From eb1a0a413b1c8e6468f43e52ae9193444c305731 Mon Sep 17 00:00:00 2001 From: wanglujun Date: Wed, 20 Sep 2023 15:41:45 +0800 Subject: [PATCH 1/6] init for 0.0.2 --- ...r-undefined-reference-to-sys_sigabbr.patch | 387 - utsudo-0.0.2/ABOUT-NLS | 1406 + utsudo-0.0.2/INSTALL | 934 + utsudo-0.0.2/INSTALL.configure | 365 + utsudo-0.0.2/LICENSE | 133 + utsudo-0.0.2/MANIFEST | 809 + utsudo-0.0.2/Makefile.in | 396 + utsudo-0.0.2/NEWS | 2759 ++ utsudo-0.0.2/README | 83 + utsudo-0.0.2/README.LDAP | 205 + utsudo-0.0.2/aclocal.m4 | 25 + utsudo-0.0.2/autogen.sh | 20 + utsudo-0.0.2/config.guess | 1462 + utsudo-0.0.2/config.h.in | 1306 + utsudo-0.0.2/config.sub | 1827 + utsudo-0.0.2/configure | 29320 ++++++++++++++++ utsudo-0.0.2/configure.ac | 4685 +++ utsudo-0.0.2/doc/LICENSE | 236 + utsudo-0.0.2/include/Makefile.in | 100 + utsudo-0.0.2/include/compat/charclass.h | 41 + utsudo-0.0.2/include/compat/endian.h | 74 + utsudo-0.0.2/include/compat/fnmatch.h | 34 + utsudo-0.0.2/include/compat/getaddrinfo.h | 83 + utsudo-0.0.2/include/compat/getopt.h | 83 + utsudo-0.0.2/include/compat/glob.h | 78 + utsudo-0.0.2/include/compat/nss_dbdefs.h | 108 + utsudo-0.0.2/include/compat/sha2.h | 100 + utsudo-0.0.2/include/compat/stdbool.h | 44 + utsudo-0.0.2/include/sudo_compat.h | 545 + .../include/sudo_compat.h.target-shell | 534 + utsudo-0.0.2/include/sudo_conf.h | 87 + utsudo-0.0.2/include/sudo_debug.h | 299 + utsudo-0.0.2/include/sudo_digest.h | 46 + utsudo-0.0.2/include/sudo_dso.h | 57 + utsudo-0.0.2/include/sudo_event.h | 195 + utsudo-0.0.2/include/sudo_fatal.h | 207 + utsudo-0.0.2/include/sudo_gettext.h | 77 + utsudo-0.0.2/include/sudo_lbuf.h | 55 + utsudo-0.0.2/include/sudo_plugin.h | 203 + utsudo-0.0.2/include/sudo_queue.h | 823 + utsudo-0.0.2/include/sudo_rand.h | 52 + utsudo-0.0.2/include/sudo_util.h | 287 + utsudo-0.0.2/indent.pro | 36 + utsudo-0.0.2/init.d/aix.sh.in | 25 + utsudo-0.0.2/init.d/hpux.sh.in | 27 + utsudo-0.0.2/init.d/utsudo.conf.in | 6 + utsudo-0.0.2/install-sh | 239 + utsudo-0.0.2/install-sh.strip | 239 + utsudo-0.0.2/lib/util/.cargo/config.toml | 13 + utsudo-0.0.2/lib/util/Cargo.toml | 14 + utsudo-0.0.2/lib/util/Makefile | 175 + utsudo-0.0.2/lib/util/Makefile.in | 175 + utsudo-0.0.2/lib/util/debug_fatal_lbuf.c | 551 + utsudo-0.0.2/lib/util/libutsudo_util.la | 41 + utsudo-0.0.2/lib/util/libutsudo_util.lai | 41 + utsudo-0.0.2/lib/util/src/arc4random.rs | 638 + .../lib/util/src/arc4random_uniform.rs | 28 + utsudo-0.0.2/lib/util/src/closefrom.rs | 97 + utsudo-0.0.2/lib/util/src/digest.rs | 239 + utsudo-0.0.2/lib/util/src/event.rs | 1942 + utsudo-0.0.2/lib/util/src/event_poll.rs | 395 + utsudo-0.0.2/lib/util/src/fatal.rs | 222 + utsudo-0.0.2/lib/util/src/getgrouplist.rs | 87 + utsudo-0.0.2/lib/util/src/gethostname.rs | 47 + utsudo-0.0.2/lib/util/src/gettime.rs | 147 + utsudo-0.0.2/lib/util/src/gidlist.rs | 112 + utsudo-0.0.2/lib/util/src/key_val.rs | 50 + utsudo-0.0.2/lib/util/src/lbuf.rs | 298 + utsudo-0.0.2/lib/util/src/lib.rs | 45 + utsudo-0.0.2/lib/util/src/locking.rs | 60 + utsudo-0.0.2/lib/util/src/memset_s.rs | 53 + utsudo-0.0.2/lib/util/src/parseln.rs | 239 + utsudo-0.0.2/lib/util/src/progname.rs | 39 + utsudo-0.0.2/lib/util/src/pw_dup.rs | 128 + utsudo-0.0.2/lib/util/src/secure_path.rs | 279 + utsudo-0.0.2/lib/util/src/setgroups.rs | 62 + utsudo-0.0.2/lib/util/src/sha2.rs | 904 + utsudo-0.0.2/lib/util/src/sig2str.rs | 287 + utsudo-0.0.2/lib/util/src/str2sig.rs | 341 + utsudo-0.0.2/lib/util/src/strlcat.rs | 67 + utsudo-0.0.2/lib/util/src/strlcpy.rs | 57 + utsudo-0.0.2/lib/util/src/strsplit.rs | 76 + utsudo-0.0.2/lib/util/src/strtobool.rs | 79 + utsudo-0.0.2/lib/util/src/strtoid.rs | 155 + utsudo-0.0.2/lib/util/src/strtomode.rs | 72 + utsudo-0.0.2/lib/util/src/strtonum.rs | 219 + utsudo-0.0.2/lib/util/src/sudo_conf.rs | 1581 + utsudo-0.0.2/lib/util/src/sudo_debug.rs | 1444 + utsudo-0.0.2/lib/util/src/sudo_debug_macro.rs | 370 + utsudo-0.0.2/lib/util/src/sudo_dso.rs | 231 + utsudo-0.0.2/lib/util/src/term.rs | 940 + utsudo-0.0.2/lib/util/src/ttyname_dev.rs | 659 + utsudo-0.0.2/lib/util/src/ttysize.rs | 131 + utsudo-0.0.2/lib/util/util.exp.in | 121 + .../lib/util/vendor/libc/.cargo-checksum.json | 1 + .../lib/util/vendor/libc/CONTRIBUTING.md | 93 + utsudo-0.0.2/lib/util/vendor/libc/Cargo.toml | 172 + .../lib/util/vendor/libc/LICENSE-APACHE | 176 + utsudo-0.0.2/lib/util/vendor/libc/LICENSE-MIT | 25 + utsudo-0.0.2/lib/util/vendor/libc/README.md | 110 + utsudo-0.0.2/lib/util/vendor/libc/build.rs | 246 + .../lib/util/vendor/libc/rustfmt.toml | 1 + .../util/vendor/libc/src/fixed_width_ints.rs | 99 + .../util/vendor/libc/src/fuchsia/aarch64.rs | 67 + .../lib/util/vendor/libc/src/fuchsia/align.rs | 142 + .../lib/util/vendor/libc/src/fuchsia/mod.rs | 4300 +++ .../util/vendor/libc/src/fuchsia/no_align.rs | 129 + .../util/vendor/libc/src/fuchsia/riscv64.rs | 44 + .../util/vendor/libc/src/fuchsia/x86_64.rs | 152 + .../util/vendor/libc/src/hermit/aarch64.rs | 2 + .../lib/util/vendor/libc/src/hermit/mod.rs | 64 + .../lib/util/vendor/libc/src/hermit/x86_64.rs | 2 + utsudo-0.0.2/lib/util/vendor/libc/src/lib.rs | 163 + .../lib/util/vendor/libc/src/macros.rs | 343 + utsudo-0.0.2/lib/util/vendor/libc/src/psp.rs | 4174 +++ utsudo-0.0.2/lib/util/vendor/libc/src/sgx.rs | 47 + .../lib/util/vendor/libc/src/solid/aarch64.rs | 4 + .../lib/util/vendor/libc/src/solid/arm.rs | 4 + .../lib/util/vendor/libc/src/solid/mod.rs | 904 + .../lib/util/vendor/libc/src/switch.rs | 49 + .../lib/util/vendor/libc/src/unix/aix/mod.rs | 3355 ++ .../vendor/libc/src/unix/aix/powerpc64.rs | 644 + .../lib/util/vendor/libc/src/unix/align.rs | 6 + .../libc/src/unix/bsd/apple/b32/align.rs | 7 + .../vendor/libc/src/unix/bsd/apple/b32/mod.rs | 119 + .../src/unix/bsd/apple/b64/aarch64/align.rs | 56 + .../src/unix/bsd/apple/b64/aarch64/mod.rs | 14 + .../libc/src/unix/bsd/apple/b64/align.rs | 7 + .../vendor/libc/src/unix/bsd/apple/b64/mod.rs | 124 + .../src/unix/bsd/apple/b64/x86_64/align.rs | 7 + .../libc/src/unix/bsd/apple/b64/x86_64/mod.rs | 180 + .../libc/src/unix/bsd/apple/long_array.rs | 8 + .../vendor/libc/src/unix/bsd/apple/mod.rs | 6125 ++++ .../unix/bsd/freebsdlike/dragonfly/errno.rs | 13 + .../src/unix/bsd/freebsdlike/dragonfly/mod.rs | 1726 + .../unix/bsd/freebsdlike/freebsd/aarch64.rs | 146 + .../src/unix/bsd/freebsdlike/freebsd/arm.rs | 50 + .../bsd/freebsdlike/freebsd/freebsd11/b64.rs | 32 + .../bsd/freebsdlike/freebsd/freebsd11/mod.rs | 488 + .../bsd/freebsdlike/freebsd/freebsd12/b64.rs | 34 + .../bsd/freebsdlike/freebsd/freebsd12/mod.rs | 505 + .../freebsdlike/freebsd/freebsd12/x86_64.rs | 5 + .../bsd/freebsdlike/freebsd/freebsd13/b64.rs | 34 + .../bsd/freebsdlike/freebsd/freebsd13/mod.rs | 546 + .../freebsdlike/freebsd/freebsd13/x86_64.rs | 5 + .../bsd/freebsdlike/freebsd/freebsd14/b64.rs | 34 + .../bsd/freebsdlike/freebsd/freebsd14/mod.rs | 546 + .../freebsdlike/freebsd/freebsd14/x86_64.rs | 12 + .../src/unix/bsd/freebsdlike/freebsd/mod.rs | 5692 +++ .../unix/bsd/freebsdlike/freebsd/powerpc.rs | 47 + .../unix/bsd/freebsdlike/freebsd/powerpc64.rs | 47 + .../unix/bsd/freebsdlike/freebsd/riscv64.rs | 154 + .../src/unix/bsd/freebsdlike/freebsd/x86.rs | 201 + .../bsd/freebsdlike/freebsd/x86_64/align.rs | 197 + .../bsd/freebsdlike/freebsd/x86_64/mod.rs | 334 + .../libc/src/unix/bsd/freebsdlike/mod.rs | 1896 + .../lib/util/vendor/libc/src/unix/bsd/mod.rs | 917 + .../libc/src/unix/bsd/netbsdlike/mod.rs | 762 + .../src/unix/bsd/netbsdlike/netbsd/aarch64.rs | 103 + .../src/unix/bsd/netbsdlike/netbsd/arm.rs | 22 + .../src/unix/bsd/netbsdlike/netbsd/mod.rs | 3178 ++ .../src/unix/bsd/netbsdlike/netbsd/powerpc.rs | 21 + .../src/unix/bsd/netbsdlike/netbsd/sparc64.rs | 8 + .../src/unix/bsd/netbsdlike/netbsd/x86.rs | 15 + .../src/unix/bsd/netbsdlike/netbsd/x86_64.rs | 40 + .../unix/bsd/netbsdlike/openbsd/aarch64.rs | 30 + .../src/unix/bsd/netbsdlike/openbsd/arm.rs | 16 + .../src/unix/bsd/netbsdlike/openbsd/mips64.rs | 8 + .../src/unix/bsd/netbsdlike/openbsd/mod.rs | 1988 ++ .../unix/bsd/netbsdlike/openbsd/powerpc.rs | 16 + .../unix/bsd/netbsdlike/openbsd/powerpc64.rs | 16 + .../unix/bsd/netbsdlike/openbsd/riscv64.rs | 16 + .../unix/bsd/netbsdlike/openbsd/sparc64.rs | 8 + .../src/unix/bsd/netbsdlike/openbsd/x86.rs | 16 + .../src/unix/bsd/netbsdlike/openbsd/x86_64.rs | 130 + .../util/vendor/libc/src/unix/haiku/b32.rs | 20 + .../util/vendor/libc/src/unix/haiku/b64.rs | 20 + .../util/vendor/libc/src/unix/haiku/mod.rs | 2094 ++ .../util/vendor/libc/src/unix/haiku/native.rs | 1366 + .../util/vendor/libc/src/unix/haiku/x86_64.rs | 264 + .../vendor/libc/src/unix/hermit/aarch64.rs | 2 + .../util/vendor/libc/src/unix/hermit/mod.rs | 1023 + .../vendor/libc/src/unix/hermit/x86_64.rs | 2 + .../src/unix/linux_like/android/b32/arm.rs | 550 + .../src/unix/linux_like/android/b32/mod.rs | 244 + .../unix/linux_like/android/b32/x86/align.rs | 7 + .../unix/linux_like/android/b32/x86/mod.rs | 622 + .../linux_like/android/b64/aarch64/align.rs | 29 + .../linux_like/android/b64/aarch64/int128.rs | 7 + .../linux_like/android/b64/aarch64/mod.rs | 427 + .../src/unix/linux_like/android/b64/mod.rs | 355 + .../linux_like/android/b64/riscv64/align.rs | 7 + .../linux_like/android/b64/riscv64/mod.rs | 353 + .../linux_like/android/b64/x86_64/align.rs | 7 + .../unix/linux_like/android/b64/x86_64/mod.rs | 802 + .../libc/src/unix/linux_like/android/mod.rs | 3699 ++ .../src/unix/linux_like/emscripten/align.rs | 74 + .../src/unix/linux_like/emscripten/mod.rs | 1898 + .../unix/linux_like/emscripten/no_align.rs | 63 + .../libc/src/unix/linux_like/linux/align.rs | 192 + .../unix/linux_like/linux/arch/generic/mod.rs | 292 + .../unix/linux_like/linux/arch/mips/mod.rs | 288 + .../src/unix/linux_like/linux/arch/mod.rs | 15 + .../unix/linux_like/linux/arch/powerpc/mod.rs | 243 + .../unix/linux_like/linux/arch/sparc/mod.rs | 228 + .../src/unix/linux_like/linux/gnu/align.rs | 13 + .../linux_like/linux/gnu/b32/arm/align.rs | 53 + .../unix/linux_like/linux/gnu/b32/arm/mod.rs | 874 + .../linux_like/linux/gnu/b32/m68k/align.rs | 7 + .../unix/linux_like/linux/gnu/b32/m68k/mod.rs | 849 + .../linux_like/linux/gnu/b32/mips/align.rs | 7 + .../unix/linux_like/linux/gnu/b32/mips/mod.rs | 818 + .../src/unix/linux_like/linux/gnu/b32/mod.rs | 358 + .../unix/linux_like/linux/gnu/b32/powerpc.rs | 824 + .../linux_like/linux/gnu/b32/riscv32/align.rs | 44 + .../linux_like/linux/gnu/b32/riscv32/mod.rs | 812 + .../linux_like/linux/gnu/b32/sparc/align.rs | 7 + .../linux_like/linux/gnu/b32/sparc/mod.rs | 856 + .../linux_like/linux/gnu/b32/x86/align.rs | 7 + .../unix/linux_like/linux/gnu/b32/x86/mod.rs | 1109 + .../linux_like/linux/gnu/b64/aarch64/align.rs | 58 + .../linux_like/linux/gnu/b64/aarch64/ilp32.rs | 64 + .../linux/gnu/b64/aarch64/int128.rs | 7 + .../linux_like/linux/gnu/b64/aarch64/lp64.rs | 73 + .../linux_like/linux/gnu/b64/aarch64/mod.rs | 938 + .../linux/gnu/b64/loongarch64/align.rs | 40 + .../linux/gnu/b64/loongarch64/mod.rs | 885 + .../linux_like/linux/gnu/b64/mips64/align.rs | 7 + .../linux_like/linux/gnu/b64/mips64/mod.rs | 933 + .../src/unix/linux_like/linux/gnu/b64/mod.rs | 126 + .../linux/gnu/b64/powerpc64/align.rs | 7 + .../linux_like/linux/gnu/b64/powerpc64/mod.rs | 978 + .../linux_like/linux/gnu/b64/riscv64/align.rs | 44 + .../linux_like/linux/gnu/b64/riscv64/mod.rs | 851 + .../unix/linux_like/linux/gnu/b64/s390x.rs | 963 + .../linux_like/linux/gnu/b64/sparc64/align.rs | 7 + .../linux_like/linux/gnu/b64/sparc64/mod.rs | 930 + .../linux_like/linux/gnu/b64/x86_64/align.rs | 24 + .../linux_like/linux/gnu/b64/x86_64/mod.rs | 834 + .../linux/gnu/b64/x86_64/not_x32.rs | 451 + .../linux_like/linux/gnu/b64/x86_64/x32.rs | 404 + .../libc/src/unix/linux_like/linux/gnu/mod.rs | 1410 + .../src/unix/linux_like/linux/gnu/no_align.rs | 10 + .../libc/src/unix/linux_like/linux/mod.rs | 4921 +++ .../linux_like/linux/musl/b32/arm/align.rs | 7 + .../unix/linux_like/linux/musl/b32/arm/mod.rs | 858 + .../unix/linux_like/linux/musl/b32/hexagon.rs | 673 + .../linux_like/linux/musl/b32/mips/align.rs | 7 + .../linux_like/linux/musl/b32/mips/mod.rs | 793 + .../src/unix/linux_like/linux/musl/b32/mod.rs | 65 + .../unix/linux_like/linux/musl/b32/powerpc.rs | 809 + .../linux/musl/b32/riscv32/align.rs | 7 + .../linux_like/linux/musl/b32/riscv32/mod.rs | 794 + .../linux_like/linux/musl/b32/x86/align.rs | 7 + .../unix/linux_like/linux/musl/b32/x86/mod.rs | 899 + .../linux/musl/b64/aarch64/align.rs | 42 + .../linux/musl/b64/aarch64/int128.rs | 7 + .../linux_like/linux/musl/b64/aarch64/mod.rs | 660 + .../unix/linux_like/linux/musl/b64/mips64.rs | 690 + .../src/unix/linux_like/linux/musl/b64/mod.rs | 167 + .../linux_like/linux/musl/b64/powerpc64.rs | 697 + .../linux/musl/b64/riscv64/align.rs | 44 + .../linux_like/linux/musl/b64/riscv64/mod.rs | 726 + .../unix/linux_like/linux/musl/b64/s390x.rs | 726 + .../linux_like/linux/musl/b64/x86_64/align.rs | 25 + .../linux_like/linux/musl/b64/x86_64/mod.rs | 917 + .../src/unix/linux_like/linux/musl/lfs64.rs | 241 + .../src/unix/linux_like/linux/musl/mod.rs | 806 + .../src/unix/linux_like/linux/no_align.rs | 130 + .../unix/linux_like/linux/non_exhaustive.rs | 9 + .../src/unix/linux_like/linux/uclibc/align.rs | 28 + .../unix/linux_like/linux/uclibc/arm/align.rs | 13 + .../unix/linux_like/linux/uclibc/arm/mod.rs | 925 + .../linux_like/linux/uclibc/arm/no_align.rs | 10 + .../linux/uclibc/mips/mips32/align.rs | 13 + .../linux/uclibc/mips/mips32/mod.rs | 692 + .../linux/uclibc/mips/mips32/no_align.rs | 10 + .../linux/uclibc/mips/mips64/align.rs | 10 + .../linux/uclibc/mips/mips64/mod.rs | 207 + .../linux/uclibc/mips/mips64/no_align.rs | 7 + .../unix/linux_like/linux/uclibc/mips/mod.rs | 310 + .../src/unix/linux_like/linux/uclibc/mod.rs | 392 + .../unix/linux_like/linux/uclibc/no_align.rs | 53 + .../linux_like/linux/uclibc/x86_64/l4re.rs | 53 + .../linux_like/linux/uclibc/x86_64/mod.rs | 345 + .../linux_like/linux/uclibc/x86_64/other.rs | 5 + .../vendor/libc/src/unix/linux_like/mod.rs | 1903 + .../lib/util/vendor/libc/src/unix/mod.rs | 1630 + .../libc/src/unix/newlib/aarch64/mod.rs | 54 + .../util/vendor/libc/src/unix/newlib/align.rs | 61 + .../vendor/libc/src/unix/newlib/arm/mod.rs | 56 + .../vendor/libc/src/unix/newlib/espidf/mod.rs | 110 + .../vendor/libc/src/unix/newlib/generic.rs | 27 + .../libc/src/unix/newlib/horizon/mod.rs | 268 + .../util/vendor/libc/src/unix/newlib/mod.rs | 789 + .../vendor/libc/src/unix/newlib/no_align.rs | 51 + .../libc/src/unix/newlib/powerpc/mod.rs | 16 + .../vendor/libc/src/unix/newlib/vita/mod.rs | 201 + .../lib/util/vendor/libc/src/unix/no_align.rs | 6 + .../util/vendor/libc/src/unix/nto/aarch64.rs | 36 + .../lib/util/vendor/libc/src/unix/nto/mod.rs | 3506 ++ .../util/vendor/libc/src/unix/nto/neutrino.rs | 1288 + .../util/vendor/libc/src/unix/nto/x86_64.rs | 132 + .../util/vendor/libc/src/unix/redox/mod.rs | 1335 + .../vendor/libc/src/unix/solarish/compat.rs | 220 + .../vendor/libc/src/unix/solarish/illumos.rs | 88 + .../util/vendor/libc/src/unix/solarish/mod.rs | 3302 ++ .../vendor/libc/src/unix/solarish/solaris.rs | 101 + .../util/vendor/libc/src/unix/solarish/x86.rs | 29 + .../vendor/libc/src/unix/solarish/x86_64.rs | 190 + .../libc/src/unix/solarish/x86_common.rs | 65 + .../util/vendor/libc/src/vxworks/aarch64.rs | 4 + .../lib/util/vendor/libc/src/vxworks/arm.rs | 4 + .../lib/util/vendor/libc/src/vxworks/mod.rs | 1930 + .../util/vendor/libc/src/vxworks/powerpc.rs | 4 + .../util/vendor/libc/src/vxworks/powerpc64.rs | 4 + .../lib/util/vendor/libc/src/vxworks/x86.rs | 4 + .../util/vendor/libc/src/vxworks/x86_64.rs | 4 + utsudo-0.0.2/lib/util/vendor/libc/src/wasi.rs | 830 + .../util/vendor/libc/src/windows/gnu/align.rs | 19 + .../util/vendor/libc/src/windows/gnu/mod.rs | 23 + .../lib/util/vendor/libc/src/windows/mod.rs | 600 + .../util/vendor/libc/src/windows/msvc/mod.rs | 20 + utsudo-0.0.2/lib/util/vendor/libc/src/xous.rs | 49 + .../lib/util/vendor/libc/tests/const_fn.rs | 5 + .../util/vendor/stdext/.cargo-checksum.json | 1 + .../lib/util/vendor/stdext/CHANGELOG.md | 27 + .../lib/util/vendor/stdext/CONTRIBUTING.md | 29 + .../lib/util/vendor/stdext/Cargo.toml | 26 + utsudo-0.0.2/lib/util/vendor/stdext/LICENSE | 25 + utsudo-0.0.2/lib/util/vendor/stdext/README.md | 129 + .../lib/util/vendor/stdext/src/duration.rs | 326 + .../lib/util/vendor/stdext/src/lib.rs | 150 + .../lib/util/vendor/stdext/src/macros.rs | 233 + .../vendor/stdext/src/num/float_convert.rs | 158 + .../lib/util/vendor/stdext/src/num/integer.rs | 469 + .../lib/util/vendor/stdext/src/num/mod.rs | 4 + .../lib/util/vendor/stdext/src/option.rs | 124 + .../lib/util/vendor/stdext/src/result.rs | 112 + .../lib/util/vendor/stdext/src/str.rs | 76 + .../lib/util/vendor/stdext/src/sync/mod.rs | 4 + .../lib/util/vendor/stdext/src/sync/mutex.rs | 33 + .../util/vendor/stdext/src/sync/rw_lock.rs | 60 + .../lib/util/vendor/stdext/src/vec.rs | 128 + utsudo-0.0.2/lib/zlib/Makefile.in | 216 + utsudo-0.0.2/lib/zlib/adler32.c | 186 + utsudo-0.0.2/lib/zlib/compress.c | 86 + utsudo-0.0.2/lib/zlib/crc32.c | 442 + utsudo-0.0.2/lib/zlib/crc32.h | 441 + utsudo-0.0.2/lib/zlib/deflate.c | 2165 ++ utsudo-0.0.2/lib/zlib/deflate.h | 349 + utsudo-0.0.2/lib/zlib/gzclose.c | 25 + utsudo-0.0.2/lib/zlib/gzguts.h | 218 + utsudo-0.0.2/lib/zlib/gzlib.c | 637 + utsudo-0.0.2/lib/zlib/gzread.c | 654 + utsudo-0.0.2/lib/zlib/gzwrite.c | 665 + utsudo-0.0.2/lib/zlib/infback.c | 640 + utsudo-0.0.2/lib/zlib/inffast.c | 323 + utsudo-0.0.2/lib/zlib/inffast.h | 11 + utsudo-0.0.2/lib/zlib/inffixed.h | 94 + utsudo-0.0.2/lib/zlib/inflate.c | 1561 + utsudo-0.0.2/lib/zlib/inflate.h | 125 + utsudo-0.0.2/lib/zlib/inftrees.c | 304 + utsudo-0.0.2/lib/zlib/inftrees.h | 62 + utsudo-0.0.2/lib/zlib/trees.c | 1203 + utsudo-0.0.2/lib/zlib/trees.h | 128 + utsudo-0.0.2/lib/zlib/uncompr.c | 93 + utsudo-0.0.2/lib/zlib/zconf.h.in | 556 + utsudo-0.0.2/lib/zlib/zlib.exp | 85 + utsudo-0.0.2/lib/zlib/zlib.h | 1912 + utsudo-0.0.2/lib/zlib/zutil.c | 325 + utsudo-0.0.2/lib/zlib/zutil.h | 271 + utsudo-0.0.2/log2cl.pl | 104 + utsudo-0.0.2/ltmain.sh | 11167 ++++++ utsudo-0.0.2/m4/ax_append_flag.m4 | 71 + utsudo-0.0.2/m4/ax_check_compile_flag.m4 | 72 + utsudo-0.0.2/m4/ax_check_link_flag.m4 | 71 + utsudo-0.0.2/m4/ax_func_getaddrinfo.m4 | 70 + utsudo-0.0.2/m4/ax_func_snprintf.m4 | 82 + utsudo-0.0.2/m4/libtool.m4 | 8444 +++++ utsudo-0.0.2/m4/ltoptions.m4 | 437 + utsudo-0.0.2/m4/ltsugar.m4 | 124 + utsudo-0.0.2/m4/ltversion.m4 | 23 + utsudo-0.0.2/m4/lt~obsolete.m4 | 99 + utsudo-0.0.2/m4/utsudo.m4 | 510 + utsudo-0.0.2/mkdep.pl | 290 + utsudo-0.0.2/mkinstalldirs | 84 + utsudo-0.0.2/mkpkg | 418 + utsudo-0.0.2/pathnames.h.in | 210 + utsudo-0.0.2/plugins/group_file/Makefile.in | 219 + utsudo-0.0.2/plugins/group_file/getgrent.c | 185 + utsudo-0.0.2/plugins/group_file/group_file.c | 134 + .../plugins/group_file/group_file.exp | 1 + utsudo-0.0.2/plugins/group_file/plugin_test.c | 221 + utsudo-0.0.2/plugins/sample/Makefile.in | 206 + utsudo-0.0.2/plugins/sample/README | 23 + utsudo-0.0.2/plugins/sample/sample_plugin.c | 502 + utsudo-0.0.2/plugins/sample/sample_plugin.exp | 2 + utsudo-0.0.2/plugins/sudoers/Makefile.in | 2623 ++ utsudo-0.0.2/plugins/sudoers/alias.c | 383 + utsudo-0.0.2/plugins/sudoers/audit.c | 110 + utsudo-0.0.2/plugins/sudoers/auth/API | 135 + utsudo-0.0.2/plugins/sudoers/auth/afs.c | 85 + utsudo-0.0.2/plugins/sudoers/auth/aix_auth.c | 314 + utsudo-0.0.2/plugins/sudoers/auth/bsdauth.c | 207 + utsudo-0.0.2/plugins/sudoers/auth/dce.c | 199 + utsudo-0.0.2/plugins/sudoers/auth/fwtk.c | 156 + utsudo-0.0.2/plugins/sudoers/auth/kerb5.c | 337 + utsudo-0.0.2/plugins/sudoers/auth/pam.c | 767 + .../plugins/sudoers/auth/pam.c.krb5ccname | 747 + utsudo-0.0.2/plugins/sudoers/auth/passwd.c | 115 + utsudo-0.0.2/plugins/sudoers/auth/rfc1938.c | 144 + .../plugins/sudoers/auth/secureware.c | 118 + utsudo-0.0.2/plugins/sudoers/auth/securid5.c | 234 + utsudo-0.0.2/plugins/sudoers/auth/sia.c | 158 + utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.c | 485 + utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.h | 104 + utsudo-0.0.2/plugins/sudoers/base64.c | 131 + utsudo-0.0.2/plugins/sudoers/boottime.c | 177 + utsudo-0.0.2/plugins/sudoers/bsm_audit.c | 287 + utsudo-0.0.2/plugins/sudoers/bsm_audit.h | 26 + utsudo-0.0.2/plugins/sudoers/check.c | 355 + utsudo-0.0.2/plugins/sudoers/check.h | 89 + utsudo-0.0.2/plugins/sudoers/cvtsudoers.c | 1344 + utsudo-0.0.2/plugins/sudoers/cvtsudoers.h | 100 + .../plugins/sudoers/cvtsudoers_json.c | 1163 + .../plugins/sudoers/cvtsudoers_ldif.c | 667 + .../plugins/sudoers/cvtsudoers_pwutil.c | 484 + utsudo-0.0.2/plugins/sudoers/def_data.c | 527 + utsudo-0.0.2/plugins/sudoers/def_data.h | 255 + utsudo-0.0.2/plugins/sudoers/def_data.in | 381 + utsudo-0.0.2/plugins/sudoers/defaults.c | 1141 + utsudo-0.0.2/plugins/sudoers/defaults.h | 141 + utsudo-0.0.2/plugins/sudoers/digestname.c | 58 + utsudo-0.0.2/plugins/sudoers/editor.c | 181 + utsudo-0.0.2/plugins/sudoers/env.c | 1498 + utsudo-0.0.2/plugins/sudoers/env_pattern.c | 99 + utsudo-0.0.2/plugins/sudoers/file.c | 158 + utsudo-0.0.2/plugins/sudoers/filedigest.c | 104 + utsudo-0.0.2/plugins/sudoers/find_path.c | 175 + utsudo-0.0.2/plugins/sudoers/fmtsudoers.c | 475 + utsudo-0.0.2/plugins/sudoers/gc.c | 153 + utsudo-0.0.2/plugins/sudoers/gentime.c | 163 + utsudo-0.0.2/plugins/sudoers/getdate.c | 1582 + utsudo-0.0.2/plugins/sudoers/getdate.y | 939 + utsudo-0.0.2/plugins/sudoers/getspwuid.c | 144 + utsudo-0.0.2/plugins/sudoers/gmtoff.c | 77 + utsudo-0.0.2/plugins/sudoers/goodpath.c | 70 + utsudo-0.0.2/plugins/sudoers/gram.c | 2309 ++ utsudo-0.0.2/plugins/sudoers/gram.h | 63 + utsudo-0.0.2/plugins/sudoers/gram.y | 1336 + utsudo-0.0.2/plugins/sudoers/group_plugin.c | 234 + utsudo-0.0.2/plugins/sudoers/hexchar.c | 104 + utsudo-0.0.2/plugins/sudoers/ins_2001.h | 35 + utsudo-0.0.2/plugins/sudoers/ins_classic.h | 39 + utsudo-0.0.2/plugins/sudoers/ins_csops.h | 41 + utsudo-0.0.2/plugins/sudoers/ins_goons.h | 50 + utsudo-0.0.2/plugins/sudoers/ins_python.h | 39 + utsudo-0.0.2/plugins/sudoers/insults.h | 69 + utsudo-0.0.2/plugins/sudoers/interfaces.c | 144 + utsudo-0.0.2/plugins/sudoers/interfaces.h | 57 + utsudo-0.0.2/plugins/sudoers/iolog.c | 1297 + utsudo-0.0.2/plugins/sudoers/iolog.h | 88 + utsudo-0.0.2/plugins/sudoers/iolog_files.h | 49 + utsudo-0.0.2/plugins/sudoers/iolog_path.c | 289 + utsudo-0.0.2/plugins/sudoers/iolog_util.c | 388 + utsudo-0.0.2/plugins/sudoers/ldap.c | 2058 ++ utsudo-0.0.2/plugins/sudoers/ldap_conf.c | 937 + utsudo-0.0.2/plugins/sudoers/ldap_util.c | 584 + utsudo-0.0.2/plugins/sudoers/linux_audit.c | 113 + utsudo-0.0.2/plugins/sudoers/linux_audit.h | 24 + utsudo-0.0.2/plugins/sudoers/locale.c | 158 + utsudo-0.0.2/plugins/sudoers/logging.c | 1107 + utsudo-0.0.2/plugins/sudoers/logging.h | 85 + utsudo-0.0.2/plugins/sudoers/logwrap.c | 82 + utsudo-0.0.2/plugins/sudoers/match.c | 674 + utsudo-0.0.2/plugins/sudoers/match_addr.c | 213 + utsudo-0.0.2/plugins/sudoers/match_command.c | 542 + utsudo-0.0.2/plugins/sudoers/match_digest.c | 109 + utsudo-0.0.2/plugins/sudoers/mkdefaults | 164 + utsudo-0.0.2/plugins/sudoers/mkdir_parents.c | 95 + utsudo-0.0.2/plugins/sudoers/parse.c | 865 + utsudo-0.0.2/plugins/sudoers/parse.h | 378 + utsudo-0.0.2/plugins/sudoers/parse_ldif.c | 768 + utsudo-0.0.2/plugins/sudoers/po/README | 14 + utsudo-0.0.2/plugins/sudoers/po/ast.mo | Bin 0 -> 34264 bytes utsudo-0.0.2/plugins/sudoers/po/ast.po | 2343 ++ utsudo-0.0.2/plugins/sudoers/po/ca.mo | Bin 0 -> 43707 bytes utsudo-0.0.2/plugins/sudoers/po/ca.po | 2081 ++ utsudo-0.0.2/plugins/sudoers/po/cs.mo | Bin 0 -> 49780 bytes utsudo-0.0.2/plugins/sudoers/po/cs.po | 2429 ++ utsudo-0.0.2/plugins/sudoers/po/da.mo | Bin 0 -> 46504 bytes utsudo-0.0.2/plugins/sudoers/po/da.po | 2344 ++ utsudo-0.0.2/plugins/sudoers/po/de.mo | Bin 0 -> 52479 bytes utsudo-0.0.2/plugins/sudoers/po/de.po | 2371 ++ utsudo-0.0.2/plugins/sudoers/po/el.mo | Bin 0 -> 51009 bytes utsudo-0.0.2/plugins/sudoers/po/el.po | 1718 + utsudo-0.0.2/plugins/sudoers/po/eo.mo | Bin 0 -> 48204 bytes utsudo-0.0.2/plugins/sudoers/po/eo.po | 2410 ++ utsudo-0.0.2/plugins/sudoers/po/eu.mo | Bin 0 -> 6404 bytes utsudo-0.0.2/plugins/sudoers/po/eu.po | 1679 + utsudo-0.0.2/plugins/sudoers/po/fi.mo | Bin 0 -> 45870 bytes utsudo-0.0.2/plugins/sudoers/po/fi.po | 2361 ++ utsudo-0.0.2/plugins/sudoers/po/fr.mo | Bin 0 -> 55950 bytes utsudo-0.0.2/plugins/sudoers/po/fr.po | 2519 ++ utsudo-0.0.2/plugins/sudoers/po/fur.mo | Bin 0 -> 9485 bytes utsudo-0.0.2/plugins/sudoers/po/fur.po | 2119 ++ utsudo-0.0.2/plugins/sudoers/po/hr.mo | Bin 0 -> 50700 bytes utsudo-0.0.2/plugins/sudoers/po/hr.po | 2558 ++ utsudo-0.0.2/plugins/sudoers/po/hu.mo | Bin 0 -> 26073 bytes utsudo-0.0.2/plugins/sudoers/po/hu.po | 2152 ++ utsudo-0.0.2/plugins/sudoers/po/it.mo | Bin 0 -> 50152 bytes utsudo-0.0.2/plugins/sudoers/po/it.po | 2385 ++ utsudo-0.0.2/plugins/sudoers/po/ja.mo | Bin 0 -> 57055 bytes utsudo-0.0.2/plugins/sudoers/po/ja.po | 2565 ++ utsudo-0.0.2/plugins/sudoers/po/ko.mo | Bin 0 -> 51972 bytes utsudo-0.0.2/plugins/sudoers/po/ko.po | 2390 ++ utsudo-0.0.2/plugins/sudoers/po/lt.mo | Bin 0 -> 1994 bytes utsudo-0.0.2/plugins/sudoers/po/lt.po | 1682 + utsudo-0.0.2/plugins/sudoers/po/nb.mo | Bin 0 -> 48881 bytes utsudo-0.0.2/plugins/sudoers/po/nb.po | 2419 ++ utsudo-0.0.2/plugins/sudoers/po/nl.mo | Bin 0 -> 39096 bytes utsudo-0.0.2/plugins/sudoers/po/nl.po | 2282 ++ utsudo-0.0.2/plugins/sudoers/po/pl.mo | Bin 0 -> 50837 bytes utsudo-0.0.2/plugins/sudoers/po/pl.po | 2374 ++ utsudo-0.0.2/plugins/sudoers/po/pt.mo | Bin 0 -> 49337 bytes utsudo-0.0.2/plugins/sudoers/po/pt.po | 2387 ++ utsudo-0.0.2/plugins/sudoers/po/pt_BR.mo | Bin 0 -> 51032 bytes utsudo-0.0.2/plugins/sudoers/po/pt_BR.po | 2526 ++ utsudo-0.0.2/plugins/sudoers/po/ru.mo | Bin 0 -> 11555 bytes utsudo-0.0.2/plugins/sudoers/po/ru.po | 1868 + utsudo-0.0.2/plugins/sudoers/po/sk.mo | Bin 0 -> 4927 bytes utsudo-0.0.2/plugins/sudoers/po/sk.po | 1892 + utsudo-0.0.2/plugins/sudoers/po/sl.mo | Bin 0 -> 36413 bytes utsudo-0.0.2/plugins/sudoers/po/sl.po | 1758 + utsudo-0.0.2/plugins/sudoers/po/sr.mo | Bin 0 -> 57779 bytes utsudo-0.0.2/plugins/sudoers/po/sr.po | 2172 ++ utsudo-0.0.2/plugins/sudoers/po/sv.mo | Bin 0 -> 48795 bytes utsudo-0.0.2/plugins/sudoers/po/sv.po | 2515 ++ utsudo-0.0.2/plugins/sudoers/po/tr.mo | Bin 0 -> 13979 bytes utsudo-0.0.2/plugins/sudoers/po/tr.po | 1721 + utsudo-0.0.2/plugins/sudoers/po/uk.mo | Bin 0 -> 68120 bytes utsudo-0.0.2/plugins/sudoers/po/uk.po | 2387 ++ utsudo-0.0.2/plugins/sudoers/po/utsudoers.pot | 2318 ++ utsudo-0.0.2/plugins/sudoers/po/vi.mo | Bin 0 -> 54696 bytes utsudo-0.0.2/plugins/sudoers/po/vi.po | 2502 ++ utsudo-0.0.2/plugins/sudoers/po/zh_CN.mo | Bin 0 -> 44876 bytes utsudo-0.0.2/plugins/sudoers/po/zh_CN.po | 2549 ++ utsudo-0.0.2/plugins/sudoers/po/zh_TW.mo | Bin 0 -> 46422 bytes utsudo-0.0.2/plugins/sudoers/po/zh_TW.po | 2386 ++ utsudo-0.0.2/plugins/sudoers/policy.c | 1010 + utsudo-0.0.2/plugins/sudoers/prompt.c | 170 + utsudo-0.0.2/plugins/sudoers/pwutil.c | 1107 + utsudo-0.0.2/plugins/sudoers/pwutil.h | 77 + utsudo-0.0.2/plugins/sudoers/pwutil_impl.c | 417 + utsudo-0.0.2/plugins/sudoers/rcstr.c | 113 + utsudo-0.0.2/plugins/sudoers/redblack.c | 481 + utsudo-0.0.2/plugins/sudoers/redblack.h | 60 + .../regress/check_symbols/check_symbols.c | 105 + .../sudoers/regress/cvtsudoers/sudoers | 126 + .../sudoers/regress/cvtsudoers/sudoers.defs | 19 + .../sudoers/regress/cvtsudoers/test1.out.ok | 14 + .../sudoers/regress/cvtsudoers/test1.sh | 8 + .../sudoers/regress/cvtsudoers/test10.out.ok | 1 + .../sudoers/regress/cvtsudoers/test10.sh | 8 + .../sudoers/regress/cvtsudoers/test11.out.ok | 7 + .../sudoers/regress/cvtsudoers/test11.sh | 6 + .../sudoers/regress/cvtsudoers/test12.out.ok | 8 + .../sudoers/regress/cvtsudoers/test12.sh | 6 + .../sudoers/regress/cvtsudoers/test13.out.ok | 7 + .../sudoers/regress/cvtsudoers/test13.sh | 6 + .../sudoers/regress/cvtsudoers/test14.out.ok | 7 + .../sudoers/regress/cvtsudoers/test14.sh | 6 + .../sudoers/regress/cvtsudoers/test15.out.ok | 1 + .../sudoers/regress/cvtsudoers/test15.sh | 8 + .../sudoers/regress/cvtsudoers/test16.out.ok | 1 + .../sudoers/regress/cvtsudoers/test16.sh | 8 + .../sudoers/regress/cvtsudoers/test17.out.ok | 1 + .../sudoers/regress/cvtsudoers/test17.sh | 8 + .../sudoers/regress/cvtsudoers/test18.out.ok | 1 + .../sudoers/regress/cvtsudoers/test18.sh | 8 + .../sudoers/regress/cvtsudoers/test19.out.ok | 11 + .../sudoers/regress/cvtsudoers/test19.sh | 6 + .../sudoers/regress/cvtsudoers/test2.out.ok | 10 + .../sudoers/regress/cvtsudoers/test2.sh | 8 + .../sudoers/regress/cvtsudoers/test20.conf | 6 + .../sudoers/regress/cvtsudoers/test20.out.ok | 1 + .../sudoers/regress/cvtsudoers/test20.sh | 11 + .../sudoers/regress/cvtsudoers/test21.conf | 8 + .../sudoers/regress/cvtsudoers/test21.out.ok | 24 + .../sudoers/regress/cvtsudoers/test21.sh | 12 + .../sudoers/regress/cvtsudoers/test22.out.ok | 31 + .../sudoers/regress/cvtsudoers/test22.sh | 71 + .../sudoers/regress/cvtsudoers/test23.out.ok | 20 + .../sudoers/regress/cvtsudoers/test23.sh | 7 + .../sudoers/regress/cvtsudoers/test24.out.ok | 89 + .../sudoers/regress/cvtsudoers/test24.sh | 7 + .../sudoers/regress/cvtsudoers/test25.out.ok | 31 + .../sudoers/regress/cvtsudoers/test25.sh | 51 + .../sudoers/regress/cvtsudoers/test26.err.ok | 3 + .../sudoers/regress/cvtsudoers/test26.out.ok | 0 .../sudoers/regress/cvtsudoers/test26.sh | 47 + .../sudoers/regress/cvtsudoers/test27.out.ok | 16 + .../sudoers/regress/cvtsudoers/test27.sh | 10 + .../sudoers/regress/cvtsudoers/test28.out.ok | 10 + .../sudoers/regress/cvtsudoers/test28.sh | 72 + .../sudoers/regress/cvtsudoers/test29.out.ok | 4 + .../sudoers/regress/cvtsudoers/test29.sh | 59 + .../sudoers/regress/cvtsudoers/test3.out.ok | 7 + .../sudoers/regress/cvtsudoers/test3.sh | 8 + .../sudoers/regress/cvtsudoers/test30.out.ok | 26 + .../sudoers/regress/cvtsudoers/test30.sh | 13 + .../sudoers/regress/cvtsudoers/test31.conf | 9 + .../sudoers/regress/cvtsudoers/test31.out.ok | 24 + .../sudoers/regress/cvtsudoers/test31.sh | 12 + .../sudoers/regress/cvtsudoers/test32.err.ok | 1 + .../sudoers/regress/cvtsudoers/test32.out.ok | 119 + .../sudoers/regress/cvtsudoers/test32.sh | 20 + .../sudoers/regress/cvtsudoers/test33.out.ok | 7 + .../sudoers/regress/cvtsudoers/test33.sh | 60 + .../sudoers/regress/cvtsudoers/test4.out.ok | 5 + .../sudoers/regress/cvtsudoers/test4.sh | 8 + .../sudoers/regress/cvtsudoers/test5.out.ok | 6 + .../sudoers/regress/cvtsudoers/test5.sh | 8 + .../sudoers/regress/cvtsudoers/test6.out.ok | 1 + .../sudoers/regress/cvtsudoers/test6.sh | 8 + .../sudoers/regress/cvtsudoers/test7.out.ok | 2 + .../sudoers/regress/cvtsudoers/test7.sh | 8 + .../sudoers/regress/cvtsudoers/test8.out.ok | 1 + .../sudoers/regress/cvtsudoers/test8.sh | 8 + .../sudoers/regress/cvtsudoers/test9.out.ok | 1 + .../sudoers/regress/cvtsudoers/test9.sh | 8 + .../regress/env_match/check_env_pattern.c | 84 + .../plugins/sudoers/regress/env_match/data | 22 + .../regress/iolog_path/check_iolog_path.c | 217 + .../plugins/sudoers/regress/iolog_path/data | 96 + .../regress/iolog_plugin/check_iolog_plugin.c | 414 + .../regress/iolog_util/check_iolog_util.c | 153 + .../sudoers/regress/logging/check_wrap.c | 110 + .../sudoers/regress/logging/check_wrap.in | 4 + .../sudoers/regress/logging/check_wrap.out.ok | 175 + .../sudoers/regress/parser/check_addr.c | 147 + .../sudoers/regress/parser/check_addr.in | 13 + .../sudoers/regress/parser/check_base64.c | 125 + .../sudoers/regress/parser/check_digest.c | 142 + .../regress/parser/check_digest.out.ok | 36 + .../sudoers/regress/parser/check_fill.c | 196 + .../sudoers/regress/parser/check_gentime.c | 89 + .../sudoers/regress/parser/check_hexchar.c | 92 + .../regress/starttime/check_starttime.c | 119 + .../plugins/sudoers/regress/sudoers/test1.in | 12 + .../sudoers/regress/sudoers/test1.json.ok | 154 + .../sudoers/regress/sudoers/test1.ldif.ok | 88 + .../regress/sudoers/test1.ldif2sudo.ok | 13 + .../sudoers/regress/sudoers/test1.out.ok | 6 + .../sudoers/regress/sudoers/test1.toke.ok | 8 + .../plugins/sudoers/regress/sudoers/test10.in | 1 + .../sudoers/regress/sudoers/test10.json.ok | 2 + .../sudoers/regress/sudoers/test10.ldif.ok | 0 .../sudoers/regress/sudoers/test10.out.ok | 2 + .../sudoers/regress/sudoers/test10.toke.ok | 1 + .../plugins/sudoers/regress/sudoers/test11.in | 1 + .../sudoers/regress/sudoers/test11.json.ok | 0 .../sudoers/regress/sudoers/test11.ldif.ok | 0 .../sudoers/regress/sudoers/test11.out.ok | 2 + .../sudoers/regress/sudoers/test11.toke.ok | 2 + .../plugins/sudoers/regress/sudoers/test12.in | 1 + .../sudoers/regress/sudoers/test12.json.ok | 0 .../sudoers/regress/sudoers/test12.ldif.ok | 0 .../sudoers/regress/sudoers/test12.out.ok | 2 + .../sudoers/regress/sudoers/test12.toke.ok | 2 + .../plugins/sudoers/regress/sudoers/test13.in | 1 + .../sudoers/regress/sudoers/test13.json.ok | 0 .../sudoers/regress/sudoers/test13.ldif.ok | 0 .../sudoers/regress/sudoers/test13.out.ok | 2 + .../sudoers/regress/sudoers/test13.toke.ok | 1 + .../plugins/sudoers/regress/sudoers/test14.in | 4 + .../sudoers/regress/sudoers/test14.json.ok | 38 + .../sudoers/regress/sudoers/test14.ldif.ok | 11 + .../regress/sudoers/test14.ldif2sudo.ok | 5 + .../sudoers/regress/sudoers/test14.out.ok | 6 + .../sudoers/regress/sudoers/test14.toke.ok | 4 + .../plugins/sudoers/regress/sudoers/test15.in | 2 + .../sudoers/regress/sudoers/test15.json.ok | 19 + .../sudoers/regress/sudoers/test15.ldif.ok | 9 + .../regress/sudoers/test15.ldif2sudo.ok | 2 + .../sudoers/regress/sudoers/test15.out.ok | 3 + .../sudoers/regress/sudoers/test15.toke.ok | 2 + .../plugins/sudoers/regress/sudoers/test16.in | 3 + .../sudoers/regress/sudoers/test16.json.ok | 24 + .../sudoers/regress/sudoers/test16.ldif.ok | 9 + .../regress/sudoers/test16.ldif2sudo.ok | 2 + .../sudoers/regress/sudoers/test16.out.ok | 5 + .../sudoers/regress/sudoers/test16.toke.ok | 3 + .../plugins/sudoers/regress/sudoers/test17.in | 13 + .../sudoers/regress/sudoers/test17.json.ok | 180 + .../sudoers/regress/sudoers/test17.ldif.ok | 104 + .../regress/sudoers/test17.ldif2sudo.ok | 29 + .../sudoers/regress/sudoers/test17.out.ok | 13 + .../sudoers/regress/sudoers/test17.toke.ok | 11 + .../plugins/sudoers/regress/sudoers/test18.in | 8 + .../sudoers/regress/sudoers/test18.json.ok | 0 .../sudoers/regress/sudoers/test18.ldif.ok | 0 .../sudoers/regress/sudoers/test18.out.ok | 4 + .../sudoers/regress/sudoers/test18.toke.ok | 10 + .../plugins/sudoers/regress/sudoers/test19.in | 12 + .../sudoers/regress/sudoers/test19.json.ok | 187 + .../sudoers/regress/sudoers/test19.ldif.ok | 103 + .../regress/sudoers/test19.ldif2sudo.ok | 30 + .../sudoers/regress/sudoers/test19.out.ok | 12 + .../sudoers/regress/sudoers/test19.toke.ok | 12 + .../plugins/sudoers/regress/sudoers/test2.in | 60 + .../sudoers/regress/sudoers/test2.json.ok | 403 + .../sudoers/regress/sudoers/test2.ldif.ok | 157 + .../regress/sudoers/test2.ldif2sudo.ok | 38 + .../sudoers/regress/sudoers/test2.out.ok | 42 + .../sudoers/regress/sudoers/test2.toke.ok | 60 + .../plugins/sudoers/regress/sudoers/test20.in | 26 + .../sudoers/regress/sudoers/test20.json.ok | 114 + .../sudoers/regress/sudoers/test20.ldif.ok | 28 + .../regress/sudoers/test20.ldif2sudo.ok | 22 + .../sudoers/regress/sudoers/test20.out.ok | 24 + .../sudoers/regress/sudoers/test20.toke.ok | 26 + .../plugins/sudoers/regress/sudoers/test21.in | 36 + .../sudoers/regress/sudoers/test21.json.ok | 169 + .../sudoers/regress/sudoers/test21.ldif.ok | 39 + .../regress/sudoers/test21.ldif2sudo.ok | 33 + .../sudoers/regress/sudoers/test21.out.ok | 35 + .../sudoers/regress/sudoers/test21.toke.ok | 36 + .../plugins/sudoers/regress/sudoers/test22.in | 6 + .../sudoers/regress/sudoers/test22.json.ok | 88 + .../sudoers/regress/sudoers/test22.ldif.ok | 40 + .../regress/sudoers/test22.ldif2sudo.ok | 11 + .../sudoers/regress/sudoers/test22.out.ok | 6 + .../sudoers/regress/sudoers/test22.sudo.ok | 7 + .../sudoers/regress/sudoers/test22.toke.ok | 6 + .../plugins/sudoers/regress/sudoers/test3.in | 6 + .../sudoers/regress/sudoers/test3.json.ok | 45 + .../sudoers/regress/sudoers/test3.ldif.ok | 12 + .../regress/sudoers/test3.ldif2sudo.ok | 0 .../sudoers/regress/sudoers/test3.out.ok | 8 + .../sudoers/regress/sudoers/test3.toke.ok | 6 + .../plugins/sudoers/regress/sudoers/test4.in | 7 + .../sudoers/regress/sudoers/test4.json.ok | 0 .../sudoers/regress/sudoers/test4.ldif.ok | 0 .../sudoers/regress/sudoers/test4.out.ok | 4 + .../sudoers/regress/sudoers/test4.toke.ok | 5 + .../plugins/sudoers/regress/sudoers/test5.in | 3 + .../sudoers/regress/sudoers/test5.json.ok | 0 .../sudoers/regress/sudoers/test5.ldif.ok | 0 .../sudoers/regress/sudoers/test5.out.ok | 2 + .../sudoers/regress/sudoers/test5.toke.ok | 3 + .../plugins/sudoers/regress/sudoers/test6.in | 15 + .../sudoers/regress/sudoers/test6.json.ok | 158 + .../sudoers/regress/sudoers/test6.ldif.ok | 70 + .../regress/sudoers/test6.ldif2sudo.ok | 5 + .../sudoers/regress/sudoers/test6.out.ok | 13 + .../sudoers/regress/sudoers/test6.toke.ok | 15 + .../plugins/sudoers/regress/sudoers/test7.in | 7 + .../sudoers/regress/sudoers/test7.json.ok | 0 .../sudoers/regress/sudoers/test7.ldif.ok | 0 .../sudoers/regress/sudoers/test7.out.ok | 2 + .../sudoers/regress/sudoers/test7.toke.ok | 7 + .../plugins/sudoers/regress/sudoers/test8.in | 8 + .../sudoers/regress/sudoers/test8.json.ok | 0 .../sudoers/regress/sudoers/test8.ldif.ok | 0 .../sudoers/regress/sudoers/test8.out.ok | 5 + .../sudoers/regress/sudoers/test8.toke.ok | 7 + .../plugins/sudoers/regress/sudoers/test9.in | 0 .../sudoers/regress/sudoers/test9.json.ok | 2 + .../sudoers/regress/sudoers/test9.ldif.ok | 0 .../sudoers/regress/sudoers/test9.out.ok | 2 + .../sudoers/regress/sudoers/test9.toke.ok | 0 .../plugins/sudoers/regress/testsudoers/group | 15 + .../sudoers/regress/testsudoers/test1.out.ok | 8 + .../sudoers/regress/testsudoers/test1.sh | 13 + .../sudoers/regress/testsudoers/test2.inc | 1 + .../sudoers/regress/testsudoers/test2.out.ok | 10 + .../sudoers/regress/testsudoers/test2.sh | 13 + .../sudoers/regress/testsudoers/test3.out.ok | 10 + .../sudoers/regress/testsudoers/test3.sh | 25 + .../sudoers/regress/testsudoers/test4.out.ok | 6 + .../sudoers/regress/testsudoers/test4.sh | 14 + .../sudoers/regress/testsudoers/test5.out.ok | 12 + .../sudoers/regress/testsudoers/test5.sh | 32 + .../sudoers/regress/testsudoers/test6.out.ok | 10 + .../sudoers/regress/testsudoers/test6.sh | 11 + .../sudoers/regress/testsudoers/test7.out.ok | 10 + .../sudoers/regress/testsudoers/test7.sh | 11 + .../sudoers/regress/visudo/test1.out.ok | 1 + .../plugins/sudoers/regress/visudo/test1.sh | 12 + .../sudoers/regress/visudo/test10.out.ok | 1 + .../plugins/sudoers/regress/visudo/test10.sh | 11 + .../sudoers/regress/visudo/test2.err.ok | 1 + .../sudoers/regress/visudo/test2.out.ok | 0 .../plugins/sudoers/regress/visudo/test2.sh | 15 + .../sudoers/regress/visudo/test3.err.ok | 2 + .../sudoers/regress/visudo/test3.out.ok | 1 + .../plugins/sudoers/regress/visudo/test3.sh | 35 + .../sudoers/regress/visudo/test4.out.ok | 1 + .../plugins/sudoers/regress/visudo/test4.sh | 14 + .../sudoers/regress/visudo/test5.out.ok | 1 + .../plugins/sudoers/regress/visudo/test5.sh | 8 + .../sudoers/regress/visudo/test6.out.ok | 1 + .../plugins/sudoers/regress/visudo/test6.sh | 25 + .../sudoers/regress/visudo/test7.out.ok | 1 + .../plugins/sudoers/regress/visudo/test7.sh | 29 + .../sudoers/regress/visudo/test8.err.ok | 1 + .../sudoers/regress/visudo/test8.out.ok | 1 + .../plugins/sudoers/regress/visudo/test8.sh | 30 + .../sudoers/regress/visudo/test9.out.ok | 1 + .../plugins/sudoers/regress/visudo/test9.sh | 12 + utsudo-0.0.2/plugins/sudoers/set_perms.c | 1723 + utsudo-0.0.2/plugins/sudoers/solaris_audit.c | 136 + utsudo-0.0.2/plugins/sudoers/solaris_audit.h | 25 + utsudo-0.0.2/plugins/sudoers/sssd.c | 793 + utsudo-0.0.2/plugins/sudoers/starttime.c | 311 + utsudo-0.0.2/plugins/sudoers/strlist.c | 99 + utsudo-0.0.2/plugins/sudoers/strlist.h | 40 + utsudo-0.0.2/plugins/sudoers/stubs.c | 117 + utsudo-0.0.2/plugins/sudoers/sudo_ldap.h | 32 + utsudo-0.0.2/plugins/sudoers/sudo_ldap_conf.h | 131 + utsudo-0.0.2/plugins/sudoers/sudo_nss.c | 272 + utsudo-0.0.2/plugins/sudoers/sudo_nss.h | 46 + utsudo-0.0.2/plugins/sudoers/sudo_printf.c | 71 + utsudo-0.0.2/plugins/sudoers/sudoers.c | 1383 + utsudo-0.0.2/plugins/sudoers/sudoers.exp | 6 + utsudo-0.0.2/plugins/sudoers/sudoers.h | 445 + utsudo-0.0.2/plugins/sudoers/sudoers.in | 97 + utsudo-0.0.2/plugins/sudoers/sudoers_debug.c | 164 + utsudo-0.0.2/plugins/sudoers/sudoers_debug.h | 48 + .../plugins/sudoers/sudoers_version.h | 77 + utsudo-0.0.2/plugins/sudoers/sudoreplay.c | 1647 + utsudo-0.0.2/plugins/sudoers/testsudoers.c | 610 + utsudo-0.0.2/plugins/sudoers/timeout.c | 116 + utsudo-0.0.2/plugins/sudoers/timestamp.c | 1077 + utsudo-0.0.2/plugins/sudoers/timestr.c | 53 + utsudo-0.0.2/plugins/sudoers/toke.c | 4809 +++ utsudo-0.0.2/plugins/sudoers/toke.h | 41 + utsudo-0.0.2/plugins/sudoers/toke.l | 1163 + utsudo-0.0.2/plugins/sudoers/toke_util.c | 195 + utsudo-0.0.2/plugins/sudoers/tsdump.c | 318 + utsudo-0.0.2/plugins/sudoers/tsgetgrpw.c | 415 + utsudo-0.0.2/plugins/sudoers/tsgetgrpw.h | 74 + utsudo-0.0.2/plugins/sudoers/visudo.c | 1302 + utsudo-0.0.2/plugins/system_group/Makefile.in | 211 + .../plugins/system_group/system_group.c | 159 + .../plugins/system_group/system_group.exp | 1 + utsudo-0.0.2/po/README | 14 + utsudo-0.0.2/po/ast.mo | Bin 0 -> 19623 bytes utsudo-0.0.2/po/ast.po | 928 + utsudo-0.0.2/po/ca.mo | Bin 0 -> 19142 bytes utsudo-0.0.2/po/ca.po | 896 + utsudo-0.0.2/po/cs.mo | Bin 0 -> 19548 bytes utsudo-0.0.2/po/cs.po | 984 + utsudo-0.0.2/po/da.mo | Bin 0 -> 18722 bytes utsudo-0.0.2/po/da.po | 946 + utsudo-0.0.2/po/de.mo | Bin 0 -> 21078 bytes utsudo-0.0.2/po/de.po | 936 + utsudo-0.0.2/po/eo.mo | Bin 0 -> 19114 bytes utsudo-0.0.2/po/eo.po | 1011 + utsudo-0.0.2/po/es.mo | Bin 0 -> 19418 bytes utsudo-0.0.2/po/es.po | 1002 + utsudo-0.0.2/po/eu.mo | Bin 0 -> 6771 bytes utsudo-0.0.2/po/eu.po | 742 + utsudo-0.0.2/po/fi.mo | Bin 0 -> 19829 bytes utsudo-0.0.2/po/fi.po | 962 + utsudo-0.0.2/po/fr.mo | Bin 0 -> 20840 bytes utsudo-0.0.2/po/fr.po | 987 + utsudo-0.0.2/po/fur.mo | Bin 0 -> 18335 bytes utsudo-0.0.2/po/fur.po | 873 + utsudo-0.0.2/po/gl.mo | Bin 0 -> 17612 bytes utsudo-0.0.2/po/gl.po | 898 + utsudo-0.0.2/po/hr.mo | Bin 0 -> 19810 bytes utsudo-0.0.2/po/hr.po | 1010 + utsudo-0.0.2/po/hu.mo | Bin 0 -> 20126 bytes utsudo-0.0.2/po/hu.po | 883 + utsudo-0.0.2/po/it.mo | Bin 0 -> 20239 bytes utsudo-0.0.2/po/it.po | 932 + utsudo-0.0.2/po/ja.mo | Bin 0 -> 23197 bytes utsudo-0.0.2/po/ja.po | 1005 + utsudo-0.0.2/po/ko.mo | Bin 0 -> 21188 bytes utsudo-0.0.2/po/ko.po | 947 + utsudo-0.0.2/po/nb.mo | Bin 0 -> 19515 bytes utsudo-0.0.2/po/nb.po | 980 + utsudo-0.0.2/po/nl.mo | Bin 0 -> 17715 bytes utsudo-0.0.2/po/nl.po | 856 + utsudo-0.0.2/po/nn.mo | Bin 0 -> 3017 bytes utsudo-0.0.2/po/nn.po | 934 + utsudo-0.0.2/po/pl.mo | Bin 0 -> 20185 bytes utsudo-0.0.2/po/pl.po | 930 + utsudo-0.0.2/po/pt.mo | Bin 0 -> 19645 bytes utsudo-0.0.2/po/pt.po | 942 + utsudo-0.0.2/po/pt_BR.mo | Bin 0 -> 20291 bytes utsudo-0.0.2/po/pt_BR.po | 997 + utsudo-0.0.2/po/ru.mo | Bin 0 -> 24520 bytes utsudo-0.0.2/po/ru.po | 923 + utsudo-0.0.2/po/sk.mo | Bin 0 -> 15495 bytes utsudo-0.0.2/po/sk.po | 858 + utsudo-0.0.2/po/sl.mo | Bin 0 -> 16463 bytes utsudo-0.0.2/po/sl.po | 810 + utsudo-0.0.2/po/sr.mo | Bin 0 -> 24566 bytes utsudo-0.0.2/po/sr.po | 923 + utsudo-0.0.2/po/sv.mo | Bin 0 -> 19364 bytes utsudo-0.0.2/po/sv.po | 983 + utsudo-0.0.2/po/tr.mo | Bin 0 -> 19506 bytes utsudo-0.0.2/po/tr.po | 997 + utsudo-0.0.2/po/uk.mo | Bin 0 -> 27109 bytes utsudo-0.0.2/po/uk.po | 935 + utsudo-0.0.2/po/utsudo.pot | 932 + utsudo-0.0.2/po/vi.mo | Bin 0 -> 21975 bytes utsudo-0.0.2/po/vi.po | 1006 + utsudo-0.0.2/po/zh_CN.mo | Bin 0 -> 17573 bytes utsudo-0.0.2/po/zh_CN.po | 1003 + utsudo-0.0.2/po/zh_TW.mo | Bin 0 -> 18824 bytes utsudo-0.0.2/po/zh_TW.po | 942 + utsudo-0.0.2/pp | 8804 +++++ utsudo-0.0.2/src_ori/Makefile.in | 759 + utsudo-0.0.2/src_ori/conversation.c | 176 + utsudo-0.0.2/src_ori/copy_file.c | 159 + utsudo-0.0.2/src_ori/debug_fatal_lbuf.c | 492 + utsudo-0.0.2/src_ori/env_hooks.c | 299 + utsudo-0.0.2/src_ori/exec.c | 434 + utsudo-0.0.2/src_ori/exec_common.c | 221 + utsudo-0.0.2/src_ori/exec_monitor.c | 735 + utsudo-0.0.2/src_ori/exec_nopty.c | 586 + utsudo-0.0.2/src_ori/exec_pty.c | 1818 + utsudo-0.0.2/src_ori/get_pty.c | 197 + utsudo-0.0.2/src_ori/hooks.c | 253 + utsudo-0.0.2/src_ori/limits.c | 204 + utsudo-0.0.2/src_ori/load_plugins.c | 375 + utsudo-0.0.2/src_ori/net_ifs.c | 374 + utsudo-0.0.2/src_ori/openbsd.c | 47 + utsudo-0.0.2/src_ori/parse_args.c | 801 + utsudo-0.0.2/src_ori/preload.c | 76 + utsudo-0.0.2/src_ori/preserve_fds.c | 224 + .../src_ori/regress/noexec/check_noexec.c | 205 + .../src_ori/regress/ttyname/check_ttyname.c | 87 + utsudo-0.0.2/src_ori/selinux.c | 485 + utsudo-0.0.2/src_ori/sesh.c | 292 + utsudo-0.0.2/src_ori/signal.c | 207 + utsudo-0.0.2/src_ori/solaris.c | 124 + utsudo-0.0.2/src_ori/sudo_edit.c | 1143 + utsudo-0.0.2/src_ori/sudo_exec.h | 119 + utsudo-0.0.2/src_ori/sudo_noexec.c | 263 + utsudo-0.0.2/src_ori/sudo_plugin_int.h | 119 + utsudo-0.0.2/src_ori/sudo_usage.h.in | 38 + utsudo-0.0.2/src_ori/tcsetpgrp_nobg.c | 80 + utsudo-0.0.2/src_ori/tgetpass.c | 449 + utsudo-0.0.2/src_ori/ttyname.c | 341 + utsudo-0.0.2/src_ori/utmp.c | 400 + utsudo-0.0.2/src_ori/utsudo.c | 1427 + utsudo-0.0.2/src_ori/utsudo.h | 296 + utsudo-0.0.2/sudo.pp | 531 + utsudo.spec | 14 +- 955 files changed, 410859 insertions(+), 396 deletions(-) delete mode 100644 0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch create mode 100644 utsudo-0.0.2/ABOUT-NLS create mode 100644 utsudo-0.0.2/INSTALL create mode 100644 utsudo-0.0.2/INSTALL.configure create mode 100644 utsudo-0.0.2/LICENSE create mode 100644 utsudo-0.0.2/MANIFEST create mode 100644 utsudo-0.0.2/Makefile.in create mode 100644 utsudo-0.0.2/NEWS create mode 100644 utsudo-0.0.2/README create mode 100644 utsudo-0.0.2/README.LDAP create mode 100644 utsudo-0.0.2/aclocal.m4 create mode 100755 utsudo-0.0.2/autogen.sh create mode 100644 utsudo-0.0.2/config.guess create mode 100644 utsudo-0.0.2/config.h.in create mode 100644 utsudo-0.0.2/config.sub create mode 100755 utsudo-0.0.2/configure create mode 100644 utsudo-0.0.2/configure.ac create mode 100644 utsudo-0.0.2/doc/LICENSE create mode 100644 utsudo-0.0.2/include/Makefile.in create mode 100644 utsudo-0.0.2/include/compat/charclass.h create mode 100644 utsudo-0.0.2/include/compat/endian.h create mode 100644 utsudo-0.0.2/include/compat/fnmatch.h create mode 100644 utsudo-0.0.2/include/compat/getaddrinfo.h create mode 100644 utsudo-0.0.2/include/compat/getopt.h create mode 100644 utsudo-0.0.2/include/compat/glob.h create mode 100644 utsudo-0.0.2/include/compat/nss_dbdefs.h create mode 100644 utsudo-0.0.2/include/compat/sha2.h create mode 100644 utsudo-0.0.2/include/compat/stdbool.h create mode 100644 utsudo-0.0.2/include/sudo_compat.h create mode 100644 utsudo-0.0.2/include/sudo_compat.h.target-shell create mode 100644 utsudo-0.0.2/include/sudo_conf.h create mode 100644 utsudo-0.0.2/include/sudo_debug.h create mode 100644 utsudo-0.0.2/include/sudo_digest.h create mode 100644 utsudo-0.0.2/include/sudo_dso.h create mode 100644 utsudo-0.0.2/include/sudo_event.h create mode 100644 utsudo-0.0.2/include/sudo_fatal.h create mode 100644 utsudo-0.0.2/include/sudo_gettext.h create mode 100644 utsudo-0.0.2/include/sudo_lbuf.h create mode 100644 utsudo-0.0.2/include/sudo_plugin.h create mode 100644 utsudo-0.0.2/include/sudo_queue.h create mode 100644 utsudo-0.0.2/include/sudo_rand.h create mode 100644 utsudo-0.0.2/include/sudo_util.h create mode 100644 utsudo-0.0.2/indent.pro create mode 100644 utsudo-0.0.2/init.d/aix.sh.in create mode 100644 utsudo-0.0.2/init.d/hpux.sh.in create mode 100644 utsudo-0.0.2/init.d/utsudo.conf.in create mode 100755 utsudo-0.0.2/install-sh create mode 100755 utsudo-0.0.2/install-sh.strip create mode 100644 utsudo-0.0.2/lib/util/.cargo/config.toml create mode 100644 utsudo-0.0.2/lib/util/Cargo.toml create mode 100644 utsudo-0.0.2/lib/util/Makefile create mode 100644 utsudo-0.0.2/lib/util/Makefile.in create mode 100644 utsudo-0.0.2/lib/util/debug_fatal_lbuf.c create mode 100644 utsudo-0.0.2/lib/util/libutsudo_util.la create mode 100644 utsudo-0.0.2/lib/util/libutsudo_util.lai create mode 100644 utsudo-0.0.2/lib/util/src/arc4random.rs create mode 100644 utsudo-0.0.2/lib/util/src/arc4random_uniform.rs create mode 100644 utsudo-0.0.2/lib/util/src/closefrom.rs create mode 100644 utsudo-0.0.2/lib/util/src/digest.rs create mode 100644 utsudo-0.0.2/lib/util/src/event.rs create mode 100644 utsudo-0.0.2/lib/util/src/event_poll.rs create mode 100644 utsudo-0.0.2/lib/util/src/fatal.rs create mode 100644 utsudo-0.0.2/lib/util/src/getgrouplist.rs create mode 100644 utsudo-0.0.2/lib/util/src/gethostname.rs create mode 100644 utsudo-0.0.2/lib/util/src/gettime.rs create mode 100644 utsudo-0.0.2/lib/util/src/gidlist.rs create mode 100644 utsudo-0.0.2/lib/util/src/key_val.rs create mode 100644 utsudo-0.0.2/lib/util/src/lbuf.rs create mode 100644 utsudo-0.0.2/lib/util/src/lib.rs create mode 100644 utsudo-0.0.2/lib/util/src/locking.rs create mode 100644 utsudo-0.0.2/lib/util/src/memset_s.rs create mode 100644 utsudo-0.0.2/lib/util/src/parseln.rs create mode 100644 utsudo-0.0.2/lib/util/src/progname.rs create mode 100644 utsudo-0.0.2/lib/util/src/pw_dup.rs create mode 100644 utsudo-0.0.2/lib/util/src/secure_path.rs create mode 100644 utsudo-0.0.2/lib/util/src/setgroups.rs create mode 100644 utsudo-0.0.2/lib/util/src/sha2.rs create mode 100644 utsudo-0.0.2/lib/util/src/sig2str.rs create mode 100644 utsudo-0.0.2/lib/util/src/str2sig.rs create mode 100644 utsudo-0.0.2/lib/util/src/strlcat.rs create mode 100644 utsudo-0.0.2/lib/util/src/strlcpy.rs create mode 100644 utsudo-0.0.2/lib/util/src/strsplit.rs create mode 100644 utsudo-0.0.2/lib/util/src/strtobool.rs create mode 100644 utsudo-0.0.2/lib/util/src/strtoid.rs create mode 100644 utsudo-0.0.2/lib/util/src/strtomode.rs create mode 100644 utsudo-0.0.2/lib/util/src/strtonum.rs create mode 100644 utsudo-0.0.2/lib/util/src/sudo_conf.rs create mode 100644 utsudo-0.0.2/lib/util/src/sudo_debug.rs create mode 100644 utsudo-0.0.2/lib/util/src/sudo_debug_macro.rs create mode 100644 utsudo-0.0.2/lib/util/src/sudo_dso.rs create mode 100644 utsudo-0.0.2/lib/util/src/term.rs create mode 100644 utsudo-0.0.2/lib/util/src/ttyname_dev.rs create mode 100644 utsudo-0.0.2/lib/util/src/ttysize.rs create mode 100644 utsudo-0.0.2/lib/util/util.exp.in create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/.cargo-checksum.json create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/CONTRIBUTING.md create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/Cargo.toml create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/LICENSE-APACHE create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/LICENSE-MIT create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/README.md create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/build.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/rustfmt.toml create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fixed_width_ints.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/riscv64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/hermit/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/hermit/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/hermit/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/lib.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/macros.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/psp.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/sgx.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/solid/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/solid/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/solid/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/switch.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/powerpc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/long_array.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/errno.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/sparc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mips64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/riscv64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/sparc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b32.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/native.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/int128.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/lfs64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/non_exhaustive.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/aarch64/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/arm/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/espidf/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/generic.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/horizon/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/powerpc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/vita/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/no_align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/neutrino.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/redox/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/compat.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/illumos.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/solaris.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_common.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/aarch64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/arm.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86_64.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/wasi.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/align.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/windows/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/windows/msvc/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/src/xous.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/libc/tests/const_fn.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/.cargo-checksum.json create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/CHANGELOG.md create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/CONTRIBUTING.md create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/Cargo.toml create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/LICENSE create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/README.md create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/duration.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/lib.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/macros.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/num/float_convert.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/num/integer.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/num/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/option.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/result.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/str.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mod.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mutex.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/sync/rw_lock.rs create mode 100644 utsudo-0.0.2/lib/util/vendor/stdext/src/vec.rs create mode 100644 utsudo-0.0.2/lib/zlib/Makefile.in create mode 100644 utsudo-0.0.2/lib/zlib/adler32.c create mode 100644 utsudo-0.0.2/lib/zlib/compress.c create mode 100644 utsudo-0.0.2/lib/zlib/crc32.c create mode 100644 utsudo-0.0.2/lib/zlib/crc32.h create mode 100644 utsudo-0.0.2/lib/zlib/deflate.c create mode 100644 utsudo-0.0.2/lib/zlib/deflate.h create mode 100644 utsudo-0.0.2/lib/zlib/gzclose.c create mode 100644 utsudo-0.0.2/lib/zlib/gzguts.h create mode 100644 utsudo-0.0.2/lib/zlib/gzlib.c create mode 100644 utsudo-0.0.2/lib/zlib/gzread.c create mode 100644 utsudo-0.0.2/lib/zlib/gzwrite.c create mode 100644 utsudo-0.0.2/lib/zlib/infback.c create mode 100644 utsudo-0.0.2/lib/zlib/inffast.c create mode 100644 utsudo-0.0.2/lib/zlib/inffast.h create mode 100644 utsudo-0.0.2/lib/zlib/inffixed.h create mode 100644 utsudo-0.0.2/lib/zlib/inflate.c create mode 100644 utsudo-0.0.2/lib/zlib/inflate.h create mode 100644 utsudo-0.0.2/lib/zlib/inftrees.c create mode 100644 utsudo-0.0.2/lib/zlib/inftrees.h create mode 100644 utsudo-0.0.2/lib/zlib/trees.c create mode 100644 utsudo-0.0.2/lib/zlib/trees.h create mode 100644 utsudo-0.0.2/lib/zlib/uncompr.c create mode 100644 utsudo-0.0.2/lib/zlib/zconf.h.in create mode 100644 utsudo-0.0.2/lib/zlib/zlib.exp create mode 100644 utsudo-0.0.2/lib/zlib/zlib.h create mode 100644 utsudo-0.0.2/lib/zlib/zutil.c create mode 100644 utsudo-0.0.2/lib/zlib/zutil.h create mode 100755 utsudo-0.0.2/log2cl.pl create mode 100644 utsudo-0.0.2/ltmain.sh create mode 100644 utsudo-0.0.2/m4/ax_append_flag.m4 create mode 100644 utsudo-0.0.2/m4/ax_check_compile_flag.m4 create mode 100644 utsudo-0.0.2/m4/ax_check_link_flag.m4 create mode 100644 utsudo-0.0.2/m4/ax_func_getaddrinfo.m4 create mode 100644 utsudo-0.0.2/m4/ax_func_snprintf.m4 create mode 100644 utsudo-0.0.2/m4/libtool.m4 create mode 100644 utsudo-0.0.2/m4/ltoptions.m4 create mode 100644 utsudo-0.0.2/m4/ltsugar.m4 create mode 100644 utsudo-0.0.2/m4/ltversion.m4 create mode 100644 utsudo-0.0.2/m4/lt~obsolete.m4 create mode 100644 utsudo-0.0.2/m4/utsudo.m4 create mode 100755 utsudo-0.0.2/mkdep.pl create mode 100755 utsudo-0.0.2/mkinstalldirs create mode 100755 utsudo-0.0.2/mkpkg create mode 100644 utsudo-0.0.2/pathnames.h.in create mode 100644 utsudo-0.0.2/plugins/group_file/Makefile.in create mode 100644 utsudo-0.0.2/plugins/group_file/getgrent.c create mode 100644 utsudo-0.0.2/plugins/group_file/group_file.c create mode 100644 utsudo-0.0.2/plugins/group_file/group_file.exp create mode 100644 utsudo-0.0.2/plugins/group_file/plugin_test.c create mode 100644 utsudo-0.0.2/plugins/sample/Makefile.in create mode 100644 utsudo-0.0.2/plugins/sample/README create mode 100644 utsudo-0.0.2/plugins/sample/sample_plugin.c create mode 100644 utsudo-0.0.2/plugins/sample/sample_plugin.exp create mode 100644 utsudo-0.0.2/plugins/sudoers/Makefile.in create mode 100644 utsudo-0.0.2/plugins/sudoers/alias.c create mode 100644 utsudo-0.0.2/plugins/sudoers/audit.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/API create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/afs.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/aix_auth.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/bsdauth.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/dce.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/fwtk.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/kerb5.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/pam.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/pam.c.krb5ccname create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/passwd.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/rfc1938.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/secureware.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/securid5.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/sia.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.c create mode 100644 utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.h create mode 100644 utsudo-0.0.2/plugins/sudoers/base64.c create mode 100644 utsudo-0.0.2/plugins/sudoers/boottime.c create mode 100644 utsudo-0.0.2/plugins/sudoers/bsm_audit.c create mode 100644 utsudo-0.0.2/plugins/sudoers/bsm_audit.h create mode 100644 utsudo-0.0.2/plugins/sudoers/check.c create mode 100644 utsudo-0.0.2/plugins/sudoers/check.h create mode 100644 utsudo-0.0.2/plugins/sudoers/cvtsudoers.c create mode 100644 utsudo-0.0.2/plugins/sudoers/cvtsudoers.h create mode 100644 utsudo-0.0.2/plugins/sudoers/cvtsudoers_json.c create mode 100644 utsudo-0.0.2/plugins/sudoers/cvtsudoers_ldif.c create mode 100644 utsudo-0.0.2/plugins/sudoers/cvtsudoers_pwutil.c create mode 100644 utsudo-0.0.2/plugins/sudoers/def_data.c create mode 100644 utsudo-0.0.2/plugins/sudoers/def_data.h create mode 100644 utsudo-0.0.2/plugins/sudoers/def_data.in create mode 100644 utsudo-0.0.2/plugins/sudoers/defaults.c create mode 100644 utsudo-0.0.2/plugins/sudoers/defaults.h create mode 100644 utsudo-0.0.2/plugins/sudoers/digestname.c create mode 100644 utsudo-0.0.2/plugins/sudoers/editor.c create mode 100644 utsudo-0.0.2/plugins/sudoers/env.c create mode 100644 utsudo-0.0.2/plugins/sudoers/env_pattern.c create mode 100644 utsudo-0.0.2/plugins/sudoers/file.c create mode 100644 utsudo-0.0.2/plugins/sudoers/filedigest.c create mode 100644 utsudo-0.0.2/plugins/sudoers/find_path.c create mode 100644 utsudo-0.0.2/plugins/sudoers/fmtsudoers.c create mode 100644 utsudo-0.0.2/plugins/sudoers/gc.c create mode 100644 utsudo-0.0.2/plugins/sudoers/gentime.c create mode 100644 utsudo-0.0.2/plugins/sudoers/getdate.c create mode 100644 utsudo-0.0.2/plugins/sudoers/getdate.y create mode 100644 utsudo-0.0.2/plugins/sudoers/getspwuid.c create mode 100644 utsudo-0.0.2/plugins/sudoers/gmtoff.c create mode 100644 utsudo-0.0.2/plugins/sudoers/goodpath.c create mode 100644 utsudo-0.0.2/plugins/sudoers/gram.c create mode 100644 utsudo-0.0.2/plugins/sudoers/gram.h create mode 100644 utsudo-0.0.2/plugins/sudoers/gram.y create mode 100644 utsudo-0.0.2/plugins/sudoers/group_plugin.c create mode 100644 utsudo-0.0.2/plugins/sudoers/hexchar.c create mode 100644 utsudo-0.0.2/plugins/sudoers/ins_2001.h create mode 100644 utsudo-0.0.2/plugins/sudoers/ins_classic.h create mode 100644 utsudo-0.0.2/plugins/sudoers/ins_csops.h create mode 100644 utsudo-0.0.2/plugins/sudoers/ins_goons.h create mode 100644 utsudo-0.0.2/plugins/sudoers/ins_python.h create mode 100644 utsudo-0.0.2/plugins/sudoers/insults.h create mode 100644 utsudo-0.0.2/plugins/sudoers/interfaces.c create mode 100644 utsudo-0.0.2/plugins/sudoers/interfaces.h create mode 100644 utsudo-0.0.2/plugins/sudoers/iolog.c create mode 100644 utsudo-0.0.2/plugins/sudoers/iolog.h create mode 100644 utsudo-0.0.2/plugins/sudoers/iolog_files.h create mode 100644 utsudo-0.0.2/plugins/sudoers/iolog_path.c create mode 100644 utsudo-0.0.2/plugins/sudoers/iolog_util.c create mode 100644 utsudo-0.0.2/plugins/sudoers/ldap.c create mode 100644 utsudo-0.0.2/plugins/sudoers/ldap_conf.c create mode 100644 utsudo-0.0.2/plugins/sudoers/ldap_util.c create mode 100644 utsudo-0.0.2/plugins/sudoers/linux_audit.c create mode 100644 utsudo-0.0.2/plugins/sudoers/linux_audit.h create mode 100644 utsudo-0.0.2/plugins/sudoers/locale.c create mode 100644 utsudo-0.0.2/plugins/sudoers/logging.c create mode 100644 utsudo-0.0.2/plugins/sudoers/logging.h create mode 100644 utsudo-0.0.2/plugins/sudoers/logwrap.c create mode 100644 utsudo-0.0.2/plugins/sudoers/match.c create mode 100644 utsudo-0.0.2/plugins/sudoers/match_addr.c create mode 100644 utsudo-0.0.2/plugins/sudoers/match_command.c create mode 100644 utsudo-0.0.2/plugins/sudoers/match_digest.c create mode 100755 utsudo-0.0.2/plugins/sudoers/mkdefaults create mode 100644 utsudo-0.0.2/plugins/sudoers/mkdir_parents.c create mode 100644 utsudo-0.0.2/plugins/sudoers/parse.c create mode 100644 utsudo-0.0.2/plugins/sudoers/parse.h create mode 100644 utsudo-0.0.2/plugins/sudoers/parse_ldif.c create mode 100644 utsudo-0.0.2/plugins/sudoers/po/README create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ast.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ast.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ca.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ca.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/cs.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/cs.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/da.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/da.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/de.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/de.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/el.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/el.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/eo.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/eo.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/eu.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/eu.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fi.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fi.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fr.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fr.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fur.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/fur.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/hr.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/hr.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/hu.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/hu.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/it.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/it.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ja.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ja.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ko.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ko.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/lt.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/lt.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/nb.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/nb.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/nl.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/nl.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pl.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pl.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pt.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pt.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pt_BR.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/pt_BR.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ru.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/ru.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sk.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sk.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sl.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sl.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sr.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sr.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sv.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/sv.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/tr.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/tr.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/uk.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/uk.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/utsudoers.pot create mode 100644 utsudo-0.0.2/plugins/sudoers/po/vi.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/vi.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/zh_CN.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/zh_CN.po create mode 100644 utsudo-0.0.2/plugins/sudoers/po/zh_TW.mo create mode 100644 utsudo-0.0.2/plugins/sudoers/po/zh_TW.po create mode 100644 utsudo-0.0.2/plugins/sudoers/policy.c create mode 100644 utsudo-0.0.2/plugins/sudoers/prompt.c create mode 100644 utsudo-0.0.2/plugins/sudoers/pwutil.c create mode 100644 utsudo-0.0.2/plugins/sudoers/pwutil.h create mode 100644 utsudo-0.0.2/plugins/sudoers/pwutil_impl.c create mode 100644 utsudo-0.0.2/plugins/sudoers/rcstr.c create mode 100644 utsudo-0.0.2/plugins/sudoers/redblack.c create mode 100644 utsudo-0.0.2/plugins/sudoers/redblack.h create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/check_symbols/check_symbols.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers.defs create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test16.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test16.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test17.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test17.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test18.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test18.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test19.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test19.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.conf create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test21.conf create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test21.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test21.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test22.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test22.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test23.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test23.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test26.err.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test26.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test26.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test27.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test27.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test28.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test28.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test29.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test29.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test3.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test3.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test31.conf create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test31.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test31.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test32.err.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test32.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test32.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test33.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test33.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test4.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test4.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/env_match/check_env_pattern.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/env_match/data create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/iolog_path/check_iolog_path.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/iolog_path/data create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/iolog_util/check_iolog_util.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_base64.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_fill.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_gentime.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/parser/check_hexchar.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/starttime/check_starttime.c create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.in create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.json.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.ldif.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.out.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.toke.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/group create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test2.inc create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test2.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test2.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test3.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test3.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test5.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test5.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test6.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test6.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test7.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test7.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test1.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test1.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test10.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test10.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test2.err.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test2.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test2.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test3.err.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test3.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test3.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test4.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test4.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test5.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test5.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test6.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test6.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.err.ok create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.out.ok create mode 100755 utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.sh create mode 100644 utsudo-0.0.2/plugins/sudoers/set_perms.c create mode 100644 utsudo-0.0.2/plugins/sudoers/solaris_audit.c create mode 100644 utsudo-0.0.2/plugins/sudoers/solaris_audit.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sssd.c create mode 100644 utsudo-0.0.2/plugins/sudoers/starttime.c create mode 100644 utsudo-0.0.2/plugins/sudoers/strlist.c create mode 100644 utsudo-0.0.2/plugins/sudoers/strlist.h create mode 100644 utsudo-0.0.2/plugins/sudoers/stubs.c create mode 100644 utsudo-0.0.2/plugins/sudoers/sudo_ldap.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudo_ldap_conf.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudo_nss.c create mode 100644 utsudo-0.0.2/plugins/sudoers/sudo_nss.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudo_printf.c create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers.c create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers.exp create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers.in create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers_debug.c create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers_debug.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoers_version.h create mode 100644 utsudo-0.0.2/plugins/sudoers/sudoreplay.c create mode 100644 utsudo-0.0.2/plugins/sudoers/testsudoers.c create mode 100644 utsudo-0.0.2/plugins/sudoers/timeout.c create mode 100644 utsudo-0.0.2/plugins/sudoers/timestamp.c create mode 100644 utsudo-0.0.2/plugins/sudoers/timestr.c create mode 100644 utsudo-0.0.2/plugins/sudoers/toke.c create mode 100644 utsudo-0.0.2/plugins/sudoers/toke.h create mode 100644 utsudo-0.0.2/plugins/sudoers/toke.l create mode 100644 utsudo-0.0.2/plugins/sudoers/toke_util.c create mode 100644 utsudo-0.0.2/plugins/sudoers/tsdump.c create mode 100644 utsudo-0.0.2/plugins/sudoers/tsgetgrpw.c create mode 100644 utsudo-0.0.2/plugins/sudoers/tsgetgrpw.h create mode 100644 utsudo-0.0.2/plugins/sudoers/visudo.c create mode 100644 utsudo-0.0.2/plugins/system_group/Makefile.in create mode 100644 utsudo-0.0.2/plugins/system_group/system_group.c create mode 100644 utsudo-0.0.2/plugins/system_group/system_group.exp create mode 100644 utsudo-0.0.2/po/README create mode 100644 utsudo-0.0.2/po/ast.mo create mode 100644 utsudo-0.0.2/po/ast.po create mode 100644 utsudo-0.0.2/po/ca.mo create mode 100644 utsudo-0.0.2/po/ca.po create mode 100644 utsudo-0.0.2/po/cs.mo create mode 100644 utsudo-0.0.2/po/cs.po create mode 100644 utsudo-0.0.2/po/da.mo create mode 100644 utsudo-0.0.2/po/da.po create mode 100644 utsudo-0.0.2/po/de.mo create mode 100644 utsudo-0.0.2/po/de.po create mode 100644 utsudo-0.0.2/po/eo.mo create mode 100644 utsudo-0.0.2/po/eo.po create mode 100644 utsudo-0.0.2/po/es.mo create mode 100644 utsudo-0.0.2/po/es.po create mode 100644 utsudo-0.0.2/po/eu.mo create mode 100644 utsudo-0.0.2/po/eu.po create mode 100644 utsudo-0.0.2/po/fi.mo create mode 100644 utsudo-0.0.2/po/fi.po create mode 100644 utsudo-0.0.2/po/fr.mo create mode 100644 utsudo-0.0.2/po/fr.po create mode 100644 utsudo-0.0.2/po/fur.mo create mode 100644 utsudo-0.0.2/po/fur.po create mode 100644 utsudo-0.0.2/po/gl.mo create mode 100644 utsudo-0.0.2/po/gl.po create mode 100644 utsudo-0.0.2/po/hr.mo create mode 100644 utsudo-0.0.2/po/hr.po create mode 100644 utsudo-0.0.2/po/hu.mo create mode 100644 utsudo-0.0.2/po/hu.po create mode 100644 utsudo-0.0.2/po/it.mo create mode 100644 utsudo-0.0.2/po/it.po create mode 100644 utsudo-0.0.2/po/ja.mo create mode 100644 utsudo-0.0.2/po/ja.po create mode 100644 utsudo-0.0.2/po/ko.mo create mode 100644 utsudo-0.0.2/po/ko.po create mode 100644 utsudo-0.0.2/po/nb.mo create mode 100644 utsudo-0.0.2/po/nb.po create mode 100644 utsudo-0.0.2/po/nl.mo create mode 100644 utsudo-0.0.2/po/nl.po create mode 100644 utsudo-0.0.2/po/nn.mo create mode 100644 utsudo-0.0.2/po/nn.po create mode 100644 utsudo-0.0.2/po/pl.mo create mode 100644 utsudo-0.0.2/po/pl.po create mode 100644 utsudo-0.0.2/po/pt.mo create mode 100644 utsudo-0.0.2/po/pt.po create mode 100644 utsudo-0.0.2/po/pt_BR.mo create mode 100644 utsudo-0.0.2/po/pt_BR.po create mode 100644 utsudo-0.0.2/po/ru.mo create mode 100644 utsudo-0.0.2/po/ru.po create mode 100644 utsudo-0.0.2/po/sk.mo create mode 100644 utsudo-0.0.2/po/sk.po create mode 100644 utsudo-0.0.2/po/sl.mo create mode 100644 utsudo-0.0.2/po/sl.po create mode 100644 utsudo-0.0.2/po/sr.mo create mode 100644 utsudo-0.0.2/po/sr.po create mode 100644 utsudo-0.0.2/po/sv.mo create mode 100644 utsudo-0.0.2/po/sv.po create mode 100644 utsudo-0.0.2/po/tr.mo create mode 100644 utsudo-0.0.2/po/tr.po create mode 100644 utsudo-0.0.2/po/uk.mo create mode 100644 utsudo-0.0.2/po/uk.po create mode 100644 utsudo-0.0.2/po/utsudo.pot create mode 100644 utsudo-0.0.2/po/vi.mo create mode 100644 utsudo-0.0.2/po/vi.po create mode 100644 utsudo-0.0.2/po/zh_CN.mo create mode 100644 utsudo-0.0.2/po/zh_CN.po create mode 100644 utsudo-0.0.2/po/zh_TW.mo create mode 100644 utsudo-0.0.2/po/zh_TW.po create mode 100755 utsudo-0.0.2/pp create mode 100644 utsudo-0.0.2/src_ori/Makefile.in create mode 100644 utsudo-0.0.2/src_ori/conversation.c create mode 100644 utsudo-0.0.2/src_ori/copy_file.c create mode 100644 utsudo-0.0.2/src_ori/debug_fatal_lbuf.c create mode 100644 utsudo-0.0.2/src_ori/env_hooks.c create mode 100644 utsudo-0.0.2/src_ori/exec.c create mode 100644 utsudo-0.0.2/src_ori/exec_common.c create mode 100644 utsudo-0.0.2/src_ori/exec_monitor.c create mode 100644 utsudo-0.0.2/src_ori/exec_nopty.c create mode 100644 utsudo-0.0.2/src_ori/exec_pty.c create mode 100644 utsudo-0.0.2/src_ori/get_pty.c create mode 100644 utsudo-0.0.2/src_ori/hooks.c create mode 100644 utsudo-0.0.2/src_ori/limits.c create mode 100644 utsudo-0.0.2/src_ori/load_plugins.c create mode 100644 utsudo-0.0.2/src_ori/net_ifs.c create mode 100644 utsudo-0.0.2/src_ori/openbsd.c create mode 100644 utsudo-0.0.2/src_ori/parse_args.c create mode 100644 utsudo-0.0.2/src_ori/preload.c create mode 100644 utsudo-0.0.2/src_ori/preserve_fds.c create mode 100644 utsudo-0.0.2/src_ori/regress/noexec/check_noexec.c create mode 100644 utsudo-0.0.2/src_ori/regress/ttyname/check_ttyname.c create mode 100644 utsudo-0.0.2/src_ori/selinux.c create mode 100644 utsudo-0.0.2/src_ori/sesh.c create mode 100644 utsudo-0.0.2/src_ori/signal.c create mode 100644 utsudo-0.0.2/src_ori/solaris.c create mode 100644 utsudo-0.0.2/src_ori/sudo_edit.c create mode 100644 utsudo-0.0.2/src_ori/sudo_exec.h create mode 100644 utsudo-0.0.2/src_ori/sudo_noexec.c create mode 100644 utsudo-0.0.2/src_ori/sudo_plugin_int.h create mode 100644 utsudo-0.0.2/src_ori/sudo_usage.h.in create mode 100644 utsudo-0.0.2/src_ori/tcsetpgrp_nobg.c create mode 100644 utsudo-0.0.2/src_ori/tgetpass.c create mode 100644 utsudo-0.0.2/src_ori/ttyname.c create mode 100644 utsudo-0.0.2/src_ori/utmp.c create mode 100644 utsudo-0.0.2/src_ori/utsudo.c create mode 100644 utsudo-0.0.2/src_ori/utsudo.h create mode 100644 utsudo-0.0.2/sudo.pp diff --git a/0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch b/0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch deleted file mode 100644 index fedf3e3..0000000 --- a/0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch +++ /dev/null @@ -1,387 +0,0 @@ -From 2c066e021947d7a876cf4fd22cfdc8aa783401ec Mon Sep 17 00:00:00 2001 -From: wanglujun -Date: Mon, 7 Aug 2023 08:57:02 +0800 -Subject: [PATCH] fix compile error: undefined reference to sys_sigabbrev - ---- - lib/util/src/sig2str.rs | 163 ++++++++++++++++++++++++++++++++++++---- - lib/util/src/str2sig.rs | 147 +++++++++++++++++++++++++++++++++++- - 2 files changed, 291 insertions(+), 19 deletions(-) - -diff --git a/lib/util/src/sig2str.rs b/lib/util/src/sig2str.rs -index 05838c8..be45208 100644 ---- a/lib/util/src/sig2str.rs -+++ b/lib/util/src/sig2str.rs -@@ -49,19 +49,10 @@ macro_rules! NSIG { - }; - } - --/* sys_sigabbrev is not declared by glibc */ --// # define sudo_sys_signame sys_sigabbrev --#[macro_export] --macro_rules! sudo_sys_signame { -- () => { -- sys_sigabbrev -- }; --} -- - pub type size_t = libc::c_ulong; --pub const _SC_RTSIG_MAX: libc::c_int = 31; -+pub const _SC_RTSIG_MAX: libc::c_uint = 31; - pub type __int32_t = libc::c_int; --pub const _ISlower: libc::c_int = 512; -+pub const _ISlower: libc::c_uint = 512; - - extern "C" { - fn __errno_location() -> *mut libc::c_int; -@@ -75,7 +66,6 @@ extern "C" { - _: ... - ) -> libc::c_int; - fn sudo_strlcpy(dst: *mut libc::c_char, src: *const libc::c_char, siz: size_t) -> size_t; -- static sys_sigabbrev: [*const libc::c_char; 65]; - fn __ctype_toupper_loc() -> *mut *const __int32_t; - fn __ctype_b_loc() -> *mut *const libc::c_ushort; - } -@@ -97,9 +87,150 @@ pub unsafe extern "C" fn sudo_sig2str( - signo: libc::c_int, - signame: *mut libc::c_char, - ) -> libc::c_int { -+ static mut sudo_sys_signame: [*mut libc::c_char; 65] = -+ [0 as *const libc::c_char as *mut libc::c_char; 65]; -+ let mut i: libc::c_int = 0; -+ sudo_sys_signame[0 as libc::c_int as usize] = -+ b"Signal 0\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ if (sudo_sys_signame[1 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[1 as libc::c_int as usize] = -+ b"HUP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[2 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[2 as libc::c_int as usize] = -+ b"INT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[3 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[3 as libc::c_int as usize] = -+ b"QUIT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[4 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[4 as libc::c_int as usize] = -+ b"ILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[5 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[5 as libc::c_int as usize] = -+ b"TRAP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[6 as libc::c_int as usize] = -+ b"ABRT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[6 as libc::c_int as usize] = -+ b"IOT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[8 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[8 as libc::c_int as usize] = -+ b"FPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[9 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[9 as libc::c_int as usize] = -+ b"KILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[7 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[7 as libc::c_int as usize] = -+ b"BUS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[11 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[11 as libc::c_int as usize] = -+ b"SEGV\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[31 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[31 as libc::c_int as usize] = -+ b"SYS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[13 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[13 as libc::c_int as usize] = -+ b"PIPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[14 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[14 as libc::c_int as usize] = -+ b"ALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[15 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[15 as libc::c_int as usize] = -+ b"TERM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[16 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[16 as libc::c_int as usize] = -+ b"STKFLT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[29 as libc::c_int as usize] = -+ b"IO\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[24 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[24 as libc::c_int as usize] = -+ b"XCPU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[25 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[25 as libc::c_int as usize] = -+ b"XFSZ\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[26 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[26 as libc::c_int as usize] = -+ b"VTALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[27 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[27 as libc::c_int as usize] = -+ b"PROF\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[28 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[28 as libc::c_int as usize] = -+ b"WINCH\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[10 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[10 as libc::c_int as usize] = -+ b"USR1\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[12 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[12 as libc::c_int as usize] = -+ b"USR2\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[30 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[30 as libc::c_int as usize] = -+ b"PWR\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[29 as libc::c_int as usize] = -+ b"POLL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[19 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[19 as libc::c_int as usize] = -+ b"STOP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[20 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[20 as libc::c_int as usize] = -+ b"TSTP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[18 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[18 as libc::c_int as usize] = -+ b"CONT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[17 as libc::c_int as usize] = -+ b"CHLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[17 as libc::c_int as usize] = -+ b"CLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[21 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[21 as libc::c_int as usize] = -+ b"TTIN\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[22 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[22 as libc::c_int as usize] = -+ b"TTOU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[23 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[23 as libc::c_int as usize] = -+ b"URG\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } - /* Realtime signal support. */ - if signo >= SIGRTMIN!() && signo <= SIGRTMAX!() { -- let mut rtmax: libc::c_long = sysconf(_SC_RTSIG_MAX); -+ let rtmax: libc::c_long = sysconf(_SC_RTSIG_MAX as libc::c_int); - if rtmax > 0 { - if signo == SIGRTMIN!() { - sudo_strlcpy( -@@ -134,12 +265,12 @@ pub unsafe extern "C" fn sudo_sig2str( - return 0; - } - -- if signo > 0 && signo < NSIG!() && !sudo_sys_signame!()[signo as usize].is_null() { -- sudo_strlcpy(signame, sudo_sys_signame!()[signo as usize], SIG2STR_MAX!()); -+ if signo > 0 && signo < NSIG!() && !(sudo_sys_signame[signo as usize]).is_null() { -+ sudo_strlcpy(signame, sudo_sys_signame[signo as usize], SIG2STR_MAX!()); - - /* Make sure we always return an upper case signame. */ - if *(*__ctype_b_loc()).offset(*signame.offset(0 as isize) as isize) as libc::c_int -- & _ISlower -+ & _ISlower as libc::c_int as libc::c_ushort as libc::c_int - != 0 - { - let mut i: libc::c_int = 0; -diff --git a/lib/util/src/str2sig.rs b/lib/util/src/str2sig.rs -index d47bda3..00989e8 100644 ---- a/lib/util/src/str2sig.rs -+++ b/lib/util/src/str2sig.rs -@@ -33,7 +33,6 @@ extern "C" { - fn strcmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; - fn sysconf(__name: libc::c_int) -> libc::c_long; - fn strcasecmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; -- static sys_sigabbrev: [*const libc::c_char; 65]; - fn __errno_location() -> *mut libc::c_int; - } - -@@ -105,6 +104,148 @@ pub unsafe extern "C" fn sudo_str2sig( - let mut errstr: *const libc::c_char = 0 as *const libc::c_char; - let mut signo: libc::c_int = 0; - -+ static mut sudo_sys_signame: [*mut libc::c_char; 65] = -+ [0 as *const libc::c_char as *mut libc::c_char; 65]; -+ let mut i: libc::c_int = 0; -+ sudo_sys_signame[0 as libc::c_int as usize] = -+ b"Signal 0\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ if (sudo_sys_signame[1 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[1 as libc::c_int as usize] = -+ b"HUP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[2 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[2 as libc::c_int as usize] = -+ b"INT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[3 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[3 as libc::c_int as usize] = -+ b"QUIT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[4 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[4 as libc::c_int as usize] = -+ b"ILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[5 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[5 as libc::c_int as usize] = -+ b"TRAP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[6 as libc::c_int as usize] = -+ b"ABRT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[6 as libc::c_int as usize] = -+ b"IOT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[8 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[8 as libc::c_int as usize] = -+ b"FPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[9 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[9 as libc::c_int as usize] = -+ b"KILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[7 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[7 as libc::c_int as usize] = -+ b"BUS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[11 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[11 as libc::c_int as usize] = -+ b"SEGV\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[31 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[31 as libc::c_int as usize] = -+ b"SYS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[13 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[13 as libc::c_int as usize] = -+ b"PIPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[14 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[14 as libc::c_int as usize] = -+ b"ALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[15 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[15 as libc::c_int as usize] = -+ b"TERM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[16 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[16 as libc::c_int as usize] = -+ b"STKFLT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[29 as libc::c_int as usize] = -+ b"IO\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[24 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[24 as libc::c_int as usize] = -+ b"XCPU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[25 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[25 as libc::c_int as usize] = -+ b"XFSZ\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[26 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[26 as libc::c_int as usize] = -+ b"VTALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[27 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[27 as libc::c_int as usize] = -+ b"PROF\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[28 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[28 as libc::c_int as usize] = -+ b"WINCH\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[10 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[10 as libc::c_int as usize] = -+ b"USR1\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[12 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[12 as libc::c_int as usize] = -+ b"USR2\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[30 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[30 as libc::c_int as usize] = -+ b"PWR\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[29 as libc::c_int as usize] = -+ b"POLL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[19 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[19 as libc::c_int as usize] = -+ b"STOP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[20 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[20 as libc::c_int as usize] = -+ b"TSTP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[18 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[18 as libc::c_int as usize] = -+ b"CONT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[17 as libc::c_int as usize] = -+ b"CHLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[17 as libc::c_int as usize] = -+ b"CLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[21 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[21 as libc::c_int as usize] = -+ b"TTIN\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[22 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[22 as libc::c_int as usize] = -+ b"TTOU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ if (sudo_sys_signame[23 as libc::c_int as usize]).is_null() { -+ sudo_sys_signame[23 as libc::c_int as usize] = -+ b"URG\0" as *const u8 as *const libc::c_char as *mut libc::c_char; -+ } -+ - if (*(*__ctype_b_loc()).offset(*signame.offset(0 as isize) as libc::c_uchar as isize) - as libc::c_int - & _ISdigit as libc::c_ushort as libc::c_int) -@@ -187,8 +328,8 @@ pub unsafe extern "C" fn sudo_str2sig( - - signo = 1; - while signo < NSIG as libc::c_int { -- if !(sys_sigabbrev[signo as usize]).is_null() { -- if strcasecmp(signame, sys_sigabbrev[signo as usize]) == 0 { -+ if !(sudo_sys_signame[signo as usize]).is_null() { -+ if strcasecmp(signame, sudo_sys_signame[signo as usize]) == 0 { - *result = signo; - return 0; - } --- -2.31.1 - diff --git a/utsudo-0.0.2/ABOUT-NLS b/utsudo-0.0.2/ABOUT-NLS new file mode 100644 index 0000000..82047a2 --- /dev/null +++ b/utsudo-0.0.2/ABOUT-NLS @@ -0,0 +1,1406 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is a +way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this 'ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU 'gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU 'gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + +1.1 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU 'gettext'. Other packages have their own ways to +internationalization, predating GNU 'gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU 'gettext' functions. Installers may use special +options at configuration time for changing the default behaviour. The +command: + + ./configure --disable-nls + +will _totally_ disable translation of messages. + + When you already have GNU 'gettext' installed on your system and run +configure without an option for your new package, 'configure' will +probably detect the previously built and installed 'libintl' library and +will decide to use it. If not, you may have to to use the +'--enable-nls[=location]' option to tell 'configure' where to look for it. + + Internationalized packages usually have many 'po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at 'configure' time by using the +'--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable 'LINGUAS' +may be set, prior to configuration, to limit the installed set. +'LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.2 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the 'LANG' environment variable to the appropriate +'LL_CC' combination. If you happen to have the 'LC_ALL' or some other +'LC_xxx' environment variables set, you should unset them before setting +'LANG', otherwise the setting of 'LANG' will not have the desired +effect. Here 'LL' is an ISO 639 two-letter language code, and 'CC' is +an ISO 3166 two-letter country code. For example, let's suppose that +you speak German and live in Germany. At the shell prompt, merely +execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in +'sh') or 'export LANG=de_DE' (in 'bash'). This can be done from your +'.login' or '.profile' file, once and for all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of 'LL_CC', with 'LL' denoting the +language and 'CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are used, +such as 'LL' or 'LL_CC.ENCODING'. You can get the list of locales +supported by your system for your language by running the command +'locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +'LANGUAGE'. GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG' +for the purpose of message handling, but you still need to have 'LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather read +translations in German than English for when Swedish is not available, +set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from 'no' to 'nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under 'nb' and some older ones under 'no', it's recommended +for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and +older translations are used. + + In the 'LANGUAGE' environment variable, but not in the 'LANG' +environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to +denote the language's main dialect. For example, 'de' is equivalent to +'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese +as spoken in Portugal) in this context. + +1.3 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +'http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +'-request' appended. For example, speakers of Swedish can send a +message to 'sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate _actively_ +in translations, or at solving translational difficulties, rather than +merely lurking around. If your team does not exist yet and you want to +start one, or if you are unsure about what to do or how to get started, +please write to 'coordinator@translationproject.org' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.4 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of Jun 2014. +The matrix shows, in regard of each package, for which languages PO +files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am an ar as ast az be bg bn bn_IN bs ca crh cs + +---------------------------------------------------+ + a2ps | [] [] [] | + aegis | | + anubis | | + aspell | [] [] [] | + bash | [] [] [] | + bfd | | + binutils | [] | + bison | | + bison-runtime | [] | + buzztrax | [] | + ccd2cue | | + ccide | | + cflow | | + clisp | | + coreutils | [] [] | + cpio | | + cppi | | + cpplib | [] | + cryptsetup | [] | + datamash | | + denemo | [] [] | + dfarc | [] | + dialog | [] [] [] | + dico | | + diffutils | [] | + dink | [] | + direvent | | + doodle | [] | + dos2unix | | + dos2unix-man | | + e2fsprogs | [] [] | + enscript | [] | + exif | [] | + fetchmail | [] [] | + findutils | [] | + flex | [] | + freedink | [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | [] | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gip | [] [] | + gjay | | + glunarclock | [] [] [] | + gnubiff | [] | + gnubik | [] | + gnucash | () () [] | + gnuchess | | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] | + gprof | [] | + gpsdrive | | + gramadoir | | + grep | [] [] | + grub | [] | + gsasl | | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] | + gst-plugins-ugly | [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] | + gtkam | [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] | + hello | [] | + help2man | | + help2man-texi | | + hylafax | | + idutils | | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + iso_639_5 | | + jwhois | | + kbd | [] | + klavaro | [] [] [] [] [] | + latrine | | + ld | [] | + leafpad | [] [] [] [] | + libc | [] [] [] | + libexif | () | + libextractor | | + libgnutls | [] | + libgpg-error | [] | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | | + libiconv | [] [] | + libidn | [] | + liferea | [] [] [] [] | + lilypond | [] [] | + lordsawar | [] | + lprng | | + lynx | [] [] | + m4 | [] | + mailfromd | | + mailutils | | + make | [] | + man-db | [] [] | + man-db-manpages | | + midi-instruments | [] [] [] | + minicom | [] | + mkisofs | [] | + myserver | [] | + nano | [] [] [] | + opcodes | | + parted | [] | + pies | | + popt | [] | + procps-ng | | + procps-ng-man | | + psmisc | [] | + pspp | [] | + pushover | [] | + pwdutils | | + pyspread | | + radius | [] | + recode | [] [] [] | + recutils | | + rpm | | + rush | | + sarg | | + sed | [] [] [] | + sharutils | [] | + shishi | | + skribilo | | + solfege | [] | + solfege-manual | | + spotmachine | | + sudo | [] [] | + sudoers | [] [] | + sysstat | [] | + tar | [] [] [] | + texinfo | [] [] | + texinfo_document | [] | + tigervnc | [] | + tin | | + tin-man | | + tracgoogleappsa... | | + trader | | + util-linux | [] | + ve | | + vice | | + vmm | | + vorbis-tools | [] | + wastesedge | | + wcd | | + wcd-man | | + wdiff | [] [] | + wget | [] [] | + wyslij-po | | + xboard | | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +---------------------------------------------------+ + af am an ar as ast az be bg bn bn_IN bs ca crh cs + 4 0 2 4 3 11 0 8 24 3 3 1 55 4 76 + + da de el en en_GB en_ZA eo es et eu fa fi fr + +--------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] [] [] | + aegis | [] [] [] [] | + anubis | [] [] [] [] [] | + aspell | [] [] [] [] [] [] [] | + bash | [] [] [] [] [] | + bfd | [] [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | [] [] [] [] | + ccd2cue | [] [] [] | + ccide | [] [] [] [] [] [] | + cflow | [] [] [] [] [] | + clisp | [] [] [] [] [] | + coreutils | [] [] [] [] [] | + cpio | [] [] [] [] [] | + cppi | [] [] [] [] [] | + cpplib | [] [] [] [] [] [] | + cryptsetup | [] [] [] [] [] | + datamash | [] [] [] [] | + denemo | | + dfarc | [] [] [] [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] | + dico | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + dink | [] [] [] [] [] [] | + direvent | [] [] [] [] | + doodle | [] [] [] [] | + dos2unix | [] [] [] [] [] | + dos2unix-man | [] [] [] | + e2fsprogs | [] [] [] [] [] | + enscript | [] [] [] [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] () [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] | + flex | [] [] [] [] [] [] | + freedink | [] [] [] [] [] [] [] [] | + fusionforge | [] [] [] | + gas | [] [] [] | + gawk | [] [] [] [] [] | + gcal | [] [] [] [] | + gcc | [] [] | + gdbm | [] [] [] [] [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] | + gip | [] [] [] [] [] [] [] | + gjay | [] [] [] [] | + glunarclock | [] [] [] [] [] | + gnubiff | () [] [] () | + gnubik | [] [] [] [] [] | + gnucash | [] () () () () () () | + gnuchess | [] [] [] [] | + gnulib | [] [] [] [] [] [] [] | + gnunet | [] | + gnunet-gtk | [] | + gold | [] [] [] | + gphoto2 | [] () [] [] | + gprof | [] [] [] [] [] [] | + gpsdrive | [] [] [] [] | + gramadoir | [] [] [] [] [] | + grep | [] [] [] [] [] [] [] | + grub | [] [] [] [] [] | + gsasl | [] [] [] [] [] | + gss | [] [] [] [] [] | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | [] () [] [] [] | + gtkam | [] () [] [] [] [] | + gtkorphan | [] [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] | + guix | [] [] [] | + guix-packages | | + gutenprint | [] [] [] [] | + hello | [] [] [] [] [] [] [] [] | + help2man | [] [] [] [] [] [] [] | + help2man-texi | [] [] [] | + hylafax | [] [] | + idutils | [] [] [] [] [] | + iso_15924 | [] () [] [] () [] () | + iso_3166 | [] () [] [] [] [] () [] () | + iso_3166_2 | [] () () () | + iso_4217 | [] () [] [] [] () [] () | + iso_639 | [] () [] [] () [] () | + iso_639_3 | () () () | + iso_639_5 | () () () | + jwhois | [] [] [] [] [] | + kbd | [] [] [] [] [] [] | + klavaro | [] [] [] [] [] [] [] | + latrine | [] () [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] [] () [] [] | + libextractor | [] | + libgnutls | [] [] [] [] | + libgpg-error | [] [] [] | + libgphoto2 | [] () [] | + libgphoto2_port | [] () [] [] [] [] | + libgsasl | [] [] [] [] [] | + libiconv | [] [] [] [] [] [] [] | + libidn | [] [] [] [] [] | + liferea | [] () [] [] [] [] [] | + lilypond | [] [] [] [] [] [] | + lordsawar | [] [] | + lprng | | + lynx | [] [] [] [] [] [] | + m4 | [] [] [] [] [] [] | + mailfromd | [] | + mailutils | [] [] [] [] | + make | [] [] [] [] [] | + man-db | [] [] [] [] | + man-db-manpages | [] [] | + midi-instruments | [] [] [] [] [] [] [] [] [] | + minicom | [] [] [] [] [] | + mkisofs | [] [] [] | + myserver | [] [] [] [] | + nano | [] [] [] [] [] [] [] | + opcodes | [] [] [] [] [] | + parted | [] [] [] | + pies | [] | + popt | [] [] [] [] [] [] | + procps-ng | [] [] | + procps-ng-man | [] [] | + psmisc | [] [] [] [] [] [] [] | + pspp | [] [] [] | + pushover | () [] [] [] | + pwdutils | [] [] [] | + pyspread | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + recutils | [] [] [] [] | + rpm | [] [] [] [] [] | + rush | [] [] [] | + sarg | [] [] | + sed | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] [] [] | + skribilo | [] [] | + solfege | [] [] [] [] [] [] [] [] | + solfege-manual | [] [] [] [] [] | + spotmachine | [] [] [] [] | + sudo | [] [] [] [] [] [] | + sudoers | [] [] [] [] [] [] | + sysstat | [] [] [] [] [] [] | + tar | [] [] [] [] [] [] [] | + texinfo | [] [] [] [] [] | + texinfo_document | [] [] [] [] | + tigervnc | [] [] [] [] [] [] | + tin | [] [] [] [] | + tin-man | [] | + tracgoogleappsa... | [] [] [] [] [] | + trader | [] [] [] [] [] [] | + util-linux | [] [] [] [] | + ve | [] [] [] [] [] | + vice | () () () | + vmm | [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | [] () | + wcd | [] [] [] [] | + wcd-man | [] | + wdiff | [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] | + wyslij-po | [] [] [] [] | + xboard | [] [] [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] [] [] | + +--------------------------------------------------+ + da de el en en_GB en_ZA eo es et eu fa fi fr + 123 134 32 1 6 0 97 97 23 14 4 106 139 + + ga gd gl gu he hi hr hu hy ia id is it ja ka kk + +-------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | [] | + anubis | [] [] [] [] | + aspell | [] [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] | + binutils | [] [] [] | + bison | [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | | + ccd2cue | [] | + ccide | [] [] | + cflow | [] [] [] | + clisp | | + coreutils | [] [] [] | + cpio | [] [] [] [] [] [] | + cppi | [] [] [] [] [] | + cpplib | [] [] | + cryptsetup | [] | + datamash | | + denemo | [] | + dfarc | [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] [] | + dink | [] | + direvent | [] | + doodle | [] [] | + dos2unix | [] [] | + dos2unix-man | | + e2fsprogs | [] | + enscript | [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] [] [] [] [] | + flex | [] | + freedink | [] [] [] [] | + fusionforge | | + gas | [] | + gawk | [] () [] | + gcal | | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] | + gettext-tools | [] [] [] | + gip | [] [] [] [] [] [] | + gjay | [] | + glunarclock | [] [] [] [] [] [] | + gnubiff | [] [] () | + gnubik | [] [] [] | + gnucash | () () () () () [] | + gnuchess | | + gnulib | [] [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | [] [] [] [] | + gramadoir | [] [] [] | + grep | [] [] [] [] [] [] [] | + grub | [] [] [] | + gsasl | [] [] [] [] [] | + gss | [] [] [] [] [] | + gst-plugins-bad | [] | + gst-plugins-base | [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] [] [] | + guix | [] | + guix-packages | | + gutenprint | [] [] [] | + hello | [] [] [] [] [] | + help2man | [] [] [] | + help2man-texi | | + hylafax | [] | + idutils | [] [] | + iso_15924 | [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | [] [] | + iso_4217 | [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] [] [] | + iso_639_3 | [] [] | + iso_639_5 | | + jwhois | [] [] [] [] | + kbd | [] [] [] | + klavaro | [] [] [] [] | + latrine | [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] [] () | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | | + libgnutls | [] | + libgpg-error | [] [] [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] [] [] | + libidn | [] [] [] [] | + liferea | [] [] [] [] [] | + lilypond | [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | | + mailutils | | + make | [] [] [] [] | + man-db | [] [] | + man-db-manpages | [] [] | + midi-instruments | [] [] [] [] [] [] [] [] [] | + minicom | [] [] [] | + mkisofs | [] [] | + myserver | [] | + nano | [] [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] | + pies | | + popt | [] [] [] [] [] [] [] [] [] [] | + procps-ng | | + procps-ng-man | | + psmisc | [] [] [] [] | + pspp | [] [] | + pushover | [] | + pwdutils | [] | + pyspread | | + radius | [] | + recode | [] [] [] [] [] [] [] | + recutils | | + rpm | [] | + rush | [] | + sarg | | + sed | [] [] [] [] [] [] [] | + sharutils | | + shishi | | + skribilo | [] | + solfege | [] [] | + solfege-manual | | + spotmachine | | + sudo | [] [] [] [] | + sudoers | [] [] [] | + sysstat | [] [] [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] [] | + tigervnc | | + tin | | + tin-man | | + tracgoogleappsa... | [] [] [] [] | + trader | [] [] | + util-linux | [] | + ve | [] | + vice | () () | + vmm | | + vorbis-tools | [] [] | + wastesedge | () | + wcd | | + wcd-man | | + wdiff | [] [] [] | + wget | [] [] [] [] | + wyslij-po | [] [] [] | + xboard | | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] [] | + +-------------------------------------------------+ + ga gd gl gu he hi hr hu hy ia id is it ja ka kk + 36 2 49 4 8 2 54 75 2 6 84 11 89 60 0 3 + + kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl + +--------------------------------------------------+ + a2ps | [] [] | + aegis | [] | + anubis | [] [] [] | + aspell | [] [] | + bash | [] [] | + bfd | | + binutils | | + bison | [] | + bison-runtime | [] [] [] [] [] [] | + buzztrax | | + ccd2cue | | + ccide | [] [] | + cflow | [] | + clisp | [] | + coreutils | [] [] | + cpio | [] | + cppi | | + cpplib | [] | + cryptsetup | [] | + datamash | [] [] | + denemo | | + dfarc | [] [] | + dialog | [] [] [] [] [] [] | + dico | | + diffutils | [] [] [] | + dink | [] | + direvent | [] | + doodle | [] | + dos2unix | [] [] | + dos2unix-man | [] | + e2fsprogs | [] | + enscript | [] | + exif | [] [] | + fetchmail | [] | + findutils | [] [] | + flex | [] | + freedink | [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | | + gcc | | + gdbm | | + gettext-examples | [] [] [] [] [] [] | + gettext-runtime | [] [] | + gettext-tools | [] | + gip | [] [] [] | + gjay | | + glunarclock | [] [] | + gnubiff | [] | + gnubik | [] [] | + gnucash | () () () () () () () [] | + gnuchess | [] [] | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] | + gprof | [] [] | + gpsdrive | [] | + gramadoir | [] | + grep | [] [] | + grub | [] [] [] | + gsasl | [] | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | [] [] | + gtick | [] | + gtkam | [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] | + hello | [] [] [] | + help2man | [] | + help2man-texi | | + hylafax | [] | + idutils | [] | + iso_15924 | () [] [] | + iso_3166 | [] [] [] () [] [] [] [] [] [] | + iso_3166_2 | () [] | + iso_4217 | () [] [] [] | + iso_639 | [] [] () [] [] [] [] | + iso_639_3 | [] () [] | + iso_639_5 | () | + jwhois | [] [] | + kbd | [] | + klavaro | [] [] | + latrine | | + ld | | + leafpad | [] [] [] [] [] | + libc | [] [] | + libexif | [] | + libextractor | [] | + libgnutls | [] [] | + libgpg-error | [] | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | [] [] | + libidn | [] | + liferea | [] [] [] | + lilypond | | + lordsawar | | + lprng | | + lynx | [] | + m4 | [] | + mailfromd | | + mailutils | | + make | [] [] | + man-db | [] | + man-db-manpages | [] | + midi-instruments | [] [] [] [] [] [] [] | + minicom | [] | + mkisofs | [] | + myserver | | + nano | [] [] [] | + opcodes | [] | + parted | [] | + pies | | + popt | [] [] [] [] [] | + procps-ng | | + procps-ng-man | | + psmisc | [] | + pspp | [] [] | + pushover | | + pwdutils | [] | + pyspread | | + radius | [] | + recode | [] [] | + recutils | [] | + rpm | [] | + rush | [] | + sarg | | + sed | [] [] | + sharutils | [] | + shishi | | + skribilo | | + solfege | [] [] | + solfege-manual | [] | + spotmachine | [] | + sudo | [] [] | + sudoers | [] [] | + sysstat | [] [] | + tar | [] [] [] | + texinfo | [] | + texinfo_document | [] | + tigervnc | [] | + tin | | + tin-man | | + tracgoogleappsa... | [] [] [] | + trader | [] | + util-linux | [] | + ve | [] | + vice | [] | + vmm | [] | + vorbis-tools | [] | + wastesedge | [] | + wcd | [] | + wcd-man | [] | + wdiff | [] | + wget | [] [] | + wyslij-po | [] | + xboard | [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + +--------------------------------------------------+ + kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl + 5 11 4 6 0 13 24 3 3 3 4 12 2 40 1 126 + + nn or os pa pl ps pt pt_BR ro ru rw sk sl sq sr + +--------------------------------------------------+ + a2ps | [] [] [] [] [] [] [] | + aegis | [] [] | + anubis | [] [] [] | + aspell | [] [] [] [] [] [] [] | + bash | [] [] [] [] [] | + bfd | [] | + binutils | [] [] | + bison | [] [] [] | + bison-runtime | [] [] [] [] [] [] [] [] | + buzztrax | | + ccd2cue | [] | + ccide | [] [] [] | + cflow | [] [] | + clisp | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cppi | [] [] [] | + cpplib | [] [] [] | + cryptsetup | [] [] | + datamash | [] [] | + denemo | | + dfarc | [] [] [] | + dialog | [] [] [] [] [] [] [] | + dico | [] | + diffutils | [] [] | + dink | | + direvent | [] [] | + doodle | [] [] | + dos2unix | [] [] [] [] | + dos2unix-man | [] [] | + e2fsprogs | [] | + enscript | [] [] [] [] [] [] | + exif | [] [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] [] | + freedink | [] [] [] [] [] | + fusionforge | | + gas | | + gawk | [] | + gcal | | + gcc | | + gdbm | [] [] [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gip | [] [] [] [] [] | + gjay | [] | + glunarclock | [] [] [] [] [] [] | + gnubiff | [] | + gnubik | [] [] [] [] | + gnucash | () () () () [] | + gnuchess | [] [] | + gnulib | [] [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | [] | + gramadoir | [] [] | + grep | [] [] [] [] [] [] | + grub | [] [] [] [] [] | + gsasl | [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] [] [] | + gtkorphan | [] [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] [] | + guix | | + guix-packages | | + gutenprint | [] | + hello | [] [] [] [] [] [] | + help2man | [] [] [] [] | + help2man-texi | [] | + hylafax | | + idutils | [] [] [] | + iso_15924 | [] () [] [] [] [] | + iso_3166 | [] [] [] [] () [] [] [] [] [] [] [] [] | + iso_3166_2 | [] () [] | + iso_4217 | [] [] () [] [] [] [] [] | + iso_639 | [] [] [] () [] [] [] [] [] [] | + iso_639_3 | [] () | + iso_639_5 | () [] | + jwhois | [] [] [] [] | + kbd | [] [] | + klavaro | [] [] [] [] [] | + latrine | [] | + ld | | + leafpad | [] [] [] [] [] [] [] [] [] | + libc | [] [] [] | + libexif | [] () [] | + libextractor | [] | + libgnutls | [] | + libgpg-error | [] [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | [] [] [] | + liferea | [] [] [] [] () [] [] | + lilypond | | + lordsawar | | + lprng | [] | + lynx | [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] | + make | [] [] [] | + man-db | [] [] [] | + man-db-manpages | [] [] [] | + midi-instruments | [] [] [] [] [] [] [] [] | + minicom | [] [] [] [] | + mkisofs | [] [] [] | + myserver | [] [] | + nano | [] [] [] [] [] [] | + opcodes | | + parted | [] [] [] [] [] [] | + pies | [] | + popt | [] [] [] [] [] [] | + procps-ng | [] | + procps-ng-man | [] | + psmisc | [] [] [] [] | + pspp | [] [] | + pushover | | + pwdutils | [] | + pyspread | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + recutils | [] | + rpm | [] | + rush | [] [] [] | + sarg | [] [] | + sed | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] | + shishi | [] [] | + skribilo | | + solfege | [] [] [] | + solfege-manual | [] [] | + spotmachine | [] [] | + sudo | [] [] [] [] [] | + sudoers | [] [] [] [] | + sysstat | [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] [] | + tigervnc | | + tin | [] | + tin-man | | + tracgoogleappsa... | [] [] [] [] | + trader | [] | + util-linux | [] [] | + ve | [] [] [] | + vice | | + vmm | | + vorbis-tools | [] [] [] | + wastesedge | | + wcd | | + wcd-man | | + wdiff | [] [] [] [] [] | + wget | [] [] [] [] [] | + wyslij-po | [] [] [] [] | + xboard | [] [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + +--------------------------------------------------+ + nn or os pa pl ps pt pt_BR ro ru rw sk sl sq sr + 7 3 1 6 117 1 12 84 33 82 3 37 45 7 98 + + sv sw ta te tg th tr uk ur vi wa wo zh_CN zh_HK + +---------------------------------------------------+ + a2ps | [] [] [] [] [] | + aegis | [] | + anubis | [] [] [] [] | + aspell | [] [] [] [] | + bash | [] [] [] [] [] | + bfd | [] [] | + binutils | [] [] [] | + bison | [] [] [] [] | + bison-runtime | [] [] [] [] [] [] | + buzztrax | [] [] [] | + ccd2cue | [] [] | + ccide | [] [] [] | + cflow | [] [] [] [] | + clisp | | + coreutils | [] [] [] [] | + cpio | [] [] [] [] [] | + cppi | [] [] [] | + cpplib | [] [] [] [] [] | + cryptsetup | [] [] [] | + datamash | [] [] [] | + denemo | | + dfarc | [] | + dialog | [] [] [] [] [] [] | + dico | [] | + diffutils | [] [] [] [] [] | + dink | | + direvent | [] [] | + doodle | [] [] | + dos2unix | [] [] [] | + dos2unix-man | [] [] | + e2fsprogs | [] [] [] [] | + enscript | [] [] [] [] | + exif | [] [] [] [] [] | + fetchmail | [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] | + freedink | [] [] | + fusionforge | | + gas | [] | + gawk | [] [] | + gcal | [] [] | + gcc | [] [] | + gdbm | [] [] | + gettext-examples | [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] | + gip | [] [] [] [] | + gjay | [] [] | + glunarclock | [] [] [] [] | + gnubiff | [] [] | + gnubik | [] [] [] | + gnucash | () () () () [] | + gnuchess | [] [] | + gnulib | [] [] [] [] | + gnunet | | + gnunet-gtk | | + gold | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] [] | + grep | [] [] [] [] [] | + grub | [] [] [] [] | + gsasl | [] [] [] [] | + gss | [] [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] [] | + gstreamer | [] [] [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] [] | + gtkspell | [] [] [] [] [] [] [] [] | + guix | [] | + guix-packages | | + gutenprint | [] [] [] | + hello | [] [] [] [] [] | + help2man | [] [] [] | + help2man-texi | [] | + hylafax | [] | + idutils | [] [] [] | + iso_15924 | [] () [] [] () [] | + iso_3166 | [] [] () [] [] () [] [] [] | + iso_3166_2 | () [] [] () [] | + iso_4217 | [] () [] [] () [] [] | + iso_639 | [] [] [] () [] [] () [] [] [] | + iso_639_3 | [] () [] [] () | + iso_639_5 | () [] () | + jwhois | [] [] [] [] | + kbd | [] [] [] | + klavaro | [] [] [] [] [] [] | + latrine | [] [] | + ld | [] [] [] [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] () | + libextractor | [] [] | + libgnutls | [] [] [] [] | + libgpg-error | [] [] [] [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] [] [] | + libidn | () [] [] [] | + liferea | [] [] [] [] [] | + lilypond | [] | + lordsawar | | + lprng | [] | + lynx | [] [] [] [] | + m4 | [] [] [] | + mailfromd | [] [] | + mailutils | [] | + make | [] [] [] | + man-db | [] [] | + man-db-manpages | [] | + midi-instruments | [] [] [] [] [] [] | + minicom | [] [] | + mkisofs | [] [] [] | + myserver | [] | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] [] | + pies | [] [] | + popt | [] [] [] [] [] [] [] | + procps-ng | [] [] | + procps-ng-man | [] | + psmisc | [] [] [] | + pspp | [] [] [] | + pushover | [] | + pwdutils | [] [] | + pyspread | [] | + radius | [] [] | + recode | [] [] [] [] | + recutils | [] [] [] | + rpm | [] [] [] [] | + rush | [] [] | + sarg | | + sed | [] [] [] [] [] | + sharutils | [] [] [] | + shishi | [] | + skribilo | | + solfege | [] [] [] | + solfege-manual | [] | + spotmachine | [] [] | + sudo | [] [] [] [] | + sudoers | [] [] [] | + sysstat | [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + texinfo_document | [] | + tigervnc | [] [] | + tin | [] | + tin-man | | + tracgoogleappsa... | [] [] [] [] [] | + trader | [] | + util-linux | [] [] [] | + ve | [] [] [] [] | + vice | () () | + vmm | | + vorbis-tools | [] [] | + wastesedge | | + wcd | [] [] | + wcd-man | [] | + wdiff | [] [] [] | + wget | [] [] [] | + wyslij-po | [] [] | + xboard | [] | + xdg-user-dirs | [] [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + +---------------------------------------------------+ + sv sw ta te tg th tr uk ur vi wa wo zh_CN zh_HK + 87 1 4 3 0 14 52 114 1 130 7 1 88 7 + + zh_TW + +-------+ + a2ps | | 30 + aegis | | 9 + anubis | | 19 + aspell | | 28 + bash | [] | 25 + bfd | | 9 + binutils | | 12 + bison | [] | 18 + bison-runtime | [] | 38 + buzztrax | | 8 + ccd2cue | | 7 + ccide | | 16 + cflow | | 15 + clisp | | 10 + coreutils | | 20 + cpio | [] | 21 + cppi | | 16 + cpplib | [] | 19 + cryptsetup | | 13 + datamash | | 11 + denemo | | 3 + dfarc | | 16 + dialog | [] | 42 + dico | | 6 + diffutils | | 21 + dink | | 9 + direvent | | 10 + doodle | | 12 + dos2unix | [] | 17 + dos2unix-man | | 8 + e2fsprogs | | 14 + enscript | | 21 + exif | | 26 + fetchmail | | 19 + findutils | | 28 + flex | [] | 18 + freedink | | 23 + fusionforge | | 3 + gas | | 5 + gawk | | 12 + gcal | | 7 + gcc | | 4 + gdbm | | 10 + gettext-examples | [] | 40 + gettext-runtime | [] | 34 + gettext-tools | [] | 24 + gip | [] | 28 + gjay | | 8 + glunarclock | [] | 27 + gnubiff | | 9 + gnubik | | 18 + gnucash | () | 6 + gnuchess | | 10 + gnulib | | 23 + gnunet | | 1 + gnunet-gtk | | 1 + gold | | 7 + gphoto2 | [] | 19 + gprof | | 21 + gpsdrive | | 13 + gramadoir | | 14 + grep | [] | 30 + grub | | 21 + gsasl | [] | 19 + gss | | 17 + gst-plugins-bad | | 13 + gst-plugins-base | | 27 + gst-plugins-good | | 32 + gst-plugins-ugly | | 34 + gstreamer | [] | 31 + gtick | | 19 + gtkam | | 24 + gtkorphan | | 20 + gtkspell | [] | 48 + guix | | 5 + guix-packages | | 0 + gutenprint | | 13 + hello | [] | 29 + help2man | | 18 + help2man-texi | | 5 + hylafax | | 5 + idutils | | 14 + iso_15924 | [] | 23 + iso_3166 | [] | 58 + iso_3166_2 | | 9 + iso_4217 | [] | 28 + iso_639 | [] | 46 + iso_639_3 | | 10 + iso_639_5 | | 2 + jwhois | [] | 20 + kbd | | 16 + klavaro | | 29 + latrine | | 7 + ld | [] | 15 + leafpad | [] | 40 + libc | [] | 24 + libexif | | 9 + libextractor | | 5 + libgnutls | | 13 + libgpg-error | | 15 + libgphoto2 | | 9 + libgphoto2_port | [] | 19 + libgsasl | | 18 + libiconv | [] | 29 + libidn | | 17 + liferea | | 29 + lilypond | | 10 + lordsawar | | 3 + lprng | | 3 + lynx | | 19 + m4 | [] | 22 + mailfromd | | 4 + mailutils | | 6 + make | | 18 + man-db | | 14 + man-db-manpages | | 9 + midi-instruments | [] | 43 + minicom | [] | 17 + mkisofs | | 13 + myserver | | 9 + nano | [] | 29 + opcodes | | 11 + parted | [] | 21 + pies | | 4 + popt | [] | 36 + procps-ng | | 5 + procps-ng-man | | 4 + psmisc | [] | 21 + pspp | | 13 + pushover | | 6 + pwdutils | | 8 + pyspread | | 5 + radius | | 9 + recode | | 31 + recutils | | 9 + rpm | [] | 13 + rush | | 10 + sarg | | 4 + sed | [] | 34 + sharutils | | 12 + shishi | | 6 + skribilo | | 3 + solfege | | 19 + solfege-manual | | 9 + spotmachine | | 9 + sudo | | 23 + sudoers | | 20 + sysstat | | 21 + tar | [] | 30 + texinfo | | 17 + texinfo_document | | 11 + tigervnc | | 10 + tin | [] | 7 + tin-man | | 1 + tracgoogleappsa... | [] | 22 + trader | | 11 + util-linux | | 12 + ve | | 14 + vice | | 1 + vmm | | 3 + vorbis-tools | | 13 + wastesedge | | 2 + wcd | | 7 + wcd-man | | 3 + wdiff | [] | 22 + wget | | 22 + wyslij-po | | 14 + xboard | | 8 + xdg-user-dirs | [] | 68 + xkeyboard-config | [] | 27 + +-------+ + 90 teams zh_TW + 170 domains 44 2805 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and distributed +as such by its maintainer. There might be an observable lag between the +mere existence a PO file and its wide availability in a distribution. + + If Jun 2014 seems to be old, you may fetch a more recent copy of this +'ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix +with full percentage details can be found at +'http://translationproject.org/extra/matrix.html'. + +1.5 Using 'gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU 'gettext' in your +package. Of course you have to respect the GNU Lesser General Public +License which covers the use of the GNU 'gettext' library. This means +in particular that even non-free programs can use 'libintl' as a shared +library, whereas only free software can use 'libintl' as a static +library or use modified versions of 'libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of 'gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact 'coordinator@translationproject.org' +to make the '.pot' files available to the translation teams. diff --git a/utsudo-0.0.2/INSTALL b/utsudo-0.0.2/INSTALL new file mode 100644 index 0000000..ec37856 --- /dev/null +++ b/utsudo-0.0.2/INSTALL @@ -0,0 +1,934 @@ +Sudo installation instructions +============================== + +Sudo uses a `configure' script to probe the capabilities and type +of the system in question. In this release, `configure' takes many +more options than it did before. Please read this document fully +before configuring and building sudo. You may also wish to read the +file INSTALL.configure which explains more about the `configure' script. + +System requirements +=================== + +To build sudo from the source distribution you need a POSIX-compliant +operating system (any modern version of BSD, Linux or Unix should work), +an ANSI/ISO C compiler that supports the "long long" type, variadic +macros (a C99 feature) as well as the ar, make and ranlib utilities. + +If you wish to modify the parser then you will need flex version +2.5.2 or later and either bison or byacc (sudo comes with a +pre-generated parser). You'll also have to run configure with the +--with-devel option or pass DEVEL=1 to make. You can get flex from +http://flex.sourceforge.net/. You can get GNU bison from +ftp://ftp.gnu.org/pub/gnu/bison/ or any GNU mirror. + +Simple sudo installation +======================== + +For most systems and configurations it is possible simply to: + + 0) If you are upgrading from a previous version of sudo + please read the info in the doc/UPGRADE file before proceeding. + + 1) Read the `OS dependent notes' section for any particular + "gotchas" relating to your operating system. + + 2) `cd' to the source or build directory and type `./configure' + to generate a Makefile and config.h file suitable for building + sudo. Before you actually run configure you should read the + `Available configure options' section to see if there are + any special options you may want or need. + + 4) Type `make' to compile sudo. If you are building sudo + in a separate build tree (apart from the sudo source) GNU + make will probably be required. If `configure' did its job + properly (and you have a supported configuration) there won't + be any problems. If this doesn't work, take a look at the + doc/TROUBLESHOOTING file for tips on what might have gone + wrong. Please mail us if you have a fix or if you are unable + to come up with a fix (address at EOF). + + 5) Type `make install' (as root) to install sudo, visudo, the + man pages, and a skeleton sudoers file. Note that the install + will not overwrite an existing sudoers file. You can also + install various pieces the package via the install-binaries, + install-doc, and install-sudoers make targets. + + 6) Edit the sudoers file with `visudo' as necessary for your + site. You will probably want to refer the example sudoers + file and sudoers man page included with the sudo package. + + 7) If you want to use syslogd(8) to do the logging, you'll need + to update your /etc/syslog.conf file. See the example syslog.conf + file included in the distribution for an example. + +Available configure options +=========================== + +This section describes flags accepted by the sudo's `configure' script. +Defaults are listed in brackets after the description. + +Configuration: + --cache-file=FILE + Cache test results in FILE + + --config-cache, -C + Alias for `--cache-file=config.cache' + + --help, -h + Print the usage/help info + + --no-create, -n + Do not create output files + + --quiet, --silent, -q + Do not print `checking...' messages + + --srcdir=DIR + Find the sources in DIR [configure dir or `..'] + +Directory and file names: + --prefix=PREFIX + Install architecture-independent files in PREFIX. [/usr/local] + + --exec-prefix=EPREFIX + Install architecture-dependent files in EPREFIX. + This includes the executables and plugins. [same as PREFIX] + + --bindir=DIR + Install `sudo', `sudoedit' and `sudoreplay' in DIR. [EPREFIX/bin] + + --sbindir=DIR + Install `visudo' in DIR. [EPREFIX/sbin] + + --libexecdir=DIR + Install plugins and helper programs in DIR/sudo [PREFIX/libexec/utsudo] + + --sysconfdir=DIR + Look for `sudo.conf' and `sudoers' files in DIR. [/etc] + + --includedir=DIR + Install sudo_plugin.h include file in DIR [PREFIX/include] + + --datarootdir=DIR + Root directory for platform-independent data files [PREFIX/share] + + --localedir=DIR + Install sudo and sudoers locale files in DIR [DATAROOTDIR/locale] + + --mandir=DIR + Install man pages in DIR [PREFIX/man] + + --docdir=DIR + Install other sudo documentation in DIR [DATAROOTDIR/doc/sudo] + + --with-exampledir=DIR + Install sudo example files in DIR [DATAROOTDIR/doc/sudo/examples] + + --with-plugindir=DIR + The directory that sudo looks in to find the policy and I/O + logging plugins. Defaults to the LIBEXEC/sudo. + + --with-rundir=DIR + The directory to be used for sudo-specific files that do + not survive a system reboot. This is typically where the + time stamp directory is located. By default, configure + will choose from the following list: + /run/sudo /var/run/sudo, /var/db/sudo, /var/lib/sudo, + /var/adm/sudo, /usr/adm/sudo + This directory should be cleared when the system reboots. + On systems that lack /run or /var/run, the default rundir and + vardir may be the same. In this case, only the ts directory + inside the rundir needs to be cleared at boot time. + + --with-vardir=DIR + The directory to be used for sudo-specific files that survive + a system reboot. This is typically where the lecture status + directory is stored. By default, configure will choose + from the following list: + /var/db/sudo, /var/lib/sudo, /var/adm/sudo, /usr/adm/sudo + This directory should *not* be cleared when the system boots. + + --with-tzdir=DIR + The directory to the system's time zone data files. This + is only used when sanitizing the TZ environment variable + to allow for fully-qualified paths in TZ. By default, + configure will look for an existing "zoneinfo" directory + in the following locations: + /usr/share /usr/share/lib /usr/lib /etc + If no zoneinfo directory is found, the TZ variable may not + contain a fully-qualified path. + +Compilation options: + --disable-hardening + Disable the use of compiler/linker exploit mitigation options + which are enabled by default. This includes compiling with + _FORTIFY_SOURCE defined to 2, building with -fstack-protector + and linking with -zrelro, where supported. + + --enable-asan + Enable the use of AddressSanitizer if supported by the + compiler. This can help detect common problems such as + buffer overflows and user after free bugs as well as behavior + undefined by the C standard. For more information see + https://github.com/google/sanitizers/wiki/AddressSanitizer + The following compiler flag is used: -fsanitize=address,undefined + + This option should only be used for testing and not in a + production environment. Due to AddressSanitizer's unchecked + use of environment variables, it is trivial to exploit a + setuid root executable such as sudo. + + --enable-pie + Build sudo and related programs as as a position independent + executables (PIE). This improves the effectiveness of address + space layout randomization (ASLR) on systems that support it. + Sudo will create PIE binaries by default on Linux systems. + + --disable-pie + Disable the creation of position independent executables (PIE), + even if the compiler creates PIE binaries by default. This + option may be needed on some Linux systems where PIE binaries + are not fully supported. + + --disable-poll + Use select() instead of poll() in the event loop. By default, + sudo will use poll() on systems that support it. Some systems + have a broken poll() implementation and need to use select instead. + On Mac OS X, select() is always used since its poll() doesn't + support devices. + + --disable-rpath + By default, configure will use -Rpath in addition to -Lpath + when passing library paths to the loader. This option will + disable the use of -Rpath. + + --disable-shared + Disable dynamic shared object support. By default, sudo + is built with a plugin API capable of loading arbitrary + policy and I/O logging plugins. If the --disable-shared + option is specified, this support is disabled and the default + sudoers policy and I/O plugins are embedded in the sudo + binary itself. This will also disable the noexec option + as it too relies on dynamic shared object support. + + --disable-shared-libutil + Disable the use of the dynamic libsudo_util library. By + default, sudo, the sudoers plugin and the associated sudo + utilities are linked against a shared version of libsudo_util. + If the --disable-shared-libutil option is specified, a + static version of the libsudo_util library will be used + instead. This option may only be used in conjunction with + the --enable-static-sudoers option. + + --enable-static-sudoers + By default, the sudoers plugin is built and installed as a + dynamic shared object. When the --enable-static-sudoers + option is specified, the sudoers plugin is compiled directly + into the sudo binary. Unlike --disable-shared, this does + not prevent other plugins from being used and the noexec + option will continue to function. + + --enable-tmpfiles.d=DIR + Set the directory to be used when installing the sudo + tmpfiles.d file. This is used to create (or clear) the + sudo time stamp directory on operating systems that use + systemd. If this option is not specified, configure will + use the /usr/lib/tmpfiles.d directory if the file + /usr/lib/tmpfiles.d/systemd.conf exists. + + --enable-zlib[=location] + Enable the use of the zlib compress library when storing + I/O log files. If specified, location is the base directory + containing the zlib include and lib directories. The special + values "system", "builtin", "shared" and "static" can be + used to indicate that the system version of zlib should be + used or that the version of zlib shipped with sudo should + be used instead. If "static" is specified, sudo will + statically link the builtin zlib and not install it. If + this option is not specified, configure will use the system + zlib if it is present, falling back on the sudo version. + + --with-incpath=DIR + Adds the specified directory (or directories) to CPPFLAGS + so configure and the compiler will look there for include + files. Multiple directories may be specified as long as + they are space separated. + E.g. --with-incpath="/usr/local/include /opt/include" + + --with-libpath=DIR + Adds the specified directory (or directories) to LDFLAGS + so configure and the compiler will look there for libraries. + Multiple directories may be specified as with --with-incpath. + + --with-libraries=LIBRARY + Adds the specified library (or libraries) to SUDO_LIBS and + and VISUDO_LIBS so sudo will link against them. If the + library doesn't start with `-l' or end in `.a' or `.o' a + `-l' will be pre-pended to it. Multiple libraries may be + specified as long as they are space separated. + + --with-libtool=PATH + By default, sudo will use the included version of libtool + to build shared libraries. The --with-libtool option can + be used to specify a different version of libtool to use. + The special values "system" and "builtin" can be used in + place of a path to denote the default system libtool (obtained + via the user's PATH) and the default libtool that comes + with sudo. + +Optional features: + --disable-root-mailer + By default sudo will run the mailer as root when tattling + on a user so as to prevent that user from killing the mailer. + With this option, sudo will run the mailer as the invoking + user which some people consider to be safer. + + --enable-nls[=location] + Enable natural language support using the gettext() family + of functions. If specified, location is the base directory + containing the libintl include and lib directories. If + this option is not specified, configure will look for the + gettext() family of functions in the standard C library + first, then check for a standalone libintl (linking with + libiconv as needed). + + --disable-nls + Disable natural language support. By default, sudo will + use the gettext() family of functions, if available, to + implement messages in the invoking user's native language. + Note that translations do not exist for all languages. + + --with-ldap[=DIR] + Enable LDAP support. If specified, DIR is the base directory + containing the LDAP include and lib directories. Please see + README.LDAP for more information. + + --with-ldap-conf-file=PATH + Path to LDAP configuration file. If specified, sudo reads + this file instead of /etc/ldap.conf to locate the LDAP server. + + --with-ldap-secret-file=PATH + Path to LDAP secret password file. If specified, sudo uses + this file instead of /etc/ldap.secret to read the secret password + when rootbinddn is specified in the ldap config file. + + --disable-sasl + Disable SASL authentication for LDAP. By default, sudo + will compile in support for SASL authentication if the + ldap_sasl_interactive_bind_s() function is present in the + LDAP libraries. + + --with-logincap + This adds support for login classes specified in /etc/login.conf. + It is enabled by default on BSD/OS, Darwin, FreeBSD, OpenBSD and + NetBSD (where available). By default, a login class is not applied + unless the 'use_loginclass' option is defined in sudoers or the user + specifies a class on the command line. + + --with-interfaces=no, --without-interfaces + This option keeps sudo from trying to glean the ip address + from each attached Ethernet interface. It is only useful + on a machine where sudo's interface reading support does + not work, which may be the case on some SysV-based OS's + using STREAMS. + + --with-noexec[=PATH] + Enable support for the "noexec" functionality which prevents + a dynamically-linked program being run by sudo from executing + another program (think shell escapes). Please see the + "PREVENTING SHELL ESCAPES" section in the sudoers man page + for details. If specified, PATH should be a fully qualified + path name, e.g. /usr/local/libexec/utsudo/sudo_noexec.so. If PATH + is "no", noexec support will not be compiled in. The default + is to compile noexec support if libtool supports building + shared objects on your OS. + + --with-selinux + Enable support for role based access control (RBAC) on + systems that support SELinux. + + --with-sssd + Enable support for using the System Security Services Daemon + (SSSD) as a sudoers data source. For more information on + SSD, see http://fedorahosted.org/sssd/ + + --with-sssd-conf=PATH + Specify the path to the SSSD configuration file, if different + from the default value of /etc/sssd/sssd.conf. + + --with-sssd-lib=PATH + Specify the path to the SSSD shared library, which is loaded + at run-time. + + --enable-offensive-insults + Enable potentially offensive sudo insults from the classic + version of sudo. + + --enable-pvs-studio + Generate a sample PVS-Studio.cfg file based on the compiler and + platform type. The "pvs-studio" Makefile target can then be + used if PVS-Studio is installed. + +Operating system-specific options: + --disable-setreuid + Disable use of the setreuid() function for operating systems + where it is broken. For instance, 4.4BSD has setreuid() that + is not fully functional. + + --disable-setresuid + Disable use of the setresuid() function for operating systems + where it is broken (none currently known). + + --enable-admin-flag + Enable the creation of an Ubuntu-style admin flag file + the first time sudo is run. + + --enable-devsearch=PATH + Set a system-specific search path of directories to look in + for device nodes. Sudo uses this when mapping the process's + tty device number to a device name. The default value is: + /dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev + + --with-bsm-audit + Enable support for sudo BSM audit logs on systems that support it. + This includes recent versions of FreeBSD, Mac OS X and Solaris. + + --with-linux-audit + Enable audit support for Linux systems. Audits attempts + to run a command as well as SELinux role changes. + + --with-man + Use the "man" macros for manual pages. By default, mdoc versions + of the manuals are installed if supported. This can be used to + override configure's test for "nroff -mdoc" support. + + --with-mdoc + Use the "mdoc" macros for manual pages. By default, mdoc versions + of the manuals are installed if supported. This can be used to + override configure's test for "nroff -mdoc" support. + + --with-netsvc[=PATH] + Path to netsvc.conf or "no" to disable netsvc.conf support. + If specified, sudo uses this file instead of /etc/netsvc.conf + on AIX systems. If netsvc support is disabled but LDAP is + enabled, sudo will check LDAP first, then the sudoers file. + + --with-nsswitch[=PATH] + Path to nsswitch.conf or "no" to disable nsswitch support. + If specified, sudo uses this file instead of /etc/nsswitch.conf. + If nsswitch support is disabled but LDAP is enabled, sudo will + check LDAP first, then the sudoers file. + + --with-project + Enable support for Solaris project resource limits. + This option is only available on Solaris 9 and above. + +Authentication options: + --with-AFS + Enable AFS support with Kerberos authentication. Should work under + AFS 3.3. If your AFS doesn't have -laudit you should be able to + link without it. + + --with-aixauth + Enable support for the AIX general authentication function. + This will use the authentication scheme specified for the + user on the machine. By default, sudo will use either AIX + authentication or PAM depending on the value of the auth_type + setting in the /etc/security/login.cfg file. + + --with-bsdauth + Enable support for BSD authentication. This is the default + for BSD/OS and OpenBSD systems that support it. + It is not possible to mix BSD authentication with other + authentication methods (and there really should be no need + to do so). Note that only the newer BSD authentication API + is supported. If you don't have /usr/include/bsd_auth.h + then you cannot use this. + + --with-DCE + Enable DCE support for systems without PAM. Known to work on + HP-UX 9.X, 10.X, and 11.0; other systems may require source + code and/or `configure' changes. On systems with PAM support + (such as HP-UX 11.0 and higher, Solaris, FreeBSD and Linux), the + DCE PAM module (usually libpam_dce) should be used instead. + + --with-fwtk[=DIR] + Enable TIS Firewall Toolkit (FWTK) 'authsrv' support. If specified, + DIR is the base directory containing the compiled FWTK package + (or at least the library and header files). + + --with-kerb5[=DIR] + Enable Kerberos V support. If specified, DIR is the base + directory containing the Kerberos V include and lib dirs. + This uses Kerberos pass phrases for authentication but + does not use the Kerberos cookie scheme. Will not work for + Kerberos V older than version 1.1. + + --enable-kerb5-instance=string + By default, the user name is used as the principal name + when authenticating via Kerberos V. If this option is + enabled, the specified instance string will be appended to + the user name (separated by a slash) when creating the + principal name. + + --with-solaris-audit + Enable audit support for Solaris 11 and above. + For older versions of Solaris, use --with-bsm-audit + + --with-opie[=DIR] + Enable NRL OPIE OTP (One Time Password) support. If specified, + DIR should contain include and lib directories with opie.h + and libopie.a respectively. + + --with-otp-only + This option is now just an alias for --without-passwd. + + --with-pam + Enable PAM support. This is on by default for Darwin, FreeBSD, + Linux, Solaris and HP-UX (version 11 and higher). + + NOTE: on RedHat Linux and Fedora you *must* have an /etc/pam.d/sudo + file install. You may either use the example pam.conf file included + with sudo or use /etc/pam.d/su as a reference. The pam.conf file + included with sudo may or may not work with other Linux distributions. + On Solaris and HP-UX 11 systems you should check (and understand) + the contents of /etc/pam.conf. Do a "man pam.conf" for more + information and consider using the "debug" option, if available, + with your PAM libraries in /etc/pam.conf to obtain syslog output + for debugging purposes. + + --with-pam-login + Enable a specific PAM session when sudo is given the -i option. + This changes the PAM service name when sudo is run with the -i + option from "sudo" to "sudo-i", allowing for a separate pam + configuration for sudo's initial login mode. + + --disable-pam-session + Disable sudo's PAM session support. This may be needed on + older PAM implementations or on operating systems where + opening a PAM session changes the utmp or wtmp files. If + PAM session support is disabled, resource limits may not + be updated for the command being run. + + --with-passwd=no, --without-passwd + This option excludes authentication via the passwd (or + shadow) file. It should only be used when another, alternative, + authentication scheme is in use. + + --with-SecurID[=DIR] + Enable SecurID support. If specified, DIR is directory containing + libaceclnt.a, acexport.h, and sdacmvls.h. + + --with-skey[=DIR] + Enable S/Key OTP (One Time Password) support. If specified, + DIR should contain include and lib directories with skey.h + and libskey.a respectively. + + --disable-sia + Disable SIA support. This is the "Security Integration + Architecture" on Digital UNIX. If you disable SIA sudo will + use its own authentication routines. + + --disable-shadow + Disable shadow password support. Normally, sudo will compile + in shadow password support and use a shadow password if it + exists. + + --enable-gss-krb5-ccache-name + Use the gss_krb5_ccache_name() function to set the Kerberos + V credential cache file name. By default, sudo will use + the KRB5CCNAME environment variable to set this. While + gss_krb5_ccache_name() provides a better API to do this it + is not supported by all Kerberos V and SASL combinations. + + --enable-gcrypt[=DIR] + Use GNU crypt's SHA-2 message digest functions instead of the + ones bundled with sudo (or in the system's C library). + If specified, DIR should contain include and lib directories + with gcrypt.h and libgcrypt respectively. + + --enable-openssl[=DIR] + Use OpenSSL's SHA-2 message digest functions instead of the + ones bundled with sudo (or in the system's C library). + If specified, DIR should contain include and lib directories + with openssl/sha.h and libcrypto respectively. + +Development options: + --enable-env-debug + Enable debugging of the environment setting functions. This + enables extra checks to make sure the environment does not + become corrupted. + + --enable-warnings + Enable compiler warnings when building sudo with gcc or clang. + + --enable-werror + Enable the -Werror compiler option when building sudo with + gcc or clang. + + --with-devel + Configure development options. This will enable compiler warnings + and set up the Makefile to be able to regenerate the sudoers parser + as well as the manual pages. + + --with-efence + Link with the "electric fence" debugging malloc. + +Options that set runtime-changeable default values: + --disable-authentication + By default, sudo requires the user to authenticate via a + password or similar means. This options causes sudo to + *not* require authentication. It is possible to turn + authentication back on in sudoers via the PASSWD attribute. + Sudoers option: !authenticate + + --disable-env-reset + Disable environment resetting. This sets the default value + of the "env_reset" Defaults option in sudoers to false. + Sudoers option: !env_reset + + --disable-path-info + Normally, sudo will tell the user when a command could not be found + in their $PATH. Some sites may wish to disable this as it could + be used to gather information on the location of executables that + the normal user does not have access to. The disadvantage is that + if the executable is simply not in the user's path, sudo will tell + the user that they are not allowed to run it, which can be confusing. + Sudoers option: path_info + + --disable-root-sudo + Don't let root run sudo. This can be used to prevent people from + "chaining" sudo commands to get a root shell by doing something + like "sudo sudo /bin/sh". + Sudoers option: !root_sudo + + --disable-zlib + Disable the use of the zlib compress library when storing + I/O log files. + Sudoers option: !compress_io + + --enable-log-host + Log the hostname in the log file. + Sudoers option: log_host + + --enable-noargs-shell + If sudo is invoked with no arguments it acts as if the "-s" flag had + been given. That is, it runs a shell as root (the shell is determined + by the SHELL environment variable, falling back on the shell listed + in the invoking user's /etc/passwd entry). + Sudoers option: shell_noargs + + --enable-shell-sets-home + If sudo is invoked with the "-s" flag the HOME environment variable + will be set to the home directory of the target user (which is root + unless the "-u" option is used). This option effectively makes the + "-s" flag imply "-H". + Sudoers option: set_home + + --enable-timestamp-type=TYPE + Set the default time stamp record type. The TYPE may be "global" + (a single record per user), "ppid" (a single record for process + with the same parent process), or "tty" (a separate record for + each login session). The default is "tty". + Sudoers option: timestamp_type + + --with-all-insults + Include all the insult sets listed below. You must either specify + --with-insults or enable insults in the sudoers file for this to + have any effect. + + --with-askpass=PATH + Set PATH as the "askpass" program to use when no tty is + available. Typically, this is a graphical password prompter, + similar to the one used by ssh. The program must take a + prompt as an argument and print the received password to + the standard output. This value may overridden at run-time + in the sudo.conf file. + + --with-badpass-message="BAD PASSWORD MESSAGE" + Message that is displayed if a user enters an incorrect password. + The default is "Sorry, try again." unless insults are turned on. + Sudoers option: badpass_message + + --with-badpri=PRIORITY + Determines which syslog priority to log unauthenticated + commands and errors. The following priorities are supported: + alert, crit, debug, emerg, err, info, notice, and warning. + Sudoers option: syslog_badpri + + --with-classic-insults + Uses insults from sudo "classic." If you just specify --with-insults + you will get the classic and CSOps insults. This is on by default if + --with-insults is given. + + --with-csops-insults + Insults the user with an extra set of insults (some quotes, some + original) from a sysadmin group at CU (CSOps). You must specify + --with-insults as well for this to have any effect. This is on by + default if --with-insults is given. + + --with-editor=PATH + Specify the default editor path for use by visudo. This may be a + single path name or a colon-separated list of editors. In the latter + case, visudo will choose the editor that matches the user's SUDO_EDITOR, + VISUAL or EDITOR environment variable, or the first editor in the list + that exists. The default is the path to vi on your system. + Sudoers option: editor + + --with-env-editor=no, --without-env-editor + By default, visudo will consult the SUDO_EDITOR, VISUAL and EDITOR + environment variables before falling back on the default editor list + (as specified by --with-editor). visudo is typically run as root so + this option may allow a user with visudo privileges to run arbitrary + commands as root without logging. Some sites may with to disable this + and use a colon-separated list of "safe" editors with the --with-editor + option. visudo will then only use the SUDO_EDITOR, VISUAL or EDITOR + variables if they match a value specified via --with-editor. + Sudoers option: env_editor + + --with-exempt=GROUP + Users in the specified group don't need to enter a password when + running sudo. This may be useful for sites that don't want their + "core" sysadmins to have to enter a password but where Jr. sysadmins + need to. You should probably use NOPASSWD in sudoers instead. + Sudoers option: exempt_group + + --with-fqdn + Define this if you want to put fully qualified host names in the sudoers + file. Ie: instead of myhost you would use myhost.mydomain.edu. You may + still use the short form if you wish (and even mix the two). Beware + that turning FQDN on requires sudo to make DNS lookups which may make + sudo unusable if your DNS is totally hosed. Also note that you must + use the host's official name as DNS knows it. That is, you may not use + a host alias (CNAME entry) due to performance issues and the fact that + there is no way to get all aliases from DNS. + Sudoers option: fqdn + + --with-goodpri=PRIORITY + Determines which syslog priority to log successfully + authenticated commands. The following priorities are + supported: alert, crit, debug, emerg, err, info, notice, + and warning. + Sudoers option: syslog_goodpri + + --with-python-insults + Insults the user with lines from "Monty Python's Flying Circus" when an + incorrect password is entered. You must either specify --with-insults or + enable insults in the sudoers file for this to have any effect. + + --with-goons-insults + Insults the user with lines from the "Goon Show" when an incorrect + password is entered. You must either specify --with-insults or + enable insults in the sudoers file for this to have any effect. + + --with-hal-insults + Uses 2001-like insults when an incorrect password is entered. + You must either specify --with-insults or enable insults in the + sudoers file for this to have any effect. + + --with-ignore-dot + If set, sudo will ignore '.' or '' (current dir) in $PATH. + The $PATH itself is not modified. + Sudoers option: ignore_dot + + --with-insults + Define this if you want to be insulted for typing an incorrect password + just like the original sudo(8). This is off by default. + Sudoers option: insults + + --with-insults=disabled + Include support for insults but disable them unless explicitly + enabled in sudoers. + Sudoers option: !insults + + --with-iologdir[=DIR] + By default, sudo stores I/O log files in either /var/log/sudo-io, + /var/adm/sudo-io, or /usr/log/sudo-io. If this option is + specified, I/O logs will be stored in the indicated directory + instead. + Sudoers option: iolog_dir + + --with-lecture=no, --without-lecture + Don't print the lecture the first time a user runs sudo. + Sudoers option: !lecture + + --with-logfac=FACILITY + Determines which syslog facility to log to. This requires + a 4.3BSD or later version of syslog. You can still set + this for ancient syslogs but it will have no effect. The + following facilities are supported: authpriv (if your OS + supports it), auth, daemon, user, local0, local1, local2, + local3, local4, local5, local6, and local7. + Sudoers option: syslog + + --with-logging=TYPE + How you want to do your logging. You may choose "syslog", + "file", or "both". Setting this to "syslog" is nice because + you can keep all of your sudo logs in one place (see the + example syslog.conf file). The default is "syslog". + Sudoers options: syslog and logfile + + --with-loglen=NUMBER + Number of characters per line for the file log. This is only used if + you are to "file" or "both". This value is used to decide when to wrap + lines for nicer log files. The default is 80. Setting this to 0 + will disable the wrapping. + Sudoers options: loglinelen + + --with-logpath=PATH + Override the default location of the sudo log file and use + "path" instead. By default will use /var/log/sudo.log if + there is a /var/log dir, falling back to /var/adm/sudo.log + or /usr/adm/sudo.log if not. + Sudoers option: logfile + + --with-long-otp-prompt + When validating with a One Time Password scheme (S/Key or + OPIE), a two-line prompt is used to make it easier to cut + and paste the challenge to a local window. It's not as + pretty as the default but some people find it more convenient. + Sudoers option: long_otp_prompt + + --with-mail-if-no-user=no, --without-mail-if-no-user + Normally, sudo will mail to the "alertmail" user if the user invoking + sudo is not in the sudoers file. This option disables that behavior. + Sudoers option: mail_no_user + + --with-mail-if-no-host + Send mail to the "alermail" user if the user exists in the sudoers + file, but is not allowed to run commands on the current host. + Sudoers option: mail_no_host + + --with-mail-if-noperms + Send mail to the "alermail" user if the user is allowed to use sudo but + the command they are trying is not listed in their sudoers file entry. + Sudoers option: mail_no_perms + + --with-mailsubject="SUBJECT OF MAIL" + Subject of the mail sent to the "mailto" user. The token "%h" + will expand to the hostname of the machine. + Default is "*** SECURITY information for %h ***". + Sudoers option: mailsub + + --with-mailto=USER|MAIL_ALIAS + User (or mail alias) that mail from sudo is sent to. + This should go to a sysadmin at your site. The default is "root". + Sudoers option: mailto + + --with-passprompt="PASSWORD PROMPT" + Default prompt to use when asking for a password; can be overridden + via the -p option and the SUDO_PROMPT environment variable. Supports + the "%H", "%h", "%U" and "%u" escapes as documented in the sudo + manual page. The default value is "Password:". + Sudoers option: passprompt + + --with-password-timeout=NUMBER + Number of minutes before the sudo password prompt times out. + The default is 5, set this to 0 for no password timeout. + Sudoers option: passwd_timeout + + --with-passwd-tries=NUMBER + Number of tries a user gets to enter his/her password before sudo logs + the failure and exits. The default is 3. + Sudoers option: passwd_tries + + --with-runas-default=USER + The default user to run commands as if the -u flag is not specified + on the command line. This defaults to "root". + Sudoers option: runas_default + + --with-secure-path[=PATH] + Path used for every command run from sudo(8). If you don't trust the + people running sudo to have a sane PATH environment variable you may + want to use this. Another use is if you want to have the "root path" + be separate from the "user path." You will need to customize the path + for your site. NOTE: this is not applied to users in the group + specified by --with-exemptgroup. If you do not specify a path, + "/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc" is used. + Sudoers option: secure_path + + --with-sendmail=PATH + Override configure's guess as to the location of sendmail. + Sudoers option: mailerpath + + --with-sendmail=no, --without-sendmail + Do not use sendmail to mail messages to the "mailto" user. + Use only if you don't run sendmail or the equivalent. + Sudoers options: !mailerpath or !mailto + + --with-sudoers-mode=MODE + File mode for the sudoers file (octal). Note that if you + wish to NFS-mount the sudoers file this must be group + readable. This value may overridden at run-time in the + sudo.conf file. The default mode is 0440. + + --with-sudoers-uid=UID + User id that "owns" the sudoers file. Note that this is + the numeric id, *not* the symbolic name. This value may + overridden at run-time in the sudo.conf file. The default + is 0. + + --with-sudoers-gid=GID + Group id that "owns" the sudoers file. Note that this is + the numeric id, *not* the symbolic name. This value may + overridden at run-time in the sudo.conf file. The default + is 0. + + --with-timeout=NUMBER + Number of minutes that can elapse before sudo will ask for a passwd + again. The default is 5, set this to 0 to always prompt for a password. + Sudoers option: timestamp_timeout + + --with-umask=MASK + Umask to use when running the root command. The default is 0022. + Sudoers option: umask + + --with-umask=no, --without-umask + Preserves the umask of the user invoking sudo. + Sudoers option: !umask + + --with-umask-override + Use the umask specified in sudoers even if it is less restrictive + than the user's. The default is to use the intersection of the + user's umask and the umask specified in sudoers. + Sudoers option: umask_override + +OS dependent notes +================== + +HP-UX: + The default C compiler shipped with HP-UX is not an ANSI compiler. + You must use either the HP ANSI C compiler or gcc to build sudo. + Binary packages of gcc are available from http://hpux.connect.org.uk/. + + To prevent PAM from overriding the value of umask on HP-UX 11, + you will need to add a line like the following to /etc/pam.conf: + + sudo session required libpam_hpsec.so.1 bypass_umask + +Linux: + PAM and LDAP headers are not installed by default on most Linux + systems. You will need to install the "pam-dev" (rpm) or + libpam0g-dev (deb) package if /usr/include/security/pam_appl.h + is not present on your system. If you wish to build with LDAP + support you will also need the "openldap-devel" (rpm) or + "libldap2-dev" (deb) package. + +Mac OS X: + The pseudo-tty support in the Mac OS X kernel has bugs related + to its handling of the SIGTSTP, SIGTTIN and SIGTTOU signals. + It does not restart reads and writes when those signals are + delivered. This may cause problems for some commands when I/O + logging is enabled. The issue has been reported to Apple and + is bug id #7952709. + +Solaris: + You need to have a C compiler in order to build sudo. Since + Solaris does not come with one by default this means that you + either need to either install the Solaris Studio compiler suite, + available for free from www.oracle.com, or install the GNU C + compiler (gcc) which is can be installed via the pkg utility + on Solaris 11 and higher and is distributed on the Solaris + Companion CD for older Solaris releases. You can also download + gcc packages from http://www.opencsw.org/packages/CSWgcc4core/ diff --git a/utsudo-0.0.2/INSTALL.configure b/utsudo-0.0.2/INSTALL.configure new file mode 100644 index 0000000..a1b253c --- /dev/null +++ b/utsudo-0.0.2/INSTALL.configure @@ -0,0 +1,365 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On macOS 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/utsudo-0.0.2/LICENSE b/utsudo-0.0.2/LICENSE new file mode 100644 index 0000000..f617c78 --- /dev/null +++ b/utsudo-0.0.2/LICENSE @@ -0,0 +1,133 @@ +木兰宽松许可证, 第2版 + +木兰宽松许可证, 第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体” 是指提交贡献的机构及其“关联实体”。 + +“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3, 请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. + + +Mulan Permissive Software License,Version 2 + +Mulan Permissive Software License,Version 2 (Mulan PSL v2) + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + +0. Definition + +Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its Affiliates. + +Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + +How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + +To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + +Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + +Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package; + +Attach the statement to the appropriate annotated syntax at the beginning of each source file. + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. + diff --git a/utsudo-0.0.2/MANIFEST b/utsudo-0.0.2/MANIFEST new file mode 100644 index 0000000..ed1a470 --- /dev/null +++ b/utsudo-0.0.2/MANIFEST @@ -0,0 +1,809 @@ +ABOUT-NLS +ChangeLog +INSTALL +INSTALL.configure +MANIFEST +Makefile.in +NEWS +README +README.LDAP +aclocal.m4 +autogen.sh +config.guess +config.h.in +config.sub +configure +configure.ac +doc/CONTRIBUTORS +doc/HISTORY +doc/LICENSE +doc/Makefile.in +doc/TROUBLESHOOTING +doc/UPGRADE +doc/cvtsudoers.man.in +doc/cvtsudoers.mdoc.in +doc/fixman.sh +doc/fixmdoc.sed +doc/schema.ActiveDirectory +doc/schema.OpenLDAP +doc/schema.iPlanet +doc/schema.olcSudo +doc/sudo.conf.man.in +doc/sudo.conf.man.in.sed +doc/sudo.conf.mdoc.in +doc/sudo.man.in +doc/sudo.man.in.sed +doc/sudo.mdoc.in +doc/sudo_plugin.man.in +doc/sudo_plugin.mdoc.in +doc/sudoers.ldap.man.in +doc/sudoers.ldap.mdoc.in +doc/sudoers.man.in +doc/sudoers.man.in.sed +doc/sudoers.mdoc.in +doc/sudoers_timestamp.man.in +doc/sudoers_timestamp.mdoc.in +doc/sudoreplay.man.in +doc/sudoreplay.mdoc.in +doc/visudo.man.in +doc/visudo.mdoc.in +examples/Makefile.in +examples/pam.conf +examples/sudo.conf +examples/sudoers +examples/syslog.conf +include/Makefile.in +include/compat/charclass.h +include/compat/endian.h +include/compat/fnmatch.h +include/compat/getaddrinfo.h +include/compat/getopt.h +include/compat/glob.h +include/compat/nss_dbdefs.h +include/compat/sha2.h +include/compat/stdbool.h +include/sudo_compat.h +include/sudo_conf.h +include/sudo_debug.h +include/sudo_digest.h +include/sudo_dso.h +include/sudo_event.h +include/sudo_fatal.h +include/sudo_gettext.h +include/sudo_lbuf.h +include/sudo_plugin.h +include/sudo_queue.h +include/sudo_rand.h +include/sudo_util.h +indent.pro +init.d/aix.sh.in +init.d/hpux.sh.in +init.d/utsudo.conf.in +install-sh +lib/util/Makefile.in +lib/util/aix.c +lib/util/arc4random.c +lib/util/arc4random.h +lib/util/arc4random_uniform.c +lib/util/chacha_private.h +lib/util/closefrom.c +lib/util/digest.c +lib/util/digest_gcrypt.c +lib/util/digest_openssl.c +lib/util/event.c +lib/util/event_poll.c +lib/util/event_select.c +lib/util/fatal.c +lib/util/fnmatch.c +lib/util/getaddrinfo.c +lib/util/getcwd.c +lib/util/getdelim.c +lib/util/getentropy.c +lib/util/getgrouplist.c +lib/util/gethostname.c +lib/util/getopt_long.c +lib/util/gettime.c +lib/util/getusershell.c +lib/util/gidlist.c +lib/util/glob.c +lib/util/inet_ntop.c +lib/util/inet_pton.c +lib/util/isblank.c +lib/util/key_val.c +lib/util/lbuf.c +lib/util/locking.c +lib/util/memrchr.c +lib/util/memset_s.c +lib/util/mksiglist.c +lib/util/mksiglist.h +lib/util/mksigname.c +lib/util/mksigname.h +lib/util/mktemp.c +lib/util/nanosleep.c +lib/util/parseln.c +lib/util/pipe2.c +lib/util/progname.c +lib/util/pw_dup.c +lib/util/reallocarray.c +lib/util/regress/fnmatch/fnm_test.c +lib/util/regress/fnmatch/fnm_test.in +lib/util/regress/getdelim/getdelim_test.c +lib/util/regress/getgrouplist/getgrouplist_test.c +lib/util/regress/glob/files +lib/util/regress/glob/globtest.c +lib/util/regress/glob/globtest.in +lib/util/regress/mktemp/mktemp_test.c +lib/util/regress/parse_gids/parse_gids_test.c +lib/util/regress/progname/progname_test.c +lib/util/regress/strsig/strsig_test.c +lib/util/regress/strsplit/strsplit_test.c +lib/util/regress/strtofoo/strtobool_test.c +lib/util/regress/strtofoo/strtoid_test.c +lib/util/regress/strtofoo/strtomode_test.c +lib/util/regress/strtofoo/strtonum_test.c +lib/util/regress/sudo_conf/conf_test.c +lib/util/regress/sudo_conf/test1.in +lib/util/regress/sudo_conf/test1.out.ok +lib/util/regress/sudo_conf/test2.in +lib/util/regress/sudo_conf/test2.out.ok +lib/util/regress/sudo_conf/test3.in +lib/util/regress/sudo_conf/test3.out.ok +lib/util/regress/sudo_conf/test4.err.ok +lib/util/regress/sudo_conf/test4.in +lib/util/regress/sudo_conf/test4.out.ok +lib/util/regress/sudo_conf/test5.err.ok +lib/util/regress/sudo_conf/test5.in +lib/util/regress/sudo_conf/test5.out.ok +lib/util/regress/sudo_conf/test6.in +lib/util/regress/sudo_conf/test6.out.ok +lib/util/regress/sudo_conf/test7.in +lib/util/regress/sudo_conf/test7.out.ok +lib/util/regress/sudo_parseln/parseln_test.c +lib/util/regress/sudo_parseln/test1.in +lib/util/regress/sudo_parseln/test1.out.ok +lib/util/regress/sudo_parseln/test2.in +lib/util/regress/sudo_parseln/test2.out.ok +lib/util/regress/sudo_parseln/test3.in +lib/util/regress/sudo_parseln/test3.out.ok +lib/util/regress/sudo_parseln/test4.in +lib/util/regress/sudo_parseln/test4.out.ok +lib/util/regress/sudo_parseln/test5.in +lib/util/regress/sudo_parseln/test5.out.ok +lib/util/regress/sudo_parseln/test6.in +lib/util/regress/sudo_parseln/test6.out.ok +lib/util/regress/tailq/hltq_test.c +lib/util/regress/vsyslog/vsyslog_test.c +lib/util/secure_path.c +lib/util/setgroups.c +lib/util/sha2.c +lib/util/sig2str.c +lib/util/siglist.in +lib/util/snprintf.c +lib/util/str2sig.c +lib/util/strlcat.c +lib/util/strlcpy.c +lib/util/strndup.c +lib/util/strnlen.c +lib/util/strsignal.c +lib/util/strsplit.c +lib/util/strtobool.c +lib/util/strtoid.c +lib/util/strtomode.c +lib/util/strtonum.c +lib/util/sudo_conf.c +lib/util/sudo_debug.c +lib/util/sudo_dso.c +lib/util/term.c +lib/util/ttyname_dev.c +lib/util/ttysize.c +lib/util/util.exp.in +lib/util/utimens.c +lib/util/vsyslog.c +lib/zlib/Makefile.in +lib/zlib/adler32.c +lib/zlib/compress.c +lib/zlib/crc32.c +lib/zlib/crc32.h +lib/zlib/deflate.c +lib/zlib/deflate.h +lib/zlib/gzclose.c +lib/zlib/gzguts.h +lib/zlib/gzlib.c +lib/zlib/gzread.c +lib/zlib/gzwrite.c +lib/zlib/infback.c +lib/zlib/inffast.c +lib/zlib/inffast.h +lib/zlib/inffixed.h +lib/zlib/inflate.c +lib/zlib/inflate.h +lib/zlib/inftrees.c +lib/zlib/inftrees.h +lib/zlib/trees.c +lib/zlib/trees.h +lib/zlib/uncompr.c +lib/zlib/zconf.h.in +lib/zlib/zlib.exp +lib/zlib/zlib.h +lib/zlib/zutil.c +lib/zlib/zutil.h +log2cl.pl +ltmain.sh +m4/ax_append_flag.m4 +m4/ax_check_compile_flag.m4 +m4/ax_check_link_flag.m4 +m4/ax_func_getaddrinfo.m4 +m4/ax_func_snprintf.m4 +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +m4/sudo.m4 +mkdep.pl +mkinstalldirs +mkpkg +pathnames.h.in +plugins/group_file/Makefile.in +plugins/group_file/getgrent.c +plugins/group_file/group_file.c +plugins/group_file/group_file.exp +plugins/group_file/plugin_test.c +plugins/sample/Makefile.in +plugins/sample/README +plugins/sample/sample_plugin.c +plugins/sample/sample_plugin.exp +plugins/sudoers/Makefile.in +plugins/sudoers/alias.c +plugins/sudoers/audit.c +plugins/sudoers/auth/API +plugins/sudoers/auth/afs.c +plugins/sudoers/auth/aix_auth.c +plugins/sudoers/auth/bsdauth.c +plugins/sudoers/auth/dce.c +plugins/sudoers/auth/fwtk.c +plugins/sudoers/auth/kerb5.c +plugins/sudoers/auth/pam.c +plugins/sudoers/auth/passwd.c +plugins/sudoers/auth/rfc1938.c +plugins/sudoers/auth/secureware.c +plugins/sudoers/auth/securid5.c +plugins/sudoers/auth/sia.c +plugins/sudoers/auth/sudo_auth.c +plugins/sudoers/auth/sudo_auth.h +plugins/sudoers/base64.c +plugins/sudoers/boottime.c +plugins/sudoers/bsm_audit.c +plugins/sudoers/bsm_audit.h +plugins/sudoers/check.c +plugins/sudoers/check.h +plugins/sudoers/cvtsudoers.c +plugins/sudoers/cvtsudoers.h +plugins/sudoers/cvtsudoers_json.c +plugins/sudoers/cvtsudoers_ldif.c +plugins/sudoers/cvtsudoers_pwutil.c +plugins/sudoers/def_data.c +plugins/sudoers/def_data.h +plugins/sudoers/def_data.in +plugins/sudoers/defaults.c +plugins/sudoers/defaults.h +plugins/sudoers/digestname.c +plugins/sudoers/editor.c +plugins/sudoers/env.c +plugins/sudoers/env_pattern.c +plugins/sudoers/file.c +plugins/sudoers/filedigest.c +plugins/sudoers/find_path.c +plugins/sudoers/fmtsudoers.c +plugins/sudoers/gc.c +plugins/sudoers/gentime.c +plugins/sudoers/getdate.c +plugins/sudoers/getdate.y +plugins/sudoers/getspwuid.c +plugins/sudoers/gmtoff.c +plugins/sudoers/goodpath.c +plugins/sudoers/gram.c +plugins/sudoers/gram.h +plugins/sudoers/gram.y +plugins/sudoers/group_plugin.c +plugins/sudoers/hexchar.c +plugins/sudoers/ins_2001.h +plugins/sudoers/ins_classic.h +plugins/sudoers/ins_csops.h +plugins/sudoers/ins_goons.h +plugins/sudoers/ins_python.h +plugins/sudoers/insults.h +plugins/sudoers/interfaces.c +plugins/sudoers/interfaces.h +plugins/sudoers/iolog.c +plugins/sudoers/iolog.h +plugins/sudoers/iolog_files.h +plugins/sudoers/iolog_path.c +plugins/sudoers/iolog_util.c +plugins/sudoers/ldap.c +plugins/sudoers/ldap_conf.c +plugins/sudoers/ldap_util.c +plugins/sudoers/linux_audit.c +plugins/sudoers/linux_audit.h +plugins/sudoers/locale.c +plugins/sudoers/logging.c +plugins/sudoers/logging.h +plugins/sudoers/logwrap.c +plugins/sudoers/match.c +plugins/sudoers/match_addr.c +plugins/sudoers/match_command.c +plugins/sudoers/match_digest.c +plugins/sudoers/mkdefaults +plugins/sudoers/mkdir_parents.c +plugins/sudoers/parse.c +plugins/sudoers/parse.h +plugins/sudoers/parse_ldif.c +plugins/sudoers/po/README +plugins/sudoers/po/ast.mo +plugins/sudoers/po/ast.po +plugins/sudoers/po/ca.mo +plugins/sudoers/po/ca.po +plugins/sudoers/po/cs.mo +plugins/sudoers/po/cs.po +plugins/sudoers/po/da.mo +plugins/sudoers/po/da.po +plugins/sudoers/po/de.mo +plugins/sudoers/po/de.po +plugins/sudoers/po/el.mo +plugins/sudoers/po/el.po +plugins/sudoers/po/eo.mo +plugins/sudoers/po/eo.po +plugins/sudoers/po/eu.mo +plugins/sudoers/po/eu.po +plugins/sudoers/po/fi.mo +plugins/sudoers/po/fi.po +plugins/sudoers/po/fr.mo +plugins/sudoers/po/fr.po +plugins/sudoers/po/fur.mo +plugins/sudoers/po/fur.po +plugins/sudoers/po/hr.mo +plugins/sudoers/po/hr.po +plugins/sudoers/po/hu.mo +plugins/sudoers/po/hu.po +plugins/sudoers/po/it.mo +plugins/sudoers/po/it.po +plugins/sudoers/po/ja.mo +plugins/sudoers/po/ja.po +plugins/sudoers/po/ko.mo +plugins/sudoers/po/ko.po +plugins/sudoers/po/lt.mo +plugins/sudoers/po/lt.po +plugins/sudoers/po/nb.mo +plugins/sudoers/po/nb.po +plugins/sudoers/po/nl.mo +plugins/sudoers/po/nl.po +plugins/sudoers/po/pl.mo +plugins/sudoers/po/pl.po +plugins/sudoers/po/pt.mo +plugins/sudoers/po/pt.po +plugins/sudoers/po/pt_BR.mo +plugins/sudoers/po/pt_BR.po +plugins/sudoers/po/ru.mo +plugins/sudoers/po/ru.po +plugins/sudoers/po/sk.mo +plugins/sudoers/po/sk.po +plugins/sudoers/po/sl.mo +plugins/sudoers/po/sl.po +plugins/sudoers/po/sr.mo +plugins/sudoers/po/sr.po +plugins/sudoers/po/sudoers.pot +plugins/sudoers/po/sv.mo +plugins/sudoers/po/sv.po +plugins/sudoers/po/tr.mo +plugins/sudoers/po/tr.po +plugins/sudoers/po/uk.mo +plugins/sudoers/po/uk.po +plugins/sudoers/po/vi.mo +plugins/sudoers/po/vi.po +plugins/sudoers/po/zh_CN.mo +plugins/sudoers/po/zh_CN.po +plugins/sudoers/po/zh_TW.mo +plugins/sudoers/po/zh_TW.po +plugins/sudoers/policy.c +plugins/sudoers/prompt.c +plugins/sudoers/pwutil.c +plugins/sudoers/pwutil.h +plugins/sudoers/pwutil_impl.c +plugins/sudoers/rcstr.c +plugins/sudoers/redblack.c +plugins/sudoers/redblack.h +plugins/sudoers/regress/check_symbols/check_symbols.c +plugins/sudoers/regress/cvtsudoers/sudoers +plugins/sudoers/regress/cvtsudoers/sudoers.defs +plugins/sudoers/regress/cvtsudoers/test1.out.ok +plugins/sudoers/regress/cvtsudoers/test1.sh +plugins/sudoers/regress/cvtsudoers/test10.out.ok +plugins/sudoers/regress/cvtsudoers/test10.sh +plugins/sudoers/regress/cvtsudoers/test11.out.ok +plugins/sudoers/regress/cvtsudoers/test11.sh +plugins/sudoers/regress/cvtsudoers/test12.out.ok +plugins/sudoers/regress/cvtsudoers/test12.sh +plugins/sudoers/regress/cvtsudoers/test13.out.ok +plugins/sudoers/regress/cvtsudoers/test13.sh +plugins/sudoers/regress/cvtsudoers/test14.out.ok +plugins/sudoers/regress/cvtsudoers/test14.sh +plugins/sudoers/regress/cvtsudoers/test15.out.ok +plugins/sudoers/regress/cvtsudoers/test15.sh +plugins/sudoers/regress/cvtsudoers/test16.out.ok +plugins/sudoers/regress/cvtsudoers/test16.sh +plugins/sudoers/regress/cvtsudoers/test17.out.ok +plugins/sudoers/regress/cvtsudoers/test17.sh +plugins/sudoers/regress/cvtsudoers/test18.out.ok +plugins/sudoers/regress/cvtsudoers/test18.sh +plugins/sudoers/regress/cvtsudoers/test19.out.ok +plugins/sudoers/regress/cvtsudoers/test19.sh +plugins/sudoers/regress/cvtsudoers/test2.out.ok +plugins/sudoers/regress/cvtsudoers/test2.sh +plugins/sudoers/regress/cvtsudoers/test20.conf +plugins/sudoers/regress/cvtsudoers/test20.out.ok +plugins/sudoers/regress/cvtsudoers/test20.sh +plugins/sudoers/regress/cvtsudoers/test21.conf +plugins/sudoers/regress/cvtsudoers/test21.out.ok +plugins/sudoers/regress/cvtsudoers/test21.sh +plugins/sudoers/regress/cvtsudoers/test22.out.ok +plugins/sudoers/regress/cvtsudoers/test22.sh +plugins/sudoers/regress/cvtsudoers/test23.out.ok +plugins/sudoers/regress/cvtsudoers/test23.sh +plugins/sudoers/regress/cvtsudoers/test24.out.ok +plugins/sudoers/regress/cvtsudoers/test24.sh +plugins/sudoers/regress/cvtsudoers/test25.out.ok +plugins/sudoers/regress/cvtsudoers/test25.sh +plugins/sudoers/regress/cvtsudoers/test26.err.ok +plugins/sudoers/regress/cvtsudoers/test26.out.ok +plugins/sudoers/regress/cvtsudoers/test26.sh +plugins/sudoers/regress/cvtsudoers/test27.out.ok +plugins/sudoers/regress/cvtsudoers/test27.sh +plugins/sudoers/regress/cvtsudoers/test28.out.ok +plugins/sudoers/regress/cvtsudoers/test28.sh +plugins/sudoers/regress/cvtsudoers/test29.out.ok +plugins/sudoers/regress/cvtsudoers/test29.sh +plugins/sudoers/regress/cvtsudoers/test3.out.ok +plugins/sudoers/regress/cvtsudoers/test3.sh +plugins/sudoers/regress/cvtsudoers/test30.out.ok +plugins/sudoers/regress/cvtsudoers/test30.sh +plugins/sudoers/regress/cvtsudoers/test31.conf +plugins/sudoers/regress/cvtsudoers/test31.out.ok +plugins/sudoers/regress/cvtsudoers/test31.sh +plugins/sudoers/regress/cvtsudoers/test32.err.ok +plugins/sudoers/regress/cvtsudoers/test32.out.ok +plugins/sudoers/regress/cvtsudoers/test32.sh +plugins/sudoers/regress/cvtsudoers/test33.out.ok +plugins/sudoers/regress/cvtsudoers/test33.sh +plugins/sudoers/regress/cvtsudoers/test4.out.ok +plugins/sudoers/regress/cvtsudoers/test4.sh +plugins/sudoers/regress/cvtsudoers/test5.out.ok +plugins/sudoers/regress/cvtsudoers/test5.sh +plugins/sudoers/regress/cvtsudoers/test6.out.ok +plugins/sudoers/regress/cvtsudoers/test6.sh +plugins/sudoers/regress/cvtsudoers/test7.out.ok +plugins/sudoers/regress/cvtsudoers/test7.sh +plugins/sudoers/regress/cvtsudoers/test8.out.ok +plugins/sudoers/regress/cvtsudoers/test8.sh +plugins/sudoers/regress/cvtsudoers/test9.out.ok +plugins/sudoers/regress/cvtsudoers/test9.sh +plugins/sudoers/regress/env_match/check_env_pattern.c +plugins/sudoers/regress/env_match/data +plugins/sudoers/regress/iolog_path/check_iolog_path.c +plugins/sudoers/regress/iolog_path/data +plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c +plugins/sudoers/regress/iolog_util/check_iolog_util.c +plugins/sudoers/regress/logging/check_wrap.c +plugins/sudoers/regress/logging/check_wrap.in +plugins/sudoers/regress/logging/check_wrap.out.ok +plugins/sudoers/regress/parser/check_addr.c +plugins/sudoers/regress/parser/check_addr.in +plugins/sudoers/regress/parser/check_base64.c +plugins/sudoers/regress/parser/check_digest.c +plugins/sudoers/regress/parser/check_digest.out.ok +plugins/sudoers/regress/parser/check_fill.c +plugins/sudoers/regress/parser/check_gentime.c +plugins/sudoers/regress/parser/check_hexchar.c +plugins/sudoers/regress/starttime/check_starttime.c +plugins/sudoers/regress/sudoers/test1.in +plugins/sudoers/regress/sudoers/test1.json.ok +plugins/sudoers/regress/sudoers/test1.ldif.ok +plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test1.out.ok +plugins/sudoers/regress/sudoers/test1.toke.ok +plugins/sudoers/regress/sudoers/test10.in +plugins/sudoers/regress/sudoers/test10.json.ok +plugins/sudoers/regress/sudoers/test10.ldif.ok +plugins/sudoers/regress/sudoers/test10.out.ok +plugins/sudoers/regress/sudoers/test10.toke.ok +plugins/sudoers/regress/sudoers/test11.in +plugins/sudoers/regress/sudoers/test11.json.ok +plugins/sudoers/regress/sudoers/test11.ldif.ok +plugins/sudoers/regress/sudoers/test11.out.ok +plugins/sudoers/regress/sudoers/test11.toke.ok +plugins/sudoers/regress/sudoers/test12.in +plugins/sudoers/regress/sudoers/test12.json.ok +plugins/sudoers/regress/sudoers/test12.ldif.ok +plugins/sudoers/regress/sudoers/test12.out.ok +plugins/sudoers/regress/sudoers/test12.toke.ok +plugins/sudoers/regress/sudoers/test13.in +plugins/sudoers/regress/sudoers/test13.json.ok +plugins/sudoers/regress/sudoers/test13.ldif.ok +plugins/sudoers/regress/sudoers/test13.out.ok +plugins/sudoers/regress/sudoers/test13.toke.ok +plugins/sudoers/regress/sudoers/test14.in +plugins/sudoers/regress/sudoers/test14.json.ok +plugins/sudoers/regress/sudoers/test14.ldif.ok +plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test14.out.ok +plugins/sudoers/regress/sudoers/test14.toke.ok +plugins/sudoers/regress/sudoers/test15.in +plugins/sudoers/regress/sudoers/test15.json.ok +plugins/sudoers/regress/sudoers/test15.ldif.ok +plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test15.out.ok +plugins/sudoers/regress/sudoers/test15.toke.ok +plugins/sudoers/regress/sudoers/test16.in +plugins/sudoers/regress/sudoers/test16.json.ok +plugins/sudoers/regress/sudoers/test16.ldif.ok +plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test16.out.ok +plugins/sudoers/regress/sudoers/test16.toke.ok +plugins/sudoers/regress/sudoers/test17.in +plugins/sudoers/regress/sudoers/test17.json.ok +plugins/sudoers/regress/sudoers/test17.ldif.ok +plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test17.out.ok +plugins/sudoers/regress/sudoers/test17.toke.ok +plugins/sudoers/regress/sudoers/test18.in +plugins/sudoers/regress/sudoers/test18.json.ok +plugins/sudoers/regress/sudoers/test18.ldif.ok +plugins/sudoers/regress/sudoers/test18.out.ok +plugins/sudoers/regress/sudoers/test18.toke.ok +plugins/sudoers/regress/sudoers/test19.in +plugins/sudoers/regress/sudoers/test19.json.ok +plugins/sudoers/regress/sudoers/test19.ldif.ok +plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test19.out.ok +plugins/sudoers/regress/sudoers/test19.toke.ok +plugins/sudoers/regress/sudoers/test2.in +plugins/sudoers/regress/sudoers/test2.json.ok +plugins/sudoers/regress/sudoers/test2.ldif.ok +plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test2.out.ok +plugins/sudoers/regress/sudoers/test2.toke.ok +plugins/sudoers/regress/sudoers/test20.in +plugins/sudoers/regress/sudoers/test20.json.ok +plugins/sudoers/regress/sudoers/test20.ldif.ok +plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test20.out.ok +plugins/sudoers/regress/sudoers/test20.toke.ok +plugins/sudoers/regress/sudoers/test21.in +plugins/sudoers/regress/sudoers/test21.json.ok +plugins/sudoers/regress/sudoers/test21.ldif.ok +plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test21.out.ok +plugins/sudoers/regress/sudoers/test21.toke.ok +plugins/sudoers/regress/sudoers/test22.in +plugins/sudoers/regress/sudoers/test22.json.ok +plugins/sudoers/regress/sudoers/test22.ldif.ok +plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test22.out.ok +plugins/sudoers/regress/sudoers/test22.sudo.ok +plugins/sudoers/regress/sudoers/test22.toke.ok +plugins/sudoers/regress/sudoers/test3.in +plugins/sudoers/regress/sudoers/test3.json.ok +plugins/sudoers/regress/sudoers/test3.ldif.ok +plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test3.out.ok +plugins/sudoers/regress/sudoers/test3.toke.ok +plugins/sudoers/regress/sudoers/test4.in +plugins/sudoers/regress/sudoers/test4.json.ok +plugins/sudoers/regress/sudoers/test4.ldif.ok +plugins/sudoers/regress/sudoers/test4.out.ok +plugins/sudoers/regress/sudoers/test4.toke.ok +plugins/sudoers/regress/sudoers/test5.in +plugins/sudoers/regress/sudoers/test5.json.ok +plugins/sudoers/regress/sudoers/test5.ldif.ok +plugins/sudoers/regress/sudoers/test5.out.ok +plugins/sudoers/regress/sudoers/test5.toke.ok +plugins/sudoers/regress/sudoers/test6.in +plugins/sudoers/regress/sudoers/test6.json.ok +plugins/sudoers/regress/sudoers/test6.ldif.ok +plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok +plugins/sudoers/regress/sudoers/test6.out.ok +plugins/sudoers/regress/sudoers/test6.toke.ok +plugins/sudoers/regress/sudoers/test7.in +plugins/sudoers/regress/sudoers/test7.json.ok +plugins/sudoers/regress/sudoers/test7.ldif.ok +plugins/sudoers/regress/sudoers/test7.out.ok +plugins/sudoers/regress/sudoers/test7.toke.ok +plugins/sudoers/regress/sudoers/test8.in +plugins/sudoers/regress/sudoers/test8.json.ok +plugins/sudoers/regress/sudoers/test8.ldif.ok +plugins/sudoers/regress/sudoers/test8.out.ok +plugins/sudoers/regress/sudoers/test8.toke.ok +plugins/sudoers/regress/sudoers/test9.in +plugins/sudoers/regress/sudoers/test9.json.ok +plugins/sudoers/regress/sudoers/test9.ldif.ok +plugins/sudoers/regress/sudoers/test9.out.ok +plugins/sudoers/regress/sudoers/test9.toke.ok +plugins/sudoers/regress/testsudoers/group +plugins/sudoers/regress/testsudoers/test1.out.ok +plugins/sudoers/regress/testsudoers/test1.sh +plugins/sudoers/regress/testsudoers/test2.inc +plugins/sudoers/regress/testsudoers/test2.out.ok +plugins/sudoers/regress/testsudoers/test2.sh +plugins/sudoers/regress/testsudoers/test3.out.ok +plugins/sudoers/regress/testsudoers/test3.sh +plugins/sudoers/regress/testsudoers/test4.out.ok +plugins/sudoers/regress/testsudoers/test4.sh +plugins/sudoers/regress/testsudoers/test5.out.ok +plugins/sudoers/regress/testsudoers/test5.sh +plugins/sudoers/regress/testsudoers/test6.out.ok +plugins/sudoers/regress/testsudoers/test6.sh +plugins/sudoers/regress/testsudoers/test7.out.ok +plugins/sudoers/regress/testsudoers/test7.sh +plugins/sudoers/regress/visudo/test1.out.ok +plugins/sudoers/regress/visudo/test1.sh +plugins/sudoers/regress/visudo/test10.out.ok +plugins/sudoers/regress/visudo/test10.sh +plugins/sudoers/regress/visudo/test2.err.ok +plugins/sudoers/regress/visudo/test2.out.ok +plugins/sudoers/regress/visudo/test2.sh +plugins/sudoers/regress/visudo/test3.err.ok +plugins/sudoers/regress/visudo/test3.out.ok +plugins/sudoers/regress/visudo/test3.sh +plugins/sudoers/regress/visudo/test4.out.ok +plugins/sudoers/regress/visudo/test4.sh +plugins/sudoers/regress/visudo/test5.out.ok +plugins/sudoers/regress/visudo/test5.sh +plugins/sudoers/regress/visudo/test6.out.ok +plugins/sudoers/regress/visudo/test6.sh +plugins/sudoers/regress/visudo/test7.out.ok +plugins/sudoers/regress/visudo/test7.sh +plugins/sudoers/regress/visudo/test8.err.ok +plugins/sudoers/regress/visudo/test8.out.ok +plugins/sudoers/regress/visudo/test8.sh +plugins/sudoers/regress/visudo/test9.out.ok +plugins/sudoers/regress/visudo/test9.sh +plugins/sudoers/set_perms.c +plugins/sudoers/solaris_audit.c +plugins/sudoers/solaris_audit.h +plugins/sudoers/sssd.c +plugins/sudoers/starttime.c +plugins/sudoers/strlist.c +plugins/sudoers/strlist.h +plugins/sudoers/stubs.c +plugins/sudoers/sudo_ldap.h +plugins/sudoers/sudo_ldap_conf.h +plugins/sudoers/sudo_nss.c +plugins/sudoers/sudo_nss.h +plugins/sudoers/sudo_printf.c +plugins/sudoers/sudoers.c +plugins/sudoers/sudoers.exp +plugins/sudoers/sudoers.h +plugins/sudoers/sudoers.in +plugins/sudoers/sudoers_debug.c +plugins/sudoers/sudoers_debug.h +plugins/sudoers/sudoers_version.h +plugins/sudoers/sudoreplay.c +plugins/sudoers/testsudoers.c +plugins/sudoers/timeout.c +plugins/sudoers/timestamp.c +plugins/sudoers/timestr.c +plugins/sudoers/toke.c +plugins/sudoers/toke.h +plugins/sudoers/toke.l +plugins/sudoers/toke_util.c +plugins/sudoers/tsdump.c +plugins/sudoers/tsgetgrpw.c +plugins/sudoers/tsgetgrpw.h +plugins/sudoers/visudo.c +plugins/system_group/Makefile.in +plugins/system_group/system_group.c +plugins/system_group/system_group.exp +po/README +po/ast.mo +po/ast.po +po/ca.mo +po/ca.po +po/cs.mo +po/cs.po +po/da.mo +po/da.po +po/de.mo +po/de.po +po/eo.mo +po/eo.po +po/es.mo +po/es.po +po/eu.mo +po/eu.po +po/fi.mo +po/fi.po +po/fr.mo +po/fr.po +po/fur.mo +po/fur.po +po/gl.mo +po/gl.po +po/hr.mo +po/hr.po +po/hu.mo +po/hu.po +po/it.mo +po/it.po +po/ja.mo +po/ja.po +po/ko.mo +po/ko.po +po/nb.mo +po/nb.po +po/nl.mo +po/nl.po +po/nn.mo +po/nn.po +po/pl.mo +po/pl.po +po/pt.mo +po/pt.po +po/pt_BR.mo +po/pt_BR.po +po/ru.mo +po/ru.po +po/sk.mo +po/sk.po +po/sl.mo +po/sl.po +po/sr.mo +po/sr.po +po/sudo.pot +po/sv.mo +po/sv.po +po/tr.mo +po/tr.po +po/uk.mo +po/uk.po +po/vi.mo +po/vi.po +po/zh_CN.mo +po/zh_CN.po +po/zh_TW.mo +po/zh_TW.po +pp +src/Makefile.in +src/debug_fatal_lbuf.c +src/conversation.c +src/env_hooks.c +src/exec.c +src/exec_common.c +src/exec_monitor.c +src/exec_nopty.c +src/exec_pty.c +src/get_pty.c +src/hooks.c +src/limits.c +src/load_plugins.c +src/net_ifs.c +src/openbsd.c +src/parse_args.c +src/preload.c +src/preserve_fds.c +src/regress/noexec/check_noexec.c +src/regress/ttyname/check_ttyname.c +src/selinux.c +src/sesh.c +src/signal.c +src/solaris.c +src/utsudo.c +src/utsudo.h +src/sudo_edit.c +src/sudo_exec.h +src/sudo_noexec.c +src/sudo_plugin_int.h +src/sudo_usage.h.in +src/tcsetpgrp_nobg.c +src/tgetpass.c +src/ttyname.c +src/utmp.c +sudo.pp diff --git a/utsudo-0.0.2/Makefile.in b/utsudo-0.0.2/Makefile.in new file mode 100644 index 0000000..cdb0db4 --- /dev/null +++ b/utsudo-0.0.2/Makefile.in @@ -0,0 +1,396 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2010-2015, 2017-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Installation paths for package building +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +includedir = @includedir@ +datarootdir = @datarootdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +rundir = @rundir@ +vardir = @vardir@ + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# sudoers owner and mode for package building +sudoersdir = $(sysconfdir) +sudoers_uid = @SUDOERS_UID@ +sudoers_gid = @SUDOERS_GID@ +sudoers_mode = @SUDOERS_MODE@ +shlib_mode = @SHLIB_MODE@ + +SUBDIRS = lib/util @ZLIB_SRC@ plugins/group_file plugins/sudoers \ + plugins/system_group src include + +# SUBDIRS = lib/util @ZLIB_SRC@ src include + +SAMPLES = plugins/sample + +VERSION = @PACKAGE_VERSION@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +LIBTOOL_DEPS = @LIBTOOL_DEPS@ + +SHELL = @SHELL@ + +SED = @SED@ + +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) + +ECHO_N = @ECHO_N@ +ECHO_C = @ECHO_C@ + +# Message catalog support +NLS = @SUDO_NLS@ +POTFILES = po/utsudo.pot plugins/sudoers/po/utsudoers.pot +LOCALEDIR_SUFFIX = @LOCALEDIR_SUFFIX@ +MSGFMT = msgfmt +MSGMERGE = msgmerge +XGETTEXT = xgettext +XGETTEXT_OPTS = -F -k_ -kN_ -kU_ --copyright-holder="Todd C. Miller" \ + "--msgid-bugs-address=https://bugzilla.sudo.ws" \ + --package-name=@PACKAGE_NAME@ --package-version=$(VERSION) \ + --flag warning:1:c-format --flag warningx:1:c-format \ + --flag fatal:1:c-format --flag fatalx:1:c-format \ + --flag easprintf:3:c-format --flag sudo_lbuf_append:2:c-format \ + --flag sudo_lbuf_append_quoted:3:c-format --foreign-user + +# Default cppcheck options when run from the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# Default splint options when run from the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# Default PVS-studio options when run from the top-level Makefile +PVS_CFG = $(top_builddir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +all: config.status + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) $@) && continue; \ + exit $$?; \ + done + +check pre-install: config.status + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) $@) && continue; \ + exit $$?; \ + done + +cppcheck: config.status + rval=0; \ + for d in $(SUBDIRS); do \ + echo checking $$d; \ + (cd $$d && exec $(MAKE) CPPCHECK_OPTS="$(CPPCHECK_OPTS)" $@) || rval=`expr $$rval + $$?`; \ + done; \ + exit $$rval + +splint: config.status + rval=0; \ + for d in $(SUBDIRS); do \ + echo splinting $$d; \ + (cd $$d && exec $(MAKE) SPLINT_OPTS="$(SPLINT_OPTS)" $@) || rval=`expr $$rval + $$?`; \ + done; \ + exit $$rval + +cov-build: + make clean + cov-build --dir cov-int make ${MFLAGS} all + +cov-upload: + tar zcf cov-int.tgz cov-int + curl --form token=$$COVERITY_SUDO_TOKEN \ + --form email=todd.miller@sudo.ws \ + --form file=@cov-int.tgz \ + --form version="$(VERSION)" \ + https://scan.coverity.com/builds?project=sudo + +cov-analyze: cov-upload + +pvs-studio: config.status + files=; \ + rval=0; \ + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) PVS_IGNORE="$(PVS_IGNORE)" pvs-log-files) || rval=`expr $$rval + $$?`; \ + for f in $$d/*.plog; do \ + if test "$$f" != "$$d/*.plog"; then \ + files="$$files $$f"; \ + fi; \ + done; \ + done; \ + if test $$rval -ne 0; then \ + exit $$rval; \ + fi; \ + plog-converter $(PVS_LOG_OPTS) $$files + +install-dirs install-binaries install-includes install-plugin: config.status pre-install + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) "INSTALL_OWNER=$(INSTALL_OWNER)" $@) && continue; \ + exit $$?; \ + done + +install: config.status ChangeLog pre-install install-nls + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) "INSTALL_OWNER=$(INSTALL_OWNER)" $@) && continue; \ + exit $$?; \ + done + +uninstall: uninstall-nls + for d in $(SUBDIRS); do \ + (cd $$d && exec $(MAKE) $@) && continue; \ + exit $$?; \ + done + +uninstall-nls: + for pot in $(POTFILES); do \ + domain=`basename $$pot .pot`; \ + rm -f $(DESTDIR)$(localedir)/*/LC_MESSAGES/$$domain.mo; \ + done + +siglist.c signame.c: + cd lib/util && exec $(MAKE) $@ + +depend: siglist.c signame.c + $(top_srcdir)/mkdep.pl --builddir=`pwd` --srcdir=$(top_srcdir) \ + lib/util/Makefile.in lib/zlib/Makefile.in \ + plugins/group_file/Makefile.in plugins/sample/Makefile.in \ + plugins/sudoers/Makefile.in plugins/system_group/Makefile.in \ + src/Makefile.in && \ + $(top_builddir)/config.status --file $(top_builddir)/lib/util/Makefile \ + --file $(top_builddir)/plugins/sample/Makefile \ + --file $(top_builddir)/plugins/group_file/Makefile \ + --file $(top_builddir)/plugins/sudoers/Makefile \ + --file $(top_builddir)/plugins/system_group/Makefile \ + --file $(top_builddir)/src/Makefile \ + --file $(top_builddir)/lib/zlib/Makefile + +ChangeLog: + if test -d $(srcdir)/.hg && cd $(srcdir); then \ + if hg log --style=changelog -r "sort(branch(.) or follow(), -date)" > $@.tmp; then \ + mv -f $@.tmp $@; \ + else \ + rm -f $@.tmp; \ + fi; \ + elif test -d $(srcdir)/.git && cd $(srcdir); then \ + $(top_srcdir)/log2cl.pl -b master > $@; \ + else \ + echo "ChangeLog data not available" > $@; \ + fi + +config.status: + @if [ ! -s config.status ]; then \ + echo "Please run configure first"; \ + exit 1; \ + fi + +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck + +Makefile: $(srcdir)/Makefile.in + ./config.status --file Makefile + +sync-po: rsync-po compile-po + +rsync-po: + rsync -Lrtvz translationproject.org::tp/latest/sudo/ po/ + rsync -Lrtvz translationproject.org::tp/latest/sudoers/ plugins/sudoers/po/ + +update-pot: + @if $(XGETTEXT) --help >/dev/null 2>&1; then \ + cd $(top_srcdir); \ + for pot in $(POTFILES); do \ + echo "Updating $$pot"; \ + domain=`basename $$pot .pot`; \ + case "$$domain" in \ + sudo) tmpfiles=; cfiles="src/*c lib/*/*c";; \ + sudoers) \ + echo "gettext \"syntax error\"" > confstr.sh; \ + $(SED) -n 's/^.*--with-passprompt=\(.*\)$$/gettext \"\1\"/p' mkpkg | sort -u >> confstr.sh; \ + $(SED) -n -e 's/^badpass_message="/gettext "/p' \ + -e 's/^passprompt="/gettext "/p' \ + -e 's/^mailsub="/gettext "/p' configure.ac \ + >> confstr.sh; \ + tmpfiles=confstr.sh; \ + cfiles="plugins/sudoers/*.c plugins/sudoers/auth/*.c";; \ + *) echo unknown domain $$domain; continue;; \ + esac; \ + $(XGETTEXT) $(XGETTEXT_OPTS) -d$$domain $$cfiles $$tmpfiles -o $$pot.tmp; \ + test -n "$$tmpfiles" && rm -f $$tmpfiles; \ + if diff -I'^.POT-Creation-Date' -I'^.Project-Id-Version' -I'^#' $$pot.tmp $$pot >/dev/null; then \ + rm -f $$pot.tmp; \ + else \ + printf '/^#$$/+1,$$d\nw\nq\n' | ed - $$pot; \ + $(SED) '1,/^#$$/d' $$pot.tmp >> $$pot; \ + rm -f $$pot.tmp; \ + fi; \ + done; \ + else \ + echo "Unable to update .pot files: $(XGETTEXT) not found" 1>&2; \ + fi + +update-po: update-pot + @if $(MSGFMT) --help >/dev/null 2>&1; then \ + cd $(top_srcdir); \ + for pot in $(POTFILES); do \ + podir=`dirname $$pot`; \ + for po in $$podir/*.po; do \ + echo $(ECHO_N) "Updating $$po$(ECHO_C)"; \ + $(MSGMERGE) --update $$po $$pot; \ + $(MSGFMT) --output /dev/null --check-format $$po || exit 1; \ + done; \ + done; \ + else \ + echo "Unable to update .po files: $(MSGFMT) not found" 1>&2; \ + fi + +compile-po: + @if $(MSGFMT) --help >/dev/null 2>&1; then \ + cd $(top_srcdir); \ + rm -f Makefile.$$$$; \ + POFILES=""; \ + for pot in $(POTFILES); do \ + podir=`dirname $$pot`; \ + for po in $$podir/*.po; do \ + POFILES="$$POFILES $$po"; \ + done; \ + done; \ + echo "all: `echo $$POFILES | $(SED) 's/\.po/.mo/g'`" >> Makefile.$$$$; \ + echo "" >> Makefile.$$$$; \ + for po in $$POFILES; do \ + mo=`echo $$po | $(SED) 's/po$$/mo/'`; \ + echo "$$mo: $$po" >> Makefile.$$$$; \ + echo " $(MSGFMT) --statistics -c -o $$mo $$po" >> Makefile.$$$$; \ + done; \ + $(MAKE) -f Makefile.$$$$; \ + rm -f Makefile.$$$$; \ + else \ + echo "Unable to compile message catalogs: $(MSGFMT) not found" 1>&2; \ + fi + +install-nls: + @if test "$(NLS)" = "enabled"; then \ + for pot in $(POTFILES); do \ + podir=`dirname $(top_srcdir)/$$pot`; \ + domain=`basename $$pot .pot`; \ + SUDO_LINGUAS=$${LINGUAS-"`echo $$podir/*.mo | $(SED) 's:'$$podir'/\([^ ]*\).mo:\1:g'`"}; \ + echo $(ECHO_N) "Installing $$domain message catalogs:$(ECHO_C)"; \ + for lang in $$SUDO_LINGUAS; do \ + test -s $$podir/$$lang.mo || continue; \ + echo $(ECHO_N) " $$lang$(ECHO_C)"; \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ + if test -n "$(LOCALEDIR_SUFFIX)"; then \ + if test ! -d $(DESTDIR)$(localedir)/$$lang$(LOCALEDIR_SUFFIX); then \ + ln -s $$lang $(DESTDIR)$(localedir)/$$lang$(LOCALEDIR_SUFFIX); \ + fi; \ + fi; \ + $(INSTALL) $(INSTALL_OWNER) -m 0644 $$podir/$$lang.mo $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$$domain.mo; \ + done; \ + echo ""; \ + done; \ + fi + +check-dist: update-pot compile-po + @if test -d $(srcdir)/.hg && cd $(srcdir); then \ + if test `hg stat -am | wc -l` -ne 0; then \ + echo "Uncommitted changes" 1>&2; \ + hg stat -am 1>&2; \ + exit 1; \ + fi; \ + fi + +dist: check-dist force-dist + +force-dist: ChangeLog $(srcdir)/MANIFEST + cd $(top_srcdir) && \ + pax -w -x ustar -s '/^/$(PACKAGE_TARNAME)-$(VERSION)\//' \ + -f ../$(PACKAGE_TARNAME)-$(VERSION).tar \ + `$(SED) 's/[ ].*//' $(srcdir)/MANIFEST` && \ + gzip -9f ../$(PACKAGE_TARNAME)-$(VERSION).tar && \ + ls -l ../$(PACKAGE_TARNAME)-$(VERSION).tar.gz + +package: $(srcdir)/sudo.pp + DESTDIR=`cd $(top_builddir) && pwd`/destdir; rm -rf $$DESTDIR; \ + $(MAKE) install INSTALL_OWNER= DESTDIR=$$DESTDIR && \ + $(SHELL) $(srcdir)/pp $(PPFLAGS) \ + --destdir=$$DESTDIR \ + $(srcdir)/sudo.pp \ + prefix=$(prefix) \ + bindir=$(bindir) \ + sbindir=$(sbindir) \ + libexecdir=$(libexecdir) \ + includedir=$(includedir) \ + vardir=$(vardir) \ + rundir=$(rundir) \ + mandir=$(mandir) \ + localedir=$(localedir) \ + sysconfdir=$(sysconfdir) \ + sudoersdir=$(sudoersdir) \ + sudoers_uid=$(sudoers_uid) \ + sudoers_gid=$(sudoers_gid) \ + sudoers_mode=$(sudoers_mode) \ + shlib_mode=$(shlib_mode) \ + version=$(VERSION) $(PPVARS) + +clean: config.status + for d in $(SUBDIRS) $(SAMPLES); do \ + (cd $$d && exec $(MAKE) $@); \ + done + -rm -rf cov-int cov-int.tgz + +mostlyclean: clean + +distclean: config.status + for d in $(SUBDIRS) $(SAMPLES); do \ + (cd $$d && exec $(MAKE) $@); \ + done + -rm -rf autom4te.cache config.cache config.h config.log config.status \ + init.d/*.sh init.d/utsudo.conf libtool Makefile pathnames.h stamp-* + +cleandir: distclean + +clobber: distclean + +realclean: distclean + +me: + +a: + +sandwich: + @if test -n "$$SUDO_USER"; then \ + echo "Okay."; \ + else \ + echo "What? Make it yourself!"; \ + fi + +.PHONY: ChangeLog me a sandwhich diff --git a/utsudo-0.0.2/NEWS b/utsudo-0.0.2/NEWS new file mode 100644 index 0000000..2182d12 --- /dev/null +++ b/utsudo-0.0.2/NEWS @@ -0,0 +1,2759 @@ +What's new in Sudo 1.8.29 + + * The cvtsudoers command will now reject non-LDIF input when converting + from LDIF format to sudoers or JSON formats. + + * The new log_allowed and log_denied sudoers settings make it possible + to disable logging and auditing of allowed and/or denied commands. + + * The umask is now handled differently on systems with PAM or login.conf. + If the umask is explicitly set in sudoers, that value is used regardless + of what PAM or login.conf may specify. However, if the umask is not + explicitly set in sudoers, PAM or login.conf may now override the default + sudoers umask. Bug #900. + + * For "make install", the sudoers file is no longer checked for syntax + errors when DESTDIR is set. The default sudoers file includes the + contents of /etc/sudoers.d which may not be readable as non-root. + Bug #902. + + * Sudo now sets most resource limits to their maximum value to avoid + problems caused by insufficient resources, such as an inability to + allocate memory or open files and pipes. + + * Fixed a regression introduced in sudo 1.8.28 where sudo would refuse + to run if the parent process was not associated with a session. + This was due to sudo passing a session ID of -1 to the plugin. + +What's new in Sudo 1.8.28p1 + + * The fix for Bug #869 caused "sudo -v" to prompt for a password + when "verifypw" is set to "all" (the default) and all of the + user's sudoers entries are marked with NOPASSWD. Bug #901. + +What's new in Sudo 1.8.28 + + * Sudo will now only set PAM_TTY to the empty string when no + terminal is present on Solaris and Linux. This workaround is + only needed on those systems which may have PAM modules that + misbehave when PAM_TTY is not set. + + * The mailerflags sudoers option now has a default value even if + sendmail support was disabled at configure time. Fixes a crash + when the mailerpath sudoers option is set but mailerflags is not. + Bug #878. + + * Sudo will now filter out last login messages on HP-UX unless it + a shell is being run via "sudo -s" or "sudo -i". Otherwise, + when trusted mode is enabled, these messages will be displayed + for each command. + + * On AIX, when the user's password has expired and PAM is not in use, + sudo will now allow the user to change their password. + Bug #883. + + * Sudo has a new -B command line option that will ring the terminal + bell when prompting for a password. + + * Sudo no longer refuses to prompt for a password when it cannot + determine the user's terminal as long as it can open /dev/tty. + This allows sudo to function on systems where /proc is unavailable, + such as when running in a chroot environment. + + * The "env_editor" sudoers flag is now on by default. This makes + source builds more consistent with the packages generated by + sudo's mkpkg script. + + * Sudo no longer ships with pre-formatted copies of the manual pages. + These were included for systems like IRIX that don't ship with an + nroff utility. There are now multiple Open Source nroff replacements + so this should no longer be an issue. + + * Fixed a bad interaction with configure's --prefix and + --disable-shared options. Bug #886. + + * More verbose error message when a password is required and no terminal + is present. Bug #828. + + * Command tags, such as NOPASSWD, are honored when a user tries to run a + command that is allowed by sudoers but which does not actually + exist on the file system. Bug #888. + + * Asturian translation for sudoers from translationproject.org. + + * I/O log timing files now store signal suspend and resume information + in the form of a signal name instead of a number. + + * Fixed a bug introduced in 1.8.24 that prevented sudo from honoring + the value of "ipa_hostname" from sssd.conf, if specified, when + matching the host name. + + * Fixed a bug introduced in 1.8.21 that prevented the core dump + resource limit set in the pam_limits module from taking effect. + Bug #894. + + * Fixed parsing of double-quoted Defaults group and netgroup bindings. + + * The user ID is now used when matching sudoUser attributes in LDAP. + Previously, the user name, group name and group IDs were used + when matching but not the user ID. + + * Sudo now writes PAM messages to the user's terminal, if available, + instead of the standard output or standard error. This prevents + PAM output from being intermixed with that of the command when + output is sent to a file or pipe. Bug #895. + + * Sudoedit now honors the umask and umask_override settings in sudoers. + Previously, the user's umask was used as-is. + + * Fixed a bug where the terminal's file context was not restored + when using SELinux RBAC. Bug #898. + + * Fixed CVE-2019-14287, a bug where a sudo user may be able to + run a command as root when the Runas specification explicitly + disallows root access as long as the ALL keyword is listed first. + +What's new in Sudo 1.8.27 + + * On HP-UX, sudo will now update the utmps file when running a command + in a pseudo-tty. Previously, only the utmp and utmpx files were + updated. + + * Nanosecond precision file time stamps are now supported in HP-UX. + + * Fixes and clarifications to the sudo plugin documentation. + + * The sudo manuals no longer require extensive post-processing to + hide system-specific features. Conditionals in the roff source + are now used instead. This fixes corruption of the sudo manual + on systems without BSD login classes. Bug #861. + + * If an I/O logging plugin is configured but the plugin does not + actually log any I/O, sudo will no longer force the command to + be run in a pseudo-tty. + + * The fix for bug #843 in sudo 1.8.24 was incomplete. If the + user's password was expired or needed to be updated, but no sudo + password was required, the PAM handle was freed too early, + resulting in a failure when processing PAM session modules. + + * In visudo, it is now possible to specify the path to sudoers + without using the -f option. Bug #864. + + * Fixed a bug introduced in sudo 1.8.22 where the utmp (or utmpx) + file would not be updated when a command was run in a pseudo-tty. + Bug #865. + + * Sudo now sets the silent flag when opening the PAM session except + when running a shell via "sudo -s" or "sudo -i". This prevents + the pam_lastlog module from printing the last login information + for each sudo command. Bug #867. + + * Fixed the default AIX hard resource limit for the maximum number + of files a user may have open. If no hard limit for "nofiles" + is explicitly set in /etc/security/limits, the default should + be "unlimited". Previously, the default hard limit was 8196. + +What's new in Sudo 1.8.26 + + * Fixed a bug in cvtsudoers when converting to JSON format when + alias expansion is enabled. Bug #853. + + * Sudo no long sets the USERNAME environment variable when running + commands. This is a non-standard environment variable that was + set on some older Linux systems. + + * Sudo now treats the LOGNAME and USER environment variables (as + well as the LOGIN variable on AIX) as a single unit. If one is + preserved or removed from the environment using env_keep, env_check + or env_delete, so is the other. + + * Added support for OpenLDAP's TLS_REQCERT setting in ldap.conf. + + * Sudo now logs when the command was suspended and resumed in the + I/O logs. This information is used by sudoreplay to skip the + time suspended when replaying the session unless the new -S flag + is used. + + * Fixed documentation problems found by the igor utility. Bug #854. + + * Sudo now prints a warning message when there is an error or end + of file while reading the password instead of exiting silently. + + * Fixed a bug in the sudoers LDAP back-end parsing the command_timeout, + role, type, privs and limitprivs sudoOptions. This also affected + cvtsudoers conversion from LDIF to sudoers or JSON. + + * Fixed a bug that prevented timeout settings in sudoers from + functioning unless a timeout was also specified on the command + line. + + * Asturian translation for sudo from translationproject.org. + + * When generating LDIF output, cvtsudoers can now be configured + to pad the sudoOrder increment such that the start order is used + as a prefix. Bug #856. + + * Fixed a bug introduced in sudo 1.8.25 that prevented sudo from + properly setting the user's groups on AIX. Bug #857. + + * If the user specifies a group via sudo's -g option that matches + any of the target user's groups, it is now allowed even if no + groups are present in the Runas_Spec. Previously, it was only + allowed if it matched the target user's primary group. + + * The sudoers LDAP back-end now supports negated sudoRunAsUser and + sudoRunAsGroup entries. + + * Sudo now provides a proper error message when the "fqdn" sudoers + option is set and it is unable to resolve the local host name. + Bug #859. + + * Portuguese translation for sudo and sudoers from translationproject.org. + + * Sudo now includes sudoers LDAP schema for the on-line configuration + supported by OpenLDAP. + +What's new in Sudo 1.8.25p1 + + * Fixed a bug introduced in sudo 1.8.25 that caused a crash on + systems that have the poll() function but not the ppoll() function. + Bug #851. + +What's new in Sudo 1.8.25 + + * Fixed a bug introduced in sudo 1.8.20 that broke formatting of + I/O log timing file entries on systems without a C99-compatible + snprintf() function. Our replacement snprintf() doesn't support + floating point so we can't use the "%f" format directive. + + * I/O log timing file entries now use a monotonic timer and include + nanosecond precision. A monotonic timer that does not increment + while the system is sleeping is used where available. + + * Fixed a bug introduced in sudo 1.8.24 where sudoNotAfter in the LDAP + backend was not being properly parsed. Bug #845. + + * When sudo runs a command in a pseudo-tty, the slave device is + now closed in the main process immediately after starting the + monitor process. This removes the need for an AIX-specific + workaround that was added in sudo 1.8.24. + + * Added support for monotonic timers on HP-UX. + + * Fixed a bug displaying timeout values the "sudo -V" output. + The value displayed was 3600 times the actual value. Bug #846. + + * Fixed a build issue on AIX 7.1 BOS levels that include memset_s() + and define rsize_t in string.h. Bug #847. + + * The testsudoers utility now supports querying an LDIF-format + policy. + + * Sudo now sets the LOGIN environment variable to the same value as + LOGNAME on AIX systems. Bug #848. + + * Fixed a regression introduced in sudo 1.8.24 where the LDAP and + SSSD backends evaluated the rules in reverse sudoOrder. Bug #849. + +What's new in Sudo 1.8.24 + + * The LDAP and SSS back-ends now use the same rule evaluation code + as the sudoers file backend. This builds on the work in sudo + 1.8.23 where the formatting functions for "sudo -l" output were + shared. The handling of negated commands in SSS and LDAP is + unchanged. + + * Fixed a regression introduced in 1.8.23 where "sudo -i" could + not be used in conjunction with --preserve-env=VARIABLE. Bug #835. + + * cvtsudoers can now parse base64-encoded attributes in LDIF files. + + * Random insults are now more random. + + * Fixed the noexec wordexp(3) test on FreeBSD. + + * Added SUDO_CONV_PREFER_TTY flag for conversation function to + tell sudo to try writing to /dev/tty first. Can be used in + conjunction with SUDO_CONV_INFO_MSG and SUDO_CONV_ERROR_MSG. + + * Sudo now supports an arbitrary number of groups per user on + Solaris. Previously, only the first 64 groups were found. + This should remove the need to set "max_groups" in sudo.conf. + + * Fixed typos in the OpenLDAP sudo schema. Bugs #839 and #840. + + * Fixed a race condition when building with parallel make. + Bug #842. + + * Fixed a duplicate free when netgroup_base in ldap.conf is set + to an invalid value. + + * Fixed a bug introduced in sudo 1.8.23 on AIX that could prevent + local users and groups from being resolved properly on systems + that have users stored in NIS, LDAP or AD. + + * Added a workaround for an AIX bug exposed by a change in sudo + 1.8.23 that prevents the terminal mode from being restored when + I/O logging is enabled. + + * On systems using PAM, sudo now ignores the PAM_NEW_AUTHTOK_REQD + and PAM_AUTHTOK_EXPIRED errors from PAM account management if + authentication is disabled for the user. This fixes a regression + introduced in sudo 1.8.23. Bug #843. + + * Fixed an ambiguity in the sudoers manual in the description and + definition of User, Runas, Host, and Cmnd Aliases. Bug #834. + + * Fixed a bug that resulted in only the first window size change + event being logged. + + * Fixed a bug on HP-UX systems introduced in sudo 1.8.22 that + caused sudo to prompt for a password every time when tty-based + time stamp files were in use. + + * Fixed a compilation problem on systems that define O_PATH or + O_SEARCH in fnctl.h but do not define O_DIRECTORY. Bug #844. + +What's new in Sudo 1.8.23 + + * PAM account management modules and BSD auth approval modules are + now run even when no password is required. + + * For kernel-based time stamps, if no terminal is present, fall + back to parent-pid style time stamps. + + * The new cvtsudoers utility replaces both the "sudoers2ldif" script + and the "visudo -x" functionality. It can read a file in either + sudoers or LDIF format and produce JSON, LDIF or sudoers output. + It is also possible to filter the generated output file by user, + group or host name. + + * The file, ldap and sss sudoers backends now share a common set + of formatting functions for "sudo -l" output, which is also used + by the cvtsudoers utility. + + * The /run directory is now used in preference to /var/run if it + exists. Bug #822. + + * More accurate descriptions of the --with-rundir and --with-vardir + configure options. Bug #823. + + * The setpassent() and setgroupent() functions are now used on systems + that support them to keep the passwd and group database open. + Sudo performs a lot of passwd and group lookups so it can be + beneficial to avoid opening and closing the files each time. + + * The new case_insensitive_user and case_insensitive_group sudoers + options can be used to control whether sudo does case-sensitive + matching of users and groups in sudoers. Case insensitive + matching is now the default. + + * Fixed a bug on some systems where sudo could hang on command + exit when I/O logging was enabled. Bug #826. + + * Fixed the build-time process start time test on Linux when the + test is run from within a container. Bug #829. + + * When determining which temporary directory to use, sudoedit now + checks the directory for writability before using it. Previously, + sudoedit only performed an existence check. Bug #827. + + * Sudo now includes an optional set of Monty Python-inspired insults. + + * Fixed the execution of scripts with an associated digest (checksum) + in sudoers on FreeBSD systems. FreeBSD does not have a proper + /dev/fd directory mounted by default and its fexecve(2) is not + fully POSIX compliant when executing scripts. Bug #831. + + * Chinese (Taiwan) translation for sudo from translationproject.org. + +What's new in Sudo 1.8.22 + + * Commands run in the background from a script run via sudo will + no longer receive SIGHUP when the parent exits and I/O logging + is enabled. Bug #502 + + * A particularly offensive insult is now disabled by default. + Bug #804 + + * The description of "sudo -i" now correctly documents that + the "env_keep" and "env_check" sudoers options are applied to + the environment. Bug #806 + + * Fixed a crash when the system's host name is not set. + Bug #807 + + * The sudoers2ldif script now handles #include and #includedir + directives. + + * Fixed a bug where sudo would silently exit when the command was + not allowed by sudoers and the "passwd_tries" sudoers option + was set to a value less than one. + + * Fixed a bug with the "listpw" and "verifypw" sudoers options and + multiple sudoers sources. If the option is set to "all", a + password should be required unless none of a user's sudoers + entries from any source require authentication. + + * Fixed a bug with the "listpw" and "verifypw" sudoers options in + the LDAP and SSSD back-ends. If the option is set to "any", and + the entry contained multiple rules, only the first matching rule + was checked. If an entry contained more than one matching rule + and the first rule required authentication but a subsequent rule + did not, sudo would prompt for a password when it should not have. + + * When running a command as the invoking user (not root), sudo + would execute the command with the same group vector it was + started with. Sudo now executes the command with a new group + vector based on the group database which is consistent with + how su(1) operates. + + * Fixed a double free in the SSSD back-end that could occur when + ipa_hostname is present in sssd.conf and is set to an unqualified + host name. + + * When I/O logging is enabled, sudo will now write to the terminal + even when it is a background process. Previously, sudo would + only write to the tty when it was the foreground process when + I/O logging was enabled. If the TOSTOP terminal flag is set, + sudo will suspend the command (and then itself) with the SIGTTOU + signal. + + * A new "authfail_message" sudoers option that overrides the + default "N incorrect password attempt(s)". + + * An empty sudoRunAsUser attribute in the LDAP and SSSD backends + will now match the invoking user. This is more consistent with + how an empty runas user in the sudoers file is treated. + + * Documented that in check mode, visudo does not check the owner/mode + on files specified with the -f flag. Bug #809. + + * It is now an error to specify the runas user as an empty string + on the command line. Previously, an empty runas user was treated + the same as an unspecified runas user. Bug #817. + + * When "timestamp_type" option is set to "tty" and a terminal is + present, the time stamp record will now include the start time + of the session leader. When the "timestamp_type" option is set + to "ppid" or when no terminal is available, the start time of + the parent process is used instead. This significantly reduces + the likelihood of a time stamp record being re-used when a user + logs out and back in again. Bug #818. + + * The sudoers time stamp file format is now documented in the new + sudoers_timestamp manual. + + * The "timestamp_type" option now takes a "kernel" value on OpenBSD + systems. This causes the tty-based time stamp to be stored in + the kernel instead of on the file system. If no tty is present, + the time stamp is considered to be invalid. + + * Visudo will now use the SUDO_EDITOR environment variable (if + present) in addition to VISUAL and EDITOR. + +What's new in Sudo 1.8.21p2 + + * Fixed a bug introduced in version 1.8.21 which prevented sudo + from using the PAM-supplied prompt. Bug #799 + + * Fixed a bug introduced in version 1.8.21 which could result in + sudo hanging when running commands that exit quickly. Bug #800 + + * Fixed a bug introduced in version 1.8.21 which prevented the + command from being run when the password was read via an external + program using the askpass interface. Bug #801 + +What's new in Sudo 1.8.21p1 + + * On systems that support both PAM and SIGINFO, the main sudo + process will no longer forward SIGINFO to the command if the + signal was generated from the keyboard. The command will have + already received SIGINFO since it is part of the same process + group so there's no need for sudo to forward it. This is + consistent with the handling of SIGINT, SIGQUIT and SIGTSTP. + Bug #796 + + * If SUDOERS_SEARCH_FILTER in ldap.conf does not specify a value, + the LDAP search expression used when looking up netgroups and + non-Unix groups had a syntax error if a group plugin was not + specified. + + * "sudo -U otheruser -l" will now have an exit value of 0 even + if "otheruser" has no sudo privileges. The exit value when a + user attempts to lists their own privileges or when a command + is specified is unchanged. + + * Fixed a regression introduced in sudo 1.8.21 where sudoreplay + playback would hang for I/O logs that contain terminal input. + + * Sudo 1.8.18 contained an incomplete fix for the matching of + entries in the LDAP and SSSD back-ends when a sudoRunAsGroup is + specified but no sudoRunAsUser is present in the sudoRole. + +What's new in Sudo 1.8.21 + + * The path that sudo uses to search for terminal devices can now + be configured via the new "devsearch" Path setting in sudo.conf. + + * It is now possible to preserve bash shell functions in the + environment when the "env_reset" sudoers setting is disabled by + removing the "*=()*" pattern from the env_delete list. + + * A change made in sudo 1.8.15 inadvertantly caused sudoedit to + send itself SIGHUP instead of exiting when the editor returns + an error or the file was not modified. + + * Sudoedit now uses an exit code of zero if the file was not + actually modified. Previously, sudoedit treated a lack of + modifications as an error. + + * When running a command in a pseudo-tty (pty), sudo now copies a + subset of the terminal flags to the new pty. Previously, all + flags were copied, even those not appropriate for a pty. + + * Fixed a problem with debug logging in the sudoers I/O logging + plugin. + + * Window size change events are now logged to the policy plugin. + On xterm and compatible terminals, sudoreplay is now capable of + resizing the terminal to match the size of the terminal the + command was run on. The new -R option can be used to disable + terminal resizing. + + * Fixed a bug in visudo where a newly added file was not checked + for syntax errors. Bug #791. + + * Fixed a bug in visudo where if a syntax error in an include + directory (like /etc/sudoers.d) was detected, the edited version + was left as a temporary file instead of being installed. + + * On PAM systems, sudo will now treat "username's Password:" as + a standard password prompt. As a result, the SUDO_PROMPT + environment variable will now override "username's Password:" + as well as the more common "Password:". Previously, the + "passprompt_override" Defaults setting would need to be set for + SUDO_PROMPT to override a prompt of "username's Password:". + + * A new "syslog_pid" sudoers setting has been added to include + sudo's process ID along with the process name when logging via + syslog. Bug #792. + + * Fixed a bug introduced in sudo 1.8.18 where a command would + not be terminated when the I/O logging plugin returned an error + to the sudo front-end. + + * A new "timestamp_type" sudoers setting has been added that replaces + the "tty_tickets" option. In addition to tty and global time stamp + records, it is now possible to use the parent process ID to restrict + the time stamp to commands run by the same process, usually the shell. + Bug #793. + + * The --preserve-env command line option has been extended to accept + a comma-separated list of environment variables to preserve. + Bug #279. + + * Friulian translation for sudo from translationproject.org. + +What's new in Sudo 1.8.20p2 + + * Fixed a bug parsing /proc/pid/stat on Linux when the process + name contains newlines. This is not exploitable due to the /dev + traversal changes in sudo 1.8.20p1. + +What's new in Sudo 1.8.20p1 + + * Fixed "make check" when using OpenSSL or GNU crypt. + Bug #787. + + * Fixed CVE-2017-1000367, a bug parsing /proc/pid/stat on Linux + when the process name contains spaces. Since the user has control + over the command name, this could potentially be used by a user + with sudo access to overwrite an arbitrary file on systems with + SELinux enabled. Also stop performing a breadth-first traversal + of /dev when looking for the device; only a hard-coded list of + directories are checked, + +What's new in Sudo 1.8.20 + + * Added support for SASL_MECH in ldap.conf. Bug #764 + + * Added support for digest matching when the command is a glob-style + pattern or a directory. Previously, only explicit path matches + supported digest checks. + + * New "fdexec" Defaults option to control whether a command + is executed by path or by open file descriptor. + + * The embedded copy of zlib has been upgraded to version 1.2.11. + + * Fixed a bug that prevented sudoers include files with a relative + path starting with the letter 'i' from being opened. Bug #776. + + * Added support for command timeouts in sudoers. The command will + be terminated if the timeout expires. + + * The SELinux role and type are now displayed in the "sudo -l" + output for the LDAP and SSSD back-ends, just as they are in the + sudoers back-end. + + * A new command line option, -T, can be used to specify a command + timeout as long as the user-specified timeout is not longer than + the timeout specified in sudoers. This option may only be + used when the "user_command_timeouts" flag is enabled in sudoers. + + * Added NOTBEFORE and NOTAFTER command options to the sudoers + back-end similar to what is already available in the LDAP back-end. + + * Sudo can now optionally use the SHA2 functions in OpenSSL or GNU + crypt instead of the SHA2 implementation bundled with sudo. + + * Fixed a compilation error on systems without the stdbool.h header + file. Bug #778. + + * Fixed a compilation error in the standalone Kerberos V authentication + module. Bug #777. + + * Added the iolog_flush flag to sudoers which causes I/O log data + to be written immediately to disk instead of being buffered. + + * I/O log files are now created with group ID 0 by default unless + the "iolog_user" or "iolog_group" options are set in sudoers. + + * It is now possible to store I/O log files on an NFS-mounted + file system where uid 0 is remapped to an unprivileged user. + The "iolog_user" option must be set to a non-root user and the + top-level I/O log directory must exist and be owned by that user. + + * Added the restricted_env_file setting to sudoers which is similar + to env_file but its contents are subject to the same restrictions + as variables in the invoking user's environment. + + * Fixed a use after free bug in the SSSD back-end when the fqdn + sudoOption is enabled and no hostname value is present in + /etc/sssd/sssd.conf. + + * Fixed a typo that resulted in a compilation error on systems + where the killpg() function is not found by configure. + + * Fixed a compilation error with the included version of zlib + when sudo was built outside the source tree. + + * Fixed the exit value of sudo when the command is terminated by + a signal other than SIGINT. This was broken in sudo 1.8.15 by + the fix for Bug #722. Bug #784. + + * Fixed a regression introduced in sudo 1.8.18 where the "lecture" + option could not be used in a positive boolean context, only + a negative one. + + * Fixed an issue where sudo would consume stdin if it was not + connected to a tty even if log_input is not enabled in sudoers. + Bug #786. + + * Clarify in the sudoers manual that the #includedir directive + diverts control to the files in the specified directory and, + when parsing of those files is complete, returns control to the + original file. Bug #775. + +What's new in Sudo 1.8.19p2 + + * Fixed a crash in visudo introduced in sudo 1.8.9 when an IP address + or network is used in a host-based Defaults entry. Bug #766 + + * Added a missing check for the ignore_iolog_errors flag when + the sudoers plugin generates the I/O log file path name. + + * Fixed a typo in sudo's vsyslog() replacement that resulted in + garbage being logged to syslog. + +What's new in Sudo 1.8.19p1 + + * Fixed a bug introduced in sudo 1.8.19 that resulted in the wrong + syslog priority and facility being used. + +What's new in Sudo 1.8.19 + + * New "syslog_maxlen" Defaults option to control the maximum size of + syslog messages generated by sudo. + + * Sudo has been run against PVS-Studio and any issues that were + not false positives have been addressed. + + * I/O log files are now created with the same group ID as the + parent directory and not the invoking user's group ID. + + * I/O log permissions and ownership are now configurable via the + "iolog_mode", "iolog_user" and "iolog_group" sudoers Defaults + variables. + + * Fixed configuration of the sudoers I/O log plugin debug subsystem. + Previously, I/O log information was not being written to the + sudoers debug log. + + * Fixed a bug in visudo that broke editing of files in an include + dir that have a syntax error. Normally, visudo does not edit + those files, but if a syntax error is detected in one, the user + should get a chance to fix it. + + * Warnings about unknown or unparsable sudoers Defaults entries now + include the file and line number of the problem. + + * Visudo will now use the file and line number information about an + unknown or unparsable Defaults entry to go directly to the file + with the problem. + + * Fixed a bug in the sudoers LDAP back-end where a negated sudoHost + entry would prevent other sudoHost entries following it from matching. + + * Warnings from visudo about a cycle in an Alias entry now include the + file and line number of the problem. + + * In strict mode, visudo will now use the file and line number + information about a cycle in an Alias entry to go directly to the + file with the problem. + + * The sudo_noexec.so file is now linked with -ldl on systems that + require it for the wordexp() wrapper. + + * Fixed linking of sudo_noexec.so on macOS systems where it must be + a dynamic library and not a module. + + * Sudo's "make check" now includes a test for sudo_noexec.so + working. + + * The sudo front-end now passes the user's umask to the plugin. + Previously the plugin had to determine this itself. + + * Sudoreplay can now display the stdin and ttyin streams when they + are explicitly added to the filter list. + + * Fixed a bug introduced in sudo 1.8.17 where the "all" setting + for verifypw and listpw was not being honored. Bug #762. + + * The syslog priority (syslog_goodpri and syslog_badpri) can now + be negated or set to "none" to disable logging of successful or + unsuccessful sudo attempts via syslog. + +What's new in Sudo 1.8.18p1 + + * When sudo_noexec.so is used, the WRDE_NOCMD flag is now added + if the wordexp() function is called. This prevents commands + from being run via wordexp() without disabling it entirely. + + * On Linux systems, sudo_noexec.so now uses a seccomp filter to + disable execute access if the kernel supports seccomp. This is + more robust than the traditional method of using stub functions + that return an error. + +What's new in Sudo 1.8.18 + + * The sudoers locale is now set before parsing the sudoers file. + If sudoers_locale is set in sudoers, it is applied before + evaluating other Defaults entries. Previously, sudoers_locale + was used when evaluating sudoers but not during the inital parse. + Bug #748. + + * A missing or otherwise invalid #includedir is now ignored instead + of causing a parse error. + + * During "make install", backup files are only used on HP-UX where + it is not possible to unlink a shared object that is in use. + This works around a bug in ldconfig on Linux which could create + links to the backup shared library file instead of the current + one. + + * Fixed a bug introduced in 1.8.17 where sudoers entries with long + commands lines could be truncated, preventing a match. Bug #752. + + * The fqdn, runas_default and sudoers_locale Defaults settings are + now applied before any other Defaults settings since they can + change how other Defaults settings are parsed. + + * On systems without the O_NOFOLLOW open(2) flag, when the NOFOLLOW + flag is set, sudoedit now checks whether the file is a symbolic link + before opening it as well as after the open. Bug #753. + + * Sudo will now only resolve a user's group IDs to group names + when sudoers includes group-based permissions. Group lookups + can be expensive on some systems where the group database is + not local. + + * If the file system holding the sudo log file is full, allow + the command to run unless the new ignore_logfile_errors Defaults + option is disabled. Bug #751. + + * The ignore_audit_errors and ignore_iolog_errors Defaults options + have been added to control sudo's behavior when it is unable to + write to the audit and I/O logs. + + * Fixed a bug introduced in 1.8.17 where the SIGPIPE signal handler + was not being restored when sudo directly executes the command. + + * Fixed a bug where "sudo -l command" would indicate that a command + was runnable even when denied by sudoers when using the LDAP or + SSSD back-ends. + + * The match_group_by_gid Defaults option has been added to allow + sites where group name resolution is slow and where sudoers only + contains a small number of groups to match groups by group ID + instead of by group name. + + * Fixed a bug on Linux where a 32-bit sudo binary could fail with + an "unable to allocate memory" error when run on a 64-bit system. + Bug #755 + + * When parsing ldap.conf, sudo will now only treat a '#' character + as the start of a comment when it is at the beginning of the + line. + + * Fixed a potential crash when auditing is enabled and the audit + function fails with an error. Bug #756 + + * Norwegian Nynorsk translation for sudo from translationproject.org. + + * Fixed a typo that broke short host name matching when the fqdn + flag is enabled in sudoers. Bug #757 + + * Negated sudoHost attributes are now supported by the LDAP and + SSSD back-ends. + + * Fixed matching entries in the LDAP and SSSD back-ends when a + RunAsGroup is specified but no RunAsUser is present. + + * Fixed "sudo -l" output in the LDAP and SSSD back-ends when a + RunAsGroup is specified but no RunAsUser is present. + +What's new in Sudo 1.8.17p1 + + * Fixed a bug introduced in 1.8.17 where the user's groups were + not set on systems that don't use PAM. Bug #749. + +What's new in Sudo 1.8.17 + + * On AIX, if /etc/security/login.cfg has auth_type set to PAM_AUTH + but pam_start(3) fails, fall back to AIX authentication. + Bug #740. + + * Sudo now takes all sudoers sources into account when determining + whether or not "sudo -l" or "sudo -v" should prompt for a password. + In other words, if both file and ldap sudoers sources are in + specified in /etc/nsswitch.conf, "sudo -v" will now require that + all entries in both sources be have NOPASSWD (file) or !authenticate + (ldap) in the entries. + + * Sudo now ignores SIGPIPE until the command is executed. Previously, + SIGPIPE was only ignored in a few select places. Bug #739. + + * Fixed a bug introduced in sudo 1.8.14 where (non-syslog) log + file entries were missing the newline when loglinelen is set to + a non-positive number. Bug #742. + + * Unix groups are now set before the plugin session intialization + code is run. This makes it possible to use dynamic groups with + the Linux-PAM pam_group module. + + * Fixed a bug where a debugging statement could dereference a NULL + pointer when looking up a group that doesn't exist. Bug #743. + + * Sudo has been run through the Coverity code scanner. A number of + minor bugs have been fixed as a result. None were security issues. + + * SELinux support, which was broken in 1.8.16, has been repaired. + + * Fixed a bug when logging I/O where all output buffers might not + get flushed at exit. + + * Forward slashes are no longer escaped in the JSON output of + "visudo -x". This was never required by the standard and not + escaping them improves readability of the output. + + * Sudo no longer treats PAM_SESSION_ERR as a fatal error when + opening the PAM session. Other errors from pam_open_session() + are still treated as fatal. This avoids the "policy plugin + failed session initialization" error message seen on some systems. + + * Korean translation for sudo and sudoers from translationproject.org. + + * Fixed a bug on AIX where the stack size hard resource limit was + being set to 2GB instead of 4GB on 64-bit systems. + + * The SSSD back-end now properly supports "sudo -U otheruser -l". + + * The SSSD back-end now uses the value of "ipa_hostname" + from sssd.conf, if specified, when matching the host name. + + * Fixed a hang on some systems when the command is being run in + a pty and it failed to execute. + + * When performing a wildcard match in sudoers, check for an exact + string match if the user command was fully-qualified (or resolved + via the PATH). This fixes an issue executing scripts on Linux + when there are multiple wildcard matches with the same base name. + Bug #746. + +What's new in Sudo 1.8.16 + + * Fixed a compilation error on Solaris 10 with Stun Studio 12. + Bug #727. + + * When preserving variables from the invoking user's environment, if + there are duplicates sudo now only keeps the first instance. + + * Fixed a bug that could cause warning mail to be sent in list + mode (sudo -l) for users without sudo privileges when the + LDAP and sssd back-ends are used. + + * Fixed a bug that prevented the "mail_no_user" option from working + properly with the LDAP back-end. + + * In the LDAP and sssd back-ends, white space is now ignored between + an operator (!, +, +=, -=) when parsing a sudoOption. + + * It is now possible to disable Path settings in sudo.conf + by omitting the path name. + + * The sudoedit_checkdir Defaults option is now enabled by default + and has been extended. When editing files with sudoedit, each + directory in the path to be edited is now checked. If a directory + is writable by the invoking user, symbolic links will not be + followed. If the parent directory of the file to be edited is + writable, sudoedit will refuse to edit it. + Bug #707. + + * The netgroup_tuple Defaults option has been added to enable matching + of the entire netgroup tuple, not just the host or user portion. + Bug #717. + + * When matching commands based on the SHA2 digest, sudo will now + use fexecve(2) to execute the command if it is available. This + fixes a time of check versus time of use race condition when the + directory holding the command is writable by the invoking user. + + * On AIX systems, sudo now caches the auth registry string along + with password and group information. This fixes a potential + problem when a user or group of the same name exists in multiple + auth registries. For example, local and LDAP. + + * Fixed a crash in the SSSD back-end when the invoking user is not + found. Bug #732. + + * Added the --enable-asan configure flag to enable address sanitizer + support. A few minor memory leaks have been plugged to quiet + the ASAN leak detector. + + * The value of _PATH_SUDO_CONF may once again be overridden via + the Makefile. Bug #735. + + * The sudoers2ldif script now handles multiple roles with same name. + + * Fixed a compilation error on systems that have the posix_spawn() + and posix_spawnp() functions but an unusable spawn.h header. + Bug #730. + + * Fixed support for negating character classes in sudo's version + of the fnmatch() function. + + * Fixed a bug in the LDAP and SSSD back-ends that could allow an + unauthorized user to list another user's privileges. Bug #738. + + * The PAM conversation function now works around an ambiguity in the + PAM spec with respect to multiple messages. Bug #726. + +What's new in Sudo 1.8.15 + + * Fixed a bug that prevented sudo from building outside the source tree + on some platforms. Bug #708. + + * Fixed the location of the sssd library in the RHEL/Centos packages. + Bug #710. + + * Fixed a build problem on systems that don't implicitly include + sys/types.h from other header files. Bug #711. + + * Fixed a problem on Linux using containers where sudo would ignore + signals sent by a process in a different container. + + * Sudo now refuses to run a command if the PAM session module + returns an error. + + * When editing files with sudoedit, symbolic links will no longer + be followed by default. The old behavior can be restored by + enabling the sudoedit_follow option in sudoers or on a per-command + basis with the FOLLOW and NOFOLLOW tags. Bug #707. + + * Fixed a bug introduced in version 1.8.14 that caused the last + valid editor in the sudoers "editor" list to be used by visudo + and sudoedit instead of the first. Bug #714. + + * Fixed a bug in visudo that prevented the addition of a final + newline to edited files without one. + + * Fixed a bug decoding certain base64 digests in sudoers when the + intermediate format included a '=' character. + + * Individual records are now locked in the time stamp file instead + of the entire file. This allows sudo to avoid prompting for a + password multiple times on the same terminal when used in a + pipeline. In other words, "sudo cat foo | sudo grep bar" now + only prompts for the password once. Previously, both sudo + processes would prompt for a password, often making it impossible + to enter. + + * Fixed a bug where sudo would fail to run commands as a non-root + user on systems that lack both setresuid() and setreuid(). + Bug #713. + + * Fixed a bug introduced in sudo 1.8.14 that prevented visudo from + re-editing the correct file when a syntax error was detected. + + * Fixed a bug where sudo would not relay a SIGHUP signal to the + command when the terminal is closed and the command is not run + in its own pseudo-tty. Bug #719 + + * If some, but not all, of the LOGNAME, USER or USERNAME environment + variables have been preserved from the invoking user's environment, + sudo will now use the preserved value to set the remaining variables + instead of using the runas user. This ensures that if, for example, + only LOGNAME is present in the env_keep list, that sudo will not + set USER and USERNAME to the runas user. + +* When the command sudo is running dies due to a signal, sudo will + now send itself that same signal with the default signal handler + installed instead of exiting. The bash shell appears to ignore + some signals, e.g. SIGINT, unless the command being run is killed + by that signal. This makes the behavior of commands run under + sudo the same as without sudo when bash is the shell. Bug #722 + + * Slovak translation for sudo from translationproject.org. + + * Hungarian and Slovak translations for sudoers from translationproject.org. + + * Previously, when env_reset was enabled (the default) and the -s + option was not used, the SHELL environment variable was set to the + shell of the invoking user. Now, when env_reset is enabled and + the -s option is not used, SHELL is set based on the target user. + + * Fixed challenge/response style BSD authentication. + + * Added the sudoedit_checkdir Defaults option to prevent sudoedit + from editing files located in a directory that is writable by + the invoking user. + + * Added the always_query_group_plugin Defaults option to control + whether groups not found in the system group database are passed + to the group plugin. Previously, unknown system groups were + always passed to the group plugin. + + * When creating a new file, sudoedit will now check that the file's + parent directory exists before running the editor. + + * Fixed the compiler stack protector test in configure for compilers + that support -fstack-protector but don't actually have the ssp + library available. + +What's new in Sudo 1.8.14p3 + + * Fixed a bug introduced in sudo 1.8.14p2 that prevented sudo + from working when no tty was present. + + * Fixed tty detection on newer AIX systems where dev_t is 64-bit. + +What's new in Sudo 1.8.14p2 + + * Fixed a bug introduced in sudo 1.8.14 that prevented the lecture + file from being created. Bug #704. + +What's new in Sudo 1.8.14p1 + + * Fixed a bug introduced in sudo 1.8.14 that prevented the sssd + back-end from working. Bug #703. + +What's new in Sudo 1.8.14 + + * Log messages on Mac OS X now respect sudoers_locale when sudo + is build with NLS support. + + * The sudo manual pages now pass "mandoc -Tlint" with no warnings. + + * Fixed a compilation problem on systems with the sig2str() function + that do not define SIG2STR_MAX in signal.h. + + * Worked around a compiler bug that resulted in unexpected behavior + when returning an int from a function declared to return bool + without an explicit cast. + + * Worked around a bug in Mac OS X 10.10 BSD auditing where the + au_preselect() fails for AUE_sudo events but succeeds for + AUE_DARWIN_sudo. + + * Fixed a hang on Linux systems with glibc when sudo is linked with + jemalloc. + + * When the user runs a command as a user ID that is not present in + the password database via the -u flag, the command is now run + with the group ID of the invoking user instead of group ID 0. + + * Fixed a compilation problem on systems that don't pull in + definitions of uid_t and gid_t without sys/types.h or unistd.h. + + * Fixed a compilation problem on newer AIX systems which use a + struct st_timespec for time stamps in struct stat that differs + from struct timespec. Bug #702. + + * The example directory is now configurable via --with-exampledir + and defaults to DATAROOTDIR/examples/sudo on BSD systems. + + * The /usr/lib/tmpfiles.d/sudo.conf file is now installed as part + of "make install" when systemd is in use. + + * Fixed a linker problem on some systems with libintl. Bug #690. + + * Fixed compilation with compilers that don't support __func__ + or __FUNCTION__. + + * Sudo no longer needs to uses weak symbols to support localization + in the warning functions. A registration function is used instead. + + * Fixed a setresuid() failure in sudoers on Linux kernels where + uid changes take the nproc resource limit into account. + + * Fixed LDAP netgroup queries on AIX. + + * Sudo will now display the custom prompt on Linux systems with PAM + even if the "Password: " prompt is not localized by the PAM module. + Bug #701. + + * Double-quoted values in an LDAP sudoOption are now supported + for consistency with file-based sudoers. + + * Fixed a bug that prevented the btime entry in /proc/stat from + being parsed on Linux. + +What's new in Sudo 1.8.13 + + * The examples directory is now a subdirectory of the doc dir to + conform to Debian guidelines. Bug #682. + + * Fixed a compilation error for siglist.c and signame.c on some + systems. Bug #686 + + * Weak symbols are now used for sudo_warn_gettext() and + sudo_warn_strerror() in libsudo_util to avoid link errors when + -Wl,--no-undefined is used in LDFLAGS. The --disable-weak-symbols + configure option can be used to disable the user of weak symbols. + + * Fixed a bug in sudo's mkstemps() replacement function that + prevented the file extension from being preserved in sudoedit. + + * A new mail_all_cmnds sudoers flag will send mail when a user runs + a command (or tries to). The behavior of the mail_always flag has + been restored to always send mail when sudo is run. + + * New "MAIL" and "NOMAIL" command tags have been added to toggle + mail sending behavior on a per-command (or Cmnd_Alias) basis. + + * Fixed matching of empty passwords when sudo is configured to + use passwd (or shadow) file authentication on systems where the + crypt() function returns NULL for invalid salts. + + * On AIX, sudo now uses the value of the auth_type setting in + /etc/security/login.cfg to determine whether to use LAM or PAM + for user authentication. + + * The "all" setting for listpw and verifypw now works correctly + with LDAP and sssd sudoers. + + * The sudo timestamp directory is now created at boot time on + platforms that use systemd. + + * Sudo will now restore the value of the SIGPIPE handler before + executing the command. + + * Sudo now uses "struct timespec" instead of "struct timeval" for + time keeping when possible. If supported, sudoedit and visudo + now use nanosecond granularity time stamps. + + * Fixed a symbol name collision with systems that have their own + SHA2 implementation. This fixes a problem where PAM could use + the wrong SHA2 implementation on Solaris 10 systems configured + to use SHA512 for passwords. + + * The editor invoked by sudoedit once again uses an unmodified + copy of the user's environment as per the documentation. This + was inadvertantly changed in sudo 1.8.0. Bug #688. + +What's new in Sudo 1.8.12 + + * The embedded copy of zlib has been upgraded to version 1.2.8 and + is now installed as a shared library where supported. + + * Debug settings for the sudo front end and sudoers plugin are now + configured separately. + + * Multiple sudo.conf Debug entries may now be specified per program + (or plugin). + + * The plugin API has been extended such that the path to the plugin + that was loaded is now included in the settings array. This + path can be used to register with the debugging subsystem. The + debug_flags setting is now prefixed with a file name and may be + specified multiple times if there is more than one matching Debug + setting in sudo.conf. + + * The sudoers regression tests now run with the locale set to C + since some of the tests compare output that includes locale-specific + messages. Bug #672 + + * Fixed a bug where sudo would not run commands on Linux when + compiled with audit support if audit is disabled. Bug #671 + + * Added __BASH_FUNC<* to the environment blacklist to match + Apple's syntax for newer-style bash functions. + + * The default password prompt now includes a trailing space after + "Password:" for consistency with su(1) on most systems. + Bug #663 + + * Fixed a problem on DragonFly BSD where SIGCHLD could be ignored, + preventing sudo from exiting. Bug #676 + + * Visudo will now use the optional sudoers_file, sudoers_mode, + sudoers_uid and sudoers_gid arguments if specified on the + sudoers.so Plugin line in the sudo.conf file. + + * Fixed a problem introduced in sudo 1.8.8 that prevented the full + host name from being used when the "fqdn" sudoers option is used. + Bug #678 + + * French and Russian translations for sudoers from translationproject.org. + + * Sudo now installs a handler for SIGCHLD signal handler immediately + before stating the process that will execute the command (or + start the monitor). The handler used to be installed earlier + but this causes problems with poorly behaved PAM modules that + install their own SIGCHLD signal handler and neglect to restore + sudo's original handler. Bug #657 + + * Removed a limit on the length of command line arguments expanded + by a wild card using sudo's version of the fnmatch() function. + This limit was introduced when sudo's version of fnmatch() + was replaced in sudo 1.8.4. + + * LDAP-based sudoers can now query an LDAP server for a user's + netgroups directly. This is often much faster than fetching + every sudoRole object containing a sudoUser that begins with a + `+' prefix and checking whether the user is a member of any of + the returned netgroups. + + * The mail_always sudoers option no longer sends mail for "sudo -l" + or "sudo -v" unless the user is unable to authenticate themselves. + + * Fixed a crash when sudo is run with an empty argument vector. + + * Fixed two potential crashes when sudo is run with very low + resource limits. + + * The TZ environment variable is now checked for safety instead + of simply being copied to the environment of the command. + +What's new in Sudo 1.8.11p2 + + * Fixed a bug where dynamic shared objects loaded from a plugin + could use the hooked version of getenv() but not the hooked + versions of putenv(), setenv() or unsetenv(). This can cause + problems for PAM modules that use those functions. + +What's new in Sudo 1.8.11p1 + + * Fixed a compilation problem on some systems when the + --disable-shared-libutil configure option was specified. + + * The user can no longer interrupt the sleep after an incorrect + password on PAM systems using pam_unix. + Bug #666 + + * Fixed a compilation problem on Linux systems that do not use PAM. + Bug #667 + + * "make install" will now work with the stock GNU autotools + install-sh script. Bug #669 + + * Fixed a crash with "sudo -i" when the current working directory + does not exist. Bug #670 + + * Fixed a potential crash in the debug subsystem when logging a message + larger that 1024 bytes. + + * Fixed a "make check" failure for ttyname when stdin is closed and + stdout and stderr are redirected to a different tty. Bug #643 + + * Added BASH_FUNC_* to the environment blacklist to match newer-style + bash functions. + +What's new in Sudo 1.8.11 + + * The sudoers plugin no longer uses setjmp/longjmp to recover + from fatal errors. All errors are now propagated to the caller + via return codes. + + * When running a command in the background, sudo will now forward + SIGINFO to the command (if supported). + + * Sudo will now use the system versions of the sha2 functions from + libc or libmd if available. + + * Visudo now works correctly on GNU Hurd. Bug #647 + + * Fixed suspend and resume of curses programs on some system when + the command is not being run in a pseudo-terminal. Bug #649 + + * Fixed a crash with LDAP-based sudoers on some systems when + Kerberos was enabled. + + * Sudo now includes optional Solaris audit support. + + * Catalan translation for sudoers from translationproject.org. + + * Norwegian Bokmaal translation for sudo from translationproject.org. + + * Greek translation for sudoers from translationproject.org + + * The sudo source tree has been reorganized to more closely resemble + that of other gettext-enabled packages. + + * Sudo and its associated programs now link against a shared version + of libsudo_util. The --disable-shared-libutil configure option + may be used to force static linking if the --enable-static-sudoers + option is also specified. + + * The passwords in ldap.conf and ldap.secret may now be encoded + in base64. + + * Audit updates. SELinux role changes are now audited. For + sudoedit, we now audit the actual editor being run, instead of + just the sudoedit command. + + * Fixed bugs in the man page post-processing that could cause + portions of the manuals to be removed. + + * Fixed a crash in the system_group plugin. Bug #653. + + * Fixed sudoedit on platforms without a native version of the + getprogname() function. Bug #654. + + * Fixed compilation problems with some pre-C99 compilers. + + * Fixed sudo's -C option which was broken in version 1.8.9. + + * It is now possible to match an environment variable's value as + well as its name using env_keep and env_check. This can be used + to preserve bash functions which would otherwise be removed from + the environment. + + * New files created via sudoedit as a non-root user now have the + proper group id. Bug #656 + + * Sudoedit now works correctly in conjunction with sudo's SELinux + RBAC support. Temporary files are now created with the proper + security context. + + * The sudo I/O logging plugin API has been updated. If a logging + function returns an error, the command will be terminated and + all of the plugin's logging functions will be disabled. If a + logging function rejects the command's output it will no longer + be displayed to the user's terminal. + + * Fixed a compilation error on systems that lack openpty(), _getpty() + and grantpt(). Bug #660 + + * Fixed a hang when a sudoers source is listed more than once in + a single sudoers nsswitch.conf entry. + + * On AIX, shell scripts without a #! magic number are now passed to + /usr/bin/sh, not /usr/bin/bsh. This is consistent with what the + execvp() function on AIX does and matches historic sudo behavior. + Bug #661 + + * Fixed a cross-compilation problem building mksiglist and mksigname. + Bug #662 + +What's new in Sudo 1.8.10p3? + + * Fixed expansion of %p in the prompt for "sudo -l" when rootpw, + runaspw or targetpw is set. Bug #639 + + * Fixed matching of UIDs and GIDs which was broken in version 1.8.9. + Bug #640 + + * PAM credential initialization has been re-enabled. It was + unintentionally disabled by default in version 1.8.8. The way + credentials are initialized has also been fixed. Bug #642. + + * Fixed a descriptor leak on Linux when determining boot time. Sudo + normally closes extra descriptors before running a command so + the impact is limited. Bug #645 + + * Fixed flushing of the last buffer of data when I/O logging is + enabled. This bug, introduced in version 1.8.9, could cause + incomplete command output on some systems. Bug #646 + +What's new in Sudo 1.8.10p2? + + * Fixed a hang introduced in sudo 1.8.10 when timestamp_timeout + is set to zero. + +What's new in Sudo 1.8.10p1? + + * Fixed a bug introduced in sudo 1.8.10 that prevented the disabling + of tty-based tickets. + + * Fixed a bug with negated commands in "sudo -l command" that + could cause the command to be listed even when it was explicitly + denied. This only affected list mode when a command was specified. + Bug #636 + +What's new in Sudo 1.8.10? + + * It is now possible to disable network interface probing in + sudo.conf by changing the value of the probe_interfaces + setting. + + * When listing a user's privileges (sudo -l), the sudoers plugin + will now prompt for the user's password even if the targetpw, + rootpw or runaspw options are set. + + * The sudoers plugin uses a new format for its time stamp files. + Each user now has a single file which may contain multiple records + when per-tty time stamps are in use (the default). The time + stamps use a monotonic timer where available and are once again + located in a directory under /var/run. The lecture status is + now stored separately from the time stamps in a different directory. + Bug #616 + + * sudo's -K option will now remove all of the user's time stamps, + not just the time stamp for the current terminal. The -k option + can be used to only disable time stamps for the current terminal. + + * If sudo was started in the background and needed to prompt for + a password, it was not possible to suspend it at the password + prompt. This now works properly. + + * LDAP-based sudoers now uses a default search filter of + (objectClass=sudoRole) for more efficient queries. The netgroup + query has been modified to avoid falling below the minimum length + for OpenLDAP substring indices. + + * The new "use_netgroups" sudoers option can be used to explicitly + enable or disable netgroups support. For LDAP-based sudoers, + netgroup support requires an expensive substring match on the + server. If netgroups are not needed, this option can be disabled + to reduce the load on the LDAP server. + + * Sudo is once again able to open the sudoers file when the group + on sudoers doesn't match the expected value, so long as the file + is not group writable. + + * Sudo now installs an init.d script to clear the time stamp + directory at boot time on AIX and HP-UX systems. These systems + either lack /var/run or do not clear it on boot. + + * The JSON format used by "visudo -x" now properly supports the + negation operator. In addition, the Options object is now the + same for both Defaults and Cmnd_Specs. + + * Czech and Serbian translations for sudoers from translationproject.org. + + * Catalan translation for sudo from translationproject.org. + +What's new in Sudo 1.8.9p5? + + * Fixed a compilation error on AIX when LDAP support is enabled. + + * Fixed parsing of the "umask" defaults setting in sudoers. Bug #632. + + * Fixed a failed assertion when the "closefrom_override" defaults + setting is enabled in sudoers and sudo's -C flag is used. Bug #633. + +What's new in Sudo 1.8.9p4? + + * Fixed a bug where sudo could consume large amounts of CPU while + the command was running when I/O logging is not enabled. Bug #631 + + * Fixed a bug where sudo would exit with an error when the debug + level is set to util@debug or all@debug and I/O logging is not + enabled. The command would continue running after sudo exited. + +What's new in Sudo 1.8.9p3? + + * Fixed a bug introduced in sudo 1.8.9 that prevented the tty name + from being resolved properly on Linux systems. Bug #630. + +What's new in Sudo 1.8.9p2? + + * Updated config.guess, config.sub and libtool to support the ppc64le + architecture (IBM PowerPC Little Endian). + +What's new in Sudo 1.8.9p1? + + * Fixed a problem with gcc 4.8's handling of bit fields that could + lead to the noexec flag being enabled even when it was not + explicitly set. + +What's new in Sudo 1.8.9? + + * Reworked sudo's main event loop to use a simple event subsystem + using poll(2) or select(2) as the back end. + + * It is now possible to statically compile the sudoers plugin into + the sudo binary without disabling shared library support. The + sudo.conf file may still be used to configure other plugins. + + * Sudo can now be compiled again with a C preprocessor that does + not support variadic macros. + + * Visudo can now export a sudoers file in JSON format using the + new -x flag. + + * The locale is now set correctly again for visudo and sudoreplay. + + * The plugin API has been extended to allow the plugin to exclude + specific file descriptors from the "closefrom" range. + + * There is now a workaround for a Solaris-specific problem where + NOEXEC was overriding traditional root DAC behavior. + + * Add user netgroup filtering for SSSD. Previously, rules for + a netgroup were applied to all even when they did not belong + to the specified netgroup. + + * On systems with BSD login classes, if the user specified a group + (not a user) to run the command as, it was possible to specify + a different login class even when the command was not run as the + super user. + + * The closefrom() emulation on Mac OS X now uses /dev/fd if possible. + + * Fixed a bug where sudoedit would not update the original file + from the temporary when PAM or I/O logging is not enabled. + + * When recycling I/O logs, the log files are now truncated properly. + + * Fixes bugs #617, #621, #622, #623, #624, #625, #626 + +What's new in Sudo 1.8.8? + + * Removed a warning on PAM systems with stacked auth modules + where the first module on the stack does not succeed. + + * Sudo, sudoreplay and visudo now support GNU-style long options. + + * The -h (--host) option may now be used to specify a host name. + This is currently only used by the sudoers plugin in conjunction + with the -l (--list) option. + + * Program usage messages and manual SYNOPSIS sections have been + simplified. + + * Sudo's LDAP SASL support now works properly with Kerberos. + Previously, the SASL library was unable to locate the user's + credential cache. + + * It is now possible to set the nproc resource limit to unlimited + via pam_limits on Linux (bug #565). + + * New "pam_service" and "pam_login_service" sudoers options + that can be used to specify the PAM service name to use. + + * New "pam_session" and "pam_setcred" sudoers options that + can be used to disable PAM session and credential support. + + * The sudoers plugin now properly supports UIDs and GIDs + that are larger than 0x7fffffff on 32-bit platforms. + + * Fixed a visudo bug introduced in sudo 1.8.7 where per-group + Defaults entries would cause an internal error. + + * If the "tty_tickets" sudoers option is enabled (the default), + but there is no tty present, sudo will now use a ticket file + based on the parent process ID. This makes it possible to support + the normal timeout behavior for the session. + + * Fixed a problem running commands that change their process + group and then attempt to change the terminal settings when not + running the command in a pseudo-terminal. Previously, the process + would receive SIGTTOU since it was effectively a background + process. Sudo will now grant the child the controlling tty and + continue it when this happens. + + * The "closefrom_override" sudoers option may now be used in + a command-specified Defaults entry (bug #610). + + * Sudo's BSM audit support now works on Solaris 11. + + * Brazilian Portuguese translation for sudo and sudoers from + translationproject.org. + + * Czech translation for sudo from translationproject.org. + + * French translation for sudo from translationproject.org. + + * Sudo's noexec support on Mac OS X 10.4 and above now uses dynamic + symbol interposition instead of setting DYLD_FORCE_FLAT_NAMESPACE=1 + which causes issues with some programs. + + * Fixed visudo's -q (--quiet) flag, broken in sudo 1.8.6. + + * Root may no longer change its SELinux role without entering + a password. + + * Fixed a bug introduced in Sudo 1.8.7 where the indexes written + to the I/O log timing file are two greater than they should be. + Sudoreplay now contains a work-around to parse those files. + + * In sudoreplay's list mode, the "this" qualifier in "fromdate" + or "todate" expressions now behaves more sensibly. Previously, + it would often match a date that was "one more" than expected. + For example, "this week" now matches the current week instead + of the following week. + +What's new in Sudo 1.8.7? + + * The non-Unix group plugin is now supported when sudoers data + is stored in LDAP. + + * Sudo now uses a workaround for a locale bug on Solaris 11.0 + that prevents setuid programs like sudo from fully using locales. + + * User messages are now always displayed in the user's locale, + even when the same message is being logged or mailed in a + different locale. + + * Log files created by sudo now explicitly have the group set + to group ID 0 rather than relying on BSD group semantics (which + may not be the default). + + * A new "exec_background" sudoers option can be used to initially + run the command without read access to the terminal when running + a command in a pseudo-tty. If the command tries to read from + the terminal it will be stopped by the kernel (via SIGTTIN or + SIGTTOU) and sudo will immediately restart it as the foreground + process (if possible). This allows sudo to only pass terminal + input to the program if the program actually is expecting it. + Unfortunately, a few poorly-behaved programs (like "su" on most + Linux systems) do not handle SIGTTIN and SIGTTOU properly. + + * Sudo now uses an efficient group query to get all the groups + for a user instead of iterating over every record in the group + database on HP-UX and Solaris. + + * Sudo now produces better error messages when there is an error + in the sudo.conf file. + + * Two new settings have been added to sudo.conf to give the admin + better control of how group database queries are performed. The + "group_source" specifies how the group list for a user will be + determined. Legal values are "static" (use the kernel groups + list), "dynamic" (perform a group database query) and "adaptive" + (only perform a group database query if the kernel list is full). + The "max_groups" setting specifies the maximum number of groups + a user may belong to when performing a group database query. + + * The sudo.conf file now supports line continuation by using a + backslash as the last character on the line. + + * There is now a standalone sudo.conf manual page. + + * Sudo now stores its libexec files in a "sudo" sub-directory instead + of in libexec itself. For backwards compatibility, if the plugin + is not found in the default plugin directory, sudo will check + the parent directory if the default directory ends in "/sudo". + + * The sudoers I/O logging plugin now logs the terminal size. + + * A new sudoers option "maxseq" can be used to limit the number of + I/O log entries that are stored. + + * The "system_group" and "group_file" sudoers group provider plugins + are now installed by default. + + * The list output (sudo -l) output from the sudoers plugin is now + less ambiguous when an entry includes different runas users. + The long list output (sudo -ll) for file-based sudoers is now + more consistent with the format of LDAP-based sudoers. + + * A UID may now be used in the sudoRunAsUser attributes for LDAP + sudoers. + + * Minor plugin API change: the close and version functions are now + optional. If the policy plugin does not provide a close function + and the command is not being run in a new pseudo-tty, sudo may + now execute the command directly instead of in a child process. + + * A new sudoers option "pam_session" can be used to disable sudo's + PAM session support. + + * On HP-UX systems, sudo will now use the pstat() function to + determine the tty instead of ttyname(). + + * Turkish translation for sudo and sudoers from translationproject.org. + + * Dutch translation for sudo and sudoers from translationproject.org. + + * Tivoli Directory Server client libraries may now be used with + HP-UX where libibmldap has a hidden dependency on libCsup. + + * The sudoers plugin will now ignore invalid domain names when + checking netgroup membership. Most Linux systems use the string + "(none)" for the NIS-style domain name instead of an empty string. + + * New support for specifying a SHA-2 digest along with the command + in sudoers. Supported hash types are sha224, sha256, sha384 and + sha512. See the description of Digest_Spec in the sudoers manual + or the description of sudoCommand in the sudoers.ldap manual for + details. + + * The paths to ldap.conf and ldap.secret may now be specified as + arguments to the sudoers plugin in the sudo.conf file. + + * Fixed potential false positives in visudo's alias cycle detection. + + * Fixed a problem where the time stamp file was being treated + as out of date on Linux systems where the change time on the + pseudo-tty device node can change after it is allocated. + + * Sudo now only builds Position Independent Executables (PIE) + by default on Linux systems and verifies that a trivial test + program builds and runs. + + * On Solaris 11.1 and higher, sudo binaries will now have the + ASLR tag enabled if supported by the linker. + +What's new in Sudo 1.8.6p8? + + * Terminal detection now works properly on 64-bit AIX kernels. + This was broken by the removal of the ttyname() fallback in Sudo + 1.8.6p6. Sudo is now able to map an AIX 64-bit device number + to the corresponding device file in /dev. + + * Sudo now checks for crypt() returning NULL when performing + passwd-based authentication. + +What's new in Sudo 1.8.6p7? + + * A time stamp file with the date set to the epoch by "sudo -k" + is now completely ignored regardless of what the local clock is + set to. Previously, if the local clock was set to a value between + the epoch and the time stamp timeout value, a time stamp reset + by "sudo -k" would be considered current. + + * The tty-specific time stamp file now includes the session ID + of the sudo process that created it. If a process with the same + tty but a different session ID runs sudo, the user will now be + prompted for a password (assuming authentication is required for + the command). + +What's new in Sudo 1.8.6p6? + + * On systems where the controlling tty can be determined via /proc + or sysctl(), sudo will no longer fall back to using ttyname() + if the process has no controlling tty. This prevents sudo from + using a non-controlling tty for logging and time stamp purposes. + +What's new in Sudo 1.8.6p5? + + * Fixed a potential crash in visudo's alias cycle detection. + + * Improved performance on Solaris when retrieving the group list + for the target user. On systems with a large number of groups + where the group database is not local (NIS, LDAP, AD), fetching + the group list could take a minute or more. + +What's new in Sudo 1.8.6p4? + + * The -fstack-protector is now used when linking visudo, sudoreplay + and testsudoers. + + * Avoid building PIE binaries on FreeBSD/ia64 as they don't run + properly. + + * Fixed a crash in visudo strict mode when an unknown Defaults + setting is encountered. + + * Do not inform the user that the command was not permitted by the + policy if they do not successfully authenticate. This is a + regression introduced in sudo 1.8.6. + + * Allow sudo to be build with sss support without also including + ldap support. + + * Fixed running commands that need the terminal in the background + when I/O logging is enabled. E.g. "sudo vi &". When the command + is foregrounded, it will now resume properly. + +What's new in Sudo 1.8.6p3? + + * Fixed post-processing of the man pages on systems with legacy + versions of sed. + + * Fixed "sudoreplay -l" on Linux systems with file systems that + set DT_UNKNOWN in the d_type field of struct dirent. + +What's new in Sudo 1.8.6p2? + + * Fixed suspending a command after it has already been resumed + once when I/O logging (or use_pty) is not enabled. + This was a regression introduced in version 1.8.6. + +What's new in Sudo 1.8.6p1? + + * Fixed the setting of LOGNAME, USER and USERNAME variables in the + command's environment when env_reset is enabled (the default). + This was a regression introduced in version 1.8.6. + + * Sudo now honors SUCCESS=return in /etc/nsswitch.conf. + +What's new in Sudo 1.8.6? + + * Sudo is now built with the -fstack-protector flag if the the + compiler supports it. Also, the -zrelro linker flag is used if + supported. The --disable-hardening configure option can be used + to build sudo without stack smashing protection. + + * Sudo is now built as a Position Independent Executable (PIE) + if supported by the compiler and linker. + + * If the user is a member of the "exempt" group in sudoers, they + will no longer be prompted for a password even if the -k flag + is specified with the command. This makes "sudo -k command" + consistent with the behavior one would get if the user ran "sudo + -k" immediately before running the command. + + * The sudoers file may now be a symbolic link. Previously, sudo + would refuse to read sudoers unless it was a regular file. + + * The sudoreplay command can now properly replay sessions where + no tty was present. + + * The sudoers plugin now takes advantage of symbol visibility + controls when supported by the compiler or linker. As a result, + only a small number of symbols are exported which significantly + reduces the chances of a conflict with other shared objects. + + * Improved support for the Tivoli Directory Server LDAP client + libraries. This includes support for using LDAP over SSL (ldaps) + as well as support for the BIND_TIMELIMIT, TLS_KEY and TLS_CIPHERS + ldap.conf options. A new ldap.conf option, TLS_KEYPW can be + used to specify a password to decrypt the key database. + + * When constructing a time filter for use with LDAP sudoNotBefore + and sudoNotAfter attributes, the current time now includes tenths + of a second. This fixes a problem with timed entries on Active + Directory. + + * If a user fails to authenticate and the command would be rejected + by sudoers, it is now logged with "command not allowed" instead + of "N incorrect password attempts". Likewise, the "mail_no_perms" + sudoers option now takes precedence over "mail_badpass". + + * The sudo manuals are now formatted using the mdoc macros. Versions + using the legacy man macros are provided for systems that lack mdoc. + + * New support for Solaris privilege sets. This makes it possible + to specify fine-grained privileges in the sudoers file on Solaris + 10 and above. A Runas_Spec that contains no Runas_Lists can be + used to give a user the ability to run a command as themselves + but with an expanded privilege set. + + * Fixed a problem with the reboot and shutdown commands on some + systems (such as HP-UX and BSD). On these systems, reboot sends + all processes (except itself) SIGTERM. When sudo received + SIGTERM, it would relay it to the reboot process, thus killing + reboot before it had a chance to actually reboot the system. + + * Support for using the System Security Services Daemon (SSSD) as + a source of sudoers data. + + * Slovenian translation for sudo and sudoers from translationproject.org. + + * Visudo will now warn about unknown Defaults entries that are + per-host, per-user, per-runas or per-command. + + * Fixed a race condition that could cause sudo to receive SIGTTOU + (and stop) when resuming a shell that was run via sudo when I/O + logging (and use_pty) is not enabled. + + * Sending SIGTSTP directly to the sudo process will now suspend the + running command when I/O logging (and use_pty) is not enabled. + +What's new in Sudo 1.8.5p3? + + * Fixed the loading of I/O plugins that conform to a plugin API + version older than 1.2. + +What's new in Sudo 1.8.5p2? + + * Fixed use of the SUDO_ASKPASS environment variable which was + broken in Sudo 1.8.5. + + * Fixed a problem reading the sudoers file when the file mode is + more restrictive than the expected mode. For example, when the + expected sudoers file mode is 0440 but the actual mode is 0400. + +What's new in Sudo 1.8.5p1? + + * Fixed a bug that prevented files in an include directory from + being evaluated. + +What's new in Sudo 1.8.5? + + * When "noexec" is enabled, sudo_noexec.so will now be prepended + to any existing LD_PRELOAD variable instead of replacing it. + + * The sudo_noexec.so shared library now wraps the execvpe(), + exect(), posix_spawn() and posix_spawnp() functions. + + * The user/group/mode checks on sudoers files have been relaxed. + As long as the file is owned by the sudoers UID, not world-writable + and not writable by a group other than the sudoers GID, the file + is considered OK. Note that visudo will still set the mode to + the value specified at configure time. + + * It is now possible to specify the sudoers path, UID, GID and + file mode as options to the plugin in the sudo.conf file. + + * Croatian, Galician, German, Lithuanian, Swedish and Vietnamese + translations from translationproject.org. + + * /etc/environment is no longer read directly on Linux systems + when PAM is used. Sudo now merges the PAM environment into the + user's environment which is typically set by the pam_env module. + + * The initial evironment created when env_reset is in effect now + includes the contents of /etc/environment on AIX systems and the + "setenv" and "path" entries from /etc/login.conf on BSD systems. + + * The plugin API has been extended in three ways. First, options + specified in sudo.conf after the plugin pathname are passed to + the plugin's open function. Second, sudo has limited support + for hooks that can be used by plugins. Currently, the hooks are + limited to environment handling functions. Third, the init_session + policy plugin function is passed a pointer to the user environment + which can be updated during session setup. The plugin API version + has been incremented to version 1.2. See the sudo_plugin manual + for more information. + + * The policy plugin's init_session function is now called by the + parent sudo process, not the child process that executes the + command. This allows the PAM session to be open and closed in + the same process, which some PAM modules require. + + * Fixed parsing of "Path askpass" and "Path noexec" in sudo.conf, + which was broken in version 1.8.4. + + * On systems with an SVR4-style /proc file system, the /proc/pid/psinfo + file is now uses to determine the controlling terminal, if possible. + This allows tty-based tickets to work properly even when, e.g. + standard input, output and error are redirected to /dev/null. + + * The output of "sudoreplay -l" is now sorted by file name (or + sequence number). Previously, entries were displayed in the + order in which they were found on the file system. + + * Sudo now behaves properly when I/O logging is enabled and the + controlling terminal is revoked (e.g. the running sshd is killed). + Previously, sudo may have exited without calling the I/O plugin's + close function which can lead to an incomplete I/O log. + + * Sudo can now detect when a user has logged out and back in again + on Solaris 11, just like it can on Solaris 10. + + * The built-in zlib included with Sudo has been upgraded to version + 1.2.6. + + * Setting the SSL parameter to start_tls in ldap.conf now works + properly when using Mozilla-based SDKs that support the + ldap_start_tls_s() function. + + * The TLS_CHECKPEER parameter in ldap.conf now works when the + Mozilla NSS crypto back-end is used with OpenLDAP. + + * A new group provider plugin, system_group, is included which + performs group look ups by name using the system groups database. + This can be used to restore the pre-1.7.3 sudo group lookup + behavior. + +What's new in Sudo 1.8.4p5? + + * Fixed a bug when matching against an IP address with an associated + netmask in the sudoers file. In certain circumstances, this + could allow users to run commands on hosts they are not authorized + for. + +What's new in Sudo 1.8.4p4? + + * Fixed a bug introduced in Sudo 1.8.4 which prevented "sudo -v" + from working. + +What's new in Sudo 1.8.4p3? + + * Fixed a crash on FreeBSD when no tty is present. + + * Fixed a bug introduced in Sudo 1.8.4 that allowed users to + specify environment variables to set on the command line without + having sudo "ALL" permissions or the "SETENV" tag. + + * When visudo is run with the -c (check) option, the sudoers + file(s) owner and mode are now also checked unless the -f option + was specified. + +What's new in Sudo 1.8.4p2? + + * Fixed a bug introduced in Sudo 1.8.4 where insufficient space + was allocated for group IDs in the LDAP filter. + + * Fixed a bug introduced in Sudo 1.8.4 where the path to sudo.conf + was "/sudo.conf" instead of "/etc/sudo.conf". + + * Fixed a bug introduced in Sudo 1.8.4 which could cause a hang + when I/O logging is enabled and input is from a pipe or file. + +What's new in Sudo 1.8.4p1? + + * Fixed a bug introduced in sudo 1.8.4 that broke adding to or + deleting from the env_keep, env_check and env_delete lists in + sudoers on some platforms. + +What's new in Sudo 1.8.4? + + * The -D flag in sudo has been replaced with a more general debugging + framework that is configured in sudo.conf. + + * Fixed a false positive in visudo strict mode when aliases are + in use. + + * Fixed a crash with "sudo -i" when a runas group was specified + without a runas user. + + * The line on which a syntax error is reported in the sudoers file + is now more accurate. Previously it was often off by a line. + + * Fixed a bug where stack garbage could be printed at the end of + the lecture when the "lecture_file" option was enabled. + + * "make install" now honors the LINGUAS environment variable. + + * The #include and #includedir directives in sudoers now support + relative paths. If the path is not fully qualified it is expected + to be located in the same directory of the sudoers file that is + including it. + + * Serbian and Spanish translations for sudo from translationproject.org. + + * LDAP-based sudoers may now access by group ID in addition to + group name. + + * visudo will now fix the mode on the sudoers file even if no changes + are made unless the -f option is specified. + + * The "use_loginclass" sudoers option works properly again. + + * On systems that use login.conf, "sudo -i" now sets environment + variables based on login.conf. + + * For LDAP-based sudoers, values in the search expression are now + escaped as per RFC 4515. + + * The plugin close function is now properly called when a login + session is killed (as opposed to the actual command being killed). + This can happen when an ssh session is disconnected or the + terminal window is closed. + + * The deprecated "noexec_file" sudoers option is no longer supported. + + * Fixed a race condition when I/O logging is not enabled that could + result in tty-generated signals (e.g. control-C) being received + by the command twice. + + * If none of the standard input, output or error are connected to + a tty device, sudo will now check its parent's standard input, + output or error for the tty name on systems with /proc and BSD + systems that support the KERN_PROC_PID sysctl. This allows + tty-based tickets to work properly even when, e.g. standard + input, output and error are redirected to /dev/null. + + * Added the --enable-kerb5-instance configure option to allow + people using Kerberos V authentication to specify a custom + instance so the principal name can be, e.g. "username/sudo" + similar to how ksu uses "username/root". + + * Fixed a bug where a pattern like "/usr/*" included /usr/bin/ in + the results, which would be incorrectly be interpreted as if the + sudoers file had specified a directory. + + * "visudo -c" will now list any include files that were checked + in addition to the main sudoers file when everything parses OK. + + * Users that only have read-only access to the sudoers file may + now run "visudo -c". Previously, write permissions were required + even though no writing is down in check-only mode. + + * It is now possible to prevent the disabling of core dumps from + within sudo itself by adding a line to the sudo.conf file like + "Set disable_coredump false". + +What's new in Sudo 1.8.3p2? + + * Fixed a format string vulnerability when the sudo binary (or a + symbolic link to the sudo binary) contains printf format escapes + and the -D (debugging) flag is used. + +What's new in Sudo 1.8.3p1? + + * Fixed a crash in the monitor process on Solaris when NOPASSWD + was specified or when authentication was disabled. + + * Fixed matching of a Runas_Alias in the group section of a + Runas_Spec. + +What's new in Sudo 1.8.3? + + * Fixed expansion of strftime() escape sequences in the "log_dir" + sudoers setting. + + * Esperanto, Italian and Japanese translations from translationproject.org. + + * Sudo will now use PAM by default on AIX 6 and higher. + + * Added --enable-werror configure option for gcc's -Werror flag. + + * Visudo no longer assumes all editors support the +linenumber + command line argument. It now uses a whitelist of editors known + to support the option. + + * Fixed matching of network addresses when a netmask is specified + but the address is not the first one in the CIDR block. + + * The configure script now check whether or not errno.h declares + the errno variable. Previously, sudo would always declare errno + itself for older systems that don't declare it in errno.h. + + * The NOPASSWD tag is now honored for denied commands too, which + matches historic sudo behavior (prior to sudo 1.7.0). + + * Sudo now honors the "DEREF" setting in ldap.conf which controls + how alias dereferencing is done during an LDAP search. + + * A symbol conflict with the pam_ssh_agent_auth PAM module that + would cause a crash been resolved. + + * The inability to load a group provider plugin is no longer + a fatal error. + + * A potential crash in the utmp handling code has been fixed. + + * Two PAM session issues have been resolved. In previous versions + of sudo, the PAM session was opened as one user and closed as + another. Additionally, if no authentication was performed, the + PAM session would never be closed. + + * Sudo will now work correctly with LDAP-based sudoers using TLS + or SSL on Debian systems. + + * The LOGNAME, USER and USERNAME environment variables are preserved + correctly again in sudoedit mode. + +What's new in Sudo 1.8.2? + + * Sudo, visudo, sudoreplay and the sudoers plug-in now have natural + language support (NLS). This can be disabled by passing configure + the --disable-nls option. Sudo will use gettext(), if available, + to display translated messages. All translations are coordinated + via The Translation Project, http://translationproject.org/. + + * Plug-ins are now loaded with the RTLD_GLOBAL flag instead of + RTLD_LOCAL. This fixes missing symbol problems in PAM modules + on certain platforms, such as FreeBSD and SuSE Linux Enterprise. + + * I/O logging is now supported for commands run in background mode + (using sudo's -b flag). + + * Group ownership of the sudoers file is now only enforced when + the file mode on sudoers allows group readability or writability. + + * Visudo now checks the contents of an alias and warns about cycles + when the alias is expanded. + + * If the user specifies a group via sudo's -g option that matches + the target user's group in the password database, it is now + allowed even if no groups are present in the Runas_Spec. + + * The sudo Makefiles now have more complete dependencies which are + automatically generated instead of being maintained manually. + + * The "use_pty" sudoers option is now correctly passed back to the + sudo front end. This was missing in previous versions of sudo + 1.8 which prevented "use_pty" from being honored. + + * "sudo -i command" now works correctly with the bash version + 2.0 and higher. Previously, the .bash_profile would not be + sourced prior to running the command unless bash was built with + NON_INTERACTIVE_LOGIN_SHELLS defined. + + * When matching groups in the sudoers file, sudo will now match + based on the name of the group instead of the group ID. This can + substantially reduce the number of group lookups for sudoers + files that contain a large number of groups. + + * Multi-factor authentication is now supported on AIX. + + * Added support for non-RFC 4517 compliant LDAP servers that require + that seconds be present in a timestamp, such as Tivoli Directory Server. + + * If the group vector is to be preserved, the PATH search for the + command is now done with the user's original group vector. + + * For LDAP-based sudoers, the "runas_default" sudoOption now works + properly in a sudoRole that contains a sudoCommand. + + * Spaces in command line arguments for "sudo -s" and "sudo -i" are + now escaped with a backslash when checking the security policy. + +What's new in Sudo 1.8.1p2? + + * Two-character CIDR-style IPv4 netmasks are now matched correctly + in the sudoers file. + + * A build error with MIT Kerberos V has been resolved. + + * A crash on HP-UX in the sudoers plugin when wildcards are + present in the sudoers file has been resolved. + + * Sudo now works correctly on Tru64 Unix again. + +What's new in Sudo 1.8.1p1? + + * Fixed a problem on AIX where sudo was unable to set the final + UID if the PAM module modified the effective UID. + + * A non-existent includedir is now treated the same as an empty + directory and not reported as an error. + + * Removed extraneous parens in LDAP filter when sudoers_search_filter + is enabled that can cause an LDAP search error. + + * Fixed a "make -j" problem for "make install". + +What's new in Sudo 1.8.1? + + * A new LDAP setting, sudoers_search_filter, has been added to + ldap.conf. This setting can be used to restrict the set of + records returned by the LDAP query. Based on changes from Matthew + Thomas. + + * White space is now permitted within a User_List when used in + conjunction with a per-user Defaults definition. + + * A group ID (%#GID) may now be specified in a User_List or Runas_List. + Likewise, for non-Unix groups the syntax is %:#GID. + + * Support for double-quoted words in the sudoers file has been fixed. + The change in 1.7.5 for escaping the double quote character + caused the double quoting to only be available at the beginning + of an entry. + + * The fix for resuming a suspended shell in 1.7.5 caused problems + with resuming non-shells on Linux. Sudo will now save the process + group ID of the program it is running on suspend and restore it + when resuming, which fixes both problems. + + * A bug that could result in corrupted output in "sudo -l" has been + fixed. + + * Sudo will now create an entry in the utmp (or utmpx) file when + allocating a pseudo-tty (e.g. when logging I/O). The "set_utmp" + and "utmp_runas" sudoers file options can be used to control this. + Other policy plugins may use the "set_utmp" and "utmp_user" + entries in the command_info list. + + * The sudoers policy now stores the TSID field in the logs + even when the "iolog_file" sudoers option is defined to a value + other than %{sessid}. Previously, the TSID field was only + included in the log file when the "iolog_file" option was set + to its default value. + + * The sudoreplay utility now supports arbitrary session IDs. + Previously, it would only work with the base-36 session IDs + that the sudoers plugin uses by default. + + * Sudo now passes "run_shell=true" to the policy plugin in the + settings list when sudo's -s command line option is specified. + The sudoers policy plugin uses this to implement the "set_home" + sudoers option which was missing from sudo 1.8.0. + + * The "noexec" functionality has been moved out of the sudoers + policy plugin and into the sudo front-end, which matches the + behavior documented in the plugin writer's guide. As a result, + the path to the noexec file is now specified in the sudo.conf + file instead of the sudoers file. + + * On Solaris 10, the PRIV_PROC_EXEC privilege is now used to + implement the "noexec" feature. Previously, this was implemented + via the LD_PRELOAD environment variable. + + * The exit values for "sudo -l", "sudo -v" and "sudo -l command" + have been fixed in the sudoers policy plugin. + + * The sudoers policy plugin now passes the login class, if any, + back to the sudo front-end. + + * The sudoers policy plugin was not being linked with requisite + libraries in certain configurations. + + * Sudo now parses command line arguments before loading any plugins. + This allows "sudo -V" or "sudo -h" to work even if there is a problem + with sudo.conf + + * Plugins are now linked with the static version of libgcc to allow + the plugin to run on a system where no shared libgcc is installed, + or where it is installed in a different location. + +What's new in Sudo 1.8.0? + + * Sudo has been refactored to use a modular framework that can + support third-party policy and I/O logging plugins. The default + plugin is "sudoers" which provides the traditional sudo functionality. + See the sudo_plugin manual for details on the plugin API and the + sample in the plugins directory for a simple example. + +What's new in Sudo 1.7.5? + + * When using visudo in check mode, a file named "-" may be used to + check sudoers data on the standard input. + + * Sudo now only fetches shadow password entries when using the + password database directly for authentication. + + * Password and group entries are now cached using the same key + that was used to look them up. This fixes a problem when looking + up entries by name if the name in the retrieved entry does not + match the name used to look it up. This may happen on some systems + that do case insensitive lookups or that truncate long names. + + * GCC will no longer display warnings on glibc systems that use + the warn_unused_result attribute for write(2) and other system calls. + + * If a PAM account management module denies access, sudo now prints + a more useful error message and stops trying to validate the user. + + * Fixed a potential hang on idle systems when the sudo-run process + exits immediately. + + * Sudo now includes a copy of zlib that will be used on systems + that do not have zlib installed. + + * The --with-umask-override configure flag has been added to enable + the "umask_override" sudoers Defaults option at build time. + + * Sudo now unblocks all signals on startup to avoid problems caused + by the parent process changing the default signal mask. + + * LDAP Sudoers entries may now specify a time period for which + the entry is valid. This requires an updated sudoers schema + that includes the sudoNotBefore and sudoNotAfter attributes. + Support for timed entries must be explicitly enabled in the + ldap.conf file. Based on changes from Andreas Mueller. + + * LDAP Sudoers entries may now specify a sudoOrder attribute that + determines the order in which matching entries are applied. The + last matching entry is used, just like file-based sudoers. This + requires an updated sudoers schema that includes the sudoOrder + attribute. Based on changes from Andreas Mueller. + + * When run as sudoedit, or when given the -e flag, sudo now treats + command line arguments as pathnames. This means that slashes + in the sudoers file entry must explicitly match slashes in + the command line arguments. As a result, and entry such as: + user ALL = sudoedit /etc/* + will allow editing of /etc/motd but not /etc/security/default. + + * NETWORK_TIMEOUT is now an alias for BIND_TIMELIMIT in ldap.conf for + compatibility with OpenLDAP configuration files. + + * The LDAP API TIMEOUT parameter is now honored in ldap.conf. + + * The I/O log directory may now be specified in the sudoers file. + + * Sudo will no longer refuse to run if the sudoers file is writable + by root. + + * Sudo now performs command line escaping for "sudo -s" and "sudo -i" + after validating the command so the sudoers entries do not need + to include the backslashes. + + * Logging and email sending are now done in the locale specified + by the "sudoers_locale" setting ("C" by default). Email send by + sudo now includes MIME headers when "sudoers_locale" is not "C". + + * The configure script has a new option, --disable-env-reset, to + allow one to change the default for the sudoers Default setting + "env_reset" at compile time. + + * When logging "sudo -l command", sudo will now prepend "list " + to the command in the log line to distinguish between an + actual command invocation in the logs. + + * Double-quoted group and user names may now include escaped double + quotes as part of the name. Previously this was a parse error. + + * Sudo once again restores the state of the signal handlers it + modifies before executing the command. This allows sudo to be + used with the nohup command. + + * Resuming a suspended shell now works properly when I/O logging + is not enabled (the I/O logging case was already correct). + +What's new in Sudo 1.7.4p6? + + * A bug has been fixed in the I/O logging support that could cause + visual artifacts in full-screen programs such as text editors. + +What's new in Sudo 1.7.4p5? + + * A bug has been fixed that would allow a command to be run without the + user entering a password when sudo's -g flag is used without the -u flag. + + * If user has no supplementary groups, sudo will now fall back on checking + the group file explicitly, which restores historic sudo behavior. + + * A crash has been fixed when sudo's -g flag is used without the -u flag + and the sudoers file contains an entry with no runas user or group listed. + + * A crash has been fixed when the Solaris project support is enabled + and sudo's -g flag is used without the -u flag. + + * Sudo no longer exits with an error when support for auditing is + compiled in but auditing is not enabled. + + * Fixed a bug introduced in sudo 1.7.3 where the ticket file was not + being honored when the "targetpw" sudoers Defaults option was enabled. + + * The LOG_INPUT and LOG_OUTPUT tags in sudoers are now parsed correctly. + + * A crash has been fixed in "sudo -l" when sudo is built with auditing + support and the user is not allowed to run any commands on the host. + +What's new in Sudo 1.7.4p4? + + * A potential security issue has been fixed with respect to the handling + of sudo's -g command line option when -u is also specified. The flaw + may allow an attacker to run commands as a user that is not authorized + by the sudoers file. + + * A bug has been fixed where "sudo -l" output was incomplete if multiple + sudoers sources were defined in nsswitch.conf and there was an error + querying one of the sources. + + * The log_input, log_output, and use_pty sudoers options now work correctly + on AIX. Previously, sudo would hang if they were enabled. + + * The "make install" target now works correctly when sudo is built in a + directory other than the source directory. + + * The "runas_default" sudoers setting now works properly in a per-command + Defaults line. + + * Suspending and resuming the bash shell when PAM is in use now works + correctly. The SIGCONT signal was not propagated to the child process. + +What's new in Sudo 1.7.4p3? + + * A bug has been fixed where duplicate HOME environment variables could be + present when the env_reset setting was disabled and the always_set_home + setting was enabled in sudoers. + + * The value of sysconfdir is now substituted into the path to the sudoers.d + directory in the installed sudoers file. + + * Compilation problems on IRIX and other platforms have been fixed. + + * If multiple PAM "auth" actions are specified and the user enters ^C at + the password prompt, sudo will no longer prompt for a password for any + subsequent "auth" actions. Previously it was necessary to enter ^C for + each "auth" action. + +What's new in Sudo 1.7.4p2? + + * A bug where sudo could spin in a busy loop waiting for the child process + has been fixed. + +What's new in Sudo 1.7.4p1? + + * A bug introduced in sudo 1.7.3 that prevented the -k and -K options from + functioning when the tty_tickets sudoers option is enabled has been fixed. + + * Sudo no longer prints a warning when the -k or -K options are specified + and the ticket file does not exist. + + * It is now easier to cross-compile sudo. + +What's new in Sudo 1.7.4? + + * Sudoedit will now preserve the file extension in the name of the + temporary file being edited. The extension is used by some + editors (such as emacs) to choose the editing mode. + + * Time stamp files have moved from /var/run/sudo to either /var/db/sudo, + /var/lib/sudo or /var/adm/sudo. The directories are checked for + existence in that order. This prevents users from receiving the + sudo lecture every time the system reboots. Time stamp files older + than the boot time are ignored on systems where it is possible to + determine this. + + * The tty_tickets sudoers option is now enabled by default. + + * Ancillary documentation (README files, LICENSE, etc) is now installed + in a sudo documentation directory. + + * Sudo now recognizes "tls_cacert" as an alias for "tls_cacertfile" + in ldap.conf. + + * Defaults settings that are tied to a user, host or command may + now include the negation operator. For example: + Defaults:!millert lecture + will match any user but millert. + + * The default PATH environment variable, used when no PATH variable + exists, now includes /usr/sbin and /sbin. + + * Sudo now uses polypkg (http://rc.quest.com/topics/polypkg/) + for cross-platform packing. + + * On Linux, sudo will now restore the nproc resource limit before + executing a command, unless the limit appears to have been modified + by pam_limits. This avoids a problem with bash scripts that open + more than 32 descriptors on SuSE Linux, where sysconf(_SC_CHILD_MAX) + will return -1 when RLIMIT_NPROC is set to RLIMIT_UNLIMITED (-1). + + * The HOME and MAIL environment variables are now reset based on the + target user's password database entry when the env_reset sudoers option + is enabled (which is the case in the default configuration). Users + wishing to preserve the original values should use a sudoers entry like: + Defaults env_keep += HOME + to preserve the old value of HOME and + Defaults env_keep += MAIL + to preserve the old value of MAIL. + + * Fixed a problem in the restoration of the AIX authdb registry setting. + + * Sudo will now fork(2) and wait until the command has completed before + calling pam_close_session(). + + * The default syslog facility is now "authpriv" if the operating system + supports it, else "auth". + +What's new in Sudo 1.7.3? + + * Support for logging I/O for the command being run. + For more information, see the documentation for the "log_input" + and "log_output" Defaults options in the sudoers manual. Also + see the sudoreplay manual for how to replay I/O log sessions. + + * The use_pty sudoers option can be used to force a command to be + run in a pseudo-pty, even when I/O logging is not enabled. + + * On some systems, sudo can now detect when a user has logged out + and back in again when tty-based time stamps are in use. Supported + systems include Solaris systems with the devices file system, + Mac OS X, and Linux systems with the devpts filesystem (pseudo-ttys + only). + + * On AIX systems, the registry setting in /etc/security/user is + now taken into account when looking up users and groups. Sudo + now applies the correct the user and group ids when running a + command as a user whose account details come from a different + source (e.g. LDAP or DCE vs. local files). + + * Support for multiple 'sudoers_base' and 'uri' entries in ldap.conf. + When multiple entries are listed, sudo will try each one in the + order in which they are specified. + + * Sudo's SELinux support should now function correctly when running + commands as a non-root user and when one of stdin, stdout or stderr + is not a terminal. + + * Sudo will now use the Linux audit system with configure with + the --with-linux-audit flag. + + * Sudo now uses mbr_check_membership() on systems that support it + to determine group membership. Currently, only Darwin (Mac OS X) + supports this. + + * When the tty_tickets sudoers option is enabled but there is no + terminal device, sudo will no longer use or create a tty-based + ticket file. Previously, sudo would use a tty name of "unknown". + As a consequence, if a user has no terminal device, sudo will + now always prompt for a password. + + * The passwd_timeout and timestamp_timeout options may now be + specified as floating point numbers for more granular timeout + values. + + * Negating the fqdn option in sudoers now works correctly when sudo + is configured with the --with-fqdn option. In previous versions + of sudo the fqdn was set before sudoers was parsed. + +What's new in Sudo 1.7.2? + + * A new #includedir directive is available in sudoers. This can be + used to implement an /etc/sudo.d directory. Files in an includedir + are not edited by visudo unless they contain a syntax error. + + * The -g option did not work properly when only setting the group + (and not the user). Also, in -l mode the wrong user was displayed + for sudoers entries where only the group was allowed to be set. + + * Fixed a problem with the alias checking in visudo which + could prevent visudo from exiting. + + * Sudo will now correctly parse the shell-style /etc/environment + file format used by pam_env on Linux. + + * When doing password and group database lookups, sudo will only + cache an entry by name or by id, depending on how the entry was + looked up. Previously, sudo would cache by both name and id + from a single lookup, but this breaks sites that have multiple + password or group database names that map to the same UID or + GID. + + * User and group names in sudoers may now be enclosed in double + quotes to avoid having to escape special characters. + + * BSM audit fixes when changing to a non-root UID. + + * Experimental non-Unix group support. Currently only works with + Quest Authorization Services and allows Active Directory groups + fixes for Minix-3. + + * For Netscape/Mozilla-derived LDAP SDKs the certificate and key + paths may be specified as a directory or a file. However, version + 5.0 of the SDK only appears to support using a directory (despite + documentation to the contrary). If SSL client initialization + fails and the certificate or key paths look like they could be + default file name, strip off the last path element and try again. + + * A setenv() compatibility fix for Linux systems, where a NULL + value is treated the same as an empty string and the variable + name is checked against the NULL pointer. + +What's new in Sudo 1.7.1? + + * A new Defaults option "pwfeedback" will cause sudo to provide visual + feedback when the user is entering a password. + + * A new Defaults option "fast_glob" will cause sudo to use the fnmatch() + function for file name globbing instead of glob(). When this option + is enabled, sudo will not check the file system when expanding wildcards. + This is faster but a side effect is that relative paths with wildcard + will no longer work. + + * New BSM audit support for systems that support it such as FreeBSD + and Mac OS X. + + * The file name specified with the #include directive may now include + a %h escape which is expanded to the short form of hostname. + + * The -k flag may now be specified along with a command, causing the + user's timestamp file to be ignored. + + * New support for Tivoli-based LDAP START_TLS, present in AIX. + + * New support for /etc/netsvc.conf on AIX. + + * The unused alias checks in visudo now handle the case of an alias + referring to another alias. + +What's new in Sudo 1.7.0? + + * Rewritten parser that converts sudoers into a set of data structures. + This eliminates a number of ordering issues and makes it possible to + apply sudoers Defaults entries before searching for the command. + It also adds support for per-command Defaults specifications. + + * Sudoers now supports a #include facility to allow the inclusion of other + sudoers-format files. + + * Sudo's -l (list) flag has been enhanced: + o applicable Defaults options are now listed + o a command argument can be specified for testing whether a user + may run a specific command. + o a new -U flag can be used in conjunction with "sudo -l" to allow + root (or a user with "sudo ALL") list another user's privileges. + + * A new -g flag has been added to allow the user to specify a + primary group to run the command as. The sudoers syntax has been + extended to include a group section in the Runas specification. + + * A UID may now be used anywhere a username is valid. + + * The "secure_path" run-time Defaults option has been restored. + + * Password and group data is now cached for fast lookups. + + * The file descriptor at which sudo starts closing all open files is now + configurable via sudoers and, optionally, the command line. + + * Visudo will now warn about aliases that are defined but not used. + + * The -i and -s command line flags now take an optional command + to be run via the shell. Previously, the argument was passed + to the shell as a script to run. + + * Improved LDAP support. SASL authentication may now be used in + conjunction when connecting to an LDAP server. The krb5_ccname + parameter in ldap.conf may be used to enable Kerberos. + + * Support for /etc/nsswitch.conf. LDAP users may now use nsswitch.conf + to specify the sudoers order. E.g.: + sudoers: ldap files + to check LDAP, then /etc/sudoers. The default is "files", even + when LDAP support is compiled in. This differs from sudo 1.6 + where LDAP was always consulted first. + + * Support for /etc/environment on AIX and Linux. If sudo is run + with the -i flag, the contents of /etc/environment are used to + populate the new environment that is passed to the command being + run. + + * If no terminal is available or if the new -A flag is specified, + sudo will use a helper program to read the password if one is + configured. Typically, this is a graphical password prompter + such as ssh-askpass. + + * A new Defaults option, "mailfrom" that sets the value of the + "From:" field in the warning/error mail. If unspecified, the + login name of the invoking user is used. + + * A new Defaults option, "env_file" that refers to a file containing + environment variables to be set in the command being run. + + * A new flag, -n, may be used to indicate that sudo should not + prompt the user for a password and, instead, exit with an error + if authentication is required. + + * If sudo needs to prompt for a password and it is unable to disable + echo (and no askpass program is defined), it will refuse to run + unless the "visiblepw" Defaults option has been specified. + + * Prior to version 1.7.0, hitting enter/return at the Password: prompt + would exit sudo. In sudo 1.7.0 and beyond, this is treated as + an empty password. To exit sudo, the user must press ^C or ^D + at the prompt. + + * visudo will now check the sudoers file owner and mode in -c (check) + mode when the -s (strict) flag is specified. + + * A new Defaults option "umask_override" will cause sudo to set the + umask specified in sudoers even if it is more permissive than the + invoking user's umask. diff --git a/utsudo-0.0.2/README b/utsudo-0.0.2/README new file mode 100644 index 0000000..8b5a006 --- /dev/null +++ b/utsudo-0.0.2/README @@ -0,0 +1,83 @@ +# This work was modified by UnionTech Software Technology Co., Ltd., +# and it is now licensed under the Mulan Permissive Software License,Version 2. + +The sudo philosophy +=================== +Sudo is a program designed to allow a sysadmin to give limited root privileges +to users and log root activity. The basic philosophy is to give as few +privileges as possible but still allow people to get their work done. + +Where to find sudo +================== +Before you try and build sudo, *please* make sure you have the current +version. The latest sudo may always be gotten via anonymous ftp from +ftp.sudo.ws in the directory /pub/sudo/ or from the sudo web site, +https://www.sudo.ws/ + +The distribution is sudo-M.m.tar.gz where `M' is the major version +number and `m' is the minor version number. BETA versions of sudo may +also be available. If you join the `sudo-workers' mailing list you +will get the BETA announcements (see the `Mailing lists' section below). + +What's new +========== +See the NEWS file for a list of major changes in this release. +For a complete list of changes, see the ChangeLog file. For a +summary of major changes to the current stable release, see the web +page, https://www.sudo.ws/stable.html. + +If you are upgrading from an earlier version of Sudo, please see +the UPGRADE file in the doc directory. + +For a history of sudo please see the HISTORY file in the doc directory. +You can find a list of contributors to sudo in the doc/CONTRIBUTORS file. + +Building the release +==================== +Please read the installation guide in the `INSTALL' file before trying to +build sudo. Pay special attention to the "OS dependent notes" section. + +Copyright +========= +Sudo is distributed under an ISC-style license. +Please refer to the `LICENSE' file included with the release for details. + +Mailing lists +============= +sudo-announce This list receives announcements whenever a new version + of sudo is released. + https://www.sudo.ws/mailman/listinfo/sudo-announce + +sudo-users This list is for questions and general discussion about sudo. + https://www.sudo.ws/mailman/listinfo/sudo-users + +sudo-workers This list is for people working on and porting sudo. + https://www.sudo.ws/mailman/listinfo/sudo-workers + +sudo-commits This list receives a message for each commit made to + the sudo source repository. + https://www.sudo.ws/mailman/listinfo/sudo-commits + +To subscribe to a list, visit its url (as listed above) and enter +your email address to subscribe. Digest versions are available but +these are fairly low traffic lists so the digest versions are not +a significant win. + +Mailing list archives are also available. See the mailing list web sites +for the appropriate links. + +Web page +======== +There is a sudo web page at https://www.sudo.ws/ that contains an +overview of sudo, documentation, downloads, a bug tracker, information +about beta versions and other useful info. + +Bug reports +=========== +If you have found what you believe to be a bug, you can file a bug +report in the sudo bug database, on the web at https://bugzilla.sudo.ws/. + +Please read over the `TROUBLESHOOTING' file in the doc directory *before* +submitting a bug report. When reporting bugs, please be sure to include +the version of sudo you are using as well as the platform you are running +it on. diff --git a/utsudo-0.0.2/README.LDAP b/utsudo-0.0.2/README.LDAP new file mode 100644 index 0000000..4680d43 --- /dev/null +++ b/utsudo-0.0.2/README.LDAP @@ -0,0 +1,205 @@ +This file explains how to build the optional LDAP functionality of SUDO to +store /etc/sudoers information. This feature is distinct from LDAP passwords. + +For general sudo LDAP configuration details, see the sudoers.ldap manual that +comes with the sudo distribution. A pre-formatted version of the manual may +be found in the sudoers.ldap.cat file. + +The sudo binary compiled with LDAP support should be totally backward +compatible and be syntactically and source code equivalent to its +non LDAP-enabled build. + +LDAP philosophy +=============== +As times change and servers become cheap, an enterprise can easily have 500+ +UNIX servers. Using LDAP to synchronize Users, Groups, Hosts, Mounts, and +others across an enterprise can greatly reduce the administrative overhead. + +In the past, sudo has used a single local configuration file, /etc/sudoers. +While the same sudoers file can be shared among machines, no built-in +mechanism exists to distribute it. Some have attempted to workaround this +by synchronizing changes via CVS/RSYNC/RDIST/RCP/SCP and even NFS. + +By using LDAP for sudoers we gain a centrally administered, globally +available configuration source for sudo. + +For information on OpenLDAP, please see http://www.openldap.org/. + +Definitions +=========== +Many times the word 'Directory' is used in the document to refer to the LDAP +server, structure and contents. + +Many times 'options' are used in this document to refer to sudoer 'defaults'. +They are one and the same. + +Build instructions +================== +The simplest way to build sudo with LDAP support is to include the +'--with-ldap' option. + + $ ./configure --with-ldap + +If your ldap libraries and headers are in a non-standard place, you will need +to specify them at configure time. E.g. + + $ ./configure --with-ldap=/usr/local/ldapsdk + +Sudo is developed using OpenLDAP but Netscape-based LDAP libraries +(such as those present in Solaris) are also known to work. + +Your mileage may vary. Please let the sudo workers mailing list + know if special configuration was required +to build an LDAP-enabled sudo so we can improve sudo. + +Schema Changes +============== +You must add the appropriate schema to your LDAP server before it +can store sudoers content. + +For OpenLDAP, there are two options, depending on how slapd is configured. + +The first option is to copy the file schema.OpenLDAP to the schema +directory (e.g. /etc/openldap/schema). You must then edit your +slapd.conf and add an include line the new schema, e.g. + + # Sudo LDAP schema + include /etc/openldap/schema/sudo.schema + +In order for sudoRole LDAP queries to be efficient, the server must index +the attribute 'sudoUser', e.g. + + # Indices to maintain + index sudoUser eq + +After making the changes to slapd.conf, restart slapd. + +The second option is only for OpenLDAP 2.3 and higher where slapd.conf +has been configured to use on-line configuration. If your slapd.conf +file includes the line: + + database config + +it should be possible to use the schema.olcSudo file. + +You can apply schema.olcSudo using the ldapadd utility or another +suitable LDAP browser. For example: + + # ldapadd -f schema.olcSudo -H ldap://ldapserver -W -x \ + -D cn=Manager,dc=example,dc=com + +There is no need to restart slapd when updating on-line configuration. + +For Netscape-derived LDAP servers such as SunONE, iPlanet or Fedora Directory, +copy the schema.iPlanet file to the schema directory with the name 99sudo.ldif. + +On Solaris, schemas are stored in /var/Sun/mps/slapd-`hostname`/config/schema/. +For Fedora Directory Server, they are stored in /etc/dirsrv/schema/. + +After copying the schema file to the appropriate directory, restart +the LDAP server. + +Finally, using an LDAP browser/editor, enable indexing by editing the +client profile to provide a Service Search Descriptor (SSD) for sudoers, +replacing example.com with your domain: + + serviceSearchDescriptor: sudoers: ou=sudoers,dc=example,dc=com + +If using an Active Directory server, copy schema.ActiveDirectory +to your Windows domain controller and run the following command: + + ldifde -i -f schema.ActiveDirectory -c dc=X dc=example,dc=com + +Importing /etc/sudoers into LDAP +================================ +Importing sudoers is a two-step process. + +Step 1: +Ask your LDAP Administrator where to create the ou=SUDOers container. + +For instance, if using OpenLDAP: + + dn: ou=SUDOers,dc=example,dc=com + objectClass: top + objectClass: organizationalUnit + ou: SUDOers + +(An example location is shown below). Then use the cvtsudoers utility to +convert your sudoers file into LDIF format. + + # SUDOERS_BASE=ou=SUDOers,dc=example,dc=com + # export SUDOERS_BASE + # cvtsudoers -f ldif -o /tmp/sudoers.ldif /etc/sudoers + +Step 2: +Import into your directory server. The following example is for +OpenLDAP. If you are using another directory, provide the LDIF +file to your LDAP Administrator. + + # ldapadd -f /tmp/sudoers.ldif -H ldap://ldapserver \ + -D cn=Manager,dc=example,dc=com -W -x + +Step 3: +Verify the sudoers LDAP data: + + # ldapsearch -b "$SUDOERS_BASE" -D cn=Manager,dc=example,dc=com -W -x + +Managing LDAP entries +===================== +Doing a one-time bulk load of your ldap entries is fine. However what if you +need to make minor changes on a daily basis? It doesn't make sense to delete +and re-add objects. (You can, but this is tedious). + +I recommend using any of the following LDAP browsers to administer your SUDOers. + * GQ - The gentleman's LDAP client - Open Source - I use this a lot on Linux + and since it is Schema aware, I don't need to create a sudoRole template. + http://sourceforge.net/projects/gqclient/ + + * phpQLAdmin - Open Source - phpQLAdmin is an administration tool, + originally for QmailLDAP, that supports editing sudoRole objects + in version 2.3.2 and higher. + http://phpqladmin.com/ + + * LDAP Browser/Editor - by Jarek Gawor - I use this a lot on Windows + and Solaris. It runs anywhere in a Java Virtual Machine including + web pages. You have to make a template from an existing sudoRole entry. + http://www.iit.edu/~gawojar/ldap + http://www.mcs.anl.gov/~gawor/ldap + http://ldapmanager.com + + * Apache Directory Studio - Open Source - an Eclipse-based LDAP + development platform. Includes an LDAP browser, and LDIF editor, + a schema editor and more. + http://directory.apache.org/studio + + There are dozens of others, some Open Source, some free, some not. + +Configure your /etc/ldap.conf and /etc/nsswitch.conf +==================================================== +The /etc/ldap.conf file is meant to be shared between sudo, pam_ldap, nss_ldap +and other ldap applications and modules. IBM Secureway unfortunately uses +the same file name but has a different syntax. If you need to change where +this file is stored, re-run configure with the --with-ldap-conf-file=PATH +option. + +See the "Configuring ldap.conf" section in the sudoers.ldap manual +for a list of supported ldap.conf parameters and an example ldap.conf + +Make sure you sudoers_base matches the location you specified when you +imported the sudoers ldif data. + +After configuring /etc/ldap.conf, you must add a line in /etc/nsswitch.conf +to tell sudo to look in LDAP for sudoers. See the "Configuring nsswitch.conf" +section in the sudoers.ldap manual for details. Note that sudo will use +/etc/nsswitch.conf even if the underlying operating system does not support it. +To disable nsswitch support, run configure with the --with-nsswitch=no option. +This will cause sudo to consult LDAP first and /etc/sudoers second, unless the +ignore_sudoers_file flag is set in the global LDAP options. + +Debugging your LDAP configuration +================================= +Enable debugging if you believe sudo is not parsing LDAP the way you think it +should. Setting the 'sudoers_debug' parameter to a value of 1 shows moderate +debugging. A value of 2 shows the results of the matches themselves. Make +sure to set the value back to zero so that other users don't get confused by +the debugging messages. diff --git a/utsudo-0.0.2/aclocal.m4 b/utsudo-0.0.2/aclocal.m4 new file mode 100644 index 0000000..b280623 --- /dev/null +++ b/utsudo-0.0.2/aclocal.m4 @@ -0,0 +1,25 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_check_link_flag.m4]) +m4_include([m4/ax_func_getaddrinfo.m4]) +m4_include([m4/ax_func_snprintf.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/utsudo.m4]) diff --git a/utsudo-0.0.2/autogen.sh b/utsudo-0.0.2/autogen.sh new file mode 100755 index 0000000..890eac7 --- /dev/null +++ b/utsudo-0.0.2/autogen.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# OpenBSD may have multiple versions of autoconf and automake installed +# If the user hasn't chosen one themselves, we do here. +if [ "`/usr/bin/uname 2>&1`" = "OpenBSD" ]; then + if [ X"$AUTOMAKE_VERSION" = X"" ]; then + AUTOMAKE_VERSION=1.15; export AUTOMAKE_VERSION + fi + if [ X"$AUTOCONF_VERSION" = X"" ]; then + AUTOCONF_VERSION=2.69; export AUTOCONF_VERSION + fi +fi + +set -ex + +autoreconf -f -i -v -Wall -I m4 + +rm -rf autom4te.cache + +exit 0 diff --git a/utsudo-0.0.2/config.guess b/utsudo-0.0.2/config.guess new file mode 100644 index 0000000..2e9ad7f --- /dev/null +++ b/utsudo-0.0.2/config.guess @@ -0,0 +1,1462 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-10-02' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2016 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = hppa2.0w ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +cat >&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/utsudo-0.0.2/config.h.in b/utsudo-0.0.2/config.h.in new file mode 100644 index 0000000..ac94d32 --- /dev/null +++ b/utsudo-0.0.2/config.h.in @@ -0,0 +1,1306 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef SUDO_CONFIG_H +#define SUDO_CONFIG_H + +/* Define to 1 if you want the insults from the "classic" version sudo. */ +#undef CLASSIC_INSULTS + +/* Define to 1 if you want insults culled from the twisted minds of CSOps. */ +#undef CSOPS_INSULTS + +/* Define to 1 if you want sudo to display "command not allowed" instead of + "command not found" when a command cannot be found. */ +#undef DONT_LEAK_PATH_INFO + +/* A colon-separated list of pathnames to be used as the editor for visudo. */ +#undef EDITOR + +/* Define to 1 to enable sudo's plugin interface. */ +#undef ENABLE_SUDO_PLUGIN_API + +/* Define to 1 to enable environment function debugging. */ +#undef ENV_DEBUG + +/* Define to 1 if you want visudo to honor the EDITOR and VISUAL env + variables. */ +#undef ENV_EDITOR + +/* Define to 1 to enable environment resetting by default. */ +#undef ENV_RESET + +/* If defined, users in this group need not enter a passwd (ie "sudo"). */ +#undef EXEMPTGROUP + +/* Define to 1 if you want to require fully qualified hosts in sudoers. */ +#undef FQDN + +/* Define to the type of elements in the array set by `getgroups'. Usually + this is either `int' or `gid_t'. */ +#undef GETGROUPS_T + +/* Define to 1 if you want insults from the "Goon Show". */ +#undef GOONS_INSULTS + +/* Define to 1 if you want 2001-like insults. */ +#undef HAL_INSULTS + +/* Define to 1 if you use AFS. */ +#undef HAVE_AFS + +/* Define to 1 if you use AIX general authentication. */ +#undef HAVE_AIXAUTH + +/* Define to 1 if you have the `arc4random' function. */ +#undef HAVE_ARC4RANDOM + +/* Define to 1 if you have the `arc4random_uniform' function. */ +#undef HAVE_ARC4RANDOM_UNIFORM + +/* Define to 1 if you have the `asprintf' function. */ +#undef HAVE_ASPRINTF + +/* Define to 1 if the system has the type `authdb_t'. */ +#undef HAVE_AUTHDB_T + +/* Define to 1 if you have the `authenticate' function. */ +#undef HAVE_AUTHENTICATE + +/* Define to 1 if you have the `auth_challenge' function. */ +#undef HAVE_AUTH_CHALLENGE + +/* Define to 1 if the `au_close' functions takes 4 arguments like Solaris 11. + */ +#undef HAVE_AU_CLOSE_SOLARIS11 + +/* Define to 1 if you have the `bigcrypt' function. */ +#undef HAVE_BIGCRYPT + +/* Define to 1 if you use BSD authentication. */ +#undef HAVE_BSD_AUTH_H + +/* Define to 1 to enable BSM audit support. */ +#undef HAVE_BSM_AUDIT + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define to 1 if you have the `closefrom' function. */ +#undef HAVE_CLOSEFROM + +/* Define to 1 if you use OSF DCE. */ +#undef HAVE_DCE + +/* Define to 1 if your `DIR' contains dd_fd. */ +#undef HAVE_DD_FD + +/* Define to 1 if you have the declaration of `errno', and to 0 if you don't. + */ +#undef HAVE_DECL_ERRNO + +/* Define to 1 if you have the declaration of `getdomainname', and to 0 if you + don't. */ +#undef HAVE_DECL_GETDOMAINNAME + +/* Define to 1 if you have the declaration of `getgrouplist_2', and to 0 if + you don't. */ +#undef HAVE_DECL_GETGROUPLIST_2 + +/* Define to 1 if you have the declaration of `getresuid', and to 0 if you + don't. */ +#undef HAVE_DECL_GETRESUID + +/* Define to 1 if you have the declaration of `h_errno', and to 0 if you + don't. */ +#undef HAVE_DECL_H_ERRNO + +/* Define to 1 if you have the declaration of `innetgr', and to 0 if you + don't. */ +#undef HAVE_DECL_INNETGR + +/* Define to 1 if you have the declaration of `LLONG_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_LLONG_MAX + +/* Define to 1 if you have the declaration of `LLONG_MIN', and to 0 if you + don't. */ +#undef HAVE_DECL_LLONG_MIN + +/* Define to 1 if you have the declaration of `PATH_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_PATH_MAX + +/* Define to 1 if you have the declaration of `QUAD_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_QUAD_MAX + +/* Define to 1 if you have the declaration of `QUAD_MIN', and to 0 if you + don't. */ +#undef HAVE_DECL_QUAD_MIN + +/* Define to 1 if you have the declaration of `SECCOMP_SET_MODE_FILTER', and + to 0 if you don't. */ +#undef HAVE_DECL_SECCOMP_SET_MODE_FILTER + +/* Define to 1 if you have the declaration of `setauthdb', and to 0 if you + don't. */ +#undef HAVE_DECL_SETAUTHDB + +/* Define to 1 if you have the declaration of `setresuid', and to 0 if you + don't. */ +#undef HAVE_DECL_SETRESUID + +/* Define to 1 if you have the declaration of `SIG2STR_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_SIG2STR_MAX + +/* Define to 1 if you have the declaration of `SIZE_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_SIZE_MAX + +/* Define to 1 if you have the declaration of `SIZE_T_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_SIZE_T_MAX + +/* Define to 1 if you have the declaration of `sys_sigabbrev', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGABBREV + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGLIST + +/* Define to 1 if you have the declaration of `sys_signame', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGNAME + +/* Define to 1 if you have the declaration of `ULLONG_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_ULLONG_MAX + +/* Define to 1 if you have the declaration of `UQUAD_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_UQUAD_MAX + +/* Define to 1 if you have the declaration of `usrinfo', and to 0 if you + don't. */ +#undef HAVE_DECL_USRINFO + +/* Define to 1 if you have the declaration of `_innetgr', and to 0 if you + don't. */ +#undef HAVE_DECL__INNETGR + +/* Define to 1 if you have the declaration of `_POSIX_PATH_MAX', and to 0 if + you don't. */ +#undef HAVE_DECL__POSIX_PATH_MAX + +/* Define to 1 if you have the declaration of `_sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL__SYS_SIGLIST + +/* Define to 1 if you have the declaration of `_sys_signame', and to 0 if you + don't. */ +#undef HAVE_DECL__SYS_SIGNAME + +/* Define to 1 if you have the `devname' function. */ +#undef HAVE_DEVNAME + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the `dirfd' function or macro. */ +#undef HAVE_DIRFD + +/* Define to 1 if you have the `dispcrypt' function. */ +#undef HAVE_DISPCRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `dlopen' function. */ +#undef HAVE_DLOPEN + +/* Define to 1 if you have the `dl_iterate_phdr' function. */ +#undef HAVE_DL_ITERATE_PHDR + +/* Define to 1 if the compiler supports the __visibility__ attribute. */ +#undef HAVE_DSO_VISIBILITY + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define to 1 if you have the `exect' function. */ +#undef HAVE_EXECT + +/* Define to 1 if you have the `execvP' function. */ +#undef HAVE_EXECVP + +/* Define to 1 if you have the `execvpe' function. */ +#undef HAVE_EXECVPE + +/* Define to 1 if you have the `faccessat' function. */ +#undef HAVE_FACCESSAT + +/* Define to 1 if your system has the F_CLOSEM fcntl. */ +#undef HAVE_FCNTL_CLOSEM + +/* Define to 1 if you have the `fexecve' function. */ +#undef HAVE_FEXECVE + +/* Define to 1 if you have the `fnmatch' function. */ +#undef HAVE_FNMATCH + +/* Define to 1 if you have the `freeifaddrs' function. */ +#undef HAVE_FREEIFADDRS + +/* Define to 1 if you have the `fseeko' function. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `futime' function. */ +#undef HAVE_FUTIME + +/* Define to 1 if you have the `futimens' function. */ +#undef HAVE_FUTIMENS + +/* Define to 1 if you have the `futimes' function. */ +#undef HAVE_FUTIMES + +/* Define to 1 if you have the `futimesat' function. */ +#undef HAVE_FUTIMESAT + +/* Define to 1 if you use the FWTK authsrv daemon. */ +#undef HAVE_FWTK + +/* Define to 1 if you are using gcrypt's sha2 functions. */ +#undef HAVE_GCRYPT + +/* Define to 1 if you have the `getaddrinfo' function. */ +#undef HAVE_GETADDRINFO + +/* Define to 1 if you have the `getauxval' function. */ +#undef HAVE_GETAUXVAL + +/* Define to 1 if you have the `getdelim' function. */ +#undef HAVE_GETDELIM + +/* Define to 1 if you have the `getdomainname' function. */ +#undef HAVE_GETDOMAINNAME + +/* Define to 1 if you have the `getentropy' function. */ +#undef HAVE_GETENTROPY + +/* Define to 1 if you have the `getgrouplist' function. */ +#undef HAVE_GETGROUPLIST + +/* Define to 1 if you have the `getgrouplist_2' function. */ +#undef HAVE_GETGROUPLIST_2 + +/* Define to 1 if your system has a working `getgroups' function. */ +#undef HAVE_GETGROUPS + +/* Define to 1 if you have the `getgrset' function. */ +#undef HAVE_GETGRSET + +/* Define to 1 if you have the `gethrtime' function. */ +#undef HAVE_GETHRTIME + +/* Define to 1 if you have the `getifaddrs' function. */ +#undef HAVE_GETIFADDRS + +/* Define to 1 if you have the `getopt_long' function. */ +#undef HAVE_GETOPT_LONG + +/* Define to 1 if you have the `getprogname' function. */ +#undef HAVE_GETPROGNAME + +/* Define to 1 if you have the `getprpwnam' function. (SecureWare-style shadow + passwords). */ +#undef HAVE_GETPRPWNAM + +/* Define to 1 if you have the `getpwnam_shadow' function. */ +#undef HAVE_GETPWNAM_SHADOW + +/* Define to 1 if you have the `getresuid' function. */ +#undef HAVE_GETRESUID + +/* Define to 1 if you have the `getspnam' function (SVR4-style shadow + passwords). */ +#undef HAVE_GETSPNAM + +/* Define to 1 if you have the `getttyent' function. */ +#undef HAVE_GETTTYENT + +/* Define to 1 if you have the `getuserattr' function. */ +#undef HAVE_GETUSERATTR + +/* Define to 1 if you have the `getusershell' function. */ +#undef HAVE_GETUSERSHELL + +/* Define to 1 if you have the `getutid' function. */ +#undef HAVE_GETUTID + +/* Define to 1 if you have the `getutsid' function. */ +#undef HAVE_GETUTSID + +/* Define to 1 if you have the `getutxid' function. */ +#undef HAVE_GETUTXID + +/* Define to 1 if you have the `glob' function. */ +#undef HAVE_GLOB + +/* Define to 1 if you have the `grantpt' function. */ +#undef HAVE_GRANTPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_GSSAPI_KRB5_H + +/* Define to 1 if you have the `gss_krb5_ccache_name' function. */ +#undef HAVE_GSS_KRB5_CCACHE_NAME + +/* Define to 1 if your Kerberos is Heimdal. */ +#undef HAVE_HEIMDAL + +/* Define to 1 if you have the `inet_ntop' function. */ +#undef HAVE_INET_NTOP + +/* Define to 1 if you have the `inet_pton' function. */ +#undef HAVE_INET_PTON + +/* Define to 1 if you have the `initprivs' function. */ +#undef HAVE_INITPRIVS + +/* Define to 1 if you have the `innetgr' function. */ +#undef HAVE_INNETGR + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have isblank(3). */ +#undef HAVE_ISBLANK + +/* Define to 1 if you have the `iscomsec' function. (HP-UX >= 10.x check for + shadow enabled). */ +#undef HAVE_ISCOMSEC + +/* Define to 1 if you use Kerberos V. */ +#undef HAVE_KERB5 + +/* Define to 1 if you have the `killpg' function. */ +#undef HAVE_KILLPG + +/* Define to 1 if your system has a NetBSD-style kinfo_proc2 struct. */ +#undef HAVE_KINFO_PROC2_NETBSD + +/* Define to 1 if your system has a 4.4BSD-style kinfo_proc struct. */ +#undef HAVE_KINFO_PROC_44BSD + +/* Define to 1 if your system has a FreeBSD-style kinfo_proc struct. */ +#undef HAVE_KINFO_PROC_FREEBSD + +/* Define to 1 if your system has an OpenBSD-style kinfo_proc struct. */ +#undef HAVE_KINFO_PROC_OPENBSD + +/* Define to 1 if you have the `krb5_get_init_creds_opt_alloc' function. */ +#undef HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC + +/* Define to 1 if your `krb5_get_init_creds_opt_free' function takes two + arguments. */ +#undef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS + +/* Define to 1 if you have the `krb5_init_secure_context' function. */ +#undef HAVE_KRB5_INIT_SECURE_CONTEXT + +/* Define to 1 if you have the `krb5_verify_user' function. */ +#undef HAVE_KRB5_VERIFY_USER + +/* Define to 1 if your LDAP needs . (OpenLDAP does not). */ +#undef HAVE_LBER_H + +/* Define to 1 if you use LDAP for sudoers. */ +#undef HAVE_LDAP + +/* Define to 1 if you have the `ldapssl_init' function. */ +#undef HAVE_LDAPSSL_INIT + +/* Define to 1 if you have the `ldapssl_set_strength' function. */ +#undef HAVE_LDAPSSL_SET_STRENGTH + +/* Define to 1 if you have the `ldap_create' function. */ +#undef HAVE_LDAP_CREATE + +/* Define to 1 if you have the `ldap_initialize' function. */ +#undef HAVE_LDAP_INITIALIZE + +/* Define to 1 if you have the `ldap_sasl_bind_s' function. */ +#undef HAVE_LDAP_SASL_BIND_S + +/* Define to 1 if you have the `ldap_sasl_interactive_bind_s' function. */ +#undef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + +/* Define to 1 if you have the `ldap_search_ext_s' function. */ +#undef HAVE_LDAP_SEARCH_EXT_S + +/* Define to 1 if you have the `ldap_search_st' function. */ +#undef HAVE_LDAP_SEARCH_ST + +/* Define to 1 if you have the `ldap_ssl_client_init' function. */ +#undef HAVE_LDAP_SSL_CLIENT_INIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_LDAP_SSL_H + +/* Define to 1 if you have the `ldap_ssl_init' function. */ +#undef HAVE_LDAP_SSL_INIT + +/* Define to 1 if you have the `ldap_start_tls_s' function. */ +#undef HAVE_LDAP_START_TLS_S + +/* Define to 1 if you have the `ldap_start_tls_s_np' function. */ +#undef HAVE_LDAP_START_TLS_S_NP + +/* Define to 1 if you have the `ldap_str2dn' function. */ +#undef HAVE_LDAP_STR2DN + +/* Define to 1 if you have the `ldap_unbind_ext_s' function. */ +#undef HAVE_LDAP_UNBIND_EXT_S + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBINTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUTIL_H + +/* Define to 1 to enable Linux audit support. */ +#undef HAVE_LINUX_AUDIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_RANDOM_H + +/* Define to 1 if you have the `lockf' function. */ +#undef HAVE_LOCKF + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOGIN_CAP_H + +/* Define to 1 if the system has the type `long long int'. */ +#undef HAVE_LONG_LONG_INT + +/* Define to 1 if you have the `lrand48' function. */ +#undef HAVE_LRAND48 + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACHINE_ENDIAN_H + +/* Define to 1 if you have the `mach_continuous_time' function. */ +#undef HAVE_MACH_CONTINUOUS_TIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_MAILLOCK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memrchr' function. */ +#undef HAVE_MEMRCHR + +/* Define to 1 if you have the `memset_s' function. */ +#undef HAVE_MEMSET_S + +/* Define to 1 if you have the `mkdtemp' function. */ +#undef HAVE_MKDTEMP + +/* Define to 1 if you have the `mkstemps' function. */ +#undef HAVE_MKSTEMPS + +/* Define to 1 if you have the header file. */ +#undef HAVE_MPS_LDAP_SSL_H + +/* Define to 1 if you have the `nanosleep' function. */ +#undef HAVE_NANOSLEEP + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETGROUP_H + +/* Define to 1 if you have the `ngettext' function. */ +#undef HAVE_NGETTEXT + +/* Define to 1 if you have the `nl_langinfo' function. */ +#undef HAVE_NL_LANGINFO + +/* Define to 1 if you have the header file. */ +#undef HAVE_NSS_DBDEFS_H + +/* Define to 1 if you have the `nss_search' function. */ +#undef HAVE_NSS_SEARCH + +/* Define to 1 if you have the `openat' function. */ +#undef HAVE_OPENAT + +/* Define to 1 if you have the `openpty' function. */ +#undef HAVE_OPENPTY + +/* Define to 1 if you are using OpenSSL's sha2 functions. */ +#undef HAVE_OPENSSL + +/* Define to 1 if you use NRL OPIE. */ +#undef HAVE_OPIE + +/* Define to 1 if you have the `optreset' symbol. */ +#undef HAVE_OPTRESET + +/* Define to 1 if you use PAM authentication. */ +#undef HAVE_PAM + +/* Define to 1 if you have the `pam_getenvlist' function. */ +#undef HAVE_PAM_GETENVLIST + +/* Define to 1 if you use a specific PAM session for sudo -i. */ +#undef HAVE_PAM_LOGIN + +/* Define to 1 if you have the header file. */ +#undef HAVE_PAM_PAM_APPL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PATHS_H + +/* Define to 1 if you have the `pipe2' function. */ +#undef HAVE_PIPE2 + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the `posix_openpt' function. */ +#undef HAVE_POSIX_OPENPT + +/* Define to 1 if you have the `posix_spawn' function. */ +#undef HAVE_POSIX_SPAWN + +/* Define to 1 if you have the `posix_spawnp' function. */ +#undef HAVE_POSIX_SPAWNP + +/* Define to 1 if you have the `ppoll' function. */ +#undef HAVE_PPOLL + +/* Define to 1 if you have the `pread' function. */ +#undef HAVE_PREAD + +/* Define to 1 if you have the `pread64' function. */ +#undef HAVE_PREAD64 + +/* Define to 1 if you have the `priv_set' function. */ +#undef HAVE_PRIV_SET + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROJECT_H + +/* Define to 1 if you have the `pselect' function. */ +#undef HAVE_PSELECT + +/* Define to 1 if you have the `pstat_getproc' function. */ +#undef HAVE_PSTAT_GETPROC + +/* Define to 1 if you have the `pthread_atfork' function. */ +#undef HAVE_PTHREAD_ATFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTY_H + +/* Define to 1 if you have the `pwrite' function. */ +#undef HAVE_PWRITE + +/* Define to 1 if you have the `pwrite64' function. */ +#undef HAVE_PWRITE64 + +/* Define to 1 if you have the `pw_dup' function. */ +#undef HAVE_PW_DUP + +/* Define to 1 if you have the `random' function. */ +#undef HAVE_RANDOM + +/* Define to 1 if you have the `reallocarray' function. */ +#undef HAVE_REALLOCARRAY + +/* Define to 1 if you have the `revoke' function. */ +#undef HAVE_REVOKE + +/* Define to 1 if the skeychallenge() function is RFC1938-compliant and takes + 4 arguments. */ +#undef HAVE_RFC1938_SKEYCHALLENGE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SASL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SASL_SASL_H + +/* Define to 1 if you use SecurID for authentication. */ +#undef HAVE_SECURID + +/* Define to 1 if you have the header file. */ +#undef HAVE_SECURITY_PAM_APPL_H + +/* Define to 1 to enable SELinux RBAC support. */ +#undef HAVE_SELINUX + +/* Define to 1 if you have the `setauthdb' function. */ +#undef HAVE_SETAUTHDB + +/* Define to 1 if you have the `seteuid' function. */ +#undef HAVE_SETEUID + +/* Define to 1 if you have the `setgroupent' function. */ +#undef HAVE_SETGROUPENT + +/* Define to 1 if you have the `setkeycreatecon' function. */ +#undef HAVE_SETKEYCREATECON + +/* Define to 1 if you have the `setpassent' function. */ +#undef HAVE_SETPASSENT + +/* Define to 1 if you have the `setprogname' function. */ +#undef HAVE_SETPROGNAME + +/* Define to 1 if you have the `setresuid' function. */ +#undef HAVE_SETRESUID + +/* Define to 1 if you have the `setreuid' function. */ +#undef HAVE_SETREUID + +/* Define to 1 if you have the `setrlimit64' function. */ +#undef HAVE_SETRLIMIT64 + +/* Define to 1 if you have the `set_auth_parameters' function. */ +#undef HAVE_SET_AUTH_PARAMETERS + +/* Define to 1 if you have the `SHA224Update' function. */ +#undef HAVE_SHA224UPDATE + +/* Define to 1 if you have the `shl_load' function. */ +#undef HAVE_SHL_LOAD + +/* Define to 1 if you have the `sia_ses_init' function. */ +#undef HAVE_SIA_SES_INIT + +/* Define to 1 if you have the `sig2str' function. */ +#undef HAVE_SIG2STR + +/* Define to 1 if you use S/Key. */ +#undef HAVE_SKEY + +/* Define to 1 if your S/Key library has skeyaccess(). */ +#undef HAVE_SKEYACCESS + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 to enable Solaris audit support. */ +#undef HAVE_SOLARIS_AUDIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_SPAWN_H + +/* Define to 1 to enable SSSD support. */ +#undef HAVE_SSSD + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `str2sig' function. */ +#undef HAVE_STR2SIG + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strnlen' function. */ +#undef HAVE_STRNLEN + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if `d_namlen' is a member of `struct dirent'. */ +#undef HAVE_STRUCT_DIRENT_D_NAMLEN + +/* Define to 1 if `d_type' is a member of `struct dirent'. */ +#undef HAVE_STRUCT_DIRENT_D_TYPE + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#undef HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if `pr_ttydev' is a member of `struct psinfo'. */ +#undef HAVE_STRUCT_PSINFO_PR_TTYDEV + +/* Define if your struct sockaddr_in has a sin_len field. */ +#undef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + +/* Define if your struct sockaddr has an sa_len field. */ +#undef HAVE_STRUCT_SOCKADDR_SA_LEN + +/* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ +#undef HAVE_STRUCT_TM_TM_GMTOFF + +/* Define to 1 if `ut_exit' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_EXIT + +/* Define to 1 if `ut_exit.e_termination' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION + +/* Define to 1 if `ut_exit.__e_termination' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_EXIT___E_TERMINATION + +/* Define to 1 if `ut_id' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_ID + +/* Define to 1 if `ut_pid' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_PID + +/* Define to 1 if `ut_tv' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_TV + +/* Define to 1 if `ut_type' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_TYPE + +/* Define to 1 if `ut_user' is a member of `struct utmp'. */ +#undef HAVE_STRUCT_UTMP_UT_USER + +/* Define to 1 if your struct stat has an st_mtim member. */ +#undef HAVE_ST_MTIM + +/* Define to 1 if your struct stat has an st_mtimespec member. */ +#undef HAVE_ST_MTIMESPEC + +/* Define to 1 if your struct stat has an st_nmtime member. */ +#undef HAVE_ST_NMTIME + +/* Define to 1 if your struct stat uses an st__tim union. */ +#undef HAVE_ST__TIM + +/* Define to 1 if you have the `sysctl' function. */ +#undef HAVE_SYSCTL + +/* Define to 1 if you have the `sysinfo' function. */ +#undef HAVE_SYSINFO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BSDTYPES_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_ENDIAN_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PROCFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RANDOM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if your libc has the `sys_sigabbrev' symbol. */ +#undef HAVE_SYS_SIGABBREV + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STROPTS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCALL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSMACROS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSTEMINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the `ttyslot' function. */ +#undef HAVE_TTYSLOT + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `unsetenv' function. */ +#undef HAVE_UNSETENV + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#undef HAVE_UNSIGNED_LONG_LONG_INT + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIL_H + +/* Define to 1 if you have the `utimensat' function. */ +#undef HAVE_UTIMENSAT + +/* Define to 1 if you have the `utimes' function. */ +#undef HAVE_UTIMES + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMPS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMPX_H + +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `vsyslog' function. */ +#undef HAVE_VSYSLOG + +/* Define to 1 if you have the `wordexp' function. */ +#undef HAVE_WORDEXP + +/* Define to 1 if you have the header file. */ +#undef HAVE_WORDEXP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ZLIB_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to 1 if you have the `_getpty' function. */ +#undef HAVE__GETPTY + +/* Define to 1 if you have the `_innetgr' function. */ +#undef HAVE__INNETGR + +/* Define to 1 if you have the `_nss_initf_group' function. */ +#undef HAVE__NSS_INITF_GROUP + +/* Define to 1 if you have the `_nss_XbyY_buf_alloc' function. */ +#undef HAVE__NSS_XBYY_BUF_ALLOC + +/* Define to 1 if you have the `_ttyname_dev' function. */ +#undef HAVE__TTYNAME_DEV + +/* Define to 1 if the compiler supports the C99 __func__ variable. */ +#undef HAVE___FUNC__ + +/* Define to 1 if you have dyld with __interpose attribute support. */ +#undef HAVE___INTERPOSE + +/* Define to 1 if you have the `__nss_initf_group' function. */ +#undef HAVE___NSS_INITF_GROUP + +/* Define to 1 if you have the `__nss_XbyY_buf_alloc' function. */ +#undef HAVE___NSS_XBYY_BUF_ALLOC + +/* Define to 1 if your crt0.o defines the __progname symbol for you. */ +#undef HAVE___PROGNAME + +/* Define to 1 if you want the hostname to be entered into the log file. */ +#undef HOST_IN_LOG + +/* Define to 1 if you want to ignore '.' and empty PATH elements. */ +#undef IGNORE_DOT_PATH + +/* The message given when a bad password is entered. */ +#undef INCORRECT_PASSWORD + +/* The syslog facility sudo will use. */ +#undef LOGFAC + +/* Define to SLOG_SYSLOG, SLOG_FILE, or SLOG_BOTH. */ +#undef LOGGING + +/* Define to 1 if you want a two line OTP (S/Key or OPIE) prompt. */ +#undef LONG_OTP_PROMPT + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* The subject of the mail sent by sudo to the MAILTO user/address. */ +#undef MAILSUBJECT + +/* The user or email address that sudo mail is sent to. */ +#undef MAILTO + +/* Define to 1 if `major', `minor', and `makedev' are declared in . + */ +#undef MAJOR_IN_MKDEV + +/* Define to 1 if `major', `minor', and `makedev' are declared in + . */ +#undef MAJOR_IN_SYSMACROS + +/* The max number of chars per log file line (for line wrapping). */ +#undef MAXLOGFILELEN + +/* Define to the max length of a uid_t in string context (excluding the NUL). + */ +#undef MAX_UID_T_LEN + +/* Define to 1 if resolv.h must be included to get the `inet_ntop' or + `inet_pton' function prototypes. */ +#undef NEED_RESOLV_H + +/* Define to 1 if you don't want sudo to prompt for a password by default. */ +#undef NO_AUTHENTICATION + +/* Define to 1 if you want sudo to free up memory before exiting. */ +#undef NO_LEAKS + +/* Define to 1 if you don't want users to get the lecture the first they user + sudo. */ +#undef NO_LECTURE + +/* Define to 1 if you don't want to use sudo's PAM session support. */ +#undef NO_PAM_SESSION + +/* Define to avoid runing the mailer as root. */ +#undef NO_ROOT_MAILER + +/* Define to 1 if root should not be allowed to use sudo. */ +#undef NO_ROOT_SUDO + +/* Define if your C preprocessor does not support variadic macros. */ +#undef NO_VARIADIC_MACROS + +/* Define to 1 to include offensive insults from the classic version of sudo. + */ +#undef OFFENSIVE_INSULTS + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if your system uses a Solaris-derived PAM and not Linux-PAM or + OpenPAM. */ +#undef PAM_SUN_CODEBASE + +/* The default password prompt. */ +#undef PASSPROMPT + +/* The passwd prompt timeout (in minutes). */ +#undef PASSWORD_TIMEOUT + +/* Define to 1 to enable replacement getcwd if system getcwd is broken. */ +#undef PREFER_PORTABLE_GETCWD + +/* Enable replacement (v)snprintf if system (v)snprintf is broken. */ +#undef PREFER_PORTABLE_SNPRINTF + +/* The syslog priority sudo will use for unsuccessful attempts/errors. */ +#undef PRI_FAILURE + +/* The syslog priority sudo will use for successful attempts. */ +#undef PRI_SUCCESS + +/* Define to const if the `putenv' takes a const argument. */ +#undef PUTENV_CONST + +/* Define to 1 if you want insults from "Monty Python's Flying Circus". */ +#undef PYTHON_INSULTS + +/* The default value of preloaded objects (if any). */ +#undef RTLD_PRELOAD_DEFAULT + +/* The delimiter to use when defining multiple preloaded objects. */ +#undef RTLD_PRELOAD_DELIM + +/* An extra environment variable that is required to enable preloading (if + any). */ +#undef RTLD_PRELOAD_ENABLE_VAR + +/* The environment variable that controls preloading of dynamic objects. */ +#undef RTLD_PRELOAD_VAR + +/* The user sudo should run commands as by default. */ +#undef RUNAS_DEFAULT + +/* A colon-separated list of directories to override the user's PATH with. */ +#undef SECURE_PATH + +/* Define to 1 to send mail when the user is not allowed to run a command. */ +#undef SEND_MAIL_WHEN_NOT_OK + +/* Define to 1 to send mail when the user is not allowed to run sudo on this + host. */ +#undef SEND_MAIL_WHEN_NO_HOST + +/* Define to 1 to send mail when the user is not in the sudoers file. */ +#undef SEND_MAIL_WHEN_NO_USER + +/* Define to 1 if the sha2 functions use `const void *' instead of `const + unsigned char'. */ +#undef SHA2_VOID_PTR + +/* Define to 1 if you want sudo to start a shell if given no arguments. */ +#undef SHELL_IF_NO_ARGS + +/* Define to 1 if you want sudo to set $HOME in shell mode. */ +#undef SHELL_SETS_HOME + +/* The size of `id_t', as computed by sizeof. */ +#undef SIZEOF_ID_T + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `time_t', as computed by sizeof. */ +#undef SIZEOF_TIME_T + +/* Define to 1 to compile the sudoers plugin statically into the sudo binary. + */ +#undef STATIC_SUDOERS_PLUGIN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if the code in interfaces.c does not compile for you. */ +#undef STUB_LOAD_INTERFACES + +/* An instance string to append to the username (separated by a slash) for + Kerberos V authentication. */ +#undef SUDO_KRB5_INSTANCE + +/* The umask that the sudo-run prog should use. */ +#undef SUDO_UMASK + +/* The number of minutes before sudo asks for a password again. */ +#undef TIMEOUT + +/* Define to global, ppid or tty to set the default timestamp record type. */ +#undef TIMESTAMP_TYPE + +/* The number of tries a user gets to enter their password. */ +#undef TRIES_FOR_PASSWORD + +/* Define to 1 to use the umask specified in sudoers even when it is less + restrictive than the invoking user's. */ +#undef UMASK_OVERRIDE + +/* Define to 1 if the `unsetenv' function returns void instead of `int'. */ +#undef UNSETENV_VOID + +/* Define to 1 if you want to create ~/.sudo_as_admin_successful if the user + is in the admin group the first time they run sudo. */ +#undef USE_ADMIN_FLAG + +/* Define to 1 if you want to insult the user for entering an incorrect + password. */ +#undef USE_INSULTS + +/* Define to 1 if you use GNU stow packaging. */ +#undef USE_STOW + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define to avoid using the passwd/shadow file for authentication. */ +#undef WITHOUT_PASSWD + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define to 1 to enable 64-bit versions of standard C functions on 32-bit + systems. */ +#undef _LARGEFILE64_SOURCE + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to __FUNCTION__ if your compiler supports __FUNCTION__ but not + __func__ */ +#undef __func__ + +/* Define to `int' if does not define. */ +#undef clockid_t + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if does not define. */ +#undef errno_t + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long long' if does not define. */ +#undef intmax_t + +/* Define to `int' if does not define. */ +#undef mode_t + +/* Define to an OS-specific initialization function or `os_init_common'. */ +#undef os_init + +/* Define to `size_t' if does not define. */ +#undef rsize_t + +/* Define to `int' if does not define. */ +#undef sig_atomic_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `unsigned int' if doesn't define. */ +#undef socklen_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Define to `unsigned int' if does not define. */ +#undef uint32_t + +/* Define to `unsigned long long' if does not define. */ +#undef uint64_t + +/* Define to `unsigned char' if does not define. */ +#undef uint8_t + +/* Define to `unsigned long long' if does not define. */ +#undef uintmax_t + +/* Define to empty if the keyword `volatile' does not work. Warning: valid + code using `volatile' can become incorrect without. Disable with care. */ +#undef volatile + +/* BSD compatibility on some SVR4 systems. */ +#ifdef __svr4__ +# define BSD_COMP +#endif + +/* Enable BSD extensions on systems that have them. */ +#ifndef _BSD_SOURCE +# undef _BSD_SOURCE +#endif + +/* Enable BSD types on IRIX. */ +#ifndef _BSD_TYPES +# undef _BSD_TYPES +#endif + +/* Enable Linux-compatible extensions on AIX. */ +#ifndef _LINUX_SOURCE_COMPAT +# undef _LINUX_SOURCE_COMPAT +#endif + +/* Enable prototypes in GCC fixed includes on older systems. */ +#ifndef __USE_FIXED_PROTOTYPES__ +# undef __USE_FIXED_PROTOTYPES__ +#endif + +/* Enable XPG4v2 extensions to POSIX, needed for MSG_WAITALL on older HP-UX. */ +#ifndef _XOPEN_SOURCE_EXTENDED +# undef _XOPEN_SOURCE_EXTENDED +#endif + +/* Enable reentrant versions of the standard C API (obsolete). */ +#ifndef _REENTRANT +# undef _REENTRANT +#endif + +/* Enable "safer" versions of the standard C API (ISO C11). */ +#ifndef __STDC_WANT_LIB_EXT1__ +# undef __STDC_WANT_LIB_EXT1__ +#endif + +/* Prevent static analyzers from genering bogus memory leak warnings. */ +#if defined(__COVERITY__) && !defined(NO_LEAKS) +# define NO_LEAKS +#endif + +#endif /* SUDO_CONFIG_H */ diff --git a/utsudo-0.0.2/config.sub b/utsudo-0.0.2/config.sub new file mode 100644 index 0000000..040d5cb --- /dev/null +++ b/utsudo-0.0.2/config.sub @@ -0,0 +1,1827 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-09-05' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2016 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze* | -sr2201*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + sr2201*) + basic_machine=harp1e-hitachi + os=-hiuxmpp + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/utsudo-0.0.2/configure b/utsudo-0.0.2/configure new file mode 100755 index 0000000..03df1fb --- /dev/null +++ b/utsudo-0.0.2/configure @@ -0,0 +1,29320 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for sudo 1.8.29. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: https://bugzilla.sudo.ws/ about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='utsudo' +PACKAGE_TARNAME='utsudo' +PACKAGE_VERSION='0.0.2' +PACKAGE_STRING='utsudo 0.0.2' +PACKAGE_BUGREPORT='https://bugzilla.sudo.ws/' +PACKAGE_URL='' + +ac_unique_file="src/utsudo.c" +ac_config_libobj_dir=lib/util +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_list= +ac_func_list= +ac_c_werror_flag= +ac_subst_vars='LTLIBOBJS +KRB5CONFIG +LIBOBJS +FLEX +YFLAGS +YACC +NROFFPROG +MANDOCPROG +TRPROG +UNAMEPROG +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +AWK +STRIP +ac_ct_AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +RANLIB +AR +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CC +plugindir +pam_login_service +pam_session +editor +secure_path +netsvc_conf +nsswitch_conf +sssd_lib +ldap_secret +ldap_conf +path_info +root_sudo +insults +timestamp_type +passwd_tries +env_reset +env_editor +runas_default +fqdn +badpass_message +mailsub +mailto +mail_no_perms +mail_no_host +mail_no_user +ignore_dot +loglen +badpri +goodpri +logfac +lecture +long_otp_prompt +passprompt +umask_override +sudo_umask +password_timeout +timeout +vardir +rundir +iolog_dir +SIGNAME +devsearch +DIGEST +exampledir +TMPFILES_D +COMPAT_EXP +RC_LINK +INIT_DIR +INIT_SCRIPT +SSP_CFLAGS +SSP_LDFLAGS +PIE_CFLAGS +PIE_LDFLAGS +ASAN_CFLAGS +ASAN_LDFLAGS +CROSS_COMPILING +SUDOERS_TEST_PROGS +COMPAT_TEST_PROGS +LOCALEDIR_SUFFIX +SUDO_NLS +LIBPTHREAD +LIBMD +LIBINTL +LIBRT +LIBDL +CONFIGURE_ARGS +LIBTOOL_DEPS +ZLIB_SRC +ZLIB +LOGINCAP_USAGE +LDAP +SELINUX_USAGE +BSDAUTH_USAGE +DONT_LEAK_PATH_INFO +CHECK_NOEXEC +INSTALL_NOEXEC +INSTALL_BACKUP +sesh_file +noexec_file +NOEXECDIR +NOEXECFILE +mansrcdir +mansectform +mansectsu +devdir +SEMAN +PSMAN +LCMAN +BAMAN +DEVEL +SUDOERS_GID +SUDOERS_UID +SUDOERS_MODE +SHLIB_MODE +SHLIB_ENABLE +MANCOMPRESSEXT +MANCOMPRESS +MANDIRTYPE +MANTYPE +AUTH_OBJS +GETGROUPS_LIB +REPLAY_LIBS +AFS_LIBS +NET_LIBS +STATIC_SUDOERS +SUDOERS_LIBS +SUDO_LIBS +SUDO_OBJS +SUDOERS_OBJS +COMMON_OBJS +LT_DEP_LIBS +LT_STATIC +LT_LDEXPORTS +LT_LDDEP +LT_LDFLAGS +ZLIB_LDFLAGS +LIBUTIL_LDFLAGS +SUDOERS_LDFLAGS +SUDO_LDFLAGS +LDFLAGS +CPPFLAGS +PROGS +CFLAGS +LIBTOOL +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +BSHELLPROG +MVPROG +VIPROG +SENDMAILPROG' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_otp_only +with_alertmail +with_pc_insults +with_devel +with_CC +with_rpath +with_blibpath +with_bsm_audit +with_linux_audit +with_solaris_audit +with_sssd +with_sssd_conf +with_sssd_lib +with_incpath +with_libpath +with_libraries +with_efence +with_csops +with_passwd +with_skey +with_opie +with_long_otp_prompt +with_SecurID +with_fwtk +with_kerb5 +with_aixauth +with_pam +with_AFS +with_DCE +with_logincap +with_bsdauth +with_project +with_lecture +with_logging +with_logfac +with_goodpri +with_badpri +with_logpath +with_loglen +with_ignore_dot +with_mail_if_no_user +with_mail_if_no_host +with_mail_if_noperms +with_mailto +with_mailsubject +with_passprompt +with_badpass_message +with_fqdn +with_timedir +with_rundir +with_vardir +with_iologdir +with_tzdir +with_sendmail +with_sudoers_mode +with_sudoers_uid +with_sudoers_gid +with_umask +with_umask_override +with_runas_default +with_exempt +with_editor +with_env_editor +with_passwd_tries +with_timeout +with_password_timeout +with_tty_tickets +with_insults +with_all_insults +with_classic_insults +with_csops_insults +with_hal_insults +with_goons_insults +with_python_insults +with_nsswitch +with_ldap +with_ldap_conf_file +with_ldap_secret_file +with_secure_path +with_interfaces +with_askpass +with_exampledir +with_plugindir +with_man +with_mdoc +enable_authentication +enable_root_mailer +enable_setreuid +enable_setresuid +enable_shadow +enable_root_sudo +enable_log_host +enable_noargs_shell +enable_shell_sets_home +enable_path_info +enable_env_debug +enable_zlib +enable_env_reset +enable_warnings +enable_werror +enable_openssl +enable_gcrypt +enable_hardening +enable_pie +enable_asan +enable_poll +enable_admin_flag +enable_nls +enable_rpath +enable_static_sudoers +enable_shared_libutil +enable_tmpfiles_d +enable_devsearch +with_selinux +enable_sasl +enable_timestamp_type +enable_offensive_insults +enable_package_build +enable_gss_krb5_ccache_name +enable_pvs_studio +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_libtool +with_noexec +with_netsvc +enable_sia +enable_largefile +with_pam_login +enable_pam_session +enable_kerb5_instance +' + ac_precious_vars='SENDMAILPROG +VIPROG +MVPROG +BSHELLPROG +build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +LT_SYS_LIBRARY_PATH +YACC +YFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures sudo 1.8.29 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/sudo] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of utsudo 1.8.29:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-authentication + Do not require authentication by default + --disable-root-mailer Don't run the mailer as root, run as the user + --disable-setreuid Don't try to use the setreuid() function + --disable-setresuid Don't try to use the setresuid() function + --disable-shadow Never use shadow passwords + --disable-root-sudo Don't allow root to run sudo + --enable-log-host Log the hostname in the log file + --enable-noargs-shell If sudo is given no arguments run a shell + --enable-shell-sets-home + Set $HOME to target user in shell mode + --disable-path-info Print 'command not allowed' not 'command not found' + --enable-env-debug Whether to enable environment debugging. + --enable-zlib[=PATH] Whether to enable or disable zlib + --enable-env-reset Whether to enable environment resetting by default. + --enable-warnings Whether to enable compiler warnings + --enable-werror Whether to enable the -Werror compiler option + --enable-openssl Use OpenSSL's message digest functions instead of + sudo's + --enable-gcrypt Use GNU crypt's message digest functions instead of + sudo's + --disable-hardening Do not use compiler/linker exploit mitigation + options + --enable-pie Build sudo as a position independent executable. + --enable-asan Build sudo with address sanitizer support. + --disable-poll Use select() instead of poll(). + --enable-admin-flag Whether to create a Ubuntu-style admin flag file + --disable-nls Disable natural language support using gettext + --disable-rpath Disable passing of -Rpath to the linker + --enable-static-sudoers Build the sudoers policy module as part of the sudo + binary instead as a plugin + --disable-shared-libutil + Disable use of the libsudo_util shared library. + --enable-tmpfiles.d=DIR Set the path to the systemd tmpfiles.d directory. + --enable-devsearch=PATH The colon-delimited path to search for device nodes + when determing the tty name. + --enable-sasl Enable/disable LDAP SASL support + --timestamp-type=TYPE Set the default time stamp record type to global, + ppid or tty. + --enable-offensive-insults + Enable potentially offensive sudo insults. + --enable-package-build Enable options for package building. + --enable-gss-krb5-ccache-name + Use GSS-API to set the Kerberos V cred cache name + --enable-pvs-studio Create a PVS-Studio.cfg file. + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-sia Disable SIA on Digital UNIX + --disable-largefile omit support for large files + --disable-pam-session Disable PAM session support + --enable-kerb5-instance instance string to append to the username (separated + by a slash) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-otp-only deprecated + --with-alertmail deprecated + --with-pc-insults deprecated + --with-devel add development options + --with-CC C compiler to use + --with-rpath deprecated, use --disable-rpath + --with-blibpath[=PATH] deprecated + --with-bsm-audit enable BSM audit support + --with-linux-audit enable Linux audit support + --with-solaris-audit enable Solaris audit support + --with-sssd enable SSSD support + --with-sssd-conf path to the SSSD config file + --with-sssd-lib path to the SSSD library + --with-incpath additional places to look for include files + --with-libpath additional places to look for libraries + --with-libraries additional libraries to link with + --with-efence link with -lefence for malloc() debugging + --with-csops add CSOps standard options + --without-passwd don't use passwd/shadow file for authentication + --with-skey[=DIR] enable S/Key support + --with-opie[=DIR] enable OPIE support + --with-long-otp-prompt use a two line OTP (skey/opie) prompt + --with-SecurID[=DIR] enable SecurID support + --with-fwtk[=DIR] enable FWTK AuthSRV support + --with-kerb5[=DIR] enable Kerberos V support + --with-aixauth enable AIX general authentication support + --with-pam enable PAM support + --with-AFS enable AFS support + --with-DCE enable DCE support + --with-logincap enable BSD login class support + --with-bsdauth enable BSD authentication support + --with-project enable Solaris project support + --without-lecture don't print lecture for first-time sudoer + --with-logging log via syslog, file, or both + --with-logfac syslog facility to log with (default is "auth") + --with-goodpri syslog priority for commands (def is "notice") + --with-badpri syslog priority for failures (def is "alert") + --with-logpath path to the sudo log file + --with-loglen maximum length of a log file line (default is 80) + --with-ignore-dot ignore '.' in the PATH + --without-mail-if-no-user + do not send mail if user not in sudoers + --with-mail-if-no-host send mail if user in sudoers but not for this host + --with-mail-if-noperms send mail if user not allowed to run command + --with-mailto who should get sudo mail (default is "root") + --with-mailsubject subject of sudo mail + --with-passprompt default password prompt + --with-badpass-message message the user sees when the password is wrong + --with-fqdn expect fully qualified hosts in sudoers + --with-timedir=DIR deprecated + --with-rundir=DIR directory for sudo-specific files that do not + survive a system reboot, e.g. `/var/run/sudo' + --with-vardir=DIR directory for sudo-specific files that survive a + system reboot, e.g. `/var/db/sudo' or + `/var/lib/sudo' + --with-iologdir=DIR directory to store sudo I/O log files in + --with-tzdir=DIR path to the time zone data directory + --with-sendmail set path to sendmail + --without-sendmail do not send mail at all + --with-sudoers-mode mode of sudoers file (defaults to 0440) + --with-sudoers-uid uid that owns sudoers file (defaults to 0) + --with-sudoers-gid gid that owns sudoers file (defaults to 0) + --with-umask umask with which the prog should run (default is + 022) + --without-umask Preserves the umask of the user invoking sudo. + --with-umask-override Use the umask specified in sudoers even if it is + less restrictive than the user's. + --with-runas-default User to run commands as (default is "root") + --with-exempt=group no passwd needed for users in this group + --with-editor=path Default editor for visudo (defaults to vi) + --with-env-editor Use the environment variable EDITOR for visudo + --with-passwd-tries number of tries to enter password (default is 3) + --with-timeout minutes before sudo asks for passwd again (def is 5 + minutes) + --with-password-timeout passwd prompt timeout in minutes (default is 5 + minutes) + --with-tty-tickets use a different ticket file for each tty + --with-insults insult the user for entering an incorrect password + --with-all-insults include all the sudo insult sets + --with-classic-insults include the insults from the "classic" sudo + --with-csops-insults include CSOps insults + --with-hal-insults include 2001-like insults + --with-goons-insults include the insults from the "Goon Show" + --with-python-insults include the insults from "Monty Python's Flying + Circus" + --with-nsswitch[=PATH] path to nsswitch.conf + --with-ldap[=DIR] enable LDAP support + --with-ldap-conf-file path to LDAP configuration file + --with-ldap-secret-file path to LDAP secret password file + --with-secure-path override the user's path with a built-in one + --without-interfaces don't try to read the ip addr of ether interfaces + --with-askpass=PATH Fully qualified pathname of askpass helper + --with-exampledir=DIR path to install sudo examples in + --with-plugindir=DIR set directory to load plugins from + --with-man manual pages use man macros + --with-mdoc manual pages use mdoc macros + --with-selinux enable SELinux support + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-libtool=PATH specify path to libtool + --with-noexec[=PATH] fully qualified pathname of sudo_noexec.so + --with-netsvc[=PATH] path to netsvc.conf + --with-pam-login enable specific PAM session for sudo -i + +Some influential environment variables: + SENDMAILPROG + The fully-qualified path to the sendmail program to use. + VIPROG The fully-qualified path to the vi program to use. + MVPROG The fully-qualified path to the mv program to use. + BSHELLPROG The fully-qualified path to the Bourne shell to use. + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + YACC The `Yet Another Compiler Compiler' implementation to use. + Defaults to the first program found out of: `bison -y', `byacc', + `yacc'. + YFLAGS The list of arguments that will be passed by default to $YACC. + This script will default YFLAGS to the empty string to avoid a + default value of `-d' given by some make applications. + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +utsudo configure 1.8.29 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------- ## +## Report this to https://bugzilla.sudo.ws/ ## +## ---------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by sudo $as_me 1.8.29, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +as_fn_append ac_header_list " sys/types.h" +as_fn_append ac_header_list " netgroup.h" +as_fn_append ac_header_list " paths.h" +as_fn_append ac_header_list " spawn.h" +as_fn_append ac_header_list " wordexp.h" +as_fn_append ac_header_list " sys/sockio.h" +as_fn_append ac_header_list " sys/bsdtypes.h" +as_fn_append ac_header_list " sys/select.h" +as_fn_append ac_header_list " sys/stropts.h" +as_fn_append ac_header_list " sys/sysmacros.h" +as_fn_append ac_header_list " sys/syscall.h" +as_fn_append ac_header_list " sys/statvfs.h" +as_fn_append ac_func_list " fexecve" +as_fn_append ac_func_list " killpg" +as_fn_append ac_func_list " nl_langinfo" +as_fn_append ac_func_list " pread" +as_fn_append ac_func_list " pwrite" +as_fn_append ac_func_list " openat" +as_fn_append ac_func_list " faccessat" +as_fn_append ac_func_list " wordexp" +as_fn_append ac_func_list " getauxval" +as_fn_append ac_func_list " seteuid" +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_config_headers="$ac_config_headers config.h pathnames.h" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Sudo version $PACKAGE_VERSION" >&5 +$as_echo "$as_me: Configuring Sudo version $PACKAGE_VERSION" >&6;} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# +# Begin initial values for man page substitution +# +iolog_dir=/var/log/sudo-io +rundir=/var/run/sudo +vardir=/var/adm/sudo +timeout=5 +password_timeout=5 +sudo_umask=0022 +umask_override=off +passprompt="Password: " +long_otp_prompt=off +lecture=once +logfac=auth +goodpri=notice +badpri=alert +loglen=80 +ignore_dot=off +mail_no_user=on +mail_no_host=off +mail_no_perms=off +mailto=root +mailsub="*** SECURITY information for %h ***" +badpass_message="Sorry, try again." +fqdn=off +runas_default=root +env_editor=on +env_reset=on +editor=vi +passwd_tries=3 +timestamp_type=tty +insults=off +root_sudo=on +path_info=on +ldap_conf=/etc/ldap.conf +ldap_secret=/etc/ldap.secret +netsvc_conf=/etc/netsvc.conf +noexec_file="$libexecdir/utsudo/sudo_noexec.so" +sesh_file="$libexecdir/utsudo/sesh" +nsswitch_conf=/etc/nsswitch.conf +secure_path="not set" +pam_session=on +pam_login_service=sudo +plugindir="$libexecdir/utsudo" +DIGEST=digest.lo +devsearch="/dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev" +# +# End initial values for man page substitution +# +INSTALL_BACKUP= +INSTALL_NOEXEC= +CHECK_NOEXEC= +exampledir='$(docdir)/examples' +devdir='$(srcdir)' +PROGS="sudo" +: ${MANDIRTYPE='man'} +: ${mansrcdir='.'} +: ${SHLIB_MODE='0644'} +: ${SUDOERS_MODE='0440'} +: ${SUDOERS_UID='0'} +: ${SUDOERS_GID='0'} +DEVEL= +LDAP="#" +BAMAN=0 +LCMAN=0 +PSMAN=0 +SEMAN=0 +LIBINTL= +LIBMD= +ZLIB= +ZLIB_SRC= +AUTH_OBJS= +AUTH_REG= +AUTH_EXCL= +AUTH_EXCL_DEF= +AUTH_DEF=passwd +SUDO_NLS=disabled +LOCALEDIR_SUFFIX= +LT_LDEXPORTS="-export-symbols \$(shlib_exp)" +LT_LDDEP="\$(shlib_exp)" +OS_INIT=os_init_common +INIT_SCRIPT= +INIT_DIR= +RC_LINK= +COMPAT_EXP= +SIGNAME= +WEAK_ALIAS=no +CHECKSHADOW=true +shadow_funcs= +shadow_libs= +TMPFILES_D= +CONFIGURE_ARGS="$@" + +RTLD_PRELOAD_VAR="LD_PRELOAD" +RTLD_PRELOAD_ENABLE_VAR= +RTLD_PRELOAD_DELIM=":" +RTLD_PRELOAD_DEFAULT= + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +# +# Prior to sudo 1.8.7, sudo stored libexec files in $libexecdir. +# Starting with sudo 1.8.7, $libexecdir/utsudo is used so strip +# off an extraneous "/sudo" from libexecdir. +# +case "$libexecdir" in + */sudo) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libexecdir should not include the \"sudo\" subdirectory" >&5 +$as_echo "$as_me: WARNING: libexecdir should not include the \"sudo\" subdirectory" >&2;} + libexecdir=`expr "$libexecdir" : '\\(.*\\)/sudo$'` + ;; +esac + + + +# Check whether --with-otp-only was given. +if test "${with_otp_only+set}" = set; then : + withval=$with_otp_only; case $with_otp_only in + yes) with_passwd="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: --with-otp-only option deprecated, treating as --without-passwd" >&5 +$as_echo "$as_me: --with-otp-only option deprecated, treating as --without-passwd" >&6;} + ;; +esac +fi + + + +# Check whether --with-alertmail was given. +if test "${with_alertmail+set}" = set; then : + withval=$with_alertmail; case $with_alertmail in + *) with_mailto="$with_alertmail" + { $as_echo "$as_me:${as_lineno-$LINENO}: --with-alertmail option deprecated, treating as --mailto" >&5 +$as_echo "$as_me: --with-alertmail option deprecated, treating as --mailto" >&6;} + ;; +esac +fi + + + +# Check whether --with-pc-insults was given. +if test "${with_pc_insults+set}" = set; then : + withval=$with_pc_insults; case $with_pc_insults in + yes) enable_offensive_insults=no + { $as_echo "$as_me:${as_lineno-$LINENO}: --with-pc-insults option deprecated, it is now the default" >&5 +$as_echo "$as_me: --with-pc-insults option deprecated, it is now the default" >&6;} + ;; + no) enable_offensive_insults=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: --without-pc-insults option deprecated, use --enable-offensive-insults" >&5 +$as_echo "$as_me: --without-pc-insults option deprecated, use --enable-offensive-insults" >&6;} + ;; +esac +fi + + + + +# Check whether --with-devel was given. +if test "${with_devel+set}" = set; then : + withval=$with_devel; case $with_devel in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: Setting up for development: -Wall, flex, yacc" >&5 +$as_echo "$as_me: Setting up for development: -Wall, flex, yacc" >&6;} + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -DSUDO_DEVEL "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -DSUDO_DEVEL"; } >&5 + (: CPPFLAGS already contains -DSUDO_DEVEL) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -DSUDO_DEVEL" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-DSUDO_DEVEL + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + DEVEL="true" + devdir=. + ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --with-devel: $with_devel" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --with-devel: $with_devel" >&2;} + ;; +esac +fi + + + +# Check whether --with-CC was given. +if test "${with_CC+set}" = set; then : + withval=$with_CC; case $with_CC in + *) as_fn_error $? "the --with-CC option is no longer supported, please set the CC environment variable instead." "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-rpath was given. +if test "${with_rpath+set}" = set; then : + withval=$with_rpath; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-rpath deprecated, rpath is now the default" >&5 +$as_echo "$as_me: WARNING: --with-rpath deprecated, rpath is now the default" >&2;} +fi + + + +# Check whether --with-blibpath was given. +if test "${with_blibpath+set}" = set; then : + withval=$with_blibpath; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-blibpath deprecated, use --with-libpath" >&5 +$as_echo "$as_me: WARNING: --with-blibpath deprecated, use --with-libpath" >&2;} +fi + + + +# Check whether --with-bsm-audit was given. +if test "${with_bsm_audit+set}" = set; then : + withval=$with_bsm_audit; case $with_bsm_audit in + yes) $as_echo "#define HAVE_BSM_AUDIT 1" >>confdefs.h + + SUDOERS_LIBS="${SUDOERS_LIBS} -lbsm" + SUDOERS_OBJS="${SUDOERS_OBJS} bsm_audit.lo" + ;; + no) ;; + *) as_fn_error $? "\"--with-bsm-audit does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-linux-audit was given. +if test "${with_linux_audit+set}" = set; then : + withval=$with_linux_audit; case $with_linux_audit in + yes) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int i = AUDIT_USER_CMD; (void)i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + $as_echo "#define HAVE_LINUX_AUDIT 1" >>confdefs.h + + SUDO_LIBS="${SUDO_LIBS} -laudit" + SUDOERS_LIBS="${SUDO_LIBS} -laudit" + SUDOERS_OBJS="${SUDOERS_OBJS} linux_audit.lo" + +else + + as_fn_error $? "unable to find AUDIT_USER_CMD in libaudit.h for --with-linux-audit" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + no) ;; + *) as_fn_error $? "\"--with-linux-audit does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-solaris-audit was given. +if test "${with_solaris_audit+set}" = set; then : + withval=$with_solaris_audit; case $with_solaris_audit in + yes) $as_echo "#define HAVE_SOLARIS_AUDIT 1" >>confdefs.h + + SUDOERS_LIBS="${SUDOERS_LIBS} -lbsm" + SUDOERS_OBJS="${SUDOERS_OBJS} solaris_audit.lo" + ;; + no) ;; + *) as_fn_error $? "\"--with-solaris-audit does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-sssd was given. +if test "${with_sssd+set}" = set; then : + withval=$with_sssd; case $with_sssd in + yes) SUDOERS_OBJS="${SUDOERS_OBJS} sssd.lo" + case "$SUDOERS_OBJS" in + *ldap_util.lo*) ;; + *) SUDOERS_OBJS="${SUDOERS_OBJS} ldap_util.lo";; + esac + $as_echo "#define HAVE_SSSD 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-sssd does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-sssd-conf was given. +if test "${with_sssd_conf+set}" = set; then : + withval=$with_sssd_conf; +fi + +sssd_conf="/etc/sssd/sssd.conf" +test -n "$with_sssd_conf" && sssd_conf="$with_sssd_conf" +cat >>confdefs.h <>confdefs.h <&5 +$as_echo "$as_me: Adding ${with_incpath} to CPPFLAGS" >&6;} + for i in ${with_incpath}; do + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${i} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${i}"; } >&5 + (: CPPFLAGS already contains -I${i}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${i}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${i} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + done + ;; +esac +fi + + + +# Check whether --with-libpath was given. +if test "${with_libpath+set}" = set; then : + withval=$with_libpath; case $with_libpath in + yes) as_fn_error $? "\"must give --with-libpath an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-libpath not supported.\"" "$LINENO" 5 + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: Adding ${with_libpath} to LDFLAGS" >&5 +$as_echo "$as_me: Adding ${with_libpath} to LDFLAGS" >&6;} + ;; +esac +fi + + + +# Check whether --with-libraries was given. +if test "${with_libraries+set}" = set; then : + withval=$with_libraries; case $with_libraries in + yes) as_fn_error $? "\"must give --with-libraries an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-libraries not supported.\"" "$LINENO" 5 + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: Adding ${with_libraries} to LIBS" >&5 +$as_echo "$as_me: Adding ${with_libraries} to LIBS" >&6;} + ;; +esac +fi + + + +# Check whether --with-efence was given. +if test "${with_efence+set}" = set; then : + withval=$with_efence; case $with_efence in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: Sudo will link with -lefence (Electric Fence)" >&5 +$as_echo "$as_me: Sudo will link with -lefence (Electric Fence)" >&6;} + LIBS="${LIBS} -lefence" + if test -f /usr/local/lib/libefence.a; then + with_libpath="${with_libpath} /usr/local/lib" + fi + ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --with-efence: $with_efence" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --with-efence: $with_efence" >&2;} + ;; +esac +fi + + + +# Check whether --with-csops was given. +if test "${with_csops+set}" = set; then : + withval=$with_csops; case $with_csops in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: Adding CSOps standard options" >&5 +$as_echo "$as_me: Adding CSOps standard options" >&6;} + CHECKSIA=false + with_ignore_dot=yes + insults=on + with_classic_insults=yes + with_csops_insults=yes + with_env_editor=yes + : ${mansectsu='8'} + : ${mansectform='5'} + ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --with-csops: $with_csops" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --with-csops: $with_csops" >&2;} + ;; +esac +fi + + + +# Check whether --with-passwd was given. +if test "${with_passwd+set}" = set; then : + withval=$with_passwd; case $with_passwd in + yes|no) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use shadow/passwd file authentication" >&5 +$as_echo_n "checking whether to use shadow/passwd file authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_passwd" >&5 +$as_echo "$with_passwd" >&6; } + AUTH_DEF="" + test "$with_passwd" = "yes" && AUTH_REG="$AUTH_REG passwd" + ;; + *) as_fn_error $? "\"Sorry, --with-passwd does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-skey was given. +if test "${with_skey+set}" = set; then : + withval=$with_skey; case $with_skey in + no) ;; + *) $as_echo "#define HAVE_SKEY 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to try S/Key authentication" >&5 +$as_echo_n "checking whether to try S/Key authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_REG="$AUTH_REG S/Key" + ;; +esac +fi + + + +# Check whether --with-opie was given. +if test "${with_opie+set}" = set; then : + withval=$with_opie; case $with_opie in + no) ;; + *) $as_echo "#define HAVE_OPIE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to try NRL OPIE authentication" >&5 +$as_echo_n "checking whether to try NRL OPIE authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_REG="$AUTH_REG NRL_OPIE" + ;; +esac +fi + + + +# Check whether --with-long-otp-prompt was given. +if test "${with_long_otp_prompt+set}" = set; then : + withval=$with_long_otp_prompt; case $with_long_otp_prompt in + yes) $as_echo "#define LONG_OTP_PROMPT 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use a two line prompt for OTP authentication" >&5 +$as_echo_n "checking whether to use a two line prompt for OTP authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + long_otp_prompt=on + ;; + no) long_otp_prompt=off + ;; + *) as_fn_error $? "\"--with-long-otp-prompt does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-SecurID was given. +if test "${with_SecurID+set}" = set; then : + withval=$with_SecurID; case $with_SecurID in + no) ;; + *) $as_echo "#define HAVE_SECURID 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use SecurID for authentication" >&5 +$as_echo_n "checking whether to use SecurID for authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_EXCL="$AUTH_EXCL SecurID" + ;; +esac +fi + + + +# Check whether --with-fwtk was given. +if test "${with_fwtk+set}" = set; then : + withval=$with_fwtk; case $with_fwtk in + no) ;; + *) $as_echo "#define HAVE_FWTK 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use FWTK AuthSRV for authentication" >&5 +$as_echo_n "checking whether to use FWTK AuthSRV for authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_EXCL="$AUTH_EXCL FWTK" + ;; +esac +fi + + + +# Check whether --with-kerb5 was given. +if test "${with_kerb5+set}" = set; then : + withval=$with_kerb5; case $with_kerb5 in + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to try Kerberos V authentication" >&5 +$as_echo_n "checking whether to try Kerberos V authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_REG="$AUTH_REG kerb5" + ;; +esac +fi + + + +# Check whether --with-aixauth was given. +if test "${with_aixauth+set}" = set; then : + withval=$with_aixauth; case $with_aixauth in + yes) AUTH_EXCL="$AUTH_EXCL AIX_AUTH";; + no) ;; + *) as_fn_error $? "\"--with-aixauth does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-pam was given. +if test "${with_pam+set}" = set; then : + withval=$with_pam; case $with_pam in + yes) AUTH_EXCL="$AUTH_EXCL PAM";; + no) ;; + *) as_fn_error $? "\"--with-pam does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-AFS was given. +if test "${with_AFS+set}" = set; then : + withval=$with_AFS; case $with_AFS in + yes) $as_echo "#define HAVE_AFS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to try AFS (kerberos) authentication" >&5 +$as_echo_n "checking whether to try AFS (kerberos) authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_REG="$AUTH_REG AFS" + ;; + no) ;; + *) as_fn_error $? "\"--with-AFS does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-DCE was given. +if test "${with_DCE+set}" = set; then : + withval=$with_DCE; case $with_DCE in + yes) $as_echo "#define HAVE_DCE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to try DCE (kerberos) authentication" >&5 +$as_echo_n "checking whether to try DCE (kerberos) authentication... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AUTH_REG="$AUTH_REG DCE" + ;; + no) ;; + *) as_fn_error $? "\"--with-DCE does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-logincap was given. +if test "${with_logincap+set}" = set; then : + withval=$with_logincap; case $with_logincap in + yes|no) ;; + *) as_fn_error $? "\"--with-logincap does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-bsdauth was given. +if test "${with_bsdauth+set}" = set; then : + withval=$with_bsdauth; case $with_bsdauth in + yes) AUTH_EXCL="$AUTH_EXCL BSD_AUTH";; + no) ;; + *) as_fn_error $? "\"--with-bsdauth does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-project was given. +if test "${with_project+set}" = set; then : + withval=$with_project; case $with_project in + yes|no) ;; + no) ;; + *) as_fn_error $? "\"--with-project does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to lecture users the first time they run sudo" >&5 +$as_echo_n "checking whether to lecture users the first time they run sudo... " >&6; } + +# Check whether --with-lecture was given. +if test "${with_lecture+set}" = set; then : + withval=$with_lecture; case $with_lecture in + yes|short|always) lecture=once + ;; + no|none|never) lecture=never + ;; + *) as_fn_error $? "\"unknown argument to --with-lecture: $with_lecture\"" "$LINENO" 5 + ;; +esac +fi + +if test "$lecture" = "once"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + $as_echo "#define NO_LECTURE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sudo should log via syslog or to a file by default" >&5 +$as_echo_n "checking whether sudo should log via syslog or to a file by default... " >&6; } + +# Check whether --with-logging was given. +if test "${with_logging+set}" = set; then : + withval=$with_logging; case $with_logging in + yes) as_fn_error $? "\"must give --with-logging an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-logging not supported.\"" "$LINENO" 5 + ;; + syslog) $as_echo "#define LOGGING SLOG_SYSLOG" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: syslog" >&5 +$as_echo "syslog" >&6; } + ;; + file) $as_echo "#define LOGGING SLOG_FILE" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: file" >&5 +$as_echo "file" >&6; } + ;; + both) $as_echo "#define LOGGING SLOG_BOTH" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: both" >&5 +$as_echo "both" >&6; } + ;; + *) as_fn_error $? "\"unknown argument to --with-logging: $with_logging\"" "$LINENO" 5 + ;; +esac +else + $as_echo "#define LOGGING SLOG_SYSLOG" >>confdefs.h + { $as_echo "$as_me:${as_lineno-$LINENO}: result: syslog" >&5 +$as_echo "syslog" >&6; } +fi + + + +# Check whether --with-logfac was given. +if test "${with_logfac+set}" = set; then : + withval=$with_logfac; case $with_logfac in + yes) as_fn_error $? "\"must give --with-logfac an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-logfac not supported.\"" "$LINENO" 5 + ;; + authpriv|auth|daemon|user|local0|local1|local2|local3|local4|local5|local6|local7) logfac=$with_logfac + ;; + *) as_fn_error $? "\"$with_logfac is not a supported syslog facility.\"" "$LINENO" 5 + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking at which syslog priority to log commands" >&5 +$as_echo_n "checking at which syslog priority to log commands... " >&6; } + +# Check whether --with-goodpri was given. +if test "${with_goodpri+set}" = set; then : + withval=$with_goodpri; case $with_goodpri in + yes) as_fn_error $? "\"must give --with-goodpri an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-goodpri not supported.\"" "$LINENO" 5 + ;; + alert|crit|debug|emerg|err|info|notice|warning) + goodpri=$with_goodpri + ;; + *) as_fn_error $? "\"$with_goodpri is not a supported syslog priority.\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define PRI_SUCCESS "$goodpri" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $goodpri" >&5 +$as_echo "$goodpri" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking at which syslog priority to log failures" >&5 +$as_echo_n "checking at which syslog priority to log failures... " >&6; } + +# Check whether --with-badpri was given. +if test "${with_badpri+set}" = set; then : + withval=$with_badpri; case $with_badpri in + yes) as_fn_error $? "\"must give --with-badpri an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-badpri not supported.\"" "$LINENO" 5 + ;; + alert|crit|debug|emerg|err|info|notice|warning) + badpri=$with_badpri + ;; + *) as_fn_error $? "$with_badpri is not a supported syslog priority." "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define PRI_FAILURE "$badpri" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $badpri" >&5 +$as_echo "$badpri" >&6; } + + +# Check whether --with-logpath was given. +if test "${with_logpath+set}" = set; then : + withval=$with_logpath; case $with_logpath in + yes) as_fn_error $? "\"must give --with-logpath an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-logpath not supported.\"" "$LINENO" 5 + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how long a line in the log file should be" >&5 +$as_echo_n "checking how long a line in the log file should be... " >&6; } + +# Check whether --with-loglen was given. +if test "${with_loglen+set}" = set; then : + withval=$with_loglen; case $with_loglen in + yes) as_fn_error $? "\"must give --with-loglen an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-loglen not supported.\"" "$LINENO" 5 + ;; + [0-9]*) loglen=$with_loglen + ;; + *) as_fn_error $? "\"you must enter a number, not $with_loglen\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define MAXLOGFILELEN $loglen +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $loglen" >&5 +$as_echo "$loglen" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sudo should ignore '.' or '' in \$PATH" >&5 +$as_echo_n "checking whether sudo should ignore '.' or '' in \$PATH... " >&6; } + +# Check whether --with-ignore-dot was given. +if test "${with_ignore_dot+set}" = set; then : + withval=$with_ignore_dot; case $with_ignore_dot in + yes) ignore_dot=on + ;; + no) ignore_dot=off + ;; + *) as_fn_error $? "\"--with-ignore-dot does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$ignore_dot" = "on"; then + $as_echo "#define IGNORE_DOT_PATH 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to send mail when a user is not in sudoers" >&5 +$as_echo_n "checking whether to send mail when a user is not in sudoers... " >&6; } + +# Check whether --with-mail-if-no-user was given. +if test "${with_mail_if_no_user+set}" = set; then : + withval=$with_mail_if_no_user; case $with_mail_if_no_user in + yes) mail_no_user=on + ;; + no) mail_no_user=off + ;; + *) as_fn_error $? "\"--with-mail-if-no-user does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$mail_no_user" = "on"; then + $as_echo "#define SEND_MAIL_WHEN_NO_USER 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to send mail when user listed but not for this host" >&5 +$as_echo_n "checking whether to send mail when user listed but not for this host... " >&6; } + +# Check whether --with-mail-if-no-host was given. +if test "${with_mail_if_no_host+set}" = set; then : + withval=$with_mail_if_no_host; case $with_mail_if_no_host in + yes) mail_no_host=on + ;; + no) mail_no_host=off + ;; + *) as_fn_error $? "\"--with-mail-if-no-host does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$mail_no_host" = "on"; then + $as_echo "#define SEND_MAIL_WHEN_NO_HOST 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to send mail when a user tries a disallowed command" >&5 +$as_echo_n "checking whether to send mail when a user tries a disallowed command... " >&6; } + +# Check whether --with-mail-if-noperms was given. +if test "${with_mail_if_noperms+set}" = set; then : + withval=$with_mail_if_noperms; case $with_mail_if_noperms in + yes) mail_noperms=on + ;; + no) mail_noperms=off + ;; + *) as_fn_error $? "\"--with-mail-if-noperms does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$mail_noperms" = "on"; then + $as_echo "#define SEND_MAIL_WHEN_NOT_OK 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking who should get the mail that sudo sends" >&5 +$as_echo_n "checking who should get the mail that sudo sends... " >&6; } + +# Check whether --with-mailto was given. +if test "${with_mailto+set}" = set; then : + withval=$with_mailto; case $with_mailto in + yes) as_fn_error $? "\"must give --with-mailto an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-mailto not supported.\"" "$LINENO" 5 + ;; + *) mailto=$with_mailto + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define MAILTO "$mailto" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mailto" >&5 +$as_echo "$mailto" >&6; } + + +# Check whether --with-mailsubject was given. +if test "${with_mailsubject+set}" = set; then : + withval=$with_mailsubject; case $with_mailsubject in + yes) as_fn_error $? "\"must give --with-mailsubject an argument.\"" "$LINENO" 5 + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sorry, --without-mailsubject not supported." >&5 +$as_echo "$as_me: WARNING: Sorry, --without-mailsubject not supported." >&2;} + ;; + *) mailsub="$with_mailsubject" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking sudo mail subject" >&5 +$as_echo_n "checking sudo mail subject... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using alert mail subject: $mailsub" >&5 +$as_echo "Using alert mail subject: $mailsub" >&6; } + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define MAILSUBJECT "$mailsub" +_ACEOF + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bad password prompt" >&5 +$as_echo_n "checking for bad password prompt... " >&6; } + +# Check whether --with-passprompt was given. +if test "${with_passprompt+set}" = set; then : + withval=$with_passprompt; case $with_passprompt in + yes) as_fn_error $? "\"must give --with-passprompt an argument.\"" "$LINENO" 5 + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sorry, --without-passprompt not supported." >&5 +$as_echo "$as_me: WARNING: Sorry, --without-passprompt not supported." >&2;} + ;; + *) passprompt="$with_passprompt" +esac +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $passprompt" >&5 +$as_echo "$passprompt" >&6; } + +cat >>confdefs.h <<_ACEOF +#define PASSPROMPT "$passprompt" +_ACEOF + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bad password message" >&5 +$as_echo_n "checking for bad password message... " >&6; } + +# Check whether --with-badpass-message was given. +if test "${with_badpass_message+set}" = set; then : + withval=$with_badpass_message; case $with_badpass_message in + yes) as_fn_error $? "\"Must give --with-badpass-message an argument.\"" "$LINENO" 5 + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sorry, --without-badpass-message not supported." >&5 +$as_echo "$as_me: WARNING: Sorry, --without-badpass-message not supported." >&2;} + ;; + *) badpass_message="$with_badpass_message" + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define INCORRECT_PASSWORD "$badpass_message" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $badpass_message" >&5 +$as_echo "$badpass_message" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to expect fully qualified hosts in sudoers" >&5 +$as_echo_n "checking whether to expect fully qualified hosts in sudoers... " >&6; } + +# Check whether --with-fqdn was given. +if test "${with_fqdn+set}" = set; then : + withval=$with_fqdn; case $with_fqdn in + yes) fqdn=on + ;; + no) fqdn=off + ;; + *) as_fn_error $? "\"--with-fqdn does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$fqdn" = "on"; then + $as_echo "#define FQDN 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check whether --with-timedir was given. +if test "${with_timedir+set}" = set; then : + withval=$with_timedir; case $with_timedir in + *) as_fn_error $? "\"--without-timedir no longer supported, see --with-rundir.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-rundir was given. +if test "${with_rundir+set}" = set; then : + withval=$with_rundir; case $with_rundir in + yes) as_fn_error $? "\"must give --with-rundir an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-rundir not supported.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-vardir was given. +if test "${with_vardir+set}" = set; then : + withval=$with_vardir; case $with_vardir in + yes) as_fn_error $? "\"must give --with-vardir an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-vardir not supported.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-iologdir was given. +if test "${with_iologdir+set}" = set; then : + withval=$with_iologdir; case $with_iologdir in + yes) ;; + no) as_fn_error $? "\"--without-iologdir not supported.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-tzdir was given. +if test "${with_tzdir+set}" = set; then : + withval=$with_tzdir; case $with_tzdir in + yes) as_fn_error $? "\"must give --with-tzdir an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-sendmail was given. +if test "${with_sendmail+set}" = set; then : + withval=$with_sendmail; case $with_sendmail in + yes) with_sendmail="" + ;; + no) ;; + *) cat >>confdefs.h <&5 +$as_echo_n "checking for umask programs should be run with... " >&6; } + +# Check whether --with-umask was given. +if test "${with_umask+set}" = set; then : + withval=$with_umask; case $with_umask in + yes) as_fn_error $? "\"must give --with-umask an argument.\"" "$LINENO" 5 + ;; + no) sudo_umask=0777 + ;; + [0-9]*) sudo_umask=$with_umask + ;; + *) as_fn_error $? "\"you must enter a numeric mask.\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define SUDO_UMASK $sudo_umask +_ACEOF + +if test "$sudo_umask" = "0777"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: user" >&5 +$as_echo "user" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_umask" >&5 +$as_echo "$sudo_umask" >&6; } +fi + + +# Check whether --with-umask-override was given. +if test "${with_umask_override+set}" = set; then : + withval=$with_umask_override; case $with_umask_override in + yes) $as_echo "#define UMASK_OVERRIDE 1" >>confdefs.h + + umask_override=on + ;; + no) umask_override=off + ;; + *) as_fn_error $? "\"--with-umask-override does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for default user to run commands as" >&5 +$as_echo_n "checking for default user to run commands as... " >&6; } + +# Check whether --with-runas-default was given. +if test "${with_runas_default+set}" = set; then : + withval=$with_runas_default; case $with_runas_default in + yes) as_fn_error $? "\"must give --with-runas-default an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-runas-default not supported.\"" "$LINENO" 5 + ;; + *) runas_default="$with_runas_default" + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define RUNAS_DEFAULT "$runas_default" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $runas_default" >&5 +$as_echo "$runas_default" >&6; } + + +# Check whether --with-exempt was given. +if test "${with_exempt+set}" = set; then : + withval=$with_exempt; case $with_exempt in + yes) as_fn_error $? "\"must give --with-exempt an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-exempt not supported.\"" "$LINENO" 5 + ;; + *) +cat >>confdefs.h <<_ACEOF +#define EXEMPTGROUP "$with_exempt" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for group to be exempt from password" >&5 +$as_echo_n "checking for group to be exempt from password... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_exempt" >&5 +$as_echo "$with_exempt" >&6; } + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for editor that visudo should use" >&5 +$as_echo_n "checking for editor that visudo should use... " >&6; } + +# Check whether --with-editor was given. +if test "${with_editor+set}" = set; then : + withval=$with_editor; case $with_editor in + yes) as_fn_error $? "\"must give --with-editor an argument.\"" "$LINENO" 5 + ;; + no) as_fn_error $? "\"--without-editor not supported.\"" "$LINENO" 5 + ;; + *) +cat >>confdefs.h <<_ACEOF +#define EDITOR "$with_editor" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_editor" >&5 +$as_echo "$with_editor" >&6; } + editor="$with_editor" + ;; +esac +else + $as_echo "#define EDITOR _PATH_VI" >>confdefs.h + { $as_echo "$as_me:${as_lineno-$LINENO}: result: vi" >&5 +$as_echo "vi" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to obey EDITOR and VISUAL environment variables" >&5 +$as_echo_n "checking whether to obey EDITOR and VISUAL environment variables... " >&6; } + +# Check whether --with-env-editor was given. +if test "${with_env_editor+set}" = set; then : + withval=$with_env_editor; case $with_env_editor in + yes) env_editor=on + ;; + no) env_editor=off + ;; + *) as_fn_error $? "\"--with-env-editor does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$env_editor" = "on"; then + $as_echo "#define ENV_EDITOR 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking number of tries a user gets to enter their password" >&5 +$as_echo_n "checking number of tries a user gets to enter their password... " >&6; } + +# Check whether --with-passwd-tries was given. +if test "${with_passwd_tries+set}" = set; then : + withval=$with_passwd_tries; case $with_passwd_tries in + yes) ;; + no) as_fn_error $? "\"--without-editor not supported.\"" "$LINENO" 5 + ;; + [1-9]*) passwd_tries=$with_passwd_tries + ;; + *) as_fn_error $? "\"you must enter the numer of tries, > 0\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define TRIES_FOR_PASSWORD $passwd_tries +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $passwd_tries" >&5 +$as_echo "$passwd_tries" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking time in minutes after which sudo will ask for a password again" >&5 +$as_echo_n "checking time in minutes after which sudo will ask for a password again... " >&6; } + +# Check whether --with-timeout was given. +if test "${with_timeout+set}" = set; then : + withval=$with_timeout; case $with_timeout in + yes) ;; + no) timeout=0 + ;; + [0-9]*) timeout=$with_timeout + ;; + *) as_fn_error $? "\"you must enter the numer of minutes.\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define TIMEOUT $timeout +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $timeout" >&5 +$as_echo "$timeout" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking time in minutes after the password prompt will time out" >&5 +$as_echo_n "checking time in minutes after the password prompt will time out... " >&6; } + +# Check whether --with-password-timeout was given. +if test "${with_password_timeout+set}" = set; then : + withval=$with_password_timeout; case $with_password_timeout in + yes) ;; + no) password_timeout=0 + ;; + [0-9]*) password_timeout=$with_password_timeout + ;; + *) as_fn_error $? "\"you must enter the numer of minutes.\"" "$LINENO" 5 + ;; +esac +fi + + +cat >>confdefs.h <<_ACEOF +#define PASSWORD_TIMEOUT $password_timeout +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $password_timeout" >&5 +$as_echo "$password_timeout" >&6; } + + +# Check whether --with-tty-tickets was given. +if test "${with_tty_tickets+set}" = set; then : + withval=$with_tty_tickets; case $with_tty_tickets in + yes) timestamp_type=tty + ;; + no) timestamp_type=global + ;; + *) as_fn_error $? "\"--with-tty-tickets does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to include insults" >&5 +$as_echo_n "checking whether to include insults... " >&6; } + +# Check whether --with-insults was given. +if test "${with_insults+set}" = set; then : + withval=$with_insults; case $with_insults in + yes) insults=on + with_classic_insults=yes + with_csops_insults=yes + ;; + disabled) insults=off + with_classic_insults=yes + with_csops_insults=yes + ;; + no) insults=off + ;; + *) as_fn_error $? "\"--with-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + +if test "$insults" = "on"; then + $as_echo "#define USE_INSULTS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check whether --with-all-insults was given. +if test "${with_all_insults+set}" = set; then : + withval=$with_all_insults; case $with_all_insults in + yes) with_classic_insults=yes + with_csops_insults=yes + with_hal_insults=yes + with_goons_insults=yes + with_python_insults=yes + ;; + no) ;; + *) as_fn_error $? "\"--with-all-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-classic-insults was given. +if test "${with_classic_insults+set}" = set; then : + withval=$with_classic_insults; case $with_classic_insults in + yes) $as_echo "#define CLASSIC_INSULTS 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-classic-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-csops-insults was given. +if test "${with_csops_insults+set}" = set; then : + withval=$with_csops_insults; case $with_csops_insults in + yes) $as_echo "#define CSOPS_INSULTS 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-csops-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-hal-insults was given. +if test "${with_hal_insults+set}" = set; then : + withval=$with_hal_insults; case $with_hal_insults in + yes) $as_echo "#define HAL_INSULTS 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-hal-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-goons-insults was given. +if test "${with_goons_insults+set}" = set; then : + withval=$with_goons_insults; case $with_goons_insults in + yes) $as_echo "#define GOONS_INSULTS 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-goons-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-python-insults was given. +if test "${with_python_insults+set}" = set; then : + withval=$with_python_insults; case $with_python_insults in + yes) $as_echo "#define PYTHON_INSULTS 1" >>confdefs.h + + ;; + no) ;; + *) as_fn_error $? "\"--with-python-insults does not take an argument.\"" "$LINENO" 5 + ;; +esac +fi + + + +# Check whether --with-nsswitch was given. +if test "${with_nsswitch+set}" = set; then : + withval=$with_nsswitch; case $with_nsswitch in + no) ;; + yes) with_nsswitch="/etc/nsswitch.conf" + ;; + *) ;; +esac +fi + + + +# Check whether --with-ldap was given. +if test "${with_ldap+set}" = set; then : + withval=$with_ldap; case $with_ldap in + no) ;; + *) $as_echo "#define HAVE_LDAP 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use sudoers from LDAP" >&5 +$as_echo_n "checking whether to use sudoers from LDAP... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; +esac +fi + + + +# Check whether --with-ldap-conf-file was given. +if test "${with_ldap_conf_file+set}" = set; then : + withval=$with_ldap_conf_file; +fi + +test -n "$with_ldap_conf_file" && ldap_conf="$with_ldap_conf_file" +cat >>confdefs.h <>confdefs.h <&5 +$as_echo_n "checking which insult sets to include... " >&6; } + i="" + test "$with_python_insults" = "yes" && i="python ${i}" + test "$with_goons_insults" = "yes" && i="goons ${i}" + test "$with_hal_insults" = "yes" && i="hal ${i}" + test "$with_csops_insults" = "yes" && i="csops ${i}" + test "$with_classic_insults" = "yes" && i="classic ${i}" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 +$as_echo "$i" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to override the user's path" >&5 +$as_echo_n "checking whether to override the user's path... " >&6; } + +# Check whether --with-secure-path was given. +if test "${with_secure_path+set}" = set; then : + withval=$with_secure_path; case $with_secure_path in + yes) with_secure_path="/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc" + cat >>confdefs.h <<_ACEOF +#define SECURE_PATH "$with_secure_path" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_secure_path" >&5 +$as_echo "$with_secure_path" >&6; } + secure_path="set to $with_secure_path" + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) cat >>confdefs.h <<_ACEOF +#define SECURE_PATH "$with_secure_path" +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_secure_path" >&5 +$as_echo "$with_secure_path" >&6; } + secure_path="set to F<$with_secure_path>" + ;; +esac +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to get ip addresses from the network interfaces" >&5 +$as_echo_n "checking whether to get ip addresses from the network interfaces... " >&6; } + +# Check whether --with-interfaces was given. +if test "${with_interfaces+set}" = set; then : + withval=$with_interfaces; case $with_interfaces in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + no) $as_echo "#define STUB_LOAD_INTERFACES 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) as_fn_error $? "\"--with-interfaces does not take an argument.\"" "$LINENO" 5 + ;; +esac +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use an askpass helper" >&5 +$as_echo_n "checking whether to use an askpass helper... " >&6; } + +# Check whether --with-askpass was given. +if test "${with_askpass+set}" = set; then : + withval=$with_askpass; case $with_askpass in + yes) as_fn_error $? "\"--with-askpass takes a path as an argument.\"" "$LINENO" 5 + ;; + no) ;; + *) ;; +esac +else + + with_askpass=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi + +if test X"$with_askpass" != X"no"; then + cat >>confdefs.h <>confdefs.h <&5 +$as_echo_n "checking whether to do user authentication by default... " >&6; } +# Check whether --enable-authentication was given. +if test "${enable_authentication+set}" = set; then : + enableval=$enable_authentication; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + $as_echo "#define NO_AUTHENTICATION 1" >>confdefs.h + + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-authentication: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-authentication: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable running the mailer as root" >&5 +$as_echo_n "checking whether to disable running the mailer as root... " >&6; } +# Check whether --enable-root-mailer was given. +if test "${enable_root_mailer+set}" = set; then : + enableval=$enable_root_mailer; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define NO_ROOT_MAILER 1" >>confdefs.h + + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-root-mailer: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-root-mailer: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check whether --enable-setreuid was given. +if test "${enable_setreuid+set}" = set; then : + enableval=$enable_setreuid; case "$enableval" in + no) SKIP_SETREUID=yes + ;; + *) ;; + esac + +fi + + +# Check whether --enable-setresuid was given. +if test "${enable_setresuid+set}" = set; then : + enableval=$enable_setresuid; case "$enableval" in + no) SKIP_SETRESUID=yes + ;; + *) ;; + esac + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable shadow password support" >&5 +$as_echo_n "checking whether to disable shadow password support... " >&6; } +# Check whether --enable-shadow was given. +if test "${enable_shadow+set}" = set; then : + enableval=$enable_shadow; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CHECKSHADOW="false" + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-shadow: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-shadow: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether root should be allowed to use sudo" >&5 +$as_echo_n "checking whether root should be allowed to use sudo... " >&6; } +# Check whether --enable-root-sudo was given. +if test "${enable_root_sudo+set}" = set; then : + enableval=$enable_root_sudo; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + no) $as_echo "#define NO_ROOT_SUDO 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + root_sudo=off + ;; + *) as_fn_error $? "\"--enable-root-sudo does not take an argument.\"" "$LINENO" 5 + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to log the hostname in the log file" >&5 +$as_echo_n "checking whether to log the hostname in the log file... " >&6; } +# Check whether --enable-log-host was given. +if test "${enable_log_host+set}" = set; then : + enableval=$enable_log_host; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HOST_IN_LOG 1" >>confdefs.h + + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-log-host: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-log-host: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to invoke a shell if sudo is given no arguments" >&5 +$as_echo_n "checking whether to invoke a shell if sudo is given no arguments... " >&6; } +# Check whether --enable-noargs-shell was given. +if test "${enable_noargs_shell+set}" = set; then : + enableval=$enable_noargs_shell; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define SHELL_IF_NO_ARGS 1" >>confdefs.h + + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-noargs-shell: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-noargs-shell: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to set \$HOME to target user in shell mode" >&5 +$as_echo_n "checking whether to set \$HOME to target user in shell mode... " >&6; } +# Check whether --enable-shell-sets-home was given. +if test "${enable_shell_sets_home+set}" = set; then : + enableval=$enable_shell_sets_home; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define SHELL_SETS_HOME 1" >>confdefs.h + + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-shell-sets-home: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-shell-sets-home: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable 'command not found' messages" >&5 +$as_echo_n "checking whether to disable 'command not found' messages... " >&6; } +# Check whether --enable-path_info was given. +if test "${enable_path_info+set}" = set; then : + enableval=$enable_path_info; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define DONT_LEAK_PATH_INFO 1" >>confdefs.h + + path_info=off + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-path-info: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-path-info: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable environment debugging" >&5 +$as_echo_n "checking whether to enable environment debugging... " >&6; } +# Check whether --enable-env_debug was given. +if test "${enable_env_debug+set}" = set; then : + enableval=$enable_env_debug; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define ENV_DEBUG 1" >>confdefs.h + + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-env-debug: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-env-debug: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check whether --enable-zlib was given. +if test "${enable_zlib+set}" = set; then : + enableval=$enable_zlib; +else + enable_zlib=yes +fi + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -DZLIB_CONST "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -DZLIB_CONST"; } >&5 + (: CPPFLAGS already contains -DZLIB_CONST) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -DZLIB_CONST" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-DZLIB_CONST + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable environment resetting by default" >&5 +$as_echo_n "checking whether to enable environment resetting by default... " >&6; } +# Check whether --enable-env_reset was given. +if test "${enable_env_reset+set}" = set; then : + enableval=$enable_env_reset; case "$enableval" in + yes) env_reset=on + ;; + no) env_reset=off + ;; + *) env_reset=on + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-env-reset: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-env-reset: $enableval" >&2;} + ;; + esac + +fi + +if test "$env_reset" = "on"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define ENV_RESET 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + $as_echo "#define ENV_RESET 0" >>confdefs.h + +fi + +# Check whether --enable-warnings was given. +if test "${enable_warnings+set}" = set; then : + enableval=$enable_warnings; case "$enableval" in + yes) ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-warnings: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-warnings: $enableval" >&2;} + ;; + esac + +fi + + +# Check whether --enable-werror was given. +if test "${enable_werror+set}" = set; then : + enableval=$enable_werror; case "$enableval" in + yes) ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-werror: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-werror: $enableval" >&2;} + ;; + esac + +fi + + +# Check whether --enable-openssl was given. +if test "${enable_openssl+set}" = set; then : + enableval=$enable_openssl; case $enableval in + no) ;; + *) LIBMD="-lcrypto" + DIGEST=digest_openssl.lo + $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h + + if test "$enableval" != "yes"; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${enableval}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${enableval}/include"; } >&5 + (: CPPFLAGS already contains -I${enableval}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${enableval}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${enableval}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${enableval}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${enableval}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${enableval}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${enableval}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${enableval}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${enableval}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${enableval}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${enableval}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${enableval}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${enableval}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + fi + ;; + esac + +fi + + +# Check whether --enable-gcrypt was given. +if test "${enable_gcrypt+set}" = set; then : + enableval=$enable_gcrypt; case $enableval in + no) ;; + *) LIBMD="-lgcrypt" + DIGEST=digest_gcrypt.lo + $as_echo "#define HAVE_GCRYPT 1" >>confdefs.h + + if test "$enableval" != "yes"; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${enableval}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${enableval}/include"; } >&5 + (: CPPFLAGS already contains -I${enableval}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${enableval}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${enableval}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${enableval}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${enableval}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${enableval}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${enableval}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${enableval}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${enableval}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${enableval}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${enableval}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${enableval}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${enableval}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + fi + ;; + esac + +fi + + +# Check whether --enable-hardening was given. +if test "${enable_hardening+set}" = set; then : + enableval=$enable_hardening; +else + enable_hardening=yes +fi + + +# Check whether --enable-pie was given. +if test "${enable_pie+set}" = set; then : + enableval=$enable_pie; +fi + + +# Check whether --enable-asan was given. +if test "${enable_asan+set}" = set; then : + enableval=$enable_asan; +fi + + +# Check whether --enable-poll was given. +if test "${enable_poll+set}" = set; then : + enableval=$enable_poll; +fi + + +# Check whether --enable-admin-flag was given. +if test "${enable_admin_flag+set}" = set; then : + enableval=$enable_admin_flag; case "$enableval" in + yes) $as_echo "#define USE_ADMIN_FLAG 1" >>confdefs.h + + ;; + no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-admin-flag: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-admin-flag: $enableval" >&2;} + ;; + esac + +fi + + +# Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; +else + enable_nls=yes +fi + + +# Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; +else + enable_rpath=yes +fi + + +# Check whether --enable-static-sudoers was given. +if test "${enable_static_sudoers+set}" = set; then : + enableval=$enable_static_sudoers; +else + enable_static_sudoers=no +fi + + +# Check whether --enable-shared_libutil was given. +if test "${enable_shared_libutil+set}" = set; then : + enableval=$enable_shared_libutil; +else + enable_shared_libutil=yes +fi + + +# Check whether --enable-tmpfiles.d was given. +if test "${enable_tmpfiles_d+set}" = set; then : + enableval=$enable_tmpfiles_d; case $enableval in + yes) TMPFILES_D=/usr/lib/tmpfiles.d + ;; + no) TMPFILES_D= + ;; + *) TMPFILES_D="$enableval" +esac +else + + test -f /usr/lib/tmpfiles.d/systemd.conf && TMPFILES_D=/usr/lib/tmpfiles.d + +fi + + +# Check whether --enable-devsearch was given. +if test "${enable_devsearch+set}" = set; then : + enableval=$enable_devsearch; case $enableval in + yes) # use default value + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring attempt to disable the device search path" >&5 +$as_echo "$as_me: WARNING: Ignoring attempt to disable the device search path" >&2;} + ;; + *) devsearch="$enableval" + ;; +esac +fi + +ds="`echo \"$devsearch\"|sed 's@/dev/*\([^:]*:*\)@_PATH_DEV \"\1\" @g'`" +cat >>confdefs.h <>confdefs.h + + SUDO_LIBS="${SUDO_LIBS} -lselinux" + SUDO_OBJS="${SUDO_OBJS} selinux.o" + PROGS="${PROGS} sesh" + SEMAN=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setkeycreatecon in -lselinux" >&5 +$as_echo_n "checking for setkeycreatecon in -lselinux... " >&6; } +if ${ac_cv_lib_selinux_setkeycreatecon+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lselinux $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char setkeycreatecon (); +int +main () +{ +return setkeycreatecon (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_selinux_setkeycreatecon=yes +else + ac_cv_lib_selinux_setkeycreatecon=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_setkeycreatecon" >&5 +$as_echo "$ac_cv_lib_selinux_setkeycreatecon" >&6; } +if test "x$ac_cv_lib_selinux_setkeycreatecon" = xyes; then : + $as_echo "#define HAVE_SETKEYCREATECON 1" >>confdefs.h + +fi + + ;; + no) ;; + *) as_fn_error $? "\"--with-selinux does not take an argument.\"" "$LINENO" 5 + ;; +esac +else + with_selinux=no +fi + + +# Check whether --enable-sasl was given. +if test "${enable_sasl+set}" = set; then : + enableval=$enable_sasl; case "$enableval" in + yes|no) ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-sasl: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-sasl: $enableval" >&2;} + ;; + esac + +fi + + +# Check whether --enable-timestamp-type was given. +if test "${enable_timestamp_type+set}" = set; then : + enableval=$enable_timestamp_type; case "$enableval" in + global|ppid|tty) + timestamp_type=$enableval + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-timestamp-type: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-timestamp-type: $enableval" >&2;} + ;; + esac + +fi + +cat >>confdefs.h <<_ACEOF +#define TIMESTAMP_TYPE $timestamp_type +_ACEOF + + +# Check whether --enable-offensive_insults was given. +if test "${enable_offensive_insults+set}" = set; then : + enableval=$enable_offensive_insults; +else + enable_offensive_insults=no +fi + +if test "$enable_offensive_insults" = "yes"; then + $as_echo "#define OFFENSIVE_INSULTS 1" >>confdefs.h + +fi + +# Check whether --enable-package_build was given. +if test "${enable_package_build+set}" = set; then : + enableval=$enable_package_build; +else + enable_package_build=no +fi + + +# Check whether --enable-gss_krb5_ccache_name was given. +if test "${enable_gss_krb5_ccache_name+set}" = set; then : + enableval=$enable_gss_krb5_ccache_name; check_gss_krb5_ccache_name=$enableval +else + check_gss_krb5_ccache_name=no +fi + + +# Check whether --enable-pvs-studio was given. +if test "${enable_pvs_studio+set}" = set; then : + enableval=$enable_pvs_studio; +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if ${ac_cv_search_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_strerror+:} false; then : + break +fi +done +if ${ac_cv_search_strerror+:} false; then : + +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test X"$AR" = X"false"; then + as_fn_error $? "the \"ar\" utility is required to build sudo" "$LINENO" 5 +fi + +if test "x$ac_cv_prog_cc_c89" = "xno"; then + as_fn_error $? "Sudo version $PACKAGE_VERSION requires an ANSI C compiler to build." "$LINENO" 5 +fi + +if test "$enable_static" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring --disable-static, sudo does not install static libs" >&5 +$as_echo "$as_me: WARNING: Ignoring --disable-static, sudo does not install static libs" >&2;} + enable_static=yes +fi + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +case "$host_os" in +aix4.[23]|aix4.[23].*|aix[5-9]*) + +if ${LDFLAGS+:} false; then : + + case " $LDFLAGS " in #( + *" -Wl,-brtl "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains -Wl,-brtl"; } >&5 + (: LDFLAGS already contains -Wl,-brtl) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " -Wl,-brtl" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS=-Wl,-brtl + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + ;; +esac + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +enable_dlopen=yes + + + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + fix_hardcoded_libdir_flag_spec= + fix_hardcoded_libdir_flag_spec_ld= + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + module_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + else + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + module_cmds='$LD -b -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir $fix_hardcoded_libdir_flag' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + # gcc-3.0.1 (collect2) breaks on -Wl,+cdp. + # HP-cc ignores -Wl,+cdp, and we test the linker for +cdp support. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if +cdp linker flag works" >&5 +$as_echo_n "checking if +cdp linker flag works... " >&6; } +if ${lt_cv_ldflag_cdp_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ldflag_cdp_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,+cdp -Wl,/usr/lib/libc.1:/nonexistent -Wl,+cdp -Wl,/lib/libc.1:/nonexistent" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ldflag_cdp_works=yes +else + lt_cv_ldflag_cdp_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ldflag_cdp_works" >&5 +$as_echo "$lt_cv_ldflag_cdp_works" >&6; } + if test "$lt_cv_ldflag_cdp_works" = yes; then + fix_hardcoded_libdir_flag_spec='${wl}+cdp ${wl}${linkdir}/${dlname}:${libdir}/${dlname}' + fix_hardcoded_libdir_flag_spec_ld='+cdp ${linkdir}/${dlname}:${libdir}/${dlname}' + fi + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + module_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + module_cmds='$CC -shared $pic_flag $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + module_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + module_cmds='$CC -b -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + module_cmds='$CC -b $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + module_cmds='$CC -b -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + +else + + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + module_cmds='$LD -b -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir $fix_hardcoded_libdir_flag' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + # gcc-3.0.1 (collect2) breaks on -Wl,+cdp. + # HP-cc ignores -Wl,+cdp, and we test the linker for +cdp support. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if +cdp linker flag works" >&5 +$as_echo_n "checking if +cdp linker flag works... " >&6; } +if ${lt_cv_ldflag_cdp_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ldflag_cdp_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,+cdp -Wl,/usr/lib/libc.1:/nonexistent -Wl,+cdp -Wl,/lib/libc.1:/nonexistent" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ldflag_cdp_works=yes +else + lt_cv_ldflag_cdp_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ldflag_cdp_works" >&5 +$as_echo "$lt_cv_ldflag_cdp_works" >&6; } + if test "$lt_cv_ldflag_cdp_works" = yes; then + fix_hardcoded_libdir_flag_spec='${wl}+cdp ${wl}${linkdir}/${dlname}:${libdir}/${dlname}' + fix_hardcoded_libdir_flag_spec_ld='+cdp ${linkdir}/${dlname}:${libdir}/${dlname}' + fi + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test -z "$fix_hardcoded_libdir_flag_spec" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + +# Check whether --with-libtool was given. +if test "${with_libtool+set}" = set; then : + withval=$with_libtool; case $with_libtool in + yes|builtin) ;; + no) as_fn_error $? "\"--without-libtool not supported.\"" "$LINENO" 5 + ;; + system) LIBTOOL=libtool + ;; + *) LIBTOOL="$with_libtool" + ;; +esac +fi + + +if test "$enable_shared" = "no"; then + with_noexec=no + enable_dlopen=no + lt_cv_dlopen=none + lt_cv_dlopen_libs= + ac_cv_func_dlopen=no + LT_LDFLAGS=-static +fi +LIBDL="$lt_cv_dlopen_libs" +SHLIB_ENABLE="$enable_dlopen" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking path to sudo_noexec.so" >&5 +$as_echo_n "checking path to sudo_noexec.so... " >&6; } + +# Check whether --with-noexec was given. +if test "${with_noexec+set}" = set; then : + withval=$with_noexec; case $with_noexec in + yes) ;; + no) ;; + *) noexec_file="$with_noexec" + ;; +esac +else + with_noexec="$noexec_file" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_noexec" >&5 +$as_echo "$with_noexec" >&6; } +NOEXECFILE="sudo_noexec.so" +NOEXECDIR="`echo $noexec_file|sed -e 's:^${\([^}]*\)}:$(\1):' -e 's:^\(.*\)/[^/]*:\1:'`" + +# Extract the first word of "uname", so it can be a program name with args. +set dummy uname; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_UNAMEPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $UNAMEPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_UNAMEPROG="$UNAMEPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_UNAMEPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_UNAMEPROG" && ac_cv_path_UNAMEPROG="uname" + ;; +esac +fi +UNAMEPROG=$ac_cv_path_UNAMEPROG +if test -n "$UNAMEPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNAMEPROG" >&5 +$as_echo "$UNAMEPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "tr", so it can be a program name with args. +set dummy tr; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_TRPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $TRPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_TRPROG="$TRPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_TRPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_TRPROG" && ac_cv_path_TRPROG="tr" + ;; +esac +fi +TRPROG=$ac_cv_path_TRPROG +if test -n "$TRPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRPROG" >&5 +$as_echo "$TRPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "mandoc", so it can be a program name with args. +set dummy mandoc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MANDOCPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MANDOCPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_MANDOCPROG="$MANDOCPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MANDOCPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_MANDOCPROG" && ac_cv_path_MANDOCPROG="mandoc" + ;; +esac +fi +MANDOCPROG=$ac_cv_path_MANDOCPROG +if test -n "$MANDOCPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANDOCPROG" >&5 +$as_echo "$MANDOCPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "$MANDOCPROG" != "mandoc"; then + : ${MANTYPE='mdoc'} +else + # Extract the first word of "nroff", so it can be a program name with args. +set dummy nroff; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_NROFFPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $NROFFPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFFPROG="$NROFFPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_NROFFPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +NROFFPROG=$ac_cv_path_NROFFPROG +if test -n "$NROFFPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NROFFPROG" >&5 +$as_echo "$NROFFPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test -n "$NROFFPROG"; then + test -n "$MANTYPE" && sudo_cv_var_mantype="$MANTYPE" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which macro set to use for manual pages" >&5 +$as_echo_n "checking which macro set to use for manual pages... " >&6; } +if ${sudo_cv_var_mantype+:} false; then : + $as_echo_n "(cached) " >&6 +else + + sudo_cv_var_mantype="man" + echo ".Sh NAME" > conftest + echo ".Nm sudo" >> conftest + echo ".Nd sudo" >> conftest + echo ".Sh DESCRIPTION" >> conftest + echo "sudo" >> conftest + if $NROFFPROG -mdoc conftest >/dev/null 2>&1; then + sudo_cv_var_mantype="mdoc" + fi + rm -f conftest + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_mantype" >&5 +$as_echo "$sudo_cv_var_mantype" >&6; } + MANTYPE="$sudo_cv_var_mantype" + else + : ${MANTYPE='mdoc'} + fi +fi + +if test -n "$sudo_cv_prev_host"; then + if test "$sudo_cv_prev_host" != "$host"; then + as_fn_error $? "config.cache was created on a different host; remove it and re-run configure." "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking previous host type" >&5 +$as_echo_n "checking previous host type... " >&6; } + if ${sudo_cv_prev_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + sudo_cv_prev_host="$host" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_prev_host" >&5 +$as_echo "$sudo_cv_prev_host" >&6; } + fi +else + # this will produce no output since there is no cached value + if ${sudo_cv_prev_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + sudo_cv_prev_host="$host" +fi + +fi + +if test -n "$host_os"; then + OS=`echo $host_os | sed 's/[0-9].*//'` + OSREV=`echo $host_os | sed 's/^[^0-9\.]*\([0-9\.]*\).*$/\1/'` + OSMAJOR=`echo $OSREV | sed 's/\..*$//'` +else + OS="unknown" + OSREV=0 + OSMAJOR=0 +fi + +case "$host" in + *-*-solaris2*) + $as_echo "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + + # LD_PRELOAD is space-delimited + RTLD_PRELOAD_DELIM=" " + + # Solaris-specific initialization + OS_INIT=os_init_solaris + SUDO_OBJS="${SUDO_OBJS} solaris.o" + + # AFS support needs -lucb + if test "$with_AFS" = "yes"; then + AFS_LIBS="-lc -lucb" + fi + : ${mansectsu='1m'} + : ${mansectform='4'} + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + for ac_func in priv_set +do : + ac_fn_c_check_func "$LINENO" "priv_set" "ac_cv_func_priv_set" +if test "x$ac_cv_func_priv_set" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PRIV_SET 1 +_ACEOF + PSMAN=1 +fi +done + + ;; + *-*-aix*) + $as_echo "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + + # To get all prototypes (so we pass -Wall) + $as_echo "#define _LINUX_SOURCE_COMPAT 1" >>confdefs.h + + + # For AIX we build in support for both LAM and PAM + # and choose which to use based on auth_type in + # /etc/security/login.cfg + if test X"${with_pam}${with_aixauth}" = X""; then + AUTH_EXCL_DEF="AIX_AUTH PAM" + fi + + # AIX analog of nsswitch.conf, enabled by default + +# Check whether --with-netsvc was given. +if test "${with_netsvc+set}" = set; then : + withval=$with_netsvc; case $with_netsvc in + no) ;; + yes) with_netsvc="/etc/netsvc.conf" + ;; + *) ;; + esac +fi + + if test -z "$with_nsswitch" -a -z "$with_netsvc"; then + with_netsvc="/etc/netsvc.conf" + fi + + # LDR_PRELOAD is only supported in AIX 5.3 and later + case "$OSREV" in + [1-4].*) with_noexec=no;; + 5.[1-2]*) with_noexec=no;; + *) RTLD_PRELOAD_VAR="LDR_PRELOAD";; + esac + + # strnlen/strndup may be broken on AIX < 6 depending + # on the libc version, use our own. + if test $OSMAJOR -lt 6; then + ac_cv_func_strnlen=no + fi + + # getdelim() may or may not be present on AIX <= 6.1. + # bos610 is missing getdelim but bos61J has it. + if test "$enable_package_build" = "yes"; then + if test $OSMAJOR -le 6; then + ac_cv_func_getdelim=no + fi + fi + + # memset_s() may or may ont be present on AIX <= 7.1. + # bos710 is missing memset_s but bos71L has it. + if test "$enable_package_build" = "yes"; then + if test $OSMAJOR -le 7; then + ac_cv_func_memset_s=no + fi + fi + + # Remove timedir on boot, AIX does not have /var/run + INIT_SCRIPT=aix.sh + INIT_DIR=/etc/rc.d/init.d + RC_LINK=/etc/rc.d/rc2.d/S90sudo + + # AIX-specific functions + for ac_func in getuserattr setrlimit64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + for ac_func in setauthdb +do : + ac_fn_c_check_func "$LINENO" "setauthdb" "ac_cv_func_setauthdb" +if test "x$ac_cv_func_setauthdb" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETAUTHDB 1 +_ACEOF + ac_fn_c_check_type "$LINENO" "authdb_t" "ac_cv_type_authdb_t" "#include +" +if test "x$ac_cv_type_authdb_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_AUTHDB_T 1 +_ACEOF + + +fi + +fi +done + + + COMMON_OBJS="${COMMON_OBJS} aix.lo" + + for _sym in aix_prep_user_v1 aix_restoreauthdb_v1 aix_setauthdb_v1 aix_setauthdb_v2 aix_getauthregistry_v1; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + + # These prototypes may be missing + ac_fn_c_check_decl "$LINENO" "usrinfo" "ac_cv_have_decl_usrinfo" " +#include +#include + +" +if test "x$ac_cv_have_decl_usrinfo" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_USRINFO $ac_have_decl +_ACEOF + + ac_fn_c_check_decl "$LINENO" "setauthdb" "ac_cv_have_decl_setauthdb" " +#include +#include + +" +if test "x$ac_cv_have_decl_setauthdb" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SETAUTHDB $ac_have_decl +_ACEOF + + ;; + *-*-hiuxmpp*) + $as_echo "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + + : ${mansectsu='1m'} + : ${mansectform='4'} + + # HP-UX does not clear /var/run so we need to do it + INIT_SCRIPT=hpux.sh + INIT_DIR=/sbin/init.d + RC_LINK=/sbin/rc2.d/S900sudo + + # HP-UX shared libs must be executable. + # Load time is much greater if writable so use 0555. + SHLIB_MODE=0555 + + # HP-UX won't unlink a shared lib that is open + INSTALL_BACKUP='~' + + for ac_func in pstat_getproc gethrtime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + ;; + *-*-hpux*) + $as_echo "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + + # AFS support needs -lBSD + if test "$with_AFS" = "yes"; then + AFS_LIBS="-lc -lBSD" + fi + : ${mansectsu='1m'} + : ${mansectform='4'} + + # HP-UX does not clear /var/run so we need to do it + INIT_SCRIPT=hpux.sh + INIT_DIR=/sbin/init.d + RC_LINK=/sbin/rc2.d/S900sudo + + # HP-UX shared libs must be executable. + # Load time is much greater if writable so use 0555. + SHLIB_MODE=0555 + + # HP-UX won't unlink a shared lib that is open + INSTALL_BACKUP='~' + + # The HP bundled compiler cannot generate shared libs + if test -z "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HP bundled C compiler" >&5 +$as_echo_n "checking for HP bundled C compiler... " >&6; } +if ${sudo_cv_var_hpccbundled+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $CC -V 2>&1 | grep '^(Bundled)' >/dev/null 2>&1; then + sudo_cv_var_hpccbundled=yes + else + sudo_cv_var_hpccbundled=no + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_hpccbundled" >&5 +$as_echo "$sudo_cv_var_hpccbundled" >&6; } + if test "$sudo_cv_var_hpccbundled" = "yes"; then + as_fn_error $? "The HP bundled C compiler is unable to build Sudo, you must use gcc or the HP ANSI C compiler instead." "$LINENO" 5 + fi + fi + + # Build PA-RISC1.1 objects for better portability + case "$host_cpu" in + hppa[2-9]*) + _CFLAGS="$CFLAGS" + if test -n "$GCC"; then + portable_flag="-march=1.1" + else + portable_flag="+DAportable" + fi + CFLAGS="$CFLAGS $portable_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands $portable_flag" >&5 +$as_echo_n "checking whether $CC understands $portable_flag... " >&6; } +if ${sudo_cv_var_daportable+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_var_daportable=yes +else + sudo_cv_var_daportable=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_daportable" >&5 +$as_echo "$sudo_cv_var_daportable" >&6; } + if test X"$sudo_cv_var_daportable" != X"yes"; then + CFLAGS="$_CFLAGS" + fi + ;; + esac + + case "$host_os" in + hpux10.*) + shadow_funcs="getprpwnam iscomsec" + shadow_libs="-lsec" + # HP-UX 10.x doesn't support LD_PRELOAD + with_noexec=no + ;; + *) + shadow_funcs="getspnam iscomsec" + shadow_libs="-lsec" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + ;; + esac + for ac_func in pstat_getproc gethrtime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + ;; + *-dec-osf*) + # ignore envariables wrt dynamic lib path + +if ${SUDO_LDFLAGS+:} false; then : + + case " $SUDO_LDFLAGS " in #( + *" -Wl,-no_library_replacement "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS already contains -Wl,-no_library_replacement"; } >&5 + (: SUDO_LDFLAGS already contains -Wl,-no_library_replacement) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDO_LDFLAGS " -Wl,-no_library_replacement" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS=\"\$SUDO_LDFLAGS\""; } >&5 + (: SUDO_LDFLAGS="$SUDO_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDO_LDFLAGS=-Wl,-no_library_replacement + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS=\"\$SUDO_LDFLAGS\""; } >&5 + (: SUDO_LDFLAGS="$SUDO_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + : ${CHECKSIA='true'} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable sia support on Digital UNIX" >&5 +$as_echo_n "checking whether to disable sia support on Digital UNIX... " >&6; } + # Check whether --enable-sia was given. +if test "${enable_sia+set}" = set; then : + enableval=$enable_sia; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CHECKSIA=true + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CHECKSIA=false + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-sia: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-sia: $enableval" >&2;} + ;; + esac + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + shadow_funcs="getprpwnam dispcrypt" + # OSF/1 4.x and higher need -ldb too + if test $OSMAJOR -lt 4; then + shadow_libs="-lsecurity -laud -lm" + else + shadow_libs="-lsecurity -ldb -laud -lm" + fi + + # use SIA by default, if we have it + test "$CHECKSIA" = "true" && AUTH_EXCL_DEF="SIA" + + # + # Some versions of Digital Unix ship with a broken + # copy of prot.h, which we need for shadow passwords. + # XXX - make should remove this as part of distclean + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken prot.h" >&5 +$as_echo_n "checking for broken prot.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main () +{ +exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, fixing locally" >&5 +$as_echo "yes, fixing locally" >&6; } + sed 's:::g' < /usr/include/prot.h > prot.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # ":DEFAULT" must be appended to _RLD_LIST + RTLD_PRELOAD_VAR="_RLD_LIST" + RTLD_PRELOAD_DEFAULT="DEFAULT" + : ${mansectsu='8'} + : ${mansectform='4'} + ;; + *-*-irix*) + $as_echo "#define _BSD_TYPES 1" >>confdefs.h + + if test "$prefix" = "/usr/local" -a "$mandir" = '${datarootdir}/man'; then + if test -d "/usr/share/man/local"; then + mandir="/usr/share/man/local" + else + mandir="/usr/man/local" + fi + fi + # IRIX <= 4 needs -lsun + if test "$OSMAJOR" -le 4; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpwnam in -lsun" >&5 +$as_echo_n "checking for getpwnam in -lsun... " >&6; } +if ${ac_cv_lib_sun_getpwnam+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsun $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getpwnam (); +int +main () +{ +return getpwnam (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_sun_getpwnam=yes +else + ac_cv_lib_sun_getpwnam=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sun_getpwnam" >&5 +$as_echo "$ac_cv_lib_sun_getpwnam" >&6; } +if test "x$ac_cv_lib_sun_getpwnam" = xyes; then : + LIBS="${LIBS} -lsun" +fi + + fi + # ":DEFAULT" must be appended to _RLD_LIST + RTLD_PRELOAD_VAR="_RLD_LIST" + RTLD_PRELOAD_DEFAULT="DEFAULT" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-linux*|*-*-k*bsd*-gnu) + shadow_funcs="getspnam" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + # Check for SECCOMP_SET_MODE_FILTER in linux/seccomp.h + ac_fn_c_check_decl "$LINENO" "SECCOMP_SET_MODE_FILTER" "ac_cv_have_decl_SECCOMP_SET_MODE_FILTER" " +#include +#include +#include +#include +#include + +" +if test "x$ac_cv_have_decl_SECCOMP_SET_MODE_FILTER" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SECCOMP_SET_MODE_FILTER $ac_have_decl +_ACEOF + + # We call getrandom via syscall(3) in case it is not in libc + for ac_header in linux/random.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "linux/random.h" "ac_cv_header_linux_random_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_random_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LINUX_RANDOM_H 1 +_ACEOF + +fi + +done + + ;; + *-*-gnu*) + # lockf() is broken on the Hurd + ac_cv_func_lockf=no + ;; + *-*-riscos*) + LIBS="${LIBS} -lsun -lbsd" + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I/usr/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I/usr/include"; } >&5 + (: CPPFLAGS already contains -I/usr/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I/usr/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I/usr/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I/usr/include/bsd "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I/usr/include/bsd"; } >&5 + (: CPPFLAGS already contains -I/usr/include/bsd) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I/usr/include/bsd" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I/usr/include/bsd + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -D_MIPS "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -D_MIPS"; } >&5 + (: CPPFLAGS already contains -D_MIPS) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -D_MIPS" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-D_MIPS + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-isc*) + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -D_ISC "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -D_ISC"; } >&5 + (: CPPFLAGS already contains -D_ISC) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -D_ISC" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-D_ISC + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + LIB_CRYPT=1 + SUDOERS_LIBS="${SUDOERS_LIBS} -lcrypt" + + shadow_funcs="getspnam" + shadow_libs="-lsec" + + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-sco*|*-sco-*) + shadow_funcs="getprpwnam" + shadow_libs="-lprot -lx" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + m88k-motorola-sysv*) + # motorolla's cc (a variant of gcc) does -O but not -O2 + CFLAGS=`echo $CFLAGS | sed 's/-O2/-O/g'` + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-sequent-sysv*) + shadow_funcs="getspnam" + shadow_libs="-lsec" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-ncr-sysv4*|*-ncr-sysvr4*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strcasecmp in -lc89" >&5 +$as_echo_n "checking for strcasecmp in -lc89... " >&6; } +if ${ac_cv_lib_c89_strcasecmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc89 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strcasecmp (); +int +main () +{ +return strcasecmp (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c89_strcasecmp=yes +else + ac_cv_lib_c89_strcasecmp=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c89_strcasecmp" >&5 +$as_echo "$ac_cv_lib_c89_strcasecmp" >&6; } +if test "x$ac_cv_lib_c89_strcasecmp" = xyes; then : + LIBS="${LIBS} -lc89" +fi + + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-ccur-sysv4*|*-ccur-sysvr4*) + LIBS="${LIBS} -lgen" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-bsdi*) + SKIP_SETREUID=yes + # Check for newer BSD auth API + if test -z "$with_bsdauth"; then + for ac_func in auth_challenge +do : + ac_fn_c_check_func "$LINENO" "auth_challenge" "ac_cv_func_auth_challenge" +if test "x$ac_cv_func_auth_challenge" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_AUTH_CHALLENGE 1 +_ACEOF + AUTH_EXCL_DEF="BSD_AUTH" +fi +done + + fi + ;; + *-*-freebsd*) + $as_echo "#define _BSD_SOURCE 1" >>confdefs.h + + + # FreeBSD has a real setreuid(2) starting with 2.1 and + # backported to 2.0.5. We just take 2.1 and above... + case "$OSREV" in + 0.*|1.*|2.0*) + SKIP_SETREUID=yes + ;; + esac + if test "${with_skey-'no'}" = "yes"; then + SUDOERS_LIBS="${SUDOERS_LIBS} -lmd" + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='maybe'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*openbsd*) + $as_echo "#define _BSD_SOURCE 1" >>confdefs.h + + + # OpenBSD-specific initialization + OS_INIT=os_init_openbsd + SUDO_OBJS="${SUDO_OBJS} openbsd.o" + + # OpenBSD has a real setreuid(2) starting with 3.3 but + # we will use setresuid(2) instead. + SKIP_SETREUID=yes + + # OpenBSD >= 3.0 supports BSD auth + if test -z "$with_bsdauth"; then + if test "$OSMAJOR" -ge 3; then + AUTH_EXCL_DEF="BSD_AUTH" + fi + fi + : ${with_logincap='maybe'} + + # Newer OpenBSD only fills in pw_password for getpwnam_shadow() + shadow_funcs="getpwnam_shadow" + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*netbsd*) + # NetBSD has a real setreuid(2) starting with 1.3.2 + case "$OSREV" in + 0.9*|1.[012]*|1.3|1.3.1) + SKIP_SETREUID=yes + ;; + esac + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='maybe'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-dragonfly*) + $as_echo "#define _BSD_SOURCE 1" >>confdefs.h + + + if test "${with_skey-'no'}" = "yes"; then + SUDOERS_LIBS="${SUDOERS_LIBS} -lmd" + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='yes'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*bsd*) + CHECKSHADOW="false" + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-darwin*) + # Darwin has a real setreuid(2) starting with 9.0 + if test $OSMAJOR -lt 9; then + SKIP_SETREUID=yes + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='yes'} + # Darwin has a broken poll() + : ${enable_poll='no'} + # Darwin 8 and above can interpose library symbols cleanly + if test $OSMAJOR -ge 8; then + $as_echo "#define HAVE___INTERPOSE 1" >>confdefs.h + + dlyld_interpose=yes + else + RTLD_PRELOAD_ENABLE_VAR="DYLD_FORCE_FLAT_NAMESPACE" + fi + RTLD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES" + + # Mach monotonic timer that runs while sleeping + for ac_func in mach_continuous_time +do : + ac_fn_c_check_func "$LINENO" "mach_continuous_time" "ac_cv_func_mach_continuous_time" +if test "x$ac_cv_func_mach_continuous_time" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MACH_CONTINUOUS_TIME 1 +_ACEOF + +fi +done + + + # Undocumented API that dynamically allocates the groups. + for ac_func in getgrouplist_2 +do : + ac_fn_c_check_func "$LINENO" "getgrouplist_2" "ac_cv_func_getgrouplist_2" +if test "x$ac_cv_func_getgrouplist_2" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETGROUPLIST_2 1 +_ACEOF + ac_fn_c_check_decl "$LINENO" "getgrouplist_2" "ac_cv_have_decl_getgrouplist_2" "$ac_includes_default" +if test "x$ac_cv_have_decl_getgrouplist_2" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETGROUPLIST_2 $ac_have_decl +_ACEOF + +fi +done + + + # We need to force a flat namespace to make libc + # symbol hooking work like it does on ELF. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-force_flat_namespace" >&5 +$as_echo_n "checking whether the linker accepts -Wl,-force_flat_namespace... " >&6; } +if ${ax_cv_check_ldflags___Wl__force_flat_namespace+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-force_flat_namespace" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___Wl__force_flat_namespace=yes +else + ax_cv_check_ldflags___Wl__force_flat_namespace=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__force_flat_namespace" >&5 +$as_echo "$ax_cv_check_ldflags___Wl__force_flat_namespace" >&6; } +if test x"$ax_cv_check_ldflags___Wl__force_flat_namespace" = xyes; then : + +if ${SUDO_LDFLAGS+:} false; then : + + case " $SUDO_LDFLAGS " in #( + *" -Wl,-force_flat_namespace "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS already contains -Wl,-force_flat_namespace"; } >&5 + (: SUDO_LDFLAGS already contains -Wl,-force_flat_namespace) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDO_LDFLAGS " -Wl,-force_flat_namespace" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS=\"\$SUDO_LDFLAGS\""; } >&5 + (: SUDO_LDFLAGS="$SUDO_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDO_LDFLAGS=-Wl,-force_flat_namespace + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDO_LDFLAGS=\"\$SUDO_LDFLAGS\""; } >&5 + (: SUDO_LDFLAGS="$SUDO_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-nextstep*) + # lockf() is broken on the NeXT + ac_cv_func_lockf=no + RTLD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES" + RTLD_PRELOAD_ENABLE_VAR="DYLD_FORCE_FLAT_NAMESPACE" + ;; + *-*-*sysv4*) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-sysv*) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; +esac + +if test X"$enable_pvs_studio" = X"yes"; then + # Determine preprocessor type + case "$CC" in + *clang*) preprocessor=clang;; + *gcc*) preprocessor=gcc;; + *) + case `$CC --version 2>&1` in + *clang*) preprocessor=clang;; + *gcc*) preprocessor=gcc;; + *) as_fn_error $? "Compiler must be gcc or clang for PVS-Studio." "$LINENO" 5;; + esac + ;; + esac + + # Determine platform (currently linux or macos) + case "$host" in + x86_64-*-linux*) pvs_platform=linux64;; + *86-*-linux*) pvs_platform=linux32;; + darwin*) pvs_platform=macos;; + *) as_fn_error $? "PVS-Studio does not support $host_os." "$LINENO" 5;; + esac + + # create basic PVS-Studio.cfg file + cat > PVS-Studio.cfg <<-EOF + preprocessor = $preprocessor + platform = $pvs_platform + analysis-mode = 4 + language = C +EOF +fi + +if test X"$with_noexec" != X"no"; then + cat >>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h <&5 + (: LDFLAGS already contains -L$i) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " -L$i" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS=-L$i + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${LDFLAGS_R+:} false; then : + + case " $LDFLAGS_R " in #( + *" -R$i "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R already contains -R\$i"; } >&5 + (: LDFLAGS_R already contains -R$i) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS_R " -R$i" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R=\"\$LDFLAGS_R\""; } >&5 + (: LDFLAGS_R="$LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS_R=-R$i + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R=\"\$LDFLAGS_R\""; } >&5 + (: LDFLAGS_R="$LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + done +fi +if test -n "$with_libraries"; then + for i in ${with_libraries}; do + case $i in + -l*) ;; + *.a) ;; + *.o) ;; + *) i="-l${i}";; + esac + LIBS="${LIBS} ${i}" + done +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +$as_echo_n "checking for working volatile... " >&6; } +if ${ac_cv_c_volatile+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +volatile int x; +int * volatile y = (int *) 0; +return !x && !y; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_volatile=yes +else + ac_cv_c_volatile=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +$as_echo "$ac_cv_c_volatile" >&6; } +if test $ac_cv_c_volatile = no; then + +$as_echo "#define volatile /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for variadic macro support in cpp" >&5 +$as_echo_n "checking for variadic macro support in cpp... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +$ac_includes_default +#if defined(__GNUC__) && __GNUC__ == 2 +# define sudo_fprintf(fp, fmt...) fprintf((fp), (fmt)) +#else +# define sudo_fprintf(fp, ...) fprintf((fp), __VA_ARGS__) +#endif + +int +main () +{ +sudo_fprintf(stderr, "a %s", "test"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_VARIADIC_MACROS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your C preprocessor doesn't support variadic macros, debugging support will be limited" >&5 +$as_echo "$as_me: WARNING: Your C preprocessor doesn't support variadic macros, debugging support will be limited" >&2;} + + for _sym in sudo_debug_printf_nvm_v1; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_YACC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +$as_echo "$YACC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + +# Extract the first word of "flex", so it can be a program name with args. +set dummy flex; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FLEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FLEX in + [\\/]* | ?:[\\/]*) + ac_cv_path_FLEX="$FLEX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FLEX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FLEX" && ac_cv_path_FLEX="flex" + ;; +esac +fi +FLEX=$ac_cv_path_FLEX +if test -n "$FLEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX" >&5 +$as_echo "$FLEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + # Extract the first word of "mv", so it can be a program name with args. +set dummy mv; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MVPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MVPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_MVPROG="$MVPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/ucb$PATH_SEPARATOR/usr/local/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_MVPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MVPROG=$ac_cv_path_MVPROG +if test -n "$MVPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MVPROG" >&5 +$as_echo "$MVPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "${ac_cv_path_MVPROG}" && cat >>confdefs.h <&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BSHELLPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BSHELLPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_BSHELLPROG="$BSHELLPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BSHELLPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_BSHELLPROG" && ac_cv_path_BSHELLPROG="/usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin" + ;; +esac +fi +BSHELLPROG=$ac_cv_path_BSHELLPROG +if test -n "$BSHELLPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BSHELLPROG" >&5 +$as_echo "$BSHELLPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "${ac_cv_path_BSHELLPROG}" && cat >>confdefs.h <&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SENDMAILPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SENDMAILPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_SENDMAILPROG="$SENDMAILPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /usr/sbin$PATH_SEPARATOR/usr/lib$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/usr/ucblib$PATH_SEPARATOR/usr/local/lib$PATH_SEPARATOR/usr/local/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SENDMAILPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SENDMAILPROG=$ac_cv_path_SENDMAILPROG +if test -n "$SENDMAILPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SENDMAILPROG" >&5 +$as_echo "$SENDMAILPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "${ac_cv_path_SENDMAILPROG}" && cat >>confdefs.h <&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_VIPROG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $VIPROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_VIPROG="$VIPROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/ucb$PATH_SEPARATOR/usr/bsd$PATH_SEPARATOR/usr/local/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_VIPROG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +VIPROG=$ac_cv_path_VIPROG +if test -n "$VIPROG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VIPROG" >&5 +$as_echo "$VIPROG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "${ac_cv_path_VIPROG}" && cat >>confdefs.h <&5 +$as_echo_n "checking which syslog facility sudo should log with... " >&6; } +if test X"$with_logfac" = X""; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int i = LOG_AUTHPRIV; (void)i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + logfac=authpriv +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +cat >>confdefs.h <<_ACEOF +#define LOGFAC "$logfac" +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $logfac" >&5 +$as_echo "$logfac" >&6; } +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if eval \${$as_ac_Header+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if ${ac_cv_search_opendir+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_opendir+:} false; then : + break +fi +done +if ${ac_cv_search_opendir+:} false; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 +$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } +if ${ac_cv_header_stdbool_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: true is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) 0.5 == true ? 1 : -1]; + /* See body of main program for 'e'. */ + char f[(_Bool) 0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + enum { j = false, k = true, l = false * true, m = true * 256 }; + /* The following fails for + HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ + _Bool n[m]; + char o[sizeof n == m * sizeof n[0] ? 1 : -1]; + char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; + /* Catch a bug in an HP-UX C compiler. See + http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html + */ + _Bool q = true; + _Bool *pq = &q; + +int +main () +{ + + bool e = &s; + *pq |= q; + *pq |= ! q; + /* Refer to every declared value, to avoid compiler optimizations. */ + return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + + !m + !n + !o + !p + !q + !pq); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdbool_h=yes +else + ac_cv_header_stdbool_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 +$as_echo "$ac_cv_header_stdbool_h" >&6; } + ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" +if test "x$ac_cv_type__Bool" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + + +if test $ac_cv_header_stdbool_h = yes; then + +$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h + +fi + + + + + for ac_header in $ac_header_list +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mkdev_h" = xyes; then : + +$as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h + +fi + + +if test $ac_cv_header_sys_mkdev_h = no; then + ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then : + +$as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h + +fi + + +fi + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in utmps.h utmpx.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + +for ac_header in endian.h sys/endian.h machine/endian.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + +for ac_header in procfs.h sys/procfs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + ac_fn_c_check_member "$LINENO" "struct psinfo" "pr_ttydev" "ac_cv_member_struct_psinfo_pr_ttydev" "$ac_includes_default +#ifdef HAVE_PROCFS_H +#include +#endif +#ifdef HAVE_SYS_PROCFS_H +#include +#endif + +" +if test "x$ac_cv_member_struct_psinfo_pr_ttydev" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_PSINFO_PR_TTYDEV 1 +_ACEOF + +for ac_func in _ttyname_dev +do : + ac_fn_c_check_func "$LINENO" "_ttyname_dev" "ac_cv_func__ttyname_dev" +if test "x$ac_cv_func__ttyname_dev" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE__TTYNAME_DEV 1 +_ACEOF + +fi +done + +fi + +break +fi + +done + +# +# Check for large file support. +# +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + +# +# HP-UX may need to define _XOPEN_SOURCE_EXTENDED to expose MSG_WAITALL. +# Also, HP-UX 11.23 has a broken sys/types.h when large files support +# is enabled and _XOPEN_SOURCE_EXTENDED is not also defined. +# The following test will define _XOPEN_SOURCE_EXTENDED in either case. +# +case "$host_os" in + hpux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/socket.h needs _XOPEN_SOURCE_EXTENDED for MSG_WAITALL" >&5 +$as_echo_n "checking whether sys/socket.h needs _XOPEN_SOURCE_EXTENDED for MSG_WAITALL... " >&6; } +if ${sudo_cv_xopen_source_extended+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +# include +int +main () +{ +int a = MSG_WAITALL; return a; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_xopen_source_extended=no +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _XOPEN_SOURCE_EXTENDED + $ac_includes_default +# include +# include +int +main () +{ +int a = MSG_WAITALL; return a; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_xopen_source_extended=yes +else + sudo_cv_xopen_source_extended=error +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_xopen_source_extended" >&5 +$as_echo "$sudo_cv_xopen_source_extended" >&6; } + if test "$sudo_cv_xopen_source_extended" = "yes"; then + $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h + + fi + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking POSIX termios" >&5 +$as_echo_n "checking POSIX termios... " >&6; } +if ${ac_cv_sys_posix_termios+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +/* SunOS 4.0.3 has termios.h but not the library calls. */ + tcgetattr(0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_sys_posix_termios=yes +else + ac_cv_sys_posix_termios=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_posix_termios" >&5 +$as_echo "$ac_cv_sys_posix_termios" >&6; } + +if test "$ac_cv_sys_posix_termios" != "yes"; then + as_fn_error $? "Must have POSIX termios to build sudo" "$LINENO" 5 +fi + +maildir=no +if test X"$ac_cv_header_paths_h" = X"yes"; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include +int +main () +{ +char *p = _PATH_MAILDIR; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + maildir=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +if test $maildir = no; then + # Solaris has maillock.h which defines MAILDIR + for ac_header in maillock.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "maillock.h" "ac_cv_header_maillock_h" "$ac_includes_default" +if test "x$ac_cv_header_maillock_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MAILLOCK_H 1 +_ACEOF + + cat >>confdefs.h <<\EOF +#define _PATH_MAILDIR MAILDIR +EOF + + maildir=yes + +fi + +done + + if test $maildir = no; then + for d in /var/mail /var/spool/mail /usr/spool/mail; do + if test -d "$d"; then + maildir=yes + cat >>confdefs.h <>confdefs.h <>confdefs.h <<_ACEOF +#define HAVE_LOGIN_CAP_H 1 +_ACEOF + LOGINCAP_USAGE='[-c class] '; LCMAN=1 + case "$OS" in + freebsd|netbsd) + SUDO_LIBS="${SUDO_LIBS} -lutil" + SUDOERS_LIBS="${SUDOERS_LIBS} -lutil" + ;; + esac + +fi + +done + +fi +if test ${with_project-'no'} != "no"; then + ac_fn_c_check_header_mongrel "$LINENO" "project.h" "ac_cv_header_project_h" "$ac_includes_default" +if test "x$ac_cv_header_project_h" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setproject in -lproject" >&5 +$as_echo_n "checking for setproject in -lproject... " >&6; } +if ${ac_cv_lib_project_setproject+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lproject $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char setproject (); +int +main () +{ +return setproject (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_project_setproject=yes +else + ac_cv_lib_project_setproject=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_project_setproject" >&5 +$as_echo "$ac_cv_lib_project_setproject" >&6; } +if test "x$ac_cv_lib_project_setproject" = xyes; then : + + $as_echo "#define HAVE_PROJECT_H 1" >>confdefs.h + + SUDO_LIBS="${SUDO_LIBS} -lproject" + +fi + + +fi + + +fi +$as_echo "#define __STDC_WANT_LIB_EXT1__ 1" >>confdefs.h + +ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" +if test "x$ac_cv_type_mode_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define mode_t int +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +$as_echo_n "checking for uid_t in sys/types.h... " >&6; } +if ${ac_cv_type_uid_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then : + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +$as_echo "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +$as_echo "#define uid_t int" >>confdefs.h + + +$as_echo "#define gid_t int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "clockid_t" "ac_cv_type_clockid_t" "#include +#include +" +if test "x$ac_cv_type_clockid_t" = xyes; then : + +else + $as_echo "#define clockid_t int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include +#include +" +if test "x$ac_cv_type_sig_atomic_t" = xyes; then : + +else + $as_echo "#define sig_atomic_t int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "struct in6_addr" "ac_cv_type_struct_in6_addr" "#include +#include +" +if test "x$ac_cv_type_struct_in6_addr" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_IN6_ADDR 1 +_ACEOF + + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 +$as_echo_n "checking for unsigned long long int... " >&6; } +if ${ac_cv_type_unsigned_long_long_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_type_unsigned_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63; +int +main () +{ +/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + ac_cv_type_unsigned_long_long_int=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 +$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } + if test $ac_cv_type_unsigned_long_long_int = yes; then + +$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h + + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +$as_echo_n "checking for long long int... " >&6; } +if ${ac_cv_type_long_long_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_type_long_long_int=yes + if test "x${ac_cv_prog_cc_c99-no}" = xno; then + ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int + if test $ac_cv_type_long_long_int = yes; then + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #ifndef LLONG_MAX + # define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + # define LLONG_MAX (HALF - 1 + HALF) + #endif +int +main () +{ +long long int n = 1; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_type_long_long_int=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 +$as_echo "$ac_cv_type_long_long_int" >&6; } + if test $ac_cv_type_long_long_int = yes; then + +$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h + + fi + +if test X"$ac_cv_type_long_long_int" != X"yes"; then + as_fn_error $? "\"C compiler does not appear to support the long long int type\"" "$LINENO" 5 +fi +ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default" +if test "x$ac_cv_type_intmax_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define intmax_t long long +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" +if test "x$ac_cv_type_uintmax_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uintmax_t unsigned long long +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint8_t unsigned char +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint32_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" +if test "x$ac_cv_type_uint64_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint64_t unsigned long long +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " +$ac_includes_default +#include +" +if test "x$ac_cv_type_socklen_t" = xyes; then : + +else + $as_echo "#define socklen_t unsigned int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "rsize_t" "ac_cv_type_rsize_t" "$ac_includes_default" +if test "x$ac_cv_type_rsize_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define rsize_t size_t +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "errno_t" "ac_cv_type_errno_t" "$ac_includes_default" +if test "x$ac_cv_type_errno_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define errno_t int +_ACEOF + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking max length of uid_t" >&5 +$as_echo_n "checking max length of uid_t... " >&6; } +if ${sudo_cv_uid_t_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f conftestdata +if test "$cross_compiling" = yes; then : + sudo_cv_uid_t_len=10 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +main() { + FILE *f; + char b[1024]; + uid_t u = (uid_t) -1; + + if ((f = fopen("conftestdata", "w")) == NULL) + exit(1); + + (void) sprintf(b, "%lu", (unsigned long) u); + (void) fprintf(f, "%d\n", strlen(b)); + (void) fclose(f); + exit(0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + sudo_cv_uid_t_len=`cat conftestdata` +else + sudo_cv_uid_t_len=10 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi + +rm -f conftestdata +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_uid_t_len" >&5 +$as_echo "$sudo_cv_uid_t_len" >&6; } + +cat >>confdefs.h <<_ACEOF +#define MAX_UID_T_LEN $sudo_cv_uid_t_len +_ACEOF + + + + ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" " +# include +# include + +" +if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then : + +$as_echo "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h + +fi + + + + ac_fn_c_check_member "$LINENO" "struct sockaddr_in" "sin_len" "ac_cv_member_struct_sockaddr_in_sin_len" " +# include +# include + +" +if test "x$ac_cv_member_struct_sockaddr_in_sin_len" = xyes; then : + +$as_echo "#define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1" >>confdefs.h + +fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of id_t" >&5 +$as_echo_n "checking size of id_t... " >&6; } +if ${ac_cv_sizeof_id_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (id_t))" "ac_cv_sizeof_id_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_id_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (id_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_id_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_id_t" >&5 +$as_echo "$ac_cv_sizeof_id_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_ID_T $ac_cv_sizeof_id_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 +$as_echo_n "checking size of time_t... " >&6; } +if ${ac_cv_sizeof_time_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_time_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (time_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_time_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 +$as_echo "$ac_cv_sizeof_time_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_TIME_T $ac_cv_sizeof_time_t +_ACEOF + + +if test $ac_cv_header_utmps_h = "yes"; then + + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_id" "ac_cv_member_struct_utmps_ut_id" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_id" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_ID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_pid" "ac_cv_member_struct_utmps_ut_pid" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_pid" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_PID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_tv" "ac_cv_member_struct_utmps_ut_tv" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_tv" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TV 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_type" "ac_cv_member_struct_utmps_ut_type" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_type" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TYPE 1" >>confdefs.h + + +fi + + if test "utmps" = "utmp"; then + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_user" "ac_cv_member_struct_utmp_ut_user" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_user" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_UTMP_UT_USER 1 +_ACEOF + + +fi + + fi + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_exit.__e_termination" "ac_cv_member_struct_utmps_ut_exit___e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_exit___e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT___E_TERMINATION 1" >>confdefs.h + + +else + + ac_fn_c_check_member "$LINENO" "struct utmps" "ut_exit.e_termination" "ac_cv_member_struct_utmps_ut_exit_e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmps_ut_exit_e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION 1" >>confdefs.h + + +fi + + +fi + + +elif test $ac_cv_header_utmpx_h = "yes"; then + + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_id" "ac_cv_member_struct_utmpx_ut_id" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_id" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_ID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_pid" "ac_cv_member_struct_utmpx_ut_pid" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_pid" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_PID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_tv" "ac_cv_member_struct_utmpx_ut_tv" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_tv" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TV 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_type" "ac_cv_member_struct_utmpx_ut_type" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_type" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TYPE 1" >>confdefs.h + + +fi + + if test "utmpx" = "utmp"; then + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_user" "ac_cv_member_struct_utmp_ut_user" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_user" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_UTMP_UT_USER 1 +_ACEOF + + +fi + + fi + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_exit.__e_termination" "ac_cv_member_struct_utmpx_ut_exit___e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_exit___e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT___E_TERMINATION 1" >>confdefs.h + + +else + + ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_exit.e_termination" "ac_cv_member_struct_utmpx_ut_exit_e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmpx_ut_exit_e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION 1" >>confdefs.h + + +fi + + +fi + + +else + + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_id" "ac_cv_member_struct_utmp_ut_id" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_id" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_ID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_pid" "ac_cv_member_struct_utmp_ut_pid" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_pid" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_PID 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_tv" "ac_cv_member_struct_utmp_ut_tv" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_tv" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TV 1" >>confdefs.h + + +fi + + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_type" "ac_cv_member_struct_utmp_ut_type" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_type" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_TYPE 1" >>confdefs.h + + +fi + + if test "utmp" = "utmp"; then + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_user" "ac_cv_member_struct_utmp_ut_user" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_user" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_UTMP_UT_USER 1 +_ACEOF + + +fi + + fi + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_exit.__e_termination" "ac_cv_member_struct_utmp_ut_exit___e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_exit___e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT___E_TERMINATION 1" >>confdefs.h + + +else + + ac_fn_c_check_member "$LINENO" "struct utmp" "ut_exit.e_termination" "ac_cv_member_struct_utmp_ut_exit_e_termination" " +# include +# include + +" +if test "x$ac_cv_member_struct_utmp_ut_exit_e_termination" = xyes; then : + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT 1" >>confdefs.h + + +$as_echo "#define HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION 1" >>confdefs.h + + +fi + + +fi + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking type of array argument to getgroups" >&5 +$as_echo_n "checking type of array argument to getgroups... " >&6; } +if ${ac_cv_type_getgroups+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_type_getgroups=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Thanks to Mike Rendell for this test. */ +$ac_includes_default +#define NGID 256 +#undef MAX +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +int +main () +{ + gid_t gidset[NGID]; + int i, n; + union { gid_t gval; long int lval; } val; + + val.lval = -1; + for (i = 0; i < NGID; i++) + gidset[i] = val.gval; + n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1, + gidset); + /* Exit non-zero if getgroups seems to require an array of ints. This + happens when gid_t is short int but getgroups modifies an array + of ints. */ + return n > 0 && gidset[n] != val.gval; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_type_getgroups=gid_t +else + ac_cv_type_getgroups=int +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if test $ac_cv_type_getgroups = cross; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then : + ac_cv_type_getgroups=gid_t +else + ac_cv_type_getgroups=int +fi +rm -f conftest* + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_getgroups" >&5 +$as_echo "$ac_cv_type_getgroups" >&6; } + +cat >>confdefs.h <<_ACEOF +#define GETGROUPS_T $ac_cv_type_getgroups +_ACEOF + + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups" +if test "x$ac_cv_func_getgroups" = xyes; then : + +fi + + +# If we don't yet have getgroups, see if it's in -lbsd. +# This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1. +ac_save_LIBS=$LIBS +if test $ac_cv_func_getgroups = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getgroups in -lbsd" >&5 +$as_echo_n "checking for getgroups in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_getgroups+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getgroups (); +int +main () +{ +return getgroups (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_getgroups=yes +else + ac_cv_lib_bsd_getgroups=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_getgroups" >&5 +$as_echo "$ac_cv_lib_bsd_getgroups" >&6; } +if test "x$ac_cv_lib_bsd_getgroups" = xyes; then : + GETGROUPS_LIB=-lbsd +fi + +fi + +# Run the program to test the functionality of the system-supplied +# getgroups function only if there is such a function. +if test $ac_cv_func_getgroups = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getgroups" >&5 +$as_echo_n "checking for working getgroups... " >&6; } +if ${ac_cv_func_getgroups_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_getgroups_works=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +/* On Ultrix 4.3, getgroups (0, 0) always fails. */ + return getgroups (0, 0) == -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_getgroups_works=yes +else + ac_cv_func_getgroups_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getgroups_works" >&5 +$as_echo "$ac_cv_func_getgroups_works" >&6; } +else + ac_cv_func_getgroups_works=no +fi +if test $ac_cv_func_getgroups_works = yes; then + +$as_echo "#define HAVE_GETGROUPS 1" >>confdefs.h + +fi +LIBS=$ac_save_LIBS + + + + + for ac_func in $ac_func_list +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + + + + + + + + + + + + + +case "$host_os" in + hpux*) + if test X"$ac_cv_func_pread" = X"yes"; then + O_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + for ac_func in pread64 pwrite64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + + +$as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h + + +fi +done + + CPPFLAGS="$O_CPPFLAGS" + fi + ;; +esac +for ac_func in getgrouplist +do : + ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist" +if test "x$ac_cv_func_getgrouplist" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETGROUPLIST 1 +_ACEOF + +else + + case "$host_os" in + aix*) + for ac_func in getgrset +do : + ac_fn_c_check_func "$LINENO" "getgrset" "ac_cv_func_getgrset" +if test "x$ac_cv_func_getgrset" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETGRSET 1 +_ACEOF + +fi +done + + ;; + *) + ac_fn_c_check_func "$LINENO" "nss_search" "ac_cv_func_nss_search" +if test "x$ac_cv_func_nss_search" = xyes; then : + + ac_fn_c_check_func "$LINENO" "_nss_XbyY_buf_alloc" "ac_cv_func__nss_XbyY_buf_alloc" +if test "x$ac_cv_func__nss_XbyY_buf_alloc" = xyes; then : + + # Solaris + ac_fn_c_check_func "$LINENO" "_nss_initf_group" "ac_cv_func__nss_initf_group" +if test "x$ac_cv_func__nss_initf_group" = xyes; then : + + for ac_header in nss_dbdefs.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "nss_dbdefs.h" "ac_cv_header_nss_dbdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_nss_dbdefs_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NSS_DBDEFS_H 1 +_ACEOF + +fi + +done + + $as_echo "#define HAVE_NSS_SEARCH 1" >>confdefs.h + + $as_echo "#define HAVE__NSS_XBYY_BUF_ALLOC 1" >>confdefs.h + + $as_echo "#define HAVE__NSS_INITF_GROUP 1" >>confdefs.h + + +else + + for ac_header in nss_dbdefs.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "nss_dbdefs.h" "ac_cv_header_nss_dbdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_nss_dbdefs_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NSS_DBDEFS_H 1 +_ACEOF + + # Older Solaris does not export _nss_initf_group + # but we can use our own. + $as_echo "#define HAVE_NSS_SEARCH 1" >>confdefs.h + + $as_echo "#define HAVE__NSS_XBYY_BUF_ALLOC 1" >>confdefs.h + + +fi + +done + + +fi + + +else + + # HP-UX + ac_fn_c_check_func "$LINENO" "__nss_XbyY_buf_alloc" "ac_cv_func___nss_XbyY_buf_alloc" +if test "x$ac_cv_func___nss_XbyY_buf_alloc" = xyes; then : + + ac_fn_c_check_func "$LINENO" "__nss_initf_group" "ac_cv_func___nss_initf_group" +if test "x$ac_cv_func___nss_initf_group" = xyes; then : + + for ac_header in nss_dbdefs.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "nss_dbdefs.h" "ac_cv_header_nss_dbdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_nss_dbdefs_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NSS_DBDEFS_H 1 +_ACEOF + +fi + +done + + $as_echo "#define HAVE_NSS_SEARCH 1" >>confdefs.h + + $as_echo "#define HAVE___NSS_XBYY_BUF_ALLOC 1" >>confdefs.h + + $as_echo "#define HAVE___NSS_INITF_GROUP 1" >>confdefs.h + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + for _sym in sudo_getgrouplist; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in getdelim +do : + ac_fn_c_check_func "$LINENO" "getdelim" "ac_cv_func_getdelim" +if test "x$ac_cv_func_getdelim" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETDELIM 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" getdelim.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getdelim.$ac_objext" + ;; +esac + + + for _sym in sudo_getdelim; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }getdelim_test" + +fi +done + +for ac_func in getusershell +do : + ac_fn_c_check_func "$LINENO" "getusershell" "ac_cv_func_getusershell" +if test "x$ac_cv_func_getusershell" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETUSERSHELL 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" getusershell.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getusershell.$ac_objext" + ;; +esac + + + for _sym in sudo_getusershell; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in reallocarray +do : + ac_fn_c_check_func "$LINENO" "reallocarray" "ac_cv_func_reallocarray" +if test "x$ac_cv_func_reallocarray" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REALLOCARRAY 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" reallocarray.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS reallocarray.$ac_objext" + ;; +esac + + + for _sym in sudo_reallocarray; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in arc4random_uniform +do : + ac_fn_c_check_func "$LINENO" "arc4random_uniform" "ac_cv_func_arc4random_uniform" +if test "x$ac_cv_func_arc4random_uniform" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ARC4RANDOM_UNIFORM 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" arc4random_uniform.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS arc4random_uniform.$ac_objext" + ;; +esac + + + for _sym in sudo_arc4random_uniform; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + for ac_func in arc4random +do : + ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random" +if test "x$ac_cv_func_arc4random" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ARC4RANDOM 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" arc4random.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS arc4random.$ac_objext" + ;; +esac + + + for _sym in sudo_arc4random; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + # arc4random.c needs getentropy() + for ac_func in getentropy +do : + ac_fn_c_check_func "$LINENO" "getentropy" "ac_cv_func_getentropy" +if test "x$ac_cv_func_getentropy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETENTROPY 1 +_ACEOF + + for ac_header in sys/random.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_random_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_RANDOM_H 1 +_ACEOF + +fi + +done + + +else + + case " $LIBOBJS " in + *" getentropy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getentropy.$ac_objext" + ;; +esac + + + for _sym in sudo_getentropy; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + + # arc4random.c wants pthread_atfork + for ac_header in pthread.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PTHREAD_H 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpthread" >&5 +$as_echo_n "checking for main in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_main=yes +else + ac_cv_lib_pthread_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_main" >&5 +$as_echo "$ac_cv_lib_pthread_main" >&6; } +if test "x$ac_cv_lib_pthread_main" = xyes; then : + LIBPTHREAD="-lpthread" +fi + + for ac_func in pthread_atfork +do : + ac_fn_c_check_func "$LINENO" "pthread_atfork" "ac_cv_func_pthread_atfork" +if test "x$ac_cv_func_pthread_atfork" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PTHREAD_ATFORK 1 +_ACEOF + +fi +done + + +fi + +done + + +fi +done + + +fi +done + + +utmp_style=LEGACY +for ac_func in getutsid getutxid getutid +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + utmp_style=POSIX; break +fi +done + +if test "$utmp_style" = "LEGACY"; then + for ac_func in getttyent ttyslot +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + + for ac_func in fseeko +do : + ac_fn_c_check_func "$LINENO" "fseeko" "ac_cv_func_fseeko" +if test "x$ac_cv_func_fseeko" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FSEEKO 1 +_ACEOF + +fi +done + +fi + +for ac_func in sysctl +do : + ac_fn_c_check_func "$LINENO" "sysctl" "ac_cv_func_sysctl" +if test "x$ac_cv_func_sysctl" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYSCTL 1 +_ACEOF + for ac_func in devname +do : + ac_fn_c_check_func "$LINENO" "devname" "ac_cv_func_devname" +if test "x$ac_cv_func_devname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DEVNAME 1 +_ACEOF + +fi +done + + ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "ki_structsize" "ac_cv_member_struct_kinfo_proc_ki_structsize" " +# include +# include +# include + +" +if test "x$ac_cv_member_struct_kinfo_proc_ki_structsize" = xyes; then : + $as_echo "#define HAVE_KINFO_PROC_FREEBSD 1" >>confdefs.h + +else + + ac_fn_c_check_member "$LINENO" "struct kinfo_proc2" "p_paddr" "ac_cv_member_struct_kinfo_proc2_p_paddr" " +# include +# include + +" +if test "x$ac_cv_member_struct_kinfo_proc2_p_paddr" = xyes; then : + $as_echo "#define HAVE_KINFO_PROC2_NETBSD 1" >>confdefs.h + +else + + ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "p_paddr" "ac_cv_member_struct_kinfo_proc_p_paddr" " +# include +# include + +" +if test "x$ac_cv_member_struct_kinfo_proc_p_paddr" = xyes; then : + $as_echo "#define HAVE_KINFO_PROC_OPENBSD 1" >>confdefs.h + +else + + ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_proc" "ac_cv_member_struct_kinfo_proc_kp_proc" " +# include +# include + +" +if test "x$ac_cv_member_struct_kinfo_proc_kp_proc" = xyes; then : + $as_echo "#define HAVE_KINFO_PROC_44BSD 1" >>confdefs.h + +fi + + +fi + + +fi + + +fi + + +fi +done + + +for ac_func in openpty +do : + ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" +if test "x$ac_cv_func_openpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OPENPTY 1 +_ACEOF + for ac_header in libutil.h util.h pty.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 +$as_echo_n "checking for openpty in -lutil... " >&6; } +if ${ac_cv_lib_util_openpty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char openpty (); +int +main () +{ +return openpty (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_util_openpty=yes +else + ac_cv_lib_util_openpty=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 +$as_echo "$ac_cv_lib_util_openpty" >&6; } +if test "x$ac_cv_lib_util_openpty" = xyes; then : + + for ac_header in libutil.h util.h pty.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + + case "$SUDO_LIBS" in + *-lutil*) ;; + *) SUDO_LIBS="${SUDO_LIBS} -lutil";; + esac + $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h + + +else + + for ac_func in _getpty +do : + ac_fn_c_check_func "$LINENO" "_getpty" "ac_cv_func__getpty" +if test "x$ac_cv_func__getpty" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE__GETPTY 1 +_ACEOF + +else + + for ac_func in grantpt +do : + ac_fn_c_check_func "$LINENO" "grantpt" "ac_cv_func_grantpt" +if test "x$ac_cv_func_grantpt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GRANTPT 1 +_ACEOF + + for ac_func in posix_openpt +do : + ac_fn_c_check_func "$LINENO" "posix_openpt" "ac_cv_func_posix_openpt" +if test "x$ac_cv_func_posix_openpt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POSIX_OPENPT 1 +_ACEOF + +fi +done + + +else + + for ac_func in revoke +do : + ac_fn_c_check_func "$LINENO" "revoke" "ac_cv_func_revoke" +if test "x$ac_cv_func_revoke" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REVOKE 1 +_ACEOF + +fi +done + + +fi +done + + +fi +done + + +fi + + +fi +done + +for ac_func in unsetenv +do : + ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" +if test "x$ac_cv_func_unsetenv" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_UNSETENV 1 +_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv returns void" >&5 +$as_echo_n "checking whether unsetenv returns void... " >&6; } +if ${sudo_cv_func_unsetenv_void+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + sudo_cv_func_unsetenv_void=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + int unsetenv(); + +int +main () +{ + + return unsetenv("FOO") != 0; + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + sudo_cv_func_unsetenv_void=no +else + sudo_cv_func_unsetenv_void=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_unsetenv_void" >&5 +$as_echo "$sudo_cv_func_unsetenv_void" >&6; } + if test $sudo_cv_func_unsetenv_void = yes; then + +$as_echo "#define UNSETENV_VOID 1" >>confdefs.h + + fi + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether putenv takes a const argument" >&5 +$as_echo_n "checking whether putenv takes a const argument... " >&6; } +if ${sudo_cv_func_putenv_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int putenv(const char *string) {return 0;} +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_func_putenv_const=yes +else + sudo_cv_func_putenv_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_putenv_const" >&5 +$as_echo "$sudo_cv_func_putenv_const" >&6; } + if test $sudo_cv_func_putenv_const = yes; then + +$as_echo "#define PUTENV_CONST const" >>confdefs.h + + else + $as_echo "#define PUTENV_CONST /**/" >>confdefs.h + + fi + +if test -z "$SKIP_SETRESUID"; then + for ac_func in setresuid +do : + ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" +if test "x$ac_cv_func_setresuid" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETRESUID 1 +_ACEOF + + SKIP_SETREUID=yes + ac_fn_c_check_decl "$LINENO" "setresuid" "ac_cv_have_decl_setresuid" "$ac_includes_default" +if test "x$ac_cv_have_decl_setresuid" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SETRESUID $ac_have_decl +_ACEOF + + for ac_func in getresuid +do : + ac_fn_c_check_func "$LINENO" "getresuid" "ac_cv_func_getresuid" +if test "x$ac_cv_func_getresuid" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETRESUID 1 +_ACEOF + ac_fn_c_check_decl "$LINENO" "getresuid" "ac_cv_have_decl_getresuid" "$ac_includes_default" +if test "x$ac_cv_have_decl_getresuid" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRESUID $ac_have_decl +_ACEOF + +fi +done + + +fi +done + +fi +if test -z "$SKIP_SETREUID"; then + for ac_func in setreuid +do : + ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" +if test "x$ac_cv_func_setreuid" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETREUID 1 +_ACEOF + +fi +done + +fi + + + +if test X"$with_interfaces" != X"no"; then + for ac_func in getifaddrs +do : + ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" +if test "x$ac_cv_func_getifaddrs" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETIFADDRS 1 +_ACEOF + for ac_func in freeifaddrs +do : + ac_fn_c_check_func "$LINENO" "freeifaddrs" "ac_cv_func_freeifaddrs" +if test "x$ac_cv_func_freeifaddrs" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FREEIFADDRS 1 +_ACEOF + +fi +done + +fi +done + +fi +for ac_func in lockf +do : + ac_fn_c_check_func "$LINENO" "lockf" "ac_cv_func_lockf" +if test "x$ac_cv_func_lockf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCKF 1 +_ACEOF + break +fi +done + +for ac_func in innetgr +do : + ac_fn_c_check_func "$LINENO" "innetgr" "ac_cv_func_innetgr" +if test "x$ac_cv_func_innetgr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_INNETGR 1 +_ACEOF + + ac_fn_c_check_decl "$LINENO" "innetgr" "ac_cv_have_decl_innetgr" " +$ac_includes_default +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ + +" +if test "x$ac_cv_have_decl_innetgr" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_INNETGR $ac_have_decl +_ACEOF + +else + + for ac_func in _innetgr +do : + ac_fn_c_check_func "$LINENO" "_innetgr" "ac_cv_func__innetgr" +if test "x$ac_cv_func__innetgr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE__INNETGR 1 +_ACEOF + + ac_fn_c_check_decl "$LINENO" "_innetgr" "ac_cv_have_decl__innetgr" " +$ac_includes_default +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ + +" +if test "x$ac_cv_have_decl__innetgr" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__INNETGR $ac_have_decl +_ACEOF + + +fi +done + + +fi +done + +for ac_func in getdomainname +do : + ac_fn_c_check_func "$LINENO" "getdomainname" "ac_cv_func_getdomainname" +if test "x$ac_cv_func_getdomainname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETDOMAINNAME 1 +_ACEOF + + ac_fn_c_check_decl "$LINENO" "getdomainname" "ac_cv_have_decl_getdomainname" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_getdomainname" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETDOMAINNAME $ac_have_decl +_ACEOF + + +else + + for ac_func in sysinfo +do : + ac_fn_c_check_func "$LINENO" "sysinfo" "ac_cv_func_sysinfo" +if test "x$ac_cv_func_sysinfo" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYSINFO 1 +_ACEOF + for ac_header in sys/systeminfo.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/systeminfo.h" "ac_cv_header_sys_systeminfo_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_systeminfo_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_SYSTEMINFO_H 1 +_ACEOF + +fi + +done + +fi +done + + +fi +done + +for ac_func in utimensat +do : + ac_fn_c_check_func "$LINENO" "utimensat" "ac_cv_func_utimensat" +if test "x$ac_cv_func_utimensat" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_UTIMENSAT 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" utimens.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS utimens.$ac_objext" + ;; +esac + + + for _sym in sudo_utimensat; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + for ac_func in utimes +do : + ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" +if test "x$ac_cv_func_utimes" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_UTIMES 1 +_ACEOF + +fi +done + + +fi +done + +for ac_func in futimens +do : + ac_fn_c_check_func "$LINENO" "futimens" "ac_cv_func_futimens" +if test "x$ac_cv_func_futimens" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FUTIMENS 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" utimens.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS utimens.$ac_objext" + ;; +esac + + + for _sym in sudo_futimens; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + for ac_func in futimes futimesat futime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fnmatch with FNM_CASEFOLD" >&5 +$as_echo_n "checking for working fnmatch with FNM_CASEFOLD... " >&6; } +if ${sudo_cv_func_fnmatch+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f conftestdata; > conftestdata +if test "$cross_compiling" = yes; then : + sudo_cv_func_fnmatch=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +main() { exit(fnmatch("/*/bin/echo *", "/usr/bin/echo just a test", FNM_CASEFOLD)); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + sudo_cv_func_fnmatch=yes +else + sudo_cv_func_fnmatch=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +rm -f core core.* *.core +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_fnmatch" >&5 +$as_echo "$sudo_cv_func_fnmatch" >&6; } +if test $sudo_cv_func_fnmatch = yes; then : + $as_echo "#define HAVE_FNMATCH 1" >>confdefs.h + +else + + case " $LIBOBJS " in + *" fnmatch.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS fnmatch.$ac_objext" + ;; +esac + + + for _sym in sudo_fnmatch; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }fnm_test" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isblank" >&5 +$as_echo_n "checking for isblank... " >&6; } +if ${sudo_cv_func_isblank+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return (isblank('a')); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_func_isblank=yes +else + sudo_cv_func_isblank=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_isblank" >&5 +$as_echo "$sudo_cv_func_isblank" >&6; } + + if test "$sudo_cv_func_isblank" = "yes"; then + +$as_echo "#define HAVE_ISBLANK 1" >>confdefs.h + + else + case " $LIBOBJS " in + *" isblank.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS isblank.$ac_objext" + ;; +esac + + + for _sym in isblank; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + fi + +for ac_func in glob +do : + ac_fn_c_check_func "$LINENO" "glob" "ac_cv_func_glob" +if test "x$ac_cv_func_glob" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GLOB 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" glob.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS glob.$ac_objext" + ;; +esac + + + for _sym in sudo_glob sudo_globfree; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in memrchr +do : + ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr" +if test "x$ac_cv_func_memrchr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MEMRCHR 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" memrchr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memrchr.$ac_objext" + ;; +esac + + + for _sym in sudo_memrchr; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in memset_s +do : + ac_fn_c_check_func "$LINENO" "memset_s" "ac_cv_func_memset_s" +if test "x$ac_cv_func_memset_s" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MEMSET_S 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" memset_s.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memset_s.$ac_objext" + ;; +esac + + + for _sym in sudo_memset_s; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in nanosleep +do : + ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NANOSLEEP 1 +_ACEOF + +else + + # On Solaris, nanosleep is in librt + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 +$as_echo_n "checking for nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_nanosleep+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (); +int +main () +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_nanosleep=yes +else + ac_cv_lib_rt_nanosleep=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : + + $as_echo "#define HAVE_NANOSLEEP 1" >>confdefs.h + + LIBRT="-lrt" + +else + + case " $LIBOBJS " in + *" nanosleep.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS nanosleep.$ac_objext" + ;; +esac + + + for _sym in sudo_nanosleep; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi + + +fi +done + +for ac_func in pipe2 +do : + ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2" +if test "x$ac_cv_func_pipe2" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PIPE2 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" pipe2.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS pipe2.$ac_objext" + ;; +esac + + + for _sym in sudo_pipe2; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in pw_dup +do : + ac_fn_c_check_func "$LINENO" "pw_dup" "ac_cv_func_pw_dup" +if test "x$ac_cv_func_pw_dup" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PW_DUP 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" pw_dup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS pw_dup.$ac_objext" + ;; +esac + + + for _sym in sudo_pw_dup; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in strlcpy +do : + ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" +if test "x$ac_cv_func_strlcpy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRLCPY 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" strlcpy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strlcpy.$ac_objext" + ;; +esac + + + for _sym in sudo_strlcpy; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in strlcat +do : + ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" +if test "x$ac_cv_func_strlcat" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRLCAT 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" strlcat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strlcat.$ac_objext" + ;; +esac + + + for _sym in sudo_strlcat; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" +if test "x$ac_cv_func_strnlen" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5 +$as_echo_n "checking for working strnlen... " >&6; } +if ${ac_cv_func_strnlen_working+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + # Guess no on AIX systems, yes otherwise. + case "$host_os" in + aix*) ac_cv_func_strnlen_working=no;; + *) ac_cv_func_strnlen_working=yes;; + esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + +#define S "foobar" +#define S_LEN (sizeof S - 1) + + /* At least one implementation is buggy: that of AIX 4.3 would + give strnlen (S, 1) == 3. */ + + int i; + for (i = 0; i < S_LEN + 1; ++i) + { + int expected = i <= S_LEN ? i : S_LEN; + if (strnlen (S, i) != expected) + return 1; + } + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strnlen_working=yes +else + ac_cv_func_strnlen_working=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5 +$as_echo "$ac_cv_func_strnlen_working" >&6; } +test $ac_cv_func_strnlen_working = no && case " $LIBOBJS " in + *" strnlen.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" + ;; +esac + + +else + case " $LIBOBJS " in + *" strnlen.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" + ;; +esac + +fi + +if test X"$ac_cv_func_strnlen_working" = X"yes"; then + $as_echo "#define HAVE_STRNLEN 1" >>confdefs.h + + for ac_func in strndup +do : + ac_fn_c_check_func "$LINENO" "strndup" "ac_cv_func_strndup" +if test "x$ac_cv_func_strndup" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRNDUP 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" strndup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strndup.$ac_objext" + ;; +esac + + + for _sym in sudo_strndup; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +else + # Broken or missing strnlen, use our own. + + for _sym in sudo_strnlen; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + # Avoid libc strndup() since it is usually implemented using strnlen() + case " $LIBOBJS " in + *" strndup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strndup.$ac_objext" + ;; +esac + + + for _sym in sudo_strndup; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + +fi +for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +else + + # On Solaris, clock_gettime is in librt + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : + + $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + LIBRT="-lrt" + +fi + + +fi +done + +for ac_func in getopt_long +do : + ac_fn_c_check_func "$LINENO" "getopt_long" "ac_cv_func_getopt_long" +if test "x$ac_cv_func_getopt_long" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETOPT_LONG 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" getopt_long.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext" + ;; +esac + + + for _sym in sudo_getopt_long sudo_getopt_long_only; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for optreset" >&5 +$as_echo_n "checking for optreset... " >&6; } + if ${sudo_cv_optreset+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern int optreset; optreset = 1; return optreset; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_optreset=yes +else + sudo_cv_optreset=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + + if test "$sudo_cv_optreset" = "yes"; then + $as_echo "#define HAVE_OPTRESET 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_optreset" >&5 +$as_echo "$sudo_cv_optreset" >&6; } + +fi +done + +for ac_func in closefrom +do : + ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom" +if test "x$ac_cv_func_closefrom" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOSEFROM 1 +_ACEOF + +else + case " $LIBOBJS " in + *" closefrom.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS closefrom.$ac_objext" + ;; +esac + + + for _sym in closefrom_fallback sudo_closefrom; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + ac_fn_c_check_decl "$LINENO" "F_CLOSEM" "ac_cv_have_decl_F_CLOSEM" " +# include +# include +" +if test "x$ac_cv_have_decl_F_CLOSEM" = xyes; then : + $as_echo "#define HAVE_FCNTL_CLOSEM 1" >>confdefs.h + +fi + + +fi +done + +for ac_func in mkstemps mkdtemp +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + break +fi +done + +if test X"$ac_cv_func_mkstemps$ac_cv_func_mkdtemp" != X"yesyes"; then + for ac_func in arc4random random lrand48 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + + if test X"$ac_cv_func_arc4random" != X"yes"; then + for ac_func in getentropy +do : + ac_fn_c_check_func "$LINENO" "getentropy" "ac_cv_func_getentropy" +if test "x$ac_cv_func_getentropy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETENTROPY 1 +_ACEOF + +fi +done + + fi + case " $LIBOBJS " in + *" mktemp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mktemp.$ac_objext" + ;; +esac + + # If either mkdtemp() or mkstemps() is missing, replace both. + + for _sym in sudo_mkdtemp sudo_mkstemps; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }mktemp_test" +fi +for ac_func in snprintf vsnprintf +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working snprintf" >&5 +$as_echo_n "checking for working snprintf... " >&6; } +if ${ac_cv_have_working_snprintf+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_have_working_snprintf=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = snprintf (bufs, 2, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = snprintf (bufd, 2, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_have_working_snprintf=yes +else + ac_cv_have_working_snprintf=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_working_snprintf" >&5 +$as_echo "$ac_cv_have_working_snprintf" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vsnprintf" >&5 +$as_echo_n "checking for working vsnprintf... " >&6; } +if ${ac_cv_have_working_vsnprintf+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_have_working_vsnprintf=cross +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int my_vsnprintf (char *buf, const char *tmpl, ...) +{ + int i; + va_list args; + va_start (args, tmpl); + i = vsnprintf (buf, 2, tmpl, args); + va_end (args); + return i; +} + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = my_vsnprintf (bufs, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = my_vsnprintf (bufd, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_have_working_vsnprintf=yes +else + ac_cv_have_working_vsnprintf=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_working_vsnprintf" >&5 +$as_echo "$ac_cv_have_working_vsnprintf" >&6; } +if test x$ac_cv_have_working_snprintf$ac_cv_have_working_vsnprintf != "xyesyes"; then + case " $LIBOBJS " in + *" snprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Replacing missing/broken (v)snprintf() with sudo's version." >&5 +$as_echo "$as_me: WARNING: Replacing missing/broken (v)snprintf() with sudo's version." >&2;} + +$as_echo "#define PREFER_PORTABLE_SNPRINTF 1" >>confdefs.h + +fi +if test X"$ac_cv_have_working_snprintf$ac_cv_have_working_vsnprintf" = X"yesyes"; then + # System has a C99-compliant v?snprintf(), check for v?asprintf() + for ac_func in asprintf +do : + ac_fn_c_check_func "$LINENO" "asprintf" "ac_cv_func_asprintf" +if test "x$ac_cv_func_asprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ASPRINTF 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" snprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" + ;; +esac + + + for _sym in sudo_asprintf; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + + for ac_func in vasprintf +do : + ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" +if test "x$ac_cv_func_vasprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VASPRINTF 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" snprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" + ;; +esac + + + for _sym in sudo_vasprintf; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +else + # Missing or non-compliant v?snprintf(), assume missing/bad v?asprintf() + + for _sym in sudo_snprintf sudo_vsnprintf sudo_asprintf sudo_vasprintf; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + +fi +ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" " +$ac_includes_default +#include + +" +if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_TM_TM_GMTOFF 1 +_ACEOF + + +fi + +ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then : + $as_echo "#define HAVE_ST_MTIM 1" >>confdefs.h + + ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim.st__tim" "ac_cv_member_struct_stat_st_mtim_st__tim" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtim_st__tim" = xyes; then : + $as_echo "#define HAVE_ST__TIM 1" >>confdefs.h + +fi + +else + ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimespec" "ac_cv_member_struct_stat_st_mtimespec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtimespec" = xyes; then : + $as_echo "#define HAVE_ST_MTIMESPEC 1" >>confdefs.h + +else + ac_fn_c_check_member "$LINENO" "struct stat" "st_nmtime" "ac_cv_member_struct_stat_st_nmtime" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_nmtime" = xyes; then : + $as_echo "#define HAVE_ST_NMTIME 1" >>confdefs.h + +fi + +fi + + + +fi + +# Look for sha2 functions if not using openssl +if test "$DIGEST" = "digest.lo"; then + FOUND_SHA2=no + ac_fn_c_check_header_mongrel "$LINENO" "sha2.h" "ac_cv_header_sha2_h" "$ac_includes_default" +if test "x$ac_cv_header_sha2_h" = xyes; then : + + FOUND_SHA2=yes + for ac_func in SHA224Update +do : + ac_fn_c_check_func "$LINENO" "SHA224Update" "ac_cv_func_SHA224Update" +if test "x$ac_cv_func_SHA224Update" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SHA224UPDATE 1 +_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the data argument of SHA224Update() is void *" >&5 +$as_echo_n "checking whether the data argument of SHA224Update() is void *... " >&6; } +if ${sudo_cv_func_sha2_void_ptr+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include +void SHA224Update(SHA2_CTX *context, const void *data, size_t len) {return;} +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_func_sha2_void_ptr=yes +else + sudo_cv_func_sha2_void_ptr=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_sha2_void_ptr" >&5 +$as_echo "$sudo_cv_func_sha2_void_ptr" >&6; } + if test $sudo_cv_func_sha2_void_ptr = yes; then + +$as_echo "#define SHA2_VOID_PTR 1" >>confdefs.h + + fi + +else + + # On some systems, SHA224Update is in libmd + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHA224Update in -lmd" >&5 +$as_echo_n "checking for SHA224Update in -lmd... " >&6; } +if ${ac_cv_lib_md_SHA224Update+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char SHA224Update (); +int +main () +{ +return SHA224Update (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_md_SHA224Update=yes +else + ac_cv_lib_md_SHA224Update=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_md_SHA224Update" >&5 +$as_echo "$ac_cv_lib_md_SHA224Update" >&6; } +if test "x$ac_cv_lib_md_SHA224Update" = xyes; then : + + $as_echo "#define HAVE_SHA224UPDATE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the data argument of SHA224Update() is void *" >&5 +$as_echo_n "checking whether the data argument of SHA224Update() is void *... " >&6; } +if ${sudo_cv_func_sha2_void_ptr+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include +void SHA224Update(SHA2_CTX *context, const void *data, size_t len) {return;} +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_func_sha2_void_ptr=yes +else + sudo_cv_func_sha2_void_ptr=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_sha2_void_ptr" >&5 +$as_echo "$sudo_cv_func_sha2_void_ptr" >&6; } + if test $sudo_cv_func_sha2_void_ptr = yes; then + +$as_echo "#define SHA2_VOID_PTR 1" >>confdefs.h + + fi + + LIBMD="-lmd" + +else + + # Does not have SHA224Update + FOUND_SHA2=no + +fi + + +fi +done + + +fi + + + if test X"$FOUND_SHA2" = X"no"; then + case " $LIBOBJS " in + *" sha2.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS sha2.$ac_objext" + ;; +esac + + + for _sym in sudo_SHA224Final sudo_SHA224Init sudo_SHA224Pad sudo_SHA224Transform sudo_SHA224Update sudo_SHA256Final sudo_SHA256Init sudo_SHA256Pad sudo_SHA256Transform sudo_SHA256Update sudo_SHA384Final sudo_SHA384Init sudo_SHA384Pad sudo_SHA384Transform sudo_SHA384Update sudo_SHA512Final sudo_SHA512Init sudo_SHA512Pad sudo_SHA512Transform sudo_SHA512Update; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + fi +fi +for ac_func in vsyslog +do : + ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" +if test "x$ac_cv_func_vsyslog" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VSYSLOG 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" vsyslog.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vsyslog.$ac_objext" + ;; +esac + + + for _sym in sudo_vsyslog; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }vsyslog_test" + +fi +done + +for ac_func in setpassent setgroupent +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test X"$with_noexec" != X"no"; then + # Check for non-standard exec functions + for ac_func in exect execvP execvpe +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + # Check for posix_spawn, and posix_spawnp + if test X"$ac_cv_header_spawn_h" = X"yes"; then + for ac_func in posix_spawn posix_spawnp +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi +fi + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_header_dirent> +int +main () +{ +DIR *d; (void)dirfd(d); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + $as_echo "#define HAVE_DIRFD 1" >>confdefs.h + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_header_dirent> +int +main () +{ +DIR d; memset(&d, 0, sizeof(d)); return(d.dd_fd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + $as_echo "#define HAVE_DD_FD 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" " +$ac_includes_default +#include <$ac_header_dirent> + +" +if test "x$ac_cv_member_struct_dirent_d_type" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_DIRENT_D_TYPE 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct dirent" "d_namlen" "ac_cv_member_struct_dirent_d_namlen" " +$ac_includes_default +#include <$ac_header_dirent> + +" +if test "x$ac_cv_member_struct_dirent_d_namlen" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_DIRENT_D_NAMLEN 1 +_ACEOF + + +fi + +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + +else + + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`" + + _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/ *//g' -e 's/-l/_/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -l$lib${5+ }$extralibs" >&5 +$as_echo_n "checking for socket in -l$lib${5+ }$extralibs... " >&6; } + if { as_var=sudo_cv_lib_$lib''_socket$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then : + $as_echo_n "(cached) " >&6 +else + + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$lib${5+ }$extralibs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval sudo_cv_lib_$lib''_socket$_sudo_check_lib_extras=yes +else + eval sudo_cv_lib_$lib''_socket$_sudo_check_lib_extras=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$SUDO_CHECK_LIB_OLIBS" + +fi + + if eval test \$sudo_cv_lib_$lib''_socket$_sudo_check_lib_extras = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + NET_LIBS="${NET_LIBS} $libs"; break + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + fi + + done + +fi + +LIBS="$OLIBS" +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +found=false +INET_PTON_LIBS= +ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton" +if test "x$ac_cv_func_inet_pton" = xyes; then : + + found=true + $as_echo "#define HAVE_INET_PTON 1" >>confdefs.h + + +else + + for libs in "-lsocket" "-linet" "-lsocket -lnsl" "-lresolv"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`" + + _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/ *//g' -e 's/-l/_/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_pton in -l$lib${5+ }$extralibs" >&5 +$as_echo_n "checking for inet_pton in -l$lib${5+ }$extralibs... " >&6; } + if { as_var=sudo_cv_lib_$lib''_inet_pton$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then : + $as_echo_n "(cached) " >&6 +else + + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$lib${5+ }$extralibs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inet_pton (); +int +main () +{ +return inet_pton (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval sudo_cv_lib_$lib''_inet_pton$_sudo_check_lib_extras=yes +else + eval sudo_cv_lib_$lib''_inet_pton$_sudo_check_lib_extras=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$SUDO_CHECK_LIB_OLIBS" + +fi + + if eval test \$sudo_cv_lib_$lib''_inet_pton$_sudo_check_lib_extras = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + found=true + $as_echo "#define HAVE_INET_PTON 1" >>confdefs.h + + NET_LIBS="${NET_LIBS} $libs" + INET_PTON_LIBS="$libs" + case "$libs" in + *-lresolv*) + $as_echo "#define NEED_RESOLV_H 1" >>confdefs.h + + ;; + esac + break + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + fi + + done + +fi + +LIBS="$OLIBS" +if test X"$found" != X"true"; then + case " $LIBOBJS " in + *" inet_pton.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS inet_pton.$ac_objext" + ;; +esac + + + for _sym in sudo_inet_pton; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + +fi +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +found=false +ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" +if test "x$ac_cv_func_inet_ntop" = xyes; then : + + found=true + $as_echo "#define HAVE_INET_NTOP 1" >>confdefs.h + + +else + + for libs in "-lsocket" "-linet" "-lsocket -lnsl" "-lresolv"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`" + + _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/ *//g' -e 's/-l/_/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntop in -l$lib${5+ }$extralibs" >&5 +$as_echo_n "checking for inet_ntop in -l$lib${5+ }$extralibs... " >&6; } + if { as_var=sudo_cv_lib_$lib''_inet_ntop$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then : + $as_echo_n "(cached) " >&6 +else + + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$lib${5+ }$extralibs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntop (); +int +main () +{ +return inet_ntop (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval sudo_cv_lib_$lib''_inet_ntop$_sudo_check_lib_extras=yes +else + eval sudo_cv_lib_$lib''_inet_ntop$_sudo_check_lib_extras=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$SUDO_CHECK_LIB_OLIBS" + +fi + + if eval test \$sudo_cv_lib_$lib''_inet_ntop$_sudo_check_lib_extras = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + found=true + $as_echo "#define HAVE_INET_NTOP 1" >>confdefs.h + + NET_LIBS="${NET_LIBS} $libs" + break + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + fi + + done + +fi + +LIBS="$OLIBS" +if test X"$found" != X"true"; then + case " $LIBOBJS " in + *" inet_ntop.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext" + ;; +esac + + + for _sym in sudo_inet_ntop; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + +fi +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog" +if test "x$ac_cv_func_syslog" = xyes; then : + +else + + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`" + + _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/ *//g' -e 's/-l/_/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for syslog in -l$lib${5+ }$extralibs" >&5 +$as_echo_n "checking for syslog in -l$lib${5+ }$extralibs... " >&6; } + if { as_var=sudo_cv_lib_$lib''_syslog$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then : + $as_echo_n "(cached) " >&6 +else + + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$lib${5+ }$extralibs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char syslog (); +int +main () +{ +return syslog (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval sudo_cv_lib_$lib''_syslog$_sudo_check_lib_extras=yes +else + eval sudo_cv_lib_$lib''_syslog$_sudo_check_lib_extras=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$SUDO_CHECK_LIB_OLIBS" + +fi + + if eval test \$sudo_cv_lib_$lib''_syslog$_sudo_check_lib_extras = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + NET_LIBS="${NET_LIBS} $libs"; break + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + fi + + done + +fi + +LIBS="$OLIBS" +# +# Check for getaddrinfo and add any required libs to NET_LIBS. +# If it was added to LIBOBJS we need to export the symbols. +# +OLIBS="$LIBS" +GETADDRINFO_LIBS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 +$as_echo_n "checking for getaddrinfo... " >&6; } +if ${ax_cv_func_getaddrinfo+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +int main() { return getaddrinfo(0, 0, 0, 0); } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_func_getaddrinfo=yes +else + ax_cv_func_getaddrinfo=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_func_getaddrinfo" >&5 +$as_echo "$ax_cv_func_getaddrinfo" >&6; } +if test X"$ax_cv_func_getaddrinfo" = X"yes"; then + +$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h + +else + # Not found in libc, check libsocket and libinet + _found=no + for _libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _cv="ax_cv_lib_getaddrinfo`echo \"$_libs\"|sed -e 's/-l/_/g' -e 's/ *//g'`" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in $_libs" >&5 +$as_echo_n "checking for getaddrinfo in $_libs... " >&6; } + if eval \${$_cv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + _nlibs= + for _l in $_libs; do + case "$LIBS" in + *"$_l"*) ;; + *) _nlibs="$_nlibs $_l";; + esac + done + _libs="${_nlibs# }" + if test -z "$_libs"; then + # No new libs to check + eval $_cv=no + else + AX_FUNC_GETADDRINFO_OLIBS="$LIBS" + LIBS="$LIBS $_libs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include + int main() { return getaddrinfo(0, 0, 0, 0); } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval $_cv=yes +else + eval $_cv=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$AX_FUNC_GETADDRINFO_OLIBS" + fi + +fi + + if eval test \$$_cv = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h + + test -n "$_libs" && LIBS="$LIBS $_libs" + break + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + done + if eval test \$$_cv != "yes"; then + case " $LIBOBJS " in + *" getaddrinfo.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" + ;; +esac + + fi +fi + +case " $LIBOBJS " in + *" getaddrinfo.$ac_objext "* ) + + for _sym in sudo_getaddrinfo sudo_freeaddrinfo sudo_gai_strerror; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + # We need libsudo_util to pull in dependent libraries for + # inet_pton(), gethostbyname(), and getservbyname() + if test -n "${INET_PTON_LIBS}"; then + LT_DEP_LIBS="${LT_DEP_LIBS}${LT_DEP_LIBS+ }${INET_PTON_LIBS}" + LIBS="${LIBS}${LIBS+ }${INET_PTON_LIBS}" + fi + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +else + + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$LT_DEP_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[^ ]*//'`" + + _sudo_check_lib_extras=`echo "$extralibs"|sed -e 's/ *//g' -e 's/-l/_/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -l$lib${5+ }$extralibs" >&5 +$as_echo_n "checking for gethostbyname in -l$lib${5+ }$extralibs... " >&6; } + if { as_var=sudo_cv_lib_$lib''_gethostbyname$_sudo_check_lib_extras; eval \${$as_var+:} false; }; then : + $as_echo_n "(cached) " >&6 +else + + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$lib${5+ }$extralibs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval sudo_cv_lib_$lib''_gethostbyname$_sudo_check_lib_extras=yes +else + eval sudo_cv_lib_$lib''_gethostbyname$_sudo_check_lib_extras=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$SUDO_CHECK_LIB_OLIBS" + +fi + + if eval test \$sudo_cv_lib_$lib''_gethostbyname$_sudo_check_lib_extras = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + LT_DEP_LIBS="${LT_DEP_LIBS} $libs"; break + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + fi + + done + +fi + + ;; + *) + for lib in $LIBS; do + case "$OLIBS" in + *"$lib"*) ;; + *) GETADDRINFO_LIBS="${GETADDRINFO_LIBS}${GETADDRINFO_LIBS+ }$lib";; + esac + done + if test -n "${GETADDRINFO_LIBS}"; then + # We need libsudo_util to pull in dependent libraries for + # gai_strerror() + LT_DEP_LIBS="${LT_DEP_LIBS}${LT_DEP_LIBS+ }${GETADDRINFO_LIBS}" + LIBS="${LIBS}${LIBS+ }${GETADDRINFO_LIBS}" + + # Add to NET_LIBS if necessary + for lib in $GETADDRINFO_LIBS; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) NET_LIBS="${NET_LIBS}${NET_LIBS+ }$lib";; + esac + done + fi + ;; +esac +LIBS="$OLIBS" + +for ac_func in getprogname +do : + ac_fn_c_check_func "$LINENO" "getprogname" "ac_cv_func_getprogname" +if test "x$ac_cv_func_getprogname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETPROGNAME 1 +_ACEOF + for ac_func in setprogname +do : + ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname" +if test "x$ac_cv_func_setprogname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETPROGNAME 1 +_ACEOF + +fi +done + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5 +$as_echo_n "checking for __progname... " >&6; } + if ${sudo_cv___progname+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern char *__progname; (void)puts(__progname); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv___progname=yes +else + sudo_cv___progname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + + if test "$sudo_cv___progname" = "yes"; then + $as_echo "#define HAVE___PROGNAME 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv___progname" >&5 +$as_echo "$sudo_cv___progname" >&6; } + + for _sym in sudo_getprogname; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __func__" >&5 +$as_echo_n "checking for __func__... " >&6; } +if ${sudo_cv___func__+:} false; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +(void)puts(__func__); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv___func__=yes +else + sudo_cv___func__=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv___func__" >&5 +$as_echo "$sudo_cv___func__" >&6; } +if test "$sudo_cv___func__" = "yes"; then + $as_echo "#define HAVE___FUNC__ 1" >>confdefs.h + +elif test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __FUNCTION__" >&5 +$as_echo_n "checking for __FUNCTION__... " >&6; } + if ${sudo_cv___FUNCTION__+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +(void)puts(__FUNCTION__); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv___FUNCTION__=yes +else + sudo_cv___FUNCTION__=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv___FUNCTION__" >&5 +$as_echo "$sudo_cv___FUNCTION__" >&6; } + if test "$sudo_cv___FUNCTION__" = "yes"; then + $as_echo "#define HAVE___FUNC__ 1" >>confdefs.h + + +$as_echo "#define __func__ __FUNCTION__" >>confdefs.h + + fi +fi + +# gettext() and friends may be located in libc (Linux and Solaris) +# or in libintl. However, it is possible to have libintl installed +# even when gettext() is present in libc. In the case of GNU libintl, +# gettext() will be defined to gettext_libintl in libintl.h. +# Since gcc prefers /usr/local/include to /usr/include, we need to +# make sure we use the gettext() that matches the include file. +if test "$enable_nls" != "no"; then + if test "$enable_nls" != "yes"; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${enable_nls}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${enable_nls}/include"; } >&5 + (: CPPFLAGS already contains -I${enable_nls}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${enable_nls}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${enable_nls}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + +if ${LDFLAGS+:} false; then : + + case " $LDFLAGS " in #( + *" -L$enable_nls/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains -L\$enable_nls/lib"; } >&5 + (: LDFLAGS already contains -L$enable_nls/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " -L$enable_nls/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS=-L$enable_nls/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${LDFLAGS_R+:} false; then : + + case " $LDFLAGS_R " in #( + *" -R$enable_nls/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R already contains -R\$enable_nls/lib"; } >&5 + (: LDFLAGS_R already contains -R$enable_nls/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS_R " -R$enable_nls/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R=\"\$LDFLAGS_R\""; } >&5 + (: LDFLAGS_R="$LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS_R=-R$enable_nls/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS_R=\"\$LDFLAGS_R\""; } >&5 + (: LDFLAGS_R="$LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + fi + OLIBS="$LIBS" + for l in "libc" "-lintl" "-lintl -liconv"; do + if test "$l" = "libc"; then + # If user specified a dir for libintl ignore libc + if test "$enable_nls" != "yes"; then + continue + fi + gettext_name=sudo_cv_gettext + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext" >&5 +$as_echo_n "checking for gettext... " >&6; } + else + LIBS="$OLIBS $l" + gettext_name=sudo_cv_gettext"`echo $l|sed -e 's/ //g' -e 's/-/_/g'`" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in $l" >&5 +$as_echo_n "checking for gettext in $l... " >&6; } + fi + if eval \${$gettext_name+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include +int +main () +{ +(void)gettext((char *)0); + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval $gettext_name=yes +else + eval $gettext_name=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi + + eval gettext_result="\$$gettext_name" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gettext_result" >&5 +$as_echo "$gettext_result" >&6; } + if test "$gettext_result" = "yes"; then + for ac_func in ngettext +do : + ac_fn_c_check_func "$LINENO" "ngettext" "ac_cv_func_ngettext" +if test "x$ac_cv_func_ngettext" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NGETTEXT 1 +_ACEOF + +fi +done + + break + fi + done + LIBS="$OLIBS" + + if test "$sudo_cv_gettext" = "yes"; then + SUDO_NLS=enabled + # For Solaris we need links from lang to lang.UTF-8 in localedir + case "$host_os" in + solaris2*) LOCALEDIR_SUFFIX=".UTF-8";; + esac + elif test "$sudo_cv_gettext_lintl" = "yes"; then + SUDO_NLS=enabled + LIBINTL="-lintl" + elif test "$sudo_cv_gettext_lintl_liconv" = "yes"; then + SUDO_NLS=enabled + LIBINTL="-lintl -liconv" + fi + if test X"$SUDO_NLS" = X"enabled"; then + $as_echo "#define HAVE_LIBINTL_H 1" >>confdefs.h + + + for _sym in sudo_warn_gettext_v1; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + fi +fi + +case "$enable_zlib" in + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzdopen in -lz" >&5 +$as_echo_n "checking for gzdopen in -lz... " >&6; } +if ${ac_cv_lib_z_gzdopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzdopen (); +int +main () +{ +return gzdopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzdopen=yes +else + ac_cv_lib_z_gzdopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzdopen" >&5 +$as_echo "$ac_cv_lib_z_gzdopen" >&6; } +if test "x$ac_cv_lib_z_gzdopen" = xyes; then : + + for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZLIB_H 1 +_ACEOF + ZLIB="-lz" +else + enable_zlib=builtin +fi + +done + + +fi + + ;; + no) + ;; + system) + $as_echo "#define HAVE_ZLIB_H 1" >>confdefs.h + + ZLIB="-lz" + ;; + static|shared|builtin) + # handled below + ;; + *) + $as_echo "#define HAVE_ZLIB_H 1" >>confdefs.h + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${enable_zlib}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${enable_zlib}/include"; } >&5 + (: CPPFLAGS already contains -I${enable_zlib}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${enable_zlib}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${enable_zlib}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + +if ${ZLIB+:} false; then : + + case " $ZLIB " in #( + *" -L$enable_zlib/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB already contains -L\$enable_zlib/lib"; } >&5 + (: ZLIB already contains -L$enable_zlib/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append ZLIB " -L$enable_zlib/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB=\"\$ZLIB\""; } >&5 + (: ZLIB="$ZLIB") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + ZLIB=-L$enable_zlib/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB=\"\$ZLIB\""; } >&5 + (: ZLIB="$ZLIB") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${ZLIB_R+:} false; then : + + case " $ZLIB_R " in #( + *" -R$enable_zlib/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB_R already contains -R\$enable_zlib/lib"; } >&5 + (: ZLIB_R already contains -R$enable_zlib/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append ZLIB_R " -R$enable_zlib/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB_R=\"\$ZLIB_R\""; } >&5 + (: ZLIB_R="$ZLIB_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + ZLIB_R=-R$enable_zlib/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : ZLIB_R=\"\$ZLIB_R\""; } >&5 + (: ZLIB_R="$ZLIB_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + ZLIB="${ZLIB} -lz" + ;; +esac +case "$enable_zlib" in + builtin|static|dynamic) + $as_echo "#define HAVE_ZLIB_H 1" >>confdefs.h + + # XXX - can't use AX_APPEND_FLAG due to use of $(top_foo) and quoting + CPPFLAGS='-I$(top_builddir)/lib/zlib -I$(top_srcdir)/lib/zlib '"${CPPFLAGS}" + ZLIB="${ZLIB}"' $(top_builddir)/lib/zlib/libsudo_z.la' + ZLIB_SRC=lib/zlib + ac_config_headers="$ac_config_headers lib/zlib/zconf.h" + + ac_config_files="$ac_config_files lib/zlib/Makefile" + + if test X"$enable_shared" = X"no" -o "$enable_zlib" = "static"; then + if test "$enable_zlib" = "shared"; then + as_fn_error $? "\"Unable to build shared libraries on this system\"" "$LINENO" 5 + fi + # Build as convenience library + ZLIB_LDFLAGS=-no-install + fi + ;; +esac + +ac_fn_c_check_decl "$LINENO" "errno" "ac_cv_have_decl_errno" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_errno" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ERRNO $ac_have_decl +_ACEOF + + +ac_fn_c_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_h_errno" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_H_ERRNO $ac_have_decl +_ACEOF + + +ac_fn_c_check_decl "$LINENO" "LLONG_MAX" "ac_cv_have_decl_LLONG_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_LLONG_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_LLONG_MAX $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "LLONG_MIN" "ac_cv_have_decl_LLONG_MIN" " +#include +#include + +" +if test "x$ac_cv_have_decl_LLONG_MIN" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_LLONG_MIN $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "ULLONG_MAX" "ac_cv_have_decl_ULLONG_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_ULLONG_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_ULLONG_MAX $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "PATH_MAX" "ac_cv_have_decl_PATH_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_PATH_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PATH_MAX $ac_have_decl +_ACEOF + +ac_fn_c_check_decl "$LINENO" "SIZE_MAX" "ac_cv_have_decl_SIZE_MAX" " +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif + +" +if test "x$ac_cv_have_decl_SIZE_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SIZE_MAX $ac_have_decl +_ACEOF + +if test "$ac_cv_have_decl_LLONG_MAX" != "yes"; then + ac_fn_c_check_decl "$LINENO" "QUAD_MAX" "ac_cv_have_decl_QUAD_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_QUAD_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_QUAD_MAX $ac_have_decl +_ACEOF + +fi +if test "$ac_cv_have_decl_LLONG_MIN" != "yes"; then + ac_fn_c_check_decl "$LINENO" "QUAD_MIN" "ac_cv_have_decl_QUAD_MIN" " +#include +#include + +" +if test "x$ac_cv_have_decl_QUAD_MIN" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_QUAD_MIN $ac_have_decl +_ACEOF + +fi +if test "$ac_cv_have_decl_ULLONG_MAX" != "yes"; then + ac_fn_c_check_decl "$LINENO" "UQUAD_MAX" "ac_cv_have_decl_UQUAD_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_UQUAD_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_UQUAD_MAX $ac_have_decl +_ACEOF + +fi +if test "$ac_cv_have_decl_SIZE_MAX" != "yes"; then + ac_fn_c_check_decl "$LINENO" "SIZE_T_MAX" "ac_cv_have_decl_SIZE_T_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl_SIZE_T_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SIZE_T_MAX $ac_have_decl +_ACEOF + +fi +if test "$ac_cv_have_decl_PATH_MAX" != "yes"; then + ac_fn_c_check_decl "$LINENO" "_POSIX_PATH_MAX" "ac_cv_have_decl__POSIX_PATH_MAX" " +#include +#include + +" +if test "x$ac_cv_have_decl__POSIX_PATH_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__POSIX_PATH_MAX $ac_have_decl +_ACEOF + +fi + +for ac_func in strsignal +do : + ac_fn_c_check_func "$LINENO" "strsignal" "ac_cv_func_strsignal" +if test "x$ac_cv_func_strsignal" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRSIGNAL 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" strsignal.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strsignal.$ac_objext" + ;; +esac + + + for _sym in sudo_strsignal; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + HAVE_SIGLIST="false" + ac_fn_c_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_sys_siglist" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + + HAVE_SIGLIST="true" + +fi +ac_fn_c_check_decl "$LINENO" "_sys_siglist" "ac_cv_have_decl__sys_siglist" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl__sys_siglist" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SYS_SIGLIST $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + + HAVE_SIGLIST="true" + +fi + + if test "$HAVE_SIGLIST" != "true"; then + case " $LIBOBJS " in + *" siglist.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS siglist.$ac_objext" + ;; +esac + + fi + +fi +done + + +for ac_func in sig2str +do : + ac_fn_c_check_func "$LINENO" "sig2str" "ac_cv_func_sig2str" +if test "x$ac_cv_func_sig2str" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SIG2STR 1 +_ACEOF + + ac_fn_c_check_decl "$LINENO" "SIG2STR_MAX" "ac_cv_have_decl_SIG2STR_MAX" " +# include + +" +if test "x$ac_cv_have_decl_SIG2STR_MAX" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SIG2STR_MAX $ac_have_decl +_ACEOF + +else + + case " $LIBOBJS " in + *" sig2str.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS sig2str.$ac_objext" + ;; +esac + + + for _sym in sudo_sig2str; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + +for ac_func in str2sig +do : + ac_fn_c_check_func "$LINENO" "str2sig" "ac_cv_func_str2sig" +if test "x$ac_cv_func_str2sig" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STR2SIG 1 +_ACEOF + +else + + case " $LIBOBJS " in + *" str2sig.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS str2sig.$ac_objext" + ;; +esac + + + for _sym in sudo_str2sig; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done + + +fi +done + + +if test x"${ac_cv_func_sig2str}${ac_cv_func_str2sig}" != x"yesyes"; then + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }strsig_test" + HAVE_SIGNAME="false" + ac_fn_c_check_decl "$LINENO" "sys_signame" "ac_cv_have_decl_sys_signame" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_sys_signame" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGNAME $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + + HAVE_SIGNAME="true" + +fi +ac_fn_c_check_decl "$LINENO" "_sys_signame" "ac_cv_have_decl__sys_signame" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl__sys_signame" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SYS_SIGNAME $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + + HAVE_SIGNAME="true" + +fi +ac_fn_c_check_decl "$LINENO" "sys_sigabbrev" "ac_cv_have_decl_sys_sigabbrev" " +$ac_includes_default +#include + +" +if test "x$ac_cv_have_decl_sys_sigabbrev" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGABBREV $ac_have_decl +_ACEOF +if test $ac_have_decl = 1; then : + + HAVE_SIGNAME="true" + +fi + + if test "$HAVE_SIGNAME" != "true"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for undeclared sys_sigabbrev" >&5 +$as_echo_n "checking for undeclared sys_sigabbrev... " >&6; } +if ${sudo_cv_var_sys_sigabbrev+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +extern char **sys_sigabbrev; +int +main () +{ +return sys_sigabbrev[1]; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_var_sys_sigabbrev=yes +else + sudo_cv_var_sys_sigabbrev=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_sys_sigabbrev" >&5 +$as_echo "$sudo_cv_var_sys_sigabbrev" >&6; } + if test "$sudo_cv_var_sys_sigabbrev" = yes; then + $as_echo "#define HAVE_SYS_SIGABBREV 1" >>confdefs.h + + else + case " $LIBOBJS " in + *" signame.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS signame.$ac_objext" + ;; +esac + + SIGNAME=signame.lo + fi + fi +fi + +OLIBS="$LIBS" +LIBS="$LIBS $lt_cv_dlopen_libs" +for ac_func in dl_iterate_phdr +do : + ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr" +if test "x$ac_cv_func_dl_iterate_phdr" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DL_ITERATE_PHDR 1 +_ACEOF + +fi +done + +LIBS="$OLIBS" + +if test ${with_netsvc-"no"} != "no"; then + cat >>confdefs.h <>confdefs.h <&5 +$as_echo_n "checking for pam_start in -lpam... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $lt_cv_dlopen_libs $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pam_start (); +int +main () +{ +return pam_start (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + found_pam_lib=yes +fi + + # + # Some PAM implementations (macOS for example) put the PAM headers + # in /usr/include/pam instead of /usr/include/security... + # + found_pam_hdrs=no + for ac_header in security/pam_appl.h pam/pam_appl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + found_pam_hdrs=yes; break +fi + +done + + if test "$found_pam_lib" = "yes" -a "$found_pam_hdrs" = "yes"; then + # Found both PAM libs and headers + with_pam=yes + elif test "$with_pam" = "yes"; then + if test "$found_pam_lib" = "no"; then + as_fn_error $? "\"--with-pam specified but unable to locate PAM development library.\"" "$LINENO" 5 + fi + if test "$found_pam_hdrs" = "no"; then + as_fn_error $? "\"--with-pam specified but unable to locate PAM development headers.\"" "$LINENO" 5 + fi + elif test "$found_pam_lib" != "$found_pam_hdrs"; then + if test "$found_pam_lib" = "no"; then + as_fn_error $? "\"found PAM headers but no PAM development library; specify --without-pam to build without PAM\"" "$LINENO" 5 + fi + if test "$found_pam_hdrs" = "no"; then + as_fn_error $? "\"found PAM library but no PAM development headers; specify --without-pam to build without PAM\"" "$LINENO" 5 + fi + fi + + if test "$with_pam" = "yes"; then + # Older PAM implementations lack pam_getenvlist + OLIBS="$LIBS" + LIBS="$LIBS -lpam $lt_cv_dlopen_libs" + for ac_func in pam_getenvlist +do : + ac_fn_c_check_func "$LINENO" "pam_getenvlist" "ac_cv_func_pam_getenvlist" +if test "x$ac_cv_func_pam_getenvlist" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PAM_GETENVLIST 1 +_ACEOF + +fi +done + + LIBS="$OLIBS" + + # We already link with -ldl if needed (see LIBDL below) + SUDOERS_LIBS="${SUDOERS_LIBS} -lpam" + $as_echo "#define HAVE_PAM 1" >>confdefs.h + + AUTH_OBJS="$AUTH_OBJS pam.lo"; + AUTH_EXCL=PAM + + +# Check whether --with-pam-login was given. +if test "${with_pam_login+set}" = set; then : + withval=$with_pam_login; case $with_pam_login in + yes) $as_echo "#define HAVE_PAM_LOGIN 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use PAM login" >&5 +$as_echo_n "checking whether to use PAM login... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + pam_login_service="sudo-i" + ;; + no) ;; + *) as_fn_error $? "\"--with-pam-login does not take an argument.\"" "$LINENO" 5 + ;; + esac +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use PAM session support" >&5 +$as_echo_n "checking whether to use PAM session support... " >&6; } + # Check whether --enable-pam_session was given. +if test "${enable_pam_session+set}" = set; then : + enableval=$enable_pam_session; case "$enableval" in + yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + $as_echo "#define NO_PAM_SESSION 1" >>confdefs.h + + pam_session=off + ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring unknown argument to --enable-pam-session: $enableval" >&5 +$as_echo "$as_me: WARNING: Ignoring unknown argument to --enable-pam-session: $enableval" >&2;} + ;; + esac +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + + fi +fi + +if test ${with_aixauth-'no'} != "no"; then + for ac_func in authenticate +do : + ac_fn_c_check_func "$LINENO" "authenticate" "ac_cv_func_authenticate" +if test "x$ac_cv_func_authenticate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_AUTHENTICATE 1 +_ACEOF + with_aixauth=yes +fi +done + + if test "${with_aixauth}" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: using AIX general authentication" >&5 +$as_echo "$as_me: using AIX general authentication" >&6;} + $as_echo "#define HAVE_AIXAUTH 1" >>confdefs.h + + AUTH_OBJS="$AUTH_OBJS aix_auth.lo"; + SUDOERS_LIBS="${SUDOERS_LIBS} -ls" + AUTH_EXCL=AIX_AUTH + fi +fi + +if test ${with_bsdauth-'no'} != "no"; then + ac_fn_c_check_header_mongrel "$LINENO" "bsd_auth.h" "ac_cv_header_bsd_auth_h" "$ac_includes_default" +if test "x$ac_cv_header_bsd_auth_h" = xyes; then : + $as_echo "#define HAVE_BSD_AUTH_H 1" >>confdefs.h + + AUTH_OBJS="$AUTH_OBJS bsdauth.lo" + BSDAUTH_USAGE='[-a type] ' + AUTH_EXCL=BSD_AUTH; BAMAN=1 +else + as_fn_error $? "BSD authentication was specified but bsd_auth.h could not be found" "$LINENO" 5 +fi + + +fi + +if test ${CHECKSIA-'false'} = "true"; then + for ac_func in sia_ses_init +do : + ac_fn_c_check_func "$LINENO" "sia_ses_init" "ac_cv_func_sia_ses_init" +if test "x$ac_cv_func_sia_ses_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SIA_SES_INIT 1 +_ACEOF + found=true +else + found=false +fi +done + + if test "$found" = "true"; then + AUTH_EXCL=SIA + AUTH_OBJS="$AUTH_OBJS sia.lo" + fi +fi + +if test ${with_fwtk-'no'} != "no"; then + if test "$with_fwtk" != "yes"; then + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_fwtk} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_fwtk}"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_fwtk}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_fwtk}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_fwtk} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_fwtk} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_fwtk}"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_fwtk}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_fwtk}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_fwtk} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_fwtk} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_fwtk}"; } >&5 + (: CPPFLAGS already contains -I${with_fwtk}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_fwtk}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_fwtk} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + with_fwtk=yes + fi + SUDOERS_LIBS="${SUDOERS_LIBS} -lauth -lfwall" + AUTH_OBJS="$AUTH_OBJS fwtk.lo" +fi + +if test ${with_SecurID-'no'} != "no"; then + if test "$with_SecurID" != "yes"; then + : + elif test -d /usr/ace/examples; then + with_SecurID=/usr/ace/examples + else + with_SecurID=/usr/ace + fi + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_SecurID} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_SecurID}"; } >&5 + (: CPPFLAGS already contains -I${with_SecurID}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_SecurID}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_SecurID} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_SecurID} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_SecurID}"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_SecurID}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_SecurID}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_SecurID} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_SecurID} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_SecurID}"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_SecurID}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_SecurID}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_SecurID} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + SUDOERS_LIBS="${SUDOERS_LIBS} -laceclnt -lpthread" + AUTH_OBJS="$AUTH_OBJS securid5.lo"; +fi + + +if test -z "${AUTH_EXCL}" -a -n "$AUTH_DEF"; then + for auth in $AUTH_DEF; do + case $auth in + passwd) : ${with_passwd='maybe'};; + esac + done +fi + +if test ${with_kerb5-'no'} != "no"; then + # Extract the first word of "krb5-config", so it can be a program name with args. +set dummy krb5-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_KRB5CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$KRB5CONFIG"; then + ac_cv_prog_KRB5CONFIG="$KRB5CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_KRB5CONFIG="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_KRB5CONFIG" && ac_cv_prog_KRB5CONFIG="""" +fi +fi +KRB5CONFIG=$ac_cv_prog_KRB5CONFIG +if test -n "$KRB5CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KRB5CONFIG" >&5 +$as_echo "$KRB5CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test -n "$KRB5CONFIG"; then + $as_echo "#define HAVE_KERB5 1" >>confdefs.h + + AUTH_OBJS="$AUTH_OBJS kerb5.lo" + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" `krb5-config --cflags` "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains \`krb5-config --cflags\`"; } >&5 + (: CPPFLAGS already contains `krb5-config --cflags`) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " `krb5-config --cflags`" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=`krb5-config --cflags` + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + SUDOERS_LIBS="$SUDOERS_LIBS `krb5-config --libs`" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Heimdal" >&5 +$as_echo_n "checking whether we are using Heimdal... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +const char *tmp = heimdal_version; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_HEIMDAL 1" >>confdefs.h + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + else + $as_echo "#define HAVE_KERB5 1" >>confdefs.h + + if test "$with_kerb5" = "yes"; then + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "kerberosV/" "krb5/" "kerberos5/" "kerberosv5/"; do + CPPFLAGS="$O_CPPFLAGS -I/usr/include/${dir}" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + found=yes; break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + done + if test X"$found" = X"no"; then + CPPFLAGS="$O_CPPFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate Kerberos V include files, you will have to edit the Makefile and add -I/path/to/krb/includes to CPPFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate Kerberos V include files, you will have to edit the Makefile and add -I/path/to/krb/includes to CPPFLAGS" >&2;} + fi + else + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_kerb5}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_kerb5}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_kerb5}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_kerb5}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_kerb5}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_kerb5}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_kerb5}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_kerb5}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_kerb5}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_kerb5}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_kerb5}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_kerb5}/include"; } >&5 + (: CPPFLAGS already contains -I${with_kerb5}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_kerb5}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_kerb5}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Heimdal" >&5 +$as_echo_n "checking whether we are using Heimdal... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +const char *tmp = heimdal_version; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_HEIMDAL 1" >>confdefs.h + + # XXX - need to check whether -lcrypo is needed! + SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5 -lcrypto -ldes -lcom_err -lasn1" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lroken" >&5 +$as_echo_n "checking for main in -lroken... " >&6; } +if ${ac_cv_lib_roken_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lroken $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_roken_main=yes +else + ac_cv_lib_roken_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_roken_main" >&5 +$as_echo "$ac_cv_lib_roken_main" >&6; } +if test "x$ac_cv_lib_roken_main" = xyes; then : + SUDOERS_LIBS="${SUDOERS_LIBS} -lroken" +fi + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5 -lk5crypto -lcom_err" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lkrb5support" >&5 +$as_echo_n "checking for main in -lkrb5support... " >&6; } +if ${ac_cv_lib_krb5support_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lkrb5support $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_krb5support_main=yes +else + ac_cv_lib_krb5support_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_krb5support_main" >&5 +$as_echo "$ac_cv_lib_krb5support_main" >&6; } +if test "x$ac_cv_lib_krb5support_main" = xyes; then : + SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5support" +fi + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + AUTH_OBJS="$AUTH_OBJS kerb5.lo" + fi + _LIBS="$LIBS" + LIBS="${LIBS} ${SUDOERS_LIBS}" + for ac_func in krb5_verify_user krb5_init_secure_context +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + for ac_func in krb5_get_init_creds_opt_alloc +do : + ac_fn_c_check_func "$LINENO" "krb5_get_init_creds_opt_alloc" "ac_cv_func_krb5_get_init_creds_opt_alloc" +if test "x$ac_cv_func_krb5_get_init_creds_opt_alloc" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether krb5_get_init_creds_opt_free takes a context" >&5 +$as_echo_n "checking whether krb5_get_init_creds_opt_free takes a context... " >&6; } +if ${sudo_cv_krb5_get_init_creds_opt_free_two_args+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +krb5_get_init_creds_opt_free(NULL, NULL); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_krb5_get_init_creds_opt_free_two_args=yes +else + sudo_cv_krb5_get_init_creds_opt_free_two_args=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_krb5_get_init_creds_opt_free_two_args" >&5 +$as_echo "$sudo_cv_krb5_get_init_creds_opt_free_two_args" >&6; } + +fi +done + + if test X"$sudo_cv_krb5_get_init_creds_opt_free_two_args" = X"yes"; then + $as_echo "#define HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS 1" >>confdefs.h + + fi + LIBS="$_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use an instance name for Kerberos V" >&5 +$as_echo_n "checking whether to use an instance name for Kerberos V... " >&6; } + # Check whether --enable-kerb5-instance was given. +if test "${enable_kerb5_instance+set}" = set; then : + enableval=$enable_kerb5_instance; case "$enableval" in + yes) as_fn_error $? "\"must give --enable-kerb5-instance an argument.\"" "$LINENO" 5 + ;; + no) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) cat >>confdefs.h <&5 +$as_echo "$enableval" >&6; } + ;; + esac +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +fi + +if test ${with_AFS-'no'} = "yes"; then + + # looks like the "standard" place for AFS libs is /usr/afsws/lib + AFSLIBDIRS="/usr/lib/afs /usr/afsws/lib /usr/afsws/lib/afs" + for i in $AFSLIBDIRS; do + if test -d ${i}; then + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L$i "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\$i"; } >&5 + (: SUDOERS_LDFLAGS already contains -L$i) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L$i" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L$i + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R$i "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\$i"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R$i) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R$i" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R$i + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + FOUND_AFSLIBDIR=true + fi + done + if test -z "$FOUND_AFSLIBDIR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate AFS libraries, you will have to edit the Makefile and add -L/path/to/afs/libs to SUDOERS_LDFLAGS or rerun configure with the --with-libpath options." >&5 +$as_echo "$as_me: WARNING: Unable to locate AFS libraries, you will have to edit the Makefile and add -L/path/to/afs/libs to SUDOERS_LDFLAGS or rerun configure with the --with-libpath options." >&2;} + fi + + # Order is important here. Note that we build AFS_LIBS from right to left + # since AFS_LIBS may be initialized with BSD compat libs that must go last + AFS_LIBS="-laudit ${AFS_LIBS}" + for i in $AFSLIBDIRS; do + if test -f ${i}/util.a; then + AFS_LIBS="${i}/util.a ${AFS_LIBS}" + FOUND_UTIL_A=true + break; + fi + done + if test -z "$FOUND_UTIL_A"; then + AFS_LIBS="-lutil ${AFS_LIBS}" + fi + AFS_LIBS="-lkauth -lprot -lubik -lauth -lrxkad -lsys -ldes -lrx -llwp -lcom_err ${AFS_LIBS}" + + # AFS includes may live in /usr/include on some machines... + for i in /usr/afsws/include; do + if test -d ${i}; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${i} "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${i}"; } >&5 + (: CPPFLAGS already contains -I${i}) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${i}" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${i} + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + FOUND_AFSINCDIR=true + fi + done + + if test -z "$FOUND_AFSLIBDIR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate AFS include dir, you may have to edit the Makefile and add -I/path/to/afs/includes to CPPFLAGS or rerun configure with the --with-incpath options." >&5 +$as_echo "$as_me: WARNING: Unable to locate AFS include dir, you may have to edit the Makefile and add -I/path/to/afs/includes to CPPFLAGS or rerun configure with the --with-incpath options." >&2;} + fi + + AUTH_OBJS="$AUTH_OBJS afs.lo" +fi + +if test ${with_DCE-'no'} = "yes"; then + DCE_OBJS="${DCE_OBJS} dce_pwent.o" + SUDOERS_LIBS="${SUDOERS_LIBS} -ldce" + AUTH_OBJS="$AUTH_OBJS dce.lo" +fi + +if test "${with_skey-'no'}" = "yes"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_skey" != "yes"; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_skey}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_skey}/include"; } >&5 + (: CPPFLAGS already contains -I${with_skey}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_skey}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_skey}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + LDFLAGS="$LDFLAGS -L${with_skey}/lib" + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_skey}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_skey}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_skey}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_skey}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_skey}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_skey}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_skey}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_skey}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_skey}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_skey}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + ac_fn_c_check_header_compile "$LINENO" "skey.h" "ac_cv_header_skey_h" "#include +" +if test "x$ac_cv_header_skey_h" = xyes; then : + found=yes +else + found=no +fi + + + else + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "/usr/local" "/usr/contrib"; do + test -n "$dir" && CPPFLAGS="$O_CPPFLAGS -I${dir}/include" + ac_fn_c_check_header_compile "$LINENO" "skey.h" "ac_cv_header_skey_h" "#include +" +if test "x$ac_cv_header_skey_h" = xyes; then : + found=yes; break +fi + + + done + if test "$found" = "no" -o -z "$dir"; then + CPPFLAGS="$O_CPPFLAGS" + else + LDFLAGS="$LDFLAGS -L${dir}/lib" + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${dir}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${dir}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${dir}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${dir}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${dir}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${dir}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${dir}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${dir}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${dir}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${dir}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + fi + if test "$found" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate skey.h, you will have to edit the Makefile and add -I/path/to/skey/includes to CPPFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate skey.h, you will have to edit the Makefile and add -I/path/to/skey/includes to CPPFLAGS" >&2;} + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lskey" >&5 +$as_echo_n "checking for main in -lskey... " >&6; } +if ${ac_cv_lib_skey_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lskey $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_skey_main=yes +else + ac_cv_lib_skey_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_skey_main" >&5 +$as_echo "$ac_cv_lib_skey_main" >&6; } +if test "x$ac_cv_lib_skey_main" = xyes; then : + found=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate libskey.a, you will have to edit the Makefile and add -L/path/to/skey/lib to SUDOERS_LDFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate libskey.a, you will have to edit the Makefile and add -L/path/to/skey/lib to SUDOERS_LDFLAGS" >&2;} +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for skeyaccess in -lskey" >&5 +$as_echo_n "checking for skeyaccess in -lskey... " >&6; } +if ${ac_cv_lib_skey_skeyaccess+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lskey $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char skeyaccess (); +int +main () +{ +return skeyaccess (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_skey_skeyaccess=yes +else + ac_cv_lib_skey_skeyaccess=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_skey_skeyaccess" >&5 +$as_echo "$ac_cv_lib_skey_skeyaccess" >&6; } +if test "x$ac_cv_lib_skey_skeyaccess" = xyes; then : + $as_echo "#define HAVE_SKEYACCESS 1" >>confdefs.h + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RFC1938-compliant skeychallenge" >&5 +$as_echo_n "checking for RFC1938-compliant skeychallenge... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# include +# include +int +main () +{ +skeychallenge(NULL, NULL, NULL, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + $as_echo "#define HAVE_RFC1938_SKEYCHALLENGE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + LDFLAGS="$O_LDFLAGS" + SUDOERS_LIBS="${SUDOERS_LIBS} -lskey" + AUTH_OBJS="$AUTH_OBJS rfc1938.lo" +fi + +if test "${with_opie-'no'}" = "yes"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_opie" != "yes"; then + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_opie}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_opie}/include"; } >&5 + (: CPPFLAGS already contains -I${with_opie}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_opie}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_opie}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + LDFLAGS="$LDFLAGS -L${with_opie}/lib" + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_opie}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_opie}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_opie}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_opie}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_opie}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_opie}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_opie}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_opie}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_opie}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_opie}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + found=yes +else + found=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext + else + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "/usr/local" "/usr/contrib"; do + test -n "$dir" && CPPFLAGS="$O_CPPFLAGS -I${dir}/include" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + found=yes; break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + done + if test "$found" = "no" -o -z "$dir"; then + CPPFLAGS="$O_CPPFLAGS" + else + LDFLAGS="$LDFLAGS -L${dir}/lib" + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${dir}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${dir}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${dir}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${dir}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${dir}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${dir}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${dir}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${dir}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${dir}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${dir}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + fi + if test "$found" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate opie.h, you will have to edit the Makefile and add -I/path/to/opie/includes to CPPFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate opie.h, you will have to edit the Makefile and add -I/path/to/opie/includes to CPPFLAGS" >&2;} + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lopie" >&5 +$as_echo_n "checking for main in -lopie... " >&6; } +if ${ac_cv_lib_opie_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lopie $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_opie_main=yes +else + ac_cv_lib_opie_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_opie_main" >&5 +$as_echo "$ac_cv_lib_opie_main" >&6; } +if test "x$ac_cv_lib_opie_main" = xyes; then : + found=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate libopie.a, you will have to edit the Makefile and add -L/path/to/opie/lib to SUDOERS_LDFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate libopie.a, you will have to edit the Makefile and add -L/path/to/opie/lib to SUDOERS_LDFLAGS" >&2;} +fi + + LDFLAGS="$O_LDFLAGS" + SUDOERS_LIBS="${SUDOERS_LIBS} -lopie" + AUTH_OBJS="$AUTH_OBJS rfc1938.lo" +fi + +if test ${with_passwd-'no'} != "no"; then + if test -z "$LIB_CRYPT"; then + _LIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 +$as_echo_n "checking for library containing crypt... " >&6; } +if ${ac_cv_search_crypt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char crypt (); +int +main () +{ +return crypt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' crypt crypt_d ufc; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_crypt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_crypt+:} false; then : + break +fi +done +if ${ac_cv_search_crypt+:} false; then : + +else + ac_cv_search_crypt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 +$as_echo "$ac_cv_search_crypt" >&6; } +ac_res=$ac_cv_search_crypt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + test "${ac_cv_search_crypt}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_crypt}" + +fi + + LIBS="$_LIBS" + fi + + if test "$CHECKSHADOW" = "true" -a -n "$shadow_funcs"; then + _LIBS="$LIBS" + LIBS="$LIBS $shadow_libs" + found=no + for ac_func in $shadow_funcs +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + found=yes +fi +done + + if test "$found" = "yes"; then + case "$shadow_funcs" in + *getprpwnam*) SECUREWARE=1;; + esac + else + shadow_libs= + fi + CHECKSHADOW=false + LIBS="$_LIBS" + fi + if test "$CHECKSHADOW" = "true"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getspnam" >&5 +$as_echo_n "checking for library containing getspnam... " >&6; } +if ${ac_cv_search_getspnam+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getspnam (); +int +main () +{ +return getspnam (); + ; + return 0; +} +_ACEOF +for ac_lib in '' gen shadow; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getspnam=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_getspnam+:} false; then : + break +fi +done +if ${ac_cv_search_getspnam+:} false; then : + +else + ac_cv_search_getspnam=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getspnam" >&5 +$as_echo "$ac_cv_search_getspnam" >&6; } +ac_res=$ac_cv_search_getspnam +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + $as_echo "#define HAVE_GETSPNAM 1" >>confdefs.h + + test "${ac_cv_search_getspnam}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_getspnam}" + CHECKSHADOW=false + +fi + + fi + if test "$CHECKSHADOW" = "true"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getprpwnam" >&5 +$as_echo_n "checking for library containing getprpwnam... " >&6; } +if ${ac_cv_search_getprpwnam+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getprpwnam (); +int +main () +{ +return getprpwnam (); + ; + return 0; +} +_ACEOF +for ac_lib in '' sec security prot; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getprpwnam=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_getprpwnam+:} false; then : + break +fi +done +if ${ac_cv_search_getprpwnam+:} false; then : + +else + ac_cv_search_getprpwnam=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getprpwnam" >&5 +$as_echo "$ac_cv_search_getprpwnam" >&6; } +ac_res=$ac_cv_search_getprpwnam +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + $as_echo "#define HAVE_GETPRPWNAM 1" >>confdefs.h + + test "${ac_cv_search_getprpwnam}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_getprpwnam}" + SECUREWARE=1 + CHECKSHADOW=false + +fi + + fi + if test -n "$shadow_libs"; then + # sudoers needs to link with shadow libs for password auth + SUDOERS_LIBS="$SUDOERS_LIBS $shadow_libs" + fi + if test -n "$SECUREWARE"; then + _LIBS="$LIBS" + LIBS="$LIBS $shadow_libs" + for ac_func in bigcrypt +do : + ac_fn_c_check_func "$LINENO" "bigcrypt" "ac_cv_func_bigcrypt" +if test "x$ac_cv_func_bigcrypt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIGCRYPT 1 +_ACEOF + +fi +done + + AUTH_OBJS="$AUTH_OBJS secureware.lo" + # set_auth_parameters() and initprivs() are called from sudo.c + for ac_func in set_auth_parameters initprivs +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + test -n "$shadow_libs" && SUDO_LIBS="$SUDO_LIBS $shadow_libs" +fi +done + + LIBS="$_LIBS" + fi +fi + +if test X"$with_bsm_audit" = X"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether au_close() takes 4 arguments" >&5 +$as_echo_n "checking whether au_close() takes 4 arguments... " >&6; } +if ${sudo_cv_func_au_close_solaris11+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#include +#include +#include + +int au_close(int d, int keep, au_event_t event, au_emod_t emod) {return 0;} +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + sudo_cv_func_au_close_solaris11=yes +else + sudo_cv_func_au_close_solaris11=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_func_au_close_solaris11" >&5 +$as_echo "$sudo_cv_func_au_close_solaris11" >&6; } + if test $sudo_cv_func_au_close_solaris11 = yes; then + +$as_echo "#define HAVE_AU_CLOSE_SOLARIS11 1" >>confdefs.h + + fi + +fi + +if test X"$enable_poll" = X""; then + for ac_func in ppoll poll +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + enable_poll=yes; break +else + enable_poll=no +fi +done + +elif test X"$enable_poll" = X"yes"; then + for ac_func in ppoll +do : + ac_fn_c_check_func "$LINENO" "ppoll" "ac_cv_func_ppoll" +if test "x$ac_cv_func_ppoll" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PPOLL 1 +_ACEOF + +else + $as_echo "#define HAVE_POLL 1" >>confdefs.h + +fi +done + +fi +if test "$enable_poll" = "yes"; then + COMMON_OBJS="${COMMON_OBJS} event_poll.lo" +else + for ac_func in pselect +do : + ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect" +if test "x$ac_cv_func_pselect" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_PSELECT 1 +_ACEOF + +fi +done + + COMMON_OBJS="${COMMON_OBJS} event_select.lo" +fi + +if test ${with_ldap-'no'} != "no"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_ldap" != "yes"; then + + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -L${with_ldap}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -L\${with_ldap}/lib"; } >&5 + (: SUDOERS_LDFLAGS already contains -L${with_ldap}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -L${with_ldap}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-L${with_ldap}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + if test X"$enable_rpath" = X"yes"; then + +if ${SUDOERS_LDFLAGS_R+:} false; then : + + case " $SUDOERS_LDFLAGS_R " in #( + *" -R${with_ldap}/lib "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R already contains -R\${with_ldap}/lib"; } >&5 + (: SUDOERS_LDFLAGS_R already contains -R${with_ldap}/lib) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS_R " -R${with_ldap}/lib" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS_R=-R${with_ldap}/lib + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS_R=\"\$SUDOERS_LDFLAGS_R\""; } >&5 + (: SUDOERS_LDFLAGS_R="$SUDOERS_LDFLAGS_R") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi + + LDFLAGS="$LDFLAGS -L${with_ldap}/lib" + +if ${CPPFLAGS+:} false; then : + + case " $CPPFLAGS " in #( + *" -I${with_ldap}/include "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS already contains -I\${with_ldap}/include"; } >&5 + (: CPPFLAGS already contains -I${with_ldap}/include) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -I${with_ldap}/include" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-I${with_ldap}/include + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + with_ldap=yes + fi + SUDOERS_OBJS="${SUDOERS_OBJS} ldap.lo ldap_conf.lo" + case "$SUDOERS_OBJS" in + *ldap_util.lo*) ;; + *) SUDOERS_OBJS="${SUDOERS_OBJS} ldap_util.lo";; + esac + LDAP="" + + _LIBS="$LIBS" + LDAP_LIBS="" + IBMLDAP_EXTRA="" + found=no + # On HP-UX, libibmldap has a hidden dependency on libCsup + case "$host_os" in + hpux*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lCsup" >&5 +$as_echo_n "checking for main in -lCsup... " >&6; } +if ${ac_cv_lib_Csup_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lCsup $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Csup_main=yes +else + ac_cv_lib_Csup_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Csup_main" >&5 +$as_echo "$ac_cv_lib_Csup_main" >&6; } +if test "x$ac_cv_lib_Csup_main" = xyes; then : + IBMLDAP_EXTRA=" -lCsup" +fi +;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ldap_init" >&5 +$as_echo_n "checking for library containing ldap_init... " >&6; } +if ${ac_cv_search_ldap_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldap_init (); +int +main () +{ +return ldap_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' "ibmldap${IBMLDAP_EXTRA}" "ibmldap -lidsldif${IBMLDAP_EXTRA}" "ldap" "ldap -llber" "ldap -llber -lssl -lcrypto" "ibmldap${IBMLDAP_EXTRA}"; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ldap_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ldap_init+:} false; then : + break +fi +done +if ${ac_cv_search_ldap_init+:} false; then : + +else + ac_cv_search_ldap_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ldap_init" >&5 +$as_echo "$ac_cv_search_ldap_init" >&6; } +ac_res=$ac_cv_search_ldap_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + + test "${ac_cv_search_ldap_init}" != "none required" && LDAP_LIBS="${ac_cv_search_ldap_init}" + found=yes + +fi + + # If nothing linked, try -lldap and hope for the best + if test "$found" = "no"; then + LDAP_LIBS="-lldap" + fi + LIBS="${_LIBS} ${LDAP_LIBS}" + OLIBS="$LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lber.h defines LBER_OPT_DEBUG_LEVEL" >&5 +$as_echo_n "checking whether lber.h defines LBER_OPT_DEBUG_LEVEL... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# include +int +main () +{ +int opt=LBER_OPT_DEBUG_LEVEL; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ber_set_option" >&5 +$as_echo_n "checking for library containing ber_set_option... " >&6; } +if ${ac_cv_search_ber_set_option+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ber_set_option (); +int +main () +{ +return ber_set_option (); + ; + return 0; +} +_ACEOF +for ac_lib in '' lber; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_ber_set_option=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_ber_set_option+:} false; then : + break +fi +done +if ${ac_cv_search_ber_set_option+:} false; then : + +else + ac_cv_search_ber_set_option=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ber_set_option" >&5 +$as_echo "$ac_cv_search_ber_set_option" >&6; } +ac_res=$ac_cv_search_ber_set_option +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + found=yes +else + found=no +fi + + if test X"$found" = X"yes" -a X"$LIBS" != X"$OLIBS"; then + LDAP_LIBS="$LDAP_LIBS -llber" + fi + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lber.h is needed" >&5 +$as_echo_n "checking whether lber.h is needed... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# include +int +main () +{ +(void)ldap_init(0, 0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_LBER_H 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test ${enable_sasl-'yes'} = "yes"; then + found_sasl_h=no + for ac_header in sasl/sasl.h sasl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + found_sasl_h=yes + for ac_func in ldap_sasl_interactive_bind_s +do : + ac_fn_c_check_func "$LINENO" "ldap_sasl_interactive_bind_s" "ac_cv_func_ldap_sasl_interactive_bind_s" +if test "x$ac_cv_func_ldap_sasl_interactive_bind_s" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LDAP_SASL_INTERACTIVE_BIND_S 1 +_ACEOF + +fi +done + + break + +fi + +done + + if test X${enable_sasl} = X"yes"; then + if test X"$found_sasl_h" != X"yes"; then + as_fn_error $? "\"--enable-sasl specified but unable to locate SASL development headers.\"" "$LINENO" 5 + fi + if test X"$ac_cv_func_ldap_sasl_interactive_bind_s" != X"yes"; then : + as_fn_error $? "\"--enable-sasl specified but SASL support is missing in your LDAP library\"" "$LINENO" 5 + fi + fi + fi + for ac_header in ldap_ssl.h mps/ldap_ssl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + break +fi + +done + + for ac_func in ldap_initialize ldap_start_tls_s ldapssl_init ldapssl_set_strength ldap_unbind_ext_s ldap_str2dn ldap_create ldap_sasl_bind_s ldap_ssl_init ldap_ssl_client_init ldap_start_tls_s_np +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + for ac_func in ldap_search_ext_s ldap_search_st +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + break +fi +done + + + if test X"$check_gss_krb5_ccache_name" = X"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_krb5_ccache_name in -lgssapi" >&5 +$as_echo_n "checking for gss_krb5_ccache_name in -lgssapi... " >&6; } +if ${ac_cv_lib_gssapi_gss_krb5_ccache_name+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgssapi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gss_krb5_ccache_name (); +int +main () +{ +return gss_krb5_ccache_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gssapi_gss_krb5_ccache_name=yes +else + ac_cv_lib_gssapi_gss_krb5_ccache_name=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssapi_gss_krb5_ccache_name" >&5 +$as_echo "$ac_cv_lib_gssapi_gss_krb5_ccache_name" >&6; } +if test "x$ac_cv_lib_gssapi_gss_krb5_ccache_name" = xyes; then : + $as_echo "#define HAVE_GSS_KRB5_CCACHE_NAME 1" >>confdefs.h + + LDAP_LIBS="${LDAP_LIBS} -lgssapi" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_krb5_ccache_name in -lgssapi_krb5" >&5 +$as_echo_n "checking for gss_krb5_ccache_name in -lgssapi_krb5... " >&6; } +if ${ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgssapi_krb5 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gss_krb5_ccache_name (); +int +main () +{ +return gss_krb5_ccache_name (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name=yes +else + ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name" >&5 +$as_echo "$ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name" >&6; } +if test "x$ac_cv_lib_gssapi_krb5_gss_krb5_ccache_name" = xyes; then : + $as_echo "#define HAVE_GSS_KRB5_CCACHE_NAME 1" >>confdefs.h + + LDAP_LIBS="${LDAP_LIBS} -lgssapi_krb5" +fi + + +fi + + + # gssapi headers may be separate or part of Kerberos V + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "kerberosV" "krb5" "kerberos5" "kerberosv5"; do + test X"$dir" != X"" && CPPFLAGS="$O_CPPFLAGS -I/usr/include/${dir}" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + found="gssapi/gssapi.h"; break +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + found="gssapi.h"; break +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi +rm -f conftest.err conftest.i conftest.$ac_ext + done + if test X"$found" != X"no"; then + for ac_header in $found +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + if test X"$found" = X"gssapi/gssapi.h"; then + for ac_header in gssapi/gssapi_krb5.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "gssapi/gssapi_krb5.h" "ac_cv_header_gssapi_gssapi_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_krb5_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GSSAPI_GSSAPI_KRB5_H 1 +_ACEOF + +fi + +done + + fi + else + CPPFLAGS="$O_CPPFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to locate gssapi.h, you will have to edit the Makefile and add -I/path/to/gssapi/includes to CPPFLAGS" >&5 +$as_echo "$as_me: WARNING: Unable to locate gssapi.h, you will have to edit the Makefile and add -I/path/to/gssapi/includes to CPPFLAGS" >&2;} + fi + fi + + SUDOERS_LIBS="${SUDOERS_LIBS} ${LDAP_LIBS}" + LIBS="$_LIBS" + LDFLAGS="$O_LDFLAGS" +fi + +# +# How to do dynamic object loading. +# We support dlopen() and sh_load(), else fall back to static loading. +# +case "$lt_cv_dlopen" in + dlopen) + $as_echo "#define HAVE_DLOPEN 1" >>confdefs.h + + if test "$enable_static_sudoers" = "yes"; then + $as_echo "#define STATIC_SUDOERS_PLUGIN 1" >>confdefs.h + + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" --tag=disable-shared -static "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains --tag=disable-shared -static"; } >&5 + (: SUDOERS_LDFLAGS already contains --tag=disable-shared -static) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " --tag=disable-shared -static" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=--tag=disable-shared -static + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + LT_STATIC="" + else + LT_STATIC="--tag=disable-static" + fi + ;; + shl_load) + $as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h + + if test "$enable_static_sudoers" = "yes"; then + $as_echo "#define STATIC_SUDOERS_PLUGIN 1" >>confdefs.h + + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" --tag=disable-shared -static "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains --tag=disable-shared -static"; } >&5 + (: SUDOERS_LDFLAGS already contains --tag=disable-shared -static) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " --tag=disable-shared -static" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=--tag=disable-shared -static + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + LT_STATIC="" + else + LT_STATIC="--tag=disable-static" + fi + ;; + *) + if test X"${ac_cv_func_dlopen}" = X"yes"; then + as_fn_error $? "\"dlopen present but libtool doesn't appear to support your platform.\"" "$LINENO" 5 + fi + # Preload sudoers module symbols + $as_echo "#define STATIC_SUDOERS_PLUGIN 1" >>confdefs.h + + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + LT_STATIC="" + ;; +esac + +# +# The check_symbols test can only succeed with a dynamic sudoers plugin. +# +if test X"$STATIC_SUDOERS" = X""; then + SUDOERS_TEST_PROGS="${SUDOERS_TEST_PROGS}${SUDOERS_TEST_PROGS+ }check_symbols" +fi + +# +# We can only disable linking with the shared libsudo_util if +# sudoers is linked statically too. +# +if test "$enable_shared_libutil" = "no"; then + if test X"$STATIC_SUDOERS" = X""; then + as_fn_error $? "\"--disable-shared-libutil may only be specified with --enable-static-sudoers or when dynamic linking is disabled.\"" "$LINENO" 5 + else + # Do not install sudoers or libsudo_util. + +if ${SUDOERS_LDFLAGS+:} false; then : + + case " $SUDOERS_LDFLAGS " in #( + *" -no-install "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS already contains -no-install"; } >&5 + (: SUDOERS_LDFLAGS already contains -no-install) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append SUDOERS_LDFLAGS " -no-install" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + SUDOERS_LDFLAGS=-no-install + { { $as_echo "$as_me:${as_lineno-$LINENO}: : SUDOERS_LDFLAGS=\"\$SUDOERS_LDFLAGS\""; } >&5 + (: SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + +if ${LIBUTIL_LDFLAGS+:} false; then : + + case " $LIBUTIL_LDFLAGS " in #( + *" -no-install "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LIBUTIL_LDFLAGS already contains -no-install"; } >&5 + (: LIBUTIL_LDFLAGS already contains -no-install) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LIBUTIL_LDFLAGS " -no-install" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LIBUTIL_LDFLAGS=\"\$LIBUTIL_LDFLAGS\""; } >&5 + (: LIBUTIL_LDFLAGS="$LIBUTIL_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LIBUTIL_LDFLAGS=-no-install + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LIBUTIL_LDFLAGS=\"\$LIBUTIL_LDFLAGS\""; } >&5 + (: LIBUTIL_LDFLAGS="$LIBUTIL_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + fi +fi + +# On HP-UX, you cannot dlopen() a shared object that uses pthreads unless +# the main program is linked against -lpthread. We have no knowledge of +# what libraries a plugin may depend on (e.g. HP-UX LDAP which uses pthreads) +# so always link against -lpthread on HP-UX if it is available. +# This check should go after all other libraries tests. +case "$host_os" in + hpux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpthread" >&5 +$as_echo_n "checking for main in -lpthread... " >&6; } +if ${ac_cv_lib_pthread_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pthread_main=yes +else + ac_cv_lib_pthread_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_main" >&5 +$as_echo "$ac_cv_lib_pthread_main" >&6; } +if test "x$ac_cv_lib_pthread_main" = xyes; then : + SUDO_LIBS="${SUDO_LIBS} -lpthread" +fi + + $as_echo "#define _REENTRANT 1" >>confdefs.h + + ;; +esac + +if test "$utmp_style" = "LEGACY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for utmp file path" >&5 +$as_echo_n "checking for utmp file path... " >&6; } +found=no +for p in "/var/run/utmp" "/var/adm/utmp" "/etc/utmp"; do + if test -r "$p"; then + found=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $p" >&5 +$as_echo "$p" >&6; } + cat >>confdefs.h <&5 +$as_echo "not found" >&6; } +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for log file location" >&5 +$as_echo_n "checking for log file location... " >&6; } +if test -n "$with_logpath"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_logpath" >&5 +$as_echo "$with_logpath" >&6; } + cat >>confdefs.h <&5 +$as_echo "/var/log/sudo.log" >&6; } + cat >>confdefs.h <<\EOF +#define _PATH_SUDO_LOGFILE "/var/log/sudo.log" +EOF + +elif test -d "/var/adm"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: /var/adm/sudo.log" >&5 +$as_echo "/var/adm/sudo.log" >&6; } + cat >>confdefs.h <<\EOF +#define _PATH_SUDO_LOGFILE "/var/adm/sudo.log" +EOF + +elif test -d "/usr/adm"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: /usr/adm/sudo.log" >&5 +$as_echo "/usr/adm/sudo.log" >&6; } + cat >>confdefs.h <<\EOF +#define _PATH_SUDO_LOGFILE "/usr/adm/sudo.log" +EOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sudo run dir location" >&5 +$as_echo_n "checking for sudo run dir location... " >&6; } +rundir="$with_rundir" +if test -z "$rundir"; then + for d in /run /var/run /var/db /var/lib /var/adm /usr/adm; do + if test -d "$d"; then + rundir="$d/sudo" + break + fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $rundir" >&5 +$as_echo "$rundir" >&6; } +cat >>confdefs.h <&5 +$as_echo_n "checking for sudo var dir location... " >&6; } +vardir="$with_vardir" +if test -z "$vardir"; then + for d in /var/db /var/lib /var/adm /usr/adm; do + if test -d "$d"; then + vardir="$d/sudo" + break + fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $vardir" >&5 +$as_echo "$vardir" >&6; } +cat >>confdefs.h <&5 +$as_echo_n "checking for I/O log dir location... " >&6; } + if test "${with_iologdir-yes}" != "yes"; then + iolog_dir="$with_iologdir" + elif test -d "/var/log"; then + iolog_dir="/var/log/sudo-io" + elif test -d "/var/adm"; then + iolog_dir="/var/adm/sudo-io" + else + iolog_dir="/usr/adm/sudo-io" + fi + if test "${with_iologdir}" != "no"; then + cat >>confdefs.h <&5 +$as_echo "$iolog_dir" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking time zone data directory" >&5 +$as_echo_n "checking time zone data directory... " >&6; } +tzdir="$with_tzdir" +if test -z "$tzdir"; then + tzdir=no + for d in /usr/share /usr/share/lib /usr/lib /etc; do + if test -d "$d/zoneinfo"; then + tzdir="$d/zoneinfo" + break + fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tzdir" >&5 +$as_echo "$tzdir" >&6; } +if test "${tzdir}" != "no"; then + cat >>confdefs.h <&5 + (: CPPFLAGS already contains -D_FORTIFY_SOURCE=2) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CPPFLAGS " -D_FORTIFY_SOURCE=2" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CPPFLAGS=-D_FORTIFY_SOURCE=2 + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CPPFLAGS=\"\$CPPFLAGS\""; } >&5 + (: CPPFLAGS="$CPPFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _FORTIFY_SOURCE may be specified" >&5 +$as_echo_n "checking whether _FORTIFY_SOURCE may be specified... " >&6; } +if ${sudo_cv_use_fortify_source+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +char buf[4]; (void)sprintf(buf, "%s", "foo"); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_use_fortify_source=yes +else + sudo_cv_use_fortify_source=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_use_fortify_source=yes +else + sudo_cv_use_fortify_source=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_use_fortify_source" >&5 +$as_echo "$sudo_cv_use_fortify_source" >&6; } + if test "$sudo_cv_use_fortify_source" != yes; then + CPPFLAGS="$O_CPPFLAGS" + fi +fi + + +ac_c_werror_flag=yes + +if test -n "$GCC" -a "$lt_cv_prog_gnu_ld" != "yes" -a -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -static-libgcc" >&5 +$as_echo_n "checking whether C compiler accepts -static-libgcc... " >&6; } +if ${ax_cv_check_cflags___static_libgcc+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -static-libgcc" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___static_libgcc=yes +else + ax_cv_check_cflags___static_libgcc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___static_libgcc" >&5 +$as_echo "$ax_cv_check_cflags___static_libgcc" >&6; } +if test x"$ax_cv_check_cflags___static_libgcc" = xyes; then : + +if ${LT_LDFLAGS+:} false; then : + + case " $LT_LDFLAGS " in #( + *" -Wc,-static-libgcc "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LT_LDFLAGS already contains -Wc,-static-libgcc"; } >&5 + (: LT_LDFLAGS already contains -Wc,-static-libgcc) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LT_LDFLAGS " -Wc,-static-libgcc" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LT_LDFLAGS=\"\$LT_LDFLAGS\""; } >&5 + (: LT_LDFLAGS="$LT_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LT_LDFLAGS=-Wc,-static-libgcc + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LT_LDFLAGS=\"\$LT_LDFLAGS\""; } >&5 + (: LT_LDFLAGS="$LT_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +fi + +if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fvisibility=hidden" >&5 +$as_echo_n "checking whether C compiler accepts -fvisibility=hidden... " >&6; } +if ${ax_cv_check_cflags___fvisibility_hidden+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fvisibility=hidden" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fvisibility_hidden=yes +else + ax_cv_check_cflags___fvisibility_hidden=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fvisibility_hidden" >&5 +$as_echo "$ax_cv_check_cflags___fvisibility_hidden" >&6; } +if test x"$ax_cv_check_cflags___fvisibility_hidden" = xyes; then : + + $as_echo "#define HAVE_DSO_VISIBILITY 1" >>confdefs.h + + CFLAGS="${CFLAGS} -fvisibility=hidden" + LT_LDEXPORTS= + LT_LDDEP= + +else + : +fi + +else + case "$host_os" in + hpux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Bhidden_def" >&5 +$as_echo_n "checking whether C compiler accepts -Bhidden_def... " >&6; } +if ${ax_cv_check_cflags___Bhidden_def+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -Bhidden_def" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___Bhidden_def=yes +else + ax_cv_check_cflags___Bhidden_def=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Bhidden_def" >&5 +$as_echo "$ax_cv_check_cflags___Bhidden_def" >&6; } +if test x"$ax_cv_check_cflags___Bhidden_def" = xyes; then : + + $as_echo "#define HAVE_DSO_VISIBILITY 1" >>confdefs.h + + CFLAGS="${CFLAGS} -Bhidden_def" + LT_LDEXPORTS= + LT_LDDEP= + +else + : +fi + + ;; + solaris2*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -xldscope=hidden" >&5 +$as_echo_n "checking whether C compiler accepts -xldscope=hidden... " >&6; } +if ${ax_cv_check_cflags___xldscope_hidden+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -xldscope=hidden" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___xldscope_hidden=yes +else + ax_cv_check_cflags___xldscope_hidden=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___xldscope_hidden" >&5 +$as_echo "$ax_cv_check_cflags___xldscope_hidden" >&6; } +if test x"$ax_cv_check_cflags___xldscope_hidden" = xyes; then : + + $as_echo "#define HAVE_DSO_VISIBILITY 1" >>confdefs.h + + CFLAGS="${CFLAGS} -xldscope=hidden" + LT_LDEXPORTS= + LT_LDDEP= + +else + : +fi + + ;; + esac +fi + +if test -n "$LT_LDEXPORTS"; then + if test "$lt_cv_prog_gnu_ld" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ld supports anonymous map files" >&5 +$as_echo_n "checking whether ld supports anonymous map files... " >&6; } +if ${sudo_cv_var_gnu_ld_anon_map+:} false; then : + $as_echo_n "(cached) " >&6 +else + + sudo_cv_var_gnu_ld_anon_map=no + cat > conftest.map <<-EOF + { + global: foo; + local: *; + }; +EOF + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -fpic -shared -Wl,--version-script,./conftest.map" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_var_gnu_ld_anon_map=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_gnu_ld_anon_map" >&5 +$as_echo "$sudo_cv_var_gnu_ld_anon_map" >&6; } + if test "$sudo_cv_var_gnu_ld_anon_map" = "yes"; then + LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,--version-script,\$(shlib_map)" + fi + else + case "$host_os" in + solaris2*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ld supports anonymous map files" >&5 +$as_echo_n "checking whether ld supports anonymous map files... " >&6; } +if ${sudo_cv_var_solaris_ld_anon_map+:} false; then : + $as_echo_n "(cached) " >&6 +else + + sudo_cv_var_solaris_ld_anon_map=no + cat > conftest.map <<-EOF + { + global: foo; + local: *; + }; +EOF + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared -Wl,-M,./conftest.map" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_var_solaris_ld_anon_map=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_solaris_ld_anon_map" >&5 +$as_echo "$sudo_cv_var_solaris_ld_anon_map" >&6; } + if test "$sudo_cv_var_solaris_ld_anon_map" = "yes"; then + LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,-M,\$(shlib_map)" + fi + ;; + hpux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ld supports controlling exported symbols" >&5 +$as_echo_n "checking whether ld supports controlling exported symbols... " >&6; } +if ${sudo_cv_var_hpux_ld_symbol_export+:} false; then : + $as_echo_n "(cached) " >&6 +else + + sudo_cv_var_hpux_ld_symbol_export=no + echo "+e foo" > conftest.opt + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + if test -n "$GCC"; then + LDFLAGS="$LDFLAGS -shared -Wl,-c,./conftest.opt" + else + LDFLAGS="$LDFLAGS -Wl,-b -Wl,-c,./conftest.opt" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + sudo_cv_var_hpux_ld_symbol_export=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + rm -f conftest.opt + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_hpux_ld_symbol_export" >&5 +$as_echo "$sudo_cv_var_hpux_ld_symbol_export" >&6; } + if test "$sudo_cv_var_hpux_ld_symbol_export" = "yes"; then + LT_LDDEP="\$(shlib_opt)"; LT_LDEXPORTS="-Wl,-c,\$(shlib_opt)" + fi + ;; + esac + fi +fi + +if test "$enable_asan" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fsanitize=address -fsanitize=undefined" >&5 +$as_echo_n "checking whether C compiler accepts -fsanitize=address -fsanitize=undefined... " >&6; } +if ${ax_cv_check_cflags___fsanitize_address__fsanitize_undefined+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fsanitize_address__fsanitize_undefined=yes +else + ax_cv_check_cflags___fsanitize_address__fsanitize_undefined=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fsanitize_address__fsanitize_undefined" >&5 +$as_echo "$ax_cv_check_cflags___fsanitize_address__fsanitize_undefined" >&6; } +if test x"$ax_cv_check_cflags___fsanitize_address__fsanitize_undefined" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -fsanitize=address -fsanitize=undefined" >&5 +$as_echo_n "checking whether the linker accepts -fsanitize=address -fsanitize=undefined... " >&6; } +if ${ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -fsanitize=address -fsanitize=undefined" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined=yes +else + ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined" >&5 +$as_echo "$ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined" >&6; } +if test x"$ax_cv_check_ldflags___fsanitize_address__fsanitize_undefined" = xyes; then : + + ASAN_LDFLAGS="-Wc,-fsanitize=address -Wc,-fsanitize=undefined" + ASAN_CFLAGS="-fsanitize=address -fsanitize=undefined" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-omit-frame-pointer" >&5 +$as_echo_n "checking whether C compiler accepts -fno-omit-frame-pointer... " >&6; } +if ${ax_cv_check_cflags___fno_omit_frame_pointer+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fno_omit_frame_pointer=yes +else + ax_cv_check_cflags___fno_omit_frame_pointer=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_omit_frame_pointer" >&5 +$as_echo "$ax_cv_check_cflags___fno_omit_frame_pointer" >&6; } +if test x"$ax_cv_check_cflags___fno_omit_frame_pointer" = xyes; then : + + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + +else + : +fi + + $as_echo "#define NO_LEAKS 1" >>confdefs.h + + +else + : +fi + + +else + : +fi + +fi + +if test -n "$GCC"; then + if test -z "$enable_pie"; then + case "$host_os" in + linux*) + # Attempt to build with PIE support + enable_pie="maybe" + ;; + esac + fi + if test -n "$enable_pie"; then + if test "$enable_pie" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-pie" >&5 +$as_echo_n "checking whether C compiler accepts -fno-pie... " >&6; } +if ${ax_cv_check_cflags___fno_pie+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fno-pie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fno_pie=yes +else + ax_cv_check_cflags___fno_pie=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_pie" >&5 +$as_echo "$ax_cv_check_cflags___fno_pie" >&6; } +if test x"$ax_cv_check_cflags___fno_pie" = xyes; then : + + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-pie" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -nopie" >&5 +$as_echo_n "checking whether the linker accepts -nopie... " >&6; } +if ${ax_cv_check_ldflags___nopie+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -nopie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___nopie=yes +else + ax_cv_check_ldflags___nopie=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___nopie" >&5 +$as_echo "$ax_cv_check_ldflags___nopie" >&6; } +if test x"$ax_cv_check_ldflags___nopie" = xyes; then : + + PIE_CFLAGS="-fno-pie" + PIE_LDFLAGS="-nopie" + +else + : +fi + + CFLAGS="$_CFLAGS" + +else + : +fi + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fPIE" >&5 +$as_echo_n "checking whether C compiler accepts -fPIE... " >&6; } +if ${ax_cv_check_cflags___fPIE+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -fPIE" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___fPIE=yes +else + ax_cv_check_cflags___fPIE=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fPIE" >&5 +$as_echo "$ax_cv_check_cflags___fPIE" >&6; } +if test x"$ax_cv_check_cflags___fPIE" = xyes; then : + + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fPIE" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -pie" >&5 +$as_echo_n "checking whether the linker accepts -pie... " >&6; } +if ${ax_cv_check_ldflags___pie+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -pie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___pie=yes +else + ax_cv_check_ldflags___pie=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___pie" >&5 +$as_echo "$ax_cv_check_ldflags___pie" >&6; } +if test x"$ax_cv_check_ldflags___pie" = xyes; then : + + if test "$enable_pie" = "maybe"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working PIE support" >&5 +$as_echo_n "checking for working PIE support... " >&6; } +if ${sudo_cv_working_pie+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f conftestdata; > conftestdata +if test "$cross_compiling" = yes; then : + sudo_cv_working_pie=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +main() { char *p = malloc(1024); if (p == NULL) return 1; memset(p, 0, 1024); return 0; } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + sudo_cv_working_pie=yes +else + sudo_cv_working_pie=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +rm -f core core.* *.core +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_working_pie" >&5 +$as_echo "$sudo_cv_working_pie" >&6; } +if test $sudo_cv_working_pie = yes; then : + enable_pie=yes +fi + fi + if test "$enable_pie" = "yes"; then + PIE_CFLAGS="-fPIE" + PIE_LDFLAGS="-Wc,-fPIE -pie" + fi + +else + : +fi + + CFLAGS="$_CFLAGS" + +else + : +fi + + fi + fi +fi +if test "$enable_pie" != "yes"; then + # Solaris 11.1 and higher supports tagging binaries to use ASLR + case "$host_os" in + solaris2.1[1-9]|solaris2.[2-9][0-9]) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-z,aslr" >&5 +$as_echo_n "checking whether the linker accepts -Wl,-z,aslr... " >&6; } +if ${ax_cv_check_ldflags___Wl__z_aslr+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-z,aslr" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___Wl__z_aslr=yes +else + ax_cv_check_ldflags___Wl__z_aslr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__z_aslr" >&5 +$as_echo "$ax_cv_check_ldflags___Wl__z_aslr" >&6; } +if test x"$ax_cv_check_ldflags___Wl__z_aslr" = xyes; then : + +if ${PIE_LDFLAGS+:} false; then : + + case " $PIE_LDFLAGS " in #( + *" -Wl,-z,aslr "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : PIE_LDFLAGS already contains -Wl,-z,aslr"; } >&5 + (: PIE_LDFLAGS already contains -Wl,-z,aslr) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append PIE_LDFLAGS " -Wl,-z,aslr" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : PIE_LDFLAGS=\"\$PIE_LDFLAGS\""; } >&5 + (: PIE_LDFLAGS="$PIE_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + PIE_LDFLAGS=-Wl,-z,aslr + { { $as_echo "$as_me:${as_lineno-$LINENO}: : PIE_LDFLAGS=\"\$PIE_LDFLAGS\""; } >&5 + (: PIE_LDFLAGS="$PIE_LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + + ;; + esac +fi + +if test "$enable_hardening" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler stack protector support" >&5 +$as_echo_n "checking for compiler stack protector support... " >&6; } +if ${sudo_cv_var_stack_protector+:} false; then : + $as_echo_n "(cached) " >&6 +else + + # Avoid CFLAGS since the compiler might optimize away our test. + # We don't want CPPFLAGS or LIBS to interfere with the test but + # keep LDFLAGS as it may have an rpath needed to find the ssp lib. + _CPPFLAGS="$CPPFLAGS" + _CFLAGS="$CFLAGS" + _LDFLAGS="$LDFLAGS" + _LIBS="$LIBS" + CPPFLAGS= + LIBS= + + sudo_cv_var_stack_protector="-fstack-protector-strong" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $ac_includes_default +int +main () +{ +char buf[1024]; buf[1023] = '\0'; + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + + sudo_cv_var_stack_protector="-fstack-protector-all" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $ac_includes_default +int +main () +{ +char buf[1024]; buf[1023] = '\0'; + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + + sudo_cv_var_stack_protector="-fstack-protector" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + $ac_includes_default +int +main () +{ +char buf[1024]; buf[1023] = '\0'; + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + + sudo_cv_var_stack_protector=no + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CPPFLAGS="$_CPPFLAGS" + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + LIBS="$_LIBS" + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sudo_cv_var_stack_protector" >&5 +$as_echo "$sudo_cv_var_stack_protector" >&6; } + if test X"$sudo_cv_var_stack_protector" != X"no"; then + SSP_CFLAGS="$sudo_cv_var_stack_protector" + SSP_LDFLAGS="-Wc,$sudo_cv_var_stack_protector" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-z,relro" >&5 +$as_echo_n "checking whether the linker accepts -Wl,-z,relro... " >&6; } +if ${ax_cv_check_ldflags___Wl__z_relro+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-z,relro" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_check_ldflags___Wl__z_relro=yes +else + ax_cv_check_ldflags___Wl__z_relro=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__z_relro" >&5 +$as_echo "$ax_cv_check_ldflags___Wl__z_relro" >&6; } +if test x"$ax_cv_check_ldflags___Wl__z_relro" = xyes; then : + +if ${LDFLAGS+:} false; then : + + case " $LDFLAGS " in #( + *" -Wl,-z,relro "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains -Wl,-z,relro"; } >&5 + (: LDFLAGS already contains -Wl,-z,relro) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " -Wl,-z,relro" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS=-Wl,-z,relro + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +fi + +case "$with_passwd" in +yes|maybe) + AUTH_OBJS="$AUTH_OBJS getspwuid.lo passwd.lo" + ;; +*) + $as_echo "#define WITHOUT_PASSWD 1" >>confdefs.h + + if test -z "$AUTH_OBJS"; then + as_fn_error $? "no authentication methods defined." "$LINENO" 5 + fi + ;; +esac +AUTH_OBJS=${AUTH_OBJS# } +_AUTH=`echo "$AUTH_OBJS" | sed -e 's/\.lo//g' -e 's/getspwuid *//'` +{ $as_echo "$as_me:${as_lineno-$LINENO}: using the following authentication methods: $_AUTH" >&5 +$as_echo "$as_me: using the following authentication methods: $_AUTH" >&6;} + +if test -n "$LIBS"; then + L="$LIBS" + LIBS= + for l in ${L}; do + dupe=0 + for sl in ${SUDO_LIBS} ${SUDOERS_LIBS} ${NET_LIBS}; do + test $l = $sl && dupe=1 + done + test $dupe = 0 && LIBS="${LIBS} $l" + done +fi + + +cat >>confdefs.h <<_ACEOF +#define os_init $OS_INIT +_ACEOF + + +if test -n "$GCC"; then + if test X"$enable_warnings" = X"yes" -o X"$with_devel" = X"yes"; then + CFLAGS="${CFLAGS} -Wall -Wsign-compare -Wpointer-arith" + fi + if test X"$enable_werror" = X"yes"; then + CFLAGS="${CFLAGS} -Werror" + fi +fi + +CROSS_COMPILING="$cross_compiling" + +test "$exec_prefix" = "NONE" && exec_prefix='$(prefix)' + +oexec_prefix="$exec_prefix" +if test "$exec_prefix" = '$(prefix)'; then + if test "$prefix" = "NONE"; then + exec_prefix="$ac_default_prefix" + else + exec_prefix="$prefix" + fi +fi + +# Update exec_prefix in noexec_file +_noexec_file= +while test X"$noexec_file" != X"$_noexec_file"; do + _noexec_file="$noexec_file" + eval noexec_file="$_noexec_file" +done + +# Update exec_prefix in sesh_file +_sesh_file= +while test X"$sesh_file" != X"$_sesh_file"; do + _sesh_file="$sesh_file" + eval sesh_file="$_sesh_file" +done + +# Update exec_prefix in plugindir +_plugindir= +while test X"$plugindir" != X"$_plugindir"; do + _plugindir="$plugindir" + eval plugindir="$_plugindir" +done +exec_prefix="$oexec_prefix" + +if test X"$with_noexec" != X"no"; then + PROGS="${PROGS} sudo_noexec.la" + INSTALL_NOEXEC="install-noexec" + + # Can't use asan with LD_PRELOAD + if test "$enable_asan" != "yes"; then + CHECK_NOEXEC=check_noexec + fi + + cat >>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h <>confdefs.h + +else + cat >>confdefs.h <confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by sudo $as_me 1.8.29, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +sudo config.status 1.8.29 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +fix_hardcoded_libdir_flag_spec='`$ECHO "$fix_hardcoded_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +fix_hardcoded_libdir_flag_spec_ld='`$ECHO "$fix_hardcoded_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +fix_hardcoded_libdir_flag_spec \ +fix_hardcoded_libdir_flag_spec_ld \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "pathnames.h") CONFIG_HEADERS="$CONFIG_HEADERS pathnames.h" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "lib/zlib/zconf.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/zlib/zconf.h" ;; + "lib/zlib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/zlib/Makefile" ;; + "init.d/$INIT_SCRIPT") CONFIG_FILES="$CONFIG_FILES init.d/$INIT_SCRIPT" ;; + "init.d/utsudo.conf") CONFIG_FILES="$CONFIG_FILES init.d/utsudo.conf" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "lib/util/Makefile") CONFIG_FILES="$CONFIG_FILES lib/util/Makefile" ;; + "lib/util/util.exp") CONFIG_FILES="$CONFIG_FILES lib/util/util.exp" ;; + "src/sudo_usage.h") CONFIG_FILES="$CONFIG_FILES src/sudo_usage.h" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "plugins/sample/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/sample/Makefile" ;; + "plugins/group_file/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/group_file/Makefile" ;; + "plugins/system_group/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/system_group/Makefile" ;; + "plugins/sudoers/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/sudoers/Makefile" ;; + "plugins/sudoers/sudoers") CONFIG_FILES="$CONFIG_FILES plugins/sudoers/sudoers" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Flag to modify a path being hardcoded into the resulting binary. +fix_hardcoded_libdir_flag_spec=$lt_fix_hardcoded_libdir_flag_spec + +# If ld is used when linking,flag to modify a path being hardcoded into the resulting binary. +fix_hardcoded_libdir_flag_spec_ld=$lt_fix_hardcoded_libdir_flag_spec_ld + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +if test "$with_pam" = "yes"; then + case $host_os in + hpux*) + if test -f /usr/lib/security/libpam_hpsec.so.1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You may wish to add the following line to /etc/pam.conf" >&5 +$as_echo "$as_me: You may wish to add the following line to /etc/pam.conf" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: sudo session required libpam_hpsec.so.1 bypass_umask bypass_last_login" >&5 +$as_echo "$as_me: sudo session required libpam_hpsec.so.1 bypass_umask bypass_last_login" >&6;} + fi + ;; + linux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: You will need to customize examples/pam.conf and install it as /etc/pam.d/sudo" >&5 +$as_echo "$as_me: You will need to customize examples/pam.conf and install it as /etc/pam.d/sudo" >&6;} + ;; + esac +fi +case "$rundir" in + /run/*|/var/run/*) + clear_rundir=0 + ;; + *) + clear_rundir=1 + ;; +esac +if test $clear_rundir -eq 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: the $rundir/ts directory must be cleared at boot time." >&5 +$as_echo "$as_me: Warning: the $rundir/ts directory must be cleared at boot time." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: You may need to create a startup item to do this." >&5 +$as_echo "$as_me: You may need to create a startup item to do this." >&6;} +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/utsudo-0.0.2/configure.ac b/utsudo-0.0.2/configure.ac new file mode 100644 index 0000000..b571b48 --- /dev/null +++ b/utsudo-0.0.2/configure.ac @@ -0,0 +1,4685 @@ +dnl +dnl Use the top-level autogen.sh script to generate configure and config.h.in +dnl +dnl SPDX-License-Identifier: ISC +dnl +dnl Copyright (c) 1994-1996, 1998-2018 Todd C. Miller +dnl +dnl Permission to use, copy, modify, and distribute this software for any +dnl purpose with or without fee is hereby granted, provided that the above +dnl copyright notice and this permission notice appear in all copies. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +dnl WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +dnl MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +dnl ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +dnl WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +dnl ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +dnl OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +dnl +AC_PREREQ([2.59]) +AC_INIT([utsudo], [1.8.29], [https://bugzilla.sudo.ws/], [utsudo]) +AC_CONFIG_HEADER([config.h pathnames.h]) +AC_CONFIG_SRCDIR([src/utsudo.c]) +dnl +dnl Note: this must come after AC_INIT +dnl +AC_MSG_NOTICE([Configuring Sudo version $PACKAGE_VERSION]) +dnl +dnl Variables that get substituted in the Makefile and man pages +dnl +AC_SUBST([SHELL]) +AC_SUBST([LIBTOOL]) +AC_SUBST([CFLAGS]) +AC_SUBST([PROGS]) +AC_SUBST([CPPFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([SUDO_LDFLAGS]) +AC_SUBST([SUDOERS_LDFLAGS]) +AC_SUBST([LIBUTIL_LDFLAGS]) +AC_SUBST([ZLIB_LDFLAGS]) +AC_SUBST([LT_LDFLAGS]) +AC_SUBST([LT_LDDEP]) +AC_SUBST([LT_LDEXPORTS]) +AC_SUBST([LT_STATIC]) +AC_SUBST([LT_DEP_LIBS]) +AC_SUBST([COMMON_OBJS]) +AC_SUBST([SUDOERS_OBJS]) +AC_SUBST([SUDO_OBJS]) +AC_SUBST([LIBS]) +AC_SUBST([SUDO_LIBS]) +AC_SUBST([SUDOERS_LIBS]) +AC_SUBST([STATIC_SUDOERS]) +AC_SUBST([NET_LIBS]) +AC_SUBST([AFS_LIBS]) +AC_SUBST([REPLAY_LIBS]) +AC_SUBST([GETGROUPS_LIB]) +AC_SUBST([AUTH_OBJS]) +AC_SUBST([MANTYPE]) +AC_SUBST([MANDIRTYPE]) +AC_SUBST([MANCOMPRESS]) +AC_SUBST([MANCOMPRESSEXT]) +AC_SUBST([SHLIB_ENABLE]) +AC_SUBST([SHLIB_MODE]) +AC_SUBST([SUDOERS_MODE]) +AC_SUBST([SUDOERS_UID]) +AC_SUBST([SUDOERS_GID]) +AC_SUBST([DEVEL]) +AC_SUBST([BAMAN]) +AC_SUBST([LCMAN]) +AC_SUBST([PSMAN]) +AC_SUBST([SEMAN]) +AC_SUBST([devdir]) +AC_SUBST([mansectsu]) +AC_SUBST([mansectform]) +AC_SUBST([mansrcdir]) +AC_SUBST([NOEXECFILE]) +AC_SUBST([NOEXECDIR]) +AC_SUBST([noexec_file]) +AC_SUBST([sesh_file]) +AC_SUBST([INSTALL_BACKUP]) +AC_SUBST([INSTALL_NOEXEC]) +AC_SUBST([CHECK_NOEXEC]) +AC_SUBST([DONT_LEAK_PATH_INFO]) +AC_SUBST([BSDAUTH_USAGE]) +AC_SUBST([SELINUX_USAGE]) +AC_SUBST([LDAP]) +AC_SUBST([LOGINCAP_USAGE]) +AC_SUBST([ZLIB]) +AC_SUBST([ZLIB_SRC]) +AC_SUBST([LIBTOOL_DEPS]) +AC_SUBST([CONFIGURE_ARGS]) +AC_SUBST([LIBDL]) +AC_SUBST([LIBRT]) +AC_SUBST([LIBINTL]) +AC_SUBST([LIBMD]) +AC_SUBST([LIBPTHREAD]) +AC_SUBST([SUDO_NLS]) +AC_SUBST([LOCALEDIR_SUFFIX]) +AC_SUBST([COMPAT_TEST_PROGS]) +AC_SUBST([SUDOERS_TEST_PROGS]) +AC_SUBST([CROSS_COMPILING]) +AC_SUBST([ASAN_LDFLAGS]) +AC_SUBST([ASAN_CFLAGS]) +AC_SUBST([PIE_LDFLAGS]) +AC_SUBST([PIE_CFLAGS]) +AC_SUBST([SSP_LDFLAGS]) +AC_SUBST([SSP_CFLAGS]) +AC_SUBST([INIT_SCRIPT]) +AC_SUBST([INIT_DIR]) +AC_SUBST([RC_LINK]) +AC_SUBST([COMPAT_EXP]) +AC_SUBST([TMPFILES_D]) +AC_SUBST([exampledir]) +AC_SUBST([DIGEST]) +AC_SUBST([devsearch]) +AC_SUBST([SIGNAME]) +dnl +dnl Variables that get substituted in docs (not overridden by environment) +dnl +AC_SUBST([iolog_dir])dnl real initial value from SUDO_IO_LOGDIR +AC_SUBST([rundir])dnl real initial value from SUDO_RUNDIR +AC_SUBST([vardir])dnl real initial value from SUDO_VARDIR +AC_SUBST([timeout]) +AC_SUBST([password_timeout]) +AC_SUBST([sudo_umask]) +AC_SUBST([umask_override]) +AC_SUBST([passprompt]) +AC_SUBST([long_otp_prompt]) +AC_SUBST([lecture]) +AC_SUBST([logfac]) +AC_SUBST([goodpri]) +AC_SUBST([badpri]) +AC_SUBST([loglen]) +AC_SUBST([ignore_dot]) +AC_SUBST([mail_no_user]) +AC_SUBST([mail_no_host]) +AC_SUBST([mail_no_perms]) +AC_SUBST([mailto]) +AC_SUBST([mailsub]) +AC_SUBST([badpass_message]) +AC_SUBST([fqdn]) +AC_SUBST([runas_default]) +AC_SUBST([env_editor]) +AC_SUBST([env_reset]) +AC_SUBST([passwd_tries]) +AC_SUBST([timestamp_type]) +AC_SUBST([insults]) +AC_SUBST([root_sudo]) +AC_SUBST([path_info]) +AC_SUBST([ldap_conf]) +AC_SUBST([ldap_secret]) +AC_SUBST([sssd_lib]) +AC_SUBST([nsswitch_conf]) +AC_SUBST([netsvc_conf]) +AC_SUBST([secure_path]) +AC_SUBST([editor]) +AC_SUBST([pam_session]) +AC_SUBST([pam_login_service]) +AC_SUBST([plugindir]) +# +# Begin initial values for man page substitution +# +iolog_dir=/var/log/sudo-io +rundir=/var/run/sudo +vardir=/var/adm/sudo +timeout=5 +password_timeout=5 +sudo_umask=0022 +umask_override=off +passprompt="Password: " +long_otp_prompt=off +lecture=once +logfac=auth +goodpri=notice +badpri=alert +loglen=80 +ignore_dot=off +mail_no_user=on +mail_no_host=off +mail_no_perms=off +mailto=root +mailsub="*** SECURITY information for %h ***" +badpass_message="Sorry, try again." +fqdn=off +runas_default=root +env_editor=on +env_reset=on +editor=vi +passwd_tries=3 +timestamp_type=tty +insults=off +root_sudo=on +path_info=on +ldap_conf=/etc/ldap.conf +ldap_secret=/etc/ldap.secret +netsvc_conf=/etc/netsvc.conf +noexec_file="$libexecdir/utsudo/sudo_noexec.so" +sesh_file="$libexecdir/utsudo/sesh" +nsswitch_conf=/etc/nsswitch.conf +secure_path="not set" +pam_session=on +pam_login_service=sudo +plugindir="$libexecdir/utsudo" +DIGEST=digest.lo +devsearch="/dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev" +# +# End initial values for man page substitution +# +dnl +dnl Initial values for Makefile variables listed above +dnl May be overridden by environment variables.. +dnl +INSTALL_BACKUP= +INSTALL_NOEXEC= +CHECK_NOEXEC= +exampledir='$(docdir)/examples' +devdir='$(srcdir)' +PROGS="utsudo" +: ${MANDIRTYPE='man'} +: ${mansrcdir='.'} +: ${SHLIB_MODE='0644'} +: ${SUDOERS_MODE='0440'} +: ${SUDOERS_UID='0'} +: ${SUDOERS_GID='0'} +DEVEL= +LDAP="#" +BAMAN=0 +LCMAN=0 +PSMAN=0 +SEMAN=0 +LIBINTL= +LIBMD= +ZLIB= +ZLIB_SRC= +AUTH_OBJS= +AUTH_REG= +AUTH_EXCL= +AUTH_EXCL_DEF= +AUTH_DEF=passwd +SUDO_NLS=disabled +LOCALEDIR_SUFFIX= +LT_LDEXPORTS="-export-symbols \$(shlib_exp)" +LT_LDDEP="\$(shlib_exp)" +OS_INIT=os_init_common +INIT_SCRIPT= +INIT_DIR= +RC_LINK= +COMPAT_EXP= +SIGNAME= +dnl +dnl Other vaiables +dnl +WEAK_ALIAS=no +CHECKSHADOW=true +shadow_funcs= +shadow_libs= +TMPFILES_D= +CONFIGURE_ARGS="$@" + +dnl +dnl LD_PRELOAD equivalents +dnl +RTLD_PRELOAD_VAR="LD_PRELOAD" +RTLD_PRELOAD_ENABLE_VAR= +RTLD_PRELOAD_DELIM=":" +RTLD_PRELOAD_DEFAULT= + +dnl +dnl libc replacement functions live in libutsudo_util.a +dnl +AC_CONFIG_LIBOBJ_DIR(lib/util) + +dnl +dnl We must call AC_USE_SYSTEM_EXTENSIONS before the compiler is run. +dnl +AC_USE_SYSTEM_EXTENSIONS + +# +# Prior to sudo 1.8.7, sudo stored libexec files in $libexecdir. +# Starting with sudo 1.8.7, $libexecdir/utsudo is used so strip +# off an extraneous "/sudo" from libexecdir. +# +case "$libexecdir" in + */utsudo) + AC_MSG_WARN([libexecdir should not include the "sudo" subdirectory]) + libexecdir=`expr "$libexecdir" : '\\(.*\\)/utsudo$'` + ;; +esac + +dnl +dnl Deprecated --with options (these all warn or generate an error) +dnl + +AC_ARG_WITH(otp-only, [AS_HELP_STRING([--with-otp-only], [deprecated])], +[case $with_otp_only in + yes) with_passwd="no" + AC_MSG_NOTICE([--with-otp-only option deprecated, treating as --without-passwd]) + ;; +esac]) + +AC_ARG_WITH(alertmail, [AS_HELP_STRING([--with-alertmail], [deprecated])], +[case $with_alertmail in + *) with_mailto="$with_alertmail" + AC_MSG_NOTICE([--with-alertmail option deprecated, treating as --mailto]) + ;; +esac]) + +AC_ARG_WITH(pc-insults, [AS_HELP_STRING([--with-pc-insults], [deprecated])], +[case $with_pc_insults in + yes) enable_offensive_insults=no + AC_MSG_NOTICE([--with-pc-insults option deprecated, it is now the default]) + ;; + no) enable_offensive_insults=yes + AC_MSG_NOTICE([--without-pc-insults option deprecated, use --enable-offensive-insults]) + ;; +esac]) + +dnl +dnl Options for --with +dnl + +AC_ARG_WITH(devel, [AS_HELP_STRING([--with-devel], [add development options])], +[case $with_devel in + yes) AC_MSG_NOTICE([Setting up for development: -Wall, flex, yacc]) + AX_APPEND_FLAG([-DSUDO_DEVEL], [CPPFLAGS]) + DEVEL="true" + devdir=. + ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --with-devel: $with_devel]) + ;; +esac]) + +AC_ARG_WITH(CC, [AS_HELP_STRING([--with-CC], [C compiler to use])], +[case $with_CC in + *) AC_MSG_ERROR([the --with-CC option is no longer supported, please set the CC environment variable instead.]) + ;; +esac]) + +AC_ARG_WITH(rpath, [AS_HELP_STRING([--with-rpath], [deprecated, use --disable-rpath])], +[AC_MSG_WARN([--with-rpath deprecated, rpath is now the default])]) + +AC_ARG_WITH(blibpath, [AS_HELP_STRING([--with-blibpath[[=PATH]]], [deprecated])], +[AC_MSG_WARN([--with-blibpath deprecated, use --with-libpath])]) + +dnl +dnl Handle BSM auditing support. +dnl +AC_ARG_WITH(bsm-audit, [AS_HELP_STRING([--with-bsm-audit], [enable BSM audit support])], +[case $with_bsm_audit in + yes) AC_DEFINE(HAVE_BSM_AUDIT) + SUDOERS_LIBS="${SUDOERS_LIBS} -lbsm" + SUDOERS_OBJS="${SUDOERS_OBJS} bsm_audit.lo" + ;; + no) ;; + *) AC_MSG_ERROR(["--with-bsm-audit does not take an argument."]) + ;; +esac]) + +dnl +dnl Handle Linux auditing support. +dnl +AC_ARG_WITH(linux-audit, [AS_HELP_STRING([--with-linux-audit], [enable Linux audit support])], +[case $with_linux_audit in + yes) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = AUDIT_USER_CMD; (void)i;]])], [ + AC_DEFINE(HAVE_LINUX_AUDIT) + SUDO_LIBS="${SUDO_LIBS} -laudit" + SUDOERS_LIBS="${SUDO_LIBS} -laudit" + SUDOERS_OBJS="${SUDOERS_OBJS} linux_audit.lo" + ], [ + AC_MSG_ERROR([unable to find AUDIT_USER_CMD in libaudit.h for --with-linux-audit]) + ]) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-linux-audit does not take an argument."]) + ;; +esac]) + +dnl +dnl Handle Solaris auditing support. +dnl +AC_ARG_WITH(solaris-audit, [AS_HELP_STRING([--with-solaris-audit], [enable Solaris audit support])], +[case $with_solaris_audit in + yes) AC_DEFINE(HAVE_SOLARIS_AUDIT) + SUDOERS_LIBS="${SUDOERS_LIBS} -lbsm" + SUDOERS_OBJS="${SUDOERS_OBJS} solaris_audit.lo" + ;; + no) ;; + *) AC_MSG_ERROR(["--with-solaris-audit does not take an argument."]) + ;; +esac]) + +dnl +dnl Handle SSSD support. +dnl +AC_ARG_WITH(sssd, [AS_HELP_STRING([--with-sssd], [enable SSSD support])], +[case $with_sssd in + yes) SUDOERS_OBJS="${SUDOERS_OBJS} sssd.lo" + case "$SUDOERS_OBJS" in + *ldap_util.lo*) ;; + *) SUDOERS_OBJS="${SUDOERS_OBJS} ldap_util.lo";; + esac + AC_DEFINE(HAVE_SSSD) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-sssd does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(sssd-conf, [AS_HELP_STRING([--with-sssd-conf], [path to the SSSD config file])]) +sssd_conf="/etc/sssd/sssd.conf" +test -n "$with_sssd_conf" && sssd_conf="$with_sssd_conf" +SUDO_DEFINE_UNQUOTED(_PATH_SSSD_CONF, "$sssd_conf", [Path to the SSSD config file]) + +AC_ARG_WITH(sssd-lib, [AS_HELP_STRING([--with-sssd-lib], [path to the SSSD library])]) +sssd_lib="\"LIBDIR\"" +test -n "$with_sssd_lib" && sssd_lib="$with_sssd_lib" +SUDO_DEFINE_UNQUOTED(_PATH_SSSD_LIB, "$sssd_lib", [Path to the SSSD library]) + +AC_ARG_WITH(incpath, [AS_HELP_STRING([--with-incpath], [additional places to look for include files])], +[case $with_incpath in + yes) AC_MSG_ERROR(["must give --with-incpath an argument."]) + ;; + no) AC_MSG_ERROR(["--without-incpath not supported."]) + ;; + *) AC_MSG_NOTICE([Adding ${with_incpath} to CPPFLAGS]) + for i in ${with_incpath}; do + AX_APPEND_FLAG([-I${i}], [CPPFLAGS]) + done + ;; +esac]) + +AC_ARG_WITH(libpath, [AS_HELP_STRING([--with-libpath], [additional places to look for libraries])], +[case $with_libpath in + yes) AC_MSG_ERROR(["must give --with-libpath an argument."]) + ;; + no) AC_MSG_ERROR(["--without-libpath not supported."]) + ;; + *) AC_MSG_NOTICE([Adding ${with_libpath} to LDFLAGS]) + ;; +esac]) + +AC_ARG_WITH(libraries, [AS_HELP_STRING([--with-libraries], [additional libraries to link with])], +[case $with_libraries in + yes) AC_MSG_ERROR(["must give --with-libraries an argument."]) + ;; + no) AC_MSG_ERROR(["--without-libraries not supported."]) + ;; + *) AC_MSG_NOTICE([Adding ${with_libraries} to LIBS]) + ;; +esac]) + +AC_ARG_WITH(efence, [AS_HELP_STRING([--with-efence], [link with -lefence for malloc() debugging])], +[case $with_efence in + yes) AC_MSG_NOTICE([Sudo will link with -lefence (Electric Fence)]) + LIBS="${LIBS} -lefence" + if test -f /usr/local/lib/libefence.a; then + with_libpath="${with_libpath} /usr/local/lib" + fi + ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --with-efence: $with_efence]) + ;; +esac]) + +AC_ARG_WITH(csops, [AS_HELP_STRING([--with-csops], [add CSOps standard options])], +[case $with_csops in + yes) AC_MSG_NOTICE([Adding CSOps standard options]) + CHECKSIA=false + with_ignore_dot=yes + insults=on + with_classic_insults=yes + with_csops_insults=yes + with_env_editor=yes + : ${mansectsu='8'} + : ${mansectform='5'} + ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --with-csops: $with_csops]) + ;; +esac]) + +AC_ARG_WITH(passwd, [AS_HELP_STRING([--without-passwd], [don't use passwd/shadow file for authentication])], +[case $with_passwd in + yes|no) AC_MSG_CHECKING(whether to use shadow/passwd file authentication) + AC_MSG_RESULT($with_passwd) + AUTH_DEF="" + test "$with_passwd" = "yes" && AUTH_REG="$AUTH_REG passwd" + ;; + *) AC_MSG_ERROR(["Sorry, --with-passwd does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(skey, [AS_HELP_STRING([--with-skey[[=DIR]]], [enable S/Key support ])], +[case $with_skey in + no) ;; + *) AC_DEFINE(HAVE_SKEY) + AC_MSG_CHECKING(whether to try S/Key authentication) + AC_MSG_RESULT(yes) + AUTH_REG="$AUTH_REG S/Key" + ;; +esac]) + +AC_ARG_WITH(opie, [AS_HELP_STRING([--with-opie[[=DIR]]], [enable OPIE support ])], +[case $with_opie in + no) ;; + *) AC_DEFINE(HAVE_OPIE) + AC_MSG_CHECKING(whether to try NRL OPIE authentication) + AC_MSG_RESULT(yes) + AUTH_REG="$AUTH_REG NRL_OPIE" + ;; +esac]) + +AC_ARG_WITH(long-otp-prompt, [AS_HELP_STRING([--with-long-otp-prompt], [use a two line OTP (skey/opie) prompt])], +[case $with_long_otp_prompt in + yes) AC_DEFINE(LONG_OTP_PROMPT) + AC_MSG_CHECKING(whether to use a two line prompt for OTP authentication) + AC_MSG_RESULT(yes) + long_otp_prompt=on + ;; + no) long_otp_prompt=off + ;; + *) AC_MSG_ERROR(["--with-long-otp-prompt does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(SecurID, [AS_HELP_STRING([--with-SecurID[[=DIR]]], [enable SecurID support])], +[case $with_SecurID in + no) ;; + *) AC_DEFINE(HAVE_SECURID) + AC_MSG_CHECKING(whether to use SecurID for authentication) + AC_MSG_RESULT(yes) + AUTH_EXCL="$AUTH_EXCL SecurID" + ;; +esac]) + +AC_ARG_WITH(fwtk, [AS_HELP_STRING([--with-fwtk[[=DIR]]], [enable FWTK AuthSRV support])], +[case $with_fwtk in + no) ;; + *) AC_DEFINE(HAVE_FWTK) + AC_MSG_CHECKING(whether to use FWTK AuthSRV for authentication) + AC_MSG_RESULT(yes) + AUTH_EXCL="$AUTH_EXCL FWTK" + ;; +esac]) + +AC_ARG_WITH(kerb5, [AS_HELP_STRING([--with-kerb5[[=DIR]]], [enable Kerberos V support])], +[case $with_kerb5 in + no) ;; + *) AC_MSG_CHECKING(whether to try Kerberos V authentication) + AC_MSG_RESULT(yes) + AUTH_REG="$AUTH_REG kerb5" + ;; +esac]) + +AC_ARG_WITH(aixauth, [AS_HELP_STRING([--with-aixauth], [enable AIX general authentication support])], +[case $with_aixauth in + yes) AUTH_EXCL="$AUTH_EXCL AIX_AUTH";; + no) ;; + *) AC_MSG_ERROR(["--with-aixauth does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(pam, [AS_HELP_STRING([--with-pam], [enable PAM support])], +[case $with_pam in + yes) AUTH_EXCL="$AUTH_EXCL PAM";; + no) ;; + *) AC_MSG_ERROR(["--with-pam does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(AFS, [AS_HELP_STRING([--with-AFS], [enable AFS support])], +[case $with_AFS in + yes) AC_DEFINE(HAVE_AFS) + AC_MSG_CHECKING(whether to try AFS (kerberos) authentication) + AC_MSG_RESULT(yes) + AUTH_REG="$AUTH_REG AFS" + ;; + no) ;; + *) AC_MSG_ERROR(["--with-AFS does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(DCE, [AS_HELP_STRING([--with-DCE], [enable DCE support])], +[case $with_DCE in + yes) AC_DEFINE(HAVE_DCE) + AC_MSG_CHECKING(whether to try DCE (kerberos) authentication) + AC_MSG_RESULT(yes) + AUTH_REG="$AUTH_REG DCE" + ;; + no) ;; + *) AC_MSG_ERROR(["--with-DCE does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(logincap, [AS_HELP_STRING([--with-logincap], [enable BSD login class support])], +[case $with_logincap in + yes|no) ;; + *) AC_MSG_ERROR(["--with-logincap does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(bsdauth, [AS_HELP_STRING([--with-bsdauth], [enable BSD authentication support])], +[case $with_bsdauth in + yes) AUTH_EXCL="$AUTH_EXCL BSD_AUTH";; + no) ;; + *) AC_MSG_ERROR(["--with-bsdauth does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(project, [AS_HELP_STRING([--with-project], [enable Solaris project support])], +[case $with_project in + yes|no) ;; + no) ;; + *) AC_MSG_ERROR(["--with-project does not take an argument."]) + ;; +esac]) + +AC_MSG_CHECKING(whether to lecture users the first time they run sudo) +AC_ARG_WITH(lecture, [AS_HELP_STRING([--without-lecture], [don't print lecture for first-time sudoer])], +[case $with_lecture in + yes|short|always) lecture=once + ;; + no|none|never) lecture=never + ;; + *) AC_MSG_ERROR(["unknown argument to --with-lecture: $with_lecture"]) + ;; +esac]) +if test "$lecture" = "once"; then + AC_MSG_RESULT(yes) +else + AC_DEFINE(NO_LECTURE) + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether sudo should log via syslog or to a file by default) +AC_ARG_WITH(logging, [AS_HELP_STRING([--with-logging], [log via syslog, file, or both])], +[case $with_logging in + yes) AC_MSG_ERROR(["must give --with-logging an argument."]) + ;; + no) AC_MSG_ERROR(["--without-logging not supported."]) + ;; + syslog) AC_DEFINE(LOGGING, SLOG_SYSLOG) + AC_MSG_RESULT(syslog) + ;; + file) AC_DEFINE(LOGGING, SLOG_FILE) + AC_MSG_RESULT(file) + ;; + both) AC_DEFINE(LOGGING, SLOG_BOTH) + AC_MSG_RESULT(both) + ;; + *) AC_MSG_ERROR(["unknown argument to --with-logging: $with_logging"]) + ;; +esac], [AC_DEFINE(LOGGING, SLOG_SYSLOG) AC_MSG_RESULT(syslog)]) + +AC_ARG_WITH(logfac, [AS_HELP_STRING([--with-logfac], [syslog facility to log with (default is "auth")])], +[case $with_logfac in + yes) AC_MSG_ERROR(["must give --with-logfac an argument."]) + ;; + no) AC_MSG_ERROR(["--without-logfac not supported."]) + ;; + authpriv|auth|daemon|user|local0|local1|local2|local3|local4|local5|local6|local7) logfac=$with_logfac + ;; + *) AC_MSG_ERROR(["$with_logfac is not a supported syslog facility."]) + ;; +esac]) + +AC_MSG_CHECKING(at which syslog priority to log commands) +AC_ARG_WITH(goodpri, [AS_HELP_STRING([--with-goodpri], [syslog priority for commands (def is "notice")])], +[case $with_goodpri in + yes) AC_MSG_ERROR(["must give --with-goodpri an argument."]) + ;; + no) AC_MSG_ERROR(["--without-goodpri not supported."]) + ;; + alert|crit|debug|emerg|err|info|notice|warning) + goodpri=$with_goodpri + ;; + *) AC_MSG_ERROR(["$with_goodpri is not a supported syslog priority."]) + ;; +esac]) +AC_DEFINE_UNQUOTED(PRI_SUCCESS, "$goodpri", [The syslog priority sudo will use for successful attempts.]) +AC_MSG_RESULT($goodpri) + +AC_MSG_CHECKING(at which syslog priority to log failures) +AC_ARG_WITH(badpri, [AS_HELP_STRING([--with-badpri], [syslog priority for failures (def is "alert")])], +[case $with_badpri in + yes) AC_MSG_ERROR(["must give --with-badpri an argument."]) + ;; + no) AC_MSG_ERROR(["--without-badpri not supported."]) + ;; + alert|crit|debug|emerg|err|info|notice|warning) + badpri=$with_badpri + ;; + *) AC_MSG_ERROR([$with_badpri is not a supported syslog priority.]) + ;; +esac]) +AC_DEFINE_UNQUOTED(PRI_FAILURE, "$badpri", [The syslog priority sudo will use for unsuccessful attempts/errors.]) +AC_MSG_RESULT($badpri) + +AC_ARG_WITH(logpath, [AS_HELP_STRING([--with-logpath], [path to the sudo log file])], +[case $with_logpath in + yes) AC_MSG_ERROR(["must give --with-logpath an argument."]) + ;; + no) AC_MSG_ERROR(["--without-logpath not supported."]) + ;; +esac]) + +AC_MSG_CHECKING(how long a line in the log file should be) +AC_ARG_WITH(loglen, [AS_HELP_STRING([--with-loglen], [maximum length of a log file line (default is 80)])], +[case $with_loglen in + yes) AC_MSG_ERROR(["must give --with-loglen an argument."]) + ;; + no) AC_MSG_ERROR(["--without-loglen not supported."]) + ;; + [[0-9]]*) loglen=$with_loglen + ;; + *) AC_MSG_ERROR(["you must enter a number, not $with_loglen"]) + ;; +esac]) +AC_DEFINE_UNQUOTED(MAXLOGFILELEN, $loglen, [The max number of chars per log file line (for line wrapping).]) +AC_MSG_RESULT($loglen) + +AC_MSG_CHECKING(whether sudo should ignore '.' or '' in \$PATH) +AC_ARG_WITH(ignore-dot, [AS_HELP_STRING([--with-ignore-dot], [ignore '.' in the PATH])], +[case $with_ignore_dot in + yes) ignore_dot=on + ;; + no) ignore_dot=off + ;; + *) AC_MSG_ERROR(["--with-ignore-dot does not take an argument."]) + ;; +esac]) +if test "$ignore_dot" = "on"; then + AC_DEFINE(IGNORE_DOT_PATH) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether to send mail when a user is not in sudoers) +AC_ARG_WITH(mail-if-no-user, [AS_HELP_STRING([--without-mail-if-no-user], [do not send mail if user not in sudoers])], +[case $with_mail_if_no_user in + yes) mail_no_user=on + ;; + no) mail_no_user=off + ;; + *) AC_MSG_ERROR(["--with-mail-if-no-user does not take an argument."]) + ;; +esac]) +if test "$mail_no_user" = "on"; then + AC_DEFINE(SEND_MAIL_WHEN_NO_USER) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether to send mail when user listed but not for this host) +AC_ARG_WITH(mail-if-no-host, [AS_HELP_STRING([--with-mail-if-no-host], [send mail if user in sudoers but not for this host])], +[case $with_mail_if_no_host in + yes) mail_no_host=on + ;; + no) mail_no_host=off + ;; + *) AC_MSG_ERROR(["--with-mail-if-no-host does not take an argument."]) + ;; +esac]) +if test "$mail_no_host" = "on"; then + AC_DEFINE(SEND_MAIL_WHEN_NO_HOST) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether to send mail when a user tries a disallowed command) +AC_ARG_WITH(mail-if-noperms, [AS_HELP_STRING([--with-mail-if-noperms], [send mail if user not allowed to run command])], +[case $with_mail_if_noperms in + yes) mail_noperms=on + ;; + no) mail_noperms=off + ;; + *) AC_MSG_ERROR(["--with-mail-if-noperms does not take an argument."]) + ;; +esac]) +if test "$mail_noperms" = "on"; then + AC_DEFINE(SEND_MAIL_WHEN_NOT_OK) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(who should get the mail that sudo sends) +AC_ARG_WITH(mailto, [AS_HELP_STRING([--with-mailto], [who should get sudo mail (default is "root")])], +[case $with_mailto in + yes) AC_MSG_ERROR(["must give --with-mailto an argument."]) + ;; + no) AC_MSG_ERROR(["--without-mailto not supported."]) + ;; + *) mailto=$with_mailto + ;; +esac]) +AC_DEFINE_UNQUOTED(MAILTO, "$mailto", [The user or email address that sudo mail is sent to.]) +AC_MSG_RESULT([$mailto]) + +AC_ARG_WITH(mailsubject, [AS_HELP_STRING([--with-mailsubject], [subject of sudo mail])], +[case $with_mailsubject in + yes) AC_MSG_ERROR(["must give --with-mailsubject an argument."]) + ;; + no) AC_MSG_WARN([Sorry, --without-mailsubject not supported.]) + ;; + *) mailsub="$with_mailsubject" + AC_MSG_CHECKING(sudo mail subject) + AC_MSG_RESULT([Using alert mail subject: $mailsub]) + ;; +esac]) +AC_DEFINE_UNQUOTED(MAILSUBJECT, "$mailsub", [The subject of the mail sent by sudo to the MAILTO user/address.]) + +AC_MSG_CHECKING(for bad password prompt) +AC_ARG_WITH(passprompt, [AS_HELP_STRING([--with-passprompt], [default password prompt])], +[case $with_passprompt in + yes) AC_MSG_ERROR(["must give --with-passprompt an argument."]) + ;; + no) AC_MSG_WARN([Sorry, --without-passprompt not supported.]) + ;; + *) passprompt="$with_passprompt" +esac]) +AC_MSG_RESULT($passprompt) +AC_DEFINE_UNQUOTED(PASSPROMPT, "$passprompt", [The default password prompt.]) + +AC_MSG_CHECKING(for bad password message) +AC_ARG_WITH(badpass-message, [AS_HELP_STRING([--with-badpass-message], [message the user sees when the password is wrong])], +[case $with_badpass_message in + yes) AC_MSG_ERROR(["Must give --with-badpass-message an argument."]) + ;; + no) AC_MSG_WARN([Sorry, --without-badpass-message not supported.]) + ;; + *) badpass_message="$with_badpass_message" + ;; +esac]) +AC_DEFINE_UNQUOTED(INCORRECT_PASSWORD, "$badpass_message", [The message given when a bad password is entered.]) +AC_MSG_RESULT([$badpass_message]) + +AC_MSG_CHECKING(whether to expect fully qualified hosts in sudoers) +AC_ARG_WITH(fqdn, [AS_HELP_STRING([--with-fqdn], [expect fully qualified hosts in sudoers])], +[case $with_fqdn in + yes) fqdn=on + ;; + no) fqdn=off + ;; + *) AC_MSG_ERROR(["--with-fqdn does not take an argument."]) + ;; +esac]) +if test "$fqdn" = "on"; then + AC_DEFINE(FQDN) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_ARG_WITH(timedir, [AS_HELP_STRING([--with-timedir=DIR], [deprecated])], +[case $with_timedir in + *) AC_MSG_ERROR(["--without-timedir no longer supported, see --with-rundir."]) + ;; +esac]) + +AC_ARG_WITH(rundir, [AS_HELP_STRING([--with-rundir=DIR], [directory for sudo-specific files that do not survive a system reboot, e.g. `/var/run/sudo'])], +[case $with_rundir in + yes) AC_MSG_ERROR(["must give --with-rundir an argument."]) + ;; + no) AC_MSG_ERROR(["--without-rundir not supported."]) + ;; +esac]) + +AC_ARG_WITH(vardir, [AS_HELP_STRING([--with-vardir=DIR], [directory for sudo-specific files that survive a system reboot, e.g. `/var/db/sudo' or `/var/lib/sudo'])], +[case $with_vardir in + yes) AC_MSG_ERROR(["must give --with-vardir an argument."]) + ;; + no) AC_MSG_ERROR(["--without-vardir not supported."]) + ;; +esac]) + +AC_ARG_WITH(iologdir, [AS_HELP_STRING([--with-iologdir=DIR], [directory to store sudo I/O log files in])], +[case $with_iologdir in + yes) ;; + no) AC_MSG_ERROR(["--without-iologdir not supported."]) + ;; +esac]) + +AC_ARG_WITH(tzdir, [AS_HELP_STRING([--with-tzdir=DIR], [path to the time zone data directory])], +[case $with_tzdir in + yes) AC_MSG_ERROR(["must give --with-tzdir an argument."]) + ;; +esac]) + +AC_ARG_WITH(sendmail, [AS_HELP_STRING([--with-sendmail], [set path to sendmail]) +AS_HELP_STRING([--without-sendmail], [do not send mail at all])], +[case $with_sendmail in + yes) with_sendmail="" + ;; + no) ;; + *) SUDO_DEFINE_UNQUOTED(_PATH_SUDO_SENDMAIL, "$with_sendmail") + ;; +esac]) + +AC_ARG_WITH(sudoers-mode, [AS_HELP_STRING([--with-sudoers-mode], [mode of sudoers file (defaults to 0440)])], +[case $with_sudoers_mode in + yes) AC_MSG_ERROR(["must give --with-sudoers-mode an argument."]) + ;; + no) AC_MSG_ERROR(["--without-sudoers-mode not supported."]) + ;; + [[1-9]]*) SUDOERS_MODE=0${with_sudoers_mode} + ;; + 0*) SUDOERS_MODE=$with_sudoers_mode + ;; + *) AC_MSG_ERROR(["you must use an octal mode, not a name."]) + ;; +esac]) + +AC_ARG_WITH(sudoers-uid, [AS_HELP_STRING([--with-sudoers-uid], [uid that owns sudoers file (defaults to 0)])], +[case $with_sudoers_uid in + yes) AC_MSG_ERROR(["must give --with-sudoers-uid an argument."]) + ;; + no) AC_MSG_ERROR(["--without-sudoers-uid not supported."]) + ;; + [[0-9]]*) SUDOERS_UID=$with_sudoers_uid + ;; + *) AC_MSG_ERROR(["you must use an unsigned numeric uid, not a name."]) + ;; +esac]) + +AC_ARG_WITH(sudoers-gid, [AS_HELP_STRING([--with-sudoers-gid], [gid that owns sudoers file (defaults to 0)])], +[case $with_sudoers_gid in + yes) AC_MSG_ERROR(["must give --with-sudoers-gid an argument."]) + ;; + no) AC_MSG_ERROR(["--without-sudoers-gid not supported."]) + ;; + [[0-9]]*) SUDOERS_GID=$with_sudoers_gid + ;; + *) AC_MSG_ERROR(["you must use an unsigned numeric gid, not a name."]) + ;; +esac]) + +AC_MSG_CHECKING(for umask programs should be run with) +AC_ARG_WITH(umask, [AS_HELP_STRING([--with-umask], [umask with which the prog should run (default is 022)]) +AS_HELP_STRING([--without-umask], [Preserves the umask of the user invoking sudo.])], +[case $with_umask in + yes) AC_MSG_ERROR(["must give --with-umask an argument."]) + ;; + no) sudo_umask=0777 + ;; + [[0-9]]*) sudo_umask=$with_umask + ;; + *) AC_MSG_ERROR(["you must enter a numeric mask."]) + ;; +esac]) +AC_DEFINE_UNQUOTED(SUDO_UMASK, $sudo_umask, [The umask that the sudo-run prog should use.]) +if test "$sudo_umask" = "0777"; then + AC_MSG_RESULT(user) +else + AC_MSG_RESULT($sudo_umask) +fi + +AC_ARG_WITH(umask-override, [AS_HELP_STRING([--with-umask-override], [Use the umask specified in sudoers even if it is less restrictive than the user's.])], +[case $with_umask_override in + yes) AC_DEFINE(UMASK_OVERRIDE) + umask_override=on + ;; + no) umask_override=off + ;; + *) AC_MSG_ERROR(["--with-umask-override does not take an argument."]) + ;; +esac]) + +AC_MSG_CHECKING(for default user to run commands as) +AC_ARG_WITH(runas-default, [AS_HELP_STRING([--with-runas-default], [User to run commands as (default is "root")])], +[case $with_runas_default in + yes) AC_MSG_ERROR(["must give --with-runas-default an argument."]) + ;; + no) AC_MSG_ERROR(["--without-runas-default not supported."]) + ;; + *) runas_default="$with_runas_default" + ;; +esac]) +AC_DEFINE_UNQUOTED(RUNAS_DEFAULT, "$runas_default", [The user sudo should run commands as by default.]) +AC_MSG_RESULT([$runas_default]) + +AC_ARG_WITH(exempt, [AS_HELP_STRING([--with-exempt=group], [no passwd needed for users in this group])], +[case $with_exempt in + yes) AC_MSG_ERROR(["must give --with-exempt an argument."]) + ;; + no) AC_MSG_ERROR(["--without-exempt not supported."]) + ;; + *) AC_DEFINE_UNQUOTED(EXEMPTGROUP, "$with_exempt", [If defined, users in this group need not enter a passwd (ie "sudo").]) + AC_MSG_CHECKING(for group to be exempt from password) + AC_MSG_RESULT([$with_exempt]) + ;; +esac]) + +AC_MSG_CHECKING(for editor that visudo should use) +AC_ARG_WITH(editor, [AS_HELP_STRING([--with-editor=path], [Default editor for visudo (defaults to vi)])], +[case $with_editor in + yes) AC_MSG_ERROR(["must give --with-editor an argument."]) + ;; + no) AC_MSG_ERROR(["--without-editor not supported."]) + ;; + *) AC_DEFINE_UNQUOTED(EDITOR, "$with_editor", [A colon-separated list of pathnames to be used as the editor for visudo.]) + AC_MSG_RESULT([$with_editor]) + editor="$with_editor" + ;; +esac], [AC_DEFINE(EDITOR, _PATH_VI) AC_MSG_RESULT(vi)]) + +AC_MSG_CHECKING(whether to obey EDITOR and VISUAL environment variables) +AC_ARG_WITH(env-editor, [AS_HELP_STRING([--with-env-editor], [Use the environment variable EDITOR for visudo])], +[case $with_env_editor in + yes) env_editor=on + ;; + no) env_editor=off + ;; + *) AC_MSG_ERROR(["--with-env-editor does not take an argument."]) + ;; +esac]) +if test "$env_editor" = "on"; then + AC_DEFINE(ENV_EDITOR) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(number of tries a user gets to enter their password) +AC_ARG_WITH(passwd-tries, [AS_HELP_STRING([--with-passwd-tries], [number of tries to enter password (default is 3)])], +[case $with_passwd_tries in + yes) ;; + no) AC_MSG_ERROR(["--without-editor not supported."]) + ;; + [[1-9]]*) passwd_tries=$with_passwd_tries + ;; + *) AC_MSG_ERROR(["you must enter the numer of tries, > 0"]) + ;; +esac]) +AC_DEFINE_UNQUOTED(TRIES_FOR_PASSWORD, $passwd_tries, [The number of tries a user gets to enter their password.]) +AC_MSG_RESULT($passwd_tries) + +AC_MSG_CHECKING(time in minutes after which sudo will ask for a password again) +AC_ARG_WITH(timeout, [AS_HELP_STRING([--with-timeout], [minutes before sudo asks for passwd again (def is 5 minutes)])], +[case $with_timeout in + yes) ;; + no) timeout=0 + ;; + [[0-9]]*) timeout=$with_timeout + ;; + *) AC_MSG_ERROR(["you must enter the numer of minutes."]) + ;; +esac]) +AC_DEFINE_UNQUOTED(TIMEOUT, $timeout, [The number of minutes before sudo asks for a password again.]) +AC_MSG_RESULT($timeout) + +AC_MSG_CHECKING(time in minutes after the password prompt will time out) +AC_ARG_WITH(password-timeout, [AS_HELP_STRING([--with-password-timeout], [passwd prompt timeout in minutes (default is 5 minutes)])], +[case $with_password_timeout in + yes) ;; + no) password_timeout=0 + ;; + [[0-9]]*) password_timeout=$with_password_timeout + ;; + *) AC_MSG_ERROR(["you must enter the numer of minutes."]) + ;; +esac]) +AC_DEFINE_UNQUOTED(PASSWORD_TIMEOUT, $password_timeout, [The passwd prompt timeout (in minutes).]) +AC_MSG_RESULT($password_timeout) + +AC_ARG_WITH(tty-tickets, [AS_HELP_STRING([--with-tty-tickets], [use a different ticket file for each tty])], +[case $with_tty_tickets in + yes) timestamp_type=tty + ;; + no) timestamp_type=global + ;; + *) AC_MSG_ERROR(["--with-tty-tickets does not take an argument."]) + ;; +esac]) + +AC_MSG_CHECKING(whether to include insults) +AC_ARG_WITH(insults, [AS_HELP_STRING([--with-insults], [insult the user for entering an incorrect password])], +[case $with_insults in + yes) insults=on + with_classic_insults=yes + with_csops_insults=yes + ;; + disabled) insults=off + with_classic_insults=yes + with_csops_insults=yes + ;; + no) insults=off + ;; + *) AC_MSG_ERROR(["--with-insults does not take an argument."]) + ;; +esac]) +if test "$insults" = "on"; then + AC_DEFINE(USE_INSULTS) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_ARG_WITH(all-insults, [AS_HELP_STRING([--with-all-insults], [include all the sudo insult sets])], +[case $with_all_insults in + yes) with_classic_insults=yes + with_csops_insults=yes + with_hal_insults=yes + with_goons_insults=yes + with_python_insults=yes + ;; + no) ;; + *) AC_MSG_ERROR(["--with-all-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(classic-insults, [AS_HELP_STRING([--with-classic-insults], [include the insults from the "classic" sudo])], +[case $with_classic_insults in + yes) AC_DEFINE(CLASSIC_INSULTS) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-classic-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(csops-insults, [AS_HELP_STRING([--with-csops-insults], [include CSOps insults])], +[case $with_csops_insults in + yes) AC_DEFINE(CSOPS_INSULTS) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-csops-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(hal-insults, [AS_HELP_STRING([--with-hal-insults], [include 2001-like insults])], +[case $with_hal_insults in + yes) AC_DEFINE(HAL_INSULTS) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-hal-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(goons-insults, [AS_HELP_STRING([--with-goons-insults], [include the insults from the "Goon Show"])], +[case $with_goons_insults in + yes) AC_DEFINE(GOONS_INSULTS) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-goons-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(python-insults, [AS_HELP_STRING([--with-python-insults], [include the insults from "Monty Python's Flying Circus"])], +[case $with_python_insults in + yes) AC_DEFINE(PYTHON_INSULTS) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-python-insults does not take an argument."]) + ;; +esac]) + +AC_ARG_WITH(nsswitch, [AS_HELP_STRING([--with-nsswitch[[=PATH]]], [path to nsswitch.conf])], +[case $with_nsswitch in + no) ;; + yes) with_nsswitch="/etc/nsswitch.conf" + ;; + *) ;; +esac]) + +AC_ARG_WITH(ldap, [AS_HELP_STRING([--with-ldap[[=DIR]]], [enable LDAP support])], +[case $with_ldap in + no) ;; + *) AC_DEFINE(HAVE_LDAP) + AC_MSG_CHECKING(whether to use sudoers from LDAP) + AC_MSG_RESULT(yes) + ;; +esac]) + +AC_ARG_WITH(ldap-conf-file, [AS_HELP_STRING([--with-ldap-conf-file], [path to LDAP configuration file])]) +test -n "$with_ldap_conf_file" && ldap_conf="$with_ldap_conf_file" +SUDO_DEFINE_UNQUOTED(_PATH_LDAP_CONF, "$ldap_conf", [Path to the ldap.conf file]) + +AC_ARG_WITH(ldap-secret-file, [AS_HELP_STRING([--with-ldap-secret-file], [path to LDAP secret password file])]) +test -n "$with_ldap_secret_file" && ldap_secret="$with_ldap_secret_file" +SUDO_DEFINE_UNQUOTED(_PATH_LDAP_SECRET, "$ldap_secret", [Path to the ldap.secret file]) + +dnl include all insult sets on one line +if test "$insults" = "on"; then + AC_MSG_CHECKING(which insult sets to include) + i="" + test "$with_python_insults" = "yes" && i="python ${i}" + test "$with_goons_insults" = "yes" && i="goons ${i}" + test "$with_hal_insults" = "yes" && i="hal ${i}" + test "$with_csops_insults" = "yes" && i="csops ${i}" + test "$with_classic_insults" = "yes" && i="classic ${i}" + AC_MSG_RESULT([$i]) +fi + +AC_MSG_CHECKING(whether to override the user's path) +AC_ARG_WITH(secure-path, [AS_HELP_STRING([--with-secure-path], [override the user's path with a built-in one])], +[case $with_secure_path in + yes) with_secure_path="/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc" + AC_DEFINE_UNQUOTED(SECURE_PATH, "$with_secure_path") + AC_MSG_RESULT([$with_secure_path]) + secure_path="set to $with_secure_path" + ;; + no) AC_MSG_RESULT(no) + ;; + *) AC_DEFINE_UNQUOTED(SECURE_PATH, "$with_secure_path") + AC_MSG_RESULT([$with_secure_path]) + secure_path="set to F<$with_secure_path>" + ;; +esac], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether to get ip addresses from the network interfaces) +AC_ARG_WITH(interfaces, [AS_HELP_STRING([--without-interfaces], [don't try to read the ip addr of ether interfaces])], +[case $with_interfaces in + yes) AC_MSG_RESULT(yes) + ;; + no) AC_DEFINE(STUB_LOAD_INTERFACES) + AC_MSG_RESULT(no) + ;; + *) AC_MSG_ERROR(["--with-interfaces does not take an argument."]) + ;; +esac], AC_MSG_RESULT(yes)) + +AC_MSG_CHECKING(whether to use an askpass helper) +AC_ARG_WITH(askpass, [AS_HELP_STRING([--with-askpass=PATH], [Fully qualified pathname of askpass helper])], +[case $with_askpass in + yes) AC_MSG_ERROR(["--with-askpass takes a path as an argument."]) + ;; + no) ;; + *) ;; +esac], [ + with_askpass=no + AC_MSG_RESULT(no) +]) +if test X"$with_askpass" != X"no"; then + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_ASKPASS, "$with_askpass") +else + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_ASKPASS, NULL) +fi + +AC_ARG_WITH(exampledir, [AS_HELP_STRING([--with-exampledir=DIR], [path to install sudo examples in])], +[case $with_exampledir in + yes) AC_MSG_ERROR(["must give --with-exampledir an argument."]) + ;; + no) AC_MSG_ERROR(["--without-exampledir not supported."]) + ;; + *) exampledir="$with_exampledir" +esac]) + +AC_ARG_WITH(plugindir, [AS_HELP_STRING([--with-plugindir=DIR], [set directory to load plugins from])], +[case $with_plugindir in + yes) AC_MSG_ERROR(["must give --with-plugindir an argument."]) + ;; + no) AC_MSG_ERROR(["--without-plugindir not supported."]) + ;; + *) plugindir="$with_plugindir" + ;; +esac]) + +AC_ARG_WITH(man, [AS_HELP_STRING([--with-man], [manual pages use man macros])], +[case $with_man in + yes) MANTYPE=man + ;; + no) AC_MSG_ERROR(["--without-man not supported."]) + ;; + *) AC_MSG_ERROR(["ignoring unknown argument to --with-man: $with_man."]) + ;; +esac]) + +AC_ARG_WITH(mdoc, [AS_HELP_STRING([--with-mdoc], [manual pages use mdoc macros])], +[case $with_mdoc in + yes) MANTYPE=mdoc + ;; + no) AC_MSG_ERROR(["--without-mdoc not supported."]) + ;; + *) AC_MSG_ERROR(["ignoring unknown argument to --with-mdoc: $with_mdoc."]) + ;; +esac]) + +dnl +dnl Options for --enable +dnl + +AC_MSG_CHECKING(whether to do user authentication by default) +AC_ARG_ENABLE(authentication, +[AS_HELP_STRING([--disable-authentication], [Do not require authentication by default])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + ;; + no) AC_MSG_RESULT(no) + AC_DEFINE(NO_AUTHENTICATION) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-authentication: $enableval]) + ;; + esac +], AC_MSG_RESULT(yes)) + +AC_MSG_CHECKING(whether to disable running the mailer as root) +AC_ARG_ENABLE(root-mailer, +[AS_HELP_STRING([--disable-root-mailer], [Don't run the mailer as root, run as the user])], +[ case "$enableval" in + yes) AC_MSG_RESULT(no) + ;; + no) AC_MSG_RESULT(yes) + AC_DEFINE(NO_ROOT_MAILER) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-root-mailer: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_ARG_ENABLE(setreuid, +[AS_HELP_STRING([--disable-setreuid], [Don't try to use the setreuid() function])], +[ case "$enableval" in + no) SKIP_SETREUID=yes + ;; + *) ;; + esac +]) + +AC_ARG_ENABLE(setresuid, +[AS_HELP_STRING([--disable-setresuid], [Don't try to use the setresuid() function])], +[ case "$enableval" in + no) SKIP_SETRESUID=yes + ;; + *) ;; + esac +]) + +AC_MSG_CHECKING(whether to disable shadow password support) +AC_ARG_ENABLE(shadow, +[AS_HELP_STRING([--disable-shadow], [Never use shadow passwords])], +[ case "$enableval" in + yes) AC_MSG_RESULT(no) + ;; + no) AC_MSG_RESULT(yes) + CHECKSHADOW="false" + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-shadow: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether root should be allowed to use sudo) +AC_ARG_ENABLE(root-sudo, +[AS_HELP_STRING([--disable-root-sudo], [Don't allow root to run sudo])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + ;; + no) AC_DEFINE(NO_ROOT_SUDO) + AC_MSG_RESULT(no) + root_sudo=off + ;; + *) AC_MSG_ERROR(["--enable-root-sudo does not take an argument."]) + ;; + esac +], AC_MSG_RESULT(yes)) + +AC_MSG_CHECKING(whether to log the hostname in the log file) +AC_ARG_ENABLE(log-host, +[AS_HELP_STRING([--enable-log-host], [Log the hostname in the log file])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + AC_DEFINE(HOST_IN_LOG) + ;; + no) AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-log-host: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether to invoke a shell if sudo is given no arguments) +AC_ARG_ENABLE(noargs-shell, +[AS_HELP_STRING([--enable-noargs-shell], [If sudo is given no arguments run a shell])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + AC_DEFINE(SHELL_IF_NO_ARGS) + ;; + no) AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-noargs-shell: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether to set \$HOME to target user in shell mode) +AC_ARG_ENABLE(shell-sets-home, +[AS_HELP_STRING([--enable-shell-sets-home], [Set $HOME to target user in shell mode])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + AC_DEFINE(SHELL_SETS_HOME) + ;; + no) AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-shell-sets-home: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether to disable 'command not found' messages) +AC_ARG_ENABLE(path_info, +[AS_HELP_STRING([--disable-path-info], [Print 'command not allowed' not 'command not found'])], +[ case "$enableval" in + yes) AC_MSG_RESULT(no) + ;; + no) AC_MSG_RESULT(yes) + AC_DEFINE(DONT_LEAK_PATH_INFO) + path_info=off + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-path-info: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(whether to enable environment debugging) +AC_ARG_ENABLE(env_debug, +[AS_HELP_STRING([--enable-env-debug], [Whether to enable environment debugging.])], +[ case "$enableval" in + yes) AC_MSG_RESULT(yes) + AC_DEFINE(ENV_DEBUG, [], [Environment debugging.]) + ;; + no) AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-env-debug: $enableval]) + ;; + esac +], AC_MSG_RESULT(no)) + +AC_ARG_ENABLE(zlib, +[AS_HELP_STRING([--enable-zlib[[=PATH]]], [Whether to enable or disable zlib])], +[], [enable_zlib=yes]) +AX_APPEND_FLAG([-DZLIB_CONST], [CPPFLAGS]) + +AC_MSG_CHECKING(whether to enable environment resetting by default) +AC_ARG_ENABLE(env_reset, +[AS_HELP_STRING([--enable-env-reset], [Whether to enable environment resetting by default.])], +[ case "$enableval" in + yes) env_reset=on + ;; + no) env_reset=off + ;; + *) env_reset=on + AC_MSG_WARN([Ignoring unknown argument to --enable-env-reset: $enableval]) + ;; + esac +]) +if test "$env_reset" = "on"; then + AC_MSG_RESULT(yes) + AC_DEFINE(ENV_RESET, 1) +else + AC_MSG_RESULT(no) + AC_DEFINE(ENV_RESET, 0) +fi + +AC_ARG_ENABLE(warnings, +[AS_HELP_STRING([--enable-warnings], [Whether to enable compiler warnings])], +[ case "$enableval" in + yes) ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --enable-warnings: $enableval]) + ;; + esac +]) + +AC_ARG_ENABLE(werror, +[AS_HELP_STRING([--enable-werror], [Whether to enable the -Werror compiler option])], +[ case "$enableval" in + yes) ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --enable-werror: $enableval]) + ;; + esac +]) + +AC_ARG_ENABLE(openssl, +[AS_HELP_STRING([--enable-openssl], [Use OpenSSL's message digest functions instead of sudo's])], +[ case $enableval in + no) ;; + *) LIBMD="-lcrypto" + DIGEST=digest_openssl.lo + AC_DEFINE(HAVE_OPENSSL) + if test "$enableval" != "yes"; then + AX_APPEND_FLAG([-I${enableval}/include], [CPPFLAGS]) + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${enableval}/lib]) + fi + ;; + esac +]) + +AC_ARG_ENABLE(gcrypt, +[AS_HELP_STRING([--enable-gcrypt], [Use GNU crypt's message digest functions instead of sudo's])], +[ case $enableval in + no) ;; + *) LIBMD="-lgcrypt" + DIGEST=digest_gcrypt.lo + AC_DEFINE(HAVE_GCRYPT) + if test "$enableval" != "yes"; then + AX_APPEND_FLAG([-I${enableval}/include], [CPPFLAGS]) + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${enableval}/lib]) + fi + ;; + esac +]) + +AC_ARG_ENABLE(hardening, +[AS_HELP_STRING([--disable-hardening], [Do not use compiler/linker exploit mitigation options])], +[], [enable_hardening=yes]) + +AC_ARG_ENABLE(pie, +[AS_HELP_STRING([--enable-pie], [Build sudo as a position independent executable.])]) + +AC_ARG_ENABLE(asan, +[AS_HELP_STRING([--enable-asan], [Build sudo with address sanitizer support.])]) + +AC_ARG_ENABLE(poll, +[AS_HELP_STRING([--disable-poll], [Use select() instead of poll().])]) + +AC_ARG_ENABLE(admin-flag, +[AS_HELP_STRING([--enable-admin-flag], [Whether to create a Ubuntu-style admin flag file])], +[ case "$enableval" in + yes) AC_DEFINE(USE_ADMIN_FLAG) + ;; + no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --enable-admin-flag: $enableval]) + ;; + esac +]) + +AC_ARG_ENABLE(nls, +[AS_HELP_STRING([--disable-nls], [Disable natural language support using gettext])], +[], [enable_nls=yes]) + +AC_ARG_ENABLE(rpath, +[AS_HELP_STRING([--disable-rpath], [Disable passing of -Rpath to the linker])], +[], [enable_rpath=yes]) + +AC_ARG_ENABLE(static-sudoers, +[AS_HELP_STRING([--enable-static-sudoers], [Build the sudoers policy module as part of the sudo binary instead as a plugin])], +[], [enable_static_sudoers=no]) + +AC_ARG_ENABLE(shared_libutil, +[AS_HELP_STRING([--disable-shared-libutil], [Disable use of the libsudo_util shared library.])], +[], [enable_shared_libutil=yes]) + +AC_ARG_ENABLE(tmpfiles.d, +[AS_HELP_STRING([--enable-tmpfiles.d=DIR], [Set the path to the systemd tmpfiles.d directory.])], +[case $enableval in + yes) TMPFILES_D=/usr/lib/tmpfiles.d + ;; + no) TMPFILES_D= + ;; + *) TMPFILES_D="$enableval" +esac], [ + test -f /usr/lib/tmpfiles.d/systemd.conf && TMPFILES_D=/usr/lib/tmpfiles.d +]) + +AC_ARG_ENABLE(devsearch, +[AS_HELP_STRING([--enable-devsearch=PATH], [The colon-delimited path to search for device nodes when determing the tty name.])], +[case $enableval in + yes) # use default value + ;; + no) AC_MSG_WARN([Ignoring attempt to disable the device search path]) + ;; + *) devsearch="$enableval" + ;; +esac]) +ds="`echo \"$devsearch\"|sed 's@/dev/*\([[^:]]*:*\)@_PATH_DEV \"\1\" @g'`" +SUDO_DEFINE_UNQUOTED(_PATH_SUDO_DEVSEARCH, $ds) + +AC_ARG_WITH(selinux, [AS_HELP_STRING([--with-selinux], [enable SELinux support])], +[case $with_selinux in + yes) SELINUX_USAGE="[[-r role]] [[-t type]] " + AC_DEFINE(HAVE_SELINUX) + SUDO_LIBS="${SUDO_LIBS} -lselinux" + SUDO_OBJS="${SUDO_OBJS} selinux.o" + PROGS="${PROGS} sesh" + SEMAN=1 + AC_CHECK_LIB([selinux], [setkeycreatecon], + [AC_DEFINE(HAVE_SETKEYCREATECON)]) + ;; + no) ;; + *) AC_MSG_ERROR(["--with-selinux does not take an argument."]) + ;; +esac], [with_selinux=no]) + +AC_ARG_ENABLE(sasl, +[AS_HELP_STRING([--enable-sasl], [Enable/disable LDAP SASL support])], +[ case "$enableval" in + yes|no) ;; + *) AC_MSG_WARN([Ignoring unknown argument to --enable-sasl: $enableval]) + ;; + esac +]) + +AC_ARG_ENABLE(timestamp-type, +[AS_HELP_STRING([--timestamp-type=TYPE], [Set the default time stamp record type to global, ppid or tty.])], +[ case "$enableval" in + global|ppid|tty) + timestamp_type=$enableval + ;; + *) AC_MSG_WARN([Ignoring unknown argument to --enable-timestamp-type: $enableval]) + ;; + esac +]) +AC_DEFINE_UNQUOTED(TIMESTAMP_TYPE, $timestamp_type) + +AC_ARG_ENABLE(offensive_insults, +[AS_HELP_STRING([--enable-offensive-insults], [Enable potentially offensive sudo insults.])], +[], [enable_offensive_insults=no]) +if test "$enable_offensive_insults" = "yes"; then + AC_DEFINE(OFFENSIVE_INSULTS) +fi + +AC_ARG_ENABLE(package_build, +[AS_HELP_STRING([--enable-package-build], [Enable options for package building.])], +[], [enable_package_build=no]) + +dnl +dnl gss_krb5_ccache_name() may not work on Heimdal so we don't use it by default +dnl +AC_ARG_ENABLE(gss_krb5_ccache_name, +[AS_HELP_STRING([--enable-gss-krb5-ccache-name], [Use GSS-API to set the Kerberos V cred cache name])], +[check_gss_krb5_ccache_name=$enableval], [check_gss_krb5_ccache_name=no]) + +AC_ARG_ENABLE(pvs-studio, +[AS_HELP_STRING([--enable-pvs-studio], [Create a PVS-Studio.cfg file.])]) + +dnl +dnl C compiler checks +dnl +AC_SEARCH_LIBS([strerror], [cposix]) +AC_PROG_CPP +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +if test X"$AR" = X"false"; then + AC_MSG_ERROR([the "ar" utility is required to build sudo]) +fi + +if test "x$ac_cv_prog_cc_c89" = "xno"; then + AC_MSG_ERROR([Sudo version $PACKAGE_VERSION requires an ANSI C compiler to build.]) +fi + +dnl +dnl If the user specified --disable-static, override them or we'll +dnl be unable to build the executables in the sudoers plugin dir. +dnl +if test "$enable_static" = "no"; then + AC_MSG_WARN([Ignoring --disable-static, sudo does not install static libs]) + enable_static=yes +fi + +dnl +dnl Set host variables and m4 macro dir +dnl +AC_CANONICAL_HOST +AC_CONFIG_MACRO_DIR([m4]) + +dnl +dnl On AIX we need to force libtool to install .so files for the plugins +dnl instead of a .a file that contains the .so. We do this by enabling +dnl runtime linking (where the .so file is installed). This must happen +dnl before the call to LT_INIT +dnl +case "$host_os" in +aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + AX_APPEND_FLAG([-Wl,-brtl], [LDFLAGS]) + ;; +esac + +dnl +dnl Libtool init, we require libtool 2.2.6b or higher +dnl +LT_PREREQ([2.2.6b]) +LT_INIT([dlopen]) + +dnl +dnl Allow the user to specify an alternate libtool. +dnl XXX - should be able to skip LT_INIT if we are using a different libtool +dnl +AC_ARG_WITH(libtool, [AS_HELP_STRING([--with-libtool=PATH], [specify path to libtool])], +[case $with_libtool in + yes|builtin) ;; + no) AC_MSG_ERROR(["--without-libtool not supported."]) + ;; + system) LIBTOOL=libtool + ;; + *) LIBTOOL="$with_libtool" + ;; +esac]) + +dnl +dnl Defer with_noexec until after libtool magic runs +dnl +if test "$enable_shared" = "no"; then + with_noexec=no + enable_dlopen=no + lt_cv_dlopen=none + lt_cv_dlopen_libs= + ac_cv_func_dlopen=no + LT_LDFLAGS=-static +fi +LIBDL="$lt_cv_dlopen_libs" +SHLIB_ENABLE="$enable_dlopen" + +AC_MSG_CHECKING(path to sudo_noexec.so) +AC_ARG_WITH(noexec, [AS_HELP_STRING([--with-noexec[[=PATH]]], [fully qualified pathname of sudo_noexec.so])], +[case $with_noexec in + yes) ;; + no) ;; + *) noexec_file="$with_noexec" + ;; +esac], [with_noexec="$noexec_file"]) +AC_MSG_RESULT($with_noexec) +NOEXECFILE="sudo_noexec.so" +NOEXECDIR="`echo $noexec_file|sed -e 's:^${\([[^}]]*\)}:$(\1):' -e 's:^\(.*\)/[[^/]]*:\1:'`" + +dnl +dnl Find programs we use +dnl +AC_PATH_PROG(UNAMEPROG, [uname], [uname]) +AC_PATH_PROG(TRPROG, [tr], [tr]) +AC_PATH_PROG(MANDOCPROG, [mandoc], [mandoc]) +if test "$MANDOCPROG" != "mandoc"; then + : ${MANTYPE='mdoc'} +else + AC_PATH_PROG(NROFFPROG, [nroff]) + if test -n "$NROFFPROG"; then + test -n "$MANTYPE" && sudo_cv_var_mantype="$MANTYPE" + AC_CACHE_CHECK([which macro set to use for manual pages], + [sudo_cv_var_mantype], + [ + sudo_cv_var_mantype="man" + echo ".Sh NAME" > conftest + echo ".Nm sudo" >> conftest + echo ".Nd sudo" >> conftest + echo ".Sh DESCRIPTION" >> conftest + echo "sudo" >> conftest + if $NROFFPROG -mdoc conftest >/dev/null 2>&1; then + sudo_cv_var_mantype="mdoc" + fi + rm -f conftest + ] + ) + MANTYPE="$sudo_cv_var_mantype" + else + : ${MANTYPE='mdoc'} + fi +fi + +dnl +dnl What kind of beastie are we being run on? +dnl Barf if config.cache was generated on another host. +dnl +if test -n "$sudo_cv_prev_host"; then + if test "$sudo_cv_prev_host" != "$host"; then + AC_MSG_ERROR([config.cache was created on a different host; remove it and re-run configure.]) + else + AC_MSG_CHECKING(previous host type) + AC_CACHE_VAL(sudo_cv_prev_host, sudo_cv_prev_host="$host") + AC_MSG_RESULT([$sudo_cv_prev_host]) + fi +else + # this will produce no output since there is no cached value + AC_CACHE_VAL(sudo_cv_prev_host, sudo_cv_prev_host="$host") +fi + +dnl +dnl We want to be able to differentiate between different rev's +dnl +if test -n "$host_os"; then + OS=`echo $host_os | sed 's/[[0-9]].*//'` + OSREV=`echo $host_os | sed 's/^[[^0-9\.]]*\([[0-9\.]]*\).*$/\1/'` + OSMAJOR=`echo $OSREV | sed 's/\..*$//'` +else + OS="unknown" + OSREV=0 + OSMAJOR=0 +fi + +case "$host" in + *-*-solaris2*) + AC_DEFINE([PAM_SUN_CODEBASE]) + + # LD_PRELOAD is space-delimited + RTLD_PRELOAD_DELIM=" " + + # Solaris-specific initialization + OS_INIT=os_init_solaris + SUDO_OBJS="${SUDO_OBJS} solaris.o" + + # AFS support needs -lucb + if test "$with_AFS" = "yes"; then + AFS_LIBS="-lc -lucb" + fi + : ${mansectsu='1m'} + : ${mansectform='4'} + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + AC_CHECK_FUNCS([priv_set], [PSMAN=1]) + ;; + *-*-aix*) + AC_DEFINE([PAM_SUN_CODEBASE]) + + # To get all prototypes (so we pass -Wall) + AC_DEFINE([_LINUX_SOURCE_COMPAT]) + + # For AIX we build in support for both LAM and PAM + # and choose which to use based on auth_type in + # /etc/security/login.cfg + if test X"${with_pam}${with_aixauth}" = X""; then + AUTH_EXCL_DEF="AIX_AUTH PAM" + fi + + # AIX analog of nsswitch.conf, enabled by default + AC_ARG_WITH(netsvc, [AS_HELP_STRING([--with-netsvc[[=PATH]]], [path to netsvc.conf])], + [case $with_netsvc in + no) ;; + yes) with_netsvc="/etc/netsvc.conf" + ;; + *) ;; + esac]) + if test -z "$with_nsswitch" -a -z "$with_netsvc"; then + with_netsvc="/etc/netsvc.conf" + fi + + # LDR_PRELOAD is only supported in AIX 5.3 and later + case "$OSREV" in + [[1-4]].*) with_noexec=no;; + 5.[[1-2]]*) with_noexec=no;; + *) RTLD_PRELOAD_VAR="LDR_PRELOAD";; + esac + + # strnlen/strndup may be broken on AIX < 6 depending + # on the libc version, use our own. + if test $OSMAJOR -lt 6; then + ac_cv_func_strnlen=no + fi + + # getdelim() may or may not be present on AIX <= 6.1. + # bos610 is missing getdelim but bos61J has it. + if test "$enable_package_build" = "yes"; then + if test $OSMAJOR -le 6; then + ac_cv_func_getdelim=no + fi + fi + + # memset_s() may or may ont be present on AIX <= 7.1. + # bos710 is missing memset_s but bos71L has it. + if test "$enable_package_build" = "yes"; then + if test $OSMAJOR -le 7; then + ac_cv_func_memset_s=no + fi + fi + + # Remove timedir on boot, AIX does not have /var/run + INIT_SCRIPT=aix.sh + INIT_DIR=/etc/rc.d/init.d + RC_LINK=/etc/rc.d/rc2.d/S90sudo + + # AIX-specific functions + AC_CHECK_FUNCS([getuserattr setrlimit64]) + AC_CHECK_FUNCS([setauthdb], + [AC_CHECK_TYPES([authdb_t], [], [], [#include ])]) + + COMMON_OBJS="${COMMON_OBJS} aix.lo" + SUDO_APPEND_COMPAT_EXP(aix_prep_user_v1 aix_restoreauthdb_v1 aix_setauthdb_v1 aix_setauthdb_v2 aix_getauthregistry_v1) + + # These prototypes may be missing + AC_CHECK_DECLS([usrinfo], [], [], [ +#include +#include + ]) + AC_CHECK_DECLS([setauthdb], [], [], [ +#include +#include + ]) + ;; + *-*-hiuxmpp*) + AC_DEFINE([PAM_SUN_CODEBASE]) + + : ${mansectsu='1m'} + : ${mansectform='4'} + + # HP-UX does not clear /var/run so we need to do it + INIT_SCRIPT=hpux.sh + INIT_DIR=/sbin/init.d + RC_LINK=/sbin/rc2.d/S900sudo + + # HP-UX shared libs must be executable. + # Load time is much greater if writable so use 0555. + SHLIB_MODE=0555 + + # HP-UX won't unlink a shared lib that is open + INSTALL_BACKUP='~' + + AC_CHECK_FUNCS([pstat_getproc gethrtime]) + ;; + *-*-hpux*) + AC_DEFINE([PAM_SUN_CODEBASE]) + + # AFS support needs -lBSD + if test "$with_AFS" = "yes"; then + AFS_LIBS="-lc -lBSD" + fi + : ${mansectsu='1m'} + : ${mansectform='4'} + + # HP-UX does not clear /var/run so we need to do it + INIT_SCRIPT=hpux.sh + INIT_DIR=/sbin/init.d + RC_LINK=/sbin/rc2.d/S900sudo + + # HP-UX shared libs must be executable. + # Load time is much greater if writable so use 0555. + SHLIB_MODE=0555 + + # HP-UX won't unlink a shared lib that is open + INSTALL_BACKUP='~' + + # The HP bundled compiler cannot generate shared libs + if test -z "$GCC"; then + AC_CACHE_CHECK([for HP bundled C compiler], + [sudo_cv_var_hpccbundled], + [if $CC -V 2>&1 | grep '^(Bundled)' >/dev/null 2>&1; then + sudo_cv_var_hpccbundled=yes + else + sudo_cv_var_hpccbundled=no + fi] + ) + if test "$sudo_cv_var_hpccbundled" = "yes"; then + AC_MSG_ERROR([The HP bundled C compiler is unable to build Sudo, you must use gcc or the HP ANSI C compiler instead.]) + fi + fi + + # Build PA-RISC1.1 objects for better portability + case "$host_cpu" in + hppa[[2-9]]*) + _CFLAGS="$CFLAGS" + if test -n "$GCC"; then + portable_flag="-march=1.1" + else + portable_flag="+DAportable" + fi + CFLAGS="$CFLAGS $portable_flag" + AC_CACHE_CHECK([whether $CC understands $portable_flag], + [sudo_cv_var_daportable], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [sudo_cv_var_daportable=yes], + [sudo_cv_var_daportable=no] + ) + ] + ) + if test X"$sudo_cv_var_daportable" != X"yes"; then + CFLAGS="$_CFLAGS" + fi + ;; + esac + + case "$host_os" in + hpux10.*) + shadow_funcs="getprpwnam iscomsec" + shadow_libs="-lsec" + # HP-UX 10.x doesn't support LD_PRELOAD + with_noexec=no + ;; + *) + shadow_funcs="getspnam iscomsec" + shadow_libs="-lsec" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + ;; + esac + AC_CHECK_FUNCS([pstat_getproc gethrtime]) + ;; + *-dec-osf*) + # ignore envariables wrt dynamic lib path + AX_APPEND_FLAG([-Wl,-no_library_replacement], [SUDO_LDFLAGS]) + + : ${CHECKSIA='true'} + AC_MSG_CHECKING(whether to disable sia support on Digital UNIX) + AC_ARG_ENABLE(sia, + [AS_HELP_STRING([--disable-sia], [Disable SIA on Digital UNIX])], + [ case "$enableval" in + yes) AC_MSG_RESULT(no) + CHECKSIA=true + ;; + no) AC_MSG_RESULT(yes) + CHECKSIA=false + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-sia: $enableval]) + ;; + esac + ], AC_MSG_RESULT(no)) + + shadow_funcs="getprpwnam dispcrypt" + # OSF/1 4.x and higher need -ldb too + if test $OSMAJOR -lt 4; then + shadow_libs="-lsecurity -laud -lm" + else + shadow_libs="-lsecurity -ldb -laud -lm" + fi + + # use SIA by default, if we have it + test "$CHECKSIA" = "true" && AUTH_EXCL_DEF="SIA" + + # + # Some versions of Digital Unix ship with a broken + # copy of prot.h, which we need for shadow passwords. + # XXX - make should remove this as part of distclean + # + AC_MSG_CHECKING([for broken prot.h]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +#include + ]], [[exit(0);]])], [AC_MSG_RESULT(no)], [AC_MSG_RESULT([yes, fixing locally]) + sed 's:::g' < /usr/include/prot.h > prot.h + ]) + # ":DEFAULT" must be appended to _RLD_LIST + RTLD_PRELOAD_VAR="_RLD_LIST" + RTLD_PRELOAD_DEFAULT="DEFAULT" + : ${mansectsu='8'} + : ${mansectform='4'} + ;; + *-*-irix*) + AC_DEFINE([_BSD_TYPES]) + if test "$prefix" = "/usr/local" -a "$mandir" = '${datarootdir}/man'; then + if test -d "/usr/share/man/local"; then + mandir="/usr/share/man/local" + else + mandir="/usr/man/local" + fi + fi + # IRIX <= 4 needs -lsun + if test "$OSMAJOR" -le 4; then + AC_CHECK_LIB(sun, getpwnam, [LIBS="${LIBS} -lsun"]) + fi + # ":DEFAULT" must be appended to _RLD_LIST + RTLD_PRELOAD_VAR="_RLD_LIST" + RTLD_PRELOAD_DEFAULT="DEFAULT" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-linux*|*-*-k*bsd*-gnu) + shadow_funcs="getspnam" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + # Check for SECCOMP_SET_MODE_FILTER in linux/seccomp.h + AC_CHECK_DECLS([SECCOMP_SET_MODE_FILTER], [], [], [ +#include +#include +#include +#include +#include + ]) + # We call getrandom via syscall(3) in case it is not in libc + AC_CHECK_HEADERS([linux/random.h]) + ;; + *-*-gnu*) + # lockf() is broken on the Hurd + ac_cv_func_lockf=no + ;; + *-*-riscos*) + LIBS="${LIBS} -lsun -lbsd" + AX_APPEND_FLAG([-I/usr/include], [CPPFLAGS]) + AX_APPEND_FLAG([-I/usr/include/bsd], [CPPFLAGS]) + AX_APPEND_FLAG([-D_MIPS], [CPPFLAGS]) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-isc*) + AX_APPEND_FLAG([-D_ISC], [CPPFLAGS]) + LIB_CRYPT=1 + SUDOERS_LIBS="${SUDOERS_LIBS} -lcrypt" + + shadow_funcs="getspnam" + shadow_libs="-lsec" + + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-sco*|*-sco-*) + shadow_funcs="getprpwnam" + shadow_libs="-lprot -lx" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + m88k-motorola-sysv*) + # motorolla's cc (a variant of gcc) does -O but not -O2 + CFLAGS=`echo $CFLAGS | sed 's/-O2/-O/g'` + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-sequent-sysv*) + shadow_funcs="getspnam" + shadow_libs="-lsec" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-ncr-sysv4*|*-ncr-sysvr4*) + AC_CHECK_LIB(c89, strcasecmp, [LIBS="${LIBS} -lc89"]) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-ccur-sysv4*|*-ccur-sysvr4*) + LIBS="${LIBS} -lgen" + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-bsdi*) + SKIP_SETREUID=yes + # Check for newer BSD auth API + if test -z "$with_bsdauth"; then + AC_CHECK_FUNCS([auth_challenge], [AUTH_EXCL_DEF="BSD_AUTH"]) + fi + ;; + *-*-freebsd*) + AC_DEFINE([_BSD_SOURCE]) + + # FreeBSD has a real setreuid(2) starting with 2.1 and + # backported to 2.0.5. We just take 2.1 and above... + case "$OSREV" in + 0.*|1.*|2.0*) + SKIP_SETREUID=yes + ;; + esac + if test "${with_skey-'no'}" = "yes"; then + SUDOERS_LIBS="${SUDOERS_LIBS} -lmd" + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='maybe'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*openbsd*) + AC_DEFINE([_BSD_SOURCE]) + + # OpenBSD-specific initialization + OS_INIT=os_init_openbsd + SUDO_OBJS="${SUDO_OBJS} openbsd.o" + + # OpenBSD has a real setreuid(2) starting with 3.3 but + # we will use setresuid(2) instead. + SKIP_SETREUID=yes + + # OpenBSD >= 3.0 supports BSD auth + if test -z "$with_bsdauth"; then + if test "$OSMAJOR" -ge 3; then + AUTH_EXCL_DEF="BSD_AUTH" + fi + fi + : ${with_logincap='maybe'} + + # Newer OpenBSD only fills in pw_password for getpwnam_shadow() + shadow_funcs="getpwnam_shadow" + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*netbsd*) + # NetBSD has a real setreuid(2) starting with 1.3.2 + case "$OSREV" in + 0.9*|1.[[012]]*|1.3|1.3.1) + SKIP_SETREUID=yes + ;; + esac + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='maybe'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-dragonfly*) + AC_DEFINE([_BSD_SOURCE]) + + if test "${with_skey-'no'}" = "yes"; then + SUDOERS_LIBS="${SUDOERS_LIBS} -lmd" + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='yes'} + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-*bsd*) + CHECKSHADOW="false" + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-darwin*) + # Darwin has a real setreuid(2) starting with 9.0 + if test $OSMAJOR -lt 9; then + SKIP_SETREUID=yes + fi + CHECKSHADOW="false" + test -z "$with_pam" && AUTH_EXCL_DEF="PAM" + : ${with_logincap='yes'} + # Darwin has a broken poll() + : ${enable_poll='no'} + # Darwin 8 and above can interpose library symbols cleanly + if test $OSMAJOR -ge 8; then + AC_DEFINE(HAVE___INTERPOSE) + dlyld_interpose=yes + else + RTLD_PRELOAD_ENABLE_VAR="DYLD_FORCE_FLAT_NAMESPACE" + fi + RTLD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES" + + # Mach monotonic timer that runs while sleeping + AC_CHECK_FUNCS([mach_continuous_time]) + + # Undocumented API that dynamically allocates the groups. + AC_CHECK_FUNCS([getgrouplist_2], [AC_CHECK_DECLS([getgrouplist_2])]) + + # We need to force a flat namespace to make libc + # symbol hooking work like it does on ELF. + AX_CHECK_LINK_FLAG([-Wl,-force_flat_namespace], [AX_APPEND_FLAG([-Wl,-force_flat_namespace], [SUDO_LDFLAGS])]) + + # Examples go in share/examples/sudo + if test X"$with_exampledir" = X""; then + exampledir='$(datarootdir)/examples/$(PACKAGE_TARNAME)' + fi + ;; + *-*-nextstep*) + # lockf() is broken on the NeXT + ac_cv_func_lockf=no + RTLD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES" + RTLD_PRELOAD_ENABLE_VAR="DYLD_FORCE_FLAT_NAMESPACE" + ;; + *-*-*sysv4*) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; + *-*-sysv*) + : ${mansectsu='1m'} + : ${mansectform='4'} + ;; +esac + +if test X"$enable_pvs_studio" = X"yes"; then + # Determine preprocessor type + case "$CC" in + *clang*) preprocessor=clang;; + *gcc*) preprocessor=gcc;; + *) + case `$CC --version 2>&1` in + *clang*) preprocessor=clang;; + *gcc*) preprocessor=gcc;; + *) AC_MSG_ERROR([Compiler must be gcc or clang for PVS-Studio.]);; + esac + ;; + esac + + # Determine platform (currently linux or macos) + case "$host" in + x86_64-*-linux*) pvs_platform=linux64;; + *86-*-linux*) pvs_platform=linux32;; + darwin*) pvs_platform=macos;; + *) AC_MSG_ERROR([PVS-Studio does not support $host_os.]);; + esac + + # create basic PVS-Studio.cfg file + cat > PVS-Studio.cfg <<-EOF + preprocessor = $preprocessor + platform = $pvs_platform + analysis-mode = 4 + language = C +EOF +fi + +dnl +dnl Library preloading to support NOEXEC +dnl +if test X"$with_noexec" != X"no"; then + SUDO_DEFINE_UNQUOTED(RTLD_PRELOAD_VAR, "$RTLD_PRELOAD_VAR") + SUDO_DEFINE_UNQUOTED(RTLD_PRELOAD_DELIM, "$RTLD_PRELOAD_DELIM") + if test -n "$RTLD_PRELOAD_DEFAULT"; then + SUDO_DEFINE_UNQUOTED(RTLD_PRELOAD_DEFAULT, "$RTLD_PRELOAD_DEFAULT") + fi + if test -n "$RTLD_PRELOAD_ENABLE_VAR"; then + SUDO_DEFINE_UNQUOTED(RTLD_PRELOAD_ENABLE_VAR, "$RTLD_PRELOAD_ENABLE_VAR") + fi +fi + +dnl +dnl Check for mixing mutually exclusive and regular auth methods +dnl +AUTH_REG=${AUTH_REG# } +AUTH_EXCL=${AUTH_EXCL# } +if test -n "$AUTH_EXCL"; then + if test -n "$AUTH_REG"; then + AC_MSG_ERROR([Cannot mix mutually exclusive ($AUTH_EXCL) and regular ($AUTH_REG) authentication methods]) + fi +fi +dnl +dnl Only one of S/Key and OPIE may be specified +dnl +if test X"${with_skey}${with_opie}" = X"yesyes"; then + AC_MSG_ERROR(["cannot use both S/Key and OPIE"]) +fi + +dnl +dnl Use BSD-style man sections by default +dnl +: ${mansectsu='8'} +: ${mansectform='5'} + +dnl +dnl Add in any libpaths or libraries specified via configure +dnl +if test -n "$with_libpath"; then + for i in ${with_libpath}; do + SUDO_APPEND_LIBPATH(LDFLAGS, [$i]) + done +fi +if test -n "$with_libraries"; then + for i in ${with_libraries}; do + case $i in + -l*) ;; + *.a) ;; + *.o) ;; + *) i="-l${i}";; + esac + LIBS="${LIBS} ${i}" + done +fi + +dnl +dnl C compiler checks (to be done after os checks) +dnl +AC_PROG_CC_STDC +AC_C_CONST +AC_C_INLINE +AC_C_VOLATILE +AC_MSG_CHECKING([for variadic macro support in cpp]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +AC_INCLUDES_DEFAULT +#if defined(__GNUC__) && __GNUC__ == 2 +# define sudo_fprintf(fp, fmt...) fprintf((fp), (fmt)) +#else +# define sudo_fprintf(fp, ...) fprintf((fp), __VA_ARGS__) +#endif +], [sudo_fprintf(stderr, "a %s", "test");])], [AC_MSG_RESULT([yes])], +[AC_MSG_RESULT([no]) + AC_DEFINE([NO_VARIADIC_MACROS], [1], [Define if your C preprocessor does not support variadic macros.]) + AC_MSG_WARN([Your C preprocessor doesn't support variadic macros, debugging support will be limited]) + SUDO_APPEND_COMPAT_EXP(sudo_debug_printf_nvm_v1) +]) + +dnl +dnl Program checks +dnl +AC_PROG_AWK +AC_PROG_YACC +AC_PATH_PROG([FLEX], [flex], [flex]) +SUDO_PROG_MV +SUDO_PROG_BSHELL +if test -z "$with_sendmail"; then + SUDO_PROG_SENDMAIL +fi +SUDO_PROG_VI +dnl +dnl Check for authpriv support in syslog +dnl +AC_MSG_CHECKING(which syslog facility sudo should log with) +if test X"$with_logfac" = X""; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = LOG_AUTHPRIV; (void)i;]])], [logfac=authpriv]) +fi +AC_DEFINE_UNQUOTED(LOGFAC, "$logfac", [The syslog facility sudo will use.]) +AC_MSG_RESULT($logfac) +dnl +dnl Header file checks +dnl +AC_HEADER_DIRENT +AC_HEADER_STDBOOL +AC_HEADER_MAJOR +AC_CHECK_HEADERS_ONCE([netgroup.h paths.h spawn.h wordexp.h sys/sockio.h sys/bsdtypes.h sys/select.h sys/stropts.h sys/sysmacros.h sys/syscall.h sys/statvfs.h]) +AC_CHECK_HEADERS([utmps.h] [utmpx.h], [break]) +AC_CHECK_HEADERS([endian.h] [sys/endian.h] [machine/endian.h], [break]) +AC_CHECK_HEADERS([procfs.h] [sys/procfs.h], [AC_CHECK_MEMBERS(struct psinfo.pr_ttydev, [AC_CHECK_FUNCS([_ttyname_dev])], [], [AC_INCLUDES_DEFAULT +#ifdef HAVE_PROCFS_H +#include +#endif +#ifdef HAVE_SYS_PROCFS_H +#include +#endif +])] +break) +# +# Check for large file support. +# +AC_SYS_LARGEFILE +# +# HP-UX may need to define _XOPEN_SOURCE_EXTENDED to expose MSG_WAITALL. +# Also, HP-UX 11.23 has a broken sys/types.h when large files support +# is enabled and _XOPEN_SOURCE_EXTENDED is not also defined. +# The following test will define _XOPEN_SOURCE_EXTENDED in either case. +# +case "$host_os" in + hpux*) + AC_CACHE_CHECK([whether sys/socket.h needs _XOPEN_SOURCE_EXTENDED for MSG_WAITALL], [sudo_cv_xopen_source_extended], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT +# include ], [int a = MSG_WAITALL; return a;])], + [sudo_cv_xopen_source_extended=no], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#define _XOPEN_SOURCE_EXTENDED + AC_INCLUDES_DEFAULT +# include +# include ], [int a = MSG_WAITALL; return a;])], + [sudo_cv_xopen_source_extended=yes], + [sudo_cv_xopen_source_extended=error]) + ])]) + if test "$sudo_cv_xopen_source_extended" = "yes"; then + AC_DEFINE([_XOPEN_SOURCE_EXTENDED]) + fi + ;; +esac +AC_SYS_POSIX_TERMIOS +if test "$ac_cv_sys_posix_termios" != "yes"; then + AC_MSG_ERROR([Must have POSIX termios to build sudo]) +fi +SUDO_MAILDIR +if test ${with_logincap-'no'} != "no"; then + AC_CHECK_HEADERS([login_cap.h], [LOGINCAP_USAGE='[[-c class]] '; LCMAN=1 + case "$OS" in + freebsd|netbsd) + SUDO_LIBS="${SUDO_LIBS} -lutil" + SUDOERS_LIBS="${SUDOERS_LIBS} -lutil" + ;; + esac + ]) +fi +if test ${with_project-'no'} != "no"; then + AC_CHECK_HEADER(project.h, [ + AC_CHECK_LIB(project, setproject, [ + AC_DEFINE(HAVE_PROJECT_H) + SUDO_LIBS="${SUDO_LIBS} -lproject" + ]) + ], []) +fi +dnl +dnl typedef checks +dnl We need to define __STDC_WANT_LIB_EXT1__ for errno_t and rsize_t +dnl +AC_DEFINE([__STDC_WANT_LIB_EXT1__]) +AC_TYPE_MODE_T +AC_TYPE_UID_T +AC_CHECK_TYPE([clockid_t], [], [AC_DEFINE(clockid_t, int)], [#include +#include ]) +AC_CHECK_TYPE([sig_atomic_t], [], [AC_DEFINE(sig_atomic_t, int)], [#include +#include ]) +AC_CHECK_TYPES([struct in6_addr], [], [], [#include +#include ]) +AC_TYPE_LONG_LONG_INT +if test X"$ac_cv_type_long_long_int" != X"yes"; then + AC_MSG_ERROR(["C compiler does not appear to support the long long int type"]) +fi +AC_CHECK_TYPE(intmax_t, long long) +AC_CHECK_TYPE(uintmax_t, unsigned long long) +AC_CHECK_TYPE(uint8_t, unsigned char) +AC_CHECK_TYPE(uint32_t, unsigned int) +AC_CHECK_TYPE(uint64_t, unsigned long long) +AC_CHECK_TYPE(socklen_t, [], [AC_DEFINE(socklen_t, unsigned int)], [ +AC_INCLUDES_DEFAULT +#include ]) +AC_CHECK_TYPE(rsize_t, size_t) +AC_CHECK_TYPE(errno_t, int) +SUDO_UID_T_LEN +SUDO_SOCK_SA_LEN +SUDO_SOCK_SIN_LEN +AC_CHECK_SIZEOF([id_t]) +AC_CHECK_SIZEOF([long long]) +AC_CHECK_SIZEOF([time_t]) +if test $ac_cv_header_utmps_h = "yes"; then + SUDO_CHECK_UTMP_MEMBERS([utmps]) +elif test $ac_cv_header_utmpx_h = "yes"; then + SUDO_CHECK_UTMP_MEMBERS([utmpx]) +else + SUDO_CHECK_UTMP_MEMBERS([utmp]) +fi + +dnl +dnl Function checks +dnl +AC_FUNC_GETGROUPS +AC_CHECK_FUNCS_ONCE([fexecve killpg nl_langinfo pread pwrite openat faccessat wordexp getauxval]) +case "$host_os" in + hpux*) + if test X"$ac_cv_func_pread" = X"yes"; then + O_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + AC_CHECK_FUNCS([pread64 pwrite64], [ + AC_DEFINE([_LARGEFILE64_SOURCE], [1], [Define to 1 to enable 64-bit versions of standard C functions on 32-bit systems.]) + ]) + CPPFLAGS="$O_CPPFLAGS" + fi + ;; +esac +AC_CHECK_FUNCS([getgrouplist], [], [ + case "$host_os" in + aix*) + AC_CHECK_FUNCS([getgrset]) + ;; + *) + AC_CHECK_FUNC([nss_search], [ + AC_CHECK_FUNC([_nss_XbyY_buf_alloc], [ + # Solaris + AC_CHECK_FUNC([_nss_initf_group], [ + AC_CHECK_HEADERS([nss_dbdefs.h]) + AC_DEFINE([HAVE_NSS_SEARCH]) + AC_DEFINE([HAVE__NSS_XBYY_BUF_ALLOC]) + AC_DEFINE([HAVE__NSS_INITF_GROUP]) + ], [ + AC_CHECK_HEADERS([nss_dbdefs.h], [ + # Older Solaris does not export _nss_initf_group + # but we can use our own. + AC_DEFINE([HAVE_NSS_SEARCH]) + AC_DEFINE([HAVE__NSS_XBYY_BUF_ALLOC]) + ]) + ]) + ], [ + # HP-UX + AC_CHECK_FUNC([__nss_XbyY_buf_alloc], [ + AC_CHECK_FUNC([__nss_initf_group], [ + AC_CHECK_HEADERS([nss_dbdefs.h]) + AC_DEFINE([HAVE_NSS_SEARCH]) + AC_DEFINE([HAVE___NSS_XBYY_BUF_ALLOC]) + AC_DEFINE([HAVE___NSS_INITF_GROUP]) + ]) + ]) + ]) + ]) + ;; + esac + SUDO_APPEND_COMPAT_EXP(sudo_getgrouplist) +]) +AC_CHECK_FUNCS([getdelim], [], [ + AC_LIBOBJ(getdelim) + SUDO_APPEND_COMPAT_EXP(sudo_getdelim) + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }getdelim_test" +]) +AC_CHECK_FUNCS([getusershell], [], [ + AC_LIBOBJ(getusershell) + SUDO_APPEND_COMPAT_EXP(sudo_getusershell) +]) +AC_CHECK_FUNCS([reallocarray], [], [ + AC_LIBOBJ(reallocarray) + SUDO_APPEND_COMPAT_EXP(sudo_reallocarray) +]) +AC_CHECK_FUNCS([arc4random_uniform], [], [ + AC_LIBOBJ(arc4random_uniform) + SUDO_APPEND_COMPAT_EXP(sudo_arc4random_uniform) + AC_CHECK_FUNCS([arc4random], [], [ + AC_LIBOBJ(arc4random) + SUDO_APPEND_COMPAT_EXP(sudo_arc4random) + # arc4random.c needs getentropy() + AC_CHECK_FUNCS([getentropy], [ + AC_CHECK_HEADERS([sys/random.h]) + ], [ + AC_LIBOBJ(getentropy) + SUDO_APPEND_COMPAT_EXP(sudo_getentropy) + ]) + # arc4random.c wants pthread_atfork + AC_CHECK_HEADERS([pthread.h], [ + AC_CHECK_LIB(pthread, main, [LIBPTHREAD="-lpthread"]) + AC_CHECK_FUNCS([pthread_atfork]) + ]) + ]) +]) + +utmp_style=LEGACY +AC_CHECK_FUNCS([getutsid getutxid getutid], [utmp_style=POSIX; break]) +if test "$utmp_style" = "LEGACY"; then + AC_CHECK_FUNCS([getttyent ttyslot], [break]) + AC_CHECK_FUNCS([fseeko]) +fi + +AC_CHECK_FUNCS([sysctl], [AC_CHECK_FUNCS([devname]) + AC_CHECK_MEMBER([struct kinfo_proc.ki_structsize], [AC_DEFINE(HAVE_KINFO_PROC_FREEBSD)], [ + AC_CHECK_MEMBER([struct kinfo_proc2.p_paddr], [AC_DEFINE(HAVE_KINFO_PROC2_NETBSD)], [ + AC_CHECK_MEMBER([struct kinfo_proc.p_paddr], [AC_DEFINE(HAVE_KINFO_PROC_OPENBSD)], [ + AC_CHECK_MEMBER([struct kinfo_proc.kp_proc], [AC_DEFINE(HAVE_KINFO_PROC_44BSD)], [], [ +# include +# include + ]) + ], [ +# include +# include + ]) + ], + [ +# include +# include + ]) + ], + [ +# include +# include +# include + ]) +]) + +AC_CHECK_FUNCS([openpty], [AC_CHECK_HEADERS([libutil.h util.h pty.h], [break])], [ + AC_CHECK_LIB(util, openpty, [ + AC_CHECK_HEADERS([libutil.h util.h pty.h], [break]) + case "$SUDO_LIBS" in + *-lutil*) ;; + *) SUDO_LIBS="${SUDO_LIBS} -lutil";; + esac + AC_DEFINE(HAVE_OPENPTY) + ], [ + AC_CHECK_FUNCS([_getpty], [], [ + AC_CHECK_FUNCS([grantpt], [ + AC_CHECK_FUNCS([posix_openpt]) + ], [ + AC_CHECK_FUNCS([revoke]) + ]) + ]) + ]) +]) +AC_CHECK_FUNCS([unsetenv], [SUDO_FUNC_UNSETENV_VOID], []) +SUDO_FUNC_PUTENV_CONST +if test -z "$SKIP_SETRESUID"; then + AC_CHECK_FUNCS([setresuid], [ + SKIP_SETREUID=yes + AC_CHECK_DECLS([setresuid]) + AC_CHECK_FUNCS([getresuid], [AC_CHECK_DECLS([getresuid])]) + ]) +fi +if test -z "$SKIP_SETREUID"; then + AC_CHECK_FUNCS([setreuid]) +fi +AC_CHECK_FUNCS_ONCE([seteuid]) +if test X"$with_interfaces" != X"no"; then + AC_CHECK_FUNCS([getifaddrs], [AC_CHECK_FUNCS([freeifaddrs])]) +fi +AC_CHECK_FUNCS([lockf], [break]) +AC_CHECK_FUNCS([innetgr], [ + AC_CHECK_DECLS([innetgr], [], [], [ +AC_INCLUDES_DEFAULT +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ +])], [ + AC_CHECK_FUNCS([_innetgr], [ + AC_CHECK_DECLS([_innetgr], [], [], [ +AC_INCLUDES_DEFAULT +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ + ]) + ]) +]) +AC_CHECK_FUNCS([getdomainname], [ + AC_CHECK_DECLS([getdomainname], [], [], [ +AC_INCLUDES_DEFAULT +#include + ]) +], [ + AC_CHECK_FUNCS([sysinfo], [AC_CHECK_HEADERS([sys/systeminfo.h])]) +]) +AC_CHECK_FUNCS([utimensat], [], [ + AC_LIBOBJ(utimens) + SUDO_APPEND_COMPAT_EXP(sudo_utimensat) + AC_CHECK_FUNCS([utimes]) +]) +AC_CHECK_FUNCS([futimens], [], [ + AC_LIBOBJ(utimens) + SUDO_APPEND_COMPAT_EXP(sudo_futimens) + AC_CHECK_FUNCS([futimes futimesat futime], [break]) +]) +SUDO_FUNC_FNMATCH([AC_DEFINE(HAVE_FNMATCH)], [ + AC_LIBOBJ(fnmatch) + SUDO_APPEND_COMPAT_EXP(sudo_fnmatch) + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }fnm_test" +]) +SUDO_FUNC_ISBLANK +AC_CHECK_FUNCS([glob], [], [ + AC_LIBOBJ(glob) + SUDO_APPEND_COMPAT_EXP(sudo_glob sudo_globfree) +]) +AC_CHECK_FUNCS([memrchr], [], [ + AC_LIBOBJ(memrchr) + SUDO_APPEND_COMPAT_EXP(sudo_memrchr) +]) +AC_CHECK_FUNCS([memset_s], [], [ + AC_LIBOBJ(memset_s) + SUDO_APPEND_COMPAT_EXP(sudo_memset_s) +]) +AC_CHECK_FUNCS(nanosleep, [], [ + # On Solaris, nanosleep is in librt + AC_CHECK_LIB(rt, nanosleep, [ + AC_DEFINE(HAVE_NANOSLEEP) + LIBRT="-lrt" + ], [ + AC_LIBOBJ(nanosleep) + SUDO_APPEND_COMPAT_EXP(sudo_nanosleep) + ]) +]) +AC_CHECK_FUNCS([pipe2], [], [ + AC_LIBOBJ(pipe2) + SUDO_APPEND_COMPAT_EXP(sudo_pipe2) +]) +AC_CHECK_FUNCS([pw_dup], [], [ + AC_LIBOBJ(pw_dup) + SUDO_APPEND_COMPAT_EXP(sudo_pw_dup) +]) +AC_CHECK_FUNCS([strlcpy], [], [ + AC_LIBOBJ(strlcpy) + SUDO_APPEND_COMPAT_EXP(sudo_strlcpy) +]) +AC_CHECK_FUNCS([strlcat], [], [ + AC_LIBOBJ(strlcat) + SUDO_APPEND_COMPAT_EXP(sudo_strlcat) +]) +AC_CHECK_FUNC([strnlen], [AC_FUNC_STRNLEN], [AC_LIBOBJ(strnlen)]) +if test X"$ac_cv_func_strnlen_working" = X"yes"; then + AC_DEFINE(HAVE_STRNLEN) + AC_CHECK_FUNCS([strndup], [], [ + AC_LIBOBJ(strndup) + SUDO_APPEND_COMPAT_EXP(sudo_strndup) + ]) +else + # Broken or missing strnlen, use our own. + SUDO_APPEND_COMPAT_EXP(sudo_strnlen) + # Avoid libc strndup() since it is usually implemented using strnlen() + AC_LIBOBJ(strndup) + SUDO_APPEND_COMPAT_EXP(sudo_strndup) +fi +AC_CHECK_FUNCS([clock_gettime], [], [ + # On Solaris, clock_gettime is in librt + AC_CHECK_LIB(rt, clock_gettime, [ + AC_DEFINE(HAVE_CLOCK_GETTIME) + LIBRT="-lrt" + ]) +]) +AC_CHECK_FUNCS([getopt_long], [], [ + AC_LIBOBJ(getopt_long) + SUDO_APPEND_COMPAT_EXP(sudo_getopt_long sudo_getopt_long_only) + AC_MSG_CHECKING([for optreset]) + AC_CACHE_VAL(sudo_cv_optreset, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[extern int optreset; optreset = 1; return optreset;]])], [sudo_cv_optreset=yes], [sudo_cv_optreset=no])]) + if test "$sudo_cv_optreset" = "yes"; then + AC_DEFINE(HAVE_OPTRESET) + fi + AC_MSG_RESULT($sudo_cv_optreset) +]) +AC_CHECK_FUNCS([closefrom], [], [AC_LIBOBJ(closefrom) + SUDO_APPEND_COMPAT_EXP(closefrom_fallback sudo_closefrom) + AC_CHECK_DECL(F_CLOSEM, AC_DEFINE(HAVE_FCNTL_CLOSEM), [], [ +# include +# include ]) +]) +AC_CHECK_FUNCS([mkstemps mkdtemp], [], [break]) +if test X"$ac_cv_func_mkstemps$ac_cv_func_mkdtemp" != X"yesyes"; then + AC_CHECK_FUNCS([arc4random random lrand48], [break]) + if test X"$ac_cv_func_arc4random" != X"yes"; then + AC_CHECK_FUNCS([getentropy]) + fi + AC_LIBOBJ(mktemp) + # If either mkdtemp() or mkstemps() is missing, replace both. + SUDO_APPEND_COMPAT_EXP(sudo_mkdtemp sudo_mkstemps) + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }mktemp_test" +fi +AX_FUNC_SNPRINTF +if test X"$ac_cv_have_working_snprintf$ac_cv_have_working_vsnprintf" = X"yesyes"; then + # System has a C99-compliant v?snprintf(), check for v?asprintf() + AC_CHECK_FUNCS([asprintf], [], [ + AC_LIBOBJ(snprintf) + SUDO_APPEND_COMPAT_EXP(sudo_asprintf) + ]) + AC_CHECK_FUNCS([vasprintf], [], [ + AC_LIBOBJ(snprintf) + SUDO_APPEND_COMPAT_EXP(sudo_vasprintf) + ]) +else + # Missing or non-compliant v?snprintf(), assume missing/bad v?asprintf() + SUDO_APPEND_COMPAT_EXP(sudo_snprintf sudo_vsnprintf sudo_asprintf sudo_vasprintf) +fi +AC_CHECK_MEMBERS([struct tm.tm_gmtoff], [], [], [ +AC_INCLUDES_DEFAULT +#include +]) +AC_CHECK_MEMBER([struct stat.st_mtim], + [AC_DEFINE(HAVE_ST_MTIM)] + [AC_CHECK_MEMBER([struct stat.st_mtim.st__tim], AC_DEFINE(HAVE_ST__TIM))], + [AC_CHECK_MEMBER([struct stat.st_mtimespec], + [AC_DEFINE([HAVE_ST_MTIMESPEC])], + [AC_CHECK_MEMBER([struct stat.st_nmtime], AC_DEFINE(HAVE_ST_NMTIME))]) + ] +) +# Look for sha2 functions if not using openssl +if test "$DIGEST" = "digest.lo"; then + FOUND_SHA2=no + AC_CHECK_HEADER([sha2.h], [ + FOUND_SHA2=yes + AC_CHECK_FUNCS([SHA224Update], [SUDO_FUNC_SHA2_VOID_PTR], [ + # On some systems, SHA224Update is in libmd + AC_CHECK_LIB(md, SHA224Update, [ + AC_DEFINE(HAVE_SHA224UPDATE) + SUDO_FUNC_SHA2_VOID_PTR + LIBMD="-lmd" + ], [ + # Does not have SHA224Update + FOUND_SHA2=no + ]) + ]) + ]) + if test X"$FOUND_SHA2" = X"no"; then + AC_LIBOBJ(sha2) + SUDO_APPEND_COMPAT_EXP(sudo_SHA224Final sudo_SHA224Init sudo_SHA224Pad sudo_SHA224Transform sudo_SHA224Update sudo_SHA256Final sudo_SHA256Init sudo_SHA256Pad sudo_SHA256Transform sudo_SHA256Update sudo_SHA384Final sudo_SHA384Init sudo_SHA384Pad sudo_SHA384Transform sudo_SHA384Update sudo_SHA512Final sudo_SHA512Init sudo_SHA512Pad sudo_SHA512Transform sudo_SHA512Update) + fi +fi +AC_CHECK_FUNCS([vsyslog], [], [ + AC_LIBOBJ(vsyslog) + SUDO_APPEND_COMPAT_EXP(sudo_vsyslog) + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }vsyslog_test" +]) +dnl +dnl 4.4BSD-based systems can force the password or group file to be held open +dnl +AC_CHECK_FUNCS([setpassent setgroupent]) +dnl +dnl Function checks for sudo_noexec +dnl +if test X"$with_noexec" != X"no"; then + # Check for non-standard exec functions + AC_CHECK_FUNCS([exect execvP execvpe]) + # Check for posix_spawn, and posix_spawnp + if test X"$ac_cv_header_spawn_h" = X"yes"; then + AC_CHECK_FUNCS([posix_spawn posix_spawnp]) + fi +fi + +dnl +dnl Check for the dirfd function/macro. If not found, look for dd_fd in DIR. +dnl +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include <$ac_header_dirent>]], [[DIR *d; (void)dirfd(d);]])], [AC_DEFINE(HAVE_DIRFD)], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include <$ac_header_dirent>]], [[DIR d; memset(&d, 0, sizeof(d)); return(d.dd_fd);]])], [AC_DEFINE(HAVE_DD_FD)], [])]) +AC_CHECK_MEMBERS([struct dirent.d_type, struct dirent.d_namlen], [], [], [ +AC_INCLUDES_DEFAULT +#include <$ac_header_dirent> +]) +dnl +dnl If socket(2) not in libc, check -lsocket and -linet +dnl May need to link with *both* -lnsl and -lsocket due to unresolved symbols +dnl +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +AC_CHECK_FUNC([socket], [], [ + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`" + SUDO_CHECK_LIB($lib, socket, [NET_LIBS="${NET_LIBS} $libs"; break], [], [$extralibs]) + done +]) +LIBS="$OLIBS" +dnl +dnl If inet_pton(3) not in libc, check -lnsl and -linet +dnl May need to link with *both* -lnsl and -lsocket due to unresolved symbols +dnl Some systems may have inet_pton() in libresolv. +dnl +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +found=false +INET_PTON_LIBS= +AC_CHECK_FUNC([inet_pton], [ + found=true + AC_DEFINE(HAVE_INET_PTON) +], [ + for libs in "-lsocket" "-linet" "-lsocket -lnsl" "-lresolv"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`" + SUDO_CHECK_LIB($lib, inet_pton, [ + found=true + AC_DEFINE(HAVE_INET_PTON) + NET_LIBS="${NET_LIBS} $libs" + INET_PTON_LIBS="$libs" + case "$libs" in + *-lresolv*) + AC_DEFINE(NEED_RESOLV_H) + ;; + esac + break + ], [], [$extralibs]) + done +]) +LIBS="$OLIBS" +if test X"$found" != X"true"; then + AC_LIBOBJ(inet_pton) + SUDO_APPEND_COMPAT_EXP(sudo_inet_pton) +fi +dnl +dnl If inet_ntop(3) not in libc, check -lnsl and -linet +dnl May need to link with *both* -lnsl and -lsocket due to unresolved symbols +dnl Some systems may have inet_ntop() in libresolv. +dnl +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +found=false +AC_CHECK_FUNC([inet_ntop], [ + found=true + AC_DEFINE(HAVE_INET_NTOP) +], [ + for libs in "-lsocket" "-linet" "-lsocket -lnsl" "-lresolv"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`" + SUDO_CHECK_LIB($lib, inet_ntop, [ + found=true + AC_DEFINE(HAVE_INET_NTOP) + NET_LIBS="${NET_LIBS} $libs" + break + ], [], [$extralibs]) + done +]) +LIBS="$OLIBS" +if test X"$found" != X"true"; then + AC_LIBOBJ(inet_ntop) + SUDO_APPEND_COMPAT_EXP(sudo_inet_ntop) +fi +dnl +dnl If syslog(3) not in libc, check -lsocket, -lnsl and -linet +dnl +OLIBS="$LIBS" +LIBS="${LIBS} ${NET_LIBS}" +AC_CHECK_FUNC([syslog], [], [ + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`" + SUDO_CHECK_LIB($lib, syslog, [NET_LIBS="${NET_LIBS} $libs"; break], [], [$extralibs]) + done +]) +LIBS="$OLIBS" +# +# Check for getaddrinfo and add any required libs to NET_LIBS. +# If it was added to LIBOBJS we need to export the symbols. +# +OLIBS="$LIBS" +GETADDRINFO_LIBS= +AX_FUNC_GETADDRINFO +case " $LIBOBJS " in + *" getaddrinfo.$ac_objext "* ) + SUDO_APPEND_COMPAT_EXP(sudo_getaddrinfo sudo_freeaddrinfo sudo_gai_strerror) + # We need libsudo_util to pull in dependent libraries for + # inet_pton(), gethostbyname(), and getservbyname() + if test -n "${INET_PTON_LIBS}"; then + LT_DEP_LIBS="${LT_DEP_LIBS}${LT_DEP_LIBS+ }${INET_PTON_LIBS}" + LIBS="${LIBS}${LIBS+ }${INET_PTON_LIBS}" + fi + AC_CHECK_FUNC([gethostbyname], [], [ + for libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _libs= + for lib in $libs; do + case "$LT_DEP_LIBS" in + *"$lib"*) ;; + *) _libs="$_libs $lib";; + esac + done + libs="${_libs# }" + test -z "$libs" && continue + lib="`echo \"$libs\"|sed -e 's/^-l//' -e 's/ .*$//'`" + extralibs="`echo \"$libs\"|sed 's/^-l[[^ ]]*//'`" + SUDO_CHECK_LIB($lib, gethostbyname, [LT_DEP_LIBS="${LT_DEP_LIBS} $libs"; break], [], [$extralibs]) + done + ]) + ;; + *) + for lib in $LIBS; do + case "$OLIBS" in + *"$lib"*) ;; + *) GETADDRINFO_LIBS="${GETADDRINFO_LIBS}${GETADDRINFO_LIBS+ }$lib";; + esac + done + if test -n "${GETADDRINFO_LIBS}"; then + # We need libsudo_util to pull in dependent libraries for + # gai_strerror() + LT_DEP_LIBS="${LT_DEP_LIBS}${LT_DEP_LIBS+ }${GETADDRINFO_LIBS}" + LIBS="${LIBS}${LIBS+ }${GETADDRINFO_LIBS}" + + # Add to NET_LIBS if necessary + for lib in $GETADDRINFO_LIBS; do + case "$NET_LIBS" in + *"$lib"*) ;; + *) NET_LIBS="${NET_LIBS}${NET_LIBS+ }$lib";; + esac + done + fi + ;; +esac +LIBS="$OLIBS" + +dnl +dnl Check for getprogname() or __progname +dnl +AC_CHECK_FUNCS([getprogname], [AC_CHECK_FUNCS([setprogname])], [ + AC_MSG_CHECKING([for __progname]) + AC_CACHE_VAL(sudo_cv___progname, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[extern char *__progname; (void)puts(__progname);]])], [sudo_cv___progname=yes], [sudo_cv___progname=no])]) + if test "$sudo_cv___progname" = "yes"; then + AC_DEFINE(HAVE___PROGNAME) + fi + AC_MSG_RESULT($sudo_cv___progname) + SUDO_APPEND_COMPAT_EXP(sudo_getprogname) +]) +dnl +dnl Check for __func__ or __FUNCTION__ +dnl +AC_MSG_CHECKING([for __func__]) +AC_CACHE_VAL(sudo_cv___func__, [ +AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[(void)puts(__func__);]])], [sudo_cv___func__=yes], [sudo_cv___func__=no])]) +AC_MSG_RESULT($sudo_cv___func__) +if test "$sudo_cv___func__" = "yes"; then + AC_DEFINE(HAVE___FUNC__) +elif test -n "$GCC"; then + AC_MSG_CHECKING([for __FUNCTION__]) + AC_CACHE_VAL(sudo_cv___FUNCTION__, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[(void)puts(__FUNCTION__);]])], [sudo_cv___FUNCTION__=yes], [sudo_cv___FUNCTION__=no])]) + AC_MSG_RESULT($sudo_cv___FUNCTION__) + if test "$sudo_cv___FUNCTION__" = "yes"; then + AC_DEFINE(HAVE___FUNC__) + AC_DEFINE(__func__, __FUNCTION__, [Define to __FUNCTION__ if your compiler supports __FUNCTION__ but not __func__]) + fi +fi + +# gettext() and friends may be located in libc (Linux and Solaris) +# or in libintl. However, it is possible to have libintl installed +# even when gettext() is present in libc. In the case of GNU libintl, +# gettext() will be defined to gettext_libintl in libintl.h. +# Since gcc prefers /usr/local/include to /usr/include, we need to +# make sure we use the gettext() that matches the include file. +if test "$enable_nls" != "no"; then + if test "$enable_nls" != "yes"; then + AX_APPEND_FLAG([-I${enable_nls}/include], [CPPFLAGS]) + SUDO_APPEND_LIBPATH(LDFLAGS, [$enable_nls/lib]) + fi + OLIBS="$LIBS" + for l in "libc" "-lintl" "-lintl -liconv"; do + if test "$l" = "libc"; then + # If user specified a dir for libintl ignore libc + if test "$enable_nls" != "yes"; then + continue + fi + gettext_name=sudo_cv_gettext + AC_MSG_CHECKING([for gettext]) + else + LIBS="$OLIBS $l" + gettext_name=sudo_cv_gettext"`echo $l|sed -e 's/ //g' -e 's/-/_/g'`" + AC_MSG_CHECKING([for gettext in $l]) + fi + AC_CACHE_VAL($gettext_name, [ + AC_LINK_IFELSE( + [ + AC_LANG_PROGRAM([[#include ]], [(void)gettext((char *)0);]) + ], [eval $gettext_name=yes], [eval $gettext_name=no] + ) + ]) + eval gettext_result="\$$gettext_name" + AC_MSG_RESULT($gettext_result) + if test "$gettext_result" = "yes"; then + AC_CHECK_FUNCS([ngettext]) + break + fi + done + LIBS="$OLIBS" + + if test "$sudo_cv_gettext" = "yes"; then + SUDO_NLS=enabled + # For Solaris we need links from lang to lang.UTF-8 in localedir + case "$host_os" in + solaris2*) LOCALEDIR_SUFFIX=".UTF-8";; + esac + elif test "$sudo_cv_gettext_lintl" = "yes"; then + SUDO_NLS=enabled + LIBINTL="-lintl" + elif test "$sudo_cv_gettext_lintl_liconv" = "yes"; then + SUDO_NLS=enabled + LIBINTL="-lintl -liconv" + fi + if test X"$SUDO_NLS" = X"enabled"; then + AC_DEFINE(HAVE_LIBINTL_H) + SUDO_APPEND_COMPAT_EXP(sudo_warn_gettext_v1) + fi +fi + +dnl +dnl Deferred zlib option processing. +dnl By default we use the system zlib if it is present. +dnl If a directory was specified for zlib (or we are use sudo's version), +dnl prepend the include dir to make sure we get the right zlib header. +dnl +case "$enable_zlib" in + yes) + AC_CHECK_LIB(z, gzdopen, [ + AC_CHECK_HEADERS([zlib.h], [ZLIB="-lz"], [enable_zlib=builtin]) + ]) + ;; + no) + ;; + system) + AC_DEFINE(HAVE_ZLIB_H) + ZLIB="-lz" + ;; + static|shared|builtin) + # handled below + ;; + *) + AC_DEFINE(HAVE_ZLIB_H) + AX_APPEND_FLAG([-I${enable_zlib}/include], [CPPFLAGS]) + SUDO_APPEND_LIBPATH(ZLIB, [$enable_zlib/lib]) + ZLIB="${ZLIB} -lz" + ;; +esac +case "$enable_zlib" in + builtin|static|dynamic) + AC_DEFINE(HAVE_ZLIB_H) + # XXX - can't use AX_APPEND_FLAG due to use of $(top_foo) and quoting + CPPFLAGS='-I$(top_builddir)/lib/zlib -I$(top_srcdir)/lib/zlib '"${CPPFLAGS}" + ZLIB="${ZLIB}"' $(top_builddir)/lib/zlib/libsudo_z.la' + ZLIB_SRC=lib/zlib + AC_CONFIG_HEADER([lib/zlib/zconf.h]) + AC_CONFIG_FILES([lib/zlib/Makefile]) + if test X"$enable_shared" = X"no" -o "$enable_zlib" = "static"; then + if test "$enable_zlib" = "shared"; then + AC_MSG_ERROR(["Unable to build shared libraries on this system"]) + fi + # Build as convenience library + ZLIB_LDFLAGS=-no-install + fi + ;; +esac + +dnl +dnl Check for errno declaration in errno.h +dnl +AC_CHECK_DECLS([errno], [], [], [ +AC_INCLUDES_DEFAULT +#include +]) + +dnl +dnl Check for h_errno declaration in netdb.h +dnl +AC_CHECK_DECLS([h_errno], [], [], [ +AC_INCLUDES_DEFAULT +#include +]) + +dnl +dnl Check for incomplete limits.h and missing SIZE_MAX. +dnl +AC_CHECK_DECLS([LLONG_MAX, LLONG_MIN, ULLONG_MAX, PATH_MAX], [], [], [ +#include +#include +]) +AC_CHECK_DECLS([SIZE_MAX], [], [], [ +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +]) +dnl +dnl Try to find equivalents for missing types +dnl +if test "$ac_cv_have_decl_LLONG_MAX" != "yes"; then + AC_CHECK_DECLS([QUAD_MAX], [], [], [[ +#include +#include + ]]) +fi +if test "$ac_cv_have_decl_LLONG_MIN" != "yes"; then + AC_CHECK_DECLS([QUAD_MIN], [], [], [[ +#include +#include + ]]) +fi +if test "$ac_cv_have_decl_ULLONG_MAX" != "yes"; then + AC_CHECK_DECLS([UQUAD_MAX], [], [], [[ +#include +#include + ]]) +fi +if test "$ac_cv_have_decl_SIZE_MAX" != "yes"; then + AC_CHECK_DECLS([SIZE_T_MAX], [], [], [[ +#include +#include + ]]) +fi +if test "$ac_cv_have_decl_PATH_MAX" != "yes"; then + AC_CHECK_DECLS([_POSIX_PATH_MAX], [], [], [[ +#include +#include + ]]) +fi + +dnl +dnl Check for strsignal() or sys_siglist +dnl +AC_CHECK_FUNCS([strsignal], [], [ + AC_LIBOBJ(strsignal) + SUDO_APPEND_COMPAT_EXP(sudo_strsignal) + HAVE_SIGLIST="false" + AC_CHECK_DECLS([sys_siglist, _sys_siglist], [ + HAVE_SIGLIST="true" + ], [ ], [ +AC_INCLUDES_DEFAULT +#include + ]) + if test "$HAVE_SIGLIST" != "true"; then + AC_LIBOBJ(siglist) + fi +]) + +dnl +dnl Check for sig2str() and str2sig(), sys_signame or sys_sigabbrev +dnl +AC_CHECK_FUNCS([sig2str], [ + AC_CHECK_DECLS(SIG2STR_MAX, [], [], [ +# include +])], [ + AC_LIBOBJ(sig2str) + SUDO_APPEND_COMPAT_EXP(sudo_sig2str) +]) +AC_CHECK_FUNCS([str2sig], [], [ + AC_LIBOBJ(str2sig) + SUDO_APPEND_COMPAT_EXP(sudo_str2sig) +]) + +dnl +dnl Check for sys_signame or sys_sigabbrev if missing sig2str() or str2sig(). +dnl Also enable unit tests for sig2str() and str2sig(). +dnl +if test x"${ac_cv_func_sig2str}${ac_cv_func_str2sig}" != x"yesyes"; then + COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }strsig_test" + HAVE_SIGNAME="false" + AC_CHECK_DECLS([sys_signame, _sys_signame, sys_sigabbrev], [ + HAVE_SIGNAME="true" + ], [ ], [ +AC_INCLUDES_DEFAULT +#include + ]) + if test "$HAVE_SIGNAME" != "true"; then + AC_CACHE_CHECK([for undeclared sys_sigabbrev], + [sudo_cv_var_sys_sigabbrev], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[extern char **sys_sigabbrev;]], [[return sys_sigabbrev[1];]])], + [sudo_cv_var_sys_sigabbrev=yes], + [sudo_cv_var_sys_sigabbrev=no] + ) + ] + ) + if test "$sudo_cv_var_sys_sigabbrev" = yes; then + AC_DEFINE(HAVE_SYS_SIGABBREV) + else + AC_LIBOBJ(signame) + SIGNAME=signame.lo + fi + fi +fi + +dnl +dnl Check for dl_iterate_phdr, may require -ldl +dnl +OLIBS="$LIBS" +LIBS="$LIBS $lt_cv_dlopen_libs" +AC_CHECK_FUNCS([dl_iterate_phdr]) +LIBS="$OLIBS" + +dnl +dnl nsswitch.conf and its equivalents +dnl +if test ${with_netsvc-"no"} != "no"; then + SUDO_DEFINE_UNQUOTED(_PATH_NETSVC_CONF, "${with_netsvc-/etc/netsvc.conf}") + netsvc_conf=${with_netsvc-/etc/netsvc.conf} +elif test ${with_nsswitch-"yes"} != "no"; then + SUDO_DEFINE_UNQUOTED(_PATH_NSSWITCH_CONF, "${with_nsswitch-/etc/nsswitch.conf}") + nsswitch_conf=${with_nsswitch-/etc/nsswitch.conf} +fi + +dnl +dnl Mutually exclusive auth checks come first, followed by +dnl non-exclusive ones. Note: passwd must be last of all! +dnl + +dnl +dnl Convert default authentication methods to with_* if +dnl no explicit authentication scheme was specified. +dnl +if test -z "${AUTH_EXCL}${AUTH_REG}" -a -n "$AUTH_EXCL_DEF"; then + for auth in $AUTH_EXCL_DEF; do + case $auth in + AIX_AUTH) with_aixauth=maybe;; + BSD_AUTH) with_bsdauth=maybe;; + PAM) with_pam=maybe;; + SIA) CHECKSIA=true;; + esac + done +fi + +dnl +dnl PAM support. Systems that use PAM by default set with_pam=default +dnl and we do the actual tests here. +dnl +if test ${with_pam-"no"} != "no"; then + # + # Check for pam_start() in libpam first, then for pam_appl.h. + # + found_pam_lib=no + AC_CHECK_LIB(pam, pam_start, [found_pam_lib=yes], [], [$lt_cv_dlopen_libs]) + # + # Some PAM implementations (macOS for example) put the PAM headers + # in /usr/include/pam instead of /usr/include/security... + # + found_pam_hdrs=no + AC_CHECK_HEADERS([security/pam_appl.h] [pam/pam_appl.h], [found_pam_hdrs=yes; break]) + if test "$found_pam_lib" = "yes" -a "$found_pam_hdrs" = "yes"; then + # Found both PAM libs and headers + with_pam=yes + elif test "$with_pam" = "yes"; then + if test "$found_pam_lib" = "no"; then + AC_MSG_ERROR(["--with-pam specified but unable to locate PAM development library."]) + fi + if test "$found_pam_hdrs" = "no"; then + AC_MSG_ERROR(["--with-pam specified but unable to locate PAM development headers."]) + fi + elif test "$found_pam_lib" != "$found_pam_hdrs"; then + if test "$found_pam_lib" = "no"; then + AC_MSG_ERROR(["found PAM headers but no PAM development library; specify --without-pam to build without PAM"]) + fi + if test "$found_pam_hdrs" = "no"; then + AC_MSG_ERROR(["found PAM library but no PAM development headers; specify --without-pam to build without PAM"]) + fi + fi + + if test "$with_pam" = "yes"; then + # Older PAM implementations lack pam_getenvlist + OLIBS="$LIBS" + LIBS="$LIBS -lpam $lt_cv_dlopen_libs" + AC_CHECK_FUNCS([pam_getenvlist]) + LIBS="$OLIBS" + + # We already link with -ldl if needed (see LIBDL below) + SUDOERS_LIBS="${SUDOERS_LIBS} -lpam" + AC_DEFINE(HAVE_PAM) + AUTH_OBJS="$AUTH_OBJS pam.lo"; + AUTH_EXCL=PAM + + AC_ARG_WITH(pam-login, [AS_HELP_STRING([--with-pam-login], [enable specific PAM session for sudo -i])], + [case $with_pam_login in + yes) AC_DEFINE([HAVE_PAM_LOGIN]) + AC_MSG_CHECKING(whether to use PAM login) + AC_MSG_RESULT(yes) + pam_login_service="sudo-i" + ;; + no) ;; + *) AC_MSG_ERROR(["--with-pam-login does not take an argument."]) + ;; + esac]) + + AC_MSG_CHECKING(whether to use PAM session support) + AC_ARG_ENABLE(pam_session, + [AS_HELP_STRING([--disable-pam-session], [Disable PAM session support])], + [ case "$enableval" in + yes) AC_MSG_RESULT(yes) + ;; + no) AC_MSG_RESULT(no) + AC_DEFINE(NO_PAM_SESSION) + pam_session=off + ;; + *) AC_MSG_RESULT(no) + AC_MSG_WARN([Ignoring unknown argument to --enable-pam-session: $enableval]) + ;; + esac], AC_MSG_RESULT(yes)) + fi +fi + +dnl +dnl AIX general authentication +dnl We may build in support for both AIX LAM and PAM and select +dnl which one to use at run-time. +dnl +if test ${with_aixauth-'no'} != "no"; then + AC_CHECK_FUNCS([authenticate], [with_aixauth=yes]) + if test "${with_aixauth}" = "yes"; then + AC_MSG_NOTICE([using AIX general authentication]) + AC_DEFINE(HAVE_AIXAUTH) + AUTH_OBJS="$AUTH_OBJS aix_auth.lo"; + SUDOERS_LIBS="${SUDOERS_LIBS} -ls" + AUTH_EXCL=AIX_AUTH + fi +fi + +dnl +dnl BSD authentication +dnl If set to "maybe" only enable if no other exclusive method in use. +dnl +if test ${with_bsdauth-'no'} != "no"; then + AC_CHECK_HEADER(bsd_auth.h, AC_DEFINE(HAVE_BSD_AUTH_H) + [AUTH_OBJS="$AUTH_OBJS bsdauth.lo"] + [BSDAUTH_USAGE='[[-a type]] '] + [AUTH_EXCL=BSD_AUTH; BAMAN=1], + [AC_MSG_ERROR([BSD authentication was specified but bsd_auth.h could not be found])]) +fi + +dnl +dnl SIA authentication for Tru64 Unix +dnl +if test ${CHECKSIA-'false'} = "true"; then + AC_CHECK_FUNCS([sia_ses_init], [found=true], [found=false]) + if test "$found" = "true"; then + AUTH_EXCL=SIA + AUTH_OBJS="$AUTH_OBJS sia.lo" + fi +fi + +dnl +dnl extra FWTK libs + includes +dnl +if test ${with_fwtk-'no'} != "no"; then + if test "$with_fwtk" != "yes"; then + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_fwtk}]) + AX_APPEND_FLAG([-I${with_fwtk}], [CPPFLAGS]) + with_fwtk=yes + fi + SUDOERS_LIBS="${SUDOERS_LIBS} -lauth -lfwall" + AUTH_OBJS="$AUTH_OBJS fwtk.lo" +fi + +dnl +dnl extra SecurID lib + includes +dnl +if test ${with_SecurID-'no'} != "no"; then + if test "$with_SecurID" != "yes"; then + : + elif test -d /usr/ace/examples; then + with_SecurID=/usr/ace/examples + else + with_SecurID=/usr/ace + fi + AX_APPEND_FLAG([-I${with_SecurID}], [CPPFLAGS]) + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_SecurID}]) + SUDOERS_LIBS="${SUDOERS_LIBS} -laceclnt -lpthread" + AUTH_OBJS="$AUTH_OBJS securid5.lo"; +fi + +dnl +dnl Non-mutually exclusive auth checks come next. +dnl Note: passwd must be last of all! +dnl + +dnl +dnl Convert default authentication methods to with_* if +dnl no explicit authentication scheme was specified. +dnl +if test -z "${AUTH_EXCL}" -a -n "$AUTH_DEF"; then + for auth in $AUTH_DEF; do + case $auth in + passwd) : ${with_passwd='maybe'};; + esac + done +fi + +dnl +dnl Kerberos V +dnl There is an easy way and a hard way... +dnl +if test ${with_kerb5-'no'} != "no"; then + AC_CHECK_PROG(KRB5CONFIG, krb5-config, yes, "") + if test -n "$KRB5CONFIG"; then + AC_DEFINE(HAVE_KERB5) + AUTH_OBJS="$AUTH_OBJS kerb5.lo" + AX_APPEND_FLAG([`krb5-config --cflags`], [CPPFLAGS]) + SUDOERS_LIBS="$SUDOERS_LIBS `krb5-config --libs`" + dnl + dnl Try to determine whether we have Heimdal or MIT Kerberos + dnl + AC_MSG_CHECKING(whether we are using Heimdal) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[const char *tmp = heimdal_version;]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_HEIMDAL) + ], [ + AC_MSG_RESULT(no) + ] + ) + else + AC_DEFINE(HAVE_KERB5) + dnl + dnl Use the specified directory, if any, else search for correct inc dir + dnl + if test "$with_kerb5" = "yes"; then + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "kerberosV/" "krb5/" "kerberos5/" "kerberosv5/"; do + CPPFLAGS="$O_CPPFLAGS -I/usr/include/${dir}" + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[#include ]])], [found=yes; break]) + done + if test X"$found" = X"no"; then + CPPFLAGS="$O_CPPFLAGS" + AC_MSG_WARN([Unable to locate Kerberos V include files, you will have to edit the Makefile and add -I/path/to/krb/includes to CPPFLAGS]) + fi + else + dnl XXX - try to include krb5.h here too + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_kerb5}/lib]) + AX_APPEND_FLAG([-I${with_kerb5}/include], [CPPFLAGS]) + fi + + dnl + dnl Try to determine whether we have Heimdal or MIT Kerberos + dnl + AC_MSG_CHECKING(whether we are using Heimdal) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[const char *tmp = heimdal_version;]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_HEIMDAL) + # XXX - need to check whether -lcrypo is needed! + SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5 -lcrypto -ldes -lcom_err -lasn1" + AC_CHECK_LIB(roken, main, [SUDOERS_LIBS="${SUDOERS_LIBS} -lroken"]) + ], [ + AC_MSG_RESULT(no) + SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5 -lk5crypto -lcom_err" + AC_CHECK_LIB(krb5support, main, [SUDOERS_LIBS="${SUDOERS_LIBS} -lkrb5support"]) + ]) + AUTH_OBJS="$AUTH_OBJS kerb5.lo" + fi + _LIBS="$LIBS" + LIBS="${LIBS} ${SUDOERS_LIBS}" + AC_CHECK_FUNCS([krb5_verify_user krb5_init_secure_context]) + AC_CHECK_FUNCS([krb5_get_init_creds_opt_alloc], [ + AC_CACHE_CHECK([whether krb5_get_init_creds_opt_free takes a context], + sudo_cv_krb5_get_init_creds_opt_free_two_args, [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[krb5_get_init_creds_opt_free(NULL, NULL);]] + )], + [sudo_cv_krb5_get_init_creds_opt_free_two_args=yes], + [sudo_cv_krb5_get_init_creds_opt_free_two_args=no] + ) + ] + ) + ]) + if test X"$sudo_cv_krb5_get_init_creds_opt_free_two_args" = X"yes"; then + AC_DEFINE(HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS) + fi + LIBS="$_LIBS" + AC_MSG_CHECKING(whether to use an instance name for Kerberos V) + AC_ARG_ENABLE(kerb5-instance, + [AS_HELP_STRING([--enable-kerb5-instance], [instance string to append to the username (separated by a slash)])], + [ case "$enableval" in + yes) AC_MSG_ERROR(["must give --enable-kerb5-instance an argument."]) + ;; + no) AC_MSG_RESULT(no) + ;; + *) SUDO_DEFINE_UNQUOTED(SUDO_KRB5_INSTANCE, "$enableval") + AC_MSG_RESULT([$enableval]) + ;; + esac], AC_MSG_RESULT(no)) +fi + +dnl +dnl extra AFS libs and includes +dnl +if test ${with_AFS-'no'} = "yes"; then + + # looks like the "standard" place for AFS libs is /usr/afsws/lib + AFSLIBDIRS="/usr/lib/afs /usr/afsws/lib /usr/afsws/lib/afs" + for i in $AFSLIBDIRS; do + if test -d ${i}; then + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [$i]) + FOUND_AFSLIBDIR=true + fi + done + if test -z "$FOUND_AFSLIBDIR"; then + AC_MSG_WARN([Unable to locate AFS libraries, you will have to edit the Makefile and add -L/path/to/afs/libs to SUDOERS_LDFLAGS or rerun configure with the --with-libpath options.]) + fi + + # Order is important here. Note that we build AFS_LIBS from right to left + # since AFS_LIBS may be initialized with BSD compat libs that must go last + AFS_LIBS="-laudit ${AFS_LIBS}" + for i in $AFSLIBDIRS; do + if test -f ${i}/util.a; then + AFS_LIBS="${i}/util.a ${AFS_LIBS}" + FOUND_UTIL_A=true + break; + fi + done + if test -z "$FOUND_UTIL_A"; then + AFS_LIBS="-lutil ${AFS_LIBS}" + fi + AFS_LIBS="-lkauth -lprot -lubik -lauth -lrxkad -lsys -ldes -lrx -llwp -lcom_err ${AFS_LIBS}" + + # AFS includes may live in /usr/include on some machines... + for i in /usr/afsws/include; do + if test -d ${i}; then + AX_APPEND_FLAG([-I${i}], [CPPFLAGS]) + FOUND_AFSINCDIR=true + fi + done + + if test -z "$FOUND_AFSLIBDIR"; then + AC_MSG_WARN([Unable to locate AFS include dir, you may have to edit the Makefile and add -I/path/to/afs/includes to CPPFLAGS or rerun configure with the --with-incpath options.]) + fi + + AUTH_OBJS="$AUTH_OBJS afs.lo" +fi + +dnl +dnl extra DCE obj + lib +dnl Order of libs in HP-UX 10.x is important, -ldce must be last. +dnl +if test ${with_DCE-'no'} = "yes"; then + DCE_OBJS="${DCE_OBJS} dce_pwent.o" + SUDOERS_LIBS="${SUDOERS_LIBS} -ldce" + AUTH_OBJS="$AUTH_OBJS dce.lo" +fi + +dnl +dnl extra S/Key lib and includes +dnl +if test "${with_skey-'no'}" = "yes"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_skey" != "yes"; then + AX_APPEND_FLAG([-I${with_skey}/include], [CPPFLAGS]) + LDFLAGS="$LDFLAGS -L${with_skey}/lib" + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_skey}/lib]) + AC_CHECK_HEADER([skey.h], [found=yes], [found=no], [#include ]) + else + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "/usr/local" "/usr/contrib"; do + test -n "$dir" && CPPFLAGS="$O_CPPFLAGS -I${dir}/include" + AC_CHECK_HEADER([skey.h], [found=yes; break], [], [#include ]) + done + if test "$found" = "no" -o -z "$dir"; then + CPPFLAGS="$O_CPPFLAGS" + else + LDFLAGS="$LDFLAGS -L${dir}/lib" + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${dir}/lib]) + fi + if test "$found" = "no"; then + AC_MSG_WARN([Unable to locate skey.h, you will have to edit the Makefile and add -I/path/to/skey/includes to CPPFLAGS]) + fi + fi + AC_CHECK_LIB(skey, main, [found=yes], [AC_MSG_WARN([Unable to locate libskey.a, you will have to edit the Makefile and add -L/path/to/skey/lib to SUDOERS_LDFLAGS])]) + AC_CHECK_LIB(skey, skeyaccess, AC_DEFINE(HAVE_SKEYACCESS)) + + AC_MSG_CHECKING([for RFC1938-compliant skeychallenge]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +# include +# include ]], + [[skeychallenge(NULL, NULL, NULL, 0);]] + )], [ + AC_DEFINE(HAVE_RFC1938_SKEYCHALLENGE) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ] + ) + + LDFLAGS="$O_LDFLAGS" + SUDOERS_LIBS="${SUDOERS_LIBS} -lskey" + AUTH_OBJS="$AUTH_OBJS rfc1938.lo" +fi + +dnl +dnl extra OPIE lib and includes +dnl +if test "${with_opie-'no'}" = "yes"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_opie" != "yes"; then + AX_APPEND_FLAG([-I${with_opie}/include], [CPPFLAGS]) + LDFLAGS="$LDFLAGS -L${with_opie}/lib" + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_opie}/lib]) + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[#include ]])], [found=yes], [found=no]) + else + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "/usr/local" "/usr/contrib"; do + test -n "$dir" && CPPFLAGS="$O_CPPFLAGS -I${dir}/include" + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[#include ]])], [found=yes; break]) + done + if test "$found" = "no" -o -z "$dir"; then + CPPFLAGS="$O_CPPFLAGS" + else + LDFLAGS="$LDFLAGS -L${dir}/lib" + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${dir}/lib]) + fi + if test "$found" = "no"; then + AC_MSG_WARN([Unable to locate opie.h, you will have to edit the Makefile and add -I/path/to/opie/includes to CPPFLAGS]) + fi + fi + AC_CHECK_LIB(opie, main, [found=yes], [AC_MSG_WARN([Unable to locate libopie.a, you will have to edit the Makefile and add -L/path/to/opie/lib to SUDOERS_LDFLAGS])]) + LDFLAGS="$O_LDFLAGS" + SUDOERS_LIBS="${SUDOERS_LIBS} -lopie" + AUTH_OBJS="$AUTH_OBJS rfc1938.lo" +fi + +dnl +dnl Check for shadow password routines if we have not already done so. +dnl If there is a specific list of functions to check we do that first. +dnl Otherwise, we check for SVR4-style and then SecureWare-style. +dnl +if test ${with_passwd-'no'} != "no"; then + dnl + dnl if crypt(3) not in libc, look elsewhere + dnl + if test -z "$LIB_CRYPT"; then + _LIBS="$LIBS" + AC_SEARCH_LIBS([crypt], [crypt crypt_d ufc], [ + test "${ac_cv_search_crypt}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_crypt}" + ]) + LIBS="$_LIBS" + fi + + if test "$CHECKSHADOW" = "true" -a -n "$shadow_funcs"; then + _LIBS="$LIBS" + LIBS="$LIBS $shadow_libs" + found=no + AC_CHECK_FUNCS($shadow_funcs, [found=yes]) + if test "$found" = "yes"; then + case "$shadow_funcs" in + *getprpwnam*) SECUREWARE=1;; + esac + else + shadow_libs= + fi + CHECKSHADOW=false + LIBS="$_LIBS" + fi + if test "$CHECKSHADOW" = "true"; then + AC_SEARCH_LIBS([getspnam], [gen shadow], [ + AC_DEFINE(HAVE_GETSPNAM) + test "${ac_cv_search_getspnam}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_getspnam}" + CHECKSHADOW=false + ]) + fi + if test "$CHECKSHADOW" = "true"; then + AC_SEARCH_LIBS([getprpwnam], [sec security prot], [ + AC_DEFINE(HAVE_GETPRPWNAM) + test "${ac_cv_search_getprpwnam}" != "none required" && shadow_libs="${shadow_libs} ${ac_cv_search_getprpwnam}" + SECUREWARE=1 + CHECKSHADOW=false + ]) + fi + if test -n "$shadow_libs"; then + # sudoers needs to link with shadow libs for password auth + SUDOERS_LIBS="$SUDOERS_LIBS $shadow_libs" + fi + if test -n "$SECUREWARE"; then + _LIBS="$LIBS" + LIBS="$LIBS $shadow_libs" + AC_CHECK_FUNCS([bigcrypt]) + AUTH_OBJS="$AUTH_OBJS secureware.lo" + # set_auth_parameters() and initprivs() are called from sudo.c + AC_CHECK_FUNCS([set_auth_parameters initprivs], [test -n "$shadow_libs" && SUDO_LIBS="$SUDO_LIBS $shadow_libs"]) + LIBS="$_LIBS" + fi +fi + +dnl +dnl Solaris 11 added a 4th argument to the au_close() function +dnl +if test X"$with_bsm_audit" = X"yes"; then + SUDO_FUNC_AU_CLOSE_SOLARIS11 +fi + +dnl +dnl Choose event subsystem backend: poll or select +dnl +if test X"$enable_poll" = X""; then + AC_CHECK_FUNCS([ppoll poll], [enable_poll=yes; break], [enable_poll=no]) +elif test X"$enable_poll" = X"yes"; then + AC_CHECK_FUNCS([ppoll], [], AC_DEFINE(HAVE_POLL)) +fi +if test "$enable_poll" = "yes"; then + COMMON_OBJS="${COMMON_OBJS} event_poll.lo" +else + AC_CHECK_FUNCS([pselect]) + COMMON_OBJS="${COMMON_OBJS} event_select.lo" +fi + +dnl +dnl extra lib and .o file for LDAP support +dnl +if test ${with_ldap-'no'} != "no"; then + O_LDFLAGS="$LDFLAGS" + if test "$with_ldap" != "yes"; then + SUDO_APPEND_LIBPATH(SUDOERS_LDFLAGS, [${with_ldap}/lib]) + LDFLAGS="$LDFLAGS -L${with_ldap}/lib" + AX_APPEND_FLAG([-I${with_ldap}/include], [CPPFLAGS]) + with_ldap=yes + fi + SUDOERS_OBJS="${SUDOERS_OBJS} ldap.lo ldap_conf.lo" + case "$SUDOERS_OBJS" in + *ldap_util.lo*) ;; + *) SUDOERS_OBJS="${SUDOERS_OBJS} ldap_util.lo";; + esac + LDAP="" + + _LIBS="$LIBS" + LDAP_LIBS="" + IBMLDAP_EXTRA="" + found=no + # On HP-UX, libibmldap has a hidden dependency on libCsup + case "$host_os" in + hpux*) AC_CHECK_LIB(Csup, main, [IBMLDAP_EXTRA=" -lCsup"]);; + esac + AC_SEARCH_LIBS([ldap_init], ["ibmldap${IBMLDAP_EXTRA}" "ibmldap -lidsldif${IBMLDAP_EXTRA}" "ldap" "ldap -llber" "ldap -llber -lssl -lcrypto" "ibmldap${IBMLDAP_EXTRA}]", [ + test "${ac_cv_search_ldap_init}" != "none required" && LDAP_LIBS="${ac_cv_search_ldap_init}" + found=yes + ]) + # If nothing linked, try -lldap and hope for the best + if test "$found" = "no"; then + LDAP_LIBS="-lldap" + fi + LIBS="${_LIBS} ${LDAP_LIBS}" + dnl check if we need to link with -llber for ber_set_option + OLIBS="$LIBS" + AC_MSG_CHECKING([whether lber.h defines LBER_OPT_DEBUG_LEVEL]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +# include ]], [[int opt=LBER_OPT_DEBUG_LEVEL;]])], [ + AC_MSG_RESULT([yes]) + AC_SEARCH_LIBS([ber_set_option], [lber], [found=yes], [found=no]) + if test X"$found" = X"yes" -a X"$LIBS" != X"$OLIBS"; then + LDAP_LIBS="$LDAP_LIBS -llber" + fi + ], [ + AC_MSG_RESULT([no]) + ]) + dnl check if ldap.h includes lber.h for us + AC_MSG_CHECKING([whether lber.h is needed]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +# include ]], [[(void)ldap_init(0, 0)]])], [AC_MSG_RESULT([no])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_LBER_H)]) + + if test ${enable_sasl-'yes'} = "yes"; then + found_sasl_h=no + AC_CHECK_HEADERS([sasl/sasl.h] [sasl.h], [ + found_sasl_h=yes + AC_CHECK_FUNCS([ldap_sasl_interactive_bind_s]) + break + ]) + if test X${enable_sasl} = X"yes"; then + if test X"$found_sasl_h" != X"yes"; then + AC_MSG_ERROR(["--enable-sasl specified but unable to locate SASL development headers."]) + fi + if test X"$ac_cv_func_ldap_sasl_interactive_bind_s" != X"yes"; then : + AC_MSG_ERROR(["--enable-sasl specified but SASL support is missing in your LDAP library"]) + fi + fi + fi + AC_CHECK_HEADERS([ldap_ssl.h] [mps/ldap_ssl.h], [break], [], [#include ]) + AC_CHECK_FUNCS([ldap_initialize ldap_start_tls_s ldapssl_init ldapssl_set_strength ldap_unbind_ext_s ldap_str2dn ldap_create ldap_sasl_bind_s ldap_ssl_init ldap_ssl_client_init ldap_start_tls_s_np]) + AC_CHECK_FUNCS([ldap_search_ext_s ldap_search_st], [break]) + + if test X"$check_gss_krb5_ccache_name" = X"yes"; then + AC_CHECK_LIB(gssapi, gss_krb5_ccache_name, + AC_DEFINE(HAVE_GSS_KRB5_CCACHE_NAME) + [LDAP_LIBS="${LDAP_LIBS} -lgssapi"], + AC_CHECK_LIB(gssapi_krb5, gss_krb5_ccache_name, + AC_DEFINE(HAVE_GSS_KRB5_CCACHE_NAME) + [LDAP_LIBS="${LDAP_LIBS} -lgssapi_krb5"]) + ) + + # gssapi headers may be separate or part of Kerberos V + found=no + O_CPPFLAGS="$CPPFLAGS" + for dir in "" "kerberosV" "krb5" "kerberos5" "kerberosv5"; do + test X"$dir" != X"" && CPPFLAGS="$O_CPPFLAGS -I/usr/include/${dir}" + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[#include ]])], [found="gssapi/gssapi.h"; break], [AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[#include ]])], [found="gssapi.h"; break])]) + done + if test X"$found" != X"no"; then + AC_CHECK_HEADERS([$found]) + if test X"$found" = X"gssapi/gssapi.h"; then + AC_CHECK_HEADERS([gssapi/gssapi_krb5.h]) + fi + else + CPPFLAGS="$O_CPPFLAGS" + AC_MSG_WARN([Unable to locate gssapi.h, you will have to edit the Makefile and add -I/path/to/gssapi/includes to CPPFLAGS]) + fi + fi + + SUDOERS_LIBS="${SUDOERS_LIBS} ${LDAP_LIBS}" + LIBS="$_LIBS" + LDFLAGS="$O_LDFLAGS" +fi + +# +# How to do dynamic object loading. +# We support dlopen() and sh_load(), else fall back to static loading. +# +case "$lt_cv_dlopen" in + dlopen) + AC_DEFINE(HAVE_DLOPEN) + if test "$enable_static_sudoers" = "yes"; then + AC_DEFINE(STATIC_SUDOERS_PLUGIN) + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + AX_APPEND_FLAG([--tag=disable-shared -static], [SUDOERS_LDFLAGS]) + LT_STATIC="" + else + LT_STATIC="--tag=disable-static" + fi + ;; + shl_load) + AC_DEFINE(HAVE_SHL_LOAD) + if test "$enable_static_sudoers" = "yes"; then + AC_DEFINE(STATIC_SUDOERS_PLUGIN) + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + AX_APPEND_FLAG([--tag=disable-shared -static], [SUDOERS_LDFLAGS]) + LT_STATIC="" + else + LT_STATIC="--tag=disable-static" + fi + ;; + *) + if test X"${ac_cv_func_dlopen}" = X"yes"; then + AC_MSG_ERROR(["dlopen present but libtool doesn't appear to support your platform."]) + fi + # Preload sudoers module symbols + AC_DEFINE(STATIC_SUDOERS_PLUGIN) + SUDO_OBJS="${SUDO_OBJS} preload.o" + STATIC_SUDOERS="\$(top_builddir)/plugins/sudoers/sudoers.la" + LT_STATIC="" + ;; +esac + +# +# The check_symbols test can only succeed with a dynamic sudoers plugin. +# +if test X"$STATIC_SUDOERS" = X""; then + SUDOERS_TEST_PROGS="${SUDOERS_TEST_PROGS}${SUDOERS_TEST_PROGS+ }check_symbols" +fi + +# +# We can only disable linking with the shared libsudo_util if +# sudoers is linked statically too. +# +if test "$enable_shared_libutil" = "no"; then + if test X"$STATIC_SUDOERS" = X""; then + AC_MSG_ERROR(["--disable-shared-libutil may only be specified with --enable-static-sudoers or when dynamic linking is disabled."]) + else + # Do not install sudoers or libsudo_util. + AX_APPEND_FLAG([-no-install], [SUDOERS_LDFLAGS]) + AX_APPEND_FLAG([-no-install], [LIBUTIL_LDFLAGS]) + fi +fi + +# On HP-UX, you cannot dlopen() a shared object that uses pthreads unless +# the main program is linked against -lpthread. We have no knowledge of +# what libraries a plugin may depend on (e.g. HP-UX LDAP which uses pthreads) +# so always link against -lpthread on HP-UX if it is available. +# This check should go after all other libraries tests. +case "$host_os" in + hpux*) + AC_CHECK_LIB(pthread, main, [SUDO_LIBS="${SUDO_LIBS} -lpthread"]) + AC_DEFINE(_REENTRANT) + ;; +esac + +dnl +dnl Check for log file, timestamp and iolog locations +dnl +if test "$utmp_style" = "LEGACY"; then + SUDO_PATH_UTMP +fi +SUDO_LOGFILE +SUDO_RUNDIR +SUDO_VARDIR +SUDO_IO_LOGDIR +SUDO_TZDIR + +dnl +dnl Attempt to use _FORTIFY_SOURCE with sprintf. If the headers support +dnl it but libc does not, __sprintf_chk should be an undefined symbol. +dnl +if test "$enable_hardening" != "no"; then + O_CPPFLAGS="$CPPFLAGS" + AX_APPEND_FLAG([-D_FORTIFY_SOURCE=2], [CPPFLAGS]) + AC_CACHE_CHECK([whether _FORTIFY_SOURCE may be specified], + [sudo_cv_use_fortify_source], + [AC_LINK_IFELSE([ + AC_LANG_PROGRAM( + [[]], [[char buf[4]; (void)sprintf(buf, "%s", "foo");]] + )], + [sudo_cv_use_fortify_source=yes], + [sudo_cv_use_fortify_source=no] + ) + ] + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [sudo_cv_use_fortify_source=yes], + [sudo_cv_use_fortify_source=no] + ) + ] + ) + if test "$sudo_cv_use_fortify_source" != yes; then + CPPFLAGS="$O_CPPFLAGS" + fi +fi + +dnl +dnl Turn warnings into errors. +dnl All compiler/loader tests after this point will fail if +dnl a warning is displayed (normally, warnings are not fatal). +dnl +AC_LANG_WERROR + +dnl +dnl If compiler supports the -static-libgcc flag use it unless we have +dnl GNU ld (which can avoid linking in libgcc when it is not needed). +dnl This test relies on AC_LANG_WERROR +dnl +if test -n "$GCC" -a "$lt_cv_prog_gnu_ld" != "yes" -a -n "$GCC"; then + AX_CHECK_COMPILE_FLAG([-static-libgcc], [AX_APPEND_FLAG([-Wc,-static-libgcc], [LT_LDFLAGS])]) +fi + +dnl +dnl Check for symbol visibility support. +dnl This test relies on AC_LANG_WERROR +dnl +if test -n "$GCC"; then + AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [ + AC_DEFINE(HAVE_DSO_VISIBILITY) + CFLAGS="${CFLAGS} -fvisibility=hidden" + LT_LDEXPORTS= + LT_LDDEP= + ]) +else + case "$host_os" in + hpux*) + AX_CHECK_COMPILE_FLAG([-Bhidden_def], [ + AC_DEFINE(HAVE_DSO_VISIBILITY) + CFLAGS="${CFLAGS} -Bhidden_def" + LT_LDEXPORTS= + LT_LDDEP= + ]) + ;; + solaris2*) + AX_CHECK_COMPILE_FLAG([-xldscope=hidden], [ + AC_DEFINE(HAVE_DSO_VISIBILITY) + CFLAGS="${CFLAGS} -xldscope=hidden" + LT_LDEXPORTS= + LT_LDDEP= + ]) + ;; + esac +fi + +dnl +dnl If the compiler doesn't have symbol visibility support, it may +dnl support version scripts (only GNU and Solaris ld). +dnl This test relies on AC_LANG_WERROR +dnl +if test -n "$LT_LDEXPORTS"; then + if test "$lt_cv_prog_gnu_ld" = "yes"; then + AC_CACHE_CHECK([whether ld supports anonymous map files], + [sudo_cv_var_gnu_ld_anon_map], + [ + sudo_cv_var_gnu_ld_anon_map=no + cat > conftest.map <<-EOF + { + global: foo; + local: *; + }; +EOF + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -fpic -shared -Wl,--version-script,./conftest.map" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])], + [sudo_cv_var_gnu_ld_anon_map=yes]) + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + ] + ) + if test "$sudo_cv_var_gnu_ld_anon_map" = "yes"; then + LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,--version-script,\$(shlib_map)" + fi + else + case "$host_os" in + solaris2*) + AC_CACHE_CHECK([whether ld supports anonymous map files], + [sudo_cv_var_solaris_ld_anon_map], + [ + sudo_cv_var_solaris_ld_anon_map=no + cat > conftest.map <<-EOF + { + global: foo; + local: *; + }; +EOF + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared -Wl,-M,./conftest.map" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])], + [sudo_cv_var_solaris_ld_anon_map=yes]) + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + ] + ) + if test "$sudo_cv_var_solaris_ld_anon_map" = "yes"; then + LT_LDDEP="\$(shlib_map)"; LT_LDEXPORTS="-Wl,-M,\$(shlib_map)" + fi + ;; + hpux*) + AC_CACHE_CHECK([whether ld supports controlling exported symbols], + [sudo_cv_var_hpux_ld_symbol_export], + [ + sudo_cv_var_hpux_ld_symbol_export=no + echo "+e foo" > conftest.opt + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_prog_compiler_pic" + _LDFLAGS="$LDFLAGS" + if test -n "$GCC"; then + LDFLAGS="$LDFLAGS -shared -Wl,-c,./conftest.opt" + else + LDFLAGS="$LDFLAGS -Wl,-b -Wl,-c,./conftest.opt" + fi + AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])], + [sudo_cv_var_hpux_ld_symbol_export=yes]) + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + rm -f conftest.opt + ] + ) + if test "$sudo_cv_var_hpux_ld_symbol_export" = "yes"; then + LT_LDDEP="\$(shlib_opt)"; LT_LDEXPORTS="-Wl,-c,\$(shlib_opt)" + fi + ;; + esac + fi +fi + +dnl +dnl Check for -fsanitize=address,undefined support +dnl This test relies on AC_LANG_WERROR +dnl +if test "$enable_asan" = "yes"; then + AX_CHECK_COMPILE_FLAG([-fsanitize=address -fsanitize=undefined], [ + AX_CHECK_LINK_FLAG([-fsanitize=address -fsanitize=undefined], [ + ASAN_LDFLAGS="-Wc,-fsanitize=address -Wc,-fsanitize=undefined" + ASAN_CFLAGS="-fsanitize=address -fsanitize=undefined" + AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer], [ + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + ]) + AC_DEFINE(NO_LEAKS) + ]) + ]) +fi + +dnl +dnl Check for PIE executable support if using gcc. +dnl This test relies on AC_LANG_WERROR +dnl +if test -n "$GCC"; then + if test -z "$enable_pie"; then + case "$host_os" in + linux*) + # Attempt to build with PIE support + enable_pie="maybe" + ;; + esac + fi + if test -n "$enable_pie"; then + if test "$enable_pie" = "no"; then + AX_CHECK_COMPILE_FLAG([-fno-pie], [ + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-pie" + AX_CHECK_LINK_FLAG([-nopie], [ + PIE_CFLAGS="-fno-pie" + PIE_LDFLAGS="-nopie" + ]) + CFLAGS="$_CFLAGS" + ]) + else + AX_CHECK_COMPILE_FLAG([-fPIE], [ + _CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fPIE" + AX_CHECK_LINK_FLAG([-pie], [ + if test "$enable_pie" = "maybe"; then + SUDO_WORKING_PIE([enable_pie=yes], []) + fi + if test "$enable_pie" = "yes"; then + PIE_CFLAGS="-fPIE" + PIE_LDFLAGS="-Wc,-fPIE -pie" + fi + ]) + CFLAGS="$_CFLAGS" + ]) + fi + fi +fi +if test "$enable_pie" != "yes"; then + # Solaris 11.1 and higher supports tagging binaries to use ASLR + case "$host_os" in + solaris2.1[[1-9]]|solaris2.[[2-9]][[0-9]]) + AX_CHECK_LINK_FLAG([-Wl,-z,aslr], [AX_APPEND_FLAG([-Wl,-z,aslr], [PIE_LDFLAGS])]) + ;; + esac +fi + +dnl +dnl Check for -fstack-protector and -z relro support +dnl This test relies on AC_LANG_WERROR +dnl +if test "$enable_hardening" != "no"; then + AC_CACHE_CHECK([for compiler stack protector support], + [sudo_cv_var_stack_protector], + [ + # Avoid CFLAGS since the compiler might optimize away our test. + # We don't want CPPFLAGS or LIBS to interfere with the test but + # keep LDFLAGS as it may have an rpath needed to find the ssp lib. + _CPPFLAGS="$CPPFLAGS" + _CFLAGS="$CFLAGS" + _LDFLAGS="$LDFLAGS" + _LIBS="$LIBS" + CPPFLAGS= + LIBS= + + sudo_cv_var_stack_protector="-fstack-protector-strong" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], + [[char buf[1024]; buf[1023] = '\0';]]) + ], [], [ + sudo_cv_var_stack_protector="-fstack-protector-all" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], + [[char buf[1024]; buf[1023] = '\0';]]) + ], [], [ + sudo_cv_var_stack_protector="-fstack-protector" + CFLAGS="$sudo_cv_var_stack_protector" + LDFLAGS="$_LDFLAGS $sudo_cv_var_stack_protector" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], + [[char buf[1024]; buf[1023] = '\0';]]) + ], [], [ + sudo_cv_var_stack_protector=no + ]) + ]) + ]) + CPPFLAGS="$_CPPFLAGS" + CFLAGS="$_CFLAGS" + LDFLAGS="$_LDFLAGS" + LIBS="$_LIBS" + ] + ) + if test X"$sudo_cv_var_stack_protector" != X"no"; then + SSP_CFLAGS="$sudo_cv_var_stack_protector" + SSP_LDFLAGS="-Wc,$sudo_cv_var_stack_protector" + fi + AX_CHECK_LINK_FLAG([-Wl,-z,relro], [AX_APPEND_FLAG([-Wl,-z,relro], [LDFLAGS])]) +fi + +dnl +dnl Use passwd auth module? +dnl +case "$with_passwd" in +yes|maybe) + AUTH_OBJS="$AUTH_OBJS getspwuid.lo passwd.lo" + ;; +*) + AC_DEFINE(WITHOUT_PASSWD) + if test -z "$AUTH_OBJS"; then + AC_MSG_ERROR([no authentication methods defined.]) + fi + ;; +esac +AUTH_OBJS=${AUTH_OBJS# } +_AUTH=`echo "$AUTH_OBJS" | sed -e 's/\.lo//g' -e 's/getspwuid *//'` +AC_MSG_NOTICE([using the following authentication methods: $_AUTH]) + +dnl +dnl LIBS may contain duplicates from SUDO_LIBS, SUDOERS_LIBS, or NET_LIBS +dnl +if test -n "$LIBS"; then + L="$LIBS" + LIBS= + for l in ${L}; do + dupe=0 + for sl in ${SUDO_LIBS} ${SUDOERS_LIBS} ${NET_LIBS}; do + test $l = $sl && dupe=1 + done + test $dupe = 0 && LIBS="${LIBS} $l" + done +fi + +dnl +dnl OS-specific initialization +dnl +AC_DEFINE_UNQUOTED(os_init, $OS_INIT, [Define to an OS-specific initialization function or `os_init_common'.]) + +dnl +dnl We add -Wall and -Werror after all tests so they don't cause failures +dnl +if test -n "$GCC"; then + if test X"$enable_warnings" = X"yes" -o X"$with_devel" = X"yes"; then + CFLAGS="${CFLAGS} -Wall -Wsign-compare -Wpointer-arith" + fi + if test X"$enable_werror" = X"yes"; then + CFLAGS="${CFLAGS} -Werror" + fi +fi + +dnl +dnl Skip regress tests and sudoers sanity check if cross compiling. +dnl +CROSS_COMPILING="$cross_compiling" + +dnl +dnl Set exec_prefix +dnl +test "$exec_prefix" = "NONE" && exec_prefix='$(prefix)' + +dnl +dnl Expand exec_prefix in in variables used by the manual pages +dnl +oexec_prefix="$exec_prefix" +if test "$exec_prefix" = '$(prefix)'; then + if test "$prefix" = "NONE"; then + exec_prefix="$ac_default_prefix" + else + exec_prefix="$prefix" + fi +fi + +# Update exec_prefix in noexec_file +_noexec_file= +while test X"$noexec_file" != X"$_noexec_file"; do + _noexec_file="$noexec_file" + eval noexec_file="$_noexec_file" +done + +# Update exec_prefix in sesh_file +_sesh_file= +while test X"$sesh_file" != X"$_sesh_file"; do + _sesh_file="$sesh_file" + eval sesh_file="$_sesh_file" +done + +# Update exec_prefix in plugindir +_plugindir= +while test X"$plugindir" != X"$_plugindir"; do + _plugindir="$plugindir" + eval plugindir="$_plugindir" +done +exec_prefix="$oexec_prefix" + +dnl +dnl Defer setting _PATH_SUDO_NOEXEC, etc until after exec_prefix is set +dnl +if test X"$with_noexec" != X"no"; then + PROGS="${PROGS} sudo_noexec.la" + INSTALL_NOEXEC="install-noexec" + + # Can't use asan with LD_PRELOAD + if test "$enable_asan" != "yes"; then + CHECK_NOEXEC=check_noexec + fi + + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_NOEXEC, "$noexec_file", [The fully qualified pathname of sudo_noexec.so]) +else + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_NOEXEC, NULL) +fi +if test X"$with_selinux" != X"no"; then + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_SESH, "$sesh_file") +else + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_SESH, NULL) +fi +if test X"$enable_shared" != X"no"; then + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_PLUGIN_DIR, "$plugindir/") + AC_DEFINE(ENABLE_SUDO_PLUGIN_API, 1, [Define to 1 to enable sudo's plugin interface.]) +else + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_PLUGIN_DIR, NULL) +fi + +dnl +dnl Add -R options to LDFLAGS, etc. +dnl +if test X"$LDFLAGS_R" != X""; then + LDFLAGS="$LDFLAGS $LDFLAGS_R" +fi +if test X"$SUDOERS_LDFLAGS_R" != X""; then + SUDOERS_LDFLAGS="$SUDOERS_LDFLAGS $SUDOERS_LDFLAGS_R" +fi +if test X"$ZLIB_R" != X""; then + ZLIB="$ZLIB_R $ZLIB" +fi + +dnl +dnl Override default configure dirs for the Makefile +dnl +if test X"$prefix" = X"NONE"; then + test "$mandir" = '${datarootdir}/man' && mandir='$(prefix)/man' +else + test "$mandir" = '${datarootdir}/man' && mandir='$(datarootdir)/man' +fi +test "$bindir" = '${exec_prefix}/bin' && bindir='$(exec_prefix)/bin' +test "$sbindir" = '${exec_prefix}/sbin' && sbindir='$(exec_prefix)/sbin' +test "$libexecdir" = '${exec_prefix}/libexec' && libexecdir='$(exec_prefix)/libexec' +test "$includedir" = '${prefix}/include' && includedir='$(prefix)/include' +test "$datarootdir" = '${prefix}/share' && datarootdir='$(prefix)/share' +test "$localedir" = '${datarootdir}/locale' && localedir='$(datarootdir)/locale' +test "$localstatedir" = '${prefix}/var' && localstatedir='$(prefix)/var' +test "$sysconfdir" = '${prefix}/etc' && sysconfdir='/etc' + +dnl +dnl Substitute into the Makefile and man pages +dnl +if test X"$INIT_SCRIPT" != X""; then + AC_CONFIG_FILES([init.d/$INIT_SCRIPT]) +elif test X"$TMPFILES_D" != X""; then + AC_CONFIG_FILES([init.d/utsudo.conf]) +fi +AC_CONFIG_FILES([Makefile include/Makefile lib/util/Makefile lib/util/util.exp src/sudo_usage.h src/Makefile plugins/sample/Makefile plugins/group_file/Makefile plugins/system_group/Makefile plugins/sudoers/Makefile plugins/sudoers/sudoers]) +AC_OUTPUT + +dnl +dnl Spew any text the user needs to know about +dnl +if test "$with_pam" = "yes"; then + case $host_os in + hpux*) + if test -f /usr/lib/security/libpam_hpsec.so.1; then + AC_MSG_NOTICE([You may wish to add the following line to /etc/pam.conf]) + AC_MSG_NOTICE([sudo session required libpam_hpsec.so.1 bypass_umask bypass_last_login]) + fi + ;; + linux*) + AC_MSG_NOTICE([You will need to customize examples/pam.conf and install it as /etc/pam.d/sudo]) + ;; + esac +fi +dnl +dnl Warn user if they may need to clear rundir manually. +dnl +case "$rundir" in + /run/*|/var/run/*) + clear_rundir=0 + ;; + *) + clear_rundir=1 + ;; +esac +if test $clear_rundir -eq 1; then + AC_MSG_NOTICE([Warning: the $rundir/ts directory must be cleared at boot time.]) + AC_MSG_NOTICE([ You may need to create a startup item to do this.]) +fi + +dnl +dnl Autoheader templates +dnl +AH_TEMPLATE(CLASSIC_INSULTS, [Define to 1 if you want the insults from the "classic" version sudo.]) +AH_TEMPLATE(CSOPS_INSULTS, [Define to 1 if you want insults culled from the twisted minds of CSOps.]) +AH_TEMPLATE(DONT_LEAK_PATH_INFO, [Define to 1 if you want sudo to display "command not allowed" instead of "command not found" when a command cannot be found.]) +AH_TEMPLATE(ENV_DEBUG, [Define to 1 to enable environment function debugging.]) +AH_TEMPLATE(ENV_EDITOR, [Define to 1 if you want visudo to honor the EDITOR and VISUAL env variables.]) +AH_TEMPLATE(FQDN, [Define to 1 if you want to require fully qualified hosts in sudoers.]) +AH_TEMPLATE(ENV_RESET, [Define to 1 to enable environment resetting by default.]) +AH_TEMPLATE(PYTHON_INSULTS, [Define to 1 if you want insults from "Monty Python's Flying Circus".]) +AH_TEMPLATE(GOONS_INSULTS, [Define to 1 if you want insults from the "Goon Show".]) +AH_TEMPLATE(HAL_INSULTS, [Define to 1 if you want 2001-like insults.]) +AH_TEMPLATE(HAVE_AFS, [Define to 1 if you use AFS.]) +AH_TEMPLATE(HAVE_AIXAUTH, [Define to 1 if you use AIX general authentication.]) +AH_TEMPLATE(HAVE_BSD_AUTH_H, [Define to 1 if you use BSD authentication.]) +AH_TEMPLATE(HAVE_BSM_AUDIT, [Define to 1 to enable BSM audit support.]) +AH_TEMPLATE(HAVE_DCE, [Define to 1 if you use OSF DCE.]) +AH_TEMPLATE(HAVE_DD_FD, [Define to 1 if your `DIR' contains dd_fd.]) +AH_TEMPLATE(HAVE_DIRFD, [Define to 1 if you have the `dirfd' function or macro.]) +AH_TEMPLATE(HAVE_DISPCRYPT, [Define to 1 if you have the `dispcrypt' function.]) +AH_TEMPLATE(HAVE_DLOPEN, [Define to 1 if you have the `dlopen' function.]) +AH_TEMPLATE(HAVE_FCNTL_CLOSEM, [Define to 1 if your system has the F_CLOSEM fcntl.]) +AH_TEMPLATE(HAVE_FNMATCH, [Define to 1 if you have the `fnmatch' function.]) +AH_TEMPLATE(HAVE_FWTK, [Define to 1 if you use the FWTK authsrv daemon.]) +AH_TEMPLATE(HAVE_GETPRPWNAM, [Define to 1 if you have the `getprpwnam' function. (SecureWare-style shadow passwords).]) +AH_TEMPLATE(HAVE_GETPWNAM_SHADOW, [Define to 1 if you have the `getpwnam_shadow' function.]) +AH_TEMPLATE(HAVE_GETSPNAM, [Define to 1 if you have the `getspnam' function (SVR4-style shadow passwords).]) +AH_TEMPLATE(HAVE_GSS_KRB5_CCACHE_NAME, [Define to 1 if you have the `gss_krb5_ccache_name' function.]) +AH_TEMPLATE(HAVE_HEIMDAL, [Define to 1 if your Kerberos is Heimdal.]) +AH_TEMPLATE(HAVE_INET_NTOP, [Define to 1 if you have the `inet_ntop' function.]) +AH_TEMPLATE(HAVE_INET_PTON, [Define to 1 if you have the `inet_pton' function.]) +AH_TEMPLATE(HAVE_ISCOMSEC, [Define to 1 if you have the `iscomsec' function. (HP-UX >= 10.x check for shadow enabled).]) +AH_TEMPLATE(HAVE_KERB5, [Define to 1 if you use Kerberos V.]) +AH_TEMPLATE(HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC, [Define to 1 if you have the `krb5_get_init_creds_opt_alloc' function.]) +AH_TEMPLATE(HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS, [Define to 1 if your `krb5_get_init_creds_opt_free' function takes two arguments.]) +AH_TEMPLATE(HAVE_KRB5_INIT_SECURE_CONTEXT, [Define to 1 if you have the `krb5_init_secure_context' function.]) +AH_TEMPLATE(HAVE_KRB5_VERIFY_USER, [Define to 1 if you have the `krb5_verify_user' function.]) +AH_TEMPLATE(HAVE_LBER_H, [Define to 1 if your LDAP needs . (OpenLDAP does not).]) +AH_TEMPLATE(HAVE_LDAP, [Define to 1 if you use LDAP for sudoers.]) +AH_TEMPLATE(HAVE_LIBINTL_H, [Define to 1 if you have the header file.]) +AH_TEMPLATE(HAVE_LINUX_AUDIT, [Define to 1 to enable Linux audit support.]) +AH_TEMPLATE(HAVE_SSSD, [Define to 1 to enable SSSD support.]) +AH_TEMPLATE(HAVE_OPIE, [Define to 1 if you use NRL OPIE.]) +AH_TEMPLATE(HAVE_OPTRESET, [Define to 1 if you have the `optreset' symbol.]) +AH_TEMPLATE(HAVE_PAM, [Define to 1 if you use PAM authentication.]) +AH_TEMPLATE(HAVE_PAM_LOGIN, [Define to 1 if you use a specific PAM session for sudo -i.]) +AH_TEMPLATE(HAVE_PROJECT_H, [Define to 1 if you have the header file.]) +AH_TEMPLATE(HAVE_SECURID, [Define to 1 if you use SecurID for authentication.]) +AH_TEMPLATE(HAVE_SELINUX, [Define to 1 to enable SELinux RBAC support.]) +AH_TEMPLATE(HAVE_SETKEYCREATECON, [Define to 1 if you have the `setkeycreatecon' function.]) +AH_TEMPLATE(HAVE_SHL_LOAD, [Define to 1 if you have the `shl_load' function.]) +AH_TEMPLATE(HAVE_SKEY, [Define to 1 if you use S/Key.]) +AH_TEMPLATE(HAVE_SKEYACCESS, [Define to 1 if your S/Key library has skeyaccess().]) +AH_TEMPLATE(HAVE_RFC1938_SKEYCHALLENGE, [Define to 1 if the skeychallenge() function is RFC1938-compliant and takes 4 arguments.]) +AH_TEMPLATE(HAVE_SOLARIS_AUDIT, [Define to 1 to enable Solaris audit support.]) +AH_TEMPLATE(HAVE_ST__TIM, [Define to 1 if your struct stat uses an st__tim union.]) +AH_TEMPLATE(HAVE_ST_MTIM, [Define to 1 if your struct stat has an st_mtim member.]) +AH_TEMPLATE(HAVE_ST_MTIMESPEC, [Define to 1 if your struct stat has an st_mtimespec member.]) +AH_TEMPLATE(HAVE_ST_NMTIME, [Define to 1 if your struct stat has an st_nmtime member.]) +AH_TEMPLATE(HAVE___PROGNAME, [Define to 1 if your crt0.o defines the __progname symbol for you.]) +AH_TEMPLATE(HOST_IN_LOG, [Define to 1 if you want the hostname to be entered into the log file.]) +AH_TEMPLATE(IGNORE_DOT_PATH, [Define to 1 if you want to ignore '.' and empty PATH elements.]) +AH_TEMPLATE(LOGGING, [Define to SLOG_SYSLOG, SLOG_FILE, or SLOG_BOTH.]) +AH_TEMPLATE(LONG_OTP_PROMPT, [Define to 1 if you want a two line OTP (S/Key or OPIE) prompt.]) +AH_TEMPLATE(NO_AUTHENTICATION, [Define to 1 if you don't want sudo to prompt for a password by default.]) +AH_TEMPLATE(NO_LEAKS, [Define to 1 if you want sudo to free up memory before exiting.]) +AH_TEMPLATE(NO_LECTURE, [Define to 1 if you don't want users to get the lecture the first they user sudo.]) +AH_TEMPLATE(NO_PAM_SESSION, [Define to 1 if you don't want to use sudo's PAM session support.]) +AH_TEMPLATE(NO_ROOT_MAILER, [Define to avoid runing the mailer as root.]) +AH_TEMPLATE(NO_ROOT_SUDO, [Define to 1 if root should not be allowed to use sudo.]) +AH_TEMPLATE(TIMESTAMP_TYPE, [Define to global, ppid or tty to set the default timestamp record type.]) +AH_TEMPLATE(OFFENSIVE_INSULTS, [Define to 1 to include offensive insults from the classic version of sudo.]) +AH_TEMPLATE(PREFER_PORTABLE_GETCWD, [Define to 1 to enable replacement getcwd if system getcwd is broken.]) +AH_TEMPLATE(SECURE_PATH, [A colon-separated list of directories to override the user's PATH with.]) +AH_TEMPLATE(SEND_MAIL_WHEN_NOT_OK, [Define to 1 to send mail when the user is not allowed to run a command.]) +AH_TEMPLATE(SEND_MAIL_WHEN_NO_HOST, [Define to 1 to send mail when the user is not allowed to run sudo on this host.]) +AH_TEMPLATE(SEND_MAIL_WHEN_NO_USER, [Define to 1 to send mail when the user is not in the sudoers file.]) +AH_TEMPLATE(SHELL_IF_NO_ARGS, [Define to 1 if you want sudo to start a shell if given no arguments.]) +AH_TEMPLATE(SHELL_SETS_HOME, [Define to 1 if you want sudo to set $HOME in shell mode.]) +AH_TEMPLATE(STATIC_SUDOERS_PLUGIN, [Define to 1 to compile the sudoers plugin statically into the sudo binary.]) +AH_TEMPLATE(STUB_LOAD_INTERFACES, [Define to 1 if the code in interfaces.c does not compile for you.]) +AH_TEMPLATE(UMASK_OVERRIDE, [Define to 1 to use the umask specified in sudoers even when it is less restrictive than the invoking user's.]) +AH_TEMPLATE(USE_ADMIN_FLAG, [Define to 1 if you want to create ~/.sudo_as_admin_successful if the user is in the admin group the first time they run sudo.]) +AH_TEMPLATE(USE_INSULTS, [Define to 1 if you want to insult the user for entering an incorrect password.]) +AH_TEMPLATE(USE_STOW, [Define to 1 if you use GNU stow packaging.]) +AH_TEMPLATE(WITHOUT_PASSWD, [Define to avoid using the passwd/shadow file for authentication.]) +AH_TEMPLATE(clockid_t, [Define to `int' if does not define.]) +AH_TEMPLATE(sig_atomic_t, [Define to `int' if does not define.]) +AH_TEMPLATE(socklen_t, [Define to `unsigned int' if doesn't define.]) +AH_TEMPLATE(HAVE___FUNC__, [Define to 1 if the compiler supports the C99 __func__ variable.]) +AH_TEMPLATE(HAVE___INTERPOSE, [Define to 1 if you have dyld with __interpose attribute support.]) +AH_TEMPLATE(SUDO_KRB5_INSTANCE, [An instance string to append to the username (separated by a slash) for Kerberos V authentication.]) +AH_TEMPLATE(RTLD_PRELOAD_VAR, [The environment variable that controls preloading of dynamic objects.]) +AH_TEMPLATE(RTLD_PRELOAD_ENABLE_VAR, [An extra environment variable that is required to enable preloading (if any).]) +AH_TEMPLATE(RTLD_PRELOAD_DELIM, [The delimiter to use when defining multiple preloaded objects.]) +AH_TEMPLATE(RTLD_PRELOAD_DEFAULT, [The default value of preloaded objects (if any).]) +AH_TEMPLATE(HAVE_DSO_VISIBILITY, [Define to 1 if the compiler supports the __visibility__ attribute.]) +AH_TEMPLATE(HAVE_SYS_SIGABBREV, [Define to 1 if your libc has the `sys_sigabbrev' symbol.]) +AH_TEMPLATE(HAVE_NSS_SEARCH, [Define to 1 if you have the `nss_search' function.]) +AH_TEMPLATE(HAVE__NSS_INITF_GROUP, [Define to 1 if you have the `_nss_initf_group' function.]) +AH_TEMPLATE(HAVE___NSS_INITF_GROUP, [Define to 1 if you have the `__nss_initf_group' function.]) +AH_TEMPLATE(HAVE__NSS_XBYY_BUF_ALLOC, [Define to 1 if you have the `_nss_XbyY_buf_alloc' function.]) +AH_TEMPLATE(HAVE___NSS_XBYY_BUF_ALLOC, [Define to 1 if you have the `__nss_XbyY_buf_alloc' function.]) +AH_TEMPLATE(NEED_RESOLV_H, [Define to 1 if resolv.h must be included to get the `inet_ntop' or `inet_pton' function prototypes.]) +AH_TEMPLATE(HAVE_STRNLEN, [Define to 1 if you have the `strnlen' function.]) +AH_TEMPLATE(PAM_SUN_CODEBASE, [Define to 1 if your system uses a Solaris-derived PAM and not Linux-PAM or OpenPAM.]) +AH_TEMPLATE(HAVE_KINFO_PROC_44BSD, [Define to 1 if your system has a 4.4BSD-style kinfo_proc struct.]) +AH_TEMPLATE(HAVE_KINFO_PROC_FREEBSD, [Define to 1 if your system has a FreeBSD-style kinfo_proc struct.]) +AH_TEMPLATE(HAVE_KINFO_PROC2_NETBSD, [Define to 1 if your system has a NetBSD-style kinfo_proc2 struct.]) +AH_TEMPLATE(HAVE_KINFO_PROC_OPENBSD, [Define to 1 if your system has an OpenBSD-style kinfo_proc struct.]) +AH_TEMPLATE(HAVE_OPENSSL, [Define to 1 if you are using OpenSSL's sha2 functions.]) +AH_TEMPLATE(HAVE_GCRYPT, [Define to 1 if you are using gcrypt's sha2 functions.]) +dnl +dnl Bits to copy verbatim into config.h.in +dnl +AH_TOP([#ifndef SUDO_CONFIG_H +#define SUDO_CONFIG_H]) + +AH_BOTTOM([/* BSD compatibility on some SVR4 systems. */ +#ifdef __svr4__ +# define BSD_COMP +#endif + +/* Enable BSD extensions on systems that have them. */ +#ifndef _BSD_SOURCE +# undef _BSD_SOURCE +#endif + +/* Enable BSD types on IRIX. */ +#ifndef _BSD_TYPES +# undef _BSD_TYPES +#endif + +/* Enable Linux-compatible extensions on AIX. */ +#ifndef _LINUX_SOURCE_COMPAT +# undef _LINUX_SOURCE_COMPAT +#endif + +/* Enable prototypes in GCC fixed includes on older systems. */ +#ifndef __USE_FIXED_PROTOTYPES__ +# undef __USE_FIXED_PROTOTYPES__ +#endif + +/* Enable XPG4v2 extensions to POSIX, needed for MSG_WAITALL on older HP-UX. */ +#ifndef _XOPEN_SOURCE_EXTENDED +# undef _XOPEN_SOURCE_EXTENDED +#endif + +/* Enable reentrant versions of the standard C API (obsolete). */ +#ifndef _REENTRANT +# undef _REENTRANT +#endif + +/* Enable "safer" versions of the standard C API (ISO C11). */ +#ifndef __STDC_WANT_LIB_EXT1__ +# undef __STDC_WANT_LIB_EXT1__ +#endif + +/* Prevent static analyzers from genering bogus memory leak warnings. */ +#if defined(__COVERITY__) && !defined(NO_LEAKS) +# define NO_LEAKS +#endif + +#endif /* SUDO_CONFIG_H */]) diff --git a/utsudo-0.0.2/doc/LICENSE b/utsudo-0.0.2/doc/LICENSE new file mode 100644 index 0000000..46dd8f2 --- /dev/null +++ b/utsudo-0.0.2/doc/LICENSE @@ -0,0 +1,236 @@ +Sudo is distributed under the following license: + + Copyright (c) 1994-1996, 1998-2019 + Todd C. Miller + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Sponsored in part by the Defense Advanced Research Projects + Agency (DARPA) and Air Force Research Laboratory, Air Force + Materiel Command, USAF, under agreement number F39502-99-1-0512. + +The file redblack.c bears the following license: + + Copyright (c) 2001 Emin Martinian + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that neither the name of Emin + Martinian nor the names of any contributors are be used to endorse or + promote products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The file reallocarray.c bears the following license: + + Copyright (c) 2008 Otto Moerbeek + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +The files getcwd.c, glob.c, glob.h, snprintf.c and sudo_queue.h bear the +following license: + + Copyright (c) 1989, 1990, 1991, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +The file fnmatch.c bears the following license: + + Copyright (c) 2011, VMware, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the VMware, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The file getopt_long.c bears the following license: + + Copyright (c) 2000 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Dieter Baron and Thomas Klausner. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +The file inet_pton.c bears the following license: + + Copyright (c) 1996 by Internet Software Consortium. + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + +The file arc4random.c bears the following license: + + Copyright (c) 1996, David Mazieres + Copyright (c) 2008, Damien Miller + Copyright (c) 2013, Markus Friedl + Copyright (c) 2014, Theo de Raadt + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +The file arc4random_uniform.c bears the following license: + + Copyright (c) 2008, Damien Miller + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +The file getentropy.c bears the following license: + + Copyright (c) 2014 Theo de Raadt + Copyright (c) 2014 Bob Beck + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +The embedded copy of zlib bears the following license: + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu diff --git a/utsudo-0.0.2/include/Makefile.in b/utsudo-0.0.2/include/Makefile.in new file mode 100644 index 0000000..d5b9758 --- /dev/null +++ b/utsudo-0.0.2/include/Makefile.in @@ -0,0 +1,100 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2015, 2017-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +includedir = @includedir@ +cross_compiling = @CROSS_COMPILING@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +all: + +depend: + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file include/Makefile + +.SUFFIXES: .h + +pre-install: + +install: install-includes + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(includedir) + +install-binaries: + +install-doc: + +install-includes: install-dirs + $(INSTALL) $(INSTALL_OWNER) -m 0644 $(srcdir)/sudo_plugin.h $(DESTDIR)$(includedir) + +install-plugin: + +uninstall: + -rm -f $(DESTDIR)$(includedir)/sudo_plugin.h + +splint: + +cppcheck: + +pvs-log-files: + +pvs-studio: + +check: + +clean: + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile + +clobber: distclean + +realclean: distclean + +cleandir: distclean diff --git a/utsudo-0.0.2/include/compat/charclass.h b/utsudo-0.0.2/include/compat/charclass.h new file mode 100644 index 0000000..77c8d7f --- /dev/null +++ b/utsudo-0.0.2/include/compat/charclass.h @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2008, 2010 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * POSIX character class support for fnmatch() and glob(). + */ +static struct cclass { + const char *name; + int (*isctype)(int); +} cclasses[] = { + { "alnum", isalnum }, + { "alpha", isalpha }, + { "blank", isblank }, + { "cntrl", iscntrl }, + { "digit", isdigit }, + { "graph", isgraph }, + { "lower", islower }, + { "print", isprint }, + { "punct", ispunct }, + { "space", isspace }, + { "upper", isupper }, + { "xdigit", isxdigit }, + { NULL, NULL } +}; + +#define NCCLASSES (nitems(cclasses) - 1) diff --git a/utsudo-0.0.2/include/compat/endian.h b/utsudo-0.0.2/include/compat/endian.h new file mode 100644 index 0000000..d3c5ca9 --- /dev/null +++ b/utsudo-0.0.2/include/compat/endian.h @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef COMPAT_ENDIAN_H +#define COMPAT_ENDIAN_H + +#ifndef BYTE_ORDER +# undef LITTLE_ENDIAN +# define LITTLE_ENDIAN 1234 +# undef BIG_ENDIAN +# define BIG_ENDIAN 4321 +# undef UNKNOWN_ENDIAN +# define UNKNOWN_ENDIAN 0 + +/* + * Attempt to guess endianness. + * Solaris may define _LITTLE_ENDIAN and _BIG_ENDIAN to 1 + * HP-UX may define __LITTLE_ENDIAN__ and __BIG_ENDIAN__ to 1 + * Otherwise, check for cpu-specific cpp defines. + * Note that some CPUs are bi-endian, including: arm, powerpc, alpha, + * sparc64, mips, hppa, sh4 and ia64. + * We just check for the most common uses. + */ + +# if defined(__BYTE_ORDER) +# define BYTE_ORDER __BYTE_ORDER +# elif defined(_BYTE_ORDER) +# define BYTE_ORDER _BYTE_ORDER +# elif defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) +# define BYTE_ORDER LITTLE_ENDIAN +# elif defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(__alpha__) || defined(__alpha) || defined(__amd64) || \ + defined(BIT_ZERO_ON_RIGHT) || defined(i386) || defined(__i386) || \ + defined(MIPSEL) || defined(_MIPSEL) || defined(ns32000) || \ + defined(__ns3200) || defined(sun386) || defined(vax) || \ + defined(__vax) || defined(__x86__) || \ + (defined(sun) && defined(__powerpc)) || \ + (!defined(__hpux) && defined(__ia64)) +# define BYTE_ORDER LITTLE_ENDIAN +# elif defined(__68k__) || defined(apollo) || defined(BIT_ZERO_ON_LEFT) || \ + defined(__convex__) || defined(_CRAY) || defined(DGUX) || \ + defined(__hppa) || defined(__hp9000) || defined(__hp9000s300) || \ + defined(__hp9000s700) || defined(__hp3000s900) || \ + defined(ibm032) || defined(ibm370) || defined(_IBMR2) || \ + defined(is68k) || defined(mc68000) || defined(m68k) || \ + defined(__m68k) || defined(m88k) || defined(__m88k) || \ + defined(MIPSEB) || defined(_MIPSEB) || defined(MPE) || \ + defined(pyr) || defined(__powerpc) || defined(__powerpc__) || \ + defined(sel) || defined(__sparc) || defined(__sparc__) || \ + defined(tahoe) || (defined(__hpux) && defined(__ia64)) || \ + (defined(sun) && defined(__powerpc)) +# define BYTE_ORDER BIG_ENDIAN +# else +# define BYTE_ORDER UNKNOWN_ENDIAN +# endif +#endif /* BYTE_ORDER */ + +#endif /* COMPAT_ENDIAN_H */ diff --git a/utsudo-0.0.2/include/compat/fnmatch.h b/utsudo-0.0.2/include/compat/fnmatch.h new file mode 100644 index 0000000..41cd3da --- /dev/null +++ b/utsudo-0.0.2/include/compat/fnmatch.h @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef COMPAT_FNMATCH_H +#define COMPAT_FNMATCH_H + +#define FNM_NOMATCH 1 /* String does not match pattern */ + +#define FNM_PATHNAME (1 << 0) /* Globbing chars don't match '/' */ +#define FNM_PERIOD (1 << 1) /* Leading '.' in string must exactly */ +#define FNM_NOESCAPE (1 << 2) /* Backslash treated as ordinary char */ +#define FNM_LEADING_DIR (1 << 3) /* Only match the leading directory */ +#define FNM_CASEFOLD (1 << 4) /* Case insensitive matching */ + +__dso_public int sudo_fnmatch(const char *pattern, const char *string, int flags); + +#define fnmatch(_a, _b, _c) sudo_fnmatch((_a), (_b), (_c)) + +#endif /* COMPAT_FNMATCH_H */ diff --git a/utsudo-0.0.2/include/compat/getaddrinfo.h b/utsudo-0.0.2/include/compat/getaddrinfo.h new file mode 100644 index 0000000..6f2f203 --- /dev/null +++ b/utsudo-0.0.2/include/compat/getaddrinfo.h @@ -0,0 +1,83 @@ +/* + * Replacement implementation of getaddrinfo. + * + * This is an implementation of the getaddrinfo family of functions for + * systems that lack it, so that code can use getaddrinfo always. It provides + * IPv4 support only; for IPv6 support, a native getaddrinfo implemenation is + * required. + * + * The canonical version of this file is maintained in the rra-c-util package, + * which can be found at . + * + * Written by Russ Allbery + * + * The authors hereby relinquish any claim to any copyright that they may have + * in this work, whether granted under contract or by operation of law or + * international treaty, and hereby commit to the public, at large, that they + * shall not, at any time in the future, seek to enforce any copyright in this + * work against any person or entity, or prevent any person or entity from + * copying, publishing, distributing or creating derivative works of this + * work. + */ + +#ifndef COMPAT_GETADDRINFO_H +#define COMPAT_GETADDRINFO_H + +#include + +/* Skip this entire file if a system getaddrinfo was detected. */ +#ifndef HAVE_GETADDRINFO + +/* OpenBSD likes to have sys/types.h included before sys/socket.h. */ +#include +#include + +/* The struct returned by getaddrinfo, from RFC 3493. */ +struct addrinfo { + int ai_flags; /* AI_PASSIVE, AI_CANONNAME, .. */ + int ai_family; /* AF_xxx */ + int ai_socktype; /* SOCK_xxx */ + int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ + socklen_t ai_addrlen; /* Length of ai_addr */ + char *ai_canonname; /* Canonical name for nodename */ + struct sockaddr *ai_addr; /* Binary address */ + struct addrinfo *ai_next; /* Next structure in linked list */ +}; + +/* Constants for ai_flags from RFC 3493, combined with binary or. */ +#define AI_PASSIVE 0x0001 +#define AI_CANONNAME 0x0002 +#define AI_NUMERICHOST 0x0004 +#define AI_NUMERICSERV 0x0008 +#define AI_V4MAPPED 0x0010 +#define AI_ALL 0x0020 +#define AI_ADDRCONFIG 0x0040 + +/* Error return codes from RFC 3493. */ +#define EAI_AGAIN 1 /* Temporary name resolution failure */ +#define EAI_BADFLAGS 2 /* Invalid value in ai_flags parameter */ +#define EAI_FAIL 3 /* Permanent name resolution failure */ +#define EAI_FAMILY 4 /* Address family not recognized */ +#define EAI_MEMORY 5 /* Memory allocation failure */ +#define EAI_NONAME 6 /* nodename or servname unknown */ +#define EAI_SERVICE 7 /* Service not recognized for socket type */ +#define EAI_SOCKTYPE 8 /* Socket type not recognized */ +#define EAI_SYSTEM 9 /* System error occurred, see errno */ +#define EAI_OVERFLOW 10 /* An argument buffer overflowed */ + +/* Function prototypes. */ +__dso_public int sudo_getaddrinfo(const char *nodename, const char *servname, + const struct addrinfo *hints, struct addrinfo **res); +__dso_public void sudo_freeaddrinfo(struct addrinfo *ai); +__dso_public const char *sudo_gai_strerror(int ecode); + +/* Map sudo_* to RFC 3493 names. */ +#undef getaddrinfo +#define getaddrinfo(_a, _b, _c, _d) sudo_getaddrinfo((_a), (_b), (_c), (_d)) +#undef freeaddrinfo +#define freeaddrinfo(_a) sudo_freeaddrinfo((_a)) +#undef gai_strerror +#define gai_strerror(_a) sudo_gai_strerror((_a)) + +#endif /* !HAVE_GETADDRINFO */ +#endif /* COMPAT_GETADDRINFO_H */ diff --git a/utsudo-0.0.2/include/compat/getopt.h b/utsudo-0.0.2/include/compat/getopt.h new file mode 100644 index 0000000..d83577e --- /dev/null +++ b/utsudo-0.0.2/include/compat/getopt.h @@ -0,0 +1,83 @@ +/* $OpenBSD: getopt.h,v 1.2 2008/06/26 05:42:04 ray Exp $ */ +/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ +/* $FreeBSD: head/include/getopt.h 203963 2010-02-16 19:28:10Z imp $ */ + +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef COMPAT_GETOPT_H +#define COMPAT_GETOPT_H + +/* + * GNU-like getopt_long()/getopt_long_only() with 4.4BSD optreset extension. + */ +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +struct option { + /* name of long option */ + const char *name; + /* + * one of no_argument, required_argument, and optional_argument: + * whether option takes an argument + */ + int has_arg; + /* if not NULL, set *flag to val when option found */ + int *flag; + /* if flag not NULL, value to set *flag to; else return value */ + int val; +}; + +__dso_public int sudo_getopt_long(int, char * const *, const char *, + const struct option *, int *); +#undef getopt_long +#define getopt_long(_a, _b, _c, _d, _e) \ + sudo_getopt_long((_a), (_b), (_c), (_d), (_e)) + +__dso_public int sudo_getopt_long_only(int, char * const *, const char *, + const struct option *, int *); +#undef getopt_long_only +#define getopt_long_only(_a, _b, _c, _d, _e) \ + sudo_getopt_long_only((_a), (_b), (_c), (_d), (_e)) +#if 0 +__dso_public int sudo_getopt(int, char * const [], const char *); +#undef getopt +#define getopt(_a, _b, _c) sudo_getopt((_a), (_b), (_c)) +#endif + +extern char *optarg; /* getopt(3) external variables */ +extern int opterr; +extern int optind; +extern int optopt; +extern int optreset; + +#endif /* !COMPAT_GETOPT_H */ diff --git a/utsudo-0.0.2/include/compat/glob.h b/utsudo-0.0.2/include/compat/glob.h new file mode 100644 index 0000000..20dd0c5 --- /dev/null +++ b/utsudo-0.0.2/include/compat/glob.h @@ -0,0 +1,78 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)glob.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef COMPAT_GLOB_H +#define COMPAT_GLOB_H + +struct stat; +typedef struct { + int gl_pathc; /* Count of total paths so far. */ + int gl_matchc; /* Count of paths matching pattern. */ + int gl_offs; /* Reserved at beginning of gl_pathv. */ + int gl_flags; /* Copy of flags parameter to glob. */ + char **gl_pathv; /* List of paths matching pattern. */ + /* Copy of errfunc parameter to glob. */ + int (*gl_errfunc)(const char *, int); +} glob_t; + +/* Flags */ +#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ +#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ +#define GLOB_ERR 0x0004 /* Return on error. */ +#define GLOB_MARK 0x0008 /* Append / to matching directories. */ +#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ +#define GLOB_NOSORT 0x0020 /* Don't sort. */ +#define GLOB_NOESCAPE 0x0040 /* Disable backslash escaping. */ + +/* Non-POSIX extensions */ +#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ +#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ +#define GLOB_TILDE 0x0200 /* Expand tilde names from the passwd file. */ +#define GLOB_LIMIT 0x0400 /* Limit pattern match output to ARG_MAX */ + +/* Error values returned by glob(3) */ +#define GLOB_NOSPACE (-1) /* Malloc call failed. */ +#define GLOB_ABORTED (-2) /* Unignored error. */ +#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK not set. */ +#define GLOB_NOSYS (-4) /* Function not supported. */ + +__dso_public int sudo_glob(const char *, int, int (*)(const char *, int), glob_t *); +__dso_public void sudo_globfree(glob_t *); + +#define glob(_a, _b, _c, _d) sudo_glob((_a), (_b), (_c), (_d)) +#define globfree(_a) sudo_globfree((_a)) + +#endif /* !COMPAT_GLOB_H */ diff --git a/utsudo-0.0.2/include/compat/nss_dbdefs.h b/utsudo-0.0.2/include/compat/nss_dbdefs.h new file mode 100644 index 0000000..849bba4 --- /dev/null +++ b/utsudo-0.0.2/include/compat/nss_dbdefs.h @@ -0,0 +1,108 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef COMPAT_NSS_DBDEFS_H +#define COMPAT_NSS_DBDEFS_H + +/* + * Bits of nss_dbdefs.h and nss_common.h needed to implement + * getgrouplist(3) using nss_search(3). + * + * HP-UX does not ship those headers so we need this compatibility header. + * It may also work on other systems that use a Solaris-derived nsswitch + * API. + */ + +#ifdef NEED_HPUX_MUTEX +# include +#endif + +typedef enum { + NSS_SUCCESS, + NSS_NOTFOUND, + NSS_UNAVAIL +} nss_status_t; + +typedef struct nss_db_params { + const char *name; + const char *config_name; + const char *default_config; + unsigned int max_active_per_src; + unsigned int max_dormant_per_src; + int flags; + void *finders; + void *private; + void (*cleanup)(struct nss_db_params *); +} nss_db_params_t; + +struct nss_groupsbymem { + const char *username; + gid_t *gid_array; + int maxgids; + int force_slow_way; + int (*str2ent)(const char *, int, void *, char *, int); + nss_status_t (*process_cstr)(const char *, int, struct nss_groupsbymem *); + int numgids; +}; + +typedef struct { + void *result; /* group struct to fill in. */ + char *buffer; /* string buffer for above */ + size_t buflen; /* string buffer size */ +} nss_XbyY_buf_t; + +typedef struct { + void *state; /* really struct nss_db_state * */ +#ifdef NEED_HPUX_MUTEX + lwp_mutex_t lock; +#endif +} nss_db_root_t; + +#ifdef NEED_HPUX_MUTEX +# define NSS_DB_ROOT_INIT { 0, LWP_MUTEX_INITIALIZER } +#else +# define NSS_DB_ROOT_INIT { 0 } +#endif +# define DEFINE_NSS_DB_ROOT(name) nss_db_root_t name = NSS_DB_ROOT_INIT + +/* Backend function to find all groups a user belongs to for initgroups(). */ +#define NSS_DBOP_GROUP_BYMEMBER 6 + +/* str2ent function return values */ +#define NSS_STR_PARSE_SUCCESS 0 +#define NSS_STR_PARSE_PARSE 1 +#define NSS_STR_PARSE_ERANGE 2 + +/* Max length for an /etc/group file line. */ +#define NSS_BUFLEN_GROUP 8192 + +/* HP-UX uses an extra underscore for these functions. */ +#ifdef HAVE___NSS_INITF_GROUP +# define _nss_initf_group __nss_initf_group +#endif +#ifdef HAVE___NSS_XBYY_BUF_ALLOC +# define _nss_XbyY_buf_alloc __nss_XbyY_buf_alloc +# define _nss_XbyY_buf_free __nss_XbyY_buf_free +#endif + +typedef void (*nss_db_initf_t)(nss_db_params_t *); +extern nss_status_t nss_search(nss_db_root_t *, nss_db_initf_t, int, void *); +extern nss_XbyY_buf_t *_nss_XbyY_buf_alloc(int, int); +extern void _nss_XbyY_buf_free(nss_XbyY_buf_t *); + +#endif /* COMPAT_NSS_DBDEFS_H */ diff --git a/utsudo-0.0.2/include/compat/sha2.h b/utsudo-0.0.2/include/compat/sha2.h new file mode 100644 index 0000000..463c33a --- /dev/null +++ b/utsudo-0.0.2/include/compat/sha2.h @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Derived from the public domain SHA-1 and SHA-2 implementations + * by Steve Reid and Wei Dai respectively. + */ + +#ifndef COMPAT_SHA2_H +#define COMPAT_SHA2_H + +#define SHA224_BLOCK_LENGTH 64 +#define SHA224_DIGEST_LENGTH 28 +#define SHA224_DIGEST_STRING_LENGTH (SHA224_DIGEST_LENGTH * 2 + 1) + +#define SHA256_BLOCK_LENGTH 64 +#define SHA256_DIGEST_LENGTH 32 +#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) + +#define SHA384_BLOCK_LENGTH 128 +#define SHA384_DIGEST_LENGTH 48 +#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1) + +#define SHA512_BLOCK_LENGTH 128 +#define SHA512_DIGEST_LENGTH 64 +#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1) + +typedef struct { + union { + uint32_t st32[8]; /* sha224 and sha256 */ + uint64_t st64[8]; /* sha384 and sha512 */ + } state; + uint64_t count[2]; + uint8_t buffer[SHA512_BLOCK_LENGTH]; +} SHA2_CTX; + +__dso_public void sudo_SHA224Init(SHA2_CTX *ctx); +__dso_public void sudo_SHA224Pad(SHA2_CTX *ctx); +__dso_public void sudo_SHA224Transform(uint32_t state[8], const uint8_t buffer[SHA224_BLOCK_LENGTH]); +__dso_public void sudo_SHA224Update(SHA2_CTX *ctx, const uint8_t *data, size_t len); +__dso_public void sudo_SHA224Final(uint8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *ctx); + +#define SHA224Init sudo_SHA224Init +#define SHA224Pad sudo_SHA224Pad +#define SHA224Transform sudo_SHA224Transform +#define SHA224Update sudo_SHA224Update +#define SHA224Final sudo_SHA224Final + +__dso_public void sudo_SHA256Init(SHA2_CTX *ctx); +__dso_public void sudo_SHA256Pad(SHA2_CTX *ctx); +__dso_public void sudo_SHA256Transform(uint32_t state[8], const uint8_t buffer[SHA256_BLOCK_LENGTH]); +__dso_public void sudo_SHA256Update(SHA2_CTX *ctx, const uint8_t *data, size_t len); +__dso_public void sudo_SHA256Final(uint8_t digest[SHA256_DIGEST_LENGTH], SHA2_CTX *ctx); + +#define SHA256Init sudo_SHA256Init +#define SHA256Pad sudo_SHA256Pad +#define SHA256Transform sudo_SHA256Transform +#define SHA256Update sudo_SHA256Update +#define SHA256Final sudo_SHA256Final + +__dso_public void sudo_SHA384Init(SHA2_CTX *ctx); +__dso_public void sudo_SHA384Pad(SHA2_CTX *ctx); +__dso_public void sudo_SHA384Transform(uint64_t state[8], const uint8_t buffer[SHA384_BLOCK_LENGTH]); +__dso_public void sudo_SHA384Update(SHA2_CTX *ctx, const uint8_t *data, size_t len); +__dso_public void sudo_SHA384Final(uint8_t digest[SHA384_DIGEST_LENGTH], SHA2_CTX *ctx); + +#define SHA384Init sudo_SHA384Init +#define SHA384Pad sudo_SHA384Pad +#define SHA384Transform sudo_SHA384Transform +#define SHA384Update sudo_SHA384Update +#define SHA384Final sudo_SHA384Final + +__dso_public void sudo_SHA512Init(SHA2_CTX *ctx); +__dso_public void sudo_SHA512Pad(SHA2_CTX *ctx); +__dso_public void sudo_SHA512Transform(uint64_t state[8], const uint8_t buffer[SHA512_BLOCK_LENGTH]); +__dso_public void sudo_SHA512Update(SHA2_CTX *ctx, const uint8_t *data, size_t len); +__dso_public void sudo_SHA512Final(uint8_t digest[SHA512_DIGEST_LENGTH], SHA2_CTX *ctx); + +#define SHA512Init sudo_SHA512Init +#define SHA512Pad sudo_SHA512Pad +#define SHA512Transform sudo_SHA512Transform +#define SHA512Update sudo_SHA512Update +#define SHA512Final sudo_SHA512Final + +#endif /* COMPAT_SHA2_H */ diff --git a/utsudo-0.0.2/include/compat/stdbool.h b/utsudo-0.0.2/include/compat/stdbool.h new file mode 100644 index 0000000..b865a46 --- /dev/null +++ b/utsudo-0.0.2/include/compat/stdbool.h @@ -0,0 +1,44 @@ +/* $OpenBSD: stdbool.h,v 1.5 2010/07/24 22:17:03 guenther Exp $ */ + +/* + * Written by Marc Espie, September 25, 1999 + * Public domain. + */ + +#ifndef COMPAT_STDBOOL_H +#define COMPAT_STDBOOL_H + +#ifndef __cplusplus + +#if (defined(HAVE__BOOL) && HAVE__BOOL > 0) || defined(lint) +/* Support for _C99: type _Bool is already built-in. */ +#define false 0 +#define true 1 + +#else +/* `_Bool' type must promote to `int' or `unsigned int'. */ +typedef enum { + false = 0, + true = 1 +} _Bool; + +/* And those constants must also be available as macros. */ +#define false false +#define true true + +#endif + +/* User visible type `bool' is provided as a macro which may be redefined */ +#define bool _Bool + +#else /* __cplusplus */ +#define _Bool bool +#define bool bool +#define false false +#define true true +#endif /* __cplusplus */ + +/* Inform that everything is fine */ +#define __bool_true_false_are_defined 1 + +#endif /* COMPAT_STDBOOL_H */ diff --git a/utsudo-0.0.2/include/sudo_compat.h b/utsudo-0.0.2/include/sudo_compat.h new file mode 100644 index 0000000..e90ad33 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_compat.h @@ -0,0 +1,545 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2008, 2009-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDO_COMPAT_H +#define SUDO_COMPAT_H + +#include +#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_VASPRINTF) || \ + !defined(HAVE_VSYSLOG) || defined(PREFER_PORTABLE_SNPRINTF) +# include +#endif +#if !defined(HAVE_MEMSET_S) && !defined(rsize_t) +# include /* for rsize_t */ +# ifdef HAVE_STRING_H +# include /* for rsize_t on AIX */ +# endif /* HAVE_STRING_H */ +#endif /* HAVE_MEMSET_S && rsize_t */ + +/* + * Macros and functions that may be missing on some operating systems. + */ + +#ifndef __GNUC_PREREQ__ +# ifdef __GNUC__ +# define __GNUC_PREREQ__(ma, mi) \ + ((__GNUC__ > (ma)) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi))) +# else +# define __GNUC_PREREQ__(ma, mi) 0 +# endif +#endif + +/* Define away __attribute__ for non-gcc or old gcc */ +#if !defined(__attribute__) && !__GNUC_PREREQ__(2, 5) +# define __attribute__(x) +#endif + +/* For catching format string mismatches */ +#ifndef __printflike +# if __GNUC_PREREQ__(3, 3) +# define __printflike(f, v) __attribute__((__format__ (__printf__, f, v))) __attribute__((__nonnull__ (f))) +# elif __GNUC_PREREQ__(2, 7) +# define __printflike(f, v) __attribute__((__format__ (__printf__, f, v))) +# else +# define __printflike(f, v) +# endif +#endif +#ifndef __printf0like +# if __GNUC_PREREQ__(2, 7) +# define __printf0like(f, v) __attribute__((__format__ (__printf__, f, v))) +# else +# define __printf0like(f, v) +# endif +#endif +#ifndef __format_arg +# if __GNUC_PREREQ__(2, 7) +# define __format_arg(f) __attribute__((__format_arg__ (f))) +# else +# define __format_arg(f) +# endif +#endif + +/* + * Given the pointer x to the member m of the struct s, return + * a pointer to the containing structure. + */ +#ifndef __containerof +# define __containerof(x, s, m) ((s *)((char *)(x) - offsetof(s, m))) +#endif + +#ifndef __dso_public +# ifdef HAVE_DSO_VISIBILITY +# if defined(__GNUC__) +# define __dso_public __attribute__((__visibility__("default"))) +# define __dso_hidden __attribute__((__visibility__("hidden"))) +# elif defined(__SUNPRO_C) +# define __dso_public __global +# define __dso_hidden __hidden +# else +# define __dso_public __declspec(dllexport) +# define __dso_hidden +# endif +# else +# define __dso_public +# define __dso_hidden +# endif +#endif + +/* + * Pre-C99 compilers may lack a va_copy macro. + */ +#ifndef va_copy +# ifdef __va_copy +# define va_copy(d, s) __va_copy(d, s) +# else +# define va_copy(d, s) memcpy(&(d), &(s), sizeof(d)); +# endif +#endif + +/* + * Some systems lack full limit definitions. + */ +#if defined(HAVE_DECL_LLONG_MAX) && !HAVE_DECL_LLONG_MAX +# if defined(HAVE_DECL_QUAD_MAX) && HAVE_DECL_QUAD_MAX +# define LLONG_MAX QUAD_MAX +# else +# define LLONG_MAX 0x7fffffffffffffffLL +# endif +#endif + +#if defined(HAVE_DECL_LLONG_MIN) && !HAVE_DECL_LLONG_MIN +# if defined(HAVE_DECL_QUAD_MIN) && HAVE_DECL_QUAD_MIN +# define LLONG_MIN QUAD_MIN +# else +# define LLONG_MIN (-0x7fffffffffffffffLL-1) +# endif +#endif + +#if defined(HAVE_DECL_ULLONG_MAX) && !HAVE_DECL_ULLONG_MAX +# if defined(HAVE_DECL_UQUAD_MAX) && HAVE_DECL_UQUAD_MAX +# define ULLONG_MAX UQUAD_MAX +# else +# define ULLONG_MAX 0xffffffffffffffffULL +# endif +#endif + +#if defined(HAVE_DECL_SIZE_MAX) && !HAVE_DECL_SIZE_MAX +# if defined(HAVE_DECL_SIZE_T_MAX) && HAVE_DECL_SIZE_T_MAX +# define SIZE_MAX SIZE_T_MAX +# else +# define SIZE_MAX ULONG_MAX +# endif +#endif + +#if defined(HAVE_DECL_PATH_MAX) && !HAVE_DECL_PATH_MAX +# if defined(HAVE_DECL__POSIX_PATH_MAX) && HAVE_DECL__POSIX_PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +# else +# define PATH_MAX 256 +# endif +#endif + +/* + * POSIX versions for those without... + */ +#ifndef _S_IFMT +# define _S_IFMT S_IFMT +#endif /* _S_IFMT */ +#ifndef _S_IFREG +# define _S_IFREG S_IFREG +#endif /* _S_IFREG */ +#ifndef _S_IFDIR +# define _S_IFDIR S_IFDIR +#endif /* _S_IFDIR */ +#ifndef _S_IFLNK +# define _S_IFLNK S_IFLNK +#endif /* _S_IFLNK */ +#ifndef _S_IFIFO +# define _S_IFIFO S_IFIFO +#endif /* _S_IFIFO */ +#ifndef S_ISREG +# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif /* S_ISREG */ +#ifndef S_ISDIR +# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif /* S_ISDIR */ +#ifndef S_ISLNK +# define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) +#endif /* S_ISLNK */ +#ifndef S_ISFIFO +# define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO) +#endif /* S_ISLNK */ +#ifndef S_ISTXT +# define S_ISTXT 0001000 +#endif /* S_ISTXT */ + +/* + * ACCESSPERMS (00777) and ALLPERMS (07777) are handy BSDisms + */ +#ifndef ACCESSPERMS +# define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) +#endif /* ACCESSPERMS */ +#ifndef ALLPERMS +# define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) +#endif /* ALLPERMS */ + +/* For futimens() and utimensat() emulation. */ +#if !defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT) +# ifndef UTIME_OMIT +# define UTIME_OMIT -1L +# endif +# ifndef UTIME_NOW +# define UTIME_NOW -2L +# endif +#endif +#if !defined(HAVE_OPENAT) || (!defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT)) +# ifndef AT_FDCWD +# define AT_FDCWD -100 +# endif +#endif + +/* For pipe2() emulation. */ +#if !defined(HAVE_PIPE2) && defined(O_NONBLOCK) && (!defined(O_CLOEXEC) || O_CLOEXEC > 0xffffffff) +# undef O_CLOEXEC +# define O_CLOEXEC 0x80000000 +#endif + +/* + * BSD defines these in but we don't include that anymore. + */ +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +# define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* Macros to set/clear/test flags. */ +#undef SET +#define SET(t, f) ((t) |= (f)) +#undef CLR +#define CLR(t, f) ((t) &= ~(f)) +#undef ISSET +#define ISSET(t, f) ((t) & (f)) + +/* + * Some systems define this in but we don't include that anymore. + */ +#ifndef howmany +# define howmany(x, y) (((x) + ((y) - 1)) / (y)) +#endif + +/* + * Simple isblank() macro and function for systems without it. + */ +#ifndef HAVE_ISBLANK +__dso_public int isblank(int); +# define isblank(_x) ((_x) == ' ' || (_x) == '\t') +#endif + +/* + * NCR's SVr4 has _innetgr(3) instead of innetgr(3) for some reason. + */ +#ifdef HAVE__INNETGR +# define innetgr(n, h, u, d) (_innetgr(n, h, u, d)) +# define HAVE_INNETGR 1 +#endif /* HAVE__INNETGR */ + +/* + * The nitems macro may be defined in sys/param.h + */ +#ifndef nitems +# define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) +#endif + +/* + * If dirfd() does not exists, hopefully dd_fd does. + */ +#if !defined(HAVE_DIRFD) && defined(HAVE_DD_FD) +# define dirfd(_d) ((_d)->dd_fd) +# define HAVE_DIRFD +#endif + +#if !defined(HAVE_KILLPG) && !defined(killpg) +# define killpg(p, s) kill(-(p), (s)) +#endif + +/* + * Declare errno if errno.h doesn't do it for us. + */ +#if defined(HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO +extern int errno; +#endif /* !HAVE_DECL_ERRNO */ + +/* Not all systems define NSIG in signal.h */ +#if !defined(NSIG) +# if defined(_NSIG) +# define NSIG _NSIG +# elif defined(__NSIG) +# define NSIG __NSIG +# else +# define NSIG 64 +# endif +#endif + +/* For sig2str() */ +#if !defined(HAVE_DECL_SIG2STR_MAX) || !HAVE_DECL_SIG2STR_MAX +# define SIG2STR_MAX 32 +#endif + +/* WCOREDUMP is not POSIX, this usually works (verified on AIX). */ +#ifndef WCOREDUMP +# define WCOREDUMP(x) ((x) & 0x80) +#endif + +/* W_EXITCODE is not POSIX but the encoding of wait status is. */ +#ifndef W_EXITCODE +# define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) +#endif + +/* Number of bits in a byte. */ +#ifndef NBBY +# ifdef __NBBY +# define NBBY __NBBY +# else +# define NBBY 8 +# endif +#endif + +#ifndef HAVE_SETEUID +# if defined(HAVE_SETRESUID) +# define seteuid(u) setresuid(-1, (u), -1) +# define setegid(g) setresgid(-1, (g), -1) +# define HAVE_SETEUID 1 +# elif defined(HAVE_SETREUID) +# define seteuid(u) setreuid(-1, (u)) +# define setegid(g) setregid(-1, (g)) +# define HAVE_SETEUID 1 +# endif +#endif /* HAVE_SETEUID */ + +/* + * Older HP-UX does not declare setresuid() or setresgid(). + */ +#if defined(HAVE_DECL_SETRESUID) && !HAVE_DECL_SETRESUID +int setresuid(uid_t, uid_t, uid_t); +int setresgid(gid_t, gid_t, gid_t); +#endif +#if defined(HAVE_DECL_GETRESUID) && !HAVE_DECL_GETRESUID +int getresuid(uid_t *, uid_t *, uid_t *); +int getresgid(gid_t *, gid_t *, gid_t *); +#endif + +/* + * HP-UX does not declare innetgr() or getdomainname(). + * Solaris does not declare getdomainname(). + */ +#if defined(HAVE_DECL_INNETGR) && !HAVE_DECL_INNETGR +int innetgr(const char *, const char *, const char *, const char *); +#endif +#if defined(HAVE_DECL__INNETGR) && !HAVE_DECL__INNETGR +int _innetgr(const char *, const char *, const char *, const char *); +#endif +#if defined(HAVE_DECL_GETDOMAINNAME) && !HAVE_DECL_GETDOMAINNAME +int getdomainname(char *, size_t); +#endif + +/* + * HP-UX 11.00 has broken pread/pwrite that can't handle a 64-bit off_t + * on 32-bit machines. + */ +#if defined(__hpux) && !defined(__LP64__) +# ifdef HAVE_PREAD64 +# undef pread +# define pread(_a, _b, _c, _d) pread64((_a), (_b), (_c), (_d)) +# endif +# ifdef HAVE_PWRITE64 +# undef pwrite +# define pwrite(_a, _b, _c, _d) pwrite64((_a), (_b), (_c), (_d)) +# endif +#endif /* __hpux && !__LP64__ */ + +/* + * Functions "missing" from libc. + * All libc replacements are prefixed with "sudo_" to avoid namespace issues. + */ + +struct passwd; +struct timespec; + +#ifndef HAVE_CLOSEFROM +__dso_public void sudo_closefrom(int); +# undef closefrom +# define closefrom(_a) sudo_closefrom((_a)) +#endif /* HAVE_CLOSEFROM */ +#ifdef PREFER_PORTABLE_GETCWD +__dso_public char *sudo_getcwd(char *, size_t size); +# undef getcwd +# define getcwd(_a, _b) sudo_getcwd((_a), (_b)) +#endif /* PREFER_PORTABLE_GETCWD */ +#ifndef HAVE_GETGROUPLIST +__dso_public int sudo_getgrouplist(const char *name, GETGROUPS_T basegid, GETGROUPS_T *groups, int *ngroupsp); +# undef getgrouplist +# define getgrouplist(_a, _b, _c, _d) sudo_getgrouplist((_a), (_b), (_c), (_d)) +#endif /* GETGROUPLIST */ +#ifndef HAVE_GETDELIM +__dso_public ssize_t sudo_getdelim(char **bufp, size_t *bufsizep, int delim, FILE *fp); +# undef getdelim +# define getdelim(_a, _b, _c, _d) sudo_getdelim((_a), (_b), (_c), (_d)) +#endif /* HAVE_GETDELIM */ +#ifndef HAVE_GETUSERSHELL +__dso_public char *sudo_getusershell(void); +# undef getusershell +# define getusershell() sudo_getusershell() +__dso_public void sudo_setusershell(void); +# undef setusershell +# define setusershell() sudo_setusershell() +__dso_public void sudo_endusershell(void); +# undef endusershell +# define endusershell() sudo_endusershell() +#endif /* HAVE_GETUSERSHELL */ +#ifndef HAVE_UTIMENSAT +__dso_public int sudo_utimensat(int fd, const char *file, const struct timespec *times, int flag); +# undef utimensat +# define utimensat(_a, _b, _c, _d) sudo_utimensat((_a), (_b), (_c), (_d)) +#endif /* HAVE_UTIMENSAT */ +#ifndef HAVE_FUTIMENS +__dso_public int sudo_futimens(int fd, const struct timespec *times); +# undef futimens +# define futimens(_a, _b) sudo_futimens((_a), (_b)) +#endif /* HAVE_FUTIMENS */ +#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_snprintf(char *str, size_t n, char const *fmt, ...) __printflike(3, 4); +# undef snprintf +# define snprintf sudo_snprintf +#endif /* HAVE_SNPRINTF */ +#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap) __printflike(3, 0); +# undef vsnprintf +# define vsnprintf sudo_vsnprintf +#endif /* HAVE_VSNPRINTF */ +#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_asprintf(char **str, char const *fmt, ...) __printflike(2, 3); +# undef asprintf +# define asprintf sudo_asprintf +#endif /* HAVE_ASPRINTF */ +#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_vasprintf(char **str, const char *fmt, va_list ap) __printflike(2, 0); +# undef vasprintf +# define vasprintf sudo_vasprintf +#endif /* HAVE_VASPRINTF */ +#ifndef HAVE_STRLCAT +__dso_public size_t sudo_strlcat(char *dst, const char *src, size_t siz); +# undef strlcat +# define strlcat(_a, _b, _c) sudo_strlcat((_a), (_b), (_c)) +#endif /* HAVE_STRLCAT */ +#ifndef HAVE_STRLCPY +__dso_public size_t sudo_strlcpy(char *dst, const char *src, size_t siz); +# undef strlcpy +# define strlcpy(_a, _b, _c) sudo_strlcpy((_a), (_b), (_c)) +#endif /* HAVE_STRLCPY */ +#ifndef HAVE_STRNDUP +__dso_public char *sudo_strndup(const char *str, size_t maxlen); +# undef strndup +# define strndup(_a, _b) sudo_strndup((_a), (_b)) +#endif /* HAVE_STRNDUP */ +#ifndef HAVE_STRNLEN +__dso_public size_t sudo_strnlen(const char *str, size_t maxlen); +# undef strnlen +# define strnlen(_a, _b) sudo_strnlen((_a), (_b)) +#endif /* HAVE_STRNLEN */ +#ifndef HAVE_MEMRCHR +__dso_public void *sudo_memrchr(const void *s, int c, size_t n); +# undef memrchr +# define memrchr(_a, _b, _c) sudo_memrchr((_a), (_b), (_c)) +#endif /* HAVE_MEMRCHR */ +#ifndef HAVE_MEMSET_S +__dso_public errno_t sudo_memset_s(void *v, rsize_t smax, int c, rsize_t n); +# undef memset_s +# define memset_s(_a, _b, _c, _d) sudo_memset_s((_a), (_b), (_c), (_d)) +#endif /* HAVE_MEMSET_S */ +#if !defined(HAVE_MKDTEMP) || !defined(HAVE_MKSTEMPS) +__dso_public char *sudo_mkdtemp(char *path); +# undef mkdtemp +# define mkdtemp(_a) sudo_mkdtemp((_a)) +__dso_public int sudo_mkstemps(char *path, int slen); +# undef mkstemps +# define mkstemps(_a, _b) sudo_mkstemps((_a), (_b)) +#endif /* !HAVE_MKDTEMP || !HAVE_MKSTEMPS */ +#ifndef HAVE_NANOSLEEP +__dso_public int sudo_nanosleep(const struct timespec *timeout, struct timespec *remainder); +#undef nanosleep +# define nanosleep(_a, _b) sudo_nanosleep((_a), (_b)) +#endif +#ifndef HAVE_PW_DUP +__dso_public struct passwd *sudo_pw_dup(const struct passwd *pw); +# undef pw_dup +# define pw_dup(_a) sudo_pw_dup((_a)) +#endif /* HAVE_PW_DUP */ +#ifndef HAVE_STRSIGNAL +__dso_public char *sudo_strsignal(int signo); +# undef strsignal +# define strsignal(_a) sudo_strsignal((_a)) +#endif /* HAVE_STRSIGNAL */ +#ifndef HAVE_SIG2STR +__dso_public int sudo_sig2str(int signo, char *signame); +# undef sig2str +# define sig2str(_a, _b) sudo_sig2str((_a), (_b)) +#endif /* HAVE_SIG2STR */ +#ifndef HAVE_STR2SIG +__dso_public int sudo_str2sig(const char *signame, int *signum); +# undef str2sig +# define str2sig(_a, _b) sudo_str2sig((_a), (_b)) +#endif /* HAVE_STR2SIG */ +#if !defined(HAVE_INET_NTOP) && defined(SUDO_NET_IFS_C) +__dso_public char *sudo_inet_ntop(int af, const void *src, char *dst, socklen_t size); +# undef inet_ntop +# define inet_ntop(_a, _b, _c, _d) sudo_inet_ntop((_a), (_b), (_c), (_d)) +#endif /* HAVE_INET_NTOP */ +#ifndef HAVE_INET_PTON +__dso_public int sudo_inet_pton(int af, const char *src, void *dst); +# undef inet_pton +# define inet_pton(_a, _b, _c) sudo_inet_pton((_a), (_b), (_c)) +#endif /* HAVE_INET_PTON */ +#ifndef HAVE_GETPROGNAME +__dso_public const char *sudo_getprogname(void); +# undef getprogname +# define getprogname() sudo_getprogname() +#endif /* HAVE_GETPROGNAME */ +#ifndef HAVE_REALLOCARRAY +__dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size); +# undef reallocarray +# define reallocarray(_a, _b, _c) sudo_reallocarray((_a), (_b), (_c)) +#endif /* HAVE_REALLOCARRAY */ +#ifndef HAVE_VSYSLOG +__dso_public void sudo_vsyslog(int pri, const char *fmt, va_list ap); +# undef vsyslog +# define vsyslog(_a, _b, _c) sudo_vsyslog((_a), (_b), (_c)) +#endif /* HAVE_VSYSLOG */ +#ifndef HAVE_PIPE2 +__dso_public int sudo_pipe2(int fildes[2], int flags); +# undef pipe2 +# define pipe2(_a, _b) sudo_pipe2((_a), (_b)) +#endif /* HAVE_PIPE2 */ + +#endif /* SUDO_COMPAT_H */ diff --git a/utsudo-0.0.2/include/sudo_compat.h.target-shell b/utsudo-0.0.2/include/sudo_compat.h.target-shell new file mode 100644 index 0000000..8be6ebc --- /dev/null +++ b/utsudo-0.0.2/include/sudo_compat.h.target-shell @@ -0,0 +1,534 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2008, 2009-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDO_COMPAT_H +#define SUDO_COMPAT_H + +#include +#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_VASPRINTF) || \ + !defined(HAVE_VSYSLOG) || defined(PREFER_PORTABLE_SNPRINTF) +# include +#endif +#if !defined(HAVE_MEMSET_S) && !defined(rsize_t) +# include /* for rsize_t */ +# ifdef HAVE_STRING_H +# include /* for rsize_t on AIX */ +# endif /* HAVE_STRING_H */ +#endif /* HAVE_MEMSET_S && rsize_t */ + +/* + * Macros and functions that may be missing on some operating systems. + */ + +#ifndef __GNUC_PREREQ__ +# ifdef __GNUC__ +# define __GNUC_PREREQ__(ma, mi) \ + ((__GNUC__ > (ma)) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi))) +# else +# define __GNUC_PREREQ__(ma, mi) 0 +# endif +#endif + +/* Define away __attribute__ for non-gcc or old gcc */ +#if !defined(__attribute__) && !__GNUC_PREREQ__(2, 5) +# define __attribute__(x) +#endif + +/* For catching format string mismatches */ +#ifndef __printflike +# if __GNUC_PREREQ__(3, 3) +# define __printflike(f, v) __attribute__((__format__ (__printf__, f, v))) __attribute__((__nonnull__ (f))) +# elif __GNUC_PREREQ__(2, 7) +# define __printflike(f, v) __attribute__((__format__ (__printf__, f, v))) +# else +# define __printflike(f, v) +# endif +#endif +#ifndef __printf0like +# if __GNUC_PREREQ__(2, 7) +# define __printf0like(f, v) __attribute__((__format__ (__printf__, f, v))) +# else +# define __printf0like(f, v) +# endif +#endif +#ifndef __format_arg +# if __GNUC_PREREQ__(2, 7) +# define __format_arg(f) __attribute__((__format_arg__ (f))) +# else +# define __format_arg(f) +# endif +#endif + +/* + * Given the pointer x to the member m of the struct s, return + * a pointer to the containing structure. + */ +#ifndef __containerof +# define __containerof(x, s, m) ((s *)((char *)(x) - offsetof(s, m))) +#endif + +#ifndef __dso_public +# ifdef HAVE_DSO_VISIBILITY +# if defined(__GNUC__) +# define __dso_public __attribute__((__visibility__("default"))) +# define __dso_hidden __attribute__((__visibility__("hidden"))) +# elif defined(__SUNPRO_C) +# define __dso_public __global +# define __dso_hidden __hidden +# else +# define __dso_public __declspec(dllexport) +# define __dso_hidden +# endif +# else +# define __dso_public +# define __dso_hidden +# endif +#endif + +/* + * Pre-C99 compilers may lack a va_copy macro. + */ +#ifndef va_copy +# ifdef __va_copy +# define va_copy(d, s) __va_copy(d, s) +# else +# define va_copy(d, s) memcpy(&(d), &(s), sizeof(d)); +# endif +#endif + +/* + * Some systems lack full limit definitions. + */ +#if defined(HAVE_DECL_LLONG_MAX) && !HAVE_DECL_LLONG_MAX +# if defined(HAVE_DECL_QUAD_MAX) && HAVE_DECL_QUAD_MAX +# define LLONG_MAX QUAD_MAX +# else +# define LLONG_MAX 0x7fffffffffffffffLL +# endif +#endif + +#if defined(HAVE_DECL_LLONG_MIN) && !HAVE_DECL_LLONG_MIN +# if defined(HAVE_DECL_QUAD_MIN) && HAVE_DECL_QUAD_MIN +# define LLONG_MIN QUAD_MIN +# else +# define LLONG_MIN (-0x7fffffffffffffffLL-1) +# endif +#endif + +#if defined(HAVE_DECL_ULLONG_MAX) && !HAVE_DECL_ULLONG_MAX +# if defined(HAVE_DECL_UQUAD_MAX) && HAVE_DECL_UQUAD_MAX +# define ULLONG_MAX UQUAD_MAX +# else +# define ULLONG_MAX 0xffffffffffffffffULL +# endif +#endif + +#if defined(HAVE_DECL_SIZE_MAX) && !HAVE_DECL_SIZE_MAX +# if defined(HAVE_DECL_SIZE_T_MAX) && HAVE_DECL_SIZE_T_MAX +# define SIZE_MAX SIZE_T_MAX +# else +# define SIZE_MAX ULONG_MAX +# endif +#endif + +#if defined(HAVE_DECL_PATH_MAX) && !HAVE_DECL_PATH_MAX +# if defined(HAVE_DECL__POSIX_PATH_MAX) && HAVE_DECL__POSIX_PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +# else +# define PATH_MAX 256 +# endif +#endif + +/* + * POSIX versions for those without... + */ +#ifndef _S_IFMT +# define _S_IFMT S_IFMT +#endif /* _S_IFMT */ +#ifndef _S_IFREG +# define _S_IFREG S_IFREG +#endif /* _S_IFREG */ +#ifndef _S_IFDIR +# define _S_IFDIR S_IFDIR +#endif /* _S_IFDIR */ +#ifndef _S_IFLNK +# define _S_IFLNK S_IFLNK +#endif /* _S_IFLNK */ +#ifndef _S_IFIFO +# define _S_IFIFO S_IFIFO +#endif /* _S_IFIFO */ +#ifndef S_ISREG +# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif /* S_ISREG */ +#ifndef S_ISDIR +# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif /* S_ISDIR */ +#ifndef S_ISLNK +# define S_ISLNK(m) (((m) & _S_IFMT) == _S_IFLNK) +#endif /* S_ISLNK */ +#ifndef S_ISFIFO +# define S_ISFIFO(m) (((m) & _S_IFMT) == _S_IFIFO) +#endif /* S_ISLNK */ +#ifndef S_ISTXT +# define S_ISTXT 0001000 +#endif /* S_ISTXT */ + +/* + * ACCESSPERMS (00777) and ALLPERMS (07777) are handy BSDisms + */ +#ifndef ACCESSPERMS +# define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) +#endif /* ACCESSPERMS */ +#ifndef ALLPERMS +# define ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) +#endif /* ALLPERMS */ + +/* For futimens() and utimensat() emulation. */ +#if !defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT) +# ifndef UTIME_OMIT +# define UTIME_OMIT -1L +# endif +# ifndef UTIME_NOW +# define UTIME_NOW -2L +# endif +#endif +#if !defined(HAVE_OPENAT) || (!defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT)) +# ifndef AT_FDCWD +# define AT_FDCWD -100 +# endif +#endif + +/* For pipe2() emulation. */ +#if !defined(HAVE_PIPE2) && defined(O_NONBLOCK) && (!defined(O_CLOEXEC) || O_CLOEXEC > 0xffffffff) +# undef O_CLOEXEC +# define O_CLOEXEC 0x80000000 +#endif + +/* + * BSD defines these in but we don't include that anymore. + */ +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +# define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* Macros to set/clear/test flags. */ +#undef SET +#define SET(t, f) ((t) |= (f)) +#undef CLR +#define CLR(t, f) ((t) &= ~(f)) +#undef ISSET +#define ISSET(t, f) ((t) & (f)) + +/* + * Some systems define this in but we don't include that anymore. + */ +#ifndef howmany +# define howmany(x, y) (((x) + ((y) - 1)) / (y)) +#endif + +/* + * Simple isblank() macro and function for systems without it. + */ +#ifndef HAVE_ISBLANK +__dso_public int isblank(int); +# define isblank(_x) ((_x) == ' ' || (_x) == '\t') +#endif + +/* + * NCR's SVr4 has _innetgr(3) instead of innetgr(3) for some reason. + */ +#ifdef HAVE__INNETGR +# define innetgr(n, h, u, d) (_innetgr(n, h, u, d)) +# define HAVE_INNETGR 1 +#endif /* HAVE__INNETGR */ + +/* + * The nitems macro may be defined in sys/param.h + */ +#ifndef nitems +# define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) +#endif + +/* + * If dirfd() does not exists, hopefully dd_fd does. + */ +#if !defined(HAVE_DIRFD) && defined(HAVE_DD_FD) +# define dirfd(_d) ((_d)->dd_fd) +# define HAVE_DIRFD +#endif + +#if !defined(HAVE_KILLPG) && !defined(killpg) +# define killpg(p, s) kill(-(p), (s)) +#endif + +/* + * Declare errno if errno.h doesn't do it for us. + */ +#if defined(HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO +extern int errno; +#endif /* !HAVE_DECL_ERRNO */ + +/* Not all systems define NSIG in signal.h */ +#if !defined(NSIG) +# if defined(_NSIG) +# define NSIG _NSIG +# elif defined(__NSIG) +# define NSIG __NSIG +# else +# define NSIG 64 +# endif +#endif + +/* For sig2str() */ +#if !defined(HAVE_DECL_SIG2STR_MAX) || !HAVE_DECL_SIG2STR_MAX +# define SIG2STR_MAX 32 +#endif + +/* WCOREDUMP is not POSIX, this usually works (verified on AIX). */ +#ifndef WCOREDUMP +# define WCOREDUMP(x) ((x) & 0x80) +#endif + +/* W_EXITCODE is not POSIX but the encoding of wait status is. */ +#ifndef W_EXITCODE +# define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) +#endif + +/* Number of bits in a byte. */ +#ifndef NBBY +# ifdef __NBBY +# define NBBY __NBBY +# else +# define NBBY 8 +# endif +#endif + +#ifndef HAVE_SETEUID +# if defined(HAVE_SETRESUID) +# define seteuid(u) setresuid(-1, (u), -1) +# define setegid(g) setresgid(-1, (g), -1) +# define HAVE_SETEUID 1 +# elif defined(HAVE_SETREUID) +# define seteuid(u) setreuid(-1, (u)) +# define setegid(g) setregid(-1, (g)) +# define HAVE_SETEUID 1 +# endif +#endif /* HAVE_SETEUID */ + +/* + * Older HP-UX does not declare setresuid() or setresgid(). + */ +#if defined(HAVE_DECL_SETRESUID) && !HAVE_DECL_SETRESUID +int setresuid(uid_t, uid_t, uid_t); +int setresgid(gid_t, gid_t, gid_t); +#endif +#if defined(HAVE_DECL_GETRESUID) && !HAVE_DECL_GETRESUID +int getresuid(uid_t *, uid_t *, uid_t *); +int getresgid(gid_t *, gid_t *, gid_t *); +#endif + +/* + * HP-UX does not declare innetgr() or getdomainname(). + * Solaris does not declare getdomainname(). + */ +#if defined(HAVE_DECL_INNETGR) && !HAVE_DECL_INNETGR +int innetgr(const char *, const char *, const char *, const char *); +#endif +#if defined(HAVE_DECL__INNETGR) && !HAVE_DECL__INNETGR +int _innetgr(const char *, const char *, const char *, const char *); +#endif +#if defined(HAVE_DECL_GETDOMAINNAME) && !HAVE_DECL_GETDOMAINNAME +int getdomainname(char *, size_t); +#endif + +/* + * HP-UX 11.00 has broken pread/pwrite that can't handle a 64-bit off_t + * on 32-bit machines. + */ +#if defined(__hpux) && !defined(__LP64__) +# ifdef HAVE_PREAD64 +# undef pread +# define pread(_a, _b, _c, _d) pread64((_a), (_b), (_c), (_d)) +# endif +# ifdef HAVE_PWRITE64 +# undef pwrite +# define pwrite(_a, _b, _c, _d) pwrite64((_a), (_b), (_c), (_d)) +# endif +#endif /* __hpux && !__LP64__ */ + +/* + * Functions "missing" from libc. + * All libc replacements are prefixed with "sudo_" to avoid namespace issues. + */ + +struct passwd; +struct timespec; + +#ifndef HAVE_CLOSEFROM +__dso_public void sudo_closefrom(int); +# undef closefrom +# define closefrom(_a) sudo_closefrom((_a)) +#endif /* HAVE_CLOSEFROM */ +#ifdef PREFER_PORTABLE_GETCWD +__dso_public char *sudo_getcwd(char *, size_t size); +# undef getcwd +# define getcwd(_a, _b) sudo_getcwd((_a), (_b)) +#endif /* PREFER_PORTABLE_GETCWD */ +#ifndef HAVE_GETGROUPLIST +__dso_public int sudo_getgrouplist(const char *name, GETGROUPS_T basegid, GETGROUPS_T *groups, int *ngroupsp); +# undef getgrouplist +# define getgrouplist(_a, _b, _c, _d) sudo_getgrouplist((_a), (_b), (_c), (_d)) +#endif /* GETGROUPLIST */ +#ifndef HAVE_GETDELIM +__dso_public ssize_t sudo_getdelim(char **bufp, size_t *bufsizep, int delim, FILE *fp); +# undef getdelim +# define getdelim(_a, _b, _c, _d) sudo_getdelim((_a), (_b), (_c), (_d)) +#endif /* HAVE_GETDELIM */ +#ifndef HAVE_UTIMENSAT +__dso_public int sudo_utimensat(int fd, const char *file, const struct timespec *times, int flag); +# undef utimensat +# define utimensat(_a, _b, _c, _d) sudo_utimensat((_a), (_b), (_c), (_d)) +#endif /* HAVE_UTIMENSAT */ +#ifndef HAVE_FUTIMENS +__dso_public int sudo_futimens(int fd, const struct timespec *times); +# undef futimens +# define futimens(_a, _b) sudo_futimens((_a), (_b)) +#endif /* HAVE_FUTIMENS */ +#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_snprintf(char *str, size_t n, char const *fmt, ...) __printflike(3, 4); +# undef snprintf +# define snprintf sudo_snprintf +#endif /* HAVE_SNPRINTF */ +#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap) __printflike(3, 0); +# undef vsnprintf +# define vsnprintf sudo_vsnprintf +#endif /* HAVE_VSNPRINTF */ +#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_asprintf(char **str, char const *fmt, ...) __printflike(2, 3); +# undef asprintf +# define asprintf sudo_asprintf +#endif /* HAVE_ASPRINTF */ +#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) +__dso_public int sudo_vasprintf(char **str, const char *fmt, va_list ap) __printflike(2, 0); +# undef vasprintf +# define vasprintf sudo_vasprintf +#endif /* HAVE_VASPRINTF */ +#ifndef HAVE_STRLCAT +__dso_public size_t sudo_strlcat(char *dst, const char *src, size_t siz); +# undef strlcat +# define strlcat(_a, _b, _c) sudo_strlcat((_a), (_b), (_c)) +#endif /* HAVE_STRLCAT */ +#ifndef HAVE_STRLCPY +__dso_public size_t sudo_strlcpy(char *dst, const char *src, size_t siz); +# undef strlcpy +# define strlcpy(_a, _b, _c) sudo_strlcpy((_a), (_b), (_c)) +#endif /* HAVE_STRLCPY */ +#ifndef HAVE_STRNDUP +__dso_public char *sudo_strndup(const char *str, size_t maxlen); +# undef strndup +# define strndup(_a, _b) sudo_strndup((_a), (_b)) +#endif /* HAVE_STRNDUP */ +#ifndef HAVE_STRNLEN +__dso_public size_t sudo_strnlen(const char *str, size_t maxlen); +# undef strnlen +# define strnlen(_a, _b) sudo_strnlen((_a), (_b)) +#endif /* HAVE_STRNLEN */ +#ifndef HAVE_MEMRCHR +__dso_public void *sudo_memrchr(const void *s, int c, size_t n); +# undef memrchr +# define memrchr(_a, _b, _c) sudo_memrchr((_a), (_b), (_c)) +#endif /* HAVE_MEMRCHR */ +#ifndef HAVE_MEMSET_S +__dso_public errno_t sudo_memset_s(void *v, rsize_t smax, int c, rsize_t n); +# undef memset_s +# define memset_s(_a, _b, _c, _d) sudo_memset_s((_a), (_b), (_c), (_d)) +#endif /* HAVE_MEMSET_S */ +#if !defined(HAVE_MKDTEMP) || !defined(HAVE_MKSTEMPS) +__dso_public char *sudo_mkdtemp(char *path); +# undef mkdtemp +# define mkdtemp(_a) sudo_mkdtemp((_a)) +__dso_public int sudo_mkstemps(char *path, int slen); +# undef mkstemps +# define mkstemps(_a, _b) sudo_mkstemps((_a), (_b)) +#endif /* !HAVE_MKDTEMP || !HAVE_MKSTEMPS */ +#ifndef HAVE_NANOSLEEP +__dso_public int sudo_nanosleep(const struct timespec *timeout, struct timespec *remainder); +#undef nanosleep +# define nanosleep(_a, _b) sudo_nanosleep((_a), (_b)) +#endif +#ifndef HAVE_PW_DUP +__dso_public struct passwd *sudo_pw_dup(const struct passwd *pw); +# undef pw_dup +# define pw_dup(_a) sudo_pw_dup((_a)) +#endif /* HAVE_PW_DUP */ +#ifndef HAVE_STRSIGNAL +__dso_public char *sudo_strsignal(int signo); +# undef strsignal +# define strsignal(_a) sudo_strsignal((_a)) +#endif /* HAVE_STRSIGNAL */ +#ifndef HAVE_SIG2STR +__dso_public int sudo_sig2str(int signo, char *signame); +# undef sig2str +# define sig2str(_a, _b) sudo_sig2str((_a), (_b)) +#endif /* HAVE_SIG2STR */ +#ifndef HAVE_STR2SIG +__dso_public int sudo_str2sig(const char *signame, int *signum); +# undef str2sig +# define str2sig(_a, _b) sudo_str2sig((_a), (_b)) +#endif /* HAVE_STR2SIG */ +#if !defined(HAVE_INET_NTOP) && defined(SUDO_NET_IFS_C) +__dso_public char *sudo_inet_ntop(int af, const void *src, char *dst, socklen_t size); +# undef inet_ntop +# define inet_ntop(_a, _b, _c, _d) sudo_inet_ntop((_a), (_b), (_c), (_d)) +#endif /* HAVE_INET_NTOP */ +#ifndef HAVE_INET_PTON +__dso_public int sudo_inet_pton(int af, const char *src, void *dst); +# undef inet_pton +# define inet_pton(_a, _b, _c) sudo_inet_pton((_a), (_b), (_c)) +#endif /* HAVE_INET_PTON */ +#ifndef HAVE_GETPROGNAME +__dso_public const char *sudo_getprogname(void); +# undef getprogname +# define getprogname() sudo_getprogname() +#endif /* HAVE_GETPROGNAME */ +#ifndef HAVE_REALLOCARRAY +__dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size); +# undef reallocarray +# define reallocarray(_a, _b, _c) sudo_reallocarray((_a), (_b), (_c)) +#endif /* HAVE_REALLOCARRAY */ +#ifndef HAVE_VSYSLOG +__dso_public void sudo_vsyslog(int pri, const char *fmt, va_list ap); +# undef vsyslog +# define vsyslog(_a, _b, _c) sudo_vsyslog((_a), (_b), (_c)) +#endif /* HAVE_VSYSLOG */ +#ifndef HAVE_PIPE2 +__dso_public int sudo_pipe2(int fildes[2], int flags); +# undef pipe2 +# define pipe2(_a, _b) sudo_pipe2((_a), (_b)) +#endif /* HAVE_PIPE2 */ + +#endif /* SUDO_COMPAT_H */ diff --git a/utsudo-0.0.2/include/sudo_conf.h b/utsudo-0.0.2/include/sudo_conf.h new file mode 100644 index 0000000..a8b72be --- /dev/null +++ b/utsudo-0.0.2/include/sudo_conf.h @@ -0,0 +1,87 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_CONF_H +#define SUDO_CONF_H + +#include "sudo_queue.h" + +/* Flags for sudo_conf_read() */ +#define SUDO_CONF_DEBUG 0x01 +#define SUDO_CONF_PATHS 0x02 +#define SUDO_CONF_PLUGINS 0x04 +#define SUDO_CONF_SETTINGS 0x08 +#define SUDO_CONF_ALL 0x0f + +/* Values of sudo_conf_group_source() */ +#define GROUP_SOURCE_ADAPTIVE 0 +#define GROUP_SOURCE_STATIC 1 +#define GROUP_SOURCE_DYNAMIC 2 + +struct sudo_debug_file; +TAILQ_HEAD(sudo_conf_debug_file_list, sudo_debug_file); + +struct plugin_info { + TAILQ_ENTRY(plugin_info) entries; + char *path; + char *symbol_name; + char **options; + unsigned int lineno; +}; +TAILQ_HEAD(plugin_info_list, plugin_info); + +struct sudo_conf_debug { + TAILQ_ENTRY(sudo_conf_debug) entries; + struct sudo_conf_debug_file_list debug_files; + char *progname; +}; +TAILQ_HEAD(sudo_conf_debug_list, sudo_conf_debug); + +/* Read main sudo.conf file. */ +__dso_public int sudo_conf_read_v1(const char *conf_file, int conf_types); +#define sudo_conf_read(_a, _b) sudo_conf_read_v1((_a), (_b)) + +/* Accessor functions. */ +__dso_public const char *sudo_conf_askpass_path_v1(void); +__dso_public const char *sudo_conf_sesh_path_v1(void); +__dso_public const char *sudo_conf_noexec_path_v1(void); +__dso_public const char *sudo_conf_plugin_dir_path_v1(void); +__dso_public const char *sudo_conf_devsearch_path_v1(void); +__dso_public struct sudo_conf_debug_list *sudo_conf_debugging_v1(void); +__dso_public struct sudo_conf_debug_file_list *sudo_conf_debug_files_v1(const char *progname); +__dso_public struct plugin_info_list *sudo_conf_plugins_v1(void); +__dso_public bool sudo_conf_disable_coredump_v1(void); +__dso_public bool sudo_conf_probe_interfaces_v1(void); +__dso_public int sudo_conf_group_source_v1(void); +__dso_public int sudo_conf_max_groups_v1(void); +__dso_public void sudo_conf_clear_paths_v1(void); +#define sudo_conf_askpass_path() sudo_conf_askpass_path_v1() +#define sudo_conf_sesh_path() sudo_conf_sesh_path_v1() +#define sudo_conf_noexec_path() sudo_conf_noexec_path_v1() +#define sudo_conf_plugin_dir_path() sudo_conf_plugin_dir_path_v1() +#define sudo_conf_devsearch_path() sudo_conf_devsearch_path_v1() +#define sudo_conf_debugging() sudo_conf_debugging_v1() +#define sudo_conf_debug_files(_a) sudo_conf_debug_files_v1((_a)) +#define sudo_conf_plugins() sudo_conf_plugins_v1() +#define sudo_conf_disable_coredump() sudo_conf_disable_coredump_v1() +#define sudo_conf_probe_interfaces() sudo_conf_probe_interfaces_v1() +#define sudo_conf_group_source() sudo_conf_group_source_v1() +#define sudo_conf_max_groups() sudo_conf_max_groups_v1() +#define sudo_conf_clear_paths() sudo_conf_clear_paths_v1() + +#endif /* SUDO_CONF_H */ diff --git a/utsudo-0.0.2/include/sudo_debug.h b/utsudo-0.0.2/include/sudo_debug.h new file mode 100644 index 0000000..522ec55 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_debug.h @@ -0,0 +1,299 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_DEBUG_H +#define SUDO_DEBUG_H + +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif +#include "sudo_queue.h" + +/* + * List of debug files and flags for use in registration. + */ +struct sudo_debug_file { + TAILQ_ENTRY(sudo_debug_file) entries; + char *debug_file; + char *debug_flags; +}; +struct sudo_conf_debug_file_list; + +/* + * The priority and subsystem are encoded in a single 32-bit value. + * The lower 4 bits are the priority and the top 26 bits are the subsystem. + * This allows for 16 priorities and a very large number of subsystems. + * Bit 5 is used as a flag to specify whether to log the errno value. + * Bit 6 specifies whether to log the function, file and line number data. + */ + +/* + * Sudo debug priorities, ordered least to most verbose, + * in other words, highest to lowest priority. Max pri is 15. + * Note: order must match sudo_debug_priorities[] + */ +#define SUDO_DEBUG_CRIT 1 /* critical errors */ +#define SUDO_DEBUG_ERROR 2 /* non-critical errors */ +#define SUDO_DEBUG_WARN 3 /* non-fatal warnings */ +#define SUDO_DEBUG_NOTICE 4 /* non-error condition notices */ +#define SUDO_DEBUG_DIAG 5 /* diagnostic messages */ +#define SUDO_DEBUG_INFO 6 /* informational message */ +#define SUDO_DEBUG_TRACE 7 /* log function enter/exit */ +#define SUDO_DEBUG_DEBUG 8 /* very verbose debugging */ + +/* Flag to include string version of errno in debug info. */ +#define SUDO_DEBUG_ERRNO (1<<4) + +/* Flag to include function, file and line number in debug info. */ +#define SUDO_DEBUG_LINENO (1<<5) + +/* + * Sudo debug subsystems. + * This includes subsystems in the sudoers plugin. + * Note: order must match sudo_debug_subsystems[] + */ +#define SUDO_DEBUG_ARGS ( 1<<6) /* command line argument handling */ +#define SUDO_DEBUG_CONV ( 2<<6) /* user conversation */ +#define SUDO_DEBUG_EDIT ( 3<<6) /* sudoedit */ +#define SUDO_DEBUG_EVENT ( 4<<6) /* event handling */ +#define SUDO_DEBUG_EXEC ( 5<<6) /* command execution */ +#define SUDO_DEBUG_HOOKS ( 6<<6) /* hook functions */ +#define SUDO_DEBUG_MAIN ( 7<<6) /* sudo main() */ +#define SUDO_DEBUG_NETIF ( 8<<6) /* network interface functions */ +#define SUDO_DEBUG_PCOMM ( 9<<6) /* plugin communications */ +#define SUDO_DEBUG_PLUGIN (10<<6) /* main plugin functions */ +#define SUDO_DEBUG_PTY (11<<6) /* pseudo-tty */ +#define SUDO_DEBUG_SELINUX (12<<6) /* selinux */ +#define SUDO_DEBUG_UTIL (13<<6) /* utility functions */ +#define SUDO_DEBUG_UTMP (14<<6) /* utmp file ops */ +#define SUDO_DEBUG_ALL 0xffff0000 /* all subsystems */ + +/* Error return for sudo_debug_register(). */ +#define SUDO_DEBUG_INSTANCE_ERROR -2 + +/* Initializer for instance index to indicate that debugging is not setup. */ +#define SUDO_DEBUG_INSTANCE_INITIALIZER -1 + +/* Extract priority number and convert to an index. */ +#define SUDO_DEBUG_PRI(n) (((n) & 0x0f) - 1) + +/* Extract subsystem number and convert to an index. */ +#define SUDO_DEBUG_SUBSYS(n) (((n) >> 6) - 1) + +/* + * Wrapper for sudo_debug_enter() that declares __func__ as needed + * and sets sudo_debug_subsys for sudo_debug_exit(). + */ +#ifdef HAVE___FUNC__ +# define debug_decl_func(funcname) +# define debug_decl_vars(funcname, subsys) \ + const int sudo_debug_subsys = (subsys); +#else +# define debug_decl_func(funcname) \ + const char __func__[] = #funcname; +# define debug_decl_vars(funcname, subsys) \ + const int sudo_debug_subsys = (subsys); \ + debug_decl_func(funcname); +#endif +#define debug_decl(funcname, subsys) \ + debug_decl_vars((funcname), (subsys)) \ + sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys); + +/* + * Wrappers for sudo_debug_exit() and friends. + */ +#define debug_return \ + do { \ + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); \ + return; \ + } while (0) + +#define debug_return_int(ret) \ + do { \ + int sudo_debug_ret = (ret); \ + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_id_t(ret) \ + do { \ + id_t sudo_debug_ret = (ret); \ + sudo_debug_exit_id_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_size_t(ret) \ + do { \ + size_t sudo_debug_ret = (ret); \ + sudo_debug_exit_size_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_ssize_t(ret) \ + do { \ + ssize_t sudo_debug_ret = (ret); \ + sudo_debug_exit_ssize_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_time_t(ret) \ + do { \ + time_t sudo_debug_ret = (ret); \ + sudo_debug_exit_time_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_long(ret) \ + do { \ + long sudo_debug_ret = (ret); \ + sudo_debug_exit_long(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_bool(ret) \ + do { \ + bool sudo_debug_ret = (ret); \ + sudo_debug_exit_bool(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_str(ret) \ + do { \ + char *sudo_debug_ret = (ret); \ + sudo_debug_exit_str(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_const_str(ret) \ + do { \ + const char *sudo_debug_ret = (ret); \ + sudo_debug_exit_str(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_str_masked(ret) \ + do { \ + char *sudo_debug_ret = (ret); \ + sudo_debug_exit_str_masked(__func__, __FILE__, __LINE__, \ + sudo_debug_subsys, sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_ptr(ret) \ + do { \ + void *sudo_debug_ret = (ret); \ + sudo_debug_exit_ptr(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +#define debug_return_const_ptr(ret) \ + do { \ + const void *sudo_debug_ret = (ret); \ + sudo_debug_exit_ptr(__func__, __FILE__, __LINE__, sudo_debug_subsys, \ + sudo_debug_ret); \ + return sudo_debug_ret; \ + } while (0) + +/* + * Variadic macros are a C99 feature but GNU cpp has supported + * a (different) version of them for a long time. + */ +#if defined(NO_VARIADIC_MACROS) +# define sudo_debug_printf sudo_debug_printf_nvm +#elif defined(__GNUC__) && __GNUC__ == 2 +# define sudo_debug_printf(pri, fmt...) \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, (pri)|sudo_debug_subsys, \ + fmt) +#else +# define sudo_debug_printf(pri, ...) \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, (pri)|sudo_debug_subsys, \ + __VA_ARGS__) +#endif + +#define sudo_debug_execve(pri, path, argv, envp) \ + sudo_debug_execve2((pri)|sudo_debug_subsys, (path), (argv), (envp)) + +#define sudo_debug_write(fd, str, len, errnum) \ + sudo_debug_write2(fd, NULL, NULL, 0, (str), (len), (errnum)) + +__dso_public int sudo_debug_deregister_v1(int instance_id); +__dso_public void sudo_debug_enter_v1(const char *func, const char *file, int line, int subsys); +__dso_public void sudo_debug_execve2_v1(int level, const char *path, char *const argv[], char *const envp[]); +__dso_public void sudo_debug_exit_v1(const char *func, const char *file, int line, int subsys); +__dso_public void sudo_debug_exit_bool_v1(const char *func, const char *file, int line, int subsys, bool ret); +__dso_public void sudo_debug_exit_int_v1(const char *func, const char *file, int line, int subsys, int ret); +__dso_public void sudo_debug_exit_long_v1(const char *func, const char *file, int line, int subsys, long ret); +__dso_public void sudo_debug_exit_ptr_v1(const char *func, const char *file, int line, int subsys, const void *ret); +__dso_public void sudo_debug_exit_id_t_v1(const char *func, const char *file, int line, int subsys, id_t ret); +__dso_public void sudo_debug_exit_size_t_v1(const char *func, const char *file, int line, int subsys, size_t ret); +__dso_public void sudo_debug_exit_ssize_t_v1(const char *func, const char *file, int line, int subsys, ssize_t ret); +__dso_public void sudo_debug_exit_str_v1(const char *func, const char *file, int line, int subsys, const char *ret); +__dso_public void sudo_debug_exit_str_masked_v1(const char *func, const char *file, int line, int subsys, const char *ret); +__dso_public void sudo_debug_exit_time_t_v1(const char *func, const char *file, int line, int subsys, time_t ret); +__dso_public pid_t sudo_debug_fork_v1(void); +__dso_public int sudo_debug_get_active_instance_v1(void); +__dso_public int sudo_debug_get_fds_v1(unsigned char **fds); +__dso_public int sudo_debug_get_instance_v1(const char *program); +__dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, int level, const char *fmt, ...) __printf0like(5, 6); +__dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) __printf0like(2, 3); +__dso_public int sudo_debug_register_v1(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files); +__dso_public int sudo_debug_set_active_instance_v1(int inst); +__dso_public void sudo_debug_update_fd_v1(int ofd, int nfd); +__dso_public void sudo_debug_vprintf2_v1(const char *func, const char *file, int line, int level, const char *fmt, va_list ap) __printf0like(5, 0); +__dso_public void sudo_debug_write2_v1(int fd, const char *func, const char *file, int line, const char *str, int len, int errnum); + +#define sudo_debug_deregister(_a) sudo_debug_deregister_v1((_a)) +#define sudo_debug_enter(_a, _b, _c, _d) sudo_debug_enter_v1((_a), (_b), (_c), (_d)) +#define sudo_debug_execve2(_a, _b, _c, _d) sudo_debug_execve2_v1((_a), (_b), (_c), (_d)) +#define sudo_debug_exit(_a, _b, _c, _d) sudo_debug_exit_v1((_a), (_b), (_c), (_d)) +#define sudo_debug_exit_bool(_a, _b, _c, _d, _e) sudo_debug_exit_bool_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_int(_a, _b, _c, _d, _e) sudo_debug_exit_int_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_long(_a, _b, _c, _d, _e) sudo_debug_exit_long_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_ptr(_a, _b, _c, _d, _e) sudo_debug_exit_ptr_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_id_t(_a, _b, _c, _d, _e) sudo_debug_exit_id_t_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_size_t(_a, _b, _c, _d, _e) sudo_debug_exit_size_t_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_ssize_t(_a, _b, _c, _d, _e) sudo_debug_exit_ssize_t_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_str(_a, _b, _c, _d, _e) sudo_debug_exit_str_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_str_masked(_a, _b, _c, _d, _e) sudo_debug_exit_str_masked_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_exit_time_t(_a, _b, _c, _d, _e) sudo_debug_exit_time_t_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_debug_fork() sudo_debug_fork_v1() +#define sudo_debug_get_active_instance() sudo_debug_get_active_instance_v1() +#define sudo_debug_get_fds(_a) sudo_debug_get_fds_v1((_a)) +#define sudo_debug_get_instance(_a) sudo_debug_get_instance_v1((_a)) +#define sudo_debug_printf2 sudo_debug_printf2_v1 +#define sudo_debug_printf_nvm sudo_debug_printf_nvm_v1 +#define sudo_debug_register(_a, _b, _c, _d) sudo_debug_register_v1((_a), (_b), (_c), (_d)) +#define sudo_debug_set_active_instance(_a) sudo_debug_set_active_instance_v1((_a)) +#define sudo_debug_update_fd(_a, _b) sudo_debug_update_fd_v1((_a), (_b)) +#define sudo_debug_vprintf2(_a, _b, _c, _d, _e, _f) sudo_debug_vprintf2_v1((_a), (_b), (_c), (_d), (_e), (_f)) +#define sudo_debug_write2(_a, _b, _c, _d, _e, _f, _g) sudo_debug_write2_v1((_a), (_b), (_c), (_d), (_e), (_f), (_g)) + +#endif /* SUDO_DEBUG_H */ diff --git a/utsudo-0.0.2/include/sudo_digest.h b/utsudo-0.0.2/include/sudo_digest.h new file mode 100644 index 0000000..dcf9736 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_digest.h @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_DIGEST_H +#define SUDO_DIGEST_H + +/* Digest types. */ +#define SUDO_DIGEST_SHA224 0 +#define SUDO_DIGEST_SHA256 1 +#define SUDO_DIGEST_SHA384 2 +#define SUDO_DIGEST_SHA512 3 +#define SUDO_DIGEST_INVALID 4 + +struct sudo_digest; + +/* Public functions. */ +__dso_public struct sudo_digest *sudo_digest_alloc_v1(int digest_type); +__dso_public void sudo_digest_free_v1(struct sudo_digest *dig); +__dso_public void sudo_digest_reset_v1(struct sudo_digest *dig); +__dso_public int sudo_digest_getlen_v1(int digest_type); +__dso_public void sudo_digest_update_v1(struct sudo_digest *dig, const void *data, size_t len); +__dso_public void sudo_digest_final_v1(struct sudo_digest *dig, unsigned char *md); + +#define sudo_digest_alloc(_a) sudo_digest_alloc_v1((_a)) +#define sudo_digest_free(_a) sudo_digest_free_v1((_a)) +#define sudo_digest_reset(_a) sudo_digest_reset_v1((_a)) +#define sudo_digest_getlen(_a) sudo_digest_getlen_v1((_a)) +#define sudo_digest_update(_a, _b, _c) sudo_digest_update_v1((_a), (_b), (_c)) +#define sudo_digest_final(_a, _b) sudo_digest_final_v1((_a), (_b)) + +#endif /* SUDO_DIGEST_H */ diff --git a/utsudo-0.0.2/include/sudo_dso.h b/utsudo-0.0.2/include/sudo_dso.h new file mode 100644 index 0000000..2daf09a --- /dev/null +++ b/utsudo-0.0.2/include/sudo_dso.h @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010, 2013, 2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_DSO_H +#define SUDO_DSO_H + +/* Values for sudo_dso_load() mode. */ +#define SUDO_DSO_LAZY 0x1 +#define SUDO_DSO_NOW 0x2 +#define SUDO_DSO_GLOBAL 0x4 +#define SUDO_DSO_LOCAL 0x8 + +/* Special handle arguments for sudo_dso_findsym(). */ +#define SUDO_DSO_NEXT ((void *)-1) /* Search subsequent objects. */ +#define SUDO_DSO_DEFAULT ((void *)-2) /* Use default search algorithm. */ +#define SUDO_DSO_SELF ((void *)-3) /* Search the caller itself. */ + +/* Internal structs for static linking of plugins. */ +struct sudo_preload_symbol { + const char *name; + void *addr; +}; +struct sudo_preload_table { + const char *path; + void *handle; + struct sudo_preload_symbol *symbols; +}; + +/* Public functions. */ +__dso_public char *sudo_dso_strerror_v1(void); +__dso_public int sudo_dso_unload_v1(void *handle); +__dso_public void *sudo_dso_findsym_v1(void *handle, const char *symbol); +__dso_public void *sudo_dso_load_v1(const char *path, int mode); +__dso_public void sudo_dso_preload_table_v1(struct sudo_preload_table *table); + +#define sudo_dso_strerror() sudo_dso_strerror_v1() +#define sudo_dso_unload(_a) sudo_dso_unload_v1((_a)) +#define sudo_dso_findsym(_a, _b) sudo_dso_findsym_v1((_a), (_b)) +#define sudo_dso_load(_a, _b) sudo_dso_load_v1((_a), (_b)) +#define sudo_dso_preload_table(_a) sudo_dso_preload_table_v1((_a)) + +#endif /* SUDO_DSO_H */ diff --git a/utsudo-0.0.2/include/sudo_event.h b/utsudo-0.0.2/include/sudo_event.h new file mode 100644 index 0000000..6cae833 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_event.h @@ -0,0 +1,195 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015, 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_EVENT_H +#define SUDO_EVENT_H + +#include /* for sigatomic_t and NSIG */ +#include "sudo_queue.h" + +/* Event types */ +#define SUDO_EV_TIMEOUT 0x01 /* fire after timeout */ +#define SUDO_EV_READ 0x02 /* fire when readable */ +#define SUDO_EV_WRITE 0x04 /* fire when writable */ +#define SUDO_EV_PERSIST 0x08 /* persist until deleted */ +#define SUDO_EV_SIGNAL 0x10 /* fire on signal receipt */ +#define SUDO_EV_SIGINFO 0x20 /* fire on signal receipt (siginfo) */ + +/* Event flags (internal) */ +#define SUDO_EVQ_INSERTED 0x01 /* event is on the event queue */ +#define SUDO_EVQ_ACTIVE 0x02 /* event is on the active queue */ +#define SUDO_EVQ_TIMEOUTS 0x04 /* event is on the timeouts queue */ + +/* Event loop flags */ +#define SUDO_EVLOOP_ONCE 0x01 /* Only run once through the loop */ +#define SUDO_EVLOOP_NONBLOCK 0x02 /* Do not block in event loop */ + +/* Event base flags (internal) */ +#define SUDO_EVBASE_LOOPONCE SUDO_EVLOOP_ONCE +#define SUDO_EVBASE_LOOPEXIT 0x02 +#define SUDO_EVBASE_LOOPBREAK 0x04 +#define SUDO_EVBASE_LOOPCONT 0x08 +#define SUDO_EVBASE_GOT_EXIT 0x10 +#define SUDO_EVBASE_GOT_BREAK 0x20 +#define SUDO_EVBASE_GOT_MASK 0xf0 + +typedef void (*sudo_ev_callback_t)(int fd, int what, void *closure); + +/* + * Container for SUDO_EV_SIGINFO events that gets passed as the closure + * pointer. This allows us to pass a siginfo_t without changing everything. + */ +struct sudo_ev_siginfo_container { + void *closure; + siginfo_t *siginfo; + char si_buf[1]; +}; + +/* Member of struct sudo_event_base. */ +struct sudo_event { + TAILQ_ENTRY(sudo_event) entries; + TAILQ_ENTRY(sudo_event) active_entries; + TAILQ_ENTRY(sudo_event) timeouts_entries; + struct sudo_event_base *base; /* base this event belongs to */ + int fd; /* fd/signal we are interested in */ + short events; /* SUDO_EV_* flags (in) */ + short revents; /* SUDO_EV_* flags (out) */ + short flags; /* internal event flags */ + short pfd_idx; /* index into pfds array (XXX) */ + sudo_ev_callback_t callback;/* user-provided callback */ + struct timespec timeout; /* for SUDO_EV_TIMEOUT */ + void *closure; /* user-provided data pointer */ +}; +TAILQ_HEAD(sudo_event_list, sudo_event); + +struct sudo_event_base { + struct sudo_event_list events; /* tail queue of all events */ + struct sudo_event_list active; /* tail queue of active events */ + struct sudo_event_list timeouts; /* tail queue of timeout events */ + struct sudo_event signal_event; /* storage for signal pipe event */ + struct sudo_event_list signals[NSIG]; /* array of signal event tail queues */ + struct sigaction *orig_handlers[NSIG]; /* original signal handlers */ + siginfo_t *siginfo[NSIG]; /* detailed signal info */ + sig_atomic_t signal_pending[NSIG]; /* pending signals */ + sig_atomic_t signal_caught; /* at least one signal caught */ + int num_handlers; /* number of installed handlers */ + int signal_pipe[2]; /* so we can wake up on singal */ +#if defined(HAVE_POLL) || defined(HAVE_PPOLL) + struct pollfd *pfds; /* array of struct pollfd */ + int pfd_max; /* size of the pfds array */ + int pfd_high; /* highest slot used */ + int pfd_free; /* idx of next free entry or pfd_max if full */ +#else + fd_set *readfds_in; /* read I/O descriptor set (in) */ + fd_set *writefds_in; /* write I/O descriptor set (in) */ + fd_set *readfds_out; /* read I/O descriptor set (out) */ + fd_set *writefds_out; /* write I/O descriptor set (out) */ + int maxfd; /* max fd we can store in readfds/writefds */ + int highfd; /* highest fd to pass as 1st arg to select */ +#endif /* HAVE_POLL */ + unsigned int flags; /* SUDO_EVBASE_* */ +}; + +/* Allocate a new event base. */ +__dso_public struct sudo_event_base *sudo_ev_base_alloc_v1(void); +#define sudo_ev_base_alloc() sudo_ev_base_alloc_v1() + +/* Free an event base. */ +__dso_public void sudo_ev_base_free_v1(struct sudo_event_base *base); +#define sudo_ev_base_free(_a) sudo_ev_base_free_v1((_a)) + +/* Set the default event base. */ +__dso_public void sudo_ev_base_setdef_v1(struct sudo_event_base *base); +#define sudo_ev_base_setdef(_a) sudo_ev_base_setdef_v1((_a)) + +/* Allocate a new event. */ +__dso_public struct sudo_event *sudo_ev_alloc_v1(int fd, short events, sudo_ev_callback_t callback, void *closure); +#define sudo_ev_alloc(_a, _b, _c, _d) sudo_ev_alloc_v1((_a), (_b), (_c), (_d)) + +/* Free an event. */ +__dso_public void sudo_ev_free_v1(struct sudo_event *ev); +#define sudo_ev_free(_a) sudo_ev_free_v1((_a)) + +/* Add an event, returns 0 on success, -1 on error */ +__dso_public int sudo_ev_add_v1(struct sudo_event_base *head, struct sudo_event *ev, struct timeval *timo, bool tohead); +__dso_public int sudo_ev_add_v2(struct sudo_event_base *head, struct sudo_event *ev, struct timespec *timo, bool tohead); +#define sudo_ev_add(_a, _b, _c, _d) sudo_ev_add_v2((_a), (_b), (_c), (_d)) + +/* Delete an event, returns 0 on success, -1 on error */ +__dso_public int sudo_ev_del_v1(struct sudo_event_base *head, struct sudo_event *ev); +#define sudo_ev_del(_a, _b) sudo_ev_del_v1((_a), (_b)) + +/* Dispatch events, returns SUDO_CB_SUCCESS, SUDO_CB_BREAK or SUDO_CB_ERROR */ +__dso_public int sudo_ev_dispatch_v1(struct sudo_event_base *head); +#define sudo_ev_dispatch(_a) sudo_ev_dispatch_v1((_a)) + +/* Main event loop, returns SUDO_CB_SUCCESS, SUDO_CB_BREAK or SUDO_CB_ERROR */ +__dso_public int sudo_ev_loop_v1(struct sudo_event_base *head, int flags); +#define sudo_ev_loop(_a, _b) sudo_ev_loop_v1((_a), (_b)) + +/* Return the remaining timeout associated with an event. */ +__dso_public int sudo_ev_get_timeleft_v1(struct sudo_event *ev, struct timeval *tv); +__dso_public int sudo_ev_get_timeleft_v2(struct sudo_event *ev, struct timespec *tv); +#define sudo_ev_get_timeleft(_a, _b) sudo_ev_get_timeleft_v2((_a), (_b)) + +/* Cause the event loop to exit after one run through. */ +__dso_public void sudo_ev_loopexit_v1(struct sudo_event_base *base); +#define sudo_ev_loopexit(_a) sudo_ev_loopexit_v1((_a)) + +/* Break out of the event loop right now. */ +__dso_public void sudo_ev_loopbreak_v1(struct sudo_event_base *base); +#define sudo_ev_loopbreak(_a) sudo_ev_loopbreak_v1((_a)) + +/* Rescan for events and restart the event loop. */ +__dso_public void sudo_ev_loopcontinue_v1(struct sudo_event_base *base); +#define sudo_ev_loopcontinue(_a) sudo_ev_loopcontinue_v1((_a)) + +/* Returns true if event loop stopped due to sudo_ev_loopexit(). */ +__dso_public bool sudo_ev_got_exit_v1(struct sudo_event_base *base); +#define sudo_ev_got_exit(_a) sudo_ev_got_exit_v1((_a)) + +/* Returns true if event loop stopped due to sudo_ev_loopbreak(). */ +__dso_public bool sudo_ev_got_break_v1(struct sudo_event_base *base); +#define sudo_ev_got_break(_a) sudo_ev_got_break_v1((_a)) + +/* Return the fd associated with an event. */ +#define sudo_ev_get_fd(_ev) ((_ev) ? (_ev)->fd : -1) + +/* Return the (absolute) timeout associated with an event or NULL. */ +#define sudo_ev_get_timeout(_ev) \ + (ISSET((_ev)->flags, SUDO_EVQ_TIMEOUTS) ? &(_ev)->timeout : NULL) + +/* Return the base an event is associated with or NULL. */ +#define sudo_ev_get_base(_ev) ((_ev) ? (_ev)->base : NULL) + +/* Magic pointer value to use self pointer as callback arg. */ +#define sudo_ev_self_cbarg() ((void *)-1) + +/* Add an event to the base's active queue and mark it active (internal). */ +void sudo_ev_activate(struct sudo_event_base *base, struct sudo_event *ev); + +/* + * Backend implementation. + */ +int sudo_ev_base_alloc_impl(struct sudo_event_base *base); +void sudo_ev_base_free_impl(struct sudo_event_base *base); +int sudo_ev_add_impl(struct sudo_event_base *base, struct sudo_event *ev); +int sudo_ev_del_impl(struct sudo_event_base *base, struct sudo_event *ev); +int sudo_ev_scan_impl(struct sudo_event_base *base, int flags); + +#endif /* SUDO_EVENT_H */ diff --git a/utsudo-0.0.2/include/sudo_fatal.h b/utsudo-0.0.2/include/sudo_fatal.h new file mode 100644 index 0000000..3d78e12 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_fatal.h @@ -0,0 +1,207 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004, 2010-2015, 2017-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_FATAL_H +#define SUDO_FATAL_H + +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +/* + * We wrap fatal/fatalx and warn/warnx so that the same output can + * go to the debug file, if there is one. + */ +#if (defined(SUDO_ERROR_WRAP) && SUDO_ERROR_WRAP == 0) || defined(NO_VARIADIC_MACROS) +# define sudo_fatal sudo_fatal_nodebug_v1 +# define sudo_fatalx sudo_fatalx_nodebug_v1 +# define sudo_gai_fatal sudo_gai_fatal_nodebug_v1 +# define sudo_warn sudo_warn_nodebug_v1 +# define sudo_warnx sudo_warnx_nodebug_v1 +# define sudo_gai_warn sudo_gai_warn_nodebug_v1 +# define sudo_vfatal(fmt, ap) sudo_vfatal_nodebug_v1((fmt), (ap)) +# define sudo_vfatalx(fmt, ap) sudo_vfatalx_nodebug_v1((fmt), (ap)) +# define sudo_gai_vfatal(en, fmt, ap) sudo_vfatal_nodebug_v1((en), (fmt), (ap)) +# define sudo_vwarn(fmt, ap) sudo_vwarn_nodebug_v1((fmt), (ap)) +# define sudo_vwarnx(fmt, ap) sudo_vwarnx_nodebug_v1((fmt), (ap)) +# define sudo_gai_vwarn(en, fmt, ap) sudo_vwarn_nodebug_v1((en), (fmt), (ap)) +#else /* SUDO_ERROR_WRAP */ +# if defined(__GNUC__) && __GNUC__ == 2 +# define sudo_fatal(fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + fmt); \ + sudo_fatal_nodebug_v1(fmt); \ +} while (0) +# define sudo_fatalx(fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \ + sudo_fatalx_nodebug_v1(fmt); \ +} while (0) +# define sudo_gai_fatal(en, fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \ + sudo_gai_fatal_nodebug_v1((en), fmt); \ +} while (0) +# define sudo_warn(fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + fmt); \ + sudo_warn_nodebug_v1(fmt); \ +} while (0) +# define sudo_warnx(fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \ + sudo_warnx_nodebug_v1(fmt); \ +} while (0) +# define sudo_gai_warn(en, fmt...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, fmt); \ + sudo_gai_warn_nodebug_v1((en), fmt); \ +} while (0) +# else +# define sudo_fatal(...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + __VA_ARGS__); \ + sudo_fatal_nodebug_v1(__VA_ARGS__); \ +} while (0) +# define sudo_fatalx(...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \ + sudo_fatalx_nodebug_v1(__VA_ARGS__); \ +} while (0) +# define sudo_gai_fatal(en, ...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \ + sudo_gai_fatal_nodebug_v1((en), __VA_ARGS__); \ +} while (0) +# define sudo_warn(...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + __VA_ARGS__); \ + sudo_warn_nodebug_v1(__VA_ARGS__); \ +} while (0) +# define sudo_warnx(...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \ + sudo_warnx_nodebug_v1(__VA_ARGS__); \ +} while (0) +# define sudo_gai_warn(en, ...) do { \ + sudo_debug_printf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, __VA_ARGS__); \ + sudo_gai_warn_nodebug_v1((en), __VA_ARGS__); \ +} while (0) +# endif /* __GNUC__ == 2 */ +# define sudo_vfatal(fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + (fmt), ap2); \ + sudo_vfatal_nodebug_v1((fmt), (ap)); \ +} while (0) +# define sudo_vfatalx(fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \ + sudo_vfatalx_nodebug_v1((fmt), (ap)); \ +} while (0) +# define sudo_gai_vfatal(en, fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \ + sudo_gai_vfatal_nodebug_v1((en), (fmt), (ap)); \ +} while (0) +# define sudo_vwarn(fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO|sudo_debug_subsys, \ + (fmt), ap2); \ + sudo_vwarn_nodebug_v1((fmt), (ap)); \ +} while (0) +# define sudo_vwarnx(fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \ + sudo_vwarnx_nodebug_v1((fmt), (ap)); \ +} while (0) +# define sudo_gai_vwarn(en, fmt, ap) do { \ + va_list ap2; \ + va_copy(ap2, (ap)); \ + sudo_debug_vprintf2(__func__, __FILE__, __LINE__, \ + SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|sudo_debug_subsys, (fmt), ap2); \ + sudo_gai_vwarn_nodebug_v1((en), (fmt), (ap)); \ +} while (0) +#endif /* SUDO_ERROR_WRAP */ + +typedef void (*sudo_fatal_callback_t)(void); + +struct sudo_conv_message; +struct sudo_conv_reply; +struct sudo_conv_callback; + +__dso_public int sudo_fatal_callback_deregister_v1(sudo_fatal_callback_t func); +__dso_public int sudo_fatal_callback_register_v1(sudo_fatal_callback_t func); +__dso_public char *sudo_warn_gettext_v1(const char *domainname, const char *msgid) __format_arg(2); +__dso_public void sudo_warn_set_locale_func_v1(bool (*func)(bool, int *)); +__dso_public void sudo_fatal_nodebug_v1(const char *fmt, ...) __printf0like(1, 2) __attribute__((__noreturn__)); +__dso_public void sudo_fatalx_nodebug_v1(const char *fmt, ...) __printflike(1, 2) __attribute__((__noreturn__)); +__dso_public void sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) __printflike(2, 3) __attribute__((__noreturn__)); +__dso_public void sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) __printf0like(1, 0) __attribute__((__noreturn__)); +__dso_public void sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) __printflike(1, 0) __attribute__((__noreturn__)); +__dso_public void sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) __printflike(2, 0) __attribute__((__noreturn__)); +__dso_public void sudo_warn_nodebug_v1(const char *fmt, ...) __printf0like(1, 2); +__dso_public void sudo_warnx_nodebug_v1(const char *fmt, ...) __printflike(1, 2); +__dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) __printflike(2, 3); +__dso_public void sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) __printf0like(1, 0); +__dso_public void sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) __printflike(1, 0); +__dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) __printflike(2, 0); +__dso_public void sudo_warn_set_conversation_v1(int (*conv)(int num_msgs, const struct sudo_conv_message *msgs, struct sudo_conv_reply *replies, struct sudo_conv_callback *callback)); + +#define sudo_fatal_callback_deregister(_a) sudo_fatal_callback_deregister_v1((_a)) +#define sudo_fatal_callback_register(_a) sudo_fatal_callback_register_v1((_a)) +#define sudo_warn_set_locale_func(_a) sudo_warn_set_locale_func_v1((_a)) +#define sudo_fatal_nodebug sudo_fatal_nodebug_v1 +#define sudo_fatalx_nodebug sudo_fatalx_nodebug_v1 +#define sudo_gai_fatal_nodebug sudo_gai_fatal_nodebug_v1 +#define sudo_vfatal_nodebug(_a, _b) sudo_vfatal_nodebug_v1((_a), (_b)) +#define sudo_vfatalx_nodebug(_a, _b) sudo_vfatalx_nodebug_v1((_a), (_b)) +#define sudo_gai_vfatal_nodebug(_a, _b, _c) sudo_gai_vfatal_nodebug_v1((_a), (_b), (_c)) +#define sudo_warn_nodebug sudo_warn_nodebug_v1 +#define sudo_warnx_nodebug sudo_warnx_nodebug_v1 +#define sudo_gai_warn_nodebug sudo_gai_warn_nodebug_v1 +#define sudo_vwarn_nodebug(_a, _b) sudo_vwarn_nodebug_v1((_a), (_b)) +#define sudo_vwarnx_nodebug(_a, _b) sudo_vwarnx_nodebug_v1((_a), (_b)) +#define sudo_gai_vwarn_nodebug(_a, _b, _c) sudo_gai_vwarn_nodebug_v1((_a), (_b), (_c)) +#define sudo_warn_set_conversation(_a) sudo_warn_set_conversation_v1(_a) + +#ifdef DEFAULT_TEXT_DOMAIN +# define sudo_warn_gettext(_a) sudo_warn_gettext_v1(DEFAULT_TEXT_DOMAIN, (_a)) +#else +# define sudo_warn_gettext(_a) sudo_warn_gettext_v1(NULL, (_a)) +#endif + +#endif /* SUDO_FATAL_H */ diff --git a/utsudo-0.0.2/include/sudo_gettext.h b/utsudo-0.0.2/include/sudo_gettext.h new file mode 100644 index 0000000..16275ab --- /dev/null +++ b/utsudo-0.0.2/include/sudo_gettext.h @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_GETTEXT_H +#define SUDO_GETTEXT_H + +/* + * Solaris locale.h includes libintl.h which causes problems when we + * redefine the gettext functions. We include it first to avoid this. + */ +#include + +#ifdef HAVE_LIBINTL_H + +# include + +/* + * If DEFAULT_TEXT_DOMAIN is defined, use its value as the domain for + * gettext() and ngettext() instead of the value set by textdomain(). + * This is used by the sudoers plugin as well as the convenience libraries. + */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(String) \ + dgettext(DEFAULT_TEXT_DOMAIN, String) +# undef ngettext +# define ngettext(String, String_Plural, N) \ + dngettext(DEFAULT_TEXT_DOMAIN, String, String_Plural, N) +# endif + +/* + * Older versions of Solaris lack ngettext() so we have to kludge it. + */ +# ifndef HAVE_NGETTEXT +# undef ngettext +# define ngettext(String, String_Plural, N) \ + ((N) == 1 ? gettext(String) : gettext(String_Plural)) +# endif + +/* Gettext convenience macros */ +# define _(String) gettext(String) +# define gettext_noop(String) String +# define N_(String) gettext_noop(String) +# define U_(String) sudo_warn_gettext(String) + +#else /* !HAVE_LIBINTL_H */ + +/* + * Internationalization is either unavailable or has been disabled. + * Define away the gettext functions used by sudo. + */ +# define _(String) String +# define N_(String) String +# define U_(String) String +# define textdomain(Domain) +# define bindtextdomain(Package, Directory) +# define ngettext(String, String_Plural, N) \ + ((N) == 1 ? (String) : (String_Plural)) + +#endif /* HAVE_LIBINTL_H */ + +#endif /* SUDO_GETTEXT_H */ diff --git a/utsudo-0.0.2/include/sudo_lbuf.h b/utsudo-0.0.2/include/sudo_lbuf.h new file mode 100644 index 0000000..4c81780 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_lbuf.h @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007, 2010, 2011, 2013-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_LBUF_H +#define SUDO_LBUF_H + +/* + * Line buffer struct. + */ +struct sudo_lbuf { + int (*output)(const char *); + char *buf; + const char *continuation; + int indent; + int len; + int size; + short cols; + short error; +}; + +typedef int (*sudo_lbuf_output_t)(const char *); + +__dso_public void sudo_lbuf_init_v1(struct sudo_lbuf *lbuf, sudo_lbuf_output_t output, int indent, const char *continuation, int cols); +__dso_public void sudo_lbuf_destroy_v1(struct sudo_lbuf *lbuf); +__dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) __printflike(2, 3); +__dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) __printflike(3, 4); +__dso_public void sudo_lbuf_print_v1(struct sudo_lbuf *lbuf); +__dso_public bool sudo_lbuf_error_v1(struct sudo_lbuf *lbuf); +__dso_public void sudo_lbuf_clearerr_v1(struct sudo_lbuf *lbuf); + +#define sudo_lbuf_init(_a, _b, _c, _d, _e) sudo_lbuf_init_v1((_a), (_b), (_c), (_d), (_e)) +#define sudo_lbuf_destroy(_a) sudo_lbuf_destroy_v1((_a)) +#define sudo_lbuf_append sudo_lbuf_append_v1 +#define sudo_lbuf_append_quoted sudo_lbuf_append_quoted_v1 +#define sudo_lbuf_print(_a) sudo_lbuf_print_v1((_a)) +#define sudo_lbuf_error(_a) sudo_lbuf_error_v1((_a)) +#define sudo_lbuf_clearerr(_a) sudo_lbuf_clearerr_v1((_a)) + +#endif /* SUDO_LBUF_H */ diff --git a/utsudo-0.0.2/include/sudo_plugin.h b/utsudo-0.0.2/include/sudo_plugin.h new file mode 100644 index 0000000..1ca3eb7 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_plugin.h @@ -0,0 +1,203 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PLUGIN_H +#define SUDO_PLUGIN_H + +/* API version major/minor */ +#define SUDO_API_VERSION_MAJOR 1 +#define SUDO_API_VERSION_MINOR 14 +#define SUDO_API_MKVERSION(x, y) (((x) << 16) | (y)) +#define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR, SUDO_API_VERSION_MINOR) + +/* Getters and setters for plugin API versions */ +#define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16) +#define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffffU) +#define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \ + *(vp) = (*(vp) & 0x0000ffffU) | ((n) << 16); \ +} while(0) +#define SUDO_API_VERSION_SET_MINOR(vp, n) do { \ + *(vp) = (*(vp) & 0xffff0000U) | (n); \ +} while(0) + +/* Conversation function types and defines */ +struct sudo_conv_message { +#define SUDO_CONV_PROMPT_ECHO_OFF 0x0001 /* do not echo user input */ +#define SUDO_CONV_PROMPT_ECHO_ON 0x0002 /* echo user input */ +#define SUDO_CONV_ERROR_MSG 0x0003 /* error message */ +#define SUDO_CONV_INFO_MSG 0x0004 /* informational message */ +#define SUDO_CONV_PROMPT_MASK 0x0005 /* mask user input */ +#define SUDO_CONV_PROMPT_ECHO_OK 0x1000 /* flag: allow echo if no tty */ +#define SUDO_CONV_PREFER_TTY 0x2000 /* flag: use tty if possible */ + int msg_type; + int timeout; + const char *msg; +}; + +/* + * Maximum length of a reply (not including the trailing NUL) when + * conversing with the user. In practical terms, this is the longest + * password sudo will support. This means that a buffer of size + * SUDO_CONV_REPL_MAX+1 is guaranteed to be able to hold any reply + * from the conversation function. It is also useful as a max value + * for memset_s() when clearing passwords returned by the conversation + * function. + */ +#define SUDO_CONV_REPL_MAX 255 + +struct sudo_conv_reply { + char *reply; +}; + +/* Conversation callback API version major/minor */ +#define SUDO_CONV_CALLBACK_VERSION_MAJOR 1 +#define SUDO_CONV_CALLBACK_VERSION_MINOR 0 +#define SUDO_CONV_CALLBACK_VERSION SUDO_API_MKVERSION(SUDO_CONV_CALLBACK_VERSION_MAJOR, SUDO_CONV_CALLBACK_VERSION_MINOR) + +/* + * Callback struct to be passed to the conversation function. + * Can be used to perform operations on suspend/resume such + * as dropping/acquiring locks. + */ +typedef int (*sudo_conv_callback_fn_t)(int signo, void *closure); +struct sudo_conv_callback { + unsigned int version; + void *closure; + sudo_conv_callback_fn_t on_suspend; + sudo_conv_callback_fn_t on_resume; +}; + +typedef int (*sudo_conv_t)(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback); +typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...); + +/* + * Hooks allow a plugin to hook into specific sudo and/or libc functions. + */ + +/* Hook functions typedefs. */ +typedef int (*sudo_hook_fn_t)(); +typedef int (*sudo_hook_fn_setenv_t)(const char *name, const char *value, int overwrite, void *closure); +typedef int (*sudo_hook_fn_putenv_t)(char *string, void *closure); +typedef int (*sudo_hook_fn_getenv_t)(const char *name, char **value, void *closure); +typedef int (*sudo_hook_fn_unsetenv_t)(const char *name, void *closure); + +/* Hook structure definition. */ +struct sudo_hook { + unsigned int hook_version; + unsigned int hook_type; + sudo_hook_fn_t hook_fn; + void *closure; +}; + +/* Hook API version major/minor */ +#define SUDO_HOOK_VERSION_MAJOR 1 +#define SUDO_HOOK_VERSION_MINOR 0 +#define SUDO_HOOK_VERSION SUDO_API_MKVERSION(SUDO_HOOK_VERSION_MAJOR, SUDO_HOOK_VERSION_MINOR) + +/* + * Hook function return values. + */ +#define SUDO_HOOK_RET_ERROR -1 /* error */ +#define SUDO_HOOK_RET_NEXT 0 /* go to the next hook in the list */ +#define SUDO_HOOK_RET_STOP 1 /* stop hook processing for this type */ + +/* + * Hooks for setenv/unsetenv/putenv/getenv. + * This allows the plugin to be notified when a PAM module modifies + * the environment so it can update the copy of the environment that + * is passed to execve(). + */ +#define SUDO_HOOK_SETENV 1 +#define SUDO_HOOK_UNSETENV 2 +#define SUDO_HOOK_PUTENV 3 +#define SUDO_HOOK_GETENV 4 + +/* Policy plugin type and defines */ +struct passwd; +struct policy_plugin { +#define SUDO_POLICY_PLUGIN 1 + unsigned int type; /* always SUDO_POLICY_PLUGIN */ + unsigned int version; /* always SUDO_API_VERSION */ + int (*open)(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const user_env[], + char * const plugin_options[]); + void (*close)(int exit_status, int error); /* wait status or error */ + int (*show_version)(int verbose); + int (*check_policy)(int argc, char * const argv[], + char *env_add[], char **command_info[], + char **argv_out[], char **user_env_out[]); + int (*list)(int argc, char * const argv[], int verbose, + const char *list_user); + int (*validate)(void); + void (*invalidate)(int remove); + int (*init_session)(struct passwd *pwd, char **user_env_out[]); + void (*register_hooks)(int version, int (*register_hook)(struct sudo_hook *hook)); + void (*deregister_hooks)(int version, int (*deregister_hook)(struct sudo_hook *hook)); +}; + +/* I/O plugin type and defines */ +struct io_plugin { +#define SUDO_IO_PLUGIN 2 + unsigned int type; /* always SUDO_IO_PLUGIN */ + unsigned int version; /* always SUDO_API_VERSION */ + int (*open)(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], + char * const plugin_options[]); + void (*close)(int exit_status, int error); /* wait status or error */ + int (*show_version)(int verbose); + int (*log_ttyin)(const char *buf, unsigned int len); + int (*log_ttyout)(const char *buf, unsigned int len); + int (*log_stdin)(const char *buf, unsigned int len); + int (*log_stdout)(const char *buf, unsigned int len); + int (*log_stderr)(const char *buf, unsigned int len); + void (*register_hooks)(int version, int (*register_hook)(struct sudo_hook *hook)); + void (*deregister_hooks)(int version, int (*deregister_hook)(struct sudo_hook *hook)); + int (*change_winsize)(unsigned int line, unsigned int cols); + int (*log_suspend)(int signo); +}; + +/* Sudoers group plugin version major/minor */ +#define GROUP_API_VERSION_MAJOR 1 +#define GROUP_API_VERSION_MINOR 0 +#define GROUP_API_VERSION SUDO_API_MKVERSION(GROUP_API_VERSION_MAJOR, GROUP_API_VERSION_MINOR) + +/* Getters and setters for group version (for source compat only) */ +#define GROUP_API_VERSION_GET_MAJOR(v) SUDO_API_VERSION_GET_MAJOR(v) +#define GROUP_API_VERSION_GET_MINOR(v) SUDO_API_VERSION_GET_MINOR(v) +#define GROUP_API_VERSION_SET_MAJOR(vp, n) SUDO_API_VERSION_SET_MAJOR(vp, n) +#define GROUP_API_VERSION_SET_MINOR(vp, n) SUDO_API_VERSION_SET_MINOR(vp, n) + +/* + * version: for compatibility checking + * group_init: return 1 on success, 0 if unconfigured, -1 on error. + * group_cleanup: called to clean up resources used by provider + * user_in_group: returns 1 if user is in group, 0 if not. + * note that pwd may be NULL if the user is not in passwd. + */ +struct sudoers_group_plugin { + unsigned int version; + int (*init)(int version, sudo_printf_t sudo_printf, char *const argv[]); + void (*cleanup)(void); + int (*query)(const char *user, const char *group, const struct passwd *pwd); +}; + +#endif /* SUDO_PLUGIN_H */ diff --git a/utsudo-0.0.2/include/sudo_queue.h b/utsudo-0.0.2/include/sudo_queue.h new file mode 100644 index 0000000..f055957 --- /dev/null +++ b/utsudo-0.0.2/include/sudo_queue.h @@ -0,0 +1,823 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD: head/sys/sys/queue.h 251887 2013-06-18 02:57:56Z lstewart $ + */ + +#ifndef SUDO_QUEUE_H +#define SUDO_QUEUE_H + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may be traversed in either direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A headless tail queue lacks a head structure, The first element acts + * as a de facto list head. It uses the same entry struct as a regular + * tail queue for easy conversion from headless to headful. + * It is capable of concatenating queues as well as individual elements. + * Traversing in reverse is more expensive due to lack of a list head. + * Note: elements must be initialized before use. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - + - + + * _LAST - - + + + * _FOREACH + + + + + * _FOREACH_FROM + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_FROM_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_FROM - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _FOREACH_REVERSE_FROM_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT - - + + + * _REMOVE_AFTER + - + - + * _REMOVE_HEAD + - + - + * _REMOVE + + + + + * _SWAP + + + + + * + */ +#ifdef QUEUE_MACRO_DEBUG +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + unsigned long lastline; + unsigned long prevline; + const char *lastfile; + const char *prevfile; +}; + +#undef TRACEBUF +#define TRACEBUF struct qm_trace trace; +#undef TRACEBUF_INITIALIZER +#define TRACEBUF_INITIALIZER { __FILE__, __LINE__, NULL, 0 } , +#undef TRASHIT +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) +#undef QMD_SAVELINK +#define QMD_SAVELINK(name, link) void **name = (void *)&(link) + +#undef QMD_TRACE_HEAD +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#undef QMD_TRACE_ELEM +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else +#undef QMD_TRACE_ELEM +#define QMD_TRACE_ELEM(elem) +#undef QMD_TRACE_HEAD +#define QMD_TRACE_HEAD(head) +#undef QMD_SAVELINK +#define QMD_SAVELINK(name, link) +#undef TRACEBUF +#define TRACEBUF +#undef TRACEBUF_INITIALIZER +#define TRACEBUF_INITIALIZER +#undef TRASHIT +#define TRASHIT(x) +#endif /* QUEUE_MACRO_DEBUG */ + +/* + * XXX - Work around a bug in the llvm static analyzer. + * https://bugs.llvm.org//show_bug.cgi?id=18222 + */ +#ifdef __clang_analyzer__ +# define ANALYZER_ASSERT(x) do { \ + if (!__builtin_expect(!(x), 0)) \ + __builtin_trap(); \ +} while (0) +#else +# define ANALYZER_ASSERT(x) do {} while (0) +#endif /* __clang_analyzer__ */ + + /* + * Singly-linked List declarations. + */ +#undef SLIST_HEAD +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#undef SLIST_HEAD_INITIALIZER +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#undef SLIST_ENTRY +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#undef SLIST_EMPTY +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#undef SLIST_FIRST +#define SLIST_FIRST(head) ((head)->slh_first) + +#undef SLIST_FOREACH +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#undef SLIST_FOREACH_FROM +#define SLIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#undef SLIST_FOREACH_SAFE +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef SLIST_FOREACH_FROM_SAFE +#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef SLIST_FOREACH_PREVPTR +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#undef SLIST_INIT +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#undef SLIST_INSERT_AFTER +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#undef SLIST_INSERT_HEAD +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#undef SLIST_NEXT +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#undef SLIST_REMOVE +#define SLIST_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = SLIST_FIRST((head)); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_REMOVE_AFTER(curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#undef SLIST_REMOVE_AFTER +#define SLIST_REMOVE_AFTER(elm, field) do { \ + SLIST_NEXT(elm, field) = \ + SLIST_NEXT(SLIST_NEXT(elm, field), field); \ +} while (0) + +#undef SLIST_REMOVE_HEAD +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +#undef SLIST_SWAP +#define SLIST_SWAP(head1, head2, type) do { \ + struct type *swap_first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = swap_first; \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#undef STAILQ_HEAD +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#undef STAILQ_HEAD_INITIALIZER +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#undef STAILQ_ENTRY +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#undef STAILQ_CONCAT +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#undef STAILQ_EMPTY +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#undef STAILQ_FIRST +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#undef STAILQ_FOREACH +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#undef STAILQ_FOREACH_FROM +#define STAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#undef STAILQ_FOREACH_SAFE +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef STAILQ_FOREACH_FROM_SAFE +#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef STAILQ_INIT +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#undef STAILQ_INSERT_AFTER +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#undef STAILQ_INSERT_HEAD +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#undef STAILQ_INSERT_TAIL +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#undef STAILQ_LAST +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? NULL : \ + __containerof((head)->stqh_last, struct type, field.stqe_next)) + +#undef STAILQ_NEXT +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#undef STAILQ_REMOVE +#define STAILQ_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = STAILQ_FIRST((head)); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + STAILQ_REMOVE_AFTER(head, curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#undef STAILQ_REMOVE_AFTER +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#undef STAILQ_REMOVE_HEAD +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#undef STAILQ_SWAP +#define STAILQ_SWAP(head1, head2, type) do { \ + struct type *swap_first = STAILQ_FIRST(head1); \ + struct type **swap_last = (head1)->stqh_last; \ + STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_FIRST(head2) = swap_first; \ + (head2)->stqh_last = swap_last; \ + if (STAILQ_EMPTY(head1)) \ + (head1)->stqh_last = &STAILQ_FIRST(head1); \ + if (STAILQ_EMPTY(head2)) \ + (head2)->stqh_last = &STAILQ_FIRST(head2); \ +} while (0) + + +/* + * List declarations. + */ +#undef LIST_HEAD +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#undef LIST_HEAD_INITIALIZER +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#undef LIST_ENTRY +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#undef LIST_EMPTY +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#undef LIST_FIRST +#define LIST_FIRST(head) ((head)->lh_first) + +#undef LIST_FOREACH +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#undef LIST_FOREACH_FROM +#define LIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#undef LIST_FOREACH_SAFE +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef LIST_FOREACH_FROM_SAFE +#define LIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef LIST_INIT +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#undef LIST_INSERT_AFTER +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#undef LIST_INSERT_BEFORE +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#undef LIST_INSERT_HEAD +#define LIST_INSERT_HEAD(head, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#undef LIST_NEXT +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#undef LIST_PREV +#define LIST_PREV(elm, head, type, field) \ + ((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL : \ + __containerof((elm)->field.le_prev, struct type, field.le_next)) + +#undef LIST_REMOVE +#define LIST_REMOVE(elm, field) do { \ + ANALYZER_ASSERT(elm != NULL); \ + QMD_SAVELINK(oldnext, (elm)->field.le_next); \ + QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ +} while (0) + +#undef LIST_SWAP +#define LIST_SWAP(head1, head2, type, field) do { \ + struct type *swap_tmp = LIST_FIRST((head1)); \ + LIST_FIRST((head1)) = LIST_FIRST((head2)); \ + LIST_FIRST((head2)) = swap_tmp; \ + if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ + if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ +} while (0) + +/* + * Tail queue declarations. + */ +#undef TAILQ_HEAD +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#undef TAILQ_HEAD_INITIALIZER +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first, TRACEBUF_INITIALIZER } + +#undef TAILQ_ENTRY +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +/* + * Tail queue functions. + */ +#undef TAILQ_CONCAT +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head1); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#undef TAILQ_EMPTY +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#undef TAILQ_FIRST +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#undef TAILQ_FOREACH +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#undef TAILQ_FOREACH_FROM +#define TAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#undef TAILQ_FOREACH_SAFE +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef TAILQ_FOREACH_FROM_SAFE +#define TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#undef TAILQ_FOREACH_REVERSE +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#undef TAILQ_FOREACH_REVERSE_FROM +#define TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#undef TAILQ_FOREACH_REVERSE_SAFE +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#undef TAILQ_FOREACH_REVERSE_FROM_SAFE +#define TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#undef TAILQ_INIT +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#undef TAILQ_INSERT_AFTER +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#undef TAILQ_INSERT_BEFORE +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#undef TAILQ_INSERT_HEAD +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#undef TAILQ_INSERT_TAIL +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#undef TAILQ_LAST +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +#undef TAILQ_NEXT +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#undef TAILQ_PREV +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#undef TAILQ_REMOVE +#define TAILQ_REMOVE(head, elm, field) do { \ + ANALYZER_ASSERT(elm != NULL); \ + QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ + QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#undef TAILQ_SWAP +#define TAILQ_SWAP(head1, head2, type, field) do { \ + struct type *swap_first = (head1)->tqh_first; \ + struct type **swap_last = (head1)->tqh_last; \ + (head1)->tqh_first = (head2)->tqh_first; \ + (head1)->tqh_last = (head2)->tqh_last; \ + (head2)->tqh_first = swap_first; \ + (head2)->tqh_last = swap_last; \ + if ((swap_first = (head1)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head1)->tqh_first; \ + else \ + (head1)->tqh_last = &(head1)->tqh_first; \ + if ((swap_first = (head2)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head2)->tqh_first; \ + else \ + (head2)->tqh_last = &(head2)->tqh_first; \ +} while (0) + +/* + * Headless Tail queue definitions. + */ +#undef HLTQ_ENTRY +#define HLTQ_ENTRY(type) TAILQ_ENTRY(type) + +#undef HLTQ_INIT +#define HLTQ_INIT(entry, field) do { \ + (entry)->field.tqe_next = NULL; \ + (entry)->field.tqe_prev = &(entry)->field.tqe_next; \ +} while (0) + +#undef HLTQ_INITIALIZER +#define HLTQ_INITIALIZER(entry, field) \ + { NULL, &(entry)->field.tqe_next } + +#undef HLTQ_FIRST +#define HLTQ_FIRST(elm) (elm) + +#undef HLTQ_END +#define HLTQ_END(elm) NULL + +#undef HLTQ_NEXT +#define HLTQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#undef HLTQ_LAST +#define HLTQ_LAST(elm, type, field) \ + ((elm)->field.tqe_next == NULL ? (elm) : \ + __containerof((elm)->field.tqe_prev, struct type, field.tqe_next)) + +#undef HLTQ_PREV +#define HLTQ_PREV(elm, type, field) \ + (*(elm)->field.tqe_prev == NULL ? NULL : \ + __containerof((elm)->field.tqe_prev, struct type, field.tqe_next)) + +#undef HLTQ_FOREACH +#define HLTQ_FOREACH(var, head, field) \ + for ((var) = HLTQ_FIRST(head); \ + (var) != HLTQ_END(head); \ + (var) = HLTQ_NEXT(var, field)) + +#undef HLTQ_FOREACH_SAFE +#define HLTQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = HLTQ_FIRST(head); \ + (var) != HLTQ_END(head) && \ + ((tvar) = HLTQ_NEXT(var, field), 1); \ + (var) = (tvar)) + +#undef HLTQ_FOREACH_REVERSE +#define HLTQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = HLTQ_LAST(head, headname); \ + (var) != HLTQ_END(head); \ + (var) = HLTQ_PREV(var, headname, field)) + +#undef HLTQ_FOREACH_REVERSE_SAFE +#define HLTQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = HLTQ_LAST(head, headname); \ + (var) != HLTQ_END(head) && \ + ((tvar) = HLTQ_PREV(var, headname, field), 1); \ + (var) = (tvar)) + +/* Concatenate queue2 to the end of queue1. */ +#undef HLTQ_CONCAT +#define HLTQ_CONCAT(queue1, queue2, field) do { \ + (queue2)->field.tqe_prev = (queue1)->field.tqe_prev; \ + *(queue1)->field.tqe_prev = (queue2); \ + (queue1)->field.tqe_prev = &(queue2)->field.tqe_next; \ +} while (0) + +/* Convert a headless tailq to a headful one. */ +#define HLTQ_TO_TAILQ(head, hl, field) do { \ + (head)->tqh_first = (hl); \ + (head)->tqh_last = (hl)->field.tqe_prev; \ + (hl)->field.tqe_prev = &(head)->tqh_first; \ +} while (0) + +/* Concatenate a headless tail queue to the end of a regular tail queue. */ +#define TAILQ_CONCAT_HLTQ(head, hl, field) do { \ + void *last = (hl)->field.tqe_prev; \ + (hl)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (hl); \ + (head)->tqh_last = last; \ +} while (0) + +#endif /* !SUDO_QUEUE_H */ diff --git a/utsudo-0.0.2/include/sudo_rand.h b/utsudo-0.0.2/include/sudo_rand.h new file mode 100644 index 0000000..283ce5f --- /dev/null +++ b/utsudo-0.0.2/include/sudo_rand.h @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDO_RAND_H +#define SUDO_RAND_H + +#include /* For arc4random() on systems that have it */ + +/* + * All libc replacements are prefixed with "sudo_" to avoid namespace issues. + */ + +#ifndef HAVE_ARC4RANDOM +/* Note: not exported by libutil. */ +uint32_t sudo_arc4random(void); +# undef arc4random +# define arc4random() sudo_arc4random() +#endif /* ARC4RANDOM */ + +#ifndef HAVE_ARC4RANDOM_UNIFORM +__dso_public uint32_t sudo_arc4random_uniform(uint32_t upper_bound); +# undef arc4random_uniform +# define arc4random_uniform(_a) sudo_arc4random_uniform((_a)) +#endif /* ARC4RANDOM_UNIFORM */ + +#ifndef HAVE_GETENTROPY +/* Note: not exported by libutil. */ +int sudo_getentropy(void *buf, size_t buflen); +# undef getentropy +# define getentropy(_a, _b) sudo_getentropy((_a), (_b)) +#endif /* HAVE_GETENTROPY */ + +#endif /* SUDO_RAND_H */ diff --git a/utsudo-0.0.2/include/sudo_util.h b/utsudo-0.0.2/include/sudo_util.h new file mode 100644 index 0000000..9fc832f --- /dev/null +++ b/utsudo-0.0.2/include/sudo_util.h @@ -0,0 +1,287 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_UTIL_H +#define SUDO_UTIL_H + +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#ifndef TIME_T_MAX +# if SIZEOF_TIME_T == 8 +# define TIME_T_MAX LLONG_MAX +# else +# define TIME_T_MAX INT_MAX +# endif +#endif + +/* + * Macros for operating on struct timeval. + */ +#define sudo_timevalclear(tv) ((tv)->tv_sec = (tv)->tv_usec = 0) + +#define sudo_timevalisset(tv) ((tv)->tv_sec || (tv)->tv_usec) + +#define sudo_timevalcmp(tv1, tv2, op) \ + (((tv1)->tv_sec == (tv2)->tv_sec) ? \ + ((tv1)->tv_usec op (tv2)->tv_usec) : \ + ((tv1)->tv_sec op (tv2)->tv_sec)) + +#define sudo_timevaladd(tv1, tv2, tv3) \ + do { \ + (tv3)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec; \ + (tv3)->tv_usec = (tv1)->tv_usec + (tv2)->tv_usec; \ + if ((tv3)->tv_usec >= 1000000) { \ + (tv3)->tv_sec++; \ + (tv3)->tv_usec -= 1000000; \ + } \ + } while (0) + +#define sudo_timevalsub(tv1, tv2, tv3) \ + do { \ + (tv3)->tv_sec = (tv1)->tv_sec - (tv2)->tv_sec; \ + (tv3)->tv_usec = (tv1)->tv_usec - (tv2)->tv_usec; \ + if ((tv3)->tv_usec < 0) { \ + (tv3)->tv_sec--; \ + (tv3)->tv_usec += 1000000; \ + } \ + } while (0) + +#ifndef TIMEVAL_TO_TIMESPEC +# define TIMEVAL_TO_TIMESPEC(tv, ts) \ + do { \ + (ts)->tv_sec = (tv)->tv_sec; \ + (ts)->tv_nsec = (tv)->tv_usec * 1000; \ + } while (0) +#endif + +/* + * Macros for operating on struct timespec. + */ +#define sudo_timespecclear(ts) ((ts)->tv_sec = (ts)->tv_nsec = 0) + +#define sudo_timespecisset(ts) ((ts)->tv_sec || (ts)->tv_nsec) + +#define sudo_timespeccmp(ts1, ts2, op) \ + (((ts1)->tv_sec == (ts2)->tv_sec) ? \ + ((ts1)->tv_nsec op (ts2)->tv_nsec) : \ + ((ts1)->tv_sec op (ts2)->tv_sec)) + +#define sudo_timespecadd(ts1, ts2, ts3) \ + do { \ + (ts3)->tv_sec = (ts1)->tv_sec + (ts2)->tv_sec; \ + (ts3)->tv_nsec = (ts1)->tv_nsec + (ts2)->tv_nsec; \ + while ((ts3)->tv_nsec >= 1000000000) { \ + (ts3)->tv_sec++; \ + (ts3)->tv_nsec -= 1000000000; \ + } \ + } while (0) + +#define sudo_timespecsub(ts1, ts2, ts3) \ + do { \ + (ts3)->tv_sec = (ts1)->tv_sec - (ts2)->tv_sec; \ + (ts3)->tv_nsec = (ts1)->tv_nsec - (ts2)->tv_nsec; \ + while ((ts3)->tv_nsec < 0) { \ + (ts3)->tv_sec--; \ + (ts3)->tv_nsec += 1000000000; \ + } \ + } while (0) + +#ifndef TIMESPEC_TO_TIMEVAL +# define TIMESPEC_TO_TIMEVAL(tv, ts) \ + do { \ + (tv)->tv_sec = (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ + } while (0) +#endif + +/* + * The timespec version of st_mtime may vary on different platforms. + */ +#if defined(HAVE_ST_MTIM) +# if defined(HAVE_ST__TIM) +# define SUDO_ST_MTIM st_mtim.st__tim +# else +# define SUDO_ST_MTIM st_mtim +# endif +#elif defined(HAVE_ST_MTIMESPEC) +# define SUDO_ST_MTIM st_mtimespec +#endif + +/* + * Macro to extract mtime as timespec. + * If there is no way to set the timestamp using nanosecond precision, + * we only fetch microsecond precision. Otherwise there is a mismatch + * between the timestamp we read and the one we wrote. + */ +#if defined(SUDO_ST_MTIM) +# if defined(HAVE_FUTIMENS) && defined(HAVE_UTIMENSAT) +# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->SUDO_ST_MTIM.tv_sec; (_y).tv_nsec = (_x)->SUDO_ST_MTIM.tv_nsec; } while (0) +# else +# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->SUDO_ST_MTIM.tv_sec; (_y).tv_nsec = ((_x)->SUDO_ST_MTIM.tv_nsec / 1000) * 1000; } while (0) +# endif +#elif defined(HAVE_ST_NMTIME) +# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->st_mtime; (_y).tv_nsec = (_x)->st_nmtime; } while (0) +#else +# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->st_mtime; (_y).tv_nsec = 0; } while (0) +#endif /* HAVE_ST_MTIM */ + +/* sizeof() that returns a signed value */ +#define ssizeof(_x) ((ssize_t)sizeof(_x)) + +/* Bit map macros. */ +#define sudo_setbit(_a, _i) ((_a)[(_i) / NBBY] |= 1 << ((_i) % NBBY)) +#define sudo_clrbit(_a, _i) ((_a)[(_i) / NBBY] &= ~(1<<((_i) % NBBY))) +#define sudo_isset(_a, _i) ((_a)[(_i) / NBBY] & (1<<((_i) % NBBY))) +#define sudo_isclr(_a, _i) (((_a)[(_i) / NBBY] & (1<<((_i) % NBBY))) == 0) + +/* sudo_parseln() flags */ +#define PARSELN_COMM_BOL 0x01 /* comments only at begining of line */ +#define PARSELN_CONT_IGN 0x02 /* ignore line continuation char */ + +/* + * Macros to quiet gcc's warn_unused_result attribute. + */ +#ifdef __GNUC__ +# define ignore_result(x) do { \ + __typeof__(x) y = (x); \ + (void)y; \ +} while(0) +#else +# define ignore_result(x) (void)(x) +#endif + +/* aix.c */ +__dso_public int aix_getauthregistry_v1(char *user, char *saved_registry); +#define aix_getauthregistry(_a, _b) aix_getauthregistry_v1((_a), (_b)) +__dso_public int aix_prep_user_v1(char *user, const char *tty); +#define aix_prep_user(_a, _b) aix_prep_user_v1((_a), (_b)) +__dso_public int aix_restoreauthdb_v1(void); +#define aix_restoreauthdb() aix_restoreauthdb_v1() +__dso_public int aix_setauthdb_v1(char *user); +__dso_public int aix_setauthdb_v2(char *user, char *registry); +#define aix_setauthdb(_a, _b) aix_setauthdb_v2((_a), (_b)) + +/* gethostname.c */ +__dso_public char *sudo_gethostname_v1(void); +#define sudo_gethostname() sudo_gethostname_v1() + +/* gettime.c */ +__dso_public int sudo_gettime_awake_v1(struct timespec *ts); +#define sudo_gettime_awake(_a) sudo_gettime_awake_v1((_a)) +__dso_public int sudo_gettime_mono_v1(struct timespec *ts); +#define sudo_gettime_mono(_a) sudo_gettime_mono_v1((_a)) +__dso_public int sudo_gettime_real_v1(struct timespec *ts); +#define sudo_gettime_real(_a) sudo_gettime_real_v1((_a)) + +/* gidlist.c */ +__dso_public int sudo_parse_gids_v1(const char *gidstr, const gid_t *basegid, GETGROUPS_T **gidsp); +#define sudo_parse_gids(_a, _b, _c) sudo_parse_gids_v1((_a), (_b), (_c)) + +/* getgrouplist.c */ +__dso_public int sudo_getgrouplist2_v1(const char *name, gid_t basegid, GETGROUPS_T **groupsp, int *ngroupsp); +#define sudo_getgrouplist2(_a, _b, _c, _d) sudo_getgrouplist2_v1((_a), (_b), (_c), (_d)) + +/* key_val.c */ +__dso_public char *sudo_new_key_val_v1(const char *key, const char *value); +#define sudo_new_key_val(_a, _b) sudo_new_key_val_v1((_a), (_b)) + +/* locking.c */ +#define SUDO_LOCK 1 /* lock a file */ +#define SUDO_TLOCK 2 /* test & lock a file (non-blocking) */ +#define SUDO_UNLOCK 4 /* unlock a file */ +__dso_public bool sudo_lock_file_v1(int fd, int action); +#define sudo_lock_file(_a, _b) sudo_lock_file_v1((_a), (_b)) +__dso_public bool sudo_lock_region_v1(int fd, int action, off_t len); +#define sudo_lock_region(_a, _b, _c) sudo_lock_region_v1((_a), (_b), (_c)) + +/* parseln.c */ +__dso_public ssize_t sudo_parseln_v1(char **buf, size_t *bufsize, unsigned int *lineno, FILE *fp); +__dso_public ssize_t sudo_parseln_v2(char **buf, size_t *bufsize, unsigned int *lineno, FILE *fp, int flags); +#define sudo_parseln(_a, _b, _c, _d, _e) sudo_parseln_v2((_a), (_b), (_c), (_d), (_e)) + +/* progname.c */ +__dso_public void initprogname(const char *); + +/* secure_path.c */ +#define SUDO_PATH_SECURE 0 +#define SUDO_PATH_MISSING -1 +#define SUDO_PATH_BAD_TYPE -2 +#define SUDO_PATH_WRONG_OWNER -3 +#define SUDO_PATH_WORLD_WRITABLE -4 +#define SUDO_PATH_GROUP_WRITABLE -5 +struct stat; +__dso_public int sudo_secure_dir_v1(const char *path, uid_t uid, gid_t gid, struct stat *sbp); +#define sudo_secure_dir(_a, _b, _c, _d) sudo_secure_dir_v1((_a), (_b), (_c), (_d)) +__dso_public int sudo_secure_file_v1(const char *path, uid_t uid, gid_t gid, struct stat *sbp); +#define sudo_secure_file(_a, _b, _c, _d) sudo_secure_file_v1((_a), (_b), (_c), (_d)) + +/* setgroups.c */ +__dso_public int sudo_setgroups_v1(int ngids, const GETGROUPS_T *gids); +#define sudo_setgroups(_a, _b) sudo_setgroups_v1((_a), (_b)) + +/* strsplit.c */ +__dso_public const char *sudo_strsplit_v1(const char *str, const char *endstr, const char *sep, const char **last); +#define sudo_strsplit(_a, _b, _c, _d) sudo_strsplit_v1(_a, _b, _c, _d) + +/* strtobool.c */ +__dso_public int sudo_strtobool_v1(const char *str); +#define sudo_strtobool(_a) sudo_strtobool_v1((_a)) + +/* strtonum.c */ +/* Not versioned for historical reasons. */ +__dso_public long long sudo_strtonum(const char *, long long, long long, const char **); + +/* strtoid.c */ +__dso_public id_t sudo_strtoid_v1(const char *str, const char *sep, char **endp, const char **errstr); +__dso_public id_t sudo_strtoid_v2(const char *str, const char **errstr); +#define sudo_strtoid(_a, _b) sudo_strtoid_v2((_a), (_b)) +__dso_public id_t sudo_strtoidx_v1(const char *str, const char *sep, char **endp, const char **errstr); +#define sudo_strtoidx(_a, _b, _c, _d) sudo_strtoidx_v1((_a), (_b), (_c), (_d)) + +/* strtomode.c */ +__dso_public int sudo_strtomode_v1(const char *cp, const char **errstr); +#define sudo_strtomode(_a, _b) sudo_strtomode_v1((_a), (_b)) + +/* sudo_printf.c */ +extern int (*sudo_printf)(int msg_type, const char *fmt, ...); + +/* term.c */ +__dso_public bool sudo_term_cbreak_v1(int fd); +#define sudo_term_cbreak(_a) sudo_term_cbreak_v1((_a)) +__dso_public bool sudo_term_copy_v1(int src, int dst); +#define sudo_term_copy(_a, _b) sudo_term_copy_v1((_a), (_b)) +__dso_public bool sudo_term_noecho_v1(int fd); +#define sudo_term_noecho(_a) sudo_term_noecho_v1((_a)) +__dso_public bool sudo_term_raw_v1(int fd, int isig); +#define sudo_term_raw(_a, _b) sudo_term_raw_v1((_a), (_b)) +__dso_public bool sudo_term_restore_v1(int fd, bool flush); +#define sudo_term_restore(_a, _b) sudo_term_restore_v1((_a), (_b)) + +/* ttyname_dev.c */ +__dso_public char *sudo_ttyname_dev_v1(dev_t tdev, char *name, size_t namelen); +#define sudo_ttyname_dev(_a, _b, _c) sudo_ttyname_dev_v1((_a), (_b), (_c)) + +/* ttysize.c */ +__dso_public void sudo_get_ttysize_v1(int *rowp, int *colp); +#define sudo_get_ttysize(_a, _b) sudo_get_ttysize_v1((_a), (_b)) + +#endif /* SUDO_UTIL_H */ diff --git a/utsudo-0.0.2/indent.pro b/utsudo-0.0.2/indent.pro new file mode 100644 index 0000000..db27ed3 --- /dev/null +++ b/utsudo-0.0.2/indent.pro @@ -0,0 +1,36 @@ +-br +-cdb +-ce +-d0 +-di1 +-ei +-i4 +-nlp +-npcs +-npsl +-ps +-sc +-TYYSTYPE +-TLIST +-TLINK +-Tu_char +-Tu_short +-Tu_int +-Tu_long +-Tushort +-Tuint +-Tdaddr_t +-Tcaddr_t +-Tino_t +-Tswblk_t +-Tsize_t +-Ttime_t +-Tdev_t +-Toff_t +-Tuid_t +-Tgid_t +-Tfixpt_t +-Tkey_t +-Tpaddr_t +-Tfd_mask +-Tfd_set diff --git a/utsudo-0.0.2/init.d/aix.sh.in b/utsudo-0.0.2/init.d/aix.sh.in new file mode 100644 index 0000000..3d11241 --- /dev/null +++ b/utsudo-0.0.2/init.d/aix.sh.in @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Simple AIX rc.d script to remove the sudo timestamp directory on boot. +# This is needed because AIX does not have /var/run. +# Install as /etc/rc.d/init.d/sudo with a link /etc/rc.d/rc2.d/S90sudo +# + +PATH=/usr/sbin:/usr/bin:/sbin +export PATH + +TSDIR="@rundir@/ts" +rval=0 + +case "$1" in +start) + echo "Removing the $TSDIR directory" + rm -rf "$TSDIR" + ;; +*) + echo "usage: $0 start" + rval=1 + ;; +esac + +exit $rval diff --git a/utsudo-0.0.2/init.d/hpux.sh.in b/utsudo-0.0.2/init.d/hpux.sh.in new file mode 100644 index 0000000..5a76bd2 --- /dev/null +++ b/utsudo-0.0.2/init.d/hpux.sh.in @@ -0,0 +1,27 @@ +#!/sbin/sh +# +# Simple HP-UX init.d script to remove the sudo timestamp directory on boot. +# This is needed because HP-UX does not clear /var/run on its own. +# Install as /sbin/init.d/sudo with a link /sbin/rc2.d/S900sudo +# + +PATH=/usr/sbin:/usr/bin:/sbin +export PATH + +TSDIR="@rundir@/ts" +rval=0 + +case "$1" in +start_msg) + echo "Removing the $TSDIR directory" + ;; +start) + rm -rf "$TSDIR" + ;; +*) + echo "usage: $0 {start|start_msg}" + rval=1 + ;; +esac + +exit $rval diff --git a/utsudo-0.0.2/init.d/utsudo.conf.in b/utsudo-0.0.2/init.d/utsudo.conf.in new file mode 100644 index 0000000..dfae56b --- /dev/null +++ b/utsudo-0.0.2/init.d/utsudo.conf.in @@ -0,0 +1,6 @@ +# Create an empty sudo time stamp directory on OSes using systemd. +# Sudo will create the directory itself but this can cause problems +# on systems that have SELinux enabled since the directories will be +# created with the user's security context. +d @rundir@ 0711 root root +D @rundir@/ts 0700 root root diff --git a/utsudo-0.0.2/install-sh b/utsudo-0.0.2/install-sh new file mode 100755 index 0000000..49d383a --- /dev/null +++ b/utsudo-0.0.2/install-sh @@ -0,0 +1,239 @@ +#! /bin/sh + +## (From INN-1.4, written by Rich Salz) +## $Revision$ +## A script to install files and directories. + +PROGNAME=`basename $0` + +## Paths to programs. CHOWN, STRIP and WHOAMI are checked below. +CHOWN=chown +CHGRP=chgrp +CHMOD=chmod +CP=cp +LN=ln +MKDIR=mkdir +MV=mv +RM=rm +STRIP=strip +WHOAMI="echo root" + +## Some systems don't support -x, so we have to use -f. +for d in /sbin /etc /usr/sbin /usr/etc; do + if [ -f $d/chown ]; then + CHOWN=${d}/chown + break + fi +done + +for d in /usr/bin /bin /usr/ucb /usr/bsd; do + if [ -f $d/whoami ]; then + WHOAMI=${d}/whoami + break + elif [ -f $d/id ]; then + WHOAMI=${d}/id | sed -n 's/^[^(]*(\([^)]*\)).*/\1/p' + fi +done + +for d in /usr/ccs/bin /usr/bin /bin; do + if [ -f $d/strip ]; then + STRIP=${d}/strip + break + fi +done + +## Defaults. +CHOWNIT=false +CHGROUPIT=false +CHMODIT=false +STRIPIT=false +BACKIT=false +TOUCHIT=true +DIRMODE=false + +# INSTALL_BACKUP is like -b but for use with libtool +if test X"${INSTALL_BACKUP}" != X""; then + BACKIT=true + BACKUP="${INSTALL_BACKUP}" +fi + +case `${WHOAMI}` in +root) + ROOT=true + ;; +*) + ROOT=false + ;; +esac + +## Process JCL. +MORETODO=true +while ${MORETODO} ; do + case X"$1" in + X-b) + BACKIT=true + BACKUP="$2" + shift + ;; + X-b*) + BACKIT=true + BACKUP="`echo \"$1\" | sed 's/^..//'`" + ;; + X-c) + # backwards compatibility + ;; + X-d) + DIRMODE=true + ;; + X-g) + GROUP="$2" + CHGROUPIT=true + shift + ;; + X-g*) + GROUP="`echo \"$1\" | sed 's/^..//'`" + CHGROUPIT=true + ;; + X-G) + GROUP="$2" + shift + ${ROOT} && CHGROUPIT=true + ;; + X-G*) + if ${ROOT} ; then + GROUP="`echo \"$1\" | sed 's/^..//'`" + CHGROUPIT=true + fi + ;; + X-m) + MODE="$2" + CHMODIT=true + shift + ;; + X-m*) + MODE="`echo \"$1\" | sed 's/^..//'`" + CHMODIT=true + ;; + X-M) + MODE="$2" + ${ROOT} && CHMODIT=true + shift + ;; + X-M*) + MODE="`echo \"$1\" | sed 's/^..//'`" + ${ROOT} && CHMODIT=true + ;; + X-n) + TOUCHIT=false + ;; + X-o) + OWNER="$2" + CHOWNIT=true + shift + ;; + X-o*) + OWNER="`echo \"$1\" | sed 's/^..//'`" + CHOWNIT=true + ;; + X-O) + OWNER="$2" + shift + ${ROOT} && CHOWNIT=true + ;; + X-O*) + if ${ROOT} ; then + OWNER="`echo \"$1\" | sed 's/^..//'`" + CHOWNIT=true + fi + ;; + X-s) + #STRIPIT=true + ;; + X--) + shift + MORETODO=false + ;; + X-*) + echo "${PROGNAME}: Unknown flag $1" 1>&2 + exit 1 + ;; + *) + MORETODO=false + ;; + esac + ${MORETODO} && shift +done + +## Making a directory? +if ${DIRMODE} ; then + while test $# != 0; do + DEST="$1" + if [ ! -d "${DEST}" ] ; then + ${MKDIR} "${DEST}" || exit 1 + fi + if ${CHOWNIT} ; then + ${CHOWN} "${OWNER}" "${DEST}" || exit 1 + fi + if ${CHGROUPIT} ; then + ${CHGRP} "${GROUP}" "${DEST}" || exit 1 + fi + if ${CHMODIT} ; then + ${CHMOD} "${MODE}" "${DEST}" || exit 1 + fi + shift; + done + exit 0 +fi + +## Process arguments. +if [ $# -ne 2 ] ; then + echo "Usage: ${PROGNAME} [flags] source destination" + exit 1 +fi + +## Get the destination and a temp file in the destination diretory. +if [ -d "$2" ] ; then + DEST="$2/`basename $1`" + TEMP="$2/$$.tmp" +else + DEST="$2" + TEMP="`expr "$2" : '\(.*\)/.*'`/$$.tmp" +fi + +## If not given the same name, we must try to copy. +if [ X"$1" != X"$2" ] ; then + if cmp -s "$1" "${DEST}" ; then + ## Files are same; touch or not. + ${TOUCHIT} && touch "${DEST}" + else + ## If destination exists and we wish to backup, link to backup. + if [ -f "${DEST}" ] ; then + if ${BACKIT} ; then + ${RM} -f "${DEST}${BACKUP}" + ${LN} "${DEST}" "${DEST}${BACKUP}" + fi + fi + ## Copy source to the right dir, then move to right spot. + ## Done in two parts so we can hope for atomicity. + ## We need to rm DEST due to bugs in "mv -f" on some systems. + ${RM} -f "${TEMP}" || exit 1 + ${CP} "$1" "${TEMP}" || exit 1 + ${RM} -f "${DEST}" || exit 1 + ${MV} -f "${TEMP}" "${DEST}" || exit 1 + fi +fi + +## Strip and set the owner/mode. +if ${STRIPIT} ; then + ${STRIP} "${DEST}" || exit 1 +fi +if ${CHOWNIT} ; then + ${CHOWN} "${OWNER}" "${DEST}" || exit 1 +fi +if ${CHGROUPIT} ; then + ${CHGRP} "${GROUP}" "${DEST}" || exit 1 +fi +if ${CHMODIT} ; then + ${CHMOD} "${MODE}" "${DEST}" || exit 1 +fi +exit 0 diff --git a/utsudo-0.0.2/install-sh.strip b/utsudo-0.0.2/install-sh.strip new file mode 100755 index 0000000..6944fba --- /dev/null +++ b/utsudo-0.0.2/install-sh.strip @@ -0,0 +1,239 @@ +#! /bin/sh + +## (From INN-1.4, written by Rich Salz) +## $Revision$ +## A script to install files and directories. + +PROGNAME=`basename $0` + +## Paths to programs. CHOWN, STRIP and WHOAMI are checked below. +CHOWN=chown +CHGRP=chgrp +CHMOD=chmod +CP=cp +LN=ln +MKDIR=mkdir +MV=mv +RM=rm +STRIP=strip +WHOAMI="echo root" + +## Some systems don't support -x, so we have to use -f. +for d in /sbin /etc /usr/sbin /usr/etc; do + if [ -f $d/chown ]; then + CHOWN=${d}/chown + break + fi +done + +for d in /usr/bin /bin /usr/ucb /usr/bsd; do + if [ -f $d/whoami ]; then + WHOAMI=${d}/whoami + break + elif [ -f $d/id ]; then + WHOAMI=${d}/id | sed -n 's/^[^(]*(\([^)]*\)).*/\1/p' + fi +done + +for d in /usr/ccs/bin /usr/bin /bin; do + if [ -f $d/strip ]; then + STRIP=${d}/strip + break + fi +done + +## Defaults. +CHOWNIT=false +CHGROUPIT=false +CHMODIT=false +STRIPIT=false +BACKIT=false +TOUCHIT=true +DIRMODE=false + +# INSTALL_BACKUP is like -b but for use with libtool +if test X"${INSTALL_BACKUP}" != X""; then + BACKIT=true + BACKUP="${INSTALL_BACKUP}" +fi + +case `${WHOAMI}` in +root) + ROOT=true + ;; +*) + ROOT=false + ;; +esac + +## Process JCL. +MORETODO=true +while ${MORETODO} ; do + case X"$1" in + X-b) + BACKIT=true + BACKUP="$2" + shift + ;; + X-b*) + BACKIT=true + BACKUP="`echo \"$1\" | sed 's/^..//'`" + ;; + X-c) + # backwards compatibility + ;; + X-d) + DIRMODE=true + ;; + X-g) + GROUP="$2" + CHGROUPIT=true + shift + ;; + X-g*) + GROUP="`echo \"$1\" | sed 's/^..//'`" + CHGROUPIT=true + ;; + X-G) + GROUP="$2" + shift + ${ROOT} && CHGROUPIT=true + ;; + X-G*) + if ${ROOT} ; then + GROUP="`echo \"$1\" | sed 's/^..//'`" + CHGROUPIT=true + fi + ;; + X-m) + MODE="$2" + CHMODIT=true + shift + ;; + X-m*) + MODE="`echo \"$1\" | sed 's/^..//'`" + CHMODIT=true + ;; + X-M) + MODE="$2" + ${ROOT} && CHMODIT=true + shift + ;; + X-M*) + MODE="`echo \"$1\" | sed 's/^..//'`" + ${ROOT} && CHMODIT=true + ;; + X-n) + TOUCHIT=false + ;; + X-o) + OWNER="$2" + CHOWNIT=true + shift + ;; + X-o*) + OWNER="`echo \"$1\" | sed 's/^..//'`" + CHOWNIT=true + ;; + X-O) + OWNER="$2" + shift + ${ROOT} && CHOWNIT=true + ;; + X-O*) + if ${ROOT} ; then + OWNER="`echo \"$1\" | sed 's/^..//'`" + CHOWNIT=true + fi + ;; + X-s) + STRIPIT=true + ;; + X--) + shift + MORETODO=false + ;; + X-*) + echo "${PROGNAME}: Unknown flag $1" 1>&2 + exit 1 + ;; + *) + MORETODO=false + ;; + esac + ${MORETODO} && shift +done + +## Making a directory? +if ${DIRMODE} ; then + while test $# != 0; do + DEST="$1" + if [ ! -d "${DEST}" ] ; then + ${MKDIR} "${DEST}" || exit 1 + fi + if ${CHOWNIT} ; then + ${CHOWN} "${OWNER}" "${DEST}" || exit 1 + fi + if ${CHGROUPIT} ; then + ${CHGRP} "${GROUP}" "${DEST}" || exit 1 + fi + if ${CHMODIT} ; then + ${CHMOD} "${MODE}" "${DEST}" || exit 1 + fi + shift; + done + exit 0 +fi + +## Process arguments. +if [ $# -ne 2 ] ; then + echo "Usage: ${PROGNAME} [flags] source destination" + exit 1 +fi + +## Get the destination and a temp file in the destination diretory. +if [ -d "$2" ] ; then + DEST="$2/`basename $1`" + TEMP="$2/$$.tmp" +else + DEST="$2" + TEMP="`expr "$2" : '\(.*\)/.*'`/$$.tmp" +fi + +## If not given the same name, we must try to copy. +if [ X"$1" != X"$2" ] ; then + if cmp -s "$1" "${DEST}" ; then + ## Files are same; touch or not. + ${TOUCHIT} && touch "${DEST}" + else + ## If destination exists and we wish to backup, link to backup. + if [ -f "${DEST}" ] ; then + if ${BACKIT} ; then + ${RM} -f "${DEST}${BACKUP}" + ${LN} "${DEST}" "${DEST}${BACKUP}" + fi + fi + ## Copy source to the right dir, then move to right spot. + ## Done in two parts so we can hope for atomicity. + ## We need to rm DEST due to bugs in "mv -f" on some systems. + ${RM} -f "${TEMP}" || exit 1 + ${CP} "$1" "${TEMP}" || exit 1 + ${RM} -f "${DEST}" || exit 1 + ${MV} -f "${TEMP}" "${DEST}" || exit 1 + fi +fi + +## Strip and set the owner/mode. +if ${STRIPIT} ; then + ${STRIP} "${DEST}" || exit 1 +fi +if ${CHOWNIT} ; then + ${CHOWN} "${OWNER}" "${DEST}" || exit 1 +fi +if ${CHGROUPIT} ; then + ${CHGRP} "${GROUP}" "${DEST}" || exit 1 +fi +if ${CHMODIT} ; then + ${CHMOD} "${MODE}" "${DEST}" || exit 1 +fi +exit 0 diff --git a/utsudo-0.0.2/lib/util/.cargo/config.toml b/utsudo-0.0.2/lib/util/.cargo/config.toml new file mode 100644 index 0000000..8824a91 --- /dev/null +++ b/utsudo-0.0.2/lib/util/.cargo/config.toml @@ -0,0 +1,13 @@ +[source.crates-io] +replace-with = "vendored-sources" + +[source."https://github.com/shadowsocks/crypto"] +git = "https://github.com/shadowsocks/crypto" +branch = "master" +replace-with = "vendored-sources" + +[source.vendored-sources] +directory = "vendor" + +[target.'cfg(target_os = "linux")'] +rustflags = ["-Clink-arg=-Wl,-soname=libutsudo_util.so.0"] diff --git a/utsudo-0.0.2/lib/util/Cargo.toml b/utsudo-0.0.2/lib/util/Cargo.toml new file mode 100644 index 0000000..4323454 --- /dev/null +++ b/utsudo-0.0.2/lib/util/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "utsudo_util" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +libc = "*" +stdext = "*" + +[lib] +crate-type = ["cdylib"] + diff --git a/utsudo-0.0.2/lib/util/Makefile b/utsudo-0.0.2/lib/util/Makefile new file mode 100644 index 0000000..62ece57 --- /dev/null +++ b/utsudo-0.0.2/lib/util/Makefile @@ -0,0 +1,175 @@ +#!/bin/bash + +all: + make clean + cargo build --release + mkdir .libs + cp target/release/libutsudo_util.so .libs/libutsudo_util.so.0.0.0 + cd .libs && ln -s libutsudo_util.so.0.0.0 libutsudo_util.so.0 + cd .libs && ln -s libutsudo_util.so.0.0.0 libutsudo_util.so + cd .libs && ln -s ../libutsudo_util.la libutsudo_util.la + cd .libs && cp ../libutsudo_util.lai ./ + cd .libs && patchelf --set-soname libutsudo_util.so.0 libutsudo_util.so.0.0.0 + make debug_fatal_lbuf.o + + +shlib_exp = +shlib_enable = yes +LT_LDFLAGS = -export-symbols +INSTALL_BACKUP = +LIBTOOL = $(SHELL) $(top_builddir)/libtool + + +#### Start of system configuration section. #### + +srcdir = . +devdir = $(srcdir) +top_builddir = ../.. +top_srcdir = ../.. +incdir = $(top_srcdir)/include +cross_compiling = no + +# Where to install things... +prefix = /usr +exec_prefix = /usr +bindir = /usr/bin +sbindir = /usr/sbin +sysconfdir = /etc +libexecdir = /usr/libexec +datarootdir = $(prefix)/share +localstatedir = /var + +# File extension, mode and map file to use for shared libraries/objects +shlib_enable = yes +shlib_mode = 0644 +shlib_exp = +shlib_map = +shlib_opt = + +# Compiler & tools to use +CC = gcc +LIBTOOL = $(SHELL) $(top_builddir)/libtool +SED = /usr/bin/sed +AWK = gawk + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = + +# C preprocessor defines +CPPDEFS = + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(srcdir) -I$(top_srcdir) $(CPPDEFS) -DZLIB_CONST -D_FORTIFY_SOURCE=2 + +# Usually -O and/or -g +CFLAGS = -g -O2 + +# Flags to pass to the link stage +LDFLAGS = +LT_LDFLAGS = -export-symbols $(shlib_exp) + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = +ASAN_LDFLAGS = + +# PIE flags +PIE_CFLAGS = +PIE_LDFLAGS = + +# Stack smashing protection flags +SSP_CFLAGS = +SSP_LDFLAGS = + +# Libtool style shared library version +SHLIB_VERSION = 0:0:0 + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Regression tests +TEST_PROGS = conf_test hltq_test parseln_test progname_test strsplit_test \ + strtobool_test strtoid_test strtomode_test strtonum_test \ + parse_gids_test getgrouplist_test strsig_test +TEST_LIBS = +TEST_LDFLAGS = + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# Set to non-empty for development mode +DEVEL = + +#### End of system configuration section. #### + +SHELL = /bin/sh + +debug_fatal_lbuf.o: $(srcdir)/debug_fatal_lbuf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/debug_fatal_lbuf.c + +debug_fatal_lbuf.i: $(srcdir)/debug_fatal_lbuf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< + +debug_fatal_lbuf.plog: debug_fatal_lbuf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/debug_fatal_lbuf.c --i-file $< --output-file $@ + + +pre-install: + +install: install-dirs + case "$(LT_LDFLAGS)" in \ + *-no-install*) ;; \ + *) if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --quiet --mode=install $(INSTALL) $(INSTALL_OWNER) libutsudo_util.la $(DESTDIR)$(libexecdir)/utsudo; \ + fi;; \ + esac + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libexecdir)/utsudo + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: + +uninstall: + $(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(libexecdir)/utsudo/libutsudo_util.la + -test -z "$(INSTALL_BACKUP)" || \ + rf -f $(DESTDIR)$(libexecdir)/utsudo/libutsudo_util.*~ +check: + + +clean: + rm .libs -rf + rm target -rf + rm *.o -rf + +.PHONY: clean diff --git a/utsudo-0.0.2/lib/util/Makefile.in b/utsudo-0.0.2/lib/util/Makefile.in new file mode 100644 index 0000000..fbcc245 --- /dev/null +++ b/utsudo-0.0.2/lib/util/Makefile.in @@ -0,0 +1,175 @@ +#!/bin/bash + +all: + make clean + cargo build --release + mkdir .libs + cp target/release/libutsudo_util.so .libs/libutsudo_util.so.0.0.0 + cd .libs && ln -s libutsudo_util.so.0.0.0 libutsudo_util.so.0 + cd .libs && ln -s libutsudo_util.so.0.0.0 libutsudo_util.so + cd .libs && ln -s ../libutsudo_util.la libutsudo_util.la + cd .libs && cp ../libutsudo_util.lai ./ + cd .libs && patchelf --set-soname libutsudo_util.so.0 libutsudo_util.so.0.0.0 + make debug_fatal_lbuf.o + + +shlib_exp = +shlib_enable = yes +LT_LDFLAGS = -export-symbols +INSTALL_BACKUP = +LIBTOOL = $(SHELL) $(top_builddir)/libtool + + +#### Start of system configuration section. #### + +srcdir = . +devdir = $(srcdir) +top_builddir = ../.. +top_srcdir = ../.. +incdir = $(top_srcdir)/include +cross_compiling = no + +# Where to install things... +prefix = /usr +exec_prefix = /usr +bindir = /usr/bin +sbindir = /usr/sbin +sysconfdir = /etc +libexecdir = /usr/libexec +datarootdir = $(prefix)/share +localstatedir = /var + +# File extension, mode and map file to use for shared libraries/objects +shlib_enable = yes +shlib_mode = 0644 +shlib_exp = +shlib_map = +shlib_opt = + +# Compiler & tools to use +CC = gcc +LIBTOOL = $(SHELL) $(top_builddir)/libtool +SED = /usr/bin/sed +AWK = gawk + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = + +# C preprocessor defines +CPPDEFS = + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(srcdir) -I$(top_srcdir) $(CPPDEFS) -DZLIB_CONST -D_FORTIFY_SOURCE=2 + +# Usually -O and/or -g +CFLAGS = -g -O2 + +# Flags to pass to the link stage +LDFLAGS = +LT_LDFLAGS = -export-symbols $(shlib_exp) + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = +ASAN_LDFLAGS = + +# PIE flags +PIE_CFLAGS = +PIE_LDFLAGS = + +# Stack smashing protection flags +SSP_CFLAGS = +SSP_LDFLAGS = + +# Libtool style shared library version +SHLIB_VERSION = 0:0:0 + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Regression tests +TEST_PROGS = conf_test hltq_test parseln_test progname_test strsplit_test \ + strtobool_test strtoid_test strtomode_test strtonum_test \ + parse_gids_test getgrouplist_test strsig_test +TEST_LIBS = +TEST_LDFLAGS = + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# Set to non-empty for development mode +DEVEL = + +#### End of system configuration section. #### + +SHELL = /bin/sh + +debug_fatal_lbuf.o: $(srcdir)/debug_fatal_lbuf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/debug_fatal_lbuf.c -fPIC + +debug_fatal_lbuf.i: $(srcdir)/debug_fatal_lbuf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< + +debug_fatal_lbuf.plog: debug_fatal_lbuf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/debug_fatal_lbuf.c --i-file $< --output-file $@ + + +pre-install: + +install: install-dirs + case "$(LT_LDFLAGS)" in \ + *-no-install*) ;; \ + *) if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --quiet --mode=install $(INSTALL) $(INSTALL_OWNER) libutsudo_util.la $(DESTDIR)$(libexecdir)/utsudo; \ + fi;; \ + esac + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libexecdir)/utsudo + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: + +uninstall: + $(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(libexecdir)/utsudo/libutsudo_util.la + -test -z "$(INSTALL_BACKUP)" || \ + rf -f $(DESTDIR)$(libexecdir)/utsudo/libutsudo_util.*~ +check: + + +clean: + rm .libs -rf + rm target -rf + rm *.o -rf + +.PHONY: clean diff --git a/utsudo-0.0.2/lib/util/debug_fatal_lbuf.c b/utsudo-0.0.2/lib/util/debug_fatal_lbuf.c new file mode 100644 index 0000000..061375c --- /dev/null +++ b/utsudo-0.0.2/lib/util/debug_fatal_lbuf.c @@ -0,0 +1,551 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define DEFAULT_TEXT_DOMAIN "sudo" +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_plugin.h" +#include "sudo_debug.h" +#include "sudo_conf.h" +#include "sudo_util.h" + +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include "sudo_queue.h" +#include "sudo_lbuf.h" + + +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + + +void warning(const char *errstr, const char *fmt, va_list ap); + +/****************************** lbuf.c **********************************/ + +bool sudo_lbuf_expand(struct sudo_lbuf *lbuf, int extra); + +/* + * Parse the format and append strings, only %s and %% escapes are supported. + * Any characters in set are quoted with a backslash. + */ +bool +sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) +{ + int len, saved_len = lbuf->len; + bool ret = false; + char *cp, *s; + va_list ap; + debug_decl(sudo_lbuf_append_quoted, SUDO_DEBUG_UTIL) + + if (sudo_lbuf_error(lbuf)) + debug_return_bool(false); + + va_start(ap, fmt); + while (*fmt != '\0') { + if (fmt[0] == '%' && fmt[1] == 's') { + if ((s = va_arg(ap, char *)) == NULL) + s = "(NULL)"; + while ((cp = strpbrk(s, set)) != NULL) { + len = (int)(cp - s); + if (!sudo_lbuf_expand(lbuf, len + 2)) + goto done; + memcpy(lbuf->buf + lbuf->len, s, len); + lbuf->len += len; + lbuf->buf[lbuf->len++] = '\\'; + lbuf->buf[lbuf->len++] = *cp; + s = cp + 1; + } + if (*s != '\0') { + len = strlen(s); + if (!sudo_lbuf_expand(lbuf, len)) + goto done; + memcpy(lbuf->buf + lbuf->len, s, len); + lbuf->len += len; + } + fmt += 2; + continue; + } + if (!sudo_lbuf_expand(lbuf, 2)) + goto done; + if (strchr(set, *fmt) != NULL) + lbuf->buf[lbuf->len++] = '\\'; + lbuf->buf[lbuf->len++] = *fmt++; + } + ret = true; + +done: + if (!ret) + lbuf->len = saved_len; + if (lbuf->size != 0) + lbuf->buf[lbuf->len] = '\0'; + va_end(ap); + + debug_return_bool(ret); +} + +/* + * Parse the format and append strings, only %s and %% escapes are supported. + */ +bool +sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) +{ + int len, saved_len = lbuf->len; + bool ret = false; + va_list ap; + char *s; + debug_decl(sudo_lbuf_append, SUDO_DEBUG_UTIL) + + if (sudo_lbuf_error(lbuf)) + debug_return_bool(false); + + va_start(ap, fmt); + while (*fmt != '\0') { + if (fmt[0] == '%' && fmt[1] == 's') { + if ((s = va_arg(ap, char *)) == NULL) + s = "(NULL)"; + len = strlen(s); + if (!sudo_lbuf_expand(lbuf, len)) + goto done; + memcpy(lbuf->buf + lbuf->len, s, len); + lbuf->len += len; + fmt += 2; + continue; + } + if (!sudo_lbuf_expand(lbuf, 1)) + goto done; + lbuf->buf[lbuf->len++] = *fmt++; + } + ret = true; + +done: + if (!ret) + lbuf->len = saved_len; + if (lbuf->size != 0) + lbuf->buf[lbuf->len] = '\0'; + va_end(ap); + + debug_return_bool(ret); +} + +/* XXX - check output function return value */ +static void +sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len) +{ + char *cp, save; + int i, have, contlen = 0; + int indent = lbuf->indent; + bool is_comment = false; + debug_decl(sudo_lbuf_println, SUDO_DEBUG_UTIL) + + /* Comment lines don't use continuation and only indent is for "# " */ + if (line[0] == '#' && isblank((unsigned char)line[1])) { + is_comment = true; + indent = 2; + } + if (lbuf->continuation != NULL && !is_comment) + contlen = strlen(lbuf->continuation); + + /* + * Print the buffer, splitting the line as needed on a word + * boundary. + */ + cp = line; + have = lbuf->cols; + while (cp != NULL && *cp != '\0') { + char *ep = NULL; + int need = len - (int)(cp - line); + + if (need > have) { + have -= contlen; /* subtract for continuation char */ + if ((ep = memrchr(cp, ' ', have)) == NULL) + ep = memchr(cp + have, ' ', need - have); + if (ep != NULL) + need = (int)(ep - cp); + } + if (cp != line) { + if (is_comment) { + lbuf->output("# "); + } else { + /* indent continued lines */ + /* XXX - build up string instead? */ + for (i = 0; i < indent; i++) + lbuf->output(" "); + } + } + /* NUL-terminate cp for the output function and restore afterwards */ + save = cp[need]; + cp[need] = '\0'; + lbuf->output(cp); + cp[need] = save; + cp = ep; + + /* + * If there is more to print, reset have, incremement cp past + * the whitespace, and print a line continuaton char if needed. + */ + if (cp != NULL) { + have = lbuf->cols - indent; + ep = line + len; + while (cp < ep && isblank((unsigned char)*cp)) { + cp++; + } + if (contlen) + lbuf->output(lbuf->continuation); + } + lbuf->output("\n"); + } + + debug_return; +} + +bool +sudo_lbuf_expand(struct sudo_lbuf *lbuf, int extra) +{ + debug_decl(sudo_lbuf_expand, SUDO_DEBUG_UTIL) + + if (lbuf->len + extra + 1 >= lbuf->size) { + char *new_buf; + int new_size = lbuf->size; + + do { + new_size += 256; + } while (lbuf->len + extra + 1 >= new_size); + if ((new_buf = realloc(lbuf->buf, new_size)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + lbuf->error = 1; + debug_return_bool(false); + } + lbuf->buf = new_buf; + lbuf->size = new_size; + } + debug_return_bool(true); +} + + + +/**************************************************************************/ +/****************************** fata.c **********************************/ + +static bool (*sudo_warn_setlocale)(bool, int *); +static bool (*sudo_warn_setlocale_prev)(bool, int *); + +struct sudo_fatal_callback { + SLIST_ENTRY(sudo_fatal_callback) entries; + void (*func)(void); +}; +SLIST_HEAD(sudo_fatal_callback_list, sudo_fatal_callback); +static struct sudo_fatal_callback_list callbacks = SLIST_HEAD_INITIALIZER(&callbacks); + +sudo_conv_t sudo_warn_conversation; + + void +do_cleanup(void) +{ + struct sudo_fatal_callback *cb; + + /* Run callbacks, removing them from the list as we go. */ + while ((cb = SLIST_FIRST(&callbacks)) != NULL) { + SLIST_REMOVE_HEAD(&callbacks, entries); + cb->func(); + free(cb); + } +} + +void +sudo_fatal_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(strerror(errno), fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_fatalx_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(NULL, fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_warn_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(strerror(errno), fmt, ap); + va_end(ap); +} + +void +sudo_warnx_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + warning(NULL, fmt, ap); + va_end(ap); +} + +void +sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(gai_strerror(errnum), fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(gai_strerror(errnum), fmt, ap); + va_end(ap); +} + +void +sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) +{ + warning(strerror(errno), fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) +{ + warning(NULL, fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) +{ + warning(strerror(errno), fmt, ap); +} + +void +sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) +{ + warning(NULL, fmt, ap); +} + +void +sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) +{ + warning(gai_strerror(errnum), fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) +{ + warning(gai_strerror(errnum), fmt, ap); +} + +void +warning(const char *errstr, const char *fmt, va_list ap) +{ + int cookie; + + /* Set user locale if setter was specified. */ + if (sudo_warn_setlocale != NULL) + sudo_warn_setlocale(false, &cookie); + + if (sudo_warn_conversation != NULL) { + struct sudo_conv_message msgs[6]; + char static_buf[1024], *buf = static_buf; + int nmsgs = 0; + + /* Use conversation function. */ + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = getprogname(); + if (fmt != NULL) { + va_list ap2; + int buflen; + + /* Use static buffer if possible, else dynamic. */ + va_copy(ap2, ap); + buflen = vsnprintf(static_buf, sizeof(static_buf), fmt, ap2); + va_end(ap2); + if (buflen >= ssizeof(static_buf)) { + buf = malloc(++buflen); + if (buf != NULL) + (void)vsnprintf(buf, buflen, fmt, ap); + else + buf = static_buf; + } + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = ": "; + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = buf; + } + if (errstr != NULL) { + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = ": "; + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = errstr; + } + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = "\n"; + sudo_warn_conversation(nmsgs, msgs, NULL, NULL); + if (buf != static_buf) + free(buf); + } else { + /* Write to the standard error. */ + fputs(getprogname(), stderr); + if (fmt != NULL) { + fputs(": ", stderr); + vfprintf(stderr, fmt, ap); + } + if (errstr != NULL) { + fputs(": ", stderr); + fputs(errstr, stderr); + } + putc('\n', stderr); + } + + /* Restore old locale as needed. */ + if (sudo_warn_setlocale != NULL) + sudo_warn_setlocale(true, &cookie); +} + +/**************************************************************************/ +/*************************** sudo_debug.c *******************************/ + +/* Support up to 10 instances. */ +#define SUDO_DEBUG_INSTANCE_MAX 10 +static struct sudo_debug_instance *sudo_debug_instances[SUDO_DEBUG_INSTANCE_MAX]; +static int sudo_debug_last_instance = -1; +SLIST_HEAD(sudo_debug_output_list, sudo_debug_output); + +/* Default instance index to use for common utility functions. */ +int sudo_debug_active_instance = -1; + +struct sudo_debug_output { + SLIST_ENTRY(sudo_debug_output) entries; + char *filename; + int *settings; + int fd; +}; + +struct sudo_debug_instance { + char *program; + const char *const *subsystems; + const unsigned int *subsystem_ids; + unsigned int max_subsystem; + struct sudo_debug_output_list outputs; +}; + +void +sudo_debug_vprintf2_v1(const char *func, const char *file, int lineno, int level, + const char *fmt, va_list ap) +{ + int buflen, pri, saved_errno = errno; + unsigned int subsys; + char static_buf[1024], *buf = static_buf; + struct sudo_debug_instance *instance; + struct sudo_debug_output *output; + debug_decl_func(sudo_debug_vprintf2); + + if (sudo_debug_active_instance == -1) + goto out; + + /* Extract priority and subsystem from level. */ + pri = SUDO_DEBUG_PRI(level); + subsys = SUDO_DEBUG_SUBSYS(level); + + /* Find matching instance. */ + if (sudo_debug_active_instance > sudo_debug_last_instance) { + sudo_warnx_nodebug("%s: invalid instance ID %d, max %d", + __func__, sudo_debug_active_instance, sudo_debug_last_instance); + goto out; + } + instance = sudo_debug_instances[sudo_debug_active_instance]; + if (instance == NULL) { + sudo_warnx_nodebug("%s: unregistered instance index %d", __func__, + sudo_debug_active_instance); + goto out; + } + + SLIST_FOREACH(output, &instance->outputs, entries) { + /* Make sure we want debug info at this level. */ + if (subsys <= instance->max_subsystem && output->settings[subsys] >= pri) { + va_list ap2; + + /* Operate on a copy of ap to support multiple outputs. */ + va_copy(ap2, ap); + buflen = fmt ? vsnprintf(static_buf, sizeof(static_buf), fmt, ap2) : 0; + va_end(ap2); + if (buflen >= ssizeof(static_buf)) { + va_list ap3; + + /* Not enough room in static buf, allocate dynamically. */ + va_copy(ap3, ap); + buflen = vasprintf(&buf, fmt, ap3); + va_end(ap3); + } + if (buflen != -1) { + int errcode = ISSET(level, SUDO_DEBUG_ERRNO) ? saved_errno : 0; + if (ISSET(level, SUDO_DEBUG_LINENO)) + sudo_debug_write2(output->fd, func, file, lineno, buf, buflen, errcode); + else + sudo_debug_write2(output->fd, NULL, NULL, 0, buf, buflen, errcode); + if (buf != static_buf) { + free(buf); + buf = static_buf; + } + } + } + } +out: + errno = saved_errno; +} + + +void +sudo_debug_printf2_v1(const char *func, const char *file, int lineno, int level, + const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_debug_vprintf2(func, file, lineno, level, fmt, ap); + va_end(ap); +} + +/**************************************************************************/ diff --git a/utsudo-0.0.2/lib/util/libutsudo_util.la b/utsudo-0.0.2/lib/util/libutsudo_util.la new file mode 100644 index 0000000..79cefc6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/libutsudo_util.la @@ -0,0 +1,41 @@ +# libutsudo_util.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libutsudo_util.so.0' + +# Names of this library. +library_names='libutsudo_util.so.0.0.0 libutsudo_util.so.0 libutsudo_util.so' + +# The name of the static archive. +old_library='' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -lpthread -ldl' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libutsudo_util. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/libexec/utsudo' diff --git a/utsudo-0.0.2/lib/util/libutsudo_util.lai b/utsudo-0.0.2/lib/util/libutsudo_util.lai new file mode 100644 index 0000000..b7d8e49 --- /dev/null +++ b/utsudo-0.0.2/lib/util/libutsudo_util.lai @@ -0,0 +1,41 @@ +# libutsudo_util.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libutsudo_util.so.0' + +# Names of this library. +library_names='libutsudo_util.so.0.0.0 libutsudo_util.so.0 libutsudo_util.so' + +# The name of the static archive. +old_library='' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -lpthread -ldl' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libutsudo_util. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/libexec/utsudo' diff --git a/utsudo-0.0.2/lib/util/src/arc4random.rs b/utsudo-0.0.2/lib/util/src/arc4random.rs new file mode 100644 index 0000000..ef5545c --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/arc4random.rs @@ -0,0 +1,638 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + non_camel_case_types, + unused_mut, + unused_unsafe, + dead_code, + non_upper_case_globals, + unused_variables, + unused_assignments +)] + +//call libc_func +use libc::abort; + +//define +pub const RSBUFSZ: i32 = 1024; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const KEYSZ: i32 = 32; +pub const IVSZ: i32 = 8; + +//aliase of type +pub type pid_t = libc::c_int; +pub type uint32_t = libc::c_uint; +pub type size_t = libc::c_ulong; +pub type __off_t = libc::c_long; +pub type __pthread_list_t = __pthread_internal_list; +pub type sig_atomic_t = __sig_atomic_t; +pub type __sig_atomic_t = libc::c_int; +pub type u8 = libc::c_uchar; +pub type u32 = libc::c_uint; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct _rs { + pub rs_have: size_t, + pub rs_count: size_t, +} + +//line 78 +static mut rs: *mut _rs = 0 as *const _rs as *mut _rs; + +//line 81 +#[derive(Copy, Clone)] +#[repr(C)] +pub struct _rsx { + pub rs_chacha: chacha_ctx, + pub rs_buf: [libc::c_uchar; 1024], +} + +//line 82 included line81 +#[derive(Copy, Clone)] +#[repr(C)] +pub struct chacha_ctx { + pub input: [u32; 16], +} + +//line 84 +static mut rsx: *mut _rsx = 0 as *const _rsx as *mut _rsx; + +//called by struct __pthread_mutex_s -> __pthread_list_t +#[derive(Copy, Clone)] +#[repr(C)] +pub struct __pthread_internal_list { + pub __prev: *mut __pthread_internal_list, + pub __next: *mut __pthread_internal_list, +} + +//called by union pthread_mutex_t +#[derive(Copy, Clone)] +#[repr(C)] +pub struct __pthread_mutex_s { + pub __lock: libc::c_int, + pub __count: libc::c_uint, + pub __owner: libc::c_int, + pub __nusers: libc::c_uint, + pub __kind: libc::c_int, + pub __spins: libc::c_short, + pub __elision: libc::c_short, + pub __list: __pthread_list_t, +} + +//called by _ARC4_LOCK +#[derive(Copy, Clone)] +#[repr(C)] +pub union pthread_mutex_t { + pub __data: __pthread_mutex_s, + pub __size: [libc::c_char; __SIZEOF_PTHREAD_MUTEX_T], + pub __align: libc::c_long, +} + +//arc4random.h_line34,init arc4random_mtx,called by 208 +static mut arc4random_mtx: pthread_mutex_t = pthread_mutex_t { + __data: { + let mut init = __pthread_mutex_s { + __lock: 0 as libc::c_int, + __count: 0 as libc::c_uint, + __owner: 0 as libc::c_int, + __nusers: 0 as libc::c_uint, + __kind: 0 as libc::c_int, + __spins: 0 as libc::c_short, + __elision: 0 as libc::c_short, + __list: { + let mut init = __pthread_internal_list { + __prev: 0 as *mut __pthread_internal_list, + __next: 0 as *mut __pthread_internal_list, + }; + init + }, + }; + init + }, +}; + +#[no_mangle] +unsafe fn _rs_stir() { + let mut rnd: [libc::c_uchar; (KEYSZ + IVSZ) as usize] = [0; (KEYSZ + IVSZ) as usize]; + + if getentropy( + rnd.as_mut_ptr() as *mut libc::c_void, + ::std::mem::size_of::<[libc::c_uchar; (KEYSZ + IVSZ) as usize]>() as libc::c_ulong, + ) == -1 + { + _getentropy_fail(); + } + + if rs.is_null() { + _rs_init( + rnd.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_uchar; (KEYSZ + IVSZ) as usize]>() as libc::c_ulong, + ); + } else { + _rs_rekey( + rnd.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_uchar; (KEYSZ + IVSZ) as usize]>() as libc::c_ulong, + ); + } + + sudo_memset_s( + rnd.as_mut_ptr() as *mut libc::c_void, + ::std::mem::size_of::<[libc::c_uchar; (KEYSZ + IVSZ) as usize]>() as libc::c_ulong, + 0, + ::std::mem::size_of::<[libc::c_uchar; (KEYSZ + IVSZ) as usize]>() as libc::c_ulong, + ); + + (*rs).rs_have = 0; + + memset( + (*rsx).rs_buf.as_mut_ptr() as *mut libc::c_void, + 0, + ::std::mem::size_of::<[libc::c_uchar; (16 * RSBUFSZ) as usize]>() as libc::c_ulong, + ); + (*rs).rs_count = 1600000; +} + +extern "C" { + fn mmap( + __addr: *mut libc::c_void, + __len: size_t, + __prot: libc::c_int, + __flags: libc::c_int, + __fd: libc::c_int, + __offset: __off_t, + ) -> *mut libc::c_void; + fn getentropy(__buffer: *mut libc::c_void, __length: size_t) -> libc::c_int; + fn sudo_memset_s(v: *mut libc::c_void, smax: size_t, c: libc::c_int, n: size_t) -> libc::c_int; + fn memset(__s: *mut libc::c_void, __s2: libc::c_int, __n: libc::c_ulong) -> *mut libc::c_void; + fn memcpy( + __dest: *mut libc::c_void, + __rsc: *const libc::c_void, + __n: size_t, + ) -> *mut libc::c_void; + fn pthread_mutex_lock(__mutex: *mut pthread_mutex_t) -> libc::c_int; + fn pthread_mutex_unlock(__mutex: *mut pthread_mutex_t) -> libc::c_int; + fn munmap(__addr: *mut libc::c_void, __len: size_t) -> libc::c_int; +} + +//function _getentropy_fail +use libc::raise; +pub const SIGKILL: libc::c_int = 9; +pub unsafe fn _getentropy_fail() { + raise(SIGKILL); +} + +//function _rs_forkdetect +static mut wipeonfork: libc::c_int = 0; +use libc::getpid; +static mut _rs_forked: __sig_atomic_t = 0; +pub unsafe fn _rs_forkdetect() { + if wipeonfork == 0 { + static mut _rs_pid: pid_t = 0; + let mut pid: pid_t = getpid(); + if _rs_pid == 0 || _rs_pid != pid || _rs_forked != 0 { + _rs_pid = pid; + _rs_forked = 0; + if !rs.is_null() { + memset( + rs as *mut libc::c_void, + 0, + ::std::mem::size_of::<_rs>() as size_t, + ); + } + } + } +} + +//function _rs_allocate +pub const PROT_READ: libc::c_short = 0x1; +pub const PROT_WRITE: libc::c_short = 0x2; +pub const MAP_ANON: libc::c_short = 0x20; +pub const MAP_FAILED: libc::c_int = -1; +pub const MAP_PRIVATE: libc::c_short = 0x02; +pub const MADV_WIPEONFORK: libc::c_int = 18; +use libc::madvise; +use libc::pthread_atfork; +pub unsafe extern "C" fn _rs_forkhandler() { + _rs_forked = 1; +} +pub unsafe fn _rs_allocate(mut rsp: *mut *mut _rs, mut rsxp: *mut *mut _rsx) -> libc::c_int { + *rsp = mmap( + 0 as *mut libc::c_void, + (::std::mem::size_of::<_rs>()) as size_t, + PROT_READ as libc::c_int | PROT_WRITE as libc::c_int, + MAP_ANON as libc::c_int | MAP_PRIVATE as libc::c_int, + -(1 as libc::c_int), + 0, + ) as *mut _rs; + if *rsp == MAP_FAILED as *mut _rs { + return -1; + } + *rsxp = mmap( + 0 as *mut libc::c_void, + (::std::mem::size_of::<_rsx>()) as size_t, + PROT_READ as libc::c_int | PROT_WRITE as libc::c_int, + MAP_ANON as libc::c_int | MAP_PRIVATE as libc::c_int, + -(1 as libc::c_int), + 0, + ) as *mut _rsx; + if *rsxp == MAP_FAILED as *mut _rsx { + munmap( + *rsp as *mut libc::c_void, + ::std::mem::size_of::<_rsx>() as size_t, + ); + *rsp = 0 as *mut _rs; + return -1; + } + if (madvise( + *rsp as *mut libc::c_void, + ::std::mem::size_of::<_rs>(), + MADV_WIPEONFORK, + ) == 0) + && (madvise( + *rsxp as *mut libc::c_void, + ::std::mem::size_of::<_rsx>(), + MADV_WIPEONFORK, + ) == 0) + { + wipeonfork = 1; + } + + pthread_atfork( + None, + None, + Some(_rs_forkhandler as unsafe extern "C" fn() -> ()), + ); + return 0; +} + +//function chacha_keysetup +macro_rules! U8TO32_LITTLE { + ($a:expr,$b:expr) => {{ + (*$a.offset($b as libc::c_int as isize) + .offset(0 as libc::c_int as isize) as libc::c_uint) + << 0 as libc::c_int + | (*$a + .offset($b as libc::c_int as isize) + .offset(1 as libc::c_int as isize) as libc::c_uint) + << 8 as libc::c_int + | (*$a + .offset($b as libc::c_int as isize) + .offset(2 as libc::c_int as isize) as libc::c_uint) + << 16 as libc::c_int + | (*$a + .offset($b as libc::c_int as isize) + .offset(3 as libc::c_int as isize) as libc::c_uint) + << 24 as libc::c_int + }}; +} + +static mut sigma: [libc::c_char; 16] = + unsafe { *::std::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"expand 32-byte k") }; +static mut tau: [libc::c_char; 16] = + unsafe { *::std::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"expand 16-byte k") }; + +#[no_mangle] +pub unsafe fn chacha_keysetup( + mut x: *mut chacha_ctx, + mut k: *const u8, + mut kbits: u32, + mut ivbits: u32, +) { + let mut constants: *const libc::c_char = 0 as *const libc::c_char; + + (*x).input[4] = U8TO32_LITTLE!(k, 0); + (*x).input[5] = U8TO32_LITTLE!(k, 4); + (*x).input[6] = U8TO32_LITTLE!(k, 8); + (*x).input[7] = U8TO32_LITTLE!(k, 12); + + if kbits == 256 { + k = k.offset(16); + constants = sigma.as_ptr(); + } else { + constants = tau.as_ptr(); + } + + (*x).input[8] = U8TO32_LITTLE!(k, 0); + (*x).input[9] = U8TO32_LITTLE!(k, 4); + (*x).input[10] = U8TO32_LITTLE!(k, 8); + (*x).input[11] = U8TO32_LITTLE!(k, 12); + (*x).input[0] = U8TO32_LITTLE!(constants, 0); + (*x).input[1] = U8TO32_LITTLE!(constants, 4); + (*x).input[2] = U8TO32_LITTLE!(constants, 8); + (*x).input[3] = U8TO32_LITTLE!(constants, 12); +} + +//function chacha_encrypt_bytes u32=libc::c_uint +macro_rules! PLUS { + ($a:expr,$b:expr) => { + ($a + $b) & 0xffffffff as libc::c_uint + }; +} + +macro_rules! ROTATE { + ($c:expr,$d:expr) => { + $c << $d & 0xffffffff | $c >> 32 - $d + }; +} + +macro_rules! XOR { + ($e:expr,$f:expr) => { + ($e ^ $f) + }; +} + +macro_rules! QUARTERROUND { + ($a1:expr,$b1:expr,$c1:expr,$d1:expr) => { + $a1 = PLUS!($a1, $b1); + $d1 = ROTATE!(XOR!($d1, $a1), 16); + $c1 = PLUS!($c1, $d1); + $b1 = ROTATE!(XOR!($b1, $c1), 12); + $a1 = PLUS!($a1, $b1); + $d1 = ROTATE!(XOR!($d1, $a1), 8); + $c1 = PLUS!($c1, $d1); + $b1 = ROTATE!(XOR!($b1, $c1), 7); + }; +} + +macro_rules! U32TO8_LITTLE { + ($a:expr,$b:expr,$c:expr) => { + *$a.offset($c as isize).offset(0 as isize) = ($b & 0xff) as u8; + *$a.offset($c as isize).offset(1 as isize) = (($b >> 8) & 0xff) as u8; + *$a.offset($c as isize).offset(2 as isize) = (($b >> 16) & 0xff) as u8; + *$a.offset($c as isize).offset(3 as isize) = (($b >> 24) & 0xff) as u8; + }; +} + +#[no_mangle] +pub unsafe fn chacha_encrypt_bytes( + mut x: *mut chacha_ctx, + mut m: *const u8, + mut c: *mut u8, + mut bytes: u32, +) { + let mut x0: u32 = 0; + let mut x1: u32 = 0; + let mut x2: u32 = 0; + let mut x3: u32 = 0; + let mut x4: u32 = 0; + let mut x5: u32 = 0; + let mut x6: u32 = 0; + let mut x7: u32 = 0; + let mut x8: u32 = 0; + let mut x9: u32 = 0; + let mut x10: u32 = 0; + let mut x11: u32 = 0; + let mut x12: u32 = 0; + let mut x13: u32 = 0; + let mut x14: u32 = 0; + let mut x15: u32 = 0; + let mut j0: u32 = 0; + let mut j1: u32 = 0; + let mut j2: u32 = 0; + let mut j3: u32 = 0; + let mut j4: u32 = 0; + let mut j5: u32 = 0; + let mut j6: u32 = 0; + let mut j7: u32 = 0; + let mut j8: u32 = 0; + let mut j9: u32 = 0; + let mut j10: u32 = 0; + let mut j11: u32 = 0; + let mut j12: u32 = 0; + let mut j13: u32 = 0; + let mut j14: u32 = 0; + let mut j15: u32 = 0; + let mut ctarget: *mut u8 = 0 as *mut u8; + let mut tmp: [u8; 64] = [0; 64]; + let mut i: libc::c_uint = 0; + + if bytes == 0 { + return; + } + + j0 = (*x).input[0]; + j1 = (*x).input[1]; + j2 = (*x).input[2]; + j3 = (*x).input[3]; + j4 = (*x).input[4]; + j5 = (*x).input[5]; + j6 = (*x).input[6]; + j7 = (*x).input[7]; + j8 = (*x).input[8]; + j9 = (*x).input[9]; + j10 = (*x).input[10]; + j11 = (*x).input[11]; + j12 = (*x).input[12]; + j13 = (*x).input[13]; + j14 = (*x).input[14]; + j15 = (*x).input[15]; + + loop { + if bytes < 64 { + while i < bytes { + tmp[i as usize] = *m.offset(i as isize); + i += 1; + } + m = tmp.as_mut_ptr(); + ctarget = c; + c = tmp.as_mut_ptr(); + } + x0 = j0; + x1 = j1; + x2 = j2; + x3 = j3; + x4 = j4; + x5 = j5; + x6 = j6; + x7 = j7; + x8 = j8; + x9 = j9; + x10 = j10; + x11 = j11; + x12 = j12; + x13 = j13; + x14 = j14; + x15 = j15; + i = 20; + while i > 0 { + QUARTERROUND!(x0, x4, x8, x12); + QUARTERROUND!(x1, x5, x9, x13); + QUARTERROUND!(x2, x6, x10, x14); + QUARTERROUND!(x3, x7, x11, x15); + QUARTERROUND!(x0, x5, x10, x15); + QUARTERROUND!(x1, x6, x11, x12); + QUARTERROUND!(x2, x7, x8, x13); + QUARTERROUND!(x3, x4, x9, x14); + i -= 2; + } + x0 = PLUS!(x0, j0); + x1 = PLUS!(x1, j1); + x2 = PLUS!(x2, j2); + x3 = PLUS!(x3, j3); + x4 = PLUS!(x4, j4); + x5 = PLUS!(x5, j5); + x6 = PLUS!(x6, j6); + x7 = PLUS!(x7, j7); + x8 = PLUS!(x8, j8); + x9 = PLUS!(x9, j9); + x10 = PLUS!(x10, j10); + x11 = PLUS!(x11, j11); + x12 = PLUS!(x12, j12); + x13 = PLUS!(x13, j13); + x14 = PLUS!(x14, j14); + x15 = PLUS!(x15, j15); + //line 185-187 + j12 = PLUS!(j12, 1); + if j12 == 0 { + j13 = PLUS!(j13, 1); + } + + U32TO8_LITTLE!(c, x0, 0); + U32TO8_LITTLE!(c, x1, 4); + U32TO8_LITTLE!(c, x2, 8); + U32TO8_LITTLE!(c, x3, 12); + U32TO8_LITTLE!(c, x4, 16); + U32TO8_LITTLE!(c, x5, 20); + U32TO8_LITTLE!(c, x6, 24); + U32TO8_LITTLE!(c, x7, 28); + U32TO8_LITTLE!(c, x8, 32); + U32TO8_LITTLE!(c, x9, 36); + U32TO8_LITTLE!(c, x10, 40); + U32TO8_LITTLE!(c, x11, 44); + U32TO8_LITTLE!(c, x12, 48); + U32TO8_LITTLE!(c, x13, 52); + U32TO8_LITTLE!(c, x14, 56); + U32TO8_LITTLE!(c, x15, 60); + if bytes <= 64 { + if bytes < 64 { + i = 0; + while i < bytes { + *ctarget.offset(i as isize) = *c.offset(i as isize); + i += 1; + } + } + (*x).input[12] = j12; + (*x).input[13] = j13; + return; + } + bytes -= 64; + c = c.offset(64); + } //116 for(;;) +} + +//function chacha_ivsetup +#[no_mangle] +pub unsafe fn chacha_ivsetup(mut x: *mut chacha_ctx, mut iv: *mut u8) { + (*x).input[12] = 0; + (*x).input[13] = 0; + (*x).input[14] = U8TO32_LITTLE!(iv, 0); + (*x).input[15] = U8TO32_LITTLE!(iv, 4); +} + +//line 93 +#[inline] +unsafe fn _rs_init(mut buf: *mut libc::c_uchar, mut n: size_t) { + if n < (KEYSZ + IVSZ) as libc::c_ulong { + return; + } + if rs.is_null() { + if _rs_allocate(&mut rs, &mut rsx) == -1 { + abort(); + } + } + chacha_keysetup(&mut (*rsx).rs_chacha, buf, (KEYSZ * 8) as libc::c_uint, 0); + chacha_ivsetup(&mut (*rsx).rs_chacha, buf.offset(KEYSZ as isize)); +} + +//line 129-138 +#[inline] +unsafe fn _rs_stir_if_needed(mut len: size_t) { + _rs_forkdetect(); + if rs.is_null() || (*rs).rs_count <= len { + _rs_stir(); + } + if (*rs).rs_count <= len { + (*rs).rs_count = 0; + } else { + (*rs).rs_count -= len; + } +} + +//line 141-161 +unsafe fn _rs_rekey(mut dat: *mut libc::c_uchar, mut datlen: size_t) { + chacha_encrypt_bytes( + &mut (*rsx).rs_chacha, + ((*rsx).rs_buf).as_mut_ptr(), + ((*rsx).rs_buf).as_mut_ptr(), + ::std::mem::size_of::<[libc::c_uchar; 1024]>() as libc::c_ulong as u32, + ); + if !dat.is_null() { + let mut i: size_t = 0; + let mut m: size_t = 0; + + if datlen < (KEYSZ + IVSZ) as libc::c_ulong { + m = datlen; + } else { + m = (KEYSZ + IVSZ) as libc::c_ulong; + } + + while 1 < m { + (*rsx).rs_buf[i as usize] = + ((*rsx).rs_buf[i as usize] ^ *dat.offset(i as isize)) as libc::c_uchar; + i += 1; + } + } + _rs_init((*rsx).rs_buf.as_mut_ptr(), (KEYSZ + IVSZ) as libc::c_ulong); + memset( + (*rsx).rs_buf.as_mut_ptr() as *mut libc::c_void, + 0, + (KEYSZ + IVSZ) as libc::c_ulong, + ); + (*rs).rs_have = (::std::mem::size_of::<[libc::c_uchar; 1024]>()) as libc::c_ulong + - KEYSZ as size_t + - IVSZ as size_t; +} + +//line 190 +#[inline] +unsafe fn _rs_random_u32(mut val: *mut libc::c_uint) { + let mut keystream: *mut libc::c_uchar = 0 as *mut libc::c_uchar; + + _rs_stir_if_needed(::std::mem::size_of::() as libc::c_ulong); + if (*rs).rs_have < ::std::mem::size_of::() as libc::c_ulong { + _rs_rekey(0 as *mut libc::c_uchar, 0); + } + keystream = (*rsx) + .rs_buf + .as_mut_ptr() + .offset(::std::mem::size_of::<[libc::c_uchar; 1024]>() as isize) + .offset(-((*rs).rs_have as isize)); + memcpy( + val as *mut libc::c_void, + keystream as *const libc::c_void, + ::std::mem::size_of::() as size_t, + ); + memset( + keystream as *mut libc::c_void, + 0, + ::std::mem::size_of::() as size_t, + ); + (*rs).rs_have -= ::std::mem::size_of::() as size_t; +} + +//line 204 +#[no_mangle] +pub fn sudo_arc4random() -> libc::c_uint { + let mut val: libc::c_uint = 0; + unsafe { + pthread_mutex_lock(&mut arc4random_mtx); + _rs_random_u32(&mut val); + pthread_mutex_unlock(&mut arc4random_mtx); + } + return val; +} diff --git a/utsudo-0.0.2/lib/util/src/arc4random_uniform.rs b/utsudo-0.0.2/lib/util/src/arc4random_uniform.rs new file mode 100644 index 0000000..5249ac4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/arc4random_uniform.rs @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(unused_attributes, deprecated, dead_code, unused_assignments)] + +use crate::arc4random::sudo_arc4random; +use libc::uint32_t; + +#[no_mangle] +pub fn sudo_arc4random_uniform(upper_bound: uint32_t) -> uint32_t { + let mut min: uint32_t = 0; + let mut r: uint32_t = 0; + if upper_bound < 2 { + return 0; + } + min = upper_bound.wrapping_neg().wrapping_rem(upper_bound); + + loop { + r = sudo_arc4random(); + if r >= min { + break; + } + } + return r.wrapping_rem(upper_bound); +} diff --git a/utsudo-0.0.2/lib/util/src/closefrom.rs b/utsudo-0.0.2/lib/util/src/closefrom.rs new file mode 100644 index 0000000..948b9a6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/closefrom.rs @@ -0,0 +1,97 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(unused_variables, unused_assignments, clashing_extern_declarations)] +use crate::arc4random::__off_t; +use crate::sudo_conf::__ino_t; +use crate::INT_MAX; +use libc::dirfd; +use libc::DIR; +pub const _SC_OPEN_MAX: i32 = 4; + +extern "C" { + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn opendir(__name: *const libc::c_char) -> *mut DIR; + fn readdir(__dirp: *mut DIR) -> *mut dirent; + fn sudo_strtonum( + _: *const libc::c_char, + _: libc::c_longlong, + _: libc::c_longlong, + _: *mut *const libc::c_char, + ) -> libc::c_longlong; + fn close(__fd: libc::c_int) -> libc::c_int; + fn closedir(__dirp: *mut DIR) -> libc::c_int; +} + +#[no_mangle] +fn closefrom_fallback(lowfd: libc::c_int) { + let lowfd: libc::c_int = 0; + let mut _fd: libc::c_long = 0; + let mut maxfd: libc::c_long; + + #[macro_export] + macro_rules! _POSIX_OPEN_MAX { + () => { + 20 + }; + } + + maxfd = unsafe { sysconf(_SC_OPEN_MAX) }; + + if maxfd < 0 { + maxfd = _POSIX_OPEN_MAX!(); + } else { + let mut fd = lowfd; + while i64::from(fd) < maxfd { + unsafe { close(fd) }; + fd += 1; + } + } +} + +#[repr(C)] +pub struct dirent { + pub d_ino: __ino_t, + pub d_off: __off_t, + pub d_reclen: libc::c_short, + pub d_type: libc::c_char, + pub d_name: [libc::c_char; 256], +} + +#[no_mangle] +fn sudo_closefrom(lowfd: libc::c_int) { + let path: *const libc::c_char; + let dirp: *mut DIR; + path = b"/proc/self/fd\0" as *const u8 as *const libc::c_char; + + dirp = unsafe { opendir(path) }; + if !dirp.is_null() { + let mut dent: *mut dirent; + loop { + dent = unsafe { readdir(dirp) }; + if dent.is_null() { + break; + } + let mut errstr: *const libc::c_char = 0 as *const libc::c_char; + let fd: libc::c_int; + + fd = unsafe { + sudo_strtonum( + ((*dent).d_name).as_mut_ptr(), + lowfd as libc::c_longlong, + INT_MAX!() as libc::c_longlong, + &mut errstr, + ) as libc::c_int + }; + if errstr.is_null() && fd != unsafe { dirfd(dirp) } { + unsafe { close(fd as libc::c_int) }; + } + } + unsafe { closedir(dirp as *mut DIR) }; + return; + } + closefrom_fallback(lowfd as libc::c_int); +} diff --git a/utsudo-0.0.2/lib/util/src/digest.rs b/utsudo-0.0.2/lib/util/src/digest.rs new file mode 100644 index 0000000..4c7edf3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/digest.rs @@ -0,0 +1,239 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + unused_mut, + non_camel_case_types, + non_upper_case_globals, + unused_variables, + unused_assignments +)] + +//call other file's func +use crate::sha2::sudo_SHA224Final; +use crate::sha2::sudo_SHA224Init; +use crate::sha2::sudo_SHA224Update; +use crate::sha2::sudo_SHA256Final; +use crate::sha2::sudo_SHA256Init; +use crate::sha2::sudo_SHA256Update; +use crate::sha2::sudo_SHA384Final; +use crate::sha2::sudo_SHA384Init; +use crate::sha2::sudo_SHA384Update; +use crate::sha2::sudo_SHA512Final; +use crate::sha2::sudo_SHA512Init; +use crate::sha2::sudo_SHA512Update; +use crate::sha2::SHA2_CTX; +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug::sudo_debug_exit_ptr_v1; +use crate::sudo_debug::sudo_debug_exit_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; +use libc::free; +use libc::malloc; + +pub type size_t = libc::c_ulong; +pub type uint8_t = libc::c_uchar; + +//define +pub const EINVAL: libc::c_int = 22; +pub const SHA224_DIGEST_LENGTH: libc::c_uint = 28; +pub const SHA256_DIGEST_LENGTH: libc::c_uint = 32; +pub const SHA384_DIGEST_LENGTH: libc::c_uint = 48; +pub const SHA512_DIGEST_LENGTH: libc::c_uint = 64; + +extern "C" { + fn __errno_location() -> *mut libc::c_int; +} + +pub struct digest_function { + pub digest_len: libc::c_uint, + pub init: Option ()>, + pub update: Option ()>, + pub final_0: Option ()>, +} + +static mut digest_functions: [digest_function; 5] = { + [ + { + //init member 1,one by one + let mut init = digest_function { + digest_len: SHA224_DIGEST_LENGTH as libc::c_uint, + init: Some(sudo_SHA224Init as unsafe extern "C" fn(*mut SHA2_CTX)), + update: Some( + sudo_SHA224Update + as unsafe extern "C" fn(*mut SHA2_CTX, *const uint8_t, size_t), + ), + final_0: Some( + sudo_SHA224Final as unsafe extern "C" fn(*mut uint8_t, *mut SHA2_CTX), + ), + }; + init + }, + { + let mut init = digest_function { + digest_len: SHA256_DIGEST_LENGTH as libc::c_uint, + init: Some(sudo_SHA256Init as unsafe extern "C" fn(*mut SHA2_CTX)), + update: Some( + sudo_SHA256Update + as unsafe extern "C" fn(*mut SHA2_CTX, *const uint8_t, size_t), + ), + final_0: Some( + sudo_SHA256Final as unsafe extern "C" fn(*mut uint8_t, *mut SHA2_CTX), + ), + }; + init + }, + { + let mut init = digest_function { + digest_len: SHA384_DIGEST_LENGTH as libc::c_uint, + init: Some(sudo_SHA384Init as unsafe extern "C" fn(*mut SHA2_CTX)), + update: Some( + sudo_SHA384Update + as unsafe extern "C" fn(*mut SHA2_CTX, *const uint8_t, size_t), + ), + final_0: Some( + sudo_SHA384Final as unsafe extern "C" fn(*mut uint8_t, *mut SHA2_CTX), + ), + }; + init + }, + { + let mut init = digest_function { + digest_len: SHA512_DIGEST_LENGTH as libc::c_uint, + init: Some(sudo_SHA512Init as unsafe extern "C" fn(*mut SHA2_CTX)), + update: Some( + sudo_SHA512Update + as unsafe extern "C" fn(*mut SHA2_CTX, *const uint8_t, size_t), + ), + final_0: Some( + sudo_SHA512Final as unsafe extern "C" fn(*mut uint8_t, *mut SHA2_CTX), + ), + }; + init + }, + { + let mut init = digest_function { + digest_len: 0 as libc::c_uint, + init: None, + update: None, + final_0: None, + }; + init + }, + ] +}; + +pub struct sudo_digest { + pub func: *mut digest_function, + pub ctx: SHA2_CTX, +} + +//line 97 +#[no_mangle] +unsafe extern "C" fn sudo_digest_alloc_v1(mut digest_type: libc::c_int) -> *mut sudo_digest { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + //line 100 + let mut func: *mut digest_function = 0 as *mut digest_function; + let mut dig: *mut sudo_digest = 0 as *mut sudo_digest; + let mut i: libc::c_int = 0; + + //line104-109 + // i = 0; + while digest_functions[i as usize].digest_len != 0 { + if digest_type == i { + func = &mut *digest_functions.as_mut_ptr().offset(i as isize) as *mut digest_function; + break; + } else { + i += 1; + } + } + + //line110-113 + if func.is_null() { + *__errno_location() = EINVAL; + debug_return_ptr!(0 as *mut sudo_digest); + } + + //115 + dig = malloc(::std::mem::size_of::() as libc::size_t) as *mut sudo_digest; + if dig.is_null() { + debug_return_ptr!(0 as *mut sudo_digest); + } + + //line 117 118 + ((*func).init).expect("is not a function pointer")(&mut (*dig).ctx); + (*dig).func = func; + + //line 120 + debug_return_ptr!(dig); +} + +#[no_mangle] +unsafe fn sudo_digest_free_v1(mut dig: *mut sudo_digest) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + free(dig as *mut libc::c_void); + + debug_return!() +} + +#[no_mangle] +unsafe fn sudo_digest_reset_v1(mut dig: *mut sudo_digest) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + ((*(*dig).func).init).expect("is not func pointer")(&mut (*dig).ctx); + + debug_return!() +} + +#[no_mangle] +unsafe fn sudo_digest_getlen_v1(mut digest_type: libc::c_int) -> libc::c_int { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + let mut i: libc::c_int = 0; + + //line 149 + while digest_functions[i as usize].digest_len != 0 { + if digest_type == i { + debug_return_int!(digest_functions[i as usize].digest_len as libc::c_int); + } + i += 1; + } + + //line 154 + debug_return_int!(-1) +} + +#[no_mangle] +unsafe fn sudo_digest_update_v1( + mut dig: *mut sudo_digest, + mut data: *const libc::c_void, + mut len: size_t, +) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + //162 + ((*(*dig).func).update).expect("is not null func point")( + &mut (*dig).ctx, + data as *const libc::c_uchar, + len, + ); + + //line164 + debug_return!() +} + +//line168 +#[no_mangle] +unsafe fn sudo_digest_final_v1(mut dig: *mut sudo_digest, mut md: *mut libc::c_uchar) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + ((*(*dig).func).final_0).expect("is not func point")(md, &mut (*dig).ctx); + + debug_return!() +} diff --git a/utsudo-0.0.2/lib/util/src/event.rs b/utsudo-0.0.2/lib/util/src/event.rs new file mode 100644 index 0000000..09b50d5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/event.rs @@ -0,0 +1,1942 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct pollfd { + pub fd: libc::c_int, + pub events: libc::c_short, + pub revents: libc::c_short, +} + +extern "C" { + fn malloc(_: libc::c_ulong) -> *mut libc::c_void; + fn calloc(_: libc::c_ulong, _: libc::c_ulong) -> *mut libc::c_void; + fn free(__ptr: *mut libc::c_void); + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn memset(_: *mut libc::c_void, _: libc::c_int, _: libc::c_ulong) -> *mut libc::c_void; + fn __errno_location() -> *mut libc::c_int; + fn close(__fd: libc::c_int) -> libc::c_int; + fn read(__fd: libc::c_int, __buf: *mut libc::c_void, __nbytes: size_t) -> ssize_t; + fn write(__fd: libc::c_int, __buf: *const libc::c_void, __n: size_t) -> ssize_t; + fn pipe2(__pipedes: *mut libc::c_int, __flags: libc::c_int) -> libc::c_int; + fn sudo_debug_enter_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ); + fn sudo_debug_exit_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ); + fn sudo_debug_exit_bool_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: bool, + ); + fn sudo_debug_exit_int_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: libc::c_int, + ); + fn sudo_debug_exit_ptr_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: *const libc::c_void, + ); + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); + fn sigfillset(__set: *mut sigset_t) -> libc::c_int; + fn sigprocmask( + __how: libc::c_int, + __set: *const sigset_t, + __oset: *mut sigset_t, + ) -> libc::c_int; + fn sigaction( + __sig: libc::c_int, + __act: *const sigaction, + __oact: *mut sigaction, + ) -> libc::c_int; + fn sudo_ev_base_free_impl(base: *mut sudo_event_base); + fn sudo_ev_base_alloc_impl(base: *mut sudo_event_base) -> libc::c_int; + fn sudo_ev_del_impl(base: *mut sudo_event_base, ev: *mut sudo_event) -> libc::c_int; + fn sudo_ev_add_impl(base: *mut sudo_event_base, ev: *mut sudo_event) -> libc::c_int; + fn sudo_ev_scan_impl(base: *mut sudo_event_base, flags: libc::c_int) -> libc::c_int; + fn sudo_gettime_mono_v1(ts: *mut timespec) -> libc::c_int; +} + +pub type __uint32_t = libc::c_uint; +pub type __uid_t = libc::c_uint; +pub type __pid_t = libc::c_int; +pub type __clock_t = libc::c_long; +pub type __time_t = libc::c_long; +pub type __suseconds_t = libc::c_long; +pub type __ssize_t = libc::c_long; +pub type __syscall_slong_t = libc::c_long; +pub type __sig_atomic_t = libc::c_int; +pub type ssize_t = __ssize_t; +pub type size_t = libc::c_ulong; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct __sigset_t { + pub __val: [libc::c_ulong; 16], +} +pub type sigset_t = __sigset_t; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timeval { + pub tv_sec: __time_t, + pub tv_usec: __suseconds_t, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} +pub type __sigval_t = sigval; +#[derive(Copy, Clone)] +#[repr(C)] +pub union sigval { + pub sival_int: libc::c_int, + pub sival_ptr: *mut libc::c_void, +} + +pub type sig_atomic_t = __sig_atomic_t; +#[derive(Copy, Clone)] +#[repr(C)] +pub struct siginfo_t { + pub si_signo: libc::c_int, + pub si_errno: libc::c_int, + pub si_code: libc::c_int, + pub __pad0: libc::c_int, + pub _sifields: C2RustUnnamed, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub union C2RustUnnamed { + pub _pad: [libc::c_int; 28], + pub _kill: C2RustUnnamed_8, + pub _timer: C2RustUnnamed_7, + pub _rt: C2RustUnnamed_6, + pub _sigchld: C2RustUnnamed_5, + pub _sigfault: C2RustUnnamed_2, + pub _sigpoll: C2RustUnnamed_1, + pub _sigsys: C2RustUnnamed_0, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_0 { + pub _call_addr: *mut libc::c_void, + pub _syscall: libc::c_int, + pub _arch: libc::c_uint, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_1 { + pub si_band: libc::c_long, + pub si_fd: libc::c_int, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_2 { + pub si_addr: *mut libc::c_void, + pub si_addr_lsb: libc::c_short, + pub _bounds: C2RustUnnamed_3, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub union C2RustUnnamed_3 { + pub _addr_bnd: C2RustUnnamed_4, + pub _pkey: __uint32_t, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_4 { + pub _lower: *mut libc::c_void, + pub _upper: *mut libc::c_void, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_5 { + pub si_pid: __pid_t, + pub si_uid: __uid_t, + pub si_status: libc::c_int, + pub si_utime: __clock_t, + pub si_stime: __clock_t, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_6 { + pub si_pid: __pid_t, + pub si_uid: __uid_t, + pub si_sigval: __sigval_t, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_7 { + pub si_tid: libc::c_int, + pub si_overrun: libc::c_int, + pub si_sigval: __sigval_t, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_8 { + pub si_pid: __pid_t, + pub si_uid: __uid_t, +} +pub type __sighandler_t = Option ()>; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigaction { + pub __sigaction_handler: C2RustUnnamed_9, + pub sa_mask: __sigset_t, + pub sa_flags: libc::c_int, + pub sa_restorer: Option ()>, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub union C2RustUnnamed_9 { + pub sa_handler: __sighandler_t, + pub sa_sigaction: + Option ()>, +} +pub type sudo_ev_callback_t = + Option ()>; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_ev_siginfo_container { + pub closure: *mut libc::c_void, + pub siginfo: *mut siginfo_t, + pub si_buf: [libc::c_char; 1], +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event { + pub entries: C2RustUnnamed_12, + pub active_entries: C2RustUnnamed_11, + pub timeouts_entries: C2RustUnnamed_10, + pub base: *mut sudo_event_base, + pub fd: libc::c_int, + pub events: libc::c_short, + pub revents: libc::c_short, + pub flags: libc::c_short, + pub pfd_idx: libc::c_short, + pub callback: sudo_ev_callback_t, + pub timeout: timespec, + pub closure: *mut libc::c_void, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event_base { + pub events: sudo_event_list, + pub active: sudo_event_list, + pub timeouts: sudo_event_list, + pub signal_event: sudo_event, + pub signals: [sudo_event_list; 65], + pub orig_handlers: [*mut sigaction; 65], + pub siginfo: [*mut siginfo_t; 65], + pub signal_pending: [sig_atomic_t; 65], + pub signal_caught: sig_atomic_t, + pub num_handlers: libc::c_int, + pub signal_pipe: [libc::c_int; 2], + pub pfds: *mut pollfd, + pub pfd_max: libc::c_int, + pub pfd_high: libc::c_int, + pub pfd_free: libc::c_int, + pub flags: libc::c_uint, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event_list { + pub tqh_first: *mut sudo_event, + pub tqh_last: *mut *mut sudo_event, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_10 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_11 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_12 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} +static mut default_base: *mut sudo_event_base = 0 as *const sudo_event_base as *mut sudo_event_base; +static mut signal_base: *mut sudo_event_base = 0 as *const sudo_event_base as *mut sudo_event_base; + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_activate(mut base: *mut sudo_event_base, mut ev: *mut sudo_event) { + (*ev).active_entries.tqe_next = 0 as *mut sudo_event; + (*ev).active_entries.tqe_prev = (*base).active.tqh_last; + *(*base).active.tqh_last = ev; + (*base).active.tqh_last = &mut (*ev).active_entries.tqe_next; + (*ev).flags = ((*ev).flags as libc::c_int | 0x2 as libc::c_int) as libc::c_short; +} + +#[inline] +unsafe extern "C" fn sudo_ev_deactivate(mut base: *mut sudo_event_base, mut ev: *mut sudo_event) { + (*ev).flags = ((*ev).flags as libc::c_int & !(0x2 as libc::c_int)) as libc::c_short; + if !((*ev).active_entries.tqe_next).is_null() { + (*(*ev).active_entries.tqe_next).active_entries.tqe_prev = (*ev).active_entries.tqe_prev; + } else { + (*base).active.tqh_last = (*ev).active_entries.tqe_prev; + } + *(*ev).active_entries.tqe_prev = (*ev).active_entries.tqe_next; +} + +unsafe extern "C" fn sudo_ev_deactivate_all(mut base: *mut sudo_event_base) { + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 23], &[libc::c_char; 23]>(b"sudo_ev_deactivate_all\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 89 as libc::c_int, + sudo_debug_subsys, + ); + + loop { + ev = (*base).active.tqh_first; + if ev.is_null() { + break; + } + sudo_ev_deactivate(base, ev); + } + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 23], &[libc::c_char; 23]>(b"sudo_ev_deactivate_all\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 94 as libc::c_int, + sudo_debug_subsys, + ); +} + +unsafe extern "C" fn sudo_ev_activate_sigevents(mut base: *mut sudo_event_base) { + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let mut set: sigset_t = sigset_t { __val: [0; 16] }; + let mut oset: sigset_t = sigset_t { __val: [0; 16] }; + let mut i: libc::c_int = 0; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 27], &[libc::c_char; 27]>( + b"sudo_ev_activate_sigevents\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 107 as libc::c_int, + sudo_debug_subsys, + ); + + sigfillset(&mut set); + sigprocmask(0 as libc::c_int, &mut set, &mut oset); + (*base).signal_caught = 0 as libc::c_int; + i = 0 as libc::c_int; + while i < 64 as libc::c_int + 1 as libc::c_int { + if !((*base).signal_pending[i as usize] == 0) { + (*base).signal_pending[i as usize] = 0 as libc::c_int; + ev = (*base).signals[i as usize].tqh_first; + while !ev.is_null() { + if (*ev).events as libc::c_int & 0x20 as libc::c_int != 0 { + let mut sc: *mut sudo_ev_siginfo_container = + (*ev).closure as *mut sudo_ev_siginfo_container; + if (*(*base).siginfo[i as usize]).si_signo == 0 as libc::c_int { + (*sc).siginfo = 0 as *mut siginfo_t; + } else { + (*sc).siginfo = ((*sc).si_buf).as_mut_ptr() as *mut siginfo_t; + memcpy( + (*sc).siginfo as *mut libc::c_void, + (*base).siginfo[i as usize] as *const libc::c_void, + ::core::mem::size_of::() as libc::c_ulong, + ); + } + } + (*ev).revents = ((*ev).events as libc::c_int + & (0x10 as libc::c_int | 0x20 as libc::c_int)) + as libc::c_short; + (*ev).active_entries.tqe_next = 0 as *mut sudo_event; + (*ev).active_entries.tqe_prev = (*base).active.tqh_last; + *(*base).active.tqh_last = ev; + (*base).active.tqh_last = &mut (*ev).active_entries.tqe_next; + (*ev).flags = ((*ev).flags as libc::c_int | 0x2 as libc::c_int) as libc::c_short; + ev = (*ev).entries.tqe_next; + } + } + i += 1; + } + sigprocmask(2 as libc::c_int, &mut oset, 0 as *mut sigset_t); + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 27], &[libc::c_char; 27]>( + b"sudo_ev_activate_sigevents\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 139 as libc::c_int, + sudo_debug_subsys, + ); +} + +unsafe extern "C" fn signal_pipe_cb( + mut fd: libc::c_int, + mut _what: libc::c_int, + mut v: *mut libc::c_void, +) { + let mut base: *mut sudo_event_base = v as *mut sudo_event_base; + let mut ch: libc::c_uchar = 0; + let mut nread: ssize_t = 0; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 151 as libc::c_int, + sudo_debug_subsys, + ); + + loop { + nread = read( + fd, + &mut ch as *mut libc::c_uchar as *mut libc::c_void, + 1 as libc::c_int as size_t, + ); + if !(nread > 0 as libc::c_int as libc::c_long) { + break; + } + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 160 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: received signal %d\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")) + .as_ptr(), + ch as libc::c_int, + ); + } + + if nread == -(1 as libc::c_int) as libc::c_long && *__errno_location() != 11 as libc::c_int { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 164 as libc::c_int, + 2 as libc::c_int + | (1 as libc::c_int) << 5 as libc::c_int + | (1 as libc::c_int) << 4 as libc::c_int + | sudo_debug_subsys, + b"%s: error reading from signal pipe fd %d\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")) + .as_ptr(), + fd, + ); + } + sudo_ev_activate_sigevents(base); + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"signal_pipe_cb\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 170 as libc::c_int, + sudo_debug_subsys, + ); +} + +unsafe extern "C" fn sudo_ev_base_init(mut base: *mut sudo_event_base) -> libc::c_int { + let mut i: libc::c_int = 0; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 177 as libc::c_int, + sudo_debug_subsys, + ); + (*base).events.tqh_first = 0 as *mut sudo_event; + (*base).events.tqh_last = &mut (*base).events.tqh_first; + (*base).timeouts.tqh_first = 0 as *mut sudo_event; + (*base).timeouts.tqh_last = &mut (*base).timeouts.tqh_first; + i = 0 as libc::c_int; + while i < 64 as libc::c_int + 1 as libc::c_int { + (*base).signals[i as usize].tqh_first = 0 as *mut sudo_event; + (*base).signals[i as usize].tqh_last = + &mut (*((*base).signals).as_mut_ptr().offset(i as isize)).tqh_first; + i += 1; + } + if sudo_ev_base_alloc_impl(base) != 0 as libc::c_int { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 185 as libc::c_int, + 2 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate impl base\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + ); + } else if pipe2( + ((*base).signal_pipe).as_mut_ptr(), + 0o4000 as libc::c_int | 0o2000000 as libc::c_int, + ) != 0 as libc::c_int + { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 190 as libc::c_int, + 2 as libc::c_int | sudo_debug_subsys, + b"%s: unable to create signal pipe\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + ); + } else { + sudo_ev_init( + &mut (*base).signal_event, + (*base).signal_pipe[0 as libc::c_int as usize], + (0x2 as libc::c_int | 0x8 as libc::c_int) as libc::c_short, + Some( + signal_pipe_cb + as unsafe extern "C" fn(libc::c_int, libc::c_int, *mut libc::c_void) -> (), + ), + base as *mut libc::c_void, + ); + let mut sudo_debug_ret: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 196 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + sudo_ev_base_free_impl(base); + let mut sudo_debug_ret_0: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 18], &[libc::c_char; 18]>(b"sudo_ev_base_init\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 200 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_base_alloc_v1() -> *mut sudo_event_base { + let mut base: *mut sudo_event_base = 0 as *mut sudo_event_base; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 207 as libc::c_int, + sudo_debug_subsys, + ); + base = calloc( + 1 as libc::c_int as libc::c_ulong, + ::core::mem::size_of::() as libc::c_ulong, + ) as *mut sudo_event_base; + if base.is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 212 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate base\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + ); + let mut sudo_debug_ret: *mut libc::c_void = 0 as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 213 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret as *mut sudo_event_base; + } + + if sudo_ev_base_init(base) != 0 as libc::c_int { + free(base as *mut libc::c_void); + let mut sudo_debug_ret_0: *mut libc::c_void = 0 as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 217 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0 as *mut sudo_event_base; + } + let mut sudo_debug_ret_1: *mut libc::c_void = base as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 22], &[libc::c_char; 22]>(b"sudo_ev_base_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 219 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_1, + ); + return sudo_debug_ret_1 as *mut sudo_event_base; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_base_free_v1(mut base: *mut sudo_event_base) { + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let mut next: *mut sudo_event = 0 as *mut sudo_event; + let mut i: libc::c_int = 0; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_base_free_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 227 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_base_free_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 230 as libc::c_int, + sudo_debug_subsys, + ); + return; + } + if default_base == base { + default_base = 0 as *mut sudo_event_base; + } + ev = (*base).events.tqh_first; + while !ev.is_null() && { + next = (*ev).entries.tqe_next; + 1 as libc::c_int != 0 + } { + sudo_ev_del_v1(base, ev); + ev = next; + } + i = 0 as libc::c_int; + while i < 64 as libc::c_int + 1 as libc::c_int { + ev = (*base).signals[i as usize].tqh_first; + while !ev.is_null() && { + next = (*ev).entries.tqe_next; + 1 as libc::c_int != 0 + } { + sudo_ev_del_v1(base, ev); + ev = next; + } + free((*base).siginfo[i as usize] as *mut libc::c_void); + free((*base).orig_handlers[i as usize] as *mut libc::c_void); + i += 1; + } + sudo_ev_base_free_impl(base); + close((*base).signal_pipe[0 as libc::c_int as usize]); + close((*base).signal_pipe[1 as libc::c_int as usize]); + free(base as *mut libc::c_void); + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_base_free_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 252 as libc::c_int, + sudo_debug_subsys, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_base_setdef_v1(mut base: *mut sudo_event_base) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 23], &[libc::c_char; 23]>(b"sudo_ev_base_setdef_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 258 as libc::c_int, + sudo_debug_subsys, + ); + default_base = base; + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 23], &[libc::c_char; 23]>(b"sudo_ev_base_setdef_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 262 as libc::c_int, + sudo_debug_subsys, + ); +} + +unsafe extern "C" fn sudo_ev_init( + mut ev: *mut sudo_event, + mut fd: libc::c_int, + mut events: libc::c_short, + mut callback: sudo_ev_callback_t, + mut closure: *mut libc::c_void, +) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"sudo_ev_init\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 272 as libc::c_int, + sudo_debug_subsys, + ); + memset( + ev as *mut libc::c_void, + 0 as libc::c_int, + ::core::mem::size_of::() as libc::c_ulong, + ); + (*ev).fd = fd; + (*ev).events = events; + (*ev).pfd_idx = -(1 as libc::c_int) as libc::c_short; + (*ev).callback = callback; + (*ev).closure = closure; + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 13], &[libc::c_char; 13]>(b"sudo_ev_init\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 282 as libc::c_int, + sudo_debug_subsys, + ); +} +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_alloc_v1( + mut fd: libc::c_int, + mut events: libc::c_short, + mut callback: sudo_ev_callback_t, + mut closure: *mut libc::c_void, +) -> *mut sudo_event { + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 289 as libc::c_int, + sudo_debug_subsys, + ); + ev = malloc(::core::mem::size_of::() as libc::c_ulong) as *mut sudo_event; + if ev.is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 294 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate event\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + ); + let mut sudo_debug_ret: *mut libc::c_void = 0 as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 295 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret as *mut sudo_event; + } + if events as libc::c_int & 0x20 as libc::c_int != 0 { + let mut container: *mut sudo_ev_siginfo_container = malloc( + (::core::mem::size_of::() as libc::c_ulong) + .wrapping_add(::core::mem::size_of::() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong), + ) + as *mut sudo_ev_siginfo_container; + if container.is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 303 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate siginfo container\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + ); + free(ev as *mut libc::c_void); + let mut sudo_debug_ret_0: *mut libc::c_void = 0 as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 305 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0 as *mut sudo_event; + } + (*container).closure = closure; + closure = container as *mut libc::c_void; + } + sudo_ev_init(ev, fd, events, callback, closure); + let mut sudo_debug_ret_1: *mut libc::c_void = ev as *mut libc::c_void; + sudo_debug_exit_ptr_v1( + (*::core::mem::transmute::<&[u8; 17], &[libc::c_char; 17]>(b"sudo_ev_alloc_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 312 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_1, + ); + return sudo_debug_ret_1 as *mut sudo_event; +} +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_free_v1(mut ev: *mut sudo_event) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"sudo_ev_free_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 318 as libc::c_int, + sudo_debug_subsys, + ); + if ev.is_null() { + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"sudo_ev_free_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 321 as libc::c_int, + sudo_debug_subsys, + ); + return; + } + if (*ev).flags as libc::c_int & 0x1 as libc::c_int != 0 { + sudo_ev_del_v1(0 as *mut sudo_event_base, ev); + } + if (*ev).events as libc::c_int & 0x20 as libc::c_int != 0 { + free((*ev).closure); + } + free(ev as *mut libc::c_void); + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"sudo_ev_free_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 330 as libc::c_int, + sudo_debug_subsys, + ); +} +unsafe extern "C" fn sudo_ev_handler( + mut signo: libc::c_int, + mut info: *mut siginfo_t, + mut _context: *mut libc::c_void, +) { + let mut ch: libc::c_uchar = signo as libc::c_uchar; + if !signal_base.is_null() { + if info.is_null() { + memset( + (*signal_base).siginfo[signo as usize] as *mut libc::c_void, + 0 as libc::c_int, + ::core::mem::size_of::() as libc::c_ulong, + ); + } else { + memcpy( + (*signal_base).siginfo[signo as usize] as *mut libc::c_void, + info as *const libc::c_void, + ::core::mem::size_of::() as libc::c_ulong, + ); + } + (*signal_base).signal_pending[signo as usize] = 1 as libc::c_int; + (*signal_base).signal_caught = 1 as libc::c_int; + let mut _y: ssize_t = write( + (*signal_base).signal_pipe[1 as libc::c_int as usize], + &mut ch as *mut libc::c_uchar as *const libc::c_void, + 1 as libc::c_int as size_t, + ); + } +} +unsafe extern "C" fn sudo_ev_add_signal( + mut base: *mut sudo_event_base, + mut ev: *mut sudo_event, + mut tohead: bool, +) -> libc::c_int { + let signo: libc::c_int = (*ev).fd; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 361 as libc::c_int, + sudo_debug_subsys, + ); + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 365 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: adding event %p to base %p, signal %d, events %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + ev, + base, + signo, + (*ev).events as libc::c_int, + ); + if signo >= 64 as libc::c_int + 1 as libc::c_int { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 368 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: signo %d larger than max %d\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + signo, + 64 as libc::c_int + 1 as libc::c_int - 1 as libc::c_int, + ); + let mut sudo_debug_ret: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 369 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + if (*ev).events as libc::c_int + & !(0x10 as libc::c_int | 0x20 as libc::c_int | 0x8 as libc::c_int) + != 0 as libc::c_int + { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 373 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: invalid event set 0x%x\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + (*ev).events as libc::c_int, + ); + let mut sudo_debug_ret_0: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 374 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; + } + if ((*base).siginfo[signo as usize]).is_null() { + (*base).siginfo[signo as usize] = + malloc(::core::mem::size_of::() as libc::c_ulong) as *mut siginfo_t; + if ((*base).siginfo[signo as usize]).is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 385 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate siginfo for signo %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + signo, + ); + let mut sudo_debug_ret_1: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 386 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_1, + ); + return sudo_debug_ret_1; + } + } + if ((*base).orig_handlers[signo as usize]).is_null() { + (*base).orig_handlers[signo as usize] = + malloc(::core::mem::size_of::() as libc::c_ulong) as *mut sigaction; + if ((*base).orig_handlers[signo as usize]).is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 395 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to allocate orig_handlers for signo %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + signo, + ); + let mut sudo_debug_ret_2: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 396 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_2, + ); + return sudo_debug_ret_2; + } + } + if ((*base).signals[signo as usize].tqh_first).is_null() { + let mut sa: sigaction = sigaction { + __sigaction_handler: C2RustUnnamed_9 { sa_handler: None }, + sa_mask: sigset_t { __val: [0; 16] }, + sa_flags: 0, + sa_restorer: None, + }; + memset( + &mut sa as *mut sigaction as *mut libc::c_void, + 0 as libc::c_int, + ::core::mem::size_of::() as libc::c_ulong, + ); + sigfillset(&mut sa.sa_mask); + sa.sa_flags = 0x10000000 as libc::c_int | 4 as libc::c_int; + sa.__sigaction_handler.sa_sigaction = Some( + sudo_ev_handler + as unsafe extern "C" fn(libc::c_int, *mut siginfo_t, *mut libc::c_void) -> (), + ); + if sigaction(signo, &mut sa, (*base).orig_handlers[signo as usize]) != 0 as libc::c_int { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 409 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to install handler for signo %d\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + signo, + ); + let mut sudo_debug_ret_3: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>( + b"sudo_ev_add_signal\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 410 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_3, + ); + return sudo_debug_ret_3; + } + (*base).num_handlers += 1; + } + (*ev).base = base; + if tohead { + (*ev).entries.tqe_next = (*base).signals[signo as usize].tqh_first; + if !((*ev).entries.tqe_next).is_null() { + (*(*base).signals[signo as usize].tqh_first) + .entries + .tqe_prev = &mut (*ev).entries.tqe_next; + } else { + (*base).signals[signo as usize].tqh_last = &mut (*ev).entries.tqe_next; + } + (*base).signals[signo as usize].tqh_first = ev; + (*ev).entries.tqe_prev = + &mut (*((*base).signals).as_mut_ptr().offset(signo as isize)).tqh_first; + } else { + (*ev).entries.tqe_next = 0 as *mut sudo_event; + (*ev).entries.tqe_prev = (*base).signals[signo as usize].tqh_last; + *(*base).signals[signo as usize].tqh_last = ev; + (*base).signals[signo as usize].tqh_last = &mut (*ev).entries.tqe_next; + } + (*ev).events = ((*ev).events as libc::c_int | 0x8 as libc::c_int) as libc::c_short; + (*ev).flags = ((*ev).flags as libc::c_int | 0x1 as libc::c_int) as libc::c_short; + if (*base).signal_event.flags as libc::c_int & 0x1 as libc::c_int == 0 { + sudo_ev_add_v2( + base, + &mut (*base).signal_event, + 0 as *mut timespec, + 1 as libc::c_int != 0, + ); + } + signal_base = base; + let mut sudo_debug_ret_4: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 19], &[libc::c_char; 19]>(b"sudo_ev_add_signal\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 435 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_4, + ); + return sudo_debug_ret_4; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_add_v1( + mut base: *mut sudo_event_base, + mut ev: *mut sudo_event, + mut timo: *mut timeval, + mut tohead: bool, +) -> libc::c_int { + let mut tsbuf: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let mut ts: *mut timespec = 0 as *mut timespec; + if !timo.is_null() { + tsbuf.tv_sec = (*timo).tv_sec; + tsbuf.tv_nsec = (*timo).tv_usec * 1000 as libc::c_int as libc::c_long; + ts = &mut tsbuf; + } + return sudo_ev_add_v2(base, ev, ts, tohead); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_add_v2( + mut base: *mut sudo_event_base, + mut ev: *mut sudo_event, + mut timo: *mut timespec, + mut tohead: bool, +) -> libc::c_int { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 456 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + if !((*ev).base).is_null() { + base = (*ev).base; + } else if !default_base.is_null() { + base = default_base; + } else { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 466 as libc::c_int, + 2 as libc::c_int | sudo_debug_subsys, + b"%s: no base specified\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + ); + let mut sudo_debug_ret: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 467 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + } + if (*ev).flags as libc::c_int & 0x1 as libc::c_int != 0 { + if timo.is_null() && (*ev).flags as libc::c_int & 0x4 as libc::c_int != 0 { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 476 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: removing event %p from timeouts queue\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + ev, + ); + (*ev).flags = ((*ev).flags as libc::c_int & !(0x4 as libc::c_int)) as libc::c_short; + if !((*ev).timeouts_entries.tqe_next).is_null() { + (*(*ev).timeouts_entries.tqe_next).timeouts_entries.tqe_prev = + (*ev).timeouts_entries.tqe_prev; + } else { + (*base).timeouts.tqh_last = (*ev).timeouts_entries.tqe_prev; + } + *(*ev).timeouts_entries.tqe_prev = (*ev).timeouts_entries.tqe_next; + } + } else { + if (*ev).events as libc::c_int & (0x10 as libc::c_int | 0x20 as libc::c_int) != 0 { + let mut sudo_debug_ret_0: libc::c_int = sudo_ev_add_signal(base, ev, tohead); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 483 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; + } + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 488 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: adding event %p to base %p, fd %d, events %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")) + .as_ptr(), + ev, + base, + (*ev).fd, + (*ev).events as libc::c_int, + ); + if (*ev).events as libc::c_int & (0x2 as libc::c_int | 0x4 as libc::c_int) != 0 { + if sudo_ev_add_impl(base, ev) != 0 as libc::c_int { + let mut sudo_debug_ret_1: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>( + b"sudo_ev_add_v2\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 491 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_1, + ); + return sudo_debug_ret_1; + } + } + (*ev).base = base; + if tohead { + (*ev).entries.tqe_next = (*base).events.tqh_first; + if !((*ev).entries.tqe_next).is_null() { + (*(*base).events.tqh_first).entries.tqe_prev = &mut (*ev).entries.tqe_next; + } else { + (*base).events.tqh_last = &mut (*ev).entries.tqe_next; + } + (*base).events.tqh_first = ev; + (*ev).entries.tqe_prev = &mut (*base).events.tqh_first; + } else { + (*ev).entries.tqe_next = 0 as *mut sudo_event; + (*ev).entries.tqe_prev = (*base).events.tqh_last; + *(*base).events.tqh_last = ev; + (*base).events.tqh_last = &mut (*ev).entries.tqe_next; + } + (*ev).flags = ((*ev).flags as libc::c_int | 0x1 as libc::c_int) as libc::c_short; + } + if !timo.is_null() { + let mut evtmp: *mut sudo_event = 0 as *mut sudo_event; + if (*ev).flags as libc::c_int & 0x4 as libc::c_int != 0 { + if !((*ev).timeouts_entries.tqe_next).is_null() { + (*(*ev).timeouts_entries.tqe_next).timeouts_entries.tqe_prev = + (*ev).timeouts_entries.tqe_prev; + } else { + (*base).timeouts.tqh_last = (*ev).timeouts_entries.tqe_prev; + } + *(*ev).timeouts_entries.tqe_prev = (*ev).timeouts_entries.tqe_next; + } + sudo_gettime_mono_v1(&mut (*ev).timeout); + (*ev).timeout.tv_sec = (*ev).timeout.tv_sec + (*timo).tv_sec; + (*ev).timeout.tv_nsec = (*ev).timeout.tv_nsec + (*timo).tv_nsec; + while (*ev).timeout.tv_nsec >= 1000000000 as libc::c_int as libc::c_long { + (*ev).timeout.tv_sec += 1; + (*ev).timeout.tv_nsec -= 1000000000 as libc::c_int as libc::c_long; + } + evtmp = (*base).timeouts.tqh_first; + while !evtmp.is_null() { + if if (*ev).timeout.tv_sec == (*evtmp).timeout.tv_sec { + ((*ev).timeout.tv_nsec < (*evtmp).timeout.tv_nsec) as libc::c_int + } else { + ((*ev).timeout.tv_sec < (*evtmp).timeout.tv_sec) as libc::c_int + } != 0 + { + break; + } + evtmp = (*evtmp).timeouts_entries.tqe_next; + } + if !evtmp.is_null() { + (*ev).timeouts_entries.tqe_prev = (*evtmp).timeouts_entries.tqe_prev; + (*ev).timeouts_entries.tqe_next = evtmp; + *(*evtmp).timeouts_entries.tqe_prev = ev; + (*evtmp).timeouts_entries.tqe_prev = &mut (*ev).timeouts_entries.tqe_next; + } else { + (*ev).timeouts_entries.tqe_next = 0 as *mut sudo_event; + (*ev).timeouts_entries.tqe_prev = (*base).timeouts.tqh_last; + *(*base).timeouts.tqh_last = ev; + (*base).timeouts.tqh_last = &mut (*ev).timeouts_entries.tqe_next; + } + (*ev).flags = ((*ev).flags as libc::c_int | 0x4 as libc::c_int) as libc::c_short; + } + let mut sudo_debug_ret_2: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_add_v2\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 522 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_2, + ); + return sudo_debug_ret_2; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_del_v1( + mut base: *mut sudo_event_base, + mut ev: *mut sudo_event, +) -> libc::c_int { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 532 as libc::c_int, + sudo_debug_subsys, + ); + if (*ev).flags as libc::c_int & 0x1 as libc::c_int == 0 { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 537 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: event %p not in queue\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + ev, + ); + let mut sudo_debug_ret: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 538 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + if base.is_null() { + if ((*ev).base).is_null() { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 545 as libc::c_int, + 2 as libc::c_int | sudo_debug_subsys, + b"%s: no base specified\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + ); + let mut sudo_debug_ret_0: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 546 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; + } + base = (*ev).base; + } else if base != (*ev).base { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 551 as libc::c_int, + 2 as libc::c_int | sudo_debug_subsys, + b"%s: mismatch base %p, ev->base %p\0" as *const u8 as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + base, + (*ev).base, + ); + let mut sudo_debug_ret_1: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 552 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_1, + ); + return sudo_debug_ret_1; + } + if (*ev).events as libc::c_int & (0x10 as libc::c_int | 0x20 as libc::c_int) != 0 { + let signo: libc::c_int = (*ev).fd; + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 560 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: removing event %p from base %p, signo %d, events %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + ev, + base, + signo, + (*ev).events as libc::c_int, + ); + if !((*ev).entries.tqe_next).is_null() { + (*(*ev).entries.tqe_next).entries.tqe_prev = (*ev).entries.tqe_prev; + } else { + (*base).signals[signo as usize].tqh_last = (*ev).entries.tqe_prev; + } + *(*ev).entries.tqe_prev = (*ev).entries.tqe_next; + if ((*base).signals[signo as usize].tqh_first).is_null() { + if sigaction( + signo, + (*base).orig_handlers[signo as usize], + 0 as *mut sigaction, + ) != 0 as libc::c_int + { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>( + b"sudo_ev_del_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 568 as libc::c_int, + 2 as libc::c_int | (1 as libc::c_int) << 5 as libc::c_int | sudo_debug_subsys, + b"%s: unable to restore handler for signo %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>( + b"sudo_ev_del_v1\0", + )) + .as_ptr(), + signo, + ); + let mut sudo_debug_ret_2: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>( + b"sudo_ev_del_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 569 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_2, + ); + return sudo_debug_ret_2; + } + (*base).num_handlers -= 1; + } + if (*base).num_handlers == 0 as libc::c_int { + sudo_ev_del_v1(base, &mut (*base).signal_event); + } + } else { + sudo_debug_printf2_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 580 as libc::c_int, + 6 as libc::c_int | sudo_debug_subsys, + b"%s: removing event %p from base %p, fd %d, events %d\0" as *const u8 + as *const libc::c_char, + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")) + .as_ptr(), + ev, + base, + (*ev).fd, + (*ev).events as libc::c_int, + ); + if (*ev).events as libc::c_int & (0x2 as libc::c_int | 0x4 as libc::c_int) != 0 { + if sudo_ev_del_impl(base, ev) != 0 as libc::c_int { + let mut sudo_debug_ret_3: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>( + b"sudo_ev_del_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 585 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_3, + ); + return sudo_debug_ret_3; + } + } + if !((*ev).entries.tqe_next).is_null() { + (*(*ev).entries.tqe_next).entries.tqe_prev = (*ev).entries.tqe_prev; + } else { + (*base).events.tqh_last = (*ev).entries.tqe_prev; + } + *(*ev).entries.tqe_prev = (*ev).entries.tqe_next; + if (*ev).flags as libc::c_int & 0x4 as libc::c_int != 0 { + if !((*ev).timeouts_entries.tqe_next).is_null() { + (*(*ev).timeouts_entries.tqe_next).timeouts_entries.tqe_prev = + (*ev).timeouts_entries.tqe_prev; + } else { + (*base).timeouts.tqh_last = (*ev).timeouts_entries.tqe_prev; + } + *(*ev).timeouts_entries.tqe_prev = (*ev).timeouts_entries.tqe_next; + } + } + if (*ev).flags as libc::c_int & 0x2 as libc::c_int != 0 { + if !((*ev).active_entries.tqe_next).is_null() { + (*(*ev).active_entries.tqe_next).active_entries.tqe_prev = + (*ev).active_entries.tqe_prev; + } else { + (*base).active.tqh_last = (*ev).active_entries.tqe_prev; + } + *(*ev).active_entries.tqe_prev = (*ev).active_entries.tqe_next; + } + (*ev).flags = 0 as libc::c_int as libc::c_short; + (*ev).pfd_idx = -(1 as libc::c_int) as libc::c_short; + let mut sudo_debug_ret_4: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 15], &[libc::c_char; 15]>(b"sudo_ev_del_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 604 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_4, + ); + return sudo_debug_ret_4; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_dispatch_v1(mut base: *mut sudo_event_base) -> libc::c_int { + return sudo_ev_loop_v1(base, 0 as libc::c_int); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_loop_v1( + mut base: *mut sudo_event_base, + mut flags: libc::c_int, +) -> libc::c_int { + let mut now: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let mut nready: libc::c_int = 0; + let mut rc: libc::c_int = 0 as libc::c_int; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"sudo_ev_loop_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 623 as libc::c_int, + sudo_debug_subsys, + ); + (*base).flags |= (flags & 0x1 as libc::c_int) as libc::c_uint; + (*base).flags &= (0x2 as libc::c_int | 0x1 as libc::c_int) as libc::c_uint; + '_rescan: loop { + if ((*base).events.tqh_first).is_null() { + rc = 1 as libc::c_int; + break; + } else { + (*base).active.tqh_first = 0 as *mut sudo_event; + (*base).active.tqh_last = &mut (*base).active.tqh_first; + nready = sudo_ev_scan_impl(base, flags); + match nready { + -1 => { + if *__errno_location() == 12 as libc::c_int { + continue; + } + if *__errno_location() == 4 as libc::c_int { + if !((*base).signal_caught != 0) { + continue; + } + signal_pipe_cb( + (*base).signal_pipe[0 as libc::c_int as usize], + 0x2 as libc::c_int, + base as *mut libc::c_void, + ); + } else { + rc = -(1 as libc::c_int); + break; + } + } + 0 => { + sudo_gettime_mono_v1(&mut now); + loop { + ev = (*base).timeouts.tqh_first; + if ev.is_null() { + break; + } + if if (*ev).timeout.tv_sec == now.tv_sec { + ((*ev).timeout.tv_nsec > now.tv_nsec) as libc::c_int + } else { + ((*ev).timeout.tv_sec > now.tv_sec) as libc::c_int + } != 0 + { + break; + } + (*ev).flags = + ((*ev).flags as libc::c_int & !(0x4 as libc::c_int)) as libc::c_short; + if !((*ev).timeouts_entries.tqe_next).is_null() { + (*(*ev).timeouts_entries.tqe_next).timeouts_entries.tqe_prev = + (*ev).timeouts_entries.tqe_prev; + } else { + (*base).timeouts.tqh_last = (*ev).timeouts_entries.tqe_prev; + } + *(*ev).timeouts_entries.tqe_prev = (*ev).timeouts_entries.tqe_next; + (*ev).revents = 0x1 as libc::c_int as libc::c_short; + (*ev).active_entries.tqe_next = 0 as *mut sudo_event; + (*ev).active_entries.tqe_prev = (*base).active.tqh_last; + *(*base).active.tqh_last = ev; + (*base).active.tqh_last = &mut (*ev).active_entries.tqe_next; + (*ev).flags = + ((*ev).flags as libc::c_int | 0x2 as libc::c_int) as libc::c_short; + } + if flags & 0x2 as libc::c_int != 0 { + if ((*base).active.tqh_first).is_null() { + break; + } + } + } + _ => {} + } + loop { + ev = (*base).active.tqh_first; + if ev.is_null() { + break; + } + sudo_ev_deactivate(base, ev); + if (*ev).events as libc::c_int & 0x8 as libc::c_int == 0 { + sudo_ev_del_v1(base, ev); + } + ((*ev).callback).expect("non-null function pointer")( + (*ev).fd, + (*ev).revents as libc::c_int, + if (*ev).closure == -(1 as libc::c_int) as *mut libc::c_void { + ev as *mut libc::c_void + } else { + (*ev).closure + }, + ); + if (*base).flags & 0x4 as libc::c_int as libc::c_uint != 0 { + (*base).flags |= 0x20 as libc::c_int as libc::c_uint; + sudo_ev_deactivate_all(base); + break '_rescan; + } else { + if !((*base).flags & 0x8 as libc::c_int as libc::c_uint != 0) { + continue; + } + (*base).flags &= !(0x8 as libc::c_int) as libc::c_uint; + sudo_ev_deactivate_all(base); + continue '_rescan; + } + } + if !((*base).flags & 0x1 as libc::c_int as libc::c_uint != 0) { + continue; + } + if (*base).flags & 0x2 as libc::c_int as libc::c_uint != 0 { + (*base).flags |= 0x10 as libc::c_int as libc::c_uint; + } + sudo_ev_deactivate_all(base); + break; + } + } + (*base).flags &= 0xf0 as libc::c_int as libc::c_uint; + let mut sudo_debug_ret: libc::c_int = rc; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 16], &[libc::c_char; 16]>(b"sudo_ev_loop_v1\0")).as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 721 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_loopexit_v1(mut base: *mut sudo_event_base) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>(b"sudo_ev_loopexit_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 727 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + base = default_base; + if base.is_null() { + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>( + b"sudo_ev_loopexit_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 731 as libc::c_int, + sudo_debug_subsys, + ); + return; + } + } + if (*base).flags & 0x4 as libc::c_int as libc::c_uint == 0 { + (*base).flags &= !(0x8 as libc::c_int) as libc::c_uint; + (*base).flags |= (0x2 as libc::c_int | 0x1 as libc::c_int) as libc::c_uint; + } + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>(b"sudo_ev_loopexit_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 740 as libc::c_int, + sudo_debug_subsys, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_loopbreak_v1(mut base: *mut sudo_event_base) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_loopbreak_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 746 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + base = default_base; + if base.is_null() { + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>( + b"sudo_ev_loopbreak_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 750 as libc::c_int, + sudo_debug_subsys, + ); + return; + } + } + (*base).flags &= + !(0x8 as libc::c_int | 0x2 as libc::c_int | 0x1 as libc::c_int) as libc::c_uint; + (*base).flags |= 0x4 as libc::c_int as libc::c_uint; + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_loopbreak_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 756 as libc::c_int, + sudo_debug_subsys, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_loopcontinue_v1(mut base: *mut sudo_event_base) { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>(b"sudo_ev_loopcontinue_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 762 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + base = default_base; + if base.is_null() { + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>( + b"sudo_ev_loopcontinue_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 766 as libc::c_int, + sudo_debug_subsys, + ); + return; + } + } + if (*base).flags & (0x1 as libc::c_int | 0x4 as libc::c_int) as libc::c_uint == 0 { + (*base).flags |= 0x8 as libc::c_int as libc::c_uint; + } + sudo_debug_exit_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>(b"sudo_ev_loopcontinue_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 773 as libc::c_int, + sudo_debug_subsys, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_got_exit_v1(mut base: *mut sudo_event_base) -> bool { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>(b"sudo_ev_got_exit_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 779 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + base = default_base; + if base.is_null() { + let mut sudo_debug_ret: bool = 0 as libc::c_int != 0; + sudo_debug_exit_bool_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>( + b"sudo_ev_got_exit_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 783 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + } + let mut sudo_debug_ret_0: bool = (*base).flags & 0x10 as libc::c_int as libc::c_uint != 0; + sudo_debug_exit_bool_v1( + (*::core::mem::transmute::<&[u8; 20], &[libc::c_char; 20]>(b"sudo_ev_got_exit_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 785 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_got_break_v1(mut base: *mut sudo_event_base) -> bool { + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_got_break_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 791 as libc::c_int, + sudo_debug_subsys, + ); + if base.is_null() { + base = default_base; + if base.is_null() { + let mut sudo_debug_ret: bool = 0 as libc::c_int != 0; + sudo_debug_exit_bool_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>( + b"sudo_ev_got_break_v1\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 795 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + } + let mut sudo_debug_ret_0: bool = (*base).flags & 0x20 as libc::c_int as libc::c_uint != 0; + sudo_debug_exit_bool_v1( + (*::core::mem::transmute::<&[u8; 21], &[libc::c_char; 21]>(b"sudo_ev_got_break_v1\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 797 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; +} +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_get_timeleft_v1( + mut ev: *mut sudo_event, + mut tv: *mut timeval, +) -> libc::c_int { + let mut ts: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let mut ret: libc::c_int = 0; + ret = sudo_ev_get_timeleft_v2(ev, &mut ts); + (*tv).tv_sec = ts.tv_sec; + (*tv).tv_usec = ts.tv_nsec / 1000 as libc::c_int as libc::c_long; + return ret; +} +#[no_mangle] +pub unsafe extern "C" fn sudo_ev_get_timeleft_v2( + mut ev: *mut sudo_event, + mut ts: *mut timespec, +) -> libc::c_int { + let mut now: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let sudo_debug_subsys: libc::c_int = (4 as libc::c_int) << 6 as libc::c_int; + sudo_debug_enter_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>(b"sudo_ev_get_timeleft_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 816 as libc::c_int, + sudo_debug_subsys, + ); + if (*ev).flags as libc::c_int & 0x4 as libc::c_int == 0 { + (*ts).tv_nsec = 0 as libc::c_int as __syscall_slong_t; + (*ts).tv_sec = (*ts).tv_nsec; + let mut sudo_debug_ret: libc::c_int = -(1 as libc::c_int); + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>( + b"sudo_ev_get_timeleft_v2\0", + )) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 820 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret, + ); + return sudo_debug_ret; + } + sudo_gettime_mono_v1(&mut now); + (*ts).tv_sec = (*ev).timeout.tv_sec - now.tv_sec; + (*ts).tv_nsec = (*ev).timeout.tv_nsec - now.tv_nsec; + while (*ts).tv_nsec < 0 as libc::c_int as libc::c_long { + (*ts).tv_sec -= 1; + (*ts).tv_nsec += 1000000000 as libc::c_int as libc::c_long; + } + if (*ts).tv_sec < 0 as libc::c_int as libc::c_long { + (*ts).tv_nsec = 0 as libc::c_int as __syscall_slong_t; + (*ts).tv_sec = (*ts).tv_nsec; + } + let mut sudo_debug_ret_0: libc::c_int = 0 as libc::c_int; + sudo_debug_exit_int_v1( + (*::core::mem::transmute::<&[u8; 24], &[libc::c_char; 24]>(b"sudo_ev_get_timeleft_v2\0")) + .as_ptr(), + b"event.c\0" as *const u8 as *const libc::c_char, + 827 as libc::c_int, + sudo_debug_subsys, + sudo_debug_ret_0, + ); + return sudo_debug_ret_0; +} diff --git a/utsudo-0.0.2/lib/util/src/event_poll.rs b/utsudo-0.0.2/lib/util/src/event_poll.rs new file mode 100644 index 0000000..8db9300 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/event_poll.rs @@ -0,0 +1,395 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ +#![allow( + non_camel_case_types, + dead_code, + unused_variables, + unused_mut, + unused_assignments, + non_snake_case, + improper_ctypes, + unused_parens +)] + +use crate::event::sudo_ev_callback_t; +use crate::sudo_debug::sudo_debug_exit_v1; +// use crate::sudo_debug::sudo_debug_printf2_v1; +use crate::term::__sighandler_t; +use crate::term::__sigset_t; +use crate::term::sig_atomic_t; +use crate::term::siginfo_t; +use libc::free; + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_DEBUG; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_EVENT; +use crate::sudo_debug_macro::SUDO_DEBUG_INFO; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; + +pub type __time_t = libc::c_long; +pub type __syscall_slong_t = libc::c_long; +pub type size_t = libc::c_ulong; +pub type nfds_t = libc::c_ulong; + +pub const __SIGRTMIN: libc::c_uint = 64; +pub const NSIG: libc::c_uint = __SIGRTMIN + 1; +pub const SUDO_EV_READ: libc::c_short = 0x02; +pub const POLLIN: libc::c_short = 0x001; +pub const POLLHUP: libc::c_short = 0x010; +pub const POLLNVAL: libc::c_short = 0x020; +pub const POLLERR: libc::c_short = 0x008; +pub const SUDO_EV_WRITE: libc::c_short = 0x04; +pub const POLLOUT: libc::c_short = 0x004; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigset_t { + pub __val: [libc::c_ulong; 16], +} + +extern "C" { + fn reallocarray(__ptr: *mut libc::c_void, __nmemb: size_t, __size: size_t) + -> *mut libc::c_void; + fn ppoll( + __fds: *mut pollfd, + __nfds: nfds_t, + __timeout: *const timespec, + __ss: *const sigset_t, + ) -> libc::c_int; + fn sudo_gettime_mono_v1(ts: *mut timespec) -> libc::c_int; + fn sudo_ev_activate(base: *mut sudo_event_base, ev: *mut sudo_event); + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct pollfd { + pub fd: libc::c_int, + pub events: libc::c_short, + pub revents: libc::c_short, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct mid_struct_1 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct mid_struct_2 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct mid_struct_3 { + pub tqe_next: *mut sudo_event, + pub tqe_prev: *mut *mut sudo_event, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event { + pub entries: mid_struct_1, + pub active_entries: mid_struct_2, + pub timeouts_entries: mid_struct_3, + pub base: *mut sudo_event_base, + pub fd: libc::c_int, + pub events: libc::c_short, + pub revents: libc::c_short, + pub flags: libc::c_short, + pub pfd_idx: libc::c_short, + pub callback: sudo_ev_callback_t, + pub timeout: timespec, + pub closure: *mut libc::c_void, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event_list { + pub tqh_first: *mut sudo_event, + pub tqh_last: *mut *mut sudo_event, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub union mid_union_1 { + pub sa_handler: __sighandler_t, + pub sa_sigaction: Option, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigaction { + pub __sigaction_handler: mid_union_1, + pub sa_mask: __sigset_t, + pub sa_flags: libc::c_int, + pub sa_restorer: Option, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_event_base { + pub events: sudo_event_list, + pub active: sudo_event_list, + pub timeouts: sudo_event_list, + pub signal_event: sudo_event, + pub signals: [sudo_event_list; NSIG as usize], + pub orig_handlers: [*mut sigaction; NSIG as usize], + pub siginfo: [*mut siginfo_t; NSIG as usize], + pub signal_pending: [sig_atomic_t; NSIG as usize], + pub signal_caught: sig_atomic_t, + pub num_handlers: libc::c_int, + pub signal_pipe: [libc::c_int; 2], + pub pfds: *mut pollfd, + pub pfd_max: libc::c_int, + pub pfd_high: libc::c_int, + pub pfd_free: libc::c_int, + pub flags: libc::c_uint, +} + +#[no_mangle] +unsafe fn sudo_ev_base_alloc_impl(mut base: *mut sudo_event_base) -> libc::c_int { + let mut i: libc::c_int = 0; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_EVENT); + + (*base).pfd_high = -1; + (*base).pfd_max = 32; + (*base).pfds = reallocarray( + 0 as *mut libc::c_void, + (*base).pfd_max as libc::c_ulong, + std::mem::size_of::() as size_t, + ) as *mut pollfd; + + if (*base).pfds.is_null() { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"%s: unable to allocate %d pollfds\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + (*base).pfd_max + ); + (*base).pfd_max = 0; + debug_return_int!(-1); + } + while i < (*base).pfd_max { + (*((*base).pfds).offset(i as isize)).fd = -1; + i += 1; + } + debug_return_int!(0) +} + +#[no_mangle] +unsafe fn sudo_ev_base_free_impl(mut base: *mut sudo_event_base) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_EVENT); + + free((*base).pfds as *mut libc::c_void); + debug_return!() +} + +#[no_mangle] +unsafe fn sudo_ev_add_impl(mut base: *mut sudo_event_base, mut ev: *mut sudo_event) -> libc::c_int { + let mut pfd: *mut pollfd = 0 as *mut pollfd; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_EVENT); + + /* If out of space in pfds array, realloc. */ + if (*base).pfd_free == (*base).pfd_max { + let mut pfds: *mut pollfd = 0 as *mut pollfd; + let mut i: libc::c_int = 0; + + pfds = reallocarray( + (*base).pfds as *mut libc::c_void, + (*base).pfd_max as size_t, + ((2 as libc::c_ulong).wrapping_mul(::std::mem::size_of::() as libc::c_ulong)) + as size_t, + ) as *mut pollfd; + + if pfds.is_null() { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"%s: unable to allocate %d pollfds\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + ((*base).pfd_max) * 2 + ); + + debug_return_int!(-1); + } + (*base).pfds = pfds; + (*base).pfd_max *= 2; + + i = (*base).pfd_free; + while i < (*base).pfd_max { + (*((*base).pfds).offset(i as isize)).fd = -1; + i += 1; + } + } + + /* Fill in pfd entry. */ + (*ev).pfd_idx = (*base).pfd_free as libc::c_short; + pfd = &mut *((*base).pfds).offset((*ev).pfd_idx as isize); + (*pfd).fd = (*ev).fd; + (*pfd).events = 0; + if (*ev).events & SUDO_EV_READ != 0 { + (*pfd).events = (*pfd).events | POLLIN; + } + if (*ev).events & SUDO_EV_WRITE != 0 { + (*pfd).events = (*pfd).events | POLLOUT; + } + + /* Update pfd_high and pfd_free. */ + if (*ev).pfd_idx as libc::c_int > (*base).pfd_high { + (*base).pfd_high = (*ev).pfd_idx as libc::c_int; + } + loop { + (*base).pfd_free += 1; + if (*base).pfd_free == (*base).pfd_max { + break; + } + if (*((*base).pfds).offset((*base).pfd_free as isize)).fd == -1 { + break; + } + } + debug_return_int!(0) +} + +#[no_mangle] +unsafe fn sudo_ev_del_impl(mut base: *mut sudo_event_base, mut ev: *mut sudo_event) -> libc::c_int { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_EVENT); + + /* Mark pfd entry unused, add to free list and adjust high slot. */ + (*((*base).pfds).offset((*ev).pfd_idx as isize)).fd = -1; + if ((*ev).pfd_idx as libc::c_int) < (*base).pfd_free { + (*base).pfd_free = (*ev).pfd_idx as libc::c_int; + } + + while ((*base).pfd_high >= 0) && (*((*base).pfds).offset((*base).pfd_high as isize)).fd == -1 { + (*base).pfd_high -= 1; + } + debug_return_int!(0) +} + +unsafe fn sudo_ev_poll( + mut fds: *mut pollfd, + mut nfds: nfds_t, + mut timo: *mut timespec, +) -> libc::c_int { + return ppoll(fds, nfds, timo, 0 as *const sigset_t); +} + +#[no_mangle] +unsafe fn sudo_ev_scan_impl(mut base: *mut sudo_event_base, mut flags: libc::c_int) -> libc::c_int { + let mut now: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let mut ts: timespec = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + let mut timeout: *mut timespec = 0 as *mut timespec; + let mut ev: *mut sudo_event = 0 as *mut sudo_event; + let mut nready: libc::c_int; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_EVENT); + + ev = (*base).timeouts.tqh_first; + if !ev.is_null() { + sudo_gettime_mono_v1(&mut now); + ts.tv_sec = (*ev).timeout.tv_sec - now.tv_sec; + ts.tv_nsec = (*ev).timeout.tv_nsec - now.tv_nsec; + while ts.tv_nsec < 0 { + ts.tv_sec -= 1; + ts.tv_nsec += 1000000000; + } + if ts.tv_sec < 0 { + ts.tv_nsec = 0; + ts.tv_sec = 0; + } + timeout = &mut ts; + } else { + if (flags & 0x02) != 0 { + ts.tv_nsec = 0; + ts.tv_sec = 0; + timeout = &mut ts; + } else { + timeout = 0 as *mut timespec; + } + } + nready = sudo_ev_poll( + (*base).pfds, + ((*base).pfd_high + 1) as libc::c_int as nfds_t, + timeout, + ); + + sudo_debug_printf!( + SUDO_DEBUG_INFO, + b"%s: %d fds ready\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + nready + ); + + match nready { + -1 => { + debug_return_int!(-1); + } + 0 => {} + _ => { + ev = (*base).events.tqh_first; + while !ev.is_null() { + if (*ev).pfd_idx != -1 + && (*((*base).pfds).offset((*ev).pfd_idx as isize)).revents != 0 + { + let mut what: libc::c_int = 0; + + if (*((*base).pfds).offset((*ev).pfd_idx as isize)).revents + & (POLLIN | POLLHUP | POLLNVAL | POLLERR) + != 0 + { + what |= ((*ev).events as libc::c_int & SUDO_EV_READ as libc::c_int); + } + if (*((*base).pfds).offset((*ev).pfd_idx as isize)).revents + & (POLLOUT | POLLHUP | POLLNVAL | POLLERR) + != 0 + { + what |= ((*ev).events as libc::c_int & SUDO_EV_WRITE as libc::c_int); + } + sudo_debug_printf!( + SUDO_DEBUG_DEBUG, + b"%s: polled fd %d, events %d, activating %p\0" as *const u8 + as *const libc::c_char, + stdext::function_name!().as_ptr(), + (*ev).fd, + what, + ev + ); + + (*ev).revents = what as libc::c_short; + sudo_ev_activate(base, ev); + } + ev = (*ev).entries.tqe_next; + } + } + }; + + debug_return_int!(nready) +} diff --git a/utsudo-0.0.2/lib/util/src/fatal.rs b/utsudo-0.0.2/lib/util/src/fatal.rs new file mode 100644 index 0000000..3e46279 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/fatal.rs @@ -0,0 +1,222 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + non_camel_case_types, + unused_variables, + unused_assignments, + unused_mut, + unused_unsafe, + non_upper_case_globals, + dead_code +)] +use crate::__LC_MESSAGES; +use libc::FILE; + +#[macro_export] +macro_rules! __LC_MESSAGES { + () => { + 5 + }; +} + +extern "C" { + fn free(__ptr: *mut libc::c_void); + fn exit(__status: libc::c_int); + fn strerror(__errnum: libc::c_int) -> *mut libc::c_char; + fn __errno_location() -> *mut libc::c_int; + fn gai_strerror(__ecode: libc::c_int) -> *const libc::c_char; + fn malloc(__size: libc::c_ulong) -> *mut libc::c_void; + fn sudo_getprogname() -> *const libc::c_char; + fn fputs(__s: *const libc::c_char, __stream: *mut FILE) -> libc::c_int; + static mut stderr: *mut FILE; + fn putc(__c: libc::c_int, __stream: *mut FILE) -> libc::c_int; + fn dcgettext( + __domainname: *const libc::c_char, + __msgid: *const libc::c_char, + __category: libc::c_int, + ) -> *mut libc::c_char; +} + +pub type ssize_t = libc::c_long; +pub type sudo_fatal_callback_t = Option; +static mut sudo_warn_conversation: sudo_conv_t = None; +static mut sudo_warn_setlocale: Option bool> = None; +static mut sudo_warn_setlocale_prev: Option bool> = + None; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_fatal_callback { + pub entries: STRUCT_unnamed, + pub func: Option ()>, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct STRUCT_unnamed { + pub sle_next: *mut sudo_fatal_callback, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_fatal_callback_list { + pub slh_first: *mut sudo_fatal_callback, +} + +static mut callbacks: sudo_fatal_callback_list = { + let mut init = sudo_fatal_callback_list { + slh_first: 0 as *const sudo_fatal_callback as *mut sudo_fatal_callback, + }; + init +}; + +pub const SUDO_CONV_PROMPT_ECHO_OFF: libc::c_int = 1; +pub const SUDO_CONV_PROMPT_ECHO_ON: libc::c_int = 2; +pub const SUDO_CONV_ERROR_MSG: libc::c_int = 3; +pub const SUDO_CONV_INFO_MSG: libc::c_int = 4; +pub const SUDO_CONV_PROMPT_MASK: libc::c_int = 5; +pub const SUDO_CONV_PROMPT_ECHO_OK: libc::c_int = 4096; +pub const SUDO_CONV_PREFER_TTY: libc::c_int = 8192; + +#[derive(Copy, Clone)] +pub struct sudo_conv_message { + pub msg_type: libc::c_int, + pub timeout: libc::c_int, + pub msg: *const libc::c_char, +} + +pub struct sudo_conv_reply { + pub reply: *mut libc::c_char, +} + +pub type sudo_conv_callback_fn_t = + Option libc::c_int>; + +pub struct sudo_conv_callback { + pub version: libc::c_uint, + pub closure: *mut libc::c_void, + pub on_suspend: sudo_conv_callback_fn_t, + pub on_resume: sudo_conv_callback_fn_t, +} + +pub type sudo_conv_t = Option< + unsafe extern "C" fn( + libc::c_int, + *const sudo_conv_message, + *mut sudo_conv_reply, + *mut sudo_conv_callback, + ) -> libc::c_int, +>; + +#[no_mangle] +pub fn do_cleanup() { + let mut cb: *mut sudo_fatal_callback = 0 as *mut sudo_fatal_callback; + + loop { + cb = unsafe { callbacks.slh_first }; + if cb.is_null() { + break; + } + unsafe { + callbacks.slh_first = (*callbacks.slh_first).entries.sle_next; + ((*cb).func).expect("the pointer is not null")(); + free(cb as *mut libc::c_void) + }; + } +} + +#[no_mangle] +unsafe fn sudo_fatal_callback_register_v1(mut func: sudo_fatal_callback_t) -> libc::c_int { + let mut cb: *mut sudo_fatal_callback = callbacks.slh_first as *mut sudo_fatal_callback; + cb = callbacks.slh_first; + while !cb.is_null() { + if func == (*cb).func { + return -1; + } + cb = (*cb).entries.sle_next; + } + + cb = malloc(std::mem::size_of::() as libc::c_ulong) + as *mut sudo_fatal_callback; + if cb.is_null() { + return -1; + } + (*cb).func = func; + (*cb).entries.sle_next = cb; + callbacks.slh_first = cb; + return 0; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_fatal_callback_deregister_v1( + mut func: sudo_fatal_callback_t, +) -> libc::c_int { + let mut cb: *mut sudo_fatal_callback = 0 as *mut sudo_fatal_callback; + let mut prev: *mut *mut sudo_fatal_callback = 0 as *mut *mut sudo_fatal_callback; + prev = &mut callbacks.slh_first; + loop { + cb = unsafe { *prev }; + if cb.is_null() { + break; + } + if (*cb).func == func { + if cb == callbacks.slh_first { + callbacks.slh_first = (*callbacks.slh_first).entries.sle_next; + } else { + let ref mut fresh8 = (**prev).entries.sle_next; + *fresh8 = (*(**prev).entries.sle_next).entries.sle_next; + } + free(cb as *mut libc::c_void); + return 0; + } + prev = &mut (*cb).entries.sle_next; + } + return -1; +} + +#[no_mangle] +extern "C" fn sudo_warn_set_conversation_v1(mut conv: sudo_conv_t) { + unsafe { sudo_warn_conversation = conv }; +} + +//#[allow(improper_ctypes_definitions)] +#[no_mangle] +pub unsafe extern "C" fn sudo_warn_set_locale_func_v1( + mut func: Option bool>, +) { + sudo_warn_setlocale_prev = sudo_warn_setlocale; + sudo_warn_setlocale = func; +} + +#[no_mangle] +fn sudo_warn_gettext_v1( + domainname: *const libc::c_char, + msgid: *const libc::c_char, +) -> *mut libc::c_char { + let mut cookie: libc::c_int = 0; + let mut msg: *mut libc::c_char = 0 as *mut libc::c_char; + + unsafe { + if sudo_warn_setlocale.is_some() { + sudo_warn_setlocale.expect("is not null func pointer")( + 0 as libc::c_int != 0, + &mut cookie, + ); + } + } + msg = unsafe { dcgettext(domainname, msgid, __LC_MESSAGES!() as libc::c_int) }; + + unsafe { + if sudo_warn_setlocale.is_some() { + sudo_warn_setlocale.expect("is not null function pointer")( + 1 as libc::c_int != 0, + &mut cookie, + ); + } + } + return msg; +} diff --git a/utsudo-0.0.2/lib/util/src/getgrouplist.rs b/utsudo-0.0.2/lib/util/src/getgrouplist.rs new file mode 100644 index 0000000..a4ee40d --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/getgrouplist.rs @@ -0,0 +1,87 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(non_camel_case_types, unused_mut, unused_variables, unused_assignments)] + +//line72-2(arg), +pub type gid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type size_t = libc::c_ulong; + +extern "C" { + fn getgrouplist( + __user: *const libc::c_char, + __group: __gid_t, + __groups: *mut __gid_t, + __ngroups: *mut libc::c_int, + ) -> libc::c_int; + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn free(__ptr: *mut libc::c_void); + fn reallocarray(__ptr: *mut libc::c_void, __nmemb: size_t, __size: size_t) + -> *mut libc::c_void; +} + +// define +pub const _SC_NGROUPS_MAX: libc::c_uint = 3; +pub const NGROUPS_MAX: libc::c_uint = 65536; + +//line_72 +#[no_mangle] +pub unsafe extern "C" fn sudo_getgrouplist2_v1( + mut name: *const libc::c_char, + mut basegid: gid_t, + mut groupsp: *mut *mut gid_t, + mut ngroupsp: *mut libc::c_int, +) -> libc::c_int { + let mut groups: *mut gid_t = *groupsp; + let mut ngroups: libc::c_int = 0; + let mut grpsize: libc::c_int = 0; + let mut tries: libc::c_int = 0; + + //line82 + if !groups.is_null() { + return getgrouplist(name, basegid, groups, ngroupsp); + } + + //line91 + grpsize = sysconf(_SC_NGROUPS_MAX as libc::c_int) as libc::c_int; + + //line92 + if grpsize < 0 as libc::c_int { + grpsize = NGROUPS_MAX as libc::c_int; + } + + //line94 + grpsize += 1; + + //line99 + while tries < 10 { + free(groups as *mut libc::c_void); + //line101 + groups = reallocarray( + 0 as *mut libc::c_void, + grpsize as size_t, + ::std::mem::size_of::() as size_t, + ) as *mut gid_t; + if groups.is_null() { + return -1 as libc::c_int; + } + ngroups = grpsize; + //line105 + if getgrouplist(name, basegid, groups, &mut ngroups) != -1 { + *groupsp = groups; + *ngroupsp = ngroups; + return 0 as libc::c_int; + } + if ngroups == grpsize { + break; + } + grpsize = ngroups; + tries += 1; + } + free(groups as *mut libc::c_void); + return -1 as libc::c_int; +} diff --git a/utsudo-0.0.2/lib/util/src/gethostname.rs b/utsudo-0.0.2/lib/util/src/gethostname.rs new file mode 100644 index 0000000..258cd21 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/gethostname.rs @@ -0,0 +1,47 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(unused_imports, unused_assignments, non_camel_case_types)] +use std::ffi::CStr; +use std::string::String; + +extern "C" { + fn malloc(_: libc::c_ulong) -> *mut libc::c_void; + fn free(__ptr: *mut libc::c_void); + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn gethostname(__name: *mut libc::c_char, __len: size_t) -> libc::c_int; +} + +pub type size_t = libc::c_ulong; +pub type C2RustUnnamed = libc::c_uint; +pub const _SC_HOST_NAME_MAX: C2RustUnnamed = 180; + +#[no_mangle] +pub unsafe extern "C" fn sudo_gethostname_v1() -> *mut libc::c_char { + let mut hname: *mut libc::c_char = 0 as *mut libc::c_char; + let mut host_name_max: size_t = 0; + + host_name_max = sysconf(_SC_HOST_NAME_MAX as libc::c_int) as size_t; + if host_name_max == -(1 as libc::c_int) as size_t { + host_name_max = 255 as libc::c_int as size_t; + } + hname = + malloc(host_name_max.wrapping_add(1 as libc::c_int as libc::c_ulong)) as *mut libc::c_char; + if !hname.is_null() { + if gethostname( + hname, + host_name_max.wrapping_add(1 as libc::c_int as libc::c_ulong), + ) == 0 as libc::c_int + && *hname as libc::c_int != '\u{0}' as i32 + { + *hname.offset(host_name_max as isize) = '\u{0}' as i32 as libc::c_char; + } else { + free(hname as *mut libc::c_void); + hname = 0 as *mut libc::c_char; + } + } + return hname; +} diff --git a/utsudo-0.0.2/lib/util/src/gettime.rs b/utsudo-0.0.2/lib/util/src/gettime.rs new file mode 100644 index 0000000..65f1bb1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/gettime.rs @@ -0,0 +1,147 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +// use crate::sudo_debug::sudo_debug_printf2_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_ERRNO; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; +use crate::sudo_debug_macro::SUDO_DEBUG_WARN; + +extern "C" { + fn clock_gettime(__clock_id: clockid_t, __tp: *mut timespec) -> libc::c_int; + fn gettimeofday(__tv: *mut timeval, __tz: __timezone_ptr_t) -> libc::c_int; + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +pub type __time_t = libc::c_long; +pub type __suseconds_t = libc::c_long; +pub type __clockid_t = libc::c_int; +pub type __syscall_slong_t = libc::c_long; +pub type clockid_t = __clockid_t; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timeval { + pub tv_sec: __time_t, + pub tv_usec: __suseconds_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timezone { + pub tz_minuteswest: libc::c_int, + pub tz_dsttime: libc::c_int, +} + +pub type __timezone_ptr_t = *mut timezone; + +pub const CLOCK_REALTIME: libc::c_int = 0; +pub const SUDO_CLOCK_BOOTTIME: libc::c_int = 7; +pub const SUDO_CLOCK_UPTIME: libc::c_int = 1; +pub const _SC_MONOTONIC_CLOCK: libc::c_int = 149; + +#[no_mangle] +pub unsafe extern "C" fn sudo_gettime_real_v1(mut ts: *mut timespec) -> libc::c_int { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if clock_gettime(CLOCK_REALTIME, ts) == -1 { + let mut tv: timeval = timeval { + tv_sec: 0, + tv_usec: 0, + }; + + sudo_debug_printf!( + SUDO_DEBUG_WARN | SUDO_DEBUG_ERRNO | SUDO_DEBUG_LINENO, + b"clock_gettime(CLOCK_REALTIME) failed, trying gettimeofday()\0" as *const u8 + as *const libc::c_char + ); + + if gettimeofday(&mut tv, 0 as *mut timezone) == -1 { + debug_return_int!(-1); + } + (*ts).tv_sec = tv.tv_sec; + (*ts).tv_nsec = tv.tv_usec * 1000; + } + debug_return_int!(0) +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_gettime_mono_v1(ts: *mut timespec) -> i32 { + static mut has_monoclock: libc::c_int = -1; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if has_monoclock == -1 { + has_monoclock = (sysconf(_SC_MONOTONIC_CLOCK) != -1) as libc::c_int; + } + + if has_monoclock == 0 { + debug_return_int!(sudo_gettime_real_v1(ts)); + } + + if clock_gettime(SUDO_CLOCK_BOOTTIME, ts) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_WARN | SUDO_DEBUG_ERRNO | SUDO_DEBUG_LINENO, + b"clock_gettime(%d) failed, using wall clock\0" as *const u8 as *const libc::c_char, + SUDO_CLOCK_BOOTTIME as libc::c_int + ); + has_monoclock = 0; + + debug_return_int!(sudo_gettime_real_v1(ts)); + } + debug_return_int!(0) +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_gettime_awake_v1(ts: *mut timespec) -> libc::c_int { + static mut has_monoclock: libc::c_int = -1; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if has_monoclock == -1 { + has_monoclock = (sysconf(_SC_MONOTONIC_CLOCK) != -1) as libc::c_int; + } + if has_monoclock == 0 { + debug_return_int!(sudo_gettime_real_v1(ts)); + } + if clock_gettime(SUDO_CLOCK_UPTIME, ts) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_WARN | SUDO_DEBUG_ERRNO | SUDO_DEBUG_LINENO, + b"clock_gettime(%d) failed, using wall clock\0" as *const u8 as *const libc::c_char, + SUDO_CLOCK_UPTIME as libc::c_int + ); + + has_monoclock = 0; + debug_return_int!(sudo_gettime_real_v1(ts)); + } + debug_return_int!(0) +} diff --git a/utsudo-0.0.2/lib/util/src/gidlist.rs b/utsudo-0.0.2/lib/util/src/gidlist.rs new file mode 100644 index 0000000..95dfa03 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/gidlist.rs @@ -0,0 +1,112 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + mutable_transmutes, + non_camel_case_types, + unused_assignments, + unused_mut +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +extern "C" { + fn reallocarray(__ptr: *mut libc::c_void, __nmemb: size_t, __size: size_t) + -> *mut libc::c_void; + fn sudo_strtoidx_v1( + str: *const libc::c_char, + sep: *const libc::c_char, + endp: *mut *mut libc::c_char, + errstr: *mut *const libc::c_char, + ) -> id_t; + fn free(__ptr: *mut libc::c_void); + fn sudo_warnx_nodebug_v1(fmt: *const libc::c_char, _: ...); +} + +pub type __gid_t = libc::c_uint; //typedef __gid_t gid_t; +pub type gid_t = __gid_t; +pub type GETGROUPS_T = gid_t; //#define GETGROUPS_T gid_t +pub type size_t = libc::c_ulong; +pub type id_t = libc::c_uint; + +#[no_mangle] +pub unsafe extern "C" fn sudo_parse_gids_v1( + mut gidstr: *const libc::c_char, + mut basegid: *const gid_t, + mut gidsp: *mut *mut GETGROUPS_T, +) -> libc::c_int { + let mut ngids: libc::c_int = 0; + let mut gids: *mut GETGROUPS_T = 0 as *mut GETGROUPS_T; + let mut cp: *const libc::c_char = gidstr; + let mut errstr: *const libc::c_char = 0 as *const libc::c_char; + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if *cp as libc::c_int != '\0' as i32 { + ngids += 1; //ngids++ + loop { + if *cp as libc::c_int == ',' as i32 { + ngids += 1; + } + cp = cp.offset(1); + + if *cp as libc::c_int != '\0' as i32 { + break; + } + } + } + if !basegid.is_null() { + ngids += 1; + } + if ngids != 0 { + gids = reallocarray( + 0 as *mut libc::c_void, + ngids as size_t, + ::std::mem::size_of::() as libc::c_ulong, //sizeof(GETGROUPS_T) + ) as *mut GETGROUPS_T; + if gids.is_null() { + sudo_warnx!( + b"%s: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + b"unable to allocate memor0" as *const u8 as *const libc::c_char + ); + debug_return_int!(-1); + } + ngids = 0; + if !basegid.is_null() { + *gids.offset(ngids as isize) = *basegid; + ngids += 1; + } + + cp = gidstr; + loop { + *gids.offset(ngids as isize) = sudo_strtoidx_v1( + cp, + b",\0" as *const u8 as *const libc::c_char, + &mut ep, + &mut errstr, + ); + if !errstr.is_null() { + sudo_warnx!(b"%s: %s\0" as *const u8 as *const libc::c_char, cp, errstr); + free(gids as *mut libc::c_void); + debug_return_int!(-1); + } + + if basegid.is_null() || *gids.offset(ngids as isize) != *basegid { + ngids += 1; + } + cp = ep.offset(1 as isize); + if !(*ep as libc::c_int != '\0' as i32) { + break; + } + } + *gidsp = gids; + } + debug_return_int!(ngids) +} diff --git a/utsudo-0.0.2/lib/util/src/key_val.rs b/utsudo-0.0.2/lib/util/src/key_val.rs new file mode 100644 index 0000000..a41be2f --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/key_val.rs @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(unused_assignments, non_camel_case_types)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_str_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +extern "C" { + fn malloc(_: libc::c_ulong) -> *mut libc::c_void; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; +} +pub type size_t = libc::c_ulong; + +#[no_mangle] +pub unsafe extern "C" fn sudo_new_key_val_v1( + key: *const libc::c_char, + val: *const libc::c_char, +) -> *mut libc::c_char { + let key_len: size_t = strlen(key); + let val_len: size_t = strlen(val); + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut str: *mut libc::c_char = 0 as *mut libc::c_char; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + str = malloc( + key_len + .wrapping_add(1 as libc::c_ulong) + .wrapping_add(val_len) + .wrapping_add(1 as libc::c_ulong), + ) as *mut libc::c_char; + cp = str; + if !cp.is_null() { + memcpy(cp as *mut libc::c_void, key as *const libc::c_void, key_len); + cp = cp.offset(key_len as isize); + let fresh0 = cp; + cp = cp.offset(1); + *fresh0 = '=' as i32 as libc::c_char; + memcpy(cp as *mut libc::c_void, val as *const libc::c_void, val_len); + cp = cp.offset(val_len as isize); + *cp = '\u{0}' as i32 as libc::c_char; + } + debug_return_str!(str) +} diff --git a/utsudo-0.0.2/lib/util/src/lbuf.rs b/utsudo-0.0.2/lib/util/src/lbuf.rs new file mode 100644 index 0000000..29d73ca --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/lbuf.rs @@ -0,0 +1,298 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + non_camel_case_types, + non_upper_case_globals, + unused_assignments, + unused_mut, + dead_code +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_bool_v1; +use crate::sudo_debug::sudo_debug_exit_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +extern "C" { + fn free(__ptr: *mut libc::c_void); + fn realloc(_: *mut libc::c_void, _: size_t) -> *mut libc::c_void; + fn strlen(__s: *const libc::c_char) -> libc::c_ulong; + fn __ctype_b_loc() -> *mut *const libc::c_ushort; + fn memchr(_: *const libc::c_void, _: libc::c_int, _: libc::c_ulong) -> *mut libc::c_void; + fn memrchr(__s: *const libc::c_void, __c: libc::c_int, __n: size_t) -> *mut libc::c_void; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +pub const _ISblank: libc::c_uint = 1; + +pub struct sudo_lbuf { + pub output: Option libc::c_int>, //int (*output)(const char *); + pub buf: *mut libc::c_char, + pub continuation: *const libc::c_char, + pub indent: libc::c_int, + pub len: libc::c_int, + pub size: libc::c_int, + pub cols: libc::c_short, + pub error: libc::c_short, +} + +pub type sudo_lbuf_output_t = Option libc::c_int>; +pub type size_t = libc::c_ulong; + +#[no_mangle] +pub unsafe extern "C" fn sudo_lbuf_init_v1( + mut lbuf: *mut sudo_lbuf, + mut output: sudo_lbuf_output_t, + mut indent: libc::c_int, + mut continuation: *const libc::c_char, + mut cols: libc::c_int, +) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + (*lbuf).output = output; + (*lbuf).continuation = continuation; + (*lbuf).indent = indent; + (*lbuf).cols = cols as libc::c_short; + (*lbuf).error = 0 as libc::c_short; + (*lbuf).len = 0; + (*lbuf).size = 0; + (*lbuf).buf = 0 as *mut libc::c_char; + + debug_return!() +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_lbuf_destroy_v1(mut lbuf: *mut sudo_lbuf) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + free((*lbuf).buf as *mut libc::c_void); + (*lbuf).buf = 0 as *mut libc::c_char; + + debug_return!() +} + +//static +unsafe extern "C" fn sudo_lbuf_expand(mut lbuf: *mut sudo_lbuf, mut extra: libc::c_int) -> bool { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if (*lbuf).len + extra + 1 >= (*lbuf).size { + let mut new_buf: *mut libc::c_char; + let mut new_size: libc::c_int = (*lbuf).size; + + //do_while + loop { + new_size += 256; + if !((*lbuf).len + extra + 1 >= new_size) { + break; + } + } + + new_buf = realloc((*lbuf).buf as *mut libc::c_void, new_size as libc::c_ulong) + as *mut libc::c_char; + if new_buf.is_null() { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"unable to allocate memory\0" as *const u8 as *const libc::c_char + ); + + (*lbuf).error = 1; + debug_return_bool!(false); + } + (*lbuf).buf = new_buf; + (*lbuf).size = new_size; + } + debug_return_bool!(true) +} + +/* XXX - check output function return value */ +unsafe extern "C" fn sudo_lbuf_println( + mut lbuf: *mut sudo_lbuf, + mut line: *mut libc::c_char, + mut len: libc::c_int, +) { + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut save: libc::c_char = 0; + let mut i: libc::c_int = 0; + let mut have: libc::c_int = 0; + let mut contlen: libc::c_int = 0; + let mut indent: libc::c_int = (*lbuf).indent; + let mut is_comment: bool = false; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if *line.offset(0 as isize) as libc::c_int == '#' as i32 + && *(*__ctype_b_loc()) + .offset(*line.offset(1 as isize) as libc::c_uchar as libc::c_int as isize) + as libc::c_int + & _ISblank as libc::c_ushort as libc::c_int + != 0 + { + is_comment = true; + indent = 2; + } + + if !((*lbuf).continuation).is_null() && !is_comment { + contlen = strlen((*lbuf).continuation) as libc::c_int; + } + + cp = line; + have = (*lbuf).cols as libc::c_int; + while !cp.is_null() && *cp as libc::c_int != '\0' as i32 { + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + let mut need: libc::c_int = len - cp.offset_from(line) as libc::c_long as libc::c_int; + + if need > have { + have -= contlen; + ep = + memrchr(cp as *const libc::c_void, ' ' as i32, have as size_t) as *mut libc::c_char; + if ep.is_null() { + ep = memchr( + cp.offset(have as isize) as *const libc::c_void, + ' ' as i32, + (need - have) as libc::c_ulong, + ) as *mut libc::c_char + }; + if !ep.is_null() { + need = ep.offset_from(cp) as libc::c_long as libc::c_int; + } + } + if cp != line { + if is_comment { + ((*lbuf).output).expect("non-null function pointer")( + b"# \0" as *const u8 as *const libc::c_char, + ); + } else { + i = 0; + while i < indent { + ((*lbuf).output).expect("non-null function pointer")( + b" \0" as *const u8 as *const libc::c_char, + ); + i += 1; + } + } + } + save = *cp.offset(need as isize); + *cp.offset(need as isize) = '\0' as i32 as libc::c_char; + ((*lbuf).output).expect("non-null function pointer")(cp); + *cp.offset(need as isize) = save; + cp = ep; + + if !cp.is_null() { + have = (*lbuf).cols as libc::c_int - indent; + ep = line.offset(len as isize); + while cp < ep + && *(*__ctype_b_loc()).offset(*cp as libc::c_uchar as libc::c_int as isize) + as libc::c_int + & _ISblank as libc::c_int as libc::c_ushort as libc::c_int + != 0 + { + cp = cp.offset(1); + } + if contlen != 0 { + ((*lbuf).output).expect("non-null function pointer")((*lbuf).continuation); + } + } + ((*lbuf).output).expect("non-null function pointer")( + b"\n\0" as *const u8 as *const libc::c_char, + ); + } + debug_return!() +} + +/* + * Print the buffer with word wrap based on the tty width. + * The lbuf is reset on return. + * XXX - check output function return value + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_lbuf_print_v1(mut lbuf: *mut sudo_lbuf) { + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + let mut len: libc::c_int = 0; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if !(((*lbuf).buf).is_null() || (*lbuf).len == 0 as libc::c_int) { + //len = lbuf->continuation ? strlen(lbuf->continuation) : 0; + len = (if !((*lbuf).continuation).is_null() { + strlen((*lbuf).continuation) + } else { + 0 as libc::c_ulong + }) as libc::c_int; + + if (*lbuf).cols as libc::c_int <= (*lbuf).indent + len + 20 as libc::c_int { + if (*lbuf).len > 0 as libc::c_int { + *((*lbuf).buf).offset((*lbuf).len as isize) = '\u{0}' as i32 as libc::c_char; + ((*lbuf).output).expect("non-null function pointer")((*lbuf).buf); + if *((*lbuf).buf).offset(((*lbuf).len - 1 as libc::c_int) as isize) as libc::c_int + != '\n' as i32 + { + ((*lbuf).output).expect("non-null function pointer")( + b"\n\0" as *const u8 as *const libc::c_char, + ); + } + } + } else { + //for + cp = (*lbuf).buf; + while !cp.is_null() && *cp as libc::c_int != '\u{0}' as i32 { + if *cp as libc::c_int == '\n' as i32 { + ((*lbuf).output).expect("non-null function pointer")( + b"\n\0" as *const u8 as *const libc::c_char, + ); + cp = cp.offset(1); + } else { + len = ((*lbuf).len as libc::c_long + - cp.offset_from((*lbuf).buf) as libc::c_long) + as libc::c_int; + ep = memchr(cp as *const libc::c_void, '\n' as i32, len as libc::c_ulong) + as *mut libc::c_char; + if !ep.is_null() { + len = ep.offset_from(cp) as libc::c_long as libc::c_int; + } + if len != 0 { + sudo_lbuf_println(lbuf, cp, len); + } + cp = if !ep.is_null() { + ep.offset(1 as isize) + } else { + 0 as *mut libc::c_char + }; + } + } + } + } + //done + (*lbuf).len = 0; + (*lbuf).error = 0 as libc::c_short; + + debug_return!() +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_lbuf_error_v1(mut lbuf: *mut sudo_lbuf) -> bool { + if !lbuf.is_null() && (*lbuf).error as libc::c_int != 0 { + return true; + } + return false; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_lbuf_clearerr_v1(mut lbuf: *mut sudo_lbuf) { + if !lbuf.is_null() { + (*lbuf).error = 0 as libc::c_short; + } +} diff --git a/utsudo-0.0.2/lib/util/src/lib.rs b/utsudo-0.0.2/lib/util/src/lib.rs new file mode 100644 index 0000000..ff0cdf9 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/lib.rs @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#[warn(unused_unsafe)] +#[macro_use] +mod sudo_debug_macro; +mod arc4random; +mod arc4random_uniform; +mod closefrom; +mod digest; +mod event; +mod event_poll; +mod fatal; +mod getgrouplist; +mod gethostname; +mod gettime; +mod gidlist; +mod key_val; +mod lbuf; +mod locking; +mod memset_s; +mod parseln; +mod progname; +mod pw_dup; +mod secure_path; +mod setgroups; +mod sha2; +mod sig2str; +mod str2sig; +mod strlcat; +mod strlcpy; +mod strsplit; +mod strtobool; +mod strtoid; +mod strtomode; +mod strtonum; +mod sudo_conf; +mod sudo_debug; +mod sudo_dso; +mod term; +mod ttyname_dev; +mod ttysize; diff --git a/utsudo-0.0.2/lib/util/src/locking.rs b/utsudo-0.0.2/lib/util/src/locking.rs new file mode 100644 index 0000000..5f99ed8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/locking.rs @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(dead_code, non_camel_case_types, unused_mut)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_bool_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +extern "C" { + fn lockf(__fd: libc::c_int, __cmd: libc::c_int, __len: off_t) -> libc::c_int; + fn __errno_location() -> *mut libc::c_int; + +} + +pub type __off_t = libc::c_long; +pub type off_t = __off_t; + +pub const SUDO_LOCK: libc::c_int = 1; +pub const SUDO_TLOCK: libc::c_int = 2; +pub const SUDO_UNLOCK: libc::c_int = 4; +pub const F_ULOCK: libc::c_int = 0; +pub const F_LOCK: libc::c_int = 1; +pub const F_TLOCK: libc::c_int = 2; +pub const EINVAL: libc::c_int = 22; + +#[no_mangle] +unsafe extern "C" fn sudo_lock_file_v1(mut fd: libc::c_int, mut type_0: libc::c_int) -> bool { + return sudo_lock_region_v1(fd, type_0, 0 as off_t); +} + +#[no_mangle] +unsafe extern "C" fn sudo_lock_region_v1( + mut fd: libc::c_int, + mut type_0: libc::c_int, + mut len: off_t, +) -> bool { + let mut op: libc::c_int = 0; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + match type_0 { + SUDO_LOCK => { + op = F_LOCK; + } + SUDO_TLOCK => { + op = F_TLOCK; + } + SUDO_UNLOCK => { + op = F_ULOCK; + } + _ => { + *__errno_location() = EINVAL; + debug_return_bool!(false); + } + } + debug_return_bool!(lockf(fd, op, len) == 0) +} diff --git a/utsudo-0.0.2/lib/util/src/memset_s.rs b/utsudo-0.0.2/lib/util/src/memset_s.rs new file mode 100644 index 0000000..f56b10b --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/memset_s.rs @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(dead_code, non_camel_case_types, unused_mut)] + +extern "C" { + fn __errno_location() -> *mut libc::c_int; +} + +pub type size_t = libc::c_ulong; +pub const SIZE_MAX: libc::c_ulong = 18446744073709551615; +pub const RSIZE_MAX: libc::c_ulong = SIZE_MAX >> 1; +pub const EINVAL: libc::c_int = 22; + +#[no_mangle] +pub fn sudo_memset_s( + mut v: *mut libc::c_void, + mut smax: size_t, + mut c: libc::c_int, + mut n: size_t, +) -> libc::c_int { + let mut ret = 0; + let mut s: *mut libc::c_uchar = v as *mut libc::c_uchar; + + if s.is_null() || smax > RSIZE_MAX { + let ref mut fresh0 = unsafe { *__errno_location() }; + *fresh0 = EINVAL; + ret = *fresh0; + } else { + if n > smax { + n = smax; + let ref mut fresh1 = unsafe { *__errno_location() }; + *fresh1 = EINVAL; + ret = *fresh1; + } + loop { + let fresh2 = n; + n = n.wrapping_sub(1); //n-- + if !(fresh2 != 0) { + break; + } + let fresh3 = s; + unsafe { + s = s.offset(1); //*s++ + ::std::ptr::write_volatile(fresh3, c as libc::c_uchar); + } + } + } + return ret; +} diff --git a/utsudo-0.0.2/lib/util/src/parseln.rs b/utsudo-0.0.2/lib/util/src/parseln.rs new file mode 100644 index 0000000..05ca7b7 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/parseln.rs @@ -0,0 +1,239 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + improper_ctypes +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_ssize_t_v1; +// use crate::sudo_debug::sudo_debug_printf2_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_marker { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_codecvt { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_wide_data { + _unused: [u8; 0], +} + +extern "C" { + fn getdelim( + __lineptr: *mut *mut libc::c_char, + __n: *mut size_t, + __delimiter: libc::c_int, + __stream: *mut FILE, + ) -> __ssize_t; + fn strchr(_: *const libc::c_char, _: libc::c_int) -> *mut libc::c_char; + fn __ctype_b_loc() -> *mut *const libc::c_ushort; + fn realloc(_: *mut libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn free(__ptr: *mut libc::c_void); + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +pub type __ssize_t = libc::c_long; +pub type ssize_t = __ssize_t; +pub type __SIZE_TYPE__ = libc::c_ulong; +pub type size_t = __SIZE_TYPE__; +pub type FILE = _IO_FILE; +pub type __off_t = libc::c_long; +pub type __off64_t = libc::c_long; + +pub struct _IO_FILE { + pub _flags: libc::c_int, + pub _IO_read_ptr: *mut libc::c_char, + pub _IO_read_end: *mut libc::c_char, + pub _IO_read_base: *mut libc::c_char, + pub _IO_write_base: *mut libc::c_char, + pub _IO_write_ptr: *mut libc::c_char, + pub _IO_write_end: *mut libc::c_char, + pub _IO_buf_base: *mut libc::c_char, + pub _IO_buf_end: *mut libc::c_char, + pub _IO_save_base: *mut libc::c_char, + pub _IO_backup_base: *mut libc::c_char, + pub _IO_save_end: *mut libc::c_char, + pub _markers: *mut _IO_marker, + pub _chain: *mut _IO_FILE, + pub _fileno: libc::c_int, + pub _flags2: libc::c_int, + pub _old_offset: __off_t, + pub _cur_column: libc::c_ushort, + pub _vtable_offset: libc::c_schar, + + pub _shortbuf: [libc::c_char; 1], + pub _lock: *mut libc::c_void, + pub _offset: __off64_t, + pub _codecvt: *mut _IO_codecvt, + pub _wide_data: *mut _IO_wide_data, + pub _freeres_list: *mut _IO_FILE, + pub _freeres_buf: *mut libc::c_void, + pub __pad5: size_t, + pub _mode: libc::c_int, + pub _unused2: [libc::c_char; 20], +} + +pub const PARSELN_COMM_BOL: libc::c_int = 0x01; +pub const PARSELN_CONT_IGN: libc::c_int = 0x02; +pub const _ISblank: libc::c_int = 1; + +#[no_mangle] +pub unsafe extern "C" fn sudo_parseln_v2( + mut bufp: *mut *mut libc::c_char, //**bufp -> *mut *mut + mut bufsizep: *mut size_t, //*bufsizep -> *mut + mut lineno: *mut libc::c_uint, + mut fp: *mut FILE, + mut flags: libc::c_int, +) -> ssize_t { + let mut linesize: size_t = 0; + let mut total: size_t = 0; + let mut len: ssize_t = 0; + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut line: *mut libc::c_char = 0 as *mut libc::c_char; + let mut continued: bool = false; + let mut comment: bool = false; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + loop { + comment = false; + continued = false; + len = getdelim(&mut line, &mut linesize, '\n' as i32, fp); + if len == -1 { + break; + } + if !lineno.is_null() { + *lineno = (*lineno).wrapping_add(1) //(*lineno)++ + } + while len > 0 as libc::c_long + && (*line.offset((len - 1 as libc::c_long) as isize) as libc::c_int == '\n' as i32 + || *line.offset((len - 1 as libc::c_long) as isize) as libc::c_int == '\r' as i32) + { + len -= 1; + *line.offset(len as isize) = '\u{0}' as i32 as libc::c_char; + } + cp = strchr(line, '#' as i32); + if !cp.is_null() { + if cp == line || (flags & PARSELN_COMM_BOL) == 0 { + *cp = '\u{0}' as i32 as libc::c_char; + len = cp.offset_from(line) as libc::c_long; //cp-line + comment = true; + } + } + if !comment && (flags & PARSELN_CONT_IGN) == 0 { + if len > 0 as libc::c_long + && *line.offset((len - 1 as libc::c_long) as isize) as libc::c_int == '\\' as i32 + && (len == 1 as libc::c_long + || *line.offset((len - 2 as libc::c_long) as isize) as libc::c_int + != '\\' as i32) + { + *line.offset((len - 1 as libc::c_long) as isize) = '\u{0}' as i32 as libc::c_char; + continued = true; + } + } + + if !continued { + while len > 0 as libc::c_long + && *(*__ctype_b_loc()).offset( + *line.offset((len - 1 as libc::c_long) as isize) as libc::c_uchar as isize + ) as libc::c_int + & _ISblank as libc::c_ushort as libc::c_int + != 0 + { + *line.offset((len - 1 as libc::c_long) as isize) = '\0' as i32 as libc::c_char; + } + } + + //for->while + cp = line; + while *(*__ctype_b_loc()).offset(*cp as libc::c_uchar as libc::c_int as isize) + as libc::c_int + & _ISblank as libc::c_ushort as libc::c_int + != 0 + { + len -= 1; + cp = cp.offset(1) + } + if (*bufp).is_null() || total.wrapping_add(len as libc::c_ulong) >= *bufsizep { + let mut tmp: *mut libc::c_void = 0 as *mut libc::c_void; + let mut size: size_t = total + .wrapping_add(len as libc::c_ulong) + .wrapping_add(1 as libc::c_ulong); + if size < 64 as libc::c_ulong { + size = 64 as libc::c_ulong; + } else if size <= 0x80000000 as libc::c_ulong { + size = size.wrapping_sub(1); //size-- + size |= size >> 1; + size |= size >> 2; + size |= size >> 4; + size |= size >> 8; + size |= size >> 16; + size = size.wrapping_add(1); //size++ + } + tmp = realloc(*bufp as *mut libc::c_void, size); + if tmp.is_null() { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"unable to allocate memory\0" as *const u8 as *const libc::c_char + ); + len = -1; + total = 0; + break; + } + *bufp = tmp as *mut libc::c_char; + *bufsizep = size; + } + memcpy( + (*bufp).offset(total as isize) as *mut libc::c_void, + cp as *const libc::c_void, + (len + 1 as libc::c_long) as libc::c_ulong, + ); + total = (total as libc::c_ulong).wrapping_add(len as libc::c_ulong) as size_t; + if !continued { + break; + } + } + free(line as *mut libc::c_void); + if len == -1 as libc::c_long && total == 0 as libc::c_ulong { + debug_return_ssize_t!(-1 as ssize_t); + } + debug_return_ssize_t!(total as ssize_t) +} + +#[no_mangle] +pub unsafe fn sudo_parseln_v1( + mut bufp: *mut *mut libc::c_char, + mut bufsizep: *mut size_t, + mut lineno: *mut libc::c_uint, + mut fp: *mut FILE, +) -> ssize_t { + return sudo_parseln_v2(bufp, bufsizep, lineno, fp, 0); +} diff --git a/utsudo-0.0.2/lib/util/src/progname.rs b/utsudo-0.0.2/lib/util/src/progname.rs new file mode 100644 index 0000000..d2d602f --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/progname.rs @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(dead_code, non_upper_case_globals, unused_mut)] + +extern "C" { + fn strrchr(_: *const libc::c_char, _: libc::c_int) -> *mut libc::c_char; + static mut __progname: *const libc::c_char; +} +static mut progname: *const libc::c_char = b"\0" as *const u8 as *const libc::c_char; //*progname = "" +#[no_mangle] +pub unsafe extern "C" fn initprogname(mut name: *const libc::c_char) { + if !__progname.is_null() && *__progname as libc::c_int != '\u{0}' as i32 { + progname = __progname; + } else { + progname = strrchr(name, '/' as i32); + if !progname.is_null() { + progname = progname.offset(1); //progname++ + } else { + progname = name; + } + } + + if *progname.offset(0 as isize) as libc::c_int == 'l' as i32 + && *progname.offset(1 as isize) as libc::c_int == 't' as i32 + && *progname.offset(2 as isize) as libc::c_int == '-' as i32 + && *progname.offset(3 as isize) as libc::c_int == '\u{0}' as i32 + { + progname = progname.offset(3 as isize); + } +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_getprogname() -> *const libc::c_char { + return progname; +} diff --git a/utsudo-0.0.2/lib/util/src/pw_dup.rs b/utsudo-0.0.2/lib/util/src/pw_dup.rs new file mode 100644 index 0000000..160d201 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/pw_dup.rs @@ -0,0 +1,128 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + mutable_transmutes, + non_camel_case_types, + unused_assignments, + unused_mut, + clashing_extern_declarations, + dead_code, + unused_variables, + unused_macros +)] + +extern "C" { + fn malloc(_: libc::c_ulong) -> *mut libc::c_void; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; +} + +pub type __uid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type size_t = libc::c_ulong; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct passwd { + pub pw_name: *mut libc::c_char, + pub pw_passwd: *mut libc::c_char, + pub pw_uid: __uid_t, + pub pw_gid: __gid_t, + pub pw_gecos: *mut libc::c_char, + pub pw_dir: *mut libc::c_char, + pub pw_shell: *mut libc::c_char, +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_pw_dup(mut pw: *const passwd) -> *mut passwd { + let mut nsize: size_t = 0 as libc::c_int as size_t; + let mut psize: size_t = 0 as libc::c_int as size_t; + let mut gsize: size_t = 0 as libc::c_int as size_t; + let mut dsize: size_t = 0 as libc::c_int as size_t; + let mut ssize: size_t = 0 as libc::c_int as size_t; + let mut total: size_t = 0; + let mut newpw: *mut passwd = 0 as *mut passwd; + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + total = ::core::mem::size_of::() as libc::c_ulong; + if !((*pw).pw_name).is_null() { + nsize = (strlen((*pw).pw_name)).wrapping_add(1 as libc::c_int as libc::c_ulong); + total = (total as libc::c_ulong).wrapping_add(nsize) as size_t as size_t; + } + if !((*pw).pw_passwd).is_null() { + psize = (strlen((*pw).pw_passwd)).wrapping_add(1 as libc::c_int as libc::c_ulong); + total = (total as libc::c_ulong).wrapping_add(psize) as size_t as size_t; + } + if !((*pw).pw_gecos).is_null() { + gsize = (strlen((*pw).pw_gecos)).wrapping_add(1 as libc::c_int as libc::c_ulong); + total = (total as libc::c_ulong).wrapping_add(gsize) as size_t as size_t; + } + if !((*pw).pw_dir).is_null() { + dsize = (strlen((*pw).pw_dir)).wrapping_add(1 as libc::c_int as libc::c_ulong); + total = (total as libc::c_ulong).wrapping_add(dsize) as size_t as size_t; + } + if !((*pw).pw_shell).is_null() { + ssize = (strlen((*pw).pw_shell)).wrapping_add(1 as libc::c_int as libc::c_ulong); + total = (total as libc::c_ulong).wrapping_add(ssize) as size_t as size_t; + } + cp = malloc(total) as *mut libc::c_char; + if cp.is_null() { + return 0 as *mut passwd; + } + newpw = cp as *mut passwd; + memcpy( + newpw as *mut libc::c_void, + pw as *const libc::c_void, + ::core::mem::size_of::() as libc::c_ulong, + ); + cp = cp.offset(::core::mem::size_of::() as libc::c_ulong as isize); + if !((*pw).pw_name).is_null() { + memcpy( + cp as *mut libc::c_void, + (*pw).pw_name as *const libc::c_void, + nsize, + ); + (*newpw).pw_name = cp; + cp = cp.offset(nsize as isize); + } + if !((*pw).pw_passwd).is_null() { + memcpy( + cp as *mut libc::c_void, + (*pw).pw_passwd as *const libc::c_void, + psize, + ); + (*newpw).pw_passwd = cp; + cp = cp.offset(psize as isize); + } + if !((*pw).pw_gecos).is_null() { + memcpy( + cp as *mut libc::c_void, + (*pw).pw_gecos as *const libc::c_void, + gsize, + ); + (*newpw).pw_gecos = cp; + cp = cp.offset(gsize as isize); + } + if !((*pw).pw_dir).is_null() { + memcpy( + cp as *mut libc::c_void, + (*pw).pw_dir as *const libc::c_void, + dsize, + ); + (*newpw).pw_dir = cp; + cp = cp.offset(dsize as isize); + } + if !((*pw).pw_shell).is_null() { + memcpy( + cp as *mut libc::c_void, + (*pw).pw_shell as *const libc::c_void, + ssize, + ); + (*newpw).pw_shell = cp; + cp = cp.offset(ssize as isize); + } + return newpw; +} diff --git a/utsudo-0.0.2/lib/util/src/secure_path.rs b/utsudo-0.0.2/lib/util/src/secure_path.rs new file mode 100644 index 0000000..428c79d --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/secure_path.rs @@ -0,0 +1,279 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + unused_variables +)] + +extern "C" { + fn __xstat( + __ver: libc::c_int, + __filename: *const libc::c_char, + __stat_buf: *mut stat, + ) -> libc::c_int; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; +} + +pub type __dev_t = libc::c_ulong; +pub type __uid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type __ino_t = libc::c_ulong; +pub type __mode_t = libc::c_uint; +pub type __nlink_t = libc::c_ulong; +pub type __off_t = libc::c_long; +pub type __time_t = libc::c_long; +pub type __blksize_t = libc::c_long; +pub type __blkcnt_t = libc::c_long; +pub type __syscall_slong_t = libc::c_long; +pub type gid_t = __gid_t; +pub type uid_t = __uid_t; + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +// #define __S_IFREG 0100000 /* Regular file. */ +#[macro_export] +macro_rules! _S_IFREG { + () => { + 0o100000 + }; +} + +// #define __S_IFDIR 0040000 /* Directory. */ +#[macro_export] +macro_rules! _S_IFDIR { + () => { + 0o40000 + }; +} + +// #define SUDO_PATH_MISSING -1 +#[macro_export] +macro_rules! SUDO_PATH_MISSING { + () => { + -1 + }; +} + +// #define __S_IFMT 0170000 /* These bits determine file type. */ +#[macro_export] +macro_rules! _S_IFMT { + () => { + 0o170000 + }; +} + +// #define SUDO_PATH_BAD_TYPE -2 +#[macro_export] +macro_rules! SUDO_PATH_BAD_TYPE { + () => { + -2 + }; +} + +// #define SUDO_PATH_WRONG_OWNER -3 +#[macro_export] +macro_rules! SUDO_PATH_WRONG_OWNER { + () => { + -3 + }; +} + +// #define SUDO_PATH_WORLD_WRITABLE -4 +#[macro_export] +macro_rules! SUDO_PATH_WORLD_WRITABLE { + () => { + -4 + }; +} + +// #define SUDO_PATH_GROUP_WRITABLE -5 +#[macro_export] +macro_rules! SUDO_PATH_GROUP_WRITABLE { + () => { + -5 + }; +} + +// #define __S_IWRITE 0200 /* Write by owner. */ +// #define S_IWUSR __S_IWRITE /* Write by owner. */ +#[macro_export] +macro_rules! S_IWUSR { + () => { + 0200 + }; +} + +// #define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ +#[macro_export] +macro_rules! S_IWGRP { + () => { + S_IWUSR!() >> 3 + }; +} + +// #define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ +#[macro_export] +macro_rules! S_IWOTH { + () => { + S_IWGRP!() >> 3 + }; +} + +// #define SUDO_PATH_SECURE 0 +macro_rules! SUDO_PATH_SECURE { + () => { + 0 + }; +} + +// #define ISSET(t, f) ((t) & (f)) +#[macro_export] +macro_rules! ISSET { + ($_t:expr, $_f:expr) => { + (($_t) & ($_f)) + }; +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct stat { + pub st_dev: __dev_t, /* Device. */ + pub st_ino: __ino_t, /* File serial number. */ + pub st_nlink: __nlink_t, /* Link count. */ + pub st_mode: __mode_t, /* File mode. */ + pub st_uid: __uid_t, /* User ID of the file's owner. */ + pub st_gid: __gid_t, /* Group ID of the file's group.*/ + pub __pad0: libc::c_int, + pub st_rdev: __dev_t, /* Device number, if device. */ + pub st_size: __off_t, /* Size of file, in bytes. */ + pub st_blksize: __blksize_t, /* Optimal block size for I/O. */ + pub st_blocks: __blkcnt_t, /* Number 512-byte blocks allocated. */ + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + pub st_atim: timespec, /* Time of last access. */ + pub st_mtim: timespec, /* Time of last modification. */ + pub st_ctim: timespec, /* Time of last status change. */ + pub __glibc_reserved: [__syscall_slong_t; 3], +} + +#[inline] +unsafe extern "C" fn stat( + mut __path: *const libc::c_char, + mut __statbuf: *mut stat, +) -> libc::c_int { + return __xstat(1 as libc::c_int, __path, __statbuf); +} + +/* + * Verify that path is the right type and not writable by other users. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_secure_path( + mut path: *const libc::c_char, + mut c_type: libc::c_uint, + mut uid: uid_t, + mut gid: gid_t, + mut sbp: *mut stat, +) -> libc::c_int { + let mut sb: stat = stat { + st_dev: 0, + st_ino: 0, + st_nlink: 0, + st_mode: 0, + st_uid: 0, + st_gid: 0, + __pad0: 0, + st_rdev: 0, + st_size: 0, + st_blksize: 0, + st_blocks: 0, + st_atim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_mtim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_ctim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + __glibc_reserved: [0; 3], + }; + let mut ret: libc::c_int = SUDO_PATH_MISSING!(); + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if (!path.is_null()) && (stat(path, &mut sb) == 0) { + if (sb.st_mode & _S_IFMT!()) != c_type { + ret = SUDO_PATH_BAD_TYPE!(); + } else if uid != -(1 as libc::c_int) as uid_t && sb.st_uid != uid { + ret = SUDO_PATH_WRONG_OWNER!(); + } else if (sb.st_mode & S_IWOTH!()) != 0 { + ret = SUDO_PATH_WORLD_WRITABLE!(); + } else if ISSET!(sb.st_mode, S_IWGRP!()) != 0 + && (gid == -(1 as libc::c_int) as gid_t || sb.st_gid != gid) + { + ret = SUDO_PATH_GROUP_WRITABLE!(); + } else { + ret = SUDO_PATH_SECURE!(); + } + if !sbp.is_null() { + memcpy( + sbp as *mut libc::c_void, + &mut sb as *mut stat as *const libc::c_void, + ::std::mem::size_of::() as libc::c_ulong, + ); + } + } + + debug_return_int!(ret) +} + +/* + * Verify that path is a regular file and not writable by other users. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_secure_file_v1( + mut path: *const libc::c_char, + mut uid: uid_t, + mut gid: gid_t, + mut sbp: *mut stat, +) -> libc::c_int { + return sudo_secure_path(path, _S_IFREG!(), uid, gid, sbp); +} + +/* + * Verify that path is a directory and not writable by other users. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_secure_dir_v1( + mut path: *const libc::c_char, + mut uid: uid_t, + mut gid: gid_t, + mut sbp: *mut stat, +) -> libc::c_int { + return sudo_secure_path(path, _S_IFDIR!(), uid, gid, sbp); +} diff --git a/utsudo-0.0.2/lib/util/src/setgroups.rs b/utsudo-0.0.2/lib/util/src/setgroups.rs new file mode 100644 index 0000000..3508e2d --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/setgroups.rs @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + unused_variables, + non_camel_case_types, + unused_variables, + unused_assignments, + unused_mut +)] + +extern "C" { + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn __errno_location() -> *mut libc::c_int; + fn setgroups(__n: size_t, __groups: *const gid_t) -> libc::c_int; +} + +//func be included +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +pub type gid_t = libc::c_uint; +pub type size_t = libc::c_ulong; + +//define +pub const EINVAL: libc::c_int = 22; +pub const _SC_NGROUPS_MAX: libc::c_int = 3; +pub const NGROUPS_MAX: libc::c_int = 65536; + +//func sudo_setgroups_v1 +#[no_mangle] +unsafe extern "C" fn sudo_setgroups_v1( + mut ngids: libc::c_int, + mut gids: *const gid_t, +) -> libc::c_int { + let mut maxgids: libc::c_int = 0; + let mut ret: libc::c_int = 0; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + //line43 + ret = setgroups(ngids as size_t, gids as *mut gid_t); + + //line44 + if ret == -(1 as libc::c_int) && *__errno_location() == EINVAL as libc::c_int { + //line47 + maxgids = sysconf(_SC_NGROUPS_MAX as libc::c_int) as libc::c_int; + //line48 + if maxgids == -(1 as libc::c_int) { + maxgids = NGROUPS_MAX as libc::c_int; + } + //line50 + if ngids > maxgids { + ret = setgroups(maxgids as size_t, gids as *mut gid_t); + } + } + debug_return_int!(ret) +} diff --git a/utsudo-0.0.2/lib/util/src/sha2.rs b/utsudo-0.0.2/lib/util/src/sha2.rs new file mode 100644 index 0000000..99e54d9 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sha2.rs @@ -0,0 +1,904 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + unused_must_use +)] +extern "C" { + fn memset(__dest: *mut libc::c_void, __ch: libc::c_int, __len: size_t) -> *mut libc::c_void; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn sudo_memset_s(v: *mut libc::c_void, smax: size_t, c: libc::c_int, n: size_t) -> libc::c_int; +} + +pub type __uint64_t = libc::c_ulong; +pub type uint64_t = __uint64_t; +pub type __uint32_t = libc::c_uint; +pub type uint32_t = __uint64_t; +pub type __uint8_t = libc::c_uchar; +pub type uint8_t = __uint8_t; +pub type size_t = libc::c_ulong; +pub const SHA512_BLOCK_LENGTH: usize = 128; +pub const SHA256_BLOCK_LENGTH: libc::c_int = 64; +pub struct SHA2_CTX { + pub state: state, + pub count: [uint64_t; 2], + pub buffer: [uint8_t; SHA512_BLOCK_LENGTH], +} +pub union state { + pub st32: [uint32_t; 8], + pub st64: [uint64_t; 8], +} +macro_rules! BE8TO32 { + ($x:expr,$y:expr) => { + $x = ((*$y.offset(0 as isize) & 255) as uint32_t) << 24 + | ((*$y.offset(1 as isize) & 255) as uint32_t) << 16 + | ((*$y.offset(2 as isize) & 255) as uint32_t) << 8 + | ((*$y.offset(3 as isize) & 255) as uint32_t) + }; +} +macro_rules! BE8TO64 { + ($x:expr,$y:expr) => { + $x = ((*$y.offset(0 as isize) & 255) as uint64_t) << 56 + | ((*$y.offset(1 as isize) & 255) as uint64_t) << 48 + | ((*$y.offset(2 as isize) & 255) as uint64_t) << 40 + | ((*$y.offset(3 as isize) & 255) as uint64_t) << 32 + | ((*$y.offset(4 as isize) & 255) as uint64_t) << 24 + | ((*$y.offset(5 as isize) & 255) as uint64_t) << 16 + | ((*$y.offset(6 as isize) & 255) as uint64_t) << 8 + | ((*$y.offset(7 as isize) & 255) as uint64_t) + }; +} +macro_rules! BE32TO8 { + ($x:expr,$y:expr) => { + *$x.offset(0 as isize) = ($y >> 24 & 255) as uint8_t; + *$x.offset(1 as isize) = ($y >> 16 & 255) as uint8_t; + *$x.offset(2 as isize) = ($y >> 8 & 255) as uint8_t; + *$x.offset(3 as isize) = ($y & 255) as uint8_t; + }; +} +macro_rules! BE64TO8 { + ($x:expr,$y:expr) => { + *$x.offset(0 as isize) = ($y >> 56 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(1 as isize) = ($y >> 48 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(2 as isize) = ($y >> 40 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(3 as isize) = ($y >> 32 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(4 as isize) = ($y >> 24 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(5 as isize) = ($y >> 16 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(6 as isize) = ($y >> 8 & 255 as libc::c_ulong) as uint8_t; + *$x.offset(7 as isize) = ($y & 255 as libc::c_ulong) as uint8_t; + }; +} +macro_rules! BE64TO81 { + ($x:expr,$y:expr) => { + $x[0 as usize] = ($y >> 56 & 255 as libc::c_ulong) as uint8_t; + $x[1 as usize] = ($y >> 48 & 255 as libc::c_ulong) as uint8_t; + $x[2 as usize] = ($y >> 40 & 255 as libc::c_ulong) as uint8_t; + $x[3 as usize] = ($y >> 32 & 255 as libc::c_ulong) as uint8_t; + $x[4 as usize] = ($y >> 24 & 255 as libc::c_ulong) as uint8_t; + $x[5 as usize] = ($y >> 16 & 255 as libc::c_ulong) as uint8_t; + $x[6 as usize] = ($y >> 8 & 255 as libc::c_ulong) as uint8_t; + $x[7 as usize] = ($y & 255 as libc::c_ulong) as uint8_t; + }; +} +macro_rules! blk0 { + ($x:expr) => { + W[$x as usize] + }; +} +macro_rules! blk2 { + ($x:expr) => { + (W[($x & 15) as usize]).wrapping_add( + (s1!(W[($x - 2 & 15) as usize])) + .wrapping_add(W[($x - 7 & 15) as usize]) + .wrapping_add(s0!(W[($x - 15 & 15) as usize])), + ) as uint32_t as uint32_t + }; +} +macro_rules! Ch { + ($x:expr,$y:expr,$z:expr) => { + $z ^ ($x & ($y ^ $z)) + }; +} +macro_rules! Maj { + ($x:expr,$y:expr,$z:expr) => { + $y ^ (($x ^ $y) & ($y ^ $z)) + }; +} +macro_rules! a { + ($x:expr) => { + T[(0 - $x & 7) as usize] + }; +} +macro_rules! b { + ($x:expr) => { + T[(1 - $x & 7) as usize] + }; +} +macro_rules! c { + ($x:expr) => { + T[(2 - $x & 7) as usize] + }; +} +macro_rules! d { + ($x:expr) => { + T[(3 - $x & 7) as usize] + }; +} +macro_rules! e { + ($x:expr) => { + T[(4 - $x & 7) as usize] + }; +} +macro_rules! f { + ($x:expr) => { + T[(5 - $x & 7) as usize] + }; +} +macro_rules! g { + ($x:expr) => { + T[(6 - $x & 7) as usize] + }; +} +macro_rules! h { + ($x:expr) => { + T[(7 - $x & 7) as usize] + }; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA224Init(mut ctx: *mut SHA2_CTX) { + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + (*ctx).state.st32[0] = 0xc1059ed8 as libc::c_ulong as uint32_t; + (*ctx).state.st32[1] = 0x367cd507 as libc::c_ulong as uint32_t; + (*ctx).state.st32[2] = 0x3070dd17 as libc::c_ulong as uint32_t; + (*ctx).state.st32[3] = 0xf70e5939 as libc::c_ulong as uint32_t; + (*ctx).state.st32[4] = 0xffc00b31 as libc::c_ulong as uint32_t; + (*ctx).state.st32[5] = 0x68581511 as libc::c_ulong as uint32_t; + (*ctx).state.st32[6] = 0x64f98fa7 as libc::c_ulong as uint32_t; + (*ctx).state.st32[7] = 0xbefa4fa4 as libc::c_ulong as uint32_t; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA224Transform( + mut state: *mut uint32_t, + mut buffer: *const uint8_t, +) { + sudo_SHA256Transform(state, buffer); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA224Update( + mut ctx: *mut SHA2_CTX, + mut data: *const uint8_t, + mut len: size_t, +) { + sudo_SHA256Update(ctx, data, len); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA224Pad(mut ctx: *mut SHA2_CTX) { + sudo_SHA256Pad(ctx); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA224Final(mut digest: *mut uint8_t, mut ctx: *mut SHA2_CTX) { + sudo_SHA256Pad(ctx); + if !digest.is_null() { + let mut i: libc::c_uint = 0; + i = 0; + while i < 7 as libc::c_uint { + BE32TO8!( + digest.offset(i.wrapping_mul(4 as libc::c_uint) as isize), + (*ctx).state.st32[i as usize] + ); + i = i.wrapping_add(1); + } + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + } +} + +static mut SHA256_K: [uint32_t; 64] = [ + 0x428a2f98 as libc::c_ulong as uint32_t, + 0x71374491 as libc::c_ulong as uint32_t, + 0xb5c0fbcf as libc::c_ulong as uint32_t, + 0xe9b5dba5 as libc::c_ulong as uint32_t, + 0x3956c25b as libc::c_ulong as uint32_t, + 0x59f111f1 as libc::c_ulong as uint32_t, + 0x923f82a4 as libc::c_ulong as uint32_t, + 0xab1c5ed5 as libc::c_ulong as uint32_t, + 0xd807aa98 as libc::c_ulong as uint32_t, + 0x12835b01 as libc::c_ulong as uint32_t, + 0x243185be as libc::c_ulong as uint32_t, + 0x550c7dc3 as libc::c_ulong as uint32_t, + 0x72be5d74 as libc::c_ulong as uint32_t, + 0x80deb1fe as libc::c_ulong as uint32_t, + 0x9bdc06a7 as libc::c_ulong as uint32_t, + 0xc19bf174 as libc::c_ulong as uint32_t, + 0xe49b69c1 as libc::c_ulong as uint32_t, + 0xefbe4786 as libc::c_ulong as uint32_t, + 0xfc19dc6 as libc::c_ulong as uint32_t, + 0x240ca1cc as libc::c_ulong as uint32_t, + 0x2de92c6f as libc::c_ulong as uint32_t, + 0x4a7484aa as libc::c_ulong as uint32_t, + 0x5cb0a9dc as libc::c_ulong as uint32_t, + 0x76f988da as libc::c_ulong as uint32_t, + 0x983e5152 as libc::c_ulong as uint32_t, + 0xa831c66d as libc::c_ulong as uint32_t, + 0xb00327c8 as libc::c_ulong as uint32_t, + 0xbf597fc7 as libc::c_ulong as uint32_t, + 0xc6e00bf3 as libc::c_ulong as uint32_t, + 0xd5a79147 as libc::c_ulong as uint32_t, + 0x6ca6351 as libc::c_ulong as uint32_t, + 0x14292967 as libc::c_ulong as uint32_t, + 0x27b70a85 as libc::c_ulong as uint32_t, + 0x2e1b2138 as libc::c_ulong as uint32_t, + 0x4d2c6dfc as libc::c_ulong as uint32_t, + 0x53380d13 as libc::c_ulong as uint32_t, + 0x650a7354 as libc::c_ulong as uint32_t, + 0x766a0abb as libc::c_ulong as uint32_t, + 0x81c2c92e as libc::c_ulong as uint32_t, + 0x92722c85 as libc::c_ulong as uint32_t, + 0xa2bfe8a1 as libc::c_ulong as uint32_t, + 0xa81a664b as libc::c_ulong as uint32_t, + 0xc24b8b70 as libc::c_ulong as uint32_t, + 0xc76c51a3 as libc::c_ulong as uint32_t, + 0xd192e819 as libc::c_ulong as uint32_t, + 0xd6990624 as libc::c_ulong as uint32_t, + 0xf40e3585 as libc::c_ulong as uint32_t, + 0x106aa070 as libc::c_ulong as uint32_t, + 0x19a4c116 as libc::c_ulong as uint32_t, + 0x1e376c08 as libc::c_ulong as uint32_t, + 0x2748774c as libc::c_ulong as uint32_t, + 0x34b0bcb5 as libc::c_ulong as uint32_t, + 0x391c0cb3 as libc::c_ulong as uint32_t, + 0x4ed8aa4a as libc::c_ulong as uint32_t, + 0x5b9cca4f as libc::c_ulong as uint32_t, + 0x682e6ff3 as libc::c_ulong as uint32_t, + 0x748f82ee as libc::c_ulong as uint32_t, + 0x78a5636f as libc::c_ulong as uint32_t, + 0x84c87814 as libc::c_ulong as uint32_t, + 0x8cc70208 as libc::c_ulong as uint32_t, + 0x90befffa as libc::c_ulong as uint32_t, + 0xa4506ceb as libc::c_ulong as uint32_t, + 0xbef9a3f7 as libc::c_ulong as uint32_t, + 0xc67178f2 as libc::c_ulong as uint32_t, +]; + +macro_rules! rotrFixed { + ($x:expr,$y:expr) => { + if $y != 0 { + $x >> $y + | $x << (std::mem::size_of::() as libc::c_ulong) + .wrapping_mul(8 as libc::c_ulong) + .wrapping_sub($y as libc::c_ulong) + } else { + $x + } + }; +} +macro_rules! S0 { + ($x:expr) => { + (rotrFixed!($x, 2)) ^ (rotrFixed!($x, 13)) ^ (rotrFixed!($x, 22)) + }; +} +macro_rules! S1 { + ($x:expr) => { + (rotrFixed!($x, 6)) ^ (rotrFixed!($x, 11)) ^ (rotrFixed!($x, 25)) + }; +} +macro_rules! s1 { + ($x:expr) => { + (rotrFixed!($x, 17)) ^ (rotrFixed!($x, 19)) ^ $x >> 10 + }; +} +macro_rules! s0 { + ($x:expr) => { + (rotrFixed!($x, 7)) ^ (rotrFixed!($x, 18)) ^ $x >> 3 + }; +} +macro_rules! R { + ($x:expr) => { + h!($x) = (h!($x)).wrapping_add( + (S1!(e!($x))) + .wrapping_add(Ch!(e!($x), f!($x), g!($x))) + .wrapping_add(SHA256_K[($x as libc::c_uint).wrapping_add(j) as usize]) + .wrapping_add((if j != 0 { blk2!($x) } else { blk0!($x) })), + ) as uint32_t as uint32_t; + + d!($x) = (d!($x)).wrapping_add(h!($x)) as uint32_t as uint32_t; + + h!($x) = (h!($x) as libc::c_uint).wrapping_add((S0!(a!($x))).wrapping_add(Maj!( + a!($x), + b!($x), + c!($x) + )) as u32) as uint32_t as uint32_t; + }; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA256Init(mut ctx: *mut SHA2_CTX) { + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + (*ctx).state.st32[0] = 0x6a09e667 as libc::c_ulong as uint32_t; + (*ctx).state.st32[1] = 0xbb67ae85 as libc::c_ulong as uint32_t; + (*ctx).state.st32[2] = 0x3c6ef372 as libc::c_ulong as uint32_t; + (*ctx).state.st32[3] = 0xa54ff53a as libc::c_ulong as uint32_t; + (*ctx).state.st32[4] = 0x510e527f as libc::c_ulong as uint32_t; + (*ctx).state.st32[5] = 0x9b05688c as libc::c_ulong as uint32_t; + (*ctx).state.st32[6] = 0x1f83d9ab as libc::c_ulong as uint32_t; + (*ctx).state.st32[7] = 0x5be0cd19 as libc::c_ulong as uint32_t; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA256Transform(mut state: *mut uint32_t, mut data: *const uint8_t) { + static mut W: [uint32_t; 16] = [0; 16]; + static mut T: [uint32_t; 8] = [0; 8]; + static mut j: libc::c_uint = 0; + + /* Copy context state to working vars. */ + memcpy( + T.as_mut_ptr() as *mut libc::c_void, + state as *const libc::c_void, + std::mem::size_of::<[uint32_t; 8]>() as libc::c_ulong, + ); + while j < 16 { + BE8TO32!(W[j as usize], data); + data = data.offset(4 as isize); + j = j.wrapping_add(1); + } + /* 64 operations, partially loop unrolled. */ + while j < 64 { + R!(0); + R!(1); + R!(2); + R!(3); + R!(4); + R!(5); + R!(6); + R!(7); + R!(8); + R!(9); + R!(10); + R!(11); + R!(12); + R!(13); + R!(14); + R!(15); + j = j.wrapping_add(16); + } + /* Add the working vars back into context state. */ + let ref mut state0 = *state.offset(0 as isize); + *state0 = (*state0 as libc::c_uint).wrapping_add(a!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state1 = *state.offset(0 as isize); + *state1 = (*state1 as libc::c_uint).wrapping_add(b!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state2 = *state.offset(0 as isize); + *state2 = (*state2 as libc::c_uint).wrapping_add(c!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state3 = *state.offset(0 as isize); + *state3 = (*state3 as libc::c_uint).wrapping_add(d!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state4 = *state.offset(0 as isize); + *state4 = (*state4 as libc::c_uint).wrapping_add(e!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state5 = *state.offset(0 as isize); + *state5 = (*state5 as libc::c_uint).wrapping_add(f!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state6 = *state.offset(0 as isize); + *state6 = (*state6 as libc::c_uint).wrapping_add(g!(0) as libc::c_uint) as uint32_t as uint32_t; + let ref mut state7 = *state.offset(0 as isize); + *state7 = (*state7 as libc::c_uint).wrapping_add(h!(0) as libc::c_uint) as uint32_t as uint32_t; + + /* Cleanup */ + sudo_memset_s( + T.as_mut_ptr() as *mut libc::c_void, + std::mem::size_of::<[uint32_t; 8]>() as libc::c_ulong, + 0, + std::mem::size_of::<[uint32_t; 8]>() as libc::c_ulong, + ); + sudo_memset_s( + W.as_mut_ptr() as *mut libc::c_void, + std::mem::size_of::<[uint32_t; 16]>() as libc::c_ulong, + 0, + std::mem::size_of::<[uint32_t; 16]>() as libc::c_ulong, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA256Update( + mut ctx: *mut SHA2_CTX, + mut data: *const uint8_t, + mut len: size_t, +) { + let mut i: size_t = 0; + let mut j: size_t = 0; + j = (*ctx).count[0 as usize] >> 3 & (SHA256_BLOCK_LENGTH - 1) as libc::c_ulong; + let ref mut ctx0 = (*ctx).count[0 as usize]; + *ctx0 = (*ctx0 as libc::c_ulong).wrapping_add(len << 3) as uint64_t as uint64_t; + + if j.wrapping_add(len) > (SHA256_BLOCK_LENGTH - 1) as libc::c_ulong { + i = (SHA256_BLOCK_LENGTH as libc::c_ulong).wrapping_sub(j); + memcpy( + &mut *((*ctx).buffer).as_mut_ptr().offset(j as isize) as *mut uint8_t + as *mut libc::c_void, + data as *const libc::c_void, + i, + ); + sudo_SHA256Transform( + ((*ctx).state.st32).as_mut_ptr(), + ((*ctx).buffer).as_mut_ptr() as *const uint8_t, + ); + while i + .wrapping_add(SHA256_BLOCK_LENGTH as libc::c_ulong) + .wrapping_sub(1 as libc::c_ulong) + < len + { + sudo_SHA256Transform( + ((*ctx).state.st32).as_mut_ptr(), + &*data.offset(i as isize) as *const uint8_t as *mut uint8_t as *const uint8_t, + ); + i = (i as libc::c_ulong).wrapping_add(SHA256_BLOCK_LENGTH as libc::c_ulong) as size_t + as size_t; + } + j = 0; + } + memcpy( + &mut *((*ctx).buffer).as_mut_ptr().offset(j as isize) as *mut uint8_t as *mut libc::c_void, + &*data.offset(i as isize) as *const uint8_t as *const libc::c_void, + len.wrapping_sub(i), + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA256Pad(mut ctx: *mut SHA2_CTX) { + let mut finalcount: [uint8_t; 8] = [0; 8]; + + /* Store unpadded message length in bits in big endian format. */ + BE64TO81!(finalcount, (*ctx).count[0 as usize]); + + /* Append a '1' bit (0x80) to the message. */ + sudo_SHA256Update( + ctx, + b"\x80\0" as *const u8 as *const libc::c_char as *mut uint8_t, + 1 as size_t, + ); + + /* Pad message such that the resulting length modulo 512 is 448. */ + while (*ctx).count[0] & 504 != 448 { + sudo_SHA256Update( + ctx, + b"\0\0" as *const u8 as *const libc::c_char as *mut uint8_t, + 1 as size_t, + ); + } + + /* Append length of message in bits and do final SHA256Transform(). */ + sudo_SHA256Update( + ctx, + finalcount.as_mut_ptr(), + std::mem::size_of::<[uint8_t; 8]>() as libc::c_ulong, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA256Final(mut digest: *mut uint8_t, mut ctx: *mut SHA2_CTX) { + sudo_SHA256Pad(ctx); + if !digest.is_null() { + let mut i: libc::c_uint = 0; + i = 0; + while i < 8 { + BE32TO8!( + digest.offset(i.wrapping_mul(4) as isize), + (*ctx).state.st32[i as usize] + ); + i = i.wrapping_add(1); + } + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + } +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA384Init(mut ctx: *mut SHA2_CTX) { + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + (*ctx).state.st64[0] = 0xcbbb9d5dc1059ed8 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[1] = 0x629a292a367cd507 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[2] = 0x9159015a3070dd17 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[3] = 0x152fecd8f70e5939 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[4] = 0x67332667ffc00b31 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[5] = 0x8eb44a8768581511 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[6] = 0xdb0c2e0d64f98fa7 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[7] = 0x47b5481dbefa4fa4 as libc::c_ulonglong as uint64_t; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA384Transform(mut state: *mut uint64_t, mut data: *const uint8_t) { + sudo_SHA512Transform(state, data); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA384Update( + mut ctx: *mut SHA2_CTX, + mut data: *const uint8_t, + mut len: size_t, +) { + sudo_SHA512Update(ctx, data, len); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA384Pad(mut ctx: *mut SHA2_CTX) { + sudo_SHA512Pad(ctx); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA384Final(mut digest: *mut uint8_t, mut ctx: *mut SHA2_CTX) { + sudo_SHA384Pad(ctx); + if !digest.is_null() { + let mut i: libc::c_uint = 0; + while i < 6 { + BE64TO8!( + digest.offset(i.wrapping_mul(8 as libc::c_uint) as isize), + (*ctx).state.st64[i as usize] + ); + i.wrapping_add(1 as libc::c_uint); + } + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + } +} + +static mut SHA512_K: [uint64_t; 80] = [ + 0x428a2f98d728ae22 as libc::c_ulonglong as uint64_t, + 0x7137449123ef65cd as libc::c_ulonglong as uint64_t, + 0xb5c0fbcfec4d3b2f as libc::c_ulonglong as uint64_t, + 0xe9b5dba58189dbbc as libc::c_ulonglong as uint64_t, + 0x3956c25bf348b538 as libc::c_ulonglong as uint64_t, + 0x59f111f1b605d019 as libc::c_ulonglong as uint64_t, + 0x923f82a4af194f9b as libc::c_ulonglong as uint64_t, + 0xab1c5ed5da6d8118 as libc::c_ulonglong as uint64_t, + 0xd807aa98a3030242 as libc::c_ulonglong as uint64_t, + 0x12835b0145706fbe as libc::c_ulonglong as uint64_t, + 0x243185be4ee4b28c as libc::c_ulonglong as uint64_t, + 0x550c7dc3d5ffb4e2 as libc::c_ulonglong as uint64_t, + 0x72be5d74f27b896f as libc::c_ulonglong as uint64_t, + 0x80deb1fe3b1696b1 as libc::c_ulonglong as uint64_t, + 0x9bdc06a725c71235 as libc::c_ulonglong as uint64_t, + 0xc19bf174cf692694 as libc::c_ulonglong as uint64_t, + 0xe49b69c19ef14ad2 as libc::c_ulonglong as uint64_t, + 0xefbe4786384f25e3 as libc::c_ulonglong as uint64_t, + 0xfc19dc68b8cd5b5 as libc::c_ulonglong as uint64_t, + 0x240ca1cc77ac9c65 as libc::c_ulonglong as uint64_t, + 0x2de92c6f592b0275 as libc::c_ulonglong as uint64_t, + 0x4a7484aa6ea6e483 as libc::c_ulonglong as uint64_t, + 0x5cb0a9dcbd41fbd4 as libc::c_ulonglong as uint64_t, + 0x76f988da831153b5 as libc::c_ulonglong as uint64_t, + 0x983e5152ee66dfab as libc::c_ulonglong as uint64_t, + 0xa831c66d2db43210 as libc::c_ulonglong as uint64_t, + 0xb00327c898fb213f as libc::c_ulonglong as uint64_t, + 0xbf597fc7beef0ee4 as libc::c_ulonglong as uint64_t, + 0xc6e00bf33da88fc2 as libc::c_ulonglong as uint64_t, + 0xd5a79147930aa725 as libc::c_ulonglong as uint64_t, + 0x6ca6351e003826f as libc::c_ulonglong as uint64_t, + 0x142929670a0e6e70 as libc::c_ulonglong as uint64_t, + 0x27b70a8546d22ffc as libc::c_ulonglong as uint64_t, + 0x2e1b21385c26c926 as libc::c_ulonglong as uint64_t, + 0x4d2c6dfc5ac42aed as libc::c_ulonglong as uint64_t, + 0x53380d139d95b3df as libc::c_ulonglong as uint64_t, + 0x650a73548baf63de as libc::c_ulonglong as uint64_t, + 0x766a0abb3c77b2a8 as libc::c_ulonglong as uint64_t, + 0x81c2c92e47edaee6 as libc::c_ulonglong as uint64_t, + 0x92722c851482353b as libc::c_ulonglong as uint64_t, + 0xa2bfe8a14cf10364 as libc::c_ulonglong as uint64_t, + 0xa81a664bbc423001 as libc::c_ulonglong as uint64_t, + 0xc24b8b70d0f89791 as libc::c_ulonglong as uint64_t, + 0xc76c51a30654be30 as libc::c_ulonglong as uint64_t, + 0xd192e819d6ef5218 as libc::c_ulonglong as uint64_t, + 0xd69906245565a910 as libc::c_ulonglong as uint64_t, + 0xf40e35855771202a as libc::c_ulonglong as uint64_t, + 0x106aa07032bbd1b8 as libc::c_ulonglong as uint64_t, + 0x19a4c116b8d2d0c8 as libc::c_ulonglong as uint64_t, + 0x1e376c085141ab53 as libc::c_ulonglong as uint64_t, + 0x2748774cdf8eeb99 as libc::c_ulonglong as uint64_t, + 0x34b0bcb5e19b48a8 as libc::c_ulonglong as uint64_t, + 0x391c0cb3c5c95a63 as libc::c_ulonglong as uint64_t, + 0x4ed8aa4ae3418acb as libc::c_ulonglong as uint64_t, + 0x5b9cca4f7763e373 as libc::c_ulonglong as uint64_t, + 0x682e6ff3d6b2b8a3 as libc::c_ulonglong as uint64_t, + 0x748f82ee5defb2fc as libc::c_ulonglong as uint64_t, + 0x78a5636f43172f60 as libc::c_ulonglong as uint64_t, + 0x84c87814a1f0ab72 as libc::c_ulonglong as uint64_t, + 0x8cc702081a6439ec as libc::c_ulonglong as uint64_t, + 0x90befffa23631e28 as libc::c_ulonglong as uint64_t, + 0xa4506cebde82bde9 as libc::c_ulonglong as uint64_t, + 0xbef9a3f7b2c67915 as libc::c_ulonglong as uint64_t, + 0xc67178f2e372532b as libc::c_ulonglong as uint64_t, + 0xca273eceea26619c as libc::c_ulonglong as uint64_t, + 0xd186b8c721c0c207 as libc::c_ulonglong as uint64_t, + 0xeada7dd6cde0eb1e as libc::c_ulonglong as uint64_t, + 0xf57d4f7fee6ed178 as libc::c_ulonglong as uint64_t, + 0x6f067aa72176fba as libc::c_ulonglong as uint64_t, + 0xa637dc5a2c898a6 as libc::c_ulonglong as uint64_t, + 0x113f9804bef90dae as libc::c_ulonglong as uint64_t, + 0x1b710b35131c471b as libc::c_ulonglong as uint64_t, + 0x28db77f523047d84 as libc::c_ulonglong as uint64_t, + 0x32caab7b40c72493 as libc::c_ulonglong as uint64_t, + 0x3c9ebe0a15c9bebc as libc::c_ulonglong as uint64_t, + 0x431d67c49c100d4c as libc::c_ulonglong as uint64_t, + 0x4cc5d4becb3e42b6 as libc::c_ulonglong as uint64_t, + 0x597f299cfc657e2a as libc::c_ulonglong as uint64_t, + 0x5fcb6fab3ad6faec as libc::c_ulonglong as uint64_t, + 0x6c44198c4a475817 as libc::c_ulonglong as uint64_t, +]; + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA512Init(mut ctx: *mut SHA2_CTX) { + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); + (*ctx).state.st64[0] = 0x6a09e667f3bcc908 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[1] = 0xbb67ae8584caa73b as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[2] = 0x3c6ef372fe94f82b as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[3] = 0xa54ff53a5f1d36f1 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[4] = 0x510e527fade682d1 as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[5] = 0x9b05688c2b3e6c1f as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[6] = 0x1f83d9abfb41bd6b as libc::c_ulonglong as uint64_t; + (*ctx).state.st64[7] = 0x5be0cd19137e2179 as libc::c_ulonglong as uint64_t; +} + +/* Round macros for SHA512 */ +macro_rules! blk2 { + ($x:expr) => { + (W[($x & 15) as usize]).wrapping_add( + (s1!(W[($x - 2 & 15) as usize])) + .wrapping_add(W[($x - 7 & 15) as usize]) + .wrapping_add(s0!(W[($x - 15 & 15) as usize])), + ) as uint64_t as uint64_t + }; +} +macro_rules! rotrFixed { + ($x:expr,$y:expr) => { + if $y != 0 { + $x >> $y + | $x << (std::mem::size_of::() as libc::c_ulong) + .wrapping_mul(8 as libc::c_ulong) + .wrapping_sub($y as libc::c_ulong) + } else { + $x + } + }; +} +macro_rules! S0 { + ($x:expr) => { + (rotrFixed!($x, 28)) ^ (rotrFixed!($x, 34)) ^ (rotrFixed!($x, 39)) + }; +} +macro_rules! S1 { + ($x:expr) => { + (rotrFixed!($x, 14)) ^ (rotrFixed!($x, 18)) ^ (rotrFixed!($x, 41)) + }; +} +macro_rules! s0 { + ($x:expr) => { + (rotrFixed!($x, 1)) ^ (rotrFixed!($x, 8)) ^ $x >> 7 + }; +} +macro_rules! s1 { + ($x:expr) => { + (rotrFixed!($x, 19)) ^ (rotrFixed!($x, 61)) ^ $x >> 6 + }; +} +macro_rules! R { + ($x:expr) => { + h!($x) = (h!($x) as libc::c_ulong).wrapping_add( + (S1!(e!($x))) + .wrapping_add(Ch!(e!($x), f!($x), g!($x))) + .wrapping_add(SHA512_K[($x as libc::c_uint).wrapping_add(j) as usize]) + .wrapping_add((if j != 0 { blk2!($x) } else { blk0!($x) })), + ) as uint64_t as uint64_t; + d!($x) = (d!($x) as libc::c_ulong).wrapping_add(h!($x)) as uint64_t as uint64_t; + h!($x) = (h!($x) as libc::c_ulong).wrapping_add((S0!(a!($x))).wrapping_add(Maj!( + a!($x), + b!($x), + c!($x) + ))) as uint64_t as uint64_t; + }; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA512Transform(mut state: *mut uint64_t, mut data: *const uint8_t) { + static mut W: [uint64_t; 16] = [0; 16]; + static mut T: [uint64_t; 8] = [0; 8]; + static mut j: libc::c_uint = 0; + memcpy( + T.as_mut_ptr() as *mut libc::c_void, + state as *const libc::c_void, + std::mem::size_of::<[uint64_t; 8]>() as libc::c_ulong, + ); + while j < 16 { + BE8TO64!(W[j as usize], data); + data = data.offset(8 as isize); + j = j.wrapping_add(1); + } + + /* 80 operations, partially loop unrolled. */ + while j < 80 { + R!(0); + R!(1); + R!(2); + R!(3); + R!(4); + R!(5); + R!(6); + R!(7); + R!(8); + R!(9); + R!(10); + R!(11); + R!(12); + R!(13); + R!(14); + R!(15); + j = j.wrapping_add(16 as libc::c_uint); + } + + /* Add the working vars back into context state. */ + let ref mut state0 = *state.offset(0 as isize); + *state0 = (*state0 as libc::c_uint).wrapping_add(a!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state1 = *state.offset(0 as isize); + *state1 = (*state1 as libc::c_uint).wrapping_add(b!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state2 = *state.offset(0 as isize); + *state2 = (*state2 as libc::c_uint).wrapping_add(c!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state3 = *state.offset(0 as isize); + *state3 = (*state3 as libc::c_uint).wrapping_add(d!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state4 = *state.offset(0 as isize); + *state4 = (*state4 as libc::c_uint).wrapping_add(e!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state5 = *state.offset(0 as isize); + *state5 = (*state5 as libc::c_uint).wrapping_add(f!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state6 = *state.offset(0 as isize); + *state6 = (*state6 as libc::c_uint).wrapping_add(g!(0) as libc::c_uint) as uint64_t as uint64_t; + let ref mut state7 = *state.offset(0 as isize); + *state7 = (*state7 as libc::c_uint).wrapping_add(h!(0) as libc::c_uint) as uint64_t as uint64_t; + + /* Cleanup. */ + sudo_memset_s( + T.as_mut_ptr() as *mut libc::c_void, + std::mem::size_of::<[uint64_t; 8]>() as libc::c_ulong, + 0, + std::mem::size_of::<[uint64_t; 8]>() as libc::c_ulong, + ); + sudo_memset_s( + W.as_mut_ptr() as *mut libc::c_void, + std::mem::size_of::<[uint64_t; 16]>() as libc::c_ulong, + 0, + std::mem::size_of::<[uint64_t; 16]>() as libc::c_ulong, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA512Update( + mut ctx: *mut SHA2_CTX, + mut data: *const uint8_t, + mut len: size_t, +) { + let mut i: size_t = 0 as size_t; + let mut j: size_t = 0; + j = (*ctx).count[0 as usize] >> 3 & (SHA512_BLOCK_LENGTH - 1) as libc::c_ulong; + + let ref mut ctx1 = (*ctx).count[0 as usize]; + *ctx1 = (*ctx1 as libc::c_ulong).wrapping_add(len << 3) as uint64_t as uint64_t; + + if (*ctx).count[0 as usize] < len << 3 { + let ref mut ctx2 = (*ctx).count[1 as usize]; + *ctx2 = (*ctx2).wrapping_add(1); + } + if j.wrapping_add(len) > (SHA512_BLOCK_LENGTH - 1) as libc::c_ulong { + i = (SHA512_BLOCK_LENGTH as libc::c_ulong).wrapping_sub(j); + memcpy( + &mut *((*ctx).buffer).as_mut_ptr().offset(j as isize) as *mut uint8_t + as *mut libc::c_void, + data as *const libc::c_void, + i, + ); + sudo_SHA512Transform( + ((*ctx).state.st64).as_mut_ptr(), + ((*ctx).buffer).as_mut_ptr() as *const uint8_t, + ); + while i + .wrapping_add(SHA512_BLOCK_LENGTH as libc::c_ulong) + .wrapping_sub(1 as libc::c_ulong) + < len + { + sudo_SHA512Transform( + ((*ctx).state.st64).as_mut_ptr(), + &*data.offset(i as isize) as *const uint8_t as *mut uint8_t as *const uint8_t, + ); + i = (i as libc::c_ulong).wrapping_add(SHA512_BLOCK_LENGTH as libc::c_ulong) as size_t + as size_t; + } + j = 0 as size_t; + } + memcpy( + &mut *((*ctx).buffer).as_mut_ptr().offset(j as isize) as *mut uint8_t as *mut libc::c_void, + &*data.offset(i as isize) as *const uint8_t as *const libc::c_void, + len.wrapping_sub(i), + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA512Pad(mut ctx: *mut SHA2_CTX) { + let mut finalcount: [uint8_t; 16] = [0; 16]; + + BE64TO81!(finalcount, (*ctx).count[1 as usize]); + BE64TO8!( + finalcount.as_mut_ptr().offset(8 as isize), + (*ctx).count[1 as usize] + ); + + /* Append a '1' bit (0x80) to the message. */ + sudo_SHA512Update( + ctx, + b"\x80\0" as *const u8 as *const libc::c_char as *mut uint8_t, + 1 as size_t, + ); + + /* Pad message such that the resulting length modulo 1024 is 896. */ + while (*ctx).count[0 as usize] & 1008 != 896 { + sudo_SHA512Update( + ctx, + b"\0\0" as *const u8 as *const libc::c_char as *mut uint8_t, + 1 as size_t, + ); + } + sudo_SHA512Update( + ctx, + finalcount.as_mut_ptr(), + std::mem::size_of::<[uint8_t; 16]>() as libc::c_ulong, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_SHA512Final(mut digest: *mut uint8_t, mut ctx: *mut SHA2_CTX) { + sudo_SHA512Pad(ctx); + if !digest.is_null() { + let mut i: libc::c_uint = 0; + while i < 8 { + BE64TO8!( + digest.offset(i.wrapping_mul(8 as libc::c_uint) as isize), + (*ctx).state.st64[i as usize] + ); + i = i.wrapping_add(1); + } + } + memset( + ctx as *mut libc::c_void, + 0, + std::mem::size_of::() as libc::c_ulong, + ); +} diff --git a/utsudo-0.0.2/lib/util/src/sig2str.rs b/utsudo-0.0.2/lib/util/src/sig2str.rs new file mode 100644 index 0000000..be45208 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sig2str.rs @@ -0,0 +1,287 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::EINVAL; + +// #define SIGRTMIN (__libc_current_sigrtmin ()) +#[macro_export] +macro_rules! SIGRTMIN { + () => { + (__libc_current_sigrtmin()) + }; +} + +// #define SIGRTMAX (__libc_current_sigrtmax ()) +#[macro_export] +macro_rules! SIGRTMAX { + () => { + (__libc_current_sigrtmax()) + }; +} + +// # define SIG2STR_MAX 32 +#[macro_export] +macro_rules! SIG2STR_MAX { + () => { + 32 + }; +} + +/* Biggest signal number + 1 (including real-time signals). */ +// #define _NSIG (__SIGRTMAX + 1) +#[macro_export] +macro_rules! NSIG { + () => { + (SIGRTMAX!() + 1) + }; +} + +pub type size_t = libc::c_ulong; +pub const _SC_RTSIG_MAX: libc::c_uint = 31; +pub type __int32_t = libc::c_int; +pub const _ISlower: libc::c_uint = 512; + +extern "C" { + fn __errno_location() -> *mut libc::c_int; + fn __libc_current_sigrtmin() -> libc::c_int; + fn __libc_current_sigrtmax() -> libc::c_int; + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn snprintf( + _: *mut libc::c_char, + _: libc::c_ulong, + _: *const libc::c_char, + _: ... + ) -> libc::c_int; + fn sudo_strlcpy(dst: *mut libc::c_char, src: *const libc::c_char, siz: size_t) -> size_t; + fn __ctype_toupper_loc() -> *mut *const __int32_t; + fn __ctype_b_loc() -> *mut *const libc::c_ushort; +} + +#[inline] +unsafe extern "C" fn toupper(mut __c: libc::c_int) -> libc::c_int { + return if __c >= -(128 as libc::c_int) && __c < 256 as libc::c_int { + *(*__ctype_toupper_loc()).offset(__c as isize) + } else { + __c + }; +} + +/* + * Translate signal number to name. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_sig2str( + signo: libc::c_int, + signame: *mut libc::c_char, +) -> libc::c_int { + static mut sudo_sys_signame: [*mut libc::c_char; 65] = + [0 as *const libc::c_char as *mut libc::c_char; 65]; + let mut i: libc::c_int = 0; + sudo_sys_signame[0 as libc::c_int as usize] = + b"Signal 0\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + if (sudo_sys_signame[1 as libc::c_int as usize]).is_null() { + sudo_sys_signame[1 as libc::c_int as usize] = + b"HUP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[2 as libc::c_int as usize]).is_null() { + sudo_sys_signame[2 as libc::c_int as usize] = + b"INT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[3 as libc::c_int as usize]).is_null() { + sudo_sys_signame[3 as libc::c_int as usize] = + b"QUIT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[4 as libc::c_int as usize]).is_null() { + sudo_sys_signame[4 as libc::c_int as usize] = + b"ILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[5 as libc::c_int as usize]).is_null() { + sudo_sys_signame[5 as libc::c_int as usize] = + b"TRAP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { + sudo_sys_signame[6 as libc::c_int as usize] = + b"ABRT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { + sudo_sys_signame[6 as libc::c_int as usize] = + b"IOT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[8 as libc::c_int as usize]).is_null() { + sudo_sys_signame[8 as libc::c_int as usize] = + b"FPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[9 as libc::c_int as usize]).is_null() { + sudo_sys_signame[9 as libc::c_int as usize] = + b"KILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[7 as libc::c_int as usize]).is_null() { + sudo_sys_signame[7 as libc::c_int as usize] = + b"BUS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[11 as libc::c_int as usize]).is_null() { + sudo_sys_signame[11 as libc::c_int as usize] = + b"SEGV\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[31 as libc::c_int as usize]).is_null() { + sudo_sys_signame[31 as libc::c_int as usize] = + b"SYS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[13 as libc::c_int as usize]).is_null() { + sudo_sys_signame[13 as libc::c_int as usize] = + b"PIPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[14 as libc::c_int as usize]).is_null() { + sudo_sys_signame[14 as libc::c_int as usize] = + b"ALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[15 as libc::c_int as usize]).is_null() { + sudo_sys_signame[15 as libc::c_int as usize] = + b"TERM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[16 as libc::c_int as usize]).is_null() { + sudo_sys_signame[16 as libc::c_int as usize] = + b"STKFLT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { + sudo_sys_signame[29 as libc::c_int as usize] = + b"IO\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[24 as libc::c_int as usize]).is_null() { + sudo_sys_signame[24 as libc::c_int as usize] = + b"XCPU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[25 as libc::c_int as usize]).is_null() { + sudo_sys_signame[25 as libc::c_int as usize] = + b"XFSZ\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[26 as libc::c_int as usize]).is_null() { + sudo_sys_signame[26 as libc::c_int as usize] = + b"VTALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[27 as libc::c_int as usize]).is_null() { + sudo_sys_signame[27 as libc::c_int as usize] = + b"PROF\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[28 as libc::c_int as usize]).is_null() { + sudo_sys_signame[28 as libc::c_int as usize] = + b"WINCH\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[10 as libc::c_int as usize]).is_null() { + sudo_sys_signame[10 as libc::c_int as usize] = + b"USR1\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[12 as libc::c_int as usize]).is_null() { + sudo_sys_signame[12 as libc::c_int as usize] = + b"USR2\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[30 as libc::c_int as usize]).is_null() { + sudo_sys_signame[30 as libc::c_int as usize] = + b"PWR\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { + sudo_sys_signame[29 as libc::c_int as usize] = + b"POLL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[19 as libc::c_int as usize]).is_null() { + sudo_sys_signame[19 as libc::c_int as usize] = + b"STOP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[20 as libc::c_int as usize]).is_null() { + sudo_sys_signame[20 as libc::c_int as usize] = + b"TSTP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[18 as libc::c_int as usize]).is_null() { + sudo_sys_signame[18 as libc::c_int as usize] = + b"CONT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { + sudo_sys_signame[17 as libc::c_int as usize] = + b"CHLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { + sudo_sys_signame[17 as libc::c_int as usize] = + b"CLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[21 as libc::c_int as usize]).is_null() { + sudo_sys_signame[21 as libc::c_int as usize] = + b"TTIN\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[22 as libc::c_int as usize]).is_null() { + sudo_sys_signame[22 as libc::c_int as usize] = + b"TTOU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[23 as libc::c_int as usize]).is_null() { + sudo_sys_signame[23 as libc::c_int as usize] = + b"URG\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + /* Realtime signal support. */ + if signo >= SIGRTMIN!() && signo <= SIGRTMAX!() { + let rtmax: libc::c_long = sysconf(_SC_RTSIG_MAX as libc::c_int); + if rtmax > 0 { + if signo == SIGRTMIN!() { + sudo_strlcpy( + signame, + b"RTMIN\0" as *const u8 as *const libc::c_char, + SIG2STR_MAX!(), + ); + } else if signo == SIGRTMAX!() { + sudo_strlcpy( + signame, + b"RTMAX\0" as *const u8 as *const libc::c_char, + SIG2STR_MAX!(), + ); + } else if signo as libc::c_long + <= (SIGRTMIN!() as libc::c_long + (rtmax / 2) - 1) as libc::c_long + { + snprintf( + signame, + SIG2STR_MAX!(), + b"RTMIN+%d\0" as *const u8 as *const libc::c_char, + signo - SIGRTMIN!(), + ); + } else { + snprintf( + signame, + SIG2STR_MAX!(), + b"RTMAX-%d\0" as *const u8 as *const libc::c_char, + SIGRTMAX!() - signo, + ); + } + } + return 0; + } + + if signo > 0 && signo < NSIG!() && !(sudo_sys_signame[signo as usize]).is_null() { + sudo_strlcpy(signame, sudo_sys_signame[signo as usize], SIG2STR_MAX!()); + + /* Make sure we always return an upper case signame. */ + if *(*__ctype_b_loc()).offset(*signame.offset(0 as isize) as isize) as libc::c_int + & _ISlower as libc::c_int as libc::c_ushort as libc::c_int + != 0 + { + let mut i: libc::c_int = 0; + while *signame.offset(i as isize) as libc::c_int != '\u{0}' as i32 { + *signame.offset(i as isize) = + toupper((*signame.offset(i as isize)).into()) as libc::c_char; + i += 1; + } + } + return 0 as libc::c_int; + } + *__errno_location() = EINVAL!(); + return -(1 as libc::c_int); +} diff --git a/utsudo-0.0.2/lib/util/src/str2sig.rs b/utsudo-0.0.2/lib/util/src/str2sig.rs new file mode 100644 index 0000000..00989e8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/str2sig.rs @@ -0,0 +1,341 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + non_camel_case_types, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::EINVAL; +use crate::SIGRTMAX; +use crate::SIGRTMIN; + +extern "C" { + fn __ctype_b_loc() -> *mut *const libc::c_ushort; + fn sudo_strtonum( + _: *const libc::c_char, + _: libc::c_longlong, + _: libc::c_longlong, + _: *mut *const libc::c_char, + ) -> libc::c_longlong; + fn strncmp( + __s1: *const libc::c_char, + __s2: *const libc::c_char, + __n: libc::c_ulong, + ) -> libc::c_int; + fn __libc_current_sigrtmin() -> libc::c_int; + fn __libc_current_sigrtmax() -> libc::c_int; + fn strcmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn sysconf(__name: libc::c_int) -> libc::c_long; + fn strcasecmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn __errno_location() -> *mut libc::c_int; +} + +pub struct sigalias { + pub name: *const libc::c_char, + pub number: libc::c_int, +} +static mut sigaliases: [sigalias; 6] = [ + { + let mut sigabrt = sigalias { + name: b"ABRT\0" as *const u8 as *const libc::c_char, + number: SIGABRT, + }; + sigabrt + }, + { + let mut sigcld = sigalias { + name: b"CLD\0" as *const u8 as *const libc::c_char, + number: SIGCLD, + }; + sigcld + }, + { + let mut sigio = sigalias { + name: b"IO\0" as *const u8 as *const libc::c_char, + number: SIGIO, + }; + sigio + }, + { + let mut sigiot = sigalias { + name: b"IOT\0" as *const u8 as *const libc::c_char, + number: SIGIOT, + }; + sigiot + }, + { + let mut sigpoll = sigalias { + name: b"POLL\0" as *const u8 as *const libc::c_char, + number: SIGPOLL, + }; + sigpoll + }, + { + let mut init = sigalias { + name: 0 as *const libc::c_char, + number: -1, + }; + init + }, +]; + +pub const SIGABRT: libc::c_int = 6; +pub const SIGCLD: libc::c_int = 17; +pub const SIGIO: libc::c_int = 29; +pub const SIGIOT: libc::c_int = 6; +pub const SIGPOLL: libc::c_int = 29; +pub const _ISdigit: libc::c_uint = 2048; +pub const __SIGRTMIN: libc::c_uint = 64; +pub const NSIG: libc::c_uint = __SIGRTMIN + 1; +pub const _SC_RTSIG_MAX: libc::c_int = 31; + +#[no_mangle] +pub unsafe extern "C" fn sudo_str2sig( + mut signame: *const libc::c_char, + mut result: *mut libc::c_int, +) -> libc::c_int { + let mut alias: *mut sigalias = 0 as *mut sigalias; + let mut errstr: *const libc::c_char = 0 as *const libc::c_char; + let mut signo: libc::c_int = 0; + + static mut sudo_sys_signame: [*mut libc::c_char; 65] = + [0 as *const libc::c_char as *mut libc::c_char; 65]; + let mut i: libc::c_int = 0; + sudo_sys_signame[0 as libc::c_int as usize] = + b"Signal 0\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + if (sudo_sys_signame[1 as libc::c_int as usize]).is_null() { + sudo_sys_signame[1 as libc::c_int as usize] = + b"HUP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[2 as libc::c_int as usize]).is_null() { + sudo_sys_signame[2 as libc::c_int as usize] = + b"INT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[3 as libc::c_int as usize]).is_null() { + sudo_sys_signame[3 as libc::c_int as usize] = + b"QUIT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[4 as libc::c_int as usize]).is_null() { + sudo_sys_signame[4 as libc::c_int as usize] = + b"ILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[5 as libc::c_int as usize]).is_null() { + sudo_sys_signame[5 as libc::c_int as usize] = + b"TRAP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { + sudo_sys_signame[6 as libc::c_int as usize] = + b"ABRT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[6 as libc::c_int as usize]).is_null() { + sudo_sys_signame[6 as libc::c_int as usize] = + b"IOT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[8 as libc::c_int as usize]).is_null() { + sudo_sys_signame[8 as libc::c_int as usize] = + b"FPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[9 as libc::c_int as usize]).is_null() { + sudo_sys_signame[9 as libc::c_int as usize] = + b"KILL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[7 as libc::c_int as usize]).is_null() { + sudo_sys_signame[7 as libc::c_int as usize] = + b"BUS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[11 as libc::c_int as usize]).is_null() { + sudo_sys_signame[11 as libc::c_int as usize] = + b"SEGV\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[31 as libc::c_int as usize]).is_null() { + sudo_sys_signame[31 as libc::c_int as usize] = + b"SYS\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[13 as libc::c_int as usize]).is_null() { + sudo_sys_signame[13 as libc::c_int as usize] = + b"PIPE\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[14 as libc::c_int as usize]).is_null() { + sudo_sys_signame[14 as libc::c_int as usize] = + b"ALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[15 as libc::c_int as usize]).is_null() { + sudo_sys_signame[15 as libc::c_int as usize] = + b"TERM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[16 as libc::c_int as usize]).is_null() { + sudo_sys_signame[16 as libc::c_int as usize] = + b"STKFLT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { + sudo_sys_signame[29 as libc::c_int as usize] = + b"IO\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[24 as libc::c_int as usize]).is_null() { + sudo_sys_signame[24 as libc::c_int as usize] = + b"XCPU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[25 as libc::c_int as usize]).is_null() { + sudo_sys_signame[25 as libc::c_int as usize] = + b"XFSZ\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[26 as libc::c_int as usize]).is_null() { + sudo_sys_signame[26 as libc::c_int as usize] = + b"VTALRM\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[27 as libc::c_int as usize]).is_null() { + sudo_sys_signame[27 as libc::c_int as usize] = + b"PROF\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[28 as libc::c_int as usize]).is_null() { + sudo_sys_signame[28 as libc::c_int as usize] = + b"WINCH\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[10 as libc::c_int as usize]).is_null() { + sudo_sys_signame[10 as libc::c_int as usize] = + b"USR1\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[12 as libc::c_int as usize]).is_null() { + sudo_sys_signame[12 as libc::c_int as usize] = + b"USR2\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[30 as libc::c_int as usize]).is_null() { + sudo_sys_signame[30 as libc::c_int as usize] = + b"PWR\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[29 as libc::c_int as usize]).is_null() { + sudo_sys_signame[29 as libc::c_int as usize] = + b"POLL\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[19 as libc::c_int as usize]).is_null() { + sudo_sys_signame[19 as libc::c_int as usize] = + b"STOP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[20 as libc::c_int as usize]).is_null() { + sudo_sys_signame[20 as libc::c_int as usize] = + b"TSTP\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[18 as libc::c_int as usize]).is_null() { + sudo_sys_signame[18 as libc::c_int as usize] = + b"CONT\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { + sudo_sys_signame[17 as libc::c_int as usize] = + b"CHLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[17 as libc::c_int as usize]).is_null() { + sudo_sys_signame[17 as libc::c_int as usize] = + b"CLD\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[21 as libc::c_int as usize]).is_null() { + sudo_sys_signame[21 as libc::c_int as usize] = + b"TTIN\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[22 as libc::c_int as usize]).is_null() { + sudo_sys_signame[22 as libc::c_int as usize] = + b"TTOU\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + if (sudo_sys_signame[23 as libc::c_int as usize]).is_null() { + sudo_sys_signame[23 as libc::c_int as usize] = + b"URG\0" as *const u8 as *const libc::c_char as *mut libc::c_char; + } + + if (*(*__ctype_b_loc()).offset(*signame.offset(0 as isize) as libc::c_uchar as isize) + as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int) + != 0 + { + signo = sudo_strtonum( + signame, + 0 as libc::c_longlong, + (NSIG - 1) as libc::c_longlong, + &mut errstr, + ) as libc::c_int; + if !errstr.is_null() { + return -1; + } + *result = signo; + return 0; + } + if strncmp( + signame, + b"RTMIN\0" as *const u8 as *const libc::c_char, + 5 as libc::c_ulong, + ) == 0 + { + if *signame.offset(5 as isize) as libc::c_int == '\u{0}' as i32 { + *result = SIGRTMIN!(); + return 0; + } + if *signame.offset(5 as isize) as libc::c_int == '+' as i32 { + if (*(*__ctype_b_loc()).offset(*signame.offset(6 as isize) as libc::c_uchar as isize) + as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int) + != 0 + { + let rtmax: libc::c_long = sysconf(_SC_RTSIG_MAX); + let off: libc::c_int = *signame.offset(6 as isize) as libc::c_int - '0' as i32; + + if rtmax > 0 as libc::c_long && (off as libc::c_long) < (rtmax / 2 as libc::c_long) + { + *result = SIGRTMIN!() + off; + return 0; + } + } + } + } + if strncmp( + signame, + b"RTMAX\0" as *const u8 as *const libc::c_char, + 5 as libc::c_ulong, + ) == 0 + { + if *signame.offset(5 as isize) as libc::c_int == '\u{0}' as i32 { + *result = SIGRTMAX!(); + return 0; + } + if *signame.offset(5 as isize) as libc::c_int == '-' as i32 { + if (*(*__ctype_b_loc()).offset(*signame.offset(6 as isize) as libc::c_uchar as isize) + as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int) + != 0 + { + let rtmax: libc::c_long = sysconf(_SC_RTSIG_MAX); + let off: libc::c_int = *signame.offset(6 as isize) as libc::c_int - '0' as i32; + if rtmax > 0 as libc::c_long && (off as libc::c_long) < (rtmax / 2 as libc::c_long) + { + *result = SIGRTMAX!() - off; + return 0; + } + } + } + } + + alias = sigaliases.as_mut_ptr(); + while !((*alias).name).is_null() { + if strcmp(signame, (*alias).name) == 0 { + *result = (*alias).number; + return 0; + } + alias = alias.offset(1); + } + + signo = 1; + while signo < NSIG as libc::c_int { + if !(sudo_sys_signame[signo as usize]).is_null() { + if strcasecmp(signame, sudo_sys_signame[signo as usize]) == 0 { + *result = signo; + return 0; + } + } + signo += 1; + } + *__errno_location() = EINVAL!(); + return -1; +} diff --git a/utsudo-0.0.2/lib/util/src/strlcat.rs b/utsudo-0.0.2/lib/util/src/strlcat.rs new file mode 100644 index 0000000..b995e1f --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strlcat.rs @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +pub type size_t = libc::c_ulong; + +extern "C" { + fn strlen(__s: *const libc::c_char) -> size_t; +} + +/* + * Appends src to string dst of size dsize (unlike strncat, dsize is the + * full size of dst, not space left). At most dsize-1 characters + * will be copied. Always NUL terminates (unless dsize <= strlen(dst)). + * Returns strlen(src) + MIN(dsize, strlen(initial dst)). + * If retval >= dsize, truncation occurred. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_strlcat( + mut dst: *mut libc::c_char, + mut src: *const libc::c_char, + mut dsize: size_t, +) -> size_t { + let mut odst: *const libc::c_char = dst; + let mut osrc: *const libc::c_char = src; + let mut n: size_t = dsize; + let mut dlen: size_t = 0; + + /* Find the end of dst and adjust bytes left but don't go past end. */ + while n != 0 && *dst as libc::c_int != '\u{0}' as i32 { + dst = dst.offset(1); + n = n.wrapping_sub(1); // n-- + } + + // dlen = *dst - *odst; + dlen = dst.offset_from(odst) as size_t; + n = dsize.wrapping_sub(dlen); //dsize - dlen + + n -= 1; + if n == 0 { + return dlen + strlen(src); + } + + while *src as libc::c_int != '\u{0}' as i32 { + if n != 0 { + *dst = *src; + dst = dst.offset(1); + n -= 1; + } + src = src.offset(1); + } + *dst = '\u{0}' as libc::c_char; + + return dlen.wrapping_add(src.offset_from(osrc) as libc::c_ulong); /* count does not include NUL */ +} diff --git a/utsudo-0.0.2/lib/util/src/strlcpy.rs b/utsudo-0.0.2/lib/util/src/strlcpy.rs new file mode 100644 index 0000000..b7e05e0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strlcpy.rs @@ -0,0 +1,57 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(non_camel_case_types, dead_code, unused_mut, unused_variables)] +pub type size_t = libc::c_ulong; + +#[no_mangle] +fn sudo_strlcpy( + mut dst: *mut libc::c_char, + mut src: *const libc::c_char, + mut dsize: size_t, +) -> size_t { + let mut osrc: *const libc::c_char = src; + let mut nleft: size_t = dsize; + + if nleft != 0 as libc::c_int as libc::c_ulong { + unsafe { + loop { + nleft = nleft.wrapping_sub(1); + if !(nleft != 0 as libc::c_int as libc::c_ulong) { + break; + } + let fresh0 = src; + src = src.offset(1); + let fresh1 = dst; + dst = dst.offset(1); + *fresh1 = *fresh0; + + if *fresh1 as libc::c_int == '\u{0}' as i32 { + break; + } + } + } + } + + if nleft == 0 as libc::c_int as libc::c_ulong { + unsafe { + if dsize != 0 as libc::c_int as libc::c_ulong { + *dst = '\u{0}' as libc::c_char; + } + loop { + let fresh2 = src; + src = src.offset(1); + if !(*fresh2 != 0) { + break; + } + } + } + } + + unsafe { + return (src.offset_from(osrc) as libc::c_long - 1 as libc::c_long) as size_t; + } +} diff --git a/utsudo-0.0.2/lib/util/src/strsplit.rs b/utsudo-0.0.2/lib/util/src/strsplit.rs new file mode 100644 index 0000000..63871a0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strsplit.rs @@ -0,0 +1,76 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow(unused_variables, unused_mut, unused_assignments)] + +//use other file's func +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_ptr_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +//line42 +#[no_mangle] +unsafe fn sudo_strsplit_v1( + mut str: *const libc::c_char, + mut endstr: *const libc::c_char, + mut sep: *const libc::c_char, + mut last: *mut *const libc::c_char, +) -> *const libc::c_char { + //line 44 + let mut cp: *const libc::c_char = 0 as *const libc::c_char; + let mut s: *const libc::c_char = 0 as *const libc::c_char; + + //line45 + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + //line 48 + if str.is_null() { + str = *last; + } + + //line 52 + while str < endstr { + s = sep; + while *s as libc::c_int != '\u{0}' as i32 { + if *str as libc::c_int == *s as libc::c_int { + str = str.offset(1); + break; + } else { + s = s.offset(1); + } + } + //line 59 + if *s as libc::c_int == '\u{0}' as i32 { + break; + } + } + + //line 64 + if str >= endstr { + *last = endstr; + debug_return_ptr!(0 as *const libc::c_char) + } + + //line70 + cp = str; + while cp < endstr { + s = sep; + while *s as libc::c_int != '\u{0}' as i32 { + if *cp as libc::c_int == *s as libc::c_int { + break; + } + s = s.offset(1); + } + if *s as libc::c_int != '\u{0}' as i32 { + break; + } + cp = cp.offset(1); + } + + //line 78 + *last = cp; + debug_return_const_ptr!(str) +} diff --git a/utsudo-0.0.2/lib/util/src/strtobool.rs b/utsudo-0.0.2/lib/util/src/strtobool.rs new file mode 100644 index 0000000..30efdf4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strtobool.rs @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + mutable_transmutes, + non_camel_case_types, + unused_assignments, + unused_mut +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +// use crate::sudo_debug::sudo_debug_printf2_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +extern "C" { + fn strcasecmp(__s1: *const libc::c_char, __s2: *const libc::c_char) -> libc::c_int; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_strtobool_v1(mut str: *const libc::c_char) -> libc::c_int { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + match *str as u8 as char { + '0' | '1' => { + if *str.offset(1 as isize) as libc::c_int == '\u{0}' as i32 { + debug_return_int!(*str as libc::c_int - '0' as i32); + } + } + 'y' | 'Y' => { + if strcasecmp(str, b"yes\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(1); + } + } + 't' | 'T' => { + if strcasecmp(str, b"true\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(1); + } + } + 'o' | 'O' => { + if strcasecmp(str, b"on\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(1); + } + if strcasecmp(str, b"off\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(0); + } + } + 'n' | 'N' => { + if strcasecmp(str, b"no\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(0); + } + } + 'f' | 'F' => { + if strcasecmp(str, b"false\0" as *const u8 as *const libc::c_char) == 0 { + debug_return_int!(0); + } + } + _ => {} + } + + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"invalid boolean value \"%s\"\0" as *const u8 as *const libc::c_char, + str + ); + debug_return_int!(-1); +} diff --git a/utsudo-0.0.2/lib/util/src/strtoid.rs b/utsudo-0.0.2/lib/util/src/strtoid.rs new file mode 100644 index 0000000..02bfbb1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strtoid.rs @@ -0,0 +1,155 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +type id_t = u32; +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_id_t_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; +use crate::INT_MAX; + +// #define INT_MIN (-__INT_MAX__ - 1) +#[macro_export] +macro_rules! INT_MIN { + () => { + (-(INT_MAX!()) - 1) + }; +} + +// #define UINT_MAX (__INT_MAX__ * 2U + 1U) +#[macro_export] +macro_rules! UINT_MAX { + () => { + ((INT_MAX!()) * (2 as libc::c_uint) + 1 as libc::c_uint) + }; +} + +// #define EINVAL 22 /* Invalid argument */ +#[macro_export] +macro_rules! EINVAL { + () => { + 22 + }; +} + +extern "C" { + fn sudo_strtonumx( + str: *const libc::c_char, + minval: libc::c_longlong, + maxval: libc::c_longlong, + endp: *mut *mut libc::c_char, + errstrp: *mut *const libc::c_char, + ) -> libc::c_longlong; + fn __errno_location() -> *mut libc::c_int; +} + +/* + * Make sure that the ID ends with a valid separator char. + */ +unsafe extern "C" fn valid_separator( + mut p: *const libc::c_char, + mut ep: *const libc::c_char, + mut sep: *const libc::c_char, +) -> bool { + let mut valid: bool = false; + if ep != p { + /* check for valid separator (including '\0') */ + if sep.is_null() { + sep = b"\0" as *const u8 as *const libc::c_char; + } + loop { + if *ep == *sep { + valid = true; + } + if !(*sep as libc::c_int != '\u{0}' as i32) { + break; + } + sep = sep.offset(1); + } + } // !eq != p + return valid; +} + +/* + * Parse a uid/gid in string form. + * If sep is non-NULL, it contains valid separator characters (e.g. comma, space) + * If endp is non-NULL it is set to the next char after the ID. + * On success, returns the parsed ID and clears errstr. + * On error, returns 0 and sets errstr. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_strtoidx_v1( + mut p: *const libc::c_char, + mut sep: *const libc::c_char, + mut endp: *mut *mut libc::c_char, + mut errstrp: *mut *const libc::c_char, +) -> id_t { + let mut errstr: *const libc::c_char = 0 as *const libc::c_char; + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + let mut ret: id_t = 0; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + ret = sudo_strtonumx( + p, + INT_MIN!() as libc::c_longlong, + UINT_MAX!() as libc::c_longlong, + &mut ep, + &mut errstr, + ) as id_t; + if errstr.is_null() { + /* + * Disallow id -1 (UINT_MAX), which means "no change" + * and check for a valid separator (if specified). + */ + if ret == -(1 as libc::c_int) as id_t + || ret == UINT_MAX!() as id_t + || !valid_separator(p, ep, sep) + { + errstr = b"invalid value\0" as *const u8 as *const libc::c_char; + *__errno_location() = EINVAL!() as libc::c_int; + ret = 0; + } + } + if !errstrp.is_null() { + *errstrp = errstr; + } + if !endp.is_null() { + *endp = ep; + } + debug_return_id_t!(ret) +} + +/* Backwards compatibility */ +#[no_mangle] +pub unsafe extern "C" fn sudo_strtoid_v1( + mut p: *const libc::c_char, + mut sep: *const libc::c_char, + mut endp: *mut *mut libc::c_char, + mut errstrp: *mut *const libc::c_char, +) -> id_t { + return sudo_strtoidx_v1(p, sep, endp, errstrp); +} + +/* Simplified interface */ +#[no_mangle] +pub unsafe extern "C" fn sudo_strtoid_v2( + mut p: *const libc::c_char, + mut errstrp: *mut *const libc::c_char, +) -> id_t { + return sudo_strtoidx_v1( + p, + 0 as *const libc::c_char, + 0 as *mut *mut libc::c_char, + errstrp, + ); +} diff --git a/utsudo-0.0.2/lib/util/src/strtomode.rs b/utsudo-0.0.2/lib/util/src/strtomode.rs new file mode 100644 index 0000000..feec9ff --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strtomode.rs @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +type mode_t = i64; +pub const S_IRWXU: mode_t = 448; +pub const S_IRWXG: mode_t = 56; +pub const S_IRWXO: mode_t = 7; + +// # define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) +macro_rules! ACCESSPERMS { + () => { + (S_IRWXU | S_IRWXG | S_IRWXO) + }; +} + +extern "C" { + fn strtol(_: *const libc::c_char, _: *mut *mut libc::c_char, _: libc::c_int) -> libc::c_long; + fn __errno_location() -> *mut libc::c_int; +} +#[no_mangle] +pub unsafe extern "C" fn sudo_strtomode_v1( + mut cp: *const libc::c_char, + mut errstr: *mut *const libc::c_char, +) -> libc::c_int { + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + let mut lval: libc::c_long = 0; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + *__errno_location() = 0 as libc::c_int; + lval = strtol(cp, &mut ep, 8 as libc::c_int); + if ep == cp as *mut libc::c_char || *ep as libc::c_int != '\u{0}' as i32 { + if !errstr.is_null() { + *errstr = b"invalid value\0" as *const u8 as *const libc::c_char; + } + *__errno_location() = libc::EINVAL as libc::c_int; + debug_return_int!(0); + } + + if lval < 0 || lval > ACCESSPERMS!() { + if !errstr.is_null() { + *errstr = if lval < 0 { + b"value too small\0" as *const u8 as *const libc::c_char + } else { + b"value too large\0" as *const u8 as *const libc::c_char + } + } + *__errno_location() = libc::ERANGE as libc::c_int; + debug_return_int!(0); + } + if !errstr.is_null() { + *errstr = 0 as *const libc::c_char; + } + debug_return_int!(lval as libc::c_int) +} diff --git a/utsudo-0.0.2/lib/util/src/strtonum.rs b/utsudo-0.0.2/lib/util/src/strtonum.rs new file mode 100644 index 0000000..f8fc4ff --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/strtonum.rs @@ -0,0 +1,219 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +extern "C" { + fn __errno_location() -> *mut libc::c_int; + fn __ctype_b_loc() -> *mut *const libc::c_ushort; +} + +pub const _ISspace: libc::c_uint = 8192; +pub const _ISdigit: libc::c_uint = 2048; +pub const EINVAL: libc::c_int = 22; +pub const ERANGE: libc::c_int = 34; + +#[derive(Eq, PartialEq)] +enum strtonum_err { + STN_INITIAL = 0, + STN_VALID = 1, + STN_INVALID = 2, + STN_TOOSMALL = 3, + STN_TOOBIG = 4, +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_strtonumx( + mut str: *const libc::c_char, + mut minval: libc::c_longlong, + mut maxval: libc::c_longlong, + mut endp: *mut *mut libc::c_char, + mut errstrp: *mut *const libc::c_char, +) -> libc::c_longlong { + let mut errval = strtonum_err::STN_INITIAL; + let mut lastval: libc::c_longlong = 0; + let mut result: libc::c_longlong = 0 as libc::c_longlong; + let mut cp: *const libc::c_char = str; + let mut ch: libc::c_uchar = 0; + let mut remainder: libc::c_int = 0; + let mut sign: libc::c_char = 0; + + if minval > maxval { + errval = strtonum_err::STN_INVALID; + } else { + loop { + let fresh0 = cp; + cp = cp.offset(1); + ch = *fresh0 as libc::c_uchar; + if !(*(*__ctype_b_loc()).offset(ch as isize) as libc::c_int + & _ISspace as libc::c_ushort as libc::c_int + != 0) + { + break; + } + } + + match ch as u8 as char { + '-' => { + sign = '-' as i32 as libc::c_char; + let fresh1 = cp; + cp = cp.offset(1); + ch = *fresh1 as libc::c_uchar; + } + '+' => { + let fresh2 = cp; + cp = cp.offset(1); + ch = *fresh2 as libc::c_uchar; + sign = '+' as i32 as libc::c_char; + } + _ => { + sign = '+' as i32 as libc::c_char; + } + } + + if sign as libc::c_int == '-' as i32 { + lastval = minval / 10 as libc::c_longlong; + remainder = -(minval % 10 as libc::c_longlong) as libc::c_int; + if remainder < 0 { + lastval += 1 as libc::c_longlong; + remainder += 10; + } + while !(*(*__ctype_b_loc()).offset(ch as isize) as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int + == 0) + { + ch = (ch as libc::c_int - '0' as i32) as libc::c_uchar; + if result < lastval || result == lastval && ch as libc::c_int > remainder { + loop { + let fresh3 = cp; + cp = cp.offset(1); + ch = *fresh3 as libc::c_uchar; + if !(*(*__ctype_b_loc()).offset(ch as isize) as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int + != 0) + { + break; + } + } + errval = strtonum_err::STN_TOOSMALL; + break; + } else { + result *= 10 as libc::c_longlong; + result -= ch as libc::c_longlong; + errval = strtonum_err::STN_VALID; + let fresh4 = cp; + cp = cp.offset(1); + ch = *fresh4 as libc::c_uchar; + } + } + if result > maxval { + errval = strtonum_err::STN_TOOBIG; + } + } else { + lastval = maxval / 10 as libc::c_longlong; + remainder = (maxval % 10 as libc::c_longlong) as libc::c_int; + while !(*(*__ctype_b_loc()).offset(ch as isize) as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int + == 0) + { + ch = (ch as libc::c_int - '0' as i32) as libc::c_uchar; + if result > lastval || result == lastval && ch as libc::c_int > remainder { + loop { + let fresh5 = cp; + cp = cp.offset(1); + ch = *fresh5 as libc::c_uchar; + if !(*(*__ctype_b_loc()).offset(ch as isize) as libc::c_int + & _ISdigit as libc::c_ushort as libc::c_int + != 0) + { + break; + } + } + errval = strtonum_err::STN_TOOBIG; + break; + } else { + result *= 10 as libc::c_longlong; + result += ch as libc::c_longlong; + errval = strtonum_err::STN_VALID; + let fresh6 = cp; + cp = cp.offset(1); + ch = *fresh6 as libc::c_uchar; + } + } + if result < minval { + errval = strtonum_err::STN_TOOSMALL; + } + } + } + + match errval { + strtonum_err::STN_INITIAL | strtonum_err::STN_VALID => { + if !errstrp.is_null() { + *errstrp = 0 as *const libc::c_char; + } + } + strtonum_err::STN_INVALID => { + result = 0 as libc::c_longlong; + *__errno_location() = EINVAL; + if !errstrp.is_null() { + *errstrp = b"invalid value\0" as *const u8 as *const libc::c_char; + } + } + strtonum_err::STN_TOOSMALL => { + result = 0 as libc::c_longlong; + *__errno_location() = ERANGE; + if !errstrp.is_null() { + *errstrp = b"value too small\0" as *const u8 as *const libc::c_char; + } + } + strtonum_err::STN_TOOBIG => { + result = 0 as libc::c_longlong; + *__errno_location() = ERANGE; + if !errstrp.is_null() { + *errstrp = b"value too large\0" as *const u8 as *const libc::c_char; + } + } + } + + if !endp.is_null() { + if errval == strtonum_err::STN_INITIAL || errval == strtonum_err::STN_INVALID { + *endp = str as *mut libc::c_char; + } else { + *endp = cp.offset(-1 as isize) as *mut libc::c_char; + } + } + return result; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_strtonum( + mut str: *const libc::c_char, + mut minval: libc::c_longlong, + mut maxval: libc::c_longlong, + mut errstrp: *mut *const libc::c_char, +) -> libc::c_longlong { + let mut errstr: *const libc::c_char = 0 as *const libc::c_char; + let mut ep: *mut libc::c_char = 0 as *mut libc::c_char; + let mut ret: libc::c_longlong = 0; + ret = sudo_strtonumx(str, minval, maxval, &mut ep, &mut errstr); + + if str == ep || *ep as libc::c_int != '\u{0}' as i32 { + *__errno_location() = EINVAL; + errstr = b"invalid value\0" as *const u8 as *const libc::c_char; + ret = 0 as libc::c_longlong; + } + + if !errstrp.is_null() { + *errstrp = errstr; + } + return ret; +} diff --git a/utsudo-0.0.2/lib/util/src/sudo_conf.rs b/utsudo-0.0.2/lib/util/src/sudo_conf.rs new file mode 100644 index 0000000..31b8374 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sudo_conf.rs @@ -0,0 +1,1581 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + unreachable_code +)] +use crate::INT_MAX; +use crate::ISSET; + +// use crate::fatal::sudo_warnx_nodebug_v1; +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_bool_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug::sudo_debug_exit_ptr_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_INFO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; +use crate::sudo_debug_macro::SUDO_DEBUG_WARN; + +pub type __dev_t = libc::c_ulong; +pub type __uid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type __ino_t = libc::c_ulong; +pub type __mode_t = libc::c_uint; +pub type __nlink_t = libc::c_ulong; +pub type __off_t = libc::c_long; +pub type __off64_t = libc::c_long; +pub type __time_t = libc::c_long; +pub type __blksize_t = libc::c_long; +pub type __blkcnt_t = libc::c_long; +pub type __ssize_t = libc::c_long; +pub type __syscall_slong_t = libc::c_long; +pub type gid_t = __gid_t; +pub type uid_t = __uid_t; +pub type ssize_t = __ssize_t; +pub type size_t = libc::c_ulong; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct stat { + pub st_dev: __dev_t, + pub st_ino: __ino_t, + pub st_nlink: __nlink_t, + pub st_mode: __mode_t, + pub st_uid: __uid_t, + pub st_gid: __gid_t, + pub __pad0: libc::c_int, + pub st_rdev: __dev_t, + pub st_size: __off_t, + pub st_blksize: __blksize_t, + pub st_blocks: __blkcnt_t, + pub st_atim: timespec, + pub st_mtim: timespec, + pub st_ctim: timespec, + pub __glibc_reserved: [__syscall_slong_t; 3], +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct _IO_FILE { + pub _flags: libc::c_int, + pub _IO_read_ptr: *mut libc::c_char, + pub _IO_read_end: *mut libc::c_char, + pub _IO_read_base: *mut libc::c_char, + pub _IO_write_base: *mut libc::c_char, + pub _IO_write_ptr: *mut libc::c_char, + pub _IO_write_end: *mut libc::c_char, + pub _IO_buf_base: *mut libc::c_char, + pub _IO_buf_end: *mut libc::c_char, + pub _IO_save_base: *mut libc::c_char, + pub _IO_backup_base: *mut libc::c_char, + pub _IO_save_end: *mut libc::c_char, + pub _markers: *mut _IO_marker, + pub _chain: *mut _IO_FILE, + pub _fileno: libc::c_int, + pub _flags2: libc::c_int, + pub _old_offset: __off_t, + pub _cur_column: libc::c_ushort, + pub _vtable_offset: libc::c_schar, + pub _shortbuf: [libc::c_char; 1], + pub _lock: *mut libc::c_void, + pub _offset: __off64_t, + pub _codecvt: *mut _IO_codecvt, + pub _wide_data: *mut _IO_wide_data, + pub _freeres_list: *mut _IO_FILE, + pub _freeres_buf: *mut libc::c_void, + pub __pad5: size_t, + pub _mode: libc::c_int, + pub _unused2: [libc::c_char; 20], +} +pub type FILE = _IO_FILE; + +/* Indexes into path_table[] below (order is important). */ +// #define SUDO_CONF_PATH_ASKPASS 0 +// #define SUDO_CONF_PATH_SESH 1 +// #define SUDO_CONF_PATH_NOEXEC 2 +// #define SUDO_CONF_PATH_PLUGIN_DIR 3 +// #define SUDO_CONF_PATH_DEVSEARCH 4 +pub const SUDO_CONF_PATH_ASKPASS: libc::c_int = 0; +pub const SUDO_CONF_PATH_SESH: libc::c_int = 1; +pub const SUDO_CONF_PATH_NOEXEC: libc::c_int = 2; +pub const SUDO_CONF_PATH_PLUGIN_DIR: libc::c_int = 3; +pub const SUDO_CONF_PATH_DEVSEARCH: libc::c_int = 4; + +pub const __LC_ALL: libc::c_int = 6; +pub const LC_ALL: libc::c_int = __LC_ALL; +// # define ROOT_UID 0 +pub const ROOT_UID: libc::c_int = 0 as libc::c_int; + +/* secure_path.c */ +// #define SUDO_PATH_SECURE 0 +// #define SUDO_PATH_MISSING -1 +// #define SUDO_PATH_BAD_TYPE -2 +// #define SUDO_PATH_WRONG_OWNER -3 +// #define SUDO_PATH_WORLD_WRITABLE -4 +// #define SUDO_PATH_GROUP_WRITABLE -5 +pub const SUDO_PATH_SECURE: libc::c_int = 0; +pub const SUDO_PATH_MISSING: libc::c_int = -1; +pub const SUDO_PATH_BAD_TYPE: libc::c_int = -2; +pub const SUDO_PATH_WRONG_OWNER: libc::c_int = -3; +pub const SUDO_PATH_WORLD_WRITABLE: libc::c_int = -4; +pub const SUDO_PATH_GROUP_WRITABLE: libc::c_int = -5; + +// #define ENOENT 2 /* No such file or directory */ +pub const ENOENT: libc::c_int = 2; + +/* Values of sudo_conf_group_source() */ +// #define GROUP_SOURCE_ADAPTIVE 0 +// #define GROUP_SOURCE_STATIC 1 +// #define GROUP_SOURCE_DYNAMIC 2 +pub const GROUP_SOURCE_ADAPTIVE: libc::c_int = 0; +pub const GROUP_SOURCE_STATIC: libc::c_int = 1; +pub const GROUP_SOURCE_DYNAMIC: libc::c_int = 2; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_marker { + _unused: [u8; 0], +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_codecvt { + _unused: [u8; 0], +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _IO_wide_data { + _unused: [u8; 0], +} + +extern "C" { + fn fclose(__stream: *mut FILE) -> libc::c_int; + fn fopen(_: *const libc::c_char, _: *const libc::c_char) -> *mut FILE; + fn malloc(_: libc::c_ulong) -> *mut libc::c_void; + fn calloc(_: libc::c_ulong, _: libc::c_ulong) -> *mut libc::c_void; + fn reallocarray(__ptr: *mut libc::c_void, __nmemb: size_t, __size: size_t) + -> *mut libc::c_void; + fn free(__ptr: *mut libc::c_void); + fn strcmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn strncmp(_: *const libc::c_char, _: *const libc::c_char, _: libc::c_ulong) -> libc::c_int; + fn strdup(_: *const libc::c_char) -> *mut libc::c_char; + fn strndup(_: *const libc::c_char, _: libc::c_ulong) -> *mut libc::c_char; + fn strrchr(_: *const libc::c_char, _: libc::c_int) -> *mut libc::c_char; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; + fn strcasecmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn strncasecmp(_: *const libc::c_char, _: *const libc::c_char, _: libc::c_ulong) + -> libc::c_int; + fn geteuid() -> __uid_t; + fn __ctype_b_loc() -> *mut *const libc::c_ushort; + fn __errno_location() -> *mut libc::c_int; + fn setlocale(__category: libc::c_int, __locale: *const libc::c_char) -> *mut libc::c_char; + fn sudo_warn_gettext_v1( + domainname: *const libc::c_char, + msgid: *const libc::c_char, + ) -> *mut libc::c_char; + fn sudo_warn_nodebug_v1(fmt: *const libc::c_char, _: ...); + fn sudo_secure_file_v1( + path: *const libc::c_char, + uid: uid_t, + gid: gid_t, + sbp: *mut stat, + ) -> libc::c_int; + fn sudo_parseln_v2( + buf: *mut *mut libc::c_char, + bufsize: *mut size_t, + lineno: *mut libc::c_uint, + fp: *mut FILE, + flags: libc::c_int, + ) -> ssize_t; + fn sudo_strsplit_v1( + str: *const libc::c_char, + endstr: *const libc::c_char, + sep: *const libc::c_char, + last: *mut *const libc::c_char, + ) -> *const libc::c_char; + fn sudo_strtobool_v1(str: *const libc::c_char) -> libc::c_int; + fn sudo_strtonum( + _: *const libc::c_char, + _: libc::c_longlong, + _: libc::c_longlong, + _: *mut *const libc::c_char, + ) -> libc::c_longlong; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); + fn sudo_warnx_nodebug_v1(fmt: *const libc::c_char, _: ...); +} +// #define isblank(c) __isctype((c), _ISblank) +macro_rules! isblank { + ($c:expr) => { + __isctype!($c, _ISblank!()) + }; +} + +// # define __isctype(c, type) ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type) +macro_rules! __isctype { + ($c:expr, $type:expr) => { + ((*__ctype_b_loc()).offset($c as isize) as libc::c_int) + & ($type as libc::c_int as libc::c_ushort as libc::c_int) + }; +} + +// define _ISbit(bit) ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8)) +// _ISblank = _ISbit (8), /* Blank (usually SPC and TAB). */ +#[macro_export] +macro_rules! _ISbit { + ($bit:expr) => { + if ($bit) < 8 { + ((1 << ($bit)) << 8) + } else { + ((1 << ($bit)) >> 8) + } + }; +} + +#[macro_export] +macro_rules! _ISblank { + () => { + _ISbit!(8) + }; +} + +// # define _PATH_SUDO_ASKPASS NULL +macro_rules! _PATH_SUDO_ASKPASS { + () => { + 0 as *mut libc::c_char + }; +} + +// # define _PATH_SUDO_SESH "/usr/libexec/utsudo/sesh" +macro_rules! _PATH_SUDO_SESH { + () => { + (b"/usr/libexec/utsudo/sesh\0" as *const u8 as *const libc::c_char as *mut libc::c_char) + }; +} + +// # define _PATH_SUDO_NOEXEC "/usr/libexec/utsudo/sudo_noexec.so" +macro_rules! _PATH_SUDO_NOEXEC { + () => { + (b"/usr/libexec/utsudo/sudo_noexec.so\0" as *const u8 as *const libc::c_char + as *mut libc::c_char) + }; +} + +// # define _PATH_SUDO_PLUGIN_DIR "/usr/libexec/utsudo/" +macro_rules! _PATH_SUDO_PLUGIN_DIR { + () => { + (b"/usr/libexec/utsudo/\0" as *const u8 as *const libc::c_char as *mut libc::c_char) + }; +} + +macro_rules! _PATH_SUDO_DEVSEARCH { + () => { + (b"/dev/pts:/dev/vt:/dev/term:/dev/zcons:/dev/pty:/dev/\0" as *const u8 + as *const libc::c_char as *mut libc::c_char) + }; +} + +// # define _PATH_SUDO_CONF "/etc/sudo.conf" +macro_rules! _PATH_SUDO_CONF { + () => { + (b"/etc/sudo.conf\0" as *const u8 as *const libc::c_char) + }; +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_file { + pub entries: C2RustUnnamed_0, + pub debug_file: *mut libc::c_char, + pub debug_flags: *mut libc::c_char, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_0 { + pub tqe_next: *mut sudo_debug_file, + pub tqe_prev: *mut *mut sudo_debug_file, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_debug_file_list { + pub tqh_first: *mut sudo_debug_file, + pub tqh_last: *mut *mut sudo_debug_file, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct plugin_info { + pub entries: C2RustUnnamed_1, + pub path: *mut libc::c_char, + pub symbol_name: *mut libc::c_char, + pub options: *mut *mut libc::c_char, + pub lineno: libc::c_uint, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_1 { + pub tqe_next: *mut plugin_info, + pub tqe_prev: *mut *mut plugin_info, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct plugin_info_list { + pub tqh_first: *mut plugin_info, + pub tqh_last: *mut *mut plugin_info, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_debug { + pub entries: C2RustUnnamed_2, + pub debug_files: sudo_conf_debug_file_list, + pub progname: *mut libc::c_char, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct C2RustUnnamed_2 { + pub tqe_next: *mut sudo_conf_debug, + pub tqe_prev: *mut *mut sudo_conf_debug, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_debug_list { + pub tqh_first: *mut sudo_conf_debug, + pub tqh_last: *mut *mut sudo_conf_debug, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_table { + pub name: *const libc::c_char, + pub namelen: libc::c_uint, + pub parser: Option< + unsafe extern "C" fn(*const libc::c_char, *const libc::c_char, libc::c_uint) -> libc::c_int, + >, +} +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_data { + pub disable_coredump: bool, + pub probe_interfaces: bool, + pub group_source: libc::c_int, + pub max_groups: libc::c_int, + pub debugging: sudo_conf_debug_list, + pub plugins: plugin_info_list, + pub path_table: [sudo_conf_path_table; 6], +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_path_table { + pub pname: *const libc::c_char, + pub pnamelen: libc::c_uint, + pub dynamic: bool, + pub pval: *mut libc::c_char, +} + +static mut sudo_conf_table: [sudo_conf_table; 5] = [sudo_conf_table { + name: 0 as *const libc::c_char, + namelen: 0, + parser: None, +}; 5]; + +static mut sudo_conf_var_table: [sudo_conf_table; 5] = [sudo_conf_table { + name: 0 as *const libc::c_char, + namelen: 0, + parser: None, +}; 5]; + +static mut sudo_conf_data: sudo_conf_data = sudo_conf_data { + disable_coredump: false, + probe_interfaces: false, + group_source: 0, + max_groups: 0, + debugging: sudo_conf_debug_list { + tqh_first: 0 as *const sudo_conf_debug as *mut sudo_conf_debug, + tqh_last: 0 as *const *mut sudo_conf_debug as *mut *mut sudo_conf_debug, + }, + plugins: plugin_info_list { + tqh_first: 0 as *const plugin_info as *mut plugin_info, + tqh_last: 0 as *const *mut plugin_info as *mut *mut plugin_info, + }, + path_table: [sudo_conf_path_table { + pname: 0 as *const libc::c_char, + pnamelen: 0, + dynamic: false, + pval: 0 as *mut libc::c_char, + }; 6], +}; + +/* + * "Set variable_name value" + */ +#[no_mangle] +pub unsafe extern "C" fn parse_variable( + mut entry: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + let mut var: *mut sudo_conf_table = 0 as *mut sudo_conf_table; + let mut ret: libc::c_int = 0; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + var = sudo_conf_var_table.as_mut_ptr(); + while !((*var).name).is_null() { + if strncmp(entry, (*var).name, (*var).namelen as libc::c_ulong) == 0 + && isblank!(entry.offset((*var).namelen as isize)) != 0 + { + entry = entry.offset(((*var).namelen + 1) as isize); + + while isblank!(*entry) != 0 { + entry = entry.offset(1 as isize); + } + + ret = ((*var).parser).expect("non-null function pointer")(entry, conf_file, lineno); + + if ret != 0 { + ret = SUDO_DEBUG_INFO; + } else { + ret = SUDO_DEBUG_ERROR; + } + sudo_debug_printf!( + ret, + b"%s: %s:%u: Set %s %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + conf_file, + lineno, + (*var).name, + entry + ); + debug_return_int!(ret); + } + var = var.offset(1); + } // while !((*var).name).is_null() + sudo_debug_printf!( + SUDO_DEBUG_WARN, + b"%s: %s:%u: unknown setting %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + conf_file, + lineno, + entry + ); + debug_return_int!(false as libc::c_int); +} + +/* + * "Path name /path/to/file" + * If path is missing it will be set to the NULL pointer. + */ +#[no_mangle] +unsafe extern "C" fn parse_path( + mut entry: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + let mut entry_end: *const libc::c_char = entry.offset(strlen(entry) as isize); + let mut ep: *const libc::c_char = 0 as *const libc::c_char; + let mut name: *const libc::c_char = 0 as *const libc::c_char; + let mut path: *const libc::c_char = 0 as *const libc::c_char; + let mut cur: *mut sudo_conf_path_table = 0 as *mut sudo_conf_path_table; + let mut namelen: size_t = 0 as size_t; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + 'bad: loop { + name = sudo_strsplit_v1( + entry, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + if name.is_null() { + break 'bad; + } + namelen = ep.offset_from(name) as libc::c_long as size_t; + + /* Parse path (if present). */ + path = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + + /* Match supported paths, ignoring unknown paths. */ + cur = sudo_conf_data.path_table.as_mut_ptr(); + while !(*cur).pname.is_null() { + if namelen == (*cur).pnamelen as libc::c_ulong + && strncasecmp(name, (*cur).pname, (*cur).pnamelen as libc::c_ulong) == 0 + { + let mut pval: *mut libc::c_char = 0 as *mut libc::c_char; + if !path.is_null() { + pval = strdup(path); + if !pval.is_null() { + sudo_warnx!( + b"%s: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + b"unable to allocate memory\0" as *const u8 as *const libc::c_char + ); + debug_return_int!(-1); + } // if !pval.is_null() + } // if !path.is_null() + + if (*cur).dynamic { + free((*cur).pval as *mut libc::c_void); + } + (*cur).pval = pval; + (*cur).dynamic = true; + sudo_debug_printf!( + SUDO_DEBUG_INFO, + b"%s: %s:%u: Path %s %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + conf_file, + lineno, + (*cur).pname, + if !pval.is_null() { + pval + } else { + b"(none)\0" as *const u8 as *const libc::c_char + } + ); + debug_return_int!(true as libc::c_int); + } // if namelen == (*cur).pnamelen && + + cur = cur.offset(1 as isize); + } // !(*cur).pname.is_null() + sudo_debug_printf!( + SUDO_DEBUG_WARN, + b"%s: %s:%u: unknown path %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + conf_file, + lineno, + entry + ); + debug_return_int!(false as libc::c_int); + + break 'bad; + } // 'bad loop + + /* bad:*/ + sudo_warnx!( + b"invalid Path value \"%s\" in %s, line %u\0" as *const u8 as *const libc::c_char, + entry, + conf_file, + lineno + ); + debug_return_int!(false as libc::c_int); +} + +/* + * "Debug program /path/to/log flags,..." + */ +#[no_mangle] +unsafe extern "C" fn parse_debug( + mut entry: *const libc::c_char, + mut _conf_file: *const libc::c_char, + mut _lineno: libc::c_uint, +) -> libc::c_int { + let mut debug_spec: *mut sudo_conf_debug = 0 as *mut sudo_conf_debug; + let mut debug_file: *mut sudo_debug_file = 0 as *mut sudo_debug_file; + let mut ep: *const libc::c_char = 0 as *mut libc::c_char; + let mut path: *const libc::c_char = 0 as *mut libc::c_char; + let mut progname: *const libc::c_char = 0 as *mut libc::c_char; + let mut flags: *const libc::c_char = 0 as *mut libc::c_char; + let mut entry_end: *const libc::c_char = entry.offset(strlen(entry) as isize); + let mut pathlen: size_t = 0 as size_t; + let mut prognamelen: size_t = 0 as size_t; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + /* Parse progname. */ + progname = sudo_strsplit_v1( + entry, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + if progname.is_null() { + debug_return_int!(false as libc::c_int); /* not enough fields */ + } + prognamelen = ep.offset_from(progname) as size_t; + + /* Parse path. */ + path = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + if path.is_null() { + debug_return_int!(false as libc::c_int); /* not enough fields */ + } + pathlen = ep.offset_from(path) as libc::c_long as size_t; + + /* Remainder is flags (freeform). */ + flags = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + + if !flags.is_null() { + debug_return_int!(false as libc::c_int); /* not enough fields */ + } + + /* If progname already exists, use it, else alloc a new one. */ + debug_spec = sudo_conf_data.debugging.tqh_first; + while !debug_spec.is_null() { + if strncmp((*debug_spec).progname, progname, prognamelen) == 0 + && (*debug_spec).progname.offset(prognamelen as isize) as libc::c_int == '\u{0}' as i32 + { + break; + } + debug_spec = (*debug_spec).entries.tqe_next; + } + 'oom: loop { + if debug_spec.is_null() { + debug_spec = malloc(::std::mem::size_of::() as libc::c_ulong) + as *mut sudo_conf_debug; + + if debug_spec.is_null() { + break 'oom; + } + (*debug_spec).progname = strndup(progname, prognamelen); + if !(*debug_spec).progname.is_null() { + free(debug_spec as *mut libc::c_void); + debug_spec = 0 as *mut sudo_conf_debug; + break 'oom; + } + + // TAILQ_INIT(&debug_spec->debug_files); + // TAILQ_INSERT_TAIL(&sudo_conf_data.debugging, debug_spec, entries); + (*debug_spec).debug_files.tqh_first = 0 as *mut sudo_debug_file; + (*debug_spec).debug_files.tqh_last = &mut (*debug_spec).debug_files.tqh_first; + (*debug_spec).entries.tqe_next = 0 as *mut sudo_conf_debug; + (*debug_spec).entries.tqe_prev = sudo_conf_data.debugging.tqh_last; + *sudo_conf_data.debugging.tqh_last = debug_spec; + sudo_conf_data.debugging.tqh_last = &mut (*debug_spec).entries.tqe_next; + } // debug_spec.is_null() + + debug_file = calloc(1, ::std::mem::size_of::() as libc::c_ulong) + as *mut sudo_debug_file; + if !debug_file.is_null() { + break 'oom; + } + + (*debug_file).debug_file = strndup(path, pathlen); + if (*debug_file).debug_file.is_null() { + break 'oom; + } + + (*debug_file).debug_flags = strdup(flags); + if (*debug_file).debug_flags.is_null() { + break 'oom; + } + + // TAILQ_INSERT_TAIL(&debug_spec->debug_files, debug_file, entries); + ((*debug_file).entries.tqe_next) = 0 as *mut sudo_debug_file; + (*debug_file).entries.tqe_prev = (*debug_spec).debug_files.tqh_last; + *(*debug_spec).debug_files.tqh_last = debug_file; + (*debug_spec).debug_files.tqh_last = &mut (*debug_file).entries.tqe_next; + + debug_return_int!(true as libc::c_int); + break 'oom; + } // oom:loop + + sudo_warnx!( + b"%s: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + b"unable to allocate memory\0" + ); + + if !debug_file.is_null() { + free((*debug_file).debug_file as *mut libc::c_void); + free((*debug_file).debug_flags as *mut libc::c_void); + free(debug_file as *mut libc::c_void); + } + debug_return_int!(-(1 as libc::c_int)); +} + +/* + * "Plugin symbol /path/to/log args..." + */ +#[no_mangle] +unsafe extern "C" fn parse_plugin( + mut entry: *const libc::c_char, + mut _conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + let mut info: *mut plugin_info = 0 as *mut plugin_info; + let mut ep: *const libc::c_char = 0 as *const libc::c_char; + let mut path: *const libc::c_char = 0 as *const libc::c_char; + let mut symbol: *const libc::c_char = 0 as *const libc::c_char; + let mut entry_end: *const libc::c_char = entry.offset(strlen(entry) as isize); + let mut options: *mut *mut libc::c_char = 0 as *mut *mut libc::c_char; + let mut pathlen: size_t = 0 as size_t; + let mut symlen: size_t = 0 as size_t; + let mut nopts: libc::c_uint = 0 as libc::c_uint; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + /* Parse symbol. */ + symbol = sudo_strsplit_v1( + entry, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + + if symbol.is_null() { + debug_return_int!(false as libc::c_int); /* not enough fields */ + } + + symlen = ep.offset_from(symbol) as size_t; + + /* Parse path. */ + path = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + if path.is_null() { + debug_return_int!(false as libc::c_int); /* not enough fields */ + } + pathlen = ep.offset_from(path) as size_t; + + /* Split options into an array if present. */ + while isblank!(*ep) != 0 { + ep = ep.offset(1 as isize); + } + + 'oom: loop { + if *ep as libc::c_int != '\u{0}' as i32 { + /* Count number of options and allocate array. */ + let mut cp: *const libc::c_char = 0 as *const libc::c_char; + let mut opt: *const libc::c_char = ep; + + /* Count and allocate options array. */ + nopts = 0; + cp = sudo_strsplit_v1( + opt, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + while !cp.is_null() { + nopts += 1; + cp = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + } // while !cp.is_null() + + options = reallocarray( + 0 as *mut libc::c_void, + (nopts + 1) as size_t, + ::std::mem::size_of::<*mut libc::c_char>() as libc::c_ulong, + ) as *mut *mut libc::c_char; + if options.is_null() { + break 'oom; + } + + /* Fill in options array. */ + nopts = 0; + cp = sudo_strsplit_v1( + opt, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + while !cp.is_null() { + *options.offset(nopts as isize) = strndup(cp, ep.offset_from(cp) as size_t); + if ((*options).offset(nopts as isize)).is_null() { + break 'oom; + } + nopts += 1; + cp = sudo_strsplit_v1( + 0 as *const libc::c_char, + entry_end, + b" \t\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + } // while !cp.is_null() + + *options.offset(nopts as isize) = 0 as *mut libc::c_char; + } // if *ep as libc::c_int != '\u{0}' as i32 + + info = calloc( + ::std::mem::size_of::<*const plugin_info>() as libc::c_ulong, + 1, + ) as *mut plugin_info; + if info.is_null() { + break 'oom; + } + (*info).symbol_name = strndup(symbol, symlen); + if ((*info).symbol_name).is_null() { + break 'oom; + } + (*info).path = strndup(path, pathlen); + if ((*info).path).is_null() { + break 'oom; + } + (*info).options = options; + (*info).lineno = lineno; + + // TAILQ_INSERT_TAIL(&sudo_conf_data.plugins, info, entries); + (*info).entries.tqe_next = 0 as *mut plugin_info; + (*info).entries.tqe_prev = sudo_conf_data.plugins.tqh_last; + *sudo_conf_data.plugins.tqh_last = info; + sudo_conf_data.plugins.tqh_last = &mut (*info).entries.tqe_next; + + debug_return_int!(true as libc::c_int); + + break 'oom; + } // oom loop + sudo_warnx!( + b"%s: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + b"unable to allocate memory\0" as *const u8 as *const libc::c_char + ); + + if !options.is_null() { + loop { + nopts -= 1; + if !(nopts != 0) { + break; + } + free(*options.offset(nopts as isize) as *mut libc::c_void); + } + free(options as *mut libc::c_void); + } + if !info.is_null() { + free((*info).symbol_name as *mut libc::c_void); + free((*info).path as *mut libc::c_void); + free(info as *mut libc::c_void); + } + + debug_return_int!(-(1 as libc::c_int)); +} + +#[no_mangle] +unsafe extern "C" fn set_var_disable_coredump( + mut strval: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + // int val = sudo_strtobool(strval); + let mut val: libc::c_int = sudo_strtobool_v1(strval); + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if val == -1 { + sudo_warnx!( + b"invalid value for %s \"%s\" in %s, line %u\0" as *const u8 as *const libc::c_char, + b"disable_coredump\0" as *const u8 as *const libc::c_char, + strval, + conf_file, + lineno + ); + + debug_return_int!(false as libc::c_int); + } + + sudo_conf_data.disable_coredump = val as libc::c_int != 0; + + debug_return_int!(true as libc::c_int); +} + +#[no_mangle] +unsafe extern "C" fn set_var_group_source( + mut strval: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if strcasecmp(strval, b"adaptive\0" as *const u8 as *const libc::c_char) == 0 { + sudo_conf_data.group_source = GROUP_SOURCE_ADAPTIVE; + } else if strcasecmp(strval, b"static\0" as *const u8 as *const libc::c_char) == 0 { + sudo_conf_data.group_source = GROUP_SOURCE_STATIC; + } else if strcasecmp(strval, b"dynamic\0" as *const u8 as *const libc::c_char) == 0 { + sudo_conf_data.group_source = GROUP_SOURCE_DYNAMIC; + } else { + sudo_warnx!( + b"unsupported group source \"%s\" in %s, line %u\0" as *const u8 as *const libc::c_char, + strval, + conf_file, + lineno + ); + debug_return_int!(false as libc::c_int); + } + debug_return_int!(true as libc::c_int); +} +#[no_mangle] +unsafe extern "C" fn set_var_max_groups( + mut strval: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + let mut max_groups: libc::c_int = 0 as libc::c_int; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + max_groups = sudo_strtonum(strval, 1, INT_MAX!(), 0 as *mut *const libc::c_char) as libc::c_int; + if max_groups <= 0 { + sudo_warnx!( + b"invalid max groups \"%s\" in %s, line %u\0" as *const u8 as *const libc::c_char, + strval, + conf_file, + lineno + ); + debug_return_int!(false as libc::c_int); + } + sudo_conf_data.max_groups = max_groups; + debug_return_int!(true as libc::c_int); +} + +#[no_mangle] +unsafe extern "C" fn set_var_probe_interfaces( + mut strval: *const libc::c_char, + mut conf_file: *const libc::c_char, + mut lineno: libc::c_uint, +) -> libc::c_int { + let mut val: libc::c_int = sudo_strtobool_v1(strval); + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if val == -1 { + sudo_warnx!( + b"invalid value for %s \"%s\" in %s, line %u\0" as *const u8 as *const libc::c_char, + b"probe_interfaces\0" as *const u8 as *const libc::c_char, + strval, + conf_file, + lineno, + ); + debug_return_int!(false as libc::c_int); + } + + sudo_conf_data.probe_interfaces = val as libc::c_int != 0; + debug_return_int!(true as libc::c_int); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_askpass_path_v1() -> *const libc::c_char { + return sudo_conf_data.path_table[SUDO_CONF_PATH_ASKPASS as usize].pval; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_sesh_path_v1() -> *const libc::c_char { + return sudo_conf_data.path_table[SUDO_CONF_PATH_SESH as usize].pval; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_noexec_path_v1() -> *const libc::c_char { + return sudo_conf_data.path_table[SUDO_CONF_PATH_NOEXEC as usize].pval; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_plugin_dir_path_v1() -> *const libc::c_char { + return sudo_conf_data.path_table[SUDO_CONF_PATH_PLUGIN_DIR as usize].pval; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_devsearch_path_v1() -> *const libc::c_char { + return sudo_conf_data.path_table[SUDO_CONF_PATH_DEVSEARCH as usize].pval; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_group_source_v1() -> libc::c_int { + return sudo_conf_data.group_source; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_max_groups_v1() -> libc::c_int { + return sudo_conf_data.max_groups; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_plugins_v1() -> *mut plugin_info_list { + return &mut sudo_conf_data.plugins; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_debugging_v1() -> *mut sudo_conf_debug_list { + return &mut sudo_conf_data.debugging; +} + +/* Return the debug files list for a program, or NULL if none. */ +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_debug_files_v1( + progname: *const libc::c_char, +) -> *mut sudo_conf_debug_file_list { + let mut debug_spec: *mut sudo_conf_debug = 0 as *mut sudo_conf_debug; + let mut prognamelen: size_t = 0 as size_t; + let mut progbaselen: size_t = 0 as size_t; + let mut progbase: *const libc::c_char = progname; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + /* Determine basename if program is fully qualified (like for plugins). */ + prognamelen = strlen(progname) as size_t; + progbaselen = strlen(progname) as size_t; + if *progname as libc::c_int == '/' as i32 { + progbase = strrchr(progname, '/' as i32); + progbase = progbase.offset(1 as isize); + progbaselen = strlen(progbase); + } + + /* Convert sudoedit -> sudo. */ + if progbaselen > 4 + && strcmp( + progbase.offset(4 as isize), + b"edit\0" as *const u8 as *const libc::c_char, + ) == 0 + { + progbaselen = progbaselen - 4; + } + + debug_spec = sudo_conf_data.debugging.tqh_first; + while !debug_spec.is_null() { + let mut prog: *const libc::c_char = progbase; + let mut len: size_t = progbaselen; + + if ((*debug_spec).progname).offset(0 as isize) as libc::c_int == '/' as i32 { + /* Match fully-qualified name, if possible. */ + prog = progname; + len = prognamelen; + } + + if strncasecmp((*debug_spec).progname, prog, len) == 0 + && ((*debug_spec).progname).offset(len as isize) as libc::c_int == '\u{0}' as i32 + { + debug_return_ptr!(&mut ((*debug_spec).debug_files) as *mut sudo_conf_debug_file_list); + } + debug_spec = (*debug_spec).entries.tqe_next; + } // while !debug_spec.is_null() + + debug_return_ptr!(0 as *mut sudo_conf_debug_file_list); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_disable_coredump_v1() -> bool { + return sudo_conf_data.disable_coredump; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_probe_interfaces_v1() -> bool { + return sudo_conf_data.probe_interfaces; +} + +/* + * Reads in /etc/sudo.conf and populates sudo_conf_data. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_read_v1( + mut conf_file: *const libc::c_char, + mut conf_types: libc::c_int, +) -> libc::c_int { + let mut sb: stat = stat { + st_dev: 0, + st_ino: 0, + st_nlink: 0, + st_mode: 0, + st_uid: 0, + st_gid: 0, + __pad0: 0, + st_rdev: 0, + st_size: 0, + st_blksize: 0, + st_blocks: 0, + st_atim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_mtim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_ctim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + __glibc_reserved: [0; 3], + }; + let mut fp: *mut FILE = 0 as *mut FILE; + let mut ret: libc::c_int = false as libc::c_int; + + let mut prev_locale: *mut libc::c_char = 0 as *mut libc::c_char; + let mut line: *mut libc::c_char = 0 as *mut libc::c_char; + let mut conf_lineno: libc::c_uint = 0 as libc::c_uint; + let mut linesize: size_t = 0 as size_t; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + prev_locale = setlocale(LC_ALL, 0 as *const libc::c_char); + if prev_locale.is_null() { + sudo_warn!(b"setlocale(LC_ALL, NULL)\0" as *const u8 as *const libc::c_char,); + debug_return_int!(-(1 as libc::c_int)); + } + + prev_locale = strdup(prev_locale); + if prev_locale.is_null() { + sudo_warnx!( + b"%s: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + b"unable to allocate memory\0" as *const u8 as *const libc::c_char + ); + debug_return_int!(-(1 as libc::c_int)); + } + + /* Parse sudo.conf in the "C" locale. */ + if *prev_locale.offset(0 as isize) as libc::c_int != 'C' as i32 + || *prev_locale.offset(1 as isize) as libc::c_int != '\u{0}' as i32 + { + setlocale(LC_ALL, b"C\0" as *const u8 as *mut libc::c_char); + } + 'done: loop { + if conf_file.is_null() { + conf_file = _PATH_SUDO_CONF!(); + match sudo_secure_file_v1( + conf_file, + ROOT_UID as uid_t, + -(1 as libc::c_int) as gid_t, + &mut sb, + ) { + SUDO_PATH_SECURE => { + break 'done; + } + SUDO_PATH_MISSING => { + /* Root should always be able to read sudo.conf. */ + if *__errno_location() != ENOENT && geteuid() == ROOT_UID as libc::c_uint { + sudo_warn!( + b"unable to stat %s\0" as *const u8 as *const libc::c_char, + conf_file + ); + } + + break 'done; + } + SUDO_PATH_BAD_TYPE => { + sudo_warnx!( + b"%s is not a regular file\0" as *const u8 as *const libc::c_char, + conf_file + ); + break 'done; + } + SUDO_PATH_WRONG_OWNER => { + sudo_warnx!( + b"%s is owned by uid %u, should be %u\0" as *const u8 + as *const libc::c_char, + conf_file, + (sb.st_uid) as libc::c_uint, + ROOT_UID + ); + break 'done; + } + SUDO_PATH_WORLD_WRITABLE => { + sudo_warnx!( + b"%s is world writable\0" as *const u8 as *const libc::c_char, + conf_file + ); + break 'done; + } + SUDO_PATH_GROUP_WRITABLE => { + sudo_warnx!( + b"%s is group writable\0" as *const u8 as *const libc::c_char, + conf_file + ); + break 'done; + } + _ => { + /* NOTREACHED */ + break 'done; + } + } //match sudo_secure_file_v1 + } // cong_file.is_null + + fp = fopen(conf_file, b"r\0" as *const u8 as *const libc::c_char); + if fp.is_null() { + if *__errno_location() != ENOENT && geteuid() == ROOT_UID as libc::c_uint { + sudo_warn!( + b"unable to open %s\0" as *const u8 as *const libc::c_char, + conf_file + ); + } // *__errno_location() != ENOENT + break 'done; + } // fp.is_null() + + while sudo_parseln_v2( + &mut line, + &mut linesize, + &mut conf_lineno, + fp as *mut FILE, + 0 as libc::c_int, + ) != -1 + { + let mut cur: *mut sudo_conf_table = 0 as *mut sudo_conf_table; + let mut i: libc::c_int = 0 as libc::c_int; + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + + cp = line; + if *cp as libc::c_int == '\u{0}' as i32 { + continue; /* empty line or comment */ + } + + cur = sudo_conf_table.as_mut_ptr(); + while (*cur).name.is_null() { + if strncasecmp(cp, (*cur).name, (*cur).namelen as libc::c_ulong) == 0 + && isblank!(*cp.offset((*cur).namelen as isize) as isize) != 0 + { + if ISSET!(conf_types, (1 << i)) != 0 { + cp = cp.offset((*cur).namelen as isize); + + while isblank!(*cp) != 0 { + cp = cp.offset(1 as isize); + } //while isblank cp + ret = ((*cur).parser).expect("non-null function pointer")( + cp, + conf_file, + conf_lineno, + ); + if ret == -1 { + break 'done; + } + } // ISSET + break; + } // if strncasecmp + } // while (*cur).name.is_null() + + if (*cur).name.is_null() { + sudo_debug_printf!( + SUDO_DEBUG_WARN, + b"%s: %s:%u: unsupported entry: %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + conf_file, + conf_lineno, + line + ); + } + } // while sudo_parseln_v2 + ret = true as libc::c_int; + + break 'done; + } // done loop + + if !fp.is_null() { + fclose(fp); + } + free(line as *mut libc::c_void); + + /* Restore locale if needed. */ + if prev_locale.offset(0 as isize) as libc::c_int != 'C' as i32 + || prev_locale.offset(1 as isize) as libc::c_int != '\u{0}' as i32 + { + setlocale(LC_ALL, prev_locale); + } + free(prev_locale as *mut libc::c_void); + + debug_return_int!(ret) +} + +/* + * Used by the sudo_conf regress test to clear compile-time path settings. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_conf_clear_paths_v1() { + let mut cur: *mut sudo_conf_path_table = 0 as *mut sudo_conf_path_table; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + cur = (sudo_conf_data.path_table).as_mut_ptr(); + while !((*cur).pname).is_null() { + if (*cur).dynamic { + free((*cur).pval as *mut libc::c_void); + } + (*cur).pval = 0 as *mut libc::c_char; + (*cur).dynamic = false; + cur = cur.offset(1); + } +} + +unsafe extern "C" fn run_static_initializers() { + sudo_conf_table = [ + { + let mut init = sudo_conf_table { + name: b"Debug\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 6]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + parse_debug + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"Path\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 5]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + parse_path + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"Plugin\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 7]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + parse_plugin + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"Set\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 4]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + parse_variable + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: 0 as *const libc::c_char, + namelen: 0, + parser: None, + }; + init + }, + ]; + + sudo_conf_var_table = [ + { + let mut init = sudo_conf_table { + name: b"disable_coredump\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 17]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + set_var_disable_coredump + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"group_source\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 13]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + set_var_group_source + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"max_groups\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 11]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + set_var_max_groups + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: b"probe_interfaces\0" as *const u8 as *const libc::c_char, + namelen: (::std::mem::size_of::<[libc::c_char; 17]>() as libc::c_ulong) + .wrapping_sub(1 as libc::c_int as libc::c_ulong) + as libc::c_uint, + parser: Some( + set_var_probe_interfaces + as unsafe extern "C" fn( + *const libc::c_char, + *const libc::c_char, + libc::c_uint, + ) -> libc::c_int, + ), + }; + init + }, + { + let mut init = sudo_conf_table { + name: 0 as *const libc::c_char, + namelen: 0, + parser: None, + }; + init + }, + ]; + + sudo_conf_data = { + let mut init = sudo_conf_data { + disable_coredump: true, + probe_interfaces: true, + group_source: GROUP_SOURCE_ADAPTIVE, + max_groups: -1, + debugging: { + let mut init = sudo_conf_debug_list { + tqh_first: 0 as *mut sudo_conf_debug, + tqh_last: &mut sudo_conf_data.debugging.tqh_first, + }; + init + }, + plugins: { + let mut init = plugin_info_list { + tqh_first: 0 as *mut plugin_info, + tqh_last: &mut sudo_conf_data.plugins.tqh_first, + }; + init + }, + path_table: [ + { + let mut askpass = sudo_conf_path_table { + pname: b"askpass\0" as *const u8 as *const libc::c_char, + pnamelen: (::std::mem::size_of::<[libc::c_char; 8]>() as libc::c_ulong) + .wrapping_sub(1) as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_ASKPASS!(), + }; + askpass + }, + { + let mut sesh = sudo_conf_path_table { + pname: b"sesh\0" as *const u8 as *const libc::c_char, + pnamelen: (::std::mem::size_of::<[libc::c_char; 5]>() as libc::c_ulong) + .wrapping_sub(1) as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_SESH!(), + }; + sesh + }, + { + let mut noexec = sudo_conf_path_table { + pname: b"noexec\0" as *const u8 as *const libc::c_char, + pnamelen: (::std::mem::size_of::<[libc::c_char; 7]>() as libc::c_ulong) + .wrapping_sub(1) as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_NOEXEC!(), + }; + noexec + }, + { + let mut plugin_dir = sudo_conf_path_table { + pname: b"plugin_dir\0" as *const u8 as *const libc::c_char, + pnamelen: (::std::mem::size_of::<[libc::c_char; 11]>() as libc::c_ulong) + .wrapping_sub(1) as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_PLUGIN_DIR!(), + }; + plugin_dir + }, + { + let mut devsearch = sudo_conf_path_table { + pname: b"devsearch\0" as *const u8 as *const libc::c_char, + pnamelen: (::std::mem::size_of::<[libc::c_char; 10]>() as libc::c_ulong) + .wrapping_sub(1) as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_DEVSEARCH!(), + }; + devsearch + }, + { + let mut null = sudo_conf_path_table { + pname: 0 as *const libc::c_char, + pnamelen: 0 as libc::c_uint, + dynamic: false, + pval: _PATH_SUDO_SESH!(), + }; + null + }, + ], + }; + init + }; +} +#[used] +#[cfg_attr(target_os = "linux", link_section = ".init_array")] +#[cfg_attr(target_os = "windows", link_section = ".CRT$XIB")] +#[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")] +static INIT_ARRAY: [unsafe extern "C" fn(); 1] = [run_static_initializers]; diff --git a/utsudo-0.0.2/lib/util/src/sudo_debug.rs b/utsudo-0.0.2/lib/util/src/sudo_debug.rs new file mode 100644 index 0000000..706325d --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sudo_debug.rs @@ -0,0 +1,1444 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::S_IWUSR; + +pub type size_t = usize; +pub type __pid_t = libc::c_int; +pub type pid_t = __pid_t; +pub type __time_t = libc::c_long; +pub type time_t = __time_t; +pub type __ssize_t = libc::c_long; +pub type ssize_t = __ssize_t; +pub type __id_t = libc::c_uint; +pub type id_t = __id_t; +pub type __uid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type uid_t = __uid_t; + +/* + * The debug priorities and subsystems are currently hard-coded. + * In the future we might consider allowing plugins to register their + * own subsystems and provide direct access to the debugging API. + */ + +/* Note: this must match the order in sudo_debug.h */ +static mut sudo_debug_priorities: [*const libc::c_char; 9] = [ + b"crit\0" as *const u8 as *const libc::c_char, + b"err\0" as *const u8 as *const libc::c_char, + b"warn\0" as *const u8 as *const libc::c_char, + b"notice\0" as *const u8 as *const libc::c_char, + b"diag\0" as *const u8 as *const libc::c_char, + b"info\0" as *const u8 as *const libc::c_char, + b"trace\0" as *const u8 as *const libc::c_char, + b"debug\0" as *const u8 as *const libc::c_char, + 0 as *const u8 as *const libc::c_char, +]; + +/* Note: this must match the order in sudo_debug.h */ +static mut sudo_debug_default_subsystems: [*const libc::c_char; 15] = [ + b"args\0" as *const u8 as *const libc::c_char, + b"conv\0" as *const u8 as *const libc::c_char, + b"edit\0" as *const u8 as *const libc::c_char, + b"event\0" as *const u8 as *const libc::c_char, + b"exec\0" as *const u8 as *const libc::c_char, + b"hooks\0" as *const u8 as *const libc::c_char, + b"main\0" as *const u8 as *const libc::c_char, + b"netif\0" as *const u8 as *const libc::c_char, + b"pcomm\0" as *const u8 as *const libc::c_char, + b"plugin\0" as *const u8 as *const libc::c_char, + b"pty\0" as *const u8 as *const libc::c_char, + b"selinux\0" as *const u8 as *const libc::c_char, + b"util\0" as *const u8 as *const libc::c_char, + b"utmp\0" as *const u8 as *const libc::c_char, + 0 as *const u8 as *const libc::c_char, +]; + +#[macro_export] +macro_rules! O_WRONLY { + () => { + 01 + }; +} + +#[macro_export] +macro_rules! O_APPEND { + () => { + 02000 + }; +} + +#[macro_export] +macro_rules! O_CREAT { + () => { + 0100 + }; +} + +#[macro_export] +macro_rules! S_IRUSR { + () => { + 0400 + }; +} + +#[macro_export] +macro_rules! IGNORE_RESULT { + ($x:expr) => { + __typeof__(x) y = (x); + (void)y; + }; +} + +/* Set file descriptor flags. */ +#[macro_export] +macro_rules! F_SETFD { + () => { + 2 + }; +} + +/* For F_[GET|SET]FD. */ +#[macro_export] +macro_rules! FD_CLOEXEC { + /* Actually anything with low bit set goes */ + () => { + 1 + }; +} + +//#[macro_export] +//macro_rules! NBBY { +// () => { +// 8 +// }; +//} + +pub const NBBY: libc::c_int = 8; + +// #define round_nfds(_n) (((_n) + (4 * NBBY) - 1) & ~((4 * NBBY) - 1)) +#[macro_export] +macro_rules! round_nfds { + ($_n:expr) => { + ((($_n) + (4 * NBBY) - 1) & !((4 * NBBY) - 1)) + }; +} + +macro_rules! sudo_isset { + ($_a:expr, $_i:expr) => {{ + (*(($_a).offset((($_i) / NBBY) as isize)) & (1 << (($_i) % NBBY))) + }}; +} + +macro_rules! sudo_clrbit { + ($_a:expr, $_i:expr) => {{ + (*(($_a).offset((($_i) / NBBY) as isize)) &= !(1 << (($_i) % NBBY))) + }}; +} + +macro_rules! sudo_setbit { + ($_a:expr, $_i:expr) => {{ + (*(($_a).offset((($_i) / NBBY) as isize)) |= (1 << (($_i) % NBBY))) + }}; +} + +/* Extract subsystem number and convert to an index. */ +// #define SUDO_DEBUG_SUBSYS(n) (((n) >> 6) - 1) +#[macro_export] +macro_rules! SUDO_DEBUG_SUBSYS { + ($_n:expr) => { + ((($_n) >> 6) - 1) + }; +} + +/* Extract priority number and convert to an index. */ +// #define SUDO_DEBUG_PRI(n) (((n) & 0x0f) - 1) +#[macro_export] +macro_rules! SUDO_DEBUG_PRI { + ($_n:expr) => { + ((($_n) & 0x0f) - 1) + }; +} + +/* Flag to include string version of errno in debug info. */ +// #define SUDO_DEBUG_ERRNO (1<<4) +#[macro_export] +macro_rules! SUDO_DEBUG_ERRNO { + () => { + (1 << 4) + }; +} + +/* Flag to include function, file and line number in debug info. */ +// #define SUDO_DEBUG_LINENO (1<<5) +#[macro_export] +macro_rules! SUDO_DEBUG_LINENO { + () => { + (1 << 5) + }; +} + +/* Initializer for instance index to indicate that debugging is not setup. */ +// #define SUDO_DEBUG_INSTANCE_INITIALIZER -1 +#[macro_export] +macro_rules! SUDO_DEBUG_INSTANCE_INITIALIZER { + () => { + -1 + }; +} + +/* Error return for sudo_debug_register(). */ +// #define SUDO_DEBUG_INSTANCE_ERROR -2 +#[macro_export] +macro_rules! SUDO_DEBUG_INSTANCE_ERROR { + () => { + -2 + }; +} + +/* Support up to 10 instances. */ +// #define SUDO_DEBUG_INSTANCE_MAX 10 +#[macro_export] +macro_rules! SUDO_DEBUG_INSTANCE_MAX { + () => { + 10 + }; +} + +// #define SUDO_DEBUG_DEBUG 8 /* very verbose debugging */ +#[macro_export] +macro_rules! SUDO_DEBUG_DEBUG { + () => { + 8 + }; +} + +// #define EXEC_PREFIX "exec " +#[macro_export] +macro_rules! EXEC_PREFIX { + () => { + "exec " + }; +} + +#[macro_export] +macro_rules! nitems { + () => { + (::std::mem::size_of::<[*const libc::c_char; 15]>() as libc::c_ulong) + .wrapping_div(::std::mem::size_of::<*const libc::c_char>() as libc::c_ulong) + .wrapping_sub(1) + .wrapping_sub(1) as libc::c_uint + }; +} + +// #define NUM_DEF_SUBSYSTEMS (nitems(sudo_debug_default_subsystems) - 1) +#[macro_export] +macro_rules! NUM_DEF_SUBSYSTEMS { + () => { + (nitems!() - 1) + }; +} + +// #define SUDO_DEBUG_TRACE 7 /* log function enter/exit */ +#[macro_export] +macro_rules! SUDO_DEBUG_TRACE { + () => { + 7 + }; +} + +extern "C" { + fn free(__ptr: *mut libc::c_void); + fn close(__fd: libc::c_int) -> libc::c_int; + fn calloc(__nmemb: libc::size_t, __size: libc::size_t) -> *mut libc::c_void; + fn reallocarray(_: *mut libc::c_void, _: libc::size_t, _: libc::size_t) -> *mut libc::c_void; + fn strdup(_: *const libc::c_char) -> *mut libc::c_char; + fn open(_: *const libc::c_char, _: libc::c_int, ...) -> libc::c_int; + fn __errno_location() -> *mut libc::c_int; + fn sudo_warn_nodebug_v1(fmt: *const libc::c_char, _: ...); + fn sudo_warnx_nodebug_v1(fmt: *const libc::c_char, _: ...); + fn fcntl(__fd: libc::c_int, __cmd: libc::c_int, ...); + fn realloc(__ptr: *mut libc::c_void, __size: libc::size_t) -> *mut libc::c_void; + fn memset(__s: *mut libc::c_void, __c: libc::c_int, _n: libc::size_t) -> *mut libc::c_void; + fn strtok_r( + __s: *mut libc::c_char, + __delim: *const libc::c_char, + __save_ptr: *mut *mut libc::c_char, + ) -> *mut libc::c_char; + fn strchr(__s: *const libc::c_char, __c: libc::c_int) -> *mut libc::c_char; + fn strcasecmp(__s1: *const libc::c_char, __s2: *const libc::c_char) -> libc::c_int; + fn strcmp(__s1: *const libc::c_char, __s2: *const libc::c_char) -> libc::c_int; + fn malloc(__size: libc::size_t) -> *mut libc::c_void; + fn snprintf( + _: *mut libc::c_char, + _: libc::c_ulong, + _: *const libc::c_char, + _: ... + ) -> libc::c_int; + fn getpid() -> __pid_t; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; + fn fork() -> pid_t; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn sudo_getprogname() -> *const libc::c_char; + fn strerror(_: libc::c_int) -> *mut libc::c_char; + fn time(__timer: *mut time_t) -> time_t; + fn ctime(__timer: *const time_t) -> *mut libc::c_char; + fn writev(__fd: libc::c_int, __iovec: *const iovec, __count: libc::c_int) -> ssize_t; + fn fchown(__fd: libc::c_int, __owner: __uid_t, __group: __gid_t) -> libc::c_int; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct iovec { + pub iov_base: *mut libc::c_void, + pub iov_len: size_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_output_sle { + pub sle_next: *mut sudo_debug_output, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_output { + pub entries: sudo_debug_output_sle, + pub filename: *mut libc::c_char, + pub settings: *mut libc::c_int, + pub fd: libc::c_int, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_output_list { + pub slh_first: *mut sudo_debug_output, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_instance { + pub program: *mut libc::c_char, + pub subsystems: *const *const libc::c_char, + pub subsystem_ids: *const libc::c_uint, + pub max_subsystem: libc::c_uint, + pub outputs: sudo_debug_output_list, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_file_list { + pub tqe_next: *mut sudo_debug_file, + pub tqe_prev: *mut *mut sudo_debug_file, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_debug_file { + pub entries: sudo_debug_file_list, + pub debug_file: *mut libc::c_char, + pub debug_flags: *mut libc::c_char, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_conf_debug_file_list { + tqh_first: *mut sudo_debug_file, + tqh_last: *mut *mut sudo_debug_file, +} + +static mut sudo_debug_fds_size: libc::c_int = -1; +static mut sudo_debug_fds: *mut libc::c_uchar = 0 as *const libc::c_char as *mut libc::c_uchar; +static mut sudo_debug_max_fd: libc::c_int = -1; +static mut sudo_debug_instances: [*mut sudo_debug_instance; SUDO_DEBUG_INSTANCE_MAX!()] = + [0 as *const sudo_debug_instance as *mut sudo_debug_instance; SUDO_DEBUG_INSTANCE_MAX!()]; +static mut sudo_debug_last_instance: libc::c_int = -1; +static mut sudo_debug_active_instance: libc::c_int = -(1 as libc::c_int); +static mut sudo_debug_pidstr: [libc::c_char; 14] = [0; 14]; +static mut sudo_debug_pidlen: size_t = 0; + +/* + * Free the specified output structure. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_free_output(output: *mut sudo_debug_output) { + free((*output).filename as *mut libc::c_void); + free((*output).settings as *mut libc::c_void); + if ((*output).fd) != -1 { + close((*output).fd); + } + free(output as *mut libc::c_void); +} + +/* + * Create a new output file for the specified debug instance. + * Returns NULL if the file cannot be opened or memory cannot be allocated. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_new_output( + instance: *mut sudo_debug_instance, + debug_file: *mut sudo_debug_file, +) -> *mut sudo_debug_output { + let mut buf: *mut libc::c_char = 0 as *mut libc::c_char; + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut last: *mut libc::c_char = 0 as *mut libc::c_char; + let mut subsys: *mut libc::c_char = 0 as *mut libc::c_char; + let mut pri: *mut libc::c_char = 0 as *mut libc::c_char; + let mut output: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + let j: libc::c_uint = 0; + let i: libc::c_int = 0; + let mut isbad: bool = false; + + /* Create new output for the instance. */ + /* XXX - reuse fd for existing filename? */ + output = calloc(1, std::mem::size_of::() as libc::size_t) + as *mut sudo_debug_output; + + 'oom: loop { + if output == 0 as *mut sudo_debug_output { + break 'oom; + } + + (*output).fd = -1; + (*output).settings = reallocarray( + 0 as *mut libc::c_void, + ((*instance).max_subsystem + 1) as libc::size_t, + std::mem::size_of::() as libc::size_t, + ) as *mut libc::c_int; + if ((*output).settings).is_null() { + break 'oom; + } + + (*output).filename = strdup((*debug_file).debug_file); + if ((*output).filename).is_null() { + break 'oom; + } + (*output).fd = -1; + + /* Init per-subsystems settings to -1 since 0 is a valid priority. */ + for j in 0..(*instance).max_subsystem + 1 { + *((*output).settings).offset(j as isize) = -(1 as libc::c_int); + } + + /* Open debug file. */ + (*output).fd = open( + (*output).filename, + O_WRONLY!() | O_APPEND!(), + S_IRUSR!() | S_IWUSR!(), + ); + + if (*output).fd == -1 { + /* Create debug file as needed and set group ownership. */ + if *__errno_location() == libc::ENOENT as libc::c_int { + (*output).fd = open( + (*output).filename, + O_WRONLY!() | O_APPEND!() | O_CREAT!(), + S_IRUSR!() | S_IWUSR!(), + ); + } + if (*output).fd == -1 { + sudo_warn_nodebug_v1((*output).filename); + /*goto bad;*/ + isbad = true; + break 'oom; + } + // ignore_result(fchown(output->fd, (uid_t)-1, 0)); + let mut _y: libc::c_int = fchown( + (*output).fd, + -(1 as libc::c_int) as uid_t, + 0 as libc::c_int as __gid_t, + ); + } + + fcntl((*output).fd, F_SETFD!() | FD_CLOEXEC!()); + if sudo_debug_fds_size < (*output).fd { + /* Bump fds size to the next multiple of 4 * NBBY. */ + let old_size = sudo_debug_fds_size / NBBY; + let new_size = round_nfds!((*output).fd + 1) / NBBY; + let new_fds: *mut libc::c_uchar; + + new_fds = realloc( + sudo_debug_fds as *mut libc::c_void, + new_size as libc::size_t, + ) as *mut libc::c_uchar; + if new_fds.is_null() { + break 'oom; + } + memset( + new_fds.offset(old_size as isize) as *mut libc::c_void, + 0, + (new_size - old_size) as libc::size_t, + ); + sudo_debug_fds = new_fds; + sudo_debug_fds_size = new_size * NBBY; + } + + sudo_setbit!(sudo_debug_fds, (*output).fd); + if (*output).fd > sudo_debug_max_fd { + sudo_debug_max_fd = (*output).fd; + } + + /* Parse Debug conf string. */ + buf = strdup((*debug_file).debug_flags); + if buf.is_null() { + break 'oom; + } + cp = strtok_r(buf, b",\0" as *const u8 as *const libc::c_char, &mut last); + while !cp.is_null() { + cp = strtok_r( + 0 as *mut libc::c_char, + b".\0" as *const u8 as *const libc::c_char, + &mut last, + ); + + /* Should be in the form subsys@pri. */ + subsys = cp; + pri = strchr(cp, '@' as libc::c_int); + if pri.is_null() { + continue; + } + + pri = pri.offset(1); + + /* Look up priority and subsystem, fill in sudo_debug_settings[]. */ + while !(sudo_debug_priorities[i as usize]).is_null() { + let mut ret = strcasecmp( + pri, + (sudo_debug_priorities[i as usize]) as *const libc::c_char, + ); + if ret == 0 { + while !(*((*instance).subsystems).offset(j as isize)).is_null() { + ret = strcasecmp(subsys, b"all\0" as *const u8 as *const libc::c_char); + if ret == 0 { + let mut idx: libc::c_uint = if (*instance).subsystem_ids.is_null() { + SUDO_DEBUG_SUBSYS!(*((*instance).subsystem_ids).offset(j as isize)) + as libc::c_uint + } else { + j + }; + if i > *((*output).settings).offset(idx as isize) { + *((*output).settings).offset(idx as isize) = i; + } + continue; + } + + ret = strcasecmp(subsys, *((*instance).subsystems).offset(j as isize)); + if ret == 0 { + let mut idx: libc::c_uint = if (*instance).subsystem_ids.is_null() { + SUDO_DEBUG_SUBSYS!(*((*instance).subsystem_ids).offset(j as isize)) + as libc::c_uint + } else { + j + }; + if i > *((*output).settings).offset(idx as isize) { + *((*output).settings).offset(idx as isize) = i; + } + break; + } // strcasecmp + } // subsystems + } // !strcasecmp + } // sudo_debug_priorities + } // ! !cp.is_null + + break 'oom; + } // 'oom loop + + free(buf as *mut libc::c_void); + + /* oom: isbad 默认是false,默认会执行下面语句*/ + if !isbad { + sudo_warn_nodebug_v1(0 as *const libc::c_char); + } + + /* bad: */ + if output.is_null() { + sudo_debug_free_output(output); + } + return 0 as *mut sudo_debug_output; +} + +/* + * Register a program/plugin with the debug framework, + * parses settings string from sudo.conf and opens debug_files. + * If subsystem names are specified they override the default values. + * NOTE: subsystems must not be freed by caller unless deregistered. + * Sets the active instance to the newly registered instance. + * Returns instance index on success, SUDO_DEBUG_INSTANCE_INITIALIZER + * if no debug files are specified and SUDO_DEBUG_INSTANCE_ERROR + * on error. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_register_v1( + mut program: *const libc::c_char, + mut subsystems: *const *const libc::c_char, + mut ids: *mut libc::c_uint, + mut debug_files: *mut sudo_conf_debug_file_list, +) -> libc::c_int { + let mut instance: *mut sudo_debug_instance = 0 as *mut sudo_debug_instance; + let mut output: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + let mut debug_file: *mut sudo_debug_file = 0 as *mut sudo_debug_file; + let mut idx: libc::c_int = -1; + let mut free_idx: libc::c_int = -1; + + debug_decl_func!(sudo_debug_register); + + if debug_files.is_null() { + return SUDO_DEBUG_INSTANCE_INITIALIZER!(); + } + + /* Use default subsystem names if none are provided. */ + if subsystems.is_null() { + subsystems = sudo_debug_default_subsystems.as_ptr(); + } else if ids.is_null() { + return SUDO_DEBUG_INSTANCE_ERROR!(); + } + + /* Search for existing instance. */ + for i in 0..sudo_debug_last_instance + 1 { + if sudo_debug_instances[i as usize].is_null() { + free_idx = i; + continue; + } + + if (*sudo_debug_instances[i as usize]).subsystems == subsystems + && strcmp((*sudo_debug_instances[i as usize]).program, program) == 0 + { + instance = sudo_debug_instances[i as usize]; + break; + } + } + + if instance.is_null() { + let mut i: libc::c_uint = 0; + let mut max_id: libc::c_uint = NUM_DEF_SUBSYSTEMS!() - 1; + + /* Fill in subsystem name -> id mapping as needed. */ + if !ids.is_null() { + while !subsystems.offset(i as isize).is_null() { + i += 1; + /* Check default subsystems. */ + for mut j in 0..NUM_DEF_SUBSYSTEMS!() { + if strcmp( + *subsystems.offset(i as isize), + sudo_debug_default_subsystems[j as usize], + ) == 0 + { + break; + } + + if j == NUM_DEF_SUBSYSTEMS!() { + max_id += 1; + j = max_id; + } + *(ids.offset(i as isize)) = (j + 1) << 6; + } // for j in NUM_DEF_SUBSYSTEMS!() + } // !while !subsystems[i].is_null() + } // !!ids.is_null() + + if free_idx != -1 { + idx = free_idx; + } + if idx == SUDO_DEBUG_INSTANCE_MAX!() { + /* XXX - realloc? */ + sudo_warnx_nodebug_v1( + b"too many debug instances (max %d)\0" as *const u8 as *const libc::c_char, + SUDO_DEBUG_INSTANCE_MAX!(), + ); + return SUDO_DEBUG_INSTANCE_ERROR!(); + } + + if (idx != (sudo_debug_last_instance + 1)) && (idx != free_idx) { + sudo_warnx_nodebug_v1( + b"%s: instance number mismatch: expected %d or %d, got %d\0" as *const u8 + as *const libc::c_char, + stdext::function_name!().as_ptr() as *const libc::c_char, + sudo_debug_last_instance + 1, + free_idx, + idx, + ); + return SUDO_DEBUG_INSTANCE_ERROR!(); + } + instance = malloc(std::mem::size_of::() as libc::size_t) + as *mut sudo_debug_instance; + if instance.is_null() { + return SUDO_DEBUG_INSTANCE_ERROR!(); + } + + (*instance).program = strdup(program); + if (*instance).program.is_null() { + free(instance as *mut libc::c_void); + return SUDO_DEBUG_INSTANCE_ERROR!(); + } + (*instance).subsystems = subsystems; + (*instance).subsystem_ids = ids; + (*instance).max_subsystem = max_id; + (*instance).outputs.slh_first = 0 as *mut sudo_debug_output; + sudo_debug_instances[idx as usize] = instance; + if idx != free_idx { + sudo_debug_last_instance += 1; + } + /* Check for matching instance but different ids[]. */ + } else if !ids.is_null() && (*instance).subsystem_ids != ids { + let mut i: libc::c_uint = 0; + loop { + if subsystems.offset(i as isize).is_null() { + break; + } + *(ids.offset(i as isize)) = *((*instance).subsystem_ids).offset(i as isize); + i += 1; + } + } + + debug_file = (*debug_files).tqh_first; + while !debug_file.is_null() { + output = sudo_debug_new_output(instance, debug_file); + if output.is_null() { + (*output).entries.sle_next = (*instance).outputs.slh_first; + (*instance).outputs.slh_first = output; + } + debug_file = (*debug_file).entries.tqe_next; + } + + /* Set active instance. */ + sudo_debug_active_instance = idx; + + /* Stash the pid string so we only have to format it once. */ + + if sudo_debug_pidlen == 0 { + snprintf( + sudo_debug_pidstr.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_char; 14]>() as libc::c_ulong, + b"[%d] \0" as *const u8 as *const libc::c_char, + getpid(), + ); + sudo_debug_pidlen = strlen(sudo_debug_pidstr.as_mut_ptr()) as size_t; + } + + return idx; +} + +/* + * De-register the specified instance from the debug subsystem + * and free up any associated data structures. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_deregister_v1(mut idx: libc::c_int) -> libc::c_int { + let mut instance: *mut sudo_debug_instance = 0 as *mut sudo_debug_instance; + let mut output: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + let mut next: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + + debug_decl_func!(sudo_debug_deregister); + + if idx < 0 || idx > sudo_debug_last_instance { + sudo_warnx_nodebug_v1( + b"%s: invalid instance ID %d, max %d\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr() as *const libc::c_char, + idx, + sudo_debug_last_instance, + ); + return -1; + } + + /* Reset active instance as needed. */ + if sudo_debug_active_instance == idx { + sudo_debug_active_instance = -1; + } + + instance = sudo_debug_instances[idx as usize]; + if instance.is_null() { + return -1; /* already deregistered */ + } + + /* Free up instance data, note that subsystems[] is owned by caller. */ + sudo_debug_instances[idx as usize] = 0 as *mut sudo_debug_instance; + + while output.is_null() && { + next = (*output).entries.sle_next; + 1 as libc::c_int != 0 + } { + close((*output).fd); + free((*output).filename as *mut libc::c_void); + free((*output).settings as *mut libc::c_void); + free(output as *mut libc::c_void); + output = next; + } + + free((*instance).program as *mut libc::c_void); + free(instance as *mut libc::c_void); + + if idx == sudo_debug_last_instance { + sudo_debug_last_instance -= 1; + } + + return 0; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_get_instance_v1( + mut program: *const libc::c_char, +) -> libc::c_int { + for idx in 0..sudo_debug_last_instance { + if sudo_debug_instances[idx as usize].is_null() { + continue; + } + if strcmp((*sudo_debug_instances[idx as usize]).program, program) == 0 { + return idx; + } + } + return SUDO_DEBUG_INSTANCE_INITIALIZER!(); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_fork_v1() -> pid_t { + let mut pid: pid_t = 0 as pid_t; + + pid = fork(); + if pid == 0 { + snprintf( + sudo_debug_pidstr.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_char; 14]>() as libc::c_ulong, + b"[%d] \0" as *const u8 as *const libc::c_char, + getpid(), + ); + sudo_debug_pidlen = strlen(sudo_debug_pidstr.as_mut_ptr()) as usize; + } + return pid; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_enter_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"-> %s @ %s:%d\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_int_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: libc::c_int, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %d\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_long_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: libc::c_long, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %ld\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_id_t_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: id_t, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %d\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret as libc::c_int, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_size_t_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: size_t, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %zu\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_ssize_t_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: ssize_t, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %zd\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_time_t_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: time_t, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %lld\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret as libc::c_longlong, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_bool_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: bool, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %s\0" as *const u8 as *const libc::c_char, + func, + file, + line, + if ret { + b"true\0" as *const u8 as *const libc::c_char + } else { + b"false\0" as *const u8 as *const libc::c_char + }, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_str_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: *const libc::c_char, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %s\0" as *const u8 as *const libc::c_char, + func, + file, + line, + if ret.is_null() { + ret + } else { + b"(null)\0" as *const u8 as *const libc::c_char + }, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_str_masked_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: *const libc::c_char, +) { + static mut stars: [libc::c_char; 81] = unsafe { + *::std::mem::transmute::<&[u8; 81], &[libc::c_char; 81]>( + b"********************************************************************************\0", + ) + }; + + let mut len: libc::c_int = (if !ret.is_null() { + strlen(ret) + } else { + (::std::mem::size_of::<[libc::c_char; 7]>() as libc::c_ulong).wrapping_sub(1) + }) as libc::c_int; + + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %.*s\0" as *const u8 as *const libc::c_char, + func, + file, + line, + len, + if !ret.is_null() { + stars.as_ptr() + } else { + b"(null)\0" as *const u8 as *const libc::c_char + }, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_exit_ptr_v1( + func: *const libc::c_char, + file: *const libc::c_char, + line: libc::c_int, + subsys: libc::c_int, + ret: *const libc::c_void, +) { + sudo_debug_printf2_v1( + 0 as *mut libc::c_char, + 0 as *mut libc::c_char, + 0, + subsys | SUDO_DEBUG_TRACE!(), + b"<- %s @ %s:%d := %p\0" as *const u8 as *const libc::c_char, + func, + file, + line, + ret, + ); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_write2_v1( + mut fd: libc::c_int, + mut func: *const libc::c_char, + mut file: *const libc::c_char, + mut lineno: libc::c_int, + mut str: *const libc::c_char, + mut len: libc::c_int, + mut errnum: libc::c_int, +) { + let mut timestr: *mut libc::c_char = 0 as *mut libc::c_char; + let mut numbuf: [libc::c_char; 13] = [0; 13]; + + let mut now: time_t = 0 as time_t; + let mut iov: [iovec; 12] = [iovec { + iov_base: 0 as *mut libc::c_void, + iov_len: 0, + }; 12]; + let mut iovcnt: libc::c_int = 3; + + iov[1].iov_base = sudo_getprogname() as *mut libc::c_char as *mut libc::c_void; + iov[1].iov_len = strlen(iov[1 as usize].iov_base as *const libc::c_char) as size_t; + iov[2].iov_base = sudo_debug_pidstr.as_mut_ptr() as *mut libc::c_void; + iov[2].iov_len = sudo_debug_pidlen; + + while len > 0 && *(str.offset((len - 1) as isize)) == '\n' as i32 as libc::c_char { + len -= 1; + } + + if len > 0 { + iov[iovcnt as usize].iov_base = str as *mut libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = len as size_t; + iovcnt += 1; + } + + /* Append error string if errno is specified. */ + if errnum != 0 { + if len > 0 { + iov[iovcnt as usize].iov_base = + b": \0" as *const u8 as *const libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = 2; + } + iov[iovcnt as usize].iov_base = + strerror(errnum) as *const libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = + strlen(iov[iovcnt as usize].iov_base as *const libc::c_char) as size_t; + iovcnt += 1; + } // !if errnum != 0 + + /* If function, file and lineno are specified, append them. */ + if !func.is_null() && !file.is_null() && lineno != 0 { + iov[iovcnt as usize].iov_base = + b" @ \0" as *const u8 as *const libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = 3; + iovcnt += 1; + + iov[iovcnt as usize].iov_base = func as *mut libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = strlen(func as *const libc::c_char) as size_t; + iovcnt += 1; + + iov[iovcnt as usize].iov_base = + b"() \0" as *const u8 as *const libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = 3; + iovcnt += 1; + + iov[iovcnt as usize].iov_base = file as *mut libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = strlen(file as *const libc::c_char) as size_t; + iovcnt += 1; + + snprintf( + numbuf.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_char; 13]>() as libc::c_ulong, + b":%d\0" as *const u8 as *const libc::c_char, + lineno, + ); + iov[iovcnt as usize].iov_base = numbuf.as_mut_ptr() as *mut libc::c_void; + iov[iovcnt as usize].iov_len = strlen(numbuf.as_mut_ptr()) as size_t; + iovcnt += 1; + } + + /* Append newline. */ + iov[iovcnt as usize].iov_base = + b"\n\0" as *const u8 as *const libc::c_char as *mut libc::c_void; + iov[iovcnt as usize].iov_len = 1; + iovcnt += 1; + + /* Do timestamp last due to ctime's static buffer. */ + time(&mut now); + timestr = ctime(&mut now).offset(4 as isize); + *(timestr.offset(15 as isize)) = ' ' as i32 as libc::c_char; /* replace year with a space */ + *(timestr.offset(16 as isize)) = '\0' as i32 as libc::c_char; + iov[0 as usize].iov_base = timestr as *mut libc::c_void; + iov[0 as usize].iov_len = 16; + + /* Write message in a single syscall */ + // ignore_result(writev(fd, iov, iovcnt)); + let mut _y: ssize_t = writev(fd, iov.as_mut_ptr(), iovcnt); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_execve2_v1( + mut level: libc::c_int, + mut path: *const libc::c_char, + mut argv: *const *mut libc::c_char, + mut envp: *const *mut libc::c_char, +) { + let mut buflen: libc::c_int = 0; + let mut pri: libc::c_int = 0; + let mut saved_errno: libc::c_int = *__errno_location(); + let mut subsys: libc::c_uint = 0; + let mut instance: *mut sudo_debug_instance = 0 as *mut sudo_debug_instance; + let mut output: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + let mut av: *const *mut libc::c_char = 0 as *const *mut libc::c_char; + let mut cp: *mut libc::c_char = 0 as *mut libc::c_char; + let mut static_buf: [libc::c_char; 4096] = [0; 4096]; + let mut buf: *mut libc::c_char = static_buf.as_mut_ptr(); + let mut plen: size_t = 0; + + debug_decl_func!(sudo_debug_execve2); + + 'out: loop { + if sudo_debug_active_instance == -1 { + break 'out; + } + + pri = SUDO_DEBUG_PRI!(level); + subsys = SUDO_DEBUG_SUBSYS!(level) as libc::c_uint; + + if sudo_debug_active_instance > sudo_debug_last_instance { + sudo_warnx_nodebug_v1( + b"%s: invalid instance ID %d, max %d\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr() as *const libc::c_char, + sudo_debug_active_instance, + sudo_debug_last_instance, + ); + break 'out; + } + + instance = sudo_debug_instances[sudo_debug_active_instance as usize]; + if instance.is_null() { + sudo_warnx_nodebug_v1( + b"%s: unregistered instance index %d\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr() as *const libc::c_char, + sudo_debug_active_instance, + ); + break 'out; + } + + if subsys > (*instance).max_subsystem { + break 'out; + } + + output = (*instance).outputs.slh_first; + while !output.is_null() { + let mut log_envp: bool = false; + + /* Make sure we want debug info at this level. */ + if *((*output).settings).offset(subsys as isize) < pri { + continue; + } + + /* Log envp for debug level "debug". */ + if *((*output).settings).offset(subsys as isize) >= SUDO_DEBUG_DEBUG!() - 1 + && !(*envp.offset(0 as isize)).is_null() + { + log_envp = true; + } + + /* Alloc and build up buffer. */ + plen = strlen(path) as size_t; + let EXEC_PREFIX_len: libc::c_int = + ::std::mem::size_of::<[libc::c_char; 6]>() as libc::c_int; + buflen = EXEC_PREFIX_len + .wrapping_sub(1) + .wrapping_add(plen as libc::c_int) as libc::c_int; + + if argv.offset(0 as isize).is_null() { + buflen += ::std::mem::size_of::<[libc::c_char; 4]>().wrapping_sub(1) as libc::c_int; + + av = argv; + while !(*av).is_null() { + buflen = buflen.wrapping_add((strlen(*av)).wrapping_add(1) as libc::c_int) + as libc::c_int; + av = av.offset(1); + } + buflen -= 1; + } + + if log_envp { + buflen += ::std::mem::size_of::<[libc::c_char; 4]>().wrapping_sub(1) as libc::c_int; + av = envp; + while !(*av).is_null() { + buflen = buflen.wrapping_add((strlen(*av)).wrapping_add(1) as libc::c_int) + as libc::c_int; + av = av.offset(1); + } + buflen -= 1; + } + + if buflen >= ::std::mem::size_of::<[libc::c_char; 4096]>() as libc::c_int { + buf = malloc((buflen + 1) as usize) as *mut libc::c_char; + if buf.is_null() { + break 'out; + } + } + + /* Copy prefix and command. */ + memcpy( + buf as *mut libc::c_void, + b"exec \0" as *const u8 as *const libc::c_char as *const libc::c_void, + EXEC_PREFIX_len.wrapping_sub(1) as libc::c_ulong, + ); + cp = buf.offset(EXEC_PREFIX_len.wrapping_sub(1) as isize); + memcpy( + cp as *mut libc::c_void, + path as *mut libc::c_void, + plen as libc::c_ulong, + ); + cp = cp.offset(plen as isize); + + /* Copy argv. */ + if argv.offset(0).is_null() { + cp = cp.offset(1); + *cp = ' ' as i32 as libc::c_char; + cp = cp.offset(1); + *cp = '[' as i32 as libc::c_char; + av = argv; + while (*av).is_null() { + let mut avlen: size_t = strlen(*av) as size_t; + memcpy( + cp as *mut libc::c_void, + *av as *mut libc::c_void, + avlen as libc::c_ulong, + ); + cp = cp.offset(avlen as isize); + cp = cp.offset(1); + *cp = ' ' as i32 as libc::c_char; + av = av.offset(1); + } // !while + *cp.offset(-(1 as libc::c_int) as isize) = ']' as i32 as libc::c_char; + } // !if argv.offset(0) + + if log_envp { + cp = cp.offset(1); + *cp = ' ' as i32 as libc::c_char; + cp = cp.offset(1); + *cp = '[' as i32 as libc::c_char; + av = argv; + while (*av).is_null() { + let mut avlen: size_t = strlen(*av) as size_t; + memcpy( + cp as *mut libc::c_void, + *av as *mut libc::c_void, + avlen as libc::c_ulong, + ); + cp = cp.offset(avlen as isize); + cp = cp.offset(1); + *cp = ' ' as i32 as libc::c_char; + av = av.offset(1); + } // !while + *cp.offset(-(1 as libc::c_int) as isize) = ']' as i32 as libc::c_char; + } // !if log_envp + + *cp = '\u{0}' as i32 as libc::c_char; + + sudo_debug_write!((*output).fd, buf, buflen, 0); + if buf != static_buf.as_mut_ptr() { + free(buf as *mut libc::c_void); + buf = static_buf.as_mut_ptr(); + } + output = (*output).entries.sle_next; + } // ! while + break 'out; + } // ! out loop + *__errno_location() = saved_errno; +} + +/* + * Returns the active instance or SUDO_DEBUG_INSTANCE_INITIALIZER + * if no instance is active. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_get_active_instance_v1() -> libc::c_int { + return sudo_debug_active_instance; +} + +/* + * Sets a new active instance, returning the old one. + * Note that the old instance may be SUDO_DEBUG_INSTANCE_INITIALIZER + * if this is the only instance. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_set_active_instance_v1(idx: libc::c_int) -> libc::c_int { + let old_idx: libc::c_int = sudo_debug_active_instance; + + if idx >= -1 && idx <= sudo_debug_last_instance { + sudo_debug_active_instance = idx; + } + + return old_idx; +} + +/* + * Replace the ofd with nfd in all outputs if present. + * Also updates sudo_debug_fds. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_update_fd_v1(ofd: libc::c_int, nfd: libc::c_int) { + if ofd <= sudo_debug_max_fd && sudo_isset!(sudo_debug_fds, ofd) != 0 { + /* Update sudo_debug_fds. */ + sudo_clrbit!(sudo_debug_fds, ofd); + sudo_setbit!(sudo_debug_fds, nfd); + + /* Update the outputs. */ + for idx in 0..sudo_debug_last_instance + 1 { + let mut instance: *mut sudo_debug_instance = 0 as *mut sudo_debug_instance; + let mut output: *mut sudo_debug_output = 0 as *mut sudo_debug_output; + + instance = sudo_debug_instances[idx as usize]; + if instance.is_null() { + continue; + } + + output = (*instance).outputs.slh_first; + while !output.is_null() { + if (*output).fd == ofd { + (*output).fd = nfd; + } + output = (*output).entries.sle_next; + } + } + } +} + +/* +* Returns the highest debug output fd or -1 if no debug files open. +* Fills in fds with the value of sudo_debug_fds. +*/ +#[no_mangle] +pub unsafe extern "C" fn sudo_debug_get_fds_v1(mut fds: *mut *mut libc::c_uchar) -> libc::c_int { + *fds = sudo_debug_fds; + return sudo_debug_max_fd; +} diff --git a/utsudo-0.0.2/lib/util/src/sudo_debug_macro.rs b/utsudo-0.0.2/lib/util/src/sudo_debug_macro.rs new file mode 100644 index 0000000..4822b7a --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sudo_debug_macro.rs @@ -0,0 +1,370 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + unused_imports, + unused_macros, + unused_variables +)] + +// use stdext::function_name; +use crate::sudo_debug::*; + +pub static mut sudo_debug_subsys: libc::c_int = 0 as libc::c_int; + + +// extern "C" { +// fn sudo_debug_printf2_v1( +// func: *const libc::c_char, +// file: *const libc::c_char, +// lineno: libc::c_int, +// level: libc::c_int, +// fmt: *const libc::c_char, +// _: ... +// ); +// } + +/* + * The priority and subsystem are encoded in a single 32-bit value. + * The lower 4 bits are the priority and the top 26 bits are the subsystem. + * This allows for 16 priorities and a very large number of subsystems. + * Bit 5 is used as a flag to specify whether to log the errno value. + * Bit 6 specifies whether to log the function, file and line number data. + */ + +/* + * Sudo debug priorities, ordered least to most verbose, + * in other words, highest to lowest priority. Max pri is 15. + * Note: order must match sudo_debug_priorities[] + */ + +/*constants*/ +pub const SUDO_DEBUG_CRIT: libc::c_int = 1; /* critical errors */ +pub const SUDO_DEBUG_ERROR: libc::c_int = 2; /* non-critical errors */ +pub const SUDO_DEBUG_WARN: libc::c_int = 3; /* non-fatal warnings */ +pub const SUDO_DEBUG_NOTICE: libc::c_int = 4; /* non-error condition notices */ +pub const SUDO_DEBUG_DIAG: libc::c_int = 5; /* diagnostic messages */ +pub const SUDO_DEBUG_INFO: libc::c_int = 6; /* informational message */ +pub const SUDO_DEBUG_TRACE: libc::c_int = 7; /* log function enter/exit */ +pub const SUDO_DEBUG_DEBUG: libc::c_int = 8; /* very verbose debugging */ +// /* Flag to include string version of errno in debug info. */ +pub const SUDO_DEBUG_ERRNO: libc::c_int = 1 << 4; +// /* Flag to include function, file and line number in debug info. */ +pub const SUDO_DEBUG_LINENO: libc::c_int = 1 << 5; +// /* +// * Sudo debug subsystems. +// * This includes subsystems in the sudoers plugin. +// * Note: order must match sudo_debug_subsystems[] +// */ +pub const SUDO_DEBUG_ARGS: libc::c_int = 1 << 6; /* command line argument handling */ +pub const SUDO_DEBUG_CONV: libc::c_int = 2 << 6; /* user conversation */ +pub const SUDO_DEBUG_EDIT: libc::c_int = 3 << 6; /* sudoedit */ +pub const SUDO_DEBUG_EVENT: libc::c_int = 4 << 6; /* event handling */ +pub const SUDO_DEBUG_EXEC: libc::c_int = 5 << 6; /* command execution */ +pub const SUDO_DEBUG_HOOKS: libc::c_int = 6 << 6; /* hook functions */ +pub const SUDO_DEBUG_MAIN: libc::c_int = 7 << 6; /* sudo main() */ +pub const SUDO_DEBUG_NETIF: libc::c_int = 8 << 6; /* network interface functions */ +pub const SUDO_DEBUG_PCOMM: libc::c_int = 9 << 6; /* plugin communications */ +pub const SUDO_DEBUG_PLUGIN: libc::c_int = 10 << 6; /* main plugin functions */ +pub const SUDO_DEBUG_PTY: libc::c_int = 11 << 6; /* pseudo-tty */ +pub const SUDO_DEBUG_SELINUX: libc::c_int = 12 << 6; /* selinux */ +pub const SUDO_DEBUG_UTIL: libc::c_int = 13 << 6; /* utility functions */ +pub const SUDO_DEBUG_UTMP: libc::c_int = 14 << 6; /* utmp file ops */ + +macro_rules! SUDO_DEBUG_ALL { + /* all subsystems */ + () => { + 0xffff0000 + }; +} + +// /* Error return for sudo_debug_register(). */ +pub const SUDO_DEBUG_INSTANCE_ERROR: libc::c_int = -2; + +// /* Initializer for instance index to indicate that debugging is not setup. */ +// #define -1 +pub const SUDO_DEBUG_INSTANCE_INITIALIZER: libc::c_int = -1; + +// /* Extract priority number and convert to an index. */ +macro_rules! SUDO_DEBUG_PRI { + ($n:expr) => { + ((($n) & 0x0f) - 1) + }; +} + +// /* Extract subsystem number and convert to an index. */ +macro_rules! SUDO_DEBUG_SUBSYS { + ($n:expr) => { + ((($n) >> 6) - 1) + }; +} + +// 啥也没调用 +macro_rules! debug_decl_func { + ($funcname:expr) => {}; +} + +#[macro_export] +macro_rules! debug_decl_vars { + ($funcname:expr, $subsys:expr) => { + crate::sudo_debug_macro::sudo_debug_subsys = $subsys + }; +} + +#[macro_export] +macro_rules! debug_decl { + ($funcname:expr, $subsys:expr) => { + debug_decl_vars!($funcname, $subsys); + sudo_debug_enter_v1( + $funcname as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + ); + }; +} + + +macro_rules! debug_return_int { + ($ret:expr) => {{ + sudo_debug_exit_int_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret, + ); + return $ret; + }}; +} + +#[macro_export] +macro_rules! debug_return_id_t { + ($ret:expr) => {{ + sudo_debug_exit_id_t_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret, + ); + return $ret; + }}; +} + +#[macro_export] +macro_rules! debug_return_size_t { + ($ret:expr) => { + let mut sudo_debug_ret: size_t = ($ret); + sudo_debug_exit_size_t( + function_name!(), + file!(), + line!(), + sudo_debug_subsys, + sudo_debug_ret, + ); + sudo_debug_ret + }; +} + +#[macro_export] +macro_rules! debug_return_ssize_t { + ($ret:expr) => {{ + sudo_debug_exit_ssize_t_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret, + ); + return $ret; + }}; +} + +#[macro_export] +macro_rules! debug_return_time_t { + ($ret:expr) => { + let mut sudo_debug_ret: time_t = ($ret); + sudo_debug_exit_time_t( + function_name!(), + file!(), + line!(), + sudo_debug_subsys, + sudo_debug_ret, + ); + sudo_debug_ret + }; +} + +#[macro_export] +macro_rules! debug_return_long { + ($ret:expr) => { + let mut sudo_debug_ret: long = ($ret); + sudo_debug_exit_long( + function_name!(), + file!(), + line!(), + sudo_debug_subsys, + sudo_debug_ret, + ); + sudo_debug_ret + }; +} + +#[macro_export] +macro_rules! debug_return_bool { + ($ret:expr) => {{ + sudo_debug_exit_bool_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + return $ret, + ); + return $ret; + }}; +} + + +macro_rules! debug_return_str { + ($ret:expr) => {{ + sudo_debug_exit_str_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret, + ); + return $ret; + }}; +} + + +macro_rules! debug_return_const_str { + ($ret:expr) => { + let mut sudo_debug_ret: *mut libc::c_char = ($ret); + sudo_debug_exit_str( + function_name!(), + file!(), + line!(), + sudo_debug_subsys, + sudo_debug_ret, + ); + sudo_debug_ret + }; +} + +macro_rules! debug_return_str_masked { + ($ret:expr) => {{ + sudo_debug_exit_str_masked( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret, + ); + return $ret; + }}; +} + +macro_rules! debug_return_ptr { + ($ret:expr) => {{ + sudo_debug_exit_ptr_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret as *const libc::c_void, + ); + return $ret; + }}; +} + +macro_rules! debug_return_const_ptr { + ($ret:expr) => {{ + sudo_debug_exit_ptr_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + $ret as *const libc::c_void, + ); + return $ret; + }}; +} + +macro_rules! sudo_debug_execve { + ($ret:expr) => {}; +} + +macro_rules! sudo_debug_write { + ($ret:expr) => {}; +} + +// #define sudo_debug_write(fd, str, len, errnum) \ +// sudo_debug_write2(fd, NULL, NULL, 0, (str), (len), (errnum)) + +macro_rules! sudo_debug_write { + ($fd:expr, $str:expr, $len:expr, $errnum:expr) => {{ + sudo_debug_write2_v1( + $fd as libc::c_int, + 0 as *const libc::c_char, + 0 as *const libc::c_char, + 0 as libc::c_int, + $str as *const libc::c_char, + $len as libc::c_int, + $errnum as libc::c_int, + ); + }}; +} + +// # define sudo_debug_printf(pri, ...) \ +// sudo_debug_printf2(__func__, __FILE__, __LINE__, (pri)|sudo_debug_subsys, \ +// __VA_ARGS__) +// #endif + +macro_rules! sudo_debug_printf { + ($pri:expr, $($arg:tt)*) => {{ + sudo_debug_printf2_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + ($pri | crate::sudo_debug_macro::sudo_debug_subsys) as libc::c_int, + $($arg)*, + ); + }}; +} + +macro_rules! debug_return { + () => {{ + sudo_debug_exit_v1( + stdext::function_name!().as_ptr() as *const libc::c_char, + file!().as_ptr() as *const libc::c_char, + line!() as libc::c_int, + crate::sudo_debug_macro::sudo_debug_subsys as libc::c_int, + ); + return; + }}; +} + +macro_rules! sudo_warn { + ($fmt:expr, $($arg:tt)*) => {{ + sudo_warn_nodebug_v1($fmt, $($arg)*); + }}; +} + +macro_rules! sudo_warnx { + ($fmt:expr, $($arg:tt)*) => {{ + sudo_warnx_nodebug_v1($fmt, $($arg)*); + }}; +} diff --git a/utsudo-0.0.2/lib/util/src/sudo_dso.rs b/utsudo-0.0.2/lib/util/src/sudo_dso.rs new file mode 100644 index 0000000..625cf52 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/sudo_dso.rs @@ -0,0 +1,231 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +//secure_path.rs +use crate::ISSET; + +/* Values for sudo_dso_load() mode. */ +// #define SUDO_DSO_LAZY 0x1 +// #define SUDO_DSO_NOW 0x2 +// #define SUDO_DSO_GLOBAL 0x4 +// #define SUDO_DSO_LOCAL 0x8 + +#[macro_export] +macro_rules! SUDO_DSO_LAZY { + () => { + 0x1 + }; +} + +#[macro_export] +macro_rules! SUDO_DSO_NOW { + () => { + 0x2 + }; +} + +#[macro_export] +macro_rules! SUDO_DSO_GLOBAL { + () => { + 0x3 + }; +} + +#[macro_export] +macro_rules! SUDO_DSO_LOCAL { + () => { + 0x4 + }; +} + +/* The MODE argument to `dlopen' contains one of the following: */ +// #define RTLD_LAZY 0x00001 /* Lazy function call binding. */ +// #define RTLD_NOW 0x00002 /* Immediate function call binding. */ +#[macro_export] +macro_rules! RTLD_LAZY { + () => { + 0x00001 + }; +} + +#[macro_export] +macro_rules! RTLD_NOW { + () => { + 0x00002 + }; +} + +// #define RTLD_GLOBAL 0x00100 +#[macro_export] +macro_rules! RTLD_GLOBAL { + () => { + 0x00100 + }; +} + +// #define RTLD_LOCAL 0 +#[macro_export] +macro_rules! RTLD_LOCAL { + () => { + 0 + }; +} + +/* Special handle arguments for sudo_dso_findsym(). */ +// #define SUDO_DSO_NEXT ((void *)-1) /* Search subsequent objects. */ +// #define SUDO_DSO_DEFAULT ((void *)-2) /* Use default search algorithm. */ +// #define SUDO_DSO_SELF ((void *)-3) /* Search the caller itself. */ +pub const SUDO_DSO_NEXT: *mut libc::c_void = -(1 as libc::c_int) as *mut libc::c_void; +pub const SUDO_DSO_DEFAULT: *mut libc::c_void = -(2 as libc::c_int) as *mut libc::c_void; +pub const SUDO_DSO_SELF: *mut libc::c_void = -(3 as libc::c_int) as *mut libc::c_void; + +// # define RTLD_NEXT ((void *) -1l) +pub const RTLD_NEXT: *mut libc::c_void = -(1 as libc::c_long) as *mut libc::c_void; + +// # define RTLD_DEFAULT ((void *) 0) +pub const RTLD_DEFAULT: *mut libc::c_void = 0 as *mut libc::c_void; + +// #define ENOENT 2 +pub const ENOENT: libc::c_int = 2; + +extern "C" { + fn dlerror() -> *mut libc::c_char; + fn dlclose(__handle: *mut libc::c_void) -> libc::c_int; + fn strcmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn dlopen(__file: *const libc::c_char, __mode: libc::c_int) -> *mut libc::c_void; + fn dlsym(__handle: *mut libc::c_void, __name: *const libc::c_char) -> *mut libc::c_void; + fn __errno_location() -> *mut libc::c_int; +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_preload_symbol { + pub name: *const libc::c_char, + pub addr: *mut libc::c_void, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sudo_preload_table { + pub path: *const libc::c_char, + pub handle: *mut libc::c_void, + pub symbols: *mut sudo_preload_symbol, +} + +static mut preload_table: *mut sudo_preload_table = 0 as *mut sudo_preload_table; + +#[no_mangle] +pub unsafe extern "C" fn sudo_dso_preload_table_v1(mut table: *mut sudo_preload_table) { + preload_table = table; +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_dso_load_v1( + mut path: *const libc::c_char, + mut mode: libc::c_int, +) -> *mut libc::c_void { + let mut pt: *mut sudo_preload_table = 0 as *mut sudo_preload_table; + let mut flags: libc::c_int = 0; + + /* Check prelinked symbols first. */ + if !preload_table.is_null() { + pt = preload_table; + while !((*pt).handle).is_null() { + if !((*pt).path).is_null() && strcmp(path, (*pt).path) == 0 { + return (*pt).handle; + } + pt = pt.offset(1); + } + } + + /* Map SUDO_DSO_* -> RTLD_* */ + if ISSET!(mode, SUDO_DSO_LAZY!()) != 0 { + flags = flags | RTLD_LAZY!(); + } + if ISSET!(mode, SUDO_DSO_NOW!()) != 0 { + flags = flags | RTLD_NOW!(); + } + if ISSET!(mode, SUDO_DSO_GLOBAL!()) != 0 { + flags = flags | RTLD_GLOBAL!(); + } + if ISSET!(mode, SUDO_DSO_LOCAL!()) != 0 { + flags = flags | RTLD_LOCAL!(); + } + + return dlopen(path, flags); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_dso_unload_v1(mut handle: *mut libc::c_void) -> libc::c_int { + let mut pt: *mut sudo_preload_table = 0 as *mut sudo_preload_table; + + /* Check prelinked symbols first. */ + if !preload_table.is_null() { + pt = preload_table; + while !((*pt).handle).is_null() { + if (*pt).handle == handle { + return 0; + } + pt = pt.offset(1 as isize); + } + } + return dlclose(handle); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_dso_findsym_v1( + mut handle: *mut libc::c_void, + mut symbol: *const libc::c_char, +) -> *mut libc::c_void { + let mut pt: *mut sudo_preload_table = 0 as *mut sudo_preload_table; + /* Check prelinked symbols first. */ + if !preload_table.is_null() { + pt = preload_table; + while !((*pt).handle).is_null() { + if (*pt).handle == handle { + let mut sym: *mut sudo_preload_symbol = (*pt).symbols; + while !(*sym).name.is_null() { + if strcmp((*sym).name, symbol) == 0 { + return (*sym).addr; + } + sym = sym.offset(1); + } + *__errno_location() = ENOENT; + return 0 as *mut libc::c_void; + } + pt = pt.offset(1); + } + } + + /* + * Not all implementations support the special handles. + */ + if handle == SUDO_DSO_NEXT { + handle = RTLD_NEXT; + } else if handle == SUDO_DSO_DEFAULT { + handle = RTLD_DEFAULT; + } else if handle == SUDO_DSO_SELF { + *__errno_location() = ENOENT; + return 0 as *mut libc::c_void; + } + + return dlsym(handle, symbol); +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_dso_strerror_v1() -> *mut libc::c_char { + return dlerror(); +} diff --git a/utsudo-0.0.2/lib/util/src/term.rs b/utsudo-0.0.2/lib/util/src/term.rs new file mode 100644 index 0000000..00352ae --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/term.rs @@ -0,0 +1,940 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + clashing_extern_declarations +)] + +//ttysize.rs文件中定义 +use crate::TIOCGWINSZ; + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_bool_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +/* Type of a signal handler. */ +// typedef void (*__sighandler_t) (int); +pub type __sighandler_t = Option ()>; +pub type __pid_t = libc::c_int; +pub type __uid_t = libc::c_uint; +pub type __clock_t = libc::c_long; +pub type __uint32_t = libc::c_uint; +pub type tcflag_t = libc::c_uint; +pub type cc_t = libc::c_uchar; +pub const NCCS: libc::c_int = 32; +pub type speed_t = libc::c_uint; +// #define EINTR 4 /* Interrupted system call */ +pub const EINTR: libc::c_int = 4; + +/* tgetpass() needs to know the erase and kill chars for cbreak mode. */ +// __dso_public int sudo_term_eof; +// __dso_public int sudo_term_erase; +// __dso_public int sudo_term_kill; + +#[no_mangle] +pub static mut sudo_term_eof: libc::c_int = 0; +#[no_mangle] +pub static mut sudo_term_erase: libc::c_int = 0; +#[no_mangle] +pub static mut sudo_term_kill: libc::c_int = 0; + +#[derive(Copy, Clone)] +#[repr(C)] +pub union sigval { + pub sival_int: libc::c_int, + pub sival_ptr: *mut libc::c_void, +} +pub type __sigval_t = sigval; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct siginfo_t { + pub si_signo: libc::c_int, + pub si_errno: libc::c_int, + pub si_code: libc::c_int, + pub __pad0: libc::c_int, + pub _sifields: sifields_union, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct kill_struct { + pub si_pid: __pid_t, + pub si_uid: __uid_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timer_struct { + pub si_tid: libc::c_int, + pub si_overrun: libc::c_int, + pub si_sigval: __sigval_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct rt_struct { + pub si_pid: __pid_t, + pub si_uid: __uid_t, + pub si_sigval: __sigval_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigchld_struct { + pub si_pid: __pid_t, + pub si_uid: __uid_t, + pub si_status: libc::c_int, + pub si_utime: __clock_t, + pub si_stime: __clock_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigfault_struct { + pub si_addr: *mut libc::c_void, + pub si_addr_lsb: libc::c_short, + pub _bounds: bounds_struct, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigpoll_struct { + pub si_band: libc::c_long, + pub si_fd: libc::c_int, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigsys_struct { + pub _call_addr: *mut libc::c_void, + pub _syscall: libc::c_int, + pub _arch: libc::c_uint, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub union sifields_union { + pub _pad: [libc::c_int; 28], + pub _kill: kill_struct, + pub _timer: timer_struct, + pub _rt: rt_struct, + pub _sigchld: sigchld_struct, + pub _sigfault: sigfault_struct, + pub _sigpoll: sigpoll_struct, + pub _sigsys: sigsys_struct, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct bounds_struct { + pub _addr_bnd: addr_bnd_struct, + pub _key: __uint32_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct addr_bnd_struct { + pub _lower: *mut libc::c_void, + pub _upper: *mut libc::c_void, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct __sigset_t { + pub __val: [libc::c_ulong; 16], +} +pub type sigset_t = __sigset_t; + +#[derive(Copy, Clone)] +#[repr(C)] +pub union __sigaction_handler_union { + /* Used if SA_SIGINFO is not set. */ + sa_handler: __sighandler_t, + + /* Used if SA_SIGINFO is set. */ + sa_sigaction: + Option ()>, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct sigaction { + pub __sigaction_handler: __sigaction_handler_union, + + /* Additional set of signals to be blocked. */ + pub sa_mask: sigset_t, + + /* Special flags. */ + pub sa_flags: libc::c_int, + + /* Restore handler. */ + // void (*sa_restorer) (void); + pub sa_restorer: Option ()>, +} + +/* An integral type that can be modified atomically, without the +possibility of a signal arriving in the middle of the operation. */ +// typedef __sig_atomic_t sig_atomic_t; + +/* C99: An integer type that can be accessed as an atomic entity, +even in the presence of asynchronous interrupts. +It is not currently necessary for this to be machine-specific. */ +// typedef int __sig_atomic_t; + +pub type sig_atomic_t = libc::c_int; +static mut got_sigttou: sig_atomic_t = 0 as sig_atomic_t; + +static mut term: termios = termios { + c_iflag: 0, + c_oflag: 0, + c_cflag: 0, + c_lflag: 0, + c_line: 0, + c_cc: [0; NCCS as usize], + c_ispeed: 0, + c_ospeed: 0, +}; +static mut oterm: termios = termios { + c_iflag: 0, + c_oflag: 0, + c_cflag: 0, + c_lflag: 0, + c_line: 0, + c_cc: [0; NCCS as usize], + c_ispeed: 0, + c_ospeed: 0, +}; +static mut changed: libc::c_int = 0 as libc::c_int; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct termios { + c_iflag: tcflag_t, /* input mode flags */ + c_oflag: tcflag_t, /* output mode flags */ + c_cflag: tcflag_t, /* control mode flags */ + c_lflag: tcflag_t, /* local mode flags */ + c_line: cc_t, /* line discipline */ + c_cc: [cc_t; NCCS as usize], /* control characters */ + c_ispeed: speed_t, /* input speed */ + c_ospeed: speed_t, /* output speed */ +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct winsize { + ws_row: libc::c_ushort, + ws_col: libc::c_ushort, + ws_xpixel: libc::c_ushort, + ws_ypixel: libc::c_ushort, +} + +extern "C" { + fn memset(_: *mut libc::c_void, _: libc::c_int, _: libc::c_ulong) -> *mut libc::c_void; + fn sigemptyset(__set: *mut sigset_t) -> libc::c_int; + fn sigaction( + __sig: libc::c_int, + __act: *const sigaction, + __oact: *mut sigaction, + ) -> libc::c_int; + fn __errno_location() -> *mut libc::c_int; + fn tcsetattr( + __fd: libc::c_int, + __optional_actions: libc::c_int, + __termios_p: *const termios, + ) -> libc::c_int; + fn tcgetattr(__fd: libc::c_int, __termios_p: *mut termios) -> libc::c_int; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn cfsetispeed(__termios_p: *mut termios, __speed: speed_t) -> libc::c_int; + fn cfsetospeed(__termios_p: *mut termios, __speed: speed_t) -> libc::c_int; + fn cfgetospeed(__termios_p: *const termios) -> speed_t; + fn cfgetispeed(__termios_p: *const termios) -> speed_t; + fn ioctl(__fd: libc::c_int, __request: libc::c_ulong, _: ...) -> libc::c_int; +} + +// #define SIGTTOU 22 /* Background write to control terminal. */ +pub const SIGTTOU: libc::c_int = 22; + +// # define TCSASOFT 0 +pub const TCSASOFT: libc::c_int = 0 as libc::c_int; + +// #define TCSADRAIN 1 +pub const TCSADRAIN: libc::c_int = 1 as libc::c_int; + +// #define TCSAFLUSH 2 +pub const TCSAFLUSH: libc::c_int = 2 as libc::c_int; + +// #define VERASE 2 +pub const VERASE: libc::c_int = 2 as libc::c_int; + +// #define VKILL 3 +pub const VKILL: libc::c_int = 3 as libc::c_int; + +// #define VEOF 4 +pub const VEOF: libc::c_int = 4 as libc::c_int; + +// #define VTIME 5 +pub const VTIME: libc::c_int = 5 as libc::c_int; + +// #define VMIN 6 +pub const VMIN: libc::c_int = 6 as libc::c_int; + +// #define CLR(t, f) ((t) &= ~(f)) +#[macro_export] +macro_rules! CLR { + ($t:expr, $f:expr) => { + (($t) &= !($f)) + }; +} + +// #define SET(t, f) ((t) |= (f)) +#[macro_export] +macro_rules! SET { + ($t:expr, $f:expr) => { + (($t) |= ($f)) + }; +} + +// #define ECHO 0000010 +#[macro_export] +macro_rules! ECHO { + () => { + 0000010 + }; +} + +// #define ECHONL 0000100 +#[macro_export] +macro_rules! ECHONL { + () => { + 0000100 + }; +} + +// #define ICRNL 0000400 +#[macro_export] +macro_rules! ICRNL { + () => { + 0000400 + }; +} + +// #define IGNCR 0000200 +#[macro_export] +macro_rules! IGNCR { + () => { + 0000200 + }; +} + +// #define INLCR 0000100 +#[macro_export] +macro_rules! INLCR { + () => { + 0000100 + }; +} + +// #define IUCLC 0001000 +#[macro_export] +macro_rules! IUCLC { + () => { + 0001000 + }; +} + +// #define IXON 0002000 +#[macro_export] +macro_rules! IXON { + () => { + 0002000 + }; +} + +// #define OPOST 0000001 +#[macro_export] +macro_rules! OPOST { + () => { + 0000001 + }; +} + +// #define ICANON 0000002 +#[macro_export] +macro_rules! ICANON { + () => { + 0000002 + }; +} + +// #define ISIG 0000001 +#[macro_export] +macro_rules! ISIG { + () => { + 0000001 + }; +} + +// #define IEXTEN 0100000 +#[macro_export] +macro_rules! IEXTEN { + () => { + 0100000 + }; +} + +// #define IGNPAR 0000004 +#[macro_export] +macro_rules! IGNPAR { + () => { + 0000004 + }; +} + +// #define PARMRK 0000010 +#[macro_export] +macro_rules! PARMRK { + () => { + 0000010 + }; +} +// #define INPCK 0000020 +#[macro_export] +macro_rules! INPCK { + () => { + 0000020 + }; +} +// #define ISTRIP 0000040 +#[macro_export] +macro_rules! ISTRIP { + () => { + 0000040 + }; +} +// #define IXANY 0004000 +#[macro_export] +macro_rules! IXANY { + () => { + 0004000 + }; +} +// #define IXOFF 0010000 +#[macro_export] +macro_rules! IXOFF { + () => { + 0010000 + }; +} +// #define IMAXBEL 0020000 +#[macro_export] +macro_rules! IMAXBEL { + () => { + 0020000 + }; +} +// #define IUTF8 0040000 +#[macro_export] +macro_rules! IUTF8 { + () => { + 0040000 + }; +} + +/* c_oflag bits */ +// #define OLCUC 0000002 +#[macro_export] +macro_rules! OLCUC { + () => { + 0000002 + }; +} +// #define ONLCR 0000004 +#[macro_export] +macro_rules! ONLCR { + () => { + 0000004 + }; +} +// #define OCRNL 0000010 +#[macro_export] +macro_rules! OCRNL { + () => { + 0000010 + }; +} +// #define ONOCR 0000020 +#[macro_export] +macro_rules! ONOCR { + () => { + 0000020 + }; +} +// #define ONLRET 0000040 +#[macro_export] +macro_rules! ONLRET { + () => { + 0000040 + }; +} + +// #define CS7 0000040 +#[macro_export] +macro_rules! CS7 { + () => { + 0000040 + }; +} +// #define CS8 0000060 +#[macro_export] +macro_rules! CS8 { + () => { + 0000060 + }; +} +// #define PARENB 0000400 +#[macro_export] +macro_rules! PARENB { + () => { + 0000400 + }; +} +// #define PARODD 0001000 +#[macro_export] +macro_rules! PARODD { + () => { + 0001000 + }; +} + +// # define XCASE 0000004 +#[macro_export] +macro_rules! XCASE { + () => { + 0000004 + }; +} + +// #define ECHOE 0000020 +#[macro_export] +macro_rules! ECHOE { + () => { + 0000020 + }; +} + +// #define ECHOK 0000040 +#[macro_export] +macro_rules! ECHOK { + () => { + 0000040 + }; +} + +// #define NOFLSH 0000200 +#[macro_export] +macro_rules! NOFLSH { + () => { + 0000200 + }; +} + +// #define TOSTOP 0000400 +#[macro_export] +macro_rules! TOSTOP { + () => { + 0000400 + }; +} + +// # define ECHOCTL 0001000 +#[macro_export] +macro_rules! ECHOCTL { + () => { + 0001000 + }; +} + +// # define ECHOKE 0004000 +#[macro_export] +macro_rules! ECHOKE { + () => { + 0004000 + }; +} + +// # define PENDIN 0040000 +#[macro_export] +macro_rules! PENDIN { + () => { + 0040000 + }; +} + +// #define B0 0000000 /* hang up */ +#[macro_export] +macro_rules! B0 { + () => { + 0000000 + }; +} + +// #define B38400 0000017 +#[macro_export] +macro_rules! B38400 { + () => { + 0000017 + }; +} + +// #define TIOCSWINSZ 0x5414 +#[macro_export] +macro_rules! TIOCSWINSZ { + () => { + 0x5414 + }; +} + +/* Termios flags to copy between terminals. */ +// #define INPUT_FLAGS (IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IUCLC|IXON|IXANY|IXOFF|IMAXBEL|IUTF8) +// #define OUTPUT_FLAGS (OPOST|OLCUC|ONLCR|OCRNL|ONOCR|ONLRET) +// #define CONTROL_FLAGS (CS7|CS8|PARENB|PARODD) +// #define LOCAL_FLAGS (ISIG|ICANON|XCASE|ECHO|ECHOE|ECHOK|ECHONL|NOFLSH|TOSTOP|IEXTEN|ECHOCTL|ECHOKE|PENDIN) + +#[macro_export] +macro_rules! INPUT_FLAGS { + () => { + (IGNPAR!() + | PARMRK!() + | INPCK!() + | ISTRIP!() + | INLCR!() + | IGNCR!() + | ICRNL!() + | IUCLC!() + | IXON!() + | IXANY!() + | IXOFF!() + | IMAXBEL!() + | IUTF8!()) + }; +} + +#[macro_export] +macro_rules! OUTPUT_FLAGS { + () => { + (OPOST!() | OLCUC!() | ONLCR!() | OCRNL!() | ONOCR!() | ONLRET!()) + }; +} + +#[macro_export] +macro_rules! CONTROL_FLAGS { + () => { + (CS7!() | CS8!() | PARENB!() | PARODD!()) + }; +} + +#[macro_export] +macro_rules! LOCAL_FLAGS { + () => { + (ISIG!() + | ICANON!() + | XCASE!() + | ECHO!() + | ECHOE!() + | ECHOK!() + | ECHONL!() + | NOFLSH!() + | TOSTOP!() + | IEXTEN!() + | ECHOCTL!() + | ECHOKE!() + | PENDIN!()) + }; +} + +/* + * SIGTTOU signal handler for term_restore that just sets a flag. + */ +#[no_mangle] +unsafe extern "C" fn sigttou(_signo: libc::c_int) { + got_sigttou = 1; +} + +/* + * Like tcsetattr() but restarts on EINTR _except_ for SIGTTOU. + * Returns 0 on success or -1 on failure, setting errno. + * Sets got_sigttou on failure if interrupted by SIGTTOU. + */ +unsafe extern "C" fn tcsetattr_nobg( + fd: libc::c_int, + flags: libc::c_int, + tp: *mut termios, +) -> libc::c_int { + let mut sa: sigaction = sigaction { + __sigaction_handler: __sigaction_handler_union { sa_handler: None }, + sa_mask: sigset_t { __val: [0; 16] }, + sa_flags: 0, + sa_restorer: None, + }; + + let mut osa: sigaction = sigaction { + __sigaction_handler: __sigaction_handler_union { sa_handler: None }, + sa_mask: sigset_t { __val: [0; 16] }, + sa_flags: 0, + sa_restorer: None, + }; + + let mut rc: libc::c_int = 0; + + /* + * If we receive SIGTTOU from tcsetattr() it means we are + * not in the foreground process group. + * This should be less racy than using tcgetpgrp(). + */ + memset( + &mut sa as *mut sigaction as *mut libc::c_void, + 0, + ::std::mem::size_of::() as libc::c_ulong, + ); + sigemptyset(&mut sa.sa_mask as *mut sigset_t); + sa.__sigaction_handler.sa_handler = Some(sigttou as unsafe extern "C" fn(libc::c_int) -> ()); + got_sigttou = 0; + sigaction( + SIGTTOU, + &mut sa as *const sigaction, + &mut osa as *mut sigaction, + ); + + loop { + rc = tcsetattr(fd, flags, tp); + if !(rc != 0 as libc::c_int && *__errno_location() == 4 as libc::c_int && got_sigttou == 0) + { + break; + } + } + + sigaction(SIGTTOU, &mut osa as *const sigaction, 0 as *mut sigaction); + + return rc; +} + +/* + * Restore saved terminal settings if we are in the foreground process group. + * Returns true on success or false on failure. + */ +// #[named] +#[no_mangle] +unsafe extern "C" fn sudo_term_restore_v1(fd: libc::c_int, flush: bool) -> bool { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if changed != 0 { + let mut flags: libc::c_int = { + if flush { + TCSASOFT | TCSAFLUSH + } else { + TCSASOFT | TCSADRAIN + } + }; + + if tcsetattr_nobg(fd, flags, &mut oterm) != 0 { + debug_return_bool!(false); + } + changed = 0; + }; + debug_return_bool!(true) +} + +/* + * Disable terminal echo. + * Returns true on success or false on failure. + */ +#[no_mangle] +unsafe extern "C" fn sudo_term_noecho_v1(fd: libc::c_int) -> bool { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if changed == 0 && tcgetattr(fd, &mut oterm) != 0 { + debug_return_bool!(false); + } + memcpy( + &mut term as *mut termios as *mut libc::c_void, + &mut oterm as *mut termios as *mut libc::c_void, + ::std::mem::size_of::() as libc::c_ulong, + ); + CLR!(term.c_lflag, ECHO!() | ECHONL!()); + if tcsetattr_nobg(fd, TCSASOFT | TCSADRAIN, &mut term) == 0 { + changed = 1; + debug_return_bool!(true); + } + debug_return_bool!(false) +} + +/* + * Set terminal to raw mode. + * Returns true on success or false on failure. + */ +#[no_mangle] +unsafe extern "C" fn sudo_term_raw_v1(fd: libc::c_int, isig: libc::c_int) -> bool { + let mut term_t: termios = termios { + c_iflag: 0, + c_oflag: 0, + c_cflag: 0, + c_lflag: 0, + c_line: 0, + c_cc: [0; NCCS as usize], + c_ispeed: 0, + c_ospeed: 0, + }; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if changed != 0 && tcgetattr(fd, &mut oterm) != 0 { + debug_return_bool!(false); + } + memcpy( + &mut term_t as *mut termios as *mut libc::c_void, + &mut oterm as *mut termios as *mut libc::c_void, + ::std::mem::size_of::() as libc::c_ulong, + ); + + /* Set terminal to raw mode */ + term_t.c_cc[VMIN as usize] = 1; + term_t.c_cc[VTIME as usize] = 0; + CLR!( + term.c_iflag, + ICRNL!() | IGNCR!() | INLCR!() | IUCLC!() | IXON!() + ); + CLR!(term.c_oflag, OPOST!()); + CLR!(term.c_lflag, ECHO!() | ICANON!() | ISIG!() | IEXTEN!()); + if isig != 0 { + SET!(term_t.c_lflag, ISIG!()); + } + if tcsetattr_nobg(fd, TCSASOFT | TCSADRAIN, &mut term) == 0 { + changed = 1; + debug_return_bool!(true); + } + debug_return_bool!(false) +} + +/* + * Set terminal to cbreak mode. + * Returns true on success or false on failure. + */ +#[no_mangle] +unsafe extern "C" fn sudo_term_cbreak_v1(fd: libc::c_int) -> bool { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if changed != 0 && tcgetattr(fd, &mut oterm) != 0 { + debug_return_bool!(false); + } + + memcpy( + &mut term as *mut termios as *mut libc::c_void, + &mut oterm as *mut termios as *mut libc::c_void, + ::std::mem::size_of::() as libc::c_ulong, + ); + /* Set terminal to half-cooked mode */ + term.c_cc[VMIN as usize] = 1; + term.c_cc[VTIME as usize] = 0; + + /* cppcheck-suppress redundantAssignment */ + CLR!(term.c_lflag, ECHO!() | ECHONL!() | ICANON!() | IEXTEN!()); + /* cppcheck-suppress redundantAssignment */ + SET!(term.c_lflag, ISIG!()); + + if tcsetattr_nobg(fd, TCSASOFT | TCSADRAIN, &mut term) == 0 { + sudo_term_eof = term.c_cc[VEOF as usize] as libc::c_int; + sudo_term_erase = term.c_cc[VERASE as usize] as libc::c_int; + sudo_term_kill = term.c_cc[VKILL as usize] as libc::c_int; + changed = 1; + debug_return_bool!(true); + } + debug_return_bool!(false) +} + +/* + * Copy terminal settings from one descriptor to another. + * We cannot simply copy the struct termios as src and dst may be + * different terminal types (pseudo-tty vs. console or glass tty). + * Returns true on success or false on failure. + */ +#[no_mangle] +unsafe extern "C" fn sudo_term_copy_v1(src: libc::c_int, dst: libc::c_int) -> bool { + let mut tt_src: termios = termios { + c_iflag: 0, + c_oflag: 0, + c_cflag: 0, + c_lflag: 0, + c_line: 0, + c_cc: [0; NCCS as usize], + c_ispeed: 0, + c_ospeed: 0, + }; + let mut tt_dst: termios = termios { + c_iflag: 0, + c_oflag: 0, + c_cflag: 0, + c_lflag: 0, + c_line: 0, + c_cc: [0; NCCS as usize], + c_ispeed: 0, + c_ospeed: 0, + }; + + let mut wsize: winsize = winsize { + ws_row: 0, + ws_col: 0, + ws_xpixel: 0, + ws_ypixel: 0, + }; + let mut speed: speed_t = 0 as speed_t; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if tcgetattr(src, &mut tt_src) != 0 || tcgetattr(dst, &mut tt_dst) != 0 { + debug_return_bool!(false); + } + + /* Clear select input, output, control and local flags. */ + CLR!(tt_dst.c_iflag, INPUT_FLAGS!()); + CLR!(tt_dst.c_oflag, OUTPUT_FLAGS!()); + CLR!(tt_dst.c_cflag, CONTROL_FLAGS!()); + CLR!(tt_dst.c_lflag, LOCAL_FLAGS!()); + + /* Copy select input, output, control and local flags. */ + SET!(tt_dst.c_iflag, (tt_src.c_iflag & INPUT_FLAGS!())); + SET!(tt_dst.c_oflag, (tt_src.c_oflag & OUTPUT_FLAGS!())); + SET!(tt_dst.c_cflag, (tt_src.c_cflag & CONTROL_FLAGS!())); + SET!(tt_dst.c_lflag, (tt_src.c_lflag & LOCAL_FLAGS!())); + + /* Copy special chars from src verbatim. */ + for i in 0..NCCS { + tt_dst.c_cc[i as usize] = tt_src.c_cc[i as usize]; + } + + /* Copy speed from src (zero output speed closes the connection). */ + speed = cfgetospeed(&mut tt_src); + if speed == B0!() { + speed = B38400!(); + } + cfsetospeed(&mut tt_dst, speed); + speed = cfgetispeed(&mut tt_src); + cfsetispeed(&mut tt_dst, speed); + + if tcsetattr_nobg(dst, TCSASOFT | TCSAFLUSH, &mut tt_dst) == -1 { + debug_return_bool!(false); + } + + if ioctl(src, TIOCGWINSZ!(), &mut wsize) == 0 { + ioctl(dst, TIOCSWINSZ!(), &mut wsize); + } + debug_return_bool!(true) +} diff --git a/utsudo-0.0.2/lib/util/src/ttyname_dev.rs b/utsudo-0.0.2/lib/util/src/ttyname_dev.rs new file mode 100644 index 0000000..0351c56 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/ttyname_dev.rs @@ -0,0 +1,659 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + clashing_extern_declarations, + unused_variables +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_str_v1; +// use crate::sudo_debug::sudo_debug_printf2_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_DEBUG; +use crate::sudo_debug_macro::SUDO_DEBUG_ERRNO; +use crate::sudo_debug_macro::SUDO_DEBUG_ERROR; +use crate::sudo_debug_macro::SUDO_DEBUG_INFO; +use crate::sudo_debug_macro::SUDO_DEBUG_LINENO; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +pub type __dev_t = libc::c_ulong; +pub type __uid_t = libc::c_uint; +pub type __gid_t = libc::c_uint; +pub type __ino_t = libc::c_ulong; +pub type __mode_t = libc::c_uint; +pub type __nlink_t = libc::c_ulong; +pub type __off_t = libc::c_long; +pub type __time_t = libc::c_long; +pub type __blksize_t = libc::c_long; +pub type __blkcnt_t = libc::c_long; +pub type __syscall_slong_t = libc::c_long; +pub type dev_t = __dev_t; +pub type size_t = libc::c_ulong; + +// #define PATH_MAX 4096 /* # chars in a path name including nul */ +pub const PATH_MAX: usize = 4096; + +// #define ENOMEM 12 /* Out of memory */ +pub const ENOMEM: libc::c_int = 12; + +// #define ERANGE 34 /* Math result not representable */ +pub const ERANGE: libc::c_int = 34; + +// #define ENOENT 2 /* No such file or directory */ +pub const ENOENT: libc::c_int = 2; + +pub const DT_CHR: libc::c_int = 2; +pub const DT_LNK: libc::c_int = 10; +pub const DT_UNKNOWN: libc::c_int = 0; + +// #define _PATH_DEV "/dev/" +macro_rules! _PATH_DEV { + () => { + b"/dev/\0" as *const u8 as *const libc::c_char + }; +} + +// console +macro_rules! _PATH_DEV_CONSOLE { + () => { + b"/dev/console\0" as *const u8 as *const libc::c_char + }; +} + +// _PATH_DEV "pts" +macro_rules! _PATH_DEV_PTS { + () => { + b"/dev/pts\0" as *const u8 as *const libc::c_char + }; +} + +// _PATH_DEV "stdin", +// _PATH_DEV "stdout", +// _PATH_DEV "stderr", +macro_rules! _PATH_DEV_STDIN { + () => { + b"/dev/stdin\0" as *const u8 as *const libc::c_char + }; +} + +macro_rules! _PATH_DEV_STDOUT { + () => { + b"/dev/stdout\0" as *const u8 as *const libc::c_char + }; +} + +macro_rules! _PATH_DEV_STDERR { + () => { + b"/dev/stderr\0" as *const u8 as *const libc::c_char + }; +} + +// #define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR) +// #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) +// #define __S_IFMT 0170000 /* These bits determine file type. */ +// #define __S_IFCHR 0020000 /* Character device. */ +macro_rules! __S_IFMT { + () => { + 0o170000 + }; +} + +macro_rules! __S_IFCHR { + () => { + 0o020000 + }; +} + +macro_rules! __S_ISTYPE { + ($mode:expr, $mask:expr) => { + ((($mode) & __S_IFMT!()) == ($mask)) + }; +} + +macro_rules! S_ISCHR { + ($mode:expr) => { + __S_ISTYPE!(($mode), __S_IFCHR!()) + }; +} + +// # define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ +// # define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ +// # define S_IWUSR __S_IWRITE /* Write by owner. */ +// #define __S_IWRITE 0200 /* Write by owner. */ +macro_rules! __S_IWRITE { + () => { + 0200 + }; +} + +macro_rules! S_IWUSR { + () => { + __S_IWRITE!() + }; +} + +macro_rules! S_IWGRP { + () => { + (S_IWUSR!() >> 3) + }; +} + +macro_rules! S_IWOTH { + () => { + (S_IWGRP!() >> 3) + }; +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __dirstream { + _unused: [u8; 0], +} + +extern "C" { + fn sudo_conf_devsearch_path_v1() -> *const libc::c_char; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; + fn sudo_strsplit_v1( + str: *const libc::c_char, + endstr: *const libc::c_char, + sep: *const libc::c_char, + last: *mut *const libc::c_char, + ) -> *const libc::c_char; + fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) -> *mut libc::c_void; + fn __errno_location() -> *mut libc::c_int; + fn strcmp(_: *const libc::c_char, _: *const libc::c_char) -> libc::c_int; + fn snprintf( + _: *mut libc::c_char, + _: libc::c_ulong, + _: *const libc::c_char, + _: ... + ) -> libc::c_int; + fn sudo_strlcpy(dst: *mut libc::c_char, src: *const libc::c_char, siz: size_t) -> size_t; + fn sudo_strlcat(dst: *mut libc::c_char, src: *const libc::c_char, siz: size_t) -> size_t; + fn __fxstat(__ver: libc::c_int, __fildes: libc::c_int, __stat_buf: *mut stat) -> libc::c_int; + fn __xstat( + __ver: libc::c_int, + __filename: *const libc::c_char, + __stat_buf: *mut stat, + ) -> libc::c_int; + fn closedir(__dirp: *mut DIR) -> libc::c_int; + fn opendir(__name: *const libc::c_char) -> *mut DIR; + fn dirfd(__dirp: *mut DIR) -> libc::c_int; + fn readdir(__dirp: *mut DIR) -> *mut dirent; + fn sudo_debug_printf2_v1( + func: *const libc::c_char, + file: *const libc::c_char, + lineno: libc::c_int, + level: libc::c_int, + fmt: *const libc::c_char, + _: ... + ); +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct timespec { + pub tv_sec: __time_t, + pub tv_nsec: __syscall_slong_t, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct stat { + pub st_dev: __dev_t, + pub st_ino: __ino_t, + pub st_nlink: __nlink_t, + pub st_mode: __mode_t, + pub st_uid: __uid_t, + pub st_gid: __gid_t, + pub __pad0: libc::c_int, + pub st_rdev: __dev_t, + pub st_size: __off_t, + pub st_blksize: __blksize_t, + pub st_blocks: __blkcnt_t, + pub st_atim: timespec, + pub st_mtim: timespec, + pub st_ctim: timespec, + pub __glibc_reserved: [__syscall_slong_t; 3], +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct dirent { + pub d_ino: __ino_t, + pub d_off: __off_t, + pub d_reclen: libc::c_ushort, + pub d_type: libc::c_uchar, + pub d_name: [libc::c_char; 256], +} + +pub type DIR = __dirstream; + +/* + * Device nodes to ignore. + */ +static mut ignore_devs: [*const libc::c_char; 4] = [ + _PATH_DEV_STDIN!(), + _PATH_DEV_STDOUT!(), + _PATH_DEV_STDERR!(), + 0 as *const libc::c_char, +]; + +#[inline] +unsafe extern "C" fn fstat(mut __fd: libc::c_int, mut __statbuf: *mut stat) -> libc::c_int { + return __fxstat(1 as libc::c_int, __fd, __statbuf); +} +#[inline] +unsafe extern "C" fn stat( + mut __path: *const libc::c_char, + mut __statbuf: *mut stat, +) -> libc::c_int { + return __xstat(1 as libc::c_int, __path, __statbuf); +} + +#[inline] +unsafe extern "C" fn gnu_dev_minor(mut __dev: __dev_t) -> libc::c_uint { + let mut __minor: libc::c_uint = 0; + __minor = ((__dev & 0xff as libc::c_uint as __dev_t) >> 0 as libc::c_int) as libc::c_uint; + __minor = (__minor as libc::c_ulong + | (__dev & 0xffffff00000 as libc::c_ulong) >> 12 as libc::c_int) + as libc::c_uint; + return __minor; +} + +/* + * Do a scan of a directory looking for the specified device. + * Does not descend into subdirectories. + * Returns name on success and NULL on failure, setting errno. + */ +// static char * +// sudo_ttyname_scan(const char *dir, dev_t rdev, char *name, size_t namelen) +#[no_mangle] +unsafe extern "C" fn sudo_ttyname_scan( + mut dir: *const libc::c_char, + mut rdev: dev_t, + mut name: *mut libc::c_char, + mut namelen: size_t, +) -> *mut libc::c_char { + let mut sdlen: size_t = 0 as size_t; + let mut pathbuf: [libc::c_char; PATH_MAX] = [0; PATH_MAX]; + let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; + let mut dp: *mut dirent = 0 as *mut dirent; + let mut sb: stat = stat { + st_dev: 0, + st_ino: 0, + st_nlink: 0, + st_mode: 0, + st_uid: 0, + st_gid: 0, + __pad0: 0, + st_rdev: 0, + st_size: 0, + st_blksize: 0, + st_blocks: 0, + st_atim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_mtim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_ctim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + __glibc_reserved: [0; 3], + }; + + let mut i: libc::c_int = 0 as libc::c_int; + let mut d: *mut DIR = 0 as *mut DIR; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + 'done: loop { + if *dir.offset(0 as isize) as libc::c_int == '\u{0}' as i32 { + *__errno_location() = ENOENT; + break 'done; + } + d = opendir(dir); + if d.is_null() { + break 'done; + } + if fstat(dirfd(d), &mut sb) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"unable to fstat %s\0" as *const u8 as *const libc::c_char, + dir + ); + break 'done; + } + if (sb.st_mode & S_IWOTH!()) != 0 { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"ignoring world-writable directory %s\0" as *const u8 as *const libc::c_char, + dir + ); + *__errno_location() = ENOENT; + break 'done; + } + sudo_debug_printf!( + SUDO_DEBUG_INFO | SUDO_DEBUG_LINENO, + b"scanning for dev %u in %s\0" as *const u8 as *const libc::c_char, + rdev as libc::c_uint, + dir + ); + sdlen = strlen(dir); + while sdlen > 0 && dir.offset((sdlen - 1) as isize) as libc::c_int == '/' as i32 { + sdlen -= 1; + } + if (sdlen + 1) >= ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong { + *__errno_location() = ERANGE; + break 'done; + } + memcpy( + pathbuf.as_mut_ptr() as *mut libc::c_void, + dir as *const libc::c_void, + sdlen, + ); + sdlen += 1; + pathbuf[sdlen as usize] = '/' as i32 as libc::c_char; + dp = readdir(d); + while !dp.is_null() { + let mut sb: stat = stat { + st_dev: 0, + st_ino: 0, + st_nlink: 0, + st_mode: 0, + st_uid: 0, + st_gid: 0, + __pad0: 0, + st_rdev: 0, + st_size: 0, + st_blksize: 0, + st_blocks: 0, + st_atim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_mtim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_ctim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + __glibc_reserved: [0; 3], + }; + /* Skip anything starting with "." */ + if (*dp).d_name[0 as usize] as libc::c_int == '.' as i32 { + continue; + } + pathbuf[sdlen as usize] = '\u{0}' as i32 as libc::c_char; + if sudo_strlcat( + pathbuf.as_mut_ptr(), + ((*dp).d_name).as_mut_ptr(), + ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong, + ) >= ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong + { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"%s%s is too big to fit in pathbuf\0" as *const u8 as *const libc::c_char, + pathbuf, + (*dp).d_name + ); + continue; + } + /* Ignore device nodes listed in ignore_devs[]. */ + i = 0; + while !ignore_devs[i as usize].is_null() { + if strcmp(pathbuf.as_mut_ptr(), ignore_devs[i as usize]) == 0 { + break; + } + i += 1; + } + if !ignore_devs[i as usize].is_null() { + sudo_debug_printf!( + SUDO_DEBUG_DEBUG | SUDO_DEBUG_LINENO, + b"ignoring %s\0" as *const u8 as *const libc::c_char, + pathbuf + ); + continue; + } + /* + * Avoid excessive stat() calls by checking dp->d_type. + */ + match (*dp).d_type as libc::c_int { + DT_CHR | DT_LNK | DT_UNKNOWN => { /* 为空*/ } + _ => { + /* Not a character device or link, skip it. */ + sudo_debug_printf!( + SUDO_DEBUG_DEBUG | SUDO_DEBUG_LINENO, + b"skipping non-device %s\0" as *const u8 as *const libc::c_char, + pathbuf + ); + continue; + } + } + if stat(pathbuf.as_mut_ptr(), &mut sb) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO | SUDO_DEBUG_ERRNO, + b"unable to stat %s\0" as *const u8 as *const libc::c_char, + pathbuf + ); + continue; + } + if S_ISCHR!(sb.st_mode) && sb.st_rdev == rdev { + sudo_debug_printf!( + SUDO_DEBUG_INFO | SUDO_DEBUG_LINENO, + b"resolved dev %u as %s\0" as *const u8 as *const libc::c_char, + rdev as libc::c_uint, + pathbuf + ); + if sudo_strlcpy(name, pathbuf.as_mut_ptr(), namelen) < namelen { + ret = name; + } else { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"unable to store %s, have %zu, need %zu\0" as *const u8 + as *const libc::c_char, + pathbuf, + namelen, + strlen(pathbuf.as_ptr() as *const libc::c_char) + 1 + ); + *__errno_location() = ERANGE; + } + break 'done; + } + } //while ((dp + break 'done; + } // 'done loop + + if !d.is_null() { + closedir(d); + } + debug_return_str!(ret) +} + +#[no_mangle] +unsafe extern "C" fn sudo_dev_check( + mut rdev: dev_t, + mut devname: *const libc::c_char, + mut buf: *mut libc::c_char, + mut buflen: size_t, +) -> *mut libc::c_char { + let mut sb: stat = stat { + st_dev: 0, + st_ino: 0, + st_nlink: 0, + st_mode: 0, + st_uid: 0, + st_gid: 0, + __pad0: 0, + st_rdev: 0, + st_size: 0, + st_blksize: 0, + st_blocks: 0, + st_atim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_mtim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + st_ctim: timespec { + tv_sec: 0, + tv_nsec: 0, + }, + __glibc_reserved: [0; 3], + }; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + if stat(devname, &mut sb) == 0 { + if S_ISCHR!(sb.st_mode) && sb.st_rdev == rdev { + sudo_debug_printf!( + SUDO_DEBUG_INFO | SUDO_DEBUG_LINENO, + b"comparing dev %u to %s: match!\0" as *const u8 as *const libc::c_char, + rdev, + devname + ); + if sudo_strlcpy(buf, devname, buflen) < buflen { + debug_return_str!(buf); + } + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"unable to store %s, have %zu, need %zu\0" as *const u8 as *const libc::c_char, + devname, + buflen, + strlen(devname) + 1 + ); + *__errno_location() = ERANGE; + } // if S_ISCHR( + } //if stat(devname + sudo_debug_printf!( + SUDO_DEBUG_INFO | SUDO_DEBUG_LINENO, + b"comparing dev %u to %s: no\0" as *const u8 as *const libc::c_char, + rdev, + devname + ); + debug_return_str!(0 as *mut libc::c_char) +} + +/* + * Like ttyname() but uses a dev_t instead of an open fd. + * Returns name on success and NULL on failure, setting errno. + * Generic version. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_ttyname_dev_v1( + mut rdev: dev_t, + mut buf: *mut libc::c_char, + mut buflen: size_t, +) -> *mut libc::c_char { + let mut devsearch: *const libc::c_char = 0 as *const libc::c_char; + let mut devsearch_end: *const libc::c_char = 0 as *const libc::c_char; + let mut path: [libc::c_char; PATH_MAX] = [0; PATH_MAX]; + let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; + let mut cp: *const libc::c_char = 0 as *const libc::c_char; + let mut ep: *const libc::c_char = 0 as *const libc::c_char; + let mut len: size_t = 0 as size_t; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + /* + * First, check /dev/console. + */ + ret = sudo_dev_check(rdev, _PATH_DEV_CONSOLE!(), buf, buflen); + if ret.is_null() { + /* + * Then check the device search path. + */ + devsearch = sudo_conf_devsearch_path_v1(); + devsearch_end = devsearch.offset(strlen(devsearch) as isize); + cp = sudo_strsplit_v1( + devsearch, + devsearch_end, + b":\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + while !cp.is_null() { + len = ep.offset_from(cp) as size_t; + if len >= ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"devsearch entry %.*s too long\0" as *const u8 as *const libc::c_char, + len as libc::c_int, + cp + ); + cp = sudo_strsplit_v1( + 0 as *const libc::c_char, + devsearch_end, + b":\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + continue; + } // if len >= + memcpy( + path.as_mut_ptr() as *mut libc::c_void, + cp as *const libc::c_void, + len, + ); + path[len as usize] = '\u{0}' as i32 as libc::c_char; + if strcmp(path.as_mut_ptr(), _PATH_DEV_PTS!()) == 0 { + /* Special case /dev/pts */ + len = snprintf( + path.as_mut_ptr(), + ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong, + b"%spts/%u\0" as *const u8 as *const libc::c_char, + _PATH_DEV!(), + gnu_dev_minor(rdev), + ) as size_t; + if len > ::std::mem::size_of::<[libc::c_char; PATH_MAX]>() as libc::c_ulong { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO, + b"devsearch entry %spts/%u too long\0" as *const u8 as *const libc::c_char, + _PATH_DEV!(), + gnu_dev_minor(rdev) as libc::c_uint + ); + cp = sudo_strsplit_v1( + 0 as *const libc::c_char, + devsearch_end, + b":\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + continue; + } //if len > + ret = sudo_dev_check(rdev, path.as_mut_ptr(), buf, buflen); + if !ret.is_null() { + break; + } + } + // if strcmp(path + else { + /* Scan path, looking for rdev. */ + ret = sudo_ttyname_scan(path.as_mut_ptr(), rdev, buf, buflen); + if !ret.is_null() || *__errno_location() == ENOMEM { + break; + } + } + cp = sudo_strsplit_v1( + 0 as *const libc::c_char, + devsearch_end, + b":\0" as *const u8 as *const libc::c_char, + &mut ep, + ); + } // while !cp.is_null() + } // ret.is_null() + + debug_return_str!(ret as *mut libc::c_char) +} diff --git a/utsudo-0.0.2/lib/util/src/ttysize.rs b/utsudo-0.0.2/lib/util/src/ttysize.rs new file mode 100644 index 0000000..0e13004 --- /dev/null +++ b/utsudo-0.0.2/lib/util/src/ttysize.rs @@ -0,0 +1,131 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut +)] + +use crate::sudo_debug::sudo_debug_enter_v1; +use crate::sudo_debug::sudo_debug_exit_int_v1; +use crate::sudo_debug::sudo_debug_exit_v1; +use crate::sudo_debug_macro::SUDO_DEBUG_UTIL; + +/* Standard file descriptors. */ +// #define STDERR_FILENO 2 /* Standard error output. */ +#[macro_export] +macro_rules! STDERR_FILENO { + () => { + 2 + }; +} + +// #define TIOCGWINSZ 0x5413 +#[macro_export] +macro_rules! TIOCGWINSZ { + () => { + 0x5413 + }; +} + +// #define __INT_MAX__ 2147483647 +// #define INT_MAX __INT_MAX__ +#[macro_export] +macro_rules! INT_MAX { + () => { + 2147483647 + }; +} + +extern "C" { + fn ioctl(fd: libc::c_int, __request: libc::c_ulong, ...) -> libc::c_int; + fn getenv(__name: *const libc::c_char) -> *mut libc::c_char; + fn sudo_strtonum( + _: *const libc::c_char, + _: libc::c_longlong, + _: libc::c_longlong, + _: *mut *const libc::c_char, + ) -> libc::c_longlong; + +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct winsize { + pub ws_row: libc::c_ushort, + pub ws_col: libc::c_ushort, + pub ws_xpixel: libc::c_ushort, + pub ws_ypixel: libc::c_ushort, +} + +#[no_mangle] +pub unsafe extern "C" fn get_ttysize_ioctl( + rowp: *mut libc::c_int, + colp: *mut libc::c_int, +) -> libc::c_int { + let mut wsize: winsize = winsize { + ws_row: 0, + ws_col: 0, + ws_xpixel: 0, + ws_ypixel: 0, + }; + + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if (ioctl(STDERR_FILENO!(), TIOCGWINSZ!(), &wsize) == 0) + && wsize.ws_row != 0 + && wsize.ws_col != 0 + { + *rowp = wsize.ws_row as libc::c_int; + *colp = wsize.ws_col as libc::c_int; + debug_return_int!(0); + } + debug_return_int!(-1) +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_get_ttysize_v1( + mut rowp: *mut libc::c_int, + mut colp: *mut libc::c_int, +) { + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + if get_ttysize_ioctl(rowp, colp) == -(1 as libc::c_int) { + let mut p: *mut libc::c_char = 0 as *mut libc::c_char; + + /* Fall back on $LINES and $COLUMNS. */ + p = getenv(b"LINES\0" as *const u8 as *const libc::c_char); + if p.is_null() || { + *rowp = sudo_strtonum( + p, + 1, + INT_MAX!() as libc::c_int as libc::c_longlong, + 0 as *mut *const libc::c_char, + ) as libc::c_int; + *rowp <= 0 as libc::c_int + } { + *rowp = 24; + } + p = getenv(b"COLUMNS\0" as *const u8 as *const libc::c_char); + if p.is_null() || { + *colp = sudo_strtonum( + p, + 1, + INT_MAX!() as libc::c_int as libc::c_longlong, + 0 as *mut *const libc::c_char, + ) as libc::c_int; + *colp <= 0 as libc::c_int + } { + *colp = 80; + } + } + debug_return!() +} diff --git a/utsudo-0.0.2/lib/util/util.exp.in b/utsudo-0.0.2/lib/util/util.exp.in new file mode 100644 index 0000000..6dd3095 --- /dev/null +++ b/utsudo-0.0.2/lib/util/util.exp.in @@ -0,0 +1,121 @@ +@COMPAT_EXP@initprogname +sudo_conf_askpass_path_v1 +sudo_conf_clear_paths_v1 +sudo_conf_debug_files_v1 +sudo_conf_debugging_v1 +sudo_conf_devsearch_path_v1 +sudo_conf_disable_coredump_v1 +sudo_conf_group_source_v1 +sudo_conf_max_groups_v1 +sudo_conf_noexec_path_v1 +sudo_conf_plugin_dir_path_v1 +sudo_conf_plugins_v1 +sudo_conf_probe_interfaces_v1 +sudo_conf_read_v1 +sudo_conf_sesh_path_v1 +sudo_debug_deregister_v1 +sudo_debug_enter_v1 +sudo_debug_execve2_v1 +sudo_debug_exit_bool_v1 +sudo_debug_exit_id_t_v1 +sudo_debug_exit_int_v1 +sudo_debug_exit_long_v1 +sudo_debug_exit_ptr_v1 +sudo_debug_exit_size_t_v1 +sudo_debug_exit_ssize_t_v1 +sudo_debug_exit_str_masked_v1 +sudo_debug_exit_str_v1 +sudo_debug_exit_time_t_v1 +sudo_debug_exit_v1 +sudo_debug_fork_v1 +sudo_debug_get_active_instance_v1 +sudo_debug_get_fds_v1 +sudo_debug_get_instance_v1 +sudo_debug_printf2_v1 +sudo_debug_register_v1 +sudo_debug_set_active_instance_v1 +sudo_debug_update_fd_v1 +sudo_debug_vprintf2_v1 +sudo_debug_write2_v1 +sudo_digest_alloc_v1 +sudo_digest_final_v1 +sudo_digest_free_v1 +sudo_digest_getlen_v1 +sudo_digest_reset_v1 +sudo_digest_update_v1 +sudo_dso_findsym_v1 +sudo_dso_load_v1 +sudo_dso_preload_table_v1 +sudo_dso_strerror_v1 +sudo_dso_unload_v1 +sudo_ev_add_v1 +sudo_ev_add_v2 +sudo_ev_alloc_v1 +sudo_ev_base_alloc_v1 +sudo_ev_base_free_v1 +sudo_ev_base_setdef_v1 +sudo_ev_del_v1 +sudo_ev_dispatch_v1 +sudo_ev_free_v1 +sudo_ev_get_timeleft_v1 +sudo_ev_get_timeleft_v2 +sudo_ev_got_break_v1 +sudo_ev_got_exit_v1 +sudo_ev_loop_v1 +sudo_ev_loopbreak_v1 +sudo_ev_loopcontinue_v1 +sudo_ev_loopexit_v1 +sudo_fatal_callback_deregister_v1 +sudo_fatal_callback_register_v1 +sudo_fatal_nodebug_v1 +sudo_fatalx_nodebug_v1 +sudo_gai_fatal_nodebug_v1 +sudo_gai_vfatal_nodebug_v1 +sudo_gai_vwarn_nodebug_v1 +sudo_gai_warn_nodebug_v1 +sudo_get_ttysize_v1 +sudo_getgrouplist2_v1 +sudo_gethostname_v1 +sudo_gettime_awake_v1 +sudo_gettime_mono_v1 +sudo_gettime_real_v1 +sudo_lbuf_append_quoted_v1 +sudo_lbuf_append_v1 +sudo_lbuf_clearerr_v1 +sudo_lbuf_destroy_v1 +sudo_lbuf_error_v1 +sudo_lbuf_init_v1 +sudo_lbuf_print_v1 +sudo_lock_file_v1 +sudo_lock_region_v1 +sudo_new_key_val_v1 +sudo_parse_gids_v1 +sudo_parseln_v1 +sudo_parseln_v2 +sudo_secure_dir_v1 +sudo_secure_file_v1 +sudo_setgroups_v1 +sudo_strsplit_v1 +sudo_strtobool_v1 +sudo_strtoid_v1 +sudo_strtoid_v2 +sudo_strtoidx_v1 +sudo_strtomode_v1 +sudo_strtonum +sudo_term_cbreak_v1 +sudo_term_copy_v1 +sudo_term_eof +sudo_term_erase +sudo_term_kill +sudo_term_noecho_v1 +sudo_term_raw_v1 +sudo_term_restore_v1 +sudo_ttyname_dev_v1 +sudo_vfatal_nodebug_v1 +sudo_vfatalx_nodebug_v1 +sudo_vwarn_nodebug_v1 +sudo_vwarnx_nodebug_v1 +sudo_warn_nodebug_v1 +sudo_warn_set_conversation_v1 +sudo_warn_set_locale_func_v1 +sudo_warnx_nodebug_v1 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/.cargo-checksum.json b/utsudo-0.0.2/lib/util/vendor/libc/.cargo-checksum.json new file mode 100644 index 0000000..f52e661 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CONTRIBUTING.md":"bdc90b52cf803faac96e594069a86dd8ea150d5ba7fb3e6cadfc08dac4c7b0ce","Cargo.toml":"a1d4350481d43c600687f1921083036db242f3a9e5bc9906d4d469fdfe588d48","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1","README.md":"ecc47e284f8d007fc048666d5108dd41cdc440ab9eedfe8c47d1634613522787","build.rs":"5bd78d7e4e79b183fb1dab92cd640a611330131d54c479c69adbe87cbdc95ae3","rustfmt.toml":"eaa2ea84fc1ba0359b77680804903e07bb38d257ab11986b95b158e460f787b2","src/fixed_width_ints.rs":"7f986e5f5e68d25ef04d386fd2f640e8be8f15427a8d4a458ea01d26b8dca0ca","src/fuchsia/aarch64.rs":"893fcec48142d273063ffd814dca33fbec92205fd39ada97075f85201d803996","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"30f4dc83ef120300d61896696512436377c5f36f1431d98ab7e01e498c0c47d5","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/riscv64.rs":"617cd75e79e0e20f664db764a4dc2a396d9fd11a4d95371acd91ed4811293b11","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"d3bfce41e4463d4be8020a2d063c9bfa8b665f45f1cc6cbf3163f5d01e7cb21f","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"24111461547739f3646f95bcb66c43f2ae679a727ff5938299434c522c02e458","src/macros.rs":"b457eb028b8e8ab3c24bb7292b874ad4e491edbb83594f6a3da024df5348c088","src/psp.rs":"dd31aabd46171d474ec5828372e28588935120e7355c90c105360d8fa9264c1c","src/sgx.rs":"16a95cdefc81c5ee00d8353a60db363c4cc3e0f75abcd5d0144723f2a306ed1b","src/solid/aarch64.rs":"a726e47f324adf73a4a0b67a2c183408d0cad105ae66acf36db37a42ab7f8707","src/solid/arm.rs":"e39a4f74ebbef3b97b8c95758ad741123d84ed3eb48d9cf4f1f4872097fc27fe","src/solid/mod.rs":"5f4151dca5132e4b4e4c23ab9737e12856dddbdc0ca3f7dbc004328ef3c8acde","src/switch.rs":"9da3dd39b3de45a7928789926e8572d00e1e11a39e6f7289a1349aadce90edba","src/unix/aix/mod.rs":"54229b5e774669c16912112e8b50fa938db76f534971222a11723a05195a0948","src/unix/aix/powerpc64.rs":"cf374d81139d45f9d77c6a764f640bfbf7e0a5903689652c8296f8e10d55169b","src/unix/align.rs":"2cdc7c826ef7ae61f5171c5ae8c445a743d86f1a7f2d9d7e4ceeec56d6874f65","src/unix/bsd/apple/b32/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b32/mod.rs":"2546ad3eb6aecb95f916648bc63264117c92b4b4859532b34cb011e4c75a5a72","src/unix/bsd/apple/b64/aarch64/align.rs":"e8eb38d064b5fefec6f37d42873820a0483e7c758ed336cc59a7155455ca89c9","src/unix/bsd/apple/b64/aarch64/mod.rs":"44c217a4f263afe7a97435de9323d20a96c37836f899ca0925306d4b7e073c27","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"f5e278a1af7fb358891d1c9be4eb7e815aaca0c5cb738d0c3604ba2208a856f7","src/unix/bsd/apple/b64/x86_64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/x86_64/mod.rs":"8c87c5855038aae5d433c8f5eb3b29b0a175879a0245342b3bfd83bdf4cfd936","src/unix/bsd/apple/long_array.rs":"3cf1f19b812e6d093c819dc65ce55b13491963e0780eda0d0bd1577603e81948","src/unix/bsd/apple/mod.rs":"a6662488273ffff2a097403281db6b5f4cd1a325f7a1582264bb8da0b553a822","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"8295b8bb0dfd38d2cdb4d9192cdeeb534cc6c3b208170e64615fa3e0edb3e578","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"f2e78625fe1eb14f43e730a3987eba888cb8ac04c23008e7c2d2f7c72258b9e6","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"6c8e216385f53a4bf5f171749b57602fc34a4e4b160a44ca31c058cb0c8a2126","src/unix/bsd/freebsdlike/freebsd/arm.rs":"59d6a670eea562fb87686e243e0a84603d29a2028a3d4b3f99ccc01bd04d2f47","src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"e243ae0e89623d4fa9f85afe14369cc5fd5f2028ea715773dbec722ba80dac1f","src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"bef9fae288a4f29e941ea369be1cd20b170040e60665a4d49a4a9e79009b72d8","src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs":"3c514e037694ce22724abb3c9c4687defda7f0e3456b615ca73593e860e38b16","src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs":"318abe48bfdd1c74ecd6afbd6c9329c5c72ce4f7d420edd6be2fc12b223ae32f","src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs":"e7b5863e222d6cc416b6b0fbe71690fad909e899b4c4ae810bbca117e4fcb650","src/unix/bsd/freebsdlike/freebsd/mod.rs":"4c3cd57aaf7fbce072e28e0d2d285b5fda9702e924561d2fd01e49e6ee186a98","src/unix/bsd/freebsdlike/freebsd/powerpc.rs":"9ca3f82f88974e6db5569f2d76a5a3749b248a31747a6c0da5820492bdfeca42","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"2dae3ecc87eac3b11657aa98915def55fc4b5c0de11fe26aae23329a54628a9a","src/unix/bsd/freebsdlike/freebsd/riscv64.rs":"fa4bed4c58cad24ba3395941c7fa6b11e089551a04714f9561078e400f5b2b62","src/unix/bsd/freebsdlike/freebsd/x86.rs":"6766e2ce85e187b306cd3b0b8d7e15b8f4042c5cff81d89b3af69ecc99c70ab0","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"0e1f69a88fca1c32874b1daf5db3d446fefbe518dca497f096cc9168c39dde70","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"51e4dd0c8ae247bb652feda5adad9333ea3bb30c750c3a3935e0b0e47d7803eb","src/unix/bsd/freebsdlike/mod.rs":"0eacafac87fb3a32ef1b85980fece2792e70eba9856af18a7407cc35be68ea57","src/unix/bsd/mod.rs":"dad51a24a524e92bfe9de3ac3b7d394d86058b9b8a1ccd4efa9bbb5c78e7fa1a","src/unix/bsd/netbsdlike/mod.rs":"0a66f7de43710e35a6a546e6c39066aa8b91a6efadb71db88738b0a577fd5537","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"65dcb58d11e8d8028401a9d07ca3eb4cb4f053e04249cc877353449d84ccc4cb","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"90dd33ef20dc3be8aef5bd152a6a06e7ab34f9527b3978487b593aaa16a907bd","src/unix/bsd/netbsdlike/netbsd/powerpc.rs":"ee7ff5d89d0ed22f531237b5059aa669df93a3b5c489fa641465ace8d405bf41","src/unix/bsd/netbsdlike/netbsd/sparc64.rs":"9489f4b3e4566f43bb12dfb92238960613dac7f6a45cc13068a8d152b902d7d9","src/unix/bsd/netbsdlike/netbsd/x86.rs":"20692320e36bfe028d1a34d16fe12ca77aa909cb02bda167376f98f1a09aefe7","src/unix/bsd/netbsdlike/netbsd/x86_64.rs":"1afe5ef46b14397cdd68664b5b232e4f5b035b6db1d4cf411c899d51ebca9f30","src/unix/bsd/netbsdlike/openbsd/aarch64.rs":"dd91931d373b7ecaf6e2de25adadee10d16fa9b12c2cbacdff3eb291e1ba36af","src/unix/bsd/netbsdlike/openbsd/arm.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/mips64.rs":"8532a189ae10c7d668d9d4065da8b05d124e09bd39442c9f74a7f231c43eca48","src/unix/bsd/netbsdlike/openbsd/mod.rs":"892e0b409ced2dfd81d98cbe9630eb83979c1668d323b304a91be13aa711d5db","src/unix/bsd/netbsdlike/openbsd/powerpc.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/powerpc64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/riscv64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/sparc64.rs":"d04fd287afbaa2c5df9d48c94e8374a532a3ba491b424ddf018270c7312f4085","src/unix/bsd/netbsdlike/openbsd/x86.rs":"6f7f5c4fde2a2259eb547890cbd86570cea04ef85347d7569e94e679448bec87","src/unix/bsd/netbsdlike/openbsd/x86_64.rs":"d31db31630289c85af3339dbe357998a21ca584cbae31607448fe2cf7675a4e1","src/unix/haiku/b32.rs":"a2efdbf7158a6da341e1db9176b0ab193ba88b449616239ed95dced11f54d87b","src/unix/haiku/b64.rs":"ff8115367d3d7d354f792d6176dfaaa26353f57056197b563bf4681f91ff7985","src/unix/haiku/mod.rs":"d7ec086b73db4f72799179627aa6330a513dcf786b06e19c75ff884d1235948e","src/unix/haiku/native.rs":"dbfcbf4954a79d1df2ff58e0590bbcb8c57dfc7a32392aa73ee4726b66bd6cc8","src/unix/haiku/x86_64.rs":"3ec3aeeb7ed208b8916f3e32d42bfd085ff5e16936a1a35d9a52789f043b7237","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"a1494a0bddf301cceb0d9b8529a84b5882fe855ceae77a1c4e8d6034e705e26c","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"ce582de7e983a33d3bfad13075c53aac9016cee35f06ad8653ee9072c3ec2564","src/unix/linux_like/android/b32/mod.rs":"7c173e0375119bf06a3081652faede95e5bcd6858e7576b7533d037978737c8f","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"e6d107efbcd37b5b85dfa18f683300cbf768ffa0237997a9fa52b184a53323ac","src/unix/linux_like/android/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/android/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/android/b64/aarch64/mod.rs":"171f8c37a2d2e45065bd3547dfcec70b02aa3da34cd99d259d150c753f620846","src/unix/linux_like/android/b64/mod.rs":"71e4fcbe952bfa4a5f9022f3972e906917b38f729b9d8ef57cd5d179104894ac","src/unix/linux_like/android/b64/riscv64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/android/b64/riscv64/mod.rs":"19d4bf2237c47127eba9144e0b82e995bc079315e719179a91813b0ae7b0e49d","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"4ec2de11a9b65c4325b7b991f0b99a414975e0e61ba8668caca5d921e9b314d1","src/unix/linux_like/android/mod.rs":"fe4c4015cdafc40b537619c9325168f519249ee5acc00cc43b9f0aa5fb95f331","src/unix/linux_like/emscripten/align.rs":"86c95cbed7a7161b1f23ee06843e7b0e2340ad92b2cb86fe2a8ef3e0e8c36216","src/unix/linux_like/emscripten/mod.rs":"712c52856ee323b8057b9452e4ab484a0e652581a530b67c3db25e819919d718","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"87401c80ff504def5cd4309a53a63fdd481642980b9daaa7fee0164a807c2c61","src/unix/linux_like/linux/arch/generic/mod.rs":"778742250aa456cb94efe67a4f8d0213827d90ab74eb5074f9afb9a30e6ea71c","src/unix/linux_like/linux/arch/mips/mod.rs":"60ace1dd76aa88d6b3b5e52fef4bec7881d452780dfff635474067b512e03df1","src/unix/linux_like/linux/arch/mod.rs":"466a29622e47c6c7f1500682b2eb17f5566dd81b322cd6348f0fdd355cec593a","src/unix/linux_like/linux/arch/powerpc/mod.rs":"bef6b7af9e5e2b4e5545c9c7e3e23a8b743277a0ed95853e7eddc38e44299f02","src/unix/linux_like/linux/arch/sparc/mod.rs":"91593ec0440f1dd8f8e612028f432c44c14089286e2aca50e10511ab942db8c3","src/unix/linux_like/linux/gnu/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/gnu/b32/arm/align.rs":"6ec0eb3ee93f7ae99fd714b4deabfb5e97fbcefd8c26f5a45fb8e7150899cdeb","src/unix/linux_like/linux/gnu/b32/arm/mod.rs":"9ab3e97b579a9122690cd01026e14528862860346b700aafbb755a7e04054f7f","src/unix/linux_like/linux/gnu/b32/m68k/align.rs":"8faa92f77a9232c035418d45331774e64a9a841d99c91791570a203bf2b45bcb","src/unix/linux_like/linux/gnu/b32/m68k/mod.rs":"6aab7f1b864e9691d14aa7d389f717c4077b8eed72a7f11e3b8c7fef245e4046","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"6b9a5dac6f937ddc1453e808e3c43502c87143332df9e43ac64fb8b1eda6c116","src/unix/linux_like/linux/gnu/b32/mod.rs":"caade9dc8b7179711102da342819bdf330c42c796b4587d0ed419550dab2e9ad","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"5c5d90326b54b57b98eff4745fe7a3fb02f053b2dc782241a73e807b491936a3","src/unix/linux_like/linux/gnu/b32/riscv32/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs":"491a9a97cf712985b75d3ad714691ef60898d88c78bc386a6917de0a6774cc26","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"80894eece66e9348f45d1b07ad37c757ea694bbd10ed49d3f920b34e9f51a9a3","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"c703cc5e9de2dc31d9e5831bfb6f354d6e3518b2ae02263f68a9a70f1c0167e2","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"ea39d5fd8ca5a71314127d1e1f542bca34ac566eac9a95662076d91ea4bee548","src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs":"bf4611b737813deef6787babf6c01698605f3b75482269b8546318667bc68e29","src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs":"11a950697fdda0258c6e37c6b13993348c8de4134105ed4faa79358e53175072","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"d7be998105fc2f6248b7fdfcedb5a0519122d28625fcfd5dccf72617fb30c45e","src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs":"060aa33cc737966c691aab8511c5c5729e551458ce18d0e284e0d45f39beeb60","src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs":"18edada8aa5d4127d9aa1bd81c62b5a4209f1efd8b2b2631e801c9e855ab1480","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"628c410b9aaec3c8f43838a28616b577a1d6de60a9799b09bb884d80281f96eb","src/unix/linux_like/linux/gnu/b64/mod.rs":"3c6555f30a7a8852757b31a542ea73fb6a16a6e27e838397e819278ad56e57a4","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"c778a136f06c2ffeacea19fa14ce79b828f91b67a002dec5ce87289bae36234e","src/unix/linux_like/linux/gnu/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"c8f07efc5ddd5d874f1ebc329cd6907818d132ac3e30f4f2a4b04be3fb388551","src/unix/linux_like/linux/gnu/b64/s390x.rs":"a2fd9277c2dcf76f7a16a3bcca745d5a9932c765c0dc2feb31c3641be25eb0aa","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"e8047e9966a2b90063e0151a0278c54885e7b323286cf5ab55cbaf151fc772d3","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"62e822478356db4a73b6bbd1b36d825b893939ab4b308ec11b0578bcc4b49769","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"891e595d33714b9883b92f0554d1d361fba2b6c3f6cac09a288252f44c6ec667","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"38f74ce15d9662ce4818815a2b87be1618d5e45f190f7e4db84ff3285b4421fb","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"b20218a11364a6dec87f96d6c0d8b19e660697ab09ad5ee0e9b3a9dafedaaebb","src/unix/linux_like/linux/gnu/mod.rs":"a105e27dac14401935ad2acb60618c0d0c078f65d5bc06c92940d6ab93659b96","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"657a86280094d5ce31e1f85d116c95637cb994baeb724b78dcbd7684b9be1b96","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"f5b217a93f99c2852f7fd1459f529798372fa7df84ee0cfd3d8cdd5b2021b8cf","src/unix/linux_like/linux/musl/b32/hexagon.rs":"226a8b64ce9c75abbbee6d2dceb0b44f7b6c750c4102ebd4d015194afee6666e","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"16f614dd59695497a01b542deacd1669335678bdd0b14d16dde482fb5c4e02f4","src/unix/linux_like/linux/musl/b32/mod.rs":"31677597fd9544c4b1ec1477628288f6273fabbc06e38f33da862ad55f019ce1","src/unix/linux_like/linux/musl/b32/powerpc.rs":"69e3ab4471f876055215a7fccabe514e69299ecfe2fa95d989e4d799e03f43e9","src/unix/linux_like/linux/musl/b32/riscv32/align.rs":"efd2accf33b87de7c7547903359a5da896edc33cd6c719552c7474b60d4a5d48","src/unix/linux_like/linux/musl/b32/riscv32/mod.rs":"7b067c7989a80e35daa9987af799d97dd1fb3df71ef82285137f51fbad2354d9","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"de632ac323bd2bb4f83d4826d6eb7e29d4b0e6293aa0c4cb9c99ef0fcabc71b7","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"6ba32725d24d7d8e6aa111f3b57aafa318f83b606abe96561329151829821133","src/unix/linux_like/linux/musl/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"31e75179cbb4e26425b3f5b052e358f593153da662884655e60801d852e55dc2","src/unix/linux_like/linux/musl/b64/mips64.rs":"9a5d29f666332bb056d0e2951e9de989aa1dc016075f009db3f2f628e0cdda8c","src/unix/linux_like/linux/musl/b64/mod.rs":"884243eb5af7df963d858d5baf47e622b45f04e0ae701728b134e986191b614b","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"e77f4cf5d65320023043e4354725397f6b079c1b7b6b3cef2c3293350b46b303","src/unix/linux_like/linux/musl/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/musl/b64/riscv64/mod.rs":"a80b1813148dec8bc396c02638978c0b4e5e040edafd56d98f8683fe2ae51ab5","src/unix/linux_like/linux/musl/b64/s390x.rs":"80a92e54e47016d051c7bd55bee9580cbedd298164199d71a67d49167e744432","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"77309276ad7a42cbe59ca381f23590b7a143aded05555b34a5b307b808cbca6e","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"032863c74d3ca73cb75483218f9bd774ae1ae7d3646d2ffb21e4cc7d4b5e0e3d","src/unix/linux_like/linux/musl/lfs64.rs":"3e4fb381f3a0756520bde0f1692d4fa45e4ae8133bf7d7c64b0e3fdd512f235f","src/unix/linux_like/linux/musl/mod.rs":"f79e4d7bef14f422c6a77f1573ff503a82305bfa5ac3e4c6f571c09212b75620","src/unix/linux_like/linux/no_align.rs":"1a754a4af299894a79835aa092d8322d301179e2b20609defd6bb4bc880e6b4a","src/unix/linux_like/linux/non_exhaustive.rs":"181a05bf94fdb911db83ce793b993bd6548a4115b306a7ef3c10f745a8fea3e9","src/unix/linux_like/linux/uclibc/align.rs":"9ed16138d8e439bd90930845a65eafa7ebd67366e6bf633936d44014f6e4c959","src/unix/linux_like/linux/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/arm/mod.rs":"50288ff9e411ab0966da24838f2c2a5618021bc19c422a04f577b2979ef4081e","src/unix/linux_like/linux/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs":"d0c4434e2bf813372c418a8f516c706cdccc9f7be2f0921b2207b0afdb66fe81","src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs":"3f38ee6a4690b9d7594be20d216467a34d955f7653c2c8ce1e6147daeb53f1e0","src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/linux_like/linux/uclibc/mips/mod.rs":"a048fce1c2d9b1ad57305642e8ad05ca0f0c7e4753267a2e2d6b4fee5db3b072","src/unix/linux_like/linux/uclibc/mod.rs":"1c3d25cddcfefa2bd17bdc81550826be31a08eef235e13f825f169a5029c8bca","src/unix/linux_like/linux/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/linux_like/linux/uclibc/x86_64/l4re.rs":"024eba5753e852dbdd212427351affe7e83f9916c1864bce414d7aa2618f192e","src/unix/linux_like/linux/uclibc/x86_64/mod.rs":"196d03affbefb85716937c15904831e731eb222ee906e05e42102d639a8152ea","src/unix/linux_like/linux/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/unix/linux_like/mod.rs":"45c98e7a0fad03b03c4c76f11a80e2423873f0a6563e35c60309a29b2c8ff44f","src/unix/mod.rs":"dd4ce377ba9517182e718848739a5c3f58cdbbcd4ee467eef9aaf8df5aed5053","src/unix/newlib/aarch64/mod.rs":"bac93836a9a57b2c710f32f852e92a4d11ad6759ab0fb6ad33e71d60e53278af","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"cbba6b3e957eceb496806e60de8725a23ff3fa0015983b4b4fa27b233732b526","src/unix/newlib/espidf/mod.rs":"816f235f4aa4baabba7f2606b31d0fdb03988c52194c966728de8690bf17299d","src/unix/newlib/generic.rs":"eab066d9f0a0f3eb53cc1073d01496bba0110989e1f6a59838afd19f870cd599","src/unix/newlib/horizon/mod.rs":"7cc5cc120437421db139bfa6a90b18168cd3070bdd0f5be96d40fe4c996f3ca1","src/unix/newlib/mod.rs":"9e36de3fd78e10cb6b9a59dc5ebe5a1b44a63ccb91433bb33653fb30d0c303c6","src/unix/newlib/no_align.rs":"e0743b2179495a9514bc3a4d1781e492878c4ec834ee0085d0891dd1712e82fb","src/unix/newlib/powerpc/mod.rs":"0202ffd57caf75b6afa2c9717750ffb96e375ac33df0ae9609a3f831be393b67","src/unix/newlib/vita/mod.rs":"68e0ce186b44e0b3031eb824710e7454dc2a9df98db98120840c3c6f4d885871","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/nto/aarch64.rs":"4709c9afdc8d583be876598e7c238499ee3e8da5bd2baa614d9c7dd414851555","src/unix/nto/mod.rs":"59ab89a8fb6e0a6d22fa968ed4873c2bafa19a0f60a90c9a5148816cb7440889","src/unix/nto/neutrino.rs":"799bff4ab01a6424db6c5a2b76aa5679826d41495f9d13c63485bf13bc80026b","src/unix/nto/x86_64.rs":"a3e18e93c2999da1cd7a6f748a4b60c07aefb73d8ea2aafec19a84cfb040bc8e","src/unix/redox/mod.rs":"73658b0d28c82a122875aa2b45c489834f4de58c378add7932bbaf3ffb2ae789","src/unix/solarish/compat.rs":"00f1ee3faec9da69204e42f025f6735dd13d894071a154425dcc43ecbdd06e7f","src/unix/solarish/illumos.rs":"cd93c2d84722bbf9933a92842a8998eb0b2afc962f50bc2546ad127b82809fa7","src/unix/solarish/mod.rs":"55ce4624745e31ad226b47fde177a46176a89da3fa5030663673a115102471f9","src/unix/solarish/solaris.rs":"41b350a89ddf01cd12a10f93640f92be53be0b0d976021cdc08da17bf3e72edf","src/unix/solarish/x86.rs":"e86e806df0caed72765040eaa2f3c883198d1aa91508540adf9b7008c77f522e","src/unix/solarish/x86_64.rs":"ec2b01f194eb8a6a27133c57681da195a949e03098f3ea1e847227a9c09ef5fc","src/unix/solarish/x86_common.rs":"ac869d9c3c95645c22460468391eb1982023c3a8e02b9e06a72e3aef3d5f1eac","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"e4edcbcf43a325e738c9465507594d0c87abf3f0e2b9b046c1425f8d44bdad0f","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"09ee3b3348b212b050f6ca8ae008a28679ea44a375674307a4e7c9ca0d3ed7d5","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"3c8c7edb7cdf5d0c44af936db2a94869585c69dfabeef30571b4f4e38375767a","src/windows/mod.rs":"a9a95e9ebc0102c334650607351d4d4dbaff0eaf7730eed1c8020d20e9bbebfd","src/windows/msvc/mod.rs":"c068271e00fca6b62bc4bf44bcf142cfc38caeded9b6c4e01d1ceef3ccf986f4","src/xous.rs":"eb0675f25ba01f73072d2b70907fb8abb1148facefe5a20756c49250f3d65fae","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"} \ No newline at end of file diff --git a/utsudo-0.0.2/lib/util/vendor/libc/CONTRIBUTING.md b/utsudo-0.0.2/lib/util/vendor/libc/CONTRIBUTING.md new file mode 100644 index 0000000..8c551db --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/CONTRIBUTING.md @@ -0,0 +1,93 @@ +# Contributing to `libc` + +Welcome! If you are reading this document, it means you are interested in contributing +to the `libc` crate. + +## Adding an API + +Want to use an API which currently isn't bound in `libc`? It's quite easy to add +one! + +The internal structure of this crate is designed to minimize the number of +`#[cfg]` attributes in order to easily be able to add new items which apply +to all platforms in the future. As a result, the crate is organized +hierarchically based on platform. Each module has a number of `#[cfg]`'d +children, but only one is ever actually compiled. Each module then reexports all +the contents of its children. + +This means that for each platform that libc supports, the path from a +leaf module to the root will contain all bindings for the platform in question. +Consequently, this indicates where an API should be added! Adding an API at a +particular level in the hierarchy means that it is supported on all the child +platforms of that level. For example, when adding a Unix API it should be added +to `src/unix/mod.rs`, but when adding a Linux-only API it should be added to +`src/unix/linux_like/linux/mod.rs`. + +If you're not 100% sure at what level of the hierarchy an API should be added +at, fear not! This crate has CI support which tests any binding against all +platforms supported, so you'll see failures if an API is added at the wrong +level or has different signatures across platforms. + +New symbol(s) (i.e. functions, constants etc.) should also be added to the +symbols list(s) found in the `libc-test/semver` directory. These lists keep +track of what symbols are public in the libc crate and ensures they remain +available between changes to the crate. If the new symbol(s) are available on +all supported Unixes it should be added to `unix.txt` list1, +otherwise they should be added to the OS specific list(s). + +With that in mind, the steps for adding a new API are: + +1. Determine where in the module hierarchy your API should be added. +2. Add the API, including adding new symbol(s) to the semver lists. +3. Send a PR to this repo. +4. Wait for CI to pass, fixing errors. +5. Wait for a merge! + +1: Note that this list has nothing to do with any Unix or Posix +standard, it's just a list shared between all OSs that declare `#[cfg(unix)]`. + +## Test before you commit + +We have two automated tests running on [GitHub Actions](https://github.com/rust-lang/libc/actions): + +1. [`libc-test`](https://github.com/gnzlbg/ctest) + - `cd libc-test && cargo test` + - Use the `skip_*()` functions in `build.rs` if you really need a workaround. +2. Style checker + - `rustc ci/style.rs && ./style src` + +## Breaking change policy + +Sometimes an upstream adds a breaking change to their API e.g. removing outdated items, +changing the type signature, etc. And we probably should follow that change to build the +`libc` crate successfully. It's annoying to do the equivalent of semver-major versioning +for each such change. Instead, we mark the item as deprecated and do the actual change +after a certain period. The steps are: + +1. Add `#[deprecated(since = "", note="")]` attribute to the item. + - The `since` field should have a next version of `libc` + (e.g., if the current version is `0.2.1`, it should be `0.2.2`). + - The `note` field should have a reason to deprecate and a tracking issue to call for comments + (e.g., "We consider removing this as the upstream removed it. + If you're using it, please comment on #XXX"). +2. If we don't see any concerns for a while, do the change actually. + +## Supported target policy + +When Rust removes a support for a target, the libc crate also may remove the support anytime. + +## Releasing your change to crates.io + +Now that you've done the amazing job of landing your new API or your new +platform in this crate, the next step is to get that sweet, sweet usage from +crates.io! The only next step is to bump the version of libc and then publish +it. If you'd like to get a release out ASAP you can follow these steps: + +1. Increment the patch version number in `Cargo.toml` and `libc-test/Cargo.toml`. +1. Send a PR to this repository. It should [look like this][example-pr], but it'd + also be nice to fill out the description with a small rationale for the + release (any rationale is ok though!). +1. Once merged, the release will be tagged and published by one of the libc crate + maintainers. + +[example-pr]: https://github.com/rust-lang/libc/pull/2120 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/Cargo.toml b/utsudo-0.0.2/lib/util/vendor/libc/Cargo.toml new file mode 100644 index 0000000..9cccef5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/Cargo.toml @@ -0,0 +1,172 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies. +# +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. + +[package] +name = "libc" +version = "0.2.147" +authors = ["The Rust Project Developers"] +build = "build.rs" +exclude = [ + "/ci/*", + "/.github/*", + "/.cirrus.yml", + "/triagebot.toml", +] +description = """ +Raw FFI bindings to platform libraries like libc. +""" +homepage = "https://github.com/rust-lang/libc" +documentation = "https://docs.rs/libc/" +readme = "README.md" +keywords = [ + "libc", + "ffi", + "bindings", + "operating", + "system", +] +categories = [ + "external-ffi-bindings", + "no-std", + "os", +] +license = "MIT OR Apache-2.0" +repository = "https://github.com/rust-lang/libc" + +[package.metadata.docs.rs] +cargo-args = ["-Zbuild-std"] +default-target = "x86_64-unknown-linux-gnu" +features = [ + "const-extern-fn", + "extra_traits", +] +targets = [ + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-freebsd", + "aarch64-unknown-fuchsia", + "aarch64-unknown-hermit", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "aarch64-unknown-netbsd", + "aarch64-unknown-openbsd", + "aarch64-wrs-vxworks", + "arm-linux-androideabi", + "arm-unknown-linux-gnueabi", + "arm-unknown-linux-gnueabihf", + "arm-unknown-linux-musleabi", + "arm-unknown-linux-musleabihf", + "armebv7r-none-eabi", + "armebv7r-none-eabihf", + "armv5te-unknown-linux-gnueabi", + "armv5te-unknown-linux-musleabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabihf", + "armv7-unknown-linux-musleabihf", + "armv7-wrs-vxworks-eabihf", + "armv7r-none-eabi", + "armv7r-none-eabihf", + "hexagon-unknown-linux-musl", + "i586-pc-windows-msvc", + "i586-unknown-linux-gnu", + "i586-unknown-linux-musl", + "i686-linux-android", + "i686-pc-windows-gnu", + "i686-pc-windows-msvc", + "i686-pc-windows-msvc", + "i686-unknown-freebsd", + "i686-unknown-haiku", + "i686-unknown-linux-gnu", + "i686-unknown-linux-musl", + "i686-unknown-netbsd", + "i686-unknown-openbsd", + "i686-wrs-vxworks", + "mips-unknown-linux-gnu", + "mips-unknown-linux-musl", + "mips64-unknown-linux-gnuabi64", + "mips64-unknown-linux-muslabi64", + "mips64el-unknown-linux-gnuabi64", + "mips64el-unknown-linux-muslabi64", + "mipsel-sony-psp", + "mipsel-unknown-linux-gnu", + "mipsel-unknown-linux-musl", + "nvptx64-nvidia-cuda", + "powerpc-unknown-linux-gnu", + "powerpc-unknown-linux-gnuspe", + "powerpc-unknown-netbsd", + "powerpc-wrs-vxworks", + "powerpc-wrs-vxworks-spe", + "powerpc64-unknown-freebsd", + "powerpc64-unknown-linux-gnu", + "powerpc64-wrs-vxworks", + "powerpc64le-unknown-linux-gnu", + "riscv32gc-unknown-linux-gnu", + "riscv32i-unknown-none-elf", + "riscv32imac-unknown-none-elf", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-freebsd", + "riscv64gc-unknown-linux-gnu", + "riscv64gc-unknown-linux-musl", + "riscv64gc-unknown-none-elf", + "riscv64imac-unknown-none-elf", + "s390x-unknown-linux-gnu", + "s390x-unknown-linux-musl", + "sparc-unknown-linux-gnu", + "sparc64-unknown-linux-gnu", + "sparc64-unknown-netbsd", + "sparcv9-sun-solaris", + "thumbv6m-none-eabi", + "thumbv7em-none-eabi", + "thumbv7em-none-eabihf", + "thumbv7m-none-eabi", + "thumbv7neon-linux-androideabi", + "thumbv7neon-unknown-linux-gnueabihf", + "wasm32-unknown-emscripten", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-fortanix-unknown-sgx", + "x86_64-linux-android", + "x86_64-pc-solaris", + "x86_64-pc-windows-gnu", + "x86_64-pc-windows-gnu", + "x86_64-pc-windows-msvc", + "x86_64-pc-windows-msvc", + "x86_64-unknown-dragonfly", + "x86_64-unknown-freebsd", + "x86_64-unknown-fuchsia", + "x86_64-unknown-haiku", + "x86_64-unknown-hermit", + "x86_64-unknown-illumos", + "x86_64-unknown-l4re-uclibc", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-gnux32", + "x86_64-unknown-linux-musl", + "x86_64-unknown-netbsd", + "x86_64-unknown-openbsd", + "x86_64-unknown-redox", + "x86_64-wrs-vxworks", +] + +[dependencies.rustc-std-workspace-core] +version = "1.0.0" +optional = true + +[features] +align = [] +const-extern-fn = [] +default = ["std"] +extra_traits = [] +rustc-dep-of-std = [ + "align", + "rustc-std-workspace-core", +] +std = [] +use_std = ["std"] diff --git a/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-APACHE b/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-APACHE new file mode 100644 index 0000000..1b5ec8b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-APACHE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-MIT b/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-MIT new file mode 100644 index 0000000..7806181 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2014-2020 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/utsudo-0.0.2/lib/util/vendor/libc/README.md b/utsudo-0.0.2/lib/util/vendor/libc/README.md new file mode 100644 index 0000000..43d706d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/README.md @@ -0,0 +1,110 @@ +# libc - Raw FFI bindings to platforms' system libraries + +[![GHA Status]][GitHub Actions] [![Cirrus CI Status]][Cirrus CI] [![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License] + +`libc` provides all of the definitions necessary to easily interoperate with C +code (or "C-like" code) on each of the platforms that Rust supports. This +includes type definitions (e.g. `c_int`), constants (e.g. `EINVAL`) as well as +function headers (e.g. `malloc`). + +This crate exports all underlying platform types, functions, and constants under +the crate root, so all items are accessible as `libc::foo`. The types and values +of all the exported APIs match the platform that libc is compiled for. + +More detailed information about the design of this library can be found in its +[associated RFC][rfc]. + +[rfc]: https://github.com/rust-lang/rfcs/blob/HEAD/text/1291-promote-libc.md + +## Usage + +Add the following to your `Cargo.toml`: + +```toml +[dependencies] +libc = "0.2" +``` + +## Features + +* `std`: by default `libc` links to the standard library. Disable this + feature to remove this dependency and be able to use `libc` in `#![no_std]` + crates. + +* `extra_traits`: all `struct`s implemented in `libc` are `Copy` and `Clone`. + This feature derives `Debug`, `Eq`, `Hash`, and `PartialEq`. + +* `const-extern-fn`: Changes some `extern fn`s into `const extern fn`s. + If you use Rust >= 1.62, this feature is implicitly enabled. + Otherwise it requires a nightly rustc. + +* **deprecated**: `use_std` is deprecated, and is equivalent to `std`. + +## Rust version support + +The minimum supported Rust toolchain version is currently **Rust 1.13.0**. +(libc does not currently have any policy regarding changes to the minimum +supported Rust version; such policy is a work in progress.) APIs requiring +newer Rust features are only available on newer Rust toolchains: + +| Feature | Version | +|----------------------|---------| +| `union` | 1.19.0 | +| `const mem::size_of` | 1.24.0 | +| `repr(align)` | 1.25.0 | +| `extra_traits` | 1.25.0 | +| `core::ffi::c_void` | 1.30.0 | +| `repr(packed(N))` | 1.33.0 | +| `cfg(target_vendor)` | 1.33.0 | +| `const-extern-fn` | 1.62.0 | + +## Platform support + +[Platform-specific documentation (HEAD)][docs.head]. + +See +[`ci/build.sh`](https://github.com/rust-lang/libc/blob/HEAD/ci/build.sh) +for the platforms on which `libc` is guaranteed to build for each Rust +toolchain. The test-matrix at [GitHub Actions] and [Cirrus CI] show the +platforms in which `libc` tests are run. + +
+ +## License + +This project is licensed under either of + +* [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) + ([LICENSE-APACHE](https://github.com/rust-lang/libc/blob/HEAD/LICENSE-APACHE)) + +* [MIT License](https://opensource.org/licenses/MIT) + ([LICENSE-MIT](https://github.com/rust-lang/libc/blob/HEAD/LICENSE-MIT)) + +at your option. + +## Contributing + +We welcome all people who want to contribute. Please see the [contributing +instructions] for more information. + +[contributing instructions]: https://github.com/rust-lang/libc/blob/HEAD/CONTRIBUTING.md + +Contributions in any form (issues, pull requests, etc.) to this project +must adhere to Rust's [Code of Conduct]. + +[Code of Conduct]: https://www.rust-lang.org/policies/code-of-conduct + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in `libc` by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. + +[GitHub Actions]: https://github.com/rust-lang/libc/actions +[GHA Status]: https://github.com/rust-lang/libc/workflows/CI/badge.svg +[Cirrus CI]: https://cirrus-ci.com/github/rust-lang/libc +[Cirrus CI Status]: https://api.cirrus-ci.com/github/rust-lang/libc.svg +[crates.io]: https://crates.io/crates/libc +[Latest Version]: https://img.shields.io/crates/v/libc.svg +[Documentation]: https://docs.rs/libc/badge.svg +[docs.rs]: https://docs.rs/libc +[License]: https://img.shields.io/crates/l/libc.svg +[docs.head]: https://rust-lang.github.io/libc/#platform-specific-documentation diff --git a/utsudo-0.0.2/lib/util/vendor/libc/build.rs b/utsudo-0.0.2/lib/util/vendor/libc/build.rs new file mode 100644 index 0000000..79bec0e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/build.rs @@ -0,0 +1,246 @@ +use std::env; +use std::process::Command; +use std::str; +use std::string::String; + +// List of cfgs this build script is allowed to set. The list is needed to support check-cfg, as we +// need to know all the possible cfgs that this script will set. If you need to set another cfg +// make sure to add it to this list as well. +const ALLOWED_CFGS: &'static [&'static str] = &[ + "freebsd10", + "freebsd11", + "freebsd12", + "freebsd13", + "freebsd14", + "libc_align", + "libc_cfg_target_vendor", + "libc_const_extern_fn", + "libc_const_extern_fn_unstable", + "libc_const_size_of", + "libc_core_cvoid", + "libc_deny_warnings", + "libc_int128", + "libc_long_array", + "libc_non_exhaustive", + "libc_packedN", + "libc_priv_mod_use", + "libc_ptr_addr_of", + "libc_thread_local", + "libc_underscore_const_names", + "libc_union", +]; + +// Extra values to allow for check-cfg. +const CHECK_CFG_EXTRA: &'static [(&'static str, &'static [&'static str])] = &[ + ("target_os", &["switch", "aix", "ohos"]), + ("target_env", &["illumos", "wasi", "aix", "ohos"]), + ("target_arch", &["loongarch64"]), +]; + +fn main() { + // Avoid unnecessary re-building. + println!("cargo:rerun-if-changed=build.rs"); + + let (rustc_minor_ver, is_nightly) = rustc_minor_nightly(); + let rustc_dep_of_std = env::var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok(); + let align_cargo_feature = env::var("CARGO_FEATURE_ALIGN").is_ok(); + let const_extern_fn_cargo_feature = env::var("CARGO_FEATURE_CONST_EXTERN_FN").is_ok(); + let libc_ci = env::var("LIBC_CI").is_ok(); + let libc_check_cfg = env::var("LIBC_CHECK_CFG").is_ok(); + + if env::var("CARGO_FEATURE_USE_STD").is_ok() { + println!( + "cargo:warning=\"libc's use_std cargo feature is deprecated since libc 0.2.55; \ + please consider using the `std` cargo feature instead\"" + ); + } + + // The ABI of libc used by libstd is backward compatible with FreeBSD 10. + // The ABI of libc from crates.io is backward compatible with FreeBSD 11. + // + // On CI, we detect the actual FreeBSD version and match its ABI exactly, + // running tests to ensure that the ABI is correct. + match which_freebsd() { + Some(10) if libc_ci || rustc_dep_of_std => set_cfg("freebsd10"), + Some(11) if libc_ci => set_cfg("freebsd11"), + Some(12) if libc_ci => set_cfg("freebsd12"), + Some(13) if libc_ci => set_cfg("freebsd13"), + Some(14) if libc_ci => set_cfg("freebsd14"), + Some(_) | None => set_cfg("freebsd11"), + } + + // On CI: deny all warnings + if libc_ci { + set_cfg("libc_deny_warnings"); + } + + // Rust >= 1.15 supports private module use: + if rustc_minor_ver >= 15 || rustc_dep_of_std { + set_cfg("libc_priv_mod_use"); + } + + // Rust >= 1.19 supports unions: + if rustc_minor_ver >= 19 || rustc_dep_of_std { + set_cfg("libc_union"); + } + + // Rust >= 1.24 supports const mem::size_of: + if rustc_minor_ver >= 24 || rustc_dep_of_std { + set_cfg("libc_const_size_of"); + } + + // Rust >= 1.25 supports repr(align): + if rustc_minor_ver >= 25 || rustc_dep_of_std || align_cargo_feature { + set_cfg("libc_align"); + } + + // Rust >= 1.26 supports i128 and u128: + if rustc_minor_ver >= 26 || rustc_dep_of_std { + set_cfg("libc_int128"); + } + + // Rust >= 1.30 supports `core::ffi::c_void`, so libc can just re-export it. + // Otherwise, it defines an incompatible type to retaining + // backwards-compatibility. + if rustc_minor_ver >= 30 || rustc_dep_of_std { + set_cfg("libc_core_cvoid"); + } + + // Rust >= 1.33 supports repr(packed(N)) and cfg(target_vendor). + if rustc_minor_ver >= 33 || rustc_dep_of_std { + set_cfg("libc_packedN"); + set_cfg("libc_cfg_target_vendor"); + } + + // Rust >= 1.40 supports #[non_exhaustive]. + if rustc_minor_ver >= 40 || rustc_dep_of_std { + set_cfg("libc_non_exhaustive"); + } + + // Rust >= 1.47 supports long array: + if rustc_minor_ver >= 47 || rustc_dep_of_std { + set_cfg("libc_long_array"); + } + + if rustc_minor_ver >= 51 || rustc_dep_of_std { + set_cfg("libc_ptr_addr_of"); + } + + // Rust >= 1.37.0 allows underscores as anonymous constant names. + if rustc_minor_ver >= 37 || rustc_dep_of_std { + set_cfg("libc_underscore_const_names"); + } + + // #[thread_local] is currently unstable + if rustc_dep_of_std { + set_cfg("libc_thread_local"); + } + + // Rust >= 1.62.0 allows to use `const_extern_fn` for "Rust" and "C". + if rustc_minor_ver >= 62 { + set_cfg("libc_const_extern_fn"); + } else { + // Rust < 1.62.0 requires a crate feature and feature gate. + if const_extern_fn_cargo_feature { + if !is_nightly || rustc_minor_ver < 40 { + panic!("const-extern-fn requires a nightly compiler >= 1.40"); + } + set_cfg("libc_const_extern_fn_unstable"); + set_cfg("libc_const_extern_fn"); + } + } + + // check-cfg is a nightly cargo/rustc feature to warn when unknown cfgs are used across the + // codebase. libc can configure it if the appropriate environment variable is passed. Since + // rust-lang/rust enforces it, this is useful when using a custom libc fork there. + // + // https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg + if libc_check_cfg { + for cfg in ALLOWED_CFGS { + println!("cargo:rustc-check-cfg=values({})", cfg); + } + for &(name, values) in CHECK_CFG_EXTRA { + let values = values.join("\",\""); + println!("cargo:rustc-check-cfg=values({},\"{}\")", name, values); + } + } +} + +fn rustc_minor_nightly() -> (u32, bool) { + macro_rules! otry { + ($e:expr) => { + match $e { + Some(e) => e, + None => panic!("Failed to get rustc version"), + } + }; + } + + let rustc = otry!(env::var_os("RUSTC")); + let output = Command::new(rustc) + .arg("--version") + .output() + .ok() + .expect("Failed to get rustc version"); + if !output.status.success() { + panic!( + "failed to run rustc: {}", + String::from_utf8_lossy(output.stderr.as_slice()) + ); + } + + let version = otry!(str::from_utf8(&output.stdout).ok()); + let mut pieces = version.split('.'); + + if pieces.next() != Some("rustc 1") { + panic!("Failed to get rustc version"); + } + + let minor = pieces.next(); + + // If `rustc` was built from a tarball, its version string + // will have neither a git hash nor a commit date + // (e.g. "rustc 1.39.0"). Treat this case as non-nightly, + // since a nightly build should either come from CI + // or a git checkout + let nightly_raw = otry!(pieces.next()).split('-').nth(1); + let nightly = nightly_raw + .map(|raw| raw.starts_with("dev") || raw.starts_with("nightly")) + .unwrap_or(false); + let minor = otry!(otry!(minor).parse().ok()); + + (minor, nightly) +} + +fn which_freebsd() -> Option { + let output = std::process::Command::new("freebsd-version").output().ok(); + if output.is_none() { + return None; + } + let output = output.unwrap(); + if !output.status.success() { + return None; + } + + let stdout = String::from_utf8(output.stdout).ok(); + if stdout.is_none() { + return None; + } + let stdout = stdout.unwrap(); + + match &stdout { + s if s.starts_with("10") => Some(10), + s if s.starts_with("11") => Some(11), + s if s.starts_with("12") => Some(12), + s if s.starts_with("13") => Some(13), + s if s.starts_with("14") => Some(14), + _ => None, + } +} + +fn set_cfg(cfg: &str) { + if !ALLOWED_CFGS.contains(&cfg) { + panic!("trying to set cfg {}, but it is not in ALLOWED_CFGS", cfg); + } + println!("cargo:rustc-cfg={}", cfg); +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/rustfmt.toml b/utsudo-0.0.2/lib/util/vendor/libc/rustfmt.toml new file mode 100644 index 0000000..dc85c99 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/rustfmt.toml @@ -0,0 +1 @@ +error_on_line_overflow = true diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fixed_width_ints.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fixed_width_ints.rs new file mode 100644 index 0000000..999de8f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fixed_width_ints.rs @@ -0,0 +1,99 @@ +//! This module contains type aliases for C's fixed-width integer types . +//! +//! These aliases are deprecated: use the Rust types instead. + +#[deprecated(since = "0.2.55", note = "Use i8 instead.")] +pub type int8_t = i8; +#[deprecated(since = "0.2.55", note = "Use i16 instead.")] +pub type int16_t = i16; +#[deprecated(since = "0.2.55", note = "Use i32 instead.")] +pub type int32_t = i32; +#[deprecated(since = "0.2.55", note = "Use i64 instead.")] +pub type int64_t = i64; +#[deprecated(since = "0.2.55", note = "Use u8 instead.")] +pub type uint8_t = u8; +#[deprecated(since = "0.2.55", note = "Use u16 instead.")] +pub type uint16_t = u16; +#[deprecated(since = "0.2.55", note = "Use u32 instead.")] +pub type uint32_t = u32; +#[deprecated(since = "0.2.55", note = "Use u64 instead.")] +pub type uint64_t = u64; + +cfg_if! { + if #[cfg(all(libc_int128, target_arch = "aarch64", not(target_os = "windows")))] { + // This introduces partial support for FFI with __int128 and + // equivalent types on platforms where Rust's definition is validated + // to match the standard C ABI of that platform. + // + // Rust does not guarantee u128/i128 are sound for FFI, and its + // definitions are in fact known to be incompatible. [0] + // + // However these problems aren't fundamental, and are just platform + // inconsistencies. Specifically at the time of this writing: + // + // * For x64 SysV ABIs (everything but Windows), the types are underaligned. + // * For all Windows ABIs, Microsoft doesn't actually officially define __int128, + // and as a result different implementations don't actually agree on its ABI. + // + // But on the other major aarch64 platforms (android, linux, ios, macos) we have + // validated that rustc has the right ABI for these types. This is important because + // aarch64 uses these types in some fundamental OS types like user_fpsimd_struct, + // which represents saved simd registers. + // + // Any API which uses these types will need to `#[ignore(improper_ctypes)]` + // until the upstream rust issue is resolved, but this at least lets us make + // progress on platforms where this type is important. + // + // The list of supported architectures and OSes is intentionally very restricted, + // as careful work needs to be done to verify that a particular platform + // has a conformant ABI. + // + // [0]: https://github.com/rust-lang/rust/issues/54341 + + /// C `__int128` (a GCC extension that's part of many ABIs) + pub type __int128 = i128; + /// C `unsigned __int128` (a GCC extension that's part of many ABIs) + pub type __uint128 = u128; + /// C __int128_t (alternate name for [__int128][]) + pub type __int128_t = i128; + /// C __uint128_t (alternate name for [__uint128][]) + pub type __uint128_t = u128; + + cfg_if! { + if #[cfg(libc_underscore_const_names)] { + macro_rules! static_assert_eq { + ($a:expr, $b:expr) => { + const _: [(); $a] = [(); $b]; + }; + } + + // NOTE: if you add more platforms to here, you may need to cfg + // these consts. They should always match the platform's values + // for `sizeof(__int128)` and `_Alignof(__int128)`. + const _SIZE_128: usize = 16; + const _ALIGN_128: usize = 16; + + // Since Rust doesn't officially guarantee that these types + // have compatible ABIs, we const assert that these values have the + // known size/align of the target platform's libc. If rustc ever + // tries to regress things, it will cause a compilation error. + // + // This isn't a bullet-proof solution because e.g. it doesn't + // catch the fact that llvm and gcc disagree on how x64 __int128 + // is actually *passed* on the stack (clang underaligns it for + // the same reason that rustc *never* properly aligns it). + static_assert_eq!(core::mem::size_of::<__int128>(), _SIZE_128); + static_assert_eq!(core::mem::align_of::<__int128>(), _ALIGN_128); + + static_assert_eq!(core::mem::size_of::<__uint128>(), _SIZE_128); + static_assert_eq!(core::mem::align_of::<__uint128>(), _ALIGN_128); + + static_assert_eq!(core::mem::size_of::<__int128_t>(), _SIZE_128); + static_assert_eq!(core::mem::align_of::<__int128_t>(), _ALIGN_128); + + static_assert_eq!(core::mem::size_of::<__uint128_t>(), _SIZE_128); + static_assert_eq!(core::mem::align_of::<__uint128_t>(), _ALIGN_128); + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/aarch64.rs new file mode 100644 index 0000000..33e3934 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/aarch64.rs @@ -0,0 +1,67 @@ +pub type c_char = u8; +pub type __u64 = ::c_ulonglong; +pub type wchar_t = u32; +pub type nlink_t = ::c_ulong; +pub type blksize_t = ::c_long; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad0: ::c_ulong, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad1: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_uint; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad0: ::c_ulong, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad1: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_uint; 2], + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } +} + +// From https://cs.opensource.google/fuchsia/fuchsia/+/main:zircon/third_party/ulib/musl/include/bits/signal.h;l=20-21;drc=0827b18ab9540c46f8037f407d17ea15a79e9ba7 +pub const MINSIGSTKSZ: ::size_t = 6144; +pub const SIGSTKSZ: ::size_t = 12288; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/align.rs new file mode 100644 index 0000000..3409bf0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/align.rs @@ -0,0 +1,142 @@ +macro_rules! expand_align { + () => { + s! { + #[cfg_attr( + any( + target_pointer_width = "32", + target_arch = "x86_64" + ), + repr(align(4)))] + #[cfg_attr( + not(any( + target_pointer_width = "32", + target_arch = "x86_64" + )), + repr(align(8)))] + pub struct pthread_mutexattr_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct pthread_rwlockattr_t { + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + + s_no_extra_traits! { + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "arm", + target_arch = "x86_64")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "arm", + target_arch = "x86_64"))), + repr(align(8)))] + pub struct pthread_mutex_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "arm", + target_arch = "x86_64")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "arm", + target_arch = "x86_64"))), + repr(align(8)))] + pub struct pthread_rwlock_t { + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + #[cfg_attr(target_arch = "x86", + repr(align(4)))] + #[cfg_attr(not(target_arch = "x86"), + repr(align(8)))] + pub struct pthread_cond_t { + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_cond_t {} + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for pthread_mutex_t { + fn eq(&self, other: &pthread_mutex_t) -> bool { + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_mutex_t {} + impl ::fmt::Debug for pthread_mutex_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_mutex_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for pthread_rwlock_t { + fn eq(&self, other: &pthread_rwlock_t) -> bool { + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_rwlock_t {} + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_rwlock_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/mod.rs new file mode 100644 index 0000000..3e922e7 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/mod.rs @@ -0,0 +1,4300 @@ +//! Definitions found commonly among almost all Unix derivatives +//! +//! More functions and definitions can be found in the more specific modules +//! according to the platform in question. + +// PUB_TYPE + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type locale_t = *mut ::c_void; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type pid_t = i32; +pub type uid_t = u32; +pub type gid_t = u32; +pub type in_addr_t = u32; +pub type in_port_t = u16; +pub type sighandler_t = ::size_t; +pub type cc_t = ::c_uchar; +pub type sa_family_t = u16; +pub type pthread_key_t = ::c_uint; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type clockid_t = ::c_int; +pub type key_t = ::c_int; +pub type id_t = ::c_uint; +pub type useconds_t = u32; +pub type dev_t = u64; +pub type socklen_t = u32; +pub type pthread_t = c_ulong; +pub type mode_t = u32; +pub type ino64_t = u64; +pub type off64_t = i64; +pub type blkcnt64_t = i64; +pub type rlim64_t = u64; +pub type mqd_t = ::c_int; +pub type nfds_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type idtype_t = ::c_uint; +pub type loff_t = ::c_longlong; + +pub type __u8 = ::c_uchar; +pub type __u16 = ::c_ushort; +pub type __s16 = ::c_short; +pub type __u32 = ::c_uint; +pub type __s32 = ::c_int; + +pub type Elf32_Half = u16; +pub type Elf32_Word = u32; +pub type Elf32_Off = u32; +pub type Elf32_Addr = u32; + +pub type Elf64_Half = u16; +pub type Elf64_Word = u32; +pub type Elf64_Off = u64; +pub type Elf64_Addr = u64; +pub type Elf64_Xword = u64; + +pub type clock_t = c_long; +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i64; + +pub type shmatt_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulonglong; +pub type fsfilcnt_t = ::c_ulonglong; +pub type rlim_t = ::c_ulonglong; + +pub type c_long = i64; +pub type c_ulong = u64; + +// FIXME: why are these uninhabited types? that seems... wrong? +// Presumably these should be `()` or an `extern type` (when that stabilizes). +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum DIR {} +impl ::Copy for DIR {} +impl ::Clone for DIR { + fn clone(&self) -> DIR { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos64_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos64_t {} +impl ::Clone for fpos64_t { + fn clone(&self) -> fpos64_t { + *self + } +} + +// PUB_STRUCT + +s! { + pub struct group { + pub gr_name: *mut ::c_char, + pub gr_passwd: *mut ::c_char, + pub gr_gid: ::gid_t, + pub gr_mem: *mut *mut ::c_char, + } + + pub struct utimbuf { + pub actime: time_t, + pub modtime: time_t, + } + + pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: ::c_long, + } + + // FIXME: the rlimit and rusage related functions and types don't exist + // within zircon. Are there reasons for keeping them around? + pub struct rlimit { + pub rlim_cur: rlim_t, + pub rlim_max: rlim_t, + } + + pub struct rusage { + pub ru_utime: timeval, + pub ru_stime: timeval, + pub ru_maxrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad1: u32, + pub ru_ixrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad2: u32, + pub ru_idrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad3: u32, + pub ru_isrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad4: u32, + pub ru_minflt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad5: u32, + pub ru_majflt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad6: u32, + pub ru_nswap: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad7: u32, + pub ru_inblock: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad8: u32, + pub ru_oublock: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad9: u32, + pub ru_msgsnd: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad10: u32, + pub ru_msgrcv: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad11: u32, + pub ru_nsignals: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad12: u32, + pub ru_nvcsw: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad13: u32, + pub ru_nivcsw: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad14: u32, + } + + pub struct in_addr { + pub s_addr: in_addr_t, + } + + pub struct in6_addr { + pub s6_addr: [u8; 16], + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ip_mreqn { + pub imr_multiaddr: in_addr, + pub imr_address: in_addr, + pub imr_ifindex: ::c_int, + } + + pub struct ipv6_mreq { + pub ipv6mr_multiaddr: in6_addr, + pub ipv6mr_interface: ::c_uint, + } + + pub struct hostent { + pub h_name: *mut ::c_char, + pub h_aliases: *mut *mut ::c_char, + pub h_addrtype: ::c_int, + pub h_length: ::c_int, + pub h_addr_list: *mut *mut ::c_char, + } + + pub struct iovec { + pub iov_base: *mut ::c_void, + pub iov_len: ::size_t, + } + + pub struct pollfd { + pub fd: ::c_int, + pub events: ::c_short, + pub revents: ::c_short, + } + + pub struct winsize { + pub ws_row: ::c_ushort, + pub ws_col: ::c_ushort, + pub ws_xpixel: ::c_ushort, + pub ws_ypixel: ::c_ushort, + } + + pub struct linger { + pub l_onoff: ::c_int, + pub l_linger: ::c_int, + } + + pub struct sigval { + // Actually a union of an int and a void* + pub sival_ptr: *mut ::c_void + } + + // + pub struct itimerval { + pub it_interval: ::timeval, + pub it_value: ::timeval, + } + + // + pub struct tms { + pub tms_utime: ::clock_t, + pub tms_stime: ::clock_t, + pub tms_cutime: ::clock_t, + pub tms_cstime: ::clock_t, + } + + pub struct servent { + pub s_name: *mut ::c_char, + pub s_aliases: *mut *mut ::c_char, + pub s_port: ::c_int, + pub s_proto: *mut ::c_char, + } + + pub struct protoent { + pub p_name: *mut ::c_char, + pub p_aliases: *mut *mut ::c_char, + pub p_proto: ::c_int, + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __td: *mut ::c_void, + __lock: [::c_int; 2], + __err: ::c_int, + __ret: ::ssize_t, + pub aio_offset: off_t, + __next: *mut ::c_void, + __prev: *mut ::c_void, + #[cfg(target_pointer_width = "32")] + __dummy4: [::c_char; 24], + #[cfg(target_pointer_width = "64")] + __dummy4: [::c_char; 16], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub __c_ispeed: ::speed_t, + pub __c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + + pub ai_addr: *mut ::sockaddr, + + pub ai_canonname: *mut c_char, + + pub ai_next: *mut addrinfo, + } + + pub struct sockaddr_ll { + pub sll_family: ::c_ushort, + pub sll_protocol: ::c_ushort, + pub sll_ifindex: ::c_int, + pub sll_hatype: ::c_ushort, + pub sll_pkttype: ::c_uchar, + pub sll_halen: ::c_uchar, + pub sll_addr: [::c_uchar; 8] + } + + pub struct fd_set { + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + pub sched_ss_low_priority: ::c_int, + pub sched_ss_repl_period: ::timespec, + pub sched_ss_init_budget: ::timespec, + pub sched_ss_max_repl: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct epoll_event { + pub events: u32, + pub u64: u64, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union + pub ifa_data: *mut ::c_void + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct spwd { + pub sp_namp: *mut ::c_char, + pub sp_pwdp: *mut ::c_char, + pub sp_lstchg: ::c_long, + pub sp_min: ::c_long, + pub sp_max: ::c_long, + pub sp_warn: ::c_long, + pub sp_inact: ::c_long, + pub sp_expire: ::c_long, + pub sp_flag: ::c_ulong, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + #[cfg(all(target_pointer_width = "32", not(target_arch = "x86_64")))] + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct dqblk { + pub dqb_bhardlimit: u64, + pub dqb_bsoftlimit: u64, + pub dqb_curspace: u64, + pub dqb_ihardlimit: u64, + pub dqb_isoftlimit: u64, + pub dqb_curinodes: u64, + pub dqb_btime: u64, + pub dqb_itime: u64, + pub dqb_valid: u32, + } + + pub struct signalfd_siginfo { + pub ssi_signo: u32, + pub ssi_errno: i32, + pub ssi_code: i32, + pub ssi_pid: u32, + pub ssi_uid: u32, + pub ssi_fd: i32, + pub ssi_tid: u32, + pub ssi_band: u32, + pub ssi_overrun: u32, + pub ssi_trapno: u32, + pub ssi_status: i32, + pub ssi_int: i32, + pub ssi_ptr: u64, + pub ssi_utime: u64, + pub ssi_stime: u64, + pub ssi_addr: u64, + pub ssi_addr_lsb: u16, + _pad2: u16, + pub ssi_syscall: i32, + pub ssi_call_addr: u64, + pub ssi_arch: u32, + _pad: [u8; 28], + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct fsid_t { + __val: [::c_int; 2], + } + + pub struct cpu_set_t { + #[cfg(all(target_pointer_width = "32", + not(target_arch = "x86_64")))] + bits: [u32; 32], + #[cfg(not(all(target_pointer_width = "32", + not(target_arch = "x86_64"))))] + bits: [u64; 16], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + // System V IPC + pub struct msginfo { + pub msgpool: ::c_int, + pub msgmap: ::c_int, + pub msgmax: ::c_int, + pub msgmnb: ::c_int, + pub msgmni: ::c_int, + pub msgssz: ::c_int, + pub msgtql: ::c_int, + pub msgseg: ::c_ushort, + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::c_uint, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct input_event { + pub time: ::timeval, + pub type_: ::__u16, + pub code: ::__u16, + pub value: ::__s32, + } + + pub struct input_id { + pub bustype: ::__u16, + pub vendor: ::__u16, + pub product: ::__u16, + pub version: ::__u16, + } + + pub struct input_absinfo { + pub value: ::__s32, + pub minimum: ::__s32, + pub maximum: ::__s32, + pub fuzz: ::__s32, + pub flat: ::__s32, + pub resolution: ::__s32, + } + + pub struct input_keymap_entry { + pub flags: ::__u8, + pub len: ::__u8, + pub index: ::__u16, + pub keycode: ::__u32, + pub scancode: [::__u8; 32], + } + + pub struct input_mask { + pub type_: ::__u32, + pub codes_size: ::__u32, + pub codes_ptr: ::__u64, + } + + pub struct ff_replay { + pub length: ::__u16, + pub delay: ::__u16, + } + + pub struct ff_trigger { + pub button: ::__u16, + pub interval: ::__u16, + } + + pub struct ff_envelope { + pub attack_length: ::__u16, + pub attack_level: ::__u16, + pub fade_length: ::__u16, + pub fade_level: ::__u16, + } + + pub struct ff_constant_effect { + pub level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_ramp_effect { + pub start_level: ::__s16, + pub end_level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_condition_effect { + pub right_saturation: ::__u16, + pub left_saturation: ::__u16, + + pub right_coeff: ::__s16, + pub left_coeff: ::__s16, + + pub deadband: ::__u16, + pub center: ::__s16, + } + + pub struct ff_periodic_effect { + pub waveform: ::__u16, + pub period: ::__u16, + pub magnitude: ::__s16, + pub offset: ::__s16, + pub phase: ::__u16, + + pub envelope: ff_envelope, + + pub custom_len: ::__u32, + pub custom_data: *mut ::__s16, + } + + pub struct ff_rumble_effect { + pub strong_magnitude: ::__u16, + pub weak_magnitude: ::__u16, + } + + pub struct ff_effect { + pub type_: ::__u16, + pub id: ::__s16, + pub direction: ::__u16, + pub trigger: ff_trigger, + pub replay: ff_replay, + // FIXME this is actually a union + #[cfg(target_pointer_width = "64")] + pub u: [u64; 4], + #[cfg(target_pointer_width = "32")] + pub u: [u32; 7], + } + + pub struct dl_phdr_info { + #[cfg(target_pointer_width = "64")] + pub dlpi_addr: Elf64_Addr, + #[cfg(target_pointer_width = "32")] + pub dlpi_addr: Elf32_Addr, + + pub dlpi_name: *const ::c_char, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phdr: *const Elf64_Phdr, + #[cfg(target_pointer_width = "32")] + pub dlpi_phdr: *const Elf32_Phdr, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phnum: Elf64_Half, + #[cfg(target_pointer_width = "32")] + pub dlpi_phnum: Elf32_Half, + + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + pub dlpi_tls_modid: ::size_t, + pub dlpi_tls_data: *mut ::c_void, + } + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct sigset_t { + __val: [::c_ulong; 16], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + __pad1: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + __pad2: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub __pad1: ::c_int, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 8], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 19], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } +} + +s_no_extra_traits! { + pub struct sysinfo { + pub uptime: ::c_ulong, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub __reserved: [::c_char; 256], + } + + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 108] + } + + pub struct sockaddr_storage { + pub ss_family: sa_family_t, + __ss_pad2: [u8; 128 - 2 - 8], + __ss_align: ::size_t, + } + + pub struct utsname { + pub sysname: [::c_char; 65], + pub nodename: [::c_char; 65], + pub release: [::c_char; 65], + pub version: [::c_char; 65], + pub machine: [::c_char; 65], + pub domainname: [::c_char; 65] + } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct dirent64 { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + // x32 compatibility + // See https://sourceware.org/bugzilla/show_bug.cgi?id=21279 + pub struct mq_attr { + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_flags: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_maxmsg: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_msgsize: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_curmsgs: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pad: [i64; 4], + + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_flags: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_maxmsg: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_msgsize: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_curmsgs: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pad: [::c_long; 4], + } + + pub struct sockaddr_nl { + pub nl_family: ::sa_family_t, + nl_pad: ::c_ushort, + pub nl_pid: u32, + pub nl_groups: u32 + } + + pub struct sigevent { + pub sigev_value: ::sigval, + pub sigev_signo: ::c_int, + pub sigev_notify: ::c_int, + pub sigev_notify_function: fn(::sigval), + pub sigev_notify_attributes: *mut pthread_attr_t, + pub __pad: [::c_char; 56 - 3 * 8 /* 8 == sizeof(long) */], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sysinfo { + fn eq(&self, other: &sysinfo) -> bool { + self.uptime == other.uptime + && self.loads == other.loads + && self.totalram == other.totalram + && self.freeram == other.freeram + && self.sharedram == other.sharedram + && self.bufferram == other.bufferram + && self.totalswap == other.totalswap + && self.freeswap == other.freeswap + && self.procs == other.procs + && self.pad == other.pad + && self.totalhigh == other.totalhigh + && self.freehigh == other.freehigh + && self.mem_unit == other.mem_unit + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sysinfo {} + impl ::fmt::Debug for sysinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sysinfo") + .field("uptime", &self.uptime) + .field("loads", &self.loads) + .field("totalram", &self.totalram) + .field("freeram", &self.freeram) + .field("sharedram", &self.sharedram) + .field("bufferram", &self.bufferram) + .field("totalswap", &self.totalswap) + .field("freeswap", &self.freeswap) + .field("procs", &self.procs) + .field("pad", &self.pad) + .field("totalhigh", &self.totalhigh) + .field("freehigh", &self.freehigh) + .field("mem_unit", &self.mem_unit) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + impl ::hash::Hash for sysinfo { + fn hash(&self, state: &mut H) { + self.uptime.hash(state); + self.loads.hash(state); + self.totalram.hash(state); + self.freeram.hash(state); + self.sharedram.hash(state); + self.bufferram.hash(state); + self.totalswap.hash(state); + self.freeswap.hash(state); + self.procs.hash(state); + self.pad.hash(state); + self.totalhigh.hash(state); + self.freehigh.hash(state); + self.mem_unit.hash(state); + self.__reserved.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_family == other.ss_family + && self.__ss_align == other.__ss_align + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_family", &self.ss_family) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_family.hash(state); + self.__ss_align.hash(state); + self.__ss_pad2.hash(state); + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a,b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a,b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a,b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a,b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for utsname {} + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + .finish() + } + } + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for dirent64 { + fn eq(&self, other: &dirent64) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent64 {} + impl ::fmt::Debug for dirent64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent64 { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for mq_attr { + fn eq(&self, other: &mq_attr) -> bool { + self.mq_flags == other.mq_flags && + self.mq_maxmsg == other.mq_maxmsg && + self.mq_msgsize == other.mq_msgsize && + self.mq_curmsgs == other.mq_curmsgs + } + } + impl Eq for mq_attr {} + impl ::fmt::Debug for mq_attr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_flags", &self.mq_flags) + .field("mq_maxmsg", &self.mq_maxmsg) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_curmsgs", &self.mq_curmsgs) + .finish() + } + } + impl ::hash::Hash for mq_attr { + fn hash(&self, state: &mut H) { + self.mq_flags.hash(state); + self.mq_maxmsg.hash(state); + self.mq_msgsize.hash(state); + self.mq_curmsgs.hash(state); + } + } + + impl PartialEq for sockaddr_nl { + fn eq(&self, other: &sockaddr_nl) -> bool { + self.nl_family == other.nl_family && + self.nl_pid == other.nl_pid && + self.nl_groups == other.nl_groups + } + } + impl Eq for sockaddr_nl {} + impl ::fmt::Debug for sockaddr_nl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_nl") + .field("nl_family", &self.nl_family) + .field("nl_pid", &self.nl_pid) + .field("nl_groups", &self.nl_groups) + .finish() + } + } + impl ::hash::Hash for sockaddr_nl { + fn hash(&self, state: &mut H) { + self.nl_family.hash(state); + self.nl_pid.hash(state); + self.nl_groups.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_value == other.sigev_value + && self.sigev_signo == other.sigev_signo + && self.sigev_notify == other.sigev_notify + && self.sigev_notify_function + == other.sigev_notify_function + && self.sigev_notify_attributes + == other.sigev_notify_attributes + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_value", &self.sigev_value) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_notify", &self.sigev_notify) + .field("sigev_notify_function", &self.sigev_notify_function) + .field("sigev_notify_attributes", + &self.sigev_notify_attributes) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_value.hash(state); + self.sigev_signo.hash(state); + self.sigev_notify.hash(state); + self.sigev_notify_function.hash(state); + self.sigev_notify_attributes.hash(state); + } + } + } +} + +// PUB_CONST + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +pub const SIG_DFL: sighandler_t = 0 as sighandler_t; +pub const SIG_IGN: sighandler_t = 1 as sighandler_t; +pub const SIG_ERR: sighandler_t = !0 as sighandler_t; + +pub const DT_UNKNOWN: u8 = 0; +pub const DT_FIFO: u8 = 1; +pub const DT_CHR: u8 = 2; +pub const DT_DIR: u8 = 4; +pub const DT_BLK: u8 = 6; +pub const DT_REG: u8 = 8; +pub const DT_LNK: u8 = 10; +pub const DT_SOCK: u8 = 12; + +pub const FD_CLOEXEC: ::c_int = 0x1; + +pub const USRQUOTA: ::c_int = 0; +pub const GRPQUOTA: ::c_int = 1; + +pub const SIGIOT: ::c_int = 6; + +pub const S_ISUID: ::c_int = 0x800; +pub const S_ISGID: ::c_int = 0x400; +pub const S_ISVTX: ::c_int = 0x200; + +pub const IF_NAMESIZE: ::size_t = 16; +pub const IFNAMSIZ: ::size_t = IF_NAMESIZE; + +pub const LOG_EMERG: ::c_int = 0; +pub const LOG_ALERT: ::c_int = 1; +pub const LOG_CRIT: ::c_int = 2; +pub const LOG_ERR: ::c_int = 3; +pub const LOG_WARNING: ::c_int = 4; +pub const LOG_NOTICE: ::c_int = 5; +pub const LOG_INFO: ::c_int = 6; +pub const LOG_DEBUG: ::c_int = 7; + +pub const LOG_KERN: ::c_int = 0; +pub const LOG_USER: ::c_int = 1 << 3; +pub const LOG_MAIL: ::c_int = 2 << 3; +pub const LOG_DAEMON: ::c_int = 3 << 3; +pub const LOG_AUTH: ::c_int = 4 << 3; +pub const LOG_SYSLOG: ::c_int = 5 << 3; +pub const LOG_LPR: ::c_int = 6 << 3; +pub const LOG_NEWS: ::c_int = 7 << 3; +pub const LOG_UUCP: ::c_int = 8 << 3; +pub const LOG_LOCAL0: ::c_int = 16 << 3; +pub const LOG_LOCAL1: ::c_int = 17 << 3; +pub const LOG_LOCAL2: ::c_int = 18 << 3; +pub const LOG_LOCAL3: ::c_int = 19 << 3; +pub const LOG_LOCAL4: ::c_int = 20 << 3; +pub const LOG_LOCAL5: ::c_int = 21 << 3; +pub const LOG_LOCAL6: ::c_int = 22 << 3; +pub const LOG_LOCAL7: ::c_int = 23 << 3; + +pub const LOG_PID: ::c_int = 0x01; +pub const LOG_CONS: ::c_int = 0x02; +pub const LOG_ODELAY: ::c_int = 0x04; +pub const LOG_NDELAY: ::c_int = 0x08; +pub const LOG_NOWAIT: ::c_int = 0x10; + +pub const LOG_PRIMASK: ::c_int = 7; +pub const LOG_FACMASK: ::c_int = 0x3f8; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const PRIO_MIN: ::c_int = -20; +pub const PRIO_MAX: ::c_int = 20; + +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_UDP: ::c_int = 17; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; + +pub const INADDR_LOOPBACK: in_addr_t = 2130706433; +pub const INADDR_ANY: in_addr_t = 0; +pub const INADDR_BROADCAST: in_addr_t = 4294967295; +pub const INADDR_NONE: in_addr_t = 4294967295; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +// Linux-specific fcntls +pub const F_SETLEASE: ::c_int = 1024; +pub const F_GETLEASE: ::c_int = 1025; +pub const F_NOTIFY: ::c_int = 1026; +pub const F_CANCELLK: ::c_int = 1029; +pub const F_DUPFD_CLOEXEC: ::c_int = 1030; +pub const F_SETPIPE_SZ: ::c_int = 1031; +pub const F_GETPIPE_SZ: ::c_int = 1032; +pub const F_ADD_SEALS: ::c_int = 1033; +pub const F_GET_SEALS: ::c_int = 1034; + +pub const F_SEAL_SEAL: ::c_int = 0x0001; +pub const F_SEAL_SHRINK: ::c_int = 0x0002; +pub const F_SEAL_GROW: ::c_int = 0x0004; +pub const F_SEAL_WRITE: ::c_int = 0x0008; + +// FIXME(#235): Include file sealing fcntls once we have a way to verify them. + +pub const SIGTRAP: ::c_int = 5; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_MONOTONIC: ::clockid_t = 1; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 3; +pub const CLOCK_MONOTONIC_RAW: ::clockid_t = 4; +pub const CLOCK_REALTIME_COARSE: ::clockid_t = 5; +pub const CLOCK_MONOTONIC_COARSE: ::clockid_t = 6; +pub const CLOCK_BOOTTIME: ::clockid_t = 7; +pub const CLOCK_REALTIME_ALARM: ::clockid_t = 8; +pub const CLOCK_BOOTTIME_ALARM: ::clockid_t = 9; +pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; +pub const CLOCK_TAI: ::clockid_t = 11; +pub const TIMER_ABSTIME: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_LOCKS: ::c_int = 10; +pub const RLIMIT_SIGPENDING: ::c_int = 11; +pub const RLIMIT_MSGQUEUE: ::c_int = 12; +pub const RLIMIT_NICE: ::c_int = 13; +pub const RLIMIT_RTPRIO: ::c_int = 14; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; + +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IRWXU: ::mode_t = 448; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IRWXG: ::mode_t = 56; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IRWXO: ::mode_t = 7; +pub const S_IXOTH: ::mode_t = 1; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IROTH: ::mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 2; +pub const LC_COLLATE: ::c_int = 3; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +pub const LC_CTYPE_MASK: ::c_int = 1 << LC_CTYPE; +pub const LC_NUMERIC_MASK: ::c_int = 1 << LC_NUMERIC; +pub const LC_TIME_MASK: ::c_int = 1 << LC_TIME; +pub const LC_COLLATE_MASK: ::c_int = 1 << LC_COLLATE; +pub const LC_MONETARY_MASK: ::c_int = 1 << LC_MONETARY; +pub const LC_MESSAGES_MASK: ::c_int = 1 << LC_MESSAGES; +// LC_ALL_MASK defined per platform + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +// MS_ flags for msync(2) +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0004; + +// MS_ flags for mount(2) +pub const MS_RDONLY: ::c_ulong = 0x01; +pub const MS_NOSUID: ::c_ulong = 0x02; +pub const MS_NODEV: ::c_ulong = 0x04; +pub const MS_NOEXEC: ::c_ulong = 0x08; +pub const MS_SYNCHRONOUS: ::c_ulong = 0x10; +pub const MS_REMOUNT: ::c_ulong = 0x20; +pub const MS_MANDLOCK: ::c_ulong = 0x40; +pub const MS_DIRSYNC: ::c_ulong = 0x80; +pub const MS_NOATIME: ::c_ulong = 0x0400; +pub const MS_NODIRATIME: ::c_ulong = 0x0800; +pub const MS_BIND: ::c_ulong = 0x1000; +pub const MS_MOVE: ::c_ulong = 0x2000; +pub const MS_REC: ::c_ulong = 0x4000; +pub const MS_SILENT: ::c_ulong = 0x8000; +pub const MS_POSIXACL: ::c_ulong = 0x010000; +pub const MS_UNBINDABLE: ::c_ulong = 0x020000; +pub const MS_PRIVATE: ::c_ulong = 0x040000; +pub const MS_SLAVE: ::c_ulong = 0x080000; +pub const MS_SHARED: ::c_ulong = 0x100000; +pub const MS_RELATIME: ::c_ulong = 0x200000; +pub const MS_KERNMOUNT: ::c_ulong = 0x400000; +pub const MS_I_VERSION: ::c_ulong = 0x800000; +pub const MS_STRICTATIME: ::c_ulong = 0x1000000; +pub const MS_ACTIVE: ::c_ulong = 0x40000000; +pub const MS_NOUSER: ::c_ulong = 0x80000000; +pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000; +pub const MS_MGC_MSK: ::c_ulong = 0xffff0000; +pub const MS_RMT_MASK: ::c_ulong = 0x800051; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EWOULDBLOCK: ::c_int = EAGAIN; + +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const SCM_CREDENTIALS: ::c_int = 0x02; + +pub const PROT_GROWSDOWN: ::c_int = 0x1000000; +pub const PROT_GROWSUP: ::c_int = 0x2000000; + +pub const MAP_TYPE: ::c_int = 0x000f; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 8; +pub const MADV_REMOVE: ::c_int = 9; +pub const MADV_DONTFORK: ::c_int = 10; +pub const MADV_DOFORK: ::c_int = 11; +pub const MADV_MERGEABLE: ::c_int = 12; +pub const MADV_UNMERGEABLE: ::c_int = 13; +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; +pub const MADV_DONTDUMP: ::c_int = 16; +pub const MADV_DODUMP: ::c_int = 17; +pub const MADV_HWPOISON: ::c_int = 100; +pub const MADV_SOFT_OFFLINE: ::c_int = 101; + +pub const IFF_UP: ::c_int = 0x1; +pub const IFF_BROADCAST: ::c_int = 0x2; +pub const IFF_DEBUG: ::c_int = 0x4; +pub const IFF_LOOPBACK: ::c_int = 0x8; +pub const IFF_POINTOPOINT: ::c_int = 0x10; +pub const IFF_NOTRAILERS: ::c_int = 0x20; +pub const IFF_RUNNING: ::c_int = 0x40; +pub const IFF_NOARP: ::c_int = 0x80; +pub const IFF_PROMISC: ::c_int = 0x100; +pub const IFF_ALLMULTI: ::c_int = 0x200; +pub const IFF_MASTER: ::c_int = 0x400; +pub const IFF_SLAVE: ::c_int = 0x800; +pub const IFF_MULTICAST: ::c_int = 0x1000; +pub const IFF_PORTSEL: ::c_int = 0x2000; +pub const IFF_AUTOMEDIA: ::c_int = 0x4000; +pub const IFF_DYNAMIC: ::c_int = 0x8000; +pub const IFF_TUN: ::c_int = 0x0001; +pub const IFF_TAP: ::c_int = 0x0002; +pub const IFF_NO_PI: ::c_int = 0x1000; + +pub const SOL_IP: ::c_int = 0; +pub const SOL_TCP: ::c_int = 6; +pub const SOL_UDP: ::c_int = 17; +pub const SOL_IPV6: ::c_int = 41; +pub const SOL_ICMPV6: ::c_int = 58; +pub const SOL_RAW: ::c_int = 255; +pub const SOL_DECNET: ::c_int = 261; +pub const SOL_X25: ::c_int = 262; +pub const SOL_PACKET: ::c_int = 263; +pub const SOL_ATM: ::c_int = 264; +pub const SOL_AAL: ::c_int = 265; +pub const SOL_IRDA: ::c_int = 266; +pub const SOL_NETBEUI: ::c_int = 267; +pub const SOL_LLC: ::c_int = 268; +pub const SOL_DCCP: ::c_int = 269; +pub const SOL_NETLINK: ::c_int = 270; +pub const SOL_TIPC: ::c_int = 271; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = 1; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_AX25: ::c_int = 3; +pub const AF_IPX: ::c_int = 4; +pub const AF_APPLETALK: ::c_int = 5; +pub const AF_NETROM: ::c_int = 6; +pub const AF_BRIDGE: ::c_int = 7; +pub const AF_ATMPVC: ::c_int = 8; +pub const AF_X25: ::c_int = 9; +pub const AF_INET6: ::c_int = 10; +pub const AF_ROSE: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_NETBEUI: ::c_int = 13; +pub const AF_SECURITY: ::c_int = 14; +pub const AF_KEY: ::c_int = 15; +pub const AF_NETLINK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = AF_NETLINK; +pub const AF_PACKET: ::c_int = 17; +pub const AF_ASH: ::c_int = 18; +pub const AF_ECONET: ::c_int = 19; +pub const AF_ATMSVC: ::c_int = 20; +pub const AF_RDS: ::c_int = 21; +pub const AF_SNA: ::c_int = 22; +pub const AF_IRDA: ::c_int = 23; +pub const AF_PPPOX: ::c_int = 24; +pub const AF_WANPIPE: ::c_int = 25; +pub const AF_LLC: ::c_int = 26; +pub const AF_CAN: ::c_int = 29; +pub const AF_TIPC: ::c_int = 30; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_IUCV: ::c_int = 32; +pub const AF_RXRPC: ::c_int = 33; +pub const AF_ISDN: ::c_int = 34; +pub const AF_PHONET: ::c_int = 35; +pub const AF_IEEE802154: ::c_int = 36; +pub const AF_CAIF: ::c_int = 37; +pub const AF_ALG: ::c_int = 38; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_AX25: ::c_int = AF_AX25; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_NETROM: ::c_int = AF_NETROM; +pub const PF_BRIDGE: ::c_int = AF_BRIDGE; +pub const PF_ATMPVC: ::c_int = AF_ATMPVC; +pub const PF_X25: ::c_int = AF_X25; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_ROSE: ::c_int = AF_ROSE; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_NETBEUI: ::c_int = AF_NETBEUI; +pub const PF_SECURITY: ::c_int = AF_SECURITY; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_NETLINK: ::c_int = AF_NETLINK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_PACKET: ::c_int = AF_PACKET; +pub const PF_ASH: ::c_int = AF_ASH; +pub const PF_ECONET: ::c_int = AF_ECONET; +pub const PF_ATMSVC: ::c_int = AF_ATMSVC; +pub const PF_RDS: ::c_int = AF_RDS; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_IRDA: ::c_int = AF_IRDA; +pub const PF_PPPOX: ::c_int = AF_PPPOX; +pub const PF_WANPIPE: ::c_int = AF_WANPIPE; +pub const PF_LLC: ::c_int = AF_LLC; +pub const PF_CAN: ::c_int = AF_CAN; +pub const PF_TIPC: ::c_int = AF_TIPC; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_IUCV: ::c_int = AF_IUCV; +pub const PF_RXRPC: ::c_int = AF_RXRPC; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_PHONET: ::c_int = AF_PHONET; +pub const PF_IEEE802154: ::c_int = AF_IEEE802154; +pub const PF_CAIF: ::c_int = AF_CAIF; +pub const PF_ALG: ::c_int = AF_ALG; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTROUTE: ::c_int = 4; +pub const MSG_CTRUNC: ::c_int = 8; +pub const MSG_TRUNC: ::c_int = 0x20; +pub const MSG_DONTWAIT: ::c_int = 0x40; +pub const MSG_EOR: ::c_int = 0x80; +pub const MSG_WAITALL: ::c_int = 0x100; +pub const MSG_FIN: ::c_int = 0x200; +pub const MSG_SYN: ::c_int = 0x400; +pub const MSG_CONFIRM: ::c_int = 0x800; +pub const MSG_RST: ::c_int = 0x1000; +pub const MSG_ERRQUEUE: ::c_int = 0x2000; +pub const MSG_NOSIGNAL: ::c_int = 0x4000; +pub const MSG_MORE: ::c_int = 0x8000; +pub const MSG_WAITFORONE: ::c_int = 0x10000; +pub const MSG_FASTOPEN: ::c_int = 0x20000000; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; + +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; + +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; + +pub const IP_TOS: ::c_int = 1; +pub const IP_TTL: ::c_int = 2; +pub const IP_HDRINCL: ::c_int = 3; +pub const IP_RECVTOS: ::c_int = 13; +pub const IP_FREEBIND: ::c_int = 15; +pub const IP_TRANSPARENT: ::c_int = 19; +pub const IP_MULTICAST_IF: ::c_int = 32; +pub const IP_MULTICAST_TTL: ::c_int = 33; +pub const IP_MULTICAST_LOOP: ::c_int = 34; +pub const IP_ADD_MEMBERSHIP: ::c_int = 35; +pub const IP_DROP_MEMBERSHIP: ::c_int = 36; + +pub const IPV6_UNICAST_HOPS: ::c_int = 16; +pub const IPV6_MULTICAST_IF: ::c_int = 17; +pub const IPV6_MULTICAST_HOPS: ::c_int = 18; +pub const IPV6_MULTICAST_LOOP: ::c_int = 19; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; +pub const IPV6_V6ONLY: ::c_int = 26; +pub const IPV6_RECVPKTINFO: ::c_int = 49; +pub const IPV6_RECVTCLASS: ::c_int = 66; +pub const IPV6_TCLASS: ::c_int = 67; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_MAXSEG: ::c_int = 2; +pub const TCP_CORK: ::c_int = 3; +pub const TCP_KEEPIDLE: ::c_int = 4; +pub const TCP_KEEPINTVL: ::c_int = 5; +pub const TCP_KEEPCNT: ::c_int = 6; +pub const TCP_SYNCNT: ::c_int = 7; +pub const TCP_LINGER2: ::c_int = 8; +pub const TCP_DEFER_ACCEPT: ::c_int = 9; +pub const TCP_WINDOW_CLAMP: ::c_int = 10; +pub const TCP_INFO: ::c_int = 11; +pub const TCP_QUICKACK: ::c_int = 12; +pub const TCP_CONGESTION: ::c_int = 13; + +pub const SO_DEBUG: ::c_int = 1; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const PATH_MAX: ::c_int = 4096; + +pub const FD_SETSIZE: usize = 1024; + +pub const EPOLLIN: ::c_int = 0x1; +pub const EPOLLPRI: ::c_int = 0x2; +pub const EPOLLOUT: ::c_int = 0x4; +pub const EPOLLRDNORM: ::c_int = 0x40; +pub const EPOLLRDBAND: ::c_int = 0x80; +pub const EPOLLWRNORM: ::c_int = 0x100; +pub const EPOLLWRBAND: ::c_int = 0x200; +pub const EPOLLMSG: ::c_int = 0x400; +pub const EPOLLERR: ::c_int = 0x8; +pub const EPOLLHUP: ::c_int = 0x10; +pub const EPOLLET: ::c_int = 0x80000000; + +pub const EPOLL_CTL_ADD: ::c_int = 1; +pub const EPOLL_CTL_MOD: ::c_int = 3; +pub const EPOLL_CTL_DEL: ::c_int = 2; + +pub const MNT_DETACH: ::c_int = 0x2; +pub const MNT_EXPIRE: ::c_int = 0x4; + +pub const Q_GETFMT: ::c_int = 0x800004; +pub const Q_GETINFO: ::c_int = 0x800005; +pub const Q_SETINFO: ::c_int = 0x800006; +pub const QIF_BLIMITS: u32 = 1; +pub const QIF_SPACE: u32 = 2; +pub const QIF_ILIMITS: u32 = 4; +pub const QIF_INODES: u32 = 8; +pub const QIF_BTIME: u32 = 16; +pub const QIF_ITIME: u32 = 32; +pub const QIF_LIMITS: u32 = 5; +pub const QIF_USAGE: u32 = 10; +pub const QIF_TIMES: u32 = 48; +pub const QIF_ALL: u32 = 63; + +pub const MNT_FORCE: ::c_int = 0x1; + +pub const Q_SYNC: ::c_int = 0x800001; +pub const Q_QUOTAON: ::c_int = 0x800002; +pub const Q_QUOTAOFF: ::c_int = 0x800003; +pub const Q_GETQUOTA: ::c_int = 0x800007; +pub const Q_SETQUOTA: ::c_int = 0x800008; + +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const NL0: ::c_int = 0x00000000; +pub const NL1: ::c_int = 0x00000100; +pub const TAB0: ::c_int = 0x00000000; +pub const CR0: ::c_int = 0x00000000; +pub const FF0: ::c_int = 0x00000000; +pub const BS0: ::c_int = 0x00000000; +pub const VT0: ::c_int = 0x00000000; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VLNEXT: usize = 15; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const OPOST: ::tcflag_t = 0x1; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CRTSCTS: ::tcflag_t = 0x80000000; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const OCRNL: ::tcflag_t = 0o000010; +pub const ONOCR: ::tcflag_t = 0o000020; +pub const ONLRET: ::tcflag_t = 0o000040; +pub const OFILL: ::tcflag_t = 0o000100; +pub const OFDEL: ::tcflag_t = 0o000200; + +pub const CLONE_VM: ::c_int = 0x100; +pub const CLONE_FS: ::c_int = 0x200; +pub const CLONE_FILES: ::c_int = 0x400; +pub const CLONE_SIGHAND: ::c_int = 0x800; +pub const CLONE_PTRACE: ::c_int = 0x2000; +pub const CLONE_VFORK: ::c_int = 0x4000; +pub const CLONE_PARENT: ::c_int = 0x8000; +pub const CLONE_THREAD: ::c_int = 0x10000; +pub const CLONE_NEWNS: ::c_int = 0x20000; +pub const CLONE_SYSVSEM: ::c_int = 0x40000; +pub const CLONE_SETTLS: ::c_int = 0x80000; +pub const CLONE_PARENT_SETTID: ::c_int = 0x100000; +pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000; +pub const CLONE_DETACHED: ::c_int = 0x400000; +pub const CLONE_UNTRACED: ::c_int = 0x800000; +pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000; +pub const CLONE_NEWUTS: ::c_int = 0x04000000; +pub const CLONE_NEWIPC: ::c_int = 0x08000000; +pub const CLONE_NEWUSER: ::c_int = 0x10000000; +pub const CLONE_NEWPID: ::c_int = 0x20000000; +pub const CLONE_NEWNET: ::c_int = 0x40000000; +pub const CLONE_IO: ::c_int = 0x80000000; +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + +pub const WNOHANG: ::c_int = 0x00000001; +pub const WUNTRACED: ::c_int = 0x00000002; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WEXITED: ::c_int = 0x00000004; +pub const WCONTINUED: ::c_int = 0x00000008; +pub const WNOWAIT: ::c_int = 0x01000000; + +// ::Options set using PTRACE_SETOPTIONS. +pub const PTRACE_O_TRACESYSGOOD: ::c_int = 0x00000001; +pub const PTRACE_O_TRACEFORK: ::c_int = 0x00000002; +pub const PTRACE_O_TRACEVFORK: ::c_int = 0x00000004; +pub const PTRACE_O_TRACECLONE: ::c_int = 0x00000008; +pub const PTRACE_O_TRACEEXEC: ::c_int = 0x00000010; +pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 0x00000020; +pub const PTRACE_O_TRACEEXIT: ::c_int = 0x00000040; +pub const PTRACE_O_TRACESECCOMP: ::c_int = 0x00000080; +pub const PTRACE_O_EXITKILL: ::c_int = 0x00100000; +pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 0x00200000; +pub const PTRACE_O_MASK: ::c_int = 0x003000ff; + +// Wait extended result codes for the above trace options. +pub const PTRACE_EVENT_FORK: ::c_int = 1; +pub const PTRACE_EVENT_VFORK: ::c_int = 2; +pub const PTRACE_EVENT_CLONE: ::c_int = 3; +pub const PTRACE_EVENT_EXEC: ::c_int = 4; +pub const PTRACE_EVENT_VFORK_DONE: ::c_int = 5; +pub const PTRACE_EVENT_EXIT: ::c_int = 6; +pub const PTRACE_EVENT_SECCOMP: ::c_int = 7; +// PTRACE_EVENT_STOP was added to glibc in 2.26 +// pub const PTRACE_EVENT_STOP: ::c_int = 128; + +pub const __WNOTHREAD: ::c_int = 0x20000000; +pub const __WALL: ::c_int = 0x40000000; +pub const __WCLONE: ::c_int = 0x80000000; + +pub const SPLICE_F_MOVE: ::c_uint = 0x01; +pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02; +pub const SPLICE_F_MORE: ::c_uint = 0x04; +pub const SPLICE_F_GIFT: ::c_uint = 0x08; + +pub const RTLD_LOCAL: ::c_int = 0; +pub const RTLD_LAZY: ::c_int = 1; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100; +pub const AT_REMOVEDIR: ::c_int = 0x200; +pub const AT_EACCESS: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_NO_AUTOMOUNT: ::c_int = 0x800; +pub const AT_EMPTY_PATH: ::c_int = 0x1000; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const PIPE_BUF: usize = 4096; + +pub const SI_LOAD_SHIFT: ::c_uint = 16; + +pub const CLD_EXITED: ::c_int = 1; +pub const CLD_KILLED: ::c_int = 2; +pub const CLD_DUMPED: ::c_int = 3; +pub const CLD_TRAPPED: ::c_int = 4; +pub const CLD_STOPPED: ::c_int = 5; +pub const CLD_CONTINUED: ::c_int = 6; + +pub const SIGEV_SIGNAL: ::c_int = 0; +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +pub const UTIME_OMIT: c_long = 1073741822; +pub const UTIME_NOW: c_long = 1073741823; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLRDBAND: ::c_short = 0x080; + +pub const ABDAY_1: ::nl_item = 0x20000; +pub const ABDAY_2: ::nl_item = 0x20001; +pub const ABDAY_3: ::nl_item = 0x20002; +pub const ABDAY_4: ::nl_item = 0x20003; +pub const ABDAY_5: ::nl_item = 0x20004; +pub const ABDAY_6: ::nl_item = 0x20005; +pub const ABDAY_7: ::nl_item = 0x20006; + +pub const DAY_1: ::nl_item = 0x20007; +pub const DAY_2: ::nl_item = 0x20008; +pub const DAY_3: ::nl_item = 0x20009; +pub const DAY_4: ::nl_item = 0x2000A; +pub const DAY_5: ::nl_item = 0x2000B; +pub const DAY_6: ::nl_item = 0x2000C; +pub const DAY_7: ::nl_item = 0x2000D; + +pub const ABMON_1: ::nl_item = 0x2000E; +pub const ABMON_2: ::nl_item = 0x2000F; +pub const ABMON_3: ::nl_item = 0x20010; +pub const ABMON_4: ::nl_item = 0x20011; +pub const ABMON_5: ::nl_item = 0x20012; +pub const ABMON_6: ::nl_item = 0x20013; +pub const ABMON_7: ::nl_item = 0x20014; +pub const ABMON_8: ::nl_item = 0x20015; +pub const ABMON_9: ::nl_item = 0x20016; +pub const ABMON_10: ::nl_item = 0x20017; +pub const ABMON_11: ::nl_item = 0x20018; +pub const ABMON_12: ::nl_item = 0x20019; + +pub const MON_1: ::nl_item = 0x2001A; +pub const MON_2: ::nl_item = 0x2001B; +pub const MON_3: ::nl_item = 0x2001C; +pub const MON_4: ::nl_item = 0x2001D; +pub const MON_5: ::nl_item = 0x2001E; +pub const MON_6: ::nl_item = 0x2001F; +pub const MON_7: ::nl_item = 0x20020; +pub const MON_8: ::nl_item = 0x20021; +pub const MON_9: ::nl_item = 0x20022; +pub const MON_10: ::nl_item = 0x20023; +pub const MON_11: ::nl_item = 0x20024; +pub const MON_12: ::nl_item = 0x20025; + +pub const AM_STR: ::nl_item = 0x20026; +pub const PM_STR: ::nl_item = 0x20027; + +pub const D_T_FMT: ::nl_item = 0x20028; +pub const D_FMT: ::nl_item = 0x20029; +pub const T_FMT: ::nl_item = 0x2002A; +pub const T_FMT_AMPM: ::nl_item = 0x2002B; + +pub const ERA: ::nl_item = 0x2002C; +pub const ERA_D_FMT: ::nl_item = 0x2002E; +pub const ALT_DIGITS: ::nl_item = 0x2002F; +pub const ERA_D_T_FMT: ::nl_item = 0x20030; +pub const ERA_T_FMT: ::nl_item = 0x20031; + +pub const CODESET: ::nl_item = 14; + +pub const CRNCYSTR: ::nl_item = 0x4000F; + +pub const RUSAGE_THREAD: ::c_int = 1; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const RADIXCHAR: ::nl_item = 0x10000; +pub const THOUSEP: ::nl_item = 0x10001; + +pub const YESEXPR: ::nl_item = 0x50000; +pub const NOEXPR: ::nl_item = 0x50001; +pub const YESSTR: ::nl_item = 0x50002; +pub const NOSTR: ::nl_item = 0x50003; + +pub const FILENAME_MAX: ::c_uint = 4096; +pub const L_tmpnam: ::c_uint = 20; +pub const _PC_LINK_MAX: ::c_int = 0; +pub const _PC_MAX_CANON: ::c_int = 1; +pub const _PC_MAX_INPUT: ::c_int = 2; +pub const _PC_NAME_MAX: ::c_int = 3; +pub const _PC_PATH_MAX: ::c_int = 4; +pub const _PC_PIPE_BUF: ::c_int = 5; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_SYNC_IO: ::c_int = 9; +pub const _PC_ASYNC_IO: ::c_int = 10; +pub const _PC_PRIO_IO: ::c_int = 11; +pub const _PC_SOCK_MAXBUF: ::c_int = 12; +pub const _PC_FILESIZEBITS: ::c_int = 13; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18; +pub const _PC_SYMLINK_MAX: ::c_int = 19; +pub const _PC_2_SYMLINKS: ::c_int = 20; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +pub const _SC_JOB_CONTROL: ::c_int = 7; +pub const _SC_SAVED_IDS: ::c_int = 8; +pub const _SC_REALTIME_SIGNALS: ::c_int = 9; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; +pub const _SC_TIMERS: ::c_int = 11; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; +pub const _SC_PRIORITIZED_IO: ::c_int = 13; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; +pub const _SC_FSYNC: ::c_int = 15; +pub const _SC_MAPPED_FILES: ::c_int = 16; +pub const _SC_MEMLOCK: ::c_int = 17; +pub const _SC_MEMLOCK_RANGE: ::c_int = 18; +pub const _SC_MEMORY_PROTECTION: ::c_int = 19; +pub const _SC_MESSAGE_PASSING: ::c_int = 20; +pub const _SC_SEMAPHORES: ::c_int = 21; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; +pub const _SC_AIO_MAX: ::c_int = 24; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; +pub const _SC_DELAYTIMER_MAX: ::c_int = 26; +pub const _SC_MQ_OPEN_MAX: ::c_int = 27; +pub const _SC_MQ_PRIO_MAX: ::c_int = 28; +pub const _SC_VERSION: ::c_int = 29; +pub const _SC_PAGESIZE: ::c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 31; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; +pub const _SC_SEM_VALUE_MAX: ::c_int = 33; +pub const _SC_SIGQUEUE_MAX: ::c_int = 34; +pub const _SC_TIMER_MAX: ::c_int = 35; +pub const _SC_BC_BASE_MAX: ::c_int = 36; +pub const _SC_BC_DIM_MAX: ::c_int = 37; +pub const _SC_BC_SCALE_MAX: ::c_int = 38; +pub const _SC_BC_STRING_MAX: ::c_int = 39; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; +pub const _SC_EXPR_NEST_MAX: ::c_int = 42; +pub const _SC_LINE_MAX: ::c_int = 43; +pub const _SC_RE_DUP_MAX: ::c_int = 44; +pub const _SC_2_VERSION: ::c_int = 46; +pub const _SC_2_C_BIND: ::c_int = 47; +pub const _SC_2_C_DEV: ::c_int = 48; +pub const _SC_2_FORT_DEV: ::c_int = 49; +pub const _SC_2_FORT_RUN: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_LOCALEDEF: ::c_int = 52; +pub const _SC_UIO_MAXIOV: ::c_int = 60; +pub const _SC_IOV_MAX: ::c_int = 60; +pub const _SC_THREADS: ::c_int = 67; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; +pub const _SC_TTY_NAME_MAX: ::c_int = 72; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; +pub const _SC_THREAD_STACK_MIN: ::c_int = 75; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 82; +pub const _SC_NPROCESSORS_CONF: ::c_int = 83; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; +pub const _SC_PHYS_PAGES: ::c_int = 85; +pub const _SC_AVPHYS_PAGES: ::c_int = 86; +pub const _SC_ATEXIT_MAX: ::c_int = 87; +pub const _SC_PASS_MAX: ::c_int = 88; +pub const _SC_XOPEN_VERSION: ::c_int = 89; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; +pub const _SC_XOPEN_UNIX: ::c_int = 91; +pub const _SC_XOPEN_CRYPT: ::c_int = 92; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; +pub const _SC_XOPEN_SHM: ::c_int = 94; +pub const _SC_2_CHAR_TERM: ::c_int = 95; +pub const _SC_2_UPE: ::c_int = 97; +pub const _SC_XOPEN_XPG2: ::c_int = 98; +pub const _SC_XOPEN_XPG3: ::c_int = 99; +pub const _SC_XOPEN_XPG4: ::c_int = 100; +pub const _SC_NZERO: ::c_int = 109; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 127; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; +pub const _SC_XOPEN_LEGACY: ::c_int = 129; +pub const _SC_XOPEN_REALTIME: ::c_int = 130; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; +pub const _SC_ADVISORY_INFO: ::c_int = 132; +pub const _SC_BARRIERS: ::c_int = 133; +pub const _SC_CLOCK_SELECTION: ::c_int = 137; +pub const _SC_CPUTIME: ::c_int = 138; +pub const _SC_THREAD_CPUTIME: ::c_int = 139; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 149; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 153; +pub const _SC_SPIN_LOCKS: ::c_int = 154; +pub const _SC_REGEXP: ::c_int = 155; +pub const _SC_SHELL: ::c_int = 157; +pub const _SC_SPAWN: ::c_int = 159; +pub const _SC_SPORADIC_SERVER: ::c_int = 160; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 161; +pub const _SC_TIMEOUTS: ::c_int = 164; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 165; +pub const _SC_2_PBS: ::c_int = 168; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 169; +pub const _SC_2_PBS_LOCATE: ::c_int = 170; +pub const _SC_2_PBS_MESSAGE: ::c_int = 171; +pub const _SC_2_PBS_TRACK: ::c_int = 172; +pub const _SC_SYMLOOP_MAX: ::c_int = 173; +pub const _SC_STREAMS: ::c_int = 174; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 175; +pub const _SC_V6_ILP32_OFF32: ::c_int = 176; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 177; +pub const _SC_V6_LP64_OFF64: ::c_int = 178; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 179; +pub const _SC_HOST_NAME_MAX: ::c_int = 180; +pub const _SC_TRACE: ::c_int = 181; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 182; +pub const _SC_TRACE_INHERIT: ::c_int = 183; +pub const _SC_TRACE_LOG: ::c_int = 184; +pub const _SC_IPV6: ::c_int = 235; +pub const _SC_RAW_SOCKETS: ::c_int = 236; +pub const _SC_V7_ILP32_OFF32: ::c_int = 237; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 238; +pub const _SC_V7_LP64_OFF64: ::c_int = 239; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 240; +pub const _SC_SS_REPL_MAX: ::c_int = 241; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 242; +pub const _SC_TRACE_NAME_MAX: ::c_int = 243; +pub const _SC_TRACE_SYS_MAX: ::c_int = 244; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 245; +pub const _SC_XOPEN_STREAMS: ::c_int = 246; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 247; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 248; + +pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; + +pub const GLOB_ERR: ::c_int = 1 << 0; +pub const GLOB_MARK: ::c_int = 1 << 1; +pub const GLOB_NOSORT: ::c_int = 1 << 2; +pub const GLOB_DOOFFS: ::c_int = 1 << 3; +pub const GLOB_NOCHECK: ::c_int = 1 << 4; +pub const GLOB_APPEND: ::c_int = 1 << 5; +pub const GLOB_NOESCAPE: ::c_int = 1 << 6; + +pub const GLOB_NOSPACE: ::c_int = 1; +pub const GLOB_ABORTED: ::c_int = 2; +pub const GLOB_NOMATCH: ::c_int = 3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; + +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const IFF_LOWER_UP: ::c_int = 0x10000; +pub const IFF_DORMANT: ::c_int = 0x20000; +pub const IFF_ECHO: ::c_int = 0x40000; + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; +pub const ST_NODEV: ::c_ulong = 4; +pub const ST_NOEXEC: ::c_ulong = 8; +pub const ST_SYNCHRONOUS: ::c_ulong = 16; +pub const ST_MANDLOCK: ::c_ulong = 64; +pub const ST_WRITE: ::c_ulong = 128; +pub const ST_APPEND: ::c_ulong = 256; +pub const ST_IMMUTABLE: ::c_ulong = 512; +pub const ST_NOATIME: ::c_ulong = 1024; +pub const ST_NODIRATIME: ::c_ulong = 2048; + +pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOW: ::c_int = 0x2; + +pub const TCP_MD5SIG: ::c_int = 14; + +align_const! { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + size: [0; __SIZEOF_PTHREAD_MUTEX_T], + }; + pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + size: [0; __SIZEOF_PTHREAD_COND_T], + }; + pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + size: [0; __SIZEOF_PTHREAD_RWLOCK_T], + }; +} +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const __SIZEOF_PTHREAD_COND_T: usize = 48; + +pub const RENAME_NOREPLACE: ::c_int = 1; +pub const RENAME_EXCHANGE: ::c_int = 2; +pub const RENAME_WHITEOUT: ::c_int = 4; + +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_BATCH: ::c_int = 3; +pub const SCHED_IDLE: ::c_int = 5; + +// netinet/in.h +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// Hop-by-hop option header +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +// IPPROTO_UDP defined in src/unix/mod.rs +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// DCCP +pub const IPPROTO_DCCP: ::c_int = 33; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +pub const IPPROTO_MTP: ::c_int = 92; +pub const IPPROTO_BEETPH: ::c_int = 94; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// Protocol indep. multicast +pub const IPPROTO_PIM: ::c_int = 103; +/// IP Payload Comp. Protocol +pub const IPPROTO_COMP: ::c_int = 108; +/// SCTP +pub const IPPROTO_SCTP: ::c_int = 132; +pub const IPPROTO_MH: ::c_int = 135; +pub const IPPROTO_UDPLITE: ::c_int = 136; +pub const IPPROTO_MPLS: ::c_int = 137; +/// raw IP packet +pub const IPPROTO_RAW: ::c_int = 255; +pub const IPPROTO_MAX: ::c_int = 256; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; + +// System V IPC +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_INFO: ::c_int = 3; +pub const MSG_STAT: ::c_int = 11; +pub const MSG_INFO: ::c_int = 12; + +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const MSG_EXCEPT: ::c_int = 0o20000; +pub const MSG_COPY: ::c_int = 0o40000; + +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; + +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_REMAP: ::c_int = 0o40000; +pub const SHM_EXEC: ::c_int = 0o100000; + +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; + +pub const SHM_HUGETLB: ::c_int = 0o4000; +pub const SHM_NORESERVE: ::c_int = 0o10000; + +pub const EPOLLRDHUP: ::c_int = 0x2000; +pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; +pub const EPOLLONESHOT: ::c_int = 0x40000000; + +pub const QFMT_VFS_OLD: ::c_int = 1; +pub const QFMT_VFS_V0: ::c_int = 2; +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const EFD_SEMAPHORE: ::c_int = 0x1; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; + +pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; +pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; +pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; +pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; +pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; +pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; +pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; + +pub const AI_PASSIVE: ::c_int = 0x0001; +pub const AI_CANONNAME: ::c_int = 0x0002; +pub const AI_NUMERICHOST: ::c_int = 0x0004; +pub const AI_V4MAPPED: ::c_int = 0x0008; +pub const AI_ALL: ::c_int = 0x0010; +pub const AI_ADDRCONFIG: ::c_int = 0x0020; + +pub const AI_NUMERICSERV: ::c_int = 0x0400; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_OVERFLOW: ::c_int = -12; + +pub const NI_NUMERICHOST: ::c_int = 1; +pub const NI_NUMERICSERV: ::c_int = 2; +pub const NI_NOFQDN: ::c_int = 4; +pub const NI_NAMEREQD: ::c_int = 8; +pub const NI_DGRAM: ::c_int = 16; + +pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; +pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; +pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; + +pub const EAI_SYSTEM: ::c_int = -11; + +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_NOTCANCELED: ::c_int = 1; +pub const AIO_ALLDONE: ::c_int = 2; +pub const LIO_READ: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_NOP: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 0; +pub const LIO_NOWAIT: ::c_int = 1; + +pub const MREMAP_MAYMOVE: ::c_int = 1; +pub const MREMAP_FIXED: ::c_int = 2; + +pub const PR_SET_PDEATHSIG: ::c_int = 1; +pub const PR_GET_PDEATHSIG: ::c_int = 2; + +pub const PR_GET_DUMPABLE: ::c_int = 3; +pub const PR_SET_DUMPABLE: ::c_int = 4; + +pub const PR_GET_UNALIGN: ::c_int = 5; +pub const PR_SET_UNALIGN: ::c_int = 6; +pub const PR_UNALIGN_NOPRINT: ::c_int = 1; +pub const PR_UNALIGN_SIGBUS: ::c_int = 2; + +pub const PR_GET_KEEPCAPS: ::c_int = 7; +pub const PR_SET_KEEPCAPS: ::c_int = 8; + +pub const PR_GET_FPEMU: ::c_int = 9; +pub const PR_SET_FPEMU: ::c_int = 10; +pub const PR_FPEMU_NOPRINT: ::c_int = 1; +pub const PR_FPEMU_SIGFPE: ::c_int = 2; + +pub const PR_GET_FPEXC: ::c_int = 11; +pub const PR_SET_FPEXC: ::c_int = 12; +pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; +pub const PR_FP_EXC_DIV: ::c_int = 0x010000; +pub const PR_FP_EXC_OVF: ::c_int = 0x020000; +pub const PR_FP_EXC_UND: ::c_int = 0x040000; +pub const PR_FP_EXC_RES: ::c_int = 0x080000; +pub const PR_FP_EXC_INV: ::c_int = 0x100000; +pub const PR_FP_EXC_DISABLED: ::c_int = 0; +pub const PR_FP_EXC_NONRECOV: ::c_int = 1; +pub const PR_FP_EXC_ASYNC: ::c_int = 2; +pub const PR_FP_EXC_PRECISE: ::c_int = 3; + +pub const PR_GET_TIMING: ::c_int = 13; +pub const PR_SET_TIMING: ::c_int = 14; +pub const PR_TIMING_STATISTICAL: ::c_int = 0; +pub const PR_TIMING_TIMESTAMP: ::c_int = 1; + +pub const PR_SET_NAME: ::c_int = 15; +pub const PR_GET_NAME: ::c_int = 16; + +pub const PR_GET_ENDIAN: ::c_int = 19; +pub const PR_SET_ENDIAN: ::c_int = 20; +pub const PR_ENDIAN_BIG: ::c_int = 0; +pub const PR_ENDIAN_LITTLE: ::c_int = 1; +pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; + +pub const PR_GET_SECCOMP: ::c_int = 21; +pub const PR_SET_SECCOMP: ::c_int = 22; + +pub const PR_CAPBSET_READ: ::c_int = 23; +pub const PR_CAPBSET_DROP: ::c_int = 24; + +pub const PR_GET_TSC: ::c_int = 25; +pub const PR_SET_TSC: ::c_int = 26; +pub const PR_TSC_ENABLE: ::c_int = 1; +pub const PR_TSC_SIGSEGV: ::c_int = 2; + +pub const PR_GET_SECUREBITS: ::c_int = 27; +pub const PR_SET_SECUREBITS: ::c_int = 28; + +pub const PR_SET_TIMERSLACK: ::c_int = 29; +pub const PR_GET_TIMERSLACK: ::c_int = 30; + +pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; +pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; + +pub const PR_MCE_KILL: ::c_int = 33; +pub const PR_MCE_KILL_CLEAR: ::c_int = 0; +pub const PR_MCE_KILL_SET: ::c_int = 1; + +pub const PR_MCE_KILL_LATE: ::c_int = 0; +pub const PR_MCE_KILL_EARLY: ::c_int = 1; +pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; + +pub const PR_MCE_KILL_GET: ::c_int = 34; + +pub const PR_SET_MM: ::c_int = 35; +pub const PR_SET_MM_START_CODE: ::c_int = 1; +pub const PR_SET_MM_END_CODE: ::c_int = 2; +pub const PR_SET_MM_START_DATA: ::c_int = 3; +pub const PR_SET_MM_END_DATA: ::c_int = 4; +pub const PR_SET_MM_START_STACK: ::c_int = 5; +pub const PR_SET_MM_START_BRK: ::c_int = 6; +pub const PR_SET_MM_BRK: ::c_int = 7; +pub const PR_SET_MM_ARG_START: ::c_int = 8; +pub const PR_SET_MM_ARG_END: ::c_int = 9; +pub const PR_SET_MM_ENV_START: ::c_int = 10; +pub const PR_SET_MM_ENV_END: ::c_int = 11; +pub const PR_SET_MM_AUXV: ::c_int = 12; +pub const PR_SET_MM_EXE_FILE: ::c_int = 13; +pub const PR_SET_MM_MAP: ::c_int = 14; +pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; + +pub const PR_SET_PTRACER: ::c_int = 0x59616d61; +pub const PR_SET_PTRACER_ANY: ::c_ulong = 0xffffffffffffffff; + +pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; +pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; + +pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; +pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; + +pub const PR_GET_TID_ADDRESS: ::c_int = 40; + +pub const PR_SET_THP_DISABLE: ::c_int = 41; +pub const PR_GET_THP_DISABLE: ::c_int = 42; + +pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43; +pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44; + +pub const PR_SET_FP_MODE: ::c_int = 45; +pub const PR_GET_FP_MODE: ::c_int = 46; +pub const PR_FP_MODE_FR: ::c_int = 1 << 0; +pub const PR_FP_MODE_FRE: ::c_int = 1 << 1; + +pub const PR_CAP_AMBIENT: ::c_int = 47; +pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1; +pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2; +pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3; +pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4; + +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; + +pub const TFD_CLOEXEC: ::c_int = O_CLOEXEC; +pub const TFD_NONBLOCK: ::c_int = O_NONBLOCK; +pub const TFD_TIMER_ABSTIME: ::c_int = 1; + +pub const XATTR_CREATE: ::c_int = 0x1; +pub const XATTR_REPLACE: ::c_int = 0x2; + +pub const _POSIX_VDISABLE: ::cc_t = 0; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; +pub const FALLOC_FL_COLLAPSE_RANGE: ::c_int = 0x08; +pub const FALLOC_FL_ZERO_RANGE: ::c_int = 0x10; +pub const FALLOC_FL_INSERT_RANGE: ::c_int = 0x20; +pub const FALLOC_FL_UNSHARE_RANGE: ::c_int = 0x40; + +// On Linux, libc doesn't define this constant, libattr does instead. +// We still define it for Linux as it's defined by libc on other platforms, +// and it's mentioned in the man pages for getxattr and setxattr. +pub const ENOATTR: ::c_int = ::ENODATA; + +pub const SO_ORIGINAL_DST: ::c_int = 80; +pub const IUTF8: ::tcflag_t = 0x00004000; +pub const CMSPAR: ::tcflag_t = 0o10000000000; + +pub const MFD_CLOEXEC: ::c_uint = 0x0001; +pub const MFD_ALLOW_SEALING: ::c_uint = 0x0002; + +// these are used in the p_type field of Elf32_Phdr and Elf64_Phdr, which has +// the type Elf32Word and Elf64Word respectively. Luckily, both of those are u32 +// so we can use that type here to avoid having to cast. +pub const PT_NULL: u32 = 0; +pub const PT_LOAD: u32 = 1; +pub const PT_DYNAMIC: u32 = 2; +pub const PT_INTERP: u32 = 3; +pub const PT_NOTE: u32 = 4; +pub const PT_SHLIB: u32 = 5; +pub const PT_PHDR: u32 = 6; +pub const PT_TLS: u32 = 7; +pub const PT_NUM: u32 = 8; +pub const PT_LOOS: u32 = 0x60000000; +pub const PT_GNU_EH_FRAME: u32 = 0x6474e550; +pub const PT_GNU_STACK: u32 = 0x6474e551; +pub const PT_GNU_RELRO: u32 = 0x6474e552; + +// Ethernet protocol IDs. +pub const ETH_P_IP: ::c_int = 0x0800; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 0x00040000; +pub const O_NOATIME: ::c_int = 0x00002000; +pub const O_CLOEXEC: ::c_int = 0x00000100; +pub const O_TMPFILE: ::c_int = 0x00004000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const BUFSIZ: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 10000; +pub const FOPEN_MAX: ::c_uint = 1000; +pub const O_PATH: ::c_int = 0x00400000; +pub const O_EXEC: ::c_int = O_PATH; +pub const O_SEARCH: ::c_int = O_PATH; +pub const O_ACCMODE: ::c_int = 03 | O_SEARCH; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const NI_MAXHOST: ::socklen_t = 255; +pub const PTHREAD_STACK_MIN: ::size_t = 2048; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const RLIM_INFINITY: ::rlim_t = !0; +pub const RLIMIT_RTTIME: ::c_int = 15; +pub const RLIMIT_NLIMITS: ::c_int = 16; +pub const RLIM_NLIMITS: ::c_int = RLIMIT_NLIMITS; + +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const SOCK_DCCP: ::c_int = 6; +pub const SOCK_PACKET: ::c_int = 10; + +pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; +pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; +pub const TCP_THIN_DUPACK: ::c_int = 17; +pub const TCP_USER_TIMEOUT: ::c_int = 18; +pub const TCP_REPAIR: ::c_int = 19; +pub const TCP_REPAIR_QUEUE: ::c_int = 20; +pub const TCP_QUEUE_SEQ: ::c_int = 21; +pub const TCP_REPAIR_OPTIONS: ::c_int = 22; +pub const TCP_FASTOPEN: ::c_int = 23; +pub const TCP_TIMESTAMP: ::c_int = 24; + +pub const SIGUNUSED: ::c_int = ::SIGSYS; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; + +pub const CPU_SETSIZE: ::c_int = 128; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_GETFPXREGS: ::c_int = 18; +pub const PTRACE_SETFPXREGS: ::c_int = 19; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; + +pub const EPOLLWAKEUP: ::c_int = 0x20000000; + +pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TIOCINQ: ::c_int = ::FIONREAD; + +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SO_MARK: ::c_int = 36; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_BUSY_POLL: ::c_int = 46; + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; + +pub const O_ASYNC: ::c_int = 0x00000400; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; + +pub const O_APPEND: ::c_int = 0x00100000; +pub const O_CREAT: ::c_int = 0x00010000; +pub const O_EXCL: ::c_int = 0x00020000; +pub const O_NOCTTY: ::c_int = 0x00000200; +pub const O_NONBLOCK: ::c_int = 0x00000010; +pub const O_SYNC: ::c_int = 0x00000040 | O_DSYNC; +pub const O_RSYNC: ::c_int = O_SYNC; +pub const O_DSYNC: ::c_int = 0x00000020; + +pub const SOCK_CLOEXEC: ::c_int = 0o2000000; +pub const SOCK_NONBLOCK: ::c_int = 0o4000; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; + +pub const O_DIRECTORY: ::c_int = 0x00080000; +pub const O_DIRECT: ::c_int = 0x00000800; +pub const O_LARGEFILE: ::c_int = 0x00001000; +pub const O_NOFOLLOW: ::c_int = 0x00000080; + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +// END_PUB_CONST + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in_bits = 8 * ::mem::size_of_val(&cpuset.bits[0]); + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + 0 != (cpuset.bits[idx] & (1 << offset)) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.bits == set2.bits + } + + pub fn major(dev: ::dev_t) -> ::c_uint { + let mut major = 0; + major |= (dev & 0x00000000000fff00) >> 8; + major |= (dev & 0xfffff00000000000) >> 32; + major as ::c_uint + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + let mut minor = 0; + minor |= (dev & 0x00000000000000ff) >> 0; + minor |= (dev & 0x00000ffffff00000) >> 12; + minor as ::c_uint + } + + pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar { + cmsg.offset(1) as *mut c_uchar + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) + -> *mut cmsghdr + { + if ((*cmsg).cmsg_len as ::size_t) < ::mem::size_of::() { + 0 as *mut cmsghdr + } else if __CMSG_NEXT(cmsg).add(::mem::size_of::()) + >= __MHDR_END(mhdr) { + 0 as *mut cmsghdr + } else { + __CMSG_NEXT(cmsg).cast() + } + } + + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as ::size_t >= ::mem::size_of::() { + (*mhdr).msg_control.cast() + } else { + 0 as *mut cmsghdr + } + } + + pub {const} fn CMSG_ALIGN(len: ::size_t) -> ::size_t { + (len + ::mem::size_of::<::size_t>() - 1) + & !(::mem::size_of::<::size_t>() - 1) + } + + pub {const} fn CMSG_SPACE(len: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(len as ::size_t) + CMSG_ALIGN(::mem::size_of::())) + as ::c_uint + } + + pub {const} fn CMSG_LEN(len: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(::mem::size_of::()) + len as ::size_t) as ::c_uint + } +} + +safe_f! { + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0x7f + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0x7f) + 1) as i8 >= 2 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0x7f) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } + + pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { + (cmd << 8) | (type_ & 0x00ff) + } + + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= (major & 0x00000fff) << 8; + dev |= (major & 0xfffff000) << 32; + dev |= (minor & 0x000000ff) << 0; + dev |= (minor & 0xffffff00) << 12; + dev + } +} + +fn __CMSG_LEN(cmsg: *const cmsghdr) -> ::ssize_t { + ((unsafe { (*cmsg).cmsg_len as ::size_t } + ::mem::size_of::<::c_long>() - 1) + & !(::mem::size_of::<::c_long>() - 1)) as ::ssize_t +} + +fn __CMSG_NEXT(cmsg: *const cmsghdr) -> *mut c_uchar { + (unsafe { cmsg.offset(__CMSG_LEN(cmsg)) }) as *mut c_uchar +} + +fn __MHDR_END(mhdr: *const msghdr) -> *mut c_uchar { + unsafe { (*mhdr).msg_control.offset((*mhdr).msg_controllen as isize) }.cast() +} + +// EXTERN_FN + +#[link(name = "c")] +#[link(name = "fdio")] +extern "C" {} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +impl ::Copy for FILE {} +impl ::Clone for FILE { + fn clone(&self) -> FILE { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos_t {} +impl ::Clone for fpos_t { + fn clone(&self) -> fpos_t { + *self + } +} + +extern "C" { + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; + pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE; + pub fn fflush(file: *mut FILE) -> c_int; + pub fn fclose(file: *mut FILE) -> c_int; + pub fn remove(filename: *const c_char) -> c_int; + pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn getchar() -> c_int; + pub fn putchar(c: c_int) -> c_int; + pub fn fgetc(stream: *mut FILE) -> c_int; + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; + pub fn puts(s: *const c_char) -> c_int; + pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; + pub fn ftell(stream: *mut FILE) -> c_long; + pub fn rewind(stream: *mut FILE); + pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; + pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; + pub fn feof(stream: *mut FILE) -> c_int; + pub fn ferror(stream: *mut FILE) -> c_int; + pub fn perror(s: *const c_char); + pub fn atof(s: *const c_char) -> c_double; + pub fn atoi(s: *const c_char) -> c_int; + pub fn atol(s: *const c_char) -> c_long; + pub fn atoll(s: *const c_char) -> c_longlong; + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float; + pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; + pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + pub fn malloc(size: size_t) -> *mut c_void; + pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; + pub fn free(p: *mut c_void); + pub fn abort() -> !; + pub fn exit(status: c_int) -> !; + pub fn _exit(status: c_int) -> !; + pub fn atexit(cb: extern "C" fn()) -> c_int; + pub fn system(s: *const c_char) -> c_int; + pub fn getenv(s: *const c_char) -> *mut c_char; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + pub fn wcslen(buf: *const wchar_t) -> size_t; + pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; + + pub fn abs(i: c_int) -> c_int; + pub fn labs(i: c_long) -> c_long; + pub fn rand() -> c_int; + pub fn srand(seed: c_uint); + + pub fn getpwnam(name: *const ::c_char) -> *mut passwd; + pub fn getpwuid(uid: ::uid_t) -> *mut passwd; + + pub fn fprintf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn printf(format: *const ::c_char, ...) -> ::c_int; + pub fn snprintf(s: *mut ::c_char, n: ::size_t, format: *const ::c_char, ...) -> ::c_int; + pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn scanf(format: *const ::c_char, ...) -> ::c_int; + pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn getchar_unlocked() -> ::c_int; + pub fn putchar_unlocked(c: ::c_int) -> ::c_int; + + pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int; + pub fn connect(socket: ::c_int, address: *const sockaddr, len: socklen_t) -> ::c_int; + pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int; + pub fn accept(socket: ::c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> ::c_int; + pub fn getpeername( + socket: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + ) -> ::c_int; + pub fn getsockname( + socket: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + ) -> ::c_int; + pub fn setsockopt( + socket: ::c_int, + level: ::c_int, + name: ::c_int, + value: *const ::c_void, + option_len: socklen_t, + ) -> ::c_int; + pub fn socketpair( + domain: ::c_int, + type_: ::c_int, + protocol: ::c_int, + socket_vector: *mut ::c_int, + ) -> ::c_int; + pub fn sendto( + socket: ::c_int, + buf: *const ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *const sockaddr, + addrlen: socklen_t, + ) -> ::ssize_t; + pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int; + + pub fn chmod(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn fchmod(fd: ::c_int, mode: mode_t) -> ::c_int; + + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + + pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int; + + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + + pub fn pclose(stream: *mut ::FILE) -> ::c_int; + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; + + pub fn opendir(dirname: *const c_char) -> *mut ::DIR; + pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; + pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, result: *mut *mut ::dirent) + -> ::c_int; + pub fn closedir(dirp: *mut ::DIR) -> ::c_int; + pub fn rewinddir(dirp: *mut ::DIR); + + pub fn openat(dirfd: ::c_int, pathname: *const ::c_char, flags: ::c_int, ...) -> ::c_int; + pub fn fchmodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + flags: ::c_int, + ) -> ::c_int; + pub fn fchown(fd: ::c_int, owner: ::uid_t, group: ::gid_t) -> ::c_int; + pub fn fchownat( + dirfd: ::c_int, + pathname: *const ::c_char, + owner: ::uid_t, + group: ::gid_t, + flags: ::c_int, + ) -> ::c_int; + pub fn fstatat( + dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut stat, + flags: ::c_int, + ) -> ::c_int; + pub fn linkat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + flags: ::c_int, + ) -> ::c_int; + pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn readlinkat( + dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut ::c_char, + bufsiz: ::size_t, + ) -> ::ssize_t; + pub fn renameat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + ) -> ::c_int; + pub fn symlinkat( + target: *const ::c_char, + newdirfd: ::c_int, + linkpath: *const ::c_char, + ) -> ::c_int; + pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, flags: ::c_int) -> ::c_int; + + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + pub fn alarm(seconds: ::c_uint) -> ::c_uint; + pub fn chdir(dir: *const c_char) -> ::c_int; + pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; + pub fn lchown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; + pub fn close(fd: ::c_int) -> ::c_int; + pub fn dup(fd: ::c_int) -> ::c_int; + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + pub fn execl(path: *const c_char, arg0: *const c_char, ...) -> ::c_int; + pub fn execle(path: *const ::c_char, arg0: *const ::c_char, ...) -> ::c_int; + pub fn execlp(file: *const ::c_char, arg0: *const ::c_char, ...) -> ::c_int; + pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::c_int; + pub fn execve( + prog: *const c_char, + argv: *const *const c_char, + envp: *const *const c_char, + ) -> ::c_int; + pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int; + pub fn fork() -> pid_t; + pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; + pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char; + pub fn getegid() -> gid_t; + pub fn geteuid() -> uid_t; + pub fn getgid() -> gid_t; + pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t) -> ::c_int; + pub fn getlogin() -> *mut c_char; + pub fn getopt(argc: ::c_int, argv: *const *mut c_char, optstr: *const c_char) -> ::c_int; + pub fn getpgid(pid: pid_t) -> pid_t; + pub fn getpgrp() -> pid_t; + pub fn getpid() -> pid_t; + pub fn getppid() -> pid_t; + pub fn getuid() -> uid_t; + pub fn isatty(fd: ::c_int) -> ::c_int; + pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int; + pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; + pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; + pub fn pause() -> ::c_int; + pub fn pipe(fds: *mut ::c_int) -> ::c_int; + pub fn posix_memalign(memptr: *mut *mut ::c_void, align: ::size_t, size: ::size_t) -> ::c_int; + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) -> ::ssize_t; + pub fn rmdir(path: *const c_char) -> ::c_int; + pub fn seteuid(uid: uid_t) -> ::c_int; + pub fn setegid(gid: gid_t) -> ::c_int; + pub fn setgid(gid: gid_t) -> ::c_int; + pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int; + pub fn setsid() -> pid_t; + pub fn setuid(uid: uid_t) -> ::c_int; + pub fn sleep(secs: ::c_uint) -> ::c_uint; + pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> ::c_int; + pub fn tcgetpgrp(fd: ::c_int) -> pid_t; + pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int; + pub fn ttyname(fd: ::c_int) -> *mut c_char; + pub fn unlink(c: *const c_char) -> ::c_int; + pub fn wait(status: *mut ::c_int) -> pid_t; + pub fn waitpid(pid: pid_t, status: *mut ::c_int, options: ::c_int) -> pid_t; + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t) -> ::ssize_t; + pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + pub fn umask(mask: mode_t) -> mode_t; + + pub fn utime(file: *const c_char, buf: *const utimbuf) -> ::c_int; + + pub fn kill(pid: pid_t, sig: ::c_int) -> ::c_int; + + pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn mlockall(flags: ::c_int) -> ::c_int; + pub fn munlockall() -> ::c_int; + + pub fn mmap( + addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off_t, + ) -> *mut ::c_void; + pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; + + pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; + pub fn if_indextoname(ifindex: ::c_uint, ifname: *mut ::c_char) -> *mut ::c_char; + + pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int; + + pub fn fsync(fd: ::c_int) -> ::c_int; + + pub fn setenv(name: *const c_char, val: *const c_char, overwrite: ::c_int) -> ::c_int; + pub fn unsetenv(name: *const c_char) -> ::c_int; + + pub fn symlink(path1: *const c_char, path2: *const c_char) -> ::c_int; + + pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; + + pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t; + + pub fn realpath(pathname: *const ::c_char, resolved: *mut ::c_char) -> *mut ::c_char; + + pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn times(buf: *mut ::tms) -> ::clock_t; + + pub fn pthread_self() -> ::pthread_t; + pub fn pthread_join(native: ::pthread_t, value: *mut *mut ::c_void) -> ::c_int; + pub fn pthread_exit(value: *mut ::c_void) -> !; + pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, stack_size: ::size_t) -> ::c_int; + pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, state: ::c_int) -> ::c_int; + pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; + pub fn sched_yield() -> ::c_int; + pub fn pthread_key_create( + key: *mut pthread_key_t, + dtor: ::Option, + ) -> ::c_int; + pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; + pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; + pub fn pthread_setspecific(key: pthread_key_t, value: *const ::c_void) -> ::c_int; + pub fn pthread_mutex_init( + lock: *mut pthread_mutex_t, + attr: *const pthread_mutexattr_t, + ) -> ::c_int; + pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> ::c_int; + + pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int; + pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int; + pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, _type: ::c_int) -> ::c_int; + + pub fn pthread_cond_init(cond: *mut pthread_cond_t, attr: *const pthread_condattr_t) + -> ::c_int; + pub fn pthread_cond_wait(cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_cond_timedwait( + cond: *mut pthread_cond_t, + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> ::c_int; + pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> ::c_int; + pub fn pthread_rwlock_init( + lock: *mut pthread_rwlock_t, + attr: *const pthread_rwlockattr_t, + ) -> ::c_int; + pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlockattr_init(attr: *mut pthread_rwlockattr_t) -> ::c_int; + pub fn pthread_rwlockattr_destroy(attr: *mut pthread_rwlockattr_t) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn getsockopt( + sockfd: ::c_int, + level: ::c_int, + optname: ::c_int, + optval: *mut ::c_void, + optlen: *mut ::socklen_t, + ) -> ::c_int; + pub fn raise(signum: ::c_int) -> ::c_int; + pub fn sigaction(signum: ::c_int, act: *const sigaction, oldact: *mut sigaction) -> ::c_int; + + pub fn utimes(filename: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn dlopen(filename: *const ::c_char, flag: ::c_int) -> *mut ::c_void; + pub fn dlerror() -> *mut ::c_char; + pub fn dlsym(handle: *mut ::c_void, symbol: *const ::c_char) -> *mut ::c_void; + pub fn dlclose(handle: *mut ::c_void) -> ::c_int; + pub fn dladdr(addr: *const ::c_void, info: *mut Dl_info) -> ::c_int; + + pub fn getaddrinfo( + node: *const c_char, + service: *const c_char, + hints: *const addrinfo, + res: *mut *mut addrinfo, + ) -> ::c_int; + pub fn freeaddrinfo(res: *mut addrinfo); + pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; + pub fn res_init() -> ::c_int; + + pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + pub fn mktime(tm: *mut tm) -> time_t; + pub fn time(time: *mut time_t) -> time_t; + pub fn gmtime(time_p: *const time_t) -> *mut tm; + pub fn localtime(time_p: *const time_t) -> *mut tm; + + pub fn mknod(pathname: *const ::c_char, mode: ::mode_t, dev: ::dev_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn getservbyname(name: *const ::c_char, proto: *const ::c_char) -> *mut servent; + pub fn getprotobyname(name: *const ::c_char) -> *mut protoent; + pub fn getprotobynumber(proto: ::c_int) -> *mut protoent; + pub fn usleep(secs: ::c_uint) -> ::c_int; + pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + pub fn putenv(string: *mut c_char) -> ::c_int; + pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; + pub fn select( + nfds: ::c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *mut timeval, + ) -> ::c_int; + pub fn setlocale(category: ::c_int, locale: *const ::c_char) -> *mut ::c_char; + pub fn localeconv() -> *mut lconv; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_wait(sem: *mut sem_t) -> ::c_int; + pub fn sem_trywait(sem: *mut sem_t) -> ::c_int; + pub fn sem_post(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + pub fn statvfs(path: *const c_char, buf: *mut statvfs) -> ::c_int; + pub fn fstatvfs(fd: ::c_int, buf: *mut statvfs) -> ::c_int; + + pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: ::size_t) -> ::ssize_t; + + pub fn sigemptyset(set: *mut sigset_t) -> ::c_int; + pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + pub fn sigfillset(set: *mut sigset_t) -> ::c_int; + pub fn sigdelset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + pub fn sigismember(set: *const sigset_t, signum: ::c_int) -> ::c_int; + + pub fn sigprocmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sigpending(set: *mut sigset_t) -> ::c_int; + + pub fn timegm(tm: *mut ::tm) -> time_t; + + pub fn getsid(pid: pid_t) -> pid_t; + + pub fn sysconf(name: ::c_int) -> ::c_long; + + pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; + + pub fn pselect( + nfds: ::c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *const timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn fseeko(stream: *mut ::FILE, offset: ::off_t, whence: ::c_int) -> ::c_int; + pub fn ftello(stream: *mut ::FILE) -> ::off_t; + pub fn tcdrain(fd: ::c_int) -> ::c_int; + pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t; + pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t; + pub fn cfmakeraw(termios: *mut ::termios); + pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int; + pub fn tcsetattr(fd: ::c_int, optional_actions: ::c_int, termios: *const ::termios) -> ::c_int; + pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcgetsid(fd: ::c_int) -> ::pid_t; + pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int; + pub fn mkstemp(template: *mut ::c_char) -> ::c_int; + pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char; + + pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; + + pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int); + pub fn closelog(); + pub fn setlogmask(maskpri: ::c_int) -> ::c_int; + pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); + + pub fn grantpt(fd: ::c_int) -> ::c_int; + pub fn posix_openpt(flags: ::c_int) -> ::c_int; + pub fn ptsname(fd: ::c_int) -> *mut ::c_char; + pub fn unlockpt(fd: ::c_int) -> ::c_int; + + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + + pub fn pthread_getattr_np(native: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int; + pub fn ptsname_r(fd: ::c_int, buf: *mut ::c_char, buflen: ::size_t) -> ::c_int; + pub fn clearenv() -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + pub fn setreuid(ruid: ::uid_t, euid: ::uid_t) -> ::c_int; + pub fn setregid(rgid: ::gid_t, egid: ::gid_t) -> ::c_int; + pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t, suid: *mut ::uid_t) -> ::c_int; + pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t, sgid: *mut ::gid_t) -> ::c_int; + pub fn acct(filename: *const ::c_char) -> ::c_int; + pub fn brk(addr: *mut ::c_void) -> ::c_int; + pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; + pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, + ) -> ::c_int; + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwent() -> *mut passwd; + + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + + // System V IPC + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn semget(key: ::key_t, nsems: ::c_int, semflag: ::c_int) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut ::sembuf, nsops: ::size_t) -> ::c_int; + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + pub fn msgsnd( + msqid: ::c_int, + msgp: *const ::c_void, + msgsz: ::size_t, + msgflg: ::c_int, + ) -> ::c_int; + + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn __errno_location() -> *mut ::c_int; + + pub fn fallocate(fd: ::c_int, mode: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn readahead(fd: ::c_int, offset: ::off64_t, count: ::size_t) -> ::ssize_t; + pub fn signalfd(fd: ::c_int, mask: *const ::sigset_t, flags: ::c_int) -> ::c_int; + pub fn timerfd_create(clockid: ::c_int, flags: ::c_int) -> ::c_int; + pub fn timerfd_gettime(fd: ::c_int, curr_value: *mut itimerspec) -> ::c_int; + pub fn timerfd_settime( + fd: ::c_int, + flags: ::c_int, + new_value: *const itimerspec, + old_value: *mut itimerspec, + ) -> ::c_int; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn quotactl( + cmd: ::c_int, + special: *const ::c_char, + id: ::c_int, + data: *mut ::c_char, + ) -> ::c_int; + pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn reboot(how_to: ::c_int) -> ::c_int; + pub fn setfsgid(gid: ::gid_t) -> ::c_int; + pub fn setfsuid(uid: ::uid_t) -> ::c_int; + + // Not available now on Android + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn sync_file_range( + fd: ::c_int, + offset: ::off64_t, + nbytes: ::off64_t, + flags: ::c_uint, + ) -> ::c_int; + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + + pub fn glob( + pattern: *const c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn vhangup() -> ::c_int; + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + pub fn sync(); + pub fn syscall(num: ::c_long, ...) -> ::c_long; + pub fn sched_getaffinity(pid: ::pid_t, cpusetsize: ::size_t, cpuset: *mut cpu_set_t) + -> ::c_int; + pub fn sched_setaffinity( + pid: ::pid_t, + cpusetsize: ::size_t, + cpuset: *const cpu_set_t, + ) -> ::c_int; + pub fn umount(target: *const ::c_char) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn tee(fd_in: ::c_int, fd_out: ::c_int, len: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn splice( + fd_in: ::c_int, + off_in: *mut ::loff_t, + fd_out: ::c_int, + off_out: *mut ::loff_t, + len: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn swapoff(puath: *const ::c_char) -> ::c_int; + pub fn vmsplice( + fd: ::c_int, + iov: *const ::iovec, + nr_segs: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn mount( + src: *const ::c_char, + target: *const ::c_char, + fstype: *const ::c_char, + flags: ::c_ulong, + data: *const ::c_void, + ) -> ::c_int; + pub fn personality(persona: ::c_ulong) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; + pub fn ppoll( + fds: *mut ::pollfd, + nfds: nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn clone( + cb: extern "C" fn(*mut ::c_void) -> ::c_int, + child_stack: *mut ::c_void, + flags: ::c_int, + arg: *mut ::c_void, + ... + ) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn swapon(path: *const ::c_char, swapflags: ::c_int) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + + pub fn setgrent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + + pub fn getgrouplist( + user: *const ::c_char, + group: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut ::dl_phdr_info, + size: ::size_t, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(any(target_arch = "riscv64"))] { + mod riscv64; + pub use self::riscv64::*; + } else { + // Unknown target_arch + } +} + +cfg_if! { + if #[cfg(libc_align)] { + #[macro_use] + mod align; + } else { + #[macro_use] + mod no_align; + } +} +expand_align!(); + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/no_align.rs new file mode 100644 index 0000000..7ca90e0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/no_align.rs @@ -0,0 +1,129 @@ +macro_rules! expand_align { + () => { + s! { + pub struct pthread_mutexattr_t { + #[cfg(target_arch = "x86_64")] + __align: [::c_int; 0], + #[cfg(not(target_arch = "x86_64"))] + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_rwlockattr_t { + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + pub struct pthread_condattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + + s_no_extra_traits! { + pub struct pthread_mutex_t { + #[cfg(any(target_arch = "arm", + all(target_arch = "x86_64", + target_pointer_width = "32")))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "arm", + all(target_arch = "x86_64", + target_pointer_width = "32"))))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { + __align: [::c_long; 0], + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_cond_t { + __align: [*const ::c_void; 0], + #[cfg(not(target_env = "musl"))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + // Ignore __align field + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_cond_t {} + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // Ignore __align field + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + // Ignore __align field + self.size.hash(state); + } + } + + impl PartialEq for pthread_mutex_t { + fn eq(&self, other: &pthread_mutex_t) -> bool { + // Ignore __align field + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_mutex_t {} + impl ::fmt::Debug for pthread_mutex_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + // Ignore __align field + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_mutex_t { + fn hash(&self, state: &mut H) { + // Ignore __align field + self.size.hash(state); + } + } + + impl PartialEq for pthread_rwlock_t { + fn eq(&self, other: &pthread_rwlock_t) -> bool { + // Ignore __align field + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_rwlock_t {} + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + // Ignore __align field + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_rwlock_t { + fn hash(&self, state: &mut H) { + // Ignore __align field + self.size.hash(state); + } + } + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/riscv64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/riscv64.rs new file mode 100644 index 0000000..de2b719 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/riscv64.rs @@ -0,0 +1,44 @@ +// From psABI Calling Convention for RV64 +pub type c_char = u8; +pub type __u64 = ::c_ulonglong; +pub type wchar_t = i32; + +pub type nlink_t = ::c_ulong; +pub type blksize_t = ::c_long; + +pub type stat64 = stat; +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + // Not actually used, IPC calls just return ENOSYS + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/x86_64.rs new file mode 100644 index 0000000..dca3c24 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/fuchsia/x86_64.rs @@ -0,0 +1,152 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = ::c_long; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct mcontext_t { + __private: [u64; 32], + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } +} + +s_no_extra_traits! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 512], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + && self + .__private + .iter() + .zip(other.__private.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + // FIXME: .field("__private", &self.__private) + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + self.__private.hash(state); + } + } + } +} + +// offsets in user_regs_structs, from sys/reg.h +pub const R15: ::c_int = 0; +pub const R14: ::c_int = 1; +pub const R13: ::c_int = 2; +pub const R12: ::c_int = 3; +pub const RBP: ::c_int = 4; +pub const RBX: ::c_int = 5; +pub const R11: ::c_int = 6; +pub const R10: ::c_int = 7; +pub const R9: ::c_int = 8; +pub const R8: ::c_int = 9; +pub const RAX: ::c_int = 10; +pub const RCX: ::c_int = 11; +pub const RDX: ::c_int = 12; +pub const RSI: ::c_int = 13; +pub const RDI: ::c_int = 14; +pub const ORIG_RAX: ::c_int = 15; +pub const RIP: ::c_int = 16; +pub const CS: ::c_int = 17; +pub const EFLAGS: ::c_int = 18; +pub const RSP: ::c_int = 19; +pub const SS: ::c_int = 20; +pub const FS_BASE: ::c_int = 21; +pub const GS_BASE: ::c_int = 22; +pub const DS: ::c_int = 23; +pub const ES: ::c_int = 24; +pub const FS: ::c_int = 25; +pub const GS: ::c_int = 26; + +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/aarch64.rs new file mode 100644 index 0000000..1a92e3b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/aarch64.rs @@ -0,0 +1,2 @@ +pub type c_char = u8; +pub type wchar_t = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/mod.rs new file mode 100644 index 0000000..bffcefd --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/mod.rs @@ -0,0 +1,64 @@ +// libc port for HermitCore (https://hermitcore.org) +// +// Ported by Colin Fink +// and Stefan Lankes + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type c_long = i64; +pub type c_ulong = u64; + +pub type wint_t = u32; +pub type wctype_t = i64; + +pub type regoff_t = size_t; +pub type off_t = c_long; + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/x86_64.rs new file mode 100644 index 0000000..76ec3ce --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/hermit/x86_64.rs @@ -0,0 +1,2 @@ +pub type c_char = i8; +pub type wchar_t = i32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/lib.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/lib.rs new file mode 100644 index 0000000..d9bd318 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/lib.rs @@ -0,0 +1,163 @@ +//! libc - Raw FFI bindings to platforms' system libraries +//! +//! [Documentation for other platforms][pd]. +//! +//! [pd]: https://rust-lang.github.io/libc/#platform-specific-documentation +#![crate_name = "libc"] +#![crate_type = "rlib"] +#![allow( + renamed_and_removed_lints, // Keep this order. + unknown_lints, // Keep this order. + bad_style, + overflowing_literals, + improper_ctypes, + // This lint is renamed but we run CI for old stable rustc so should be here. + redundant_semicolon, + redundant_semicolons, + unused_macros, + unused_macro_rules, +)] +#![cfg_attr(libc_deny_warnings, deny(warnings))] +// Attributes needed when building as part of the standard library +#![cfg_attr(feature = "rustc-dep-of-std", feature(link_cfg, no_core))] +#![cfg_attr(libc_thread_local, feature(thread_local))] +// Enable extra lints: +#![cfg_attr(feature = "extra_traits", deny(missing_debug_implementations))] +#![deny(missing_copy_implementations, safe_packed_borrows)] +#![cfg_attr(not(feature = "rustc-dep-of-std"), no_std)] +#![cfg_attr(feature = "rustc-dep-of-std", no_core)] +#![cfg_attr(libc_const_extern_fn_unstable, feature(const_extern_fn))] + +#[macro_use] +mod macros; + +cfg_if! { + if #[cfg(feature = "rustc-dep-of-std")] { + extern crate rustc_std_workspace_core as core; + #[allow(unused_imports)] + use core::iter; + #[allow(unused_imports)] + use core::ops; + #[allow(unused_imports)] + use core::option; + } +} + +cfg_if! { + if #[cfg(libc_priv_mod_use)] { + #[cfg(libc_core_cvoid)] + #[allow(unused_imports)] + use core::ffi; + #[allow(unused_imports)] + use core::fmt; + #[allow(unused_imports)] + use core::hash; + #[allow(unused_imports)] + use core::num; + #[allow(unused_imports)] + use core::mem; + #[doc(hidden)] + #[allow(unused_imports)] + use core::clone::Clone; + #[doc(hidden)] + #[allow(unused_imports)] + use core::marker::{Copy, Send, Sync}; + #[doc(hidden)] + #[allow(unused_imports)] + use core::option::Option; + } else { + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::fmt; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::hash; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::num; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::mem; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::clone::Clone; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::marker::{Copy, Send, Sync}; + #[doc(hidden)] + #[allow(unused_imports)] + pub use core::option::Option; + } +} + +cfg_if! { + if #[cfg(windows)] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod windows; + pub use windows::*; + } else if #[cfg(target_os = "fuchsia")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod fuchsia; + pub use fuchsia::*; + } else if #[cfg(target_os = "switch")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod switch; + pub use switch::*; + } else if #[cfg(target_os = "psp")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod psp; + pub use psp::*; + } else if #[cfg(target_os = "vxworks")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod vxworks; + pub use vxworks::*; + } else if #[cfg(target_os = "solid_asp3")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod solid; + pub use solid::*; + } else if #[cfg(unix)] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod unix; + pub use unix::*; + } else if #[cfg(target_os = "hermit")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod hermit; + pub use hermit::*; + } else if #[cfg(all(target_env = "sgx", target_vendor = "fortanix"))] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod sgx; + pub use sgx::*; + } else if #[cfg(any(target_env = "wasi", target_os = "wasi"))] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod wasi; + pub use wasi::*; + } else if #[cfg(target_os = "xous")] { + mod fixed_width_ints; + pub use fixed_width_ints::*; + + mod xous; + pub use xous::*; + } else { + // non-supported targets: empty... + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/macros.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/macros.rs new file mode 100644 index 0000000..fd47370 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/macros.rs @@ -0,0 +1,343 @@ +/// A macro for defining #[cfg] if-else statements. +/// +/// This is similar to the `if/elif` C preprocessor macro by allowing definition +/// of a cascade of `#[cfg]` cases, emitting the implementation which matches +/// first. +/// +/// This allows you to conveniently provide a long list #[cfg]'d blocks of code +/// without having to rewrite each clause multiple times. +macro_rules! cfg_if { + // match if/else chains with a final `else` + ($( + if #[cfg($($meta:meta),*)] { $($it:item)* } + ) else * else { + $($it2:item)* + }) => { + cfg_if! { + @__items + () ; + $( ( ($($meta),*) ($($it)*) ), )* + ( () ($($it2)*) ), + } + }; + + // match if/else chains lacking a final `else` + ( + if #[cfg($($i_met:meta),*)] { $($i_it:item)* } + $( + else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } + )* + ) => { + cfg_if! { + @__items + () ; + ( ($($i_met),*) ($($i_it)*) ), + $( ( ($($e_met),*) ($($e_it)*) ), )* + ( () () ), + } + }; + + // Internal and recursive macro to emit all the items + // + // Collects all the negated `cfg`s in a list at the beginning and after the + // semicolon is all the remaining items + (@__items ($($not:meta,)*) ; ) => {}; + (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), + $($rest:tt)*) => { + // Emit all items within one block, applying an appropriate #[cfg]. The + // #[cfg] will require all `$m` matchers specified and must also negate + // all previous matchers. + cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } + + // Recurse to emit all other items in `$rest`, and when we do so add all + // our `$m` matchers to the list of `$not` matchers as future emissions + // will have to negate everything we just matched as well. + cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } + }; + + // Internal macro to Apply a cfg attribute to a list of items + (@__apply $m:meta, $($it:item)*) => { + $(#[$m] $it)* + }; +} + +macro_rules! s { + ($($(#[$attr:meta])* pub $t:ident $i:ident { $($field:tt)* })*) => ($( + s!(it: $(#[$attr])* pub $t $i { $($field)* }); + )*); + (it: $(#[$attr:meta])* pub union $i:ident { $($field:tt)* }) => ( + compile_error!("unions cannot derive extra traits, use s_no_extra_traits instead"); + ); + (it: $(#[$attr:meta])* pub struct $i:ident { $($field:tt)* }) => ( + __item! { + #[repr(C)] + #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] + #[allow(deprecated)] + $(#[$attr])* + pub struct $i { $($field)* } + } + #[allow(deprecated)] + impl ::Copy for $i {} + #[allow(deprecated)] + impl ::Clone for $i { + fn clone(&self) -> $i { *self } + } + ); +} + +macro_rules! s_no_extra_traits { + ($($(#[$attr:meta])* pub $t:ident $i:ident { $($field:tt)* })*) => ($( + s_no_extra_traits!(it: $(#[$attr])* pub $t $i { $($field)* }); + )*); + (it: $(#[$attr:meta])* pub union $i:ident { $($field:tt)* }) => ( + cfg_if! { + if #[cfg(libc_union)] { + __item! { + #[repr(C)] + $(#[$attr])* + pub union $i { $($field)* } + } + + impl ::Copy for $i {} + impl ::Clone for $i { + fn clone(&self) -> $i { *self } + } + } + } + ); + (it: $(#[$attr:meta])* pub struct $i:ident { $($field:tt)* }) => ( + __item! { + #[repr(C)] + $(#[$attr])* + pub struct $i { $($field)* } + } + #[allow(deprecated)] + impl ::Copy for $i {} + #[allow(deprecated)] + impl ::Clone for $i { + fn clone(&self) -> $i { *self } + } + ); +} + +macro_rules! e { + ($($(#[$attr:meta])* pub enum $i:ident { $($field:tt)* })*) => ($( + __item! { + #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] + $(#[$attr])* + pub enum $i { $($field)* } + } + impl ::Copy for $i {} + impl ::Clone for $i { + fn clone(&self) -> $i { *self } + } + )*); +} + +macro_rules! s_paren { + ($($(#[$attr:meta])* pub struct $i:ident ( $($field:tt)* ); )* ) => ($( + __item! { + #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] + $(#[$attr])* + pub struct $i ( $($field)* ); + } + impl ::Copy for $i {} + impl ::Clone for $i { + fn clone(&self) -> $i { *self } + } + )*); +} + +// This is a pretty horrible hack to allow us to conditionally mark +// some functions as 'const', without requiring users of this macro +// to care about the "const-extern-fn" feature. +// +// When 'const-extern-fn' is enabled, we emit the captured 'const' keyword +// in the expanded function. +// +// When 'const-extern-fn' is disabled, we always emit a plain 'pub unsafe extern fn'. +// Note that the expression matched by the macro is exactly the same - this allows +// users of this macro to work whether or not 'const-extern-fn' is enabled +// +// Unfortunately, we need to duplicate most of this macro between the 'cfg_if' blocks. +// This is because 'const unsafe extern fn' won't even parse on older compilers, +// so we need to avoid emitting it at all of 'const-extern-fn'. +// +// Specifically, moving the 'cfg_if' into the macro body will *not* work. +// Doing so would cause the '#[cfg(feature = "const-extern-fn")]' to be emitted +// into user code. The 'cfg' gate will not stop Rust from trying to parse the +// 'pub const unsafe extern fn', so users would get a compiler error even when +// the 'const-extern-fn' feature is disabled +// +// Note that users of this macro need to place 'const' in a weird position +// (after the closing ')' for the arguments, but before the return type). +// This was the only way I could satisfy the following two requirements: +// 1. Avoid ambiguity errors from 'macro_rules!' (which happen when writing '$foo:ident fn' +// 2. Allow users of this macro to mix 'pub fn foo' and 'pub const fn bar' within the same +// 'f!' block +cfg_if! { + if #[cfg(libc_const_extern_fn)] { + macro_rules! f { + ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + pub $($constness)* unsafe extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + macro_rules! safe_f { + ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + pub $($constness)* extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + macro_rules! const_fn { + ($($(#[$attr:meta])* $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + $($constness)* fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + } else { + macro_rules! f { + ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + pub unsafe extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + macro_rules! safe_f { + ($($(#[$attr:meta])* pub $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + pub extern fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + + macro_rules! const_fn { + ($($(#[$attr:meta])* $({$constness:ident})* fn $i:ident( + $($arg:ident: $argty:ty),* + ) -> $ret:ty { + $($body:stmt);* + })*) => ($( + #[inline] + $(#[$attr])* + fn $i($($arg: $argty),* + ) -> $ret { + $($body);* + } + )*) + } + } +} + +macro_rules! __item { + ($i:item) => { + $i + }; +} + +macro_rules! align_const { + ($($(#[$attr:meta])* + pub const $name:ident : $t1:ty + = $t2:ident { $($field:tt)* };)*) => ($( + #[cfg(libc_align)] + $(#[$attr])* + pub const $name : $t1 = $t2 { + $($field)* + }; + #[cfg(not(libc_align))] + $(#[$attr])* + pub const $name : $t1 = $t2 { + $($field)* + __align: [], + }; + )*) +} + +// This macro is used to deprecate items that should be accessed via the mach2 crate +macro_rules! deprecated_mach { + (pub const $id:ident: $ty:ty = $expr:expr;) => { + #[deprecated( + since = "0.2.55", + note = "Use the `mach2` crate instead", + )] + #[allow(deprecated)] + pub const $id: $ty = $expr; + }; + ($(pub const $id:ident: $ty:ty = $expr:expr;)*) => { + $( + deprecated_mach!( + pub const $id: $ty = $expr; + ); + )* + }; + (pub type $id:ident = $ty:ty;) => { + #[deprecated( + since = "0.2.55", + note = "Use the `mach2` crate instead", + )] + #[allow(deprecated)] + pub type $id = $ty; + }; + ($(pub type $id:ident = $ty:ty;)*) => { + $( + deprecated_mach!( + pub type $id = $ty; + ); + )* + } +} + +#[cfg(not(libc_ptr_addr_of))] +macro_rules! ptr_addr_of { + ($place:expr) => { + &$place + }; +} + +#[cfg(libc_ptr_addr_of)] +macro_rules! ptr_addr_of { + ($place:expr) => { + ::core::ptr::addr_of!($place) + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/psp.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/psp.rs new file mode 100644 index 0000000..575232d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/psp.rs @@ -0,0 +1,4174 @@ +//! PSP C type definitions +//! +//! These type declarations are not enough, as they must be ultimately resolved +//! by the linker. Crates that use these definitions must, somewhere in the +//! crate graph, include a stub provider crate such as the `psp` crate. + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} + +pub type SceKernelVTimerHandler = unsafe extern "C" fn( + uid: SceUid, + arg1: *mut SceKernelSysClock, + arg2: *mut SceKernelSysClock, + arg3: *mut c_void, +) -> u32; + +pub type SceKernelVTimerHandlerWide = + unsafe extern "C" fn(uid: SceUid, arg1: i64, arg2: i64, arg3: *mut c_void) -> u32; + +pub type SceKernelThreadEventHandler = + unsafe extern "C" fn(mask: i32, thid: SceUid, common: *mut c_void) -> i32; + +pub type SceKernelAlarmHandler = unsafe extern "C" fn(common: *mut c_void) -> u32; + +pub type SceKernelCallbackFunction = + unsafe extern "C" fn(arg1: i32, arg2: i32, arg: *mut c_void) -> i32; + +pub type SceKernelThreadEntry = unsafe extern "C" fn(args: usize, argp: *mut c_void) -> i32; + +pub type PowerCallback = extern "C" fn(unknown: i32, power_info: i32); + +pub type IoPermissions = i32; + +pub type UmdCallback = fn(unknown: i32, event: i32) -> i32; + +pub type SceMpegRingbufferCb = + ::Option i32>; + +pub type GuCallback = ::Option; +pub type GuSwapBuffersCallback = + ::Option; + +pub type SceNetAdhocctlHandler = + ::Option; + +pub type AdhocMatchingCallback = ::Option< + unsafe extern "C" fn( + matching_id: i32, + event: i32, + mac: *mut u8, + opt_len: i32, + opt_data: *mut c_void, + ), +>; + +pub type SceNetApctlHandler = ::Option< + unsafe extern "C" fn(oldState: i32, newState: i32, event: i32, error: i32, pArg: *mut c_void), +>; + +pub type HttpMallocFunction = ::Option *mut c_void>; +pub type HttpReallocFunction = + ::Option *mut c_void>; +pub type HttpFreeFunction = ::Option; +pub type HttpPasswordCB = ::Option< + unsafe extern "C" fn( + request: i32, + auth_type: HttpAuthType, + realm: *const u8, + username: *mut u8, + password: *mut u8, + need_entity: i32, + entity_body: *mut *mut u8, + entity_size: *mut usize, + save: *mut i32, + ) -> i32, +>; + +pub type socklen_t = u32; + +e! { + #[repr(u32)] + pub enum AudioFormat { + Stereo = 0, + Mono = 0x10, + } + + #[repr(u32)] + pub enum DisplayMode { + Lcd = 0, + } + + #[repr(u32)] + pub enum DisplayPixelFormat { + Psm5650 = 0, + Psm5551 = 1, + Psm4444 = 2, + Psm8888 = 3, + } + + #[repr(u32)] + pub enum DisplaySetBufSync { + Immediate = 0, + NextFrame = 1, + } + + #[repr(i32)] + pub enum AudioOutputFrequency { + Khz48 = 48000, + Khz44_1 = 44100, + Khz32 = 32000, + Khz24 = 24000, + Khz22_05 = 22050, + Khz16 = 16000, + Khz12 = 12000, + Khz11_025 = 11025, + Khz8 = 8000, + } + + #[repr(i32)] + pub enum AudioInputFrequency { + Khz44_1 = 44100, + Khz22_05 = 22050, + Khz11_025 = 11025, + } + + #[repr(u32)] + pub enum CtrlMode { + Digital = 0, + Analog, + } + + #[repr(i32)] + pub enum GeMatrixType { + Bone0 = 0, + Bone1, + Bone2, + Bone3, + Bone4, + Bone5, + Bone6, + Bone7, + World, + View, + Projection, + TexGen, + } + + #[repr(i32)] + pub enum GeListState { + Done = 0, + Queued, + DrawingDone, + StallReached, + CancelDone, + } + + #[repr(u8)] + pub enum GeCommand { + Nop = 0, + Vaddr = 0x1, + Iaddr = 0x2, + Prim = 0x4, + Bezier = 0x5, + Spline = 0x6, + BoundingBox = 0x7, + Jump = 0x8, + BJump = 0x9, + Call = 0xa, + Ret = 0xb, + End = 0xc, + Signal = 0xe, + Finish = 0xf, + Base = 0x10, + VertexType = 0x12, + OffsetAddr = 0x13, + Origin = 0x14, + Region1 = 0x15, + Region2 = 0x16, + LightingEnable = 0x17, + LightEnable0 = 0x18, + LightEnable1 = 0x19, + LightEnable2 = 0x1a, + LightEnable3 = 0x1b, + DepthClampEnable = 0x1c, + CullFaceEnable = 0x1d, + TextureMapEnable = 0x1e, + FogEnable = 0x1f, + DitherEnable = 0x20, + AlphaBlendEnable = 0x21, + AlphaTestEnable = 0x22, + ZTestEnable = 0x23, + StencilTestEnable = 0x24, + AntiAliasEnable = 0x25, + PatchCullEnable = 0x26, + ColorTestEnable = 0x27, + LogicOpEnable = 0x28, + BoneMatrixNumber = 0x2a, + BoneMatrixData = 0x2b, + MorphWeight0 = 0x2c, + MorphWeight1 = 0x2d, + MorphWeight2 = 0x2e, + MorphWeight3 = 0x2f, + MorphWeight4 = 0x30, + MorphWeight5 = 0x31, + MorphWeight6 = 0x32, + MorphWeight7 = 0x33, + PatchDivision = 0x36, + PatchPrimitive = 0x37, + PatchFacing = 0x38, + WorldMatrixNumber = 0x3a, + WorldMatrixData = 0x3b, + ViewMatrixNumber = 0x3c, + ViewMatrixData = 0x3d, + ProjMatrixNumber = 0x3e, + ProjMatrixData = 0x3f, + TGenMatrixNumber = 0x40, + TGenMatrixData = 0x41, + ViewportXScale = 0x42, + ViewportYScale = 0x43, + ViewportZScale = 0x44, + ViewportXCenter = 0x45, + ViewportYCenter = 0x46, + ViewportZCenter = 0x47, + TexScaleU = 0x48, + TexScaleV = 0x49, + TexOffsetU = 0x4a, + TexOffsetV = 0x4b, + OffsetX = 0x4c, + OffsetY = 0x4d, + ShadeMode = 0x50, + ReverseNormal = 0x51, + MaterialUpdate = 0x53, + MaterialEmissive = 0x54, + MaterialAmbient = 0x55, + MaterialDiffuse = 0x56, + MaterialSpecular = 0x57, + MaterialAlpha = 0x58, + MaterialSpecularCoef = 0x5b, + AmbientColor = 0x5c, + AmbientAlpha = 0x5d, + LightMode = 0x5e, + LightType0 = 0x5f, + LightType1 = 0x60, + LightType2 = 0x61, + LightType3 = 0x62, + Light0X = 0x63, + Light0Y, + Light0Z, + Light1X, + Light1Y, + Light1Z, + Light2X, + Light2Y, + Light2Z, + Light3X, + Light3Y, + Light3Z, + Light0DirectionX = 0x6f, + Light0DirectionY, + Light0DirectionZ, + Light1DirectionX, + Light1DirectionY, + Light1DirectionZ, + Light2DirectionX, + Light2DirectionY, + Light2DirectionZ, + Light3DirectionX, + Light3DirectionY, + Light3DirectionZ, + Light0ConstantAtten = 0x7b, + Light0LinearAtten, + Light0QuadtraticAtten, + Light1ConstantAtten, + Light1LinearAtten, + Light1QuadtraticAtten, + Light2ConstantAtten, + Light2LinearAtten, + Light2QuadtraticAtten, + Light3ConstantAtten, + Light3LinearAtten, + Light3QuadtraticAtten, + Light0ExponentAtten = 0x87, + Light1ExponentAtten, + Light2ExponentAtten, + Light3ExponentAtten, + Light0CutoffAtten = 0x8b, + Light1CutoffAtten, + Light2CutoffAtten, + Light3CutoffAtten, + Light0Ambient = 0x8f, + Light0Diffuse, + Light0Specular, + Light1Ambient, + Light1Diffuse, + Light1Specular, + Light2Ambient, + Light2Diffuse, + Light2Specular, + Light3Ambient, + Light3Diffuse, + Light3Specular, + Cull = 0x9b, + FrameBufPtr = 0x9c, + FrameBufWidth = 0x9d, + ZBufPtr = 0x9e, + ZBufWidth = 0x9f, + TexAddr0 = 0xa0, + TexAddr1, + TexAddr2, + TexAddr3, + TexAddr4, + TexAddr5, + TexAddr6, + TexAddr7, + TexBufWidth0 = 0xa8, + TexBufWidth1, + TexBufWidth2, + TexBufWidth3, + TexBufWidth4, + TexBufWidth5, + TexBufWidth6, + TexBufWidth7, + ClutAddr = 0xb0, + ClutAddrUpper = 0xb1, + TransferSrc, + TransferSrcW, + TransferDst, + TransferDstW, + TexSize0 = 0xb8, + TexSize1, + TexSize2, + TexSize3, + TexSize4, + TexSize5, + TexSize6, + TexSize7, + TexMapMode = 0xc0, + TexShadeLs = 0xc1, + TexMode = 0xc2, + TexFormat = 0xc3, + LoadClut = 0xc4, + ClutFormat = 0xc5, + TexFilter = 0xc6, + TexWrap = 0xc7, + TexLevel = 0xc8, + TexFunc = 0xc9, + TexEnvColor = 0xca, + TexFlush = 0xcb, + TexSync = 0xcc, + Fog1 = 0xcd, + Fog2 = 0xce, + FogColor = 0xcf, + TexLodSlope = 0xd0, + FramebufPixFormat = 0xd2, + ClearMode = 0xd3, + Scissor1 = 0xd4, + Scissor2 = 0xd5, + MinZ = 0xd6, + MaxZ = 0xd7, + ColorTest = 0xd8, + ColorRef = 0xd9, + ColorTestmask = 0xda, + AlphaTest = 0xdb, + StencilTest = 0xdc, + StencilOp = 0xdd, + ZTest = 0xde, + BlendMode = 0xdf, + BlendFixedA = 0xe0, + BlendFixedB = 0xe1, + Dith0 = 0xe2, + Dith1, + Dith2, + Dith3, + LogicOp = 0xe6, + ZWriteDisable = 0xe7, + MaskRgb = 0xe8, + MaskAlpha = 0xe9, + TransferStart = 0xea, + TransferSrcPos = 0xeb, + TransferDstPos = 0xec, + TransferSize = 0xee, + Vscx = 0xf0, + Vscy = 0xf1, + Vscz = 0xf2, + Vtcs = 0xf3, + Vtct = 0xf4, + Vtcq = 0xf5, + Vcv = 0xf6, + Vap = 0xf7, + Vfc = 0xf8, + Vscv = 0xf9, + + Unknown03 = 0x03, + Unknown0D = 0x0d, + Unknown11 = 0x11, + Unknown29 = 0x29, + Unknown34 = 0x34, + Unknown35 = 0x35, + Unknown39 = 0x39, + Unknown4E = 0x4e, + Unknown4F = 0x4f, + Unknown52 = 0x52, + Unknown59 = 0x59, + Unknown5A = 0x5a, + UnknownB6 = 0xb6, + UnknownB7 = 0xb7, + UnknownD1 = 0xd1, + UnknownED = 0xed, + UnknownEF = 0xef, + UnknownFA = 0xfa, + UnknownFB = 0xfb, + UnknownFC = 0xfc, + UnknownFD = 0xfd, + UnknownFE = 0xfe, + NopFF = 0xff, + } + + #[repr(i32)] + pub enum SceSysMemPartitionId { + SceKernelUnknownPartition = 0, + SceKernelPrimaryKernelPartition = 1, + SceKernelPrimaryUserPartition = 2, + SceKernelOtherKernelPartition1 = 3, + SceKernelOtherKernelPartition2 = 4, + SceKernelVshellPARTITION = 5, + SceKernelScUserPartition = 6, + SceKernelMeUserPartition = 7, + SceKernelExtendedScKernelPartition = 8, + SceKernelExtendedSc2KernelPartition = 9, + SceKernelExtendedMeKernelPartition = 10, + SceKernelVshellKernelPartition = 11, + SceKernelExtendedKernelPartition = 12, + } + + #[repr(i32)] + pub enum SceSysMemBlockTypes { + Low = 0, + High, + Addr, + } + + #[repr(u32)] + pub enum Interrupt { + Gpio = 4, + Ata = 5, + Umd = 6, + Mscm0 = 7, + Wlan = 8, + Audio = 10, + I2c = 12, + Sircs = 14, + Systimer0 = 15, + Systimer1 = 16, + Systimer2 = 17, + Systimer3 = 18, + Thread0 = 19, + Nand = 20, + Dmacplus = 21, + Dma0 = 22, + Dma1 = 23, + Memlmd = 24, + Ge = 25, + Vblank = 30, + Mecodec = 31, + Hpremote = 36, + Mscm1 = 60, + Mscm2 = 61, + Thread1 = 65, + Interrupt = 66, + } + + #[repr(u32)] + pub enum SubInterrupt { + Gpio = Interrupt::Gpio as u32, + Ata = Interrupt::Ata as u32, + Umd = Interrupt::Umd as u32, + Dmacplus = Interrupt::Dmacplus as u32, + Ge = Interrupt::Ge as u32, + Display = Interrupt::Vblank as u32, + } + + #[repr(u32)] + pub enum SceKernelIdListType { + Thread = 1, + Semaphore = 2, + EventFlag = 3, + Mbox = 4, + Vpl = 5, + Fpl = 6, + Mpipe = 7, + Callback = 8, + ThreadEventHandler = 9, + Alarm = 10, + VTimer = 11, + SleepThread = 64, + DelayThread = 65, + SuspendThread = 66, + DormantThread = 67, + } + + #[repr(i32)] + pub enum UsbCamResolution { + Px160_120 = 0, + Px176_144 = 1, + Px320_240 = 2, + Px352_288 = 3, + Px640_480 = 4, + Px1024_768 = 5, + Px1280_960 = 6, + Px480_272 = 7, + Px360_272 = 8, + } + + #[repr(i32)] + pub enum UsbCamResolutionEx { + Px160_120 = 0, + Px176_144 = 1, + Px320_240 = 2, + Px352_288 = 3, + Px360_272 = 4, + Px480_272 = 5, + Px640_480 = 6, + Px1024_768 = 7, + Px1280_960 = 8, + } + + #[repr(i32)] + pub enum UsbCamDelay { + NoDelay = 0, + Delay10Sec = 1, + Delay20Sec = 2, + Delay30Sec = 3, + } + + #[repr(i32)] + pub enum UsbCamFrameRate { + Fps3_75 = 0, + Fps5 = 1, + Fps7_5 = 2, + Fps10 = 3, + Fps15 = 4, + Fps20 = 5, + Fps30 = 6, + Fps60 = 7, + } + + #[repr(i32)] + pub enum UsbCamWb { + Auto = 0, + Daylight = 1, + Fluorescent = 2, + Incadescent = 3, + } + + #[repr(i32)] + pub enum UsbCamEffectMode { + Normal = 0, + Negative = 1, + Blackwhite = 2, + Sepia = 3, + Blue = 4, + Red = 5, + Green = 6, + } + + #[repr(i32)] + pub enum UsbCamEvLevel { + Pos2_0 = 0, + Pos1_7 = 1, + Pos1_5 = 2, + Pos1_3 = 3, + Pos1_0 = 4, + Pos0_7 = 5, + Pos0_5 = 6, + Pos0_3 = 7, + Zero = 8, + Neg0_3, + Neg0_5, + Neg0_7, + Neg1_0, + Neg1_3, + Neg1_5, + Neg1_7, + Neg2_0, + } + + #[repr(i32)] + pub enum RtcCheckValidError { + InvalidYear = -1, + InvalidMonth = -2, + InvalidDay = -3, + InvalidHour = -4, + InvalidMinutes = -5, + InvalidSeconds = -6, + InvalidMicroseconds = -7, + } + + #[repr(u32)] + pub enum PowerTick { + All = 0, + Suspend = 1, + Display = 6, + } + + #[repr(u32)] + pub enum IoAssignPerms { + RdWr = 0, + RdOnly = 1, + } + + #[repr(u32)] + pub enum IoWhence { + Set = 0, + Cur = 1, + End = 2, + } + + #[repr(u32)] + pub enum UmdType { + Game = 0x10, + Video = 0x20, + Audio = 0x40, + } + + #[repr(u32)] + pub enum GuPrimitive { + Points = 0, + Lines = 1, + LineStrip = 2, + Triangles = 3, + TriangleStrip = 4, + TriangleFan = 5, + Sprites = 6, + } + + #[repr(u32)] + pub enum PatchPrimitive { + Points = 0, + LineStrip = 2, + TriangleStrip = 4, + } + + #[repr(u32)] + pub enum GuState { + AlphaTest = 0, + DepthTest = 1, + ScissorTest = 2, + StencilTest = 3, + Blend = 4, + CullFace = 5, + Dither = 6, + Fog = 7, + ClipPlanes = 8, + Texture2D = 9, + Lighting = 10, + Light0 = 11, + Light1 = 12, + Light2 = 13, + Light3 = 14, + LineSmooth = 15, + PatchCullFace = 16, + ColorTest = 17, + ColorLogicOp = 18, + FaceNormalReverse = 19, + PatchFace = 20, + Fragment2X = 21, + } + + #[repr(u32)] + pub enum MatrixMode { + Projection = 0, + View = 1, + Model = 2, + Texture = 3, + } + + #[repr(u32)] + pub enum TexturePixelFormat { + Psm5650 = 0, + Psm5551 = 1, + Psm4444 = 2, + Psm8888 = 3, + PsmT4 = 4, + PsmT8 = 5, + PsmT16 = 6, + PsmT32 = 7, + PsmDxt1 = 8, + PsmDxt3 = 9, + PsmDxt5 = 10, + } + + #[repr(u32)] + pub enum SplineMode { + FillFill = 0, + OpenFill = 1, + FillOpen = 2, + OpenOpen = 3, + } + + #[repr(u32)] + pub enum ShadingModel { + Flat = 0, + Smooth = 1, + } + + #[repr(u32)] + pub enum LogicalOperation { + Clear = 0, + And = 1, + AndReverse = 2, + Copy = 3, + AndInverted = 4, + Noop = 5, + Xor = 6, + Or = 7, + Nor = 8, + Equiv = 9, + Inverted = 10, + OrReverse = 11, + CopyInverted = 12, + OrInverted = 13, + Nand = 14, + Set = 15, + } + + #[repr(u32)] + pub enum TextureFilter { + Nearest = 0, + Linear = 1, + NearestMipmapNearest = 4, + LinearMipmapNearest = 5, + NearestMipmapLinear = 6, + LinearMipmapLinear = 7, + } + + #[repr(u32)] + pub enum TextureMapMode { + TextureCoords = 0, + TextureMatrix = 1, + EnvironmentMap = 2, + } + + #[repr(u32)] + pub enum TextureLevelMode { + Auto = 0, + Const = 1, + Slope = 2, + } + + #[repr(u32)] + pub enum TextureProjectionMapMode { + Position = 0, + Uv = 1, + NormalizedNormal = 2, + Normal = 3, + } + + #[repr(u32)] + pub enum GuTexWrapMode { + Repeat = 0, + Clamp = 1, + } + + #[repr(u32)] + pub enum FrontFaceDirection { + Clockwise = 0, + CounterClockwise = 1, + } + + #[repr(u32)] + pub enum AlphaFunc { + Never = 0, + Always, + Equal, + NotEqual, + Less, + LessOrEqual, + Greater, + GreaterOrEqual, + } + + #[repr(u32)] + pub enum StencilFunc { + Never = 0, + Always, + Equal, + NotEqual, + Less, + LessOrEqual, + Greater, + GreaterOrEqual, + } + + #[repr(u32)] + pub enum ColorFunc { + Never = 0, + Always, + Equal, + NotEqual, + } + + #[repr(u32)] + pub enum DepthFunc { + Never = 0, + Always, + Equal, + NotEqual, + Less, + LessOrEqual, + Greater, + GreaterOrEqual, + } + + #[repr(u32)] + pub enum TextureEffect { + Modulate = 0, + Decal = 1, + Blend = 2, + Replace = 3, + Add = 4, + } + + #[repr(u32)] + pub enum TextureColorComponent { + Rgb = 0, + Rgba = 1, + } + + #[repr(u32)] + pub enum MipmapLevel { + None = 0, + Level1, + Level2, + Level3, + Level4, + Level5, + Level6, + Level7, + } + + #[repr(u32)] + pub enum BlendOp { + Add = 0, + Subtract = 1, + ReverseSubtract = 2, + Min = 3, + Max = 4, + Abs = 5, + } + + #[repr(u32)] + pub enum BlendSrc { + SrcColor = 0, + OneMinusSrcColor = 1, + SrcAlpha = 2, + OneMinusSrcAlpha = 3, + Fix = 10, + } + + #[repr(u32)] + pub enum BlendDst { + DstColor = 0, + OneMinusDstColor = 1, + DstAlpha = 4, + OneMinusDstAlpha = 5, + Fix = 10, + } + + #[repr(u32)] + pub enum StencilOperation { + Keep = 0, + Zero = 1, + Replace = 2, + Invert = 3, + Incr = 4, + Decr = 5, + } + + #[repr(u32)] + pub enum LightMode { + SingleColor = 0, + SeparateSpecularColor = 1, + } + + #[repr(u32)] + pub enum LightType { + Directional = 0, + Pointlight = 1, + Spotlight = 2, + } + + #[repr(u32)] + pub enum GuContextType { + Direct = 0, + Call = 1, + Send = 2, + } + + #[repr(u32)] + pub enum GuQueueMode { + Tail = 0, + Head = 1, + } + + #[repr(u32)] + pub enum GuSyncMode { + Finish = 0, + Signal = 1, + Done = 2, + List = 3, + Send = 4, + } + + #[repr(u32)] + pub enum GuSyncBehavior { + Wait = 0, + NoWait = 1, + } + + #[repr(u32)] + pub enum GuCallbackId { + Signal = 1, + Finish = 4, + } + + #[repr(u32)] + pub enum SignalBehavior { + Suspend = 1, + Continue = 2, + } + + #[repr(u32)] + pub enum ClutPixelFormat { + Psm5650 = 0, + Psm5551 = 1, + Psm4444 = 2, + Psm8888 = 3, + } + + #[repr(C)] + pub enum KeyType { + Directory = 1, + Integer = 2, + String = 3, + Bytes = 4, + } + + #[repr(u32)] + pub enum UtilityMsgDialogMode { + Error, + Text, + } + + #[repr(u32)] + pub enum UtilityMsgDialogPressed { + Unknown1, + Yes, + No, + Back, + } + + #[repr(u32)] + pub enum UtilityDialogButtonAccept { + Circle, + Cross, + } + + #[repr(u32)] + pub enum SceUtilityOskInputLanguage { + Default, + Japanese, + English, + French, + Spanish, + German, + Italian, + Dutch, + Portugese, + Russian, + Korean, + } + + #[repr(u32)] + pub enum SceUtilityOskInputType { + All, + LatinDigit, + LatinSymbol, + LatinLowercase = 4, + LatinUppercase = 8, + JapaneseDigit = 0x100, + JapaneseSymbol = 0x200, + JapaneseLowercase = 0x400, + JapaneseUppercase = 0x800, + JapaneseHiragana = 0x1000, + JapaneseHalfWidthKatakana = 0x2000, + JapaneseKatakana = 0x4000, + JapaneseKanji = 0x8000, + RussianLowercase = 0x10000, + RussianUppercase = 0x20000, + Korean = 0x40000, + Url = 0x80000, + } + + #[repr(u32)] + pub enum SceUtilityOskState { + None, + Initializing, + Initialized, + Visible, + Quit, + Finished, + } + + #[repr(u32)] + pub enum SceUtilityOskResult { + Unchanged, + Cancelled, + Changed, + } + + #[repr(u32)] + pub enum SystemParamLanguage { + Japanese, + English, + French, + Spanish, + German, + Italian, + Dutch, + Portugese, + Russian, + Korean, + ChineseTraditional, + ChineseSimplified, + } + + #[repr(u32)] + pub enum SystemParamId { + StringNickname = 1, + AdhocChannel, + WlanPowerSave, + DateFormat, + TimeFormat, + Timezone, + DaylightSavings, + Language, + Unknown, + } + + #[repr(u32)] + pub enum SystemParamAdhocChannel { + ChannelAutomatic = 0, + Channel1 = 1, + Channel6 = 6, + Channel11 = 11, + } + + #[repr(u32)] + pub enum SystemParamWlanPowerSaveState { + Off, + On, + } + + #[repr(u32)] + pub enum SystemParamDateFormat { + YYYYMMDD, + MMDDYYYY, + DDMMYYYY, + } + + #[repr(u32)] + pub enum SystemParamTimeFormat { + Hour24, + Hour12, + } + + #[repr(u32)] + pub enum SystemParamDaylightSavings { + Std, + Dst, + } + + #[repr(u32)] + pub enum AvModule { + AvCodec, + SasCore, + Atrac3Plus, + MpegBase, + Mp3, + Vaudio, + Aac, + G729, + } + + #[repr(u32)] + pub enum Module { + NetCommon = 0x100, + NetAdhoc, + NetInet, + NetParseUri, + NetHttp, + NetSsl, + + UsbPspCm = 0x200, + UsbMic, + UsbCam, + UsbGps, + + AvCodec = 0x300, + AvSascore, + AvAtrac3Plus, + AvMpegBase, + AvMp3, + AvVaudio, + AvAac, + AvG729, + + NpCommon = 0x400, + NpService, + NpMatching2, + NpDrm = 0x500, + + Irda = 0x600, + } + + #[repr(u32)] + pub enum NetModule { + NetCommon = 1, + NetAdhoc, + NetInet, + NetParseUri, + NetHttp, + NetSsl, + } + + #[repr(u32)] + pub enum UsbModule { + UsbPspCm = 1, + UsbAcc, + UsbMic, + UsbCam, + UsbGps, + } + + #[repr(u32)] + pub enum NetParam { + Name, + Ssid, + Secure, + WepKey, + IsStaticIp, + Ip, + NetMask, + Route, + ManualDns, + PrimaryDns, + SecondaryDns, + ProxyUser, + ProxyPass, + UseProxy, + ProxyServer, + ProxyPort, + Unknown1, + Unknown2, + } + + #[repr(u32)] + pub enum UtilityNetconfAction { + ConnectAP, + DisplayStatus, + ConnectAdhoc, + } + + #[repr(u32)] + pub enum UtilitySavedataMode { + AutoLoad, + AutoSave, + Load, + Save, + ListLoad, + ListSave, + ListDelete, + Delete, + } + + #[repr(u32)] + pub enum UtilitySavedataFocus { + Unknown1, + FirstList, + LastList, + Latest, + Oldest, + Unknown2, + Unknown3, + FirstEmpty, + LastEmpty, + } + + #[repr(u32)] + pub enum UtilityGameSharingMode { + Single = 1, + Multiple, + } + + #[repr(u32)] + pub enum UtilityGameSharingDataType { + File = 1, + Memory, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerInterfaceMode { + Full, + Limited, + None, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerCookieMode { + Disabled = 0, + Enabled, + Confirm, + Default, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerTextSize { + Large, + Normal, + Small, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerDisplayMode { + Normal, + Fit, + SmartFit, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerConnectMode { + Last, + ManualOnce, + ManualAll, + } + + #[repr(u32)] + pub enum UtilityHtmlViewerDisconnectMode { + Enable, + Disable, + Confirm, + } + + #[repr(u32)] + pub enum ScePspnetAdhocPtpState { + Closed, + Listen, + SynSent, + SynReceived, + Established, + } + + #[repr(u32)] + pub enum AdhocMatchingMode { + Host = 1, + Client, + Ptp, + } + + #[repr(u32)] + pub enum ApctlState { + Disconnected, + Scanning, + Joining, + GettingIp, + GotIp, + EapAuth, + KeyExchange, + } + + #[repr(u32)] + pub enum ApctlEvent { + ConnectRequest, + ScanRequest, + ScanComplete, + Established, + GetIp, + DisconnectRequest, + Error, + Info, + EapAuth, + KeyExchange, + Reconnect, + } + + #[repr(u32)] + pub enum ApctlInfo { + ProfileName, + Bssid, + Ssid, + SsidLength, + SecurityType, + Strength, + Channel, + PowerSave, + Ip, + SubnetMask, + Gateway, + PrimaryDns, + SecondaryDns, + UseProxy, + ProxyUrl, + ProxyPort, + EapType, + StartBrowser, + Wifisp, + } + + #[repr(u32)] + pub enum ApctlInfoSecurityType { + None, + Wep, + Wpa, + } + + #[repr(u32)] + pub enum HttpMethod { + Get, + Post, + Head, + } + + #[repr(u32)] + pub enum HttpAuthType { + Basic, + Digest, + } +} + +s_paren! { + #[repr(transparent)] + pub struct SceUid(pub i32); + + #[repr(transparent)] + pub struct SceMpeg(*mut *mut c_void); + + #[repr(transparent)] + pub struct SceMpegStream(*mut c_void); + + #[repr(transparent)] + pub struct Mp3Handle(pub i32); + + #[repr(transparent)] + pub struct RegHandle(u32); +} + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: u8, + pub sa_data: [u8;14], + } + + pub struct in_addr { + pub s_addr: u32, + } + + pub struct AudioInputParams { + pub unknown1: i32, + pub gain: i32, + pub unknown2: i32, + pub unknown3: i32, + pub unknown4: i32, + pub unknown5: i32, + } + + pub struct Atrac3BufferInfo { + pub puc_write_position_first_buf: *mut u8, + pub ui_writable_byte_first_buf: u32, + pub ui_min_write_byte_first_buf: u32, + pub ui_read_position_first_buf: u32, + pub puc_write_position_second_buf: *mut u8, + pub ui_writable_byte_second_buf: u32, + pub ui_min_write_byte_second_buf: u32, + pub ui_read_position_second_buf: u32, + } + + pub struct SceCtrlData { + pub timestamp: u32, + pub buttons: i32, + pub lx: u8, + pub ly: u8, + pub rsrv: [u8; 6], + } + + pub struct SceCtrlLatch { + pub ui_make: u32, + pub ui_break: u32, + pub ui_press: u32, + pub ui_release: u32, + } + + pub struct GeStack { + pub stack: [u32; 8], + } + + pub struct GeCallbackData { + pub signal_func: ::Option, + pub signal_arg: *mut c_void, + pub finish_func: ::Option, + pub finish_arg: *mut c_void, + } + + pub struct GeListArgs { + pub size: u32, + pub context: *mut GeContext, + pub num_stacks: u32, + pub stacks: *mut GeStack, + } + + pub struct GeBreakParam { + pub buf: [u32; 4], + } + + pub struct SceKernelLoadExecParam { + pub size: usize, + pub args: usize, + pub argp: *mut c_void, + pub key: *const u8, + } + + pub struct timeval { + pub tv_sec: i32, + pub tv_usec: i32, + } + + pub struct timezone { + pub tz_minutes_west: i32, + pub tz_dst_time: i32, + } + + pub struct IntrHandlerOptionParam { + size: i32, + entry: u32, + common: u32, + gp: u32, + intr_code: u16, + sub_count: u16, + intr_level: u16, + enabled: u16, + calls: u32, + field_1c: u32, + total_clock_lo: u32, + total_clock_hi: u32, + min_clock_lo: u32, + min_clock_hi: u32, + max_clock_lo: u32, + max_clock_hi: u32, + } + + pub struct SceKernelLMOption { + pub size: usize, + pub m_pid_text: SceUid, + pub m_pid_data: SceUid, + pub flags: u32, + pub position: u8, + pub access: u8, + pub c_reserved: [u8; 2usize], + } + + pub struct SceKernelSMOption { + pub size: usize, + pub m_pid_stack: SceUid, + pub stack_size: usize, + pub priority: i32, + pub attribute: u32, + } + + pub struct SceKernelModuleInfo { + pub size: usize, + pub n_segment: u8, + pub reserved: [u8; 3usize], + pub segment_addr: [i32; 4usize], + pub segment_size: [i32; 4usize], + pub entry_addr: u32, + pub gp_value: u32, + pub text_addr: u32, + pub text_size: u32, + pub data_size: u32, + pub bss_size: u32, + pub attribute: u16, + pub version: [u8; 2usize], + pub name: [u8; 28usize], + } + + pub struct DebugProfilerRegs { + pub enable: u32, + pub systemck: u32, + pub cpuck: u32, + pub internal: u32, + pub memory: u32, + pub copz: u32, + pub vfpu: u32, + pub sleep: u32, + pub bus_access: u32, + pub uncached_load: u32, + pub uncached_store: u32, + pub cached_load: u32, + pub cached_store: u32, + pub i_miss: u32, + pub d_miss: u32, + pub d_writeback: u32, + pub cop0_inst: u32, + pub fpu_inst: u32, + pub vfpu_inst: u32, + pub local_bus: u32, + } + + pub struct SceKernelSysClock { + pub low: u32, + pub hi: u32, + } + + pub struct SceKernelThreadOptParam { + pub size: usize, + pub stack_mpid: SceUid, + } + + pub struct SceKernelThreadInfo { + pub size: usize, + pub name: [u8; 32], + pub attr: u32, + pub status: i32, + pub entry: SceKernelThreadEntry, + pub stack: *mut c_void, + pub stack_size: i32, + pub gp_reg: *mut c_void, + pub init_priority: i32, + pub current_priority: i32, + pub wait_type: i32, + pub wait_id: SceUid, + pub wakeup_count: i32, + pub exit_status: i32, + pub run_clocks: SceKernelSysClock, + pub intr_preempt_count: u32, + pub thread_preempt_count: u32, + pub release_count: u32, + } + + pub struct SceKernelThreadRunStatus { + pub size: usize, + pub status: i32, + pub current_priority: i32, + pub wait_type: i32, + pub wait_id: i32, + pub wakeup_count: i32, + pub run_clocks: SceKernelSysClock, + pub intr_preempt_count: u32, + pub thread_preempt_count: u32, + pub release_count: u32, + } + + pub struct SceKernelSemaOptParam { + pub size: usize, + } + + pub struct SceKernelSemaInfo { + pub size: usize, + pub name: [u8; 32], + pub attr: u32, + pub init_count: i32, + pub current_count: i32, + pub max_count: i32, + pub num_wait_threads: i32, + } + + pub struct SceKernelEventFlagInfo { + pub size: usize, + pub name: [u8; 32], + pub attr: u32, + pub init_pattern: u32, + pub current_pattern: u32, + pub num_wait_threads: i32, + } + + pub struct SceKernelEventFlagOptParam { + pub size: usize, + } + + pub struct SceKernelMbxOptParam { + pub size: usize, + } + + pub struct SceKernelMbxInfo { + pub size: usize, + pub name: [u8; 32usize], + pub attr: u32, + pub num_wait_threads: i32, + pub num_messages: i32, + pub first_message: *mut c_void, + } + + pub struct SceKernelVTimerInfo { + pub size: usize, + pub name: [u8; 32], + pub active: i32, + pub base: SceKernelSysClock, + pub current: SceKernelSysClock, + pub schedule: SceKernelSysClock, + pub handler: SceKernelVTimerHandler, + pub common: *mut c_void, + } + + pub struct SceKernelThreadEventHandlerInfo { + pub size: usize, + pub name: [u8; 32], + pub thread_id: SceUid, + pub mask: i32, + pub handler: SceKernelThreadEventHandler, + pub common: *mut c_void, + } + + pub struct SceKernelAlarmInfo { + pub size: usize, + pub schedule: SceKernelSysClock, + pub handler: SceKernelAlarmHandler, + pub common: *mut c_void, + } + + pub struct SceKernelSystemStatus { + pub size: usize, + pub status: u32, + pub idle_clocks: SceKernelSysClock, + pub comes_out_of_idle_count: u32, + pub thread_switch_count: u32, + pub vfpu_switch_count: u32, + } + + pub struct SceKernelMppInfo { + pub size: usize, + pub name: [u8; 32], + pub attr: u32, + pub buf_size: i32, + pub free_size: i32, + pub num_send_wait_threads: i32, + pub num_receive_wait_threads: i32, + } + + pub struct SceKernelVplOptParam { + pub size: usize, + } + + pub struct SceKernelVplInfo { + pub size: usize, + pub name: [u8; 32], + pub attr: u32, + pub pool_size: i32, + pub free_size: i32, + pub num_wait_threads: i32, + } + + pub struct SceKernelFplOptParam { + pub size: usize, + } + + pub struct SceKernelFplInfo { + pub size: usize, + pub name: [u8; 32usize], + pub attr: u32, + pub block_size: i32, + pub num_blocks: i32, + pub free_blocks: i32, + pub num_wait_threads: i32, + } + + pub struct SceKernelVTimerOptParam { + pub size: usize, + } + + pub struct SceKernelCallbackInfo { + pub size: usize, + pub name: [u8; 32usize], + pub thread_id: SceUid, + pub callback: SceKernelCallbackFunction, + pub common: *mut c_void, + pub notify_count: i32, + pub notify_arg: i32, + } + + pub struct UsbCamSetupStillParam { + pub size: i32, + pub resolution: UsbCamResolution, + pub jpeg_size: i32, + pub reverse_flags: i32, + pub delay: UsbCamDelay, + pub comp_level: i32, + } + + pub struct UsbCamSetupStillExParam { + pub size: i32, + pub unk: u32, + pub resolution: UsbCamResolutionEx, + pub jpeg_size: i32, + pub comp_level: i32, + pub unk2: u32, + pub unk3: u32, + pub flip: i32, + pub mirror: i32, + pub delay: UsbCamDelay, + pub unk4: [u32; 5usize], + } + + pub struct UsbCamSetupVideoParam { + pub size: i32, + pub resolution: UsbCamResolution, + pub framerate: UsbCamFrameRate, + pub white_balance: UsbCamWb, + pub saturation: i32, + pub brightness: i32, + pub contrast: i32, + pub sharpness: i32, + pub effect_mode: UsbCamEffectMode, + pub frame_size: i32, + pub unk: u32, + pub evl_evel: UsbCamEvLevel, + } + + pub struct UsbCamSetupVideoExParam { + pub size: i32, + pub unk: u32, + pub resolution: UsbCamResolutionEx, + pub framerate: UsbCamFrameRate, + pub unk2: u32, + pub unk3: u32, + pub white_balance: UsbCamWb, + pub saturation: i32, + pub brightness: i32, + pub contrast: i32, + pub sharpness: i32, + pub unk4: u32, + pub unk5: u32, + pub unk6: [u32; 3usize], + pub effect_mode: UsbCamEffectMode, + pub unk7: u32, + pub unk8: u32, + pub unk9: u32, + pub unk10: u32, + pub unk11: u32, + pub frame_size: i32, + pub unk12: u32, + pub ev_level: UsbCamEvLevel, + } + + pub struct ScePspDateTime { + pub year: u16, + pub month: u16, + pub day: u16, + pub hour: u16, + pub minutes: u16, + pub seconds: u16, + pub microseconds: u32, + } + + pub struct SceIoStat { + pub st_mode: i32, + pub st_attr: i32, + pub st_size: i64, + pub st_ctime: ScePspDateTime, + pub st_atime: ScePspDateTime, + pub st_mtime: ScePspDateTime, + pub st_private: [u32; 6usize], + } + + pub struct UmdInfo { + pub size: u32, + pub type_: UmdType, + } + + pub struct SceMpegRingbuffer { + pub packets: i32, + pub unk0: u32, + pub unk1: u32, + pub unk2: u32, + pub unk3: u32, + pub data: *mut c_void, + pub callback: SceMpegRingbufferCb, + pub cb_param: *mut c_void, + pub unk4: u32, + pub unk5: u32, + pub sce_mpeg: *mut c_void, + } + + pub struct SceMpegAu { + pub pts_msb: u32, + pub pts: u32, + pub dts_msb: u32, + pub dts: u32, + pub es_buffer: u32, + pub au_size: u32, + } + + pub struct SceMpegAvcMode { + pub unk0: i32, + pub pixel_format: super::DisplayPixelFormat, + } + + #[repr(align(64))] + pub struct SceMpegLLI { + pub src: *mut c_void, + pub dst: *mut c_void, + pub next: *mut c_void, + pub size: i32, + } + + #[repr(align(64))] + pub struct SceMpegYCrCbBuffer { + pub frame_buffer_height16: i32, + pub frame_buffer_width16: i32, + pub unknown: i32, + pub unknown2: i32, + pub y_buffer: *mut c_void, + pub y_buffer2: *mut c_void, + pub cr_buffer: *mut c_void, + pub cb_buffer: *mut c_void, + pub cr_buffer2: *mut c_void, + pub cb_buffer2: *mut c_void, + + pub frame_height: i32, + pub frame_width: i32, + pub frame_buffer_width: i32, + pub unknown3: [i32; 11usize], + } + + pub struct ScePspSRect { + pub x: i16, + pub y: i16, + pub w: i16, + pub h: i16, + } + + pub struct ScePspIRect { + pub x: i32, + pub y: i32, + pub w: i32, + pub h: i32, + } + + pub struct ScePspL64Rect { + pub x: u64, + pub y: u64, + pub w: u64, + pub h: u64, + } + + pub struct ScePspSVector2 { + pub x: i16, + pub y: i16, + } + + pub struct ScePspIVector2 { + pub x: i32, + pub y: i32, + } + + pub struct ScePspL64Vector2 { + pub x: u64, + pub y: u64, + } + + pub struct ScePspSVector3 { + pub x: i16, + pub y: i16, + pub z: i16, + } + + pub struct ScePspIVector3 { + pub x: i32, + pub y: i32, + pub z: i32, + } + + pub struct ScePspL64Vector3 { + pub x: u64, + pub y: u64, + pub z: u64, + } + + pub struct ScePspSVector4 { + pub x: i16, + pub y: i16, + pub z: i16, + pub w: i16, + } + + pub struct ScePspIVector4 { + pub x: i32, + pub y: i32, + pub z: i32, + pub w: i32, + } + + pub struct ScePspL64Vector4 { + pub x: u64, + pub y: u64, + pub z: u64, + pub w: u64, + } + + pub struct ScePspIMatrix2 { + pub x: ScePspIVector2, + pub y: ScePspIVector2, + } + + pub struct ScePspIMatrix3 { + pub x: ScePspIVector3, + pub y: ScePspIVector3, + pub z: ScePspIVector3, + } + + #[repr(align(16))] + pub struct ScePspIMatrix4 { + pub x: ScePspIVector4, + pub y: ScePspIVector4, + pub z: ScePspIVector4, + pub w: ScePspIVector4, + } + + pub struct ScePspIMatrix4Unaligned { + pub x: ScePspIVector4, + pub y: ScePspIVector4, + pub z: ScePspIVector4, + pub w: ScePspIVector4, + } + + pub struct SceMp3InitArg { + pub mp3_stream_start: u32, + pub unk1: u32, + pub mp3_stream_end: u32, + pub unk2: u32, + pub mp3_buf: *mut c_void, + pub mp3_buf_size: i32, + pub pcm_buf: *mut c_void, + pub pcm_buf_size: i32, + } + + pub struct OpenPSID { + pub data: [u8; 16usize], + } + + pub struct UtilityDialogCommon { + pub size: u32, + pub language: SystemParamLanguage, + pub button_accept: UtilityDialogButtonAccept, + pub graphics_thread: i32, + pub access_thread: i32, + pub font_thread: i32, + pub sound_thread: i32, + pub result: i32, + pub reserved: [i32; 4usize], + } + + pub struct UtilityNetconfAdhoc { + pub name: [u8; 8usize], + pub timeout: u32, + } + + pub struct UtilityNetconfData { + pub base: UtilityDialogCommon, + pub action: UtilityNetconfAction, + pub adhocparam: *mut UtilityNetconfAdhoc, + pub hotspot: i32, + pub hotspot_connected: i32, + pub wifisp: i32, + } + + pub struct UtilitySavedataFileData { + pub buf: *mut c_void, + pub buf_size: usize, + pub size: usize, + pub unknown: i32, + } + + pub struct UtilitySavedataListSaveNewData { + pub icon0: UtilitySavedataFileData, + pub title: *mut u8, + } + + pub struct UtilityGameSharingParams { + pub base: UtilityDialogCommon, + pub unknown1: i32, + pub unknown2: i32, + pub name: [u8; 8usize], + pub unknown3: i32, + pub unknown4: i32, + pub unknown5: i32, + pub result: i32, + pub filepath: *mut u8, + pub mode: UtilityGameSharingMode, + pub datatype: UtilityGameSharingDataType, + pub data: *mut c_void, + pub datasize: u32, + } + + pub struct UtilityHtmlViewerParam { + pub base: UtilityDialogCommon, + pub memaddr: *mut c_void, + pub memsize: u32, + pub unknown1: i32, + pub unknown2: i32, + pub initialurl: *mut u8, + pub numtabs: u32, + pub interfacemode: UtilityHtmlViewerInterfaceMode, + pub options: i32, + pub dldirname: *mut u8, + pub dlfilename: *mut u8, + pub uldirname: *mut u8, + pub ulfilename: *mut u8, + pub cookiemode: UtilityHtmlViewerCookieMode, + pub unknown3: u32, + pub homeurl: *mut u8, + pub textsize: UtilityHtmlViewerTextSize, + pub displaymode: UtilityHtmlViewerDisplayMode, + pub connectmode: UtilityHtmlViewerConnectMode, + pub disconnectmode: UtilityHtmlViewerDisconnectMode, + pub memused: u32, + pub unknown4: [i32; 10usize], + } + + pub struct SceUtilityOskData { + pub unk_00: i32, + pub unk_04: i32, + pub language: SceUtilityOskInputLanguage, + pub unk_12: i32, + pub inputtype: SceUtilityOskInputType, + pub lines: i32, + pub unk_24: i32, + pub desc: *mut u16, + pub intext: *mut u16, + pub outtextlength: i32, + pub outtext: *mut u16, + pub result: SceUtilityOskResult, + pub outtextlimit: i32, + } + + pub struct SceUtilityOskParams { + pub base: UtilityDialogCommon, + pub datacount: i32, + pub data: *mut SceUtilityOskData, + pub state: SceUtilityOskState, + pub unk_60: i32, + } + + pub struct SceNetMallocStat { + pub pool: i32, + pub maximum: i32, + pub free: i32, + } + + pub struct SceNetAdhocctlAdhocId { + pub unknown: i32, + pub adhoc_id: [u8; 9usize], + pub unk: [u8; 3usize], + } + + pub struct SceNetAdhocctlScanInfo { + pub next: *mut SceNetAdhocctlScanInfo, + pub channel: i32, + pub name: [u8; 8usize], + pub bssid: [u8; 6usize], + pub unknown: [u8; 2usize], + pub unknown2: i32, + } + + pub struct SceNetAdhocctlGameModeInfo { + pub count: i32, + pub macs: [[u8; 6usize]; 16usize], + } + + pub struct SceNetAdhocPtpStat { + pub next: *mut SceNetAdhocPtpStat, + pub ptp_id: i32, + pub mac: [u8; 6usize], + pub peermac: [u8; 6usize], + pub port: u16, + pub peerport: u16, + pub sent_data: u32, + pub rcvd_data: u32, + pub state: ScePspnetAdhocPtpState, + } + + pub struct SceNetAdhocPdpStat { + pub next: *mut SceNetAdhocPdpStat, + pub pdp_id: i32, + pub mac: [u8; 6usize], + pub port: u16, + pub rcvd_data: u32, + } + + pub struct AdhocPoolStat { + pub size: i32, + pub maxsize: i32, + pub freesize: i32, + } +} + +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct GeContext { + pub context: [u32; 512], + } + + #[allow(missing_debug_implementations)] + pub struct SceKernelUtilsSha1Context { + pub h: [u32; 5usize], + pub us_remains: u16, + pub us_computed: u16, + pub ull_total_len: u64, + pub buf: [u8; 64usize], + } + + #[allow(missing_debug_implementations)] + pub struct SceKernelUtilsMt19937Context { + pub count: u32, + pub state: [u32; 624usize], + } + + #[allow(missing_debug_implementations)] + pub struct SceKernelUtilsMd5Context { + pub h: [u32; 4usize], + pub pad: u32, + pub us_remains: u16, + pub us_computed: u16, + pub ull_total_len: u64, + pub buf: [u8; 64usize], + } + + #[allow(missing_debug_implementations)] + pub struct SceIoDirent { + pub d_stat: SceIoStat, + pub d_name: [u8; 256usize], + pub d_private: *mut c_void, + pub dummy: i32, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFRect { + pub x: f32, + pub y: f32, + pub w: f32, + pub h: f32, + } + + #[repr(align(16))] + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFVector3 { + pub x: f32, + pub y: f32, + pub z: f32, + } + + #[repr(align(16))] + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFVector4 { + pub x: f32, + pub y: f32, + pub z: f32, + pub w: f32, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFVector4Unaligned { + pub x: f32, + pub y: f32, + pub z: f32, + pub w: f32, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFVector2 { + pub x: f32, + pub y: f32, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFMatrix2 { + pub x: ScePspFVector2, + pub y: ScePspFVector2, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + pub struct ScePspFMatrix3 { + pub x: ScePspFVector3, + pub y: ScePspFVector3, + pub z: ScePspFVector3, + } + + #[cfg_attr(feature = "extra_traits", derive(Debug))] + #[repr(align(16))] + pub struct ScePspFMatrix4 { + pub x: ScePspFVector4, + pub y: ScePspFVector4, + pub z: ScePspFVector4, + pub w: ScePspFVector4, + } + + #[allow(missing_debug_implementations)] + pub struct ScePspFMatrix4Unaligned { + pub x: ScePspFVector4, + pub y: ScePspFVector4, + pub z: ScePspFVector4, + pub w: ScePspFVector4, + } + + #[allow(missing_debug_implementations)] + pub union ScePspVector3 { + pub fv: ScePspFVector3, + pub iv: ScePspIVector3, + pub f: [f32; 3usize], + pub i: [i32; 3usize], + } + + #[allow(missing_debug_implementations)] + pub union ScePspVector4 { + pub fv: ScePspFVector4, + pub iv: ScePspIVector4, + pub qw: u128, + pub f: [f32; 4usize], + pub i: [i32; 4usize], + } + + #[allow(missing_debug_implementations)] + pub union ScePspMatrix2 { + pub fm: ScePspFMatrix2, + pub im: ScePspIMatrix2, + pub fv: [ScePspFVector2; 2usize], + pub iv: [ScePspIVector2; 2usize], + pub v: [ScePspVector2; 2usize], + pub f: [[f32; 2usize]; 2usize], + pub i: [[i32; 2usize]; 2usize], + } + + #[allow(missing_debug_implementations)] + pub union ScePspMatrix3 { + pub fm: ScePspFMatrix3, + pub im: ScePspIMatrix3, + pub fv: [ScePspFVector3; 3usize], + pub iv: [ScePspIVector3; 3usize], + pub v: [ScePspVector3; 3usize], + pub f: [[f32; 3usize]; 3usize], + pub i: [[i32; 3usize]; 3usize], + } + + #[allow(missing_debug_implementations)] + pub union ScePspVector2 { + pub fv: ScePspFVector2, + pub iv: ScePspIVector2, + pub f: [f32; 2usize], + pub i: [i32; 2usize], + } + + #[allow(missing_debug_implementations)] + pub union ScePspMatrix4 { + pub fm: ScePspFMatrix4, + pub im: ScePspIMatrix4, + pub fv: [ScePspFVector4; 4usize], + pub iv: [ScePspIVector4; 4usize], + pub v: [ScePspVector4; 4usize], + pub f: [[f32; 4usize]; 4usize], + pub i: [[i32; 4usize]; 4usize], + } + + #[allow(missing_debug_implementations)] + pub struct Key { + pub key_type: KeyType, + pub name: [u8; 256usize], + pub name_len: u32, + pub unk2: u32, + pub unk3: u32, + } + + #[allow(missing_debug_implementations)] + pub struct UtilityMsgDialogParams { + pub base: UtilityDialogCommon, + pub unknown: i32, + pub mode: UtilityMsgDialogMode, + pub error_value: u32, + pub message: [u8; 512usize], + pub options: i32, + pub button_pressed: UtilityMsgDialogPressed, + } + + #[allow(missing_debug_implementations)] + pub union UtilityNetData { + pub as_uint: u32, + pub as_string: [u8; 128usize], + } + + #[allow(missing_debug_implementations)] + pub struct UtilitySavedataSFOParam { + pub title: [u8; 128usize], + pub savedata_title: [u8; 128usize], + pub detail: [u8; 1024usize], + pub parental_level: u8, + pub unknown: [u8; 3usize], + } + + #[allow(missing_debug_implementations)] + pub struct SceUtilitySavedataParam { + pub base: UtilityDialogCommon, + pub mode: UtilitySavedataMode, + pub unknown1: i32, + pub overwrite: i32, + pub game_name: [u8; 13usize], + pub reserved: [u8; 3usize], + pub save_name: [u8; 20usize], + pub save_name_list: *mut [u8; 20usize], + pub file_name: [u8; 13usize], + pub reserved1: [u8; 3usize], + pub data_buf: *mut c_void, + pub data_buf_size: usize, + pub data_size: usize, + pub sfo_param: UtilitySavedataSFOParam, + pub icon0_file_data: UtilitySavedataFileData, + pub icon1_file_data: UtilitySavedataFileData, + pub pic1_file_data: UtilitySavedataFileData, + pub snd0_file_data: UtilitySavedataFileData, + pub new_data: *mut UtilitySavedataListSaveNewData, + pub focus: UtilitySavedataFocus, + pub unknown2: [i32; 4usize], + pub key: [u8; 16], + pub unknown3: [u8; 20], + } + + #[allow(missing_debug_implementations)] + pub struct SceNetAdhocctlPeerInfo { + pub next: *mut SceNetAdhocctlPeerInfo, + pub nickname: [u8; 128usize], + pub mac: [u8; 6usize], + pub unknown: [u8; 6usize], + pub timestamp: u32, + } + + #[allow(missing_debug_implementations)] + pub struct SceNetAdhocctlParams { + pub channel: i32, + pub name: [u8; 8usize], + pub bssid: [u8; 6usize], + pub nickname: [u8; 128usize], + } + + #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))] + pub union SceNetApctlInfo { + pub name: [u8; 64usize], + pub bssid: [u8; 6usize], + pub ssid: [u8; 32usize], + pub ssid_length: u32, + pub security_type: u32, + pub strength: u8, + pub channel: u8, + pub power_save: u8, + pub ip: [u8; 16usize], + pub sub_net_mask: [u8; 16usize], + pub gateway: [u8; 16usize], + pub primary_dns: [u8; 16usize], + pub secondary_dns: [u8; 16usize], + pub use_proxy: u32, + pub proxy_url: [u8; 128usize], + pub proxy_port: u16, + pub eap_type: u32, + pub start_browser: u32, + pub wifisp: u32, + } +} + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +pub const AUDIO_VOLUME_MAX: u32 = 0x8000; +pub const AUDIO_CHANNEL_MAX: u32 = 8; +pub const AUDIO_NEXT_CHANNEL: i32 = -1; +pub const AUDIO_SAMPLE_MIN: u32 = 64; +pub const AUDIO_SAMPLE_MAX: u32 = 65472; + +pub const PSP_CTRL_SELECT: i32 = 0x000001; +pub const PSP_CTRL_START: i32 = 0x000008; +pub const PSP_CTRL_UP: i32 = 0x000010; +pub const PSP_CTRL_RIGHT: i32 = 0x000020; +pub const PSP_CTRL_DOWN: i32 = 0x000040; +pub const PSP_CTRL_LEFT: i32 = 0x000080; +pub const PSP_CTRL_LTRIGGER: i32 = 0x000100; +pub const PSP_CTRL_RTRIGGER: i32 = 0x000200; +pub const PSP_CTRL_TRIANGLE: i32 = 0x001000; +pub const PSP_CTRL_CIRCLE: i32 = 0x002000; +pub const PSP_CTRL_CROSS: i32 = 0x004000; +pub const PSP_CTRL_SQUARE: i32 = 0x008000; +pub const PSP_CTRL_HOME: i32 = 0x010000; +pub const PSP_CTRL_HOLD: i32 = 0x020000; +pub const PSP_CTRL_NOTE: i32 = 0x800000; +pub const PSP_CTRL_SCREEN: i32 = 0x400000; +pub const PSP_CTRL_VOLUP: i32 = 0x100000; +pub const PSP_CTRL_VOLDOWN: i32 = 0x200000; +pub const PSP_CTRL_WLAN_UP: i32 = 0x040000; +pub const PSP_CTRL_REMOTE: i32 = 0x080000; +pub const PSP_CTRL_DISC: i32 = 0x1000000; +pub const PSP_CTRL_MS: i32 = 0x2000000; + +pub const USB_CAM_PID: i32 = 0x282; +pub const USB_BUS_DRIVER_NAME: &str = "USBBusDriver"; +pub const USB_CAM_DRIVER_NAME: &str = "USBCamDriver"; +pub const USB_CAM_MIC_DRIVER_NAME: &str = "USBCamMicDriver"; +pub const USB_STOR_DRIVER_NAME: &str = "USBStor_Driver"; + +pub const ACTIVATED: i32 = 0x200; +pub const CONNECTED: i32 = 0x020; +pub const ESTABLISHED: i32 = 0x002; + +pub const USB_CAM_FLIP: i32 = 1; +pub const USB_CAM_MIRROR: i32 = 0x100; + +pub const THREAD_ATTR_VFPU: i32 = 0x00004000; +pub const THREAD_ATTR_USER: i32 = 0x80000000; +pub const THREAD_ATTR_USBWLAN: i32 = 0xa0000000; +pub const THREAD_ATTR_VSH: i32 = 0xc0000000; +pub const THREAD_ATTR_SCRATCH_SRAM: i32 = 0x00008000; +pub const THREAD_ATTR_NO_FILLSTACK: i32 = 0x00100000; +pub const THREAD_ATTR_CLEAR_STACK: i32 = 0x00200000; + +pub const EVENT_WAIT_MULTIPLE: i32 = 0x200; + +pub const EVENT_WAIT_AND: i32 = 0; +pub const EVENT_WAIT_OR: i32 = 1; +pub const EVENT_WAIT_CLEAR: i32 = 0x20; + +pub const POWER_INFO_POWER_SWITCH: i32 = 0x80000000; +pub const POWER_INFO_HOLD_SWITCH: i32 = 0x40000000; +pub const POWER_INFO_STANDBY: i32 = 0x00080000; +pub const POWER_INFO_RESUME_COMPLETE: i32 = 0x00040000; +pub const POWER_INFO_RESUMING: i32 = 0x00020000; +pub const POWER_INFO_SUSPENDING: i32 = 0x00010000; +pub const POWER_INFO_AC_POWER: i32 = 0x00001000; +pub const POWER_INFO_BATTERY_LOW: i32 = 0x00000100; +pub const POWER_INFO_BATTERY_EXIST: i32 = 0x00000080; +pub const POWER_INFO_BATTERY_POWER: i32 = 0x0000007; + +pub const FIO_S_IFLNK: i32 = 0x4000; +pub const FIO_S_IFDIR: i32 = 0x1000; +pub const FIO_S_IFREG: i32 = 0x2000; +pub const FIO_S_ISUID: i32 = 0x0800; +pub const FIO_S_ISGID: i32 = 0x0400; +pub const FIO_S_ISVTX: i32 = 0x0200; +pub const FIO_S_IRUSR: i32 = 0x0100; +pub const FIO_S_IWUSR: i32 = 0x0080; +pub const FIO_S_IXUSR: i32 = 0x0040; +pub const FIO_S_IRGRP: i32 = 0x0020; +pub const FIO_S_IWGRP: i32 = 0x0010; +pub const FIO_S_IXGRP: i32 = 0x0008; +pub const FIO_S_IROTH: i32 = 0x0004; +pub const FIO_S_IWOTH: i32 = 0x0002; +pub const FIO_S_IXOTH: i32 = 0x0001; + +pub const FIO_SO_IFLNK: i32 = 0x0008; +pub const FIO_SO_IFDIR: i32 = 0x0010; +pub const FIO_SO_IFREG: i32 = 0x0020; +pub const FIO_SO_IROTH: i32 = 0x0004; +pub const FIO_SO_IWOTH: i32 = 0x0002; +pub const FIO_SO_IXOTH: i32 = 0x0001; + +pub const PSP_O_RD_ONLY: i32 = 0x0001; +pub const PSP_O_WR_ONLY: i32 = 0x0002; +pub const PSP_O_RD_WR: i32 = 0x0003; +pub const PSP_O_NBLOCK: i32 = 0x0004; +pub const PSP_O_DIR: i32 = 0x0008; +pub const PSP_O_APPEND: i32 = 0x0100; +pub const PSP_O_CREAT: i32 = 0x0200; +pub const PSP_O_TRUNC: i32 = 0x0400; +pub const PSP_O_EXCL: i32 = 0x0800; +pub const PSP_O_NO_WAIT: i32 = 0x8000; + +pub const UMD_NOT_PRESENT: i32 = 0x01; +pub const UMD_PRESENT: i32 = 0x02; +pub const UMD_CHANGED: i32 = 0x04; +pub const UMD_INITING: i32 = 0x08; +pub const UMD_INITED: i32 = 0x10; +pub const UMD_READY: i32 = 0x20; + +pub const PLAY_PAUSE: i32 = 0x1; +pub const FORWARD: i32 = 0x4; +pub const BACK: i32 = 0x8; +pub const VOL_UP: i32 = 0x10; +pub const VOL_DOWN: i32 = 0x20; +pub const HOLD: i32 = 0x80; + +pub const GU_PI: f32 = 3.141593; + +pub const GU_TEXTURE_8BIT: i32 = 1; +pub const GU_TEXTURE_16BIT: i32 = 2; +pub const GU_TEXTURE_32BITF: i32 = 3; +pub const GU_COLOR_5650: i32 = 4 << 2; +pub const GU_COLOR_5551: i32 = 5 << 2; +pub const GU_COLOR_4444: i32 = 6 << 2; +pub const GU_COLOR_8888: i32 = 7 << 2; +pub const GU_NORMAL_8BIT: i32 = 1 << 5; +pub const GU_NORMAL_16BIT: i32 = 2 << 5; +pub const GU_NORMAL_32BITF: i32 = 3 << 5; +pub const GU_VERTEX_8BIT: i32 = 1 << 7; +pub const GU_VERTEX_16BIT: i32 = 2 << 7; +pub const GU_VERTEX_32BITF: i32 = 3 << 7; +pub const GU_WEIGHT_8BIT: i32 = 1 << 9; +pub const GU_WEIGHT_16BIT: i32 = 2 << 9; +pub const GU_WEIGHT_32BITF: i32 = 3 << 9; +pub const GU_INDEX_8BIT: i32 = 1 << 11; +pub const GU_INDEX_16BIT: i32 = 2 << 11; +pub const GU_WEIGHTS1: i32 = (((1 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS2: i32 = (((2 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS3: i32 = (((3 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS4: i32 = (((4 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS5: i32 = (((5 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS6: i32 = (((6 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS7: i32 = (((7 - 1) & 7) << 14) as i32; +pub const GU_WEIGHTS8: i32 = (((8 - 1) & 7) << 14) as i32; +pub const GU_VERTICES1: i32 = (((1 - 1) & 7) << 18) as i32; +pub const GU_VERTICES2: i32 = (((2 - 1) & 7) << 18) as i32; +pub const GU_VERTICES3: i32 = (((3 - 1) & 7) << 18) as i32; +pub const GU_VERTICES4: i32 = (((4 - 1) & 7) << 18) as i32; +pub const GU_VERTICES5: i32 = (((5 - 1) & 7) << 18) as i32; +pub const GU_VERTICES6: i32 = (((6 - 1) & 7) << 18) as i32; +pub const GU_VERTICES7: i32 = (((7 - 1) & 7) << 18) as i32; +pub const GU_VERTICES8: i32 = (((8 - 1) & 7) << 18) as i32; +pub const GU_TRANSFORM_2D: i32 = 1 << 23; +pub const GU_TRANSFORM_3D: i32 = 0; + +pub const GU_COLOR_BUFFER_BIT: i32 = 1; +pub const GU_STENCIL_BUFFER_BIT: i32 = 2; +pub const GU_DEPTH_BUFFER_BIT: i32 = 4; +pub const GU_FAST_CLEAR_BIT: i32 = 16; + +pub const GU_AMBIENT: i32 = 1; +pub const GU_DIFFUSE: i32 = 2; +pub const GU_SPECULAR: i32 = 4; +pub const GU_UNKNOWN_LIGHT_COMPONENT: i32 = 8; + +pub const SYSTEM_REGISTRY: [u8; 7] = *b"/system"; +pub const REG_KEYNAME_SIZE: u32 = 27; + +pub const UTILITY_MSGDIALOG_ERROR: i32 = 0; +pub const UTILITY_MSGDIALOG_TEXT: i32 = 1; +pub const UTILITY_MSGDIALOG_YES_NO_BUTTONS: i32 = 0x10; +pub const UTILITY_MSGDIALOG_DEFAULT_NO: i32 = 0x100; + +pub const UTILITY_HTMLVIEWER_OPEN_SCE_START_PAGE: i32 = 0x000001; +pub const UTILITY_HTMLVIEWER_DISABLE_STARTUP_LIMITS: i32 = 0x000002; +pub const UTILITY_HTMLVIEWER_DISABLE_EXIT_DIALOG: i32 = 0x000004; +pub const UTILITY_HTMLVIEWER_DISABLE_CURSOR: i32 = 0x000008; +pub const UTILITY_HTMLVIEWER_DISABLE_DOWNLOAD_COMPLETE_DIALOG: i32 = 0x000010; +pub const UTILITY_HTMLVIEWER_DISABLE_DOWNLOAD_START_DIALOG: i32 = 0x000020; +pub const UTILITY_HTMLVIEWER_DISABLE_DOWNLOAD_DESTINATION_DIALOG: i32 = 0x000040; +pub const UTILITY_HTMLVIEWER_LOCK_DOWNLOAD_DESTINATION_DIALOG: i32 = 0x000080; +pub const UTILITY_HTMLVIEWER_DISABLE_TAB_DISPLAY: i32 = 0x000100; +pub const UTILITY_HTMLVIEWER_ENABLE_ANALOG_HOLD: i32 = 0x000200; +pub const UTILITY_HTMLVIEWER_ENABLE_FLASH: i32 = 0x000400; +pub const UTILITY_HTMLVIEWER_DISABLE_LRTRIGGER: i32 = 0x000800; + +extern "C" { + pub fn sceAudioChReserve(channel: i32, sample_count: i32, format: AudioFormat) -> i32; + pub fn sceAudioChRelease(channel: i32) -> i32; + pub fn sceAudioOutput(channel: i32, vol: i32, buf: *mut c_void) -> i32; + pub fn sceAudioOutputBlocking(channel: i32, vol: i32, buf: *mut c_void) -> i32; + pub fn sceAudioOutputPanned( + channel: i32, + left_vol: i32, + right_vol: i32, + buf: *mut c_void, + ) -> i32; + pub fn sceAudioOutputPannedBlocking( + channel: i32, + left_vol: i32, + right_vol: i32, + buf: *mut c_void, + ) -> i32; + pub fn sceAudioGetChannelRestLen(channel: i32) -> i32; + pub fn sceAudioGetChannelRestLength(channel: i32) -> i32; + pub fn sceAudioSetChannelDataLen(channel: i32, sample_count: i32) -> i32; + pub fn sceAudioChangeChannelConfig(channel: i32, format: AudioFormat) -> i32; + pub fn sceAudioChangeChannelVolume(channel: i32, left_vol: i32, right_vol: i32) -> i32; + pub fn sceAudioOutput2Reserve(sample_count: i32) -> i32; + pub fn sceAudioOutput2Release() -> i32; + pub fn sceAudioOutput2ChangeLength(sample_count: i32) -> i32; + pub fn sceAudioOutput2OutputBlocking(vol: i32, buf: *mut c_void) -> i32; + pub fn sceAudioOutput2GetRestSample() -> i32; + pub fn sceAudioSRCChReserve( + sample_count: i32, + freq: AudioOutputFrequency, + channels: i32, + ) -> i32; + pub fn sceAudioSRCChRelease() -> i32; + pub fn sceAudioSRCOutputBlocking(vol: i32, buf: *mut c_void) -> i32; + pub fn sceAudioInputInit(unknown1: i32, gain: i32, unknown2: i32) -> i32; + pub fn sceAudioInputInitEx(params: *mut AudioInputParams) -> i32; + pub fn sceAudioInputBlocking(sample_count: i32, freq: AudioInputFrequency, buf: *mut c_void); + pub fn sceAudioInput(sample_count: i32, freq: AudioInputFrequency, buf: *mut c_void); + pub fn sceAudioGetInputLength() -> i32; + pub fn sceAudioWaitInputEnd() -> i32; + pub fn sceAudioPollInputEnd() -> i32; + + pub fn sceAtracGetAtracID(ui_codec_type: u32) -> i32; + pub fn sceAtracSetDataAndGetID(buf: *mut c_void, bufsize: usize) -> i32; + pub fn sceAtracDecodeData( + atrac_id: i32, + out_samples: *mut u16, + out_n: *mut i32, + out_end: *mut i32, + out_remain_frame: *mut i32, + ) -> i32; + pub fn sceAtracGetRemainFrame(atrac_id: i32, out_remain_frame: *mut i32) -> i32; + pub fn sceAtracGetStreamDataInfo( + atrac_id: i32, + write_pointer: *mut *mut u8, + available_bytes: *mut u32, + read_offset: *mut u32, + ) -> i32; + pub fn sceAtracAddStreamData(atrac_id: i32, bytes_to_add: u32) -> i32; + pub fn sceAtracGetBitrate(atrac_id: i32, out_bitrate: *mut i32) -> i32; + pub fn sceAtracSetLoopNum(atrac_id: i32, nloops: i32) -> i32; + pub fn sceAtracReleaseAtracID(atrac_id: i32) -> i32; + pub fn sceAtracGetNextSample(atrac_id: i32, out_n: *mut i32) -> i32; + pub fn sceAtracGetMaxSample(atrac_id: i32, out_max: *mut i32) -> i32; + pub fn sceAtracGetBufferInfoForReseting( + atrac_id: i32, + ui_sample: u32, + pbuffer_info: *mut Atrac3BufferInfo, + ) -> i32; + pub fn sceAtracGetChannel(atrac_id: i32, pui_channel: *mut u32) -> i32; + pub fn sceAtracGetInternalErrorInfo(atrac_id: i32, pi_result: *mut i32) -> i32; + pub fn sceAtracGetLoopStatus( + atrac_id: i32, + pi_loop_num: *mut i32, + pui_loop_status: *mut u32, + ) -> i32; + pub fn sceAtracGetNextDecodePosition(atrac_id: i32, pui_sample_position: *mut u32) -> i32; + pub fn sceAtracGetSecondBufferInfo( + atrac_id: i32, + pui_position: *mut u32, + pui_data_byte: *mut u32, + ) -> i32; + pub fn sceAtracGetSoundSample( + atrac_id: i32, + pi_end_sample: *mut i32, + pi_loop_start_sample: *mut i32, + pi_loop_end_sample: *mut i32, + ) -> i32; + pub fn sceAtracResetPlayPosition( + atrac_id: i32, + ui_sample: u32, + ui_write_byte_first_buf: u32, + ui_write_byte_second_buf: u32, + ) -> i32; + pub fn sceAtracSetData(atrac_id: i32, puc_buffer_addr: *mut u8, ui_buffer_byte: u32) -> i32; + pub fn sceAtracSetHalfwayBuffer( + atrac_id: i32, + puc_buffer_addr: *mut u8, + ui_read_byte: u32, + ui_buffer_byte: u32, + ) -> i32; + pub fn sceAtracSetHalfwayBufferAndGetID( + puc_buffer_addr: *mut u8, + ui_read_byte: u32, + ui_buffer_byte: u32, + ) -> i32; + pub fn sceAtracSetSecondBuffer( + atrac_id: i32, + puc_second_buffer_addr: *mut u8, + ui_second_buffer_byte: u32, + ) -> i32; + + pub fn sceCtrlSetSamplingCycle(cycle: i32) -> i32; + pub fn sceCtrlGetSamplingCycle(pcycle: *mut i32) -> i32; + pub fn sceCtrlSetSamplingMode(mode: CtrlMode) -> i32; + pub fn sceCtrlGetSamplingMode(pmode: *mut i32) -> i32; + pub fn sceCtrlPeekBufferPositive(pad_data: *mut SceCtrlData, count: i32) -> i32; + pub fn sceCtrlPeekBufferNegative(pad_data: *mut SceCtrlData, count: i32) -> i32; + pub fn sceCtrlReadBufferPositive(pad_data: *mut SceCtrlData, count: i32) -> i32; + pub fn sceCtrlReadBufferNegative(pad_data: *mut SceCtrlData, count: i32) -> i32; + pub fn sceCtrlPeekLatch(latch_data: *mut SceCtrlLatch) -> i32; + pub fn sceCtrlReadLatch(latch_data: *mut SceCtrlLatch) -> i32; + pub fn sceCtrlSetIdleCancelThreshold(idlereset: i32, idleback: i32) -> i32; + pub fn sceCtrlGetIdleCancelThreshold(idlereset: *mut i32, idleback: *mut i32) -> i32; + + pub fn sceDisplaySetMode(mode: DisplayMode, width: usize, height: usize) -> u32; + pub fn sceDisplayGetMode(pmode: *mut i32, pwidth: *mut i32, pheight: *mut i32) -> i32; + pub fn sceDisplaySetFrameBuf( + top_addr: *const u8, + buffer_width: usize, + pixel_format: DisplayPixelFormat, + sync: DisplaySetBufSync, + ) -> u32; + pub fn sceDisplayGetFrameBuf( + top_addr: *mut *mut c_void, + buffer_width: *mut usize, + pixel_format: *mut DisplayPixelFormat, + sync: DisplaySetBufSync, + ) -> i32; + pub fn sceDisplayGetVcount() -> u32; + pub fn sceDisplayWaitVblank() -> i32; + pub fn sceDisplayWaitVblankCB() -> i32; + pub fn sceDisplayWaitVblankStart() -> i32; + pub fn sceDisplayWaitVblankStartCB() -> i32; + pub fn sceDisplayGetAccumulatedHcount() -> i32; + pub fn sceDisplayGetCurrentHcount() -> i32; + pub fn sceDisplayGetFramePerSec() -> f32; + pub fn sceDisplayIsForeground() -> i32; + pub fn sceDisplayIsVblank() -> i32; + + pub fn sceGeEdramGetSize() -> u32; + pub fn sceGeEdramGetAddr() -> *mut u8; + pub fn sceGeEdramSetAddrTranslation(width: i32) -> i32; + pub fn sceGeGetCmd(cmd: i32) -> u32; + pub fn sceGeGetMtx(type_: GeMatrixType, matrix: *mut c_void) -> i32; + pub fn sceGeGetStack(stack_id: i32, stack: *mut GeStack) -> i32; + pub fn sceGeSaveContext(context: *mut GeContext) -> i32; + pub fn sceGeRestoreContext(context: *const GeContext) -> i32; + pub fn sceGeListEnQueue( + list: *const c_void, + stall: *mut c_void, + cbid: i32, + arg: *mut GeListArgs, + ) -> i32; + pub fn sceGeListEnQueueHead( + list: *const c_void, + stall: *mut c_void, + cbid: i32, + arg: *mut GeListArgs, + ) -> i32; + pub fn sceGeListDeQueue(qid: i32) -> i32; + pub fn sceGeListUpdateStallAddr(qid: i32, stall: *mut c_void) -> i32; + pub fn sceGeListSync(qid: i32, sync_type: i32) -> GeListState; + pub fn sceGeDrawSync(sync_type: i32) -> GeListState; + pub fn sceGeBreak(mode: i32, p_param: *mut GeBreakParam) -> i32; + pub fn sceGeContinue() -> i32; + pub fn sceGeSetCallback(cb: *mut GeCallbackData) -> i32; + pub fn sceGeUnsetCallback(cbid: i32) -> i32; + + pub fn sceKernelExitGame(); + pub fn sceKernelRegisterExitCallback(id: SceUid) -> i32; + pub fn sceKernelLoadExec(file: *const u8, param: *mut SceKernelLoadExecParam) -> i32; + + pub fn sceKernelAllocPartitionMemory( + partition: SceSysMemPartitionId, + name: *const u8, + type_: SceSysMemBlockTypes, + size: u32, + addr: *mut c_void, + ) -> SceUid; + pub fn sceKernelGetBlockHeadAddr(blockid: SceUid) -> *mut c_void; + pub fn sceKernelFreePartitionMemory(blockid: SceUid) -> i32; + pub fn sceKernelTotalFreeMemSize() -> usize; + pub fn sceKernelMaxFreeMemSize() -> usize; + pub fn sceKernelDevkitVersion() -> u32; + pub fn sceKernelSetCompiledSdkVersion(version: u32) -> i32; + pub fn sceKernelGetCompiledSdkVersion() -> u32; + + pub fn sceKernelLibcTime(t: *mut i32) -> i32; + pub fn sceKernelLibcClock() -> u32; + pub fn sceKernelLibcGettimeofday(tp: *mut timeval, tzp: *mut timezone) -> i32; + pub fn sceKernelDcacheWritebackAll(); + pub fn sceKernelDcacheWritebackInvalidateAll(); + pub fn sceKernelDcacheWritebackRange(p: *const c_void, size: u32); + pub fn sceKernelDcacheWritebackInvalidateRange(p: *const c_void, size: u32); + pub fn sceKernelDcacheInvalidateRange(p: *const c_void, size: u32); + pub fn sceKernelIcacheInvalidateAll(); + pub fn sceKernelIcacheInvalidateRange(p: *const c_void, size: u32); + pub fn sceKernelUtilsMt19937Init(ctx: *mut SceKernelUtilsMt19937Context, seed: u32) -> i32; + pub fn sceKernelUtilsMt19937UInt(ctx: *mut SceKernelUtilsMt19937Context) -> u32; + pub fn sceKernelUtilsMd5Digest(data: *mut u8, size: u32, digest: *mut u8) -> i32; + pub fn sceKernelUtilsMd5BlockInit(ctx: *mut SceKernelUtilsMd5Context) -> i32; + pub fn sceKernelUtilsMd5BlockUpdate( + ctx: *mut SceKernelUtilsMd5Context, + data: *mut u8, + size: u32, + ) -> i32; + pub fn sceKernelUtilsMd5BlockResult(ctx: *mut SceKernelUtilsMd5Context, digest: *mut u8) + -> i32; + pub fn sceKernelUtilsSha1Digest(data: *mut u8, size: u32, digest: *mut u8) -> i32; + pub fn sceKernelUtilsSha1BlockInit(ctx: *mut SceKernelUtilsSha1Context) -> i32; + pub fn sceKernelUtilsSha1BlockUpdate( + ctx: *mut SceKernelUtilsSha1Context, + data: *mut u8, + size: u32, + ) -> i32; + pub fn sceKernelUtilsSha1BlockResult( + ctx: *mut SceKernelUtilsSha1Context, + digest: *mut u8, + ) -> i32; + + pub fn sceKernelRegisterSubIntrHandler( + int_no: i32, + no: i32, + handler: *mut c_void, + arg: *mut c_void, + ) -> i32; + pub fn sceKernelReleaseSubIntrHandler(int_no: i32, no: i32) -> i32; + pub fn sceKernelEnableSubIntr(int_no: i32, no: i32) -> i32; + pub fn sceKernelDisableSubIntr(int_no: i32, no: i32) -> i32; + pub fn QueryIntrHandlerInfo( + intr_code: SceUid, + sub_intr_code: SceUid, + data: *mut IntrHandlerOptionParam, + ) -> i32; + + pub fn sceKernelCpuSuspendIntr() -> u32; + pub fn sceKernelCpuResumeIntr(flags: u32); + pub fn sceKernelCpuResumeIntrWithSync(flags: u32); + pub fn sceKernelIsCpuIntrSuspended(flags: u32) -> i32; + pub fn sceKernelIsCpuIntrEnable() -> i32; + + pub fn sceKernelLoadModule( + path: *const u8, + flags: i32, + option: *mut SceKernelLMOption, + ) -> SceUid; + pub fn sceKernelLoadModuleMs( + path: *const u8, + flags: i32, + option: *mut SceKernelLMOption, + ) -> SceUid; + pub fn sceKernelLoadModuleByID( + fid: SceUid, + flags: i32, + option: *mut SceKernelLMOption, + ) -> SceUid; + pub fn sceKernelLoadModuleBufferUsbWlan( + buf_size: usize, + buf: *mut c_void, + flags: i32, + option: *mut SceKernelLMOption, + ) -> SceUid; + pub fn sceKernelStartModule( + mod_id: SceUid, + arg_size: usize, + argp: *mut c_void, + status: *mut i32, + option: *mut SceKernelSMOption, + ) -> i32; + pub fn sceKernelStopModule( + mod_id: SceUid, + arg_size: usize, + argp: *mut c_void, + status: *mut i32, + option: *mut SceKernelSMOption, + ) -> i32; + pub fn sceKernelUnloadModule(mod_id: SceUid) -> i32; + pub fn sceKernelSelfStopUnloadModule(unknown: i32, arg_size: usize, argp: *mut c_void) -> i32; + pub fn sceKernelStopUnloadSelfModule( + arg_size: usize, + argp: *mut c_void, + status: *mut i32, + option: *mut SceKernelSMOption, + ) -> i32; + pub fn sceKernelQueryModuleInfo(mod_id: SceUid, info: *mut SceKernelModuleInfo) -> i32; + pub fn sceKernelGetModuleIdList( + read_buf: *mut SceUid, + read_buf_size: i32, + id_count: *mut i32, + ) -> i32; + + pub fn sceKernelVolatileMemLock(unk: i32, ptr: *mut *mut c_void, size: *mut i32) -> i32; + pub fn sceKernelVolatileMemTryLock(unk: i32, ptr: *mut *mut c_void, size: *mut i32) -> i32; + pub fn sceKernelVolatileMemUnlock(unk: i32) -> i32; + + pub fn sceKernelStdin() -> SceUid; + pub fn sceKernelStdout() -> SceUid; + pub fn sceKernelStderr() -> SceUid; + + pub fn sceKernelGetThreadmanIdType(uid: SceUid) -> SceKernelIdListType; + pub fn sceKernelCreateThread( + name: *const u8, + entry: SceKernelThreadEntry, + init_priority: i32, + stack_size: i32, + attr: i32, + option: *mut SceKernelThreadOptParam, + ) -> SceUid; + pub fn sceKernelDeleteThread(thid: SceUid) -> i32; + pub fn sceKernelStartThread(id: SceUid, arg_len: usize, arg_p: *mut c_void) -> i32; + pub fn sceKernelExitThread(status: i32) -> i32; + pub fn sceKernelExitDeleteThread(status: i32) -> i32; + pub fn sceKernelTerminateThread(thid: SceUid) -> i32; + pub fn sceKernelTerminateDeleteThread(thid: SceUid) -> i32; + pub fn sceKernelSuspendDispatchThread() -> i32; + pub fn sceKernelResumeDispatchThread(state: i32) -> i32; + pub fn sceKernelSleepThread() -> i32; + pub fn sceKernelSleepThreadCB() -> i32; + pub fn sceKernelWakeupThread(thid: SceUid) -> i32; + pub fn sceKernelCancelWakeupThread(thid: SceUid) -> i32; + pub fn sceKernelSuspendThread(thid: SceUid) -> i32; + pub fn sceKernelResumeThread(thid: SceUid) -> i32; + pub fn sceKernelWaitThreadEnd(thid: SceUid, timeout: *mut u32) -> i32; + pub fn sceKernelWaitThreadEndCB(thid: SceUid, timeout: *mut u32) -> i32; + pub fn sceKernelDelayThread(delay: u32) -> i32; + pub fn sceKernelDelayThreadCB(delay: u32) -> i32; + pub fn sceKernelDelaySysClockThread(delay: *mut SceKernelSysClock) -> i32; + pub fn sceKernelDelaySysClockThreadCB(delay: *mut SceKernelSysClock) -> i32; + pub fn sceKernelChangeCurrentThreadAttr(unknown: i32, attr: i32) -> i32; + pub fn sceKernelChangeThreadPriority(thid: SceUid, priority: i32) -> i32; + pub fn sceKernelRotateThreadReadyQueue(priority: i32) -> i32; + pub fn sceKernelReleaseWaitThread(thid: SceUid) -> i32; + pub fn sceKernelGetThreadId() -> i32; + pub fn sceKernelGetThreadCurrentPriority() -> i32; + pub fn sceKernelGetThreadExitStatus(thid: SceUid) -> i32; + pub fn sceKernelCheckThreadStack() -> i32; + pub fn sceKernelGetThreadStackFreeSize(thid: SceUid) -> i32; + pub fn sceKernelReferThreadStatus(thid: SceUid, info: *mut SceKernelThreadInfo) -> i32; + pub fn sceKernelReferThreadRunStatus( + thid: SceUid, + status: *mut SceKernelThreadRunStatus, + ) -> i32; + pub fn sceKernelCreateSema( + name: *const u8, + attr: u32, + init_val: i32, + max_val: i32, + option: *mut SceKernelSemaOptParam, + ) -> SceUid; + pub fn sceKernelDeleteSema(sema_id: SceUid) -> i32; + pub fn sceKernelSignalSema(sema_id: SceUid, signal: i32) -> i32; + pub fn sceKernelWaitSema(sema_id: SceUid, signal: i32, timeout: *mut u32) -> i32; + pub fn sceKernelWaitSemaCB(sema_id: SceUid, signal: i32, timeout: *mut u32) -> i32; + pub fn sceKernelPollSema(sema_id: SceUid, signal: i32) -> i32; + pub fn sceKernelReferSemaStatus(sema_id: SceUid, info: *mut SceKernelSemaInfo) -> i32; + pub fn sceKernelCreateEventFlag( + name: *const u8, + attr: i32, + bits: i32, + opt: *mut SceKernelEventFlagOptParam, + ) -> SceUid; + pub fn sceKernelSetEventFlag(ev_id: SceUid, bits: u32) -> i32; + pub fn sceKernelClearEventFlag(ev_id: SceUid, bits: u32) -> i32; + pub fn sceKernelPollEventFlag(ev_id: SceUid, bits: u32, wait: i32, out_bits: *mut u32) -> i32; + pub fn sceKernelWaitEventFlag( + ev_id: SceUid, + bits: u32, + wait: i32, + out_bits: *mut u32, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelWaitEventFlagCB( + ev_id: SceUid, + bits: u32, + wait: i32, + out_bits: *mut u32, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelDeleteEventFlag(ev_id: SceUid) -> i32; + pub fn sceKernelReferEventFlagStatus(event: SceUid, status: *mut SceKernelEventFlagInfo) + -> i32; + pub fn sceKernelCreateMbx( + name: *const u8, + attr: u32, + option: *mut SceKernelMbxOptParam, + ) -> SceUid; + pub fn sceKernelDeleteMbx(mbx_id: SceUid) -> i32; + pub fn sceKernelSendMbx(mbx_id: SceUid, message: *mut c_void) -> i32; + pub fn sceKernelReceiveMbx(mbx_id: SceUid, message: *mut *mut c_void, timeout: *mut u32) + -> i32; + pub fn sceKernelReceiveMbxCB( + mbx_id: SceUid, + message: *mut *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelPollMbx(mbx_id: SceUid, pmessage: *mut *mut c_void) -> i32; + pub fn sceKernelCancelReceiveMbx(mbx_id: SceUid, num: *mut i32) -> i32; + pub fn sceKernelReferMbxStatus(mbx_id: SceUid, info: *mut SceKernelMbxInfo) -> i32; + pub fn sceKernelSetAlarm( + clock: u32, + handler: SceKernelAlarmHandler, + common: *mut c_void, + ) -> SceUid; + pub fn sceKernelSetSysClockAlarm( + clock: *mut SceKernelSysClock, + handler: *mut SceKernelAlarmHandler, + common: *mut c_void, + ) -> SceUid; + pub fn sceKernelCancelAlarm(alarm_id: SceUid) -> i32; + pub fn sceKernelReferAlarmStatus(alarm_id: SceUid, info: *mut SceKernelAlarmInfo) -> i32; + pub fn sceKernelCreateCallback( + name: *const u8, + func: SceKernelCallbackFunction, + arg: *mut c_void, + ) -> SceUid; + pub fn sceKernelReferCallbackStatus(cb: SceUid, status: *mut SceKernelCallbackInfo) -> i32; + pub fn sceKernelDeleteCallback(cb: SceUid) -> i32; + pub fn sceKernelNotifyCallback(cb: SceUid, arg2: i32) -> i32; + pub fn sceKernelCancelCallback(cb: SceUid) -> i32; + pub fn sceKernelGetCallbackCount(cb: SceUid) -> i32; + pub fn sceKernelCheckCallback() -> i32; + pub fn sceKernelGetThreadmanIdList( + type_: SceKernelIdListType, + read_buf: *mut SceUid, + read_buf_size: i32, + id_count: *mut i32, + ) -> i32; + pub fn sceKernelReferSystemStatus(status: *mut SceKernelSystemStatus) -> i32; + pub fn sceKernelCreateMsgPipe( + name: *const u8, + part: i32, + attr: i32, + unk1: *mut c_void, + opt: *mut c_void, + ) -> SceUid; + pub fn sceKernelDeleteMsgPipe(uid: SceUid) -> i32; + pub fn sceKernelSendMsgPipe( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelSendMsgPipeCB( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelTrySendMsgPipe( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + ) -> i32; + pub fn sceKernelReceiveMsgPipe( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelReceiveMsgPipeCB( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelTryReceiveMsgPipe( + uid: SceUid, + message: *mut c_void, + size: u32, + unk1: i32, + unk2: *mut c_void, + ) -> i32; + pub fn sceKernelCancelMsgPipe(uid: SceUid, send: *mut i32, recv: *mut i32) -> i32; + pub fn sceKernelReferMsgPipeStatus(uid: SceUid, info: *mut SceKernelMppInfo) -> i32; + pub fn sceKernelCreateVpl( + name: *const u8, + part: i32, + attr: i32, + size: u32, + opt: *mut SceKernelVplOptParam, + ) -> SceUid; + pub fn sceKernelDeleteVpl(uid: SceUid) -> i32; + pub fn sceKernelAllocateVpl( + uid: SceUid, + size: u32, + data: *mut *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelAllocateVplCB( + uid: SceUid, + size: u32, + data: *mut *mut c_void, + timeout: *mut u32, + ) -> i32; + pub fn sceKernelTryAllocateVpl(uid: SceUid, size: u32, data: *mut *mut c_void) -> i32; + pub fn sceKernelFreeVpl(uid: SceUid, data: *mut c_void) -> i32; + pub fn sceKernelCancelVpl(uid: SceUid, num: *mut i32) -> i32; + pub fn sceKernelReferVplStatus(uid: SceUid, info: *mut SceKernelVplInfo) -> i32; + pub fn sceKernelCreateFpl( + name: *const u8, + part: i32, + attr: i32, + size: u32, + blocks: u32, + opt: *mut SceKernelFplOptParam, + ) -> i32; + pub fn sceKernelDeleteFpl(uid: SceUid) -> i32; + pub fn sceKernelAllocateFpl(uid: SceUid, data: *mut *mut c_void, timeout: *mut u32) -> i32; + pub fn sceKernelAllocateFplCB(uid: SceUid, data: *mut *mut c_void, timeout: *mut u32) -> i32; + pub fn sceKernelTryAllocateFpl(uid: SceUid, data: *mut *mut c_void) -> i32; + pub fn sceKernelFreeFpl(uid: SceUid, data: *mut c_void) -> i32; + pub fn sceKernelCancelFpl(uid: SceUid, pnum: *mut i32) -> i32; + pub fn sceKernelReferFplStatus(uid: SceUid, info: *mut SceKernelFplInfo) -> i32; + pub fn sceKernelUSec2SysClock(usec: u32, clock: *mut SceKernelSysClock) -> i32; + pub fn sceKernelUSec2SysClockWide(usec: u32) -> i64; + pub fn sceKernelSysClock2USec( + clock: *mut SceKernelSysClock, + low: *mut u32, + high: *mut u32, + ) -> i32; + pub fn sceKernelSysClock2USecWide(clock: i64, low: *mut u32, high: *mut u32) -> i32; + pub fn sceKernelGetSystemTime(time: *mut SceKernelSysClock) -> i32; + pub fn sceKernelGetSystemTimeWide() -> i64; + pub fn sceKernelGetSystemTimeLow() -> u32; + pub fn sceKernelCreateVTimer(name: *const u8, opt: *mut SceKernelVTimerOptParam) -> SceUid; + pub fn sceKernelDeleteVTimer(uid: SceUid) -> i32; + pub fn sceKernelGetVTimerBase(uid: SceUid, base: *mut SceKernelSysClock) -> i32; + pub fn sceKernelGetVTimerBaseWide(uid: SceUid) -> i64; + pub fn sceKernelGetVTimerTime(uid: SceUid, time: *mut SceKernelSysClock) -> i32; + pub fn sceKernelGetVTimerTimeWide(uid: SceUid) -> i64; + pub fn sceKernelSetVTimerTime(uid: SceUid, time: *mut SceKernelSysClock) -> i32; + pub fn sceKernelSetVTimerTimeWide(uid: SceUid, time: i64) -> i64; + pub fn sceKernelStartVTimer(uid: SceUid) -> i32; + pub fn sceKernelStopVTimer(uid: SceUid) -> i32; + pub fn sceKernelSetVTimerHandler( + uid: SceUid, + time: *mut SceKernelSysClock, + handler: SceKernelVTimerHandler, + common: *mut c_void, + ) -> i32; + pub fn sceKernelSetVTimerHandlerWide( + uid: SceUid, + time: i64, + handler: SceKernelVTimerHandlerWide, + common: *mut c_void, + ) -> i32; + pub fn sceKernelCancelVTimerHandler(uid: SceUid) -> i32; + pub fn sceKernelReferVTimerStatus(uid: SceUid, info: *mut SceKernelVTimerInfo) -> i32; + pub fn sceKernelRegisterThreadEventHandler( + name: *const u8, + thread_id: SceUid, + mask: i32, + handler: SceKernelThreadEventHandler, + common: *mut c_void, + ) -> SceUid; + pub fn sceKernelReleaseThreadEventHandler(uid: SceUid) -> i32; + pub fn sceKernelReferThreadEventHandlerStatus( + uid: SceUid, + info: *mut SceKernelThreadEventHandlerInfo, + ) -> i32; + pub fn sceKernelReferThreadProfiler() -> *mut DebugProfilerRegs; + pub fn sceKernelReferGlobalProfiler() -> *mut DebugProfilerRegs; + + pub fn sceUsbStart(driver_name: *const u8, size: i32, args: *mut c_void) -> i32; + pub fn sceUsbStop(driver_name: *const u8, size: i32, args: *mut c_void) -> i32; + pub fn sceUsbActivate(pid: u32) -> i32; + pub fn sceUsbDeactivate(pid: u32) -> i32; + pub fn sceUsbGetState() -> i32; + pub fn sceUsbGetDrvState(driver_name: *const u8) -> i32; +} + +extern "C" { + pub fn sceUsbCamSetupStill(param: *mut UsbCamSetupStillParam) -> i32; + pub fn sceUsbCamSetupStillEx(param: *mut UsbCamSetupStillExParam) -> i32; + pub fn sceUsbCamStillInputBlocking(buf: *mut u8, size: usize) -> i32; + pub fn sceUsbCamStillInput(buf: *mut u8, size: usize) -> i32; + pub fn sceUsbCamStillWaitInputEnd() -> i32; + pub fn sceUsbCamStillPollInputEnd() -> i32; + pub fn sceUsbCamStillCancelInput() -> i32; + pub fn sceUsbCamStillGetInputLength() -> i32; + pub fn sceUsbCamSetupVideo( + param: *mut UsbCamSetupVideoParam, + work_area: *mut c_void, + work_area_size: i32, + ) -> i32; + pub fn sceUsbCamSetupVideoEx( + param: *mut UsbCamSetupVideoExParam, + work_area: *mut c_void, + work_area_size: i32, + ) -> i32; + pub fn sceUsbCamStartVideo() -> i32; + pub fn sceUsbCamStopVideo() -> i32; + pub fn sceUsbCamReadVideoFrameBlocking(buf: *mut u8, size: usize) -> i32; + pub fn sceUsbCamReadVideoFrame(buf: *mut u8, size: usize) -> i32; + pub fn sceUsbCamWaitReadVideoFrameEnd() -> i32; + pub fn sceUsbCamPollReadVideoFrameEnd() -> i32; + pub fn sceUsbCamGetReadVideoFrameSize() -> i32; + pub fn sceUsbCamSetSaturation(saturation: i32) -> i32; + pub fn sceUsbCamSetBrightness(brightness: i32) -> i32; + pub fn sceUsbCamSetContrast(contrast: i32) -> i32; + pub fn sceUsbCamSetSharpness(sharpness: i32) -> i32; + pub fn sceUsbCamSetImageEffectMode(effect_mode: UsbCamEffectMode) -> i32; + pub fn sceUsbCamSetEvLevel(exposure_level: UsbCamEvLevel) -> i32; + pub fn sceUsbCamSetReverseMode(reverse_flags: i32) -> i32; + pub fn sceUsbCamSetZoom(zoom: i32) -> i32; + pub fn sceUsbCamGetSaturation(saturation: *mut i32) -> i32; + pub fn sceUsbCamGetBrightness(brightness: *mut i32) -> i32; + pub fn sceUsbCamGetContrast(contrast: *mut i32) -> i32; + pub fn sceUsbCamGetSharpness(sharpness: *mut i32) -> i32; + pub fn sceUsbCamGetImageEffectMode(effect_mode: *mut UsbCamEffectMode) -> i32; + pub fn sceUsbCamGetEvLevel(exposure_level: *mut UsbCamEvLevel) -> i32; + pub fn sceUsbCamGetReverseMode(reverse_flags: *mut i32) -> i32; + pub fn sceUsbCamGetZoom(zoom: *mut i32) -> i32; + pub fn sceUsbCamAutoImageReverseSW(on: i32) -> i32; + pub fn sceUsbCamGetAutoImageReverseState() -> i32; + pub fn sceUsbCamGetLensDirection() -> i32; + + pub fn sceUsbstorBootRegisterNotify(event_flag: SceUid) -> i32; + pub fn sceUsbstorBootUnregisterNotify(event_flag: u32) -> i32; + pub fn sceUsbstorBootSetCapacity(size: u32) -> i32; + + pub fn scePowerRegisterCallback(slot: i32, cbid: SceUid) -> i32; + pub fn scePowerUnregisterCallback(slot: i32) -> i32; + pub fn scePowerIsPowerOnline() -> i32; + pub fn scePowerIsBatteryExist() -> i32; + pub fn scePowerIsBatteryCharging() -> i32; + pub fn scePowerGetBatteryChargingStatus() -> i32; + pub fn scePowerIsLowBattery() -> i32; + pub fn scePowerGetBatteryLifePercent() -> i32; + pub fn scePowerGetBatteryLifeTime() -> i32; + pub fn scePowerGetBatteryTemp() -> i32; + pub fn scePowerGetBatteryElec() -> i32; + pub fn scePowerGetBatteryVolt() -> i32; + pub fn scePowerSetCpuClockFrequency(cpufreq: i32) -> i32; + pub fn scePowerSetBusClockFrequency(busfreq: i32) -> i32; + pub fn scePowerGetCpuClockFrequency() -> i32; + pub fn scePowerGetCpuClockFrequencyInt() -> i32; + pub fn scePowerGetCpuClockFrequencyFloat() -> f32; + pub fn scePowerGetBusClockFrequency() -> i32; + pub fn scePowerGetBusClockFrequencyInt() -> i32; + pub fn scePowerGetBusClockFrequencyFloat() -> f32; + pub fn scePowerSetClockFrequency(pllfreq: i32, cpufreq: i32, busfreq: i32) -> i32; + pub fn scePowerLock(unknown: i32) -> i32; + pub fn scePowerUnlock(unknown: i32) -> i32; + pub fn scePowerTick(t: PowerTick) -> i32; + pub fn scePowerGetIdleTimer() -> i32; + pub fn scePowerIdleTimerEnable(unknown: i32) -> i32; + pub fn scePowerIdleTimerDisable(unknown: i32) -> i32; + pub fn scePowerRequestStandby() -> i32; + pub fn scePowerRequestSuspend() -> i32; + + pub fn sceWlanDevIsPowerOn() -> i32; + pub fn sceWlanGetSwitchState() -> i32; + pub fn sceWlanGetEtherAddr(ether_addr: *mut u8) -> i32; + + pub fn sceWlanDevAttach() -> i32; + pub fn sceWlanDevDetach() -> i32; + + pub fn sceRtcGetTickResolution() -> u32; + pub fn sceRtcGetCurrentTick(tick: *mut u64) -> i32; + pub fn sceRtcGetCurrentClock(tm: *mut ScePspDateTime, tz: i32) -> i32; + pub fn sceRtcGetCurrentClockLocalTime(tm: *mut ScePspDateTime) -> i32; + pub fn sceRtcConvertUtcToLocalTime(tick_utc: *const u64, tick_local: *mut u64) -> i32; + pub fn sceRtcConvertLocalTimeToUTC(tick_local: *const u64, tick_utc: *mut u64) -> i32; + pub fn sceRtcIsLeapYear(year: i32) -> i32; + pub fn sceRtcGetDaysInMonth(year: i32, month: i32) -> i32; + pub fn sceRtcGetDayOfWeek(year: i32, month: i32, day: i32) -> i32; + pub fn sceRtcCheckValid(date: *const ScePspDateTime) -> i32; + pub fn sceRtcSetTick(date: *mut ScePspDateTime, tick: *const u64) -> i32; + pub fn sceRtcGetTick(date: *const ScePspDateTime, tick: *mut u64) -> i32; + pub fn sceRtcCompareTick(tick1: *const u64, tick2: *const u64) -> i32; + pub fn sceRtcTickAddTicks(dest_tick: *mut u64, src_tick: *const u64, num_ticks: u64) -> i32; + pub fn sceRtcTickAddMicroseconds(dest_tick: *mut u64, src_tick: *const u64, num_ms: u64) + -> i32; + pub fn sceRtcTickAddSeconds(dest_tick: *mut u64, src_tick: *const u64, num_seconds: u64) + -> i32; + pub fn sceRtcTickAddMinutes(dest_tick: *mut u64, src_tick: *const u64, num_minutes: u64) + -> i32; + pub fn sceRtcTickAddHours(dest_tick: *mut u64, src_tick: *const u64, num_hours: u64) -> i32; + pub fn sceRtcTickAddDays(dest_tick: *mut u64, src_tick: *const u64, num_days: u64) -> i32; + pub fn sceRtcTickAddWeeks(dest_tick: *mut u64, src_tick: *const u64, num_weeks: u64) -> i32; + pub fn sceRtcTickAddMonths(dest_tick: *mut u64, src_tick: *const u64, num_months: u64) -> i32; + pub fn sceRtcTickAddYears(dest_tick: *mut u64, src_tick: *const u64, num_years: u64) -> i32; + pub fn sceRtcSetTime_t(date: *mut ScePspDateTime, time: u32) -> i32; + pub fn sceRtcGetTime_t(date: *const ScePspDateTime, time: *mut u32) -> i32; + pub fn sceRtcSetTime64_t(date: *mut ScePspDateTime, time: u64) -> i32; + pub fn sceRtcGetTime64_t(date: *const ScePspDateTime, time: *mut u64) -> i32; + pub fn sceRtcSetDosTime(date: *mut ScePspDateTime, dos_time: u32) -> i32; + pub fn sceRtcGetDosTime(date: *mut ScePspDateTime, dos_time: u32) -> i32; + pub fn sceRtcSetWin32FileTime(date: *mut ScePspDateTime, time: *mut u64) -> i32; + pub fn sceRtcGetWin32FileTime(date: *mut ScePspDateTime, time: *mut u64) -> i32; + pub fn sceRtcParseDateTime(dest_tick: *mut u64, date_string: *const u8) -> i32; + pub fn sceRtcFormatRFC3339( + psz_date_time: *mut char, + p_utc: *const u64, + time_zone_minutes: i32, + ) -> i32; + pub fn sceRtcFormatRFC3339LocalTime(psz_date_time: *mut char, p_utc: *const u64) -> i32; + pub fn sceRtcParseRFC3339(p_utc: *mut u64, psz_date_time: *const u8) -> i32; + pub fn sceRtcFormatRFC2822( + psz_date_time: *mut char, + p_utc: *const u64, + time_zone_minutes: i32, + ) -> i32; + pub fn sceRtcFormatRFC2822LocalTime(psz_date_time: *mut char, p_utc: *const u64) -> i32; + + pub fn sceIoOpen(file: *const u8, flags: i32, permissions: IoPermissions) -> SceUid; + pub fn sceIoOpenAsync(file: *const u8, flags: i32, permissions: IoPermissions) -> SceUid; + pub fn sceIoClose(fd: SceUid) -> i32; + pub fn sceIoCloseAsync(fd: SceUid) -> i32; + pub fn sceIoRead(fd: SceUid, data: *mut c_void, size: u32) -> i32; + pub fn sceIoReadAsync(fd: SceUid, data: *mut c_void, size: u32) -> i32; + pub fn sceIoWrite(fd: SceUid, data: *const c_void, size: usize) -> i32; + pub fn sceIoWriteAsync(fd: SceUid, data: *const c_void, size: u32) -> i32; + pub fn sceIoLseek(fd: SceUid, offset: i64, whence: IoWhence) -> i64; + pub fn sceIoLseekAsync(fd: SceUid, offset: i64, whence: IoWhence) -> i32; + pub fn sceIoLseek32(fd: SceUid, offset: i32, whence: IoWhence) -> i32; + pub fn sceIoLseek32Async(fd: SceUid, offset: i32, whence: IoWhence) -> i32; + pub fn sceIoRemove(file: *const u8) -> i32; + pub fn sceIoMkdir(dir: *const u8, mode: IoPermissions) -> i32; + pub fn sceIoRmdir(path: *const u8) -> i32; + pub fn sceIoChdir(path: *const u8) -> i32; + pub fn sceIoRename(oldname: *const u8, newname: *const u8) -> i32; + pub fn sceIoDopen(dirname: *const u8) -> SceUid; + pub fn sceIoDread(fd: SceUid, dir: *mut SceIoDirent) -> i32; + pub fn sceIoDclose(fd: SceUid) -> i32; + pub fn sceIoDevctl( + dev: *const u8, + cmd: u32, + indata: *mut c_void, + inlen: i32, + outdata: *mut c_void, + outlen: i32, + ) -> i32; + pub fn sceIoAssign( + dev1: *const u8, + dev2: *const u8, + dev3: *const u8, + mode: IoAssignPerms, + unk1: *mut c_void, + unk2: i32, + ) -> i32; + pub fn sceIoUnassign(dev: *const u8) -> i32; + pub fn sceIoGetstat(file: *const u8, stat: *mut SceIoStat) -> i32; + pub fn sceIoChstat(file: *const u8, stat: *mut SceIoStat, bits: i32) -> i32; + pub fn sceIoIoctl( + fd: SceUid, + cmd: u32, + indata: *mut c_void, + inlen: i32, + outdata: *mut c_void, + outlen: i32, + ) -> i32; + pub fn sceIoIoctlAsync( + fd: SceUid, + cmd: u32, + indata: *mut c_void, + inlen: i32, + outdata: *mut c_void, + outlen: i32, + ) -> i32; + pub fn sceIoSync(device: *const u8, unk: u32) -> i32; + pub fn sceIoWaitAsync(fd: SceUid, res: *mut i64) -> i32; + pub fn sceIoWaitAsyncCB(fd: SceUid, res: *mut i64) -> i32; + pub fn sceIoPollAsync(fd: SceUid, res: *mut i64) -> i32; + pub fn sceIoGetAsyncStat(fd: SceUid, poll: i32, res: *mut i64) -> i32; + pub fn sceIoCancel(fd: SceUid) -> i32; + pub fn sceIoGetDevType(fd: SceUid) -> i32; + pub fn sceIoChangeAsyncPriority(fd: SceUid, pri: i32) -> i32; + pub fn sceIoSetAsyncCallback(fd: SceUid, cb: SceUid, argp: *mut c_void) -> i32; + + pub fn sceJpegInitMJpeg() -> i32; + pub fn sceJpegFinishMJpeg() -> i32; + pub fn sceJpegCreateMJpeg(width: i32, height: i32) -> i32; + pub fn sceJpegDeleteMJpeg() -> i32; + pub fn sceJpegDecodeMJpeg(jpeg_buf: *mut u8, size: usize, rgba: *mut c_void, unk: u32) -> i32; + + pub fn sceUmdCheckMedium() -> i32; + pub fn sceUmdGetDiscInfo(info: *mut UmdInfo) -> i32; + pub fn sceUmdActivate(unit: i32, drive: *const u8) -> i32; + pub fn sceUmdDeactivate(unit: i32, drive: *const u8) -> i32; + pub fn sceUmdWaitDriveStat(state: i32) -> i32; + pub fn sceUmdWaitDriveStatWithTimer(state: i32, timeout: u32) -> i32; + pub fn sceUmdWaitDriveStatCB(state: i32, timeout: u32) -> i32; + pub fn sceUmdCancelWaitDriveStat() -> i32; + pub fn sceUmdGetDriveStat() -> i32; + pub fn sceUmdGetErrorStat() -> i32; + pub fn sceUmdRegisterUMDCallBack(cbid: i32) -> i32; + pub fn sceUmdUnRegisterUMDCallBack(cbid: i32) -> i32; + pub fn sceUmdReplacePermit() -> i32; + pub fn sceUmdReplaceProhibit() -> i32; + + pub fn sceMpegInit() -> i32; + pub fn sceMpegFinish(); + pub fn sceMpegRingbufferQueryMemSize(packets: i32) -> i32; + pub fn sceMpegRingbufferConstruct( + ringbuffer: *mut SceMpegRingbuffer, + packets: i32, + data: *mut c_void, + size: i32, + callback: SceMpegRingbufferCb, + cb_param: *mut c_void, + ) -> i32; + pub fn sceMpegRingbufferDestruct(ringbuffer: *mut SceMpegRingbuffer); + pub fn sceMpegRingbufferAvailableSize(ringbuffer: *mut SceMpegRingbuffer) -> i32; + pub fn sceMpegRingbufferPut( + ringbuffer: *mut SceMpegRingbuffer, + num_packets: i32, + available: i32, + ) -> i32; + pub fn sceMpegQueryMemSize(unk: i32) -> i32; + pub fn sceMpegCreate( + handle: SceMpeg, + data: *mut c_void, + size: i32, + ringbuffer: *mut SceMpegRingbuffer, + frame_width: i32, + unk1: i32, + unk2: i32, + ) -> i32; + pub fn sceMpegDelete(handle: SceMpeg); + pub fn sceMpegQueryStreamOffset(handle: SceMpeg, buffer: *mut c_void, offset: *mut i32) -> i32; + pub fn sceMpegQueryStreamSize(buffer: *mut c_void, size: *mut i32) -> i32; + pub fn sceMpegRegistStream(handle: SceMpeg, stream_id: i32, unk: i32) -> SceMpegStream; + pub fn sceMpegUnRegistStream(handle: SceMpeg, stream: SceMpegStream); + pub fn sceMpegFlushAllStream(handle: SceMpeg) -> i32; + pub fn sceMpegMallocAvcEsBuf(handle: SceMpeg) -> *mut c_void; + pub fn sceMpegFreeAvcEsBuf(handle: SceMpeg, buf: *mut c_void); + pub fn sceMpegQueryAtracEsSize(handle: SceMpeg, es_size: *mut i32, out_size: *mut i32) -> i32; + pub fn sceMpegInitAu(handle: SceMpeg, es_buffer: *mut c_void, au: *mut SceMpegAu) -> i32; + pub fn sceMpegGetAvcAu( + handle: SceMpeg, + stream: SceMpegStream, + au: *mut SceMpegAu, + unk: *mut i32, + ) -> i32; + pub fn sceMpegAvcDecodeMode(handle: SceMpeg, mode: *mut SceMpegAvcMode) -> i32; + pub fn sceMpegAvcDecode( + handle: SceMpeg, + au: *mut SceMpegAu, + iframe_width: i32, + buffer: *mut c_void, + init: *mut i32, + ) -> i32; + pub fn sceMpegAvcDecodeStop( + handle: SceMpeg, + frame_width: i32, + buffer: *mut c_void, + status: *mut i32, + ) -> i32; + pub fn sceMpegGetAtracAu( + handle: SceMpeg, + stream: SceMpegStream, + au: *mut SceMpegAu, + unk: *mut c_void, + ) -> i32; + pub fn sceMpegAtracDecode( + handle: SceMpeg, + au: *mut SceMpegAu, + buffer: *mut c_void, + init: i32, + ) -> i32; + + pub fn sceMpegBaseYCrCbCopyVme(yuv_buffer: *mut c_void, buffer: *mut i32, type_: i32) -> i32; + pub fn sceMpegBaseCscInit(width: i32) -> i32; + pub fn sceMpegBaseCscVme( + rgb_buffer: *mut c_void, + rgb_buffer2: *mut c_void, + width: i32, + y_cr_cb_buffer: *mut SceMpegYCrCbBuffer, + ) -> i32; + pub fn sceMpegbase_BEA18F91(lli: *mut SceMpegLLI) -> i32; + + pub fn sceHprmPeekCurrentKey(key: *mut i32) -> i32; + pub fn sceHprmPeekLatch(latch: *mut [u32; 4]) -> i32; + pub fn sceHprmReadLatch(latch: *mut [u32; 4]) -> i32; + pub fn sceHprmIsHeadphoneExist() -> i32; + pub fn sceHprmIsRemoteExist() -> i32; + pub fn sceHprmIsMicrophoneExist() -> i32; + + pub fn sceGuDepthBuffer(zbp: *mut c_void, zbw: i32); + pub fn sceGuDispBuffer(width: i32, height: i32, dispbp: *mut c_void, dispbw: i32); + pub fn sceGuDrawBuffer(psm: DisplayPixelFormat, fbp: *mut c_void, fbw: i32); + pub fn sceGuDrawBufferList(psm: DisplayPixelFormat, fbp: *mut c_void, fbw: i32); + pub fn sceGuDisplay(state: bool) -> bool; + pub fn sceGuDepthFunc(function: DepthFunc); + pub fn sceGuDepthMask(mask: i32); + pub fn sceGuDepthOffset(offset: i32); + pub fn sceGuDepthRange(near: i32, far: i32); + pub fn sceGuFog(near: f32, far: f32, color: u32); + pub fn sceGuInit(); + pub fn sceGuTerm(); + pub fn sceGuBreak(mode: i32); + pub fn sceGuContinue(); + pub fn sceGuSetCallback(signal: GuCallbackId, callback: GuCallback) -> GuCallback; + pub fn sceGuSignal(behavior: SignalBehavior, signal: i32); + pub fn sceGuSendCommandf(cmd: GeCommand, argument: f32); + pub fn sceGuSendCommandi(cmd: GeCommand, argument: i32); + pub fn sceGuGetMemory(size: i32) -> *mut c_void; + pub fn sceGuStart(context_type: GuContextType, list: *mut c_void); + pub fn sceGuFinish() -> i32; + pub fn sceGuFinishId(id: u32) -> i32; + pub fn sceGuCallList(list: *const c_void); + pub fn sceGuCallMode(mode: i32); + pub fn sceGuCheckList() -> i32; + pub fn sceGuSendList(mode: GuQueueMode, list: *const c_void, context: *mut GeContext); + pub fn sceGuSwapBuffers() -> *mut c_void; + pub fn sceGuSync(mode: GuSyncMode, behavior: GuSyncBehavior) -> GeListState; + pub fn sceGuDrawArray( + prim: GuPrimitive, + vtype: i32, + count: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGuBeginObject( + vtype: i32, + count: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGuEndObject(); + pub fn sceGuSetStatus(state: GuState, status: i32); + pub fn sceGuGetStatus(state: GuState) -> bool; + pub fn sceGuSetAllStatus(status: i32); + pub fn sceGuGetAllStatus() -> i32; + pub fn sceGuEnable(state: GuState); + pub fn sceGuDisable(state: GuState); + pub fn sceGuLight(light: i32, type_: LightType, components: i32, position: &ScePspFVector3); + pub fn sceGuLightAtt(light: i32, atten0: f32, atten1: f32, atten2: f32); + pub fn sceGuLightColor(light: i32, component: i32, color: u32); + pub fn sceGuLightMode(mode: LightMode); + pub fn sceGuLightSpot(light: i32, direction: &ScePspFVector3, exponent: f32, cutoff: f32); + pub fn sceGuClear(flags: i32); + pub fn sceGuClearColor(color: u32); + pub fn sceGuClearDepth(depth: u32); + pub fn sceGuClearStencil(stencil: u32); + pub fn sceGuPixelMask(mask: u32); + pub fn sceGuColor(color: u32); + pub fn sceGuColorFunc(func: ColorFunc, color: u32, mask: u32); + pub fn sceGuColorMaterial(components: i32); + pub fn sceGuAlphaFunc(func: AlphaFunc, value: i32, mask: i32); + pub fn sceGuAmbient(color: u32); + pub fn sceGuAmbientColor(color: u32); + pub fn sceGuBlendFunc(op: BlendOp, src: BlendSrc, dest: BlendDst, src_fix: u32, dest_fix: u32); + pub fn sceGuMaterial(components: i32, color: u32); + pub fn sceGuModelColor(emissive: u32, ambient: u32, diffuse: u32, specular: u32); + pub fn sceGuStencilFunc(func: StencilFunc, ref_: i32, mask: i32); + pub fn sceGuStencilOp(fail: StencilOperation, zfail: StencilOperation, zpass: StencilOperation); + pub fn sceGuSpecular(power: f32); + pub fn sceGuFrontFace(order: FrontFaceDirection); + pub fn sceGuLogicalOp(op: LogicalOperation); + pub fn sceGuSetDither(matrix: &ScePspIMatrix4); + pub fn sceGuShadeModel(mode: ShadingModel); + pub fn sceGuCopyImage( + psm: DisplayPixelFormat, + sx: i32, + sy: i32, + width: i32, + height: i32, + srcw: i32, + src: *mut c_void, + dx: i32, + dy: i32, + destw: i32, + dest: *mut c_void, + ); + pub fn sceGuTexEnvColor(color: u32); + pub fn sceGuTexFilter(min: TextureFilter, mag: TextureFilter); + pub fn sceGuTexFlush(); + pub fn sceGuTexFunc(tfx: TextureEffect, tcc: TextureColorComponent); + pub fn sceGuTexImage( + mipmap: MipmapLevel, + width: i32, + height: i32, + tbw: i32, + tbp: *const c_void, + ); + pub fn sceGuTexLevelMode(mode: TextureLevelMode, bias: f32); + pub fn sceGuTexMapMode(mode: TextureMapMode, a1: u32, a2: u32); + pub fn sceGuTexMode(tpsm: TexturePixelFormat, maxmips: i32, a2: i32, swizzle: i32); + pub fn sceGuTexOffset(u: f32, v: f32); + pub fn sceGuTexProjMapMode(mode: TextureProjectionMapMode); + pub fn sceGuTexScale(u: f32, v: f32); + pub fn sceGuTexSlope(slope: f32); + pub fn sceGuTexSync(); + pub fn sceGuTexWrap(u: GuTexWrapMode, v: GuTexWrapMode); + pub fn sceGuClutLoad(num_blocks: i32, cbp: *const c_void); + pub fn sceGuClutMode(cpsm: ClutPixelFormat, shift: u32, mask: u32, a3: u32); + pub fn sceGuOffset(x: u32, y: u32); + pub fn sceGuScissor(x: i32, y: i32, w: i32, h: i32); + pub fn sceGuViewport(cx: i32, cy: i32, width: i32, height: i32); + pub fn sceGuDrawBezier( + v_type: i32, + u_count: i32, + v_count: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGuPatchDivide(ulevel: u32, vlevel: u32); + pub fn sceGuPatchFrontFace(a0: u32); + pub fn sceGuPatchPrim(prim: PatchPrimitive); + pub fn sceGuDrawSpline( + v_type: i32, + u_count: i32, + v_count: i32, + u_edge: i32, + v_edge: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGuSetMatrix(type_: MatrixMode, matrix: &ScePspFMatrix4); + pub fn sceGuBoneMatrix(index: u32, matrix: &ScePspFMatrix4); + pub fn sceGuMorphWeight(index: i32, weight: f32); + pub fn sceGuDrawArrayN( + primitive_type: GuPrimitive, + v_type: i32, + count: i32, + a3: i32, + indices: *const c_void, + vertices: *const c_void, + ); + + pub fn sceGumDrawArray( + prim: GuPrimitive, + v_type: i32, + count: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGumDrawArrayN( + prim: GuPrimitive, + v_type: i32, + count: i32, + a3: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGumDrawBezier( + v_type: i32, + u_count: i32, + v_count: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGumDrawSpline( + v_type: i32, + u_count: i32, + v_count: i32, + u_edge: i32, + v_edge: i32, + indices: *const c_void, + vertices: *const c_void, + ); + pub fn sceGumFastInverse(); + pub fn sceGumFullInverse(); + pub fn sceGumLoadIdentity(); + pub fn sceGumLoadMatrix(m: &ScePspFMatrix4); + pub fn sceGumLookAt(eye: &ScePspFVector3, center: &ScePspFVector3, up: &ScePspFVector3); + pub fn sceGumMatrixMode(mode: MatrixMode); + pub fn sceGumMultMatrix(m: &ScePspFMatrix4); + pub fn sceGumOrtho(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32); + pub fn sceGumPerspective(fovy: f32, aspect: f32, near: f32, far: f32); + pub fn sceGumPopMatrix(); + pub fn sceGumPushMatrix(); + pub fn sceGumRotateX(angle: f32); + pub fn sceGumRotateY(angle: f32); + pub fn sceGumRotateZ(angle: f32); + pub fn sceGumRotateXYZ(v: &ScePspFVector3); + pub fn sceGumRotateZYX(v: &ScePspFVector3); + pub fn sceGumScale(v: &ScePspFVector3); + pub fn sceGumStoreMatrix(m: &mut ScePspFMatrix4); + pub fn sceGumTranslate(v: &ScePspFVector3); + pub fn sceGumUpdateMatrix(); + + pub fn sceMp3ReserveMp3Handle(args: *mut SceMp3InitArg) -> i32; + pub fn sceMp3ReleaseMp3Handle(handle: Mp3Handle) -> i32; + pub fn sceMp3InitResource() -> i32; + pub fn sceMp3TermResource() -> i32; + pub fn sceMp3Init(handle: Mp3Handle) -> i32; + pub fn sceMp3Decode(handle: Mp3Handle, dst: *mut *mut i16) -> i32; + pub fn sceMp3GetInfoToAddStreamData( + handle: Mp3Handle, + dst: *mut *mut u8, + to_write: *mut i32, + src_pos: *mut i32, + ) -> i32; + pub fn sceMp3NotifyAddStreamData(handle: Mp3Handle, size: i32) -> i32; + pub fn sceMp3CheckStreamDataNeeded(handle: Mp3Handle) -> i32; + pub fn sceMp3SetLoopNum(handle: Mp3Handle, loop_: i32) -> i32; + pub fn sceMp3GetLoopNum(handle: Mp3Handle) -> i32; + pub fn sceMp3GetSumDecodedSample(handle: Mp3Handle) -> i32; + pub fn sceMp3GetMaxOutputSample(handle: Mp3Handle) -> i32; + pub fn sceMp3GetSamplingRate(handle: Mp3Handle) -> i32; + pub fn sceMp3GetBitRate(handle: Mp3Handle) -> i32; + pub fn sceMp3GetMp3ChannelNum(handle: Mp3Handle) -> i32; + pub fn sceMp3ResetPlayPosition(handle: Mp3Handle) -> i32; + + pub fn sceRegOpenRegistry(reg: *mut Key, mode: i32, handle: *mut RegHandle) -> i32; + pub fn sceRegFlushRegistry(handle: RegHandle) -> i32; + pub fn sceRegCloseRegistry(handle: RegHandle) -> i32; + pub fn sceRegOpenCategory( + handle: RegHandle, + name: *const u8, + mode: i32, + dir_handle: *mut RegHandle, + ) -> i32; + pub fn sceRegRemoveCategory(handle: RegHandle, name: *const u8) -> i32; + pub fn sceRegCloseCategory(dir_handle: RegHandle) -> i32; + pub fn sceRegFlushCategory(dir_handle: RegHandle) -> i32; + pub fn sceRegGetKeyInfo( + dir_handle: RegHandle, + name: *const u8, + key_handle: *mut RegHandle, + type_: *mut KeyType, + size: *mut usize, + ) -> i32; + pub fn sceRegGetKeyInfoByName( + dir_handle: RegHandle, + name: *const u8, + type_: *mut KeyType, + size: *mut usize, + ) -> i32; + pub fn sceRegGetKeyValue( + dir_handle: RegHandle, + key_handle: RegHandle, + buf: *mut c_void, + size: usize, + ) -> i32; + pub fn sceRegGetKeyValueByName( + dir_handle: RegHandle, + name: *const u8, + buf: *mut c_void, + size: usize, + ) -> i32; + pub fn sceRegSetKeyValue( + dir_handle: RegHandle, + name: *const u8, + buf: *const c_void, + size: usize, + ) -> i32; + pub fn sceRegGetKeysNum(dir_handle: RegHandle, num: *mut i32) -> i32; + pub fn sceRegGetKeys(dir_handle: RegHandle, buf: *mut u8, num: i32) -> i32; + pub fn sceRegCreateKey(dir_handle: RegHandle, name: *const u8, type_: i32, size: usize) -> i32; + pub fn sceRegRemoveRegistry(key: *mut Key) -> i32; + + pub fn sceOpenPSIDGetOpenPSID(openpsid: *mut OpenPSID) -> i32; + + pub fn sceUtilityMsgDialogInitStart(params: *mut UtilityMsgDialogParams) -> i32; + pub fn sceUtilityMsgDialogShutdownStart(); + pub fn sceUtilityMsgDialogGetStatus() -> i32; + pub fn sceUtilityMsgDialogUpdate(n: i32); + pub fn sceUtilityMsgDialogAbort() -> i32; + pub fn sceUtilityNetconfInitStart(data: *mut UtilityNetconfData) -> i32; + pub fn sceUtilityNetconfShutdownStart() -> i32; + pub fn sceUtilityNetconfUpdate(unknown: i32) -> i32; + pub fn sceUtilityNetconfGetStatus() -> i32; + pub fn sceUtilityCheckNetParam(id: i32) -> i32; + pub fn sceUtilityGetNetParam(conf: i32, param: NetParam, data: *mut UtilityNetData) -> i32; + pub fn sceUtilitySavedataInitStart(params: *mut SceUtilitySavedataParam) -> i32; + pub fn sceUtilitySavedataGetStatus() -> i32; + pub fn sceUtilitySavedataShutdownStart() -> i32; + pub fn sceUtilitySavedataUpdate(unknown: i32); + pub fn sceUtilityGameSharingInitStart(params: *mut UtilityGameSharingParams) -> i32; + pub fn sceUtilityGameSharingShutdownStart(); + pub fn sceUtilityGameSharingGetStatus() -> i32; + pub fn sceUtilityGameSharingUpdate(n: i32); + pub fn sceUtilityHtmlViewerInitStart(params: *mut UtilityHtmlViewerParam) -> i32; + pub fn sceUtilityHtmlViewerShutdownStart() -> i32; + pub fn sceUtilityHtmlViewerUpdate(n: i32) -> i32; + pub fn sceUtilityHtmlViewerGetStatus() -> i32; + pub fn sceUtilitySetSystemParamInt(id: SystemParamId, value: i32) -> i32; + pub fn sceUtilitySetSystemParamString(id: SystemParamId, str: *const u8) -> i32; + pub fn sceUtilityGetSystemParamInt(id: SystemParamId, value: *mut i32) -> i32; + pub fn sceUtilityGetSystemParamString(id: SystemParamId, str: *mut u8, len: i32) -> i32; + pub fn sceUtilityOskInitStart(params: *mut SceUtilityOskParams) -> i32; + pub fn sceUtilityOskShutdownStart() -> i32; + pub fn sceUtilityOskUpdate(n: i32) -> i32; + pub fn sceUtilityOskGetStatus() -> i32; + pub fn sceUtilityLoadNetModule(module: NetModule) -> i32; + pub fn sceUtilityUnloadNetModule(module: NetModule) -> i32; + pub fn sceUtilityLoadAvModule(module: AvModule) -> i32; + pub fn sceUtilityUnloadAvModule(module: AvModule) -> i32; + pub fn sceUtilityLoadUsbModule(module: UsbModule) -> i32; + pub fn sceUtilityUnloadUsbModule(module: UsbModule) -> i32; + pub fn sceUtilityLoadModule(module: Module) -> i32; + pub fn sceUtilityUnloadModule(module: Module) -> i32; + pub fn sceUtilityCreateNetParam(conf: i32) -> i32; + pub fn sceUtilitySetNetParam(param: NetParam, val: *const c_void) -> i32; + pub fn sceUtilityCopyNetParam(src: i32, dest: i32) -> i32; + pub fn sceUtilityDeleteNetParam(conf: i32) -> i32; + + pub fn sceNetInit( + poolsize: i32, + calloutprio: i32, + calloutstack: i32, + netintrprio: i32, + netintrstack: i32, + ) -> i32; + pub fn sceNetTerm() -> i32; + pub fn sceNetFreeThreadinfo(thid: i32) -> i32; + pub fn sceNetThreadAbort(thid: i32) -> i32; + pub fn sceNetEtherStrton(name: *mut u8, mac: *mut u8); + pub fn sceNetEtherNtostr(mac: *mut u8, name: *mut u8); + pub fn sceNetGetLocalEtherAddr(mac: *mut u8) -> i32; + pub fn sceNetGetMallocStat(stat: *mut SceNetMallocStat) -> i32; + + pub fn sceNetAdhocctlInit( + stacksize: i32, + priority: i32, + adhoc_id: *mut SceNetAdhocctlAdhocId, + ) -> i32; + pub fn sceNetAdhocctlTerm() -> i32; + pub fn sceNetAdhocctlConnect(name: *const u8) -> i32; + pub fn sceNetAdhocctlDisconnect() -> i32; + pub fn sceNetAdhocctlGetState(event: *mut i32) -> i32; + pub fn sceNetAdhocctlCreate(name: *const u8) -> i32; + pub fn sceNetAdhocctlJoin(scaninfo: *mut SceNetAdhocctlScanInfo) -> i32; + pub fn sceNetAdhocctlGetAdhocId(id: *mut SceNetAdhocctlAdhocId) -> i32; + pub fn sceNetAdhocctlCreateEnterGameMode( + name: *const u8, + unknown: i32, + num: i32, + macs: *mut u8, + timeout: u32, + unknown2: i32, + ) -> i32; + pub fn sceNetAdhocctlJoinEnterGameMode( + name: *const u8, + hostmac: *mut u8, + timeout: u32, + unknown: i32, + ) -> i32; + pub fn sceNetAdhocctlGetGameModeInfo(gamemodeinfo: *mut SceNetAdhocctlGameModeInfo) -> i32; + pub fn sceNetAdhocctlExitGameMode() -> i32; + pub fn sceNetAdhocctlGetPeerList(length: *mut i32, buf: *mut c_void) -> i32; + pub fn sceNetAdhocctlGetPeerInfo( + mac: *mut u8, + size: i32, + peerinfo: *mut SceNetAdhocctlPeerInfo, + ) -> i32; + pub fn sceNetAdhocctlScan() -> i32; + pub fn sceNetAdhocctlGetScanInfo(length: *mut i32, buf: *mut c_void) -> i32; + pub fn sceNetAdhocctlAddHandler(handler: SceNetAdhocctlHandler, unknown: *mut c_void) -> i32; + pub fn sceNetAdhocctlDelHandler(id: i32) -> i32; + pub fn sceNetAdhocctlGetNameByAddr(mac: *mut u8, nickname: *mut u8) -> i32; + pub fn sceNetAdhocctlGetAddrByName( + nickname: *mut u8, + length: *mut i32, + buf: *mut c_void, + ) -> i32; + pub fn sceNetAdhocctlGetParameter(params: *mut SceNetAdhocctlParams) -> i32; + + pub fn sceNetAdhocInit() -> i32; + pub fn sceNetAdhocTerm() -> i32; + pub fn sceNetAdhocPdpCreate(mac: *mut u8, port: u16, buf_size: u32, unk1: i32) -> i32; + pub fn sceNetAdhocPdpDelete(id: i32, unk1: i32) -> i32; + pub fn sceNetAdhocPdpSend( + id: i32, + dest_mac_addr: *mut u8, + port: u16, + data: *mut c_void, + len: u32, + timeout: u32, + nonblock: i32, + ) -> i32; + pub fn sceNetAdhocPdpRecv( + id: i32, + src_mac_addr: *mut u8, + port: *mut u16, + data: *mut c_void, + data_length: *mut c_void, + timeout: u32, + nonblock: i32, + ) -> i32; + pub fn sceNetAdhocGetPdpStat(size: *mut i32, stat: *mut SceNetAdhocPdpStat) -> i32; + pub fn sceNetAdhocGameModeCreateMaster(data: *mut c_void, size: i32) -> i32; + pub fn sceNetAdhocGameModeCreateReplica(mac: *mut u8, data: *mut c_void, size: i32) -> i32; + pub fn sceNetAdhocGameModeUpdateMaster() -> i32; + pub fn sceNetAdhocGameModeUpdateReplica(id: i32, unk1: i32) -> i32; + pub fn sceNetAdhocGameModeDeleteMaster() -> i32; + pub fn sceNetAdhocGameModeDeleteReplica(id: i32) -> i32; + pub fn sceNetAdhocPtpOpen( + srcmac: *mut u8, + srcport: u16, + destmac: *mut u8, + destport: u16, + buf_size: u32, + delay: u32, + count: i32, + unk1: i32, + ) -> i32; + pub fn sceNetAdhocPtpConnect(id: i32, timeout: u32, nonblock: i32) -> i32; + pub fn sceNetAdhocPtpListen( + srcmac: *mut u8, + srcport: u16, + buf_size: u32, + delay: u32, + count: i32, + queue: i32, + unk1: i32, + ) -> i32; + pub fn sceNetAdhocPtpAccept( + id: i32, + mac: *mut u8, + port: *mut u16, + timeout: u32, + nonblock: i32, + ) -> i32; + pub fn sceNetAdhocPtpSend( + id: i32, + data: *mut c_void, + data_size: *mut i32, + timeout: u32, + nonblock: i32, + ) -> i32; + pub fn sceNetAdhocPtpRecv( + id: i32, + data: *mut c_void, + data_size: *mut i32, + timeout: u32, + nonblock: i32, + ) -> i32; + pub fn sceNetAdhocPtpFlush(id: i32, timeout: u32, nonblock: i32) -> i32; + pub fn sceNetAdhocPtpClose(id: i32, unk1: i32) -> i32; + pub fn sceNetAdhocGetPtpStat(size: *mut i32, stat: *mut SceNetAdhocPtpStat) -> i32; +} + +extern "C" { + pub fn sceNetAdhocMatchingInit(memsize: i32) -> i32; + pub fn sceNetAdhocMatchingTerm() -> i32; + pub fn sceNetAdhocMatchingCreate( + mode: AdhocMatchingMode, + max_peers: i32, + port: u16, + buf_size: i32, + hello_delay: u32, + ping_delay: u32, + init_count: i32, + msg_delay: u32, + callback: AdhocMatchingCallback, + ) -> i32; + pub fn sceNetAdhocMatchingDelete(matching_id: i32) -> i32; + pub fn sceNetAdhocMatchingStart( + matching_id: i32, + evth_pri: i32, + evth_stack: i32, + inth_pri: i32, + inth_stack: i32, + opt_len: i32, + opt_data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingStop(matching_id: i32) -> i32; + pub fn sceNetAdhocMatchingSelectTarget( + matching_id: i32, + mac: *mut u8, + opt_len: i32, + opt_data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingCancelTarget(matching_id: i32, mac: *mut u8) -> i32; + pub fn sceNetAdhocMatchingCancelTargetWithOpt( + matching_id: i32, + mac: *mut u8, + opt_len: i32, + opt_data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingSendData( + matching_id: i32, + mac: *mut u8, + data_len: i32, + data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingAbortSendData(matching_id: i32, mac: *mut u8) -> i32; + pub fn sceNetAdhocMatchingSetHelloOpt( + matching_id: i32, + opt_len: i32, + opt_data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingGetHelloOpt( + matching_id: i32, + opt_len: *mut i32, + opt_data: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingGetMembers( + matching_id: i32, + length: *mut i32, + buf: *mut c_void, + ) -> i32; + pub fn sceNetAdhocMatchingGetPoolMaxAlloc() -> i32; + pub fn sceNetAdhocMatchingGetPoolStat(poolstat: *mut AdhocPoolStat) -> i32; +} + +extern "C" { + pub fn sceNetApctlInit(stack_size: i32, init_priority: i32) -> i32; + pub fn sceNetApctlTerm() -> i32; + pub fn sceNetApctlGetInfo(code: ApctlInfo, pinfo: *mut SceNetApctlInfo) -> i32; + pub fn sceNetApctlAddHandler(handler: SceNetApctlHandler, parg: *mut c_void) -> i32; + pub fn sceNetApctlDelHandler(handler_id: i32) -> i32; + pub fn sceNetApctlConnect(conn_index: i32) -> i32; + pub fn sceNetApctlDisconnect() -> i32; + pub fn sceNetApctlGetState(pstate: *mut ApctlState) -> i32; + + pub fn sceNetInetInit() -> i32; + pub fn sceNetInetTerm() -> i32; + pub fn sceNetInetAccept(s: i32, addr: *mut sockaddr, addr_len: *mut socklen_t) -> i32; + pub fn sceNetInetBind(s: i32, my_addr: *const sockaddr, addr_len: socklen_t) -> i32; + pub fn sceNetInetConnect(s: i32, serv_addr: *const sockaddr, addr_len: socklen_t) -> i32; + pub fn sceNetInetGetsockopt( + s: i32, + level: i32, + opt_name: i32, + opt_val: *mut c_void, + optl_en: *mut socklen_t, + ) -> i32; + pub fn sceNetInetListen(s: i32, backlog: i32) -> i32; + pub fn sceNetInetRecv(s: i32, buf: *mut c_void, len: usize, flags: i32) -> usize; + pub fn sceNetInetRecvfrom( + s: i32, + buf: *mut c_void, + flags: usize, + arg1: i32, + from: *mut sockaddr, + from_len: *mut socklen_t, + ) -> usize; + pub fn sceNetInetSend(s: i32, buf: *const c_void, len: usize, flags: i32) -> usize; + pub fn sceNetInetSendto( + s: i32, + buf: *const c_void, + len: usize, + flags: i32, + to: *const sockaddr, + to_len: socklen_t, + ) -> usize; + pub fn sceNetInetSetsockopt( + s: i32, + level: i32, + opt_name: i32, + opt_val: *const c_void, + opt_len: socklen_t, + ) -> i32; + pub fn sceNetInetShutdown(s: i32, how: i32) -> i32; + pub fn sceNetInetSocket(domain: i32, type_: i32, protocol: i32) -> i32; + pub fn sceNetInetClose(s: i32) -> i32; + pub fn sceNetInetGetErrno() -> i32; + + pub fn sceSslInit(unknown1: i32) -> i32; + pub fn sceSslEnd() -> i32; + pub fn sceSslGetUsedMemoryMax(memory: *mut u32) -> i32; + pub fn sceSslGetUsedMemoryCurrent(memory: *mut u32) -> i32; + + pub fn sceHttpInit(unknown1: u32) -> i32; + pub fn sceHttpEnd() -> i32; + pub fn sceHttpCreateTemplate(agent: *mut u8, unknown1: i32, unknown2: i32) -> i32; + pub fn sceHttpDeleteTemplate(templateid: i32) -> i32; + pub fn sceHttpCreateConnection( + templateid: i32, + host: *mut u8, + unknown1: *mut u8, + port: u16, + unknown2: i32, + ) -> i32; + pub fn sceHttpCreateConnectionWithURL(templateid: i32, url: *const u8, unknown1: i32) -> i32; + pub fn sceHttpDeleteConnection(connection_id: i32) -> i32; + pub fn sceHttpCreateRequest( + connection_id: i32, + method: HttpMethod, + path: *mut u8, + content_length: u64, + ) -> i32; + pub fn sceHttpCreateRequestWithURL( + connection_id: i32, + method: HttpMethod, + url: *mut u8, + content_length: u64, + ) -> i32; + pub fn sceHttpDeleteRequest(request_id: i32) -> i32; + pub fn sceHttpSendRequest(request_id: i32, data: *mut c_void, data_size: u32) -> i32; + pub fn sceHttpAbortRequest(request_id: i32) -> i32; + pub fn sceHttpReadData(request_id: i32, data: *mut c_void, data_size: u32) -> i32; + pub fn sceHttpGetContentLength(request_id: i32, content_length: *mut u64) -> i32; + pub fn sceHttpGetStatusCode(request_id: i32, status_code: *mut i32) -> i32; + pub fn sceHttpSetResolveTimeOut(id: i32, timeout: u32) -> i32; + pub fn sceHttpSetResolveRetry(id: i32, count: i32) -> i32; + pub fn sceHttpSetConnectTimeOut(id: i32, timeout: u32) -> i32; + pub fn sceHttpSetSendTimeOut(id: i32, timeout: u32) -> i32; + pub fn sceHttpSetRecvTimeOut(id: i32, timeout: u32) -> i32; + pub fn sceHttpEnableKeepAlive(id: i32) -> i32; + pub fn sceHttpDisableKeepAlive(id: i32) -> i32; + pub fn sceHttpEnableRedirect(id: i32) -> i32; + pub fn sceHttpDisableRedirect(id: i32) -> i32; + pub fn sceHttpEnableCookie(id: i32) -> i32; + pub fn sceHttpDisableCookie(id: i32) -> i32; + pub fn sceHttpSaveSystemCookie() -> i32; + pub fn sceHttpLoadSystemCookie() -> i32; + pub fn sceHttpAddExtraHeader(id: i32, name: *mut u8, value: *mut u8, unknown1: i32) -> i32; + pub fn sceHttpDeleteHeader(id: i32, name: *const u8) -> i32; + pub fn sceHttpsInit(unknown1: i32, unknown2: i32, unknown3: i32, unknown4: i32) -> i32; + pub fn sceHttpsEnd() -> i32; + pub fn sceHttpsLoadDefaultCert(unknown1: i32, unknown2: i32) -> i32; + pub fn sceHttpDisableAuth(id: i32) -> i32; + pub fn sceHttpDisableCache(id: i32) -> i32; + pub fn sceHttpEnableAuth(id: i32) -> i32; + pub fn sceHttpEnableCache(id: i32) -> i32; + pub fn sceHttpEndCache() -> i32; + pub fn sceHttpGetAllHeader(request: i32, header: *mut *mut u8, header_size: *mut u32) -> i32; + pub fn sceHttpGetNetworkErrno(request: i32, err_num: *mut i32) -> i32; + pub fn sceHttpGetProxy( + id: i32, + activate_flag: *mut i32, + mode: *mut i32, + proxy_host: *mut u8, + len: usize, + proxy_port: *mut u16, + ) -> i32; + pub fn sceHttpInitCache(max_size: usize) -> i32; + pub fn sceHttpSetAuthInfoCB(id: i32, cbfunc: HttpPasswordCB) -> i32; + pub fn sceHttpSetProxy( + id: i32, + activate_flag: i32, + mode: i32, + new_proxy_host: *const u8, + new_proxy_port: u16, + ) -> i32; + pub fn sceHttpSetResHeaderMaxSize(id: i32, header_size: u32) -> i32; + pub fn sceHttpSetMallocFunction( + malloc_func: HttpMallocFunction, + free_func: HttpFreeFunction, + realloc_func: HttpReallocFunction, + ) -> i32; + + pub fn sceNetResolverInit() -> i32; + pub fn sceNetResolverCreate(rid: *mut i32, buf: *mut c_void, buf_length: u32) -> i32; + pub fn sceNetResolverDelete(rid: i32) -> i32; + pub fn sceNetResolverStartNtoA( + rid: i32, + hostname: *const u8, + addr: *mut in_addr, + timeout: u32, + retry: i32, + ) -> i32; + pub fn sceNetResolverStartAtoN( + rid: i32, + addr: *const in_addr, + hostname: *mut u8, + hostname_len: u32, + timeout: u32, + retry: i32, + ) -> i32; + pub fn sceNetResolverStop(rid: i32) -> i32; + pub fn sceNetResolverTerm() -> i32; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/sgx.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/sgx.rs new file mode 100644 index 0000000..7da6269 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/sgx.rs @@ -0,0 +1,47 @@ +//! SGX C types definition + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/solid/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/aarch64.rs new file mode 100644 index 0000000..ceabea3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/aarch64.rs @@ -0,0 +1,4 @@ +pub type c_char = i8; +pub type wchar_t = u32; +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/solid/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/arm.rs new file mode 100644 index 0000000..04cc154 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/arm.rs @@ -0,0 +1,4 @@ +pub type c_char = i8; +pub type wchar_t = u32; +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/solid/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/mod.rs new file mode 100644 index 0000000..f0f2ae8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/solid/mod.rs @@ -0,0 +1,904 @@ +//! Interface to the [SOLID] C library +//! +//! [SOLID]: https://solid.kmckk.com/ + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type uintptr_t = usize; +pub type intptr_t = isize; +pub type ptrdiff_t = isize; +pub type size_t = ::uintptr_t; +pub type ssize_t = ::intptr_t; + +pub type clock_t = c_uint; +pub type time_t = i64; +pub type clockid_t = c_int; +pub type timer_t = c_int; +pub type suseconds_t = c_int; +pub type useconds_t = c_uint; + +pub type sighandler_t = size_t; + +// sys/ansi.h +pub type __caddr_t = *mut c_char; +pub type __gid_t = u32; +pub type __in_addr_t = u32; +pub type __in_port_t = u16; +pub type __mode_t = u32; +pub type __off_t = i64; +pub type __pid_t = i32; +pub type __sa_family_t = u8; +pub type __socklen_t = c_uint; +pub type __uid_t = u32; +pub type __fsblkcnt_t = u64; +pub type __fsfilcnt_t = u64; + +// locale.h +pub type locale_t = usize; + +// nl_types.h +pub type nl_item = c_long; + +// sys/types.h +pub type __va_list = *mut c_char; +pub type u_int8_t = u8; +pub type u_int16_t = u16; +pub type u_int32_t = u32; +pub type u_int64_t = u64; +pub type u_char = c_uchar; +pub type u_short = c_ushort; +pub type u_int = c_uint; +pub type u_long = c_ulong; +pub type unchar = c_uchar; +pub type ushort = c_ushort; +pub type uint = c_uint; +pub type ulong = c_ulong; +pub type u_quad_t = u64; +pub type quad_t = i64; +pub type qaddr_t = *mut quad_t; +pub type longlong_t = i64; +pub type u_longlong_t = u64; +pub type blkcnt_t = i64; +pub type blksize_t = i32; +pub type fsblkcnt_t = __fsblkcnt_t; +pub type fsfilcnt_t = __fsfilcnt_t; +pub type caddr_t = __caddr_t; +pub type daddr_t = i64; +pub type dev_t = u64; +pub type fixpt_t = u32; +pub type gid_t = __gid_t; +pub type idtype_t = c_int; +pub type id_t = u32; +pub type ino_t = u64; +pub type key_t = c_long; +pub type mode_t = __mode_t; +pub type nlink_t = u32; +pub type off_t = __off_t; +pub type pid_t = __pid_t; +pub type lwpid_t = i32; +pub type rlim_t = u64; +pub type segsz_t = i32; +pub type swblk_t = i32; +pub type mqd_t = c_int; +pub type cpuid_t = c_ulong; +pub type psetid_t = c_int; + +s! { + // stat.h + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: c_short, + pub st_nlink: c_short, + pub st_uid: c_short, + pub st_gid: c_short, + pub st_rdev: dev_t, + pub st_size: off_t, + pub st_atime: time_t, + pub st_mtime: time_t, + pub st_ctime: time_t, + pub st_blksize: blksize_t, + } + + // time.h + pub struct tm { + pub tm_sec: c_int, + pub tm_min: c_int, + pub tm_hour: c_int, + pub tm_mday: c_int, + pub tm_mon: c_int, + pub tm_year: c_int, + pub tm_wday: c_int, + pub tm_yday: c_int, + pub tm_isdst: c_int, + pub tm_gmtoff: c_long, + pub tm_zone: *mut c_char, + } + + // stdlib.h + pub struct qdiv_t { + pub quot: quad_t, + pub rem: quad_t, + } + pub struct lldiv_t { + pub quot: c_longlong, + pub rem: c_longlong, + } + pub struct div_t { + pub quot: c_int, + pub rem: c_int, + } + pub struct ldiv_t { + pub quot: c_long, + pub rem: c_long, + } + + // locale.h + pub struct lconv { + pub decimal_point: *mut c_char, + pub thousands_sep: *mut c_char, + pub grouping: *mut c_char, + pub int_curr_symbol: *mut c_char, + pub currency_symbol: *mut c_char, + pub mon_decimal_point: *mut c_char, + pub mon_thousands_sep: *mut c_char, + pub mon_grouping: *mut c_char, + pub positive_sign: *mut c_char, + pub negative_sign: *mut c_char, + pub int_frac_digits: c_char, + pub frac_digits: c_char, + pub p_cs_precedes: c_char, + pub p_sep_by_space: c_char, + pub n_cs_precedes: c_char, + pub n_sep_by_space: c_char, + pub p_sign_posn: c_char, + pub n_sign_posn: c_char, + pub int_p_cs_precedes: c_char, + pub int_n_cs_precedes: c_char, + pub int_p_sep_by_space: c_char, + pub int_n_sep_by_space: c_char, + pub int_p_sign_posn: c_char, + pub int_n_sign_posn: c_char, + } + + pub struct iovec { + pub iov_base: *mut c_void, + pub iov_len: size_t, + } + + pub struct timeval { + pub tv_sec: c_long, + pub tv_usec: c_long, + } +} + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +pub const EXIT_FAILURE: c_int = 1; +pub const EXIT_SUCCESS: c_int = 0; +pub const RAND_MAX: c_int = 0x7fffffff; +pub const EOF: c_int = -1; +pub const SEEK_SET: c_int = 0; +pub const SEEK_CUR: c_int = 1; +pub const SEEK_END: c_int = 2; +pub const _IOFBF: c_int = 0; +pub const _IONBF: c_int = 2; +pub const _IOLBF: c_int = 1; +pub const BUFSIZ: c_uint = 1024; +pub const FOPEN_MAX: c_uint = 20; +pub const FILENAME_MAX: c_uint = 1024; + +pub const O_RDONLY: c_int = 1; +pub const O_WRONLY: c_int = 2; +pub const O_RDWR: c_int = 4; +pub const O_APPEND: c_int = 8; +pub const O_CREAT: c_int = 0x10; +pub const O_EXCL: c_int = 0x400; +pub const O_TEXT: c_int = 0x100; +pub const O_BINARY: c_int = 0x200; +pub const O_TRUNC: c_int = 0x20; +pub const S_IEXEC: c_short = 0x0040; +pub const S_IWRITE: c_short = 0x0080; +pub const S_IREAD: c_short = 0x0100; +pub const S_IFCHR: c_short = 0x2000; +pub const S_IFDIR: c_short = 0x4000; +pub const S_IFMT: c_short = 0o160000; +pub const S_IFIFO: c_short = 0o0010000; +pub const S_IFBLK: c_short = 0o0060000; +pub const S_IFREG: c_short = 0o0100000; + +pub const LC_ALL: c_int = 0; +pub const LC_COLLATE: c_int = 1; +pub const LC_CTYPE: c_int = 2; +pub const LC_MONETARY: c_int = 3; +pub const LC_NUMERIC: c_int = 4; +pub const LC_TIME: c_int = 5; +pub const LC_MESSAGES: c_int = 6; +pub const _LC_LAST: c_int = 7; + +pub const EPERM: c_int = 1; +pub const ENOENT: c_int = 2; +pub const ESRCH: c_int = 3; +pub const EINTR: c_int = 4; +pub const EIO: c_int = 5; +pub const ENXIO: c_int = 6; +pub const E2BIG: c_int = 7; +pub const ENOEXEC: c_int = 8; +pub const EBADF: c_int = 9; +pub const ECHILD: c_int = 10; +pub const EAGAIN: c_int = 11; +pub const ENOMEM: c_int = 12; +pub const EACCES: c_int = 13; +pub const EFAULT: c_int = 14; +pub const ENOTBLK: c_int = 15; +pub const EBUSY: c_int = 16; +pub const EEXIST: c_int = 17; +pub const EXDEV: c_int = 18; +pub const ENODEV: c_int = 19; +pub const ENOTDIR: c_int = 20; +pub const EISDIR: c_int = 21; +pub const EINVAL: c_int = 22; +pub const ENFILE: c_int = 23; +pub const EMFILE: c_int = 24; +pub const ENOTTY: c_int = 25; +pub const ETXTBSY: c_int = 26; +pub const EFBIG: c_int = 27; +pub const ENOSPC: c_int = 28; +pub const ESPIPE: c_int = 29; +pub const EROFS: c_int = 30; +pub const EMLINK: c_int = 31; +pub const EPIPE: c_int = 32; +pub const EDOM: c_int = 33; +pub const ERANGE: c_int = 34; + +pub const EDEADLK: c_int = 35; +pub const ENAMETOOLONG: c_int = 36; +pub const ENOLCK: c_int = 37; +pub const ENOSYS: c_int = 38; +pub const ENOTEMPTY: c_int = 39; +pub const ELOOP: c_int = 40; +pub const EWOULDBLOCK: c_int = EAGAIN; +pub const ENOMSG: c_int = 42; +pub const EIDRM: c_int = 43; +pub const ECHRNG: c_int = 44; +pub const EL2NSYNC: c_int = 45; +pub const EL3HLT: c_int = 46; +pub const EL3RST: c_int = 47; +pub const ELNRNG: c_int = 48; +pub const EUNATCH: c_int = 49; +pub const ENOCSI: c_int = 50; +pub const EL2HLT: c_int = 51; +pub const EBADE: c_int = 52; +pub const EBADR: c_int = 53; +pub const EXFULL: c_int = 54; +pub const ENOANO: c_int = 55; +pub const EBADRQC: c_int = 56; +pub const EBADSLT: c_int = 57; + +pub const EDEADLOCK: c_int = EDEADLK; + +pub const EBFONT: c_int = 59; +pub const ENOSTR: c_int = 60; +pub const ENODATA: c_int = 61; +pub const ETIME: c_int = 62; +pub const ENOSR: c_int = 63; +pub const ENONET: c_int = 64; +pub const ENOPKG: c_int = 65; +pub const EREMOTE: c_int = 66; +pub const ENOLINK: c_int = 67; +pub const EADV: c_int = 68; +pub const ESRMNT: c_int = 69; +pub const ECOMM: c_int = 70; +pub const EPROTO: c_int = 71; +pub const EMULTIHOP: c_int = 72; +pub const EDOTDOT: c_int = 73; +pub const EBADMSG: c_int = 74; +pub const EOVERFLOW: c_int = 75; +pub const ENOTUNIQ: c_int = 76; +pub const EBADFD: c_int = 77; +pub const EREMCHG: c_int = 78; +pub const ELIBACC: c_int = 79; +pub const ELIBBAD: c_int = 80; +pub const ELIBSCN: c_int = 81; +pub const ELIBMAX: c_int = 82; +pub const ELIBEXEC: c_int = 83; +pub const EILSEQ: c_int = 84; +pub const ERESTART: c_int = 85; +pub const ESTRPIPE: c_int = 86; +pub const EUSERS: c_int = 87; +pub const ENOTSOCK: c_int = 88; +pub const EDESTADDRREQ: c_int = 89; +pub const EMSGSIZE: c_int = 90; +pub const EPROTOTYPE: c_int = 91; +pub const ENOPROTOOPT: c_int = 92; +pub const EPROTONOSUPPORT: c_int = 93; +pub const ESOCKTNOSUPPORT: c_int = 94; +pub const EOPNOTSUPP: c_int = 95; +pub const EPFNOSUPPORT: c_int = 96; +pub const EAFNOSUPPORT: c_int = 97; +pub const EADDRINUSE: c_int = 98; +pub const EADDRNOTAVAIL: c_int = 99; +pub const ENETDOWN: c_int = 100; +pub const ENETUNREACH: c_int = 101; +pub const ENETRESET: c_int = 102; +pub const ECONNABORTED: c_int = 103; +pub const ECONNRESET: c_int = 104; +pub const ENOBUFS: c_int = 105; +pub const EISCONN: c_int = 106; +pub const ENOTCONN: c_int = 107; +pub const ESHUTDOWN: c_int = 108; +pub const ETOOMANYREFS: c_int = 109; +pub const ETIMEDOUT: c_int = 110; +pub const ECONNREFUSED: c_int = 111; +pub const EHOSTDOWN: c_int = 112; +pub const EHOSTUNREACH: c_int = 113; +pub const EALREADY: c_int = 114; +pub const EINPROGRESS: c_int = 115; +pub const ESTALE: c_int = 116; +pub const EUCLEAN: c_int = 117; +pub const ENOTNAM: c_int = 118; +pub const ENAVAIL: c_int = 119; +pub const EISNAM: c_int = 120; +pub const EREMOTEIO: c_int = 121; +pub const EDQUOT: c_int = 122; + +pub const ENOMEDIUM: c_int = 123; +pub const EMEDIUMTYPE: c_int = 124; +pub const ECANCELED: c_int = 125; +pub const ENOKEY: c_int = 126; +pub const EKEYEXPIRED: c_int = 127; +pub const EKEYREVOKED: c_int = 128; +pub const EKEYREJECTED: c_int = 129; + +pub const EOWNERDEAD: c_int = 130; +pub const ENOTRECOVERABLE: c_int = 131; + +pub const ENOTSUP: c_int = 132; +pub const EFTYPE: c_int = 133; + +// signal codes +pub const SIGHUP: c_int = 1; +pub const SIGINT: c_int = 2; +pub const SIGQUIT: c_int = 3; +pub const SIGILL: c_int = 4; +pub const SIGTRAP: c_int = 5; +pub const SIGABRT: c_int = 6; +pub const SIGIOT: c_int = SIGABRT; +pub const SIGEMT: c_int = 7; +pub const SIGFPE: c_int = 8; +pub const SIGKILL: c_int = 9; +pub const SIGBUS: c_int = 10; +pub const SIGSEGV: c_int = 11; +pub const SIGSYS: c_int = 12; +pub const SIGPIPE: c_int = 13; +pub const SIGALRM: c_int = 14; +pub const SIGTERM: c_int = 15; +pub const SIGURG: c_int = 16; +pub const SIGSTOP: c_int = 17; +pub const SIGTSTP: c_int = 18; +pub const SIGCONT: c_int = 19; +pub const SIGCHLD: c_int = 20; +pub const SIGTTIN: c_int = 21; +pub const SIGTTOU: c_int = 22; +pub const SIGIO: c_int = 23; +pub const SIGXCPU: c_int = 24; +pub const SIGXFSZ: c_int = 25; +pub const SIGVTALRM: c_int = 26; +pub const SIGPROF: c_int = 27; +pub const SIGWINCH: c_int = 28; +pub const SIGINFO: c_int = 29; +pub const SIGUSR1: c_int = 30; +pub const SIGUSR2: c_int = 31; +pub const SIGPWR: c_int = 32; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +impl ::Copy for FILE {} +impl ::Clone for FILE { + fn clone(&self) -> FILE { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos_t {} +impl ::Copy for fpos_t {} +impl ::Clone for fpos_t { + fn clone(&self) -> fpos_t { + *self + } +} + +extern "C" { + // ctype.h + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + + // stdio.h + pub fn __get_stdio_file(fileno: c_int) -> *mut FILE; + pub fn clearerr(arg1: *mut FILE); + pub fn fclose(arg1: *mut FILE) -> c_int; + pub fn feof(arg1: *mut FILE) -> c_int; + pub fn ferror(arg1: *mut FILE) -> c_int; + pub fn fflush(arg1: *mut FILE) -> c_int; + pub fn fgetc(arg1: *mut FILE) -> c_int; + pub fn fgets(arg1: *mut c_char, arg2: c_int, arg3: *mut FILE) -> *mut c_char; + pub fn fopen(arg1: *const c_char, arg2: *const c_char) -> *mut FILE; + pub fn fprintf(arg1: *mut FILE, arg2: *const c_char, ...) -> c_int; + pub fn fputc(arg1: c_int, arg2: *mut FILE) -> c_int; + pub fn fputs(arg1: *const c_char, arg2: *mut FILE) -> c_int; + pub fn fread(arg1: *mut c_void, arg2: size_t, arg3: size_t, arg4: *mut FILE) -> size_t; + pub fn freopen(arg1: *const c_char, arg2: *const c_char, arg3: *mut FILE) -> *mut FILE; + pub fn fscanf(arg1: *mut FILE, arg2: *const c_char, ...) -> c_int; + pub fn fseek(arg1: *mut FILE, arg2: c_long, arg3: c_int) -> c_int; + pub fn ftell(arg1: *mut FILE) -> c_long; + pub fn fwrite(arg1: *const c_void, arg2: size_t, arg3: size_t, arg4: *mut FILE) -> size_t; + pub fn getc(arg1: *mut FILE) -> c_int; + pub fn getchar() -> c_int; + pub fn perror(arg1: *const c_char); + pub fn printf(arg1: *const c_char, ...) -> c_int; + pub fn putc(arg1: c_int, arg2: *mut FILE) -> c_int; + pub fn putchar(arg1: c_int) -> c_int; + pub fn puts(arg1: *const c_char) -> c_int; + pub fn remove(arg1: *const c_char) -> c_int; + pub fn rewind(arg1: *mut FILE); + pub fn scanf(arg1: *const c_char, ...) -> c_int; + pub fn setbuf(arg1: *mut FILE, arg2: *mut c_char); + pub fn setvbuf(arg1: *mut FILE, arg2: *mut c_char, arg3: c_int, arg4: size_t) -> c_int; + pub fn sscanf(arg1: *const c_char, arg2: *const c_char, ...) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn ungetc(arg1: c_int, arg2: *mut FILE) -> c_int; + pub fn vfprintf(arg1: *mut FILE, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn vprintf(arg1: *const c_char, arg2: __va_list) -> c_int; + pub fn gets(arg1: *mut c_char) -> *mut c_char; + pub fn sprintf(arg1: *mut c_char, arg2: *const c_char, ...) -> c_int; + pub fn tmpnam(arg1: *const c_char) -> *mut c_char; + pub fn vsprintf(arg1: *mut c_char, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn rename(arg1: *const c_char, arg2: *const c_char) -> c_int; + pub fn asiprintf(arg1: *mut *mut c_char, arg2: *const c_char, ...) -> c_int; + pub fn fiprintf(arg1: *mut FILE, arg2: *const c_char, ...) -> c_int; + pub fn fiscanf(arg1: *mut FILE, arg2: *const c_char, ...) -> c_int; + pub fn iprintf(arg1: *const c_char, ...) -> c_int; + pub fn iscanf(arg1: *const c_char, ...) -> c_int; + pub fn siprintf(arg1: *mut c_char, arg2: *const c_char, ...) -> c_int; + pub fn siscanf(arg1: *mut c_char, arg2: *const c_char, ...) -> c_int; + pub fn sniprintf(arg1: *mut c_char, arg2: size_t, arg3: *const c_char, ...) -> c_int; + pub fn vasiprintf(arg1: *mut *mut c_char, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn vfiprintf(arg1: *mut FILE, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn vfiscanf(arg1: *mut FILE, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn viprintf(arg1: *const c_char, arg2: __va_list) -> c_int; + pub fn viscanf(arg1: *const c_char, arg2: __va_list) -> c_int; + pub fn vsiprintf(arg1: *mut c_char, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn vsiscanf(arg1: *const c_char, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn vsniprintf( + arg1: *mut c_char, + arg2: size_t, + arg3: *const c_char, + arg4: __va_list, + ) -> c_int; + pub fn vdiprintf(arg1: c_int, arg2: *const c_char, arg3: __va_list) -> c_int; + pub fn diprintf(arg1: c_int, arg2: *const c_char, ...) -> c_int; + pub fn fgetpos(arg1: *mut FILE, arg2: *mut fpos_t) -> c_int; + pub fn fsetpos(arg1: *mut FILE, arg2: *const fpos_t) -> c_int; + pub fn fdopen(arg1: c_int, arg2: *const c_char) -> *mut FILE; + pub fn fileno(arg1: *mut FILE) -> c_int; + pub fn flockfile(arg1: *mut FILE); + pub fn ftrylockfile(arg1: *mut FILE) -> c_int; + pub fn funlockfile(arg1: *mut FILE); + pub fn getc_unlocked(arg1: *mut FILE) -> c_int; + pub fn getchar_unlocked() -> c_int; + pub fn putc_unlocked(arg1: c_int, arg2: *mut FILE) -> c_int; + pub fn putchar_unlocked(arg1: c_int) -> c_int; + pub fn snprintf(arg1: *mut c_char, arg2: size_t, arg3: *const c_char, ...) -> c_int; + pub fn vsnprintf( + arg1: *mut c_char, + arg2: size_t, + arg3: *const c_char, + arg4: __va_list, + ) -> c_int; + pub fn getw(arg1: *mut FILE) -> c_int; + pub fn putw(arg1: c_int, arg2: *mut FILE) -> c_int; + pub fn tempnam(arg1: *const c_char, arg2: *const c_char) -> *mut c_char; + pub fn fseeko(stream: *mut FILE, offset: off_t, whence: c_int) -> c_int; + pub fn ftello(stream: *mut FILE) -> off_t; + + // stdlib.h + pub fn atof(arg1: *const c_char) -> f64; + pub fn strtod(arg1: *const c_char, arg2: *mut *mut c_char) -> f64; + pub fn drand48() -> f64; + pub fn erand48(arg1: *mut c_ushort) -> f64; + pub fn strtof(arg1: *const c_char, arg2: *mut *mut c_char) -> f32; + pub fn strtold(arg1: *const c_char, arg2: *mut *mut c_char) -> f64; + pub fn strtod_l(arg1: *const c_char, arg2: *mut *mut c_char, arg3: locale_t) -> f64; + pub fn strtof_l(arg1: *const c_char, arg2: *mut *mut c_char, arg3: locale_t) -> f32; + pub fn strtold_l(arg1: *const c_char, arg2: *mut *mut c_char, arg3: locale_t) -> f64; + pub fn _Exit(arg1: c_int) -> !; + pub fn abort() -> !; + pub fn abs(arg1: c_int) -> c_int; + pub fn atexit(arg1: ::Option) -> c_int; + pub fn atoi(arg1: *const c_char) -> c_int; + pub fn atol(arg1: *const c_char) -> c_long; + pub fn itoa(arg1: c_int, arg2: *mut c_char, arg3: c_int) -> *mut c_char; + pub fn ltoa(arg1: c_long, arg2: *mut c_char, arg3: c_int) -> *mut c_char; + pub fn ultoa(arg1: c_ulong, arg2: *mut c_char, arg3: c_int) -> *mut c_char; + pub fn bsearch( + arg1: *const c_void, + arg2: *const c_void, + arg3: size_t, + arg4: size_t, + arg5: ::Option c_int>, + ) -> *mut c_void; + pub fn calloc(arg1: size_t, arg2: size_t) -> *mut c_void; + pub fn div(arg1: c_int, arg2: c_int) -> div_t; + pub fn exit(arg1: c_int) -> !; + pub fn free(arg1: *mut c_void); + pub fn getenv(arg1: *const c_char) -> *mut c_char; + pub fn labs(arg1: c_long) -> c_long; + pub fn ldiv(arg1: c_long, arg2: c_long) -> ldiv_t; + pub fn malloc(arg1: size_t) -> *mut c_void; + pub fn qsort( + arg1: *mut c_void, + arg2: size_t, + arg3: size_t, + arg4: ::Option c_int>, + ); + pub fn rand() -> c_int; + pub fn realloc(arg1: *mut c_void, arg2: size_t) -> *mut c_void; + pub fn srand(arg1: c_uint); + pub fn strtol(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> c_long; + pub fn strtoul(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> c_ulong; + pub fn mblen(arg1: *const c_char, arg2: size_t) -> c_int; + pub fn mbstowcs(arg1: *mut wchar_t, arg2: *const c_char, arg3: size_t) -> size_t; + pub fn wctomb(arg1: *mut c_char, arg2: wchar_t) -> c_int; + pub fn mbtowc(arg1: *mut wchar_t, arg2: *const c_char, arg3: size_t) -> c_int; + pub fn wcstombs(arg1: *mut c_char, arg2: *const wchar_t, arg3: size_t) -> size_t; + pub fn rand_r(arg1: *mut c_uint) -> c_int; + pub fn jrand48(arg1: *mut c_ushort) -> c_long; + pub fn lcong48(arg1: *mut c_ushort); + pub fn lrand48() -> c_long; + pub fn mrand48() -> c_long; + pub fn nrand48(arg1: *mut c_ushort) -> c_long; + pub fn seed48(arg1: *mut c_ushort) -> *mut c_ushort; + pub fn srand48(arg1: c_long); + pub fn putenv(arg1: *mut c_char) -> c_int; + pub fn a64l(arg1: *const c_char) -> c_long; + pub fn l64a(arg1: c_long) -> *mut c_char; + pub fn random() -> c_long; + pub fn setstate(arg1: *mut c_char) -> *mut c_char; + pub fn initstate(arg1: c_uint, arg2: *mut c_char, arg3: size_t) -> *mut c_char; + pub fn srandom(arg1: c_uint); + pub fn mkostemp(arg1: *mut c_char, arg2: c_int) -> c_int; + pub fn mkostemps(arg1: *mut c_char, arg2: c_int, arg3: c_int) -> c_int; + pub fn mkdtemp(arg1: *mut c_char) -> *mut c_char; + pub fn mkstemp(arg1: *mut c_char) -> c_int; + pub fn mktemp(arg1: *mut c_char) -> *mut c_char; + pub fn atoll(arg1: *const c_char) -> c_longlong; + pub fn llabs(arg1: c_longlong) -> c_longlong; + pub fn lldiv(arg1: c_longlong, arg2: c_longlong) -> lldiv_t; + pub fn strtoll(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> c_longlong; + pub fn strtoull(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> c_ulonglong; + pub fn aligned_alloc(arg1: size_t, arg2: size_t) -> *mut c_void; + pub fn at_quick_exit(arg1: ::Option) -> c_int; + pub fn quick_exit(arg1: c_int); + pub fn setenv(arg1: *const c_char, arg2: *const c_char, arg3: c_int) -> c_int; + pub fn unsetenv(arg1: *const c_char) -> c_int; + pub fn humanize_number( + arg1: *mut c_char, + arg2: size_t, + arg3: i64, + arg4: *const c_char, + arg5: c_int, + arg6: c_int, + ) -> c_int; + pub fn dehumanize_number(arg1: *const c_char, arg2: *mut i64) -> c_int; + pub fn getenv_r(arg1: *const c_char, arg2: *mut c_char, arg3: size_t) -> c_int; + pub fn heapsort( + arg1: *mut c_void, + arg2: size_t, + arg3: size_t, + arg4: ::Option c_int>, + ) -> c_int; + pub fn mergesort( + arg1: *mut c_void, + arg2: size_t, + arg3: size_t, + arg4: ::Option c_int>, + ) -> c_int; + pub fn radixsort( + arg1: *mut *const c_uchar, + arg2: c_int, + arg3: *const c_uchar, + arg4: c_uint, + ) -> c_int; + pub fn sradixsort( + arg1: *mut *const c_uchar, + arg2: c_int, + arg3: *const c_uchar, + arg4: c_uint, + ) -> c_int; + pub fn getprogname() -> *const c_char; + pub fn setprogname(arg1: *const c_char); + pub fn qabs(arg1: quad_t) -> quad_t; + pub fn strtoq(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> quad_t; + pub fn strtouq(arg1: *const c_char, arg2: *mut *mut c_char, arg3: c_int) -> u_quad_t; + pub fn strsuftoll( + arg1: *const c_char, + arg2: *const c_char, + arg3: c_longlong, + arg4: c_longlong, + ) -> c_longlong; + pub fn strsuftollx( + arg1: *const c_char, + arg2: *const c_char, + arg3: c_longlong, + arg4: c_longlong, + arg5: *mut c_char, + arg6: size_t, + ) -> c_longlong; + pub fn l64a_r(arg1: c_long, arg2: *mut c_char, arg3: c_int) -> c_int; + pub fn qdiv(arg1: quad_t, arg2: quad_t) -> qdiv_t; + pub fn strtol_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> c_long; + pub fn strtoul_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> c_ulong; + pub fn strtoll_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> c_longlong; + pub fn strtoull_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> c_ulonglong; + pub fn strtoq_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> quad_t; + pub fn strtouq_l( + arg1: *const c_char, + arg2: *mut *mut c_char, + arg3: c_int, + arg4: locale_t, + ) -> u_quad_t; + pub fn _mb_cur_max_l(arg1: locale_t) -> size_t; + pub fn mblen_l(arg1: *const c_char, arg2: size_t, arg3: locale_t) -> c_int; + pub fn mbstowcs_l( + arg1: *mut wchar_t, + arg2: *const c_char, + arg3: size_t, + arg4: locale_t, + ) -> size_t; + pub fn wctomb_l(arg1: *mut c_char, arg2: wchar_t, arg3: locale_t) -> c_int; + pub fn mbtowc_l(arg1: *mut wchar_t, arg2: *const c_char, arg3: size_t, arg4: locale_t) + -> c_int; + pub fn wcstombs_l( + arg1: *mut c_char, + arg2: *const wchar_t, + arg3: size_t, + arg4: locale_t, + ) -> size_t; + + // string.h + pub fn memchr(arg1: *const c_void, arg2: c_int, arg3: size_t) -> *mut c_void; + pub fn memcmp(arg1: *const c_void, arg2: *const c_void, arg3: size_t) -> c_int; + pub fn memcpy(arg1: *mut c_void, arg2: *const c_void, arg3: size_t) -> *mut c_void; + pub fn memmove(arg1: *mut c_void, arg2: *const c_void, arg3: size_t) -> *mut c_void; + pub fn memset(arg1: *mut c_void, arg2: c_int, arg3: size_t) -> *mut c_void; + pub fn strcat(arg1: *mut c_char, arg2: *const c_char) -> *mut c_char; + pub fn strchr(arg1: *const c_char, arg2: c_int) -> *mut c_char; + pub fn strcmp(arg1: *const c_char, arg2: *const c_char) -> c_int; + pub fn strcoll(arg1: *const c_char, arg2: *const c_char) -> c_int; + pub fn strcpy(arg1: *mut c_char, arg2: *const c_char) -> *mut c_char; + pub fn strcspn(arg1: *const c_char, arg2: *const c_char) -> size_t; + pub fn strerror(arg1: c_int) -> *mut c_char; + pub fn strlen(arg1: *const c_char) -> size_t; + pub fn strncat(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> *mut c_char; + pub fn strncmp(arg1: *const c_char, arg2: *const c_char, arg3: size_t) -> c_int; + pub fn strncpy(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> *mut c_char; + pub fn strpbrk(arg1: *const c_char, arg2: *const c_char) -> *mut c_char; + pub fn strrchr(arg1: *const c_char, arg2: c_int) -> *mut c_char; + pub fn strspn(arg1: *const c_char, arg2: *const c_char) -> size_t; + pub fn strstr(arg1: *const c_char, arg2: *const c_char) -> *mut c_char; + pub fn strtok(arg1: *mut c_char, arg2: *const c_char) -> *mut c_char; + pub fn strtok_r(arg1: *mut c_char, arg2: *const c_char, arg3: *mut *mut c_char) -> *mut c_char; + pub fn strerror_r(arg1: c_int, arg2: *mut c_char, arg3: size_t) -> c_int; + pub fn strxfrm(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> size_t; + pub fn memccpy( + arg1: *mut c_void, + arg2: *const c_void, + arg3: c_int, + arg4: size_t, + ) -> *mut c_void; + pub fn strdup(arg1: *const c_char) -> *mut c_char; + pub fn stpcpy(arg1: *mut c_char, arg2: *const c_char) -> *mut c_char; + pub fn stpncpy(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> *mut c_char; + pub fn strnlen(arg1: *const c_char, arg2: size_t) -> size_t; + pub fn memmem( + arg1: *const c_void, + arg2: size_t, + arg3: *const c_void, + arg4: size_t, + ) -> *mut c_void; + pub fn strcasestr(arg1: *const c_char, arg2: *const c_char) -> *mut c_char; + pub fn strlcat(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> size_t; + pub fn strlcpy(arg1: *mut c_char, arg2: *const c_char, arg3: size_t) -> size_t; + pub fn strsep(arg1: *mut *mut c_char, arg2: *const c_char) -> *mut c_char; + pub fn stresep(arg1: *mut *mut c_char, arg2: *const c_char, arg3: c_int) -> *mut c_char; + pub fn strndup(arg1: *const c_char, arg2: size_t) -> *mut c_char; + pub fn memrchr(arg1: *const c_void, arg2: c_int, arg3: size_t) -> *mut c_void; + pub fn explicit_memset(arg1: *mut c_void, arg2: c_int, arg3: size_t) -> *mut c_void; + pub fn consttime_memequal(arg1: *const c_void, arg2: *const c_void, arg3: size_t) -> c_int; + pub fn strcoll_l(arg1: *const c_char, arg2: *const c_char, arg3: locale_t) -> c_int; + pub fn strxfrm_l( + arg1: *mut c_char, + arg2: *const c_char, + arg3: size_t, + arg4: locale_t, + ) -> size_t; + pub fn strerror_l(arg1: c_int, arg2: locale_t) -> *mut c_char; + + // strings.h + pub fn bcmp(arg1: *const c_void, arg2: *const c_void, arg3: size_t) -> c_int; + pub fn bcopy(arg1: *const c_void, arg2: *mut c_void, arg3: size_t); + pub fn bzero(arg1: *mut c_void, arg2: size_t); + pub fn ffs(arg1: c_int) -> c_int; + pub fn popcount(arg1: c_uint) -> c_uint; + pub fn popcountl(arg1: c_ulong) -> c_uint; + pub fn popcountll(arg1: c_ulonglong) -> c_uint; + pub fn popcount32(arg1: u32) -> c_uint; + pub fn popcount64(arg1: u64) -> c_uint; + pub fn rindex(arg1: *const c_char, arg2: c_int) -> *mut c_char; + pub fn strcasecmp(arg1: *const c_char, arg2: *const c_char) -> c_int; + pub fn strncasecmp(arg1: *const c_char, arg2: *const c_char, arg3: size_t) -> c_int; + + // signal.h + pub fn signal(arg1: c_int, arg2: sighandler_t) -> sighandler_t; + pub fn raise(arg1: c_int) -> c_int; + + // time.h + pub fn asctime(arg1: *const tm) -> *mut c_char; + pub fn clock() -> clock_t; + pub fn ctime(arg1: *const time_t) -> *mut c_char; + pub fn difftime(arg1: time_t, arg2: time_t) -> f64; + pub fn gmtime(arg1: *const time_t) -> *mut tm; + pub fn localtime(arg1: *const time_t) -> *mut tm; + pub fn time(arg1: *mut time_t) -> time_t; + pub fn mktime(arg1: *mut tm) -> time_t; + pub fn strftime( + arg1: *mut c_char, + arg2: size_t, + arg3: *const c_char, + arg4: *const tm, + ) -> size_t; + pub fn utime(arg1: *const c_char, arg2: *mut time_t) -> c_int; + pub fn asctime_r(arg1: *const tm, arg2: *mut c_char) -> *mut c_char; + pub fn ctime_r(arg1: *const time_t, arg2: *mut c_char) -> *mut c_char; + pub fn gmtime_r(arg1: *const time_t, arg2: *mut tm) -> *mut tm; + pub fn localtime_r(arg1: *const time_t, arg2: *mut tm) -> *mut tm; + + // sys/stat.h + pub fn stat(arg1: *const c_char, arg2: *mut stat) -> c_int; + pub fn lstat(arg1: *const c_char, arg2: *mut stat) -> c_int; + pub fn fstat(arg1: c_int, arg2: *mut stat) -> c_int; + pub fn chmod(arg1: *const c_char, arg2: __mode_t) -> c_int; + pub fn mkdir(arg1: *const c_char, arg2: __mode_t) -> c_int; + + // fcntl.h + pub fn open(arg1: *const c_char, arg2: c_int, ...) -> c_int; + pub fn creat(arg1: *const c_char, arg2: c_int) -> c_int; + pub fn close(arg1: c_int) -> c_int; + pub fn read(arg1: c_int, arg2: *mut c_void, arg3: c_int) -> c_int; + pub fn write(arg1: c_int, arg2: *const c_void, arg3: c_int) -> c_int; + pub fn unlink(arg1: *const c_char) -> c_int; + pub fn tell(arg1: c_int) -> c_long; + pub fn dup(arg1: c_int) -> c_int; + pub fn dup2(arg1: c_int, arg2: c_int) -> c_int; + pub fn access(arg1: *const c_char, arg2: c_int) -> c_int; + pub fn rmdir(arg1: *const c_char) -> c_int; + pub fn chdir(arg1: *const c_char) -> c_int; + pub fn _exit(arg1: c_int); + pub fn getwd(arg1: *mut c_char) -> *mut c_char; + pub fn getcwd(arg1: *mut c_char, arg2: size_t) -> *mut c_char; + pub static mut optarg: *mut c_char; + pub static mut opterr: c_int; + pub static mut optind: c_int; + pub static mut optopt: c_int; + pub static mut optreset: c_int; + pub fn getopt(arg1: c_int, arg2: *mut *mut c_char, arg3: *const c_char) -> c_int; + pub static mut suboptarg: *mut c_char; + pub fn getsubopt( + arg1: *mut *mut c_char, + arg2: *const *mut c_char, + arg3: *mut *mut c_char, + ) -> c_int; + pub fn fcntl(arg1: c_int, arg2: c_int, ...) -> c_int; + pub fn getpid() -> pid_t; + pub fn sleep(arg1: c_uint) -> c_uint; + pub fn usleep(arg1: useconds_t) -> c_int; + + // locale.h + pub fn localeconv() -> *mut lconv; + pub fn setlocale(arg1: c_int, arg2: *const c_char) -> *mut c_char; + pub fn duplocale(arg1: locale_t) -> locale_t; + pub fn freelocale(arg1: locale_t); + pub fn localeconv_l(arg1: locale_t) -> *mut lconv; + pub fn newlocale(arg1: c_int, arg2: *const c_char, arg3: locale_t) -> locale_t; + + // langinfo.h + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + pub fn nl_langinfo_l(item: ::nl_item, locale: locale_t) -> *mut ::c_char; + + // malloc.h + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + + // sys/types.h + pub fn lseek(arg1: c_int, arg2: __off_t, arg3: c_int) -> __off_t; +} + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "arm"))] { + mod arm; + pub use self::arm::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/switch.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/switch.rs new file mode 100644 index 0000000..030ab20 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/switch.rs @@ -0,0 +1,49 @@ +//! Switch C type definitions + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type off_t = i64; +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = u32; + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/mod.rs new file mode 100644 index 0000000..325d7d6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/mod.rs @@ -0,0 +1,3355 @@ +pub type c_char = i8; +pub type caddr_t = *mut ::c_char; +// FIXME: clockid_t must be c_long, but time.rs accepts only i32 +pub type clockid_t = ::c_int; +pub type blkcnt_t = ::c_long; +pub type clock_t = ::c_int; +pub type daddr_t = ::c_long; +pub type dev_t = ::c_ulong; +pub type fpos64_t = ::c_longlong; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type idtype_t = ::c_int; +pub type ino_t = ::c_ulong; +pub type key_t = ::c_int; +pub type mode_t = ::c_uint; +pub type nlink_t = ::c_short; +pub type rlim_t = ::c_ulong; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type time_t = ::c_long; +pub type time64_t = ::int64_t; +pub type timer_t = ::c_long; +pub type wchar_t = ::c_uint; +pub type nfds_t = ::c_int; +pub type projid_t = ::c_int; +pub type id_t = ::c_uint; +pub type blksize64_t = ::c_ulonglong; +pub type blkcnt64_t = ::c_ulonglong; +pub type sctp_assoc_t = ::uint32_t; + +pub type suseconds_t = ::c_int; +pub type useconds_t = ::c_uint; +pub type off_t = ::c_long; +pub type off64_t = ::c_longlong; + +pub type socklen_t = ::c_uint; +pub type sa_family_t = ::c_uchar; +pub type in_port_t = ::c_ushort; +pub type in_addr_t = ::c_uint; + +pub type signal_t = ::c_int; +pub type pthread_t = ::c_uint; +pub type pthread_key_t = ::c_uint; +pub type thread_t = pthread_t; +pub type blksize_t = ::c_long; +pub type nl_item = ::c_int; +pub type mqd_t = ::c_int; +pub type shmatt_t = ::c_ulong; +pub type regoff_t = ::c_long; +pub type rlim64_t = ::c_ulonglong; + +pub type sem_t = ::c_int; +pub type pollset_t = ::c_int; + +pub type pthread_rwlockattr_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_attr_t = *mut ::c_void; +pub type pthread_barrierattr_t = *mut ::c_void; +pub type posix_spawn_file_actions_t = *mut ::c_char; +pub type iconv_t = *mut ::c_void; + +e! { + pub enum uio_rw { + UIO_READ = 0, + UIO_WRITE, + UIO_READ_NO_MOVE, + UIO_WRITE_NO_MOVE, + UIO_PWRITE, + } +} + +s! { + pub struct fsid_t { + pub val: [::c_uint; 2], + } + + pub struct fsid64_t { + pub val: [::uint64_t; 2], + } + + pub struct timezone { + pub tz_minuteswest: ::c_int, + pub tz_dsttime: ::c_int, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct dirent { + pub d_offset: ::c_ulong, + pub d_ino: ::ino_t, + pub d_reclen: ::c_ushort, + pub d_namlen: ::c_ushort, + pub d_name: [::c_char; 256] + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS] + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_sysid: ::c_uint, + pub l_pid: ::pid_t, + pub l_vfs: ::c_int, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: socklen_t, + pub msg_flags: ::c_int, + } + + pub struct statvfs64 { + pub f_bsize: ::blksize64_t, + pub f_frsize: ::blksize64_t, + pub f_blocks: ::blkcnt64_t, + pub f_bfree: ::blkcnt64_t, + pub f_bavail: ::blkcnt64_t, + pub f_files: ::blkcnt64_t, + pub f_ffree: ::blkcnt64_t, + pub f_favail: ::blkcnt64_t, + pub f_fsid: fsid64_t, + pub f_basetype: [::c_char; 16], + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_fstr: [::c_char; 32], + pub f_filler: [::c_ulong; 16] + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub left_parenthesis: *mut ::c_char, + pub right_parenthesis: *mut ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::c_ulong, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + pub ai_eflags: ::c_int, + } + + pub struct in_addr { + pub s_addr: in_addr_t + } + + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_sourceaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct sockaddr { + pub sa_len: ::c_uchar, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 120], + } + + pub struct sockaddr_in { + pub sin_len: ::c_uchar, + pub sin_family: sa_family_t, + pub sin_port: in_port_t, + pub sin_addr: in_addr, + pub sin_zero: [::c_char; 8] + } + + pub struct sockaddr_in6 { + pub sin6_len: ::c_uchar, + pub sin6_family: ::c_uchar, + pub sin6_port: ::uint16_t, + pub sin6_flowinfo: ::uint32_t, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: ::uint32_t + } + + pub struct sockaddr_storage { + pub __ss_len: ::c_uchar, + pub ss_family: sa_family_t, + __ss_pad1: [::c_char; 6], + __ss_align: ::int64_t, + __ss_pad2: [::c_char; 1265], + } + + pub struct sockaddr_un { + pub sun_len: ::c_uchar, + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 1023] + } + + pub struct st_timespec { + pub tv_sec: ::time_t, + pub tv_nsec: ::c_int, + } + + pub struct statfs64 { + pub f_version: ::c_int, + pub f_type: ::c_int, + pub f_bsize: blksize64_t, + pub f_blocks: blkcnt64_t, + pub f_bfree: blkcnt64_t, + pub f_bavail: blkcnt64_t, + pub f_files: ::uint64_t, + pub f_ffree: ::uint64_t, + pub f_fsid: fsid64_t, + pub f_vfstype: ::c_int, + pub f_fsize: blksize64_t, + pub f_vfsnumber: ::c_int, + pub f_vfsoff: ::c_int, + pub f_vfslen: ::c_int, + pub f_vfsvers: ::c_int, + pub f_fname: [::c_char; 32], + pub f_fpack: [::c_char; 32], + pub f_name_max: ::c_int, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char + } + + pub struct utsname { + pub sysname: [::c_char; 32], + pub nodename: [::c_char; 32], + pub release: [::c_char; 32], + pub version: [::c_char; 32], + pub machine: [::c_char; 32], + } + + pub struct xutsname { + pub nid: ::c_uint, + pub reserved: ::c_int, + pub longnid: ::c_ulonglong, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sigevent { + pub sigev_value: ::sigval, + pub sigev_signo: ::c_int, + pub sigev_notify: ::c_int, + pub sigev_notify_function: extern fn(val: ::sigval), + pub sigev_notify_attributes: *mut pthread_attr_t, + } + + // Should be union with another 'sival_int' + pub struct sigval64 { + pub sival_ptr: ::c_ulonglong, + } + + pub struct sigevent64 { + pub sigev_value: sigval64, + pub sigev_signo: ::c_int, + pub sigev_notify: ::c_int, + pub sigev_notify_function: ::c_ulonglong, + pub sigev_notify_attributes: ::c_ulonglong, + } + + pub struct osigevent { + pub sevt_value: *mut ::c_void, + pub sevt_signo: signal_t, + } + + pub struct poll_ctl { + pub cmd: ::c_short, + pub events: ::c_short, + pub fd: ::c_int, + } + + pub struct sf_parms { + pub header_data: *mut ::c_void, + pub header_length: ::c_uint, + pub file_descriptor: ::c_int, + pub file_size: ::uint64_t, + pub file_offset: ::uint64_t, + pub file_bytes: ::int64_t, + pub trailer_data: *mut ::c_void, + pub trailer_length: ::c_uint, + pub bytes_sent: ::uint64_t, + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::c_uint, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + pub sched_policy: ::c_int, + pub sched_reserved: [::c_int; 6], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + pub __pad: [::c_int; 4], + } + + pub struct posix_spawnattr_t { + pub posix_attr_flags: ::c_short, + pub posix_attr_pgroup: ::pid_t, + pub posix_attr_sigmask: ::sigset_t, + pub posix_attr_sigdefault: ::sigset_t, + pub posix_attr_schedpolicy: ::c_int, + pub posix_attr_schedparam: sched_param, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_padr: *mut ::c_void, + pub gl_ptx: *mut ::c_void, + } + + pub struct mallinfo { + pub arena: ::c_ulong, + pub ordblks: ::c_int, + pub smblks: ::c_int, + pub hblks: ::c_int, + pub hblkhd: ::c_int, + pub usmblks: ::c_ulong, + pub fsmblks: ::c_ulong, + pub uordblks: ::c_ulong, + pub fordblks: ::c_ulong, + pub keepcost: ::c_int, + } + + pub struct utmp_exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct utmp { + pub ut_user: [::c_char; 256], + pub ut_id: [::c_char; 14], + pub ut_line: [::c_char; 64], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_time: time64_t, + pub ut_exit: utmp_exit_status, + pub ut_host: [::c_char; 256], + pub __dbl_word_pad: ::c_int, + pub __reservedA: [::c_int; 2], + pub __reservedV: [::c_int; 6], + } + + pub struct regmatch_t { + pub rm_so: regoff_t, + pub rm_eo: regoff_t, + } + + pub struct regex_t { + pub re_nsub: ::size_t, + pub re_comp: *mut ::c_void, + pub re_cflags: ::c_int, + pub re_erroff: ::size_t, + pub re_len: ::size_t, + pub re_ucoll: [::wchar_t; 2], + pub re_lsub: [*mut ::c_void; 24], + pub re_esub: [*mut ::c_void; 24], + pub re_map: *mut ::c_uchar, + pub __maxsub: ::c_int, + pub __unused: [*mut ::c_void; 34], + } + + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + + pub struct shmid_ds { + pub shm_perm: ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: shmatt_t, + pub shm_cnattch: shmatt_t, + pub shm_atime: time_t, + pub shm_dtime: time_t, + pub shm_ctime: time_t, + pub shm_handle: ::uint32_t, + pub shm_extshm: ::c_int, + pub shm_pagesize: ::int64_t, + pub shm_lba: ::uint64_t, + pub shm_reserved: ::int64_t, + pub shm_reserved1: ::int64_t, + } + + pub struct stat64 { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_flag: ::c_ushort, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: dev_t, + pub st_ssize: ::c_int, + pub st_atim: st_timespec, + pub st_mtim: st_timespec, + pub st_ctim: st_timespec, + pub st_blksize: blksize_t, + pub st_blocks: blkcnt_t, + pub st_vfstype: ::c_int, + pub st_vfs: ::c_uint, + pub st_type: ::c_uint, + pub st_gen: ::c_uint, + pub st_reserved: [::c_uint; 10], + pub st_size: off64_t, + } + + pub struct mntent { + pub mnt_fsname: *mut ::c_char, + pub mnt_dir: *mut ::c_char, + pub mnt_type: *mut ::c_char, + pub mnt_opts: *mut ::c_char, + pub mnt_freq: ::c_int, + pub mnt_passno: ::c_int, + } + + pub struct ipc_perm { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: mode_t, + pub seq: ::c_ushort, + pub __reserved: ::c_ushort, + pub key: key_t, + } + + pub struct entry { + pub key: *mut ::c_char, + pub data: *mut ::c_void, + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } +} + +s_no_extra_traits! { + #[cfg(libc_union)] + pub union __sigaction_sa_union { + pub __su_handler: extern fn(c: ::c_int), + pub __su_sigaction: extern fn(c: ::c_int, info: *mut siginfo_t, ptr: *mut ::c_void), + } + + pub struct sigaction { + #[cfg(libc_union)] + pub sa_union: __sigaction_sa_union, + pub sa_mask: sigset_t, + pub sa_flags: ::c_int, + } + + #[cfg(libc_union)] + pub union __poll_ctl_ext_u { + pub addr: *mut ::c_void, + pub data32: u32, + pub data: u64, + } + + pub struct poll_ctl_ext { + pub version: u8, + pub command: u8, + pub events: ::c_short, + pub fd: ::c_int, + #[cfg(libc_union)] + pub u: __poll_ctl_ext_u, + pub reversed64: [u64; 6], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + #[cfg(libc_union)] + impl PartialEq for __sigaction_sa_union { + fn eq(&self, other: &__sigaction_sa_union) -> bool { + unsafe { + self.__su_handler == other.__su_handler + && self.__su_sigaction == other.__su_sigaction + } + } + } + #[cfg(libc_union)] + impl Eq for __sigaction_sa_union {} + #[cfg(libc_union)] + impl ::fmt::Debug for __sigaction_sa_union { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__sigaction_sa_union") + .field("__su_handler", unsafe { &self.__su_handler }) + .field("__su_sigaction", unsafe { &self.__su_sigaction }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __sigaction_sa_union { + fn hash(&self, state: &mut H) { + unsafe { + self.__su_handler.hash(state); + self.__su_sigaction.hash(state); + } + } + } + + impl PartialEq for sigaction { + fn eq(&self, other: &sigaction) -> bool { + #[cfg(libc_union)] + let union_eq = self.sa_union == other.sa_union; + #[cfg(not(libc_union))] + let union_eq = true; + self.sa_mask == other.sa_mask + && self.sa_flags == other.sa_flags + && union_eq + } + } + impl Eq for sigaction {} + impl ::fmt::Debug for sigaction { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("sigaction"); + #[cfg(libc_union)] + struct_formatter.field("sa_union", &self.sa_union); + struct_formatter.field("sa_mask", &self.sa_mask); + struct_formatter.field("sa_flags", &self.sa_flags); + struct_formatter.finish() + } + } + impl ::hash::Hash for sigaction { + fn hash(&self, state: &mut H) { + #[cfg(libc_union)] + self.sa_union.hash(state); + self.sa_mask.hash(state); + self.sa_flags.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __poll_ctl_ext_u { + fn eq(&self, other: &__poll_ctl_ext_u) -> bool { + unsafe { + self.addr == other.addr + && self.data32 == other.data32 + && self.data == other.data + } + } + } + #[cfg(libc_union)] + impl Eq for __poll_ctl_ext_u {} + #[cfg(libc_union)] + impl ::fmt::Debug for __poll_ctl_ext_u { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__poll_ctl_ext_u") + .field("addr", unsafe { &self.addr }) + .field("data32", unsafe { &self.data32 }) + .field("data", unsafe { &self.data }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __poll_ctl_ext_u { + fn hash(&self, state: &mut H) { + unsafe { + self.addr.hash(state); + self.data32.hash(state); + self.data.hash(state); + } + } + } + + impl PartialEq for poll_ctl_ext { + fn eq(&self, other: &poll_ctl_ext) -> bool { + #[cfg(libc_union)] + let union_eq = self.u == other.u; + #[cfg(not(libc_union))] + let union_eq = true; + self.version == other.version + && self.command == other.command + && self.events == other.events + && self.fd == other.fd + && self.reversed64 == other.reversed64 + && union_eq + } + } + impl Eq for poll_ctl_ext {} + impl ::fmt::Debug for poll_ctl_ext { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("poll_ctl_ext"); + struct_formatter.field("version", &self.version); + struct_formatter.field("command", &self.command); + struct_formatter.field("events", &self.events); + struct_formatter.field("fd", &self.fd); + #[cfg(libc_union)] + struct_formatter.field("u", &self.u); + struct_formatter.field("reversed64", &self.reversed64); + struct_formatter.finish() + } + } + impl ::hash::Hash for poll_ctl_ext { + fn hash(&self, state: &mut H) { + self.version.hash(state); + self.command.hash(state); + self.events.hash(state); + self.fd.hash(state); + #[cfg(libc_union)] + self.u.hash(state); + self.reversed64.hash(state); + } + } + } +} + +// dlfcn.h +pub const RTLD_LAZY: ::c_int = 0x4; +pub const RTLD_NOW: ::c_int = 0x2; +pub const RTLD_GLOBAL: ::c_int = 0x10000; +pub const RTLD_LOCAL: ::c_int = 0x80000; +pub const RTLD_DEFAULT: *mut ::c_void = -1isize as *mut ::c_void; +pub const RTLD_MYSELF: *mut ::c_void = -2isize as *mut ::c_void; +pub const RTLD_NEXT: *mut ::c_void = -3isize as *mut ::c_void; + +// fcntl.h +pub const O_RDONLY: ::c_int = 0x0; +pub const O_WRONLY: ::c_int = 0x1; +pub const O_RDWR: ::c_int = 0x2; +pub const O_NDELAY: ::c_int = 0x8000; +pub const O_APPEND: ::c_int = 0x8; +pub const O_DSYNC: ::c_int = 0x400000; +pub const O_CREAT: ::c_int = 0x100; +pub const O_EXCL: ::c_int = 0x400; +pub const O_NOCTTY: ::c_int = 0x800; +pub const O_TRUNC: ::c_int = 0x200; +pub const O_NOFOLLOW: ::c_int = 0x1000000; +pub const O_DIRECTORY: ::c_int = 0x80000; +pub const O_SEARCH: ::c_int = 0x20; +pub const O_EXEC: ::c_int = 0x20; +pub const O_CLOEXEC: ::c_int = 0x800000; +pub const O_ACCMODE: ::c_int = O_RDONLY | O_WRONLY | O_RDWR; +pub const O_DIRECT: ::c_int = 0x8000000; +pub const O_TTY_INIT: ::c_int = 0; +pub const O_RSYNC: ::c_int = 0x200000; +pub const O_LARGEFILE: ::c_int = 0x4000000; +pub const F_CLOSEM: ::c_int = 10; +pub const F_DUPFD_CLOEXEC: ::c_int = 16; +pub const F_GETLK64: ::c_int = 11; +pub const F_SETLK64: ::c_int = 12; +pub const F_SETLKW64: ::c_int = 13; +pub const F_DUP2FD: ::c_int = 14; +pub const F_TSTLK: ::c_int = 15; +pub const F_GETLK: ::c_int = F_GETLK64; +pub const F_SETLK: ::c_int = F_SETLK64; +pub const F_SETLKW: ::c_int = F_SETLKW64; +pub const F_GETOWN: ::c_int = 8; +pub const F_SETOWN: ::c_int = 9; +pub const AT_FDCWD: ::c_int = -2; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 1; +pub const AT_SYMLINK_FOLLOW: ::c_int = 2; +pub const AT_REMOVEDIR: ::c_int = 1; +pub const AT_EACCESS: ::c_int = 1; +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const O_SYNC: ::c_int = 16; +pub const O_NONBLOCK: ::c_int = 4; +pub const FASYNC: ::c_int = 0x20000; +pub const POSIX_FADV_NORMAL: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_RANDOM: ::c_int = 3; +pub const POSIX_FADV_WILLNEED: ::c_int = 4; +pub const POSIX_FADV_DONTNEED: ::c_int = 5; +pub const POSIX_FADV_NOREUSE: ::c_int = 6; + +// glob.h +pub const GLOB_APPEND: ::c_int = 0x1; +pub const GLOB_DOOFFS: ::c_int = 0x2; +pub const GLOB_ERR: ::c_int = 0x4; +pub const GLOB_MARK: ::c_int = 0x8; +pub const GLOB_NOCHECK: ::c_int = 0x10; +pub const GLOB_NOSORT: ::c_int = 0x20; +pub const GLOB_NOESCAPE: ::c_int = 0x80; +pub const GLOB_NOSPACE: ::c_int = 0x2000; +pub const GLOB_ABORTED: ::c_int = 0x1000; +pub const GLOB_NOMATCH: ::c_int = 0x4000; +pub const GLOB_NOSYS: ::c_int = 0x8000; + +// langinfo.h +pub const DAY_1: ::nl_item = 13; +pub const DAY_2: ::nl_item = 14; +pub const DAY_3: ::nl_item = 15; +pub const DAY_4: ::nl_item = 16; +pub const DAY_5: ::nl_item = 17; +pub const DAY_6: ::nl_item = 18; +pub const DAY_7: ::nl_item = 19; +pub const ABDAY_1: ::nl_item = 6; +pub const ABDAY_2: ::nl_item = 7; +pub const ABDAY_3: ::nl_item = 8; +pub const ABDAY_4: ::nl_item = 9; +pub const ABDAY_5: ::nl_item = 10; +pub const ABDAY_6: ::nl_item = 11; +pub const ABDAY_7: ::nl_item = 12; +pub const MON_1: ::nl_item = 32; +pub const MON_2: ::nl_item = 33; +pub const MON_3: ::nl_item = 34; +pub const MON_4: ::nl_item = 35; +pub const MON_5: ::nl_item = 36; +pub const MON_6: ::nl_item = 37; +pub const MON_7: ::nl_item = 38; +pub const MON_8: ::nl_item = 39; +pub const MON_9: ::nl_item = 40; +pub const MON_10: ::nl_item = 41; +pub const MON_11: ::nl_item = 42; +pub const MON_12: ::nl_item = 43; +pub const ABMON_1: ::nl_item = 20; +pub const ABMON_2: ::nl_item = 21; +pub const ABMON_3: ::nl_item = 22; +pub const ABMON_4: ::nl_item = 23; +pub const ABMON_5: ::nl_item = 24; +pub const ABMON_6: ::nl_item = 25; +pub const ABMON_7: ::nl_item = 26; +pub const ABMON_8: ::nl_item = 27; +pub const ABMON_9: ::nl_item = 28; +pub const ABMON_10: ::nl_item = 29; +pub const ABMON_11: ::nl_item = 30; +pub const ABMON_12: ::nl_item = 31; +pub const RADIXCHAR: ::nl_item = 44; +pub const THOUSEP: ::nl_item = 45; +pub const YESSTR: ::nl_item = 46; +pub const NOSTR: ::nl_item = 47; +pub const CRNCYSTR: ::nl_item = 48; +pub const D_T_FMT: ::nl_item = 1; +pub const D_FMT: ::nl_item = 2; +pub const T_FMT: ::nl_item = 3; +pub const AM_STR: ::nl_item = 4; +pub const PM_STR: ::nl_item = 5; +pub const CODESET: ::nl_item = 49; +pub const T_FMT_AMPM: ::nl_item = 55; +pub const ERA: ::nl_item = 56; +pub const ERA_D_FMT: ::nl_item = 57; +pub const ERA_D_T_FMT: ::nl_item = 58; +pub const ERA_T_FMT: ::nl_item = 59; +pub const ALT_DIGITS: ::nl_item = 60; +pub const YESEXPR: ::nl_item = 61; +pub const NOEXPR: ::nl_item = 62; + +// locale.h +pub const LC_GLOBAL_LOCALE: ::locale_t = -1isize as ::locale_t; +pub const LC_CTYPE: ::c_int = 1; +pub const LC_NUMERIC: ::c_int = 3; +pub const LC_TIME: ::c_int = 4; +pub const LC_COLLATE: ::c_int = 0; +pub const LC_MONETARY: ::c_int = 2; +pub const LC_MESSAGES: ::c_int = 4; +pub const LC_ALL: ::c_int = -1; +pub const LC_CTYPE_MASK: ::c_int = 2; +pub const LC_NUMERIC_MASK: ::c_int = 16; +pub const LC_TIME_MASK: ::c_int = 32; +pub const LC_COLLATE_MASK: ::c_int = 1; +pub const LC_MONETARY_MASK: ::c_int = 8; +pub const LC_MESSAGES_MASK: ::c_int = 4; +pub const LC_ALL_MASK: ::c_int = LC_CTYPE_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK + | LC_COLLATE_MASK + | LC_MONETARY_MASK + | LC_MESSAGES_MASK; + +// netdb.h +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const NI_MAXSERV: ::socklen_t = 32; +pub const NI_NOFQDN: ::socklen_t = 0x1; +pub const NI_NUMERICHOST: ::socklen_t = 0x2; +pub const NI_NAMEREQD: ::socklen_t = 0x4; +pub const NI_NUMERICSERV: ::socklen_t = 0x8; +pub const NI_DGRAM: ::socklen_t = 0x10; +pub const NI_NUMERICSCOPE: ::socklen_t = 0x40; +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 13; +pub const AI_CANONNAME: ::c_int = 0x01; +pub const AI_PASSIVE: ::c_int = 0x02; +pub const AI_NUMERICHOST: ::c_int = 0x04; +pub const AI_ADDRCONFIG: ::c_int = 0x08; +pub const AI_V4MAPPED: ::c_int = 0x10; +pub const AI_ALL: ::c_int = 0x20; +pub const AI_NUMERICSERV: ::c_int = 0x40; +pub const AI_EXTFLAGS: ::c_int = 0x80; +pub const AI_DEFAULT: ::c_int = AI_V4MAPPED | AI_ADDRCONFIG; +pub const IPV6_ADDRFORM: ::c_int = 22; +pub const IPV6_ADDR_PREFERENCES: ::c_int = 74; +pub const IPV6_CHECKSUM: ::c_int = 39; +pub const IPV6_DONTFRAG: ::c_int = 45; +pub const IPV6_DSTOPTS: ::c_int = 54; +pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 16777215; +pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 251658240; +pub const IPV6_HOPLIMIT: ::c_int = 40; +pub const IPV6_HOPOPTS: ::c_int = 52; +pub const IPV6_NEXTHOP: ::c_int = 48; +pub const IPV6_PATHMTU: ::c_int = 46; +pub const IPV6_PKTINFO: ::c_int = 33; +pub const IPV6_PREFER_SRC_CGA: ::c_int = 16; +pub const IPV6_PREFER_SRC_COA: ::c_int = 2; +pub const IPV6_PREFER_SRC_HOME: ::c_int = 1; +pub const IPV6_PREFER_SRC_NONCGA: ::c_int = 32; +pub const IPV6_PREFER_SRC_PUBLIC: ::c_int = 4; +pub const IPV6_PREFER_SRC_TMP: ::c_int = 8; +pub const IPV6_RECVDSTOPTS: ::c_int = 56; +pub const IPV6_RECVHOPLIMIT: ::c_int = 41; +pub const IPV6_RECVHOPOPTS: ::c_int = 53; +pub const IPV6_RECVPATHMTU: ::c_int = 47; +pub const IPV6_RECVRTHDR: ::c_int = 51; +pub const IPV6_RECVTCLASS: ::c_int = 42; +pub const IPV6_RTHDR: ::c_int = 50; +pub const IPV6_RTHDRDSTOPTS: ::c_int = 55; +pub const IPV6_TCLASS: ::c_int = 43; + +// net/bpf.h +pub const DLT_NULL: ::c_int = 0x18; +pub const DLT_EN10MB: ::c_int = 0x6; +pub const DLT_EN3MB: ::c_int = 0x1a; +pub const DLT_AX25: ::c_int = 0x5; +pub const DLT_PRONET: ::c_int = 0xd; +pub const DLT_IEEE802: ::c_int = 0x7; +pub const DLT_ARCNET: ::c_int = 0x23; +pub const DLT_SLIP: ::c_int = 0x1c; +pub const DLT_PPP: ::c_int = 0x17; +pub const DLT_FDDI: ::c_int = 0xf; +pub const DLT_ATM: ::c_int = 0x25; +pub const DLT_IPOIB: ::c_int = 0xc7; +pub const BIOCSETF: ::c_ulong = 0x80104267; +pub const BIOCGRTIMEOUT: ::c_ulong = 0x4010426e; +pub const BIOCGBLEN: ::c_int = 0x40044266; +pub const BIOCSBLEN: ::c_int = 0xc0044266; +pub const BIOCFLUSH: ::c_int = 0x20004268; +pub const BIOCPROMISC: ::c_int = 0x20004269; +pub const BIOCGDLT: ::c_int = 0x4004426a; +pub const BIOCSRTIMEOUT: ::c_int = 0x8010426d; +pub const BIOCGSTATS: ::c_int = 0x4008426f; +pub const BIOCIMMEDIATE: ::c_int = 0x80044270; +pub const BIOCVERSION: ::c_int = 0x40044271; +pub const BIOCSDEVNO: ::c_int = 0x20004272; +pub const BIOCGETIF: ::c_ulong = 0x4020426b; +pub const BIOCSETIF: ::c_ulong = 0xffffffff8020426c; +pub const BPF_ABS: ::c_int = 32; +pub const BPF_ADD: ::c_int = 0; +pub const BPF_ALIGNMENT: ::c_ulong = 4; +pub const BPF_ALU: ::c_int = 4; +pub const BPF_AND: ::c_int = 80; +pub const BPF_B: ::c_int = 16; +pub const BPF_DIV: ::c_int = 48; +pub const BPF_H: ::c_int = 8; +pub const BPF_IMM: ::c_int = 0; +pub const BPF_IND: ::c_int = 64; +pub const BPF_JA: ::c_int = 0; +pub const BPF_JEQ: ::c_int = 16; +pub const BPF_JGE: ::c_int = 48; +pub const BPF_JGT: ::c_int = 32; +pub const BPF_JMP: ::c_int = 5; +pub const BPF_JSET: ::c_int = 64; +pub const BPF_K: ::c_int = 0; +pub const BPF_LD: ::c_int = 0; +pub const BPF_LDX: ::c_int = 1; +pub const BPF_LEN: ::c_int = 128; +pub const BPF_LSH: ::c_int = 96; +pub const BPF_MAXINSNS: ::c_int = 512; +pub const BPF_MEM: ::c_int = 96; +pub const BPF_MEMWORDS: ::c_int = 16; +pub const BPF_MISC: ::c_int = 7; +pub const BPF_MSH: ::c_int = 160; +pub const BPF_MUL: ::c_int = 32; +pub const BPF_NEG: ::c_int = 128; +pub const BPF_OR: ::c_int = 64; +pub const BPF_RET: ::c_int = 6; +pub const BPF_RSH: ::c_int = 112; +pub const BPF_ST: ::c_int = 2; +pub const BPF_STX: ::c_int = 3; +pub const BPF_SUB: ::c_int = 16; +pub const BPF_W: ::c_int = 0; +pub const BPF_X: ::c_int = 8; + +// net/if.h +pub const IFNET_SLOWHZ: ::c_int = 1; +pub const IFQ_MAXLEN: ::c_int = 50; +pub const IF_NAMESIZE: ::c_int = 16; +pub const IFNAMSIZ: ::c_int = 16; +pub const IFF_UP: ::c_int = 0x1; +pub const IFF_BROADCAST: ::c_int = 0x2; +pub const IFF_DEBUG: ::c_int = 0x4; +pub const IFF_LOOPBACK: ::c_int = 0x8; +pub const IFF_POINTOPOINT: ::c_int = 0x10; +pub const IFF_NOTRAILERS: ::c_int = 0x20; +pub const IFF_RUNNING: ::c_int = 0x40; +pub const IFF_NOARP: ::c_int = 0x80; +pub const IFF_PROMISC: ::c_int = 0x100; +pub const IFF_ALLMULTI: ::c_int = 0x200; +pub const IFF_MULTICAST: ::c_int = 0x80000; +pub const IFF_LINK0: ::c_int = 0x100000; +pub const IFF_LINK1: ::c_int = 0x200000; +pub const IFF_LINK2: ::c_int = 0x400000; +pub const IFF_OACTIVE: ::c_int = 0x400; +pub const IFF_SIMPLEX: ::c_int = 0x800; + +// net/if_arp.h +pub const ARPHRD_ETHER: ::c_int = 1; +pub const ARPHRD_802_5: ::c_int = 6; +pub const ARPHRD_802_3: ::c_int = 6; +pub const ARPHRD_FDDI: ::c_int = 1; +pub const ARPOP_REQUEST: ::c_int = 1; +pub const ARPOP_REPLY: ::c_int = 2; + +// net/route.h +pub const RTM_ADD: ::c_int = 0x1; +pub const RTM_DELETE: ::c_int = 0x2; +pub const RTM_CHANGE: ::c_int = 0x3; +pub const RTM_GET: ::c_int = 0x4; +pub const RTM_LOSING: ::c_int = 0x5; +pub const RTM_REDIRECT: ::c_int = 0x6; +pub const RTM_MISS: ::c_int = 0x7; +pub const RTM_LOCK: ::c_int = 0x8; +pub const RTM_OLDADD: ::c_int = 0x9; +pub const RTM_OLDDEL: ::c_int = 0xa; +pub const RTM_RESOLVE: ::c_int = 0xb; +pub const RTM_NEWADDR: ::c_int = 0xc; +pub const RTM_DELADDR: ::c_int = 0xd; +pub const RTM_IFINFO: ::c_int = 0xe; +pub const RTM_EXPIRE: ::c_int = 0xf; +pub const RTM_RTLOST: ::c_int = 0x10; +pub const RTM_GETNEXT: ::c_int = 0x11; +pub const RTM_SAMEADDR: ::c_int = 0x12; +pub const RTM_SET: ::c_int = 0x13; +pub const RTV_MTU: ::c_int = 0x1; +pub const RTV_HOPCOUNT: ::c_int = 0x2; +pub const RTV_EXPIRE: ::c_int = 0x4; +pub const RTV_RPIPE: ::c_int = 0x8; +pub const RTV_SPIPE: ::c_int = 0x10; +pub const RTV_SSTHRESH: ::c_int = 0x20; +pub const RTV_RTT: ::c_int = 0x40; +pub const RTV_RTTVAR: ::c_int = 0x80; +pub const RTA_DST: ::c_int = 0x1; +pub const RTA_GATEWAY: ::c_int = 0x2; +pub const RTA_NETMASK: ::c_int = 0x4; +pub const RTA_GENMASK: ::c_int = 0x8; +pub const RTA_IFP: ::c_int = 0x10; +pub const RTA_IFA: ::c_int = 0x20; +pub const RTA_AUTHOR: ::c_int = 0x40; +pub const RTA_BRD: ::c_int = 0x80; +pub const RTA_DOWNSTREAM: ::c_int = 0x100; +pub const RTAX_DST: ::c_int = 0; +pub const RTAX_GATEWAY: ::c_int = 1; +pub const RTAX_NETMASK: ::c_int = 2; +pub const RTAX_GENMASK: ::c_int = 3; +pub const RTAX_IFP: ::c_int = 4; +pub const RTAX_IFA: ::c_int = 5; +pub const RTAX_AUTHOR: ::c_int = 6; +pub const RTAX_BRD: ::c_int = 7; +pub const RTAX_MAX: ::c_int = 8; +pub const RTF_UP: ::c_int = 0x1; +pub const RTF_GATEWAY: ::c_int = 0x2; +pub const RTF_HOST: ::c_int = 0x4; +pub const RTF_REJECT: ::c_int = 0x8; +pub const RTF_DYNAMIC: ::c_int = 0x10; +pub const RTF_MODIFIED: ::c_int = 0x20; +pub const RTF_DONE: ::c_int = 0x40; +pub const RTF_MASK: ::c_int = 0x80; +pub const RTF_CLONING: ::c_int = 0x100; +pub const RTF_XRESOLVE: ::c_int = 0x200; +pub const RTF_LLINFO: ::c_int = 0x400; +pub const RTF_STATIC: ::c_int = 0x800; +pub const RTF_BLACKHOLE: ::c_int = 0x1000; +pub const RTF_BUL: ::c_int = 0x2000; +pub const RTF_PROTO2: ::c_int = 0x4000; +pub const RTF_PROTO1: ::c_int = 0x8000; +pub const RTF_CLONE: ::c_int = 0x10000; +pub const RTF_CLONED: ::c_int = 0x20000; +pub const RTF_PROTO3: ::c_int = 0x40000; +pub const RTF_BCE: ::c_int = 0x80000; +pub const RTF_PINNED: ::c_int = 0x100000; +pub const RTF_LOCAL: ::c_int = 0x200000; +pub const RTF_BROADCAST: ::c_int = 0x400000; +pub const RTF_MULTICAST: ::c_int = 0x800000; +pub const RTF_ACTIVE_DGD: ::c_int = 0x1000000; +pub const RTF_STOPSRCH: ::c_int = 0x2000000; +pub const RTF_FREE_IN_PROG: ::c_int = 0x4000000; +pub const RTF_PERMANENT6: ::c_int = 0x8000000; +pub const RTF_UNREACHABLE: ::c_int = 0x10000000; +pub const RTF_CACHED: ::c_int = 0x20000000; +pub const RTF_SMALLMTU: ::c_int = 0x40000; + +// netinet/in.h +pub const IPPROTO_HOPOPTS: ::c_int = 0; +pub const IPPROTO_IGMP: ::c_int = 2; +pub const IPPROTO_GGP: ::c_int = 3; +pub const IPPROTO_IPIP: ::c_int = 4; +pub const IPPROTO_EGP: ::c_int = 8; +pub const IPPROTO_PUP: ::c_int = 12; +pub const IPPROTO_IDP: ::c_int = 22; +pub const IPPROTO_TP: ::c_int = 29; +pub const IPPROTO_ROUTING: ::c_int = 43; +pub const IPPROTO_FRAGMENT: ::c_int = 44; +pub const IPPROTO_QOS: ::c_int = 45; +pub const IPPROTO_RSVP: ::c_int = 46; +pub const IPPROTO_GRE: ::c_int = 47; +pub const IPPROTO_ESP: ::c_int = 50; +pub const IPPROTO_AH: ::c_int = 51; +pub const IPPROTO_NONE: ::c_int = 59; +pub const IPPROTO_DSTOPTS: ::c_int = 60; +pub const IPPROTO_LOCAL: ::c_int = 63; +pub const IPPROTO_EON: ::c_int = 80; +pub const IPPROTO_BIP: ::c_int = 0x53; +pub const IPPROTO_SCTP: ::c_int = 132; +pub const IPPROTO_MH: ::c_int = 135; +pub const IPPROTO_GIF: ::c_int = 140; +pub const IPPROTO_RAW: ::c_int = 255; +pub const IPPROTO_MAX: ::c_int = 256; +pub const IP_OPTIONS: ::c_int = 1; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_TOS: ::c_int = 3; +pub const IP_TTL: ::c_int = 4; +pub const IP_UNICAST_HOPS: ::c_int = 4; +pub const IP_RECVOPTS: ::c_int = 5; +pub const IP_RECVRETOPTS: ::c_int = 6; +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_RETOPTS: ::c_int = 8; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_HOPS: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IP_RECVMACHDR: ::c_int = 14; +pub const IP_RECVIFINFO: ::c_int = 15; +pub const IP_BROADCAST_IF: ::c_int = 16; +pub const IP_DHCPMODE: ::c_int = 17; +pub const IP_RECVIF: ::c_int = 20; +pub const IP_ADDRFORM: ::c_int = 22; +pub const IP_DONTFRAG: ::c_int = 25; +pub const IP_FINDPMTU: ::c_int = 26; +pub const IP_PMTUAGE: ::c_int = 27; +pub const IP_RECVINTERFACE: ::c_int = 32; +pub const IP_RECVTTL: ::c_int = 34; +pub const IP_BLOCK_SOURCE: ::c_int = 58; +pub const IP_UNBLOCK_SOURCE: ::c_int = 59; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 60; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 61; +pub const IP_DEFAULT_MULTICAST_TTL: ::c_int = 1; +pub const IP_DEFAULT_MULTICAST_LOOP: ::c_int = 1; +pub const IP_INC_MEMBERSHIPS: ::c_int = 20; +pub const IP_INIT_MEMBERSHIP: ::c_int = 20; +pub const IPV6_UNICAST_HOPS: ::c_int = IP_TTL; +pub const IPV6_MULTICAST_IF: ::c_int = IP_MULTICAST_IF; +pub const IPV6_MULTICAST_HOPS: ::c_int = IP_MULTICAST_TTL; +pub const IPV6_MULTICAST_LOOP: ::c_int = IP_MULTICAST_LOOP; +pub const IPV6_RECVPKTINFO: ::c_int = 35; +pub const IPV6_V6ONLY: ::c_int = 37; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = IP_ADD_MEMBERSHIP; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = IP_DROP_MEMBERSHIP; +pub const IPV6_JOIN_GROUP: ::c_int = IP_ADD_MEMBERSHIP; +pub const IPV6_LEAVE_GROUP: ::c_int = IP_DROP_MEMBERSHIP; +pub const MCAST_BLOCK_SOURCE: ::c_int = 64; +pub const MCAST_EXCLUDE: ::c_int = 2; +pub const MCAST_INCLUDE: ::c_int = 1; +pub const MCAST_JOIN_GROUP: ::c_int = 62; +pub const MCAST_JOIN_SOURCE_GROUP: ::c_int = 66; +pub const MCAST_LEAVE_GROUP: ::c_int = 63; +pub const MCAST_LEAVE_SOURCE_GROUP: ::c_int = 67; +pub const MCAST_UNBLOCK_SOURCE: ::c_int = 65; + +// netinet/ip.h +pub const MAXTTL: ::c_int = 255; +pub const IPDEFTTL: ::c_int = 64; +pub const IPOPT_CONTROL: ::c_int = 0; +pub const IPOPT_EOL: ::c_int = 0; +pub const IPOPT_LSRR: ::c_int = 131; +pub const IPOPT_MINOFF: ::c_int = 4; +pub const IPOPT_NOP: ::c_int = 1; +pub const IPOPT_OFFSET: ::c_int = 2; +pub const IPOPT_OLEN: ::c_int = 1; +pub const IPOPT_OPTVAL: ::c_int = 0; +pub const IPOPT_RESERVED1: ::c_int = 0x20; +pub const IPOPT_RESERVED2: ::c_int = 0x60; +pub const IPOPT_RR: ::c_int = 7; +pub const IPOPT_SSRR: ::c_int = 137; +pub const IPOPT_TS: ::c_int = 68; +pub const IPOPT_TS_PRESPEC: ::c_int = 3; +pub const IPOPT_TS_TSANDADDR: ::c_int = 1; +pub const IPOPT_TS_TSONLY: ::c_int = 0; +pub const IPTOS_LOWDELAY: ::c_int = 16; +pub const IPTOS_PREC_CRITIC_ECP: ::c_int = 160; +pub const IPTOS_PREC_FLASH: ::c_int = 96; +pub const IPTOS_PREC_FLASHOVERRIDE: ::c_int = 128; +pub const IPTOS_PREC_IMMEDIATE: ::c_int = 64; +pub const IPTOS_PREC_INTERNETCONTROL: ::c_int = 192; +pub const IPTOS_PREC_NETCONTROL: ::c_int = 224; +pub const IPTOS_PREC_PRIORITY: ::c_int = 32; +pub const IPTOS_PREC_ROUTINE: ::c_int = 16; +pub const IPTOS_RELIABILITY: ::c_int = 4; +pub const IPTOS_THROUGHPUT: ::c_int = 8; +pub const IPVERSION: ::c_int = 4; + +// netinet/tcp.h +pub const TCP_NODELAY: ::c_int = 0x1; +pub const TCP_MAXSEG: ::c_int = 0x2; +pub const TCP_RFC1323: ::c_int = 0x4; +pub const TCP_KEEPALIVE: ::c_int = 0x8; +pub const TCP_KEEPIDLE: ::c_int = 0x11; +pub const TCP_KEEPINTVL: ::c_int = 0x12; +pub const TCP_KEEPCNT: ::c_int = 0x13; +pub const TCP_NODELAYACK: ::c_int = 0x14; + +// pthread.h +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 0; +pub const PTHREAD_PROCESS_PRIVATE: ::c_ushort = 1; +pub const PTHREAD_STACK_MIN: ::size_t = PAGESIZE as ::size_t * 4; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 5; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 3; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 4; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const PTHREAD_MUTEX_ROBUST: ::c_int = 1; +pub const PTHREAD_MUTEX_STALLED: ::c_int = 0; +pub const PTHREAD_PRIO_INHERIT: ::c_int = 3; +pub const PTHREAD_PRIO_NONE: ::c_int = 1; +pub const PTHREAD_PRIO_PROTECT: ::c_int = 2; + +// regex.h +pub const REG_EXTENDED: ::c_int = 1; +pub const REG_ICASE: ::c_int = 2; +pub const REG_NEWLINE: ::c_int = 4; +pub const REG_NOSUB: ::c_int = 8; +pub const REG_NOTBOL: ::c_int = 0x100; +pub const REG_NOTEOL: ::c_int = 0x200; +pub const REG_NOMATCH: ::c_int = 1; +pub const REG_BADPAT: ::c_int = 2; +pub const REG_ECOLLATE: ::c_int = 3; +pub const REG_ECTYPE: ::c_int = 4; +pub const REG_EESCAPE: ::c_int = 5; +pub const REG_ESUBREG: ::c_int = 6; +pub const REG_EBRACK: ::c_int = 7; +pub const REG_EPAREN: ::c_int = 8; +pub const REG_EBRACE: ::c_int = 9; +pub const REG_BADBR: ::c_int = 10; +pub const REG_ERANGE: ::c_int = 11; +pub const REG_ESPACE: ::c_int = 12; +pub const REG_BADRPT: ::c_int = 13; +pub const REG_ECHAR: ::c_int = 14; +pub const REG_EBOL: ::c_int = 15; +pub const REG_EEOL: ::c_int = 16; +pub const REG_ENOSYS: ::c_int = 17; + +// rpcsvc/mount.h +pub const NFSMNT_ACDIRMAX: ::c_int = 2048; +pub const NFSMNT_ACDIRMIN: ::c_int = 1024; +pub const NFSMNT_ACREGMAX: ::c_int = 512; +pub const NFSMNT_ACREGMIN: ::c_int = 256; +pub const NFSMNT_INT: ::c_int = 64; +pub const NFSMNT_NOAC: ::c_int = 128; +pub const NFSMNT_RETRANS: ::c_int = 16; +pub const NFSMNT_RSIZE: ::c_int = 4; +pub const NFSMNT_SOFT: ::c_int = 1; +pub const NFSMNT_TIMEO: ::c_int = 8; +pub const NFSMNT_WSIZE: ::c_int = 2; + +// rpcsvc/rstat.h +pub const CPUSTATES: ::c_int = 4; + +// search.h +pub const FIND: ::c_int = 0; +pub const ENTER: ::c_int = 1; + +// semaphore.h +pub const SEM_FAILED: *mut sem_t = -1isize as *mut ::sem_t; + +// spawn.h +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x1; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x2; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x4; +pub const POSIX_SPAWN_SETSCHEDULER: ::c_int = 0x8; +pub const POSIX_SPAWN_SETSCHEDPARAM: ::c_int = 0x10; +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x20; +pub const POSIX_SPAWN_FORK_HANDLERS: ::c_int = 0x1000; + +// stdio.h +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0o000; +pub const _IONBF: ::c_int = 0o004; +pub const _IOLBF: ::c_int = 0o100; +pub const BUFSIZ: ::c_uint = 4096; +pub const FOPEN_MAX: ::c_uint = 32767; +pub const FILENAME_MAX: ::c_uint = 255; +pub const L_tmpnam: ::c_uint = 21; +pub const TMP_MAX: ::c_uint = 16384; + +// stdlib.h +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; + +// sys/access.h +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; + +// sys/aio.h +pub const LIO_NOP: ::c_int = 0; +pub const LIO_READ: ::c_int = 1; +pub const LIO_WRITE: ::c_int = 2; +pub const LIO_NOWAIT: ::c_int = 0; +pub const LIO_WAIT: ::c_int = 1; +pub const AIO_ALLDONE: ::c_int = 2; +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_NOTCANCELED: ::c_int = 1; + +// sys/errno.h +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EDEADLK: ::c_int = 45; +pub const ENOLCK: ::c_int = 49; +pub const ECANCELED: ::c_int = 117; +pub const ENOTSUP: ::c_int = 124; +pub const EPROCLIM: ::c_int = 83; +pub const EDQUOT: ::c_int = 88; +pub const EOWNERDEAD: ::c_int = 95; +pub const ENOTRECOVERABLE: ::c_int = 94; +pub const ENOSTR: ::c_int = 123; +pub const ENODATA: ::c_int = 122; +pub const ETIME: ::c_int = 119; +pub const ENOSR: ::c_int = 118; +pub const EREMOTE: ::c_int = 93; +pub const ENOATTR: ::c_int = 112; +pub const ESAD: ::c_int = 113; +pub const ENOTRUST: ::c_int = 114; +pub const ENOLINK: ::c_int = 126; +pub const EPROTO: ::c_int = 121; +pub const EMULTIHOP: ::c_int = 125; +pub const EBADMSG: ::c_int = 120; +pub const ENAMETOOLONG: ::c_int = 86; +pub const EOVERFLOW: ::c_int = 127; +pub const EILSEQ: ::c_int = 116; +pub const ENOSYS: ::c_int = 109; +pub const ELOOP: ::c_int = 85; +pub const ERESTART: ::c_int = 82; +pub const ENOTEMPTY: ::c_int = 87; +pub const EUSERS: ::c_int = 84; +pub const ENOTSOCK: ::c_int = 57; +pub const EDESTADDRREQ: ::c_int = 58; +pub const EMSGSIZE: ::c_int = 59; +pub const EPROTOTYPE: ::c_int = 60; +pub const ENOPROTOOPT: ::c_int = 61; +pub const EPROTONOSUPPORT: ::c_int = 62; +pub const ESOCKTNOSUPPORT: ::c_int = 63; +pub const EOPNOTSUPP: ::c_int = 64; +pub const EPFNOSUPPORT: ::c_int = 65; +pub const EAFNOSUPPORT: ::c_int = 66; +pub const EADDRINUSE: ::c_int = 67; +pub const EADDRNOTAVAIL: ::c_int = 68; +pub const ENETDOWN: ::c_int = 69; +pub const ENETUNREACH: ::c_int = 70; +pub const ENETRESET: ::c_int = 71; +pub const ECONNABORTED: ::c_int = 72; +pub const ECONNRESET: ::c_int = 73; +pub const ENOBUFS: ::c_int = 74; +pub const EISCONN: ::c_int = 75; +pub const ENOTCONN: ::c_int = 76; +pub const ESHUTDOWN: ::c_int = 77; +pub const ETOOMANYREFS: ::c_int = 115; +pub const ETIMEDOUT: ::c_int = 78; +pub const ECONNREFUSED: ::c_int = 79; +pub const EHOSTDOWN: ::c_int = 80; +pub const EHOSTUNREACH: ::c_int = 81; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EALREADY: ::c_int = 56; +pub const EINPROGRESS: ::c_int = 55; +pub const ESTALE: ::c_int = 52; + +// sys/dr.h +pub const LPAR_INFO_FORMAT1: ::c_int = 1; +pub const LPAR_INFO_FORMAT2: ::c_int = 2; +pub const WPAR_INFO_FORMAT: ::c_int = 3; +pub const PROC_MODULE_INFO: ::c_int = 4; +pub const NUM_PROC_MODULE_TYPES: ::c_int = 5; +pub const LPAR_INFO_VRME_NUM_POOLS: ::c_int = 6; +pub const LPAR_INFO_VRME_POOLS: ::c_int = 7; +pub const LPAR_INFO_VRME_LPAR: ::c_int = 8; +pub const LPAR_INFO_VRME_RESET_HWMARKS: ::c_int = 9; +pub const LPAR_INFO_VRME_ALLOW_DESIRED: ::c_int = 10; +pub const EMTP_INFO_FORMAT: ::c_int = 11; +pub const LPAR_INFO_LPM_CAPABILITY: ::c_int = 12; +pub const ENERGYSCALE_INFO: ::c_int = 13; + +// sys/file.h +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +// sys/flock.h +pub const F_RDLCK: ::c_short = 0o01; +pub const F_WRLCK: ::c_short = 0o02; +pub const F_UNLCK: ::c_short = 0o03; + +// sys/fs/quota_common.h +pub const Q_QUOTAON: ::c_int = 0x100; +pub const Q_QUOTAOFF: ::c_int = 0x200; +pub const Q_SETUSE: ::c_int = 0x500; +pub const Q_SYNC: ::c_int = 0x600; +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQLIM: ::c_int = 0x400; +pub const Q_SETQUOTA: ::c_int = 0x400; + +// sys/ioctl.h +pub const IOCPARM_MASK: ::c_int = 0x7f; +pub const IOC_VOID: ::c_int = 0x20000000; +pub const IOC_OUT: ::c_int = 0x40000000; +pub const IOC_IN: ::c_int = 0x40000000 << 1; +pub const IOC_INOUT: ::c_int = IOC_IN | IOC_OUT; +pub const FIOCLEX: ::c_int = 536897025; +pub const FIONCLEX: ::c_int = 536897026; +pub const FIONREAD: ::c_int = 1074030207; +pub const FIONBIO: ::c_int = -2147195266; +pub const FIOASYNC: ::c_int = -2147195267; +pub const FIOSETOWN: ::c_int = -2147195268; +pub const FIOGETOWN: ::c_int = 1074030203; +pub const TIOCGETD: ::c_int = 0x40047400; +pub const TIOCSETD: ::c_int = 0x80047401; +pub const TIOCHPCL: ::c_int = 0x20007402; +pub const TIOCMODG: ::c_int = 0x40047403; +pub const TIOCMODS: ::c_int = 0x80047404; +pub const TIOCM_LE: ::c_int = 0x1; +pub const TIOCM_DTR: ::c_int = 0x2; +pub const TIOCM_RTS: ::c_int = 0x4; +pub const TIOCM_ST: ::c_int = 0x8; +pub const TIOCM_SR: ::c_int = 0x10; +pub const TIOCM_CTS: ::c_int = 0x20; +pub const TIOCM_CAR: ::c_int = 0x40; +pub const TIOCM_CD: ::c_int = 0x40; +pub const TIOCM_RNG: ::c_int = 0x80; +pub const TIOCM_RI: ::c_int = 0x80; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCGETP: ::c_int = 0x40067408; +pub const TIOCSETP: ::c_int = 0x80067409; +pub const TIOCSETN: ::c_int = 0x8006740a; +pub const TIOCEXCL: ::c_int = 0x2000740d; +pub const TIOCNXCL: ::c_int = 0x2000740e; +pub const TIOCFLUSH: ::c_int = 0x80047410; +pub const TIOCSETC: ::c_int = 0x80067411; +pub const TIOCGETC: ::c_int = 0x40067412; +pub const TANDEM: ::c_int = 0x1; +pub const CBREAK: ::c_int = 0x2; +pub const LCASE: ::c_int = 0x4; +pub const MDMBUF: ::c_int = 0x800000; +pub const XTABS: ::c_int = 0xc00; +pub const SIOCADDMULTI: ::c_int = -2145359567; +pub const SIOCADDRT: ::c_int = -2143784438; +pub const SIOCDARP: ::c_int = -2142476000; +pub const SIOCDELMULTI: ::c_int = -2145359566; +pub const SIOCDELRT: ::c_int = -2143784437; +pub const SIOCDIFADDR: ::c_int = -2144835303; +pub const SIOCGARP: ::c_int = -1068734170; +pub const SIOCGIFADDR: ::c_int = -1071093471; +pub const SIOCGIFBRDADDR: ::c_int = -1071093469; +pub const SIOCGIFCONF: ::c_int = -1072666299; +pub const SIOCGIFDSTADDR: ::c_int = -1071093470; +pub const SIOCGIFFLAGS: ::c_int = -1071093487; +pub const SIOCGIFHWADDR: ::c_int = -1068209771; +pub const SIOCGIFMETRIC: ::c_int = -1071093481; +pub const SIOCGIFMTU: ::c_int = -1071093418; +pub const SIOCGIFNETMASK: ::c_int = -1071093467; +pub const SIOCSARP: ::c_int = -2142476002; +pub const SIOCSIFADDR: ::c_int = -2144835316; +pub const SIOCSIFBRDADDR: ::c_int = -2144835309; +pub const SIOCSIFDSTADDR: ::c_int = -2144835314; +pub const SIOCSIFFLAGS: ::c_int = -2144835312; +pub const SIOCSIFMETRIC: ::c_int = -2144835304; +pub const SIOCSIFMTU: ::c_int = -2144835240; +pub const SIOCSIFNETMASK: ::c_int = -2144835306; +pub const TIOCUCNTL: ::c_int = -2147191706; +pub const TIOCCONS: ::c_int = -2147191710; +pub const TIOCPKT: ::c_int = -2147191696; +pub const TIOCPKT_DATA: ::c_int = 0; +pub const TIOCPKT_FLUSHREAD: ::c_int = 1; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 2; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_START: ::c_int = 8; +pub const TIOCPKT_STOP: ::c_int = 4; + +// sys/ipc.h +pub const IPC_ALLOC: ::c_int = 0o100000; +pub const IPC_CREAT: ::c_int = 0o020000; +pub const IPC_EXCL: ::c_int = 0o002000; +pub const IPC_NOWAIT: ::c_int = 0o004000; +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 101; +pub const IPC_R: ::c_int = 0o0400; +pub const IPC_W: ::c_int = 0o0200; +pub const IPC_O: ::c_int = 0o1000; +pub const IPC_NOERROR: ::c_int = 0o10000; +pub const IPC_STAT: ::c_int = 102; +pub const IPC_PRIVATE: ::key_t = -1; +pub const SHM_LOCK: ::c_int = 201; +pub const SHM_UNLOCK: ::c_int = 202; + +// sys/ldr.h +pub const L_GETINFO: ::c_int = 2; +pub const L_GETMESSAGE: ::c_int = 1; +pub const L_GETLIBPATH: ::c_int = 3; +pub const L_GETXINFO: ::c_int = 8; + +// sys/limits.h +pub const PATH_MAX: ::c_int = 1023; +pub const PAGESIZE: ::c_int = 4096; +pub const IOV_MAX: ::c_int = 16; +pub const AIO_LISTIO_MAX: ::c_int = 4096; +pub const PIPE_BUF: usize = 32768; +pub const OPEN_MAX: ::c_int = 65534; +pub const MAX_INPUT: ::c_int = 512; +pub const MAX_CANON: ::c_int = 256; +pub const ARG_MAX: ::c_int = 1048576; +pub const BC_BASE_MAX: ::c_int = 99; +pub const BC_DIM_MAX: ::c_int = 0x800; +pub const BC_SCALE_MAX: ::c_int = 99; +pub const BC_STRING_MAX: ::c_int = 0x800; +pub const CHARCLASS_NAME_MAX: ::c_int = 14; +pub const CHILD_MAX: ::c_int = 128; +pub const COLL_WEIGHTS_MAX: ::c_int = 4; +pub const EXPR_NEST_MAX: ::c_int = 32; +pub const NZERO: ::c_int = 20; + +// sys/lockf.h +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +// sys/machine.h +pub const BIG_ENDIAN: ::c_int = 4321; +pub const LITTLE_ENDIAN: ::c_int = 1234; +pub const PDP_ENDIAN: ::c_int = 3412; + +// sys/mman.h +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; +pub const MAP_FILE: ::c_int = 0; +pub const MAP_SHARED: ::c_int = 1; +pub const MAP_PRIVATE: ::c_int = 2; +pub const MAP_FIXED: ::c_int = 0x100; +pub const MAP_ANON: ::c_int = 0x10; +pub const MAP_ANONYMOUS: ::c_int = 0x10; +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; +pub const MAP_TYPE: ::c_int = 0xf0; +pub const MCL_CURRENT: ::c_int = 0x100; +pub const MCL_FUTURE: ::c_int = 0x200; +pub const MS_SYNC: ::c_int = 0x20; +pub const MS_ASYNC: ::c_int = 0x10; +pub const MS_INVALIDATE: ::c_int = 0x40; +pub const POSIX_MADV_NORMAL: ::c_int = 1; +pub const POSIX_MADV_RANDOM: ::c_int = 3; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 4; +pub const POSIX_MADV_DONTNEED: ::c_int = 5; +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; + +// sys/mode.h +pub const S_IFMT: mode_t = 0o170000; +pub const S_IFREG: mode_t = 0o100000; +pub const S_IFDIR: mode_t = 0o40000; +pub const S_IFBLK: mode_t = 0o60000; +pub const S_IFCHR: mode_t = 0o20000; +pub const S_IFIFO: mode_t = 0o10000; +pub const S_IRWXU: mode_t = 0o700; +pub const S_IRUSR: mode_t = 0o400; +pub const S_IWUSR: mode_t = 0o200; +pub const S_IXUSR: mode_t = 0o100; +pub const S_IRWXG: mode_t = 0o70; +pub const S_IRGRP: mode_t = 0o40; +pub const S_IWGRP: mode_t = 0o20; +pub const S_IXGRP: mode_t = 0o10; +pub const S_IRWXO: mode_t = 7; +pub const S_IROTH: mode_t = 4; +pub const S_IWOTH: mode_t = 2; +pub const S_IXOTH: mode_t = 1; +pub const S_IFLNK: mode_t = 0o120000; +pub const S_IFSOCK: mode_t = 0o140000; +pub const S_IEXEC: mode_t = 0o100; +pub const S_IWRITE: mode_t = 0o200; +pub const S_IREAD: mode_t = 0o400; + +// sys/msg.h +pub const MSG_NOERROR: ::c_int = 0o10000; + +// sys/m_signal.h +pub const SIGSTKSZ: ::size_t = 4096; +pub const MINSIGSTKSZ: ::size_t = 1200; + +// sys/params.h +pub const MAXPATHLEN: ::c_int = PATH_MAX + 1; +pub const MAXSYMLINKS: ::c_int = 20; +pub const MAXHOSTNAMELEN: ::c_int = 256; +pub const MAXUPRC: ::c_int = 128; +pub const NGROUPS_MAX: ::c_ulong = 2048; +pub const NGROUPS: ::c_ulong = NGROUPS_MAX; +pub const NOFILE: ::c_int = OPEN_MAX; + +// sys/poll.h +pub const POLLIN: ::c_short = 0x0001; +pub const POLLPRI: ::c_short = 0x0004; +pub const POLLOUT: ::c_short = 0x0002; +pub const POLLERR: ::c_short = 0x4000; +pub const POLLHUP: ::c_short = 0x2000; +pub const POLLMSG: ::c_short = 0x0080; +pub const POLLSYNC: ::c_short = 0x8000; +pub const POLLNVAL: ::c_short = POLLSYNC; +pub const POLLNORM: ::c_short = POLLIN; +pub const POLLRDNORM: ::c_short = 0x0010; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLRDBAND: ::c_short = 0x0020; +pub const POLLWRBAND: ::c_short = 0x0040; + +// sys/pollset.h +pub const PS_ADD: ::c_uchar = 0; +pub const PS_MOD: ::c_uchar = 1; +pub const PS_DELETE: ::c_uchar = 2; +pub const PS_REPLACE: ::c_uchar = 3; + +// sys/ptrace.h +pub const PT_TRACE_ME: ::c_int = 0; +pub const PT_READ_I: ::c_int = 1; +pub const PT_READ_D: ::c_int = 2; +pub const PT_WRITE_I: ::c_int = 4; +pub const PT_WRITE_D: ::c_int = 5; +pub const PT_CONTINUE: ::c_int = 7; +pub const PT_KILL: ::c_int = 8; +pub const PT_STEP: ::c_int = 9; +pub const PT_READ_GPR: ::c_int = 11; +pub const PT_READ_FPR: ::c_int = 12; +pub const PT_WRITE_GPR: ::c_int = 14; +pub const PT_WRITE_FPR: ::c_int = 15; +pub const PT_READ_BLOCK: ::c_int = 17; +pub const PT_WRITE_BLOCK: ::c_int = 19; +pub const PT_ATTACH: ::c_int = 30; +pub const PT_DETACH: ::c_int = 31; +pub const PT_REGSET: ::c_int = 32; +pub const PT_REATT: ::c_int = 33; +pub const PT_LDINFO: ::c_int = 34; +pub const PT_MULTI: ::c_int = 35; +pub const PT_NEXT: ::c_int = 36; +pub const PT_SET: ::c_int = 37; +pub const PT_CLEAR: ::c_int = 38; +pub const PT_LDXINFO: ::c_int = 39; +pub const PT_QUERY: ::c_int = 40; +pub const PT_WATCH: ::c_int = 41; +pub const PTT_CONTINUE: ::c_int = 50; +pub const PTT_STEP: ::c_int = 51; +pub const PTT_READ_SPRS: ::c_int = 52; +pub const PTT_WRITE_SPRS: ::c_int = 53; +pub const PTT_READ_GPRS: ::c_int = 54; +pub const PTT_WRITE_GPRS: ::c_int = 55; +pub const PTT_READ_FPRS: ::c_int = 56; +pub const PTT_WRITE_FPRS: ::c_int = 57; +pub const PTT_READ_VEC: ::c_int = 58; +pub const PTT_WRITE_VEC: ::c_int = 59; +pub const PTT_WATCH: ::c_int = 60; +pub const PTT_SET_TRAP: ::c_int = 61; +pub const PTT_CLEAR_TRAP: ::c_int = 62; +pub const PTT_READ_UKEYSET: ::c_int = 63; +pub const PT_GET_UKEY: ::c_int = 64; +pub const PTT_READ_FPSCR_HI: ::c_int = 65; +pub const PTT_WRITE_FPSCR_HI: ::c_int = 66; +pub const PTT_READ_VSX: ::c_int = 67; +pub const PTT_WRITE_VSX: ::c_int = 68; +pub const PTT_READ_TM: ::c_int = 69; +pub const PTRACE_ATTACH: ::c_int = 14; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_DETACH: ::c_int = 15; +pub const PTRACE_GETFPREGS: ::c_int = 12; +pub const PTRACE_GETREGS: ::c_int = 10; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_SETFPREGS: ::c_int = 13; +pub const PTRACE_SETREGS: ::c_int = 11; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_SYSCALL: ::c_int = 16; +pub const PTRACE_TRACEME: ::c_int = 0; + +// sys/resource.h +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_AS: ::c_int = 6; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_THREADS: ::c_int = 8; +pub const RLIMIT_NPROC: ::c_int = 9; +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; +pub const RUSAGE_THREAD: ::c_int = 1; +pub const RLIM_SAVED_MAX: ::c_ulong = RLIM_INFINITY - 1; +pub const RLIM_SAVED_CUR: ::c_ulong = RLIM_INFINITY - 2; +pub const RLIM_NLIMITS: ::c_int = 10; + +// sys/sched.h +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_LOCAL: ::c_int = 3; +pub const SCHED_GLOBAL: ::c_int = 4; +pub const SCHED_FIFO2: ::c_int = 5; +pub const SCHED_FIFO3: ::c_int = 6; +pub const SCHED_FIFO4: ::c_int = 7; + +// sys/sem.h +pub const SEM_UNDO: ::c_int = 0o10000; +pub const GETNCNT: ::c_int = 3; +pub const GETPID: ::c_int = 4; +pub const GETVAL: ::c_int = 5; +pub const GETALL: ::c_int = 6; +pub const GETZCNT: ::c_int = 7; +pub const SETVAL: ::c_int = 8; +pub const SETALL: ::c_int = 9; + +// sys/shm.h +pub const SHMLBA: ::c_int = 0x10000000; +pub const SHMLBA_EXTSHM: ::c_int = 0x1000; +pub const SHM_SHMAT: ::c_int = 0x80000000; +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_PIN: ::c_int = 0o4000; +pub const SHM_LGPAGE: ::c_int = 0o20000000000; +pub const SHM_MAP: ::c_int = 0o4000; +pub const SHM_FMAP: ::c_int = 0o2000; +pub const SHM_COPY: ::c_int = 0o40000; +pub const SHM_CLEAR: ::c_int = 0; +pub const SHM_HGSEG: ::c_int = 0o10000000000; +pub const SHM_R: ::c_int = IPC_R; +pub const SHM_W: ::c_int = IPC_W; +pub const SHM_DEST: ::c_int = 0o2000; + +// sys/signal.h +pub const SA_ONSTACK: ::c_int = 0x00000001; +pub const SA_RESETHAND: ::c_int = 0x00000002; +pub const SA_RESTART: ::c_int = 0x00000008; +pub const SA_SIGINFO: ::c_int = 0x00000100; +pub const SA_NODEFER: ::c_int = 0x00000200; +pub const SA_NOCLDWAIT: ::c_int = 0x00000400; +pub const SA_NOCLDSTOP: ::c_int = 0x00000004; +pub const SS_ONSTACK: ::c_int = 0x00000001; +pub const SS_DISABLE: ::c_int = 0x00000002; +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_SIGNAL: ::c_int = 2; +pub const SIGEV_THREAD: ::c_int = 3; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGSYS: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGPWR: ::c_int = 29; +pub const SIGWINCH: ::c_int = 28; +pub const SIGURG: ::c_int = 16; +pub const SIGPOLL: ::c_int = SIGIO; +pub const SIGIO: ::c_int = 23; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGCONT: ::c_int = 19; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGVTALRM: ::c_int = 34; +pub const SIGPROF: ::c_int = 32; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGTRAP: ::c_int = 5; +pub const SIGCLD: ::c_int = 20; +pub const SIGRTMAX: ::c_int = 57; +pub const SIGRTMIN: ::c_int = 50; +pub const SI_USER: ::c_int = 0; +pub const SI_UNDEFINED: ::c_int = 8; +pub const SI_EMPTY: ::c_int = 9; +pub const BUS_ADRALN: ::c_int = 1; +pub const BUS_ADRERR: ::c_int = 2; +pub const BUS_OBJERR: ::c_int = 3; +pub const BUS_UEGARD: ::c_int = 4; +pub const CLD_EXITED: ::c_int = 10; +pub const CLD_KILLED: ::c_int = 11; +pub const CLD_DUMPED: ::c_int = 12; +pub const CLD_TRAPPED: ::c_int = 13; +pub const CLD_STOPPED: ::c_int = 14; +pub const CLD_CONTINUED: ::c_int = 15; +pub const FPE_INTDIV: ::c_int = 20; +pub const FPE_INTOVF: ::c_int = 21; +pub const FPE_FLTDIV: ::c_int = 22; +pub const FPE_FLTOVF: ::c_int = 23; +pub const FPE_FLTUND: ::c_int = 24; +pub const FPE_FLTRES: ::c_int = 25; +pub const FPE_FLTINV: ::c_int = 26; +pub const FPE_FLTSUB: ::c_int = 27; +pub const ILL_ILLOPC: ::c_int = 30; +pub const ILL_ILLOPN: ::c_int = 31; +pub const ILL_ILLADR: ::c_int = 32; +pub const ILL_ILLTRP: ::c_int = 33; +pub const ILL_PRVOPC: ::c_int = 34; +pub const ILL_PRVREG: ::c_int = 35; +pub const ILL_COPROC: ::c_int = 36; +pub const ILL_BADSTK: ::c_int = 37; +pub const ILL_TMBADTHING: ::c_int = 38; +pub const POLL_IN: ::c_int = 40; +pub const POLL_OUT: ::c_int = 41; +pub const POLL_MSG: ::c_int = -3; +pub const POLL_ERR: ::c_int = 43; +pub const POLL_PRI: ::c_int = 44; +pub const POLL_HUP: ::c_int = 45; +pub const SEGV_MAPERR: ::c_int = 50; +pub const SEGV_ACCERR: ::c_int = 51; +pub const SEGV_KEYERR: ::c_int = 52; +pub const TRAP_BRKPT: ::c_int = 60; +pub const TRAP_TRACE: ::c_int = 61; +pub const SI_QUEUE: ::c_int = 71; +pub const SI_TIMER: ::c_int = 72; +pub const SI_ASYNCIO: ::c_int = 73; +pub const SI_MESGQ: ::c_int = 74; + +// sys/socket.h +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const SO_TIMESTAMPNS: ::c_int = 0x100a; +pub const SOMAXCONN: ::c_int = 1024; +pub const AF_LOCAL: ::c_int = AF_UNIX; +pub const UIO_MAXIOV: ::c_int = 1024; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const AF_INET6: ::c_int = 24; +pub const AF_INTF: ::c_int = 20; +pub const AF_RIF: ::c_int = 21; +pub const AF_NDD: ::c_int = 23; +pub const AF_MAX: ::c_int = 30; +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = 19; +pub const PF_RIF: ::c_int = AF_RIF; +pub const PF_INTF: ::c_int = AF_INTF; +pub const PF_NDD: ::c_int = AF_NDD; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_MAX: ::c_int = AF_MAX; +pub const SF_CLOSE: ::c_int = 1; +pub const SF_REUSE: ::c_int = 2; +pub const SF_DONT_CACHE: ::c_int = 4; +pub const SF_SYNC_CACHE: ::c_int = 8; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_USE_IFBUFS: ::c_int = 0x0400; +pub const SO_CKSUMRECV: ::c_int = 0x0800; +pub const SO_NOREUSEADDR: ::c_int = 0x1000; +pub const SO_KERNACCEPT: ::c_int = 0x2000; +pub const SO_NOMULTIPATH: ::c_int = 0x4000; +pub const SO_AUDIT: ::c_int = 0x8000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_MPEG2: ::c_int = 0x80; +pub const MSG_NOSIGNAL: ::c_int = 0x100; +pub const MSG_WAITFORONE: ::c_int = 0x200; +pub const MSG_ARGEXT: ::c_int = 0x400; +pub const MSG_NONBLOCK: ::c_int = 0x4000; +pub const MSG_COMPAT: ::c_int = 0x8000; +pub const MSG_MAXIOVLEN: ::c_int = 16; +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +// sys/stat.h +pub const UTIME_NOW: ::c_int = -2; +pub const UTIME_OMIT: ::c_int = -3; + +// sys/statvfs.h +pub const ST_RDONLY: ::c_ulong = 0x0001; +pub const ST_NOSUID: ::c_ulong = 0x0040; +pub const ST_NODEV: ::c_ulong = 0x0080; + +// sys/stropts.h +pub const I_NREAD: ::c_int = 0x20005301; +pub const I_PUSH: ::c_int = 0x20005302; +pub const I_POP: ::c_int = 0x20005303; +pub const I_LOOK: ::c_int = 0x20005304; +pub const I_FLUSH: ::c_int = 0x20005305; +pub const I_SRDOPT: ::c_int = 0x20005306; +pub const I_GRDOPT: ::c_int = 0x20005307; +pub const I_STR: ::c_int = 0x20005308; +pub const I_SETSIG: ::c_int = 0x20005309; +pub const I_GETSIG: ::c_int = 0x2000530a; +pub const I_FIND: ::c_int = 0x2000530b; +pub const I_LINK: ::c_int = 0x2000530c; +pub const I_UNLINK: ::c_int = 0x2000530d; +pub const I_PEEK: ::c_int = 0x2000530f; +pub const I_FDINSERT: ::c_int = 0x20005310; +pub const I_SENDFD: ::c_int = 0x20005311; +pub const I_RECVFD: ::c_int = 0x20005312; +pub const I_SWROPT: ::c_int = 0x20005314; +pub const I_GWROPT: ::c_int = 0x20005315; +pub const I_LIST: ::c_int = 0x20005316; +pub const I_PLINK: ::c_int = 0x2000531d; +pub const I_PUNLINK: ::c_int = 0x2000531e; +pub const I_FLUSHBAND: ::c_int = 0x20005313; +pub const I_CKBAND: ::c_int = 0x20005318; +pub const I_GETBAND: ::c_int = 0x20005319; +pub const I_ATMARK: ::c_int = 0x20005317; +pub const I_SETCLTIME: ::c_int = 0x2000531b; +pub const I_GETCLTIME: ::c_int = 0x2000531c; +pub const I_CANPUT: ::c_int = 0x2000531a; + +// sys/syslog.h +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_NFACILITIES: ::c_int = 24; +pub const LOG_PERROR: ::c_int = 0x20; + +// sys/systemcfg.h +pub const SC_ARCH: ::c_int = 1; +pub const SC_IMPL: ::c_int = 2; +pub const SC_VERS: ::c_int = 3; +pub const SC_WIDTH: ::c_int = 4; +pub const SC_NCPUS: ::c_int = 5; +pub const SC_L1C_ATTR: ::c_int = 6; +pub const SC_L1C_ISZ: ::c_int = 7; +pub const SC_L1C_DSZ: ::c_int = 8; +pub const SC_L1C_ICA: ::c_int = 9; +pub const SC_L1C_DCA: ::c_int = 10; +pub const SC_L1C_IBS: ::c_int = 11; +pub const SC_L1C_DBS: ::c_int = 12; +pub const SC_L1C_ILS: ::c_int = 13; +pub const SC_L1C_DLS: ::c_int = 14; +pub const SC_L2C_SZ: ::c_int = 15; +pub const SC_L2C_AS: ::c_int = 16; +pub const SC_TLB_ATTR: ::c_int = 17; +pub const SC_ITLB_SZ: ::c_int = 18; +pub const SC_DTLB_SZ: ::c_int = 19; +pub const SC_ITLB_ATT: ::c_int = 20; +pub const SC_DTLB_ATT: ::c_int = 21; +pub const SC_RESRV_SZ: ::c_int = 22; +pub const SC_PRI_LC: ::c_int = 23; +pub const SC_PRO_LC: ::c_int = 24; +pub const SC_RTC_TYPE: ::c_int = 25; +pub const SC_VIRT_AL: ::c_int = 26; +pub const SC_CAC_CONG: ::c_int = 27; +pub const SC_MOD_ARCH: ::c_int = 28; +pub const SC_MOD_IMPL: ::c_int = 29; +pub const SC_XINT: ::c_int = 30; +pub const SC_XFRAC: ::c_int = 31; +pub const SC_KRN_ATTR: ::c_int = 32; +pub const SC_PHYSMEM: ::c_int = 33; +pub const SC_SLB_ATTR: ::c_int = 34; +pub const SC_SLB_SZ: ::c_int = 35; +pub const SC_MAX_NCPUS: ::c_int = 37; +pub const SC_MAX_REALADDR: ::c_int = 38; +pub const SC_ORIG_ENT_CAP: ::c_int = 39; +pub const SC_ENT_CAP: ::c_int = 40; +pub const SC_DISP_WHE: ::c_int = 41; +pub const SC_CAPINC: ::c_int = 42; +pub const SC_VCAPW: ::c_int = 43; +pub const SC_SPLP_STAT: ::c_int = 44; +pub const SC_SMT_STAT: ::c_int = 45; +pub const SC_SMT_TC: ::c_int = 46; +pub const SC_VMX_VER: ::c_int = 47; +pub const SC_LMB_SZ: ::c_int = 48; +pub const SC_MAX_XCPU: ::c_int = 49; +pub const SC_EC_LVL: ::c_int = 50; +pub const SC_AME_STAT: ::c_int = 51; +pub const SC_ECO_STAT: ::c_int = 52; +pub const SC_DFP_VER: ::c_int = 53; +pub const SC_VRM_STAT: ::c_int = 54; +pub const SC_PHYS_IMP: ::c_int = 55; +pub const SC_PHYS_VER: ::c_int = 56; +pub const SC_SPCM_STATUS: ::c_int = 57; +pub const SC_SPCM_MAX: ::c_int = 58; +pub const SC_TM_VER: ::c_int = 59; +pub const SC_NX_CAP: ::c_int = 60; +pub const SC_PKS_STATE: ::c_int = 61; +pub const SC_MMA_VER: ::c_int = 62; +pub const POWER_RS: ::c_int = 1; +pub const POWER_PC: ::c_int = 2; +pub const IA64: ::c_int = 3; +pub const POWER_RS1: ::c_int = 0x1; +pub const POWER_RSC: ::c_int = 0x2; +pub const POWER_RS2: ::c_int = 0x4; +pub const POWER_601: ::c_int = 0x8; +pub const POWER_604: ::c_int = 0x10; +pub const POWER_603: ::c_int = 0x20; +pub const POWER_620: ::c_int = 0x40; +pub const POWER_630: ::c_int = 0x80; +pub const POWER_A35: ::c_int = 0x100; +pub const POWER_RS64II: ::c_int = 0x200; +pub const POWER_RS64III: ::c_int = 0x400; +pub const POWER_4: ::c_int = 0x800; +pub const POWER_RS64IV: ::c_int = POWER_4; +pub const POWER_MPC7450: ::c_int = 0x1000; +pub const POWER_5: ::c_int = 0x2000; +pub const POWER_6: ::c_int = 0x4000; +pub const POWER_7: ::c_int = 0x8000; +pub const POWER_8: ::c_int = 0x10000; +pub const POWER_9: ::c_int = 0x20000; + +// sys/time.h +pub const FD_SETSIZE: usize = 65534; +pub const TIMEOFDAY: ::c_int = 9; +pub const CLOCK_REALTIME: ::clockid_t = TIMEOFDAY as clockid_t; +pub const CLOCK_MONOTONIC: ::clockid_t = 10; +pub const TIMER_ABSTIME: ::c_int = 999; +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; +pub const ITIMER_VIRT: ::c_int = 3; +pub const ITIMER_REAL1: ::c_int = 20; +pub const ITIMER_REAL_TH: ::c_int = ITIMER_REAL1; +pub const DST_AUST: ::c_int = 2; +pub const DST_CAN: ::c_int = 6; +pub const DST_EET: ::c_int = 5; +pub const DST_MET: ::c_int = 4; +pub const DST_NONE: ::c_int = 0; +pub const DST_USA: ::c_int = 1; +pub const DST_WET: ::c_int = 3; + +// sys/termio.h +pub const CSTART: ::tcflag_t = 0o21; +pub const CSTOP: ::tcflag_t = 0o23; +pub const TCGETA: ::c_int = TIOC | 5; +pub const TCSETA: ::c_int = TIOC | 6; +pub const TCSETAW: ::c_int = TIOC | 7; +pub const TCSETAF: ::c_int = TIOC | 8; +pub const TCSBRK: ::c_int = TIOC | 9; +pub const TCXONC: ::c_int = TIOC | 11; +pub const TCFLSH: ::c_int = TIOC | 12; +pub const TCGETS: ::c_int = TIOC | 1; +pub const TCSETS: ::c_int = TIOC | 2; +pub const TCSANOW: ::c_int = 0; +pub const TCSETSW: ::c_int = TIOC | 3; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSETSF: ::c_int = TIOC | 4; +pub const TCSAFLUSH: ::c_int = 2; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; +pub const TIOC: ::c_int = 0x5400; +pub const TIOCGWINSZ: ::c_int = 0x40087468; +pub const TIOCSWINSZ: ::c_int = 0x80087467; +pub const TIOCLBIS: ::c_int = 0x8004747f; +pub const TIOCLBIC: ::c_int = 0x8004747e; +pub const TIOCLSET: ::c_int = 0x8004747d; +pub const TIOCLGET: ::c_int = 0x4004747c; +pub const TIOCSBRK: ::c_int = 0x2000747b; +pub const TIOCCBRK: ::c_int = 0x2000747a; +pub const TIOCSDTR: ::c_int = 0x20007479; +pub const TIOCCDTR: ::c_int = 0x20007478; +pub const TIOCSLTC: ::c_int = 0x80067475; +pub const TIOCGLTC: ::c_int = 0x40067474; +pub const TIOCOUTQ: ::c_int = 0x40047473; +pub const TIOCNOTTY: ::c_int = 0x20007471; +pub const TIOCSTOP: ::c_int = 0x2000746f; +pub const TIOCSTART: ::c_int = 0x2000746e; +pub const TIOCGPGRP: ::c_int = 0x40047477; +pub const TIOCSPGRP: ::c_int = 0x80047476; +pub const TIOCGSID: ::c_int = 0x40047448; +pub const TIOCSTI: ::c_int = 0x80017472; +pub const TIOCMSET: ::c_int = 0x8004746d; +pub const TIOCMBIS: ::c_int = 0x8004746c; +pub const TIOCMBIC: ::c_int = 0x8004746b; +pub const TIOCMGET: ::c_int = 0x4004746a; +pub const TIOCREMOTE: ::c_int = 0x80047469; + +// sys/user.h +pub const MAXCOMLEN: ::c_int = 32; +pub const UF_SYSTEM: ::c_int = 0x1000; + +// sys/vattr.h +pub const AT_FLAGS: ::c_int = 0x80; +pub const AT_GID: ::c_int = 8; +pub const AT_UID: ::c_int = 4; + +// sys/wait.h +pub const P_ALL: ::c_int = 0; +pub const P_PID: ::c_int = 1; +pub const P_PGID: ::c_int = 2; +pub const WNOHANG: ::c_int = 0x1; +pub const WUNTRACED: ::c_int = 0x2; +pub const WEXITED: ::c_int = 0x04; +pub const WCONTINUED: ::c_int = 0x01000000; +pub const WNOWAIT: ::c_int = 0x10; +pub const WSTOPPED: ::c_int = _W_STOPPED; +pub const _W_STOPPED: ::c_int = 0x00000040; +pub const _W_SLWTED: ::c_int = 0x0000007c; +pub const _W_SEWTED: ::c_int = 0x0000007d; +pub const _W_SFWTED: ::c_int = 0x0000007e; +pub const _W_STRC: ::c_int = 0x0000007f; + +// termios.h +pub const NCCS: usize = 16; +pub const OLCUC: ::tcflag_t = 2; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const ECHO: ::tcflag_t = 0x20000; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOCTL: ::tcflag_t = 0x00020000; +pub const ECHOPRT: ::tcflag_t = 0x00040000; +pub const ECHOKE: ::tcflag_t = 0x00080000; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXON: ::tcflag_t = 0x0001; +pub const IXOFF: ::tcflag_t = 0x00000400; +pub const IXANY: ::tcflag_t = 0x00001000; +pub const IMAXBEL: ::tcflag_t = 0x00010000; +pub const OPOST: ::tcflag_t = 0x00000001; +pub const ONLCR: ::tcflag_t = 0x00000004; +pub const OCRNL: ::tcflag_t = 0x00000008; +pub const ONOCR: ::tcflag_t = 0x00000010; +pub const ONLRET: ::tcflag_t = 0x00000020; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const IEXTEN: ::tcflag_t = 0x00200000; +pub const TOSTOP: ::tcflag_t = 0x00010000; +pub const FLUSHO: ::tcflag_t = 0x00100000; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VEOF: usize = 4; +pub const VEOL: usize = 5; +pub const VSTART: usize = 7; +pub const VSTOP: usize = 8; +pub const VSUSP: usize = 9; +pub const VMIN: usize = 4; +pub const VTIME: usize = 5; +pub const VEOL2: usize = 6; +pub const VDSUSP: usize = 10; +pub const VREPRINT: usize = 11; +pub const VDISCRD: usize = 12; +pub const VWERSE: usize = 13; +pub const VLNEXT: usize = 14; +pub const B0: ::speed_t = 0x0; +pub const B50: ::speed_t = 0x1; +pub const B75: ::speed_t = 0x2; +pub const B110: ::speed_t = 0x3; +pub const B134: ::speed_t = 0x4; +pub const B150: ::speed_t = 0x5; +pub const B200: ::speed_t = 0x6; +pub const B300: ::speed_t = 0x7; +pub const B600: ::speed_t = 0x8; +pub const B1200: ::speed_t = 0x9; +pub const B1800: ::speed_t = 0xa; +pub const B2400: ::speed_t = 0xb; +pub const B4800: ::speed_t = 0xc; +pub const B9600: ::speed_t = 0xd; +pub const B19200: ::speed_t = 0xe; +pub const B38400: ::speed_t = 0xf; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const IUCLC: ::tcflag_t = 0x00000800; +pub const OFILL: ::tcflag_t = 0x00000040; +pub const OFDEL: ::tcflag_t = 0x00000080; +pub const CRDLY: ::tcflag_t = 0x00000300; +pub const CR0: ::tcflag_t = 0x00000000; +pub const CR1: ::tcflag_t = 0x00000100; +pub const CR2: ::tcflag_t = 0x00000200; +pub const CR3: ::tcflag_t = 0x00000300; +pub const TABDLY: ::tcflag_t = 0x00000c00; +pub const TAB0: ::tcflag_t = 0x00000000; +pub const TAB1: ::tcflag_t = 0x00000400; +pub const TAB2: ::tcflag_t = 0x00000800; +pub const TAB3: ::tcflag_t = 0x00000c00; +pub const BSDLY: ::tcflag_t = 0x00001000; +pub const BS0: ::tcflag_t = 0x00000000; +pub const BS1: ::tcflag_t = 0x00001000; +pub const FFDLY: ::tcflag_t = 0x00002000; +pub const FF0: ::tcflag_t = 0x00000000; +pub const FF1: ::tcflag_t = 0x00002000; +pub const NLDLY: ::tcflag_t = 0x00004000; +pub const NL0: ::tcflag_t = 0x00000000; +pub const NL1: ::tcflag_t = 0x00004000; +pub const VTDLY: ::tcflag_t = 0x00008000; +pub const VT0: ::tcflag_t = 0x00000000; +pub const VT1: ::tcflag_t = 0x00008000; +pub const OXTABS: ::tcflag_t = 0x00040000; +pub const ONOEOT: ::tcflag_t = 0x00080000; +pub const CBAUD: ::tcflag_t = 0x0000000f; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const CIBAUD: ::tcflag_t = 0x000f0000; +pub const IBSHIFT: ::tcflag_t = 16; +pub const PAREXT: ::tcflag_t = 0x00100000; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const XCASE: ::tcflag_t = 0x00000004; +pub const ALTWERASE: ::tcflag_t = 0x00400000; + +// time.h +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 11; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 12; + +// unistd.h +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const _POSIX_VDISABLE: ::c_int = 0xff; +pub const _PC_LINK_MAX: ::c_int = 11; +pub const _PC_MAX_CANON: ::c_int = 12; +pub const _PC_MAX_INPUT: ::c_int = 13; +pub const _PC_NAME_MAX: ::c_int = 14; +pub const _PC_PATH_MAX: ::c_int = 16; +pub const _PC_PIPE_BUF: ::c_int = 17; +pub const _PC_NO_TRUNC: ::c_int = 15; +pub const _PC_VDISABLE: ::c_int = 18; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 10; +pub const _PC_ASYNC_IO: ::c_int = 19; +pub const _PC_PRIO_IO: ::c_int = 21; +pub const _PC_SYNC_IO: ::c_int = 20; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 26; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 27; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 28; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 29; +pub const _PC_REC_XFER_ALIGN: ::c_int = 30; +pub const _PC_SYMLINK_MAX: ::c_int = 25; +pub const _PC_2_SYMLINKS: ::c_int = 31; +pub const _PC_TIMESTAMP_RESOLUTION: ::c_int = 32; +pub const _PC_FILESIZEBITS: ::c_int = 22; +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_JOB_CONTROL: ::c_int = 7; +pub const _SC_SAVED_IDS: ::c_int = 8; +pub const _SC_VERSION: ::c_int = 9; +pub const _SC_PASS_MAX: ::c_int = 45; +pub const _SC_PAGESIZE: ::c_int = _SC_PAGE_SIZE; +pub const _SC_PAGE_SIZE: ::c_int = 48; +pub const _SC_XOPEN_VERSION: ::c_int = 46; +pub const _SC_NPROCESSORS_CONF: ::c_int = 71; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 72; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 75; +pub const _SC_AIO_MAX: ::c_int = 76; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 77; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 78; +pub const _SC_DELAYTIMER_MAX: ::c_int = 79; +pub const _SC_FSYNC: ::c_int = 80; +pub const _SC_MAPPED_FILES: ::c_int = 84; +pub const _SC_MEMLOCK: ::c_int = 85; +pub const _SC_MEMLOCK_RANGE: ::c_int = 86; +pub const _SC_MEMORY_PROTECTION: ::c_int = 87; +pub const _SC_MESSAGE_PASSING: ::c_int = 88; +pub const _SC_MQ_OPEN_MAX: ::c_int = 89; +pub const _SC_MQ_PRIO_MAX: ::c_int = 90; +pub const _SC_PRIORITIZED_IO: ::c_int = 91; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 92; +pub const _SC_REALTIME_SIGNALS: ::c_int = 93; +pub const _SC_RTSIG_MAX: ::c_int = 94; +pub const _SC_SEMAPHORES: ::c_int = 95; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 96; +pub const _SC_SEM_VALUE_MAX: ::c_int = 97; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 98; +pub const _SC_SIGQUEUE_MAX: ::c_int = 99; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 100; +pub const _SC_TIMERS: ::c_int = 102; +pub const _SC_TIMER_MAX: ::c_int = 103; +pub const _SC_2_C_BIND: ::c_int = 51; +pub const _SC_2_C_DEV: ::c_int = 32; +pub const _SC_2_C_VERSION: ::c_int = 52; +pub const _SC_2_FORT_DEV: ::c_int = 33; +pub const _SC_2_FORT_RUN: ::c_int = 34; +pub const _SC_2_LOCALEDEF: ::c_int = 35; +pub const _SC_2_SW_DEV: ::c_int = 36; +pub const _SC_2_UPE: ::c_int = 53; +pub const _SC_2_VERSION: ::c_int = 31; +pub const _SC_BC_BASE_MAX: ::c_int = 23; +pub const _SC_BC_DIM_MAX: ::c_int = 24; +pub const _SC_BC_SCALE_MAX: ::c_int = 25; +pub const _SC_BC_STRING_MAX: ::c_int = 26; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 50; +pub const _SC_EXPR_NEST_MAX: ::c_int = 28; +pub const _SC_LINE_MAX: ::c_int = 29; +pub const _SC_RE_DUP_MAX: ::c_int = 30; +pub const _SC_XOPEN_CRYPT: ::c_int = 56; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 57; +pub const _SC_XOPEN_SHM: ::c_int = 55; +pub const _SC_2_CHAR_TERM: ::c_int = 54; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 109; +pub const _SC_ATEXIT_MAX: ::c_int = 47; +pub const _SC_IOV_MAX: ::c_int = 58; +pub const _SC_XOPEN_UNIX: ::c_int = 73; +pub const _SC_T_IOV_MAX: ::c_int = 0; +pub const _SC_PHYS_PAGES: ::c_int = 113; +pub const _SC_AVPHYS_PAGES: ::c_int = 114; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 101; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 81; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 82; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 83; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 68; +pub const _SC_THREAD_STACK_MIN: ::c_int = 69; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 70; +pub const _SC_TTY_NAME_MAX: ::c_int = 104; +pub const _SC_THREADS: ::c_int = 60; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 61; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 62; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 64; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 65; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 66; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 67; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 59; +pub const _SC_XOPEN_LEGACY: ::c_int = 112; +pub const _SC_XOPEN_REALTIME: ::c_int = 110; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 111; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 105; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 106; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 107; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 108; +pub const _SC_2_PBS: ::c_int = 132; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 133; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 134; +pub const _SC_2_PBS_LOCATE: ::c_int = 135; +pub const _SC_2_PBS_MESSAGE: ::c_int = 136; +pub const _SC_2_PBS_TRACK: ::c_int = 137; +pub const _SC_ADVISORY_INFO: ::c_int = 130; +pub const _SC_BARRIERS: ::c_int = 138; +pub const _SC_CLOCK_SELECTION: ::c_int = 139; +pub const _SC_CPUTIME: ::c_int = 140; +pub const _SC_HOST_NAME_MAX: ::c_int = 126; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 141; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 142; +pub const _SC_REGEXP: ::c_int = 127; +pub const _SC_SHELL: ::c_int = 128; +pub const _SC_SPAWN: ::c_int = 143; +pub const _SC_SPIN_LOCKS: ::c_int = 144; +pub const _SC_SPORADIC_SERVER: ::c_int = 145; +pub const _SC_SS_REPL_MAX: ::c_int = 156; +pub const _SC_SYMLOOP_MAX: ::c_int = 129; +pub const _SC_THREAD_CPUTIME: ::c_int = 146; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 147; +pub const _SC_TIMEOUTS: ::c_int = 148; +pub const _SC_TRACE: ::c_int = 149; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 150; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 157; +pub const _SC_TRACE_INHERIT: ::c_int = 151; +pub const _SC_TRACE_LOG: ::c_int = 152; +pub const _SC_TRACE_NAME_MAX: ::c_int = 158; +pub const _SC_TRACE_SYS_MAX: ::c_int = 159; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 160; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 153; +pub const _SC_V6_ILP32_OFF32: ::c_int = 121; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 122; +pub const _SC_V6_LP64_OFF64: ::c_int = 123; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 124; +pub const _SC_XOPEN_STREAMS: ::c_int = 125; +pub const _SC_IPV6: ::c_int = 154; +pub const _SC_RAW_SOCKETS: ::c_int = 155; + +// utmp.h +pub const EMPTY: ::c_short = -1; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; + +f! { + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { + if cmsg.is_null() { + CMSG_FIRSTHDR(mhdr) + } else { + if (cmsg as usize + (*cmsg).cmsg_len as usize + ::mem::size_of::<::cmsghdr>()) > + ((*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize) { + 0 as *mut ::cmsghdr + } else { + // AIX does not have any alignment/padding for ancillary data, so we don't need _CMSG_ALIGN here. + (cmsg as usize + (*cmsg).cmsg_len as usize) as *mut cmsghdr + } + } + } + + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar).offset(::mem::size_of::<::cmsghdr>() as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + ::mem::size_of::<::cmsghdr>() as ::c_uint + length + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + ::mem::size_of::<::cmsghdr>() as ::c_uint + length + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of::<::c_long>() * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of::<::c_long>() * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let bits = ::mem::size_of::<::c_long>() * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn major(dev: ::dev_t) -> ::c_uint { + let x = dev >> 16; + x as ::c_uint + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + let y = dev & 0xFFFF; + y as ::c_uint + } + + pub fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= major << 16; + dev |= minor; + dev + } +} + +safe_f! { + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & _W_STOPPED) != 0 + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + if WIFSTOPPED(status) { + (((status as ::c_uint) >> 8) & 0xff) as ::c_int + } else { + -1 + } + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xFF) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + if WIFEXITED(status) { + (((status as ::c_uint) >> 8) & 0xff) as ::c_int + } else { + -1 + } + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + !WIFEXITED(status) && !WIFSTOPPED(status) + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + if WIFSIGNALED(status) { + (((status as ::c_uint) >> 16) & 0xff) as ::c_int + } else { + -1 + } + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + (status & WCONTINUED) != 0 + } + + // AIX doesn't have native WCOREDUMP. + pub {const} fn WCOREDUMP(_status: ::c_int) -> bool { + false + } +} + +#[link(name = "thread")] +extern "C" { + pub fn thr_kill(id: thread_t, sig: ::c_int) -> ::c_int; + pub fn thr_self() -> thread_t; +} + +#[link(name = "pthread")] +extern "C" { + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getschedparam( + attr: *const ::pthread_attr_t, + param: *mut sched_param, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_setschedparam( + attr: *mut ::pthread_attr_t, + param: *const sched_param, + ) -> ::c_int; + pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_barrier_init( + barrier: *mut pthread_barrier_t, + attr: *const ::pthread_barrierattr_t, + count: ::c_uint, + ) -> ::c_int; + pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_barrierattr_destroy(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_getpshared( + attr: *const ::pthread_barrierattr_t, + shared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_barrierattr_init(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_setpshared( + attr: *mut ::pthread_barrierattr_t, + shared: ::c_int, + ) -> ::c_int; + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_getattr_np(native: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; + pub fn pthread_getschedparam( + thread: ::pthread_t, + policy: *mut ::c_int, + param: *mut sched_param, + ) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, signal: ::c_int) -> ::c_int; + pub fn pthread_mutex_consistent(mutex: *mut ::pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_mutexattr_getprotocol( + attr: *const pthread_mutexattr_t, + protocol: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getrobust( + attr: *mut ::pthread_mutexattr_t, + robust: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setprotocol( + attr: *mut pthread_mutexattr_t, + protocol: ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setpshared( + attr: *mut pthread_mutexattr_t, + pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setrobust( + attr: *mut ::pthread_mutexattr_t, + robust: ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_getpshared( + attr: *const pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; + pub fn pthread_setschedparam( + thread: ::pthread_t, + policy: ::c_int, + param: *const sched_param, + ) -> ::c_int; + pub fn pthread_setschedprio(native: ::pthread_t, priority: ::c_int) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> ::c_int; +} + +#[link(name = "iconv")] +extern "C" { + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; + pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; +} + +extern "C" { + pub fn acct(filename: *const ::c_char) -> ::c_int; + pub fn aio_cancel(fildes: ::c_int, aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *mut ::aiocb) -> ::c_int; + #[link_name = "_posix_aio_fsync"] + pub fn aio_fsync(op: ::c_int, aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut ::aiocb) -> ::c_int; + // pub fn aio_suspend + // pub fn aio_write + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + pub fn brk(addr: *mut ::c_void) -> ::c_int; + pub fn clearenv() -> ::c_int; + pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn clock_settime(clock_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn drand48() -> ::c_double; + pub fn duplocale(arg1: ::locale_t) -> ::locale_t; + pub fn endgrent(); + pub fn endmntent(streamp: *mut ::FILE) -> ::c_int; + pub fn endpwent(); + pub fn endutent(); + pub fn endutxent(); + pub fn erand48(xseed: *mut ::c_ushort) -> ::c_double; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn fattach(fildes: ::c_int, path: *const ::c_char) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn ffs(value: ::c_int) -> ::c_int; + pub fn ffsl(value: ::c_long) -> ::c_int; + pub fn ffsll(value: ::c_longlong) -> ::c_int; + pub fn fgetgrent(file: *mut ::FILE) -> *mut ::group; + pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; + pub fn fgetpwent(file: *mut ::FILE) -> *mut ::passwd; + pub fn fopen64(filename: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn freelocale(loc: ::locale_t); + pub fn freopen64( + filename: *const c_char, + mode: *const c_char, + file: *mut ::FILE, + ) -> *mut ::FILE; + pub fn fseeko64(stream: *mut ::FILE, offset: ::off64_t, whence: ::c_int) -> ::c_int; + pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; + pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn fstatfs64(fd: ::c_int, buf: *mut statfs64) -> ::c_int; + pub fn fstatvfs64(fd: ::c_int, buf: *mut statvfs64) -> ::c_int; + pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; + pub fn ftok(path: *const ::c_char, id: ::c_int) -> ::key_t; + pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn getdomainname(name: *mut ::c_char, len: ::c_int) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrent() -> *mut ::group; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getgrset(user: *mut ::c_char) -> *mut ::c_char; + pub fn gethostid() -> ::c_long; + pub fn getmntent(stream: *mut ::FILE) -> *mut ::mntent; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::size_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + sevlen: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getpagesize() -> ::c_int; + pub fn getpeereid(socket: ::c_int, euid: *mut ::uid_t, egid: *mut ::gid_t) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn getpwent() -> *mut ::passwd; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getitimer(which: ::c_int, curr_value: *mut ::itimerval) -> ::c_int; + pub fn getutent() -> *mut utmp; + pub fn getutid(u: *const utmp) -> *mut utmp; + pub fn getutline(u: *const utmp) -> *mut utmp; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn glob( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + pub fn hasmntopt(mnt: *const ::mntent, opt: *const ::c_char) -> *mut ::c_char; + pub fn hcreate(nelt: ::size_t) -> ::c_int; + pub fn hdestroy(); + pub fn hsearch(entry: entry, action: ::c_int) -> *mut entry; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn if_nameindex() -> *mut if_nameindex; + pub fn initgroups(name: *const ::c_char, basegid: ::gid_t) -> ::c_int; + pub fn ioctl(fildes: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn jrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn lcong48(p: *mut ::c_ushort); + pub fn lfind( + key: *const ::c_void, + base: *const ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + pub fn loadquery(flags: ::c_int, buf: *mut ::c_char, buflen: ::c_uint) -> ::c_int; + pub fn lpar_get_info(command: ::c_int, buf: *mut ::c_void, bufsize: ::size_t) -> ::c_int; + pub fn lpar_set_resources(id: ::c_int, resource: *mut ::c_void) -> ::c_int; + pub fn lrand48() -> c_long; + pub fn lsearch( + key: *const ::c_void, + base: *mut ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t; + pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + pub fn makecontext(ucp: *mut ::ucontext_t, func: extern "C" fn(), argc: ::c_int, ...); + pub fn mallinfo() -> ::mallinfo; + pub fn mallopt(param: ::c_int, value: ::c_int) -> ::c_int; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + pub fn memset_s(s: *mut ::c_void, smax: ::size_t, c: ::c_int, n: ::size_t) -> ::c_int; + pub fn mincore(addr: *const ::c_void, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn mount(device: *const ::c_char, path: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_notify(mqd: ::mqd_t, notification: *const ::sigevent) -> ::c_int; + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn mrand48() -> c_long; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + pub fn msgsnd( + msqid: ::c_int, + msgp: *const ::c_void, + msgsz: ::size_t, + msgflg: ::c_int, + ) -> ::c_int; + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + pub fn nl_langinfo_l(item: ::nl_item, loc: ::locale_t) -> *mut ::c_char; + pub fn nrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn pollset_create(maxfd: ::c_int) -> pollset_t; + pub fn pollset_ctl( + ps: pollset_t, + pollctl_array: *mut poll_ctl, + array_length: ::c_int, + ) -> ::c_int; + pub fn pollset_destroy(ps: pollset_t) -> ::c_int; + pub fn pollset_poll( + ps: pollset_t, + polldata_array: *mut ::pollfd, + array_length: ::c_int, + timeout: ::c_int, + ) -> ::c_int; + pub fn pollset_query(ps: pollset_t, pollfd_query: *mut ::pollfd) -> ::c_int; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn posix_fadvise64( + fd: ::c_int, + offset: ::off64_t, + len: ::off64_t, + advise: ::c_int, + ) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fallocate64(fd: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_getschedparam( + attr: *const posix_spawnattr_t, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_getschedpolicy( + attr: *const posix_spawnattr_t, + flags: *mut ::c_int, + ) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_setschedparam( + attr: *mut posix_spawnattr_t, + param: *const ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, offset: off64_t) -> ::ssize_t; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn ptrace64( + request: ::c_int, + id: ::c_longlong, + addr: ::c_longlong, + data: ::c_int, + buff: *mut ::c_int, + ) -> ::c_int; + pub fn pututline(u: *const utmp) -> *mut utmp; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn pwrite64( + fd: ::c_int, + buf: *const ::c_void, + count: ::size_t, + offset: off64_t, + ) -> ::ssize_t; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + #[link_name = "__linux_quotactl"] + pub fn quotactl( + cmd: ::c_int, + special: *const ::c_char, + id: ::c_int, + data: *mut ::c_char, + ) -> ::c_int; + pub fn rand() -> ::c_int; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + pub fn recvmsg(sockfd: ::c_int, msg: *mut msghdr, flags: ::c_int) -> ::ssize_t; + pub fn regcomp(preg: *mut regex_t, pattern: *const ::c_char, cflags: ::c_int) -> ::c_int; + pub fn regerror( + errcode: ::c_int, + preg: *const ::regex_t, + errbuf: *mut ::c_char, + errbuf_size: ::size_t, + ) -> ::size_t; + pub fn regexec( + preg: *const regex_t, + input: *const ::c_char, + nmatch: ::size_t, + pmatch: *mut regmatch_t, + eflags: ::c_int, + ) -> ::c_int; + pub fn regfree(preg: *mut regex_t); + pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; + pub fn sched_getparam(pid: ::pid_t, param: *mut sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sctp_opt_info( + sd: ::c_int, + id: ::sctp_assoc_t, + opt: ::c_int, + arg_size: *mut ::c_void, + size: *mut ::size_t, + ) -> ::c_int; + pub fn sctp_peeloff(s: ::c_int, id: ::sctp_assoc_t) -> ::c_int; + pub fn seed48(xseed: *mut ::c_ushort) -> *mut ::c_ushort; + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn semget(key: ::key_t, nsems: ::c_int, semflag: ::c_int) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut sembuf, nsops: ::size_t) -> ::c_int; + pub fn send_file(socket: *mut ::c_int, iobuf: *mut sf_parms, flags: ::c_uint) -> ::ssize_t; + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn sendmsg(sockfd: ::c_int, msg: *const msghdr, flags: ::c_int) -> ::ssize_t; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn setgrent(); + pub fn sethostid(hostid: ::c_int) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn setmntent(filename: *const ::c_char, ty: *const ::c_char) -> *mut ::FILE; + pub fn setpriority(which: ::c_int, who: id_t, priority: ::c_int) -> ::c_int; + pub fn setpwent(); + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn setitimer( + which: ::c_int, + new_value: *const ::itimerval, + old_value: *mut ::itimerval, + ) -> ::c_int; + pub fn setutent(); + pub fn setutxent(); + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn shmget(key: key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + pub fn splice(socket1: ::c_int, socket2: ::c_int, flags: ::c_int) -> ::c_int; + pub fn srand(seed: ::c_uint); + pub fn srand48(seed: ::c_long); + pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn statfs64(path: *const ::c_char, buf: *mut statfs64) -> ::c_int; + pub fn statvfs64(path: *const ::c_char, buf: *mut statvfs64) -> ::c_int; + pub fn statx( + path: *const ::c_char, + buf: *mut stat, + length: ::c_int, + command: ::c_int, + ) -> ::c_int; + pub fn strcasecmp_l( + string1: *const ::c_char, + string2: *const ::c_char, + locale: ::locale_t, + ) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + pub fn strftime( + arg1: *mut c_char, + arg2: ::size_t, + arg3: *const c_char, + arg4: *const tm, + ) -> ::size_t; + pub fn strncasecmp_l( + string1: *const ::c_char, + string2: *const ::c_char, + length: ::size_t, + locale: ::locale_t, + ) -> ::c_int; + pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char; + pub fn strsep(string: *mut *mut ::c_char, delim: *const ::c_char) -> *mut ::c_char; + pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> ::c_int; + pub fn swapoff(puath: *const ::c_char) -> ::c_int; + pub fn swapon(path: *const ::c_char) -> ::c_int; + pub fn sync(); + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn timer_create( + clockid: ::clockid_t, + sevp: *mut ::sigevent, + timerid: *mut ::timer_t, + ) -> ::c_int; + pub fn timer_delete(timerid: timer_t) -> ::c_int; + pub fn timer_getoverrun(timerid: timer_t) -> ::c_int; + pub fn timer_gettime(timerid: timer_t, value: *mut itimerspec) -> ::c_int; + pub fn timer_settime( + timerid: ::timer_t, + flags: ::c_int, + new_value: *const ::itimerspec, + old_value: *mut ::itimerspec, + ) -> ::c_int; + pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn updwtmp(file: *const ::c_char, u: *mut utmp); + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn utmpname(file: *const ::c_char) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn wait4( + pid: ::pid_t, + status: *mut ::c_int, + options: ::c_int, + rusage: *mut ::rusage, + ) -> ::pid_t; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + // Use AIX thread-safe version errno. + pub fn _Errno() -> *mut ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "powerpc64")] { + mod powerpc64; + pub use self::powerpc64::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/powerpc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/powerpc64.rs new file mode 100644 index 0000000..2cacf29 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/aix/powerpc64.rs @@ -0,0 +1,644 @@ +pub type c_long = i64; +pub type c_ulong = u64; + +s! { + pub struct sigset_t { + pub ss_set: [c_ulong; 4], + } + + pub struct fd_set { + pub fds_bits: [c_long; 1024], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_sysid: ::c_uint, + pub l_pid: ::pid_t, + pub l_vfs: ::c_int, + pub l_start: ::off_t, + pub l_len: ::off_t, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_basetype: [::c_char; 16], + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_fstr: [::c_char; 32], + pub f_filler: [::c_ulong; 16] + } + + pub struct pthread_rwlock_t { + __rw_word: [::c_long; 10], + } + + pub struct pthread_cond_t { + __cv_word: [::c_long; 6], + } + + pub struct pthread_mutex_t { + __mt_word: [::c_long; 8], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_flag: ::c_ushort, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_ssize: ::c_int, + pub st_atime: ::st_timespec, + pub st_mtime: ::st_timespec, + pub st_ctime: ::st_timespec, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_vfstype: ::c_int, + pub st_vfs: ::c_uint, + pub st_type: ::c_uint, + pub st_gen: ::c_uint, + pub st_reserved: [::c_uint; 9], + pub st_padto_ll: ::c_uint, + pub st_size: ::off_t, + } + + pub struct statfs { + pub f_version: ::c_int, + pub f_type: ::c_int, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_fsid: ::fsid64_t, + pub f_vfstype: ::c_int, + pub f_fsize: ::c_ulong, + pub f_vfsnumber: ::c_int, + pub f_vfsoff: ::c_int, + pub f_vfslen: ::c_int, + pub f_vfsvers: ::c_int, + pub f_fname: [::c_char; 32], + pub f_fpack: [::c_char; 32], + pub f_name_max: ::c_int, + } + + pub struct aiocb { + pub aio_lio_opcode: ::c_int, + pub aio_fildes: ::c_int, + pub aio_word1: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_return: ::ssize_t, + pub aio_errno: ::c_int, + pub aio_nbytes: ::size_t, + pub aio_reqprio: ::c_int, + pub aio_sigevent: ::sigevent, + pub aio_word2: ::c_int, + pub aio_fp: ::c_int, + pub aio_handle: *mut aiocb, + pub aio_reserved: [::c_uint; 2], + pub aio_sigev_tid: c_long, + } + + pub struct ucontext_t { + pub __sc_onstack: ::c_int, + pub uc_sigmask: ::sigset_t, + pub __sc_uerror: ::c_int, + pub uc_mcontext: ::mcontext_t, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + // Should be pointer to __extctx_t + pub __extctx: *mut ::c_void, + pub __extctx_magic: ::c_int, + pub __pad: [::c_int; 1], + } + + pub struct mcontext_t { + pub gpr: [::c_ulonglong; 32], + pub msr: ::c_ulonglong, + pub iar: ::c_ulonglong, + pub lr: ::c_ulonglong, + pub ctr: ::c_ulonglong, + pub cr: ::c_uint, + pub xer: ::c_uint, + pub fpscr: ::c_uint, + pub fpscrx: ::c_uint, + pub except: [::c_ulonglong; 1], + // Should be array of double type + pub fpr: [::uint64_t; 32], + pub fpeu: ::c_char, + pub fpinfo: ::c_char, + pub fpscr24_31: ::c_char, + pub pad: [::c_char; 1], + pub excp_type: ::c_int, + } + + pub struct utmpx { + pub ut_user: [::c_char; 256], + pub ut_id: [::c_char; 14], + pub ut_line: [::c_char; 64], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_host: [::c_char; 256], + pub __dbl_word_pad: ::c_int, + pub __reservedA: [::c_int; 2], + pub __reservedV: [::c_int; 6], + } + + pub struct pthread_spinlock_t { + pub __sp_word: [::c_long; 3], + } + + pub struct pthread_barrier_t { + pub __br_word: [::c_long; 5], + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_first: ::c_uint, + pub msg_last: ::c_uint, + pub msg_cbytes: ::c_uint, + pub msg_qnum: ::c_uint, + pub msg_qbytes: ::c_ulong, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + pub msg_rwait: ::c_int, + pub msg_wwait: ::c_int, + pub msg_reqevents: ::c_ushort, + } +} + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + pub si_band: ::c_long, + pub si_value: ::sigval, + pub __si_flags: ::c_int, + pub __pad: [::c_int; 3], + } + + #[cfg(libc_union)] + pub union _kernel_simple_lock { + pub _slock: ::c_long, + // Should be pointer to 'lock_data_instrumented' + pub _slockp: *mut ::c_void, + } + + pub struct fileops_t { + pub fo_rw: extern fn(file: *mut file, rw: ::uio_rw, io: *mut ::c_void, ext: ::c_long, + secattr: *mut ::c_void) -> ::c_int, + pub fo_ioctl: extern fn(file: *mut file, a: ::c_long, b: ::caddr_t, c: ::c_long, + d: ::c_long) -> ::c_int, + pub fo_select: extern fn(file: *mut file, a: ::c_int, b: *mut ::c_ushort, + c: extern fn()) -> ::c_int, + pub fo_close: extern fn(file: *mut file) -> ::c_int, + pub fo_fstat: extern fn(file: *mut file, sstat: *mut ::stat) -> ::c_int, + } + + pub struct file { + pub f_flag: ::c_long, + pub f_count: ::c_int, + pub f_options: ::c_short, + pub f_type: ::c_short, + // Should be pointer to 'vnode' + pub f_data: *mut ::c_void, + pub f_offset: ::c_longlong, + pub f_dir_off: ::c_long, + // Should be pointer to 'cred' + pub f_cred: *mut ::c_void, + #[cfg(libc_union)] + pub f_lock: _kernel_simple_lock, + #[cfg(libc_union)] + pub f_offset_lock: _kernel_simple_lock, + pub f_vinfo: ::caddr_t, + pub f_ops: *mut fileops_t, + pub f_parentp: ::caddr_t, + pub f_fnamep: ::caddr_t, + pub f_fdata: [::c_char; 160], + } + + #[cfg(libc_union)] + pub union __ld_info_file { + pub _ldinfo_fd: ::c_int, + pub _ldinfo_fp: *mut file, + pub _core_offset: ::c_long, + } + + pub struct ld_info { + pub ldinfo_next: ::c_uint, + pub ldinfo_flags: ::c_uint, + #[cfg(libc_union)] + pub _file: __ld_info_file, + pub ldinfo_textorg: *mut ::c_void, + pub ldinfo_textsize: ::c_ulong, + pub ldinfo_dataorg: *mut ::c_void, + pub ldinfo_datasize: ::c_ulong, + pub ldinfo_filename: [::c_char; 2], + } + + #[cfg(libc_union)] + pub union __pollfd_ext_u { + pub addr: *mut ::c_void, + pub data32: u32, + pub data: u64, + } + + pub struct pollfd_ext { + pub fd: ::c_int, + pub events: ::c_ushort, + pub revents: ::c_ushort, + #[cfg(libc_union)] + pub data: __pollfd_ext_u, + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + self.si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.si_status + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &siginfo_t) -> bool { + #[cfg(libc_union)] + let value_eq = self.si_value == other.si_value; + #[cfg(not(libc_union))] + let value_eq = true; + self.si_signo == other.si_signo + && self.si_errno == other.si_errno + && self.si_code == other.si_code + && self.si_pid == other.si_pid + && self.si_uid == other.si_uid + && self.si_status == other.si_status + && self.si_addr == other.si_addr + && self.si_band == other.si_band + && self.__si_flags == other.__si_flags + && value_eq + } + } + impl Eq for siginfo_t {} + impl ::fmt::Debug for siginfo_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("siginfo_t"); + struct_formatter.field("si_signo", &self.si_signo); + struct_formatter.field("si_errno", &self.si_errno); + struct_formatter.field("si_code", &self.si_code); + struct_formatter.field("si_pid", &self.si_pid); + struct_formatter.field("si_uid", &self.si_uid); + struct_formatter.field("si_status", &self.si_status); + struct_formatter.field("si_addr", &self.si_addr); + struct_formatter.field("si_band", &self.si_band); + #[cfg(libc_union)] + struct_formatter.field("si_value", &self.si_value); + struct_formatter.field("__si_flags", &self.__si_flags); + struct_formatter.finish() + } + } + impl ::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + self.si_pid.hash(state); + self.si_uid.hash(state); + self.si_status.hash(state); + self.si_addr.hash(state); + self.si_band.hash(state); + #[cfg(libc_union)] + self.si_value.hash(state); + self.__si_flags.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for _kernel_simple_lock { + fn eq(&self, other: &_kernel_simple_lock) -> bool { + unsafe { + self._slock == other._slock + && self._slockp == other._slockp + } + } + } + #[cfg(libc_union)] + impl Eq for _kernel_simple_lock {} + #[cfg(libc_union)] + impl ::fmt::Debug for _kernel_simple_lock { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("_kernel_simple_lock") + .field("_slock", unsafe { &self._slock }) + .field("_slockp", unsafe { &self._slockp }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for _kernel_simple_lock { + fn hash(&self, state: &mut H) { + unsafe { + self._slock.hash(state); + self._slockp.hash(state); + } + } + } + + impl PartialEq for fileops_t { + fn eq(&self, other: &fileops_t) -> bool { + self.fo_rw == other.fo_rw + && self.fo_ioctl == other.fo_ioctl + && self.fo_select == other.fo_select + && self.fo_close == other.fo_close + && self.fo_fstat == other.fo_fstat + } + } + impl Eq for fileops_t {} + impl ::fmt::Debug for fileops_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("fileops_t"); + struct_formatter.field("fo_rw", &self.fo_rw); + struct_formatter.field("fo_ioctl", &self.fo_ioctl); + struct_formatter.field("fo_select", &self.fo_select); + struct_formatter.field("fo_close", &self.fo_close); + struct_formatter.field("fo_fstat", &self.fo_fstat); + struct_formatter.finish() + } + } + impl ::hash::Hash for fileops_t { + fn hash(&self, state: &mut H) { + self.fo_rw.hash(state); + self.fo_ioctl.hash(state); + self.fo_select.hash(state); + self.fo_close.hash(state); + self.fo_fstat.hash(state); + } + } + + impl PartialEq for file { + fn eq(&self, other: &file) -> bool { + #[cfg(libc_union)] + let lock_eq = self.f_lock == other.f_lock + && self.f_offset_lock == other.f_offset_lock; + #[cfg(not(libc_union))] + let lock_eq = true; + self.f_flag == other.f_flag + && self.f_count == other.f_count + && self.f_options == other.f_options + && self.f_type == other.f_type + && self.f_data == other.f_data + && self.f_offset == other.f_offset + && self.f_dir_off == other.f_dir_off + && self.f_cred == other.f_cred + && self.f_vinfo == other.f_vinfo + && self.f_ops == other.f_ops + && self.f_parentp == other.f_parentp + && self.f_fnamep == other.f_fnamep + && self.f_fdata == other.f_fdata + && lock_eq + } + } + impl Eq for file {} + impl ::fmt::Debug for file { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("file"); + struct_formatter.field("f_flag", &self.f_flag); + struct_formatter.field("f_count", &self.f_count); + struct_formatter.field("f_options", &self.f_options); + struct_formatter.field("f_type", &self.f_type); + struct_formatter.field("f_data", &self.f_data); + struct_formatter.field("f_offset", &self.f_offset); + struct_formatter.field("f_dir_off", &self.f_dir_off); + struct_formatter.field("f_cred", &self.f_cred); + #[cfg(libc_union)] + struct_formatter.field("f_lock", &self.f_lock); + #[cfg(libc_union)] + struct_formatter.field("f_offset_lock", &self.f_offset_lock); + struct_formatter.field("f_vinfo", &self.f_vinfo); + struct_formatter.field("f_ops", &self.f_ops); + struct_formatter.field("f_parentp", &self.f_parentp); + struct_formatter.field("f_fnamep", &self.f_fnamep); + struct_formatter.field("f_fdata", &self.f_fdata); + struct_formatter.finish() + } + } + impl ::hash::Hash for file { + fn hash(&self, state: &mut H) { + self.f_flag.hash(state); + self.f_count.hash(state); + self.f_options.hash(state); + self.f_type.hash(state); + self.f_data.hash(state); + self.f_offset.hash(state); + self.f_dir_off.hash(state); + self.f_cred.hash(state); + #[cfg(libc_union)] + self.f_lock.hash(state); + #[cfg(libc_union)] + self.f_offset_lock.hash(state); + self.f_vinfo.hash(state); + self.f_ops.hash(state); + self.f_parentp.hash(state); + self.f_fnamep.hash(state); + self.f_fdata.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __ld_info_file { + fn eq(&self, other: &__ld_info_file) -> bool { + unsafe { + self._ldinfo_fd == other._ldinfo_fd + && self._ldinfo_fp == other._ldinfo_fp + && self._core_offset == other._core_offset + } + } + } + #[cfg(libc_union)] + impl Eq for __ld_info_file {} + #[cfg(libc_union)] + impl ::fmt::Debug for __ld_info_file { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__ld_info_file") + .field("_ldinfo_fd", unsafe { &self._ldinfo_fd }) + .field("_ldinfo_fp", unsafe { &self._ldinfo_fp }) + .field("_core_offset", unsafe { &self._core_offset }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __ld_info_file { + fn hash(&self, state: &mut H) { + unsafe { + self._ldinfo_fd.hash(state); + self._ldinfo_fp.hash(state); + self._core_offset.hash(state); + } + } + } + + impl PartialEq for ld_info { + fn eq(&self, other: &ld_info) -> bool { + #[cfg(libc_union)] + let file_eq = self._file == other._file; + #[cfg(not(libc_union))] + let file_eq = true; + self.ldinfo_next == other.ldinfo_next + && self.ldinfo_flags == other.ldinfo_flags + && self.ldinfo_textorg == other.ldinfo_textorg + && self.ldinfo_textsize == other.ldinfo_textsize + && self.ldinfo_dataorg == other.ldinfo_dataorg + && self.ldinfo_datasize == other.ldinfo_datasize + && self.ldinfo_filename == other.ldinfo_filename + && file_eq + } + } + impl Eq for ld_info {} + impl ::fmt::Debug for ld_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("ld_info"); + struct_formatter.field("ldinfo_next", &self.ldinfo_next); + struct_formatter.field("ldinfo_flags", &self.ldinfo_flags); + struct_formatter.field("ldinfo_textorg", &self.ldinfo_textorg); + struct_formatter.field("ldinfo_textsize", &self.ldinfo_textsize); + struct_formatter.field("ldinfo_dataorg", &self.ldinfo_dataorg); + struct_formatter.field("ldinfo_datasize", &self.ldinfo_datasize); + struct_formatter.field("ldinfo_filename", &self.ldinfo_filename); + #[cfg(libc_union)] + struct_formatter.field("_file", &self._file); + struct_formatter.finish() + } + } + impl ::hash::Hash for ld_info { + fn hash(&self, state: &mut H) { + self.ldinfo_next.hash(state); + self.ldinfo_flags.hash(state); + self.ldinfo_textorg.hash(state); + self.ldinfo_textsize.hash(state); + self.ldinfo_dataorg.hash(state); + self.ldinfo_datasize.hash(state); + self.ldinfo_filename.hash(state); + #[cfg(libc_union)] + self._file.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __pollfd_ext_u { + fn eq(&self, other: &__pollfd_ext_u) -> bool { + unsafe { + self.addr == other.addr + && self.data32 == other.data32 + && self.data == other.data + } + } + } + #[cfg(libc_union)] + impl Eq for __pollfd_ext_u {} + #[cfg(libc_union)] + impl ::fmt::Debug for __pollfd_ext_u { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__pollfd_ext_u") + .field("addr", unsafe { &self.addr }) + .field("data32", unsafe { &self.data32 }) + .field("data", unsafe { &self.data }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __pollfd_ext_u { + fn hash(&self, state: &mut H) { + unsafe { + self.addr.hash(state); + self.data.hash(state); + self.data32.hash(state); + } + } + } + + impl PartialEq for pollfd_ext { + fn eq(&self, other: &pollfd_ext) -> bool { + #[cfg(libc_union)] + let data_eq = self.data == other.data; + #[cfg(not(libc_union))] + let data_eq = true; + self.fd == other.fd + && self.events == other.events + && self.revents == other.revents + && data_eq + } + } + impl Eq for pollfd_ext {} + impl ::fmt::Debug for pollfd_ext { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("pollfd_ext"); + struct_formatter.field("fd", &self.fd); + struct_formatter.field("events", &self.events); + struct_formatter.field("revents", &self.revents); + #[cfg(libc_union)] + struct_formatter.field("data", &self.data); + struct_formatter.finish() + } + } + impl ::hash::Hash for pollfd_ext { + fn hash(&self, state: &mut H) { + self.fd.hash(state); + self.events.hash(state); + self.revents.hash(state); + #[cfg(libc_union)] + self.data.hash(state); + } + } + } +} + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __mt_word: [0, 2, 0, 0, 0, 0, 0, 0], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __cv_word: [0, 0, 0, 0, 2, 0], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __rw_word: [2, 0, 0, 0, 0, 0, 0, 0, 0, 0], +}; +pub const RLIM_INFINITY: ::c_ulong = 0x7fffffffffffffff; + +extern "C" { + pub fn getsystemcfg(label: ::c_int) -> ::c_ulong; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/align.rs new file mode 100644 index 0000000..4fdba9a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/align.rs @@ -0,0 +1,6 @@ +s! { + #[repr(align(4))] + pub struct in6_addr { + pub s6_addr: [u8; 16], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/align.rs new file mode 100644 index 0000000..ca1fe1c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 2] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/mod.rs new file mode 100644 index 0000000..0f1722f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b32/mod.rs @@ -0,0 +1,119 @@ +//! 32-bit specific Apple (ios/darwin) definitions + +pub type c_long = i32; +pub type c_ulong = u32; +pub type boolean_t = ::c_int; + +s! { + pub struct if_data { + pub ifi_type: ::c_uchar, + pub ifi_typelen: ::c_uchar, + pub ifi_physical: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_recvquota: ::c_uchar, + pub ifi_xmitquota: ::c_uchar, + pub ifi_unused1: ::c_uchar, + pub ifi_mtu: u32, + pub ifi_metric: u32, + pub ifi_baudrate: u32, + pub ifi_ipackets: u32, + pub ifi_ierrors: u32, + pub ifi_opackets: u32, + pub ifi_oerrors: u32, + pub ifi_collisions: u32, + pub ifi_ibytes: u32, + pub ifi_obytes: u32, + pub ifi_imcasts: u32, + pub ifi_omcasts: u32, + pub ifi_iqdrops: u32, + pub ifi_noproto: u32, + pub ifi_recvtiming: u32, + pub ifi_xmittiming: u32, + pub ifi_lastchange: ::timeval, + pub ifi_unused2: u32, + pub ifi_hwassist: u32, + pub ifi_reserved1: u32, + pub ifi_reserved2: u32, + } + + pub struct bpf_hdr { + pub bh_tstamp: ::timeval, + pub bh_caplen: u32, + pub bh_datalen: u32, + pub bh_hdrlen: ::c_ushort, + } + + pub struct malloc_zone_t { + __private: [::uintptr_t; 18], // FIXME: keeping private for now + } +} + +s_no_extra_traits! { + pub struct pthread_attr_t { + __sig: c_long, + __opaque: [::c_char; 36] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_attr_t { + fn eq(&self, other: &pthread_attr_t) -> bool { + self.__sig == other.__sig + && self.__opaque + .iter() + .zip(other.__opaque.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_attr_t {} + impl ::fmt::Debug for pthread_attr_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_attr_t") + .field("__sig", &self.__sig) + // FIXME: .field("__opaque", &self.__opaque) + .finish() + } + } + impl ::hash::Hash for pthread_attr_t { + fn hash(&self, state: &mut H) { + self.__sig.hash(state); + self.__opaque.hash(state); + } + } + } +} + +#[doc(hidden)] +#[deprecated(since = "0.2.55")] +pub const NET_RT_MAXID: ::c_int = 10; + +pub const __PTHREAD_MUTEX_SIZE__: usize = 40; +pub const __PTHREAD_COND_SIZE__: usize = 24; +pub const __PTHREAD_CONDATTR_SIZE__: usize = 4; +pub const __PTHREAD_RWLOCK_SIZE__: usize = 124; +pub const __PTHREAD_RWLOCKATTR_SIZE__: usize = 12; + +pub const TIOCTIMESTAMP: ::c_ulong = 0x40087459; +pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40087458; + +pub const BIOCSETF: ::c_ulong = 0x80084267; +pub const BIOCSRTIMEOUT: ::c_ulong = 0x8008426d; +pub const BIOCGRTIMEOUT: ::c_ulong = 0x4008426e; +pub const BIOCSETFNR: ::c_ulong = 0x8008427e; + +extern "C" { + pub fn exchangedata( + path1: *const ::c_char, + path2: *const ::c_char, + options: ::c_ulong, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs new file mode 100644 index 0000000..29db97e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs @@ -0,0 +1,56 @@ +pub type mcontext_t = *mut __darwin_mcontext64; + +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct max_align_t { + priv_: f64 + } +} + +s! { + pub struct ucontext_t { + pub uc_onstack: ::c_int, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_link: *mut ::ucontext_t, + pub uc_mcsize: usize, + pub uc_mcontext: mcontext_t, + __mcontext_data: __darwin_mcontext64, + } + + pub struct __darwin_mcontext64 { + pub __es: __darwin_arm_exception_state64, + pub __ss: __darwin_arm_thread_state64, + pub __ns: __darwin_arm_neon_state64, + } + + pub struct __darwin_arm_exception_state64 { + pub __far: u64, + pub __esr: u32, + pub __exception: u32, + } + + pub struct __darwin_arm_thread_state64 { + pub __x: [u64; 29], + pub __fp: u64, + pub __lr: u64, + pub __sp: u64, + pub __pc: u64, + pub __cpsr: u32, + pub __pad: u32, + } + + // This type natively uses a uint128, but for a while we hacked + // it in with repr(align) and `[u64; 2]`. uint128 isn't available + // all the way back to our earliest supported versions so we + // preserver the old shim. + #[cfg_attr(not(libc_int128), repr(align(16)))] + pub struct __darwin_arm_neon_state64 { + #[cfg(libc_int128)] + pub __v: [::__uint128_t; 32], + #[cfg(not(libc_int128))] + pub __v: [[u64; 2]; 32], + pub __fpsr: u32, + pub __fpcr: u32, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/mod.rs new file mode 100644 index 0000000..79e9ac8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/aarch64/mod.rs @@ -0,0 +1,14 @@ +pub type boolean_t = ::c_int; + +s! { + pub struct malloc_zone_t { + __private: [::uintptr_t; 18], // FIXME: needs arm64 auth pointers support + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/align.rs new file mode 100644 index 0000000..ca1fe1c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 2] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/mod.rs new file mode 100644 index 0000000..48d94bc --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/mod.rs @@ -0,0 +1,124 @@ +//! 64-bit specific Apple (ios/darwin) definitions + +pub type c_long = i64; +pub type c_ulong = u64; + +s! { + pub struct timeval32 { + pub tv_sec: i32, + pub tv_usec: i32, + } + + pub struct if_data { + pub ifi_type: ::c_uchar, + pub ifi_typelen: ::c_uchar, + pub ifi_physical: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_recvquota: ::c_uchar, + pub ifi_xmitquota: ::c_uchar, + pub ifi_unused1: ::c_uchar, + pub ifi_mtu: u32, + pub ifi_metric: u32, + pub ifi_baudrate: u32, + pub ifi_ipackets: u32, + pub ifi_ierrors: u32, + pub ifi_opackets: u32, + pub ifi_oerrors: u32, + pub ifi_collisions: u32, + pub ifi_ibytes: u32, + pub ifi_obytes: u32, + pub ifi_imcasts: u32, + pub ifi_omcasts: u32, + pub ifi_iqdrops: u32, + pub ifi_noproto: u32, + pub ifi_recvtiming: u32, + pub ifi_xmittiming: u32, + pub ifi_lastchange: timeval32, + pub ifi_unused2: u32, + pub ifi_hwassist: u32, + pub ifi_reserved1: u32, + pub ifi_reserved2: u32, + } + + pub struct bpf_hdr { + pub bh_tstamp: ::timeval32, + pub bh_caplen: u32, + pub bh_datalen: u32, + pub bh_hdrlen: ::c_ushort, + } +} + +s_no_extra_traits! { + pub struct pthread_attr_t { + __sig: c_long, + __opaque: [::c_char; 56] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_attr_t { + fn eq(&self, other: &pthread_attr_t) -> bool { + self.__sig == other.__sig + && self.__opaque + .iter() + .zip(other.__opaque.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_attr_t {} + impl ::fmt::Debug for pthread_attr_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_attr_t") + .field("__sig", &self.__sig) + // FIXME: .field("__opaque", &self.__opaque) + .finish() + } + } + impl ::hash::Hash for pthread_attr_t { + fn hash(&self, state: &mut H) { + self.__sig.hash(state); + self.__opaque.hash(state); + } + } + } +} + +#[doc(hidden)] +#[deprecated(since = "0.2.55")] +pub const NET_RT_MAXID: ::c_int = 11; + +pub const __PTHREAD_MUTEX_SIZE__: usize = 56; +pub const __PTHREAD_COND_SIZE__: usize = 40; +pub const __PTHREAD_CONDATTR_SIZE__: usize = 8; +pub const __PTHREAD_RWLOCK_SIZE__: usize = 192; +pub const __PTHREAD_RWLOCKATTR_SIZE__: usize = 16; + +pub const TIOCTIMESTAMP: ::c_ulong = 0x40107459; +pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40107458; + +pub const BIOCSETF: ::c_ulong = 0x80104267; +pub const BIOCSRTIMEOUT: ::c_ulong = 0x8010426d; +pub const BIOCGRTIMEOUT: ::c_ulong = 0x4010426e; +pub const BIOCSETFNR: ::c_ulong = 0x8010427e; + +extern "C" { + pub fn exchangedata( + path1: *const ::c_char, + path2: *const ::c_char, + options: ::c_uint, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/align.rs new file mode 100644 index 0000000..ca1fe1c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 2] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/mod.rs new file mode 100644 index 0000000..653650c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/b64/x86_64/mod.rs @@ -0,0 +1,180 @@ +pub type boolean_t = ::c_uint; +pub type mcontext_t = *mut __darwin_mcontext64; + +s! { + pub struct ucontext_t { + pub uc_onstack: ::c_int, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_link: *mut ::ucontext_t, + pub uc_mcsize: usize, + pub uc_mcontext: mcontext_t, + } + + pub struct __darwin_mcontext64 { + pub __es: __darwin_x86_exception_state64, + pub __ss: __darwin_x86_thread_state64, + pub __fs: __darwin_x86_float_state64, + } + + pub struct __darwin_x86_exception_state64 { + pub __trapno: u16, + pub __cpu: u16, + pub __err: u32, + pub __faultvaddr: u64, + } + + pub struct __darwin_x86_thread_state64 { + pub __rax: u64, + pub __rbx: u64, + pub __rcx: u64, + pub __rdx: u64, + pub __rdi: u64, + pub __rsi: u64, + pub __rbp: u64, + pub __rsp: u64, + pub __r8: u64, + pub __r9: u64, + pub __r10: u64, + pub __r11: u64, + pub __r12: u64, + pub __r13: u64, + pub __r14: u64, + pub __r15: u64, + pub __rip: u64, + pub __rflags: u64, + pub __cs: u64, + pub __fs: u64, + pub __gs: u64, + } + + pub struct __darwin_x86_float_state64 { + pub __fpu_reserved: [::c_int; 2], + __fpu_fcw: ::c_short, + __fpu_fsw: ::c_short, + pub __fpu_ftw: u8, + pub __fpu_rsrv1: u8, + pub __fpu_fop: u16, + pub __fpu_ip: u32, + pub __fpu_cs: u16, + pub __fpu_rsrv2: u16, + pub __fpu_dp: u32, + pub __fpu_ds: u16, + pub __fpu_rsrv3: u16, + pub __fpu_mxcsr: u32, + pub __fpu_mxcsrmask: u32, + pub __fpu_stmm0: __darwin_mmst_reg, + pub __fpu_stmm1: __darwin_mmst_reg, + pub __fpu_stmm2: __darwin_mmst_reg, + pub __fpu_stmm3: __darwin_mmst_reg, + pub __fpu_stmm4: __darwin_mmst_reg, + pub __fpu_stmm5: __darwin_mmst_reg, + pub __fpu_stmm6: __darwin_mmst_reg, + pub __fpu_stmm7: __darwin_mmst_reg, + pub __fpu_xmm0: __darwin_xmm_reg, + pub __fpu_xmm1: __darwin_xmm_reg, + pub __fpu_xmm2: __darwin_xmm_reg, + pub __fpu_xmm3: __darwin_xmm_reg, + pub __fpu_xmm4: __darwin_xmm_reg, + pub __fpu_xmm5: __darwin_xmm_reg, + pub __fpu_xmm6: __darwin_xmm_reg, + pub __fpu_xmm7: __darwin_xmm_reg, + pub __fpu_xmm8: __darwin_xmm_reg, + pub __fpu_xmm9: __darwin_xmm_reg, + pub __fpu_xmm10: __darwin_xmm_reg, + pub __fpu_xmm11: __darwin_xmm_reg, + pub __fpu_xmm12: __darwin_xmm_reg, + pub __fpu_xmm13: __darwin_xmm_reg, + pub __fpu_xmm14: __darwin_xmm_reg, + pub __fpu_xmm15: __darwin_xmm_reg, + // this field is actually [u8; 96], but defining it with a bigger type + // allows us to auto-implement traits for it since the length of the + // array is less than 32 + __fpu_rsrv4: [u32; 24], + pub __fpu_reserved1: ::c_int, + } + + pub struct __darwin_mmst_reg { + pub __mmst_reg: [::c_char; 10], + pub __mmst_rsrv: [::c_char; 6], + } + + pub struct __darwin_xmm_reg { + pub __xmm_reg: [::c_char; 16], + } + + pub struct malloc_introspection_t { + _private: [::uintptr_t; 16], // FIXME: keeping private for now + } + + pub struct malloc_zone_t { + _reserved1: *mut ::c_void, + _reserved2: *mut ::c_void, + pub size: ::Option ::size_t>, + pub malloc: ::Option *mut ::c_void>, + pub calloc: ::Option *mut ::c_void>, + pub valloc: ::Option *mut ::c_void>, + pub free: ::Option, + pub realloc: ::Option *mut ::c_void>, + pub destroy: ::Option, + pub zone_name: *const ::c_char, + pub batch_malloc: ::Option ::c_uint>, + pub batch_free: ::Option, + pub introspect: *mut malloc_introspection_t, + pub version: ::c_uint, + pub memalign: ::Option *mut ::c_void>, + pub free_definite_size: ::Option, + pub pressure_relief: ::Option ::size_t>, + pub claimed_address: ::Option ::boolean_t>, + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/long_array.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/long_array.rs new file mode 100644 index 0000000..4c56a27 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/long_array.rs @@ -0,0 +1,8 @@ +s! { + pub struct ctl_info { + pub ctl_id: u32, + pub ctl_name: [::c_char; MAX_KCTL_NAME], + } +} + +pub const MAX_KCTL_NAME: usize = 96; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/mod.rs new file mode 100644 index 0000000..c6f254e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/apple/mod.rs @@ -0,0 +1,6125 @@ +//! Apple (ios/darwin)-specific definitions +//! +//! This covers *-apple-* triples currently +pub type c_char = i8; +pub type wchar_t = i32; +pub type clock_t = c_ulong; +pub type time_t = c_long; +pub type suseconds_t = i32; +pub type dev_t = i32; +pub type ino_t = u64; +pub type mode_t = u16; +pub type nlink_t = u16; +pub type blksize_t = i32; +pub type rlim_t = u64; +pub type pthread_key_t = c_ulong; +pub type sigset_t = u32; +pub type clockid_t = ::c_uint; +pub type fsblkcnt_t = ::c_uint; +pub type fsfilcnt_t = ::c_uint; +pub type speed_t = ::c_ulong; +pub type tcflag_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type id_t = ::c_uint; +pub type sem_t = ::c_int; +pub type idtype_t = ::c_uint; +pub type integer_t = ::c_int; +pub type cpu_type_t = integer_t; +pub type cpu_subtype_t = integer_t; +pub type natural_t = u32; +pub type mach_msg_type_number_t = natural_t; +pub type kern_return_t = ::c_int; +pub type uuid_t = [u8; 16]; +pub type task_info_t = *mut integer_t; +pub type host_info_t = *mut integer_t; +pub type task_flavor_t = natural_t; +pub type rusage_info_t = *mut ::c_void; +pub type vm_offset_t = ::uintptr_t; +pub type vm_size_t = ::uintptr_t; +pub type vm_address_t = vm_offset_t; + +pub type posix_spawnattr_t = *mut ::c_void; +pub type posix_spawn_file_actions_t = *mut ::c_void; +pub type key_t = ::c_int; +pub type shmatt_t = ::c_ushort; + +pub type sae_associd_t = u32; +pub type sae_connid_t = u32; + +pub type mach_port_t = ::c_uint; +pub type host_t = ::c_uint; +pub type host_flavor_t = integer_t; +pub type host_info64_t = *mut integer_t; +pub type processor_flavor_t = ::c_int; +pub type thread_flavor_t = natural_t; +pub type thread_inspect_t = ::mach_port_t; +pub type thread_act_t = ::mach_port_t; +pub type thread_act_array_t = *mut ::thread_act_t; +pub type policy_t = ::c_int; +pub type mach_vm_address_t = u64; +pub type mach_vm_offset_t = u64; +pub type mach_vm_size_t = u64; +pub type vm_map_t = ::mach_port_t; +pub type mem_entry_name_port_t = ::mach_port_t; +pub type memory_object_t = ::mach_port_t; +pub type memory_object_offset_t = ::c_ulonglong; +pub type vm_inherit_t = ::c_uint; +pub type vm_prot_t = ::c_int; + +pub type ledger_t = ::mach_port_t; +pub type ledger_array_t = *mut ::ledger_t; + +pub type iconv_t = *mut ::c_void; + +pub type processor_cpu_load_info_t = *mut processor_cpu_load_info; +pub type processor_cpu_load_info_data_t = processor_cpu_load_info; +pub type processor_basic_info_t = *mut processor_basic_info; +pub type processor_basic_info_data_t = processor_basic_info; +pub type processor_set_basic_info_data_t = processor_set_basic_info; +pub type processor_set_basic_info_t = *mut processor_set_basic_info; +pub type processor_set_load_info_data_t = processor_set_load_info; +pub type processor_set_load_info_t = *mut processor_set_load_info; +pub type processor_info_t = *mut integer_t; +pub type processor_info_array_t = *mut integer_t; + +pub type mach_task_basic_info_data_t = mach_task_basic_info; +pub type mach_task_basic_info_t = *mut mach_task_basic_info; +pub type task_thread_times_info_data_t = task_thread_times_info; +pub type task_thread_times_info_t = *mut task_thread_times_info; + +pub type thread_info_t = *mut integer_t; +pub type thread_basic_info_t = *mut thread_basic_info; +pub type thread_basic_info_data_t = thread_basic_info; +pub type thread_identifier_info_t = *mut thread_identifier_info; +pub type thread_identifier_info_data_t = thread_identifier_info; +pub type thread_extended_info_t = *mut thread_extended_info; +pub type thread_extended_info_data_t = thread_extended_info; + +pub type thread_t = ::mach_port_t; +pub type thread_policy_flavor_t = natural_t; +pub type thread_policy_t = *mut integer_t; +pub type thread_latency_qos_t = integer_t; +pub type thread_throughput_qos_t = integer_t; +pub type thread_standard_policy_data_t = thread_standard_policy; +pub type thread_standard_policy_t = *mut thread_standard_policy; +pub type thread_extended_policy_data_t = thread_extended_policy; +pub type thread_extended_policy_t = *mut thread_extended_policy; +pub type thread_time_constraint_policy_data_t = thread_time_constraint_policy; +pub type thread_time_constraint_policy_t = *mut thread_time_constraint_policy; +pub type thread_precedence_policy_data_t = thread_precedence_policy; +pub type thread_precedence_policy_t = *mut thread_precedence_policy; +pub type thread_affinity_policy_data_t = thread_affinity_policy; +pub type thread_affinity_policy_t = *mut thread_affinity_policy; +pub type thread_background_policy_data_t = thread_background_policy; +pub type thread_background_policy_t = *mut thread_background_policy; +pub type thread_latency_qos_policy_data_t = thread_latency_qos_policy; +pub type thread_latency_qos_policy_t = *mut thread_latency_qos_policy; +pub type thread_throughput_qos_policy_data_t = thread_throughput_qos_policy; +pub type thread_throughput_qos_policy_t = *mut thread_throughput_qos_policy; + +pub type pthread_introspection_hook_t = + extern "C" fn(event: ::c_uint, thread: ::pthread_t, addr: *mut ::c_void, size: ::size_t); +pub type pthread_jit_write_callback_t = ::Option ::c_int>; + +pub type os_unfair_lock = os_unfair_lock_s; +pub type os_unfair_lock_t = *mut os_unfair_lock; + +pub type os_log_t = *mut ::c_void; +pub type os_log_type_t = u8; +pub type os_signpost_id_t = u64; +pub type os_signpost_type_t = u8; + +pub type vm_statistics_t = *mut vm_statistics; +pub type vm_statistics_data_t = vm_statistics; +pub type vm_statistics64_t = *mut vm_statistics64; +pub type vm_statistics64_data_t = vm_statistics64; + +pub type task_t = ::mach_port_t; +pub type task_inspect_t = ::mach_port_t; + +pub type sysdir_search_path_enumeration_state = ::c_uint; + +pub type CCStatus = i32; +pub type CCCryptorStatus = i32; +pub type CCRNGStatus = ::CCCryptorStatus; + +pub type copyfile_state_t = *mut ::c_void; +pub type copyfile_flags_t = u32; + +pub type attrgroup_t = u32; +pub type vol_capabilities_set_t = [u32; 4]; + +deprecated_mach! { + pub type mach_timebase_info_data_t = mach_timebase_info; +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +#[repr(u32)] +pub enum qos_class_t { + QOS_CLASS_USER_INTERACTIVE = 0x21, + QOS_CLASS_USER_INITIATED = 0x19, + QOS_CLASS_DEFAULT = 0x15, + QOS_CLASS_UTILITY = 0x11, + QOS_CLASS_BACKGROUND = 0x09, + QOS_CLASS_UNSPECIFIED = 0x00, +} +impl ::Copy for qos_class_t {} +impl ::Clone for qos_class_t { + fn clone(&self) -> qos_class_t { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +#[repr(u32)] +pub enum sysdir_search_path_directory_t { + SYSDIR_DIRECTORY_APPLICATION = 1, + SYSDIR_DIRECTORY_DEMO_APPLICATION = 2, + SYSDIR_DIRECTORY_DEVELOPER_APPLICATION = 3, + SYSDIR_DIRECTORY_ADMIN_APPLICATION = 4, + SYSDIR_DIRECTORY_LIBRARY = 5, + SYSDIR_DIRECTORY_DEVELOPER = 6, + SYSDIR_DIRECTORY_USER = 7, + SYSDIR_DIRECTORY_DOCUMENTATION = 8, + SYSDIR_DIRECTORY_DOCUMENT = 9, + SYSDIR_DIRECTORY_CORESERVICE = 10, + SYSDIR_DIRECTORY_AUTOSAVED_INFORMATION = 11, + SYSDIR_DIRECTORY_DESKTOP = 12, + SYSDIR_DIRECTORY_CACHES = 13, + SYSDIR_DIRECTORY_APPLICATION_SUPPORT = 14, + SYSDIR_DIRECTORY_DOWNLOADS = 15, + SYSDIR_DIRECTORY_INPUT_METHODS = 16, + SYSDIR_DIRECTORY_MOVIES = 17, + SYSDIR_DIRECTORY_MUSIC = 18, + SYSDIR_DIRECTORY_PICTURES = 19, + SYSDIR_DIRECTORY_PRINTER_DESCRIPTION = 20, + SYSDIR_DIRECTORY_SHARED_PUBLIC = 21, + SYSDIR_DIRECTORY_PREFERENCE_PANES = 22, + SYSDIR_DIRECTORY_ALL_APPLICATIONS = 100, + SYSDIR_DIRECTORY_ALL_LIBRARIES = 101, +} +impl ::Copy for sysdir_search_path_directory_t {} +impl ::Clone for sysdir_search_path_directory_t { + fn clone(&self) -> sysdir_search_path_directory_t { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +#[repr(u32)] +pub enum sysdir_search_path_domain_mask_t { + SYSDIR_DOMAIN_MASK_USER = (1 << 0), + SYSDIR_DOMAIN_MASK_LOCAL = (1 << 1), + SYSDIR_DOMAIN_MASK_NETWORK = (1 << 2), + SYSDIR_DOMAIN_MASK_SYSTEM = (1 << 3), + SYSDIR_DOMAIN_MASK_ALL = 0x0ffff, +} +impl ::Copy for sysdir_search_path_domain_mask_t {} +impl ::Clone for sysdir_search_path_domain_mask_t { + fn clone(&self) -> sysdir_search_path_domain_mask_t { + *self + } +} + +s! { + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ip_mreqn { + pub imr_multiaddr: in_addr, + pub imr_address: in_addr, + pub imr_ifindex: ::c_int, + } + + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_sourceaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_reqprio: ::c_int, + pub aio_sigevent: sigevent, + pub aio_lio_opcode: ::c_int + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + __unused1: ::c_int, + pub gl_offs: ::size_t, + __unused2: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + + __unused3: *mut ::c_void, + + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + #[deprecated( + since = "0.2.55", + note = "Use the `mach2` crate instead", + )] + pub struct mach_timebase_info { + pub numer: u32, + pub denom: u32, + } + + pub struct stat { + pub st_dev: dev_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_ino: ino_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: dev_t, + pub st_atime: time_t, + pub st_atime_nsec: c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: c_long, + pub st_birthtime: time_t, + pub st_birthtime_nsec: c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: blksize_t, + pub st_flags: u32, + pub st_gen: u32, + pub st_lspare: i32, + pub st_qspare: [i64; 2], + } + + pub struct pthread_mutexattr_t { + __sig: ::c_long, + __opaque: [u8; 8], + } + + pub struct pthread_condattr_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_CONDATTR_SIZE__], + } + + pub struct pthread_rwlockattr_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_RWLOCKATTR_SIZE__], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + //Requires it to be union for tests + //pub si_value: ::sigval, + _pad: [usize; 9], + } + + pub struct sigaction { + // FIXME: this field is actually a union + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + pub sa_flags: ::c_int, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct fstore_t { + pub fst_flags: ::c_uint, + pub fst_posmode: ::c_int, + pub fst_offset: ::off_t, + pub fst_length: ::off_t, + pub fst_bytesalloc: ::off_t, + } + + pub struct radvisory { + pub ra_offset: ::off_t, + pub ra_count: ::c_int, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct kevent64_s { + pub ident: u64, + pub filter: i16, + pub flags: u16, + pub fflags: u32, + pub data: i64, + pub udata: u64, + pub ext: [u64; 2], + } + + pub struct dqblk { + pub dqb_bhardlimit: u64, + pub dqb_bsoftlimit: u64, + pub dqb_curbytes: u64, + pub dqb_ihardlimit: u32, + pub dqb_isoftlimit: u32, + pub dqb_curinodes: u32, + pub dqb_btime: u32, + pub dqb_itime: u32, + pub dqb_id: u32, + pub dqb_spare: [u32; 4], + } + + pub struct if_msghdr { + pub ifm_msglen: ::c_ushort, + pub ifm_version: ::c_uchar, + pub ifm_type: ::c_uchar, + pub ifm_addrs: ::c_int, + pub ifm_flags: ::c_int, + pub ifm_index: ::c_ushort, + pub ifm_data: if_data, + } + + pub struct ifa_msghdr { + pub ifam_msglen: ::c_ushort, + pub ifam_version: ::c_uchar, + pub ifam_type: ::c_uchar, + pub ifam_addrs: ::c_int, + pub ifam_flags: ::c_int, + pub ifam_index: ::c_ushort, + pub ifam_metric: ::c_int, + } + + pub struct ifma_msghdr { + pub ifmam_msglen: ::c_ushort, + pub ifmam_version: ::c_uchar, + pub ifmam_type: ::c_uchar, + pub ifmam_addrs: ::c_int, + pub ifmam_flags: ::c_int, + pub ifmam_index: ::c_ushort, + } + + pub struct ifma_msghdr2 { + pub ifmam_msglen: ::c_ushort, + pub ifmam_version: ::c_uchar, + pub ifmam_type: ::c_uchar, + pub ifmam_addrs: ::c_int, + pub ifmam_flags: ::c_int, + pub ifmam_index: ::c_ushort, + pub ifmam_refcount: i32, + } + + pub struct rt_metrics { + pub rmx_locks: u32, + pub rmx_mtu: u32, + pub rmx_hopcount: u32, + pub rmx_expire: i32, + pub rmx_recvpipe: u32, + pub rmx_sendpipe: u32, + pub rmx_ssthresh: u32, + pub rmx_rtt: u32, + pub rmx_rttvar: u32, + pub rmx_pksent: u32, + pub rmx_state: u32, + pub rmx_filler: [u32; 3], + } + + pub struct rt_msghdr { + pub rtm_msglen: ::c_ushort, + pub rtm_version: ::c_uchar, + pub rtm_type: ::c_uchar, + pub rtm_index: ::c_ushort, + pub rtm_flags: ::c_int, + pub rtm_addrs: ::c_int, + pub rtm_pid: ::pid_t, + pub rtm_seq: ::c_int, + pub rtm_errno: ::c_int, + pub rtm_use: ::c_int, + pub rtm_inits: u32, + pub rtm_rmx: rt_metrics, + } + + pub struct rt_msghdr2 { + pub rtm_msglen: ::c_ushort, + pub rtm_version: ::c_uchar, + pub rtm_type: ::c_uchar, + pub rtm_index: ::c_ushort, + pub rtm_flags: ::c_int, + pub rtm_addrs: ::c_int, + pub rtm_refcnt: i32, + pub rtm_parentflags: ::c_int, + pub rtm_reserved: ::c_int, + pub rtm_use: ::c_int, + pub rtm_inits: u32, + pub rtm_rmx: rt_metrics, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + } + + pub struct sf_hdtr { + pub headers: *mut ::iovec, + pub hdr_cnt: ::c_int, + pub trailers: *mut ::iovec, + pub trl_cnt: ::c_int, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct proc_taskinfo { + pub pti_virtual_size: u64, + pub pti_resident_size: u64, + pub pti_total_user: u64, + pub pti_total_system: u64, + pub pti_threads_user: u64, + pub pti_threads_system: u64, + pub pti_policy: i32, + pub pti_faults: i32, + pub pti_pageins: i32, + pub pti_cow_faults: i32, + pub pti_messages_sent: i32, + pub pti_messages_received: i32, + pub pti_syscalls_mach: i32, + pub pti_syscalls_unix: i32, + pub pti_csw: i32, + pub pti_threadnum: i32, + pub pti_numrunning: i32, + pub pti_priority: i32, + } + + pub struct proc_bsdinfo { + pub pbi_flags: u32, + pub pbi_status: u32, + pub pbi_xstatus: u32, + pub pbi_pid: u32, + pub pbi_ppid: u32, + pub pbi_uid: ::uid_t, + pub pbi_gid: ::gid_t, + pub pbi_ruid: ::uid_t, + pub pbi_rgid: ::gid_t, + pub pbi_svuid: ::uid_t, + pub pbi_svgid: ::gid_t, + pub rfu_1: u32, + pub pbi_comm: [::c_char; MAXCOMLEN], + pub pbi_name: [::c_char; 32], // MAXCOMLEN * 2, but macro isn't happy... + pub pbi_nfiles: u32, + pub pbi_pgid: u32, + pub pbi_pjobc: u32, + pub e_tdev: u32, + pub e_tpgid: u32, + pub pbi_nice: i32, + pub pbi_start_tvsec: u64, + pub pbi_start_tvusec: u64, + } + + pub struct proc_taskallinfo { + pub pbsd: proc_bsdinfo, + pub ptinfo: proc_taskinfo, + } + + pub struct xsw_usage { + pub xsu_total: u64, + pub xsu_avail: u64, + pub xsu_used: u64, + pub xsu_pagesize: u32, + pub xsu_encrypted: ::boolean_t, + } + + pub struct xucred { + pub cr_version: ::c_uint, + pub cr_uid: ::uid_t, + pub cr_ngroups: ::c_short, + pub cr_groups: [::gid_t;16] + } + + #[deprecated( + since = "0.2.55", + note = "Use the `mach2` crate instead", + )] + pub struct mach_header { + pub magic: u32, + pub cputype: cpu_type_t, + pub cpusubtype: cpu_subtype_t, + pub filetype: u32, + pub ncmds: u32, + pub sizeofcmds: u32, + pub flags: u32, + } + + #[deprecated( + since = "0.2.55", + note = "Use the `mach2` crate instead", + )] + pub struct mach_header_64 { + pub magic: u32, + pub cputype: cpu_type_t, + pub cpusubtype: cpu_subtype_t, + pub filetype: u32, + pub ncmds: u32, + pub sizeofcmds: u32, + pub flags: u32, + pub reserved: u32, + } + + pub struct segment_command { + pub cmd: u32, + pub cmdsize: u32, + pub segname: [::c_char; 16], + pub vmaddr: u32, + pub vmsize: u32, + pub fileoff: u32, + pub filesize: u32, + pub maxprot: vm_prot_t, + pub initprot: vm_prot_t, + pub nsects: u32, + pub flags: u32, + } + + pub struct segment_command_64 { + pub cmd: u32, + pub cmdsize: u32, + pub segname: [::c_char; 16], + pub vmaddr: u64, + pub vmsize: u64, + pub fileoff: u64, + pub filesize: u64, + pub maxprot: vm_prot_t, + pub initprot: vm_prot_t, + pub nsects: u32, + pub flags: u32, + } + + pub struct load_command { + pub cmd: u32, + pub cmdsize: u32, + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 12], + } + + pub struct sockaddr_inarp { + pub sin_len: ::c_uchar, + pub sin_family: ::c_uchar, + pub sin_port: ::c_ushort, + pub sin_addr: ::in_addr, + pub sin_srcaddr: ::in_addr, + pub sin_tos: ::c_ushort, + pub sin_other: ::c_ushort, + } + + pub struct sockaddr_ctl { + pub sc_len: ::c_uchar, + pub sc_family: ::c_uchar, + pub ss_sysaddr: u16, + pub sc_id: u32, + pub sc_unit: u32, + pub sc_reserved: [u32; 5], + } + + pub struct in_pktinfo { + pub ipi_ifindex: ::c_uint, + pub ipi_spec_dst: ::in_addr, + pub ipi_addr: ::in_addr, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } + + // sys/ipc.h: + + pub struct ipc_perm { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub _seq: ::c_ushort, + pub _key: ::key_t, + } + + // sys/sem.h + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + // sys/shm.h + + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + // net/ndrv.h + pub struct sockaddr_ndrv { + pub snd_len: ::c_uchar, + pub snd_family: ::c_uchar, + pub snd_name: [::c_uchar; 16] // IFNAMSIZ from if.h + } + + // sys/socket.h + + pub struct sa_endpoints_t { + pub sae_srcif: ::c_uint, // optional source interface + pub sae_srcaddr: *const ::sockaddr, // optional source address + pub sae_srcaddrlen: ::socklen_t, // size of source address + pub sae_dstaddr: *const ::sockaddr, // destination address + pub sae_dstaddrlen: ::socklen_t, // size of destination address + } + + pub struct timex { + pub modes: ::c_uint, + pub offset: ::c_long, + pub freq: ::c_long, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub status: ::c_int, + pub constant: ::c_long, + pub precision: ::c_long, + pub tolerance: ::c_long, + pub ppsfreq: ::c_long, + pub jitter: ::c_long, + pub shift: ::c_int, + pub stabil: ::c_long, + pub jitcnt: ::c_long, + pub calcnt: ::c_long, + pub errcnt: ::c_long, + pub stbcnt: ::c_long, + } + + pub struct ntptimeval { + pub time: ::timespec, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub tai: ::c_long, + pub time_state: ::c_int, + } + + pub struct thread_standard_policy { + pub no_data: natural_t, + } + + pub struct thread_extended_policy { + pub timeshare: boolean_t, + } + + pub struct thread_time_constraint_policy { + pub period: u32, + pub computation: u32, + pub constraint: u32, + pub preemptible: boolean_t, + } + + pub struct thread_precedence_policy { + pub importance: integer_t, + } + + pub struct thread_affinity_policy { + pub affinity_tag: integer_t, + } + + pub struct thread_background_policy { + pub priority: integer_t, + } + + pub struct thread_latency_qos_policy { + pub thread_latency_qos_tier: thread_latency_qos_t, + } + + pub struct thread_throughput_qos_policy { + pub thread_throughput_qos_tier: thread_throughput_qos_t, + } + + // malloc/malloc.h + pub struct malloc_statistics_t { + pub blocks_in_use: ::c_uint, + pub size_in_use: ::size_t, + pub max_size_in_use: ::size_t, + pub size_allocated: ::size_t, + } + + pub struct mstats { + pub bytes_total: ::size_t, + pub chunks_used: ::size_t, + pub bytes_used: ::size_t, + pub chunks_free: ::size_t, + pub bytes_free: ::size_t, + } + + pub struct vm_range_t { + pub address: ::vm_address_t, + pub size: ::vm_size_t, + } + + // sched.h + pub struct sched_param { + pub sched_priority: ::c_int, + __opaque: [::c_char; 4], + } + + pub struct vinfo_stat { + pub vst_dev: u32, + pub vst_mode: u16, + pub vst_nlink: u16, + pub vst_ino: u64, + pub vst_uid: ::uid_t, + pub vst_gid: ::gid_t, + pub vst_atime: i64, + pub vst_atimensec: i64, + pub vst_mtime: i64, + pub vst_mtimensec: i64, + pub vst_ctime: i64, + pub vst_ctimensec: i64, + pub vst_birthtime: i64, + pub vst_birthtimensec: i64, + pub vst_size: ::off_t, + pub vst_blocks: i64, + pub vst_blksize: i32, + pub vst_flags: u32, + pub vst_gen: u32, + pub vst_rdev: u32, + pub vst_qspare: [i64; 2], + } + + pub struct vnode_info { + pub vi_stat: vinfo_stat, + pub vi_type: ::c_int, + pub vi_pad: ::c_int, + pub vi_fsid: ::fsid_t, + } + + pub struct vnode_info_path { + pub vip_vi: vnode_info, + // Normally it's `vip_path: [::c_char; MAXPATHLEN]` but because libc supports an old rustc + // version, we go around this limitation like this. + pub vip_path: [[::c_char; 32]; 32], + } + + pub struct proc_vnodepathinfo { + pub pvi_cdir: vnode_info_path, + pub pvi_rdir: vnode_info_path, + } + + pub struct vm_statistics { + pub free_count: natural_t, + pub active_count: natural_t, + pub inactive_count: natural_t, + pub wire_count: natural_t, + pub zero_fill_count: natural_t, + pub reactivations: natural_t, + pub pageins: natural_t, + pub pageouts: natural_t, + pub faults: natural_t, + pub cow_faults: natural_t, + pub lookups: natural_t, + pub hits: natural_t, + pub purgeable_count: natural_t, + pub purges: natural_t, + pub speculative_count: natural_t, + } + + pub struct task_thread_times_info { + pub user_time: time_value_t, + pub system_time: time_value_t, + } + + pub struct rusage_info_v0 { + pub ri_uuid: [u8; 16], + pub ri_user_time: u64, + pub ri_system_time: u64, + pub ri_pkg_idle_wkups: u64, + pub ri_interrupt_wkups: u64, + pub ri_pageins: u64, + pub ri_wired_size: u64, + pub ri_resident_size: u64, + pub ri_phys_footprint: u64, + pub ri_proc_start_abstime: u64, + pub ri_proc_exit_abstime: u64, + } + + pub struct rusage_info_v1 { + pub ri_uuid: [u8; 16], + pub ri_user_time: u64, + pub ri_system_time: u64, + pub ri_pkg_idle_wkups: u64, + pub ri_interrupt_wkups: u64, + pub ri_pageins: u64, + pub ri_wired_size: u64, + pub ri_resident_size: u64, + pub ri_phys_footprint: u64, + pub ri_proc_start_abstime: u64, + pub ri_proc_exit_abstime: u64, + pub ri_child_user_time: u64, + pub ri_child_system_time: u64, + pub ri_child_pkg_idle_wkups: u64, + pub ri_child_interrupt_wkups: u64, + pub ri_child_pageins: u64, + pub ri_child_elapsed_abstime: u64, + } + + pub struct rusage_info_v2 { + pub ri_uuid: [u8; 16], + pub ri_user_time: u64, + pub ri_system_time: u64, + pub ri_pkg_idle_wkups: u64, + pub ri_interrupt_wkups: u64, + pub ri_pageins: u64, + pub ri_wired_size: u64, + pub ri_resident_size: u64, + pub ri_phys_footprint: u64, + pub ri_proc_start_abstime: u64, + pub ri_proc_exit_abstime: u64, + pub ri_child_user_time: u64, + pub ri_child_system_time: u64, + pub ri_child_pkg_idle_wkups: u64, + pub ri_child_interrupt_wkups: u64, + pub ri_child_pageins: u64, + pub ri_child_elapsed_abstime: u64, + pub ri_diskio_bytesread: u64, + pub ri_diskio_byteswritten: u64, + } + + pub struct rusage_info_v3 { + pub ri_uuid: [u8; 16], + pub ri_user_time: u64, + pub ri_system_time: u64, + pub ri_pkg_idle_wkups: u64, + pub ri_interrupt_wkups: u64, + pub ri_pageins: u64, + pub ri_wired_size: u64, + pub ri_resident_size: u64, + pub ri_phys_footprint: u64, + pub ri_proc_start_abstime: u64, + pub ri_proc_exit_abstime: u64, + pub ri_child_user_time: u64, + pub ri_child_system_time: u64, + pub ri_child_pkg_idle_wkups: u64, + pub ri_child_interrupt_wkups: u64, + pub ri_child_pageins: u64, + pub ri_child_elapsed_abstime: u64, + pub ri_diskio_bytesread: u64, + pub ri_diskio_byteswritten: u64, + pub ri_cpu_time_qos_default: u64, + pub ri_cpu_time_qos_maintenance: u64, + pub ri_cpu_time_qos_background: u64, + pub ri_cpu_time_qos_utility: u64, + pub ri_cpu_time_qos_legacy: u64, + pub ri_cpu_time_qos_user_initiated: u64, + pub ri_cpu_time_qos_user_interactive: u64, + pub ri_billed_system_time: u64, + pub ri_serviced_system_time: u64, + } + + pub struct rusage_info_v4 { + pub ri_uuid: [u8; 16], + pub ri_user_time: u64, + pub ri_system_time: u64, + pub ri_pkg_idle_wkups: u64, + pub ri_interrupt_wkups: u64, + pub ri_pageins: u64, + pub ri_wired_size: u64, + pub ri_resident_size: u64, + pub ri_phys_footprint: u64, + pub ri_proc_start_abstime: u64, + pub ri_proc_exit_abstime: u64, + pub ri_child_user_time: u64, + pub ri_child_system_time: u64, + pub ri_child_pkg_idle_wkups: u64, + pub ri_child_interrupt_wkups: u64, + pub ri_child_pageins: u64, + pub ri_child_elapsed_abstime: u64, + pub ri_diskio_bytesread: u64, + pub ri_diskio_byteswritten: u64, + pub ri_cpu_time_qos_default: u64, + pub ri_cpu_time_qos_maintenance: u64, + pub ri_cpu_time_qos_background: u64, + pub ri_cpu_time_qos_utility: u64, + pub ri_cpu_time_qos_legacy: u64, + pub ri_cpu_time_qos_user_initiated: u64, + pub ri_cpu_time_qos_user_interactive: u64, + pub ri_billed_system_time: u64, + pub ri_serviced_system_time: u64, + pub ri_logical_writes: u64, + pub ri_lifetime_max_phys_footprint: u64, + pub ri_instructions: u64, + pub ri_cycles: u64, + pub ri_billed_energy: u64, + pub ri_serviced_energy: u64, + pub ri_interval_max_phys_footprint: u64, + pub ri_runnable_time: u64, + } + + pub struct image_offset { + pub uuid: ::uuid_t, + pub offset: u32, + } + + pub struct attrlist { + pub bitmapcount: ::c_ushort, + pub reserved: u16, + pub commonattr: attrgroup_t, + pub volattr: attrgroup_t, + pub dirattr: attrgroup_t, + pub fileattr: attrgroup_t, + pub forkattr: attrgroup_t, + } + + pub struct attrreference_t { + pub attr_dataoffset: i32, + pub attr_length: u32, + } + + pub struct vol_capabilities_attr_t { + pub capabilities: vol_capabilities_set_t, + pub valid: vol_capabilities_set_t, + } + + pub struct attribute_set_t { + pub commonattr: attrgroup_t, + pub volattr: attrgroup_t, + pub dirattr: attrgroup_t, + pub fileattr: attrgroup_t, + pub forkattr: attrgroup_t, + } + + pub struct vol_attributes_attr_t { + pub validattr: attribute_set_t, + pub nativeattr: attribute_set_t, + } +} + +s_no_extra_traits! { + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: i16, + pub flags: u16, + pub fflags: u32, + pub data: ::intptr_t, + pub udata: *mut ::c_void, + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct semid_ds { + // Note the manpage shows different types than the system header. + pub sem_perm: ipc_perm, + pub sem_base: i32, + pub sem_nsems: ::c_ushort, + pub sem_otime: ::time_t, + pub sem_pad1: i32, + pub sem_ctime: ::time_t, + pub sem_pad2: i32, + pub sem_pad3: [i32; 4], + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct shmid_ds { + pub shm_perm: ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, // FIXME: 64-bit wrong align => wrong offset + pub shm_dtime: ::time_t, // FIXME: 64-bit wrong align => wrong offset + pub shm_ctime: ::time_t, // FIXME: 64-bit wrong align => wrong offset + // FIXME: 64-bit wrong align => wrong offset: + pub shm_internal: *mut ::c_void, + } + + pub struct proc_threadinfo { + pub pth_user_time: u64, + pub pth_system_time: u64, + pub pth_cpu_usage: i32, + pub pth_policy: i32, + pub pth_run_state: i32, + pub pth_flags: i32, + pub pth_sleep_time: i32, + pub pth_curpri: i32, + pub pth_priority: i32, + pub pth_maxpriority: i32, + pub pth_name: [::c_char; MAXTHREADNAMESIZE], + } + + pub struct statfs { + pub f_bsize: u32, + pub f_iosize: i32, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_owner: ::uid_t, + pub f_type: u32, + pub f_flags: u32, + pub f_fssubtype: u32, + pub f_fstypename: [::c_char; 16], + pub f_mntonname: [::c_char; 1024], + pub f_mntfromname: [::c_char; 1024], + pub f_flags_ext: u32, + pub f_reserved: [u32; 7], + } + + pub struct dirent { + pub d_ino: u64, + pub d_seekoff: u64, + pub d_reclen: u16, + pub d_namlen: u16, + pub d_type: u8, + pub d_name: [::c_char; 1024], + } + + pub struct pthread_rwlock_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_RWLOCK_SIZE__], + } + + pub struct pthread_mutex_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_MUTEX_SIZE__], + } + + pub struct pthread_cond_t { + __sig: ::c_long, + __opaque: [u8; __PTHREAD_COND_SIZE__], + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 112], + } + + pub struct utmpx { + pub ut_user: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_host: [::c_char; _UTX_HOSTSIZE], + ut_pad: [u32; 16], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + __unused1: *mut ::c_void, //actually a function pointer + pub sigev_notify_attributes: *mut ::pthread_attr_t + } + + pub struct processor_cpu_load_info { + pub cpu_ticks: [::c_uint; CPU_STATE_MAX as usize], + } + + pub struct processor_basic_info { + pub cpu_type: cpu_type_t, + pub cpu_subtype: cpu_subtype_t, + pub running: ::boolean_t, + pub slot_num: ::c_int, + pub is_master: ::boolean_t, + } + + pub struct processor_set_basic_info { + pub processor_count: ::c_int, + pub default_policy: ::c_int, + } + + pub struct processor_set_load_info { + pub task_count: ::c_int, + pub thread_count: ::c_int, + pub load_average: integer_t, + pub mach_factor: integer_t, + } + + pub struct time_value_t { + pub seconds: integer_t, + pub microseconds: integer_t, + } + + pub struct thread_basic_info { + pub user_time: time_value_t, + pub system_time: time_value_t, + pub cpu_usage: ::integer_t, + pub policy: ::policy_t, + pub run_state: ::integer_t, + pub flags: ::integer_t, + pub suspend_count: ::integer_t, + pub sleep_time: ::integer_t, + } + + pub struct thread_identifier_info { + pub thread_id: u64, + pub thread_handle: u64, + pub dispatch_qaddr: u64, + } + + pub struct thread_extended_info { + pub pth_user_time: u64, + pub pth_system_time: u64, + pub pth_cpu_usage: i32, + pub pth_policy: i32, + pub pth_run_state: i32, + pub pth_flags: i32, + pub pth_sleep_time: i32, + pub pth_curpri: i32, + pub pth_priority: i32, + pub pth_maxpriority: i32, + pub pth_name: [::c_char; MAXTHREADNAMESIZE], + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct if_data64 { + pub ifi_type: ::c_uchar, + pub ifi_typelen: ::c_uchar, + pub ifi_physical: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_recvquota: ::c_uchar, + pub ifi_xmitquota: ::c_uchar, + pub ifi_unused1: ::c_uchar, + pub ifi_mtu: u32, + pub ifi_metric: u32, + pub ifi_baudrate: u64, + pub ifi_ipackets: u64, + pub ifi_ierrors: u64, + pub ifi_opackets: u64, + pub ifi_oerrors: u64, + pub ifi_collisions: u64, + pub ifi_ibytes: u64, + pub ifi_obytes: u64, + pub ifi_imcasts: u64, + pub ifi_omcasts: u64, + pub ifi_iqdrops: u64, + pub ifi_noproto: u64, + pub ifi_recvtiming: u32, + pub ifi_xmittiming: u32, + #[cfg(target_pointer_width = "32")] + pub ifi_lastchange: ::timeval, + #[cfg(not(target_pointer_width = "32"))] + pub ifi_lastchange: timeval32, + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct if_msghdr2 { + pub ifm_msglen: ::c_ushort, + pub ifm_version: ::c_uchar, + pub ifm_type: ::c_uchar, + pub ifm_addrs: ::c_int, + pub ifm_flags: ::c_int, + pub ifm_index: ::c_ushort, + pub ifm_snd_len: ::c_int, + pub ifm_snd_maxlen: ::c_int, + pub ifm_snd_drops: ::c_int, + pub ifm_timer: ::c_int, + pub ifm_data: if_data64, + } + + #[cfg_attr(libc_packedN, repr(packed(8)))] + pub struct vm_statistics64 { + pub free_count: natural_t, + pub active_count: natural_t, + pub inactive_count: natural_t, + pub wire_count: natural_t, + pub zero_fill_count: u64, + pub reactivations: u64, + pub pageins: u64, + pub pageouts: u64, + pub faults: u64, + pub cow_faults: u64, + pub lookups: u64, + pub hits: u64, + pub purges: u64, + pub purgeable_count: natural_t, + pub speculative_count: natural_t, + pub decompressions: u64, + pub compressions: u64, + pub swapins: u64, + pub swapouts: u64, + pub compressor_page_count: natural_t, + pub throttled_count: natural_t, + pub external_page_count: natural_t, + pub internal_page_count: natural_t, + pub total_uncompressed_pages_in_compressor: u64, + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct mach_task_basic_info { + pub virtual_size: mach_vm_size_t, + pub resident_size: mach_vm_size_t, + pub resident_size_max: mach_vm_size_t, + pub user_time: time_value_t, + pub system_time: time_value_t, + pub policy: ::policy_t, + pub suspend_count: integer_t, + } + + #[cfg_attr(libc_packedN, repr(packed(4)))] + pub struct log2phys { + pub l2p_flags: ::c_uint, + pub l2p_contigbytes: ::off_t, + pub l2p_devoffset: ::off_t, + } + + pub struct os_unfair_lock_s { + _os_unfair_lock_opaque: u32, + } + + #[cfg_attr(libc_packedN, repr(packed(1)))] + pub struct sockaddr_vm { + pub svm_len: ::c_uchar, + pub svm_family: ::sa_family_t, + pub svm_reserved1: ::c_ushort, + pub svm_port: ::c_uint, + pub svm_cid: ::c_uint, + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _si_pid: ::pid_t, + _si_uid: ::uid_t, + _si_status: ::c_int, + _si_addr: *mut ::c_void, + si_value: ::sigval, + } + + (*(self as *const siginfo_t as *const siginfo_timer)).si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.si_status + } +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + pub union semun { + pub val: ::c_int, + pub buf: *mut semid_ds, + pub array: *mut ::c_ushort, + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for semun { + fn eq(&self, other: &semun) -> bool { + unsafe { self.val == other.val } + } + } + impl Eq for semun {} + impl ::fmt::Debug for semun { + fn fmt(&self, f: &mut ::fmt::Formatter) + -> ::fmt::Result { + f.debug_struct("semun") + .field("val", unsafe { &self.val }) + .finish() + } + } + impl ::hash::Hash for semun { + fn hash(&self, state: &mut H) { + unsafe { self.val.hash(state) }; + } + } + } + } + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for kevent { + fn eq(&self, other: &kevent) -> bool { + self.ident == other.ident + && self.filter == other.filter + && self.flags == other.flags + && self.fflags == other.fflags + && self.data == other.data + && self.udata == other.udata + } + } + impl Eq for kevent {} + impl ::fmt::Debug for kevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ident = self.ident; + let filter = self.filter; + let flags = self.flags; + let fflags = self.fflags; + let data = self.data; + let udata = self.udata; + f.debug_struct("kevent") + .field("ident", &ident) + .field("filter", &filter) + .field("flags", &flags) + .field("fflags", &fflags) + .field("data", &data) + .field("udata", &udata) + .finish() + } + } + impl ::hash::Hash for kevent { + fn hash(&self, state: &mut H) { + let ident = self.ident; + let filter = self.filter; + let flags = self.flags; + let fflags = self.fflags; + let data = self.data; + let udata = self.udata; + ident.hash(state); + filter.hash(state); + flags.hash(state); + fflags.hash(state); + data.hash(state); + udata.hash(state); + } + } + + impl PartialEq for semid_ds { + fn eq(&self, other: &semid_ds) -> bool { + let sem_perm = self.sem_perm; + let sem_pad3 = self.sem_pad3; + let other_sem_perm = other.sem_perm; + let other_sem_pad3 = other.sem_pad3; + sem_perm == other_sem_perm + && self.sem_base == other.sem_base + && self.sem_nsems == other.sem_nsems + && self.sem_otime == other.sem_otime + && self.sem_pad1 == other.sem_pad1 + && self.sem_ctime == other.sem_ctime + && self.sem_pad2 == other.sem_pad2 + && sem_pad3 == other_sem_pad3 + } + } + impl Eq for semid_ds {} + impl ::fmt::Debug for semid_ds { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let sem_perm = self.sem_perm; + let sem_base = self.sem_base; + let sem_nsems = self.sem_nsems; + let sem_otime = self.sem_otime; + let sem_pad1 = self.sem_pad1; + let sem_ctime = self.sem_ctime; + let sem_pad2 = self.sem_pad2; + let sem_pad3 = self.sem_pad3; + f.debug_struct("semid_ds") + .field("sem_perm", &sem_perm) + .field("sem_base", &sem_base) + .field("sem_nsems", &sem_nsems) + .field("sem_otime", &sem_otime) + .field("sem_pad1", &sem_pad1) + .field("sem_ctime", &sem_ctime) + .field("sem_pad2", &sem_pad2) + .field("sem_pad3", &sem_pad3) + .finish() + } + } + impl ::hash::Hash for semid_ds { + fn hash(&self, state: &mut H) { + let sem_perm = self.sem_perm; + let sem_base = self.sem_base; + let sem_nsems = self.sem_nsems; + let sem_otime = self.sem_otime; + let sem_pad1 = self.sem_pad1; + let sem_ctime = self.sem_ctime; + let sem_pad2 = self.sem_pad2; + let sem_pad3 = self.sem_pad3; + sem_perm.hash(state); + sem_base.hash(state); + sem_nsems.hash(state); + sem_otime.hash(state); + sem_pad1.hash(state); + sem_ctime.hash(state); + sem_pad2.hash(state); + sem_pad3.hash(state); + } + } + + impl PartialEq for shmid_ds { + fn eq(&self, other: &shmid_ds) -> bool { + let shm_perm = self.shm_perm; + let other_shm_perm = other.shm_perm; + shm_perm == other_shm_perm + && self.shm_segsz == other.shm_segsz + && self.shm_lpid == other.shm_lpid + && self.shm_cpid == other.shm_cpid + && self.shm_nattch == other.shm_nattch + && self.shm_atime == other.shm_atime + && self.shm_dtime == other.shm_dtime + && self.shm_ctime == other.shm_ctime + && self.shm_internal == other.shm_internal + } + } + impl Eq for shmid_ds {} + impl ::fmt::Debug for shmid_ds { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let shm_perm = self.shm_perm; + let shm_segsz = self.shm_segsz; + let shm_lpid = self.shm_lpid; + let shm_cpid = self.shm_cpid; + let shm_nattch = self.shm_nattch; + let shm_atime = self.shm_atime; + let shm_dtime = self.shm_dtime; + let shm_ctime = self.shm_ctime; + let shm_internal = self.shm_internal; + f.debug_struct("shmid_ds") + .field("shm_perm", &shm_perm) + .field("shm_segsz", &shm_segsz) + .field("shm_lpid", &shm_lpid) + .field("shm_cpid", &shm_cpid) + .field("shm_nattch", &shm_nattch) + .field("shm_atime", &shm_atime) + .field("shm_dtime", &shm_dtime) + .field("shm_ctime", &shm_ctime) + .field("shm_internal", &shm_internal) + .finish() + } + } + impl ::hash::Hash for shmid_ds { + fn hash(&self, state: &mut H) { + let shm_perm = self.shm_perm; + let shm_segsz = self.shm_segsz; + let shm_lpid = self.shm_lpid; + let shm_cpid = self.shm_cpid; + let shm_nattch = self.shm_nattch; + let shm_atime = self.shm_atime; + let shm_dtime = self.shm_dtime; + let shm_ctime = self.shm_ctime; + let shm_internal = self.shm_internal; + shm_perm.hash(state); + shm_segsz.hash(state); + shm_lpid.hash(state); + shm_cpid.hash(state); + shm_nattch.hash(state); + shm_atime.hash(state); + shm_dtime.hash(state); + shm_ctime.hash(state); + shm_internal.hash(state); + } + } + + impl PartialEq for proc_threadinfo { + fn eq(&self, other: &proc_threadinfo) -> bool { + self.pth_user_time == other.pth_user_time + && self.pth_system_time == other.pth_system_time + && self.pth_cpu_usage == other.pth_cpu_usage + && self.pth_policy == other.pth_policy + && self.pth_run_state == other.pth_run_state + && self.pth_flags == other.pth_flags + && self.pth_sleep_time == other.pth_sleep_time + && self.pth_curpri == other.pth_curpri + && self.pth_priority == other.pth_priority + && self.pth_maxpriority == other.pth_maxpriority + && self.pth_name + .iter() + .zip(other.pth_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for proc_threadinfo {} + impl ::fmt::Debug for proc_threadinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("proc_threadinfo") + .field("pth_user_time", &self.pth_user_time) + .field("pth_system_time", &self.pth_system_time) + .field("pth_cpu_usage", &self.pth_cpu_usage) + .field("pth_policy", &self.pth_policy) + .field("pth_run_state", &self.pth_run_state) + .field("pth_flags", &self.pth_flags) + .field("pth_sleep_time", &self.pth_sleep_time) + .field("pth_curpri", &self.pth_curpri) + .field("pth_priority", &self.pth_priority) + .field("pth_maxpriority", &self.pth_maxpriority) + // FIXME: .field("pth_name", &self.pth_name) + .finish() + } + } + impl ::hash::Hash for proc_threadinfo { + fn hash(&self, state: &mut H) { + self.pth_user_time.hash(state); + self.pth_system_time.hash(state); + self.pth_cpu_usage.hash(state); + self.pth_policy.hash(state); + self.pth_run_state.hash(state); + self.pth_flags.hash(state); + self.pth_sleep_time.hash(state); + self.pth_curpri.hash(state); + self.pth_priority.hash(state); + self.pth_maxpriority.hash(state); + self.pth_name.hash(state); + } + } + + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_fsid == other.f_fsid + && self.f_owner == other.f_owner + && self.f_flags == other.f_flags + && self.f_fssubtype == other.f_fssubtype + && self.f_fstypename == other.f_fstypename + && self.f_type == other.f_type + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self.f_reserved == other.f_reserved + } + } + + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_fsid", &self.f_fsid) + .field("f_owner", &self.f_owner) + .field("f_flags", &self.f_flags) + .field("f_fssubtype", &self.f_fssubtype) + .field("f_fstypename", &self.f_fstypename) + .field("f_type", &self.f_type) + // FIXME: .field("f_mntonname", &self.f_mntonname) + // FIXME: .field("f_mntfromname", &self.f_mntfromname) + .field("f_reserved", &self.f_reserved) + .finish() + } + } + + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_fsid.hash(state); + self.f_owner.hash(state); + self.f_flags.hash(state); + self.f_fssubtype.hash(state); + self.f_fstypename.hash(state); + self.f_type.hash(state); + self.f_mntonname.hash(state); + self.f_mntfromname.hash(state); + self.f_reserved.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_seekoff == other.d_seekoff + && self.d_reclen == other.d_reclen + && self.d_namlen == other.d_namlen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_seekoff", &self.d_seekoff) + .field("d_reclen", &self.d_reclen) + .field("d_namlen", &self.d_namlen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_seekoff.hash(state); + self.d_reclen.hash(state); + self.d_namlen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + impl PartialEq for pthread_rwlock_t { + fn eq(&self, other: &pthread_rwlock_t) -> bool { + self.__sig == other.__sig + && self. + __opaque + .iter() + .zip(other.__opaque.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_rwlock_t {} + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + .field("__sig", &self.__sig) + // FIXME: .field("__opaque", &self.__opaque) + .finish() + } + } + impl ::hash::Hash for pthread_rwlock_t { + fn hash(&self, state: &mut H) { + self.__sig.hash(state); + self.__opaque.hash(state); + } + } + + impl PartialEq for pthread_mutex_t { + fn eq(&self, other: &pthread_mutex_t) -> bool { + self.__sig == other.__sig + && self. + __opaque + .iter() + .zip(other.__opaque.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for pthread_mutex_t {} + + impl ::fmt::Debug for pthread_mutex_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + .field("__sig", &self.__sig) + // FIXME: .field("__opaque", &self.__opaque) + .finish() + } + } + + impl ::hash::Hash for pthread_mutex_t { + fn hash(&self, state: &mut H) { + self.__sig.hash(state); + self.__opaque.hash(state); + } + } + + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.__sig == other.__sig + && self. + __opaque + .iter() + .zip(other.__opaque.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for pthread_cond_t {} + + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + .field("__sig", &self.__sig) + // FIXME: .field("__opaque", &self.__opaque) + .finish() + } + } + + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.__sig.hash(state); + self.__opaque.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + && self + .__ss_pad1 + .iter() + .zip(other.__ss_pad1.iter()) + .all(|(a, b)| a == b) + && self.__ss_align == other.__ss_align + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for sockaddr_storage {} + + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_align.hash(state); + self.__ss_pad2.hash(state); + } + } + + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_user + .iter() + .zip(other.ut_user.iter()) + .all(|(a,b)| a == b) + && self.ut_id == other.ut_id + && self.ut_line == other.ut_line + && self.ut_pid == other.ut_pid + && self.ut_type == other.ut_type + && self.ut_tv == other.ut_tv + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self.ut_pad == other.ut_pad + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + // FIXME: .field("ut_user", &self.ut_user) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + .field("ut_pid", &self.ut_pid) + .field("ut_type", &self.ut_type) + .field("ut_tv", &self.ut_tv) + // FIXME: .field("ut_host", &self.ut_host) + .field("ut_pad", &self.ut_pad) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_user.hash(state); + self.ut_id.hash(state); + self.ut_line.hash(state); + self.ut_pid.hash(state); + self.ut_type.hash(state); + self.ut_tv.hash(state); + self.ut_host.hash(state); + self.ut_pad.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.sigev_notify_attributes + == other.sigev_notify_attributes + } + } + + impl Eq for sigevent {} + + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("sigev_notify_attributes", + &self.sigev_notify_attributes) + .finish() + } + } + + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.sigev_notify_attributes.hash(state); + } + } + + impl PartialEq for processor_cpu_load_info { + fn eq(&self, other: &processor_cpu_load_info) -> bool { + self.cpu_ticks == other.cpu_ticks + } + } + impl Eq for processor_cpu_load_info {} + impl ::fmt::Debug for processor_cpu_load_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("processor_cpu_load_info") + .field("cpu_ticks", &self.cpu_ticks) + .finish() + } + } + impl ::hash::Hash for processor_cpu_load_info { + fn hash(&self, state: &mut H) { + self.cpu_ticks.hash(state); + } + } + + impl PartialEq for processor_basic_info { + fn eq(&self, other: &processor_basic_info) -> bool { + self.cpu_type == other.cpu_type + && self.cpu_subtype == other.cpu_subtype + && self.running == other.running + && self.slot_num == other.slot_num + && self.is_master == other.is_master + } + } + impl Eq for processor_basic_info {} + impl ::fmt::Debug for processor_basic_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("processor_basic_info") + .field("cpu_type", &self.cpu_type) + .field("cpu_subtype", &self.cpu_subtype) + .field("running", &self.running) + .field("slot_num", &self.slot_num) + .field("is_master", &self.is_master) + .finish() + } + } + impl ::hash::Hash for processor_basic_info { + fn hash(&self, state: &mut H) { + self.cpu_type.hash(state); + self.cpu_subtype.hash(state); + self.running.hash(state); + self.slot_num.hash(state); + self.is_master.hash(state); + } + } + + impl PartialEq for processor_set_basic_info { + fn eq(&self, other: &processor_set_basic_info) -> bool { + self.processor_count == other.processor_count + && self.default_policy == other.default_policy + } + } + impl Eq for processor_set_basic_info {} + impl ::fmt::Debug for processor_set_basic_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("processor_set_basic_info") + .field("processor_count", &self.processor_count) + .field("default_policy", &self.default_policy) + .finish() + } + } + impl ::hash::Hash for processor_set_basic_info { + fn hash(&self, state: &mut H) { + self.processor_count.hash(state); + self.default_policy.hash(state); + } + } + + impl PartialEq for processor_set_load_info { + fn eq(&self, other: &processor_set_load_info) -> bool { + self.task_count == other.task_count + && self.thread_count == other.thread_count + && self.load_average == other.load_average + && self.mach_factor == other.mach_factor + } + } + impl Eq for processor_set_load_info {} + impl ::fmt::Debug for processor_set_load_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("processor_set_load_info") + .field("task_count", &self.task_count) + .field("thread_count", &self.thread_count) + .field("load_average", &self.load_average) + .field("mach_factor", &self.mach_factor) + .finish() + } + } + impl ::hash::Hash for processor_set_load_info { + fn hash(&self, state: &mut H) { + self.task_count.hash(state); + self.thread_count.hash(state); + self.load_average.hash(state); + self.mach_factor.hash(state); + } + } + + impl PartialEq for time_value_t { + fn eq(&self, other: &time_value_t) -> bool { + self.seconds == other.seconds + && self.microseconds == other.microseconds + } + } + impl Eq for time_value_t {} + impl ::fmt::Debug for time_value_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("time_value_t") + .field("seconds", &self.seconds) + .field("microseconds", &self.microseconds) + .finish() + } + } + impl ::hash::Hash for time_value_t { + fn hash(&self, state: &mut H) { + self.seconds.hash(state); + self.microseconds.hash(state); + } + } + impl PartialEq for thread_basic_info { + fn eq(&self, other: &thread_basic_info) -> bool { + self.user_time == other.user_time + && self.system_time == other.system_time + && self.cpu_usage == other.cpu_usage + && self.policy == other.policy + && self.run_state == other.run_state + && self.flags == other.flags + && self.suspend_count == other.suspend_count + && self.sleep_time == other.sleep_time + } + } + impl Eq for thread_basic_info {} + impl ::fmt::Debug for thread_basic_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("thread_basic_info") + .field("user_time", &self.user_time) + .field("system_time", &self.system_time) + .field("cpu_usage", &self.cpu_usage) + .field("policy", &self.policy) + .field("run_state", &self.run_state) + .field("flags", &self.flags) + .field("suspend_count", &self.suspend_count) + .field("sleep_time", &self.sleep_time) + .finish() + } + } + impl ::hash::Hash for thread_basic_info { + fn hash(&self, state: &mut H) { + self.user_time.hash(state); + self.system_time.hash(state); + self.cpu_usage.hash(state); + self.policy.hash(state); + self.run_state.hash(state); + self.flags.hash(state); + self.suspend_count.hash(state); + self.sleep_time.hash(state); + } + } + impl PartialEq for thread_extended_info { + fn eq(&self, other: &thread_extended_info) -> bool { + self.pth_user_time == other.pth_user_time + && self.pth_system_time == other.pth_system_time + && self.pth_cpu_usage == other.pth_cpu_usage + && self.pth_policy == other.pth_policy + && self.pth_run_state == other.pth_run_state + && self.pth_flags == other.pth_flags + && self.pth_sleep_time == other.pth_sleep_time + && self.pth_curpri == other.pth_curpri + && self.pth_priority == other.pth_priority + && self.pth_maxpriority == other.pth_maxpriority + && self.pth_name + .iter() + .zip(other.pth_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for thread_extended_info {} + impl ::fmt::Debug for thread_extended_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("proc_threadinfo") + .field("pth_user_time", &self.pth_user_time) + .field("pth_system_time", &self.pth_system_time) + .field("pth_cpu_usage", &self.pth_cpu_usage) + .field("pth_policy", &self.pth_policy) + .field("pth_run_state", &self.pth_run_state) + .field("pth_flags", &self.pth_flags) + .field("pth_sleep_time", &self.pth_sleep_time) + .field("pth_curpri", &self.pth_curpri) + .field("pth_priority", &self.pth_priority) + .field("pth_maxpriority", &self.pth_maxpriority) + // FIXME: .field("pth_name", &self.pth_name) + .finish() + } + } + impl ::hash::Hash for thread_extended_info { + fn hash(&self, state: &mut H) { + self.pth_user_time.hash(state); + self.pth_system_time.hash(state); + self.pth_cpu_usage.hash(state); + self.pth_policy.hash(state); + self.pth_run_state.hash(state); + self.pth_flags.hash(state); + self.pth_sleep_time.hash(state); + self.pth_curpri.hash(state); + self.pth_priority.hash(state); + self.pth_maxpriority.hash(state); + self.pth_name.hash(state); + } + } + impl PartialEq for thread_identifier_info { + fn eq(&self, other: &thread_identifier_info) -> bool { + self.thread_id == other.thread_id + && self.thread_handle == other.thread_handle + && self.dispatch_qaddr == other.dispatch_qaddr + } + } + impl Eq for thread_identifier_info {} + impl ::fmt::Debug for thread_identifier_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("thread_identifier_info") + .field("thread_id", &self.thread_id) + .field("thread_handle", &self.thread_handle) + .field("dispatch_qaddr", &self.dispatch_qaddr) + .finish() + } + } + impl ::hash::Hash for thread_identifier_info { + fn hash(&self, state: &mut H) { + self.thread_id.hash(state); + self.thread_handle.hash(state); + self.dispatch_qaddr.hash(state); + } + } + impl PartialEq for if_data64 { + fn eq(&self, other: &if_data64) -> bool { + self.ifi_type == other.ifi_type && + self.ifi_typelen == other.ifi_typelen && + self.ifi_physical == other.ifi_physical && + self.ifi_addrlen == other.ifi_addrlen && + self.ifi_hdrlen == other.ifi_hdrlen && + self.ifi_recvquota == other.ifi_recvquota && + self.ifi_xmitquota == other.ifi_xmitquota && + self.ifi_unused1 == other.ifi_unused1 && + self.ifi_mtu == other.ifi_mtu && + self.ifi_metric == other.ifi_metric && + self.ifi_baudrate == other.ifi_baudrate && + self.ifi_ipackets == other.ifi_ipackets && + self.ifi_ierrors == other.ifi_ierrors && + self.ifi_opackets == other.ifi_opackets && + self.ifi_oerrors == other.ifi_oerrors && + self.ifi_collisions == other.ifi_collisions && + self.ifi_ibytes == other.ifi_ibytes && + self.ifi_obytes == other.ifi_obytes && + self.ifi_imcasts == other.ifi_imcasts && + self.ifi_omcasts == other.ifi_omcasts && + self.ifi_iqdrops == other.ifi_iqdrops && + self.ifi_noproto == other.ifi_noproto && + self.ifi_recvtiming == other.ifi_recvtiming && + self.ifi_xmittiming == other.ifi_xmittiming && + self.ifi_lastchange == other.ifi_lastchange + } + } + impl Eq for if_data64 {} + impl ::fmt::Debug for if_data64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ifi_type = self.ifi_type; + let ifi_typelen = self.ifi_typelen; + let ifi_physical = self.ifi_physical; + let ifi_addrlen = self.ifi_addrlen; + let ifi_hdrlen = self.ifi_hdrlen; + let ifi_recvquota = self.ifi_recvquota; + let ifi_xmitquota = self.ifi_xmitquota; + let ifi_unused1 = self.ifi_unused1; + let ifi_mtu = self.ifi_mtu; + let ifi_metric = self.ifi_metric; + let ifi_baudrate = self.ifi_baudrate; + let ifi_ipackets = self.ifi_ipackets; + let ifi_ierrors = self.ifi_ierrors; + let ifi_opackets = self.ifi_opackets; + let ifi_oerrors = self.ifi_oerrors; + let ifi_collisions = self.ifi_collisions; + let ifi_ibytes = self.ifi_ibytes; + let ifi_obytes = self.ifi_obytes; + let ifi_imcasts = self.ifi_imcasts; + let ifi_omcasts = self.ifi_omcasts; + let ifi_iqdrops = self.ifi_iqdrops; + let ifi_noproto = self.ifi_noproto; + let ifi_recvtiming = self.ifi_recvtiming; + let ifi_xmittiming = self.ifi_xmittiming; + let ifi_lastchange = self.ifi_lastchange; + f.debug_struct("if_data64") + .field("ifi_type", &ifi_type) + .field("ifi_typelen", &ifi_typelen) + .field("ifi_physical", &ifi_physical) + .field("ifi_addrlen", &ifi_addrlen) + .field("ifi_hdrlen", &ifi_hdrlen) + .field("ifi_recvquota", &ifi_recvquota) + .field("ifi_xmitquota", &ifi_xmitquota) + .field("ifi_unused1", &ifi_unused1) + .field("ifi_mtu", &ifi_mtu) + .field("ifi_metric", &ifi_metric) + .field("ifi_baudrate", &ifi_baudrate) + .field("ifi_ipackets", &ifi_ipackets) + .field("ifi_ierrors", &ifi_ierrors) + .field("ifi_opackets", &ifi_opackets) + .field("ifi_oerrors", &ifi_oerrors) + .field("ifi_collisions", &ifi_collisions) + .field("ifi_ibytes", &ifi_ibytes) + .field("ifi_obytes", &ifi_obytes) + .field("ifi_imcasts", &ifi_imcasts) + .field("ifi_omcasts", &ifi_omcasts) + .field("ifi_iqdrops", &ifi_iqdrops) + .field("ifi_noproto", &ifi_noproto) + .field("ifi_recvtiming", &ifi_recvtiming) + .field("ifi_xmittiming", &ifi_xmittiming) + .field("ifi_lastchange", &ifi_lastchange) + .finish() + } + } + impl ::hash::Hash for if_data64 { + fn hash(&self, state: &mut H) { + let ifi_type = self.ifi_type; + let ifi_typelen = self.ifi_typelen; + let ifi_physical = self.ifi_physical; + let ifi_addrlen = self.ifi_addrlen; + let ifi_hdrlen = self.ifi_hdrlen; + let ifi_recvquota = self.ifi_recvquota; + let ifi_xmitquota = self.ifi_xmitquota; + let ifi_unused1 = self.ifi_unused1; + let ifi_mtu = self.ifi_mtu; + let ifi_metric = self.ifi_metric; + let ifi_baudrate = self.ifi_baudrate; + let ifi_ipackets = self.ifi_ipackets; + let ifi_ierrors = self.ifi_ierrors; + let ifi_opackets = self.ifi_opackets; + let ifi_oerrors = self.ifi_oerrors; + let ifi_collisions = self.ifi_collisions; + let ifi_ibytes = self.ifi_ibytes; + let ifi_obytes = self.ifi_obytes; + let ifi_imcasts = self.ifi_imcasts; + let ifi_omcasts = self.ifi_omcasts; + let ifi_iqdrops = self.ifi_iqdrops; + let ifi_noproto = self.ifi_noproto; + let ifi_recvtiming = self.ifi_recvtiming; + let ifi_xmittiming = self.ifi_xmittiming; + let ifi_lastchange = self.ifi_lastchange; + ifi_type.hash(state); + ifi_typelen.hash(state); + ifi_physical.hash(state); + ifi_addrlen.hash(state); + ifi_hdrlen.hash(state); + ifi_recvquota.hash(state); + ifi_xmitquota.hash(state); + ifi_unused1.hash(state); + ifi_mtu.hash(state); + ifi_metric.hash(state); + ifi_baudrate.hash(state); + ifi_ipackets.hash(state); + ifi_ierrors.hash(state); + ifi_opackets.hash(state); + ifi_oerrors.hash(state); + ifi_collisions.hash(state); + ifi_ibytes.hash(state); + ifi_obytes.hash(state); + ifi_imcasts.hash(state); + ifi_omcasts.hash(state); + ifi_iqdrops.hash(state); + ifi_noproto.hash(state); + ifi_recvtiming.hash(state); + ifi_xmittiming.hash(state); + ifi_lastchange.hash(state); + } + } + impl PartialEq for if_msghdr2 { + fn eq(&self, other: &if_msghdr2) -> bool { + self.ifm_msglen == other.ifm_msglen && + self.ifm_version == other.ifm_version && + self.ifm_type == other.ifm_type && + self.ifm_addrs == other.ifm_addrs && + self.ifm_flags == other.ifm_flags && + self.ifm_index == other.ifm_index && + self.ifm_snd_len == other.ifm_snd_len && + self.ifm_snd_maxlen == other.ifm_snd_maxlen && + self.ifm_snd_drops == other.ifm_snd_drops && + self.ifm_timer == other.ifm_timer && + self.ifm_data == other.ifm_data + } + } + impl Eq for if_msghdr2 {} + impl ::fmt::Debug for if_msghdr2 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ifm_msglen = self.ifm_msglen; + let ifm_version = self.ifm_version; + let ifm_type = self.ifm_type; + let ifm_addrs = self.ifm_addrs; + let ifm_flags = self.ifm_flags; + let ifm_index = self.ifm_index; + let ifm_snd_len = self.ifm_snd_len; + let ifm_snd_maxlen = self.ifm_snd_maxlen; + let ifm_snd_drops = self.ifm_snd_drops; + let ifm_timer = self.ifm_timer; + let ifm_data = self.ifm_data; + f.debug_struct("if_msghdr2") + .field("ifm_msglen", &ifm_msglen) + .field("ifm_version", &ifm_version) + .field("ifm_type", &ifm_type) + .field("ifm_addrs", &ifm_addrs) + .field("ifm_flags", &ifm_flags) + .field("ifm_index", &ifm_index) + .field("ifm_snd_len", &ifm_snd_len) + .field("ifm_snd_maxlen", &ifm_snd_maxlen) + .field("ifm_snd_drops", &ifm_snd_drops) + .field("ifm_timer", &ifm_timer) + .field("ifm_data", &ifm_data) + .finish() + } + } + impl ::hash::Hash for if_msghdr2 { + fn hash(&self, state: &mut H) { + let ifm_msglen = self.ifm_msglen; + let ifm_version = self.ifm_version; + let ifm_type = self.ifm_type; + let ifm_addrs = self.ifm_addrs; + let ifm_flags = self.ifm_flags; + let ifm_index = self.ifm_index; + let ifm_snd_len = self.ifm_snd_len; + let ifm_snd_maxlen = self.ifm_snd_maxlen; + let ifm_snd_drops = self.ifm_snd_drops; + let ifm_timer = self.ifm_timer; + let ifm_data = self.ifm_data; + ifm_msglen.hash(state); + ifm_version.hash(state); + ifm_type.hash(state); + ifm_addrs.hash(state); + ifm_flags.hash(state); + ifm_index.hash(state); + ifm_snd_len.hash(state); + ifm_snd_maxlen.hash(state); + ifm_snd_drops.hash(state); + ifm_timer.hash(state); + ifm_data.hash(state); + } + } + impl PartialEq for vm_statistics64 { + fn eq(&self, other: &vm_statistics64) -> bool { + // Otherwise rustfmt crashes... + let total_uncompressed = self.total_uncompressed_pages_in_compressor; + self.free_count == other.free_count && + self.active_count == other.active_count && + self.inactive_count == other.inactive_count && + self.wire_count == other.wire_count && + self.zero_fill_count == other.zero_fill_count && + self.reactivations == other.reactivations && + self.pageins == other.pageins && + self.pageouts == other.pageouts && + self.faults == other.faults && + self.cow_faults == other.cow_faults && + self.lookups == other.lookups && + self.hits == other.hits && + self.purges == other.purges && + self.purgeable_count == other.purgeable_count && + self.speculative_count == other.speculative_count && + self.decompressions == other.decompressions && + self.compressions == other.compressions && + self.swapins == other.swapins && + self.swapouts == other.swapouts && + self.compressor_page_count == other.compressor_page_count && + self.throttled_count == other.throttled_count && + self.external_page_count == other.external_page_count && + self.internal_page_count == other.internal_page_count && + total_uncompressed == other.total_uncompressed_pages_in_compressor + } + } + impl Eq for vm_statistics64 {} + impl ::fmt::Debug for vm_statistics64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let free_count = self.free_count; + let active_count = self.active_count; + let inactive_count = self.inactive_count; + let wire_count = self.wire_count; + let zero_fill_count = self.zero_fill_count; + let reactivations = self.reactivations; + let pageins = self.pageins; + let pageouts = self.pageouts; + let faults = self.faults; + let cow_faults = self.cow_faults; + let lookups = self.lookups; + let hits = self.hits; + let purges = self.purges; + let purgeable_count = self.purgeable_count; + let speculative_count = self.speculative_count; + let decompressions = self.decompressions; + let compressions = self.compressions; + let swapins = self.swapins; + let swapouts = self.swapouts; + let compressor_page_count = self.compressor_page_count; + let throttled_count = self.throttled_count; + let external_page_count = self.external_page_count; + let internal_page_count = self.internal_page_count; + // Otherwise rustfmt crashes... + let total_uncompressed = self.total_uncompressed_pages_in_compressor; + f.debug_struct("vm_statistics64") + .field("free_count", &free_count) + .field("active_count", &active_count) + .field("inactive_count", &inactive_count) + .field("wire_count", &wire_count) + .field("zero_fill_count", &zero_fill_count) + .field("reactivations", &reactivations) + .field("pageins", &pageins) + .field("pageouts", &pageouts) + .field("faults", &faults) + .field("cow_faults", &cow_faults) + .field("lookups", &lookups) + .field("hits", &hits) + .field("purges", &purges) + .field("purgeable_count", &purgeable_count) + .field("speculative_count", &speculative_count) + .field("decompressions", &decompressions) + .field("compressions", &compressions) + .field("swapins", &swapins) + .field("swapouts", &swapouts) + .field("compressor_page_count", &compressor_page_count) + .field("throttled_count", &throttled_count) + .field("external_page_count", &external_page_count) + .field("internal_page_count", &internal_page_count) + .field("total_uncompressed_pages_in_compressor", &total_uncompressed) + .finish() + } + } + impl ::hash::Hash for vm_statistics64 { + fn hash(&self, state: &mut H) { + let free_count = self.free_count; + let active_count = self.active_count; + let inactive_count = self.inactive_count; + let wire_count = self.wire_count; + let zero_fill_count = self.zero_fill_count; + let reactivations = self.reactivations; + let pageins = self.pageins; + let pageouts = self.pageouts; + let faults = self.faults; + let cow_faults = self.cow_faults; + let lookups = self.lookups; + let hits = self.hits; + let purges = self.purges; + let purgeable_count = self.purgeable_count; + let speculative_count = self.speculative_count; + let decompressions = self.decompressions; + let compressions = self.compressions; + let swapins = self.swapins; + let swapouts = self.swapouts; + let compressor_page_count = self.compressor_page_count; + let throttled_count = self.throttled_count; + let external_page_count = self.external_page_count; + let internal_page_count = self.internal_page_count; + // Otherwise rustfmt crashes... + let total_uncompressed = self.total_uncompressed_pages_in_compressor; + free_count.hash(state); + active_count.hash(state); + inactive_count.hash(state); + wire_count.hash(state); + zero_fill_count.hash(state); + reactivations.hash(state); + pageins.hash(state); + pageouts.hash(state); + faults.hash(state); + cow_faults.hash(state); + lookups.hash(state); + hits.hash(state); + purges.hash(state); + purgeable_count.hash(state); + speculative_count.hash(state); + decompressions.hash(state); + compressions.hash(state); + swapins.hash(state); + swapouts.hash(state); + compressor_page_count.hash(state); + throttled_count.hash(state); + external_page_count.hash(state); + internal_page_count.hash(state); + total_uncompressed.hash(state); + } + } + + impl PartialEq for mach_task_basic_info { + fn eq(&self, other: &mach_task_basic_info) -> bool { + self.virtual_size == other.virtual_size + && self.resident_size == other.resident_size + && self.resident_size_max == other.resident_size_max + && self.user_time == other.user_time + && self.system_time == other.system_time + && self.policy == other.policy + && self.suspend_count == other.suspend_count + } + } + impl Eq for mach_task_basic_info {} + impl ::fmt::Debug for mach_task_basic_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let virtual_size = self.virtual_size; + let resident_size = self.resident_size; + let resident_size_max = self.resident_size_max; + let user_time = self.user_time; + let system_time = self.system_time; + let policy = self.policy; + let suspend_count = self.suspend_count; + f.debug_struct("mach_task_basic_info") + .field("virtual_size", &virtual_size) + .field("resident_size", &resident_size) + .field("resident_size_max", &resident_size_max) + .field("user_time", &user_time) + .field("system_time", &system_time) + .field("policy", &policy) + .field("suspend_count", &suspend_count) + .finish() + } + } + impl ::hash::Hash for mach_task_basic_info { + fn hash(&self, state: &mut H) { + let virtual_size = self.virtual_size; + let resident_size = self.resident_size; + let resident_size_max = self.resident_size_max; + let user_time = self.user_time; + let system_time = self.system_time; + let policy = self.policy; + let suspend_count = self.suspend_count; + virtual_size.hash(state); + resident_size.hash(state); + resident_size_max.hash(state); + user_time.hash(state); + system_time.hash(state); + policy.hash(state); + suspend_count.hash(state); + } + } + + impl PartialEq for log2phys { + fn eq(&self, other: &log2phys) -> bool { + self.l2p_flags == other.l2p_flags + && self.l2p_contigbytes == other.l2p_contigbytes + && self.l2p_devoffset == other.l2p_devoffset + } + } + impl Eq for log2phys {} + impl ::fmt::Debug for log2phys { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let l2p_flags = self.l2p_flags; + let l2p_contigbytes = self.l2p_contigbytes; + let l2p_devoffset = self.l2p_devoffset; + f.debug_struct("log2phys") + .field("l2p_flags", &l2p_flags) + .field("l2p_contigbytes", &l2p_contigbytes) + .field("l2p_devoffset", &l2p_devoffset) + .finish() + } + } + impl ::hash::Hash for log2phys { + fn hash(&self, state: &mut H) { + let l2p_flags = self.l2p_flags; + let l2p_contigbytes = self.l2p_contigbytes; + let l2p_devoffset = self.l2p_devoffset; + l2p_flags.hash(state); + l2p_contigbytes.hash(state); + l2p_devoffset.hash(state); + } + } + impl PartialEq for os_unfair_lock { + fn eq(&self, other: &os_unfair_lock) -> bool { + self._os_unfair_lock_opaque == other._os_unfair_lock_opaque + } + } + + impl Eq for os_unfair_lock {} + + impl ::fmt::Debug for os_unfair_lock { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("os_unfair_lock") + .field("_os_unfair_lock_opaque", &self._os_unfair_lock_opaque) + .finish() + } + } + + impl ::hash::Hash for os_unfair_lock { + fn hash(&self, state: &mut H) { + self._os_unfair_lock_opaque.hash(state); + } + } + + impl PartialEq for sockaddr_vm { + fn eq(&self, other: &sockaddr_vm) -> bool { + self.svm_len == other.svm_len + && self.svm_family == other.svm_family + && self.svm_reserved1 == other.svm_reserved1 + && self.svm_port == other.svm_port + && self.svm_cid == other.svm_cid + } + } + + impl Eq for sockaddr_vm {} + + impl ::fmt::Debug for sockaddr_vm { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let svm_len = self.svm_len; + let svm_family = self.svm_family; + let svm_reserved1 = self.svm_reserved1; + let svm_port = self.svm_port; + let svm_cid = self.svm_cid; + + f.debug_struct("sockaddr_vm") + .field("svm_len",&svm_len) + .field("svm_family",&svm_family) + .field("svm_reserved1",&svm_reserved1) + .field("svm_port",&svm_port) + .field("svm_cid",&svm_cid) + .finish() + } + } + + impl ::hash::Hash for sockaddr_vm { + fn hash(&self, state: &mut H) { + let svm_len = self.svm_len; + let svm_family = self.svm_family; + let svm_reserved1 = self.svm_reserved1; + let svm_port = self.svm_port; + let svm_cid = self.svm_cid; + + svm_len.hash(state); + svm_family.hash(state); + svm_reserved1.hash(state); + svm_port.hash(state); + svm_cid.hash(state); + } + } + } +} + +pub const _UTX_USERSIZE: usize = 256; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 256; + +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; +pub const SIGNATURE: ::c_short = 10; +pub const SHUTDOWN_TIME: ::c_short = 11; + +pub const LC_COLLATE_MASK: ::c_int = 1 << 0; +pub const LC_CTYPE_MASK: ::c_int = 1 << 1; +pub const LC_MESSAGES_MASK: ::c_int = 1 << 2; +pub const LC_MONETARY_MASK: ::c_int = 1 << 3; +pub const LC_NUMERIC_MASK: ::c_int = 1 << 4; +pub const LC_TIME_MASK: ::c_int = 1 << 5; +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const CODESET: ::nl_item = 0; +pub const D_T_FMT: ::nl_item = 1; +pub const D_FMT: ::nl_item = 2; +pub const T_FMT: ::nl_item = 3; +pub const T_FMT_AMPM: ::nl_item = 4; +pub const AM_STR: ::nl_item = 5; +pub const PM_STR: ::nl_item = 6; + +pub const DAY_1: ::nl_item = 7; +pub const DAY_2: ::nl_item = 8; +pub const DAY_3: ::nl_item = 9; +pub const DAY_4: ::nl_item = 10; +pub const DAY_5: ::nl_item = 11; +pub const DAY_6: ::nl_item = 12; +pub const DAY_7: ::nl_item = 13; + +pub const ABDAY_1: ::nl_item = 14; +pub const ABDAY_2: ::nl_item = 15; +pub const ABDAY_3: ::nl_item = 16; +pub const ABDAY_4: ::nl_item = 17; +pub const ABDAY_5: ::nl_item = 18; +pub const ABDAY_6: ::nl_item = 19; +pub const ABDAY_7: ::nl_item = 20; + +pub const MON_1: ::nl_item = 21; +pub const MON_2: ::nl_item = 22; +pub const MON_3: ::nl_item = 23; +pub const MON_4: ::nl_item = 24; +pub const MON_5: ::nl_item = 25; +pub const MON_6: ::nl_item = 26; +pub const MON_7: ::nl_item = 27; +pub const MON_8: ::nl_item = 28; +pub const MON_9: ::nl_item = 29; +pub const MON_10: ::nl_item = 30; +pub const MON_11: ::nl_item = 31; +pub const MON_12: ::nl_item = 32; + +pub const ABMON_1: ::nl_item = 33; +pub const ABMON_2: ::nl_item = 34; +pub const ABMON_3: ::nl_item = 35; +pub const ABMON_4: ::nl_item = 36; +pub const ABMON_5: ::nl_item = 37; +pub const ABMON_6: ::nl_item = 38; +pub const ABMON_7: ::nl_item = 39; +pub const ABMON_8: ::nl_item = 40; +pub const ABMON_9: ::nl_item = 41; +pub const ABMON_10: ::nl_item = 42; +pub const ABMON_11: ::nl_item = 43; +pub const ABMON_12: ::nl_item = 44; + +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_MONOTONIC_RAW: ::clockid_t = 4; +pub const CLOCK_MONOTONIC_RAW_APPROX: ::clockid_t = 5; +pub const CLOCK_MONOTONIC: ::clockid_t = 6; +pub const CLOCK_UPTIME_RAW: ::clockid_t = 8; +pub const CLOCK_UPTIME_RAW_APPROX: ::clockid_t = 9; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 12; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 16; + +pub const ERA: ::nl_item = 45; +pub const ERA_D_FMT: ::nl_item = 46; +pub const ERA_D_T_FMT: ::nl_item = 47; +pub const ERA_T_FMT: ::nl_item = 48; +pub const ALT_DIGITS: ::nl_item = 49; + +pub const RADIXCHAR: ::nl_item = 50; +pub const THOUSEP: ::nl_item = 51; + +pub const YESEXPR: ::nl_item = 52; +pub const NOEXPR: ::nl_item = 53; + +pub const YESSTR: ::nl_item = 54; +pub const NOSTR: ::nl_item = 55; + +pub const CRNCYSTR: ::nl_item = 56; + +pub const D_MD_ORDER: ::nl_item = 57; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const SEEK_HOLE: ::c_int = 3; +pub const SEEK_DATA: ::c_int = 4; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 308915776; +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; +pub const _PC_NO_TRUNC: ::c_int = 8; +pub const _PC_VDISABLE: ::c_int = 9; +pub const O_EVTONLY: ::c_int = 0x00008000; +pub const O_NOCTTY: ::c_int = 0x00020000; +pub const O_DIRECTORY: ::c_int = 0x00100000; +pub const O_SYMLINK: ::c_int = 0x00200000; +pub const O_DSYNC: ::c_int = 0x00400000; +pub const O_CLOEXEC: ::c_int = 0x01000000; +pub const O_NOFOLLOW_ANY: ::c_int = 0x20000000; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const PT_TRACE_ME: ::c_int = 0; +pub const PT_READ_I: ::c_int = 1; +pub const PT_READ_D: ::c_int = 2; +pub const PT_READ_U: ::c_int = 3; +pub const PT_WRITE_I: ::c_int = 4; +pub const PT_WRITE_D: ::c_int = 5; +pub const PT_WRITE_U: ::c_int = 6; +pub const PT_CONTINUE: ::c_int = 7; +pub const PT_KILL: ::c_int = 8; +pub const PT_STEP: ::c_int = 9; +pub const PT_ATTACH: ::c_int = 10; +pub const PT_DETACH: ::c_int = 11; +pub const PT_SIGEXC: ::c_int = 12; +pub const PT_THUPDATE: ::c_int = 13; +pub const PT_ATTACHEXC: ::c_int = 14; + +pub const PT_FORCEQUOTA: ::c_int = 30; +pub const PT_DENY_ATTACH: ::c_int = 31; +pub const PT_FIRSTMACH: ::c_int = 32; + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_ANON: ::c_int = 0x1000; +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const CPU_STATE_USER: ::c_int = 0; +pub const CPU_STATE_SYSTEM: ::c_int = 1; +pub const CPU_STATE_IDLE: ::c_int = 2; +pub const CPU_STATE_NICE: ::c_int = 3; +pub const CPU_STATE_MAX: ::c_int = 4; + +pub const PROCESSOR_BASIC_INFO: ::c_int = 1; +pub const PROCESSOR_CPU_LOAD_INFO: ::c_int = 2; +pub const PROCESSOR_PM_REGS_INFO: ::c_int = 0x10000001; +pub const PROCESSOR_TEMPERATURE: ::c_int = 0x10000002; +pub const PROCESSOR_SET_LOAD_INFO: ::c_int = 4; +pub const PROCESSOR_SET_BASIC_INFO: ::c_int = 5; + +deprecated_mach! { + pub const VM_FLAGS_FIXED: ::c_int = 0x0000; + pub const VM_FLAGS_ANYWHERE: ::c_int = 0x0001; + pub const VM_FLAGS_PURGABLE: ::c_int = 0x0002; + pub const VM_FLAGS_RANDOM_ADDR: ::c_int = 0x0008; + pub const VM_FLAGS_NO_CACHE: ::c_int = 0x0010; + pub const VM_FLAGS_RESILIENT_CODESIGN: ::c_int = 0x0020; + pub const VM_FLAGS_RESILIENT_MEDIA: ::c_int = 0x0040; + pub const VM_FLAGS_OVERWRITE: ::c_int = 0x4000; + pub const VM_FLAGS_SUPERPAGE_MASK: ::c_int = 0x70000; + pub const VM_FLAGS_RETURN_DATA_ADDR: ::c_int = 0x100000; + pub const VM_FLAGS_RETURN_4K_DATA_ADDR: ::c_int = 0x800000; + pub const VM_FLAGS_ALIAS_MASK: ::c_int = 0xFF000000; + pub const VM_FLAGS_USER_ALLOCATE: ::c_int = 0xff07401f; + pub const VM_FLAGS_USER_MAP: ::c_int = 0xff97401f; + pub const VM_FLAGS_USER_REMAP: ::c_int = VM_FLAGS_FIXED | + VM_FLAGS_ANYWHERE | + VM_FLAGS_RANDOM_ADDR | + VM_FLAGS_OVERWRITE | + VM_FLAGS_RETURN_DATA_ADDR | + VM_FLAGS_RESILIENT_CODESIGN; + + pub const VM_FLAGS_SUPERPAGE_SHIFT: ::c_int = 16; + pub const SUPERPAGE_NONE: ::c_int = 0; + pub const SUPERPAGE_SIZE_ANY: ::c_int = 1; + pub const VM_FLAGS_SUPERPAGE_NONE: ::c_int = SUPERPAGE_NONE << + VM_FLAGS_SUPERPAGE_SHIFT; + pub const VM_FLAGS_SUPERPAGE_SIZE_ANY: ::c_int = SUPERPAGE_SIZE_ANY << + VM_FLAGS_SUPERPAGE_SHIFT; + pub const SUPERPAGE_SIZE_2MB: ::c_int = 2; + pub const VM_FLAGS_SUPERPAGE_SIZE_2MB: ::c_int = SUPERPAGE_SIZE_2MB << + VM_FLAGS_SUPERPAGE_SHIFT; + + pub const VM_MEMORY_MALLOC: ::c_int = 1; + pub const VM_MEMORY_MALLOC_SMALL: ::c_int = 2; + pub const VM_MEMORY_MALLOC_LARGE: ::c_int = 3; + pub const VM_MEMORY_MALLOC_HUGE: ::c_int = 4; + pub const VM_MEMORY_SBRK: ::c_int = 5; + pub const VM_MEMORY_REALLOC: ::c_int = 6; + pub const VM_MEMORY_MALLOC_TINY: ::c_int = 7; + pub const VM_MEMORY_MALLOC_LARGE_REUSABLE: ::c_int = 8; + pub const VM_MEMORY_MALLOC_LARGE_REUSED: ::c_int = 9; + pub const VM_MEMORY_ANALYSIS_TOOL: ::c_int = 10; + pub const VM_MEMORY_MALLOC_NANO: ::c_int = 11; + pub const VM_MEMORY_MACH_MSG: ::c_int = 20; + pub const VM_MEMORY_IOKIT: ::c_int = 21; + pub const VM_MEMORY_STACK: ::c_int = 30; + pub const VM_MEMORY_GUARD: ::c_int = 31; + pub const VM_MEMORY_SHARED_PMAP: ::c_int = 32; + pub const VM_MEMORY_DYLIB: ::c_int = 33; + pub const VM_MEMORY_OBJC_DISPATCHERS: ::c_int = 34; + pub const VM_MEMORY_UNSHARED_PMAP: ::c_int = 35; + pub const VM_MEMORY_APPKIT: ::c_int = 40; + pub const VM_MEMORY_FOUNDATION: ::c_int = 41; + pub const VM_MEMORY_COREGRAPHICS: ::c_int = 42; + pub const VM_MEMORY_CORESERVICES: ::c_int = 43; + pub const VM_MEMORY_CARBON: ::c_int = VM_MEMORY_CORESERVICES; + pub const VM_MEMORY_JAVA: ::c_int = 44; + pub const VM_MEMORY_COREDATA: ::c_int = 45; + pub const VM_MEMORY_COREDATA_OBJECTIDS: ::c_int = 46; + pub const VM_MEMORY_ATS: ::c_int = 50; + pub const VM_MEMORY_LAYERKIT: ::c_int = 51; + pub const VM_MEMORY_CGIMAGE: ::c_int = 52; + pub const VM_MEMORY_TCMALLOC: ::c_int = 53; + pub const VM_MEMORY_COREGRAPHICS_DATA: ::c_int = 54; + pub const VM_MEMORY_COREGRAPHICS_SHARED: ::c_int = 55; + pub const VM_MEMORY_COREGRAPHICS_FRAMEBUFFERS: ::c_int = 56; + pub const VM_MEMORY_COREGRAPHICS_BACKINGSTORES: ::c_int = 57; + pub const VM_MEMORY_COREGRAPHICS_XALLOC: ::c_int = 58; + pub const VM_MEMORY_COREGRAPHICS_MISC: ::c_int = VM_MEMORY_COREGRAPHICS; + pub const VM_MEMORY_DYLD: ::c_int = 60; + pub const VM_MEMORY_DYLD_MALLOC: ::c_int = 61; + pub const VM_MEMORY_SQLITE: ::c_int = 62; + pub const VM_MEMORY_JAVASCRIPT_CORE: ::c_int = 63; + pub const VM_MEMORY_JAVASCRIPT_JIT_EXECUTABLE_ALLOCATOR: ::c_int = 64; + pub const VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE: ::c_int = 65; + pub const VM_MEMORY_GLSL: ::c_int = 66; + pub const VM_MEMORY_OPENCL: ::c_int = 67; + pub const VM_MEMORY_COREIMAGE: ::c_int = 68; + pub const VM_MEMORY_WEBCORE_PURGEABLE_BUFFERS: ::c_int = 69; + pub const VM_MEMORY_IMAGEIO: ::c_int = 70; + pub const VM_MEMORY_COREPROFILE: ::c_int = 71; + pub const VM_MEMORY_ASSETSD: ::c_int = 72; + pub const VM_MEMORY_OS_ALLOC_ONCE: ::c_int = 73; + pub const VM_MEMORY_LIBDISPATCH: ::c_int = 74; + pub const VM_MEMORY_ACCELERATE: ::c_int = 75; + pub const VM_MEMORY_COREUI: ::c_int = 76; + pub const VM_MEMORY_COREUIFILE: ::c_int = 77; + pub const VM_MEMORY_GENEALOGY: ::c_int = 78; + pub const VM_MEMORY_RAWCAMERA: ::c_int = 79; + pub const VM_MEMORY_CORPSEINFO: ::c_int = 80; + pub const VM_MEMORY_ASL: ::c_int = 81; + pub const VM_MEMORY_SWIFT_RUNTIME: ::c_int = 82; + pub const VM_MEMORY_SWIFT_METADATA: ::c_int = 83; + pub const VM_MEMORY_DHMM: ::c_int = 84; + pub const VM_MEMORY_SCENEKIT: ::c_int = 86; + pub const VM_MEMORY_SKYWALK: ::c_int = 87; + pub const VM_MEMORY_APPLICATION_SPECIFIC_1: ::c_int = 240; + pub const VM_MEMORY_APPLICATION_SPECIFIC_16: ::c_int = 255; +} + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0010; + +pub const MS_KILLPAGES: ::c_int = 0x0004; +pub const MS_DEACTIVATE: ::c_int = 0x0008; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EDEADLK: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EAGAIN: ::c_int = 35; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EINPROGRESS: ::c_int = 36; +pub const EALREADY: ::c_int = 37; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const ENOTSUP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ELOOP: ::c_int = 62; +pub const ENAMETOOLONG: ::c_int = 63; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const ENOTEMPTY: ::c_int = 66; +pub const EPROCLIM: ::c_int = 67; +pub const EUSERS: ::c_int = 68; +pub const EDQUOT: ::c_int = 69; +pub const ESTALE: ::c_int = 70; +pub const EREMOTE: ::c_int = 71; +pub const EBADRPC: ::c_int = 72; +pub const ERPCMISMATCH: ::c_int = 73; +pub const EPROGUNAVAIL: ::c_int = 74; +pub const EPROGMISMATCH: ::c_int = 75; +pub const EPROCUNAVAIL: ::c_int = 76; +pub const ENOLCK: ::c_int = 77; +pub const ENOSYS: ::c_int = 78; +pub const EFTYPE: ::c_int = 79; +pub const EAUTH: ::c_int = 80; +pub const ENEEDAUTH: ::c_int = 81; +pub const EPWROFF: ::c_int = 82; +pub const EDEVERR: ::c_int = 83; +pub const EOVERFLOW: ::c_int = 84; +pub const EBADEXEC: ::c_int = 85; +pub const EBADARCH: ::c_int = 86; +pub const ESHLIBVERS: ::c_int = 87; +pub const EBADMACHO: ::c_int = 88; +pub const ECANCELED: ::c_int = 89; +pub const EIDRM: ::c_int = 90; +pub const ENOMSG: ::c_int = 91; +pub const EILSEQ: ::c_int = 92; +pub const ENOATTR: ::c_int = 93; +pub const EBADMSG: ::c_int = 94; +pub const EMULTIHOP: ::c_int = 95; +pub const ENODATA: ::c_int = 96; +pub const ENOLINK: ::c_int = 97; +pub const ENOSR: ::c_int = 98; +pub const ENOSTR: ::c_int = 99; +pub const EPROTO: ::c_int = 100; +pub const ETIME: ::c_int = 101; +pub const EOPNOTSUPP: ::c_int = 102; +pub const ENOPOLICY: ::c_int = 103; +pub const ENOTRECOVERABLE: ::c_int = 104; +pub const EOWNERDEAD: ::c_int = 105; +pub const EQFULL: ::c_int = 106; +pub const ELAST: ::c_int = 106; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const F_DUPFD: ::c_int = 0; +pub const F_DUPFD_CLOEXEC: ::c_int = 67; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_PREALLOCATE: ::c_int = 42; +pub const F_RDADVISE: ::c_int = 44; +pub const F_RDAHEAD: ::c_int = 45; +pub const F_NOCACHE: ::c_int = 48; +pub const F_LOG2PHYS: ::c_int = 49; +pub const F_GETPATH: ::c_int = 50; +pub const F_FULLFSYNC: ::c_int = 51; +pub const F_FREEZE_FS: ::c_int = 53; +pub const F_THAW_FS: ::c_int = 54; +pub const F_GLOBAL_NOCACHE: ::c_int = 55; +pub const F_NODIRECT: ::c_int = 62; +pub const F_LOG2PHYS_EXT: ::c_int = 65; +pub const F_BARRIERFSYNC: ::c_int = 85; +pub const F_GETPATH_NOFIRMLINK: ::c_int = 102; + +pub const F_ALLOCATECONTIG: ::c_uint = 0x02; +pub const F_ALLOCATEALL: ::c_uint = 0x04; + +pub const F_PEOFPOSMODE: ::c_int = 3; +pub const F_VOLPOSMODE: ::c_int = 4; + +pub const AT_FDCWD: ::c_int = -2; +pub const AT_EACCESS: ::c_int = 0x0010; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x0020; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x0040; +pub const AT_REMOVEDIR: ::c_int = 0x0080; + +pub const PTHREAD_INTROSPECTION_THREAD_CREATE: ::c_uint = 1; +pub const PTHREAD_INTROSPECTION_THREAD_START: ::c_uint = 2; +pub const PTHREAD_INTROSPECTION_THREAD_TERMINATE: ::c_uint = 3; +pub const PTHREAD_INTROSPECTION_THREAD_DESTROY: ::c_uint = 4; + +pub const TIOCMODG: ::c_ulong = 0x40047403; +pub const TIOCMODS: ::c_ulong = 0x80047404; +pub const TIOCM_LE: ::c_int = 0x1; +pub const TIOCM_DTR: ::c_int = 0x2; +pub const TIOCM_RTS: ::c_int = 0x4; +pub const TIOCM_ST: ::c_int = 0x8; +pub const TIOCM_SR: ::c_int = 0x10; +pub const TIOCM_CTS: ::c_int = 0x20; +pub const TIOCM_CAR: ::c_int = 0x40; +pub const TIOCM_CD: ::c_int = 0x40; +pub const TIOCM_RNG: ::c_int = 0x80; +pub const TIOCM_RI: ::c_int = 0x80; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCEXCL: ::c_int = 0x2000740d; +pub const TIOCNXCL: ::c_int = 0x2000740e; +pub const TIOCFLUSH: ::c_ulong = 0x80047410; +pub const TIOCGETD: ::c_ulong = 0x4004741a; +pub const TIOCSETD: ::c_ulong = 0x8004741b; +pub const TIOCIXON: ::c_uint = 0x20007481; +pub const TIOCIXOFF: ::c_uint = 0x20007480; +pub const TIOCSDTR: ::c_uint = 0x20007479; +pub const TIOCCDTR: ::c_uint = 0x20007478; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCNOTTY: ::c_uint = 0x20007471; +pub const TIOCPKT: ::c_ulong = 0x80047470; +pub const TIOCPKT_DATA: ::c_int = 0x0; +pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; +pub const TIOCPKT_STOP: ::c_int = 0x4; +pub const TIOCPKT_START: ::c_int = 0x8; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_IOCTL: ::c_int = 0x40; +pub const TIOCSTOP: ::c_uint = 0x2000746f; +pub const TIOCSTART: ::c_uint = 0x2000746e; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCREMOTE: ::c_ulong = 0x80047469; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCUCNTL: ::c_ulong = 0x80047466; +pub const TIOCSTAT: ::c_uint = 0x20007465; +pub const TIOCSCONS: ::c_uint = 0x20007463; +pub const TIOCCONS: ::c_ulong = 0x80047462; +pub const TIOCSCTTY: ::c_uint = 0x20007461; +pub const TIOCEXT: ::c_ulong = 0x80047460; +pub const TIOCSIG: ::c_uint = 0x2000745f; +pub const TIOCDRAIN: ::c_uint = 0x2000745e; +pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; +pub const TIOCMGDTRWAIT: ::c_ulong = 0x4004745a; +pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; +pub const TIOCGDRAINWAIT: ::c_ulong = 0x40047456; +pub const TIOCDSIMICROCODE: ::c_uint = 0x20007455; +pub const TIOCPTYGRANT: ::c_uint = 0x20007454; +pub const TIOCPTYGNAME: ::c_uint = 0x40807453; +pub const TIOCPTYUNLK: ::c_uint = 0x20007452; + +pub const BIOCGRSIG: ::c_ulong = 0x40044272; +pub const BIOCSRSIG: ::c_ulong = 0x80044273; +pub const BIOCSDLT: ::c_ulong = 0x80044278; +pub const BIOCGSEESENT: ::c_ulong = 0x40044276; +pub const BIOCSSEESENT: ::c_ulong = 0x80044277; +pub const BIOCGDLTLIST: ::c_ulong = 0xc00c4279; + +pub const FIODTYPE: ::c_ulong = 0x4004667a; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND: ::c_int = 0x0001; +pub const GLOB_DOOFFS: ::c_int = 0x0002; +pub const GLOB_ERR: ::c_int = 0x0004; +pub const GLOB_MARK: ::c_int = 0x0008; +pub const GLOB_NOCHECK: ::c_int = 0x0010; +pub const GLOB_NOSORT: ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x2000; + +pub const GLOB_NOSPACE: ::c_int = -1; +pub const GLOB_ABORTED: ::c_int = -2; +pub const GLOB_NOMATCH: ::c_int = -3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const _SC_IOV_MAX: ::c_int = 56; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_MQ_PRIO_MAX: ::c_int = 75; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; +pub const _SC_THREAD_STACK_MIN: ::c_int = 93; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; +pub const _SC_THREADS: ::c_int = 96; +pub const _SC_TTY_NAME_MAX: ::c_int = 101; +pub const _SC_ATEXIT_MAX: ::c_int = 107; +pub const _SC_XOPEN_CRYPT: ::c_int = 108; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; +pub const _SC_XOPEN_LEGACY: ::c_int = 110; +pub const _SC_XOPEN_REALTIME: ::c_int = 111; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; +pub const _SC_XOPEN_SHM: ::c_int = 113; +pub const _SC_XOPEN_UNIX: ::c_int = 115; +pub const _SC_XOPEN_VERSION: ::c_int = 116; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 121; +pub const _SC_PHYS_PAGES: ::c_int = 200; + +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 2; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 1; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 2; +#[cfg(target_arch = "aarch64")] +pub const PTHREAD_STACK_MIN: ::size_t = 16384; +#[cfg(not(target_arch = "aarch64"))] +pub const PTHREAD_STACK_MIN: ::size_t = 8192; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_AS: ::c_int = 5; +pub const RLIMIT_RSS: ::c_int = RLIMIT_AS; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: ::c_int = 9; +pub const _RLIMIT_POSIX_FLAG: ::c_int = 0x1000; + +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; +pub const MADV_ZERO_WIRED_PAGES: ::c_int = 6; +pub const MADV_FREE_REUSABLE: ::c_int = 7; +pub const MADV_FREE_REUSE: ::c_int = 8; +pub const MADV_CAN_REUSE: ::c_int = 9; + +pub const MINCORE_INCORE: ::c_int = 0x1; +pub const MINCORE_REFERENCED: ::c_int = 0x2; +pub const MINCORE_MODIFIED: ::c_int = 0x4; +pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; +pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; + +pub const CTLIOCGINFO: c_ulong = 0xc0644e03; + +// +// sys/netinet/in.h +// Protocols (RFC 1700) +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// IP6 hop-by-hop options +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// gateway2 (deprecated) +pub const IPPROTO_GGP: ::c_int = 3; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// Stream protocol II. +pub const IPPROTO_ST: ::c_int = 7; +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// private interior gateway +pub const IPPROTO_PIGP: ::c_int = 9; +/// BBN RCC Monitoring +pub const IPPROTO_RCCMON: ::c_int = 10; +/// network voice protocol +pub const IPPROTO_NVPII: ::c_int = 11; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +/// Argus +pub const IPPROTO_ARGUS: ::c_int = 13; +/// EMCON +pub const IPPROTO_EMCON: ::c_int = 14; +/// Cross Net Debugger +pub const IPPROTO_XNET: ::c_int = 15; +/// Chaos +pub const IPPROTO_CHAOS: ::c_int = 16; +// IPPROTO_UDP defined in src/unix/mod.rs +/// Multiplexing +pub const IPPROTO_MUX: ::c_int = 18; +/// DCN Measurement Subsystems +pub const IPPROTO_MEAS: ::c_int = 19; +/// Host Monitoring +pub const IPPROTO_HMP: ::c_int = 20; +/// Packet Radio Measurement +pub const IPPROTO_PRM: ::c_int = 21; +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// Trunk-1 +pub const IPPROTO_TRUNK1: ::c_int = 23; +/// Trunk-2 +pub const IPPROTO_TRUNK2: ::c_int = 24; +/// Leaf-1 +pub const IPPROTO_LEAF1: ::c_int = 25; +/// Leaf-2 +pub const IPPROTO_LEAF2: ::c_int = 26; +/// Reliable Data +pub const IPPROTO_RDP: ::c_int = 27; +/// Reliable Transaction +pub const IPPROTO_IRTP: ::c_int = 28; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// Bulk Data Transfer +pub const IPPROTO_BLT: ::c_int = 30; +/// Network Services +pub const IPPROTO_NSP: ::c_int = 31; +/// Merit Internodal +pub const IPPROTO_INP: ::c_int = 32; +/// Sequential Exchange +pub const IPPROTO_SEP: ::c_int = 33; +/// Third Party Connect +pub const IPPROTO_3PC: ::c_int = 34; +/// InterDomain Policy Routing +pub const IPPROTO_IDPR: ::c_int = 35; +/// XTP +pub const IPPROTO_XTP: ::c_int = 36; +/// Datagram Delivery +pub const IPPROTO_DDP: ::c_int = 37; +/// Control Message Transport +pub const IPPROTO_CMTP: ::c_int = 38; +/// TP++ Transport +pub const IPPROTO_TPXX: ::c_int = 39; +/// IL transport protocol +pub const IPPROTO_IL: ::c_int = 40; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// Source Demand Routing +pub const IPPROTO_SDRP: ::c_int = 42; +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// InterDomain Routing +pub const IPPROTO_IDRP: ::c_int = 45; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// Mobile Host Routing +pub const IPPROTO_MHRP: ::c_int = 48; +/// BHA +pub const IPPROTO_BHA: ::c_int = 49; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +/// Integ. Net Layer Security +pub const IPPROTO_INLSP: ::c_int = 52; +/// IP with encryption +pub const IPPROTO_SWIPE: ::c_int = 53; +/// Next Hop Resolution +pub const IPPROTO_NHRP: ::c_int = 54; +/* 55-57: Unassigned */ +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +/// any host internal protocol +pub const IPPROTO_AHIP: ::c_int = 61; +/// CFTP +pub const IPPROTO_CFTP: ::c_int = 62; +/// "hello" routing protocol +pub const IPPROTO_HELLO: ::c_int = 63; +/// SATNET/Backroom EXPAK +pub const IPPROTO_SATEXPAK: ::c_int = 64; +/// Kryptolan +pub const IPPROTO_KRYPTOLAN: ::c_int = 65; +/// Remote Virtual Disk +pub const IPPROTO_RVD: ::c_int = 66; +/// Pluribus Packet Core +pub const IPPROTO_IPPC: ::c_int = 67; +/// Any distributed FS +pub const IPPROTO_ADFS: ::c_int = 68; +/// Satnet Monitoring +pub const IPPROTO_SATMON: ::c_int = 69; +/// VISA Protocol +pub const IPPROTO_VISA: ::c_int = 70; +/// Packet Core Utility +pub const IPPROTO_IPCV: ::c_int = 71; +/// Comp. Prot. Net. Executive +pub const IPPROTO_CPNX: ::c_int = 72; +/// Comp. Prot. HeartBeat +pub const IPPROTO_CPHB: ::c_int = 73; +/// Wang Span Network +pub const IPPROTO_WSN: ::c_int = 74; +/// Packet Video Protocol +pub const IPPROTO_PVP: ::c_int = 75; +/// BackRoom SATNET Monitoring +pub const IPPROTO_BRSATMON: ::c_int = 76; +/// Sun net disk proto (temp.) +pub const IPPROTO_ND: ::c_int = 77; +/// WIDEBAND Monitoring +pub const IPPROTO_WBMON: ::c_int = 78; +/// WIDEBAND EXPAK +pub const IPPROTO_WBEXPAK: ::c_int = 79; +/// ISO cnlp +pub const IPPROTO_EON: ::c_int = 80; +/// VMTP +pub const IPPROTO_VMTP: ::c_int = 81; +/// Secure VMTP +pub const IPPROTO_SVMTP: ::c_int = 82; +/// Banyon VINES +pub const IPPROTO_VINES: ::c_int = 83; +/// TTP +pub const IPPROTO_TTP: ::c_int = 84; +/// NSFNET-IGP +pub const IPPROTO_IGP: ::c_int = 85; +/// dissimilar gateway prot. +pub const IPPROTO_DGP: ::c_int = 86; +/// TCF +pub const IPPROTO_TCF: ::c_int = 87; +/// Cisco/GXS IGRP +pub const IPPROTO_IGRP: ::c_int = 88; +/// OSPFIGP +pub const IPPROTO_OSPFIGP: ::c_int = 89; +/// Strite RPC protocol +pub const IPPROTO_SRPC: ::c_int = 90; +/// Locus Address Resoloution +pub const IPPROTO_LARP: ::c_int = 91; +/// Multicast Transport +pub const IPPROTO_MTP: ::c_int = 92; +/// AX.25 Frames +pub const IPPROTO_AX25: ::c_int = 93; +/// IP encapsulated in IP +pub const IPPROTO_IPEIP: ::c_int = 94; +/// Mobile Int.ing control +pub const IPPROTO_MICP: ::c_int = 95; +/// Semaphore Comm. security +pub const IPPROTO_SCCSP: ::c_int = 96; +/// Ethernet IP encapsulation +pub const IPPROTO_ETHERIP: ::c_int = 97; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// any private encr. scheme +pub const IPPROTO_APES: ::c_int = 99; +/// GMTP +pub const IPPROTO_GMTP: ::c_int = 100; + +/* 101-254: Partly Unassigned */ +/// Protocol Independent Mcast +pub const IPPROTO_PIM: ::c_int = 103; +/// payload compression (IPComp) +pub const IPPROTO_IPCOMP: ::c_int = 108; +/// PGM +pub const IPPROTO_PGM: ::c_int = 113; +/// SCTP +pub const IPPROTO_SCTP: ::c_int = 132; + +/* 255: Reserved */ +/* BSD Private, local use, namespace incursion */ +/// divert pseudo-protocol +pub const IPPROTO_DIVERT: ::c_int = 254; +/// raw IP packet +pub const IPPROTO_RAW: ::c_int = 255; +pub const IPPROTO_MAX: ::c_int = 256; +/// last return value of *_input(), meaning "all job for this pkt is done". +pub const IPPROTO_DONE: ::c_int = 257; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_SIP: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_NDRV: ::c_int = 27; +pub const AF_ISDN: ::c_int = 28; +pub const AF_E164: ::c_int = AF_ISDN; +pub const pseudo_AF_KEY: ::c_int = 29; +pub const AF_INET6: ::c_int = 30; +pub const AF_NATM: ::c_int = 31; +pub const AF_SYSTEM: ::c_int = 32; +pub const AF_NETBIOS: ::c_int = 33; +pub const AF_PPP: ::c_int = 34; +pub const pseudo_AF_HDRCMPLT: ::c_int = 35; +pub const AF_IEEE80211: ::c_int = 37; +pub const AF_UTUN: ::c_int = 38; +pub const AF_VSOCK: ::c_int = 40; +pub const AF_SYS_CONTROL: ::c_int = 2; + +pub const SYSPROTO_EVENT: ::c_int = 1; +pub const SYSPROTO_CONTROL: ::c_int = 2; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_NDRV: ::c_int = AF_NDRV; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_NATM: ::c_int = AF_NATM; +pub const PF_SYSTEM: ::c_int = AF_SYSTEM; +pub const PF_NETBIOS: ::c_int = AF_NETBIOS; +pub const PF_PPP: ::c_int = AF_PPP; +pub const PF_VSOCK: ::c_int = AF_VSOCK; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; + +pub const SOMAXCONN: ::c_int = 128; + +pub const SOCK_MAXADDRLEN: ::c_int = 255; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IP_RECVIF: ::c_int = 20; +pub const IP_BOUND_IF: ::c_int = 25; +pub const IP_PKTINFO: ::c_int = 26; +pub const IP_RECVTOS: ::c_int = 27; +pub const IP_DONTFRAG: ::c_int = 28; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_CHECKSUM: ::c_int = 26; +pub const IPV6_RECVTCLASS: ::c_int = 35; +pub const IPV6_TCLASS: ::c_int = 36; +pub const IPV6_PKTINFO: ::c_int = 46; +pub const IPV6_HOPLIMIT: ::c_int = 47; +pub const IPV6_RECVPKTINFO: ::c_int = 61; +pub const IPV6_DONTFRAG: ::c_int = 62; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 70; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 71; +pub const IP_BLOCK_SOURCE: ::c_int = 72; +pub const IP_UNBLOCK_SOURCE: ::c_int = 73; +pub const IPV6_BOUND_IF: ::c_int = 125; + +pub const TCP_NOPUSH: ::c_int = 4; +pub const TCP_NOOPT: ::c_int = 8; +pub const TCP_KEEPALIVE: ::c_int = 0x10; +pub const TCP_KEEPINTVL: ::c_int = 0x101; +pub const TCP_KEEPCNT: ::c_int = 0x102; +/// Enable/Disable TCP Fastopen on this socket +pub const TCP_FASTOPEN: ::c_int = 0x105; + +pub const SOL_LOCAL: ::c_int = 0; + +pub const LOCAL_PEERCRED: ::c_int = 0x001; +pub const LOCAL_PEERPID: ::c_int = 0x002; +pub const LOCAL_PEEREPID: ::c_int = 0x003; +pub const LOCAL_PEERUUID: ::c_int = 0x004; +pub const LOCAL_PEEREUUID: ::c_int = 0x005; + +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_TIMESTAMP_MONOTONIC: ::c_int = 0x0800; +pub const SO_DONTTRUNC: ::c_int = 0x2000; +pub const SO_WANTMORE: ::c_int = 0x4000; +pub const SO_WANTOOBFLAG: ::c_int = 0x8000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_LABEL: ::c_int = 0x1010; +pub const SO_PEERLABEL: ::c_int = 0x1011; +pub const SO_NREAD: ::c_int = 0x1020; +pub const SO_NKE: ::c_int = 0x1021; +pub const SO_NOSIGPIPE: ::c_int = 0x1022; +pub const SO_NOADDRERR: ::c_int = 0x1023; +pub const SO_NWRITE: ::c_int = 0x1024; +pub const SO_REUSESHAREUID: ::c_int = 0x1025; +pub const SO_NOTIFYCONFLICT: ::c_int = 0x1026; +pub const SO_LINGER_SEC: ::c_int = 0x1080; +pub const SO_RANDOMPORT: ::c_int = 0x1082; +pub const SO_NP_EXTENSIONS: ::c_int = 0x1083; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_EOF: ::c_int = 0x100; +pub const MSG_FLUSH: ::c_int = 0x400; +pub const MSG_HOLD: ::c_int = 0x800; +pub const MSG_SEND: ::c_int = 0x1000; +pub const MSG_HAVEMORE: ::c_int = 0x2000; +pub const MSG_RCVMORE: ::c_int = 0x4000; +pub const MSG_NEEDSA: ::c_int = 0x10000; +pub const MSG_NOSIGNAL: ::c_int = 0x80000; + +pub const SCM_TIMESTAMP: ::c_int = 0x02; +pub const SCM_CREDS: ::c_int = 0x03; + +// https://github.com/aosm/xnu/blob/HEAD/bsd/net/if.h#L140-L156 +pub const IFF_UP: ::c_int = 0x1; // interface is up +pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link +pub const IFF_NOTRAILERS: ::c_int = 0x20; // obsolete: avoid use of trailers +pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated +pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol +pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets +pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress +pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions +pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit +pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; // use alternate physical connection +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const SAE_ASSOCID_ANY: ::sae_associd_t = 0; +/// ((sae_associd_t)(-1ULL)) +pub const SAE_ASSOCID_ALL: ::sae_associd_t = 0xffffffff; + +pub const SAE_CONNID_ANY: ::sae_connid_t = 0; +/// ((sae_connid_t)(-1ULL)) +pub const SAE_CONNID_ALL: ::sae_connid_t = 0xffffffff; + +// connectx() flag parameters + +/// resume connect() on read/write +pub const CONNECT_RESUME_ON_READ_WRITE: ::c_uint = 0x1; +/// data is idempotent +pub const CONNECT_DATA_IDEMPOTENT: ::c_uint = 0x2; +/// data includes security that replaces the TFO-cookie +pub const CONNECT_DATA_AUTHENTICATED: ::c_uint = 0x4; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const MAP_COPY: ::c_int = 0x0002; +pub const MAP_RENAME: ::c_int = 0x0020; +pub const MAP_NORESERVE: ::c_int = 0x0040; +pub const MAP_NOEXTEND: ::c_int = 0x0100; +pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; +pub const MAP_NOCACHE: ::c_int = 0x0400; +pub const MAP_JIT: ::c_int = 0x0800; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_BC_BASE_MAX: ::c_int = 9; +pub const _SC_BC_DIM_MAX: ::c_int = 10; +pub const _SC_BC_SCALE_MAX: ::c_int = 11; +pub const _SC_BC_STRING_MAX: ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; +pub const _SC_EXPR_NEST_MAX: ::c_int = 14; +pub const _SC_LINE_MAX: ::c_int = 15; +pub const _SC_RE_DUP_MAX: ::c_int = 16; +pub const _SC_2_VERSION: ::c_int = 17; +pub const _SC_2_C_BIND: ::c_int = 18; +pub const _SC_2_C_DEV: ::c_int = 19; +pub const _SC_2_CHAR_TERM: ::c_int = 20; +pub const _SC_2_FORT_DEV: ::c_int = 21; +pub const _SC_2_FORT_RUN: ::c_int = 22; +pub const _SC_2_LOCALEDEF: ::c_int = 23; +pub const _SC_2_SW_DEV: ::c_int = 24; +pub const _SC_2_UPE: ::c_int = 25; +pub const _SC_STREAM_MAX: ::c_int = 26; +pub const _SC_TZNAME_MAX: ::c_int = 27; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; +pub const _SC_PAGESIZE: ::c_int = 29; +pub const _SC_MEMLOCK: ::c_int = 30; +pub const _SC_MEMLOCK_RANGE: ::c_int = 31; +pub const _SC_MEMORY_PROTECTION: ::c_int = 32; +pub const _SC_MESSAGE_PASSING: ::c_int = 33; +pub const _SC_PRIORITIZED_IO: ::c_int = 34; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; +pub const _SC_REALTIME_SIGNALS: ::c_int = 36; +pub const _SC_SEMAPHORES: ::c_int = 37; +pub const _SC_FSYNC: ::c_int = 38; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; +pub const _SC_TIMERS: ::c_int = 41; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; +pub const _SC_AIO_MAX: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; +pub const _SC_DELAYTIMER_MAX: ::c_int = 45; +pub const _SC_MQ_OPEN_MAX: ::c_int = 46; +pub const _SC_MAPPED_FILES: ::c_int = 47; +pub const _SC_RTSIG_MAX: ::c_int = 48; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; +pub const _SC_SEM_VALUE_MAX: ::c_int = 50; +pub const _SC_SIGQUEUE_MAX: ::c_int = 51; +pub const _SC_TIMER_MAX: ::c_int = 52; +pub const _SC_NPROCESSORS_CONF: ::c_int = 57; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; +pub const _SC_2_PBS: ::c_int = 59; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 60; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 61; +pub const _SC_2_PBS_LOCATE: ::c_int = 62; +pub const _SC_2_PBS_MESSAGE: ::c_int = 63; +pub const _SC_2_PBS_TRACK: ::c_int = 64; +pub const _SC_ADVISORY_INFO: ::c_int = 65; +pub const _SC_BARRIERS: ::c_int = 66; +pub const _SC_CLOCK_SELECTION: ::c_int = 67; +pub const _SC_CPUTIME: ::c_int = 68; +pub const _SC_FILE_LOCKING: ::c_int = 69; +pub const _SC_HOST_NAME_MAX: ::c_int = 72; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 74; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 76; +pub const _SC_REGEXP: ::c_int = 77; +pub const _SC_SHELL: ::c_int = 78; +pub const _SC_SPAWN: ::c_int = 79; +pub const _SC_SPIN_LOCKS: ::c_int = 80; +pub const _SC_SPORADIC_SERVER: ::c_int = 81; +pub const _SC_THREAD_CPUTIME: ::c_int = 84; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 92; +pub const _SC_TIMEOUTS: ::c_int = 95; +pub const _SC_TRACE: ::c_int = 97; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 98; +pub const _SC_TRACE_INHERIT: ::c_int = 99; +pub const _SC_TRACE_LOG: ::c_int = 100; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 102; +pub const _SC_V6_ILP32_OFF32: ::c_int = 103; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 104; +pub const _SC_V6_LP64_OFF64: ::c_int = 105; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 106; +pub const _SC_IPV6: ::c_int = 118; +pub const _SC_RAW_SOCKETS: ::c_int = 119; +pub const _SC_SYMLOOP_MAX: ::c_int = 120; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_XOPEN_STREAMS: ::c_int = 114; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 122; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 123; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 124; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 125; +pub const _SC_SS_REPL_MAX: ::c_int = 126; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 127; +pub const _SC_TRACE_NAME_MAX: ::c_int = 128; +pub const _SC_TRACE_SYS_MAX: ::c_int = 129; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 130; +pub const _SC_PASS_MAX: ::c_int = 131; +// `confstr` keys (only the values guaranteed by `man confstr`). +pub const _CS_PATH: ::c_int = 1; +pub const _CS_DARWIN_USER_DIR: ::c_int = 65536; +pub const _CS_DARWIN_USER_TEMP_DIR: ::c_int = 65537; +pub const _CS_DARWIN_USER_CACHE_DIR: ::c_int = 65538; + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const _PTHREAD_MUTEX_SIG_init: ::c_long = 0x32AAABA7; +pub const _PTHREAD_COND_SIG_init: ::c_long = 0x3CB0B1BB; +pub const _PTHREAD_RWLOCK_SIG_init: ::c_long = 0x2DA8B3B4; +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __sig: _PTHREAD_MUTEX_SIG_init, + __opaque: [0; __PTHREAD_MUTEX_SIZE__], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __sig: _PTHREAD_COND_SIG_init, + __opaque: [0; __PTHREAD_COND_SIZE__], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __sig: _PTHREAD_RWLOCK_SIG_init, + __opaque: [0; __PTHREAD_RWLOCK_SIZE__], +}; + +pub const OS_UNFAIR_LOCK_INIT: os_unfair_lock = os_unfair_lock { + _os_unfair_lock_opaque: 0, +}; + +pub const OS_LOG_TYPE_DEFAULT: ::os_log_type_t = 0x00; +pub const OS_LOG_TYPE_INFO: ::os_log_type_t = 0x01; +pub const OS_LOG_TYPE_DEBUG: ::os_log_type_t = 0x02; +pub const OS_LOG_TYPE_ERROR: ::os_log_type_t = 0x10; +pub const OS_LOG_TYPE_FAULT: ::os_log_type_t = 0x11; + +pub const OS_SIGNPOST_EVENT: ::os_signpost_type_t = 0x00; +pub const OS_SIGNPOST_INTERVAL_BEGIN: ::os_signpost_type_t = 0x01; +pub const OS_SIGNPOST_INTERVAL_END: ::os_signpost_type_t = 0x02; + +pub const MINSIGSTKSZ: ::size_t = 32768; +pub const SIGSTKSZ: ::size_t = 131072; + +pub const FD_SETSIZE: usize = 1024; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const SCHED_OTHER: ::c_int = 1; +pub const SCHED_FIFO: ::c_int = 4; +pub const SCHED_RR: ::c_int = 2; + +pub const EVFILT_READ: i16 = -1; +pub const EVFILT_WRITE: i16 = -2; +pub const EVFILT_AIO: i16 = -3; +pub const EVFILT_VNODE: i16 = -4; +pub const EVFILT_PROC: i16 = -5; +pub const EVFILT_SIGNAL: i16 = -6; +pub const EVFILT_TIMER: i16 = -7; +pub const EVFILT_MACHPORT: i16 = -8; +pub const EVFILT_FS: i16 = -9; +pub const EVFILT_USER: i16 = -10; +pub const EVFILT_VM: i16 = -12; + +pub const EV_ADD: u16 = 0x1; +pub const EV_DELETE: u16 = 0x2; +pub const EV_ENABLE: u16 = 0x4; +pub const EV_DISABLE: u16 = 0x8; +pub const EV_ONESHOT: u16 = 0x10; +pub const EV_CLEAR: u16 = 0x20; +pub const EV_RECEIPT: u16 = 0x40; +pub const EV_DISPATCH: u16 = 0x80; +pub const EV_FLAG0: u16 = 0x1000; +pub const EV_POLL: u16 = 0x1000; +pub const EV_FLAG1: u16 = 0x2000; +pub const EV_OOBAND: u16 = 0x2000; +pub const EV_ERROR: u16 = 0x4000; +pub const EV_EOF: u16 = 0x8000; +pub const EV_SYSFLAGS: u16 = 0xf000; + +pub const NOTE_TRIGGER: u32 = 0x01000000; +pub const NOTE_FFNOP: u32 = 0x00000000; +pub const NOTE_FFAND: u32 = 0x40000000; +pub const NOTE_FFOR: u32 = 0x80000000; +pub const NOTE_FFCOPY: u32 = 0xc0000000; +pub const NOTE_FFCTRLMASK: u32 = 0xc0000000; +pub const NOTE_FFLAGSMASK: u32 = 0x00ffffff; +pub const NOTE_LOWAT: u32 = 0x00000001; +pub const NOTE_DELETE: u32 = 0x00000001; +pub const NOTE_WRITE: u32 = 0x00000002; +pub const NOTE_EXTEND: u32 = 0x00000004; +pub const NOTE_ATTRIB: u32 = 0x00000008; +pub const NOTE_LINK: u32 = 0x00000010; +pub const NOTE_RENAME: u32 = 0x00000020; +pub const NOTE_REVOKE: u32 = 0x00000040; +pub const NOTE_NONE: u32 = 0x00000080; +pub const NOTE_EXIT: u32 = 0x80000000; +pub const NOTE_FORK: u32 = 0x40000000; +pub const NOTE_EXEC: u32 = 0x20000000; +#[doc(hidden)] +#[deprecated(since = "0.2.49", note = "Deprecated since MacOSX 10.9")] +pub const NOTE_REAP: u32 = 0x10000000; +pub const NOTE_SIGNAL: u32 = 0x08000000; +pub const NOTE_EXITSTATUS: u32 = 0x04000000; +pub const NOTE_EXIT_DETAIL: u32 = 0x02000000; +pub const NOTE_PDATAMASK: u32 = 0x000fffff; +pub const NOTE_PCTRLMASK: u32 = 0xfff00000; +#[doc(hidden)] +#[deprecated(since = "0.2.49", note = "Deprecated since MacOSX 10.9")] +pub const NOTE_EXIT_REPARENTED: u32 = 0x00080000; +pub const NOTE_EXIT_DETAIL_MASK: u32 = 0x00070000; +pub const NOTE_EXIT_DECRYPTFAIL: u32 = 0x00010000; +pub const NOTE_EXIT_MEMORY: u32 = 0x00020000; +pub const NOTE_EXIT_CSERROR: u32 = 0x00040000; +pub const NOTE_VM_PRESSURE: u32 = 0x80000000; +pub const NOTE_VM_PRESSURE_TERMINATE: u32 = 0x40000000; +pub const NOTE_VM_PRESSURE_SUDDEN_TERMINATE: u32 = 0x20000000; +pub const NOTE_VM_ERROR: u32 = 0x10000000; +pub const NOTE_SECONDS: u32 = 0x00000001; +pub const NOTE_USECONDS: u32 = 0x00000002; +pub const NOTE_NSECONDS: u32 = 0x00000004; +pub const NOTE_ABSOLUTE: u32 = 0x00000008; +pub const NOTE_LEEWAY: u32 = 0x00000010; +pub const NOTE_CRITICAL: u32 = 0x00000020; +pub const NOTE_BACKGROUND: u32 = 0x00000040; +pub const NOTE_TRACK: u32 = 0x00000001; +pub const NOTE_TRACKERR: u32 = 0x00000002; +pub const NOTE_CHILD: u32 = 0x00000004; + +pub const OCRNL: ::tcflag_t = 0x00000010; +pub const ONOCR: ::tcflag_t = 0x00000020; +pub const ONLRET: ::tcflag_t = 0x00000040; +pub const OFILL: ::tcflag_t = 0x00000080; +pub const NLDLY: ::tcflag_t = 0x00000300; +pub const TABDLY: ::tcflag_t = 0x00000c04; +pub const CRDLY: ::tcflag_t = 0x00003000; +pub const FFDLY: ::tcflag_t = 0x00004000; +pub const BSDLY: ::tcflag_t = 0x00008000; +pub const VTDLY: ::tcflag_t = 0x00010000; +pub const OFDEL: ::tcflag_t = 0x00020000; + +pub const NL0: ::tcflag_t = 0x00000000; +pub const NL1: ::tcflag_t = 0x00000100; +pub const TAB0: ::tcflag_t = 0x00000000; +pub const TAB1: ::tcflag_t = 0x00000400; +pub const TAB2: ::tcflag_t = 0x00000800; +pub const CR0: ::tcflag_t = 0x00000000; +pub const CR1: ::tcflag_t = 0x00001000; +pub const CR2: ::tcflag_t = 0x00002000; +pub const CR3: ::tcflag_t = 0x00003000; +pub const FF0: ::tcflag_t = 0x00000000; +pub const FF1: ::tcflag_t = 0x00004000; +pub const BS0: ::tcflag_t = 0x00000000; +pub const BS1: ::tcflag_t = 0x00008000; +pub const TAB3: ::tcflag_t = 0x00000004; +pub const VT0: ::tcflag_t = 0x00000000; +pub const VT1: ::tcflag_t = 0x00010000; +pub const IUTF8: ::tcflag_t = 0x00004000; +pub const CRTSCTS: ::tcflag_t = 0x00030000; + +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const NI_MAXSERV: ::socklen_t = 32; +pub const NI_NOFQDN: ::c_int = 0x00000001; +pub const NI_NUMERICHOST: ::c_int = 0x00000002; +pub const NI_NAMEREQD: ::c_int = 0x00000004; +pub const NI_NUMERICSERV: ::c_int = 0x00000008; +pub const NI_NUMERICSCOPE: ::c_int = 0x00000100; +pub const NI_DGRAM: ::c_int = 0x00000010; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const RENAME_SWAP: ::c_uint = 0x00000002; +pub const RENAME_EXCL: ::c_uint = 0x00000004; + +pub const RTLD_LOCAL: ::c_int = 0x4; +pub const RTLD_FIRST: ::c_int = 0x100; +pub const RTLD_NODELETE: ::c_int = 0x80; +pub const RTLD_NOLOAD: ::c_int = 0x10; +pub const RTLD_GLOBAL: ::c_int = 0x8; + +pub const _WSTOPPED: ::c_int = 0o177; + +pub const LOG_NETINFO: ::c_int = 12 << 3; +pub const LOG_REMOTEAUTH: ::c_int = 13 << 3; +pub const LOG_INSTALL: ::c_int = 14 << 3; +pub const LOG_RAS: ::c_int = 15 << 3; +pub const LOG_LAUNCHD: ::c_int = 24 << 3; +pub const LOG_NFACILITIES: ::c_int = 25; + +pub const CTLTYPE: ::c_int = 0xf; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_OPAQUE: ::c_int = 5; +pub const CTLTYPE_STRUCT: ::c_int = CTLTYPE_OPAQUE; +pub const CTLFLAG_RD: ::c_int = 0x80000000; +pub const CTLFLAG_WR: ::c_int = 0x40000000; +pub const CTLFLAG_RW: ::c_int = CTLFLAG_RD | CTLFLAG_WR; +pub const CTLFLAG_NOLOCK: ::c_int = 0x20000000; +pub const CTLFLAG_ANYBODY: ::c_int = 0x10000000; +pub const CTLFLAG_SECURE: ::c_int = 0x08000000; +pub const CTLFLAG_MASKED: ::c_int = 0x04000000; +pub const CTLFLAG_NOAUTO: ::c_int = 0x02000000; +pub const CTLFLAG_KERN: ::c_int = 0x01000000; +pub const CTLFLAG_LOCKED: ::c_int = 0x00800000; +pub const CTLFLAG_OID2: ::c_int = 0x00400000; +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_MAXID: ::c_int = 9; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_DOMAINNAME: ::c_int = KERN_NISDOMAINNAME; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_KDEBUG: ::c_int = 24; +pub const KERN_UPDATEINTERVAL: ::c_int = 25; +pub const KERN_OSRELDATE: ::c_int = 26; +pub const KERN_NTP_PLL: ::c_int = 27; +pub const KERN_BOOTFILE: ::c_int = 28; +pub const KERN_MAXFILESPERPROC: ::c_int = 29; +pub const KERN_MAXPROCPERUID: ::c_int = 30; +pub const KERN_DUMPDEV: ::c_int = 31; +pub const KERN_IPC: ::c_int = 32; +pub const KERN_DUMMY: ::c_int = 33; +pub const KERN_PS_STRINGS: ::c_int = 34; +pub const KERN_USRSTACK32: ::c_int = 35; +pub const KERN_LOGSIGEXIT: ::c_int = 36; +pub const KERN_SYMFILE: ::c_int = 37; +pub const KERN_PROCARGS: ::c_int = 38; +pub const KERN_NETBOOT: ::c_int = 40; +pub const KERN_SYSV: ::c_int = 42; +pub const KERN_AFFINITY: ::c_int = 43; +pub const KERN_TRANSLATE: ::c_int = 44; +pub const KERN_CLASSIC: ::c_int = KERN_TRANSLATE; +pub const KERN_EXEC: ::c_int = 45; +pub const KERN_CLASSICHANDLER: ::c_int = KERN_EXEC; +pub const KERN_AIOMAX: ::c_int = 46; +pub const KERN_AIOPROCMAX: ::c_int = 47; +pub const KERN_AIOTHREADS: ::c_int = 48; +pub const KERN_COREFILE: ::c_int = 50; +pub const KERN_COREDUMP: ::c_int = 51; +pub const KERN_SUGID_COREDUMP: ::c_int = 52; +pub const KERN_PROCDELAYTERM: ::c_int = 53; +pub const KERN_SHREG_PRIVATIZABLE: ::c_int = 54; +pub const KERN_LOW_PRI_WINDOW: ::c_int = 56; +pub const KERN_LOW_PRI_DELAY: ::c_int = 57; +pub const KERN_POSIX: ::c_int = 58; +pub const KERN_USRSTACK64: ::c_int = 59; +pub const KERN_NX_PROTECTION: ::c_int = 60; +pub const KERN_TFP: ::c_int = 61; +pub const KERN_PROCNAME: ::c_int = 62; +pub const KERN_THALTSTACK: ::c_int = 63; +pub const KERN_SPECULATIVE_READS: ::c_int = 64; +pub const KERN_OSVERSION: ::c_int = 65; +pub const KERN_SAFEBOOT: ::c_int = 66; +pub const KERN_RAGEVNODE: ::c_int = 68; +pub const KERN_TTY: ::c_int = 69; +pub const KERN_CHECKOPENEVT: ::c_int = 70; +pub const KERN_THREADNAME: ::c_int = 71; +pub const KERN_MAXID: ::c_int = 72; +pub const KERN_RAGE_PROC: ::c_int = 1; +pub const KERN_RAGE_THREAD: ::c_int = 2; +pub const KERN_UNRAGE_PROC: ::c_int = 3; +pub const KERN_UNRAGE_THREAD: ::c_int = 4; +pub const KERN_OPENEVT_PROC: ::c_int = 1; +pub const KERN_UNOPENEVT_PROC: ::c_int = 2; +pub const KERN_TFP_POLICY: ::c_int = 1; +pub const KERN_TFP_POLICY_DENY: ::c_int = 0; +pub const KERN_TFP_POLICY_DEFAULT: ::c_int = 2; +pub const KERN_KDEFLAGS: ::c_int = 1; +pub const KERN_KDDFLAGS: ::c_int = 2; +pub const KERN_KDENABLE: ::c_int = 3; +pub const KERN_KDSETBUF: ::c_int = 4; +pub const KERN_KDGETBUF: ::c_int = 5; +pub const KERN_KDSETUP: ::c_int = 6; +pub const KERN_KDREMOVE: ::c_int = 7; +pub const KERN_KDSETREG: ::c_int = 8; +pub const KERN_KDGETREG: ::c_int = 9; +pub const KERN_KDREADTR: ::c_int = 10; +pub const KERN_KDPIDTR: ::c_int = 11; +pub const KERN_KDTHRMAP: ::c_int = 12; +pub const KERN_KDPIDEX: ::c_int = 14; +pub const KERN_KDSETRTCDEC: ::c_int = 15; +pub const KERN_KDGETENTROPY: ::c_int = 16; +pub const KERN_KDWRITETR: ::c_int = 17; +pub const KERN_KDWRITEMAP: ::c_int = 18; +#[doc(hidden)] +#[deprecated(since = "0.2.49", note = "Removed in MacOSX 10.12")] +pub const KERN_KDENABLE_BG_TRACE: ::c_int = 19; +#[doc(hidden)] +#[deprecated(since = "0.2.49", note = "Removed in MacOSX 10.12")] +pub const KERN_KDDISABLE_BG_TRACE: ::c_int = 20; +pub const KERN_KDREADCURTHRMAP: ::c_int = 21; +pub const KERN_KDSET_TYPEFILTER: ::c_int = 22; +pub const KERN_KDBUFWAIT: ::c_int = 23; +pub const KERN_KDCPUMAP: ::c_int = 24; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_LCID: ::c_int = 7; +pub const KERN_SUCCESS: ::c_int = 0; +pub const KERN_INVALID_ADDRESS: ::c_int = 1; +pub const KERN_PROTECTION_FAILURE: ::c_int = 2; +pub const KERN_NO_SPACE: ::c_int = 3; +pub const KERN_INVALID_ARGUMENT: ::c_int = 4; +pub const KERN_FAILURE: ::c_int = 5; +pub const KERN_RESOURCE_SHORTAGE: ::c_int = 6; +pub const KERN_NOT_RECEIVER: ::c_int = 7; +pub const KERN_NO_ACCESS: ::c_int = 8; +pub const KERN_MEMORY_FAILURE: ::c_int = 9; +pub const KERN_MEMORY_ERROR: ::c_int = 10; +pub const KERN_ALREADY_IN_SET: ::c_int = 11; +pub const KERN_NOT_IN_SET: ::c_int = 12; +pub const KERN_NAME_EXISTS: ::c_int = 13; +pub const KERN_ABORTED: ::c_int = 14; +pub const KERN_INVALID_NAME: ::c_int = 15; +pub const KERN_INVALID_TASK: ::c_int = 16; +pub const KERN_INVALID_RIGHT: ::c_int = 17; +pub const KERN_INVALID_VALUE: ::c_int = 18; +pub const KERN_UREFS_OVERFLOW: ::c_int = 19; +pub const KERN_INVALID_CAPABILITY: ::c_int = 20; +pub const KERN_RIGHT_EXISTS: ::c_int = 21; +pub const KERN_INVALID_HOST: ::c_int = 22; +pub const KERN_MEMORY_PRESENT: ::c_int = 23; +pub const KERN_MEMORY_DATA_MOVED: ::c_int = 24; +pub const KERN_MEMORY_RESTART_COPY: ::c_int = 25; +pub const KERN_INVALID_PROCESSOR_SET: ::c_int = 26; +pub const KERN_POLICY_LIMIT: ::c_int = 27; +pub const KERN_INVALID_POLICY: ::c_int = 28; +pub const KERN_INVALID_OBJECT: ::c_int = 29; +pub const KERN_ALREADY_WAITING: ::c_int = 30; +pub const KERN_DEFAULT_SET: ::c_int = 31; +pub const KERN_EXCEPTION_PROTECTED: ::c_int = 32; +pub const KERN_INVALID_LEDGER: ::c_int = 33; +pub const KERN_INVALID_MEMORY_CONTROL: ::c_int = 34; +pub const KERN_INVALID_SECURITY: ::c_int = 35; +pub const KERN_NOT_DEPRESSED: ::c_int = 36; +pub const KERN_TERMINATED: ::c_int = 37; +pub const KERN_LOCK_SET_DESTROYED: ::c_int = 38; +pub const KERN_LOCK_UNSTABLE: ::c_int = 39; +pub const KERN_LOCK_OWNED: ::c_int = 40; +pub const KERN_LOCK_OWNED_SELF: ::c_int = 41; +pub const KERN_SEMAPHORE_DESTROYED: ::c_int = 42; +pub const KERN_RPC_SERVER_TERMINATED: ::c_int = 43; +pub const KERN_RPC_TERMINATE_ORPHAN: ::c_int = 44; +pub const KERN_RPC_CONTINUE_ORPHAN: ::c_int = 45; +pub const KERN_NOT_SUPPORTED: ::c_int = 46; +pub const KERN_NODE_DOWN: ::c_int = 47; +pub const KERN_NOT_WAITING: ::c_int = 48; +pub const KERN_OPERATION_TIMED_OUT: ::c_int = 49; +pub const KERN_CODESIGN_ERROR: ::c_int = 50; +pub const KERN_POLICY_STATIC: ::c_int = 51; +pub const KERN_INSUFFICIENT_BUFFER_SIZE: ::c_int = 52; +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; +pub const KIPC_MBSTAT: ::c_int = 8; +pub const KIPC_NMBCLUSTERS: ::c_int = 9; +pub const KIPC_SOQLIMITCOMPAT: ::c_int = 10; +pub const VM_METER: ::c_int = 1; +pub const VM_LOADAVG: ::c_int = 2; +pub const VM_MACHFACTOR: ::c_int = 4; +pub const VM_SWAPUSAGE: ::c_int = 5; +pub const VM_MAXID: ::c_int = 6; +pub const VM_PROT_NONE: ::vm_prot_t = 0x00; +pub const VM_PROT_READ: ::vm_prot_t = 0x01; +pub const VM_PROT_WRITE: ::vm_prot_t = 0x02; +pub const VM_PROT_EXECUTE: ::vm_prot_t = 0x04; +pub const MEMORY_OBJECT_NULL: ::memory_object_t = 0; +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_EPOCH: ::c_int = 10; +pub const HW_FLOATINGPT: ::c_int = 11; +pub const HW_MACHINE_ARCH: ::c_int = 12; +pub const HW_VECTORUNIT: ::c_int = 13; +pub const HW_BUS_FREQ: ::c_int = 14; +pub const HW_CPU_FREQ: ::c_int = 15; +pub const HW_CACHELINE: ::c_int = 16; +pub const HW_L1ICACHESIZE: ::c_int = 17; +pub const HW_L1DCACHESIZE: ::c_int = 18; +pub const HW_L2SETTINGS: ::c_int = 19; +pub const HW_L2CACHESIZE: ::c_int = 20; +pub const HW_L3SETTINGS: ::c_int = 21; +pub const HW_L3CACHESIZE: ::c_int = 22; +pub const HW_TB_FREQ: ::c_int = 23; +pub const HW_MEMSIZE: ::c_int = 24; +pub const HW_AVAILCPU: ::c_int = 25; +pub const HW_TARGET: ::c_int = 26; +pub const HW_PRODUCT: ::c_int = 27; +pub const HW_MAXID: ::c_int = 28; +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_MAXID: ::c_int = 21; +pub const CTL_DEBUG_NAME: ::c_int = 0; +pub const CTL_DEBUG_VALUE: ::c_int = 1; +pub const CTL_DEBUG_MAXID: ::c_int = 20; + +pub const PRIO_DARWIN_THREAD: ::c_int = 3; +pub const PRIO_DARWIN_PROCESS: ::c_int = 4; +pub const PRIO_DARWIN_BG: ::c_int = 0x1000; +pub const PRIO_DARWIN_NONUI: ::c_int = 0x1001; + +pub const SEM_FAILED: *mut sem_t = -1isize as *mut ::sem_t; + +pub const AI_PASSIVE: ::c_int = 0x00000001; +pub const AI_CANONNAME: ::c_int = 0x00000002; +pub const AI_NUMERICHOST: ::c_int = 0x00000004; +pub const AI_NUMERICSERV: ::c_int = 0x00001000; +pub const AI_MASK: ::c_int = + AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_ADDRCONFIG; +pub const AI_ALL: ::c_int = 0x00000100; +pub const AI_V4MAPPED_CFG: ::c_int = 0x00000200; +pub const AI_ADDRCONFIG: ::c_int = 0x00000400; +pub const AI_V4MAPPED: ::c_int = 0x00000800; +pub const AI_DEFAULT: ::c_int = AI_V4MAPPED_CFG | AI_ADDRCONFIG; +pub const AI_UNUSABLE: ::c_int = 0x10000000; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 3; + +pub const AIO_CANCELED: ::c_int = 2; +pub const AIO_NOTCANCELED: ::c_int = 4; +pub const AIO_ALLDONE: ::c_int = 1; +#[deprecated( + since = "0.2.64", + note = "Can vary at runtime. Use sysconf(3) instead" +)] +pub const AIO_LISTIO_MAX: ::c_int = 16; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 2; +pub const LIO_READ: ::c_int = 1; +pub const LIO_WAIT: ::c_int = 2; +pub const LIO_NOWAIT: ::c_int = 1; + +pub const WEXITED: ::c_int = 0x00000004; +pub const WSTOPPED: ::c_int = 0x00000008; +pub const WCONTINUED: ::c_int = 0x00000010; +pub const WNOWAIT: ::c_int = 0x00000020; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +pub const UTIME_OMIT: c_long = -2; +pub const UTIME_NOW: c_long = -1; + +pub const XATTR_NOFOLLOW: ::c_int = 0x0001; +pub const XATTR_CREATE: ::c_int = 0x0002; +pub const XATTR_REPLACE: ::c_int = 0x0004; +pub const XATTR_NOSECURITY: ::c_int = 0x0008; +pub const XATTR_NODEFAULT: ::c_int = 0x0010; +pub const XATTR_SHOWCOMPRESSION: ::c_int = 0x0020; + +pub const NET_RT_IFLIST2: ::c_int = 0x0006; + +// net/route.h +pub const RTF_UP: ::c_int = 0x1; +pub const RTF_GATEWAY: ::c_int = 0x2; +pub const RTF_HOST: ::c_int = 0x4; +pub const RTF_REJECT: ::c_int = 0x8; +pub const RTF_DYNAMIC: ::c_int = 0x10; +pub const RTF_MODIFIED: ::c_int = 0x20; +pub const RTF_DONE: ::c_int = 0x40; +pub const RTF_DELCLONE: ::c_int = 0x80; +pub const RTF_CLONING: ::c_int = 0x100; +pub const RTF_XRESOLVE: ::c_int = 0x200; +pub const RTF_LLINFO: ::c_int = 0x400; +pub const RTF_STATIC: ::c_int = 0x800; +pub const RTF_BLACKHOLE: ::c_int = 0x1000; +pub const RTF_NOIFREF: ::c_int = 0x2000; +pub const RTF_PROTO2: ::c_int = 0x4000; +pub const RTF_PROTO1: ::c_int = 0x8000; +pub const RTF_PRCLONING: ::c_int = 0x10000; +pub const RTF_WASCLONED: ::c_int = 0x20000; +pub const RTF_PROTO3: ::c_int = 0x40000; +pub const RTF_PINNED: ::c_int = 0x100000; +pub const RTF_LOCAL: ::c_int = 0x200000; +pub const RTF_BROADCAST: ::c_int = 0x400000; +pub const RTF_MULTICAST: ::c_int = 0x800000; +pub const RTF_IFSCOPE: ::c_int = 0x1000000; +pub const RTF_CONDEMNED: ::c_int = 0x2000000; +pub const RTF_IFREF: ::c_int = 0x4000000; +pub const RTF_PROXY: ::c_int = 0x8000000; +pub const RTF_ROUTER: ::c_int = 0x10000000; +pub const RTF_DEAD: ::c_int = 0x20000000; +pub const RTF_GLOBAL: ::c_int = 0x40000000; + +pub const RTM_VERSION: ::c_int = 5; + +// Message types +pub const RTM_ADD: ::c_int = 0x1; +pub const RTM_DELETE: ::c_int = 0x2; +pub const RTM_CHANGE: ::c_int = 0x3; +pub const RTM_GET: ::c_int = 0x4; +pub const RTM_LOSING: ::c_int = 0x5; +pub const RTM_REDIRECT: ::c_int = 0x6; +pub const RTM_MISS: ::c_int = 0x7; +pub const RTM_LOCK: ::c_int = 0x8; +pub const RTM_OLDADD: ::c_int = 0x9; +pub const RTM_OLDDEL: ::c_int = 0xa; +pub const RTM_RESOLVE: ::c_int = 0xb; +pub const RTM_NEWADDR: ::c_int = 0xc; +pub const RTM_DELADDR: ::c_int = 0xd; +pub const RTM_IFINFO: ::c_int = 0xe; +pub const RTM_NEWMADDR: ::c_int = 0xf; +pub const RTM_DELMADDR: ::c_int = 0x10; +pub const RTM_IFINFO2: ::c_int = 0x12; +pub const RTM_NEWMADDR2: ::c_int = 0x13; +pub const RTM_GET2: ::c_int = 0x14; + +// Bitmask values for rtm_inits and rmx_locks. +pub const RTV_MTU: ::c_int = 0x1; +pub const RTV_HOPCOUNT: ::c_int = 0x2; +pub const RTV_EXPIRE: ::c_int = 0x4; +pub const RTV_RPIPE: ::c_int = 0x8; +pub const RTV_SPIPE: ::c_int = 0x10; +pub const RTV_SSTHRESH: ::c_int = 0x20; +pub const RTV_RTT: ::c_int = 0x40; +pub const RTV_RTTVAR: ::c_int = 0x80; + +// Bitmask values for rtm_addrs. +pub const RTA_DST: ::c_int = 0x1; +pub const RTA_GATEWAY: ::c_int = 0x2; +pub const RTA_NETMASK: ::c_int = 0x4; +pub const RTA_GENMASK: ::c_int = 0x8; +pub const RTA_IFP: ::c_int = 0x10; +pub const RTA_IFA: ::c_int = 0x20; +pub const RTA_AUTHOR: ::c_int = 0x40; +pub const RTA_BRD: ::c_int = 0x80; + +// Index offsets for sockaddr array for alternate internal encoding. +pub const RTAX_DST: ::c_int = 0; +pub const RTAX_GATEWAY: ::c_int = 1; +pub const RTAX_NETMASK: ::c_int = 2; +pub const RTAX_GENMASK: ::c_int = 3; +pub const RTAX_IFP: ::c_int = 4; +pub const RTAX_IFA: ::c_int = 5; +pub const RTAX_AUTHOR: ::c_int = 6; +pub const RTAX_BRD: ::c_int = 7; +pub const RTAX_MAX: ::c_int = 8; + +pub const KERN_PROCARGS2: ::c_int = 49; + +pub const PROC_PIDTASKALLINFO: ::c_int = 2; +pub const PROC_PIDTBSDINFO: ::c_int = 3; +pub const PROC_PIDTASKINFO: ::c_int = 4; +pub const PROC_PIDTHREADINFO: ::c_int = 5; +pub const PROC_PIDVNODEPATHINFO: ::c_int = 9; +pub const PROC_PIDPATHINFO_MAXSIZE: ::c_int = 4096; +pub const PROC_CSM_ALL: ::c_uint = 0x0001; +pub const PROC_CSM_NOSMT: ::c_uint = 0x0002; +pub const PROC_CSM_TECS: ::c_uint = 0x0004; +pub const MAXCOMLEN: usize = 16; +pub const MAXTHREADNAMESIZE: usize = 64; + +pub const XUCRED_VERSION: ::c_uint = 0; + +pub const LC_SEGMENT: u32 = 0x1; +pub const LC_SEGMENT_64: u32 = 0x19; + +pub const MH_MAGIC: u32 = 0xfeedface; +pub const MH_MAGIC_64: u32 = 0xfeedfacf; + +// net/if_utun.h +pub const UTUN_OPT_FLAGS: ::c_int = 1; +pub const UTUN_OPT_IFNAME: ::c_int = 2; + +// net/bpf.h +pub const DLT_NULL: ::c_uint = 0; // no link-layer encapsulation +pub const DLT_EN10MB: ::c_uint = 1; // Ethernet (10Mb) +pub const DLT_EN3MB: ::c_uint = 2; // Experimental Ethernet (3Mb) +pub const DLT_AX25: ::c_uint = 3; // Amateur Radio AX.25 +pub const DLT_PRONET: ::c_uint = 4; // Proteon ProNET Token Ring +pub const DLT_CHAOS: ::c_uint = 5; // Chaos +pub const DLT_IEEE802: ::c_uint = 6; // IEEE 802 Networks +pub const DLT_ARCNET: ::c_uint = 7; // ARCNET +pub const DLT_SLIP: ::c_uint = 8; // Serial Line IP +pub const DLT_PPP: ::c_uint = 9; // Point-to-point Protocol +pub const DLT_FDDI: ::c_uint = 10; // FDDI +pub const DLT_ATM_RFC1483: ::c_uint = 11; // LLC/SNAP encapsulated atm +pub const DLT_RAW: ::c_uint = 12; // raw IP +pub const DLT_LOOP: ::c_uint = 108; + +// https://github.com/apple/darwin-xnu/blob/HEAD/bsd/net/bpf.h#L100 +// sizeof(i32) +pub const BPF_ALIGNMENT: ::c_int = 4; + +// sys/mount.h +pub const MNT_NODEV: ::c_int = 0x00000010; +pub const MNT_UNION: ::c_int = 0x00000020; +pub const MNT_CPROTECT: ::c_int = 0x00000080; + +// MAC labeled / "quarantined" flag +pub const MNT_QUARANTINE: ::c_int = 0x00000400; + +// Flags set by internal operations. +pub const MNT_LOCAL: ::c_int = 0x00001000; +pub const MNT_QUOTA: ::c_int = 0x00002000; +pub const MNT_ROOTFS: ::c_int = 0x00004000; +pub const MNT_DOVOLFS: ::c_int = 0x00008000; + +pub const MNT_DONTBROWSE: ::c_int = 0x00100000; +pub const MNT_IGNORE_OWNERSHIP: ::c_int = 0x00200000; +pub const MNT_AUTOMOUNTED: ::c_int = 0x00400000; +pub const MNT_JOURNALED: ::c_int = 0x00800000; +pub const MNT_NOUSERXATTR: ::c_int = 0x01000000; +pub const MNT_DEFWRITE: ::c_int = 0x02000000; +pub const MNT_MULTILABEL: ::c_int = 0x04000000; +pub const MNT_NOATIME: ::c_int = 0x10000000; +pub const MNT_SNAPSHOT: ::c_int = 0x40000000; + +// External filesystem command modifier flags. +pub const MNT_NOBLOCK: ::c_int = 0x00020000; + +// sys/spawn.h: +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x01; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x02; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x04; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x08; +pub const POSIX_SPAWN_SETEXEC: ::c_int = 0x40; +pub const POSIX_SPAWN_START_SUSPENDED: ::c_int = 0x80; +pub const POSIX_SPAWN_CLOEXEC_DEFAULT: ::c_int = 0x4000; + +// sys/ipc.h: +pub const IPC_CREAT: ::c_int = 0x200; +pub const IPC_EXCL: ::c_int = 0x400; +pub const IPC_NOWAIT: ::c_int = 0x800; +pub const IPC_PRIVATE: key_t = 0; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; + +pub const IPC_R: ::c_int = 0x100; +pub const IPC_W: ::c_int = 0x80; +pub const IPC_M: ::c_int = 0x1000; + +// sys/sem.h +pub const SEM_UNDO: ::c_int = 0o10000; + +pub const GETNCNT: ::c_int = 3; +pub const GETPID: ::c_int = 4; +pub const GETVAL: ::c_int = 5; +pub const GETALL: ::c_int = 6; +pub const GETZCNT: ::c_int = 7; +pub const SETVAL: ::c_int = 8; +pub const SETALL: ::c_int = 9; + +// sys/shm.h +pub const SHM_RDONLY: ::c_int = 0x1000; +pub const SHM_RND: ::c_int = 0x2000; +#[cfg(target_arch = "aarch64")] +pub const SHMLBA: ::c_int = 16 * 1024; +#[cfg(not(target_arch = "aarch64"))] +pub const SHMLBA: ::c_int = 4096; +pub const SHM_R: ::c_int = IPC_R; +pub const SHM_W: ::c_int = IPC_W; + +// Flags for chflags(2) +pub const UF_SETTABLE: ::c_uint = 0x0000ffff; +pub const UF_NODUMP: ::c_uint = 0x00000001; +pub const UF_IMMUTABLE: ::c_uint = 0x00000002; +pub const UF_APPEND: ::c_uint = 0x00000004; +pub const UF_OPAQUE: ::c_uint = 0x00000008; +pub const UF_COMPRESSED: ::c_uint = 0x00000020; +pub const UF_TRACKED: ::c_uint = 0x00000040; +pub const SF_SETTABLE: ::c_uint = 0xffff0000; +pub const SF_ARCHIVED: ::c_uint = 0x00010000; +pub const SF_IMMUTABLE: ::c_uint = 0x00020000; +pub const SF_APPEND: ::c_uint = 0x00040000; +pub const UF_HIDDEN: ::c_uint = 0x00008000; + +// +pub const NTP_API: ::c_int = 4; +pub const MAXPHASE: ::c_long = 500000000; +pub const MAXFREQ: ::c_long = 500000; +pub const MINSEC: ::c_int = 256; +pub const MAXSEC: ::c_int = 2048; +pub const NANOSECOND: ::c_long = 1000000000; +pub const SCALE_PPM: ::c_int = 65; +pub const MAXTC: ::c_int = 10; +pub const MOD_OFFSET: ::c_uint = 0x0001; +pub const MOD_FREQUENCY: ::c_uint = 0x0002; +pub const MOD_MAXERROR: ::c_uint = 0x0004; +pub const MOD_ESTERROR: ::c_uint = 0x0008; +pub const MOD_STATUS: ::c_uint = 0x0010; +pub const MOD_TIMECONST: ::c_uint = 0x0020; +pub const MOD_PPSMAX: ::c_uint = 0x0040; +pub const MOD_TAI: ::c_uint = 0x0080; +pub const MOD_MICRO: ::c_uint = 0x1000; +pub const MOD_NANO: ::c_uint = 0x2000; +pub const MOD_CLKB: ::c_uint = 0x4000; +pub const MOD_CLKA: ::c_uint = 0x8000; +pub const STA_PLL: ::c_int = 0x0001; +pub const STA_PPSFREQ: ::c_int = 0x0002; +pub const STA_PPSTIME: ::c_int = 0x0004; +pub const STA_FLL: ::c_int = 0x0008; +pub const STA_INS: ::c_int = 0x0010; +pub const STA_DEL: ::c_int = 0x0020; +pub const STA_UNSYNC: ::c_int = 0x0040; +pub const STA_FREQHOLD: ::c_int = 0x0080; +pub const STA_PPSSIGNAL: ::c_int = 0x0100; +pub const STA_PPSJITTER: ::c_int = 0x0200; +pub const STA_PPSWANDER: ::c_int = 0x0400; +pub const STA_PPSERROR: ::c_int = 0x0800; +pub const STA_CLOCKERR: ::c_int = 0x1000; +pub const STA_NANO: ::c_int = 0x2000; +pub const STA_MODE: ::c_int = 0x4000; +pub const STA_CLK: ::c_int = 0x8000; +pub const STA_RONLY: ::c_int = STA_PPSSIGNAL + | STA_PPSJITTER + | STA_PPSWANDER + | STA_PPSERROR + | STA_CLOCKERR + | STA_NANO + | STA_MODE + | STA_CLK; +pub const TIME_OK: ::c_int = 0; +pub const TIME_INS: ::c_int = 1; +pub const TIME_DEL: ::c_int = 2; +pub const TIME_OOP: ::c_int = 3; +pub const TIME_WAIT: ::c_int = 4; +pub const TIME_ERROR: ::c_int = 5; + +// +pub const MNT_WAIT: ::c_int = 1; +pub const MNT_NOWAIT: ::c_int = 2; + +// +pub const THREAD_STANDARD_POLICY: ::c_int = 1; +pub const THREAD_STANDARD_POLICY_COUNT: ::c_int = 0; +pub const THREAD_EXTENDED_POLICY: ::c_int = 1; +pub const THREAD_TIME_CONSTRAINT_POLICY: ::c_int = 2; +pub const THREAD_PRECEDENCE_POLICY: ::c_int = 3; +pub const THREAD_AFFINITY_POLICY: ::c_int = 4; +pub const THREAD_AFFINITY_TAG_NULL: ::c_int = 0; +pub const THREAD_BACKGROUND_POLICY: ::c_int = 5; +pub const THREAD_BACKGROUND_POLICY_DARWIN_BG: ::c_int = 0x1000; +pub const THREAD_LATENCY_QOS_POLICY: ::c_int = 7; +pub const THREAD_THROUGHPUT_QOS_POLICY: ::c_int = 8; + +// +pub const TH_STATE_RUNNING: ::c_int = 1; +pub const TH_STATE_STOPPED: ::c_int = 2; +pub const TH_STATE_WAITING: ::c_int = 3; +pub const TH_STATE_UNINTERRUPTIBLE: ::c_int = 4; +pub const TH_STATE_HALTED: ::c_int = 5; +pub const TH_FLAGS_SWAPPED: ::c_int = 0x1; +pub const TH_FLAGS_IDLE: ::c_int = 0x2; +pub const TH_FLAGS_GLOBAL_FORCED_IDLE: ::c_int = 0x4; +pub const THREAD_BASIC_INFO: ::c_int = 3; +pub const THREAD_IDENTIFIER_INFO: ::c_int = 4; +pub const THREAD_EXTENDED_INFO: ::c_int = 5; + +// CommonCrypto/CommonCryptoError.h +pub const kCCSuccess: i32 = 0; +pub const kCCParamError: i32 = -4300; +pub const kCCBufferTooSmall: i32 = -4301; +pub const kCCMemoryFailure: i32 = -4302; +pub const kCCAlignmentError: i32 = -4303; +pub const kCCDecodeError: i32 = -4304; +pub const kCCUnimplemented: i32 = -4305; +pub const kCCOverflow: i32 = -4306; +pub const kCCRNGFailure: i32 = -4307; +pub const kCCUnspecifiedError: i32 = -4308; +pub const kCCCallSequenceError: i32 = -4309; +pub const kCCKeySizeError: i32 = -4310; +pub const kCCInvalidKey: i32 = -4311; + +// mach/host_info.h +pub const HOST_LOAD_INFO: i32 = 1; +pub const HOST_VM_INFO: i32 = 2; +pub const HOST_CPU_LOAD_INFO: i32 = 3; +pub const HOST_VM_INFO64: i32 = 4; +pub const HOST_EXTMOD_INFO64: i32 = 5; +pub const HOST_EXPIRED_TASK_INFO: i32 = 6; + +// mach/vm_statistics.h +pub const VM_PAGE_QUERY_PAGE_PRESENT: i32 = 0x1; +pub const VM_PAGE_QUERY_PAGE_FICTITIOUS: i32 = 0x2; +pub const VM_PAGE_QUERY_PAGE_REF: i32 = 0x4; +pub const VM_PAGE_QUERY_PAGE_DIRTY: i32 = 0x8; +pub const VM_PAGE_QUERY_PAGE_PAGED_OUT: i32 = 0x10; +pub const VM_PAGE_QUERY_PAGE_COPIED: i32 = 0x20; +pub const VM_PAGE_QUERY_PAGE_SPECULATIVE: i32 = 0x40; +pub const VM_PAGE_QUERY_PAGE_EXTERNAL: i32 = 0x80; +pub const VM_PAGE_QUERY_PAGE_CS_VALIDATED: i32 = 0x100; +pub const VM_PAGE_QUERY_PAGE_CS_TAINTED: i32 = 0x200; +pub const VM_PAGE_QUERY_PAGE_CS_NX: i32 = 0x400; + +// mach/task_info.h +pub const TASK_THREAD_TIMES_INFO: u32 = 3; +pub const HOST_CPU_LOAD_INFO_COUNT: u32 = 4; +pub const MACH_TASK_BASIC_INFO: u32 = 20; + +pub const MACH_PORT_NULL: i32 = 0; + +pub const RUSAGE_INFO_V0: ::c_int = 0; +pub const RUSAGE_INFO_V1: ::c_int = 1; +pub const RUSAGE_INFO_V2: ::c_int = 2; +pub const RUSAGE_INFO_V3: ::c_int = 3; +pub const RUSAGE_INFO_V4: ::c_int = 4; + +// copyfile.h +pub const COPYFILE_ACL: ::copyfile_flags_t = 1 << 0; +pub const COPYFILE_STAT: ::copyfile_flags_t = 1 << 1; +pub const COPYFILE_XATTR: ::copyfile_flags_t = 1 << 2; +pub const COPYFILE_DATA: ::copyfile_flags_t = 1 << 3; +pub const COPYFILE_SECURITY: ::copyfile_flags_t = COPYFILE_STAT | COPYFILE_ACL; +pub const COPYFILE_METADATA: ::copyfile_flags_t = COPYFILE_SECURITY | COPYFILE_XATTR; +pub const COPYFILE_RECURSIVE: ::copyfile_flags_t = 1 << 15; +pub const COPYFILE_CHECK: ::copyfile_flags_t = 1 << 16; +pub const COPYFILE_EXCL: ::copyfile_flags_t = 1 << 17; +pub const COPYFILE_NOFOLLOW_SRC: ::copyfile_flags_t = 1 << 18; +pub const COPYFILE_NOFOLLOW_DST: ::copyfile_flags_t = 1 << 19; +pub const COPYFILE_MOVE: ::copyfile_flags_t = 1 << 20; +pub const COPYFILE_UNLINK: ::copyfile_flags_t = 1 << 21; +pub const COPYFILE_NOFOLLOW: ::copyfile_flags_t = COPYFILE_NOFOLLOW_SRC | COPYFILE_NOFOLLOW_DST; +pub const COPYFILE_PACK: ::copyfile_flags_t = 1 << 22; +pub const COPYFILE_UNPACK: ::copyfile_flags_t = 1 << 23; +pub const COPYFILE_CLONE: ::copyfile_flags_t = 1 << 24; +pub const COPYFILE_CLONE_FORCE: ::copyfile_flags_t = 1 << 25; +pub const COPYFILE_RUN_IN_PLACE: ::copyfile_flags_t = 1 << 26; +pub const COPYFILE_DATA_SPARSE: ::copyfile_flags_t = 1 << 27; +pub const COPYFILE_PRESERVE_DST_TRACKED: ::copyfile_flags_t = 1 << 28; +pub const COPYFILE_VERBOSE: ::copyfile_flags_t = 1 << 30; +pub const COPYFILE_RECURSE_ERROR: ::c_int = 0; +pub const COPYFILE_RECURSE_FILE: ::c_int = 1; +pub const COPYFILE_RECURSE_DIR: ::c_int = 2; +pub const COPYFILE_RECURSE_DIR_CLEANUP: ::c_int = 3; +pub const COPYFILE_COPY_DATA: ::c_int = 4; +pub const COPYFILE_COPY_XATTR: ::c_int = 5; +pub const COPYFILE_START: ::c_int = 1; +pub const COPYFILE_FINISH: ::c_int = 2; +pub const COPYFILE_ERR: ::c_int = 3; +pub const COPYFILE_PROGRESS: ::c_int = 4; +pub const COPYFILE_CONTINUE: ::c_int = 0; +pub const COPYFILE_SKIP: ::c_int = 1; +pub const COPYFILE_QUIT: ::c_int = 2; + +// +pub const ATTR_BIT_MAP_COUNT: ::c_ushort = 5; +pub const FSOPT_NOFOLLOW: u32 = 0x1; +pub const FSOPT_NOFOLLOW_ANY: u32 = 0x800; +pub const FSOPT_REPORT_FULLSIZE: u32 = 0x4; +pub const FSOPT_PACK_INVAL_ATTRS: u32 = 0x8; +pub const FSOPT_ATTR_CMN_EXTENDED: u32 = 0x20; +pub const FSOPT_RETURN_REALDEV: u32 = 0x200; +pub const ATTR_CMN_NAME: attrgroup_t = 0x00000001; +pub const ATTR_CMN_DEVID: attrgroup_t = 0x00000002; +pub const ATTR_CMN_FSID: attrgroup_t = 0x00000004; +pub const ATTR_CMN_OBJTYPE: attrgroup_t = 0x00000008; +pub const ATTR_CMN_OBJTAG: attrgroup_t = 0x00000010; +pub const ATTR_CMN_OBJID: attrgroup_t = 0x00000020; +pub const ATTR_CMN_OBJPERMANENTID: attrgroup_t = 0x00000040; +pub const ATTR_CMN_PAROBJID: attrgroup_t = 0x00000080; +pub const ATTR_CMN_SCRIPT: attrgroup_t = 0x00000100; +pub const ATTR_CMN_CRTIME: attrgroup_t = 0x00000200; +pub const ATTR_CMN_MODTIME: attrgroup_t = 0x00000400; +pub const ATTR_CMN_CHGTIME: attrgroup_t = 0x00000800; +pub const ATTR_CMN_ACCTIME: attrgroup_t = 0x00001000; +pub const ATTR_CMN_BKUPTIME: attrgroup_t = 0x00002000; +pub const ATTR_CMN_FNDRINFO: attrgroup_t = 0x00004000; +pub const ATTR_CMN_OWNERID: attrgroup_t = 0x00008000; +pub const ATTR_CMN_GRPID: attrgroup_t = 0x00010000; +pub const ATTR_CMN_ACCESSMASK: attrgroup_t = 0x00020000; +pub const ATTR_CMN_FLAGS: attrgroup_t = 0x00040000; +pub const ATTR_CMN_GEN_COUNT: attrgroup_t = 0x00080000; +pub const ATTR_CMN_DOCUMENT_ID: attrgroup_t = 0x00100000; +pub const ATTR_CMN_USERACCESS: attrgroup_t = 0x00200000; +pub const ATTR_CMN_EXTENDED_SECURITY: attrgroup_t = 0x00400000; +pub const ATTR_CMN_UUID: attrgroup_t = 0x00800000; +pub const ATTR_CMN_GRPUUID: attrgroup_t = 0x01000000; +pub const ATTR_CMN_FILEID: attrgroup_t = 0x02000000; +pub const ATTR_CMN_PARENTID: attrgroup_t = 0x04000000; +pub const ATTR_CMN_FULLPATH: attrgroup_t = 0x08000000; +pub const ATTR_CMN_ADDEDTIME: attrgroup_t = 0x10000000; +pub const ATTR_CMN_DATA_PROTECT_FLAGS: attrgroup_t = 0x40000000; +pub const ATTR_CMN_RETURNED_ATTRS: attrgroup_t = 0x80000000; +pub const ATTR_VOL_FSTYPE: attrgroup_t = 0x00000001; +pub const ATTR_VOL_SIGNATURE: attrgroup_t = 0x00000002; +pub const ATTR_VOL_SIZE: attrgroup_t = 0x00000004; +pub const ATTR_VOL_SPACEFREE: attrgroup_t = 0x00000008; +pub const ATTR_VOL_SPACEAVAIL: attrgroup_t = 0x00000010; +pub const ATTR_VOL_MINALLOCATION: attrgroup_t = 0x00000020; +pub const ATTR_VOL_ALLOCATIONCLUMP: attrgroup_t = 0x00000040; +pub const ATTR_VOL_IOBLOCKSIZE: attrgroup_t = 0x00000080; +pub const ATTR_VOL_OBJCOUNT: attrgroup_t = 0x00000100; +pub const ATTR_VOL_FILECOUNT: attrgroup_t = 0x00000200; +pub const ATTR_VOL_DIRCOUNT: attrgroup_t = 0x00000400; +pub const ATTR_VOL_MAXOBJCOUNT: attrgroup_t = 0x00000800; +pub const ATTR_VOL_MOUNTPOINT: attrgroup_t = 0x00001000; +pub const ATTR_VOL_NAME: attrgroup_t = 0x00002000; +pub const ATTR_VOL_MOUNTFLAGS: attrgroup_t = 0x00004000; +pub const ATTR_VOL_MOUNTEDDEVICE: attrgroup_t = 0x00008000; +pub const ATTR_VOL_ENCODINGSUSED: attrgroup_t = 0x00010000; +pub const ATTR_VOL_CAPABILITIES: attrgroup_t = 0x00020000; +pub const ATTR_VOL_UUID: attrgroup_t = 0x00040000; +pub const ATTR_VOL_SPACEUSED: attrgroup_t = 0x00800000; +pub const ATTR_VOL_QUOTA_SIZE: attrgroup_t = 0x10000000; +pub const ATTR_VOL_RESERVED_SIZE: attrgroup_t = 0x20000000; +pub const ATTR_VOL_ATTRIBUTES: attrgroup_t = 0x40000000; +pub const ATTR_VOL_INFO: attrgroup_t = 0x80000000; +pub const ATTR_DIR_LINKCOUNT: attrgroup_t = 0x00000001; +pub const ATTR_DIR_ENTRYCOUNT: attrgroup_t = 0x00000002; +pub const ATTR_DIR_MOUNTSTATUS: attrgroup_t = 0x00000004; +pub const ATTR_DIR_ALLOCSIZE: attrgroup_t = 0x00000008; +pub const ATTR_DIR_IOBLOCKSIZE: attrgroup_t = 0x00000010; +pub const ATTR_DIR_DATALENGTH: attrgroup_t = 0x00000020; +pub const ATTR_FILE_LINKCOUNT: attrgroup_t = 0x00000001; +pub const ATTR_FILE_TOTALSIZE: attrgroup_t = 0x00000002; +pub const ATTR_FILE_ALLOCSIZE: attrgroup_t = 0x00000004; +pub const ATTR_FILE_IOBLOCKSIZE: attrgroup_t = 0x00000008; +pub const ATTR_FILE_DEVTYPE: attrgroup_t = 0x00000020; +pub const ATTR_FILE_FORKCOUNT: attrgroup_t = 0x00000080; +pub const ATTR_FILE_FORKLIST: attrgroup_t = 0x00000100; +pub const ATTR_FILE_DATALENGTH: attrgroup_t = 0x00000200; +pub const ATTR_FILE_DATAALLOCSIZE: attrgroup_t = 0x00000400; +pub const ATTR_FILE_RSRCLENGTH: attrgroup_t = 0x00001000; +pub const ATTR_FILE_RSRCALLOCSIZE: attrgroup_t = 0x00002000; +pub const ATTR_CMNEXT_RELPATH: attrgroup_t = 0x00000004; +pub const ATTR_CMNEXT_PRIVATESIZE: attrgroup_t = 0x00000008; +pub const ATTR_CMNEXT_LINKID: attrgroup_t = 0x00000010; +pub const ATTR_CMNEXT_NOFIRMLINKPATH: attrgroup_t = 0x00000020; +pub const ATTR_CMNEXT_REALDEVID: attrgroup_t = 0x00000040; +pub const ATTR_CMNEXT_REALFSID: attrgroup_t = 0x00000080; +pub const ATTR_CMNEXT_CLONEID: attrgroup_t = 0x00000100; +pub const ATTR_CMNEXT_EXT_FLAGS: attrgroup_t = 0x00000200; +pub const ATTR_CMNEXT_RECURSIVE_GENCOUNT: attrgroup_t = 0x00000400; +pub const DIR_MNTSTATUS_MNTPOINT: u32 = 0x1; +pub const VOL_CAPABILITIES_FORMAT: usize = 0; +pub const VOL_CAPABILITIES_INTERFACES: usize = 1; +pub const VOL_CAP_FMT_PERSISTENTOBJECTIDS: attrgroup_t = 0x00000001; +pub const VOL_CAP_FMT_SYMBOLICLINKS: attrgroup_t = 0x00000002; +pub const VOL_CAP_FMT_HARDLINKS: attrgroup_t = 0x00000004; +pub const VOL_CAP_FMT_JOURNAL: attrgroup_t = 0x00000008; +pub const VOL_CAP_FMT_JOURNAL_ACTIVE: attrgroup_t = 0x00000010; +pub const VOL_CAP_FMT_NO_ROOT_TIMES: attrgroup_t = 0x00000020; +pub const VOL_CAP_FMT_SPARSE_FILES: attrgroup_t = 0x00000040; +pub const VOL_CAP_FMT_ZERO_RUNS: attrgroup_t = 0x00000080; +pub const VOL_CAP_FMT_CASE_SENSITIVE: attrgroup_t = 0x00000100; +pub const VOL_CAP_FMT_CASE_PRESERVING: attrgroup_t = 0x00000200; +pub const VOL_CAP_FMT_FAST_STATFS: attrgroup_t = 0x00000400; +pub const VOL_CAP_FMT_2TB_FILESIZE: attrgroup_t = 0x00000800; +pub const VOL_CAP_FMT_OPENDENYMODES: attrgroup_t = 0x00001000; +pub const VOL_CAP_FMT_HIDDEN_FILES: attrgroup_t = 0x00002000; +pub const VOL_CAP_FMT_PATH_FROM_ID: attrgroup_t = 0x00004000; +pub const VOL_CAP_FMT_NO_VOLUME_SIZES: attrgroup_t = 0x00008000; +pub const VOL_CAP_FMT_DECMPFS_COMPRESSION: attrgroup_t = 0x00010000; +pub const VOL_CAP_FMT_64BIT_OBJECT_IDS: attrgroup_t = 0x00020000; +pub const VOL_CAP_FMT_DIR_HARDLINKS: attrgroup_t = 0x00040000; +pub const VOL_CAP_FMT_DOCUMENT_ID: attrgroup_t = 0x00080000; +pub const VOL_CAP_FMT_WRITE_GENERATION_COUNT: attrgroup_t = 0x00100000; +pub const VOL_CAP_FMT_NO_IMMUTABLE_FILES: attrgroup_t = 0x00200000; +pub const VOL_CAP_FMT_NO_PERMISSIONS: attrgroup_t = 0x00400000; +pub const VOL_CAP_FMT_SHARED_SPACE: attrgroup_t = 0x00800000; +pub const VOL_CAP_FMT_VOL_GROUPS: attrgroup_t = 0x01000000; +pub const VOL_CAP_FMT_SEALED: attrgroup_t = 0x02000000; +pub const VOL_CAP_INT_SEARCHFS: attrgroup_t = 0x00000001; +pub const VOL_CAP_INT_ATTRLIST: attrgroup_t = 0x00000002; +pub const VOL_CAP_INT_NFSEXPORT: attrgroup_t = 0x00000004; +pub const VOL_CAP_INT_READDIRATTR: attrgroup_t = 0x00000008; +pub const VOL_CAP_INT_EXCHANGEDATA: attrgroup_t = 0x00000010; +pub const VOL_CAP_INT_COPYFILE: attrgroup_t = 0x00000020; +pub const VOL_CAP_INT_ALLOCATE: attrgroup_t = 0x00000040; +pub const VOL_CAP_INT_VOL_RENAME: attrgroup_t = 0x00000080; +pub const VOL_CAP_INT_ADVLOCK: attrgroup_t = 0x00000100; +pub const VOL_CAP_INT_FLOCK: attrgroup_t = 0x00000200; +pub const VOL_CAP_INT_EXTENDED_SECURITY: attrgroup_t = 0x00000400; +pub const VOL_CAP_INT_USERACCESS: attrgroup_t = 0x00000800; +pub const VOL_CAP_INT_MANLOCK: attrgroup_t = 0x00001000; +pub const VOL_CAP_INT_NAMEDSTREAMS: attrgroup_t = 0x00002000; +pub const VOL_CAP_INT_EXTENDED_ATTR: attrgroup_t = 0x00004000; +pub const VOL_CAP_INT_CLONE: attrgroup_t = 0x00010000; +pub const VOL_CAP_INT_SNAPSHOT: attrgroup_t = 0x00020000; +pub const VOL_CAP_INT_RENAME_SWAP: attrgroup_t = 0x00040000; +pub const VOL_CAP_INT_RENAME_EXCL: attrgroup_t = 0x00080000; +pub const VOL_CAP_INT_RENAME_OPENFAIL: attrgroup_t = 0x00100000; + +// +/// Process being created by fork. +pub const SIDL: u32 = 1; +/// Currently runnable. +pub const SRUN: u32 = 2; +/// Sleeping on an address. +pub const SSLEEP: u32 = 3; +/// Process debugging or suspension. +pub const SSTOP: u32 = 4; +/// Awaiting collection by parent. +pub const SZOMB: u32 = 5; + +// sys/vsock.h +pub const VMADDR_CID_ANY: ::c_uint = 0xFFFFFFFF; +pub const VMADDR_CID_HYPERVISOR: ::c_uint = 0; +pub const VMADDR_CID_RESERVED: ::c_uint = 1; +pub const VMADDR_CID_HOST: ::c_uint = 2; +pub const VMADDR_PORT_ANY: ::c_uint = 0xFFFFFFFF; + +cfg_if! { + if #[cfg(libc_const_extern_fn)] { + const fn __DARWIN_ALIGN32(p: usize) -> usize { + const __DARWIN_ALIGNBYTES32: usize = ::mem::size_of::() - 1; + p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32 + } + } else if #[cfg(libc_const_size_of)] { + fn __DARWIN_ALIGN32(p: usize) -> usize { + const __DARWIN_ALIGNBYTES32: usize = ::mem::size_of::() - 1; + p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32 + } + } else { + fn __DARWIN_ALIGN32(p: usize) -> usize { + let __DARWIN_ALIGNBYTES32: usize = ::mem::size_of::() - 1; + p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32 + } + } +} + +cfg_if! { + if #[cfg(libc_const_size_of)] { + pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_TIME_CONSTRAINT_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / + ::mem::size_of::()) as mach_msg_type_number_t; + pub const THREAD_PRECEDENCE_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_AFFINITY_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_BACKGROUND_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_LATENCY_QOS_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_THROUGHPUT_QOS_POLICY_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / + ::mem::size_of::()) as mach_msg_type_number_t; + pub const THREAD_BASIC_INFO_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_IDENTIFIER_INFO_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + pub const THREAD_EXTENDED_INFO_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + + pub const TASK_THREAD_TIMES_INFO_COUNT: u32 = + (::mem::size_of::() + / ::mem::size_of::()) as u32; + pub const MACH_TASK_BASIC_INFO_COUNT: u32 = (::mem::size_of::() + / ::mem::size_of::()) as u32; + pub const HOST_VM_INFO64_COUNT: mach_msg_type_number_t = + (::mem::size_of::() / ::mem::size_of::()) + as mach_msg_type_number_t; + } else { + pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_TIME_CONSTRAINT_POLICY_COUNT: mach_msg_type_number_t = 4; + pub const THREAD_PRECEDENCE_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_AFFINITY_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_BACKGROUND_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_LATENCY_QOS_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_THROUGHPUT_QOS_POLICY_COUNT: mach_msg_type_number_t = 1; + pub const THREAD_BASIC_INFO_COUNT: mach_msg_type_number_t = 10; + pub const THREAD_IDENTIFIER_INFO_COUNT: mach_msg_type_number_t = 6; + pub const THREAD_EXTENDED_INFO_COUNT: mach_msg_type_number_t = 28; + pub const TASK_THREAD_TIMES_INFO_COUNT: u32 = 4; + pub const MACH_TASK_BASIC_INFO_COUNT: u32 = 12; + pub const HOST_VM_INFO64_COUNT: mach_msg_type_number_t = 38; + } +} + +f! { + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, + cmsg: *const ::cmsghdr) -> *mut ::cmsghdr { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let cmsg_len = (*cmsg).cmsg_len as usize; + let next = cmsg as usize + __DARWIN_ALIGN32(cmsg_len as usize); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next + __DARWIN_ALIGN32(::mem::size_of::<::cmsghdr>()) > max { + 0 as *mut ::cmsghdr + } else { + next as *mut ::cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(__DARWIN_ALIGN32(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (__DARWIN_ALIGN32(::mem::size_of::<::cmsghdr>()) + + __DARWIN_ALIGN32(length as usize)) + as ::c_uint + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + (__DARWIN_ALIGN32(::mem::size_of::<::cmsghdr>()) + length as usize) + as ::c_uint + } + + pub {const} fn VM_MAKE_TAG(id: u8) -> u32 { + (id as u32) << 24u32 + } + + pub fn major(dev: dev_t) -> i32 { + (dev >> 24) & 0xff + } + + pub fn minor(dev: dev_t) -> i32 { + dev & 0xffffff + } + + pub fn makedev(major: i32, minor: i32) -> dev_t { + (major << 24) | minor + } +} + +safe_f! { + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub {const} fn _WSTATUS(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) == 0x13 + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0 + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) != 0x13 + } +} + +extern "C" { + pub fn setgrent(); + #[doc(hidden)] + #[deprecated(since = "0.2.49", note = "Deprecated in MacOSX 10.5")] + #[cfg_attr(not(target_arch = "aarch64"), link_name = "daemon$1050")] + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + #[doc(hidden)] + #[deprecated(since = "0.2.49", note = "Deprecated in MacOSX 10.10")] + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + #[doc(hidden)] + #[deprecated(since = "0.2.49", note = "Deprecated in MacOSX 10.10")] + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "aio_suspend$UNIX2003" + )] + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn chflags(path: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn fchflags(fd: ::c_int, flags: ::c_uint) -> ::c_int; + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "confstr$UNIX2003" + )] + pub fn confstr(name: ::c_int, buf: *mut ::c_char, len: ::size_t) -> ::size_t; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + + pub fn asctime(tm: *const ::tm) -> *mut ::c_char; + pub fn ctime(clock: *const time_t) -> *mut ::c_char; + pub fn getdate(datestr: *const ::c_char) -> *mut ::tm; + pub fn strftime( + buf: *mut ::c_char, + maxsize: ::size_t, + format: *const ::c_char, + timeptr: *const ::tm, + ) -> ::size_t; + pub fn strptime( + buf: *const ::c_char, + format: *const ::c_char, + timeptr: *mut ::tm, + ) -> *mut ::c_char; + pub fn asctime_r(tm: *const ::tm, result: *mut ::c_char) -> *mut ::c_char; + pub fn ctime_r(clock: *const time_t, result: *mut ::c_char) -> *mut ::c_char; + + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn mincore(addr: *const ::c_void, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + pub fn sysctlnametomib( + name: *const ::c_char, + mibp: *mut ::c_int, + sizep: *mut ::size_t, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "mprotect$UNIX2003" + )] + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn semget(key: key_t, nsems: ::c_int, semflg: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "semctl$UNIX2003" + )] + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut sembuf, nsops: ::size_t) -> ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn ftok(pathname: *const c_char, proj_id: ::c_int) -> key_t; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "shmctl$UNIX2003" + )] + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn shmget(key: key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn sysctlbyname( + name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + pub fn mach_absolute_time() -> u64; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + #[allow(deprecated)] + pub fn mach_timebase_info(info: *mut ::mach_timebase_info) -> ::c_int; + pub fn mach_host_self() -> mach_port_t; + pub fn mach_thread_self() -> mach_port_t; + pub fn pthread_setname_np(name: *const ::c_char) -> ::c_int; + pub fn pthread_getname_np(thread: ::pthread_t, name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_mach_thread_np(thread: ::pthread_t) -> ::mach_port_t; + pub fn pthread_from_mach_thread_np(port: ::mach_port_t) -> ::pthread_t; + pub fn pthread_create_from_mach_thread( + thread: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_stack_frame_decode_np( + frame_addr: ::uintptr_t, + return_addr: *mut ::uintptr_t, + ) -> ::uintptr_t; + pub fn pthread_get_stackaddr_np(thread: ::pthread_t) -> *mut ::c_void; + pub fn pthread_get_stacksize_np(thread: ::pthread_t) -> ::size_t; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_main_np() -> ::c_int; + pub fn pthread_mutexattr_setpshared( + attr: *mut pthread_mutexattr_t, + pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_getpshared( + attr: *const pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; + pub fn pthread_threadid_np(thread: ::pthread_t, thread_id: *mut u64) -> ::c_int; + pub fn pthread_attr_set_qos_class_np( + attr: *mut pthread_attr_t, + class: qos_class_t, + priority: ::c_int, + ) -> ::c_int; + pub fn pthread_attr_get_qos_class_np( + attr: *mut pthread_attr_t, + class: *mut qos_class_t, + priority: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_set_qos_class_self_np(class: qos_class_t, priority: ::c_int) -> ::c_int; + pub fn pthread_get_qos_class_np( + thread: ::pthread_t, + class: *mut qos_class_t, + priority: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_attr_getschedparam( + attr: *const ::pthread_attr_t, + param: *mut sched_param, + ) -> ::c_int; + pub fn pthread_attr_setschedparam( + attr: *mut ::pthread_attr_t, + param: *const sched_param, + ) -> ::c_int; + pub fn pthread_getschedparam( + thread: ::pthread_t, + policy: *mut ::c_int, + param: *mut sched_param, + ) -> ::c_int; + pub fn pthread_setschedparam( + thread: ::pthread_t, + policy: ::c_int, + param: *const sched_param, + ) -> ::c_int; + + // Available from Big Sur + pub fn pthread_introspection_hook_install( + hook: ::pthread_introspection_hook_t, + ) -> ::pthread_introspection_hook_t; + pub fn pthread_introspection_setspecific_np( + thread: ::pthread_t, + key: ::pthread_key_t, + value: *const ::c_void, + ) -> ::c_int; + pub fn pthread_introspection_getspecific_np( + thread: ::pthread_t, + key: ::pthread_key_t, + ) -> *mut ::c_void; + pub fn pthread_jit_write_protect_np(enabled: ::c_int); + pub fn pthread_jit_write_protect_supported_np() -> ::c_int; + // An array of pthread_jit_write_with_callback_np must declare + // the list of callbacks e.g. + // #[link_section = "__DATA_CONST,__pth_jit_func"] + // static callbacks: [libc::pthread_jit_write_callback_t; 2] = [native_jit_write_cb, + // std::mem::transmute::(std::ptr::null())]; + // (a handy PTHREAD_JIT_WRITE_CALLBACK_NP macro for other languages). + pub fn pthread_jit_write_with_callback_np( + callback: ::pthread_jit_write_callback_t, + ctx: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_jit_write_freeze_callbacks_np(); + pub fn pthread_cpu_number_np(cpu_number_out: *mut ::size_t) -> ::c_int; + + pub fn os_unfair_lock_lock(lock: os_unfair_lock_t); + pub fn os_unfair_lock_trylock(lock: os_unfair_lock_t) -> bool; + pub fn os_unfair_lock_unlock(lock: os_unfair_lock_t); + pub fn os_unfair_lock_assert_owner(lock: os_unfair_lock_t); + pub fn os_unfair_lock_assert_not_owner(lock: os_unfair_lock_t); + + pub fn os_log_create(subsystem: *const ::c_char, category: *const ::c_char) -> ::os_log_t; + pub fn os_log_type_enabled(oslog: ::os_log_t, tpe: ::os_log_type_t) -> bool; + pub fn os_signpost_id_make_with_pointer( + log: ::os_log_t, + ptr: *const ::c_void, + ) -> ::os_signpost_id_t; + pub fn os_signpost_id_generate(log: ::os_log_t) -> ::os_signpost_id_t; + pub fn os_signpost_enabled(log: ::os_log_t) -> bool; + + pub fn thread_policy_set( + thread: thread_t, + flavor: thread_policy_flavor_t, + policy_info: thread_policy_t, + count: mach_msg_type_number_t, + ) -> kern_return_t; + pub fn thread_policy_get( + thread: thread_t, + flavor: thread_policy_flavor_t, + policy_info: thread_policy_t, + count: *mut mach_msg_type_number_t, + get_default: *mut boolean_t, + ) -> kern_return_t; + pub fn thread_info( + target_act: thread_inspect_t, + flavor: thread_flavor_t, + thread_info_out: thread_info_t, + thread_info_outCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + #[cfg_attr(doc, doc(alias = "__errno_location"))] + #[cfg_attr(doc, doc(alias = "errno"))] + pub fn __error() -> *mut ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; + pub fn backtrace_symbols(addrs: *const *mut ::c_void, sz: ::c_int) -> *mut *mut ::c_char; + pub fn backtrace_symbols_fd(addrs: *const *mut ::c_void, sz: ::c_int, fd: ::c_int); + pub fn backtrace_from_fp( + startfp: *mut ::c_void, + array: *mut *mut ::c_void, + size: ::c_int, + ) -> ::c_int; + pub fn backtrace_image_offsets( + array: *const *mut ::c_void, + image_offsets: *mut image_offset, + size: ::c_int, + ); + pub fn backtrace_async( + array: *mut *mut ::c_void, + length: ::size_t, + task_id: *mut u32, + ) -> ::size_t; + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "statfs$INODE64" + )] + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "fstatfs$INODE64" + )] + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn kevent( + kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn kevent64( + kq: ::c_int, + changelist: *const ::kevent64_s, + nchanges: ::c_int, + eventlist: *mut ::kevent64_s, + nevents: ::c_int, + flags: ::c_uint, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn mount( + src: *const ::c_char, + target: *const ::c_char, + flags: ::c_int, + data: *mut ::c_void, + ) -> ::c_int; + pub fn fmount( + src: *const ::c_char, + fd: ::c_int, + flags: ::c_int, + data: *mut ::c_void, + ) -> ::c_int; + pub fn ptrace(request: ::c_int, pid: ::pid_t, addr: *mut ::c_char, data: ::c_int) -> ::c_int; + pub fn quotactl( + special: *const ::c_char, + cmd: ::c_int, + id: ::c_int, + data: *mut ::c_char, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn sendfile( + fd: ::c_int, + s: ::c_int, + offset: ::off_t, + len: *mut ::off_t, + hdtr: *mut ::sf_hdtr, + flags: ::c_int, + ) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + pub fn login_tty(fd: ::c_int) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t) -> ::c_int; + pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + pub fn getdomainname(name: *mut ::c_char, len: ::c_int) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn getxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *mut ::c_void, + size: ::size_t, + position: u32, + flags: ::c_int, + ) -> ::ssize_t; + pub fn fgetxattr( + filedes: ::c_int, + name: *const ::c_char, + value: *mut ::c_void, + size: ::size_t, + position: u32, + flags: ::c_int, + ) -> ::ssize_t; + pub fn setxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *const ::c_void, + size: ::size_t, + position: u32, + flags: ::c_int, + ) -> ::c_int; + pub fn fsetxattr( + filedes: ::c_int, + name: *const ::c_char, + value: *const ::c_void, + size: ::size_t, + position: u32, + flags: ::c_int, + ) -> ::c_int; + pub fn listxattr( + path: *const ::c_char, + list: *mut ::c_char, + size: ::size_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn flistxattr( + filedes: ::c_int, + list: *mut ::c_char, + size: ::size_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn removexattr(path: *const ::c_char, name: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn renamex_np(from: *const ::c_char, to: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn renameatx_np( + fromfd: ::c_int, + from: *const ::c_char, + tofd: ::c_int, + to: *const ::c_char, + flags: ::c_uint, + ) -> ::c_int; + pub fn fremovexattr(filedes: ::c_int, name: *const ::c_char, flags: ::c_int) -> ::c_int; + + pub fn getgrouplist( + name: *const ::c_char, + basegid: ::c_int, + groups: *mut ::c_int, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn initgroups(user: *const ::c_char, basegroup: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "waitid$UNIX2003" + )] + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + pub fn brk(addr: *const ::c_void) -> *mut ::c_void; + pub fn sbrk(increment: ::c_int) -> *mut ::c_void; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + pub fn _dyld_image_count() -> u32; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + #[allow(deprecated)] + pub fn _dyld_get_image_header(image_index: u32) -> *const mach_header; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + pub fn _dyld_get_image_vmaddr_slide(image_index: u32) -> ::intptr_t; + #[deprecated(since = "0.2.55", note = "Use the `mach2` crate instead")] + pub fn _dyld_get_image_name(image_index: u32) -> *const ::c_char; + + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_setarchpref_np( + attr: *mut posix_spawnattr_t, + count: ::size_t, + pref: *mut ::cpu_type_t, + subpref: *mut ::cpu_subtype_t, + ocount: *mut ::size_t, + ) -> ::c_int; + pub fn posix_spawnattr_getarchpref_np( + attr: *const posix_spawnattr_t, + count: ::size_t, + pref: *mut ::cpu_type_t, + subpref: *mut ::cpu_subtype_t, + ocount: *mut ::size_t, + ) -> ::c_int; + pub fn posix_spawnattr_set_qos_class_np( + attr: *mut posix_spawnattr_t, + qos_class: ::qos_class_t, + ) -> ::c_int; + pub fn posix_spawnattr_get_qos_class_np( + attr: *const posix_spawnattr_t, + qos_class: *mut ::qos_class_t, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + + pub fn connectx( + socket: ::c_int, + endpoints: *const sa_endpoints_t, + associd: sae_associd_t, + flags: ::c_uint, + iov: *const ::iovec, + iovcnt: ::c_uint, + len: *mut ::size_t, + connid: *mut sae_connid_t, + ) -> ::c_int; + pub fn disconnectx(socket: ::c_int, associd: sae_associd_t, connid: sae_connid_t) -> ::c_int; + + pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; + pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "getmntinfo$INODE64" + )] + pub fn getmntinfo(mntbufp: *mut *mut statfs, flags: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "getfsstat$INODE64" + )] + pub fn getfsstat(mntbufp: *mut statfs, bufsize: ::c_int, flags: ::c_int) -> ::c_int; + + // Copy-on-write functions. + // According to the man page `flags` is an `int` but in the header + // this is a `uint32_t`. + pub fn clonefile(src: *const ::c_char, dst: *const ::c_char, flags: u32) -> ::c_int; + pub fn clonefileat( + src_dirfd: ::c_int, + src: *const ::c_char, + dst_dirfd: ::c_int, + dst: *const ::c_char, + flags: u32, + ) -> ::c_int; + pub fn fclonefileat( + srcfd: ::c_int, + dst_dirfd: ::c_int, + dst: *const ::c_char, + flags: u32, + ) -> ::c_int; + + pub fn copyfile( + from: *const ::c_char, + to: *const ::c_char, + state: copyfile_state_t, + flags: copyfile_flags_t, + ) -> ::c_int; + pub fn fcopyfile( + from: ::c_int, + to: ::c_int, + state: copyfile_state_t, + flags: copyfile_flags_t, + ) -> ::c_int; + + // Added in macOS 10.13 + // ISO/IEC 9899:2011 ("ISO C11") K.3.7.4.1 + pub fn memset_s(s: *mut ::c_void, smax: ::size_t, c: ::c_int, n: ::size_t) -> ::c_int; + // Added in macOS 10.5 + pub fn memset_pattern4(b: *mut ::c_void, pattern4: *const ::c_void, len: ::size_t); + pub fn memset_pattern8(b: *mut ::c_void, pattern8: *const ::c_void, len: ::size_t); + pub fn memset_pattern16(b: *mut ::c_void, pattern16: *const ::c_void, len: ::size_t); + + // Inherited from BSD but available from Big Sur only + pub fn strtonum( + __numstr: *const ::c_char, + __minval: ::c_longlong, + __maxval: ::c_longlong, + errstrp: *mut *const ::c_char, + ) -> ::c_longlong; + + pub fn mstats() -> mstats; + pub fn malloc_printf(format: *const ::c_char, ...); + pub fn malloc_zone_check(zone: *mut ::malloc_zone_t) -> ::boolean_t; + pub fn malloc_zone_print(zone: *mut ::malloc_zone_t, verbose: ::boolean_t); + pub fn malloc_zone_statistics(zone: *mut ::malloc_zone_t, stats: *mut malloc_statistics_t); + pub fn malloc_zone_log(zone: *mut ::malloc_zone_t, address: *mut ::c_void); + pub fn malloc_zone_print_ptr_info(ptr: *mut ::c_void); + pub fn malloc_default_zone() -> *mut ::malloc_zone_t; + pub fn malloc_zone_from_ptr(ptr: *const ::c_void) -> *mut ::malloc_zone_t; + pub fn malloc_zone_malloc(zone: *mut ::malloc_zone_t, size: ::size_t) -> *mut ::c_void; + pub fn malloc_zone_valloc(zone: *mut ::malloc_zone_t, size: ::size_t) -> *mut ::c_void; + pub fn malloc_zone_calloc( + zone: *mut ::malloc_zone_t, + num_items: ::size_t, + size: ::size_t, + ) -> *mut ::c_void; + pub fn malloc_zone_realloc( + zone: *mut ::malloc_zone_t, + ptr: *mut ::c_void, + size: ::size_t, + ) -> *mut ::c_void; + pub fn malloc_zone_free(zone: *mut ::malloc_zone_t, ptr: *mut ::c_void); + + pub fn proc_listpids( + t: u32, + typeinfo: u32, + buffer: *mut ::c_void, + buffersize: ::c_int, + ) -> ::c_int; + pub fn proc_listallpids(buffer: *mut ::c_void, buffersize: ::c_int) -> ::c_int; + pub fn proc_listpgrppids( + pgrpid: ::pid_t, + buffer: *mut ::c_void, + buffersize: ::c_int, + ) -> ::c_int; + pub fn proc_listchildpids(ppid: ::pid_t, buffer: *mut ::c_void, buffersize: ::c_int) + -> ::c_int; + pub fn proc_pidinfo( + pid: ::c_int, + flavor: ::c_int, + arg: u64, + buffer: *mut ::c_void, + buffersize: ::c_int, + ) -> ::c_int; + pub fn proc_pidfdinfo( + pid: ::c_int, + fd: ::c_int, + flavor: ::c_int, + buffer: *mut ::c_void, + buffersize: ::c_int, + ) -> ::c_int; + pub fn proc_pidfileportinfo( + pid: ::c_int, + fileport: u32, + flavor: ::c_int, + buffer: *mut ::c_void, + buffersize: ::c_int, + ) -> ::c_int; + pub fn proc_pidpath(pid: ::c_int, buffer: *mut ::c_void, buffersize: u32) -> ::c_int; + pub fn proc_name(pid: ::c_int, buffer: *mut ::c_void, buffersize: u32) -> ::c_int; + pub fn proc_regionfilename( + pid: ::c_int, + address: u64, + buffer: *mut ::c_void, + buffersize: u32, + ) -> ::c_int; + pub fn proc_kmsgbuf(buffer: *mut ::c_void, buffersize: u32) -> ::c_int; + pub fn proc_libversion(major: *mut ::c_int, mintor: *mut ::c_int) -> ::c_int; + pub fn proc_pid_rusage(pid: ::c_int, flavor: ::c_int, buffer: *mut rusage_info_t) -> ::c_int; + + // Available from Big Sur + pub fn proc_set_no_smt() -> ::c_int; + pub fn proc_setthread_no_smt() -> ::c_int; + pub fn proc_set_csm(flags: u32) -> ::c_int; + pub fn proc_setthread_csm(flags: u32) -> ::c_int; + /// # Notes + /// + /// `id` is of type [`uuid_t`]. + pub fn gethostuuid(id: *mut u8, timeout: *const ::timespec) -> ::c_int; + + pub fn gethostid() -> ::c_long; + pub fn sethostid(hostid: ::c_long); + + pub fn CCRandomGenerateBytes(bytes: *mut ::c_void, size: ::size_t) -> ::CCRNGStatus; + + pub fn _NSGetExecutablePath(buf: *mut ::c_char, bufsize: *mut u32) -> ::c_int; + pub fn _NSGetEnviron() -> *mut *mut *mut ::c_char; + + pub fn mach_vm_map( + target_task: ::vm_map_t, + address: *mut ::mach_vm_address_t, + size: ::mach_vm_size_t, + mask: ::mach_vm_offset_t, + flags: ::c_int, + object: ::mem_entry_name_port_t, + offset: ::memory_object_offset_t, + copy: ::boolean_t, + cur_protection: ::vm_prot_t, + max_protection: ::vm_prot_t, + inheritance: ::vm_inherit_t, + ) -> ::kern_return_t; + + pub fn vm_deallocate( + target_task: vm_map_t, + address: vm_address_t, + size: vm_size_t, + ) -> ::kern_return_t; + + pub fn host_statistics64( + host_priv: host_t, + flavor: host_flavor_t, + host_info64_out: host_info64_t, + host_info64_outCnt: *mut mach_msg_type_number_t, + ) -> ::kern_return_t; + pub fn host_processor_info( + host: host_t, + flavor: processor_flavor_t, + out_processor_count: *mut natural_t, + out_processor_info: *mut processor_info_array_t, + out_processor_infoCnt: *mut mach_msg_type_number_t, + ) -> ::kern_return_t; + + pub static mut mach_task_self_: ::mach_port_t; + pub fn task_for_pid( + host: ::mach_port_t, + pid: ::pid_t, + task: *mut ::mach_port_t, + ) -> ::kern_return_t; + pub fn task_info( + host: ::mach_port_t, + flavor: task_flavor_t, + task_info_out: task_info_t, + task_info_count: *mut mach_msg_type_number_t, + ) -> ::kern_return_t; + pub fn task_create( + target_task: ::task_t, + ledgers: ::ledger_array_t, + ledgersCnt: ::mach_msg_type_number_t, + inherit_memory: ::boolean_t, + child_task: *mut ::task_t, + ) -> ::kern_return_t; + pub fn task_terminate(target_task: ::task_t) -> ::kern_return_t; + pub fn task_threads( + target_task: ::task_inspect_t, + act_list: *mut ::thread_act_array_t, + act_listCnt: *mut ::mach_msg_type_number_t, + ) -> ::kern_return_t; + pub fn host_statistics( + host_priv: host_t, + flavor: host_flavor_t, + host_info_out: host_info_t, + host_info_outCnt: *mut mach_msg_type_number_t, + ) -> ::kern_return_t; + + // sysdir.h + pub fn sysdir_start_search_path_enumeration( + dir: sysdir_search_path_directory_t, + domainMask: sysdir_search_path_domain_mask_t, + ) -> ::sysdir_search_path_enumeration_state; + pub fn sysdir_get_next_search_path_enumeration( + state: ::sysdir_search_path_enumeration_state, + path: *mut ::c_char, + ) -> ::sysdir_search_path_enumeration_state; + + pub static vm_page_size: vm_size_t; + + pub fn getattrlist( + path: *const ::c_char, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u32, + ) -> ::c_int; + pub fn fgetattrlist( + fd: ::c_int, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u32, + ) -> ::c_int; + pub fn getattrlistat( + fd: ::c_int, + path: *const ::c_char, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: ::c_ulong, + ) -> ::c_int; + pub fn setattrlist( + path: *const ::c_char, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u32, + ) -> ::c_int; + pub fn fsetattrlist( + fd: ::c_int, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u32, + ) -> ::c_int; + pub fn setattrlistat( + dir_fd: ::c_int, + path: *const ::c_char, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u32, + ) -> ::c_int; + pub fn getattrlistbulk( + dirfd: ::c_int, + attrList: *mut ::c_void, + attrBuf: *mut ::c_void, + attrBufSize: ::size_t, + options: u64, + ) -> ::c_int; + + pub fn malloc_size(ptr: *const ::c_void) -> ::size_t; + pub fn malloc_good_size(size: ::size_t) -> ::size_t; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +pub unsafe fn mach_task_self() -> ::mach_port_t { + mach_task_self_ +} + +cfg_if! { + if #[cfg(target_os = "macos")] { + extern "C" { + pub fn clock_settime(clock_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + } + } +} +cfg_if! { + if #[cfg(any(target_os = "macos", target_os = "ios"))] { + extern "C" { + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + pub fn task_set_info(target_task: ::task_t, + flavor: ::task_flavor_t, + task_info_in: ::task_info_t, + task_info_inCnt: ::mach_msg_type_number_t + ) -> ::kern_return_t; + } + } +} + +// These require a dependency on `libiconv`, and including this when built as +// part of `std` means every Rust program gets it. Ideally we would have a link +// modifier to only include these if they are used, but we do not. +#[cfg_attr(not(feature = "rustc-dep-of-std"), link(name = "iconv"))] +extern "C" { + pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + mod b32; + pub use self::b32::*; + } else if #[cfg(target_pointer_width = "64")] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_arch + } +} + +cfg_if! { + if #[cfg(libc_long_array)] { + mod long_array; + pub use self::long_array::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/errno.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/errno.rs new file mode 100644 index 0000000..5fe6bb8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/errno.rs @@ -0,0 +1,13 @@ +// DragonFlyBSD's __error function is declared with "static inline", so it must +// be implemented in the libc crate, as a pointer to a static thread_local. +f! { + #[deprecated(since = "0.2.77", note = "Use `__errno_location()` instead")] + pub fn __error() -> *mut ::c_int { + &mut errno + } +} + +extern "C" { + #[thread_local] + pub static mut errno: ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs new file mode 100644 index 0000000..b3a5be4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs @@ -0,0 +1,1726 @@ +pub type dev_t = u32; +pub type c_char = i8; +pub type wchar_t = i32; +pub type clock_t = u64; +pub type ino_t = u64; +pub type lwpid_t = i32; +pub type nlink_t = u32; +pub type blksize_t = i64; +pub type clockid_t = ::c_ulong; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; +pub type suseconds_t = i64; + +pub type uuid_t = ::uuid; + +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type idtype_t = ::c_uint; +pub type shmatt_t = ::c_uint; + +pub type mqd_t = ::c_int; +pub type sem_t = *mut sem; + +pub type cpuset_t = cpumask_t; +pub type cpu_set_t = cpumask_t; + +pub type register_t = ::c_long; +pub type umtx_t = ::c_int; +pub type pthread_barrierattr_t = ::c_int; +pub type pthread_barrier_t = ::uintptr_t; +pub type pthread_spinlock_t = ::uintptr_t; + +pub type segsz_t = usize; + +pub type vm_prot_t = u8; +pub type vm_maptype_t = u8; +pub type vm_inherit_t = i8; +pub type vm_subsys_t = ::c_int; +pub type vm_eflags_t = ::c_uint; + +pub type vm_map_t = *mut __c_anonymous_vm_map; +pub type vm_map_entry_t = *mut vm_map_entry; + +pub type pmap = __c_anonymous_pmap; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum sem {} +impl ::Copy for sem {} +impl ::Clone for sem { + fn clone(&self) -> sem { + *self + } +} + +e! { + #[repr(u32)] + pub enum lwpstat { + LSRUN = 1, + LSSTOP = 2, + LSSLEEP = 3, + } + + #[repr(u32)] + pub enum procstat { + SIDL = 1, + SACTIVE = 2, + SSTOP = 3, + SZOMB = 4, + SCORE = 5, + } +} + +s! { + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: ::intptr_t, + pub udata: *mut ::c_void, + } + + pub struct exit_status { + pub e_termination: u16, + pub e_exit: u16 + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: sigevent, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + _aio_val: ::c_int, + _aio_err: ::c_int + } + + pub struct uuid { + pub time_low: u32, + pub time_mid: u16, + pub time_hi_and_version: u16, + pub clock_seq_hi_and_reserved: u8, + pub clock_seq_low: u8, + pub node: [u8; 6], + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_owner: ::uid_t, + pub f_type: ::c_uint, + pub f_syncreads: u64, + pub f_syncwrites: u64, + pub f_asyncreads: u64, + pub f_asyncwrites: u64, + pub f_fsid_uuid: ::uuid_t, + pub f_uid_uuid: ::uuid_t, + } + + pub struct stat { + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_dev: ::dev_t, + pub st_mode: ::mode_t, + pub st_padding1: u16, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: i64, + pub __old_st_blksize: u32, + pub st_flags: u32, + pub st_gen: u32, + pub st_lspare: i32, + pub st_blksize: i64, + pub st_qspare2: i64, + } + + pub struct if_data { + pub ifi_type: ::c_uchar, + pub ifi_physical: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_recvquota: ::c_uchar, + pub ifi_xmitquota: ::c_uchar, + pub ifi_mtu: ::c_ulong, + pub ifi_metric: ::c_ulong, + pub ifi_link_state: ::c_ulong, + pub ifi_baudrate: u64, + pub ifi_ipackets: ::c_ulong, + pub ifi_ierrors: ::c_ulong, + pub ifi_opackets: ::c_ulong, + pub ifi_oerrors: ::c_ulong, + pub ifi_collisions: ::c_ulong, + pub ifi_ibytes: ::c_ulong, + pub ifi_obytes: ::c_ulong, + pub ifi_imcasts: ::c_ulong, + pub ifi_omcasts: ::c_ulong, + pub ifi_iqdrops: ::c_ulong, + pub ifi_noproto: ::c_ulong, + pub ifi_hwassist: ::c_ulong, + pub ifi_oqdrops: ::c_ulong, + pub ifi_lastchange: ::timeval, + } + + pub struct if_msghdr { + pub ifm_msglen: ::c_ushort, + pub ifm_version: ::c_uchar, + pub ifm_type: ::c_uchar, + pub ifm_addrs: ::c_int, + pub ifm_flags: ::c_int, + pub ifm_index: ::c_ushort, + pub ifm_data: if_data, + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 12], + pub sdl_rcf: ::c_ushort, + pub sdl_route: [::c_ushort; 16], + } + + pub struct xucred { + pub cr_version: ::c_uint, + pub cr_uid: ::uid_t, + pub cr_ngroups: ::c_short, + pub cr_groups: [::gid_t; 16], + __cr_unused1: *mut ::c_void, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct cpumask_t { + ary: [u64; 4], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + shm_internal: *mut ::c_void, + } + + pub struct kinfo_file { + pub f_size: ::size_t, + pub f_pid: ::pid_t, + pub f_uid: ::uid_t, + pub f_fd: ::c_int, + pub f_file: *mut ::c_void, + pub f_type: ::c_short, + pub f_count: ::c_int, + pub f_msgcount: ::c_int, + pub f_offset: ::off_t, + pub f_data: *mut ::c_void, + pub f_flag: ::c_uint, + } + + pub struct kinfo_cputime { + pub cp_user: u64, + pub cp_nice: u64, + pub cp_sys: u64, + pub cp_intr: u64, + pub cp_idel: u64, + cp_unused01: u64, + cp_unused02: u64, + pub cp_sample_pc: u64, + pub cp_sample_sp: u64, + pub cp_msg: [::c_char; 32], + } + + pub struct kinfo_lwp { + pub kl_pid: ::pid_t, + pub kl_tid: ::lwpid_t, + pub kl_flags: ::c_int, + pub kl_stat: ::lwpstat, + pub kl_lock: ::c_int, + pub kl_tdflags: ::c_int, + pub kl_mpcount: ::c_int, + pub kl_prio: ::c_int, + pub kl_tdprio: ::c_int, + pub kl_rtprio: ::rtprio, + pub kl_uticks: u64, + pub kl_sticks: u64, + pub kl_iticks: u64, + pub kl_cpticks: u64, + pub kl_pctcpu: ::c_uint, + pub kl_slptime: ::c_uint, + pub kl_origcpu: ::c_int, + pub kl_estcpu: ::c_int, + pub kl_cpuid: ::c_int, + pub kl_ru: ::rusage, + pub kl_siglist: ::sigset_t, + pub kl_sigmask: ::sigset_t, + pub kl_wchan: ::uintptr_t, + pub kl_wmesg: [::c_char; 9], + pub kl_comm: [::c_char; MAXCOMLEN+1], + } + + pub struct kinfo_proc { + pub kp_paddr: ::uintptr_t, + pub kp_flags: ::c_int, + pub kp_stat: ::procstat, + pub kp_lock: ::c_int, + pub kp_acflag: ::c_int, + pub kp_traceflag: ::c_int, + pub kp_fd: ::uintptr_t, + pub kp_siglist: ::sigset_t, + pub kp_sigignore: ::sigset_t, + pub kp_sigcatch: ::sigset_t, + pub kp_sigflag: ::c_int, + pub kp_start: ::timeval, + pub kp_comm: [::c_char; MAXCOMLEN+1], + pub kp_uid: ::uid_t, + pub kp_ngroups: ::c_short, + pub kp_groups: [::gid_t; NGROUPS], + pub kp_ruid: ::uid_t, + pub kp_svuid: ::uid_t, + pub kp_rgid: ::gid_t, + pub kp_svgid: ::gid_t, + pub kp_pid: ::pid_t, + pub kp_ppid: ::pid_t, + pub kp_pgid: ::pid_t, + pub kp_jobc: ::c_int, + pub kp_sid: ::pid_t, + pub kp_login: [::c_char; 40], // MAXNAMELEN rounded up to the nearest sizeof(long) + pub kp_tdev: ::dev_t, + pub kp_tpgid: ::pid_t, + pub kp_tsid: ::pid_t, + pub kp_exitstat: ::c_ushort, + pub kp_nthreads: ::c_int, + pub kp_nice: ::c_int, + pub kp_swtime: ::c_uint, + pub kp_vm_map_size: ::size_t, + pub kp_vm_rssize: ::segsz_t, + pub kp_vm_swrss: ::segsz_t, + pub kp_vm_tsize: ::segsz_t, + pub kp_vm_dsize: ::segsz_t, + pub kp_vm_ssize: ::segsz_t, + pub kp_vm_prssize: ::c_uint, + pub kp_jailid: ::c_int, + pub kp_ru: ::rusage, + pub kp_cru: ::rusage, + pub kp_auxflags: ::c_int, + pub kp_lwp: ::kinfo_lwp, + pub kp_ktaddr: ::uintptr_t, + kp_spare: [::c_int; 2], + } + + pub struct __c_anonymous_vm_map { + _priv: [::uintptr_t; 36], + } + + pub struct vm_map_entry { + _priv: [::uintptr_t; 15], + pub eflags: ::vm_eflags_t, + pub maptype: ::vm_maptype_t, + pub protection: ::vm_prot_t, + pub max_protection: ::vm_prot_t, + pub inheritance: ::vm_inherit_t, + pub wired_count: ::c_int, + pub id: ::vm_subsys_t, + } + + pub struct __c_anonymous_pmap { + _priv1: [::uintptr_t; 32], + _priv2: [::uintptr_t; 32], + _priv3: [::uintptr_t; 32], + _priv4: [::uintptr_t; 32], + _priv5: [::uintptr_t; 8], + } + + pub struct vmspace { + vm_map: __c_anonymous_vm_map, + vm_pmap: __c_anonymous_pmap, + pub vm_flags: ::c_int, + pub vm_shm: *mut ::c_char, + pub vm_rssize: ::segsz_t, + pub vm_swrss: ::segsz_t, + pub vm_tsize: ::segsz_t, + pub vm_dsize: ::segsz_t, + pub vm_ssize: ::segsz_t, + pub vm_taddr: *mut ::c_char, + pub vm_daddr: *mut ::c_char, + pub vm_maxsaddr: *mut ::c_char, + pub vm_minsaddr: *mut ::c_char, + _unused1: ::c_int, + _unused2: ::c_int, + pub vm_pagesupply: ::c_int, + pub vm_holdcnt: ::c_uint, + pub vm_refcnt: ::c_uint, + } + + pub struct cpuctl_msr_args_t { + pub msr: ::c_int, + pub data: u64, + } + + pub struct cpuctl_cpuid_args_t { + pub level: ::c_int, + pub data: [u32; 4], + } + + pub struct cpuctl_cpuid_count_args_t { + pub level: ::c_int, + pub level_type: ::c_int, + pub data: [u32; 4], + } + + pub struct cpuctl_update_args_t { + pub data: *mut ::c_void, + pub size: ::size_t, + } +} + +s_no_extra_traits! { + pub struct utmpx { + pub ut_name: [::c_char; 32], + pub ut_id: [::c_char; 4], + + pub ut_line: [::c_char; 32], + pub ut_host: [::c_char; 256], + + pub ut_unused: [u8; 16], + pub ut_session: u16, + pub ut_type: u16, + pub ut_pid: ::pid_t, + ut_exit: exit_status, + ut_ss: ::sockaddr_storage, + pub ut_tv: ::timeval, + pub ut_unused2: [u8; 16], + } + + pub struct lastlogx { + pub ll_tv: ::timeval, + pub ll_line: [::c_char; _UTX_LINESIZE], + pub ll_host: [::c_char; _UTX_HOSTSIZE], + pub ll_ss: ::sockaddr_storage, + } + + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_namlen: u16, + pub d_type: u8, + __unused1: u8, + __unused2: u32, + pub d_name: [::c_char; 256], + } + + pub struct statfs { + __spare2: ::c_long, + pub f_bsize: ::c_long, + pub f_iosize: ::c_long, + pub f_blocks: ::c_long, + pub f_bfree: ::c_long, + pub f_bavail: ::c_long, + pub f_files: ::c_long, + pub f_ffree: ::c_long, + pub f_fsid: ::fsid_t, + pub f_owner: ::uid_t, + pub f_type: ::c_int, + pub f_flags: ::c_int, + pub f_syncwrites: ::c_long, + pub f_asyncwrites: ::c_long, + pub f_fstypename: [::c_char; 16], + pub f_mntonname: [::c_char; 80], + pub f_syncreads: ::c_long, + pub f_asyncreads: ::c_long, + __spares1: ::c_short, + pub f_mntfromname: [::c_char; 80], + __spares2: ::c_short, + __spare: [::c_long; 2], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + // The union is 8-byte in size, so it is aligned at a 8-byte offset. + #[cfg(target_pointer_width = "64")] + __unused1: ::c_int, + pub sigev_signo: ::c_int, //actually a union + // pad the union + #[cfg(target_pointer_width = "64")] + __unused2: ::c_int, + pub sigev_value: ::sigval, + __unused3: *mut ::c_void //actually a function pointer + } + + pub struct mcontext_t { + pub mc_onstack: register_t, + pub mc_rdi: register_t, + pub mc_rsi: register_t, + pub mc_rdx: register_t, + pub mc_rcx: register_t, + pub mc_r8: register_t, + pub mc_r9: register_t, + pub mc_rax: register_t, + pub mc_rbx: register_t, + pub mc_rbp: register_t, + pub mc_r10: register_t, + pub mc_r11: register_t, + pub mc_r12: register_t, + pub mc_r13: register_t, + pub mc_r14: register_t, + pub mc_r15: register_t, + pub mc_xflags: register_t, + pub mc_trapno: register_t, + pub mc_addr: register_t, + pub mc_flags: register_t, + pub mc_err: register_t, + pub mc_rip: register_t, + pub mc_cs: register_t, + pub mc_rflags: register_t, + pub mc_rsp: register_t, + pub mc_ss: register_t, + pub mc_len: ::c_uint, + pub mc_fpformat: ::c_uint, + pub mc_ownedfp: ::c_uint, + __reserved: ::c_uint, + __unused: [::c_uint; 8], + pub mc_fpregs: [[::c_uint; 8]; 32], + } + + pub struct ucontext_t { + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + pub uc_link: *mut ucontext_t, + pub uc_stack: stack_t, + pub uc_cofunc: ::Option, + pub uc_arg: *mut ::c_void, + __pad: [::c_int; 4], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_name == other.ut_name + && self.ut_id == other.ut_id + && self.ut_line == other.ut_line + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self.ut_unused == other.ut_unused + && self.ut_session == other.ut_session + && self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_exit == other.ut_exit + && self.ut_ss == other.ut_ss + && self.ut_tv == other.ut_tv + && self.ut_unused2 == other.ut_unused2 + } + } + impl Eq for utmpx {} + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_name", &self.ut_name) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + // FIXME: .field("ut_host", &self.ut_host) + .field("ut_unused", &self.ut_unused) + .field("ut_session", &self.ut_session) + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) + .field("ut_exit", &self.ut_exit) + .field("ut_ss", &self.ut_ss) + .field("ut_tv", &self.ut_tv) + .field("ut_unused2", &self.ut_unused2) + .finish() + } + } + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_name.hash(state); + self.ut_id.hash(state); + self.ut_line.hash(state); + self.ut_host.hash(state); + self.ut_unused.hash(state); + self.ut_session.hash(state); + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_exit.hash(state); + self.ut_ss.hash(state); + self.ut_tv.hash(state); + self.ut_unused2.hash(state); + } + } + impl PartialEq for lastlogx { + fn eq(&self, other: &lastlogx) -> bool { + self.ll_tv == other.ll_tv + && self.ll_line == other.ll_line + && self.ll_host == other.ll_host + && self.ll_ss == other.ll_ss + } + } + impl Eq for lastlogx {} + impl ::fmt::Debug for lastlogx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("lastlogx") + .field("ll_tv", &self.ll_tv) + .field("ll_line", &self.ll_line) + .field("ll_host", &self.ll_host) + .field("ll_ss", &self.ll_ss) + .finish() + } + } + impl ::hash::Hash for lastlogx { + fn hash(&self, state: &mut H) { + self.ll_tv.hash(state); + self.ll_line.hash(state); + self.ll_host.hash(state); + self.ll_ss.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_namlen == other.d_namlen + && self.d_type == other.d_type + // Ignore __unused1 + // Ignore __unused2 + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_namlen", &self.d_namlen) + .field("d_type", &self.d_type) + // Ignore __unused1 + // Ignore __unused2 + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_namlen.hash(state); + self.d_type.hash(state); + // Ignore __unused1 + // Ignore __unused2 + self.d_name.hash(state); + } + } + + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_fsid == other.f_fsid + && self.f_owner == other.f_owner + && self.f_type == other.f_type + && self.f_flags == other.f_flags + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncwrites == other.f_asyncwrites + && self.f_fstypename == other.f_fstypename + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + && self.f_syncreads == other.f_syncreads + && self.f_asyncreads == other.f_asyncreads + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_fsid", &self.f_fsid) + .field("f_owner", &self.f_owner) + .field("f_type", &self.f_type) + .field("f_flags", &self.f_flags) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncwrites", &self.f_asyncwrites) + // FIXME: .field("f_mntonname", &self.f_mntonname) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncreads", &self.f_asyncreads) + // FIXME: .field("f_mntfromname", &self.f_mntfromname) + .finish() + } + } + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_fsid.hash(state); + self.f_owner.hash(state); + self.f_type.hash(state); + self.f_flags.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncwrites.hash(state); + self.f_fstypename.hash(state); + self.f_mntonname.hash(state); + self.f_syncreads.hash(state); + self.f_asyncreads.hash(state); + self.f_mntfromname.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + } + } + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.mc_onstack == other.mc_onstack && + self.mc_rdi == other.mc_rdi && + self.mc_rsi == other.mc_rsi && + self.mc_rdx == other.mc_rdx && + self.mc_rcx == other.mc_rcx && + self.mc_r8 == other.mc_r8 && + self.mc_r9 == other.mc_r9 && + self.mc_rax == other.mc_rax && + self.mc_rbx == other.mc_rbx && + self.mc_rbp == other.mc_rbp && + self.mc_r10 == other.mc_r10 && + self.mc_r11 == other.mc_r11 && + self.mc_r12 == other.mc_r12 && + self.mc_r13 == other.mc_r13 && + self.mc_r14 == other.mc_r14 && + self.mc_r15 == other.mc_r15 && + self.mc_xflags == other.mc_xflags && + self.mc_trapno == other.mc_trapno && + self.mc_addr == other.mc_addr && + self.mc_flags == other.mc_flags && + self.mc_err == other.mc_err && + self.mc_rip == other.mc_rip && + self.mc_cs == other.mc_cs && + self.mc_rflags == other.mc_rflags && + self.mc_rsp == other.mc_rsp && + self.mc_ss == other.mc_ss && + self.mc_len == other.mc_len && + self.mc_fpformat == other.mc_fpformat && + self.mc_ownedfp == other.mc_ownedfp && + self.mc_fpregs.iter().zip(other.mc_fpregs.iter()). + all(|(a, b)| a == b) + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("mc_onstack", &self.mc_onstack) + .field("mc_rdi", &self.mc_rdi) + .field("mc_rsi", &self.mc_rsi) + .field("mc_rdx", &self.mc_rdx) + .field("mc_rcx", &self.mc_rcx) + .field("mc_r8", &self.mc_r8) + .field("mc_r9", &self.mc_r9) + .field("mc_rax", &self.mc_rax) + .field("mc_rbx", &self.mc_rbx) + .field("mc_rbp", &self.mc_rbp) + .field("mc_r10", &self.mc_r10) + .field("mc_r11", &self.mc_r11) + .field("mc_r12", &self.mc_r12) + .field("mc_r13", &self.mc_r13) + .field("mc_r14", &self.mc_r14) + .field("mc_r15", &self.mc_r15) + .field("mc_xflags", &self.mc_xflags) + .field("mc_trapno", &self.mc_trapno) + .field("mc_addr", &self.mc_addr) + .field("mc_flags", &self.mc_flags) + .field("mc_err", &self.mc_err) + .field("mc_rip", &self.mc_rip) + .field("mc_cs", &self.mc_cs) + .field("mc_rflags", &self.mc_rflags) + .field("mc_rsp", &self.mc_rsp) + .field("mc_ss", &self.mc_ss) + .field("mc_len", &self.mc_len) + .field("mc_fpformat", &self.mc_fpformat) + .field("mc_ownedfp", &self.mc_ownedfp) + .field("mc_fpregs", &self.mc_fpregs) + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.mc_onstack.hash(state); + self.mc_rdi.hash(state); + self.mc_rsi.hash(state); + self.mc_rdx.hash(state); + self.mc_rcx.hash(state); + self.mc_r8.hash(state); + self.mc_r9.hash(state); + self.mc_rax.hash(state); + self.mc_rbx.hash(state); + self.mc_rbp.hash(state); + self.mc_r10.hash(state); + self.mc_r11.hash(state); + self.mc_r10.hash(state); + self.mc_r11.hash(state); + self.mc_r12.hash(state); + self.mc_r13.hash(state); + self.mc_r14.hash(state); + self.mc_r15.hash(state); + self.mc_xflags.hash(state); + self.mc_trapno.hash(state); + self.mc_addr.hash(state); + self.mc_flags.hash(state); + self.mc_err.hash(state); + self.mc_rip.hash(state); + self.mc_cs.hash(state); + self.mc_rflags.hash(state); + self.mc_rsp.hash(state); + self.mc_ss.hash(state); + self.mc_len.hash(state); + self.mc_fpformat.hash(state); + self.mc_ownedfp.hash(state); + self.mc_fpregs.hash(state); + } + } + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_sigmask == other.uc_sigmask + && self.uc_mcontext == other.uc_mcontext + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_cofunc == other.uc_cofunc + && self.uc_arg == other.uc_arg + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_sigmask", &self.uc_sigmask) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_cofunc", &self.uc_cofunc) + .field("uc_arg", &self.uc_arg) + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_sigmask.hash(state); + self.uc_mcontext.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_cofunc.hash(state); + self.uc_arg.hash(state); + } + } + } +} + +pub const RAND_MAX: ::c_int = 0x7fff_ffff; +pub const PTHREAD_STACK_MIN: ::size_t = 16384; +pub const SIGSTKSZ: ::size_t = 40960; +pub const SIGCKPT: ::c_int = 33; +pub const SIGCKPTEXIT: ::c_int = 34; +pub const CKPT_FREEZE: ::c_int = 0x1; +pub const CKPT_THAW: ::c_int = 0x2; +pub const MADV_INVAL: ::c_int = 10; +pub const MADV_SETMAP: ::c_int = 11; +pub const O_CLOEXEC: ::c_int = 0x00020000; +pub const O_DIRECTORY: ::c_int = 0x08000000; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_GETPATH: ::c_int = 19; +pub const ENOMEDIUM: ::c_int = 93; +pub const ENOTRECOVERABLE: ::c_int = 94; +pub const EOWNERDEAD: ::c_int = 95; +pub const EASYNC: ::c_int = 99; +pub const ELAST: ::c_int = 99; +pub const RLIMIT_POSIXLOCKS: ::c_int = 11; +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: ::rlim_t = 12; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_P1003_1B: ::c_int = 9; +pub const CTL_LWKT: ::c_int = 10; +pub const CTL_MAXID: ::c_int = 11; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_UPDATEINTERVAL: ::c_int = 23; +pub const KERN_OSRELDATE: ::c_int = 24; +pub const KERN_NTP_PLL: ::c_int = 25; +pub const KERN_BOOTFILE: ::c_int = 26; +pub const KERN_MAXFILESPERPROC: ::c_int = 27; +pub const KERN_MAXPROCPERUID: ::c_int = 28; +pub const KERN_DUMPDEV: ::c_int = 29; +pub const KERN_IPC: ::c_int = 30; +pub const KERN_DUMMY: ::c_int = 31; +pub const KERN_PS_STRINGS: ::c_int = 32; +pub const KERN_USRSTACK: ::c_int = 33; +pub const KERN_LOGSIGEXIT: ::c_int = 34; +pub const KERN_IOV_MAX: ::c_int = 35; +pub const KERN_MAXPOSIXLOCKSPERUID: ::c_int = 36; +pub const KERN_MAXID: ::c_int = 37; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_ARGS: ::c_int = 7; +pub const KERN_PROC_CWD: ::c_int = 8; +pub const KERN_PROC_PATHNAME: ::c_int = 9; +pub const KERN_PROC_FLAGMASK: ::c_int = 0x10; +pub const KERN_PROC_FLAG_LWP: ::c_int = 0x10; +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; +pub const KIPC_MBSTAT: ::c_int = 8; +pub const KIPC_NMBCLUSTERS: ::c_int = 9; +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_FLOATINGPT: ::c_int = 10; +pub const HW_MACHINE_ARCH: ::c_int = 11; +pub const HW_MACHINE_PLATFORM: ::c_int = 12; +pub const HW_SENSORS: ::c_int = 13; +pub const HW_MAXID: ::c_int = 14; +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_MAXID: ::c_int = 21; +pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; +pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; +pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; +pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; +pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; +pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; +pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; +pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; +pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; +pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; +pub const CTL_P1003_1B_FSYNC: ::c_int = 11; +pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; +pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; +pub const CTL_P1003_1B_TIMERS: ::c_int = 14; +pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; +pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; +pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; +pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; +pub const CTL_P1003_1B_UNUSED1: ::c_int = 19; +pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; +pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; +pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; +pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; +pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; +pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; +pub const CTL_P1003_1B_MAXID: ::c_int = 26; + +pub const CPUCTL_RSMSR: ::c_int = 0xc0106301; +pub const CPUCTL_WRMSR: ::c_int = 0xc0106302; +pub const CPUCTL_CPUID: ::c_int = 0xc0106303; +pub const CPUCTL_UPDATE: ::c_int = 0xc0106304; +pub const CPUCTL_MSRSBIT: ::c_int = 0xc0106305; +pub const CPUCTL_MSRCBIT: ::c_int = 0xc0106306; +pub const CPUCTL_CPUID_COUNT: ::c_int = 0xc0106307; + +pub const CPU_SETSIZE: ::size_t = ::mem::size_of::<::cpumask_t>() * 8; + +pub const EVFILT_READ: i16 = -1; +pub const EVFILT_WRITE: i16 = -2; +pub const EVFILT_AIO: i16 = -3; +pub const EVFILT_VNODE: i16 = -4; +pub const EVFILT_PROC: i16 = -5; +pub const EVFILT_SIGNAL: i16 = -6; +pub const EVFILT_TIMER: i16 = -7; +pub const EVFILT_EXCEPT: i16 = -8; +pub const EVFILT_USER: i16 = -9; +pub const EVFILT_FS: i16 = -10; + +pub const EV_ADD: u16 = 0x1; +pub const EV_DELETE: u16 = 0x2; +pub const EV_ENABLE: u16 = 0x4; +pub const EV_DISABLE: u16 = 0x8; +pub const EV_ONESHOT: u16 = 0x10; +pub const EV_CLEAR: u16 = 0x20; +pub const EV_RECEIPT: u16 = 0x40; +pub const EV_DISPATCH: u16 = 0x80; +pub const EV_NODATA: u16 = 0x1000; +pub const EV_FLAG1: u16 = 0x2000; +pub const EV_ERROR: u16 = 0x4000; +pub const EV_EOF: u16 = 0x8000; +pub const EV_HUP: u16 = 0x8000; +pub const EV_SYSFLAGS: u16 = 0xf000; + +pub const FIODNAME: ::c_ulong = 0x80106678; + +pub const NOTE_TRIGGER: u32 = 0x01000000; +pub const NOTE_FFNOP: u32 = 0x00000000; +pub const NOTE_FFAND: u32 = 0x40000000; +pub const NOTE_FFOR: u32 = 0x80000000; +pub const NOTE_FFCOPY: u32 = 0xc0000000; +pub const NOTE_FFCTRLMASK: u32 = 0xc0000000; +pub const NOTE_FFLAGSMASK: u32 = 0x00ffffff; +pub const NOTE_LOWAT: u32 = 0x00000001; +pub const NOTE_OOB: u32 = 0x00000002; +pub const NOTE_DELETE: u32 = 0x00000001; +pub const NOTE_WRITE: u32 = 0x00000002; +pub const NOTE_EXTEND: u32 = 0x00000004; +pub const NOTE_ATTRIB: u32 = 0x00000008; +pub const NOTE_LINK: u32 = 0x00000010; +pub const NOTE_RENAME: u32 = 0x00000020; +pub const NOTE_REVOKE: u32 = 0x00000040; +pub const NOTE_EXIT: u32 = 0x80000000; +pub const NOTE_FORK: u32 = 0x40000000; +pub const NOTE_EXEC: u32 = 0x20000000; +pub const NOTE_PDATAMASK: u32 = 0x000fffff; +pub const NOTE_PCTRLMASK: u32 = 0xf0000000; +pub const NOTE_TRACK: u32 = 0x00000001; +pub const NOTE_TRACKERR: u32 = 0x00000002; +pub const NOTE_CHILD: u32 = 0x00000004; + +pub const SO_SNDSPACE: ::c_int = 0x100a; +pub const SO_CPUHINT: ::c_int = 0x1030; +pub const SO_PASSCRED: ::c_int = 0x4000; + +pub const PT_FIRSTMACH: ::c_int = 32; + +pub const PROC_REAP_ACQUIRE: ::c_int = 0x0001; +pub const PROC_REAP_RELEASE: ::c_int = 0x0002; +pub const PROC_REAP_STATUS: ::c_int = 0x0003; +pub const PROC_PDEATHSIG_CTL: ::c_int = 0x0004; +pub const PROC_PDEATHSIG_STATUS: ::c_int = 0x0005; + +// https://github.com/DragonFlyBSD/DragonFlyBSD/blob/HEAD/sys/net/if.h#L101 +pub const IFF_UP: ::c_int = 0x1; // interface is up +pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link +pub const IFF_SMART: ::c_int = 0x20; // interface manages own routes +pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated +pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol +pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets +pub const IFF_OACTIVE_COMPAT: ::c_int = 0x400; // was transmission in progress +pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions +pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit +pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; // use alternate physical connection +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + // was interface is in polling mode +pub const IFF_POLLING_COMPAT: ::c_int = 0x10000; +pub const IFF_PPROMISC: ::c_int = 0x20000; // user-requested promisc mode +pub const IFF_MONITOR: ::c_int = 0x40000; // user-requested monitor mode +pub const IFF_STATICARP: ::c_int = 0x80000; // static ARP +pub const IFF_NPOLLING: ::c_int = 0x100000; // interface is in polling mode +pub const IFF_IDIRECT: ::c_int = 0x200000; // direct input + +// +// sys/netinet/in.h +// Protocols (RFC 1700) +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// IP6 hop-by-hop options +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// gateway^2 (deprecated) +pub const IPPROTO_GGP: ::c_int = 3; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// Stream protocol II. +pub const IPPROTO_ST: ::c_int = 7; +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// private interior gateway +pub const IPPROTO_PIGP: ::c_int = 9; +/// BBN RCC Monitoring +pub const IPPROTO_RCCMON: ::c_int = 10; +/// network voice protocol +pub const IPPROTO_NVPII: ::c_int = 11; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +/// Argus +pub const IPPROTO_ARGUS: ::c_int = 13; +/// EMCON +pub const IPPROTO_EMCON: ::c_int = 14; +/// Cross Net Debugger +pub const IPPROTO_XNET: ::c_int = 15; +/// Chaos +pub const IPPROTO_CHAOS: ::c_int = 16; +// IPPROTO_UDP defined in src/unix/mod.rs +/// Multiplexing +pub const IPPROTO_MUX: ::c_int = 18; +/// DCN Measurement Subsystems +pub const IPPROTO_MEAS: ::c_int = 19; +/// Host Monitoring +pub const IPPROTO_HMP: ::c_int = 20; +/// Packet Radio Measurement +pub const IPPROTO_PRM: ::c_int = 21; +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// Trunk-1 +pub const IPPROTO_TRUNK1: ::c_int = 23; +/// Trunk-2 +pub const IPPROTO_TRUNK2: ::c_int = 24; +/// Leaf-1 +pub const IPPROTO_LEAF1: ::c_int = 25; +/// Leaf-2 +pub const IPPROTO_LEAF2: ::c_int = 26; +/// Reliable Data +pub const IPPROTO_RDP: ::c_int = 27; +/// Reliable Transaction +pub const IPPROTO_IRTP: ::c_int = 28; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// Bulk Data Transfer +pub const IPPROTO_BLT: ::c_int = 30; +/// Network Services +pub const IPPROTO_NSP: ::c_int = 31; +/// Merit Internodal +pub const IPPROTO_INP: ::c_int = 32; +/// Sequential Exchange +pub const IPPROTO_SEP: ::c_int = 33; +/// Third Party Connect +pub const IPPROTO_3PC: ::c_int = 34; +/// InterDomain Policy Routing +pub const IPPROTO_IDPR: ::c_int = 35; +/// XTP +pub const IPPROTO_XTP: ::c_int = 36; +/// Datagram Delivery +pub const IPPROTO_DDP: ::c_int = 37; +/// Control Message Transport +pub const IPPROTO_CMTP: ::c_int = 38; +/// TP++ Transport +pub const IPPROTO_TPXX: ::c_int = 39; +/// IL transport protocol +pub const IPPROTO_IL: ::c_int = 40; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// Source Demand Routing +pub const IPPROTO_SDRP: ::c_int = 42; +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// InterDomain Routing +pub const IPPROTO_IDRP: ::c_int = 45; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// Mobile Host Routing +pub const IPPROTO_MHRP: ::c_int = 48; +/// BHA +pub const IPPROTO_BHA: ::c_int = 49; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +/// Integ. Net Layer Security +pub const IPPROTO_INLSP: ::c_int = 52; +/// IP with encryption +pub const IPPROTO_SWIPE: ::c_int = 53; +/// Next Hop Resolution +pub const IPPROTO_NHRP: ::c_int = 54; +/// IP Mobility +pub const IPPROTO_MOBILE: ::c_int = 55; +/// Transport Layer Security +pub const IPPROTO_TLSP: ::c_int = 56; +/// SKIP +pub const IPPROTO_SKIP: ::c_int = 57; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +/// any host internal protocol +pub const IPPROTO_AHIP: ::c_int = 61; +/// CFTP +pub const IPPROTO_CFTP: ::c_int = 62; +/// "hello" routing protocol +pub const IPPROTO_HELLO: ::c_int = 63; +/// SATNET/Backroom EXPAK +pub const IPPROTO_SATEXPAK: ::c_int = 64; +/// Kryptolan +pub const IPPROTO_KRYPTOLAN: ::c_int = 65; +/// Remote Virtual Disk +pub const IPPROTO_RVD: ::c_int = 66; +/// Pluribus Packet Core +pub const IPPROTO_IPPC: ::c_int = 67; +/// Any distributed FS +pub const IPPROTO_ADFS: ::c_int = 68; +/// Satnet Monitoring +pub const IPPROTO_SATMON: ::c_int = 69; +/// VISA Protocol +pub const IPPROTO_VISA: ::c_int = 70; +/// Packet Core Utility +pub const IPPROTO_IPCV: ::c_int = 71; +/// Comp. Prot. Net. Executive +pub const IPPROTO_CPNX: ::c_int = 72; +/// Comp. Prot. HeartBeat +pub const IPPROTO_CPHB: ::c_int = 73; +/// Wang Span Network +pub const IPPROTO_WSN: ::c_int = 74; +/// Packet Video Protocol +pub const IPPROTO_PVP: ::c_int = 75; +/// BackRoom SATNET Monitoring +pub const IPPROTO_BRSATMON: ::c_int = 76; +/// Sun net disk proto (temp.) +pub const IPPROTO_ND: ::c_int = 77; +/// WIDEBAND Monitoring +pub const IPPROTO_WBMON: ::c_int = 78; +/// WIDEBAND EXPAK +pub const IPPROTO_WBEXPAK: ::c_int = 79; +/// ISO cnlp +pub const IPPROTO_EON: ::c_int = 80; +/// VMTP +pub const IPPROTO_VMTP: ::c_int = 81; +/// Secure VMTP +pub const IPPROTO_SVMTP: ::c_int = 82; +/// Banyon VINES +pub const IPPROTO_VINES: ::c_int = 83; +/// TTP +pub const IPPROTO_TTP: ::c_int = 84; +/// NSFNET-IGP +pub const IPPROTO_IGP: ::c_int = 85; +/// dissimilar gateway prot. +pub const IPPROTO_DGP: ::c_int = 86; +/// TCF +pub const IPPROTO_TCF: ::c_int = 87; +/// Cisco/GXS IGRP +pub const IPPROTO_IGRP: ::c_int = 88; +/// OSPFIGP +pub const IPPROTO_OSPFIGP: ::c_int = 89; +/// Strite RPC protocol +pub const IPPROTO_SRPC: ::c_int = 90; +/// Locus Address Resoloution +pub const IPPROTO_LARP: ::c_int = 91; +/// Multicast Transport +pub const IPPROTO_MTP: ::c_int = 92; +/// AX.25 Frames +pub const IPPROTO_AX25: ::c_int = 93; +/// IP encapsulated in IP +pub const IPPROTO_IPEIP: ::c_int = 94; +/// Mobile Int.ing control +pub const IPPROTO_MICP: ::c_int = 95; +/// Semaphore Comm. security +pub const IPPROTO_SCCSP: ::c_int = 96; +/// Ethernet IP encapsulation +pub const IPPROTO_ETHERIP: ::c_int = 97; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// any private encr. scheme +pub const IPPROTO_APES: ::c_int = 99; +/// GMTP +pub const IPPROTO_GMTP: ::c_int = 100; +/// payload compression (IPComp) +pub const IPPROTO_IPCOMP: ::c_int = 108; + +/* 101-254: Partly Unassigned */ +/// Protocol Independent Mcast +pub const IPPROTO_PIM: ::c_int = 103; +/// CARP +pub const IPPROTO_CARP: ::c_int = 112; +/// PGM +pub const IPPROTO_PGM: ::c_int = 113; +/// PFSYNC +pub const IPPROTO_PFSYNC: ::c_int = 240; + +/* 255: Reserved */ +/* BSD Private, local use, namespace incursion, no longer used */ +/// divert pseudo-protocol +pub const IPPROTO_DIVERT: ::c_int = 254; +pub const IPPROTO_MAX: ::c_int = 256; +/// last return value of *_input(), meaning "all job for this pkt is done". +pub const IPPROTO_DONE: ::c_int = 257; + +/// Used by RSS: the layer3 protocol is unknown +pub const IPPROTO_UNKNOWN: ::c_int = 258; + +// sys/netinet/tcp.h +pub const TCP_SIGNATURE_ENABLE: ::c_int = 16; +pub const TCP_KEEPINIT: ::c_int = 32; +pub const TCP_FASTKEEP: ::c_int = 128; + +pub const AF_BLUETOOTH: ::c_int = 33; +pub const AF_MPLS: ::c_int = 34; +pub const AF_IEEE80211: ::c_int = 35; + +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_MAXID: ::c_int = 4; + +pub const SOMAXOPT_SIZE: ::c_int = 65536; + +pub const MSG_UNUSED09: ::c_int = 0x00000200; +pub const MSG_NOSIGNAL: ::c_int = 0x00000400; +pub const MSG_SYNC: ::c_int = 0x00000800; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00001000; +pub const MSG_FBLOCKING: ::c_int = 0x00010000; +pub const MSG_FNONBLOCKING: ::c_int = 0x00020000; +pub const MSG_FMASK: ::c_int = 0xFFFF0000; + +// sys/mount.h +pub const MNT_NODEV: ::c_int = 0x00000010; +pub const MNT_AUTOMOUNTED: ::c_int = 0x00000020; +pub const MNT_TRIM: ::c_int = 0x01000000; +pub const MNT_LOCAL: ::c_int = 0x00001000; +pub const MNT_QUOTA: ::c_int = 0x00002000; +pub const MNT_ROOTFS: ::c_int = 0x00004000; +pub const MNT_USER: ::c_int = 0x00008000; +pub const MNT_IGNORE: ::c_int = 0x00800000; + +// utmpx entry types +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; +pub const SIGNATURE: ::c_short = 10; +pub const DOWNTIME: ::c_short = 11; +// utmpx database types +pub const UTX_DB_UTMPX: ::c_uint = 0; +pub const UTX_DB_WTMPX: ::c_uint = 1; +pub const UTX_DB_LASTLOG: ::c_uint = 2; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_USERSIZE: usize = 32; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 256; + +pub const LC_COLLATE_MASK: ::c_int = 1 << 0; +pub const LC_CTYPE_MASK: ::c_int = 1 << 1; +pub const LC_MONETARY_MASK: ::c_int = 1 << 2; +pub const LC_NUMERIC_MASK: ::c_int = 1 << 3; +pub const LC_TIME_MASK: ::c_int = 1 << 4; +pub const LC_MESSAGES_MASK: ::c_int = 1 << 5; +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const TIOCSIG: ::c_ulong = 0x2000745f; +pub const BTUARTDISC: ::c_int = 0x7; +pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40107458; +pub const TIOCISPTMASTER: ::c_ulong = 0x20007455; +pub const TIOCMODG: ::c_ulong = 0x40047403; +pub const TIOCMODS: ::c_ulong = 0x80047404; +pub const TIOCREMOTE: ::c_ulong = 0x80047469; + +// Constants used by "at" family of system calls. +pub const AT_FDCWD: ::c_int = 0xFFFAFDCD; // invalid file descriptor +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 1; +pub const AT_REMOVEDIR: ::c_int = 2; +pub const AT_EACCESS: ::c_int = 4; +pub const AT_SYMLINK_FOLLOW: ::c_int = 8; + +pub const VCHECKPT: usize = 19; + +pub const _PC_2_SYMLINKS: ::c_int = 22; +pub const _PC_TIMESTAMP_RESOLUTION: ::c_int = 23; + +pub const _SC_V7_ILP32_OFF32: ::c_int = 122; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 123; +pub const _SC_V7_LP64_OFF64: ::c_int = 124; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 125; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 126; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 127; + +pub const WCONTINUED: ::c_int = 0x4; +pub const WSTOPPED: ::c_int = 0x2; +pub const WNOWAIT: ::c_int = 0x8; +pub const WEXITED: ::c_int = 0x10; +pub const WTRAPPED: ::c_int = 0x20; + +// Similar to FreeBSD, only the standardized ones are exposed. +// There are more. +pub const P_PID: idtype_t = 0; +pub const P_PGID: idtype_t = 2; +pub const P_ALL: idtype_t = 7; + +// Values for struct rtprio (type_ field) +pub const RTP_PRIO_REALTIME: ::c_ushort = 0; +pub const RTP_PRIO_NORMAL: ::c_ushort = 1; +pub const RTP_PRIO_IDLE: ::c_ushort = 2; +pub const RTP_PRIO_THREAD: ::c_ushort = 3; + +// Flags for chflags(2) +pub const UF_NOHISTORY: ::c_ulong = 0x00000040; +pub const UF_CACHE: ::c_ulong = 0x00000080; +pub const UF_XLINK: ::c_ulong = 0x00000100; +pub const SF_NOHISTORY: ::c_ulong = 0x00400000; +pub const SF_CACHE: ::c_ulong = 0x00800000; +pub const SF_XLINK: ::c_ulong = 0x01000000; + +// timespec constants +pub const UTIME_OMIT: c_long = -2; +pub const UTIME_NOW: c_long = -1; + +pub const MINCORE_SUPER: ::c_int = 0x20; + +// kinfo_proc constants +pub const MAXCOMLEN: usize = 16; +pub const MAXLOGNAME: usize = 33; +pub const NGROUPS: usize = 16; + +pub const RB_PAUSE: ::c_int = 0x40000; +pub const RB_VIDEO: ::c_int = 0x20000000; + +const_fn! { + {const} fn _CMSG_ALIGN(n: usize) -> usize { + (n + (::mem::size_of::<::c_long>() - 1)) & !(::mem::size_of::<::c_long>() - 1) + } +} + +f! { + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(_CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + (_CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) + length as usize) + as ::c_uint + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + let next = cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len as usize) + + _CMSG_ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next <= max { + (cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } else { + 0 as *mut ::cmsghdr + } + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (_CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) + + _CMSG_ALIGN(length as usize)) as ::c_uint + } + + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.ary.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let (idx, offset) = ((cpu >> 6) & 3, cpu & 63); + cpuset.ary[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let (idx, offset) = ((cpu >> 6) & 3, cpu & 63); + cpuset.ary[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let (idx, offset) = ((cpu >> 6) & 3, cpu & 63); + 0 != cpuset.ary[idx] & (1 << offset) + } + + pub fn major(dev: ::dev_t) -> ::c_int { + ((dev >> 8) & 0xff) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + (dev & 0xffff00ff) as ::c_int + } +} + +safe_f! { + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 + } + + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= major << 8; + dev |= minor; + dev + } +} + +extern "C" { + pub fn __errno_location() -> *mut ::c_int; + pub fn setgrent(); + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + + pub fn setutxdb(_type: ::c_uint, file: *mut ::c_char) -> ::c_int; + + pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, timeout: *mut ::timespec) -> ::c_int; + + pub fn devname_r( + dev: ::dev_t, + mode: ::mode_t, + buf: *mut ::c_char, + len: ::size_t, + ) -> *mut ::c_char; + + pub fn waitid( + idtype: idtype_t, + id: ::id_t, + infop: *mut ::siginfo_t, + options: ::c_int, + ) -> ::c_int; + + pub fn freelocale(loc: ::locale_t); + + pub fn lwp_rtprio( + function: ::c_int, + pid: ::pid_t, + lwpid: lwpid_t, + rtp: *mut super::rtprio, + ) -> ::c_int; + + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> ::c_int; + + pub fn sched_getaffinity(pid: ::pid_t, cpusetsize: ::size_t, mask: *mut cpu_set_t) -> ::c_int; + pub fn sched_setaffinity(pid: ::pid_t, cpusetsize: ::size_t, mask: *const cpu_set_t) + -> ::c_int; + pub fn sched_getcpu() -> ::c_int; + pub fn setproctitle(fmt: *const ::c_char, ...); + + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn procctl(idtype: ::idtype_t, id: ::id_t, cmd: ::c_int, data: *mut ::c_void) -> ::c_int; + + pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int; + pub fn getlastlogx(fname: *const ::c_char, uid: ::uid_t, ll: *mut lastlogx) -> *mut lastlogx; + pub fn updlastlogx(fname: *const ::c_char, uid: ::uid_t, ll: *mut lastlogx) -> ::c_int; + pub fn getutxuser(name: *const ::c_char) -> utmpx; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + + pub fn sys_checkpoint(tpe: ::c_int, fd: ::c_int, pid: ::pid_t, retval: ::c_int) -> ::c_int; + + pub fn umtx_sleep(ptr: *const ::c_int, value: ::c_int, timeout: ::c_int) -> ::c_int; + pub fn umtx_wakeup(ptr: *const ::c_int, count: ::c_int) -> ::c_int; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +#[link(name = "rt")] +extern "C" { + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + + pub fn reallocf(ptr: *mut ::c_void, size: ::size_t) -> *mut ::c_void; + pub fn freezero(ptr: *mut ::c_void, size: ::size_t); +} + +#[link(name = "kvm")] +extern "C" { + pub fn kvm_vm_map_entry_first( + kvm: *mut ::kvm_t, + map: vm_map_t, + entry: vm_map_entry_t, + ) -> vm_map_entry_t; + pub fn kvm_vm_map_entry_next( + kvm: *mut ::kvm_t, + map: vm_map_entry_t, + entry: vm_map_entry_t, + ) -> vm_map_entry_t; +} + +cfg_if! { + if #[cfg(libc_thread_local)] { + mod errno; + pub use self::errno::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/aarch64.rs new file mode 100644 index 0000000..e8be881 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/aarch64.rs @@ -0,0 +1,146 @@ +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = u32; +pub type time_t = i64; +pub type suseconds_t = i64; +pub type register_t = i64; + +s_no_extra_traits! { + pub struct gpregs { + pub gp_x: [::register_t; 30], + pub gp_lr: ::register_t, + pub gp_sp: ::register_t, + pub gp_elr: ::register_t, + pub gp_spsr: u32, + pub gp_pad: ::c_int, + } + + pub struct fpregs { + pub fp_q: u128, + pub fp_sr: u32, + pub fp_cr: u32, + pub fp_flags: ::c_int, + pub fp_pad: ::c_int, + } + + pub struct mcontext_t { + pub mc_gpregs: gpregs, + pub mc_fpregs: fpregs, + pub mc_flags: ::c_int, + pub mc_pad: ::c_int, + pub mc_spare: [u64; 8], + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_longlong>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for gpregs { + fn eq(&self, other: &gpregs) -> bool { + self.gp_x.iter().zip(other.gp_x.iter()).all(|(a, b)| a == b) && + self.gp_lr == other.gp_lr && + self.gp_sp == other.gp_sp && + self.gp_elr == other.gp_elr && + self.gp_spsr == other.gp_spsr && + self.gp_pad == other.gp_pad + } + } + impl Eq for gpregs {} + impl ::fmt::Debug for gpregs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("gpregs") + .field("gp_x", &self.gp_x) + .field("gp_lr", &self.gp_lr) + .field("gp_sp", &self.gp_sp) + .field("gp_elr", &self.gp_elr) + .field("gp_spsr", &self.gp_spsr) + .field("gp_pad", &self.gp_pad) + .finish() + } + } + impl ::hash::Hash for gpregs { + fn hash(&self, state: &mut H) { + self.gp_x.hash(state); + self.gp_lr.hash(state); + self.gp_sp.hash(state); + self.gp_elr.hash(state); + self.gp_spsr.hash(state); + self.gp_pad.hash(state); + } + } + impl PartialEq for fpregs { + fn eq(&self, other: &fpregs) -> bool { + self.fp_q == other.fp_q && + self.fp_sr == other.fp_sr && + self.fp_cr == other.fp_cr && + self.fp_flags == other.fp_flags && + self.fp_pad == other.fp_pad + } + } + impl Eq for fpregs {} + impl ::fmt::Debug for fpregs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpregs") + .field("fp_q", &self.fp_q) + .field("fp_sr", &self.fp_sr) + .field("fp_cr", &self.fp_cr) + .field("fp_flags", &self.fp_flags) + .field("fp_pad", &self.fp_pad) + .finish() + } + } + impl ::hash::Hash for fpregs { + fn hash(&self, state: &mut H) { + self.fp_q.hash(state); + self.fp_sr.hash(state); + self.fp_cr.hash(state); + self.fp_flags.hash(state); + self.fp_pad.hash(state); + } + } + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.mc_gpregs == other.mc_gpregs && + self.mc_fpregs == other.mc_fpregs && + self.mc_flags == other.mc_flags && + self.mc_pad == other.mc_pad && + self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b) + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("mc_gpregs", &self.mc_gpregs) + .field("mc_fpregs", &self.mc_fpregs) + .field("mc_flags", &self.mc_flags) + .field("mc_pad", &self.mc_pad) + .field("mc_spare", &self.mc_spare) + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.mc_gpregs.hash(state); + self.mc_fpregs.hash(state); + self.mc_flags.hash(state); + self.mc_pad.hash(state); + self.mc_spare.hash(state); + } + } + } +} + +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/arm.rs new file mode 100644 index 0000000..300b3dd --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/arm.rs @@ -0,0 +1,50 @@ +pub type c_char = u8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type wchar_t = u32; +pub type time_t = i64; +pub type suseconds_t = i32; +pub type register_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_atime_pad: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_mtime_pad: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ctime_pad: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u32, + pub st_lspare: i32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + pub st_birthtime_pad: ::c_long, + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs new file mode 100644 index 0000000..f32128f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs @@ -0,0 +1,32 @@ +#[repr(C)] +#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] +pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u32, + pub st_lspare: i32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, +} + +impl ::Copy for ::stat {} +impl ::Clone for ::stat { + fn clone(&self) -> ::stat { + *self + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs new file mode 100644 index 0000000..de34069 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs @@ -0,0 +1,488 @@ +// APIs that were changed after FreeBSD 11 + +// The type of `nlink_t` changed from `u16` to `u64` in FreeBSD 12: +pub type nlink_t = u16; +// Type of `dev_t` changed from `u32` to `u64` in FreeBSD 12: +pub type dev_t = u32; +// Type of `ino_t` changed from `unsigned int` to `unsigned long` in FreeBSD 12: +pub type ino_t = u32; + +s! { + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: ::intptr_t, + pub udata: *mut ::c_void, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + // Type of shm_nattc changed from `int` to `shmatt_t` (aka `unsigned + // int`) in FreeBSD 12: + pub shm_nattch: ::c_int, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + } + + pub struct kinfo_proc { + /// Size of this structure. + pub ki_structsize: ::c_int, + /// Reserved: layout identifier. + pub ki_layout: ::c_int, + /// Address of command arguments. + pub ki_args: *mut ::pargs, + // This is normally "struct proc". + /// Address of proc. + pub ki_paddr: *mut ::c_void, + // This is normally "struct user". + /// Kernel virtual address of u-area. + pub ki_addr: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to trace file. + pub ki_tracep: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to executable file. + pub ki_textvp: *mut ::c_void, + // This is normally "struct filedesc". + /// Pointer to open file info. + pub ki_fd: *mut ::c_void, + // This is normally "struct vmspace". + /// Pointer to kernel vmspace struct. + pub ki_vmspace: *mut ::c_void, + /// Sleep address. + pub ki_wchan: *mut ::c_void, + /// Process identifier. + pub ki_pid: ::pid_t, + /// Parent process ID. + pub ki_ppid: ::pid_t, + /// Process group ID. + pub ki_pgid: ::pid_t, + /// tty process group ID. + pub ki_tpgid: ::pid_t, + /// Process session ID. + pub ki_sid: ::pid_t, + /// Terminal session ID. + pub ki_tsid: ::pid_t, + /// Job control counter. + pub ki_jobc: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short1: ::c_short, + /// Controlling tty dev. + pub ki_tdev: ::dev_t, + /// Signals arrived but not delivered. + pub ki_siglist: ::sigset_t, + /// Current signal mask. + pub ki_sigmask: ::sigset_t, + /// Signals being ignored. + pub ki_sigignore: ::sigset_t, + /// Signals being caught by user. + pub ki_sigcatch: ::sigset_t, + /// Effective user ID. + pub ki_uid: ::uid_t, + /// Real user ID. + pub ki_ruid: ::uid_t, + /// Saved effective user ID. + pub ki_svuid: ::uid_t, + /// Real group ID. + pub ki_rgid: ::gid_t, + /// Saved effective group ID. + pub ki_svgid: ::gid_t, + /// Number of groups. + pub ki_ngroups: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short2: ::c_short, + /// Groups. + pub ki_groups: [::gid_t; ::KI_NGROUPS], + /// Virtual size. + pub ki_size: ::vm_size_t, + /// Current resident set size in pages. + pub ki_rssize: ::segsz_t, + /// Resident set size before last swap. + pub ki_swrss: ::segsz_t, + /// Text size (pages) XXX. + pub ki_tsize: ::segsz_t, + /// Data size (pages) XXX. + pub ki_dsize: ::segsz_t, + /// Stack size (pages). + pub ki_ssize: ::segsz_t, + /// Exit status for wait & stop signal. + pub ki_xstat: ::u_short, + /// Accounting flags. + pub ki_acflag: ::u_short, + /// %cpu for process during `ki_swtime`. + pub ki_pctcpu: ::fixpt_t, + /// Time averaged value of `ki_cpticks`. + pub ki_estcpu: ::u_int, + /// Time since last blocked. + pub ki_slptime: ::u_int, + /// Time swapped in or out. + pub ki_swtime: ::u_int, + /// Number of copy-on-write faults. + pub ki_cow: ::u_int, + /// Real time in microsec. + pub ki_runtime: u64, + /// Starting time. + pub ki_start: ::timeval, + /// Time used by process children. + pub ki_childtime: ::timeval, + /// P_* flags. + pub ki_flag: ::c_long, + /// KI_* flags (below). + pub ki_kiflag: ::c_long, + /// Kernel trace points. + pub ki_traceflag: ::c_int, + /// S* process status. + pub ki_stat: ::c_char, + /// Process "nice" value. + pub ki_nice: i8, // signed char + /// Process lock (prevent swap) count. + pub ki_lock: ::c_char, + /// Run queue index. + pub ki_rqindex: ::c_char, + /// Which cpu we are on. + pub ki_oncpu_old: ::c_uchar, + /// Last cpu we were on. + pub ki_lastcpu_old: ::c_uchar, + /// Thread name. + pub ki_tdname: [::c_char; ::TDNAMLEN + 1], + /// Wchan message. + pub ki_wmesg: [::c_char; ::WMESGLEN + 1], + /// Setlogin name. + pub ki_login: [::c_char; ::LOGNAMELEN + 1], + /// Lock name. + pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1], + /// Command name. + pub ki_comm: [::c_char; ::COMMLEN + 1], + /// Emulation name. + pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1], + /// Login class. + pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1], + /// More thread name. + pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1], + /// Spare string space. + pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq + /// Spare room for growth. + pub ki_spareints: [::c_int; ::KI_NSPARE_INT], + /// Which cpu we are on. + pub ki_oncpu: ::c_int, + /// Last cpu we were on. + pub ki_lastcpu: ::c_int, + /// PID of tracing process. + pub ki_tracer: ::c_int, + /// P2_* flags. + pub ki_flag2: ::c_int, + /// Default FIB number. + pub ki_fibnum: ::c_int, + /// Credential flags. + pub ki_cr_flags: ::u_int, + /// Process jail ID. + pub ki_jid: ::c_int, + /// Number of threads in total. + pub ki_numthreads: ::c_int, + /// Thread ID. + pub ki_tid: ::lwpid_t, + /// Process priority. + pub ki_pri: ::priority, + /// Process rusage statistics. + pub ki_rusage: ::rusage, + /// rusage of children processes. + pub ki_rusage_ch: ::rusage, + // This is normally "struct pcb". + /// Kernel virtual addr of pcb. + pub ki_pcb: *mut ::c_void, + /// Kernel virtual addr of stack. + pub ki_kstack: *mut ::c_void, + /// User convenience pointer. + pub ki_udata: *mut ::c_void, + // This is normally "struct thread". + pub ki_tdaddr: *mut ::c_void, + pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR], + pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG], + /// PS_* flags. + pub ki_sflag: ::c_long, + /// kthread flag. + pub ki_tdflags: ::c_long, + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_reclen: u16, + pub d_type: u8, + // Type of `d_namlen` changed from `char` to `u16` in FreeBSD 12: + pub d_namlen: u8, + pub d_name: [::c_char; 256], + } + + pub struct statfs { + pub f_version: u32, + pub f_type: u32, + pub f_flags: u64, + pub f_bsize: u64, + pub f_iosize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: i64, + pub f_files: u64, + pub f_ffree: i64, + pub f_syncwrites: u64, + pub f_asyncwrites: u64, + pub f_syncreads: u64, + pub f_asyncreads: u64, + f_spare: [u64; 10], + pub f_namemax: u32, + pub f_owner: ::uid_t, + pub f_fsid: ::fsid_t, + f_charspare: [::c_char; 80], + pub f_fstypename: [::c_char; 16], + // Array length changed from 88 to 1024 in FreeBSD 12: + pub f_mntfromname: [::c_char; 88], + // Array length changed from 88 to 1024 in FreeBSD 12: + pub f_mntonname: [::c_char; 88], + } + + pub struct vnstat { + pub vn_fileid: u64, + pub vn_size: u64, + pub vn_mntdir: *mut ::c_char, + pub vn_dev: u32, + pub vn_fsid: u32, + pub vn_type: ::c_int, + pub vn_mode: u16, + pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_version == other.f_version + && self.f_type == other.f_type + && self.f_flags == other.f_flags + && self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncwrites == other.f_asyncwrites + && self.f_syncreads == other.f_syncreads + && self.f_asyncreads == other.f_asyncreads + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_fsid == other.f_fsid + && self.f_fstypename == other.f_fstypename + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_fsid", &self.f_fsid) + .field("f_fstypename", &self.f_fstypename) + .field("f_mntfromname", &&self.f_mntfromname[..]) + .field("f_mntonname", &&self.f_mntonname[..]) + .finish() + } + } + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_version.hash(state); + self.f_type.hash(state); + self.f_flags.hash(state); + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncwrites.hash(state); + self.f_syncreads.hash(state); + self.f_asyncreads.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_fsid.hash(state); + self.f_fstypename.hash(state); + self.f_mntfromname.hash(state); + self.f_mntonname.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self.d_namlen == other.d_namlen + && self + .d_name[..self.d_namlen as _] + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + .field("d_namlen", &self.d_namlen) + .field("d_name", &&self.d_name[..self.d_namlen as _]) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_namlen.hash(state); + self.d_name[..self.d_namlen as _].hash(state); + } + } + + impl PartialEq for vnstat { + fn eq(&self, other: &vnstat) -> bool { + let self_vn_devname: &[::c_char] = &self.vn_devname; + let other_vn_devname: &[::c_char] = &other.vn_devname; + + self.vn_fileid == other.vn_fileid && + self.vn_size == other.vn_size && + self.vn_mntdir == other.vn_mntdir && + self.vn_dev == other.vn_dev && + self.vn_fsid == other.vn_fsid && + self.vn_type == other.vn_type && + self.vn_mode == other.vn_mode && + self_vn_devname == other_vn_devname + } + } + impl Eq for vnstat {} + impl ::fmt::Debug for vnstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + f.debug_struct("vnstat") + .field("vn_fileid", &self.vn_fileid) + .field("vn_size", &self.vn_size) + .field("vn_mntdir", &self.vn_mntdir) + .field("vn_dev", &self.vn_dev) + .field("vn_fsid", &self.vn_fsid) + .field("vn_type", &self.vn_type) + .field("vn_mode", &self.vn_mode) + .field("vn_devname", &self_vn_devname) + .finish() + } + } + impl ::hash::Hash for vnstat { + fn hash(&self, state: &mut H) { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + self.vn_fileid.hash(state); + self.vn_size.hash(state); + self.vn_mntdir.hash(state); + self.vn_dev.hash(state); + self.vn_fsid.hash(state); + self.vn_type.hash(state); + self.vn_mode.hash(state); + self_vn_devname.hash(state); + } + } + } +} + +pub const ELAST: ::c_int = 96; +pub const RAND_MAX: ::c_int = 0x7fff_fffd; +pub const KI_NSPARE_PTR: usize = 6; +pub const MINCORE_SUPER: ::c_int = 0x20; +/// max length of devicename +pub const SPECNAMELEN: ::c_int = 63; + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + (major << 8) | minor + } +} + +f! { + pub fn major(dev: ::dev_t) -> ::c_int { + ((dev >> 8) & 0xff) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + (dev & 0xffff00ff) as ::c_int + } +} + +extern "C" { + // Return type ::c_int was removed in FreeBSD 12 + pub fn setgrent() -> ::c_int; + + // Type of `addr` argument changed from `const void*` to `void*` + // in FreeBSD 12 + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + + // Return type ::c_int was removed in FreeBSD 12 + pub fn freelocale(loc: ::locale_t) -> ::c_int; + + // Return type ::c_int changed to ::ssize_t in FreeBSD 12: + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::c_int; + + // Type of `path` argument changed from `const void*` to `void*` + // in FreeBSD 12 + pub fn dirname(path: *const ::c_char) -> *mut ::c_char; + pub fn basename(path: *const ::c_char) -> *mut ::c_char; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs new file mode 100644 index 0000000..80c6fa1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs @@ -0,0 +1,34 @@ +#[repr(C)] +#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] +pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + st_padding0: i16, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_padding1: i32, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u64, + pub st_spare: [u64; 10], +} + +impl ::Copy for ::stat {} +impl ::Clone for ::stat { + fn clone(&self) -> ::stat { + *self + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs new file mode 100644 index 0000000..10fcaa0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs @@ -0,0 +1,505 @@ +// APIs in FreeBSD 12 that have changed since 11. + +pub type nlink_t = u64; +pub type dev_t = u64; +pub type ino_t = ::c_ulong; +pub type shmatt_t = ::c_uint; + +s! { + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: i64, + pub udata: *mut ::c_void, + pub ext: [u64; 4], + } + + pub struct kvm_page { + pub version: ::c_uint, + pub paddr: ::c_ulong, + pub kmap_vaddr: ::c_ulong, + pub dmap_vaddr: ::c_ulong, + pub prot: ::vm_prot_t, + pub offset: ::u_long, + pub len: ::size_t, + } + + pub struct kinfo_proc { + /// Size of this structure. + pub ki_structsize: ::c_int, + /// Reserved: layout identifier. + pub ki_layout: ::c_int, + /// Address of command arguments. + pub ki_args: *mut ::pargs, + // This is normally "struct proc". + /// Address of proc. + pub ki_paddr: *mut ::c_void, + // This is normally "struct user". + /// Kernel virtual address of u-area. + pub ki_addr: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to trace file. + pub ki_tracep: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to executable file. + pub ki_textvp: *mut ::c_void, + // This is normally "struct filedesc". + /// Pointer to open file info. + pub ki_fd: *mut ::c_void, + // This is normally "struct vmspace". + /// Pointer to kernel vmspace struct. + pub ki_vmspace: *mut ::c_void, + /// Sleep address. + pub ki_wchan: *mut ::c_void, + /// Process identifier. + pub ki_pid: ::pid_t, + /// Parent process ID. + pub ki_ppid: ::pid_t, + /// Process group ID. + pub ki_pgid: ::pid_t, + /// tty process group ID. + pub ki_tpgid: ::pid_t, + /// Process session ID. + pub ki_sid: ::pid_t, + /// Terminal session ID. + pub ki_tsid: ::pid_t, + /// Job control counter. + pub ki_jobc: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short1: ::c_short, + /// Controlling tty dev. + pub ki_tdev_freebsd11: u32, + /// Signals arrived but not delivered. + pub ki_siglist: ::sigset_t, + /// Current signal mask. + pub ki_sigmask: ::sigset_t, + /// Signals being ignored. + pub ki_sigignore: ::sigset_t, + /// Signals being caught by user. + pub ki_sigcatch: ::sigset_t, + /// Effective user ID. + pub ki_uid: ::uid_t, + /// Real user ID. + pub ki_ruid: ::uid_t, + /// Saved effective user ID. + pub ki_svuid: ::uid_t, + /// Real group ID. + pub ki_rgid: ::gid_t, + /// Saved effective group ID. + pub ki_svgid: ::gid_t, + /// Number of groups. + pub ki_ngroups: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short2: ::c_short, + /// Groups. + pub ki_groups: [::gid_t; ::KI_NGROUPS], + /// Virtual size. + pub ki_size: ::vm_size_t, + /// Current resident set size in pages. + pub ki_rssize: ::segsz_t, + /// Resident set size before last swap. + pub ki_swrss: ::segsz_t, + /// Text size (pages) XXX. + pub ki_tsize: ::segsz_t, + /// Data size (pages) XXX. + pub ki_dsize: ::segsz_t, + /// Stack size (pages). + pub ki_ssize: ::segsz_t, + /// Exit status for wait & stop signal. + pub ki_xstat: ::u_short, + /// Accounting flags. + pub ki_acflag: ::u_short, + /// %cpu for process during `ki_swtime`. + pub ki_pctcpu: ::fixpt_t, + /// Time averaged value of `ki_cpticks`. + pub ki_estcpu: ::u_int, + /// Time since last blocked. + pub ki_slptime: ::u_int, + /// Time swapped in or out. + pub ki_swtime: ::u_int, + /// Number of copy-on-write faults. + pub ki_cow: ::u_int, + /// Real time in microsec. + pub ki_runtime: u64, + /// Starting time. + pub ki_start: ::timeval, + /// Time used by process children. + pub ki_childtime: ::timeval, + /// P_* flags. + pub ki_flag: ::c_long, + /// KI_* flags (below). + pub ki_kiflag: ::c_long, + /// Kernel trace points. + pub ki_traceflag: ::c_int, + /// S* process status. + pub ki_stat: ::c_char, + /// Process "nice" value. + pub ki_nice: i8, // signed char + /// Process lock (prevent swap) count. + pub ki_lock: ::c_char, + /// Run queue index. + pub ki_rqindex: ::c_char, + /// Which cpu we are on. + pub ki_oncpu_old: ::c_uchar, + /// Last cpu we were on. + pub ki_lastcpu_old: ::c_uchar, + /// Thread name. + pub ki_tdname: [::c_char; ::TDNAMLEN + 1], + /// Wchan message. + pub ki_wmesg: [::c_char; ::WMESGLEN + 1], + /// Setlogin name. + pub ki_login: [::c_char; ::LOGNAMELEN + 1], + /// Lock name. + pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1], + /// Command name. + pub ki_comm: [::c_char; ::COMMLEN + 1], + /// Emulation name. + pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1], + /// Login class. + pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1], + /// More thread name. + pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1], + /// Spare string space. + pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq + /// Spare room for growth. + pub ki_spareints: [::c_int; ::KI_NSPARE_INT], + /// Controlling tty dev. + pub ki_tdev: ::dev_t, + /// Which cpu we are on. + pub ki_oncpu: ::c_int, + /// Last cpu we were on. + pub ki_lastcpu: ::c_int, + /// PID of tracing process. + pub ki_tracer: ::c_int, + /// P2_* flags. + pub ki_flag2: ::c_int, + /// Default FIB number. + pub ki_fibnum: ::c_int, + /// Credential flags. + pub ki_cr_flags: ::u_int, + /// Process jail ID. + pub ki_jid: ::c_int, + /// Number of threads in total. + pub ki_numthreads: ::c_int, + /// Thread ID. + pub ki_tid: ::lwpid_t, + /// Process priority. + pub ki_pri: ::priority, + /// Process rusage statistics. + pub ki_rusage: ::rusage, + /// rusage of children processes. + pub ki_rusage_ch: ::rusage, + // This is normally "struct pcb". + /// Kernel virtual addr of pcb. + pub ki_pcb: *mut ::c_void, + /// Kernel virtual addr of stack. + pub ki_kstack: *mut ::c_void, + /// User convenience pointer. + pub ki_udata: *mut ::c_void, + // This is normally "struct thread". + pub ki_tdaddr: *mut ::c_void, + pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR], + pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG], + /// PS_* flags. + pub ki_sflag: ::c_long, + /// kthread flag. + pub ki_tdflags: ::c_long, + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_type: u8, + d_pad0: u8, + pub d_namlen: u16, + d_pad1: u16, + pub d_name: [::c_char; 256], + } + + pub struct statfs { + pub f_version: u32, + pub f_type: u32, + pub f_flags: u64, + pub f_bsize: u64, + pub f_iosize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: i64, + pub f_files: u64, + pub f_ffree: i64, + pub f_syncwrites: u64, + pub f_asyncwrites: u64, + pub f_syncreads: u64, + pub f_asyncreads: u64, + f_spare: [u64; 10], + pub f_namemax: u32, + pub f_owner: ::uid_t, + pub f_fsid: ::fsid_t, + f_charspare: [::c_char; 80], + pub f_fstypename: [::c_char; 16], + pub f_mntfromname: [::c_char; 1024], + pub f_mntonname: [::c_char; 1024], + } + + pub struct vnstat { + pub vn_fileid: u64, + pub vn_size: u64, + pub vn_dev: u64, + pub vn_fsid: u64, + pub vn_mntdir: *mut ::c_char, + pub vn_type: ::c_int, + pub vn_mode: u16, + pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_version == other.f_version + && self.f_type == other.f_type + && self.f_flags == other.f_flags + && self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncwrites == other.f_asyncwrites + && self.f_syncreads == other.f_syncreads + && self.f_asyncreads == other.f_asyncreads + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_fsid == other.f_fsid + && self.f_fstypename == other.f_fstypename + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_fsid", &self.f_fsid) + .field("f_fstypename", &self.f_fstypename) + .field("f_mntfromname", &&self.f_mntfromname[..]) + .field("f_mntonname", &&self.f_mntonname[..]) + .finish() + } + } + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_version.hash(state); + self.f_type.hash(state); + self.f_flags.hash(state); + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncwrites.hash(state); + self.f_syncreads.hash(state); + self.f_asyncreads.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_fsid.hash(state); + self.f_charspare.hash(state); + self.f_fstypename.hash(state); + self.f_mntfromname.hash(state); + self.f_mntonname.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self.d_namlen == other.d_namlen + && self + .d_name[..self.d_namlen as _] + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + .field("d_namlen", &self.d_namlen) + .field("d_name", &&self.d_name[..self.d_namlen as _]) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_namlen.hash(state); + self.d_name[..self.d_namlen as _].hash(state); + } + } + + impl PartialEq for vnstat { + fn eq(&self, other: &vnstat) -> bool { + let self_vn_devname: &[::c_char] = &self.vn_devname; + let other_vn_devname: &[::c_char] = &other.vn_devname; + + self.vn_fileid == other.vn_fileid && + self.vn_size == other.vn_size && + self.vn_dev == other.vn_dev && + self.vn_fsid == other.vn_fsid && + self.vn_mntdir == other.vn_mntdir && + self.vn_type == other.vn_type && + self.vn_mode == other.vn_mode && + self_vn_devname == other_vn_devname + } + } + impl Eq for vnstat {} + impl ::fmt::Debug for vnstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + f.debug_struct("vnstat") + .field("vn_fileid", &self.vn_fileid) + .field("vn_size", &self.vn_size) + .field("vn_dev", &self.vn_dev) + .field("vn_fsid", &self.vn_fsid) + .field("vn_mntdir", &self.vn_mntdir) + .field("vn_type", &self.vn_type) + .field("vn_mode", &self.vn_mode) + .field("vn_devname", &self_vn_devname) + .finish() + } + } + impl ::hash::Hash for vnstat { + fn hash(&self, state: &mut H) { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + self.vn_fileid.hash(state); + self.vn_size.hash(state); + self.vn_dev.hash(state); + self.vn_fsid.hash(state); + self.vn_mntdir.hash(state); + self.vn_type.hash(state); + self.vn_mode.hash(state); + self_vn_devname.hash(state); + } + } + } +} + +pub const RAND_MAX: ::c_int = 0x7fff_fffd; +pub const ELAST: ::c_int = 97; + +/// max length of devicename +pub const SPECNAMELEN: ::c_int = 63; +pub const KI_NSPARE_PTR: usize = 6; + +pub const MINCORE_SUPER: ::c_int = 0x20; + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= ((major & 0xffffff00) as dev_t) << 32; + dev |= ((major & 0x000000ff) as dev_t) << 8; + dev |= ((minor & 0x0000ff00) as dev_t) << 24; + dev |= ((minor & 0xffff00ff) as dev_t) << 0; + dev + } +} + +f! { + pub fn major(dev: ::dev_t) -> ::c_int { + (((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + (((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as ::c_int + } +} + +extern "C" { + pub fn setgrent(); + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn freelocale(loc: ::locale_t); + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs new file mode 100644 index 0000000..7bf2534 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs @@ -0,0 +1,5 @@ +pub const PROC_KPTI_CTL: ::c_int = ::PROC_PROCCTL_MD_MIN; +pub const PROC_KPTI_CTL_ENABLE_ON_EXEC: ::c_int = 1; +pub const PROC_KPTI_CTL_DISABLE_ON_EXEC: ::c_int = 2; +pub const PROC_KPTI_STATUS: ::c_int = ::PROC_PROCCTL_MD_MIN + 1; +pub const PROC_KPTI_STATUS_ACTIVE: ::c_int = 0x80000000; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs new file mode 100644 index 0000000..80c6fa1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs @@ -0,0 +1,34 @@ +#[repr(C)] +#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] +pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + st_padding0: i16, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_padding1: i32, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u64, + pub st_spare: [u64; 10], +} + +impl ::Copy for ::stat {} +impl ::Clone for ::stat { + fn clone(&self) -> ::stat { + *self + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs new file mode 100644 index 0000000..0e04a12 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs @@ -0,0 +1,546 @@ +// APIs in FreeBSD 14 that have changed since 11. + +pub type nlink_t = u64; +pub type dev_t = u64; +pub type ino_t = ::c_ulong; +pub type shmatt_t = ::c_uint; +pub type kpaddr_t = u64; +pub type kssize_t = i64; +pub type domainset_t = __c_anonymous_domainset; + +s! { + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: i64, + pub udata: *mut ::c_void, + pub ext: [u64; 4], + } + + pub struct kvm_page { + pub kp_version: ::u_int, + pub kp_paddr: ::kpaddr_t, + pub kp_kmap_vaddr: ::kvaddr_t, + pub kp_dmap_vaddr: ::kvaddr_t, + pub kp_prot: ::vm_prot_t, + pub kp_offset: ::off_t, + pub kp_len: ::size_t, + } + + pub struct __c_anonymous_domainset { + _priv: [::uintptr_t; 4], + } + + pub struct kinfo_proc { + /// Size of this structure. + pub ki_structsize: ::c_int, + /// Reserved: layout identifier. + pub ki_layout: ::c_int, + /// Address of command arguments. + pub ki_args: *mut ::pargs, + // This is normally "struct proc". + /// Address of proc. + pub ki_paddr: *mut ::c_void, + // This is normally "struct user". + /// Kernel virtual address of u-area. + pub ki_addr: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to trace file. + pub ki_tracep: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to executable file. + pub ki_textvp: *mut ::c_void, + // This is normally "struct filedesc". + /// Pointer to open file info. + pub ki_fd: *mut ::c_void, + // This is normally "struct vmspace". + /// Pointer to kernel vmspace struct. + pub ki_vmspace: *mut ::c_void, + /// Sleep address. + pub ki_wchan: *const ::c_void, + /// Process identifier. + pub ki_pid: ::pid_t, + /// Parent process ID. + pub ki_ppid: ::pid_t, + /// Process group ID. + pub ki_pgid: ::pid_t, + /// tty process group ID. + pub ki_tpgid: ::pid_t, + /// Process session ID. + pub ki_sid: ::pid_t, + /// Terminal session ID. + pub ki_tsid: ::pid_t, + /// Job control counter. + pub ki_jobc: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short1: ::c_short, + /// Controlling tty dev. + pub ki_tdev_freebsd11: u32, + /// Signals arrived but not delivered. + pub ki_siglist: ::sigset_t, + /// Current signal mask. + pub ki_sigmask: ::sigset_t, + /// Signals being ignored. + pub ki_sigignore: ::sigset_t, + /// Signals being caught by user. + pub ki_sigcatch: ::sigset_t, + /// Effective user ID. + pub ki_uid: ::uid_t, + /// Real user ID. + pub ki_ruid: ::uid_t, + /// Saved effective user ID. + pub ki_svuid: ::uid_t, + /// Real group ID. + pub ki_rgid: ::gid_t, + /// Saved effective group ID. + pub ki_svgid: ::gid_t, + /// Number of groups. + pub ki_ngroups: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short2: ::c_short, + /// Groups. + pub ki_groups: [::gid_t; ::KI_NGROUPS], + /// Virtual size. + pub ki_size: ::vm_size_t, + /// Current resident set size in pages. + pub ki_rssize: ::segsz_t, + /// Resident set size before last swap. + pub ki_swrss: ::segsz_t, + /// Text size (pages) XXX. + pub ki_tsize: ::segsz_t, + /// Data size (pages) XXX. + pub ki_dsize: ::segsz_t, + /// Stack size (pages). + pub ki_ssize: ::segsz_t, + /// Exit status for wait & stop signal. + pub ki_xstat: ::u_short, + /// Accounting flags. + pub ki_acflag: ::u_short, + /// %cpu for process during `ki_swtime`. + pub ki_pctcpu: ::fixpt_t, + /// Time averaged value of `ki_cpticks`. + pub ki_estcpu: ::u_int, + /// Time since last blocked. + pub ki_slptime: ::u_int, + /// Time swapped in or out. + pub ki_swtime: ::u_int, + /// Number of copy-on-write faults. + pub ki_cow: ::u_int, + /// Real time in microsec. + pub ki_runtime: u64, + /// Starting time. + pub ki_start: ::timeval, + /// Time used by process children. + pub ki_childtime: ::timeval, + /// P_* flags. + pub ki_flag: ::c_long, + /// KI_* flags (below). + pub ki_kiflag: ::c_long, + /// Kernel trace points. + pub ki_traceflag: ::c_int, + /// S* process status. + pub ki_stat: ::c_char, + /// Process "nice" value. + pub ki_nice: i8, // signed char + /// Process lock (prevent swap) count. + pub ki_lock: ::c_char, + /// Run queue index. + pub ki_rqindex: ::c_char, + /// Which cpu we are on. + pub ki_oncpu_old: ::c_uchar, + /// Last cpu we were on. + pub ki_lastcpu_old: ::c_uchar, + /// Thread name. + pub ki_tdname: [::c_char; ::TDNAMLEN + 1], + /// Wchan message. + pub ki_wmesg: [::c_char; ::WMESGLEN + 1], + /// Setlogin name. + pub ki_login: [::c_char; ::LOGNAMELEN + 1], + /// Lock name. + pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1], + /// Command name. + pub ki_comm: [::c_char; ::COMMLEN + 1], + /// Emulation name. + pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1], + /// Login class. + pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1], + /// More thread name. + pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1], + /// Spare string space. + pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq + /// Spare room for growth. + pub ki_spareints: [::c_int; ::KI_NSPARE_INT], + /// Controlling tty dev. + pub ki_tdev: u64, + /// Which cpu we are on. + pub ki_oncpu: ::c_int, + /// Last cpu we were on. + pub ki_lastcpu: ::c_int, + /// PID of tracing process. + pub ki_tracer: ::c_int, + /// P2_* flags. + pub ki_flag2: ::c_int, + /// Default FIB number. + pub ki_fibnum: ::c_int, + /// Credential flags. + pub ki_cr_flags: ::u_int, + /// Process jail ID. + pub ki_jid: ::c_int, + /// Number of threads in total. + pub ki_numthreads: ::c_int, + /// Thread ID. + pub ki_tid: ::lwpid_t, + /// Process priority. + pub ki_pri: ::priority, + /// Process rusage statistics. + pub ki_rusage: ::rusage, + /// rusage of children processes. + pub ki_rusage_ch: ::rusage, + // This is normally "struct pcb". + /// Kernel virtual addr of pcb. + pub ki_pcb: *mut ::c_void, + /// Kernel virtual addr of stack. + pub ki_kstack: *mut ::c_void, + /// User convenience pointer. + pub ki_udata: *mut ::c_void, + // This is normally "struct thread". + pub ki_tdaddr: *mut ::c_void, + // This is normally "struct pwddesc". + /// Pointer to process paths info. + pub ki_pd: *mut ::c_void, + pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR], + pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG], + /// PS_* flags. + pub ki_sflag: ::c_long, + /// kthread flag. + pub ki_tdflags: ::c_long, + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_type: u8, + d_pad0: u8, + pub d_namlen: u16, + d_pad1: u16, + pub d_name: [::c_char; 256], + } + + pub struct statfs { + pub f_version: u32, + pub f_type: u32, + pub f_flags: u64, + pub f_bsize: u64, + pub f_iosize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: i64, + pub f_files: u64, + pub f_ffree: i64, + pub f_syncwrites: u64, + pub f_asyncwrites: u64, + pub f_syncreads: u64, + pub f_asyncreads: u64, + f_spare: [u64; 10], + pub f_namemax: u32, + pub f_owner: ::uid_t, + pub f_fsid: ::fsid_t, + f_charspare: [::c_char; 80], + pub f_fstypename: [::c_char; 16], + pub f_mntfromname: [::c_char; 1024], + pub f_mntonname: [::c_char; 1024], + } + + pub struct vnstat { + pub vn_fileid: u64, + pub vn_size: u64, + pub vn_dev: u64, + pub vn_fsid: u64, + pub vn_mntdir: *mut ::c_char, + pub vn_type: ::c_int, + pub vn_mode: u16, + pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_version == other.f_version + && self.f_type == other.f_type + && self.f_flags == other.f_flags + && self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncwrites == other.f_asyncwrites + && self.f_syncreads == other.f_syncreads + && self.f_asyncreads == other.f_asyncreads + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_fsid == other.f_fsid + && self.f_fstypename == other.f_fstypename + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_fsid", &self.f_fsid) + .field("f_fstypename", &self.f_fstypename) + .field("f_mntfromname", &&self.f_mntfromname[..]) + .field("f_mntonname", &&self.f_mntonname[..]) + .finish() + } + } + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_version.hash(state); + self.f_type.hash(state); + self.f_flags.hash(state); + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncwrites.hash(state); + self.f_syncreads.hash(state); + self.f_asyncreads.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_fsid.hash(state); + self.f_charspare.hash(state); + self.f_fstypename.hash(state); + self.f_mntfromname.hash(state); + self.f_mntonname.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self.d_namlen == other.d_namlen + && self + .d_name[..self.d_namlen as _] + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + .field("d_namlen", &self.d_namlen) + .field("d_name", &&self.d_name[..self.d_namlen as _]) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_namlen.hash(state); + self.d_name[..self.d_namlen as _].hash(state); + } + } + + impl PartialEq for vnstat { + fn eq(&self, other: &vnstat) -> bool { + let self_vn_devname: &[::c_char] = &self.vn_devname; + let other_vn_devname: &[::c_char] = &other.vn_devname; + + self.vn_fileid == other.vn_fileid && + self.vn_size == other.vn_size && + self.vn_dev == other.vn_dev && + self.vn_fsid == other.vn_fsid && + self.vn_mntdir == other.vn_mntdir && + self.vn_type == other.vn_type && + self.vn_mode == other.vn_mode && + self_vn_devname == other_vn_devname + } + } + impl Eq for vnstat {} + impl ::fmt::Debug for vnstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + f.debug_struct("vnstat") + .field("vn_fileid", &self.vn_fileid) + .field("vn_size", &self.vn_size) + .field("vn_dev", &self.vn_dev) + .field("vn_fsid", &self.vn_fsid) + .field("vn_mntdir", &self.vn_mntdir) + .field("vn_type", &self.vn_type) + .field("vn_mode", &self.vn_mode) + .field("vn_devname", &self_vn_devname) + .finish() + } + } + impl ::hash::Hash for vnstat { + fn hash(&self, state: &mut H) { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + self.vn_fileid.hash(state); + self.vn_size.hash(state); + self.vn_dev.hash(state); + self.vn_fsid.hash(state); + self.vn_mntdir.hash(state); + self.vn_type.hash(state); + self.vn_mode.hash(state); + self_vn_devname.hash(state); + } + } + } +} + +pub const RAND_MAX: ::c_int = 0x7fff_ffff; +pub const ELAST: ::c_int = 97; + +pub const KF_TYPE_EVENTFD: ::c_int = 13; + +/// max length of devicename +pub const SPECNAMELEN: ::c_int = 255; +pub const KI_NSPARE_PTR: usize = 5; + +/// domainset policies +pub const DOMAINSET_POLICY_INVALID: ::c_int = 0; +pub const DOMAINSET_POLICY_ROUNDROBIN: ::c_int = 1; +pub const DOMAINSET_POLICY_FIRSTTOUCH: ::c_int = 2; +pub const DOMAINSET_POLICY_PREFER: ::c_int = 3; +pub const DOMAINSET_POLICY_INTERLEAVE: ::c_int = 4; + +pub const MINCORE_SUPER: ::c_int = 0x20; + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= ((major & 0xffffff00) as dev_t) << 32; + dev |= ((major & 0x000000ff) as dev_t) << 8; + dev |= ((minor & 0x0000ff00) as dev_t) << 24; + dev |= ((minor & 0xffff00ff) as dev_t) << 0; + dev + } +} + +f! { + pub fn major(dev: ::dev_t) -> ::c_int { + (((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + (((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as ::c_int + } +} + +extern "C" { + pub fn setgrent(); + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn freelocale(loc: ::locale_t); + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + + pub fn cpuset_getdomain( + level: ::cpulevel_t, + which: ::cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *mut ::domainset_t, + policy: *mut ::c_int, + ) -> ::c_int; + pub fn cpuset_setdomain( + level: ::cpulevel_t, + which: ::cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *const ::domainset_t, + policy: ::c_int, + ) -> ::c_int; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +#[link(name = "kvm")] +extern "C" { + pub fn kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs new file mode 100644 index 0000000..7bf2534 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs @@ -0,0 +1,5 @@ +pub const PROC_KPTI_CTL: ::c_int = ::PROC_PROCCTL_MD_MIN; +pub const PROC_KPTI_CTL_ENABLE_ON_EXEC: ::c_int = 1; +pub const PROC_KPTI_CTL_DISABLE_ON_EXEC: ::c_int = 2; +pub const PROC_KPTI_STATUS: ::c_int = ::PROC_PROCCTL_MD_MIN + 1; +pub const PROC_KPTI_STATUS_ACTIVE: ::c_int = 0x80000000; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs new file mode 100644 index 0000000..80c6fa1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs @@ -0,0 +1,34 @@ +#[repr(C)] +#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))] +pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + st_padding0: i16, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_padding1: i32, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u64, + pub st_spare: [u64; 10], +} + +impl ::Copy for ::stat {} +impl ::Clone for ::stat { + fn clone(&self) -> ::stat { + *self + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs new file mode 100644 index 0000000..a86ca6e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs @@ -0,0 +1,546 @@ +// APIs in FreeBSD 13 that have changed since 11. + +pub type nlink_t = u64; +pub type dev_t = u64; +pub type ino_t = ::c_ulong; +pub type shmatt_t = ::c_uint; +pub type kpaddr_t = u64; +pub type kssize_t = i64; +pub type domainset_t = __c_anonymous_domainset; + +s! { + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: i64, + pub udata: *mut ::c_void, + pub ext: [u64; 4], + } + + pub struct kvm_page { + pub kp_version: ::u_int, + pub kp_paddr: ::kpaddr_t, + pub kp_kmap_vaddr: ::kvaddr_t, + pub kp_dmap_vaddr: ::kvaddr_t, + pub kp_prot: ::vm_prot_t, + pub kp_offset: ::off_t, + pub kp_len: ::size_t, + } + + pub struct __c_anonymous_domainset { + _priv: [::uintptr_t; 4], + } + + pub struct kinfo_proc { + /// Size of this structure. + pub ki_structsize: ::c_int, + /// Reserved: layout identifier. + pub ki_layout: ::c_int, + /// Address of command arguments. + pub ki_args: *mut ::pargs, + // This is normally "struct proc". + /// Address of proc. + pub ki_paddr: *mut ::c_void, + // This is normally "struct user". + /// Kernel virtual address of u-area. + pub ki_addr: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to trace file. + pub ki_tracep: *mut ::c_void, + // This is normally "struct vnode". + /// Pointer to executable file. + pub ki_textvp: *mut ::c_void, + // This is normally "struct filedesc". + /// Pointer to open file info. + pub ki_fd: *mut ::c_void, + // This is normally "struct vmspace". + /// Pointer to kernel vmspace struct. + pub ki_vmspace: *mut ::c_void, + /// Sleep address. + pub ki_wchan: *const ::c_void, + /// Process identifier. + pub ki_pid: ::pid_t, + /// Parent process ID. + pub ki_ppid: ::pid_t, + /// Process group ID. + pub ki_pgid: ::pid_t, + /// tty process group ID. + pub ki_tpgid: ::pid_t, + /// Process session ID. + pub ki_sid: ::pid_t, + /// Terminal session ID. + pub ki_tsid: ::pid_t, + /// Job control counter. + pub ki_jobc: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short1: ::c_short, + /// Controlling tty dev. + pub ki_tdev_freebsd11: u32, + /// Signals arrived but not delivered. + pub ki_siglist: ::sigset_t, + /// Current signal mask. + pub ki_sigmask: ::sigset_t, + /// Signals being ignored. + pub ki_sigignore: ::sigset_t, + /// Signals being caught by user. + pub ki_sigcatch: ::sigset_t, + /// Effective user ID. + pub ki_uid: ::uid_t, + /// Real user ID. + pub ki_ruid: ::uid_t, + /// Saved effective user ID. + pub ki_svuid: ::uid_t, + /// Real group ID. + pub ki_rgid: ::gid_t, + /// Saved effective group ID. + pub ki_svgid: ::gid_t, + /// Number of groups. + pub ki_ngroups: ::c_short, + /// Unused (just here for alignment). + pub ki_spare_short2: ::c_short, + /// Groups. + pub ki_groups: [::gid_t; ::KI_NGROUPS], + /// Virtual size. + pub ki_size: ::vm_size_t, + /// Current resident set size in pages. + pub ki_rssize: ::segsz_t, + /// Resident set size before last swap. + pub ki_swrss: ::segsz_t, + /// Text size (pages) XXX. + pub ki_tsize: ::segsz_t, + /// Data size (pages) XXX. + pub ki_dsize: ::segsz_t, + /// Stack size (pages). + pub ki_ssize: ::segsz_t, + /// Exit status for wait & stop signal. + pub ki_xstat: ::u_short, + /// Accounting flags. + pub ki_acflag: ::u_short, + /// %cpu for process during `ki_swtime`. + pub ki_pctcpu: ::fixpt_t, + /// Time averaged value of `ki_cpticks`. + pub ki_estcpu: ::u_int, + /// Time since last blocked. + pub ki_slptime: ::u_int, + /// Time swapped in or out. + pub ki_swtime: ::u_int, + /// Number of copy-on-write faults. + pub ki_cow: ::u_int, + /// Real time in microsec. + pub ki_runtime: u64, + /// Starting time. + pub ki_start: ::timeval, + /// Time used by process children. + pub ki_childtime: ::timeval, + /// P_* flags. + pub ki_flag: ::c_long, + /// KI_* flags (below). + pub ki_kiflag: ::c_long, + /// Kernel trace points. + pub ki_traceflag: ::c_int, + /// S* process status. + pub ki_stat: ::c_char, + /// Process "nice" value. + pub ki_nice: i8, // signed char + /// Process lock (prevent swap) count. + pub ki_lock: ::c_char, + /// Run queue index. + pub ki_rqindex: ::c_char, + /// Which cpu we are on. + pub ki_oncpu_old: ::c_uchar, + /// Last cpu we were on. + pub ki_lastcpu_old: ::c_uchar, + /// Thread name. + pub ki_tdname: [::c_char; ::TDNAMLEN + 1], + /// Wchan message. + pub ki_wmesg: [::c_char; ::WMESGLEN + 1], + /// Setlogin name. + pub ki_login: [::c_char; ::LOGNAMELEN + 1], + /// Lock name. + pub ki_lockname: [::c_char; ::LOCKNAMELEN + 1], + /// Command name. + pub ki_comm: [::c_char; ::COMMLEN + 1], + /// Emulation name. + pub ki_emul: [::c_char; ::KI_EMULNAMELEN + 1], + /// Login class. + pub ki_loginclass: [::c_char; ::LOGINCLASSLEN + 1], + /// More thread name. + pub ki_moretdname: [::c_char; ::MAXCOMLEN - ::TDNAMLEN + 1], + /// Spare string space. + pub ki_sparestrings: [[::c_char; 23]; 2], // little hack to allow PartialEq + /// Spare room for growth. + pub ki_spareints: [::c_int; ::KI_NSPARE_INT], + /// Controlling tty dev. + pub ki_tdev: u64, + /// Which cpu we are on. + pub ki_oncpu: ::c_int, + /// Last cpu we were on. + pub ki_lastcpu: ::c_int, + /// PID of tracing process. + pub ki_tracer: ::c_int, + /// P2_* flags. + pub ki_flag2: ::c_int, + /// Default FIB number. + pub ki_fibnum: ::c_int, + /// Credential flags. + pub ki_cr_flags: ::u_int, + /// Process jail ID. + pub ki_jid: ::c_int, + /// Number of threads in total. + pub ki_numthreads: ::c_int, + /// Thread ID. + pub ki_tid: ::lwpid_t, + /// Process priority. + pub ki_pri: ::priority, + /// Process rusage statistics. + pub ki_rusage: ::rusage, + /// rusage of children processes. + pub ki_rusage_ch: ::rusage, + // This is normally "struct pcb". + /// Kernel virtual addr of pcb. + pub ki_pcb: *mut ::c_void, + /// Kernel virtual addr of stack. + pub ki_kstack: *mut ::c_void, + /// User convenience pointer. + pub ki_udata: *mut ::c_void, + // This is normally "struct thread". + pub ki_tdaddr: *mut ::c_void, + // This is normally "struct pwddesc". + /// Pointer to process paths info. + pub ki_pd: *mut ::c_void, + pub ki_spareptrs: [*mut ::c_void; ::KI_NSPARE_PTR], + pub ki_sparelongs: [::c_long; ::KI_NSPARE_LONG], + /// PS_* flags. + pub ki_sflag: ::c_long, + /// kthread flag. + pub ki_tdflags: ::c_long, + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_type: u8, + d_pad0: u8, + pub d_namlen: u16, + d_pad1: u16, + pub d_name: [::c_char; 256], + } + + pub struct statfs { + pub f_version: u32, + pub f_type: u32, + pub f_flags: u64, + pub f_bsize: u64, + pub f_iosize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: i64, + pub f_files: u64, + pub f_ffree: i64, + pub f_syncwrites: u64, + pub f_asyncwrites: u64, + pub f_syncreads: u64, + pub f_asyncreads: u64, + f_spare: [u64; 10], + pub f_namemax: u32, + pub f_owner: ::uid_t, + pub f_fsid: ::fsid_t, + f_charspare: [::c_char; 80], + pub f_fstypename: [::c_char; 16], + pub f_mntfromname: [::c_char; 1024], + pub f_mntonname: [::c_char; 1024], + } + + pub struct vnstat { + pub vn_fileid: u64, + pub vn_size: u64, + pub vn_dev: u64, + pub vn_fsid: u64, + pub vn_mntdir: *mut ::c_char, + pub vn_type: ::c_int, + pub vn_mode: u16, + pub vn_devname: [::c_char; ::SPECNAMELEN as usize + 1], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_version == other.f_version + && self.f_type == other.f_type + && self.f_flags == other.f_flags + && self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncwrites == other.f_asyncwrites + && self.f_syncreads == other.f_syncreads + && self.f_asyncreads == other.f_asyncreads + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_fsid == other.f_fsid + && self.f_fstypename == other.f_fstypename + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statfs {} + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_fsid", &self.f_fsid) + .field("f_fstypename", &self.f_fstypename) + .field("f_mntfromname", &&self.f_mntfromname[..]) + .field("f_mntonname", &&self.f_mntonname[..]) + .finish() + } + } + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_version.hash(state); + self.f_type.hash(state); + self.f_flags.hash(state); + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncwrites.hash(state); + self.f_syncreads.hash(state); + self.f_asyncreads.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_fsid.hash(state); + self.f_charspare.hash(state); + self.f_fstypename.hash(state); + self.f_mntfromname.hash(state); + self.f_mntonname.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self.d_namlen == other.d_namlen + && self + .d_name[..self.d_namlen as _] + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + .field("d_namlen", &self.d_namlen) + .field("d_name", &&self.d_name[..self.d_namlen as _]) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_namlen.hash(state); + self.d_name[..self.d_namlen as _].hash(state); + } + } + + impl PartialEq for vnstat { + fn eq(&self, other: &vnstat) -> bool { + let self_vn_devname: &[::c_char] = &self.vn_devname; + let other_vn_devname: &[::c_char] = &other.vn_devname; + + self.vn_fileid == other.vn_fileid && + self.vn_size == other.vn_size && + self.vn_dev == other.vn_dev && + self.vn_fsid == other.vn_fsid && + self.vn_mntdir == other.vn_mntdir && + self.vn_type == other.vn_type && + self.vn_mode == other.vn_mode && + self_vn_devname == other_vn_devname + } + } + impl Eq for vnstat {} + impl ::fmt::Debug for vnstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + f.debug_struct("vnstat") + .field("vn_fileid", &self.vn_fileid) + .field("vn_size", &self.vn_size) + .field("vn_dev", &self.vn_dev) + .field("vn_fsid", &self.vn_fsid) + .field("vn_mntdir", &self.vn_mntdir) + .field("vn_type", &self.vn_type) + .field("vn_mode", &self.vn_mode) + .field("vn_devname", &self_vn_devname) + .finish() + } + } + impl ::hash::Hash for vnstat { + fn hash(&self, state: &mut H) { + let self_vn_devname: &[::c_char] = &self.vn_devname; + + self.vn_fileid.hash(state); + self.vn_size.hash(state); + self.vn_dev.hash(state); + self.vn_fsid.hash(state); + self.vn_mntdir.hash(state); + self.vn_type.hash(state); + self.vn_mode.hash(state); + self_vn_devname.hash(state); + } + } + } +} + +pub const RAND_MAX: ::c_int = 0x7fff_ffff; +pub const ELAST: ::c_int = 97; + +pub const KF_TYPE_EVENTFD: ::c_int = 13; + +/// max length of devicename +pub const SPECNAMELEN: ::c_int = 255; +pub const KI_NSPARE_PTR: usize = 5; + +/// domainset policies +pub const DOMAINSET_POLICY_INVALID: ::c_int = 0; +pub const DOMAINSET_POLICY_ROUNDROBIN: ::c_int = 1; +pub const DOMAINSET_POLICY_FIRSTTOUCH: ::c_int = 2; +pub const DOMAINSET_POLICY_PREFER: ::c_int = 3; +pub const DOMAINSET_POLICY_INTERLEAVE: ::c_int = 4; + +pub const MINCORE_SUPER: ::c_int = 0x60; + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= ((major & 0xffffff00) as dev_t) << 32; + dev |= ((major & 0x000000ff) as dev_t) << 8; + dev |= ((minor & 0x0000ff00) as dev_t) << 24; + dev |= ((minor & 0xffff00ff) as dev_t) << 0; + dev + } +} + +f! { + pub fn major(dev: ::dev_t) -> ::c_int { + (((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + (((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as ::c_int + } +} + +extern "C" { + pub fn setgrent(); + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn freelocale(loc: ::locale_t); + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + + pub fn cpuset_getdomain( + level: ::cpulevel_t, + which: ::cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *mut ::domainset_t, + policy: *mut ::c_int, + ) -> ::c_int; + pub fn cpuset_setdomain( + level: ::cpulevel_t, + which: ::cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *const ::domainset_t, + policy: ::c_int, + ) -> ::c_int; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +#[link(name = "kvm")] +extern "C" { + pub fn kvm_kerndisp(kd: *mut ::kvm_t) -> ::kssize_t; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs new file mode 100644 index 0000000..01d0b43 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs @@ -0,0 +1,12 @@ +pub const PROC_KPTI_CTL: ::c_int = ::PROC_PROCCTL_MD_MIN; +pub const PROC_KPTI_CTL_ENABLE_ON_EXEC: ::c_int = 1; +pub const PROC_KPTI_CTL_DISABLE_ON_EXEC: ::c_int = 2; +pub const PROC_KPTI_STATUS: ::c_int = ::PROC_PROCCTL_MD_MIN + 1; +pub const PROC_KPTI_STATUS_ACTIVE: ::c_int = 0x80000000; +pub const PROC_LA_CTL: ::c_int = ::PROC_PROCCTL_MD_MIN + 2; +pub const PROC_LA_STATUS: ::c_int = ::PROC_PROCCTL_MD_MIN + 3; +pub const PROC_LA_CTL_LA48_ON_EXEC: ::c_int = 1; +pub const PROC_LA_CTL_LA57_ON_EXEC: ::c_int = 2; +pub const PROC_LA_CTL_DEFAULT_ON_EXEC: ::c_int = 3; +pub const PROC_LA_STATUS_LA48: ::c_int = 0x01000000; +pub const PROC_LA_STATUS_LA57: ::c_int = 0x02000000; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs new file mode 100644 index 0000000..4138af5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs @@ -0,0 +1,5692 @@ +pub type fflags_t = u32; +pub type clock_t = i32; + +pub type vm_prot_t = u_char; +pub type kvaddr_t = u64; +pub type segsz_t = isize; +pub type __fixpt_t = u32; +pub type fixpt_t = __fixpt_t; +pub type __lwpid_t = i32; +pub type lwpid_t = __lwpid_t; +pub type blksize_t = i32; +pub type clockid_t = ::c_int; +pub type sem_t = _sem; +pub type timer_t = *mut __c_anonymous__timer; + +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type idtype_t = ::c_uint; + +pub type msglen_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; + +pub type cpulevel_t = ::c_int; +pub type cpuwhich_t = ::c_int; + +pub type mqd_t = *mut ::c_void; +pub type posix_spawnattr_t = *mut ::c_void; +pub type posix_spawn_file_actions_t = *mut ::c_void; + +pub type pthread_spinlock_t = *mut __c_anonymous_pthread_spinlock; +pub type pthread_barrierattr_t = *mut __c_anonymous_pthread_barrierattr; +pub type pthread_barrier_t = *mut __c_anonymous_pthread_barrier; + +pub type uuid_t = ::uuid; +pub type u_int = ::c_uint; +pub type u_char = ::c_uchar; +pub type u_long = ::c_ulong; +pub type u_short = ::c_ushort; + +pub type caddr_t = *mut ::c_char; + +pub type fhandle_t = fhandle; + +pub type au_id_t = ::uid_t; +pub type au_asid_t = ::pid_t; + +pub type cpusetid_t = ::c_int; + +pub type sctp_assoc_t = u32; + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_support_flags { + DEVSTAT_ALL_SUPPORTED = 0x00, + DEVSTAT_NO_BLOCKSIZE = 0x01, + DEVSTAT_NO_ORDERED_TAGS = 0x02, + DEVSTAT_BS_UNAVAILABLE = 0x04, +} +impl ::Copy for devstat_support_flags {} +impl ::Clone for devstat_support_flags { + fn clone(&self) -> devstat_support_flags { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_trans_flags { + DEVSTAT_NO_DATA = 0x00, + DEVSTAT_READ = 0x01, + DEVSTAT_WRITE = 0x02, + DEVSTAT_FREE = 0x03, +} + +impl ::Copy for devstat_trans_flags {} +impl ::Clone for devstat_trans_flags { + fn clone(&self) -> devstat_trans_flags { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_tag_type { + DEVSTAT_TAG_SIMPLE = 0x00, + DEVSTAT_TAG_HEAD = 0x01, + DEVSTAT_TAG_ORDERED = 0x02, + DEVSTAT_TAG_NONE = 0x03, +} +impl ::Copy for devstat_tag_type {} +impl ::Clone for devstat_tag_type { + fn clone(&self) -> devstat_tag_type { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_match_flags { + DEVSTAT_MATCH_NONE = 0x00, + DEVSTAT_MATCH_TYPE = 0x01, + DEVSTAT_MATCH_IF = 0x02, + DEVSTAT_MATCH_PASS = 0x04, +} +impl ::Copy for devstat_match_flags {} +impl ::Clone for devstat_match_flags { + fn clone(&self) -> devstat_match_flags { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_priority { + DEVSTAT_PRIORITY_MIN = 0x000, + DEVSTAT_PRIORITY_OTHER = 0x020, + DEVSTAT_PRIORITY_PASS = 0x030, + DEVSTAT_PRIORITY_FD = 0x040, + DEVSTAT_PRIORITY_WFD = 0x050, + DEVSTAT_PRIORITY_TAPE = 0x060, + DEVSTAT_PRIORITY_CD = 0x090, + DEVSTAT_PRIORITY_DISK = 0x110, + DEVSTAT_PRIORITY_ARRAY = 0x120, + DEVSTAT_PRIORITY_MAX = 0xfff, +} +impl ::Copy for devstat_priority {} +impl ::Clone for devstat_priority { + fn clone(&self) -> devstat_priority { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_type_flags { + DEVSTAT_TYPE_DIRECT = 0x000, + DEVSTAT_TYPE_SEQUENTIAL = 0x001, + DEVSTAT_TYPE_PRINTER = 0x002, + DEVSTAT_TYPE_PROCESSOR = 0x003, + DEVSTAT_TYPE_WORM = 0x004, + DEVSTAT_TYPE_CDROM = 0x005, + DEVSTAT_TYPE_SCANNER = 0x006, + DEVSTAT_TYPE_OPTICAL = 0x007, + DEVSTAT_TYPE_CHANGER = 0x008, + DEVSTAT_TYPE_COMM = 0x009, + DEVSTAT_TYPE_ASC0 = 0x00a, + DEVSTAT_TYPE_ASC1 = 0x00b, + DEVSTAT_TYPE_STORARRAY = 0x00c, + DEVSTAT_TYPE_ENCLOSURE = 0x00d, + DEVSTAT_TYPE_FLOPPY = 0x00e, + DEVSTAT_TYPE_MASK = 0x00f, + DEVSTAT_TYPE_IF_SCSI = 0x010, + DEVSTAT_TYPE_IF_IDE = 0x020, + DEVSTAT_TYPE_IF_OTHER = 0x030, + DEVSTAT_TYPE_IF_MASK = 0x0f0, + DEVSTAT_TYPE_PASS = 0x100, +} +impl ::Copy for devstat_type_flags {} +impl ::Clone for devstat_type_flags { + fn clone(&self) -> devstat_type_flags { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_metric { + DSM_NONE, + DSM_TOTAL_BYTES, + DSM_TOTAL_BYTES_READ, + DSM_TOTAL_BYTES_WRITE, + DSM_TOTAL_TRANSFERS, + DSM_TOTAL_TRANSFERS_READ, + DSM_TOTAL_TRANSFERS_WRITE, + DSM_TOTAL_TRANSFERS_OTHER, + DSM_TOTAL_BLOCKS, + DSM_TOTAL_BLOCKS_READ, + DSM_TOTAL_BLOCKS_WRITE, + DSM_KB_PER_TRANSFER, + DSM_KB_PER_TRANSFER_READ, + DSM_KB_PER_TRANSFER_WRITE, + DSM_TRANSFERS_PER_SECOND, + DSM_TRANSFERS_PER_SECOND_READ, + DSM_TRANSFERS_PER_SECOND_WRITE, + DSM_TRANSFERS_PER_SECOND_OTHER, + DSM_MB_PER_SECOND, + DSM_MB_PER_SECOND_READ, + DSM_MB_PER_SECOND_WRITE, + DSM_BLOCKS_PER_SECOND, + DSM_BLOCKS_PER_SECOND_READ, + DSM_BLOCKS_PER_SECOND_WRITE, + DSM_MS_PER_TRANSACTION, + DSM_MS_PER_TRANSACTION_READ, + DSM_MS_PER_TRANSACTION_WRITE, + DSM_SKIP, + DSM_TOTAL_BYTES_FREE, + DSM_TOTAL_TRANSFERS_FREE, + DSM_TOTAL_BLOCKS_FREE, + DSM_KB_PER_TRANSFER_FREE, + DSM_MB_PER_SECOND_FREE, + DSM_TRANSFERS_PER_SECOND_FREE, + DSM_BLOCKS_PER_SECOND_FREE, + DSM_MS_PER_TRANSACTION_OTHER, + DSM_MS_PER_TRANSACTION_FREE, + DSM_BUSY_PCT, + DSM_QUEUE_LENGTH, + DSM_TOTAL_DURATION, + DSM_TOTAL_DURATION_READ, + DSM_TOTAL_DURATION_WRITE, + DSM_TOTAL_DURATION_FREE, + DSM_TOTAL_DURATION_OTHER, + DSM_TOTAL_BUSY_TIME, + DSM_MAX, +} +impl ::Copy for devstat_metric {} +impl ::Clone for devstat_metric { + fn clone(&self) -> devstat_metric { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug, Hash, PartialEq, Eq))] +#[repr(u32)] +pub enum devstat_select_mode { + DS_SELECT_ADD, + DS_SELECT_ONLY, + DS_SELECT_REMOVE, + DS_SELECT_ADDONLY, +} +impl ::Copy for devstat_select_mode {} +impl ::Clone for devstat_select_mode { + fn clone(&self) -> devstat_select_mode { + *self + } +} + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + __unused1: [::c_int; 2], + __unused2: *mut ::c_void, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + // unused 3 through 5 are the __aiocb_private structure + __unused3: ::c_long, + __unused4: ::c_long, + __unused5: *mut ::c_void, + pub aio_sigevent: sigevent + } + + pub struct jail { + pub version: u32, + pub path: *mut ::c_char, + pub hostname: *mut ::c_char, + pub jailname: *mut ::c_char, + pub ip4s: ::c_uint, + pub ip6s: ::c_uint, + pub ip4: *mut ::in_addr, + pub ip6: *mut ::in6_addr, + } + + pub struct statvfs { + pub f_bavail: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_blocks: ::fsblkcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_bsize: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_fsid: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + // internal structure has changed over time + pub struct _sem { + data: [u32; 4], + } + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + pub msg_cbytes: ::msglen_t, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::ssize_t, + } + + pub struct sockcred { + pub sc_uid: ::uid_t, + pub sc_euid: ::uid_t, + pub sc_gid: ::gid_t, + pub sc_egid: ::gid_t, + pub sc_ngroups: ::c_int, + pub sc_groups: [::gid_t; 1], + } + + pub struct ptrace_vm_entry { + pub pve_entry: ::c_int, + pub pve_timestamp: ::c_int, + pub pve_start: ::c_ulong, + pub pve_end: ::c_ulong, + pub pve_offset: ::c_ulong, + pub pve_prot: ::c_uint, + pub pve_pathlen: ::c_uint, + pub pve_fileid: ::c_long, + pub pve_fsid: u32, + pub pve_path: *mut ::c_char, + } + + pub struct ptrace_lwpinfo { + pub pl_lwpid: lwpid_t, + pub pl_event: ::c_int, + pub pl_flags: ::c_int, + pub pl_sigmask: ::sigset_t, + pub pl_siglist: ::sigset_t, + pub pl_siginfo: ::siginfo_t, + pub pl_tdname: [::c_char; ::MAXCOMLEN as usize + 1], + pub pl_child_pid: ::pid_t, + pub pl_syscall_code: ::c_uint, + pub pl_syscall_narg: ::c_uint, + } + + pub struct ptrace_sc_ret { + pub sr_retval: [::register_t; 2], + pub sr_error: ::c_int, + } + + pub struct ptrace_coredump { + pub pc_fd: ::c_int, + pub pc_flags: u32, + pub pc_limit: ::off_t, + } + + pub struct ptrace_sc_remote { + pub pscr_ret: ptrace_sc_ret, + pub pscr_syscall: ::c_uint, + pub pscr_nargs: ::c_uint, + pub pscr_args: *mut ::register_t, + } + + pub struct cpuset_t { + #[cfg(target_pointer_width = "64")] + __bits: [::c_long; 4], + #[cfg(target_pointer_width = "32")] + __bits: [::c_long; 8], + } + + pub struct cap_rights_t { + cr_rights: [u64; 2], + } + + pub struct umutex { + m_owner: ::lwpid_t, + m_flags: u32, + m_ceilings: [u32; 2], + m_rb_link: ::uintptr_t, + #[cfg(target_pointer_width = "32")] + m_pad: u32, + m_spare: [u32; 2], + + } + + pub struct ucond { + c_has_waiters: u32, + c_flags: u32, + c_clockid: u32, + c_spare: [u32; 1], + } + + pub struct uuid { + pub time_low: u32, + pub time_mid: u16, + pub time_hi_and_version: u16, + pub clock_seq_hi_and_reserved: u8, + pub clock_seq_low: u8, + pub node: [u8; _UUID_NODE_LEN], + } + + pub struct __c_anonymous_pthread_spinlock { + s_clock: umutex, + } + + pub struct __c_anonymous_pthread_barrierattr { + pshared: ::c_int, + } + + pub struct __c_anonymous_pthread_barrier { + b_lock: umutex, + b_cv: ucond, + b_cycle: i64, + b_count: ::c_int, + b_waiters: ::c_int, + b_refcount: ::c_int, + b_destroying: ::c_int, + } + + pub struct kinfo_vmentry { + pub kve_structsize: ::c_int, + pub kve_type: ::c_int, + pub kve_start: u64, + pub kve_end: u64, + pub kve_offset: u64, + pub kve_vn_fileid: u64, + #[cfg(not(freebsd11))] + pub kve_vn_fsid_freebsd11: u32, + #[cfg(freebsd11)] + pub kve_vn_fsid: u32, + pub kve_flags: ::c_int, + pub kve_resident: ::c_int, + pub kve_private_resident: ::c_int, + pub kve_protection: ::c_int, + pub kve_ref_count: ::c_int, + pub kve_shadow_count: ::c_int, + pub kve_vn_type: ::c_int, + pub kve_vn_size: u64, + #[cfg(not(freebsd11))] + pub kve_vn_rdev_freebsd11: u32, + #[cfg(freebsd11)] + pub kve_vn_rdev: u32, + pub kve_vn_mode: u16, + pub kve_status: u16, + #[cfg(not(freebsd11))] + pub kve_vn_fsid: u64, + #[cfg(not(freebsd11))] + pub kve_vn_rdev: u64, + #[cfg(not(freebsd11))] + _kve_is_spare: [::c_int; 8], + #[cfg(freebsd11)] + _kve_is_spare: [::c_int; 12], + pub kve_path: [[::c_char; 32]; 32], + } + + pub struct __c_anonymous_filestat { + pub stqe_next: *mut filestat, + } + + pub struct filestat { + pub fs_type: ::c_int, + pub fs_flags: ::c_int, + pub fs_fflags: ::c_int, + pub fs_uflags: ::c_int, + pub fs_fd: ::c_int, + pub fs_ref_count: ::c_int, + pub fs_offset: ::off_t, + pub fs_typedep: *mut ::c_void, + pub fs_path: *mut ::c_char, + pub next: __c_anonymous_filestat, + pub fs_cap_rights: cap_rights_t, + } + + pub struct filestat_list { + pub stqh_first: *mut filestat, + pub stqh_last: *mut *mut filestat, + } + + pub struct procstat { + pub tpe: ::c_int, + pub kd: ::uintptr_t, + pub vmentries: *mut ::c_void, + pub files: *mut ::c_void, + pub argv: *mut ::c_void, + pub envv: *mut ::c_void, + pub core: ::uintptr_t, + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct __c_anonymous__timer { + _priv: [::c_int; 3], + } + + /// Used to hold a copy of the command line, if it had a sane length. + pub struct pargs { + /// Reference count. + pub ar_ref: u_int, + /// Length. + pub ar_length: u_int, + /// Arguments. + pub ar_args: [::c_uchar; 1], + } + + pub struct priority { + /// Scheduling class. + pub pri_class: u_char, + /// Normal priority level. + pub pri_level: u_char, + /// Priority before propagation. + pub pri_native: u_char, + /// User priority based on p_cpu and p_nice. + pub pri_user: u_char, + } + + pub struct kvm_swap { + pub ksw_devname: [::c_char; 32], + pub ksw_used: u_int, + pub ksw_total: u_int, + pub ksw_flags: ::c_int, + pub ksw_reserved1: u_int, + pub ksw_reserved2: u_int, + } + + pub struct nlist { + /// symbol name (in memory) + pub n_name: *const ::c_char, + /// type defines + pub n_type: ::c_uchar, + /// "type" and binding information + pub n_other: ::c_char, + /// used by stab entries + pub n_desc: ::c_short, + pub n_value: ::c_ulong, + } + + pub struct kvm_nlist { + pub n_name: *const ::c_char, + pub n_type: ::c_uchar, + pub n_value: ::kvaddr_t, + } + + pub struct __c_anonymous_sem { + _priv: ::uintptr_t, + } + + pub struct semid_ds { + pub sem_perm: ::ipc_perm, + pub __sem_base: *mut __c_anonymous_sem, + pub sem_nsems: ::c_ushort, + pub sem_otime: ::time_t, + pub sem_ctime: ::time_t, + } + + pub struct vmtotal { + pub t_vm: u64, + pub t_avm: u64, + pub t_rm: u64, + pub t_arm: u64, + pub t_vmshr: u64, + pub t_avmshr: u64, + pub t_rmshr: u64, + pub t_armshr: u64, + pub t_free: u64, + pub t_rq: i16, + pub t_dw: i16, + pub t_pw: i16, + pub t_sl: i16, + pub t_sw: i16, + pub t_pad: [u16; 3], + } + + pub struct sockstat { + pub inp_ppcb: u64, + pub so_addr: u64, + pub so_pcb: u64, + pub unp_conn: u64, + pub dom_family: ::c_int, + pub proto: ::c_int, + pub so_rcv_sb_state: ::c_int, + pub so_snd_sb_state: ::c_int, + /// Socket address. + pub sa_local: ::sockaddr_storage, + /// Peer address. + pub sa_peer: ::sockaddr_storage, + pub type_: ::c_int, + pub dname: [::c_char; 32], + #[cfg(any(freebsd12, freebsd13, freebsd14))] + pub sendq: ::c_uint, + #[cfg(any(freebsd12, freebsd13, freebsd14))] + pub recvq: ::c_uint, + } + + pub struct shmstat { + pub size: u64, + pub mode: u16, + } + + pub struct spacectl_range { + pub r_offset: ::off_t, + pub r_len: ::off_t + } + + pub struct rusage_ext { + pub rux_runtime: u64, + pub rux_uticks: u64, + pub rux_sticks: u64, + pub rux_iticks: u64, + pub rux_uu: u64, + pub rux_su: u64, + pub rux_tu: u64, + } + + pub struct if_clonereq { + pub ifcr_total: ::c_int, + pub ifcr_count: ::c_int, + pub ifcr_buffer: *mut ::c_char, + } + + pub struct if_msghdr { + /// to skip over non-understood messages + pub ifm_msglen: ::c_ushort, + /// future binary compatibility + pub ifm_version: ::c_uchar, + /// message type + pub ifm_type: ::c_uchar, + /// like rtm_addrs + pub ifm_addrs: ::c_int, + /// value of if_flags + pub ifm_flags: ::c_int, + /// index for associated ifp + pub ifm_index: ::c_ushort, + pub _ifm_spare1: ::c_ushort, + /// statistics and other data about if + pub ifm_data: if_data, + } + + pub struct if_msghdrl { + /// to skip over non-understood messages + pub ifm_msglen: ::c_ushort, + /// future binary compatibility + pub ifm_version: ::c_uchar, + /// message type + pub ifm_type: ::c_uchar, + /// like rtm_addrs + pub ifm_addrs: ::c_int, + /// value of if_flags + pub ifm_flags: ::c_int, + /// index for associated ifp + pub ifm_index: ::c_ushort, + /// spare space to grow if_index, see if_var.h + pub _ifm_spare1: ::c_ushort, + /// length of if_msghdrl incl. if_data + pub ifm_len: ::c_ushort, + /// offset of if_data from beginning + pub ifm_data_off: ::c_ushort, + pub _ifm_spare2: ::c_int, + /// statistics and other data about if + pub ifm_data: if_data, + } + + pub struct ifa_msghdr { + /// to skip over non-understood messages + pub ifam_msglen: ::c_ushort, + /// future binary compatibility + pub ifam_version: ::c_uchar, + /// message type + pub ifam_type: ::c_uchar, + /// like rtm_addrs + pub ifam_addrs: ::c_int, + /// value of ifa_flags + pub ifam_flags: ::c_int, + /// index for associated ifp + pub ifam_index: ::c_ushort, + pub _ifam_spare1: ::c_ushort, + /// value of ifa_ifp->if_metric + pub ifam_metric: ::c_int, + } + + pub struct ifa_msghdrl { + /// to skip over non-understood messages + pub ifam_msglen: ::c_ushort, + /// future binary compatibility + pub ifam_version: ::c_uchar, + /// message type + pub ifam_type: ::c_uchar, + /// like rtm_addrs + pub ifam_addrs: ::c_int, + /// value of ifa_flags + pub ifam_flags: ::c_int, + /// index for associated ifp + pub ifam_index: ::c_ushort, + /// spare space to grow if_index, see if_var.h + pub _ifam_spare1: ::c_ushort, + /// length of ifa_msghdrl incl. if_data + pub ifam_len: ::c_ushort, + /// offset of if_data from beginning + pub ifam_data_off: ::c_ushort, + /// value of ifa_ifp->if_metric + pub ifam_metric: ::c_int, + /// statistics and other data about if or address + pub ifam_data: if_data, + } + + pub struct ifma_msghdr { + /// to skip over non-understood messages + pub ifmam_msglen: ::c_ushort, + /// future binary compatibility + pub ifmam_version: ::c_uchar, + /// message type + pub ifmam_type: ::c_uchar, + /// like rtm_addrs + pub ifmam_addrs: ::c_int, + /// value of ifa_flags + pub ifmam_flags: ::c_int, + /// index for associated ifp + pub ifmam_index: ::c_ushort, + pub _ifmam_spare1: ::c_ushort, + } + + pub struct if_announcemsghdr { + /// to skip over non-understood messages + pub ifan_msglen: ::c_ushort, + /// future binary compatibility + pub ifan_version: ::c_uchar, + /// message type + pub ifan_type: ::c_uchar, + /// index for associated ifp + pub ifan_index: ::c_ushort, + /// if name, e.g. "en0" + pub ifan_name: [::c_char; ::IFNAMSIZ as usize], + /// what type of announcement + pub ifan_what: ::c_ushort, + } + + pub struct ifreq_buffer { + pub length: ::size_t, + pub buffer: *mut ::c_void, + } + + pub struct ifaliasreq { + /// if name, e.g. "en0" + pub ifra_name: [::c_char; ::IFNAMSIZ as usize], + pub ifra_addr: ::sockaddr, + pub ifra_broadaddr: ::sockaddr, + pub ifra_mask: ::sockaddr, + pub ifra_vhid: ::c_int, + } + + /// 9.x compat + pub struct oifaliasreq { + /// if name, e.g. "en0" + pub ifra_name: [::c_char; ::IFNAMSIZ as usize], + pub ifra_addr: ::sockaddr, + pub ifra_broadaddr: ::sockaddr, + pub ifra_mask: ::sockaddr, + } + + pub struct ifmediareq { + /// if name, e.g. "en0" + pub ifm_name: [::c_char; ::IFNAMSIZ as usize], + /// current media options + pub ifm_current: ::c_int, + /// don't care mask + pub ifm_mask: ::c_int, + /// media status + pub ifm_status: ::c_int, + /// active options + pub ifm_active: ::c_int, + /// # entries in ifm_ulist array + pub ifm_count: ::c_int, + /// media words + pub ifm_ulist: *mut ::c_int, + } + + pub struct ifdrv { + /// if name, e.g. "en0" + pub ifd_name: [::c_char; ::IFNAMSIZ as usize], + pub ifd_cmd: ::c_ulong, + pub ifd_len: ::size_t, + pub ifd_data: *mut ::c_void, + } + + pub struct ifi2creq { + /// i2c address (0xA0, 0xA2) + pub dev_addr: u8, + /// read offset + pub offset: u8, + /// read length + pub len: u8, + pub spare0: u8, + pub spare1: u32, + /// read buffer + pub data: [u8; 8], + } + + pub struct ifrsshash { + /// if name, e.g. "en0" + pub ifrh_name: [::c_char; ::IFNAMSIZ as usize], + /// RSS_FUNC_ + pub ifrh_func: u8, + pub ifrh_spare0: u8, + pub ifrh_spare1: u16, + /// RSS_TYPE_ + pub ifrh_types: u32, + } + + pub struct ifmibdata { + /// name of interface + pub ifmd_name: [::c_char; ::IFNAMSIZ as usize], + /// number of promiscuous listeners + pub ifmd_pcount: ::c_int, + /// interface flags + pub ifmd_flags: ::c_int, + /// instantaneous length of send queue + pub ifmd_snd_len: ::c_int, + /// maximum length of send queue + pub ifmd_snd_maxlen: ::c_int, + /// number of drops in send queue + pub ifmd_snd_drops: ::c_int, + /// for future expansion + pub ifmd_filler: [::c_int; 4], + /// generic information and statistics + pub ifmd_data: if_data, + } + + pub struct ifmib_iso_8802_3 { + pub dot3StatsAlignmentErrors: u32, + pub dot3StatsFCSErrors: u32, + pub dot3StatsSingleCollisionFrames: u32, + pub dot3StatsMultipleCollisionFrames: u32, + pub dot3StatsSQETestErrors: u32, + pub dot3StatsDeferredTransmissions: u32, + pub dot3StatsLateCollisions: u32, + pub dot3StatsExcessiveCollisions: u32, + pub dot3StatsInternalMacTransmitErrors: u32, + pub dot3StatsCarrierSenseErrors: u32, + pub dot3StatsFrameTooLongs: u32, + pub dot3StatsInternalMacReceiveErrors: u32, + pub dot3StatsEtherChipSet: u32, + pub dot3StatsMissedFrames: u32, + pub dot3StatsCollFrequencies: [u32; 16], + pub dot3Compliance: u32, + } + + pub struct __c_anonymous_ph { + pub ph1: u64, + pub ph2: u64, + } + + pub struct fid { + pub fid_len: ::c_ushort, + pub fid_data0: ::c_ushort, + pub fid_data: [::c_char; ::MAXFIDSZ as usize], + } + + pub struct fhandle { + pub fh_fsid: ::fsid_t, + pub fh_fid: fid, + } + + pub struct bintime { + pub sec: ::time_t, + pub frac: u64, + } + + pub struct clockinfo { + /// clock frequency + pub hz: ::c_int, + /// micro-seconds per hz tick + pub tick: ::c_int, + pub spare: ::c_int, + /// statistics clock frequency + pub stathz: ::c_int, + /// profiling clock frequency + pub profhz: ::c_int, + } + + pub struct __c_anonymous_stailq_entry_devstat { + pub stqe_next: *mut devstat, + } + + pub struct devstat { + /// Update sequence + pub sequence0: ::u_int, + /// Allocated entry + pub allocated: ::c_int, + /// started ops + pub start_count: ::u_int, + /// completed ops + pub end_count: ::u_int, + /// busy time unaccounted for since this time + pub busy_from: bintime, + pub dev_links: __c_anonymous_stailq_entry_devstat, + /// Devstat device number. + pub device_number: u32, + pub device_name: [::c_char; DEVSTAT_NAME_LEN as usize], + pub unit_number: ::c_int, + pub bytes: [u64; DEVSTAT_N_TRANS_FLAGS as usize], + pub operations: [u64; DEVSTAT_N_TRANS_FLAGS as usize], + pub duration: [bintime; DEVSTAT_N_TRANS_FLAGS as usize], + pub busy_time: bintime, + /// Time the device was created. + pub creation_time: bintime, + /// Block size, bytes + pub block_size: u32, + /// The number of simple, ordered, and head of queue tags sent. + pub tag_types: [u64; 3], + /// Which statistics are supported by a given device. + pub flags: devstat_support_flags, + /// Device type + pub device_type: devstat_type_flags, + /// Controls list pos. + pub priority: devstat_priority, + /// Identification for GEOM nodes + pub id: *const ::c_void, + /// Update sequence + pub sequence1: ::u_int, + } + + pub struct devstat_match { + pub match_fields: devstat_match_flags, + pub device_type: devstat_type_flags, + pub num_match_categories: ::c_int, + } + + pub struct devstat_match_table { + pub match_str: *const ::c_char, + pub type_: devstat_type_flags, + pub match_field: devstat_match_flags, + } + + pub struct device_selection { + pub device_number: u32, + pub device_name: [::c_char; DEVSTAT_NAME_LEN as usize], + pub unit_number: ::c_int, + pub selected: ::c_int, + pub bytes: u64, + pub position: ::c_int, + } + + pub struct devinfo { + pub devices: *mut devstat, + pub mem_ptr: *mut u8, + pub generation: ::c_long, + pub numdevs: ::c_int, + } + + pub struct sockcred2 { + pub sc_version: ::c_int, + pub sc_pid: ::pid_t, + pub sc_uid: ::uid_t, + pub sc_euid: ::uid_t, + pub sc_gid: ::gid_t, + pub sc_egid: ::gid_t, + pub sc_ngroups: ::c_int, + pub sc_groups: [::gid_t; 1], + } + + pub struct ifconf { + pub ifc_len: ::c_int, + #[cfg(libc_union)] + pub ifc_ifcu: __c_anonymous_ifc_ifcu, + } + + pub struct au_mask_t { + pub am_success: ::c_uint, + pub am_failure: ::c_uint, + } + + pub struct au_tid_t { + pub port: u32, + pub machine: u32, + } + + pub struct auditinfo_t { + pub ai_auid: ::au_id_t, + pub ai_mask: ::au_mask_t, + pub ai_termid: au_tid_t, + pub ai_asid: ::au_asid_t, + } + + pub struct tcp_fastopen { + pub enable: ::c_int, + pub psk: [u8; ::TCP_FASTOPEN_PSK_LEN as usize], + } + + pub struct tcp_function_set { + pub function_set_name: [::c_char; ::TCP_FUNCTION_NAME_LEN_MAX as usize], + pub pcbcnt: u32, + } + + pub struct tcp_info { + pub tcpi_state: u8, + pub __tcpi_ca_state: u8, + pub __tcpi_retransmits: u8, + pub __tcpi_probes: u8, + pub __tcpi_backoff: u8, + pub tcpi_options: u8, + pub tcp_snd_wscale: u8, + pub tcp_rcv_wscale: u8, + pub tcpi_rto: u32, + pub __tcpi_ato: u32, + pub tcpi_snd_mss: u32, + pub tcpi_rcv_mss: u32, + pub __tcpi_unacked: u32, + pub __tcpi_sacked: u32, + pub __tcpi_lost: u32, + pub __tcpi_retrans: u32, + pub __tcpi_fackets: u32, + pub __tcpi_last_data_sent: u32, + pub __tcpi_last_ack_sent: u32, + pub tcpi_last_data_recv: u32, + pub __tcpi_last_ack_recv: u32, + pub __tcpi_pmtu: u32, + pub __tcpi_rcv_ssthresh: u32, + pub tcpi_rtt: u32, + pub tcpi_rttvar: u32, + pub tcpi_snd_ssthresh: u32, + pub tcpi_snd_cwnd: u32, + pub __tcpi_advmss: u32, + pub __tcpi_reordering: u32, + pub __tcpi_rcv_rtt: u32, + pub tcpi_rcv_space: u32, + pub tcpi_snd_wnd: u32, + pub tcpi_snd_bwnd: u32, + pub tcpi_snd_nxt: u32, + pub tcpi_rcv_nxt: u32, + pub tcpi_toe_tid: u32, + pub tcpi_snd_rexmitpack: u32, + pub tcpi_rcv_ooopack: u32, + pub tcpi_snd_zerowin: u32, + #[cfg(freebsd14)] + pub tcpi_delivered_ce: u32, + #[cfg(freebsd14)] + pub tcpi_received_ce: u32, + #[cfg(freebsd14)] + pub __tcpi_delivered_e1_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_delivered_e0_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_delivered_ce_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_received_e1_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_received_e0_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_received_ce_bytes: u32, + #[cfg(freebsd14)] + pub __tcpi_pad: [u32; 19], + #[cfg(not(freebsd14))] + pub __tcpi_pad: [u32; 26], + } + + pub struct _umtx_time { + pub _timeout: ::timespec, + pub _flags: u32, + pub _clockid: u32, + } + + pub struct shm_largepage_conf { + pub psind: ::c_int, + pub alloc_policy: ::c_int, + __pad: [::c_int; 10], + } + + pub struct memory_type { + __priva: [::uintptr_t; 32], + __privb: [::uintptr_t; 26], + } + + pub struct memory_type_list { + __priv: [::uintptr_t; 2], + } + + pub struct pidfh { + __priva: [[::uintptr_t; 32]; 8], + __privb: [::uintptr_t; 2], + } + + pub struct sctp_event { + pub se_assoc_id: ::sctp_assoc_t, + pub se_type: u16, + pub se_on: u8, + } + + pub struct sctp_event_subscribe { + pub sctp_data_io_event: u8, + pub sctp_association_event: u8, + pub sctp_address_event: u8, + pub sctp_send_failure_event: u8, + pub sctp_peer_error_event: u8, + pub sctp_shutdown_event: u8, + pub sctp_partial_delivery_event: u8, + pub sctp_adaptation_layer_event: u8, + pub sctp_authentication_event: u8, + pub sctp_sender_dry_event: u8, + pub sctp_stream_reset_event: u8, + } + + pub struct sctp_initmsg { + pub sinit_num_ostreams: u16, + pub sinit_max_instreams: u16, + pub sinit_max_attempts: u16, + pub sinit_max_init_timeo: u16, + } + + pub struct sctp_sndrcvinfo { + pub sinfo_stream: u16, + pub sinfo_ssn: u16, + pub sinfo_flags: u16, + pub sinfo_ppid: u32, + pub sinfo_context: u32, + pub sinfo_timetolive: u32, + pub sinfo_tsn: u32, + pub sinfo_cumtsn: u32, + pub sinfo_assoc_id: ::sctp_assoc_t, + pub sinfo_keynumber: u16, + pub sinfo_keynumber_valid: u16, + pub __reserve_pad: [[u8; 23]; 4], + } + + pub struct sctp_extrcvinfo { + pub sinfo_stream: u16, + pub sinfo_ssn: u16, + pub sinfo_flags: u16, + pub sinfo_ppid: u32, + pub sinfo_context: u32, + pub sinfo_timetolive: u32, + pub sinfo_tsn: u32, + pub sinfo_cumtsn: u32, + pub sinfo_assoc_id: ::sctp_assoc_t, + pub serinfo_next_flags: u16, + pub serinfo_next_stream: u16, + pub serinfo_next_aid: u32, + pub serinfo_next_length: u32, + pub serinfo_next_ppid: u32, + pub sinfo_keynumber: u16, + pub sinfo_keynumber_valid: u16, + pub __reserve_pad: [[u8; 19]; 4], + } + + pub struct sctp_sndinfo { + pub snd_sid: u16, + pub snd_flags: u16, + pub snd_ppid: u32, + pub snd_context: u32, + pub snd_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_prinfo { + pub pr_policy: u16, + pub pr_value: u32, + } + + pub struct sctp_default_prinfo { + pub pr_policy: u16, + pub pr_value: u32, + pub pr_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_authinfo { + pub auth_keynumber: u16, + } + + pub struct sctp_rcvinfo { + pub rcv_sid: u16, + pub rcv_ssn: u16, + pub rcv_flags: u16, + pub rcv_ppid: u32, + pub rcv_tsn: u32, + pub rcv_cumtsn: u32, + pub rcv_context: u32, + pub rcv_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_nxtinfo { + pub nxt_sid: u16, + pub nxt_flags: u16, + pub nxt_ppid: u32, + pub nxt_length: u32, + pub nxt_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_recvv_rn { + pub recvv_rcvinfo: sctp_rcvinfo, + pub recvv_nxtinfo: sctp_nxtinfo, + } + + pub struct sctp_sendv_spa { + pub sendv_flags: u32, + pub sendv_sndinfo: sctp_sndinfo, + pub sendv_prinfo: sctp_prinfo, + pub sendv_authinfo: sctp_authinfo, + } + + pub struct sctp_snd_all_completes { + pub sall_stream: u16, + pub sall_flags: u16, + pub sall_ppid: u32, + pub sall_context: u32, + pub sall_num_sent: u32, + pub sall_num_failed: u32, + } + + pub struct sctp_pcbinfo { + pub ep_count: u32, + pub asoc_count: u32, + pub laddr_count: u32, + pub raddr_count: u32, + pub chk_count: u32, + pub readq_count: u32, + pub free_chunks: u32, + pub stream_oque: u32, + } + + pub struct sctp_sockstat { + pub ss_assoc_id: ::sctp_assoc_t, + pub ss_total_sndbuf: u32, + pub ss_total_recv_buf: u32, + } + + pub struct sctp_assoc_change { + pub sac_type: u16, + pub sac_flags: u16, + pub sac_length: u32, + pub sac_state: u16, + pub sac_error: u16, + pub sac_outbound_streams: u16, + pub sac_inbound_streams: u16, + pub sac_assoc_id: ::sctp_assoc_t, + pub sac_info: [u8; 0], + } + + pub struct sctp_paddr_change { + pub spc_type: u16, + pub spc_flags: u16, + pub spc_length: u32, + pub spc_aaddr: ::sockaddr_storage, + pub spc_state: u32, + pub spc_error: u32, + pub spc_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_remote_error { + pub sre_type: u16, + pub sre_flags: u16, + pub sre_length: u32, + pub sre_error: u16, + pub sre_assoc_id: ::sctp_assoc_t, + pub sre_data: [u8; 0], + } + + pub struct sctp_send_failed_event { + pub ssfe_type: u16, + pub ssfe_flags: u16, + pub ssfe_length: u32, + pub ssfe_error: u32, + pub ssfe_info: sctp_sndinfo, + pub ssfe_assoc_id: ::sctp_assoc_t, + pub ssfe_data: [u8; 0], + } + + pub struct sctp_shutdown_event { + pub sse_type: u16, + pub sse_flags: u16, + pub sse_length: u32, + pub sse_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_adaptation_event { + pub sai_type: u16, + pub sai_flags: u16, + pub sai_length: u32, + pub sai_adaptation_ind: u32, + pub sai_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_setadaptation { + pub ssb_adaptation_ind: u32, + } + + pub struct sctp_pdapi_event { + pub pdapi_type: u16, + pub pdapi_flags: u16, + pub pdapi_length: u32, + pub pdapi_indication: u32, + pub pdapi_stream: u16, + pub pdapi_seq: u16, + pub pdapi_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_sender_dry_event { + pub sender_dry_type: u16, + pub sender_dry_flags: u16, + pub sender_dry_length: u32, + pub sender_dry_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_stream_reset_event { + pub strreset_type: u16, + pub strreset_flags: u16, + pub strreset_length: u32, + pub strreset_assoc_id: ::sctp_assoc_t, + pub strreset_stream_list: [u16; 0], + } + + pub struct sctp_stream_change_event { + pub strchange_type: u16, + pub strchange_flags: u16, + pub strchange_length: u32, + pub strchange_assoc_id: ::sctp_assoc_t, + pub strchange_instrms: u16, + pub strchange_outstrms: u16, + } +} + +s_no_extra_traits! { + pub struct utmpx { + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_id: [::c_char; 8], + pub ut_pid: ::pid_t, + pub ut_user: [::c_char; 32], + pub ut_line: [::c_char; 16], + pub ut_host: [::c_char; 128], + pub __ut_spare: [::c_char; 64], + } + + #[cfg(libc_union)] + pub union __c_anonymous_cr_pid { + __cr_unused: *mut ::c_void, + pub cr_pid: ::pid_t, + } + + pub struct xucred { + pub cr_version: ::c_uint, + pub cr_uid: ::uid_t, + pub cr_ngroups: ::c_short, + pub cr_groups: [::gid_t; 16], + #[cfg(libc_union)] + pub cr_pid__c_anonymous_union: __c_anonymous_cr_pid, + #[cfg(not(libc_union))] + __cr_unused1: *mut ::c_void, + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 46], + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + __reserved: [::c_long; 4] + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + //The rest of the structure is actually a union. We expose only + //sigev_notify_thread_id because it's the most useful union member. + pub sigev_notify_thread_id: ::lwpid_t, + #[cfg(target_pointer_width = "64")] + __unused1: ::c_int, + __unused2: [::c_long; 7] + } + + pub struct ptsstat { + #[cfg(any(freebsd12, freebsd13, freebsd14))] + pub dev: u64, + #[cfg(not(any(freebsd12, freebsd13, freebsd14)))] + pub dev: u32, + pub devname: [::c_char; SPECNAMELEN as usize + 1], + } + + #[cfg(libc_union)] + pub union __c_anonymous_elf32_auxv_union { + pub a_val: ::c_int, + } + + pub struct Elf32_Auxinfo { + pub a_type: ::c_int, + #[cfg(libc_union)] + pub a_un: __c_anonymous_elf32_auxv_union, + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifi_epoch { + pub tt: ::time_t, + pub ph: u64, + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifi_lastchange { + pub tv: ::timeval, + pub ph: __c_anonymous_ph, + } + + pub struct if_data { + /// ethernet, tokenring, etc + pub ifi_type: u8, + /// e.g., AUI, Thinnet, 10base-T, etc + pub ifi_physical: u8, + /// media address length + pub ifi_addrlen: u8, + /// media header length + pub ifi_hdrlen: u8, + /// current link state + pub ifi_link_state: u8, + /// carp vhid + pub ifi_vhid: u8, + /// length of this data struct + pub ifi_datalen: u16, + /// maximum transmission unit + pub ifi_mtu: u32, + /// routing metric (external only) + pub ifi_metric: u32, + /// linespeed + pub ifi_baudrate: u64, + /// packets received on interface + pub ifi_ipackets: u64, + /// input errors on interface + pub ifi_ierrors: u64, + /// packets sent on interface + pub ifi_opackets: u64, + /// output errors on interface + pub ifi_oerrors: u64, + /// collisions on csma interfaces + pub ifi_collisions: u64, + /// total number of octets received + pub ifi_ibytes: u64, + /// total number of octets sent + pub ifi_obytes: u64, + /// packets received via multicast + pub ifi_imcasts: u64, + /// packets sent via multicast + pub ifi_omcasts: u64, + /// dropped on input + pub ifi_iqdrops: u64, + /// dropped on output + pub ifi_oqdrops: u64, + /// destined for unsupported protocol + pub ifi_noproto: u64, + /// HW offload capabilities, see IFCAP + pub ifi_hwassist: u64, + /// uptime at attach or stat reset + #[cfg(libc_union)] + pub __ifi_epoch: __c_anonymous_ifi_epoch, + /// uptime at attach or stat reset + #[cfg(not(libc_union))] + pub __ifi_epoch: u64, + /// time of last administrative change + #[cfg(libc_union)] + pub __ifi_lastchange: __c_anonymous_ifi_lastchange, + /// time of last administrative change + #[cfg(not(libc_union))] + pub __ifi_lastchange: ::timeval, + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifr_ifru { + pub ifru_addr: ::sockaddr, + pub ifru_dstaddr: ::sockaddr, + pub ifru_broadaddr: ::sockaddr, + pub ifru_buffer: ifreq_buffer, + pub ifru_flags: [::c_short; 2], + pub ifru_index: ::c_short, + pub ifru_jid: ::c_int, + pub ifru_metric: ::c_int, + pub ifru_mtu: ::c_int, + pub ifru_phys: ::c_int, + pub ifru_media: ::c_int, + pub ifru_data: ::caddr_t, + pub ifru_cap: [::c_int; 2], + pub ifru_fib: ::c_uint, + pub ifru_vlan_pcp: ::c_uchar, + } + + pub struct ifreq { + /// if name, e.g. "en0" + pub ifr_name: [::c_char; ::IFNAMSIZ], + #[cfg(libc_union)] + pub ifr_ifru: __c_anonymous_ifr_ifru, + #[cfg(not(libc_union))] + pub ifr_ifru: ::sockaddr, + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifc_ifcu { + pub ifcu_buf: ::caddr_t, + pub ifcu_req: *mut ifreq, + } + + pub struct ifstat { + /// if name, e.g. "en0" + pub ifs_name: [::c_char; ::IFNAMSIZ as usize], + pub ascii: [::c_char; ::IFSTATMAX as usize + 1], + } + + pub struct ifrsskey { + /// if name, e.g. "en0" + pub ifrk_name: [::c_char; ::IFNAMSIZ as usize], + /// RSS_FUNC_ + pub ifrk_func: u8, + pub ifrk_spare0: u8, + pub ifrk_keylen: u16, + pub ifrk_key: [u8; ::RSS_KEYLEN as usize], + } + + pub struct ifdownreason { + pub ifdr_name: [::c_char; ::IFNAMSIZ as usize], + pub ifdr_reason: u32, + pub ifdr_vendor: u32, + pub ifdr_msg: [::c_char; ::IFDR_MSG_SIZE as usize], + } + + #[repr(packed)] + pub struct sctphdr { + pub src_port: u16, + pub dest_port: u16, + pub v_tag: u32, + pub checksum: u32, + } + + #[repr(packed)] + pub struct sctp_chunkhdr { + pub chunk_type: u8, + pub chunk_flags: u8, + pub chunk_length: u16, + } + + #[repr(packed)] + pub struct sctp_paramhdr { + pub param_type: u16, + pub param_length: u16, + } + + #[repr(packed)] + pub struct sctp_gen_error_cause { + pub code: u16, + pub length: u16, + pub info: [u8; 0], + } + + #[repr(packed)] + pub struct sctp_error_cause { + pub code: u16, + pub length: u16, + } + + #[repr(packed)] + pub struct sctp_error_invalid_stream { + pub cause: sctp_error_cause, + pub stream_id: u16, + __reserved: u16, + } + + #[repr(packed)] + pub struct sctp_error_missing_param { + pub cause: sctp_error_cause, + pub num_missing_params: u32, + pub tpe: [u8; 0], + } + + #[repr(packed)] + pub struct sctp_error_stale_cookie { + pub cause: sctp_error_cause, + pub stale_time: u32, + } + + #[repr(packed)] + pub struct sctp_error_out_of_resource { + pub cause: sctp_error_cause, + } + + #[repr(packed)] + pub struct sctp_error_unresolv_addr { + pub cause: sctp_error_cause, + } + + #[repr(packed)] + pub struct sctp_error_unrecognized_chunk { + pub cause: sctp_error_cause, + pub ch: sctp_chunkhdr, + } + + #[repr(packed)] + pub struct sctp_error_no_user_data { + pub cause: sctp_error_cause, + pub tsn: u32, + } + + #[repr(packed)] + pub struct sctp_error_auth_invalid_hmac { + pub cause: sctp_error_cause, + pub hmac_id: u16, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_tv == other.ut_tv + && self.ut_id == other.ut_id + && self.ut_pid == other.ut_pid + && self.ut_user == other.ut_user + && self.ut_line == other.ut_line + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self + .__ut_spare + .iter() + .zip(other.__ut_spare.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for utmpx {} + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_type", &self.ut_type) + .field("ut_tv", &self.ut_tv) + .field("ut_id", &self.ut_id) + .field("ut_pid", &self.ut_pid) + .field("ut_user", &self.ut_user) + .field("ut_line", &self.ut_line) + // FIXME: .field("ut_host", &self.ut_host) + // FIXME: .field("__ut_spare", &self.__ut_spare) + .finish() + } + } + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_type.hash(state); + self.ut_tv.hash(state); + self.ut_id.hash(state); + self.ut_pid.hash(state); + self.ut_user.hash(state); + self.ut_line.hash(state); + self.ut_host.hash(state); + self.__ut_spare.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_cr_pid { + fn eq(&self, other: &__c_anonymous_cr_pid) -> bool { + unsafe { self.cr_pid == other.cr_pid} + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_cr_pid {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_cr_pid { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("cr_pid") + .field("cr_pid", unsafe { &self.cr_pid }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_cr_pid { + fn hash(&self, state: &mut H) { + unsafe { self.cr_pid.hash(state) }; + } + } + + impl PartialEq for xucred { + fn eq(&self, other: &xucred) -> bool { + #[cfg(libc_union)] + let equal_cr_pid = self.cr_pid__c_anonymous_union + == other.cr_pid__c_anonymous_union; + #[cfg(not(libc_union))] + let equal_cr_pid = self.__cr_unused1 == other.__cr_unused1; + + self.cr_version == other.cr_version + && self.cr_uid == other.cr_uid + && self.cr_ngroups == other.cr_ngroups + && self.cr_groups == other.cr_groups + && equal_cr_pid + } + } + impl Eq for xucred {} + impl ::fmt::Debug for xucred { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let mut struct_formatter = f.debug_struct("xucred"); + struct_formatter.field("cr_version", &self.cr_version); + struct_formatter.field("cr_uid", &self.cr_uid); + struct_formatter.field("cr_ngroups", &self.cr_ngroups); + struct_formatter.field("cr_groups", &self.cr_groups); + #[cfg(libc_union)] + struct_formatter.field( + "cr_pid__c_anonymous_union", + &self.cr_pid__c_anonymous_union + ); + struct_formatter.finish() + } + } + impl ::hash::Hash for xucred { + fn hash(&self, state: &mut H) { + self.cr_version.hash(state); + self.cr_uid.hash(state); + self.cr_ngroups.hash(state); + self.cr_groups.hash(state); + #[cfg(libc_union)] + self.cr_pid__c_anonymous_union.hash(state); + #[cfg(not(libc_union))] + self.__cr_unused1.hash(state); + } + } + + impl PartialEq for sockaddr_dl { + fn eq(&self, other: &sockaddr_dl) -> bool { + self.sdl_len == other.sdl_len + && self.sdl_family == other.sdl_family + && self.sdl_index == other.sdl_index + && self.sdl_type == other.sdl_type + && self.sdl_nlen == other.sdl_nlen + && self.sdl_alen == other.sdl_alen + && self.sdl_slen == other.sdl_slen + && self + .sdl_data + .iter() + .zip(other.sdl_data.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_dl {} + impl ::fmt::Debug for sockaddr_dl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_dl") + .field("sdl_len", &self.sdl_len) + .field("sdl_family", &self.sdl_family) + .field("sdl_index", &self.sdl_index) + .field("sdl_type", &self.sdl_type) + .field("sdl_nlen", &self.sdl_nlen) + .field("sdl_alen", &self.sdl_alen) + .field("sdl_slen", &self.sdl_slen) + // FIXME: .field("sdl_data", &self.sdl_data) + .finish() + } + } + impl ::hash::Hash for sockaddr_dl { + fn hash(&self, state: &mut H) { + self.sdl_len.hash(state); + self.sdl_family.hash(state); + self.sdl_index.hash(state); + self.sdl_type.hash(state); + self.sdl_nlen.hash(state); + self.sdl_alen.hash(state); + self.sdl_slen.hash(state); + self.sdl_data.hash(state); + } + } + + impl PartialEq for mq_attr { + fn eq(&self, other: &mq_attr) -> bool { + self.mq_flags == other.mq_flags && + self.mq_maxmsg == other.mq_maxmsg && + self.mq_msgsize == other.mq_msgsize && + self.mq_curmsgs == other.mq_curmsgs + } + } + impl Eq for mq_attr {} + impl ::fmt::Debug for mq_attr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_flags", &self.mq_flags) + .field("mq_maxmsg", &self.mq_maxmsg) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_curmsgs", &self.mq_curmsgs) + .finish() + } + } + impl ::hash::Hash for mq_attr { + fn hash(&self, state: &mut H) { + self.mq_flags.hash(state); + self.mq_maxmsg.hash(state); + self.mq_msgsize.hash(state); + self.mq_curmsgs.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.sigev_notify_thread_id + == other.sigev_notify_thread_id + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("sigev_notify_thread_id", + &self.sigev_notify_thread_id) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.sigev_notify_thread_id.hash(state); + } + } + + impl PartialEq for ptsstat { + fn eq(&self, other: &ptsstat) -> bool { + let self_devname: &[::c_char] = &self.devname; + let other_devname: &[::c_char] = &other.devname; + + self.dev == other.dev && self_devname == other_devname + } + } + impl Eq for ptsstat {} + impl ::fmt::Debug for ptsstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let self_devname: &[::c_char] = &self.devname; + + f.debug_struct("ptsstat") + .field("dev", &self.dev) + .field("devname", &self_devname) + .finish() + } + } + impl ::hash::Hash for ptsstat { + fn hash(&self, state: &mut H) { + let self_devname: &[::c_char] = &self.devname; + + self.dev.hash(state); + self_devname.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_elf32_auxv_union { + fn eq(&self, other: &__c_anonymous_elf32_auxv_union) -> bool { + unsafe { self.a_val == other.a_val} + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_elf32_auxv_union {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_elf32_auxv_union { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("a_val") + .field("a_val", unsafe { &self.a_val }) + .finish() + } + } + #[cfg(not(libc_union))] + impl PartialEq for Elf32_Auxinfo { + fn eq(&self, other: &Elf32_Auxinfo) -> bool { + self.a_type == other.a_type + } + } + #[cfg(libc_union)] + impl PartialEq for Elf32_Auxinfo { + fn eq(&self, other: &Elf32_Auxinfo) -> bool { + self.a_type == other.a_type + && self.a_un == other.a_un + } + } + impl Eq for Elf32_Auxinfo {} + #[cfg(not(libc_union))] + impl ::fmt::Debug for Elf32_Auxinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("Elf32_Auxinfo") + .field("a_type", &self.a_type) + .finish() + } + } + #[cfg(libc_union)] + impl ::fmt::Debug for Elf32_Auxinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("Elf32_Auxinfo") + .field("a_type", &self.a_type) + .field("a_un", &self.a_un) + .finish() + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ifr_ifru { + fn eq(&self, other: &__c_anonymous_ifr_ifru) -> bool { + unsafe { + self.ifru_addr == other.ifru_addr && + self.ifru_dstaddr == other.ifru_dstaddr && + self.ifru_broadaddr == other.ifru_broadaddr && + self.ifru_buffer == other.ifru_buffer && + self.ifru_flags == other.ifru_flags && + self.ifru_index == other.ifru_index && + self.ifru_jid == other.ifru_jid && + self.ifru_metric == other.ifru_metric && + self.ifru_mtu == other.ifru_mtu && + self.ifru_phys == other.ifru_phys && + self.ifru_media == other.ifru_media && + self.ifru_data == other.ifru_data && + self.ifru_cap == other.ifru_cap && + self.ifru_fib == other.ifru_fib && + self.ifru_vlan_pcp == other.ifru_vlan_pcp + } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_ifr_ifru {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifr_ifru { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ifr_ifru") + .field("ifru_addr", unsafe { &self.ifru_addr }) + .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) + .field("ifru_broadaddr", unsafe { &self.ifru_broadaddr }) + .field("ifru_buffer", unsafe { &self.ifru_buffer }) + .field("ifru_flags", unsafe { &self.ifru_flags }) + .field("ifru_index", unsafe { &self.ifru_index }) + .field("ifru_jid", unsafe { &self.ifru_jid }) + .field("ifru_metric", unsafe { &self.ifru_metric }) + .field("ifru_mtu", unsafe { &self.ifru_mtu }) + .field("ifru_phys", unsafe { &self.ifru_phys }) + .field("ifru_media", unsafe { &self.ifru_media }) + .field("ifru_data", unsafe { &self.ifru_data }) + .field("ifru_cap", unsafe { &self.ifru_cap }) + .field("ifru_fib", unsafe { &self.ifru_fib }) + .field("ifru_vlan_pcp", unsafe { &self.ifru_vlan_pcp }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ifr_ifru { + fn hash(&self, state: &mut H) { + unsafe { self.ifru_addr.hash(state) }; + unsafe { self.ifru_dstaddr.hash(state) }; + unsafe { self.ifru_broadaddr.hash(state) }; + unsafe { self.ifru_buffer.hash(state) }; + unsafe { self.ifru_flags.hash(state) }; + unsafe { self.ifru_index.hash(state) }; + unsafe { self.ifru_jid.hash(state) }; + unsafe { self.ifru_metric.hash(state) }; + unsafe { self.ifru_mtu.hash(state) }; + unsafe { self.ifru_phys.hash(state) }; + unsafe { self.ifru_media.hash(state) }; + unsafe { self.ifru_data.hash(state) }; + unsafe { self.ifru_cap.hash(state) }; + unsafe { self.ifru_fib.hash(state) }; + unsafe { self.ifru_vlan_pcp.hash(state) }; + } + } + + impl PartialEq for ifreq { + fn eq(&self, other: &ifreq) -> bool { + self.ifr_name == other.ifr_name && self.ifr_ifru == other.ifr_ifru + } + } + impl Eq for ifreq {} + impl ::fmt::Debug for ifreq { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ifreq") + .field("ifr_name", &self.ifr_name) + .field("ifr_ifru", &self.ifr_ifru) + .finish() + } + } + impl ::hash::Hash for ifreq { + fn hash(&self, state: &mut H) { + self.ifr_name.hash(state); + self.ifr_ifru.hash(state); + } + } + + #[cfg(libc_union)] + impl Eq for __c_anonymous_ifc_ifcu {} + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ifc_ifcu { + fn eq(&self, other: &__c_anonymous_ifc_ifcu) -> bool { + unsafe { + self.ifcu_buf == other.ifcu_buf && + self.ifcu_req == other.ifcu_req + } + } + } + + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifc_ifcu { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ifc_ifcu") + .field("ifcu_buf", unsafe { &self.ifcu_buf }) + .field("ifcu_req", unsafe { &self.ifcu_req }) + .finish() + } + } + + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ifc_ifcu { + fn hash(&self, state: &mut H) { + unsafe { self.ifcu_buf.hash(state) }; + unsafe { self.ifcu_req.hash(state) }; + } + } + + impl PartialEq for ifstat { + fn eq(&self, other: &ifstat) -> bool { + let self_ascii: &[::c_char] = &self.ascii; + let other_ascii: &[::c_char] = &other.ascii; + + self.ifs_name == other.ifs_name && self_ascii == other_ascii + } + } + impl Eq for ifstat {} + impl ::fmt::Debug for ifstat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ascii: &[::c_char] = &self.ascii; + + f.debug_struct("ifstat") + .field("ifs_name", &self.ifs_name) + .field("ascii", &ascii) + .finish() + } + } + impl ::hash::Hash for ifstat { + fn hash(&self, state: &mut H) { + self.ifs_name.hash(state); + self.ascii.hash(state); + } + } + + impl PartialEq for ifrsskey { + fn eq(&self, other: &ifrsskey) -> bool { + let self_ifrk_key: &[u8] = &self.ifrk_key; + let other_ifrk_key: &[u8] = &other.ifrk_key; + + self.ifrk_name == other.ifrk_name && + self.ifrk_func == other.ifrk_func && + self.ifrk_spare0 == other.ifrk_spare0 && + self.ifrk_keylen == other.ifrk_keylen && + self_ifrk_key == other_ifrk_key + } + } + impl Eq for ifrsskey {} + impl ::fmt::Debug for ifrsskey { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ifrk_key: &[u8] = &self.ifrk_key; + + f.debug_struct("ifrsskey") + .field("ifrk_name", &self.ifrk_name) + .field("ifrk_func", &self.ifrk_func) + .field("ifrk_spare0", &self.ifrk_spare0) + .field("ifrk_keylen", &self.ifrk_keylen) + .field("ifrk_key", &ifrk_key) + .finish() + } + } + impl ::hash::Hash for ifrsskey { + fn hash(&self, state: &mut H) { + self.ifrk_name.hash(state); + self.ifrk_func.hash(state); + self.ifrk_spare0.hash(state); + self.ifrk_keylen.hash(state); + self.ifrk_key.hash(state); + } + } + + impl PartialEq for ifdownreason { + fn eq(&self, other: &ifdownreason) -> bool { + let self_ifdr_msg: &[::c_char] = &self.ifdr_msg; + let other_ifdr_msg: &[::c_char] = &other.ifdr_msg; + + self.ifdr_name == other.ifdr_name && + self.ifdr_reason == other.ifdr_reason && + self.ifdr_vendor == other.ifdr_vendor && + self_ifdr_msg == other_ifdr_msg + } + } + impl Eq for ifdownreason {} + impl ::fmt::Debug for ifdownreason { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ifdr_msg: &[::c_char] = &self.ifdr_msg; + + f.debug_struct("ifdownreason") + .field("ifdr_name", &self.ifdr_name) + .field("ifdr_reason", &self.ifdr_reason) + .field("ifdr_vendor", &self.ifdr_vendor) + .field("ifdr_msg", &ifdr_msg) + .finish() + } + } + impl ::hash::Hash for ifdownreason { + fn hash(&self, state: &mut H) { + self.ifdr_name.hash(state); + self.ifdr_reason.hash(state); + self.ifdr_vendor.hash(state); + self.ifdr_msg.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ifi_epoch { + fn eq(&self, other: &__c_anonymous_ifi_epoch) -> bool { + unsafe { + self.tt == other.tt && + self.ph == other.ph + } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_ifi_epoch {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifi_epoch { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__c_anonymous_ifi_epoch") + .field("tt", unsafe { &self.tt }) + .field("ph", unsafe { &self.ph }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ifi_epoch { + fn hash(&self, state: &mut H) { + unsafe { + self.tt.hash(state); + self.ph.hash(state); + } + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ifi_lastchange { + fn eq(&self, other: &__c_anonymous_ifi_lastchange) -> bool { + unsafe { + self.tv == other.tv && + self.ph == other.ph + } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_ifi_lastchange {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifi_lastchange { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("__c_anonymous_ifi_lastchange") + .field("tv", unsafe { &self.tv }) + .field("ph", unsafe { &self.ph }) + .finish() + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ifi_lastchange { + fn hash(&self, state: &mut H) { + unsafe { + self.tv.hash(state); + self.ph.hash(state); + } + } + } + + impl PartialEq for if_data { + fn eq(&self, other: &if_data) -> bool { + self.ifi_type == other.ifi_type && + self.ifi_physical == other.ifi_physical && + self.ifi_addrlen == other.ifi_addrlen && + self.ifi_hdrlen == other.ifi_hdrlen && + self.ifi_link_state == other.ifi_link_state && + self.ifi_vhid == other.ifi_vhid && + self.ifi_datalen == other.ifi_datalen && + self.ifi_mtu == other.ifi_mtu && + self.ifi_metric == other.ifi_metric && + self.ifi_baudrate == other.ifi_baudrate && + self.ifi_ipackets == other.ifi_ipackets && + self.ifi_ierrors == other.ifi_ierrors && + self.ifi_opackets == other.ifi_opackets && + self.ifi_oerrors == other.ifi_oerrors && + self.ifi_collisions == other.ifi_collisions && + self.ifi_ibytes == other.ifi_ibytes && + self.ifi_obytes == other.ifi_obytes && + self.ifi_imcasts == other.ifi_imcasts && + self.ifi_omcasts == other.ifi_omcasts && + self.ifi_iqdrops == other.ifi_iqdrops && + self.ifi_oqdrops == other.ifi_oqdrops && + self.ifi_noproto == other.ifi_noproto && + self.ifi_hwassist == other.ifi_hwassist && + self.__ifi_epoch == other.__ifi_epoch && + self.__ifi_lastchange == other.__ifi_lastchange + } + } + impl Eq for if_data {} + impl ::fmt::Debug for if_data { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("if_data") + .field("ifi_type", &self.ifi_type) + .field("ifi_physical", &self.ifi_physical) + .field("ifi_addrlen", &self.ifi_addrlen) + .field("ifi_hdrlen", &self.ifi_hdrlen) + .field("ifi_link_state", &self.ifi_link_state) + .field("ifi_vhid", &self.ifi_vhid) + .field("ifi_datalen", &self.ifi_datalen) + .field("ifi_mtu", &self.ifi_mtu) + .field("ifi_metric", &self.ifi_metric) + .field("ifi_baudrate", &self.ifi_baudrate) + .field("ifi_ipackets", &self.ifi_ipackets) + .field("ifi_ierrors", &self.ifi_ierrors) + .field("ifi_opackets", &self.ifi_opackets) + .field("ifi_oerrors", &self.ifi_oerrors) + .field("ifi_collisions", &self.ifi_collisions) + .field("ifi_ibytes", &self.ifi_ibytes) + .field("ifi_obytes", &self.ifi_obytes) + .field("ifi_imcasts", &self.ifi_imcasts) + .field("ifi_omcasts", &self.ifi_omcasts) + .field("ifi_iqdrops", &self.ifi_iqdrops) + .field("ifi_oqdrops", &self.ifi_oqdrops) + .field("ifi_noproto", &self.ifi_noproto) + .field("ifi_hwassist", &self.ifi_hwassist) + .field("__ifi_epoch", &self.__ifi_epoch) + .field("__ifi_lastchange", &self.__ifi_lastchange) + .finish() + } + } + impl ::hash::Hash for if_data { + fn hash(&self, state: &mut H) { + self.ifi_type.hash(state); + self.ifi_physical.hash(state); + self.ifi_addrlen.hash(state); + self.ifi_hdrlen.hash(state); + self.ifi_link_state.hash(state); + self.ifi_vhid.hash(state); + self.ifi_datalen.hash(state); + self.ifi_mtu.hash(state); + self.ifi_metric.hash(state); + self.ifi_baudrate.hash(state); + self.ifi_ipackets.hash(state); + self.ifi_ierrors.hash(state); + self.ifi_opackets.hash(state); + self.ifi_oerrors.hash(state); + self.ifi_collisions.hash(state); + self.ifi_ibytes.hash(state); + self.ifi_obytes.hash(state); + self.ifi_imcasts.hash(state); + self.ifi_omcasts.hash(state); + self.ifi_iqdrops.hash(state); + self.ifi_oqdrops.hash(state); + self.ifi_noproto.hash(state); + self.ifi_hwassist.hash(state); + self.__ifi_epoch.hash(state); + self.__ifi_lastchange.hash(state); + } + } + + impl PartialEq for sctphdr { + fn eq(&self, other: &sctphdr) -> bool { + return {self.src_port} == {other.src_port} && + {self.dest_port} == {other.dest_port} && + {self.v_tag} == {other.v_tag} && + {self.checksum} == {other.checksum} + } + } + impl Eq for sctphdr {} + impl ::fmt::Debug for sctphdr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctphdr") + .field("src_port", &{self.src_port}) + .field("dest_port", &{self.dest_port}) + .field("v_tag", &{self.v_tag}) + .field("checksum", &{self.checksum}) + .finish() + } + } + impl ::hash::Hash for sctphdr { + fn hash(&self, state: &mut H) { + {self.src_port}.hash(state); + {self.dest_port}.hash(state); + {self.v_tag}.hash(state); + {self.checksum}.hash(state); + } + } + + impl PartialEq for sctp_chunkhdr { + fn eq(&self, other: &sctp_chunkhdr) -> bool { + return {self.chunk_type} == {other.chunk_type} && + {self.chunk_flags} == {other.chunk_flags} && + {self.chunk_length} == {other.chunk_length} + } + } + impl Eq for sctp_chunkhdr {} + impl ::fmt::Debug for sctp_chunkhdr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_chunkhdr") + .field("chunk_type", &{self.chunk_type}) + .field("chunk_flags", &{self.chunk_flags}) + .field("chunk_length", &{self.chunk_length}) + .finish() + } + } + impl ::hash::Hash for sctp_chunkhdr { + fn hash(&self, state: &mut H) { + {self.chunk_type}.hash(state); + {self.chunk_flags}.hash(state); + {self.chunk_length}.hash(state); + } + } + + impl PartialEq for sctp_paramhdr { + fn eq(&self, other: &sctp_paramhdr) -> bool { + return {self.param_type} == {other.param_type} && + {self.param_length} == {other.param_length} + } + } + impl Eq for sctp_paramhdr {} + impl ::fmt::Debug for sctp_paramhdr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_paramhdr") + .field("param_type", &{self.param_type}) + .field("param_length", &{self.param_length}) + .finish() + } + } + impl ::hash::Hash for sctp_paramhdr { + fn hash(&self, state: &mut H) { + {self.param_type}.hash(state); + {self.param_length}.hash(state); + } + } + + impl PartialEq for sctp_gen_error_cause { + fn eq(&self, other: &sctp_gen_error_cause) -> bool { + return {self.code} == {other.code} && + {self.length} == {other.length} && + {self.info}.iter().zip({other.info}.iter()).all(|(a,b)| a == b) + } + } + impl Eq for sctp_gen_error_cause {} + impl ::fmt::Debug for sctp_gen_error_cause { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_gen_error_cause") + .field("code", &{self.code}) + .field("length", &{self.length}) + // FIXME: .field("info", &{self.info}) + .finish() + } + } + impl ::hash::Hash for sctp_gen_error_cause { + fn hash(&self, state: &mut H) { + {self.code}.hash(state); + {self.length}.hash(state); + {self.info}.hash(state); + } + } + + impl PartialEq for sctp_error_cause { + fn eq(&self, other: &sctp_error_cause) -> bool { + return {self.code} == {other.code} && + {self.length} == {other.length} + } + } + impl Eq for sctp_error_cause {} + impl ::fmt::Debug for sctp_error_cause { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_cause") + .field("code", &{self.code}) + .field("length", &{self.length}) + .finish() + } + } + impl ::hash::Hash for sctp_error_cause { + fn hash(&self, state: &mut H) { + {self.code}.hash(state); + {self.length}.hash(state); + } + } + + impl PartialEq for sctp_error_invalid_stream { + fn eq(&self, other: &sctp_error_invalid_stream) -> bool { + return {self.cause} == {other.cause} && + {self.stream_id} == {other.stream_id} + } + } + impl Eq for sctp_error_invalid_stream {} + impl ::fmt::Debug for sctp_error_invalid_stream { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_invalid_stream") + .field("cause", &{self.cause}) + .field("stream_id", &{self.stream_id}) + .finish() + } + } + impl ::hash::Hash for sctp_error_invalid_stream { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.stream_id}.hash(state); + } + } + + impl PartialEq for sctp_error_missing_param { + fn eq(&self, other: &sctp_error_missing_param) -> bool { + return {self.cause} == {other.cause} && + {self.num_missing_params} == {other.num_missing_params} && + {self.tpe}.iter().zip({other.tpe}.iter()).all(|(a,b)| a == b) + } + } + impl Eq for sctp_error_missing_param {} + impl ::fmt::Debug for sctp_error_missing_param { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_missing_param") + .field("cause", &{self.cause}) + .field("num_missing_params", &{self.num_missing_params}) + // FIXME: .field("tpe", &{self.tpe}) + .finish() + } + } + impl ::hash::Hash for sctp_error_missing_param { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.num_missing_params}.hash(state); + {self.tpe}.hash(state); + } + } + + impl PartialEq for sctp_error_stale_cookie { + fn eq(&self, other: &sctp_error_stale_cookie) -> bool { + return {self.cause} == {other.cause} && + {self.stale_time} == {other.stale_time} + } + } + impl Eq for sctp_error_stale_cookie {} + impl ::fmt::Debug for sctp_error_stale_cookie { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_stale_cookie") + .field("cause", &{self.cause}) + .field("stale_time", &{self.stale_time}) + .finish() + } + } + impl ::hash::Hash for sctp_error_stale_cookie { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.stale_time}.hash(state); + } + } + + impl PartialEq for sctp_error_out_of_resource { + fn eq(&self, other: &sctp_error_out_of_resource) -> bool { + return {self.cause} == {other.cause} + } + } + impl Eq for sctp_error_out_of_resource {} + impl ::fmt::Debug for sctp_error_out_of_resource { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_out_of_resource") + .field("cause", &{self.cause}) + .finish() + } + } + impl ::hash::Hash for sctp_error_out_of_resource { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + } + } + + impl PartialEq for sctp_error_unresolv_addr { + fn eq(&self, other: &sctp_error_unresolv_addr) -> bool { + return {self.cause} == {other.cause} + } + } + impl Eq for sctp_error_unresolv_addr {} + impl ::fmt::Debug for sctp_error_unresolv_addr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_unresolv_addr") + .field("cause", &{self.cause}) + .finish() + } + } + impl ::hash::Hash for sctp_error_unresolv_addr { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + } + } + + impl PartialEq for sctp_error_unrecognized_chunk { + fn eq(&self, other: &sctp_error_unrecognized_chunk) -> bool { + return {self.cause} == {other.cause} && + {self.ch} == {other.ch} + } + } + impl Eq for sctp_error_unrecognized_chunk {} + impl ::fmt::Debug for sctp_error_unrecognized_chunk { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_unrecognized_chunk") + .field("cause", &{self.cause}) + .field("ch", &{self.ch}) + .finish() + } + } + impl ::hash::Hash for sctp_error_unrecognized_chunk { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.ch}.hash(state); + } + } + + impl PartialEq for sctp_error_no_user_data { + fn eq(&self, other: &sctp_error_no_user_data) -> bool { + return {self.cause} == {other.cause} && + {self.tsn} == {other.tsn} + } + } + impl Eq for sctp_error_no_user_data {} + impl ::fmt::Debug for sctp_error_no_user_data { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_no_user_data") + .field("cause", &{self.cause}) + .field("tsn", &{self.tsn}) + .finish() + } + } + impl ::hash::Hash for sctp_error_no_user_data { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.tsn}.hash(state); + } + } + + impl PartialEq for sctp_error_auth_invalid_hmac { + fn eq(&self, other: &sctp_error_auth_invalid_hmac) -> bool { + return {self.cause} == {other.cause} && + {self.hmac_id} == {other.hmac_id} + } + } + impl Eq for sctp_error_auth_invalid_hmac {} + impl ::fmt::Debug for sctp_error_auth_invalid_hmac { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sctp_error_invalid_hmac") + .field("cause", &{self.cause}) + .field("hmac_id", &{self.hmac_id}) + .finish() + } + } + impl ::hash::Hash for sctp_error_auth_invalid_hmac { + fn hash(&self, state: &mut H) { + {self.cause}.hash(state); + {self.hmac_id}.hash(state); + } + } + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +#[repr(u32)] +pub enum dot3Vendors { + dot3VendorAMD = 1, + dot3VendorIntel = 2, + dot3VendorNational = 4, + dot3VendorFujitsu = 5, + dot3VendorDigital = 6, + dot3VendorWesternDigital = 7, +} +impl ::Copy for dot3Vendors {} +impl ::Clone for dot3Vendors { + fn clone(&self) -> dot3Vendors { + *self + } +} + +// aio.h +pub const LIO_VECTORED: ::c_int = 4; +pub const LIO_WRITEV: ::c_int = 5; +pub const LIO_READV: ::c_int = 6; + +// sys/devicestat.h +pub const DEVSTAT_N_TRANS_FLAGS: ::c_int = 4; +pub const DEVSTAT_NAME_LEN: ::c_int = 16; + +// sys/cpuset.h +pub const CPU_SETSIZE: ::c_int = 256; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const EXTATTR_NAMESPACE_EMPTY: ::c_int = 0; +pub const EXTATTR_NAMESPACE_USER: ::c_int = 1; +pub const EXTATTR_NAMESPACE_SYSTEM: ::c_int = 2; + +pub const PTHREAD_STACK_MIN: ::size_t = MINSIGSTKSZ; +pub const PTHREAD_MUTEX_ADAPTIVE_NP: ::c_int = 4; +pub const PTHREAD_MUTEX_STALLED: ::c_int = 0; +pub const PTHREAD_MUTEX_ROBUST: ::c_int = 1; +pub const SIGSTKSZ: ::size_t = MINSIGSTKSZ + 32768; +pub const SF_NODISKIO: ::c_int = 0x00000001; +pub const SF_MNOWAIT: ::c_int = 0x00000002; +pub const SF_SYNC: ::c_int = 0x00000004; +pub const SF_USER_READAHEAD: ::c_int = 0x00000008; +pub const SF_NOCACHE: ::c_int = 0x00000010; +pub const O_CLOEXEC: ::c_int = 0x00100000; +pub const O_DIRECTORY: ::c_int = 0x00020000; +pub const O_DSYNC: ::c_int = 0x01000000; +pub const O_EMPTY_PATH: ::c_int = 0x02000000; +pub const O_EXEC: ::c_int = 0x00040000; +pub const O_PATH: ::c_int = 0x00400000; +pub const O_RESOLVE_BENEATH: ::c_int = 0x00800000; +pub const O_SEARCH: ::c_int = O_EXEC; +pub const O_TTY_INIT: ::c_int = 0x00080000; +pub const O_VERIFY: ::c_int = 0x00200000; +pub const F_GETLK: ::c_int = 11; +pub const F_SETLK: ::c_int = 12; +pub const F_SETLKW: ::c_int = 13; +pub const ENOTCAPABLE: ::c_int = 93; +pub const ECAPMODE: ::c_int = 94; +pub const ENOTRECOVERABLE: ::c_int = 95; +pub const EOWNERDEAD: ::c_int = 96; +pub const EINTEGRITY: ::c_int = 97; +pub const RLIMIT_NPTS: ::c_int = 11; +pub const RLIMIT_SWAP: ::c_int = 12; +pub const RLIMIT_KQUEUES: ::c_int = 13; +pub const RLIMIT_UMTXP: ::c_int = 14; +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: ::rlim_t = 15; +pub const RLIM_SAVED_MAX: ::rlim_t = ::RLIM_INFINITY; +pub const RLIM_SAVED_CUR: ::rlim_t = ::RLIM_INFINITY; + +pub const CP_USER: ::c_int = 0; +pub const CP_NICE: ::c_int = 1; +pub const CP_SYS: ::c_int = 2; +pub const CP_INTR: ::c_int = 3; +pub const CP_IDLE: ::c_int = 4; +pub const CPUSTATES: ::c_int = 5; + +pub const NI_NOFQDN: ::c_int = 0x00000001; +pub const NI_NUMERICHOST: ::c_int = 0x00000002; +pub const NI_NAMEREQD: ::c_int = 0x00000004; +pub const NI_NUMERICSERV: ::c_int = 0x00000008; +pub const NI_DGRAM: ::c_int = 0x00000010; +pub const NI_NUMERICSCOPE: ::c_int = 0x00000020; + +pub const XU_NGROUPS: ::c_int = 16; + +pub const Q_GETQUOTA: ::c_int = 0x700; +pub const Q_SETQUOTA: ::c_int = 0x800; + +pub const MAP_GUARD: ::c_int = 0x00002000; +pub const MAP_EXCL: ::c_int = 0x00004000; +pub const MAP_PREFAULT_READ: ::c_int = 0x00040000; +pub const MAP_ALIGNED_SUPER: ::c_int = 1 << 24; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const POLLINIGNEOF: ::c_short = 0x2000; + +pub const EVFILT_READ: i16 = -1; +pub const EVFILT_WRITE: i16 = -2; +pub const EVFILT_AIO: i16 = -3; +pub const EVFILT_VNODE: i16 = -4; +pub const EVFILT_PROC: i16 = -5; +pub const EVFILT_SIGNAL: i16 = -6; +pub const EVFILT_TIMER: i16 = -7; +pub const EVFILT_PROCDESC: i16 = -8; +pub const EVFILT_FS: i16 = -9; +pub const EVFILT_LIO: i16 = -10; +pub const EVFILT_USER: i16 = -11; +pub const EVFILT_SENDFILE: i16 = -12; +pub const EVFILT_EMPTY: i16 = -13; + +pub const EV_ADD: u16 = 0x1; +pub const EV_DELETE: u16 = 0x2; +pub const EV_ENABLE: u16 = 0x4; +pub const EV_DISABLE: u16 = 0x8; +pub const EV_FORCEONESHOT: u16 = 0x100; +pub const EV_KEEPUDATA: u16 = 0x200; + +pub const EV_ONESHOT: u16 = 0x10; +pub const EV_CLEAR: u16 = 0x20; +pub const EV_RECEIPT: u16 = 0x40; +pub const EV_DISPATCH: u16 = 0x80; +pub const EV_SYSFLAGS: u16 = 0xf000; +pub const EV_DROP: u16 = 0x1000; +pub const EV_FLAG1: u16 = 0x2000; +pub const EV_FLAG2: u16 = 0x4000; + +pub const EV_EOF: u16 = 0x8000; +pub const EV_ERROR: u16 = 0x4000; + +pub const NOTE_TRIGGER: u32 = 0x01000000; +pub const NOTE_FFNOP: u32 = 0x00000000; +pub const NOTE_FFAND: u32 = 0x40000000; +pub const NOTE_FFOR: u32 = 0x80000000; +pub const NOTE_FFCOPY: u32 = 0xc0000000; +pub const NOTE_FFCTRLMASK: u32 = 0xc0000000; +pub const NOTE_FFLAGSMASK: u32 = 0x00ffffff; +pub const NOTE_LOWAT: u32 = 0x00000001; +pub const NOTE_FILE_POLL: u32 = 0x00000002; +pub const NOTE_DELETE: u32 = 0x00000001; +pub const NOTE_WRITE: u32 = 0x00000002; +pub const NOTE_EXTEND: u32 = 0x00000004; +pub const NOTE_ATTRIB: u32 = 0x00000008; +pub const NOTE_LINK: u32 = 0x00000010; +pub const NOTE_RENAME: u32 = 0x00000020; +pub const NOTE_REVOKE: u32 = 0x00000040; +pub const NOTE_OPEN: u32 = 0x00000080; +pub const NOTE_CLOSE: u32 = 0x00000100; +pub const NOTE_CLOSE_WRITE: u32 = 0x00000200; +pub const NOTE_READ: u32 = 0x00000400; +pub const NOTE_EXIT: u32 = 0x80000000; +pub const NOTE_FORK: u32 = 0x40000000; +pub const NOTE_EXEC: u32 = 0x20000000; +pub const NOTE_PDATAMASK: u32 = 0x000fffff; +pub const NOTE_PCTRLMASK: u32 = 0xf0000000; +pub const NOTE_TRACK: u32 = 0x00000001; +pub const NOTE_TRACKERR: u32 = 0x00000002; +pub const NOTE_CHILD: u32 = 0x00000004; +pub const NOTE_SECONDS: u32 = 0x00000001; +pub const NOTE_MSECONDS: u32 = 0x00000002; +pub const NOTE_USECONDS: u32 = 0x00000004; +pub const NOTE_NSECONDS: u32 = 0x00000008; +pub const NOTE_ABSTIME: u32 = 0x00000010; + +pub const MADV_PROTECT: ::c_int = 10; + +#[doc(hidden)] +#[deprecated( + since = "0.2.72", + note = "CTL_UNSPEC is deprecated. Use CTL_SYSCTL instead" +)] +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_SYSCTL: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_P1003_1B: ::c_int = 9; + +// sys/sysctl.h +pub const CTL_MAXNAME: ::c_int = 24; + +pub const CTLTYPE: ::c_int = 0xf; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_S64: ::c_int = 4; +pub const CTLTYPE_OPAQUE: ::c_int = 5; +pub const CTLTYPE_STRUCT: ::c_int = CTLTYPE_OPAQUE; +pub const CTLTYPE_UINT: ::c_int = 6; +pub const CTLTYPE_LONG: ::c_int = 7; +pub const CTLTYPE_ULONG: ::c_int = 8; +pub const CTLTYPE_U64: ::c_int = 9; +pub const CTLTYPE_U8: ::c_int = 0xa; +pub const CTLTYPE_U16: ::c_int = 0xb; +pub const CTLTYPE_S8: ::c_int = 0xc; +pub const CTLTYPE_S16: ::c_int = 0xd; +pub const CTLTYPE_S32: ::c_int = 0xe; +pub const CTLTYPE_U32: ::c_int = 0xf; + +pub const CTLFLAG_RD: ::c_int = 0x80000000; +pub const CTLFLAG_WR: ::c_int = 0x40000000; +pub const CTLFLAG_RW: ::c_int = CTLFLAG_RD | CTLFLAG_WR; +pub const CTLFLAG_DORMANT: ::c_int = 0x20000000; +pub const CTLFLAG_ANYBODY: ::c_int = 0x10000000; +pub const CTLFLAG_SECURE: ::c_int = 0x08000000; +pub const CTLFLAG_PRISON: ::c_int = 0x04000000; +pub const CTLFLAG_DYN: ::c_int = 0x02000000; +pub const CTLFLAG_SKIP: ::c_int = 0x01000000; +pub const CTLMASK_SECURE: ::c_int = 0x00F00000; +pub const CTLFLAG_TUN: ::c_int = 0x00080000; +pub const CTLFLAG_RDTUN: ::c_int = CTLFLAG_RD | CTLFLAG_TUN; +pub const CTLFLAG_RWTUN: ::c_int = CTLFLAG_RW | CTLFLAG_TUN; +pub const CTLFLAG_MPSAFE: ::c_int = 0x00040000; +pub const CTLFLAG_VNET: ::c_int = 0x00020000; +pub const CTLFLAG_DYING: ::c_int = 0x00010000; +pub const CTLFLAG_CAPRD: ::c_int = 0x00008000; +pub const CTLFLAG_CAPWR: ::c_int = 0x00004000; +pub const CTLFLAG_STATS: ::c_int = 0x00002000; +pub const CTLFLAG_NOFETCH: ::c_int = 0x00001000; +pub const CTLFLAG_CAPRW: ::c_int = CTLFLAG_CAPRD | CTLFLAG_CAPWR; +pub const CTLFLAG_NEEDGIANT: ::c_int = 0x00000800; + +pub const CTLSHIFT_SECURE: ::c_int = 20; +pub const CTLFLAG_SECURE1: ::c_int = CTLFLAG_SECURE | (0 << CTLSHIFT_SECURE); +pub const CTLFLAG_SECURE2: ::c_int = CTLFLAG_SECURE | (1 << CTLSHIFT_SECURE); +pub const CTLFLAG_SECURE3: ::c_int = CTLFLAG_SECURE | (2 << CTLSHIFT_SECURE); + +pub const OID_AUTO: ::c_int = -1; + +pub const CTL_SYSCTL_DEBUG: ::c_int = 0; +pub const CTL_SYSCTL_NAME: ::c_int = 1; +pub const CTL_SYSCTL_NEXT: ::c_int = 2; +pub const CTL_SYSCTL_NAME2OID: ::c_int = 3; +pub const CTL_SYSCTL_OIDFMT: ::c_int = 4; +pub const CTL_SYSCTL_OIDDESCR: ::c_int = 5; +pub const CTL_SYSCTL_OIDLABEL: ::c_int = 6; +pub const CTL_SYSCTL_NEXTNOSKIP: ::c_int = 7; + +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_NISDOMAINNAME: ::c_int = 22; +pub const KERN_UPDATEINTERVAL: ::c_int = 23; +pub const KERN_OSRELDATE: ::c_int = 24; +pub const KERN_NTP_PLL: ::c_int = 25; +pub const KERN_BOOTFILE: ::c_int = 26; +pub const KERN_MAXFILESPERPROC: ::c_int = 27; +pub const KERN_MAXPROCPERUID: ::c_int = 28; +pub const KERN_DUMPDEV: ::c_int = 29; +pub const KERN_IPC: ::c_int = 30; +pub const KERN_DUMMY: ::c_int = 31; +pub const KERN_PS_STRINGS: ::c_int = 32; +pub const KERN_USRSTACK: ::c_int = 33; +pub const KERN_LOGSIGEXIT: ::c_int = 34; +pub const KERN_IOV_MAX: ::c_int = 35; +pub const KERN_HOSTUUID: ::c_int = 36; +pub const KERN_ARND: ::c_int = 37; +pub const KERN_MAXPHYS: ::c_int = 38; + +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_ARGS: ::c_int = 7; +pub const KERN_PROC_PROC: ::c_int = 8; +pub const KERN_PROC_SV_NAME: ::c_int = 9; +pub const KERN_PROC_RGID: ::c_int = 10; +pub const KERN_PROC_GID: ::c_int = 11; +pub const KERN_PROC_PATHNAME: ::c_int = 12; +pub const KERN_PROC_OVMMAP: ::c_int = 13; +pub const KERN_PROC_OFILEDESC: ::c_int = 14; +pub const KERN_PROC_KSTACK: ::c_int = 15; +pub const KERN_PROC_INC_THREAD: ::c_int = 0x10; +pub const KERN_PROC_VMMAP: ::c_int = 32; +pub const KERN_PROC_FILEDESC: ::c_int = 33; +pub const KERN_PROC_GROUPS: ::c_int = 34; +pub const KERN_PROC_ENV: ::c_int = 35; +pub const KERN_PROC_AUXV: ::c_int = 36; +pub const KERN_PROC_RLIMIT: ::c_int = 37; +pub const KERN_PROC_PS_STRINGS: ::c_int = 38; +pub const KERN_PROC_UMASK: ::c_int = 39; +pub const KERN_PROC_OSREL: ::c_int = 40; +pub const KERN_PROC_SIGTRAMP: ::c_int = 41; +pub const KERN_PROC_CWD: ::c_int = 42; +pub const KERN_PROC_NFDS: ::c_int = 43; +pub const KERN_PROC_SIGFASTBLK: ::c_int = 44; + +pub const KIPC_MAXSOCKBUF: ::c_int = 1; +pub const KIPC_SOCKBUF_WASTE: ::c_int = 2; +pub const KIPC_SOMAXCONN: ::c_int = 3; +pub const KIPC_MAX_LINKHDR: ::c_int = 4; +pub const KIPC_MAX_PROTOHDR: ::c_int = 5; +pub const KIPC_MAX_HDR: ::c_int = 6; +pub const KIPC_MAX_DATALEN: ::c_int = 7; + +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_DISKSTATS: ::c_int = 9; +pub const HW_FLOATINGPT: ::c_int = 10; +pub const HW_MACHINE_ARCH: ::c_int = 11; +pub const HW_REALMEM: ::c_int = 12; + +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_LOCALBASE: ::c_int = 21; + +pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1; +pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2; +pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3; +pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4; +pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5; +pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6; +pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7; +pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8; +pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9; +pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10; +pub const CTL_P1003_1B_FSYNC: ::c_int = 11; +pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12; +pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13; +pub const CTL_P1003_1B_TIMERS: ::c_int = 14; +pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15; +pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16; +pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17; +pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18; +pub const CTL_P1003_1B_MQ_OPEN_MAX: ::c_int = 19; +pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20; +pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21; +pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22; +pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23; +pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24; +pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25; + +pub const TIOCGPTN: ::c_ulong = 0x4004740f; +pub const TIOCPTMASTER: ::c_ulong = 0x2000741c; +pub const TIOCSIG: ::c_ulong = 0x2004745f; +pub const TIOCM_DCD: ::c_int = 0x40; +pub const H4DISC: ::c_int = 0x7; + +pub const VM_TOTAL: ::c_int = 1; + +pub const BIOCSETFNR: ::c_ulong = 0x80104282; + +pub const FIODGNAME: ::c_ulong = 0x80106678; +pub const FIONWRITE: ::c_ulong = 0x40046677; +pub const FIONSPACE: ::c_ulong = 0x40046676; +pub const FIOSEEKDATA: ::c_ulong = 0xc0086661; +pub const FIOSEEKHOLE: ::c_ulong = 0xc0086662; +pub const FIOSSHMLPGCNF: ::c_ulong = 0x80306664; + +pub const JAIL_API_VERSION: u32 = 2; +pub const JAIL_CREATE: ::c_int = 0x01; +pub const JAIL_UPDATE: ::c_int = 0x02; +pub const JAIL_ATTACH: ::c_int = 0x04; +pub const JAIL_DYING: ::c_int = 0x08; +pub const JAIL_SET_MASK: ::c_int = 0x0f; +pub const JAIL_GET_MASK: ::c_int = 0x08; +pub const JAIL_SYS_DISABLE: ::c_int = 0; +pub const JAIL_SYS_NEW: ::c_int = 1; +pub const JAIL_SYS_INHERIT: ::c_int = 2; + +pub const MNT_ACLS: ::c_int = 0x08000000; +pub const MNT_BYFSID: ::c_int = 0x08000000; +pub const MNT_GJOURNAL: ::c_int = 0x02000000; +pub const MNT_MULTILABEL: ::c_int = 0x04000000; +pub const MNT_NFS4ACLS: ::c_int = 0x00000010; +pub const MNT_SNAPSHOT: ::c_int = 0x01000000; +pub const MNT_UNION: ::c_int = 0x00000020; +pub const MNT_NONBUSY: ::c_int = 0x04000000; + +pub const SCM_BINTIME: ::c_int = 0x04; +pub const SCM_REALTIME: ::c_int = 0x05; +pub const SCM_MONOTONIC: ::c_int = 0x06; +pub const SCM_TIME_INFO: ::c_int = 0x07; +pub const SCM_CREDS2: ::c_int = 0x08; + +pub const SO_BINTIME: ::c_int = 0x2000; +pub const SO_NO_OFFLOAD: ::c_int = 0x4000; +pub const SO_NO_DDP: ::c_int = 0x8000; +pub const SO_REUSEPORT_LB: ::c_int = 0x10000; +pub const SO_LABEL: ::c_int = 0x1009; +pub const SO_PEERLABEL: ::c_int = 0x1010; +pub const SO_LISTENQLIMIT: ::c_int = 0x1011; +pub const SO_LISTENQLEN: ::c_int = 0x1012; +pub const SO_LISTENINCQLEN: ::c_int = 0x1013; +pub const SO_SETFIB: ::c_int = 0x1014; +pub const SO_USER_COOKIE: ::c_int = 0x1015; +pub const SO_PROTOCOL: ::c_int = 0x1016; +pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL; +pub const SO_TS_CLOCK: ::c_int = 0x1017; +pub const SO_DOMAIN: ::c_int = 0x1019; +pub const SO_VENDOR: ::c_int = 0x80000000; + +pub const SO_TS_REALTIME_MICRO: ::c_int = 0; +pub const SO_TS_BINTIME: ::c_int = 1; +pub const SO_TS_REALTIME: ::c_int = 2; +pub const SO_TS_MONOTONIC: ::c_int = 3; +pub const SO_TS_DEFAULT: ::c_int = SO_TS_REALTIME_MICRO; +pub const SO_TS_CLOCK_MAX: ::c_int = SO_TS_MONOTONIC; + +pub const LOCAL_CREDS: ::c_int = 2; +pub const LOCAL_CREDS_PERSISTENT: ::c_int = 3; +pub const LOCAL_CONNWAIT: ::c_int = 4; +pub const LOCAL_VENDOR: ::c_int = SO_VENDOR; + +pub const PL_EVENT_NONE: ::c_int = 0; +pub const PL_EVENT_SIGNAL: ::c_int = 1; +pub const PL_FLAG_SA: ::c_int = 0x01; +pub const PL_FLAG_BOUND: ::c_int = 0x02; +pub const PL_FLAG_SCE: ::c_int = 0x04; +pub const PL_FLAG_SCX: ::c_int = 0x08; +pub const PL_FLAG_EXEC: ::c_int = 0x10; +pub const PL_FLAG_SI: ::c_int = 0x20; +pub const PL_FLAG_FORKED: ::c_int = 0x40; +pub const PL_FLAG_CHILD: ::c_int = 0x80; +pub const PL_FLAG_BORN: ::c_int = 0x100; +pub const PL_FLAG_EXITED: ::c_int = 0x200; +pub const PL_FLAG_VFORKED: ::c_int = 0x400; +pub const PL_FLAG_VFORK_DONE: ::c_int = 0x800; + +pub const PT_LWPINFO: ::c_int = 13; +pub const PT_GETNUMLWPS: ::c_int = 14; +pub const PT_GETLWPLIST: ::c_int = 15; +pub const PT_CLEARSTEP: ::c_int = 16; +pub const PT_SETSTEP: ::c_int = 17; +pub const PT_SUSPEND: ::c_int = 18; +pub const PT_RESUME: ::c_int = 19; +pub const PT_TO_SCE: ::c_int = 20; +pub const PT_TO_SCX: ::c_int = 21; +pub const PT_SYSCALL: ::c_int = 22; +pub const PT_FOLLOW_FORK: ::c_int = 23; +pub const PT_LWP_EVENTS: ::c_int = 24; +pub const PT_GET_EVENT_MASK: ::c_int = 25; +pub const PT_SET_EVENT_MASK: ::c_int = 26; +pub const PT_GET_SC_ARGS: ::c_int = 27; +pub const PT_GET_SC_RET: ::c_int = 28; +pub const PT_COREDUMP: ::c_int = 29; +pub const PT_GETREGS: ::c_int = 33; +pub const PT_SETREGS: ::c_int = 34; +pub const PT_GETFPREGS: ::c_int = 35; +pub const PT_SETFPREGS: ::c_int = 36; +pub const PT_GETDBREGS: ::c_int = 37; +pub const PT_SETDBREGS: ::c_int = 38; +pub const PT_VM_TIMESTAMP: ::c_int = 40; +pub const PT_VM_ENTRY: ::c_int = 41; +pub const PT_GETREGSET: ::c_int = 42; +pub const PT_SETREGSET: ::c_int = 43; +pub const PT_SC_REMOTE: ::c_int = 44; +pub const PT_FIRSTMACH: ::c_int = 64; + +pub const PTRACE_EXEC: ::c_int = 0x0001; +pub const PTRACE_SCE: ::c_int = 0x0002; +pub const PTRACE_SCX: ::c_int = 0x0004; +pub const PTRACE_SYSCALL: ::c_int = PTRACE_SCE | PTRACE_SCX; +pub const PTRACE_FORK: ::c_int = 0x0008; +pub const PTRACE_LWP: ::c_int = 0x0010; +pub const PTRACE_VFORK: ::c_int = 0x0020; +pub const PTRACE_DEFAULT: ::c_int = PTRACE_EXEC; + +pub const PC_COMPRESS: u32 = 0x00000001; +pub const PC_ALL: u32 = 0x00000002; + +pub const PROC_SPROTECT: ::c_int = 1; +pub const PROC_REAP_ACQUIRE: ::c_int = 2; +pub const PROC_REAP_RELEASE: ::c_int = 3; +pub const PROC_REAP_STATUS: ::c_int = 4; +pub const PROC_REAP_GETPIDS: ::c_int = 5; +pub const PROC_REAP_KILL: ::c_int = 6; +pub const PROC_TRACE_CTL: ::c_int = 7; +pub const PROC_TRACE_STATUS: ::c_int = 8; +pub const PROC_TRAPCAP_CTL: ::c_int = 9; +pub const PROC_TRAPCAP_STATUS: ::c_int = 10; +pub const PROC_PDEATHSIG_CTL: ::c_int = 11; +pub const PROC_PDEATHSIG_STATUS: ::c_int = 12; +pub const PROC_ASLR_CTL: ::c_int = 13; +pub const PROC_ASLR_STATUS: ::c_int = 14; +pub const PROC_PROTMAX_CTL: ::c_int = 15; +pub const PROC_PROTMAX_STATUS: ::c_int = 16; +pub const PROC_STACKGAP_CTL: ::c_int = 17; +pub const PROC_STACKGAP_STATUS: ::c_int = 18; +pub const PROC_NO_NEW_PRIVS_CTL: ::c_int = 19; +pub const PROC_NO_NEW_PRIVS_STATUS: ::c_int = 20; +pub const PROC_WXMAP_CTL: ::c_int = 21; +pub const PROC_WXMAP_STATUS: ::c_int = 22; +pub const PROC_PROCCTL_MD_MIN: ::c_int = 0x10000000; + +pub const PPROT_SET: ::c_int = 1; +pub const PPROT_CLEAR: ::c_int = 2; +pub const PPROT_DESCEND: ::c_int = 0x10; +pub const PPROT_INHERIT: ::c_int = 0x20; + +pub const PROC_TRACE_CTL_ENABLE: ::c_int = 1; +pub const PROC_TRACE_CTL_DISABLE: ::c_int = 2; +pub const PROC_TRACE_CTL_DISABLE_EXEC: ::c_int = 3; + +pub const PROC_TRAPCAP_CTL_ENABLE: ::c_int = 1; +pub const PROC_TRAPCAP_CTL_DISABLE: ::c_int = 2; + +pub const PROC_ASLR_FORCE_ENABLE: ::c_int = 1; +pub const PROC_ASLR_FORCE_DISABLE: ::c_int = 2; +pub const PROC_ASLR_NOFORCE: ::c_int = 3; +pub const PROC_ASLR_ACTIVE: ::c_int = 0x80000000; + +pub const PROC_PROTMAX_FORCE_ENABLE: ::c_int = 1; +pub const PROC_PROTMAX_FORCE_DISABLE: ::c_int = 2; +pub const PROC_PROTMAX_NOFORCE: ::c_int = 3; +pub const PROC_PROTMAX_ACTIVE: ::c_int = 0x80000000; + +pub const PROC_STACKGAP_ENABLE: ::c_int = 0x0001; +pub const PROC_STACKGAP_DISABLE: ::c_int = 0x0002; +pub const PROC_STACKGAP_ENABLE_EXEC: ::c_int = 0x0004; +pub const PROC_STACKGAP_DISABLE_EXEC: ::c_int = 0x0008; + +pub const PROC_NO_NEW_PRIVS_ENABLE: ::c_int = 1; +pub const PROC_NO_NEW_PRIVS_DISABLE: ::c_int = 2; + +pub const PROC_WX_MAPPINGS_PERMIT: ::c_int = 0x0001; +pub const PROC_WX_MAPPINGS_DISALLOW_EXEC: ::c_int = 0x0002; +pub const PROC_WXORX_ENFORCE: ::c_int = 0x80000000; + +pub const AF_SLOW: ::c_int = 33; +pub const AF_SCLUSTER: ::c_int = 34; +pub const AF_ARP: ::c_int = 35; +pub const AF_BLUETOOTH: ::c_int = 36; +pub const AF_IEEE80211: ::c_int = 37; +pub const AF_INET_SDP: ::c_int = 40; +pub const AF_INET6_SDP: ::c_int = 42; + +// sys/net/if.h +pub const IF_MAXUNIT: ::c_int = 0x7fff; +/// (n) interface is up +pub const IFF_UP: ::c_int = 0x1; +/// (i) broadcast address valid +pub const IFF_BROADCAST: ::c_int = 0x2; +/// (n) turn on debugging +pub const IFF_DEBUG: ::c_int = 0x4; +/// (i) is a loopback net +pub const IFF_LOOPBACK: ::c_int = 0x8; +/// (i) is a point-to-point link +pub const IFF_POINTOPOINT: ::c_int = 0x10; +/// (i) calls if_input in net epoch +pub const IFF_KNOWSEPOCH: ::c_int = 0x20; +/// (d) resources allocated +pub const IFF_RUNNING: ::c_int = 0x40; +#[doc(hidden)] +#[deprecated( + since = "0.2.54", + note = "IFF_DRV_RUNNING is deprecated. Use the portable IFF_RUNNING instead" +)] +/// (d) resources allocate +pub const IFF_DRV_RUNNING: ::c_int = 0x40; +/// (n) no address resolution protocol +pub const IFF_NOARP: ::c_int = 0x80; +/// (n) receive all packets +pub const IFF_PROMISC: ::c_int = 0x100; +/// (n) receive all multicast packets +pub const IFF_ALLMULTI: ::c_int = 0x200; +/// (d) tx hardware queue is full +pub const IFF_OACTIVE: ::c_int = 0x400; +#[doc(hidden)] +#[deprecated(since = "0.2.54", note = "Use the portable `IFF_OACTIVE` instead")] +/// (d) tx hardware queue is full +pub const IFF_DRV_OACTIVE: ::c_int = 0x400; +/// (i) can't hear own transmissions +pub const IFF_SIMPLEX: ::c_int = 0x800; +/// per link layer defined bit +pub const IFF_LINK0: ::c_int = 0x1000; +/// per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; +/// per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; +/// use alternate physical connection +pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; +/// (i) supports multicast +pub const IFF_MULTICAST: ::c_int = 0x8000; +/// (i) unconfigurable using ioctl(2) +pub const IFF_CANTCONFIG: ::c_int = 0x10000; +/// (n) user-requested promisc mode +pub const IFF_PPROMISC: ::c_int = 0x20000; +/// (n) user-requested monitor mode +pub const IFF_MONITOR: ::c_int = 0x40000; +/// (n) static ARP +pub const IFF_STATICARP: ::c_int = 0x80000; +/// (n) interface is winding down +pub const IFF_DYING: ::c_int = 0x200000; +/// (n) interface is being renamed +pub const IFF_RENAMING: ::c_int = 0x400000; +/// interface is not part of any groups +pub const IFF_NOGROUP: ::c_int = 0x800000; + +/// link invalid/unknown +pub const LINK_STATE_UNKNOWN: ::c_int = 0; +/// link is down +pub const LINK_STATE_DOWN: ::c_int = 1; +/// link is up +pub const LINK_STATE_UP: ::c_int = 2; + +/// can offload checksum on RX +pub const IFCAP_RXCSUM: ::c_int = 0x00001; +/// can offload checksum on TX +pub const IFCAP_TXCSUM: ::c_int = 0x00002; +/// can be a network console +pub const IFCAP_NETCONS: ::c_int = 0x00004; +/// VLAN-compatible MTU +pub const IFCAP_VLAN_MTU: ::c_int = 0x00008; +/// hardware VLAN tag support +pub const IFCAP_VLAN_HWTAGGING: ::c_int = 0x00010; +/// 9000 byte MTU supported +pub const IFCAP_JUMBO_MTU: ::c_int = 0x00020; +/// driver supports polling +pub const IFCAP_POLLING: ::c_int = 0x00040; +/// can do IFCAP_HWCSUM on VLANs +pub const IFCAP_VLAN_HWCSUM: ::c_int = 0x00080; +/// can do TCP Segmentation Offload +pub const IFCAP_TSO4: ::c_int = 0x00100; +/// can do TCP6 Segmentation Offload +pub const IFCAP_TSO6: ::c_int = 0x00200; +/// can do Large Receive Offload +pub const IFCAP_LRO: ::c_int = 0x00400; +/// wake on any unicast frame +pub const IFCAP_WOL_UCAST: ::c_int = 0x00800; +/// wake on any multicast frame +pub const IFCAP_WOL_MCAST: ::c_int = 0x01000; +/// wake on any Magic Packet +pub const IFCAP_WOL_MAGIC: ::c_int = 0x02000; +/// interface can offload TCP +pub const IFCAP_TOE4: ::c_int = 0x04000; +/// interface can offload TCP6 +pub const IFCAP_TOE6: ::c_int = 0x08000; +/// interface hw can filter vlan tag +pub const IFCAP_VLAN_HWFILTER: ::c_int = 0x10000; +/// can do SIOCGIFCAPNV/SIOCSIFCAPNV +pub const IFCAP_NV: ::c_int = 0x20000; +/// can do IFCAP_TSO on VLANs +pub const IFCAP_VLAN_HWTSO: ::c_int = 0x40000; +/// the runtime link state is dynamic +pub const IFCAP_LINKSTATE: ::c_int = 0x80000; +/// netmap mode supported/enabled +pub const IFCAP_NETMAP: ::c_int = 0x100000; +/// can offload checksum on IPv6 RX +pub const IFCAP_RXCSUM_IPV6: ::c_int = 0x200000; +/// can offload checksum on IPv6 TX +pub const IFCAP_TXCSUM_IPV6: ::c_int = 0x400000; +/// manages counters internally +pub const IFCAP_HWSTATS: ::c_int = 0x800000; +/// hardware supports TX rate limiting +pub const IFCAP_TXRTLMT: ::c_int = 0x1000000; +/// hardware rx timestamping +pub const IFCAP_HWRXTSTMP: ::c_int = 0x2000000; +/// understands M_EXTPG mbufs +pub const IFCAP_MEXTPG: ::c_int = 0x4000000; +/// can do TLS encryption and segmentation for TCP +pub const IFCAP_TXTLS4: ::c_int = 0x8000000; +/// can do TLS encryption and segmentation for TCP6 +pub const IFCAP_TXTLS6: ::c_int = 0x10000000; +/// can do IFCAN_HWCSUM on VXLANs +pub const IFCAP_VXLAN_HWCSUM: ::c_int = 0x20000000; +/// can do IFCAP_TSO on VXLANs +pub const IFCAP_VXLAN_HWTSO: ::c_int = 0x40000000; +/// can do TLS with rate limiting +pub const IFCAP_TXTLS_RTLMT: ::c_int = 0x80000000; + +pub const IFCAP_HWCSUM_IPV6: ::c_int = IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6; +pub const IFCAP_HWCSUM: ::c_int = IFCAP_RXCSUM | IFCAP_TXCSUM; +pub const IFCAP_TSO: ::c_int = IFCAP_TSO4 | IFCAP_TSO6; +pub const IFCAP_WOL: ::c_int = IFCAP_WOL_UCAST | IFCAP_WOL_MCAST | IFCAP_WOL_MAGIC; +pub const IFCAP_TOE: ::c_int = IFCAP_TOE4 | IFCAP_TOE6; +pub const IFCAP_TXTLS: ::c_int = IFCAP_TXTLS4 | IFCAP_TXTLS6; +pub const IFCAP_CANTCHANGE: ::c_int = IFCAP_NETMAP | IFCAP_NV; + +pub const IFQ_MAXLEN: ::c_int = 50; +pub const IFNET_SLOWHZ: ::c_int = 1; + +pub const IFAN_ARRIVAL: ::c_int = 0; +pub const IFAN_DEPARTURE: ::c_int = 1; + +pub const IFSTATMAX: ::c_int = 800; + +pub const RSS_FUNC_NONE: ::c_int = 0; +pub const RSS_FUNC_PRIVATE: ::c_int = 1; +pub const RSS_FUNC_TOEPLITZ: ::c_int = 2; + +pub const RSS_TYPE_IPV4: ::c_int = 0x00000001; +pub const RSS_TYPE_TCP_IPV4: ::c_int = 0x00000002; +pub const RSS_TYPE_IPV6: ::c_int = 0x00000004; +pub const RSS_TYPE_IPV6_EX: ::c_int = 0x00000008; +pub const RSS_TYPE_TCP_IPV6: ::c_int = 0x00000010; +pub const RSS_TYPE_TCP_IPV6_EX: ::c_int = 0x00000020; +pub const RSS_TYPE_UDP_IPV4: ::c_int = 0x00000040; +pub const RSS_TYPE_UDP_IPV6: ::c_int = 0x00000080; +pub const RSS_TYPE_UDP_IPV6_EX: ::c_int = 0x00000100; +pub const RSS_KEYLEN: ::c_int = 128; + +pub const IFNET_PCP_NONE: ::c_int = 0xff; +pub const IFDR_MSG_SIZE: ::c_int = 64; +pub const IFDR_REASON_MSG: ::c_int = 1; +pub const IFDR_REASON_VENDOR: ::c_int = 2; + +// sys/net/if_mib.h + +/// non-interface-specific +pub const IFMIB_SYSTEM: ::c_int = 1; +/// per-interface data table +pub const IFMIB_IFDATA: ::c_int = 2; + +/// generic stats for all kinds of ifaces +pub const IFDATA_GENERAL: ::c_int = 1; +/// specific to the type of interface +pub const IFDATA_LINKSPECIFIC: ::c_int = 2; +/// driver name and unit +pub const IFDATA_DRIVERNAME: ::c_int = 3; + +/// number of interfaces configured +pub const IFMIB_IFCOUNT: ::c_int = 1; + +/// functions not specific to a type of iface +pub const NETLINK_GENERIC: ::c_int = 0; + +pub const DOT3COMPLIANCE_STATS: ::c_int = 1; +pub const DOT3COMPLIANCE_COLLS: ::c_int = 2; + +pub const dot3ChipSetAMD7990: ::c_int = 1; +pub const dot3ChipSetAMD79900: ::c_int = 2; +pub const dot3ChipSetAMD79C940: ::c_int = 3; + +pub const dot3ChipSetIntel82586: ::c_int = 1; +pub const dot3ChipSetIntel82596: ::c_int = 2; +pub const dot3ChipSetIntel82557: ::c_int = 3; + +pub const dot3ChipSetNational8390: ::c_int = 1; +pub const dot3ChipSetNationalSonic: ::c_int = 2; + +pub const dot3ChipSetFujitsu86950: ::c_int = 1; + +pub const dot3ChipSetDigitalDC21040: ::c_int = 1; +pub const dot3ChipSetDigitalDC21140: ::c_int = 2; +pub const dot3ChipSetDigitalDC21041: ::c_int = 3; +pub const dot3ChipSetDigitalDC21140A: ::c_int = 4; +pub const dot3ChipSetDigitalDC21142: ::c_int = 5; + +pub const dot3ChipSetWesternDigital83C690: ::c_int = 1; +pub const dot3ChipSetWesternDigital83C790: ::c_int = 2; + +// sys/netinet/in.h +// Protocols (RFC 1700) +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// IP6 hop-by-hop options +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// gateway^2 (deprecated) +pub const IPPROTO_GGP: ::c_int = 3; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// Stream protocol II. +pub const IPPROTO_ST: ::c_int = 7; +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// private interior gateway +pub const IPPROTO_PIGP: ::c_int = 9; +/// BBN RCC Monitoring +pub const IPPROTO_RCCMON: ::c_int = 10; +/// network voice protocol +pub const IPPROTO_NVPII: ::c_int = 11; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +/// Argus +pub const IPPROTO_ARGUS: ::c_int = 13; +/// EMCON +pub const IPPROTO_EMCON: ::c_int = 14; +/// Cross Net Debugger +pub const IPPROTO_XNET: ::c_int = 15; +/// Chaos +pub const IPPROTO_CHAOS: ::c_int = 16; +// IPPROTO_UDP defined in src/unix/mod.rs +/// Multiplexing +pub const IPPROTO_MUX: ::c_int = 18; +/// DCN Measurement Subsystems +pub const IPPROTO_MEAS: ::c_int = 19; +/// Host Monitoring +pub const IPPROTO_HMP: ::c_int = 20; +/// Packet Radio Measurement +pub const IPPROTO_PRM: ::c_int = 21; +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// Trunk-1 +pub const IPPROTO_TRUNK1: ::c_int = 23; +/// Trunk-2 +pub const IPPROTO_TRUNK2: ::c_int = 24; +/// Leaf-1 +pub const IPPROTO_LEAF1: ::c_int = 25; +/// Leaf-2 +pub const IPPROTO_LEAF2: ::c_int = 26; +/// Reliable Data +pub const IPPROTO_RDP: ::c_int = 27; +/// Reliable Transaction +pub const IPPROTO_IRTP: ::c_int = 28; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// Bulk Data Transfer +pub const IPPROTO_BLT: ::c_int = 30; +/// Network Services +pub const IPPROTO_NSP: ::c_int = 31; +/// Merit Internodal +pub const IPPROTO_INP: ::c_int = 32; +#[doc(hidden)] +#[deprecated( + since = "0.2.72", + note = "IPPROTO_SEP is deprecated. Use IPPROTO_DCCP instead" +)] +pub const IPPROTO_SEP: ::c_int = 33; +/// Datagram Congestion Control Protocol +pub const IPPROTO_DCCP: ::c_int = 33; +/// Third Party Connect +pub const IPPROTO_3PC: ::c_int = 34; +/// InterDomain Policy Routing +pub const IPPROTO_IDPR: ::c_int = 35; +/// XTP +pub const IPPROTO_XTP: ::c_int = 36; +/// Datagram Delivery +pub const IPPROTO_DDP: ::c_int = 37; +/// Control Message Transport +pub const IPPROTO_CMTP: ::c_int = 38; +/// TP++ Transport +pub const IPPROTO_TPXX: ::c_int = 39; +/// IL transport protocol +pub const IPPROTO_IL: ::c_int = 40; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// Source Demand Routing +pub const IPPROTO_SDRP: ::c_int = 42; +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// InterDomain Routing +pub const IPPROTO_IDRP: ::c_int = 45; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// Mobile Host Routing +pub const IPPROTO_MHRP: ::c_int = 48; +/// BHA +pub const IPPROTO_BHA: ::c_int = 49; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +/// Integ. Net Layer Security +pub const IPPROTO_INLSP: ::c_int = 52; +/// IP with encryption +pub const IPPROTO_SWIPE: ::c_int = 53; +/// Next Hop Resolution +pub const IPPROTO_NHRP: ::c_int = 54; +/// IP Mobility +pub const IPPROTO_MOBILE: ::c_int = 55; +/// Transport Layer Security +pub const IPPROTO_TLSP: ::c_int = 56; +/// SKIP +pub const IPPROTO_SKIP: ::c_int = 57; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +/// any host internal protocol +pub const IPPROTO_AHIP: ::c_int = 61; +/// CFTP +pub const IPPROTO_CFTP: ::c_int = 62; +/// "hello" routing protocol +pub const IPPROTO_HELLO: ::c_int = 63; +/// SATNET/Backroom EXPAK +pub const IPPROTO_SATEXPAK: ::c_int = 64; +/// Kryptolan +pub const IPPROTO_KRYPTOLAN: ::c_int = 65; +/// Remote Virtual Disk +pub const IPPROTO_RVD: ::c_int = 66; +/// Pluribus Packet Core +pub const IPPROTO_IPPC: ::c_int = 67; +/// Any distributed FS +pub const IPPROTO_ADFS: ::c_int = 68; +/// Satnet Monitoring +pub const IPPROTO_SATMON: ::c_int = 69; +/// VISA Protocol +pub const IPPROTO_VISA: ::c_int = 70; +/// Packet Core Utility +pub const IPPROTO_IPCV: ::c_int = 71; +/// Comp. Prot. Net. Executive +pub const IPPROTO_CPNX: ::c_int = 72; +/// Comp. Prot. HeartBeat +pub const IPPROTO_CPHB: ::c_int = 73; +/// Wang Span Network +pub const IPPROTO_WSN: ::c_int = 74; +/// Packet Video Protocol +pub const IPPROTO_PVP: ::c_int = 75; +/// BackRoom SATNET Monitoring +pub const IPPROTO_BRSATMON: ::c_int = 76; +/// Sun net disk proto (temp.) +pub const IPPROTO_ND: ::c_int = 77; +/// WIDEBAND Monitoring +pub const IPPROTO_WBMON: ::c_int = 78; +/// WIDEBAND EXPAK +pub const IPPROTO_WBEXPAK: ::c_int = 79; +/// ISO cnlp +pub const IPPROTO_EON: ::c_int = 80; +/// VMTP +pub const IPPROTO_VMTP: ::c_int = 81; +/// Secure VMTP +pub const IPPROTO_SVMTP: ::c_int = 82; +/// Banyon VINES +pub const IPPROTO_VINES: ::c_int = 83; +/// TTP +pub const IPPROTO_TTP: ::c_int = 84; +/// NSFNET-IGP +pub const IPPROTO_IGP: ::c_int = 85; +/// dissimilar gateway prot. +pub const IPPROTO_DGP: ::c_int = 86; +/// TCF +pub const IPPROTO_TCF: ::c_int = 87; +/// Cisco/GXS IGRP +pub const IPPROTO_IGRP: ::c_int = 88; +/// OSPFIGP +pub const IPPROTO_OSPFIGP: ::c_int = 89; +/// Strite RPC protocol +pub const IPPROTO_SRPC: ::c_int = 90; +/// Locus Address Resoloution +pub const IPPROTO_LARP: ::c_int = 91; +/// Multicast Transport +pub const IPPROTO_MTP: ::c_int = 92; +/// AX.25 Frames +pub const IPPROTO_AX25: ::c_int = 93; +/// IP encapsulated in IP +pub const IPPROTO_IPEIP: ::c_int = 94; +/// Mobile Int.ing control +pub const IPPROTO_MICP: ::c_int = 95; +/// Semaphore Comm. security +pub const IPPROTO_SCCSP: ::c_int = 96; +/// Ethernet IP encapsulation +pub const IPPROTO_ETHERIP: ::c_int = 97; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// any private encr. scheme +pub const IPPROTO_APES: ::c_int = 99; +/// GMTP +pub const IPPROTO_GMTP: ::c_int = 100; +/// payload compression (IPComp) +pub const IPPROTO_IPCOMP: ::c_int = 108; +/// SCTP +pub const IPPROTO_SCTP: ::c_int = 132; +/// IPv6 Mobility Header +pub const IPPROTO_MH: ::c_int = 135; +/// UDP-Lite +pub const IPPROTO_UDPLITE: ::c_int = 136; +/// IP6 Host Identity Protocol +pub const IPPROTO_HIP: ::c_int = 139; +/// IP6 Shim6 Protocol +pub const IPPROTO_SHIM6: ::c_int = 140; + +/* 101-254: Partly Unassigned */ +/// Protocol Independent Mcast +pub const IPPROTO_PIM: ::c_int = 103; +/// CARP +pub const IPPROTO_CARP: ::c_int = 112; +/// PGM +pub const IPPROTO_PGM: ::c_int = 113; +/// MPLS-in-IP +pub const IPPROTO_MPLS: ::c_int = 137; +/// PFSYNC +pub const IPPROTO_PFSYNC: ::c_int = 240; + +/* 255: Reserved */ +/* BSD Private, local use, namespace incursion, no longer used */ +/// OLD divert pseudo-proto +pub const IPPROTO_OLD_DIVERT: ::c_int = 254; +pub const IPPROTO_MAX: ::c_int = 256; +/// last return value of *_input(), meaning "all job for this pkt is done". +pub const IPPROTO_DONE: ::c_int = 257; + +/* Only used internally, so can be outside the range of valid IP protocols. */ +/// divert pseudo-protocol +pub const IPPROTO_DIVERT: ::c_int = 258; +/// SeND pseudo-protocol +pub const IPPROTO_SEND: ::c_int = 259; + +// sys/netinet/TCP.h +pub const TCP_MD5SIG: ::c_int = 16; +pub const TCP_INFO: ::c_int = 32; +pub const TCP_CONGESTION: ::c_int = 64; +pub const TCP_CCALGOOPT: ::c_int = 65; +pub const TCP_MAXUNACKTIME: ::c_int = 68; +pub const TCP_MAXPEAKRATE: ::c_int = 69; +pub const TCP_IDLE_REDUCE: ::c_int = 70; +pub const TCP_REMOTE_UDP_ENCAPS_PORT: ::c_int = 71; +pub const TCP_DELACK: ::c_int = 72; +pub const TCP_FIN_IS_RST: ::c_int = 73; +pub const TCP_LOG_LIMIT: ::c_int = 74; +pub const TCP_SHARED_CWND_ALLOWED: ::c_int = 75; +pub const TCP_PROC_ACCOUNTING: ::c_int = 76; +pub const TCP_USE_CMP_ACKS: ::c_int = 77; +pub const TCP_PERF_INFO: ::c_int = 78; +pub const TCP_LRD: ::c_int = 79; +pub const TCP_KEEPINIT: ::c_int = 128; +pub const TCP_FASTOPEN: ::c_int = 1025; +pub const TCP_PCAP_OUT: ::c_int = 2048; +pub const TCP_PCAP_IN: ::c_int = 4096; +pub const TCP_FASTOPEN_PSK_LEN: ::c_int = 16; +pub const TCP_FUNCTION_NAME_LEN_MAX: ::c_int = 32; + +pub const IP_BINDANY: ::c_int = 24; +pub const IP_BINDMULTI: ::c_int = 25; +pub const IP_RSS_LISTEN_BUCKET: ::c_int = 26; +pub const IP_ORIGDSTADDR: ::c_int = 27; +pub const IP_RECVORIGDSTADDR: ::c_int = IP_ORIGDSTADDR; + +pub const IP_DONTFRAG: ::c_int = 67; +pub const IP_RECVTOS: ::c_int = 68; + +pub const IPV6_BINDANY: ::c_int = 64; +pub const IPV6_ORIGDSTADDR: ::c_int = 72; +pub const IPV6_RECVORIGDSTADDR: ::c_int = IPV6_ORIGDSTADDR; + +pub const PF_SLOW: ::c_int = AF_SLOW; +pub const PF_SCLUSTER: ::c_int = AF_SCLUSTER; +pub const PF_ARP: ::c_int = AF_ARP; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_IEEE80211: ::c_int = AF_IEEE80211; +pub const PF_INET_SDP: ::c_int = AF_INET_SDP; +pub const PF_INET6_SDP: ::c_int = AF_INET6_SDP; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_IFMALIST: ::c_int = 4; +pub const NET_RT_IFLISTL: ::c_int = 5; + +// System V IPC +pub const IPC_INFO: ::c_int = 3; +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; +pub const SHM_STAT: ::c_int = 13; +pub const SHM_INFO: ::c_int = 14; +pub const SHM_ANON: *mut ::c_char = 1 as *mut ::c_char; + +// The *_MAXID constants never should've been used outside of the +// FreeBSD base system. And with the exception of CTL_P1003_1B_MAXID, +// they were all removed in svn r262489. They remain here for backwards +// compatibility only, and are scheduled to be removed in libc 1.0.0. +#[doc(hidden)] +#[deprecated(since = "0.2.54", note = "Removed in FreeBSD 11")] +pub const CTL_MAXID: ::c_int = 10; +#[doc(hidden)] +#[deprecated(since = "0.2.54", note = "Removed in FreeBSD 11")] +pub const KERN_MAXID: ::c_int = 38; +#[doc(hidden)] +#[deprecated(since = "0.2.54", note = "Removed in FreeBSD 11")] +pub const HW_MAXID: ::c_int = 13; +#[doc(hidden)] +#[deprecated(since = "0.2.54", note = "Removed in FreeBSD 11")] +pub const USER_MAXID: ::c_int = 21; +#[doc(hidden)] +#[deprecated(since = "0.2.74", note = "Removed in FreeBSD 13")] +pub const CTL_P1003_1B_MAXID: ::c_int = 26; + +pub const MSG_NOTIFICATION: ::c_int = 0x00002000; +pub const MSG_NBIO: ::c_int = 0x00004000; +pub const MSG_COMPAT: ::c_int = 0x00008000; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00040000; +pub const MSG_NOSIGNAL: ::c_int = 0x20000; +pub const MSG_WAITFORONE: ::c_int = 0x00080000; + +// utmpx entry types +pub const EMPTY: ::c_short = 0; +pub const BOOT_TIME: ::c_short = 1; +pub const OLD_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 3; +pub const USER_PROCESS: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const DEAD_PROCESS: ::c_short = 7; +pub const SHUTDOWN_TIME: ::c_short = 8; +// utmp database types +pub const UTXDB_ACTIVE: ::c_int = 0; +pub const UTXDB_LASTLOGIN: ::c_int = 1; +pub const UTXDB_LOG: ::c_int = 2; + +pub const LC_COLLATE_MASK: ::c_int = 1 << 0; +pub const LC_CTYPE_MASK: ::c_int = 1 << 1; +pub const LC_MONETARY_MASK: ::c_int = 1 << 2; +pub const LC_NUMERIC_MASK: ::c_int = 1 << 3; +pub const LC_TIME_MASK: ::c_int = 1 << 4; +pub const LC_MESSAGES_MASK: ::c_int = 1 << 5; +pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK + | LC_MONETARY_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK; + +pub const WSTOPPED: ::c_int = 2; // same as WUNTRACED +pub const WCONTINUED: ::c_int = 4; +pub const WNOWAIT: ::c_int = 8; +pub const WEXITED: ::c_int = 16; +pub const WTRAPPED: ::c_int = 32; + +// FreeBSD defines a great many more of these, we only expose the +// standardized ones. +pub const P_PID: idtype_t = 0; +pub const P_PGID: idtype_t = 2; +pub const P_ALL: idtype_t = 7; + +pub const UTIME_OMIT: c_long = -2; +pub const UTIME_NOW: c_long = -1; + +pub const B460800: ::speed_t = 460800; +pub const B921600: ::speed_t = 921600; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_REMOVEDIR: ::c_int = 0x800; +pub const AT_RESOLVE_BENEATH: ::c_int = 0x2000; +pub const AT_EMPTY_PATH: ::c_int = 0x4000; + +pub const AT_NULL: ::c_int = 0; +pub const AT_IGNORE: ::c_int = 1; +pub const AT_EXECFD: ::c_int = 2; +pub const AT_PHDR: ::c_int = 3; +pub const AT_PHENT: ::c_int = 4; +pub const AT_PHNUM: ::c_int = 5; +pub const AT_PAGESZ: ::c_int = 6; +pub const AT_BASE: ::c_int = 7; +pub const AT_FLAGS: ::c_int = 8; +pub const AT_ENTRY: ::c_int = 9; +pub const AT_NOTELF: ::c_int = 10; +pub const AT_UID: ::c_int = 11; +pub const AT_EUID: ::c_int = 12; +pub const AT_GID: ::c_int = 13; +pub const AT_EGID: ::c_int = 14; +pub const AT_EXECPATH: ::c_int = 15; +pub const AT_CANARY: ::c_int = 16; +pub const AT_OSRELDATE: ::c_int = 18; +pub const AT_NCPUS: ::c_int = 19; +pub const AT_PAGESIZES: ::c_int = 20; +pub const AT_TIMEKEEP: ::c_int = 22; +pub const AT_HWCAP: ::c_int = 25; +pub const AT_HWCAP2: ::c_int = 26; +pub const AT_USRSTACKBASE: ::c_int = 35; +pub const AT_USRSTACKLIM: ::c_int = 36; + +pub const TABDLY: ::tcflag_t = 0x00000004; +pub const TAB0: ::tcflag_t = 0x00000000; +pub const TAB3: ::tcflag_t = 0x00000004; + +pub const _PC_ACL_NFS4: ::c_int = 64; + +pub const _SC_CPUSET_SIZE: ::c_int = 122; + +pub const _UUID_NODE_LEN: usize = 6; + +// Flags which can be passed to pdfork(2) +pub const PD_DAEMON: ::c_int = 0x00000001; +pub const PD_CLOEXEC: ::c_int = 0x00000002; +pub const PD_ALLOWED_AT_FORK: ::c_int = PD_DAEMON | PD_CLOEXEC; + +// Values for struct rtprio (type_ field) +pub const RTP_PRIO_REALTIME: ::c_ushort = 2; +pub const RTP_PRIO_NORMAL: ::c_ushort = 3; +pub const RTP_PRIO_IDLE: ::c_ushort = 4; + +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x01; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x02; +pub const POSIX_SPAWN_SETSCHEDPARAM: ::c_int = 0x04; +pub const POSIX_SPAWN_SETSCHEDULER: ::c_int = 0x08; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x10; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x20; + +// Flags for chflags(2) +pub const UF_SYSTEM: ::c_ulong = 0x00000080; +pub const UF_SPARSE: ::c_ulong = 0x00000100; +pub const UF_OFFLINE: ::c_ulong = 0x00000200; +pub const UF_REPARSE: ::c_ulong = 0x00000400; +pub const UF_ARCHIVE: ::c_ulong = 0x00000800; +pub const UF_READONLY: ::c_ulong = 0x00001000; +pub const UF_HIDDEN: ::c_ulong = 0x00008000; +pub const SF_SNAPSHOT: ::c_ulong = 0x00200000; + +// fcntl commands +pub const F_ADD_SEALS: ::c_int = 19; +pub const F_GET_SEALS: ::c_int = 20; +pub const F_OGETLK: ::c_int = 7; +pub const F_OSETLK: ::c_int = 8; +pub const F_OSETLKW: ::c_int = 9; +pub const F_RDAHEAD: ::c_int = 16; +pub const F_READAHEAD: ::c_int = 15; +pub const F_SETLK_REMOTE: ::c_int = 14; +pub const F_KINFO: ::c_int = 22; + +// for use with F_ADD_SEALS +pub const F_SEAL_GROW: ::c_int = 4; +pub const F_SEAL_SEAL: ::c_int = 1; +pub const F_SEAL_SHRINK: ::c_int = 2; +pub const F_SEAL_WRITE: ::c_int = 8; + +// for use with fspacectl +pub const SPACECTL_DEALLOC: ::c_int = 1; + +// For getrandom() +pub const GRND_NONBLOCK: ::c_uint = 0x1; +pub const GRND_RANDOM: ::c_uint = 0x2; +pub const GRND_INSECURE: ::c_uint = 0x4; + +// For realhostname* api +pub const HOSTNAME_FOUND: ::c_int = 0; +pub const HOSTNAME_INCORRECTNAME: ::c_int = 1; +pub const HOSTNAME_INVALIDADDR: ::c_int = 2; +pub const HOSTNAME_INVALIDNAME: ::c_int = 3; + +// For rfork +pub const RFFDG: ::c_int = 4; +pub const RFPROC: ::c_int = 16; +pub const RFMEM: ::c_int = 32; +pub const RFNOWAIT: ::c_int = 64; +pub const RFCFDG: ::c_int = 4096; +pub const RFTHREAD: ::c_int = 8192; +pub const RFLINUXTHPN: ::c_int = 65536; +pub const RFTSIGZMB: ::c_int = 524288; +pub const RFSPAWN: ::c_int = 2147483648; + +// For eventfd +pub const EFD_SEMAPHORE: ::c_int = 0x1; +pub const EFD_NONBLOCK: ::c_int = 0x4; +pub const EFD_CLOEXEC: ::c_int = 0x100000; + +pub const MALLOCX_ZERO: ::c_int = 0x40; + +/// size of returned wchan message +pub const WMESGLEN: usize = 8; +/// size of returned lock name +pub const LOCKNAMELEN: usize = 8; +/// size of returned thread name +pub const TDNAMLEN: usize = 16; +/// size of returned ki_comm name +pub const COMMLEN: usize = 19; +/// size of returned ki_emul +pub const KI_EMULNAMELEN: usize = 16; +/// number of groups in ki_groups +pub const KI_NGROUPS: usize = 16; +cfg_if! { + if #[cfg(freebsd11)] { + pub const KI_NSPARE_INT: usize = 4; + } else { + pub const KI_NSPARE_INT: usize = 2; + } +} +pub const KI_NSPARE_LONG: usize = 12; +/// Flags for the process credential. +pub const KI_CRF_CAPABILITY_MODE: usize = 0x00000001; +/// Steal a bit from ki_cr_flags to indicate that the cred had more than +/// KI_NGROUPS groups. +pub const KI_CRF_GRP_OVERFLOW: usize = 0x80000000; +/// controlling tty vnode active +pub const KI_CTTY: usize = 0x00000001; +/// session leader +pub const KI_SLEADER: usize = 0x00000002; +/// proc blocked on lock ki_lockname +pub const KI_LOCKBLOCK: usize = 0x00000004; +/// size of returned ki_login +pub const LOGNAMELEN: usize = 17; +/// size of returned ki_loginclass +pub const LOGINCLASSLEN: usize = 17; + +pub const KF_ATTR_VALID: ::c_int = 0x0001; +pub const KF_TYPE_NONE: ::c_int = 0; +pub const KF_TYPE_VNODE: ::c_int = 1; +pub const KF_TYPE_SOCKET: ::c_int = 2; +pub const KF_TYPE_PIPE: ::c_int = 3; +pub const KF_TYPE_FIFO: ::c_int = 4; +pub const KF_TYPE_KQUEUE: ::c_int = 5; +pub const KF_TYPE_MQUEUE: ::c_int = 7; +pub const KF_TYPE_SHM: ::c_int = 8; +pub const KF_TYPE_SEM: ::c_int = 9; +pub const KF_TYPE_PTS: ::c_int = 10; +pub const KF_TYPE_PROCDESC: ::c_int = 11; +pub const KF_TYPE_DEV: ::c_int = 12; +pub const KF_TYPE_UNKNOWN: ::c_int = 255; + +pub const KF_VTYPE_VNON: ::c_int = 0; +pub const KF_VTYPE_VREG: ::c_int = 1; +pub const KF_VTYPE_VDIR: ::c_int = 2; +pub const KF_VTYPE_VBLK: ::c_int = 3; +pub const KF_VTYPE_VCHR: ::c_int = 4; +pub const KF_VTYPE_VLNK: ::c_int = 5; +pub const KF_VTYPE_VSOCK: ::c_int = 6; +pub const KF_VTYPE_VFIFO: ::c_int = 7; +pub const KF_VTYPE_VBAD: ::c_int = 8; +pub const KF_VTYPE_UNKNOWN: ::c_int = 255; + +/// Current working directory +pub const KF_FD_TYPE_CWD: ::c_int = -1; +/// Root directory +pub const KF_FD_TYPE_ROOT: ::c_int = -2; +/// Jail directory +pub const KF_FD_TYPE_JAIL: ::c_int = -3; +/// Ktrace vnode +pub const KF_FD_TYPE_TRACE: ::c_int = -4; +pub const KF_FD_TYPE_TEXT: ::c_int = -5; +/// Controlling terminal +pub const KF_FD_TYPE_CTTY: ::c_int = -6; +pub const KF_FLAG_READ: ::c_int = 0x00000001; +pub const KF_FLAG_WRITE: ::c_int = 0x00000002; +pub const KF_FLAG_APPEND: ::c_int = 0x00000004; +pub const KF_FLAG_ASYNC: ::c_int = 0x00000008; +pub const KF_FLAG_FSYNC: ::c_int = 0x00000010; +pub const KF_FLAG_NONBLOCK: ::c_int = 0x00000020; +pub const KF_FLAG_DIRECT: ::c_int = 0x00000040; +pub const KF_FLAG_HASLOCK: ::c_int = 0x00000080; +pub const KF_FLAG_SHLOCK: ::c_int = 0x00000100; +pub const KF_FLAG_EXLOCK: ::c_int = 0x00000200; +pub const KF_FLAG_NOFOLLOW: ::c_int = 0x00000400; +pub const KF_FLAG_CREAT: ::c_int = 0x00000800; +pub const KF_FLAG_TRUNC: ::c_int = 0x00001000; +pub const KF_FLAG_EXCL: ::c_int = 0x00002000; +pub const KF_FLAG_EXEC: ::c_int = 0x00004000; + +pub const KVME_TYPE_NONE: ::c_int = 0; +pub const KVME_TYPE_DEFAULT: ::c_int = 1; +pub const KVME_TYPE_VNODE: ::c_int = 2; +pub const KVME_TYPE_SWAP: ::c_int = 3; +pub const KVME_TYPE_DEVICE: ::c_int = 4; +pub const KVME_TYPE_PHYS: ::c_int = 5; +pub const KVME_TYPE_DEAD: ::c_int = 6; +pub const KVME_TYPE_SG: ::c_int = 7; +pub const KVME_TYPE_MGTDEVICE: ::c_int = 8; +// Present in `sys/user.h` but is undefined for whatever reason... +// pub const KVME_TYPE_GUARD: ::c_int = 9; +pub const KVME_TYPE_UNKNOWN: ::c_int = 255; +pub const KVME_PROT_READ: ::c_int = 0x00000001; +pub const KVME_PROT_WRITE: ::c_int = 0x00000002; +pub const KVME_PROT_EXEC: ::c_int = 0x00000004; +pub const KVME_FLAG_COW: ::c_int = 0x00000001; +pub const KVME_FLAG_NEEDS_COPY: ::c_int = 0x00000002; +pub const KVME_FLAG_NOCOREDUMP: ::c_int = 0x00000004; +pub const KVME_FLAG_SUPER: ::c_int = 0x00000008; +pub const KVME_FLAG_GROWS_UP: ::c_int = 0x00000010; +pub const KVME_FLAG_GROWS_DOWN: ::c_int = 0x00000020; +pub const KVME_FLAG_USER_WIRED: ::c_int = 0x00000040; + +pub const KKST_MAXLEN: ::c_int = 1024; +/// Stack is valid. +pub const KKST_STATE_STACKOK: ::c_int = 0; +/// Stack swapped out. +pub const KKST_STATE_SWAPPED: ::c_int = 1; +pub const KKST_STATE_RUNNING: ::c_int = 2; + +// Constants about priority. +pub const PRI_MIN: ::c_int = 0; +pub const PRI_MAX: ::c_int = 255; +pub const PRI_MIN_ITHD: ::c_int = PRI_MIN; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PRI_MAX_ITHD: ::c_int = PRI_MIN_REALTIME - 1; +pub const PI_REALTIME: ::c_int = PRI_MIN_ITHD + 0; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_AV: ::c_int = PRI_MIN_ITHD + 4; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_NET: ::c_int = PRI_MIN_ITHD + 8; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_DISK: ::c_int = PRI_MIN_ITHD + 12; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_TTY: ::c_int = PRI_MIN_ITHD + 16; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_DULL: ::c_int = PRI_MIN_ITHD + 20; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PI_SOFT: ::c_int = PRI_MIN_ITHD + 24; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PRI_MIN_REALTIME: ::c_int = 48; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PRI_MAX_REALTIME: ::c_int = PRI_MIN_KERN - 1; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PRI_MIN_KERN: ::c_int = 80; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PRI_MAX_KERN: ::c_int = PRI_MIN_TIMESHARE - 1; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PSWP: ::c_int = PRI_MIN_KERN + 0; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PVM: ::c_int = PRI_MIN_KERN + 4; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PINOD: ::c_int = PRI_MIN_KERN + 8; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PRIBIO: ::c_int = PRI_MIN_KERN + 12; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PVFS: ::c_int = PRI_MIN_KERN + 16; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PZERO: ::c_int = PRI_MIN_KERN + 20; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PSOCK: ::c_int = PRI_MIN_KERN + 24; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PWAIT: ::c_int = PRI_MIN_KERN + 28; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PLOCK: ::c_int = PRI_MIN_KERN + 32; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PPAUSE: ::c_int = PRI_MIN_KERN + 36; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const PRI_MIN_TIMESHARE: ::c_int = 120; +pub const PRI_MAX_TIMESHARE: ::c_int = PRI_MIN_IDLE - 1; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +#[allow(deprecated)] +pub const PUSER: ::c_int = PRI_MIN_TIMESHARE; +pub const PRI_MIN_IDLE: ::c_int = 224; +pub const PRI_MAX_IDLE: ::c_int = PRI_MAX; + +pub const NZERO: ::c_int = 0; + +// Resource utilization information. +pub const RUSAGE_THREAD: ::c_int = 1; + +cfg_if! { + if #[cfg(any(freebsd11, target_pointer_width = "32"))] { + pub const ARG_MAX: ::c_int = 256 * 1024; + } else { + pub const ARG_MAX: ::c_int = 2 * 256 * 1024; + } +} +pub const CHILD_MAX: ::c_int = 40; +/// max command name remembered +pub const MAXCOMLEN: usize = 19; +/// max interpreter file name length +pub const MAXINTERP: ::c_int = ::PATH_MAX; +/// max login name length (incl. NUL) +pub const MAXLOGNAME: ::c_int = 33; +/// max simultaneous processes +pub const MAXUPRC: ::c_int = CHILD_MAX; +/// max bytes for an exec function +pub const NCARGS: ::c_int = ARG_MAX; +/// /* max number groups +pub const NGROUPS: ::c_int = NGROUPS_MAX + 1; +/// max open files per process +pub const NOFILE: ::c_int = OPEN_MAX; +/// marker for empty group set member +pub const NOGROUP: ::c_int = 65535; +/// max hostname size +pub const MAXHOSTNAMELEN: ::c_int = 256; +/// max bytes in term canon input line +pub const MAX_CANON: ::c_int = 255; +/// max bytes in terminal input +pub const MAX_INPUT: ::c_int = 255; +/// max bytes in a file name +pub const NAME_MAX: ::c_int = 255; +pub const MAXSYMLINKS: ::c_int = 32; +/// max supplemental group id's +pub const NGROUPS_MAX: ::c_int = 1023; +/// max open files per process +pub const OPEN_MAX: ::c_int = 64; + +pub const _POSIX_ARG_MAX: ::c_int = 4096; +pub const _POSIX_LINK_MAX: ::c_int = 8; +pub const _POSIX_MAX_CANON: ::c_int = 255; +pub const _POSIX_MAX_INPUT: ::c_int = 255; +pub const _POSIX_NAME_MAX: ::c_int = 14; +pub const _POSIX_PIPE_BUF: ::c_int = 512; +pub const _POSIX_SSIZE_MAX: ::c_int = 32767; +pub const _POSIX_STREAM_MAX: ::c_int = 8; + +/// max ibase/obase values in bc(1) +pub const BC_BASE_MAX: ::c_int = 99; +/// max array elements in bc(1) +pub const BC_DIM_MAX: ::c_int = 2048; +/// max scale value in bc(1) +pub const BC_SCALE_MAX: ::c_int = 99; +/// max const string length in bc(1) +pub const BC_STRING_MAX: ::c_int = 1000; +/// max character class name size +pub const CHARCLASS_NAME_MAX: ::c_int = 14; +/// max weights for order keyword +pub const COLL_WEIGHTS_MAX: ::c_int = 10; +/// max expressions nested in expr(1) +pub const EXPR_NEST_MAX: ::c_int = 32; +/// max bytes in an input line +pub const LINE_MAX: ::c_int = 2048; +/// max RE's in interval notation +pub const RE_DUP_MAX: ::c_int = 255; + +pub const _POSIX2_BC_BASE_MAX: ::c_int = 99; +pub const _POSIX2_BC_DIM_MAX: ::c_int = 2048; +pub const _POSIX2_BC_SCALE_MAX: ::c_int = 99; +pub const _POSIX2_BC_STRING_MAX: ::c_int = 1000; +pub const _POSIX2_CHARCLASS_NAME_MAX: ::c_int = 14; +pub const _POSIX2_COLL_WEIGHTS_MAX: ::c_int = 2; +pub const _POSIX2_EQUIV_CLASS_MAX: ::c_int = 2; +pub const _POSIX2_EXPR_NEST_MAX: ::c_int = 32; +pub const _POSIX2_LINE_MAX: ::c_int = 2048; +pub const _POSIX2_RE_DUP_MAX: ::c_int = 255; + +// sys/proc.h +pub const TDF_BORROWING: ::c_int = 0x00000001; +pub const TDF_INPANIC: ::c_int = 0x00000002; +pub const TDF_INMEM: ::c_int = 0x00000004; +pub const TDF_SINTR: ::c_int = 0x00000008; +pub const TDF_TIMEOUT: ::c_int = 0x00000010; +pub const TDF_IDLETD: ::c_int = 0x00000020; +pub const TDF_CANSWAP: ::c_int = 0x00000040; +pub const TDF_KTH_SUSP: ::c_int = 0x00000100; +pub const TDF_ALLPROCSUSP: ::c_int = 0x00000200; +pub const TDF_BOUNDARY: ::c_int = 0x00000400; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_ASTPENDING: ::c_int = 0x00000800; +pub const TDF_SBDRY: ::c_int = 0x00002000; +pub const TDF_UPIBLOCKED: ::c_int = 0x00004000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_NEEDSUSPCHK: ::c_int = 0x00008000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_NEEDRESCHED: ::c_int = 0x00010000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_NEEDSIGCHK: ::c_int = 0x00020000; +pub const TDF_NOLOAD: ::c_int = 0x00040000; +pub const TDF_SERESTART: ::c_int = 0x00080000; +pub const TDF_THRWAKEUP: ::c_int = 0x00100000; +pub const TDF_SEINTR: ::c_int = 0x00200000; +pub const TDF_SWAPINREQ: ::c_int = 0x00400000; +#[deprecated(since = "0.2.133", note = "Removed in FreeBSD 14")] +pub const TDF_UNUSED23: ::c_int = 0x00800000; +pub const TDF_SCHED0: ::c_int = 0x01000000; +pub const TDF_SCHED1: ::c_int = 0x02000000; +pub const TDF_SCHED2: ::c_int = 0x04000000; +pub const TDF_SCHED3: ::c_int = 0x08000000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_ALRMPEND: ::c_int = 0x10000000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_PROFPEND: ::c_int = 0x20000000; +#[deprecated(since = "0.2.133", note = "Not stable across OS versions")] +pub const TDF_MACPEND: ::c_int = 0x40000000; + +pub const TDB_SUSPEND: ::c_int = 0x00000001; +pub const TDB_XSIG: ::c_int = 0x00000002; +pub const TDB_USERWR: ::c_int = 0x00000004; +pub const TDB_SCE: ::c_int = 0x00000008; +pub const TDB_SCX: ::c_int = 0x00000010; +pub const TDB_EXEC: ::c_int = 0x00000020; +pub const TDB_FORK: ::c_int = 0x00000040; +pub const TDB_STOPATFORK: ::c_int = 0x00000080; +pub const TDB_CHILD: ::c_int = 0x00000100; +pub const TDB_BORN: ::c_int = 0x00000200; +pub const TDB_EXIT: ::c_int = 0x00000400; +pub const TDB_VFORK: ::c_int = 0x00000800; +pub const TDB_FSTP: ::c_int = 0x00001000; +pub const TDB_STEP: ::c_int = 0x00002000; + +pub const TDP_OLDMASK: ::c_int = 0x00000001; +pub const TDP_INKTR: ::c_int = 0x00000002; +pub const TDP_INKTRACE: ::c_int = 0x00000004; +pub const TDP_BUFNEED: ::c_int = 0x00000008; +pub const TDP_COWINPROGRESS: ::c_int = 0x00000010; +pub const TDP_ALTSTACK: ::c_int = 0x00000020; +pub const TDP_DEADLKTREAT: ::c_int = 0x00000040; +pub const TDP_NOFAULTING: ::c_int = 0x00000080; +pub const TDP_OWEUPC: ::c_int = 0x00000200; +pub const TDP_ITHREAD: ::c_int = 0x00000400; +pub const TDP_SYNCIO: ::c_int = 0x00000800; +pub const TDP_SCHED1: ::c_int = 0x00001000; +pub const TDP_SCHED2: ::c_int = 0x00002000; +pub const TDP_SCHED3: ::c_int = 0x00004000; +pub const TDP_SCHED4: ::c_int = 0x00008000; +pub const TDP_GEOM: ::c_int = 0x00010000; +pub const TDP_SOFTDEP: ::c_int = 0x00020000; +pub const TDP_NORUNNINGBUF: ::c_int = 0x00040000; +pub const TDP_WAKEUP: ::c_int = 0x00080000; +pub const TDP_INBDFLUSH: ::c_int = 0x00100000; +pub const TDP_KTHREAD: ::c_int = 0x00200000; +pub const TDP_CALLCHAIN: ::c_int = 0x00400000; +pub const TDP_IGNSUSP: ::c_int = 0x00800000; +pub const TDP_AUDITREC: ::c_int = 0x01000000; +pub const TDP_RFPPWAIT: ::c_int = 0x02000000; +pub const TDP_RESETSPUR: ::c_int = 0x04000000; +pub const TDP_NERRNO: ::c_int = 0x08000000; +pub const TDP_EXECVMSPC: ::c_int = 0x40000000; + +pub const TDI_SUSPENDED: ::c_int = 0x0001; +pub const TDI_SLEEPING: ::c_int = 0x0002; +pub const TDI_SWAPPED: ::c_int = 0x0004; +pub const TDI_LOCK: ::c_int = 0x0008; +pub const TDI_IWAIT: ::c_int = 0x0010; + +pub const P_ADVLOCK: ::c_int = 0x00000001; +pub const P_CONTROLT: ::c_int = 0x00000002; +pub const P_KPROC: ::c_int = 0x00000004; +pub const P_UNUSED3: ::c_int = 0x00000008; +pub const P_PPWAIT: ::c_int = 0x00000010; +pub const P_PROFIL: ::c_int = 0x00000020; +pub const P_STOPPROF: ::c_int = 0x00000040; +pub const P_HADTHREADS: ::c_int = 0x00000080; +pub const P_SUGID: ::c_int = 0x00000100; +pub const P_SYSTEM: ::c_int = 0x00000200; +pub const P_SINGLE_EXIT: ::c_int = 0x00000400; +pub const P_TRACED: ::c_int = 0x00000800; +pub const P_WAITED: ::c_int = 0x00001000; +pub const P_WEXIT: ::c_int = 0x00002000; +pub const P_EXEC: ::c_int = 0x00004000; +pub const P_WKILLED: ::c_int = 0x00008000; +pub const P_CONTINUED: ::c_int = 0x00010000; +pub const P_STOPPED_SIG: ::c_int = 0x00020000; +pub const P_STOPPED_TRACE: ::c_int = 0x00040000; +pub const P_STOPPED_SINGLE: ::c_int = 0x00080000; +pub const P_PROTECTED: ::c_int = 0x00100000; +pub const P_SIGEVENT: ::c_int = 0x00200000; +pub const P_SINGLE_BOUNDARY: ::c_int = 0x00400000; +pub const P_HWPMC: ::c_int = 0x00800000; +pub const P_JAILED: ::c_int = 0x01000000; +pub const P_TOTAL_STOP: ::c_int = 0x02000000; +pub const P_INEXEC: ::c_int = 0x04000000; +pub const P_STATCHILD: ::c_int = 0x08000000; +pub const P_INMEM: ::c_int = 0x10000000; +pub const P_SWAPPINGOUT: ::c_int = 0x20000000; +pub const P_SWAPPINGIN: ::c_int = 0x40000000; +pub const P_PPTRACE: ::c_int = 0x80000000; +pub const P_STOPPED: ::c_int = P_STOPPED_SIG | P_STOPPED_SINGLE | P_STOPPED_TRACE; + +pub const P2_INHERIT_PROTECTED: ::c_int = 0x00000001; +pub const P2_NOTRACE: ::c_int = 0x00000002; +pub const P2_NOTRACE_EXEC: ::c_int = 0x00000004; +pub const P2_AST_SU: ::c_int = 0x00000008; +pub const P2_PTRACE_FSTP: ::c_int = 0x00000010; +pub const P2_TRAPCAP: ::c_int = 0x00000020; +pub const P2_STKGAP_DISABLE: ::c_int = 0x00000800; +pub const P2_STKGAP_DISABLE_EXEC: ::c_int = 0x00001000; + +pub const P_TREE_ORPHANED: ::c_int = 0x00000001; +pub const P_TREE_FIRST_ORPHAN: ::c_int = 0x00000002; +pub const P_TREE_REAPER: ::c_int = 0x00000004; + +pub const SIDL: ::c_char = 1; +pub const SRUN: ::c_char = 2; +pub const SSLEEP: ::c_char = 3; +pub const SSTOP: ::c_char = 4; +pub const SZOMB: ::c_char = 5; +pub const SWAIT: ::c_char = 6; +pub const SLOCK: ::c_char = 7; + +pub const P_MAGIC: ::c_int = 0xbeefface; + +pub const TDP_SIGFASTBLOCK: ::c_int = 0x00000100; +pub const TDP_UIOHELD: ::c_int = 0x10000000; +pub const TDP_SIGFASTPENDING: ::c_int = 0x80000000; +pub const TDP2_COMPAT32RB: ::c_int = 0x00000002; +pub const P2_PROTMAX_ENABLE: ::c_int = 0x00000200; +pub const P2_PROTMAX_DISABLE: ::c_int = 0x00000400; +pub const TDP2_SBPAGES: ::c_int = 0x00000001; +pub const P2_ASLR_ENABLE: ::c_int = 0x00000040; +pub const P2_ASLR_DISABLE: ::c_int = 0x00000080; +pub const P2_ASLR_IGNSTART: ::c_int = 0x00000100; +pub const P_TREE_GRPEXITED: ::c_int = 0x00000008; + +// libprocstat.h +pub const PS_FST_VTYPE_VNON: ::c_int = 1; +pub const PS_FST_VTYPE_VREG: ::c_int = 2; +pub const PS_FST_VTYPE_VDIR: ::c_int = 3; +pub const PS_FST_VTYPE_VBLK: ::c_int = 4; +pub const PS_FST_VTYPE_VCHR: ::c_int = 5; +pub const PS_FST_VTYPE_VLNK: ::c_int = 6; +pub const PS_FST_VTYPE_VSOCK: ::c_int = 7; +pub const PS_FST_VTYPE_VFIFO: ::c_int = 8; +pub const PS_FST_VTYPE_VBAD: ::c_int = 9; +pub const PS_FST_VTYPE_UNKNOWN: ::c_int = 255; + +pub const PS_FST_TYPE_VNODE: ::c_int = 1; +pub const PS_FST_TYPE_FIFO: ::c_int = 2; +pub const PS_FST_TYPE_SOCKET: ::c_int = 3; +pub const PS_FST_TYPE_PIPE: ::c_int = 4; +pub const PS_FST_TYPE_PTS: ::c_int = 5; +pub const PS_FST_TYPE_KQUEUE: ::c_int = 6; +pub const PS_FST_TYPE_MQUEUE: ::c_int = 8; +pub const PS_FST_TYPE_SHM: ::c_int = 9; +pub const PS_FST_TYPE_SEM: ::c_int = 10; +pub const PS_FST_TYPE_UNKNOWN: ::c_int = 11; +pub const PS_FST_TYPE_NONE: ::c_int = 12; +pub const PS_FST_TYPE_PROCDESC: ::c_int = 13; +pub const PS_FST_TYPE_DEV: ::c_int = 14; +pub const PS_FST_TYPE_EVENTFD: ::c_int = 15; + +pub const PS_FST_UFLAG_RDIR: ::c_int = 0x0001; +pub const PS_FST_UFLAG_CDIR: ::c_int = 0x0002; +pub const PS_FST_UFLAG_JAIL: ::c_int = 0x0004; +pub const PS_FST_UFLAG_TRACE: ::c_int = 0x0008; +pub const PS_FST_UFLAG_TEXT: ::c_int = 0x0010; +pub const PS_FST_UFLAG_MMAP: ::c_int = 0x0020; +pub const PS_FST_UFLAG_CTTY: ::c_int = 0x0040; + +pub const PS_FST_FFLAG_READ: ::c_int = 0x0001; +pub const PS_FST_FFLAG_WRITE: ::c_int = 0x0002; +pub const PS_FST_FFLAG_NONBLOCK: ::c_int = 0x0004; +pub const PS_FST_FFLAG_APPEND: ::c_int = 0x0008; +pub const PS_FST_FFLAG_SHLOCK: ::c_int = 0x0010; +pub const PS_FST_FFLAG_EXLOCK: ::c_int = 0x0020; +pub const PS_FST_FFLAG_ASYNC: ::c_int = 0x0040; +pub const PS_FST_FFLAG_SYNC: ::c_int = 0x0080; +pub const PS_FST_FFLAG_NOFOLLOW: ::c_int = 0x0100; +pub const PS_FST_FFLAG_CREAT: ::c_int = 0x0200; +pub const PS_FST_FFLAG_TRUNC: ::c_int = 0x0400; +pub const PS_FST_FFLAG_EXCL: ::c_int = 0x0800; +pub const PS_FST_FFLAG_DIRECT: ::c_int = 0x1000; +pub const PS_FST_FFLAG_EXEC: ::c_int = 0x2000; +pub const PS_FST_FFLAG_HASLOCK: ::c_int = 0x4000; + +// sys/mount.h + +/// File identifier. +/// These are unique per filesystem on a single machine. +/// +/// Note that the offset of fid_data is 4 bytes, so care must be taken to avoid +/// undefined behavior accessing unaligned fields within an embedded struct. +pub const MAXFIDSZ: ::c_int = 16; +/// Length of type name including null. +pub const MFSNAMELEN: ::c_int = 16; +cfg_if! { + if #[cfg(any(freebsd10, freebsd11))] { + /// Size of on/from name bufs. + pub const MNAMELEN: ::c_int = 88; + } else { + /// Size of on/from name bufs. + pub const MNAMELEN: ::c_int = 1024; + } +} + +/// Using journaled soft updates. +pub const MNT_SUJ: u64 = 0x100000000; +/// Mounted by automountd(8). +pub const MNT_AUTOMOUNTED: u64 = 0x200000000; +/// Filesys metadata untrusted. +pub const MNT_UNTRUSTED: u64 = 0x800000000; + +/// Require TLS. +pub const MNT_EXTLS: u64 = 0x4000000000; +/// Require TLS with client cert. +pub const MNT_EXTLSCERT: u64 = 0x8000000000; +/// Require TLS with user cert. +pub const MNT_EXTLSCERTUSER: u64 = 0x10000000000; + +/// Filesystem is stored locally. +pub const MNT_LOCAL: u64 = 0x000001000; +/// Quotas are enabled on fs. +pub const MNT_QUOTA: u64 = 0x000002000; +/// Identifies the root fs. +pub const MNT_ROOTFS: u64 = 0x000004000; +/// Mounted by a user. +pub const MNT_USER: u64 = 0x000008000; +/// Do not show entry in df. +pub const MNT_IGNORE: u64 = 0x000800000; +/// Filesystem is verified. +pub const MNT_VERIFIED: u64 = 0x400000000; + +/// Do not cover a mount point. +pub const MNT_NOCOVER: u64 = 0x001000000000; +/// Only mount on empty dir. +pub const MNT_EMPTYDIR: u64 = 0x002000000000; +/// Recursively unmount uppers. +pub const MNT_RECURSE: u64 = 0x100000000000; +/// Unmount in async context. +pub const MNT_DEFERRED: u64 = 0x200000000000; + +/// Get configured filesystems. +pub const VFS_VFSCONF: ::c_int = 0; +/// Generic filesystem information. +pub const VFS_GENERIC: ::c_int = 0; + +/// int: highest defined filesystem type. +pub const VFS_MAXTYPENUM: ::c_int = 1; +/// struct: vfsconf for filesystem given as next argument. +pub const VFS_CONF: ::c_int = 2; + +/// Synchronously wait for I/O to complete. +pub const MNT_WAIT: ::c_int = 1; +/// Start all I/O, but do not wait for it. +pub const MNT_NOWAIT: ::c_int = 2; +/// Push data not written by filesystem syncer. +pub const MNT_LAZY: ::c_int = 3; +/// Suspend file system after sync. +pub const MNT_SUSPEND: ::c_int = 4; + +pub const MAXSECFLAVORS: ::c_int = 5; + +/// Statically compiled into kernel. +pub const VFCF_STATIC: ::c_int = 0x00010000; +/// May get data over the network. +pub const VFCF_NETWORK: ::c_int = 0x00020000; +/// Writes are not implemented. +pub const VFCF_READONLY: ::c_int = 0x00040000; +/// Data does not represent real files. +pub const VFCF_SYNTHETIC: ::c_int = 0x00080000; +/// Aliases some other mounted FS. +pub const VFCF_LOOPBACK: ::c_int = 0x00100000; +/// Stores file names as Unicode. +pub const VFCF_UNICODE: ::c_int = 0x00200000; +/// Can be mounted from within a jail. +pub const VFCF_JAIL: ::c_int = 0x00400000; +/// Supports delegated administration. +pub const VFCF_DELEGADMIN: ::c_int = 0x00800000; +/// Stop at Boundary: defer stop requests to kernel->user (AST) transition. +pub const VFCF_SBDRY: ::c_int = 0x01000000; + +// time.h + +/// not on dst +pub const DST_NONE: ::c_int = 0; +/// USA style dst +pub const DST_USA: ::c_int = 1; +/// Australian style dst +pub const DST_AUST: ::c_int = 2; +/// Western European dst +pub const DST_WET: ::c_int = 3; +/// Middle European dst +pub const DST_MET: ::c_int = 4; +/// Eastern European dst +pub const DST_EET: ::c_int = 5; +/// Canada +pub const DST_CAN: ::c_int = 6; + +pub const CPUCLOCK_WHICH_PID: ::c_int = 0; +pub const CPUCLOCK_WHICH_TID: ::c_int = 1; + +pub const MFD_CLOEXEC: ::c_uint = 0x00000001; +pub const MFD_ALLOW_SEALING: ::c_uint = 0x00000002; +pub const MFD_HUGETLB: ::c_uint = 0x00000004; +pub const MFD_HUGE_MASK: ::c_uint = 0xFC000000; +pub const MFD_HUGE_64KB: ::c_uint = 16 << 26; +pub const MFD_HUGE_512KB: ::c_uint = 19 << 26; +pub const MFD_HUGE_1MB: ::c_uint = 20 << 26; +pub const MFD_HUGE_2MB: ::c_uint = 21 << 26; +pub const MFD_HUGE_8MB: ::c_uint = 23 << 26; +pub const MFD_HUGE_16MB: ::c_uint = 24 << 26; +pub const MFD_HUGE_32MB: ::c_uint = 25 << 26; +pub const MFD_HUGE_256MB: ::c_uint = 28 << 26; +pub const MFD_HUGE_512MB: ::c_uint = 29 << 26; +pub const MFD_HUGE_1GB: ::c_uint = 30 << 26; +pub const MFD_HUGE_2GB: ::c_uint = 31 << 26; +pub const MFD_HUGE_16GB: ::c_uint = 34 << 26; + +pub const SHM_LARGEPAGE_ALLOC_DEFAULT: ::c_int = 0; +pub const SHM_LARGEPAGE_ALLOC_NOWAIT: ::c_int = 1; +pub const SHM_LARGEPAGE_ALLOC_HARD: ::c_int = 2; +pub const SHM_RENAME_NOREPLACE: ::c_int = 1 << 0; +pub const SHM_RENAME_EXCHANGE: ::c_int = 1 << 1; + +// sys/umtx.h + +pub const UMTX_OP_WAIT: ::c_int = 2; +pub const UMTX_OP_WAKE: ::c_int = 3; +pub const UMTX_OP_MUTEX_TRYLOCK: ::c_int = 4; +pub const UMTX_OP_MUTEX_LOCK: ::c_int = 5; +pub const UMTX_OP_MUTEX_UNLOCK: ::c_int = 6; +pub const UMTX_OP_SET_CEILING: ::c_int = 7; +pub const UMTX_OP_CV_WAIT: ::c_int = 8; +pub const UMTX_OP_CV_SIGNAL: ::c_int = 9; +pub const UMTX_OP_CV_BROADCAST: ::c_int = 10; +pub const UMTX_OP_WAIT_UINT: ::c_int = 11; +pub const UMTX_OP_RW_RDLOCK: ::c_int = 12; +pub const UMTX_OP_RW_WRLOCK: ::c_int = 13; +pub const UMTX_OP_RW_UNLOCK: ::c_int = 14; +pub const UMTX_OP_WAIT_UINT_PRIVATE: ::c_int = 15; +pub const UMTX_OP_WAKE_PRIVATE: ::c_int = 16; +pub const UMTX_OP_MUTEX_WAIT: ::c_int = 17; +pub const UMTX_OP_NWAKE_PRIVATE: ::c_int = 21; +pub const UMTX_OP_MUTEX_WAKE2: ::c_int = 22; +pub const UMTX_OP_SEM2_WAIT: ::c_int = 23; +pub const UMTX_OP_SEM2_WAKE: ::c_int = 24; +pub const UMTX_OP_SHM: ::c_int = 25; +pub const UMTX_OP_ROBUST_LISTS: ::c_int = 26; + +pub const UMTX_ABSTIME: u32 = 1; + +pub const CPU_LEVEL_ROOT: ::c_int = 1; +pub const CPU_LEVEL_CPUSET: ::c_int = 2; +pub const CPU_LEVEL_WHICH: ::c_int = 3; + +pub const CPU_WHICH_TID: ::c_int = 1; +pub const CPU_WHICH_PID: ::c_int = 2; +pub const CPU_WHICH_CPUSET: ::c_int = 3; +pub const CPU_WHICH_IRQ: ::c_int = 4; +pub const CPU_WHICH_JAIL: ::c_int = 5; + +// sys/signal.h +pub const SIGTHR: ::c_int = 32; +pub const SIGLWP: ::c_int = SIGTHR; +pub const SIGLIBRT: ::c_int = 33; + +// netinet/sctp.h +pub const SCTP_FUTURE_ASSOC: ::c_int = 0; +pub const SCTP_CURRENT_ASSOC: ::c_int = 1; +pub const SCTP_ALL_ASSOC: ::c_int = 2; + +pub const SCTP_NO_NEXT_MSG: ::c_int = 0x0000; +pub const SCTP_NEXT_MSG_AVAIL: ::c_int = 0x0001; +pub const SCTP_NEXT_MSG_ISCOMPLETE: ::c_int = 0x0002; +pub const SCTP_NEXT_MSG_IS_UNORDERED: ::c_int = 0x0004; +pub const SCTP_NEXT_MSG_IS_NOTIFICATION: ::c_int = 0x0008; + +pub const SCTP_RECVV_NOINFO: ::c_int = 0; +pub const SCTP_RECVV_RCVINFO: ::c_int = 1; +pub const SCTP_RECVV_NXTINFO: ::c_int = 2; +pub const SCTP_RECVV_RN: ::c_int = 3; + +pub const SCTP_SENDV_NOINFO: ::c_int = 0; +pub const SCTP_SENDV_SNDINFO: ::c_int = 1; +pub const SCTP_SENDV_PRINFO: ::c_int = 2; +pub const SCTP_SENDV_AUTHINFO: ::c_int = 3; +pub const SCTP_SENDV_SPA: ::c_int = 4; + +pub const SCTP_SEND_SNDINFO_VALID: ::c_int = 0x00000001; +pub const SCTP_SEND_PRINFO_VALID: ::c_int = 0x00000002; +pub const SCTP_SEND_AUTHINFO_VALID: ::c_int = 0x00000004; + +pub const SCTP_NOTIFICATION: ::c_int = 0x0010; +pub const SCTP_COMPLETE: ::c_int = 0x0020; +pub const SCTP_EOF: ::c_int = 0x0100; +pub const SCTP_ABORT: ::c_int = 0x0200; +pub const SCTP_UNORDERED: ::c_int = 0x0400; +pub const SCTP_ADDR_OVER: ::c_int = 0x0800; +pub const SCTP_SENDALL: ::c_int = 0x1000; +pub const SCTP_EOR: ::c_int = 0x2000; +pub const SCTP_SACK_IMMEDIATELY: ::c_int = 0x4000; +pub const SCTP_PR_SCTP_NONE: ::c_int = 0x0000; +pub const SCTP_PR_SCTP_TTL: ::c_int = 0x0001; +pub const SCTP_PR_SCTP_PRIO: ::c_int = 0x0002; +pub const SCTP_PR_SCTP_BUF: ::c_int = SCTP_PR_SCTP_PRIO; +pub const SCTP_PR_SCTP_RTX: ::c_int = 0x0003; +pub const SCTP_PR_SCTP_MAX: ::c_int = SCTP_PR_SCTP_RTX; +pub const SCTP_PR_SCTP_ALL: ::c_int = 0x000f; + +pub const SCTP_INIT: ::c_int = 0x0001; +pub const SCTP_SNDRCV: ::c_int = 0x0002; +pub const SCTP_EXTRCV: ::c_int = 0x0003; +pub const SCTP_SNDINFO: ::c_int = 0x0004; +pub const SCTP_RCVINFO: ::c_int = 0x0005; +pub const SCTP_NXTINFO: ::c_int = 0x0006; +pub const SCTP_PRINFO: ::c_int = 0x0007; +pub const SCTP_AUTHINFO: ::c_int = 0x0008; +pub const SCTP_DSTADDRV4: ::c_int = 0x0009; +pub const SCTP_DSTADDRV6: ::c_int = 0x000a; + +pub const SCTP_RTOINFO: ::c_int = 0x00000001; +pub const SCTP_ASSOCINFO: ::c_int = 0x00000002; +pub const SCTP_INITMSG: ::c_int = 0x00000003; +pub const SCTP_NODELAY: ::c_int = 0x00000004; +pub const SCTP_AUTOCLOSE: ::c_int = 0x00000005; +pub const SCTP_SET_PEER_PRIMARY_ADDR: ::c_int = 0x00000006; +pub const SCTP_PRIMARY_ADDR: ::c_int = 0x00000007; +pub const SCTP_ADAPTATION_LAYER: ::c_int = 0x00000008; +pub const SCTP_ADAPTION_LAYER: ::c_int = 0x00000008; +pub const SCTP_DISABLE_FRAGMENTS: ::c_int = 0x00000009; +pub const SCTP_PEER_ADDR_PARAMS: ::c_int = 0x0000000a; +pub const SCTP_DEFAULT_SEND_PARAM: ::c_int = 0x0000000b; +pub const SCTP_EVENTS: ::c_int = 0x0000000c; +pub const SCTP_I_WANT_MAPPED_V4_ADDR: ::c_int = 0x0000000d; +pub const SCTP_MAXSEG: ::c_int = 0x0000000e; +pub const SCTP_DELAYED_SACK: ::c_int = 0x0000000f; +pub const SCTP_FRAGMENT_INTERLEAVE: ::c_int = 0x00000010; +pub const SCTP_PARTIAL_DELIVERY_POINT: ::c_int = 0x00000011; +pub const SCTP_AUTH_CHUNK: ::c_int = 0x00000012; +pub const SCTP_AUTH_KEY: ::c_int = 0x00000013; +pub const SCTP_HMAC_IDENT: ::c_int = 0x00000014; +pub const SCTP_AUTH_ACTIVE_KEY: ::c_int = 0x00000015; +pub const SCTP_AUTH_DELETE_KEY: ::c_int = 0x00000016; +pub const SCTP_USE_EXT_RCVINFO: ::c_int = 0x00000017; +pub const SCTP_AUTO_ASCONF: ::c_int = 0x00000018; +pub const SCTP_MAXBURST: ::c_int = 0x00000019; +pub const SCTP_MAX_BURST: ::c_int = 0x00000019; +pub const SCTP_CONTEXT: ::c_int = 0x0000001a; +pub const SCTP_EXPLICIT_EOR: ::c_int = 0x00000001b; +pub const SCTP_REUSE_PORT: ::c_int = 0x00000001c; +pub const SCTP_AUTH_DEACTIVATE_KEY: ::c_int = 0x00000001d; +pub const SCTP_EVENT: ::c_int = 0x0000001e; +pub const SCTP_RECVRCVINFO: ::c_int = 0x0000001f; +pub const SCTP_RECVNXTINFO: ::c_int = 0x00000020; +pub const SCTP_DEFAULT_SNDINFO: ::c_int = 0x00000021; +pub const SCTP_DEFAULT_PRINFO: ::c_int = 0x00000022; +pub const SCTP_PEER_ADDR_THLDS: ::c_int = 0x00000023; +pub const SCTP_REMOTE_UDP_ENCAPS_PORT: ::c_int = 0x00000024; +pub const SCTP_ECN_SUPPORTED: ::c_int = 0x00000025; +pub const SCTP_AUTH_SUPPORTED: ::c_int = 0x00000027; +pub const SCTP_ASCONF_SUPPORTED: ::c_int = 0x00000028; +pub const SCTP_RECONFIG_SUPPORTED: ::c_int = 0x00000029; +pub const SCTP_NRSACK_SUPPORTED: ::c_int = 0x00000030; +pub const SCTP_PKTDROP_SUPPORTED: ::c_int = 0x00000031; +pub const SCTP_MAX_CWND: ::c_int = 0x00000032; + +pub const SCTP_STATUS: ::c_int = 0x00000100; +pub const SCTP_GET_PEER_ADDR_INFO: ::c_int = 0x00000101; +pub const SCTP_PEER_AUTH_CHUNKS: ::c_int = 0x00000102; +pub const SCTP_LOCAL_AUTH_CHUNKS: ::c_int = 0x00000103; +pub const SCTP_GET_ASSOC_NUMBER: ::c_int = 0x00000104; +pub const SCTP_GET_ASSOC_ID_LIST: ::c_int = 0x00000105; +pub const SCTP_TIMEOUTS: ::c_int = 0x00000106; +pub const SCTP_PR_STREAM_STATUS: ::c_int = 0x00000107; +pub const SCTP_PR_ASSOC_STATUS: ::c_int = 0x00000108; + +pub const SCTP_COMM_UP: ::c_int = 0x0001; +pub const SCTP_COMM_LOST: ::c_int = 0x0002; +pub const SCTP_RESTART: ::c_int = 0x0003; +pub const SCTP_SHUTDOWN_COMP: ::c_int = 0x0004; +pub const SCTP_CANT_STR_ASSOC: ::c_int = 0x0005; + +pub const SCTP_ASSOC_SUPPORTS_PR: ::c_int = 0x01; +pub const SCTP_ASSOC_SUPPORTS_AUTH: ::c_int = 0x02; +pub const SCTP_ASSOC_SUPPORTS_ASCONF: ::c_int = 0x03; +pub const SCTP_ASSOC_SUPPORTS_MULTIBUF: ::c_int = 0x04; +pub const SCTP_ASSOC_SUPPORTS_RE_CONFIG: ::c_int = 0x05; +pub const SCTP_ASSOC_SUPPORTS_INTERLEAVING: ::c_int = 0x06; +pub const SCTP_ASSOC_SUPPORTS_MAX: ::c_int = 0x06; + +pub const SCTP_ADDR_AVAILABLE: ::c_int = 0x0001; +pub const SCTP_ADDR_UNREACHABLE: ::c_int = 0x0002; +pub const SCTP_ADDR_REMOVED: ::c_int = 0x0003; +pub const SCTP_ADDR_ADDED: ::c_int = 0x0004; +pub const SCTP_ADDR_MADE_PRIM: ::c_int = 0x0005; +pub const SCTP_ADDR_CONFIRMED: ::c_int = 0x0006; + +pub const SCTP_ACTIVE: ::c_int = 0x0001; +pub const SCTP_INACTIVE: ::c_int = 0x0002; +pub const SCTP_UNCONFIRMED: ::c_int = 0x0200; + +pub const SCTP_DATA_UNSENT: ::c_int = 0x0001; +pub const SCTP_DATA_SENT: ::c_int = 0x0002; + +pub const SCTP_PARTIAL_DELIVERY_ABORTED: ::c_int = 0x0001; + +pub const SCTP_AUTH_NEW_KEY: ::c_int = 0x0001; +pub const SCTP_AUTH_NEWKEY: ::c_int = SCTP_AUTH_NEW_KEY; +pub const SCTP_AUTH_NO_AUTH: ::c_int = 0x0002; +pub const SCTP_AUTH_FREE_KEY: ::c_int = 0x0003; + +pub const SCTP_STREAM_RESET_INCOMING_SSN: ::c_int = 0x0001; +pub const SCTP_STREAM_RESET_OUTGOING_SSN: ::c_int = 0x0002; +pub const SCTP_STREAM_RESET_DENIED: ::c_int = 0x0004; +pub const SCTP_STREAM_RESET_FAILED: ::c_int = 0x0008; + +pub const SCTP_ASSOC_RESET_DENIED: ::c_int = 0x0004; +pub const SCTP_ASSOC_RESET_FAILED: ::c_int = 0x0008; + +pub const SCTP_STREAM_CHANGE_DENIED: ::c_int = 0x0004; +pub const SCTP_STREAM_CHANGE_FAILED: ::c_int = 0x0008; + +pub const KENV_DUMP_LOADER: ::c_int = 4; +pub const KENV_DUMP_STATIC: ::c_int = 5; + +pub const RB_PAUSE: ::c_int = 0x100000; +pub const RB_REROOT: ::c_int = 0x200000; +pub const RB_POWERCYCLE: ::c_int = 0x400000; +pub const RB_PROBE: ::c_int = 0x10000000; +pub const RB_MULTIPLE: ::c_int = 0x20000000; + +cfg_if! { + if #[cfg(libc_const_extern_fn)] { + pub const fn MAP_ALIGNED(a: ::c_int) -> ::c_int { + a << 24 + } + } else { + pub fn MAP_ALIGNED(a: ::c_int) -> ::c_int { + a << 24 + } + } +} + +const_fn! { + {const} fn _ALIGN(p: usize) -> usize { + (p + _ALIGNBYTES) & !_ALIGNBYTES + } +} + +f! { + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + _ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + + _ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (_ALIGN(::mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize)) + as ::c_uint + } + + pub fn MALLOCX_ALIGN(lg: ::c_uint) -> ::c_int { + ffsl(lg as ::c_long - 1) + } + + pub {const} fn MALLOCX_TCACHE(tc: ::c_int) -> ::c_int { + (tc + 2) << 8 as ::c_int + } + + pub {const} fn MALLOCX_ARENA(a: ::c_int) -> ::c_int { + (a + 1) << 20 as ::c_int + } + + pub fn SOCKCREDSIZE(ngrps: usize) -> usize { + let ngrps = if ngrps > 0 { + ngrps - 1 + } else { + 0 + }; + ::mem::size_of::() + ::mem::size_of::<::gid_t>() * ngrps + } + + pub fn uname(buf: *mut ::utsname) -> ::c_int { + __xuname(256, buf as *mut ::c_void) + } + + pub fn CPU_ZERO(cpuset: &mut cpuset_t) -> () { + for slot in cpuset.__bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_FILL(cpuset: &mut cpuset_t) -> () { + for slot in cpuset.__bits.iter_mut() { + *slot = !0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpuset_t) -> () { + let bitset_bits = 8 * ::mem::size_of::<::c_long>(); + let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits); + cpuset.__bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpuset_t) -> () { + let bitset_bits = 8 * ::mem::size_of::<::c_long>(); + let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits); + cpuset.__bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpuset_t) -> bool { + let bitset_bits = 8 * ::mem::size_of::<::c_long>(); + let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits); + 0 != cpuset.__bits[idx] & (1 << offset) + } + + pub fn CPU_COUNT(cpuset: &cpuset_t) -> ::c_int { + let mut s: u32 = 0; + let cpuset_size = ::mem::size_of::(); + let bitset_size = ::mem::size_of::<::c_long>(); + + for i in cpuset.__bits[..(cpuset_size / bitset_size)].iter() { + s += i.count_ones(); + }; + s as ::c_int + } + + pub fn SOCKCRED2SIZE(ngrps: usize) -> usize { + let ngrps = if ngrps > 0 { + ngrps - 1 + } else { + 0 + }; + ::mem::size_of::() + ::mem::size_of::<::gid_t>() * ngrps + } +} + +safe_f! { + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 && status != 0x13 + } + + pub {const} fn INVALID_SINFO_FLAG(x: ::c_int) -> bool { + (x) & 0xfffffff0 & !(SCTP_EOF | SCTP_ABORT | SCTP_UNORDERED | + SCTP_ADDR_OVER | SCTP_SENDALL | SCTP_EOR | SCTP_SACK_IMMEDIATELY) != 0 + } + + pub {const} fn PR_SCTP_POLICY(x: ::c_int) -> ::c_int { + x & 0x0f + } + + pub {const} fn PR_SCTP_ENABLED(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) != SCTP_PR_SCTP_NONE && PR_SCTP_POLICY(x) != SCTP_PR_SCTP_ALL + } + + pub {const} fn PR_SCTP_TTL_ENABLED(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) == SCTP_PR_SCTP_TTL + } + + pub {const} fn PR_SCTP_BUF_ENABLED(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) == SCTP_PR_SCTP_BUF + } + + pub {const} fn PR_SCTP_RTX_ENABLED(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) == SCTP_PR_SCTP_RTX + } + + pub {const} fn PR_SCTP_INVALID_POLICY(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) > SCTP_PR_SCTP_MAX + } + + pub {const} fn PR_SCTP_VALID_POLICY(x: ::c_int) -> bool { + PR_SCTP_POLICY(x) <= SCTP_PR_SCTP_MAX + } +} + +cfg_if! { + if #[cfg(not(any(freebsd10, freebsd11)))] { + extern "C" { + pub fn fhlink(fhp: *mut fhandle_t, to: *const ::c_char) -> ::c_int; + pub fn fhlinkat(fhp: *mut fhandle_t, tofd: ::c_int, to: *const ::c_char) -> ::c_int; + pub fn fhreadlink( + fhp: *mut fhandle_t, + buf: *mut ::c_char, + bufsize: ::size_t, + ) -> ::c_int; + pub fn getfhat( + fd: ::c_int, + path: *mut ::c_char, + fhp: *mut fhandle, + flag: ::c_int, + ) -> ::c_int; + } + } +} + +extern "C" { + #[cfg_attr(doc, doc(alias = "__errno_location"))] + #[cfg_attr(doc, doc(alias = "errno"))] + pub fn __error() -> *mut ::c_int; + + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_readv(aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_writev(aiocbp: *mut ::aiocb) -> ::c_int; + + pub fn copy_file_range( + infd: ::c_int, + inoffp: *mut ::off_t, + outfd: ::c_int, + outoffp: *mut ::off_t, + len: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + + pub fn devname_r( + dev: ::dev_t, + mode: ::mode_t, + buf: *mut ::c_char, + len: ::c_int, + ) -> *mut ::c_char; + + pub fn extattr_delete_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_delete_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_delete_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_get_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_get_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_get_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_list_fd( + fd: ::c_int, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_list_file( + path: *const ::c_char, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_list_link( + path: *const ::c_char, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_set_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_set_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_set_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + + pub fn fspacectl( + fd: ::c_int, + cmd: ::c_int, + rqsr: *const spacectl_range, + flags: ::c_int, + rmsr: *mut spacectl_range, + ) -> ::c_int; + + pub fn jail(jail: *mut ::jail) -> ::c_int; + pub fn jail_attach(jid: ::c_int) -> ::c_int; + pub fn jail_remove(jid: ::c_int) -> ::c_int; + pub fn jail_get(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) -> ::c_int; + pub fn jail_set(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) -> ::c_int; + + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + + pub fn getutxuser(user: *const ::c_char) -> *mut utmpx; + pub fn setutxdb(_type: ::c_int, file: *const ::c_char) -> ::c_int; + + pub fn aio_waitcomplete(iocbp: *mut *mut aiocb, timeout: *mut ::timespec) -> ::ssize_t; + pub fn mq_getfd_np(mqd: ::mqd_t) -> ::c_int; + + pub fn waitid( + idtype: idtype_t, + id: ::id_t, + infop: *mut ::siginfo_t, + options: ::c_int, + ) -> ::c_int; + pub fn ptsname_r(fd: ::c_int, buf: *mut ::c_char, buflen: ::size_t) -> ::c_int; + + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn semget(key: ::key_t, nsems: ::c_int, semflg: ::c_int) -> ::c_int; + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut sembuf, nsops: ::size_t) -> ::c_int; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut ::msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgsnd( + msqid: ::c_int, + msgp: *const ::c_void, + msgsz: ::size_t, + msgflg: ::c_int, + ) -> ::c_int; + pub fn cfmakesane(termios: *mut ::termios); + + pub fn pdfork(fdp: *mut ::c_int, flags: ::c_int) -> ::pid_t; + pub fn pdgetpid(fd: ::c_int, pidp: *mut ::pid_t) -> ::c_int; + pub fn pdkill(fd: ::c_int, signum: ::c_int) -> ::c_int; + + pub fn rtprio_thread(function: ::c_int, lwpid: ::lwpid_t, rtp: *mut super::rtprio) -> ::c_int; + + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_getschedpolicy( + attr: *const posix_spawnattr_t, + flags: *mut ::c_int, + ) -> ::c_int; + pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; + pub fn posix_spawnattr_getschedparam( + attr: *const posix_spawnattr_t, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_setschedparam( + attr: *mut posix_spawnattr_t, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + + pub fn uuidgen(store: *mut uuid, count: ::c_int) -> ::c_int; + + pub fn thr_kill(id: ::c_long, sig: ::c_int) -> ::c_int; + pub fn thr_kill2(pid: ::pid_t, id: ::c_long, sig: ::c_int) -> ::c_int; + pub fn thr_self(tid: *mut ::c_long) -> ::c_int; + pub fn pthread_getthreadid_np() -> ::c_int; + pub fn pthread_getaffinity_np( + td: ::pthread_t, + cpusetsize: ::size_t, + cpusetp: *mut cpuset_t, + ) -> ::c_int; + pub fn pthread_setaffinity_np( + td: ::pthread_t, + cpusetsize: ::size_t, + cpusetp: *const cpuset_t, + ) -> ::c_int; + + // sched.h linux compatibility api + pub fn sched_getaffinity(pid: ::pid_t, cpusetsz: ::size_t, cpuset: *mut ::cpuset_t) -> ::c_int; + pub fn sched_setaffinity( + pid: ::pid_t, + cpusetsz: ::size_t, + cpuset: *const ::cpuset_t, + ) -> ::c_int; + pub fn sched_getcpu() -> ::c_int; + + pub fn pthread_mutex_consistent(mutex: *mut ::pthread_mutex_t) -> ::c_int; + + pub fn pthread_mutexattr_getrobust( + attr: *mut ::pthread_mutexattr_t, + robust: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setrobust( + attr: *mut ::pthread_mutexattr_t, + robust: ::c_int, + ) -> ::c_int; + + pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> ::c_int; + + #[cfg_attr(all(target_os = "freebsd", freebsd11), link_name = "statfs@FBSD_1.0")] + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + #[cfg_attr(all(target_os = "freebsd", freebsd11), link_name = "fstatfs@FBSD_1.0")] + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + + pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int; + pub fn __xuname(nmln: ::c_int, buf: *mut ::c_void) -> ::c_int; + + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::size_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::size_t, + flags: ::c_int, + timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + + pub fn fhopen(fhp: *const fhandle_t, flags: ::c_int) -> ::c_int; + pub fn fhstat(fhp: *const fhandle, buf: *mut ::stat) -> ::c_int; + pub fn fhstatfs(fhp: *const fhandle_t, buf: *mut ::statfs) -> ::c_int; + pub fn getfh(path: *const ::c_char, fhp: *mut fhandle_t) -> ::c_int; + pub fn lgetfh(path: *const ::c_char, fhp: *mut fhandle_t) -> ::c_int; + pub fn getfsstat(buf: *mut ::statfs, bufsize: ::c_long, mode: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "freebsd", freebsd11), + link_name = "getmntinfo@FBSD_1.0" + )] + pub fn getmntinfo(mntbufp: *mut *mut ::statfs, mode: ::c_int) -> ::c_int; + pub fn mount( + type_: *const ::c_char, + dir: *const ::c_char, + flags: ::c_int, + data: *mut ::c_void, + ) -> ::c_int; + pub fn nmount(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int) -> ::c_int; + + pub fn setproctitle(fmt: *const ::c_char, ...); + pub fn rfork(flags: ::c_int) -> ::c_int; + pub fn cpuset_getaffinity( + level: cpulevel_t, + which: cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *mut cpuset_t, + ) -> ::c_int; + pub fn cpuset_setaffinity( + level: cpulevel_t, + which: cpuwhich_t, + id: ::id_t, + setsize: ::size_t, + mask: *const cpuset_t, + ) -> ::c_int; + pub fn cpuset(setid: *mut ::cpusetid_t) -> ::c_int; + pub fn cpuset_getid( + level: cpulevel_t, + which: cpuwhich_t, + id: ::id_t, + setid: *mut ::cpusetid_t, + ) -> ::c_int; + pub fn cpuset_setid(which: cpuwhich_t, id: ::id_t, setid: ::cpusetid_t) -> ::c_int; + pub fn cap_enter() -> ::c_int; + pub fn cap_getmode(modep: *mut ::c_uint) -> ::c_int; + pub fn cap_fcntls_get(fd: ::c_int, fcntlrightsp: *mut u32) -> ::c_int; + pub fn cap_fcntls_limit(fd: ::c_int, fcntlrights: u32) -> ::c_int; + pub fn cap_ioctls_get(fd: ::c_int, cmds: *mut u_long, maxcmds: usize) -> isize; + pub fn cap_ioctls_limit(fd: ::c_int, cmds: *const u_long, ncmds: usize) -> ::c_int; + pub fn __cap_rights_init(version: ::c_int, rights: *mut cap_rights_t, ...) + -> *mut cap_rights_t; + pub fn __cap_rights_get(version: ::c_int, fd: ::c_int, rightsp: *mut cap_rights_t) -> ::c_int; + pub fn __cap_rights_set(rights: *mut cap_rights_t, ...) -> *mut cap_rights_t; + pub fn __cap_rights_clear(rights: *mut cap_rights_t, ...) -> *mut cap_rights_t; + pub fn __cap_rights_is_set(rights: *const cap_rights_t, ...) -> bool; + pub fn cap_rights_is_valid(rights: *const cap_rights_t) -> bool; + pub fn cap_rights_limit(fd: ::c_int, rights: *const cap_rights_t) -> ::c_int; + pub fn cap_rights_merge(dst: *mut cap_rights_t, src: *const cap_rights_t) -> *mut cap_rights_t; + pub fn cap_rights_remove(dst: *mut cap_rights_t, src: *const cap_rights_t) + -> *mut cap_rights_t; + pub fn cap_rights_contains(big: *const cap_rights_t, little: *const cap_rights_t) -> bool; + pub fn cap_sandboxed() -> bool; + + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn ffs(value: ::c_int) -> ::c_int; + pub fn ffsl(value: ::c_long) -> ::c_int; + pub fn ffsll(value: ::c_longlong) -> ::c_int; + pub fn fls(value: ::c_int) -> ::c_int; + pub fn flsl(value: ::c_long) -> ::c_int; + pub fn flsll(value: ::c_longlong) -> ::c_int; + pub fn malloc_stats_print( + write_cb: unsafe extern "C" fn(*mut ::c_void, *const ::c_char), + cbopaque: *mut ::c_void, + opt: *const ::c_char, + ); + pub fn mallctl( + name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn mallctlnametomib( + name: *const ::c_char, + mibp: *mut ::size_t, + miplen: *mut ::size_t, + ) -> ::c_int; + pub fn mallctlbymib( + mib: *const ::size_t, + mible: ::size_t, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn mallocx(size: ::size_t, flags: ::c_int) -> *mut ::c_void; + pub fn rallocx(ptr: *mut ::c_void, size: ::size_t, flags: ::c_int) -> *mut ::c_void; + pub fn xallocx(ptr: *mut ::c_void, size: ::size_t, extra: ::size_t, flags: ::c_int) + -> ::size_t; + pub fn sallocx(ptr: *const ::c_void, flags: ::c_int) -> ::size_t; + pub fn dallocx(ptr: *mut ::c_void, flags: ::c_int); + pub fn sdallocx(ptr: *mut ::c_void, size: ::size_t, flags: ::c_int); + pub fn nallocx(size: ::size_t, flags: ::c_int) -> ::size_t; + + pub fn procctl(idtype: ::idtype_t, id: ::id_t, cmd: ::c_int, data: *mut ::c_void) -> ::c_int; + + pub fn getpagesize() -> ::c_int; + pub fn getpagesizes(pagesize: *mut ::size_t, nelem: ::c_int) -> ::c_int; + + pub fn clock_getcpuclockid2(arg1: ::id_t, arg2: ::c_int, arg3: *mut clockid_t) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + + pub fn strchrnul(s: *const ::c_char, c: ::c_int) -> *mut ::c_char; + + pub fn shm_create_largepage( + path: *const ::c_char, + flags: ::c_int, + psind: ::c_int, + alloc_policy: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn shm_rename( + path_from: *const ::c_char, + path_to: *const ::c_char, + flags: ::c_int, + ) -> ::c_int; + pub fn memfd_create(name: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn setaudit(auditinfo: *const auditinfo_t) -> ::c_int; + + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + + pub fn fdatasync(fd: ::c_int) -> ::c_int; + + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + pub fn elf_aux_info(aux: ::c_int, buf: *mut ::c_void, buflen: ::c_int) -> ::c_int; + pub fn setproctitle_fast(fmt: *const ::c_char, ...); + pub fn timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int; + + pub fn _umtx_op( + obj: *mut ::c_void, + op: ::c_int, + val: ::c_ulong, + uaddr: *mut ::c_void, + uaddr2: *mut ::c_void, + ) -> ::c_int; + + pub fn sctp_peeloff(s: ::c_int, id: ::sctp_assoc_t) -> ::c_int; + pub fn sctp_bindx(s: ::c_int, addrs: *mut ::sockaddr, num: ::c_int, tpe: ::c_int) -> ::c_int; + pub fn sctp_connectx( + s: ::c_int, + addrs: *const ::sockaddr, + addrcnt: ::c_int, + id: *mut ::sctp_assoc_t, + ) -> ::c_int; + pub fn sctp_getaddrlen(family: ::sa_family_t) -> ::c_int; + pub fn sctp_getpaddrs( + s: ::c_int, + asocid: ::sctp_assoc_t, + addrs: *mut *mut ::sockaddr, + ) -> ::c_int; + pub fn sctp_freepaddrs(addrs: *mut ::sockaddr); + pub fn sctp_getladdrs( + s: ::c_int, + asocid: ::sctp_assoc_t, + addrs: *mut *mut ::sockaddr, + ) -> ::c_int; + pub fn sctp_freeladdrs(addrs: *mut ::sockaddr); + pub fn sctp_opt_info( + s: ::c_int, + id: ::sctp_assoc_t, + opt: ::c_int, + arg: *mut ::c_void, + size: *mut ::socklen_t, + ) -> ::c_int; + pub fn sctp_sendv( + sd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + addrs: *mut ::sockaddr, + addrcnt: ::c_int, + info: *mut ::c_void, + infolen: ::socklen_t, + infotype: ::c_uint, + flags: ::c_int, + ) -> ::ssize_t; + pub fn sctp_recvv( + sd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + from: *mut ::sockaddr, + fromlen: *mut ::socklen_t, + info: *mut ::c_void, + infolen: *mut ::socklen_t, + infotype: *mut ::c_uint, + flags: *mut ::c_int, + ) -> ::ssize_t; +} + +#[link(name = "memstat")] +extern "C" { + pub fn memstat_strerror(error: ::c_int) -> *const ::c_char; + pub fn memstat_mtl_alloc() -> *mut memory_type_list; + pub fn memstat_mtl_first(list: *mut memory_type_list) -> *mut memory_type; + pub fn memstat_mtl_next(mtp: *mut memory_type) -> *mut memory_type; + pub fn memstat_mtl_find( + list: *mut memory_type_list, + allocator: ::c_int, + name: *const ::c_char, + ) -> *mut memory_type; + pub fn memstat_mtl_free(list: *mut memory_type_list); + pub fn memstat_mtl_geterror(list: *mut memory_type_list) -> ::c_int; + pub fn memstat_get_name(mtp: *const memory_type) -> *const ::c_char; +} + +#[link(name = "kvm")] +extern "C" { + pub fn kvm_dpcpu_setcpu(kd: *mut ::kvm_t, cpu: ::c_uint) -> ::c_int; + pub fn kvm_getargv(kd: *mut ::kvm_t, p: *const kinfo_proc, nchr: ::c_int) + -> *mut *mut ::c_char; + pub fn kvm_getcptime(kd: *mut ::kvm_t, cp_time: *mut ::c_long) -> ::c_int; + pub fn kvm_getenvv(kd: *mut ::kvm_t, p: *const kinfo_proc, nchr: ::c_int) + -> *mut *mut ::c_char; + pub fn kvm_geterr(kd: *mut ::kvm_t) -> *mut ::c_char; + pub fn kvm_getmaxcpu(kd: *mut ::kvm_t) -> ::c_int; + pub fn kvm_getncpus(kd: *mut ::kvm_t) -> ::c_int; + pub fn kvm_getpcpu(kd: *mut ::kvm_t, cpu: ::c_int) -> *mut ::c_void; + pub fn kvm_counter_u64_fetch(kd: *mut ::kvm_t, base: ::c_ulong) -> u64; + pub fn kvm_getswapinfo( + kd: *mut ::kvm_t, + info: *mut kvm_swap, + maxswap: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn kvm_native(kd: *mut ::kvm_t) -> ::c_int; + pub fn kvm_nlist(kd: *mut ::kvm_t, nl: *mut nlist) -> ::c_int; + pub fn kvm_nlist2(kd: *mut ::kvm_t, nl: *mut kvm_nlist) -> ::c_int; + pub fn kvm_read_zpcpu( + kd: *mut ::kvm_t, + base: ::c_ulong, + buf: *mut ::c_void, + size: ::size_t, + cpu: ::c_int, + ) -> ::ssize_t; + pub fn kvm_read2( + kd: *mut ::kvm_t, + addr: kvaddr_t, + buf: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; +} + +#[link(name = "util")] +extern "C" { + pub fn extattr_namespace_to_string( + attrnamespace: ::c_int, + string: *mut *mut ::c_char, + ) -> ::c_int; + pub fn extattr_string_to_namespace( + string: *const ::c_char, + attrnamespace: *mut ::c_int, + ) -> ::c_int; + pub fn realhostname(host: *mut ::c_char, hsize: ::size_t, ip: *const ::in_addr) -> ::c_int; + pub fn realhostname_sa( + host: *mut ::c_char, + hsize: ::size_t, + addr: *mut ::sockaddr, + addrlen: ::c_int, + ) -> ::c_int; + + pub fn kld_isloaded(name: *const ::c_char) -> ::c_int; + pub fn kld_load(name: *const ::c_char) -> ::c_int; + + pub fn kinfo_getvmmap(pid: ::pid_t, cntp: *mut ::c_int) -> *mut kinfo_vmentry; + + pub fn hexdump(ptr: *const ::c_void, length: ::c_int, hdr: *const ::c_char, flags: ::c_int); + pub fn humanize_number( + buf: *mut ::c_char, + len: ::size_t, + number: i64, + suffix: *const ::c_char, + scale: ::c_int, + flags: ::c_int, + ) -> ::c_int; + + pub fn flopen(path: *const ::c_char, flags: ::c_int, ...) -> ::c_int; + pub fn flopenat(fd: ::c_int, path: *const ::c_char, flags: ::c_int, ...) -> ::c_int; + + pub fn getlocalbase() -> *const ::c_char; + + pub fn pidfile_open( + path: *const ::c_char, + mode: ::mode_t, + pidptr: *mut ::pid_t, + ) -> *mut ::pidfh; + pub fn pidfile_write(path: *mut ::pidfh) -> ::c_int; + pub fn pidfile_close(path: *mut ::pidfh) -> ::c_int; + pub fn pidfile_remove(path: *mut ::pidfh) -> ::c_int; + pub fn pidfile_fileno(path: *const ::pidfh) -> ::c_int; + // FIXME: pidfile_signal in due time (both manpage present and updated image snapshot) +} + +#[link(name = "procstat")] +extern "C" { + pub fn procstat_open_sysctl() -> *mut procstat; + pub fn procstat_getfiles( + procstat: *mut procstat, + kp: *mut kinfo_proc, + mmapped: ::c_int, + ) -> *mut filestat_list; + pub fn procstat_freefiles(procstat: *mut procstat, head: *mut filestat_list); + pub fn procstat_getprocs( + procstat: *mut procstat, + what: ::c_int, + arg: ::c_int, + count: *mut ::c_uint, + ) -> *mut kinfo_proc; + pub fn procstat_freeprocs(procstat: *mut procstat, p: *mut kinfo_proc); + pub fn procstat_getvmmap( + procstat: *mut procstat, + kp: *mut kinfo_proc, + count: *mut ::c_uint, + ) -> *mut kinfo_vmentry; + pub fn procstat_freevmmap(procstat: *mut procstat, vmmap: *mut kinfo_vmentry); + pub fn procstat_close(procstat: *mut procstat); + pub fn procstat_freeargv(procstat: *mut procstat); + pub fn procstat_freeenvv(procstat: *mut procstat); + pub fn procstat_freegroups(procstat: *mut procstat, groups: *mut ::gid_t); + pub fn procstat_freeptlwpinfo(procstat: *mut procstat, pl: *mut ptrace_lwpinfo); + pub fn procstat_getargv( + procstat: *mut procstat, + kp: *mut kinfo_proc, + nchr: ::size_t, + ) -> *mut *mut ::c_char; + pub fn procstat_getenvv( + procstat: *mut procstat, + kp: *mut kinfo_proc, + nchr: ::size_t, + ) -> *mut *mut ::c_char; + pub fn procstat_getgroups( + procstat: *mut procstat, + kp: *mut kinfo_proc, + count: *mut ::c_uint, + ) -> *mut ::gid_t; + pub fn procstat_getosrel( + procstat: *mut procstat, + kp: *mut kinfo_proc, + osrelp: *mut ::c_int, + ) -> ::c_int; + pub fn procstat_getpathname( + procstat: *mut procstat, + kp: *mut kinfo_proc, + pathname: *mut ::c_char, + maxlen: ::size_t, + ) -> ::c_int; + pub fn procstat_getrlimit( + procstat: *mut procstat, + kp: *mut kinfo_proc, + which: ::c_int, + rlimit: *mut ::rlimit, + ) -> ::c_int; + pub fn procstat_getumask( + procstat: *mut procstat, + kp: *mut kinfo_proc, + maskp: *mut ::c_ushort, + ) -> ::c_int; + pub fn procstat_open_core(filename: *const ::c_char) -> *mut procstat; + pub fn procstat_open_kvm(nlistf: *const ::c_char, memf: *const ::c_char) -> *mut procstat; + pub fn procstat_get_socket_info( + proc_: *mut procstat, + fst: *mut filestat, + sock: *mut sockstat, + errbuf: *mut ::c_char, + ) -> ::c_int; + pub fn procstat_get_vnode_info( + proc_: *mut procstat, + fst: *mut filestat, + vn: *mut vnstat, + errbuf: *mut ::c_char, + ) -> ::c_int; + pub fn procstat_get_pts_info( + proc_: *mut procstat, + fst: *mut filestat, + pts: *mut ptsstat, + errbuf: *mut ::c_char, + ) -> ::c_int; + pub fn procstat_get_shm_info( + proc_: *mut procstat, + fst: *mut filestat, + shm: *mut shmstat, + errbuf: *mut ::c_char, + ) -> ::c_int; +} + +#[link(name = "rt")] +extern "C" { + pub fn timer_create(clock_id: clockid_t, evp: *mut sigevent, timerid: *mut timer_t) -> ::c_int; + pub fn timer_delete(timerid: timer_t) -> ::c_int; + pub fn timer_getoverrun(timerid: timer_t) -> ::c_int; + pub fn timer_gettime(timerid: timer_t, value: *mut itimerspec) -> ::c_int; + pub fn timer_settime( + timerid: timer_t, + flags: ::c_int, + value: *const itimerspec, + ovalue: *mut itimerspec, + ) -> ::c_int; +} + +#[link(name = "devstat")] +extern "C" { + pub fn devstat_getnumdevs(kd: *mut ::kvm_t) -> ::c_int; + pub fn devstat_getgeneration(kd: *mut ::kvm_t) -> ::c_long; + pub fn devstat_getversion(kd: *mut ::kvm_t) -> ::c_int; + pub fn devstat_checkversion(kd: *mut ::kvm_t) -> ::c_int; + pub fn devstat_selectdevs( + dev_select: *mut *mut device_selection, + num_selected: *mut ::c_int, + num_selections: *mut ::c_int, + select_generation: *mut ::c_long, + current_generation: ::c_long, + devices: *mut devstat, + numdevs: ::c_int, + matches: *mut devstat_match, + num_matches: ::c_int, + dev_selections: *mut *mut ::c_char, + num_dev_selections: ::c_int, + select_mode: devstat_select_mode, + maxshowdevs: ::c_int, + perf_select: ::c_int, + ) -> ::c_int; + pub fn devstat_buildmatch( + match_str: *mut ::c_char, + matches: *mut *mut devstat_match, + num_matches: *mut ::c_int, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(freebsd14)] { + mod freebsd14; + pub use self::freebsd14::*; + } else if #[cfg(freebsd13)] { + mod freebsd13; + pub use self::freebsd13::*; + } else if #[cfg(freebsd12)] { + mod freebsd12; + pub use self::freebsd12::*; + } else if #[cfg(any(freebsd10, freebsd11))] { + mod freebsd11; + pub use self::freebsd11::*; + } else { + // Unknown freebsd version + } +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "powerpc64")] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(target_arch = "riscv64")] { + mod riscv64; + pub use self::riscv64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc.rs new file mode 100644 index 0000000..a0120c3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc.rs @@ -0,0 +1,47 @@ +pub type c_char = u8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type wchar_t = i32; +pub type time_t = i64; +pub type suseconds_t = i32; +pub type register_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u32, + pub st_lspare: i32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} + +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 2048; // 512 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs new file mode 100644 index 0000000..7f5b975 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs @@ -0,0 +1,47 @@ +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = i32; +pub type time_t = i64; +pub type suseconds_t = i64; +pub type register_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u32, + pub st_lspare: i32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 2048; // 512 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs new file mode 100644 index 0000000..f9fa1c2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/riscv64.rs @@ -0,0 +1,154 @@ +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = ::c_int; +pub type time_t = i64; +pub type suseconds_t = ::c_long; +pub type register_t = i64; + +s_no_extra_traits! { + pub struct gpregs { + pub gp_ra: ::register_t, + pub gp_sp: ::register_t, + pub gp_gp: ::register_t, + pub gp_tp: ::register_t, + pub gp_t: [::register_t; 7], + pub gp_s: [::register_t; 12], + pub gp_a: [::register_t; 8], + pub gp_sepc: ::register_t, + pub gp_sstatus: ::register_t, + } + + pub struct fpregs { + pub fp_x: [[::register_t; 2]; 32], + pub fp_fcsr: ::register_t, + pub fp_flags: ::c_int, + pub fp_pad: ::c_int, + } + + pub struct mcontext_t { + pub mc_gpregs: gpregs, + pub mc_fpregs: fpregs, + pub mc_flags: ::c_int, + pub mc_pad: ::c_int, + pub mc_spare: [u64; 8], + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_longlong>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for gpregs { + fn eq(&self, other: &gpregs) -> bool { + self.gp_ra == other.gp_ra && + self.gp_sp == other.gp_sp && + self.gp_gp == other.gp_gp && + self.gp_tp == other.gp_tp && + self.gp_t.iter().zip(other.gp_t.iter()).all(|(a, b)| a == b) && + self.gp_s.iter().zip(other.gp_s.iter()).all(|(a, b)| a == b) && + self.gp_a.iter().zip(other.gp_a.iter()).all(|(a, b)| a == b) && + self.gp_sepc == other.gp_sepc && + self.gp_sstatus == other.gp_sstatus + } + } + impl Eq for gpregs {} + impl ::fmt::Debug for gpregs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("gpregs") + .field("gp_ra", &self.gp_ra) + .field("gp_sp", &self.gp_sp) + .field("gp_gp", &self.gp_gp) + .field("gp_tp", &self.gp_tp) + .field("gp_t", &self.gp_t) + .field("gp_s", &self.gp_s) + .field("gp_a", &self.gp_a) + .field("gp_sepc", &self.gp_sepc) + .field("gp_sstatus", &self.gp_sstatus) + .finish() + } + } + impl ::hash::Hash for gpregs { + fn hash(&self, state: &mut H) { + self.gp_ra.hash(state); + self.gp_sp.hash(state); + self.gp_gp.hash(state); + self.gp_tp.hash(state); + self.gp_t.hash(state); + self.gp_s.hash(state); + self.gp_a.hash(state); + self.gp_sepc.hash(state); + self.gp_sstatus.hash(state); + } + } + impl PartialEq for fpregs { + fn eq(&self, other: &fpregs) -> bool { + self.fp_x == other.fp_x && + self.fp_fcsr == other.fp_fcsr && + self.fp_flags == other.fp_flags && + self.fp_pad == other.fp_pad + } + } + impl Eq for fpregs {} + impl ::fmt::Debug for fpregs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpregs") + .field("fp_x", &self.fp_x) + .field("fp_fcsr", &self.fp_fcsr) + .field("fp_flags", &self.fp_flags) + .field("fp_pad", &self.fp_pad) + .finish() + } + } + impl ::hash::Hash for fpregs { + fn hash(&self, state: &mut H) { + self.fp_x.hash(state); + self.fp_fcsr.hash(state); + self.fp_flags.hash(state); + self.fp_pad.hash(state); + } + } + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.mc_gpregs == other.mc_gpregs && + self.mc_fpregs == other.mc_fpregs && + self.mc_flags == other.mc_flags && + self.mc_pad == other.mc_pad && + self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b) + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("mc_gpregs", &self.mc_gpregs) + .field("mc_fpregs", &self.mc_fpregs) + .field("mc_flags", &self.mc_flags) + .field("mc_pad", &self.mc_pad) + .field("mc_spare", &self.mc_spare) + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.mc_gpregs.hash(state); + self.mc_fpregs.hash(state); + self.mc_flags.hash(state); + self.mc_pad.hash(state); + self.mc_spare.hash(state); + } + } + } +} + +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86.rs new file mode 100644 index 0000000..4046ec3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86.rs @@ -0,0 +1,201 @@ +pub type c_char = i8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type wchar_t = i32; +pub type time_t = i32; +pub type suseconds_t = i32; +pub type register_t = i32; + +s_no_extra_traits! { + pub struct mcontext_t { + pub mc_onstack: register_t, + pub mc_gs: register_t, + pub mc_fs: register_t, + pub mc_es: register_t, + pub mc_ds: register_t, + pub mc_edi: register_t, + pub mc_esi: register_t, + pub mc_ebp: register_t, + pub mc_isp: register_t, + pub mc_ebx: register_t, + pub mc_edx: register_t, + pub mc_ecx: register_t, + pub mc_eax: register_t, + pub mc_trapno: register_t, + pub mc_err: register_t, + pub mc_eip: register_t, + pub mc_cs: register_t, + pub mc_eflags: register_t, + pub mc_esp: register_t, + pub mc_ss: register_t, + pub mc_len: ::c_int, + pub mc_fpformat: ::c_int, + pub mc_ownedfp: ::c_int, + pub mc_flags: register_t, + pub mc_fpstate: [[::c_int; 32]; 4], + pub mc_fsbase: register_t, + pub mc_gsbase: register_t, + pub mc_xfpustate: register_t, + pub mc_xfpustate_len: register_t, + pub mc_spare2: [::c_int; 4], + } +} + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: ::fflags_t, + pub st_gen: u32, + pub st_lspare: i32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + __unused: [u8; 8], + } + + pub struct ucontext_t { + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: ::mcontext_t, + pub uc_link: *mut ::ucontext_t, + pub uc_stack: ::stack_t, + pub uc_flags: ::c_int, + __spare__: [::c_int; 4], + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.mc_onstack == other.mc_onstack && + self.mc_gs == other.mc_gs && + self.mc_fs == other.mc_fs && + self.mc_es == other.mc_es && + self.mc_ds == other.mc_ds && + self.mc_edi == other.mc_edi && + self.mc_esi == other.mc_esi && + self.mc_ebp == other.mc_ebp && + self.mc_isp == other.mc_isp && + self.mc_ebx == other.mc_ebx && + self.mc_edx == other.mc_edx && + self.mc_ecx == other.mc_ecx && + self.mc_eax == other.mc_eax && + self.mc_trapno == other.mc_trapno && + self.mc_err == other.mc_err && + self.mc_eip == other.mc_eip && + self.mc_cs == other.mc_cs && + self.mc_eflags == other.mc_eflags && + self.mc_esp == other.mc_esp && + self.mc_ss == other.mc_ss && + self.mc_len == other.mc_len && + self.mc_fpformat == other.mc_fpformat && + self.mc_ownedfp == other.mc_ownedfp && + self.mc_flags == other.mc_flags && + self.mc_fpstate.iter().zip(other.mc_fpstate.iter()).all(|(a, b)| a == b) && + self.mc_fsbase == other.mc_fsbase && + self.mc_gsbase == other.mc_gsbase && + self.mc_xfpustate == other.mc_xfpustate && + self.mc_xfpustate_len == other.mc_xfpustate_len && + self.mc_spare2.iter().zip(other.mc_spare2.iter()).all(|(a, b)| a == b) + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("mc_onstack", &self.mc_onstack) + .field("mc_gs", &self.mc_gs) + .field("mc_fs", &self.mc_fs) + .field("mc_es", &self.mc_es) + .field("mc_ds", &self.mc_ds) + .field("mc_edi", &self.mc_edi) + .field("mc_esi", &self.mc_esi) + .field("mc_ebp", &self.mc_ebp) + .field("mc_isp", &self.mc_isp) + .field("mc_ebx", &self.mc_ebx) + .field("mc_edx", &self.mc_edx) + .field("mc_ecx", &self.mc_ecx) + .field("mc_eax", &self.mc_eax) + .field("mc_trapno", &self.mc_trapno) + .field("mc_err", &self.mc_err) + .field("mc_eip", &self.mc_eip) + .field("mc_cs", &self.mc_cs) + .field("mc_eflags", &self.mc_eflags) + .field("mc_esp", &self.mc_esp) + .field("mc_ss", &self.mc_ss) + .field("mc_len", &self.mc_len) + .field("mc_fpformat", &self.mc_fpformat) + .field("mc_ownedfp", &self.mc_ownedfp) + .field("mc_flags", &self.mc_flags) + .field("mc_fpstate", &self.mc_fpstate) + .field("mc_fsbase", &self.mc_fsbase) + .field("mc_gsbase", &self.mc_gsbase) + .field("mc_xfpustate", &self.mc_xfpustate) + .field("mc_xfpustate_len", &self.mc_xfpustate_len) + .field("mc_spare2", &self.mc_spare2) + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.mc_onstack.hash(state); + self.mc_gs.hash(state); + self.mc_fs.hash(state); + self.mc_es.hash(state); + self.mc_ds.hash(state); + self.mc_edi.hash(state); + self.mc_esi.hash(state); + self.mc_ebp.hash(state); + self.mc_isp.hash(state); + self.mc_ebx.hash(state); + self.mc_edx.hash(state); + self.mc_ecx.hash(state); + self.mc_eax.hash(state); + self.mc_trapno.hash(state); + self.mc_err.hash(state); + self.mc_eip.hash(state); + self.mc_cs.hash(state); + self.mc_eflags.hash(state); + self.mc_esp.hash(state); + self.mc_ss.hash(state); + self.mc_len.hash(state); + self.mc_fpformat.hash(state); + self.mc_ownedfp.hash(state); + self.mc_flags.hash(state); + self.mc_fpstate.hash(state); + self.mc_fsbase.hash(state); + self.mc_gsbase.hash(state); + self.mc_xfpustate.hash(state); + self.mc_xfpustate_len.hash(state); + self.mc_spare2.hash(state); + } + } + } +} + +pub const MINSIGSTKSZ: ::size_t = 2048; // 512 * 4 diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs new file mode 100644 index 0000000..3a016a0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs @@ -0,0 +1,197 @@ +use {c_long, register_t}; + +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } + + #[repr(align(16))] + pub struct mcontext_t { + pub mc_onstack: register_t, + pub mc_rdi: register_t, + pub mc_rsi: register_t, + pub mc_rdx: register_t, + pub mc_rcx: register_t, + pub mc_r8: register_t, + pub mc_r9: register_t, + pub mc_rax: register_t, + pub mc_rbx: register_t, + pub mc_rbp: register_t, + pub mc_r10: register_t, + pub mc_r11: register_t, + pub mc_r12: register_t, + pub mc_r13: register_t, + pub mc_r14: register_t, + pub mc_r15: register_t, + pub mc_trapno: u32, + pub mc_fs: u16, + pub mc_gs: u16, + pub mc_addr: register_t, + pub mc_flags: u32, + pub mc_es: u16, + pub mc_ds: u16, + pub mc_err: register_t, + pub mc_rip: register_t, + pub mc_cs: register_t, + pub mc_rflags: register_t, + pub mc_rsp: register_t, + pub mc_ss: register_t, + pub mc_len: c_long, + pub mc_fpformat: c_long, + pub mc_ownedfp: c_long, + pub mc_fpstate: [c_long; 64], + pub mc_fsbase: register_t, + pub mc_gsbase: register_t, + pub mc_xfpustate: register_t, + pub mc_xfpustate_len: register_t, + pub mc_spare: [c_long; 4], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.mc_onstack == other.mc_onstack && + self.mc_rdi == other.mc_rdi && + self.mc_rsi == other.mc_rsi && + self.mc_rdx == other.mc_rdx && + self.mc_rcx == other.mc_rcx && + self.mc_r8 == other.mc_r8 && + self.mc_r9 == other.mc_r9 && + self.mc_rax == other.mc_rax && + self.mc_rbx == other.mc_rbx && + self.mc_rbp == other.mc_rbp && + self.mc_r10 == other.mc_r10 && + self.mc_r11 == other.mc_r11 && + self.mc_r12 == other.mc_r12 && + self.mc_r13 == other.mc_r13 && + self.mc_r14 == other.mc_r14 && + self.mc_r15 == other.mc_r15 && + self.mc_trapno == other.mc_trapno && + self.mc_fs == other.mc_fs && + self.mc_gs == other.mc_gs && + self.mc_addr == other.mc_addr && + self.mc_flags == other.mc_flags && + self.mc_es == other.mc_es && + self.mc_ds == other.mc_ds && + self.mc_err == other.mc_err && + self.mc_rip == other.mc_rip && + self.mc_cs == other.mc_cs && + self.mc_rflags == other.mc_rflags && + self.mc_rsp == other.mc_rsp && + self.mc_ss == other.mc_ss && + self.mc_len == other.mc_len && + self.mc_fpformat == other.mc_fpformat && + self.mc_ownedfp == other.mc_ownedfp && + self.mc_fpstate.iter().zip(other.mc_fpstate.iter()) + .all(|(a, b)| a == b) && + self.mc_fsbase == other.mc_fsbase && + self.mc_gsbase == other.mc_gsbase && + self.mc_xfpustate == other.mc_xfpustate && + self.mc_xfpustate_len == other.mc_xfpustate_len && + self.mc_spare == other.mc_spare + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("mc_onstack", &self.mc_onstack) + .field("mc_rdi", &self.mc_rdi) + .field("mc_rsi", &self.mc_rsi) + .field("mc_rdx", &self.mc_rdx) + .field("mc_rcx", &self.mc_rcx) + .field("mc_r8", &self.mc_r8) + .field("mc_r9", &self.mc_r9) + .field("mc_rax", &self.mc_rax) + .field("mc_rbx", &self.mc_rbx) + .field("mc_rbp", &self.mc_rbp) + .field("mc_r10", &self.mc_r10) + .field("mc_r11", &self.mc_r11) + .field("mc_r12", &self.mc_r12) + .field("mc_r13", &self.mc_r13) + .field("mc_r14", &self.mc_r14) + .field("mc_r15", &self.mc_r15) + .field("mc_trapno", &self.mc_trapno) + .field("mc_fs", &self.mc_fs) + .field("mc_gs", &self.mc_gs) + .field("mc_addr", &self.mc_addr) + .field("mc_flags", &self.mc_flags) + .field("mc_es", &self.mc_es) + .field("mc_ds", &self.mc_ds) + .field("mc_err", &self.mc_err) + .field("mc_rip", &self.mc_rip) + .field("mc_cs", &self.mc_cs) + .field("mc_rflags", &self.mc_rflags) + .field("mc_rsp", &self.mc_rsp) + .field("mc_ss", &self.mc_ss) + .field("mc_len", &self.mc_len) + .field("mc_fpformat", &self.mc_fpformat) + .field("mc_ownedfp", &self.mc_ownedfp) + // FIXME: .field("mc_fpstate", &self.mc_fpstate) + .field("mc_fsbase", &self.mc_fsbase) + .field("mc_gsbase", &self.mc_gsbase) + .field("mc_xfpustate", &self.mc_xfpustate) + .field("mc_xfpustate_len", &self.mc_xfpustate_len) + .field("mc_spare", &self.mc_spare) + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.mc_onstack.hash(state); + self.mc_rdi.hash(state); + self.mc_rsi.hash(state); + self.mc_rdx.hash(state); + self.mc_rcx.hash(state); + self.mc_r8.hash(state); + self.mc_r9.hash(state); + self.mc_rax.hash(state); + self.mc_rbx.hash(state); + self.mc_rbp.hash(state); + self.mc_r10.hash(state); + self.mc_r11.hash(state); + self.mc_r12.hash(state); + self.mc_r13.hash(state); + self.mc_r14.hash(state); + self.mc_r15.hash(state); + self.mc_trapno.hash(state); + self.mc_fs.hash(state); + self.mc_gs.hash(state); + self.mc_addr.hash(state); + self.mc_flags.hash(state); + self.mc_es.hash(state); + self.mc_ds.hash(state); + self.mc_err.hash(state); + self.mc_rip.hash(state); + self.mc_cs.hash(state); + self.mc_rflags.hash(state); + self.mc_rsp.hash(state); + self.mc_ss.hash(state); + self.mc_len.hash(state); + self.mc_fpformat.hash(state); + self.mc_ownedfp.hash(state); + self.mc_fpstate.hash(state); + self.mc_fsbase.hash(state); + self.mc_gsbase.hash(state); + self.mc_xfpustate.hash(state); + self.mc_xfpustate_len.hash(state); + self.mc_spare.hash(state); + } + } + } +} + +s! { + pub struct ucontext_t { + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: ::mcontext_t, + pub uc_link: *mut ::ucontext_t, + pub uc_stack: ::stack_t, + pub uc_flags: ::c_int, + __spare__: [::c_int; 4], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs new file mode 100644 index 0000000..ae1fcf7 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs @@ -0,0 +1,334 @@ +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = i32; +pub type time_t = i64; +pub type suseconds_t = i64; +pub type register_t = i64; + +s! { + pub struct reg32 { + pub r_fs: u32, + pub r_es: u32, + pub r_ds: u32, + pub r_edi: u32, + pub r_esi: u32, + pub r_ebp: u32, + pub r_isp: u32, + pub r_ebx: u32, + pub r_edx: u32, + pub r_ecx: u32, + pub r_eax: u32, + pub r_trapno: u32, + pub r_err: u32, + pub r_eip: u32, + pub r_cs: u32, + pub r_eflags: u32, + pub r_esp: u32, + pub r_ss: u32, + pub r_gs: u32, + } + + pub struct reg { + pub r_r15: i64, + pub r_r14: i64, + pub r_r13: i64, + pub r_r12: i64, + pub r_r11: i64, + pub r_r10: i64, + pub r_r9: i64, + pub r_r8: i64, + pub r_rdi: i64, + pub r_rsi: i64, + pub r_rbp: i64, + pub r_rbx: i64, + pub r_rdx: i64, + pub r_rcx: i64, + pub r_rax: i64, + pub r_trapno: u32, + pub r_fs: u16, + pub r_gs: u16, + pub r_err: u32, + pub r_es: u16, + pub r_ds: u16, + pub r_rip: i64, + pub r_cs: i64, + pub r_rflags: i64, + pub r_rsp: i64, + pub r_ss: i64, + } +} + +s_no_extra_traits! { + pub struct fpreg32 { + pub fpr_env: [u32; 7], + pub fpr_acc: [[u8; 10]; 8], + pub fpr_ex_sw: u32, + pub fpr_pad: [u8; 64], + } + + pub struct fpreg { + pub fpr_env: [u64; 4], + pub fpr_acc: [[u8; 16]; 8], + pub fpr_xacc: [[u8; 16]; 16], + pub fpr_spare: [u64; 12], + } + + pub struct xmmreg { + pub xmm_env: [u32; 8], + pub xmm_acc: [[u8; 16]; 8], + pub xmm_reg: [[u8; 16]; 8], + pub xmm_pad: [u8; 224], + } + + #[cfg(libc_union)] + pub union __c_anonymous_elf64_auxv_union { + pub a_val: ::c_long, + pub a_ptr: *mut ::c_void, + pub a_fcn: extern "C" fn(), + } + + pub struct Elf64_Auxinfo { + pub a_type: ::c_long, + #[cfg(libc_union)] + pub a_un: __c_anonymous_elf64_auxv_union, + } + + pub struct kinfo_file { + pub kf_structsize: ::c_int, + pub kf_type: ::c_int, + pub kf_fd: ::c_int, + pub kf_ref_count: ::c_int, + pub kf_flags: ::c_int, + _kf_pad0: ::c_int, + pub kf_offset: i64, + _priv: [::uintptr_t; 38], // FIXME if needed + pub kf_status: u16, + _kf_pad1: u16, + _kf_ispare0: ::c_int, + pub kf_cap_rights: ::cap_rights_t, + _kf_cap_spare: u64, + pub kf_path: [::c_char; ::PATH_MAX as usize], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for fpreg32 { + fn eq(&self, other: &fpreg32) -> bool { + self.fpr_env == other.fpr_env && + self.fpr_acc == other.fpr_acc && + self.fpr_ex_sw == other.fpr_ex_sw && + self.fpr_pad + .iter() + .zip(other.fpr_pad.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for fpreg32 {} + impl ::fmt::Debug for fpreg32 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpreg32") + .field("fpr_env", &&self.fpr_env[..]) + .field("fpr_acc", &self.fpr_acc) + .field("fpr_ex_sw", &self.fpr_ex_sw) + .field("fpr_pad", &&self.fpr_pad[..]) + .finish() + } + } + impl ::hash::Hash for fpreg32 { + fn hash(&self, state: &mut H) { + self.fpr_env.hash(state); + self.fpr_acc.hash(state); + self.fpr_ex_sw.hash(state); + self.fpr_pad.hash(state); + } + } + + impl PartialEq for fpreg { + fn eq(&self, other: &fpreg) -> bool { + self.fpr_env == other.fpr_env && + self.fpr_acc == other.fpr_acc && + self.fpr_xacc == other.fpr_xacc && + self.fpr_spare == other.fpr_spare + } + } + impl Eq for fpreg {} + impl ::fmt::Debug for fpreg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpreg") + .field("fpr_env", &self.fpr_env) + .field("fpr_acc", &self.fpr_acc) + .field("fpr_xacc", &self.fpr_xacc) + .field("fpr_spare", &self.fpr_spare) + .finish() + } + } + impl ::hash::Hash for fpreg { + fn hash(&self, state: &mut H) { + self.fpr_env.hash(state); + self.fpr_acc.hash(state); + self.fpr_xacc.hash(state); + self.fpr_spare.hash(state); + } + } + + impl PartialEq for xmmreg { + fn eq(&self, other: &xmmreg) -> bool { + self.xmm_env == other.xmm_env && + self.xmm_acc == other.xmm_acc && + self.xmm_reg == other.xmm_reg && + self.xmm_pad + .iter() + .zip(other.xmm_pad.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for xmmreg {} + impl ::fmt::Debug for xmmreg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("xmmreg") + .field("xmm_env", &self.xmm_env) + .field("xmm_acc", &self.xmm_acc) + .field("xmm_reg", &self.xmm_reg) + .field("xmm_pad", &&self.xmm_pad[..]) + .finish() + } + } + impl ::hash::Hash for xmmreg { + fn hash(&self, state: &mut H) { + self.xmm_env.hash(state); + self.xmm_acc.hash(state); + self.xmm_reg.hash(state); + self.xmm_pad.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_elf64_auxv_union { + fn eq(&self, other: &__c_anonymous_elf64_auxv_union) -> bool { + unsafe { self.a_val == other.a_val + || self.a_ptr == other.a_ptr + || self.a_fcn == other.a_fcn } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_elf64_auxv_union {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_elf64_auxv_union { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("a_val") + .field("a_val", unsafe { &self.a_val }) + .finish() + } + } + #[cfg(not(libc_union))] + impl PartialEq for Elf64_Auxinfo { + fn eq(&self, other: &Elf64_Auxinfo) -> bool { + self.a_type == other.a_type + } + } + #[cfg(libc_union)] + impl PartialEq for Elf64_Auxinfo { + fn eq(&self, other: &Elf64_Auxinfo) -> bool { + self.a_type == other.a_type + && self.a_un == other.a_un + } + } + impl Eq for Elf64_Auxinfo {} + #[cfg(not(libc_union))] + impl ::fmt::Debug for Elf64_Auxinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("Elf64_Auxinfo") + .field("a_type", &self.a_type) + .finish() + } + } + #[cfg(libc_union)] + impl ::fmt::Debug for Elf64_Auxinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("Elf64_Auxinfo") + .field("a_type", &self.a_type) + .field("a_un", &self.a_un) + .finish() + } + } + + impl PartialEq for kinfo_file { + fn eq(&self, other: &kinfo_file) -> bool { + self.kf_structsize == other.kf_structsize && + self.kf_type == other.kf_type && + self.kf_fd == other.kf_fd && + self.kf_ref_count == other.kf_ref_count && + self.kf_flags == other.kf_flags && + self.kf_offset == other.kf_offset && + self.kf_status == other.kf_status && + self.kf_cap_rights == other.kf_cap_rights && + self.kf_path + .iter() + .zip(other.kf_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for kinfo_file {} + impl ::fmt::Debug for kinfo_file { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("kinfo_file") + .field("kf_structsize", &self.kf_structsize) + .field("kf_type", &self.kf_type) + .field("kf_fd", &self.kf_fd) + .field("kf_ref_count", &self.kf_ref_count) + .field("kf_flags", &self.kf_flags) + .field("kf_offset", &self.kf_offset) + .field("kf_status", &self.kf_status) + .field("kf_cap_rights", &self.kf_cap_rights) + .field("kf_path", &&self.kf_path[..]) + .finish() + } + } + impl ::hash::Hash for kinfo_file { + fn hash(&self, state: &mut H) { + self.kf_structsize.hash(state); + self.kf_type.hash(state); + self.kf_fd.hash(state); + self.kf_ref_count.hash(state); + self.kf_flags.hash(state); + self.kf_offset.hash(state); + self.kf_status.hash(state); + self.kf_cap_rights.hash(state); + self.kf_path.hash(state); + } + } + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} +pub const MAP_32BIT: ::c_int = 0x00080000; +pub const MINSIGSTKSZ: ::size_t = 2048; // 512 * 4 + +pub const _MC_HASSEGS: u32 = 0x1; +pub const _MC_HASBASES: u32 = 0x2; +pub const _MC_HASFPXSTATE: u32 = 0x4; +pub const _MC_FLAG_MASK: u32 = _MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE; + +pub const _MC_FPFMT_NODEV: c_long = 0x10000; +pub const _MC_FPFMT_XMM: c_long = 0x10002; +pub const _MC_FPOWNED_NONE: c_long = 0x20000; +pub const _MC_FPOWNED_FPU: c_long = 0x20001; +pub const _MC_FPOWNED_PCB: c_long = 0x20002; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/mod.rs new file mode 100644 index 0000000..fe69ca4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/freebsdlike/mod.rs @@ -0,0 +1,1896 @@ +pub type mode_t = u16; +pub type pthread_attr_t = *mut ::c_void; +pub type rlim_t = i64; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; +pub type pthread_rwlockattr_t = *mut ::c_void; +pub type pthread_key_t = ::c_int; +pub type tcflag_t = ::c_uint; +pub type speed_t = ::c_uint; +pub type nl_item = ::c_int; +pub type id_t = i64; +pub type vm_size_t = ::uintptr_t; +pub type key_t = ::c_long; + +// elf.h + +pub type Elf32_Addr = u32; +pub type Elf32_Half = u16; +pub type Elf32_Lword = u64; +pub type Elf32_Off = u32; +pub type Elf32_Sword = i32; +pub type Elf32_Word = u32; + +pub type Elf64_Addr = u64; +pub type Elf64_Half = u16; +pub type Elf64_Lword = u64; +pub type Elf64_Off = u64; +pub type Elf64_Sword = i32; +pub type Elf64_Sxword = i64; +pub type Elf64_Word = u32; +pub type Elf64_Xword = u64; + +pub type iconv_t = *mut ::c_void; + +// It's an alias over "struct __kvm_t". However, its fields aren't supposed to be used directly, +// making the type definition system dependent. Better not bind it exactly. +pub type kvm_t = ::c_void; + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + type Elf_Addr = Elf64_Addr; + type Elf_Half = Elf64_Half; + type Elf_Phdr = Elf64_Phdr; + } else if #[cfg(target_pointer_width = "32")] { + type Elf_Addr = Elf32_Addr; + type Elf_Half = Elf32_Half; + type Elf_Phdr = Elf32_Phdr; + } +} + +// link.h + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + self.si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.si_status + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ip_mreqn { + pub imr_multiaddr: in_addr, + pub imr_address: in_addr, + pub imr_ifindex: ::c_int, + } + + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_sourceaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::size_t, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct sigset_t { + bits: [u32; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + pub si_value: ::sigval, + _pad1: ::c_long, + _pad2: [::c_int; 7], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_flags: ::c_int, + pub sa_mask: sigset_t, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + #[cfg(not(target_os = "dragonfly"))] + pub l_sysid: ::c_int, + } + + pub struct sf_hdtr { + pub headers: *mut ::iovec, + pub hdr_cnt: ::c_int, + pub trailers: *mut ::iovec, + pub trl_cnt: ::c_int, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct cmsgcred { + pub cmcred_pid: ::pid_t, + pub cmcred_uid: ::uid_t, + pub cmcred_euid: ::uid_t, + pub cmcred_gid: ::gid_t, + pub cmcred_ngroups: ::c_short, + pub cmcred_groups: [::gid_t; CMGROUP_MAX], + } + + pub struct rtprio { + pub type_: ::c_ushort, + pub prio: ::c_ushort, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } + + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct timex { + pub modes: ::c_uint, + pub offset: ::c_long, + pub freq: ::c_long, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub status: ::c_int, + pub constant: ::c_long, + pub precision: ::c_long, + pub tolerance: ::c_long, + pub ppsfreq: ::c_long, + pub jitter: ::c_long, + pub shift: ::c_int, + pub stabil: ::c_long, + pub jitcnt: ::c_long, + pub calcnt: ::c_long, + pub errcnt: ::c_long, + pub stbcnt: ::c_long, + } + + pub struct ntptimeval { + pub time: ::timespec, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub tai: ::c_long, + pub time_state: ::c_int, + } + + pub struct accept_filter_arg { + pub af_name: [::c_char; 16], + af_arg: [[::c_char; 10]; 24], + } + + pub struct ptrace_io_desc { + pub piod_op: ::c_int, + pub piod_offs: *mut ::c_void, + pub piod_addr: *mut ::c_void, + pub piod_len: ::size_t, + } + + // bpf.h + + pub struct bpf_program { + pub bf_len: ::c_uint, + pub bf_insns: *mut bpf_insn, + } + + pub struct bpf_stat { + pub bs_recv: ::c_uint, + pub bs_drop: ::c_uint, + } + + pub struct bpf_version { + pub bv_major: ::c_ushort, + pub bv_minor: ::c_ushort, + } + + pub struct bpf_hdr { + pub bh_tstamp: ::timeval, + pub bh_caplen: u32, + pub bh_datalen: u32, + pub bh_hdrlen: ::c_ushort, + } + + pub struct bpf_insn { + pub code: ::c_ushort, + pub jt: ::c_uchar, + pub jf: ::c_uchar, + pub k: u32, + } + + pub struct bpf_dltlist { + bfl_len: ::c_uint, + bfl_list: *mut ::c_uint, + } + + // elf.h + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + // link.h + + pub struct dl_phdr_info { + pub dlpi_addr: Elf_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const Elf_Phdr, + pub dlpi_phnum: Elf_Half, + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + pub dlpi_tls_modid: usize, + pub dlpi_tls_data: *mut ::c_void, + } + + pub struct ipc_perm { + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_ushort, + pub key: ::key_t, + } + + pub struct eui64 { + pub octet: [u8; EUI64_LEN], + } +} + +s_no_extra_traits! { + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 112], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + && self.__ss_pad1 == other.__ss_pad1 + && self.__ss_align == other.__ss_align + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_align.hash(state); + self.__ss_pad2.hash(state); + } + } + } +} + +// Non-public helper constant +cfg_if! { + if #[cfg(all(not(libc_const_size_of), target_pointer_width = "32"))] { + const SIZEOF_LONG: usize = 4; + } else if #[cfg(all(not(libc_const_size_of), target_pointer_width = "64"))] { + const SIZEOF_LONG: usize = 8; + } else if #[cfg(libc_const_size_of)] { + const SIZEOF_LONG: usize = ::mem::size_of::<::c_long>(); + } +} + +#[deprecated( + since = "0.2.64", + note = "Can vary at runtime. Use sysconf(3) instead" +)] +pub const AIO_LISTIO_MAX: ::c_int = 16; +pub const AIO_CANCELED: ::c_int = 1; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const AIO_ALLDONE: ::c_int = 3; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_READ: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 1; +pub const LIO_NOWAIT: ::c_int = 0; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; +pub const SIGEV_KEVENT: ::c_int = 3; + +pub const CODESET: ::nl_item = 0; +pub const D_T_FMT: ::nl_item = 1; +pub const D_FMT: ::nl_item = 2; +pub const T_FMT: ::nl_item = 3; +pub const T_FMT_AMPM: ::nl_item = 4; +pub const AM_STR: ::nl_item = 5; +pub const PM_STR: ::nl_item = 6; + +pub const DAY_1: ::nl_item = 7; +pub const DAY_2: ::nl_item = 8; +pub const DAY_3: ::nl_item = 9; +pub const DAY_4: ::nl_item = 10; +pub const DAY_5: ::nl_item = 11; +pub const DAY_6: ::nl_item = 12; +pub const DAY_7: ::nl_item = 13; + +pub const ABDAY_1: ::nl_item = 14; +pub const ABDAY_2: ::nl_item = 15; +pub const ABDAY_3: ::nl_item = 16; +pub const ABDAY_4: ::nl_item = 17; +pub const ABDAY_5: ::nl_item = 18; +pub const ABDAY_6: ::nl_item = 19; +pub const ABDAY_7: ::nl_item = 20; + +pub const MON_1: ::nl_item = 21; +pub const MON_2: ::nl_item = 22; +pub const MON_3: ::nl_item = 23; +pub const MON_4: ::nl_item = 24; +pub const MON_5: ::nl_item = 25; +pub const MON_6: ::nl_item = 26; +pub const MON_7: ::nl_item = 27; +pub const MON_8: ::nl_item = 28; +pub const MON_9: ::nl_item = 29; +pub const MON_10: ::nl_item = 30; +pub const MON_11: ::nl_item = 31; +pub const MON_12: ::nl_item = 32; + +pub const ABMON_1: ::nl_item = 33; +pub const ABMON_2: ::nl_item = 34; +pub const ABMON_3: ::nl_item = 35; +pub const ABMON_4: ::nl_item = 36; +pub const ABMON_5: ::nl_item = 37; +pub const ABMON_6: ::nl_item = 38; +pub const ABMON_7: ::nl_item = 39; +pub const ABMON_8: ::nl_item = 40; +pub const ABMON_9: ::nl_item = 41; +pub const ABMON_10: ::nl_item = 42; +pub const ABMON_11: ::nl_item = 43; +pub const ABMON_12: ::nl_item = 44; + +pub const ERA: ::nl_item = 45; +pub const ERA_D_FMT: ::nl_item = 46; +pub const ERA_D_T_FMT: ::nl_item = 47; +pub const ERA_T_FMT: ::nl_item = 48; +pub const ALT_DIGITS: ::nl_item = 49; + +pub const RADIXCHAR: ::nl_item = 50; +pub const THOUSEP: ::nl_item = 51; + +pub const YESEXPR: ::nl_item = 52; +pub const NOEXPR: ::nl_item = 53; + +pub const YESSTR: ::nl_item = 54; +pub const NOSTR: ::nl_item = 55; + +pub const CRNCYSTR: ::nl_item = 56; + +pub const D_MD_ORDER: ::nl_item = 57; + +pub const ALTMON_1: ::nl_item = 58; +pub const ALTMON_2: ::nl_item = 59; +pub const ALTMON_3: ::nl_item = 60; +pub const ALTMON_4: ::nl_item = 61; +pub const ALTMON_5: ::nl_item = 62; +pub const ALTMON_6: ::nl_item = 63; +pub const ALTMON_7: ::nl_item = 64; +pub const ALTMON_8: ::nl_item = 65; +pub const ALTMON_9: ::nl_item = 66; +pub const ALTMON_10: ::nl_item = 67; +pub const ALTMON_11: ::nl_item = 68; +pub const ALTMON_12: ::nl_item = 69; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 308915776; + +pub const O_NOCTTY: ::c_int = 32768; +pub const O_DIRECT: ::c_int = 0x00010000; + +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_DUPFD_CLOEXEC: ::c_int = 17; +pub const F_DUP2FD: ::c_int = 10; +pub const F_DUP2FD_CLOEXEC: ::c_int = 18; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_ANON: ::c_int = 0x1000; +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MNT_EXPUBLIC: ::c_int = 0x20000000; +pub const MNT_NOATIME: ::c_int = 0x10000000; +pub const MNT_NOCLUSTERR: ::c_int = 0x40000000; +pub const MNT_NOCLUSTERW: ::c_int = 0x80000000; +pub const MNT_NOSYMFOLLOW: ::c_int = 0x00400000; +pub const MNT_SOFTDEP: ::c_int = 0x00200000; +pub const MNT_SUIDDIR: ::c_int = 0x00100000; +pub const MNT_EXRDONLY: ::c_int = 0x00000080; +pub const MNT_DEFEXPORTED: ::c_int = 0x00000200; +pub const MNT_EXPORTANON: ::c_int = 0x00000400; +pub const MNT_EXKERB: ::c_int = 0x00000800; +pub const MNT_DELEXPORT: ::c_int = 0x00020000; + +pub const MS_SYNC: ::c_int = 0x0000; +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EDEADLK: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EAGAIN: ::c_int = 35; +pub const EWOULDBLOCK: ::c_int = 35; +pub const EINPROGRESS: ::c_int = 36; +pub const EALREADY: ::c_int = 37; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ELOOP: ::c_int = 62; +pub const ENAMETOOLONG: ::c_int = 63; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const ENOTEMPTY: ::c_int = 66; +pub const EPROCLIM: ::c_int = 67; +pub const EUSERS: ::c_int = 68; +pub const EDQUOT: ::c_int = 69; +pub const ESTALE: ::c_int = 70; +pub const EREMOTE: ::c_int = 71; +pub const EBADRPC: ::c_int = 72; +pub const ERPCMISMATCH: ::c_int = 73; +pub const EPROGUNAVAIL: ::c_int = 74; +pub const EPROGMISMATCH: ::c_int = 75; +pub const EPROCUNAVAIL: ::c_int = 76; +pub const ENOLCK: ::c_int = 77; +pub const ENOSYS: ::c_int = 78; +pub const EFTYPE: ::c_int = 79; +pub const EAUTH: ::c_int = 80; +pub const ENEEDAUTH: ::c_int = 81; +pub const EIDRM: ::c_int = 82; +pub const ENOMSG: ::c_int = 83; +pub const EOVERFLOW: ::c_int = 84; +pub const ECANCELED: ::c_int = 85; +pub const EILSEQ: ::c_int = 86; +pub const ENOATTR: ::c_int = 87; +pub const EDOOFUS: ::c_int = 88; +pub const EBADMSG: ::c_int = 89; +pub const EMULTIHOP: ::c_int = 90; +pub const ENOLINK: ::c_int = 91; +pub const EPROTO: ::c_int = 92; + +pub const POLLSTANDARD: ::c_short = ::POLLIN + | ::POLLPRI + | ::POLLOUT + | ::POLLRDNORM + | ::POLLRDBAND + | ::POLLWRBAND + | ::POLLERR + | ::POLLHUP + | ::POLLNVAL; + +pub const AI_PASSIVE: ::c_int = 0x00000001; +pub const AI_CANONNAME: ::c_int = 0x00000002; +pub const AI_NUMERICHOST: ::c_int = 0x00000004; +pub const AI_NUMERICSERV: ::c_int = 0x00000008; +pub const AI_ALL: ::c_int = 0x00000100; +pub const AI_ADDRCONFIG: ::c_int = 0x00000400; +pub const AI_V4MAPPED: ::c_int = 0x00000800; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND: ::c_int = 0x0001; +pub const GLOB_DOOFFS: ::c_int = 0x0002; +pub const GLOB_ERR: ::c_int = 0x0004; +pub const GLOB_MARK: ::c_int = 0x0008; +pub const GLOB_NOCHECK: ::c_int = 0x0010; +pub const GLOB_NOSORT: ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x2000; + +pub const GLOB_NOSPACE: ::c_int = -1; +pub const GLOB_ABORTED: ::c_int = -2; +pub const GLOB_NOMATCH: ::c_int = -3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; +pub const RLIMIT_SBSIZE: ::c_int = 9; +pub const RLIMIT_VMEM: ::c_int = 10; +pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_VIRTUAL: ::clockid_t = 1; +pub const CLOCK_PROF: ::clockid_t = 2; +pub const CLOCK_MONOTONIC: ::clockid_t = 4; +pub const CLOCK_UPTIME: ::clockid_t = 5; +pub const CLOCK_BOOTTIME: ::clockid_t = CLOCK_UPTIME; +pub const CLOCK_UPTIME_PRECISE: ::clockid_t = 7; +pub const CLOCK_UPTIME_FAST: ::clockid_t = 8; +pub const CLOCK_REALTIME_PRECISE: ::clockid_t = 9; +pub const CLOCK_REALTIME_FAST: ::clockid_t = 10; +pub const CLOCK_REALTIME_COARSE: ::clockid_t = CLOCK_REALTIME_FAST; +pub const CLOCK_MONOTONIC_PRECISE: ::clockid_t = 11; +pub const CLOCK_MONOTONIC_FAST: ::clockid_t = 12; +pub const CLOCK_MONOTONIC_COARSE: ::clockid_t = CLOCK_MONOTONIC_FAST; +pub const CLOCK_SECOND: ::clockid_t = 13; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 14; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 15; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; +pub const MADV_NOSYNC: ::c_int = 6; +pub const MADV_AUTOSYNC: ::c_int = 7; +pub const MADV_NOCORE: ::c_int = 8; +pub const MADV_CORE: ::c_int = 9; + +pub const MINCORE_INCORE: ::c_int = 0x1; +pub const MINCORE_REFERENCED: ::c_int = 0x2; +pub const MINCORE_MODIFIED: ::c_int = 0x4; +pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8; +pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NETBIOS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_SIP: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_ISDN: ::c_int = 26; +pub const AF_E164: ::c_int = AF_ISDN; +pub const pseudo_AF_KEY: ::c_int = 27; +pub const AF_INET6: ::c_int = 28; +pub const AF_NATM: ::c_int = 29; +pub const AF_ATM: ::c_int = 30; +pub const pseudo_AF_HDRCMPLT: ::c_int = 31; +pub const AF_NETGRAPH: ::c_int = 32; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NETBIOS: ::c_int = AF_NETBIOS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_NATM: ::c_int = AF_NATM; +pub const PF_ATM: ::c_int = AF_ATM; +pub const PF_NETGRAPH: ::c_int = AF_NETGRAPH; + +pub const PIOD_READ_D: ::c_int = 1; +pub const PIOD_WRITE_D: ::c_int = 2; +pub const PIOD_READ_I: ::c_int = 3; +pub const PIOD_WRITE_I: ::c_int = 4; + +pub const PT_TRACE_ME: ::c_int = 0; +pub const PT_READ_I: ::c_int = 1; +pub const PT_READ_D: ::c_int = 2; +pub const PT_WRITE_I: ::c_int = 4; +pub const PT_WRITE_D: ::c_int = 5; +pub const PT_CONTINUE: ::c_int = 7; +pub const PT_KILL: ::c_int = 8; +pub const PT_STEP: ::c_int = 9; +pub const PT_ATTACH: ::c_int = 10; +pub const PT_DETACH: ::c_int = 11; +pub const PT_IO: ::c_int = 12; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 0x00000001; +pub const MSG_PEEK: ::c_int = 0x00000002; +pub const MSG_DONTROUTE: ::c_int = 0x00000004; +pub const MSG_EOR: ::c_int = 0x00000008; +pub const MSG_TRUNC: ::c_int = 0x00000010; +pub const MSG_CTRUNC: ::c_int = 0x00000020; +pub const MSG_WAITALL: ::c_int = 0x00000040; +pub const MSG_DONTWAIT: ::c_int = 0x00000080; +pub const MSG_EOF: ::c_int = 0x00000100; + +pub const SCM_TIMESTAMP: ::c_int = 0x02; +pub const SCM_CREDS: ::c_int = 0x03; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_CLOEXEC: ::c_int = 0x10000000; +pub const SOCK_NONBLOCK: ::c_int = 0x20000000; +pub const SOCK_MAXADDRLEN: ::c_int = 255; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_SENDSRCADDR: ::c_int = IP_RECVDSTADDR; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IP_RECVIF: ::c_int = 20; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_CHECKSUM: ::c_int = 26; +pub const IPV6_RECVPKTINFO: ::c_int = 36; +pub const IPV6_PKTINFO: ::c_int = 46; +pub const IPV6_HOPLIMIT: ::c_int = 47; +pub const IPV6_RECVTCLASS: ::c_int = 57; +pub const IPV6_TCLASS: ::c_int = 61; +pub const IPV6_DONTFRAG: ::c_int = 62; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 70; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 71; +pub const IP_BLOCK_SOURCE: ::c_int = 72; +pub const IP_UNBLOCK_SOURCE: ::c_int = 73; + +pub const TCP_NOPUSH: ::c_int = 4; +pub const TCP_NOOPT: ::c_int = 8; +pub const TCP_KEEPIDLE: ::c_int = 256; +pub const TCP_KEEPINTVL: ::c_int = 512; +pub const TCP_KEEPCNT: ::c_int = 1024; + +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_NOSIGPIPE: ::c_int = 0x0800; +pub const SO_ACCEPTFILTER: ::c_int = 0x1000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; + +pub const LOCAL_PEERCRED: ::c_int = 1; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const MAP_COPY: ::c_int = 0x0002; +#[doc(hidden)] +#[deprecated( + since = "0.2.54", + note = "Removed in FreeBSD 11, unused in DragonFlyBSD" +)] +pub const MAP_RENAME: ::c_int = 0x0020; +#[doc(hidden)] +#[deprecated( + since = "0.2.54", + note = "Removed in FreeBSD 11, unused in DragonFlyBSD" +)] +pub const MAP_NORESERVE: ::c_int = 0x0040; +pub const MAP_HASSEMAPHORE: ::c_int = 0x0200; +pub const MAP_STACK: ::c_int = 0x0400; +pub const MAP_NOSYNC: ::c_int = 0x0800; +pub const MAP_NOCORE: ::c_int = 0x020000; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; +pub const _PC_NO_TRUNC: ::c_int = 8; +pub const _PC_VDISABLE: ::c_int = 9; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 10; +pub const _PC_FILESIZEBITS: ::c_int = 12; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_SYMLINK_MAX: ::c_int = 18; +pub const _PC_MIN_HOLE_SIZE: ::c_int = 21; +pub const _PC_ASYNC_IO: ::c_int = 53; +pub const _PC_PRIO_IO: ::c_int = 54; +pub const _PC_SYNC_IO: ::c_int = 55; +pub const _PC_ACL_EXTENDED: ::c_int = 59; +pub const _PC_ACL_PATH_MAX: ::c_int = 60; +pub const _PC_CAP_PRESENT: ::c_int = 61; +pub const _PC_INF_PRESENT: ::c_int = 62; +pub const _PC_MAC_PRESENT: ::c_int = 63; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_BC_BASE_MAX: ::c_int = 9; +pub const _SC_BC_DIM_MAX: ::c_int = 10; +pub const _SC_BC_SCALE_MAX: ::c_int = 11; +pub const _SC_BC_STRING_MAX: ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; +pub const _SC_EXPR_NEST_MAX: ::c_int = 14; +pub const _SC_LINE_MAX: ::c_int = 15; +pub const _SC_RE_DUP_MAX: ::c_int = 16; +pub const _SC_2_VERSION: ::c_int = 17; +pub const _SC_2_C_BIND: ::c_int = 18; +pub const _SC_2_C_DEV: ::c_int = 19; +pub const _SC_2_CHAR_TERM: ::c_int = 20; +pub const _SC_2_FORT_DEV: ::c_int = 21; +pub const _SC_2_FORT_RUN: ::c_int = 22; +pub const _SC_2_LOCALEDEF: ::c_int = 23; +pub const _SC_2_SW_DEV: ::c_int = 24; +pub const _SC_2_UPE: ::c_int = 25; +pub const _SC_STREAM_MAX: ::c_int = 26; +pub const _SC_TZNAME_MAX: ::c_int = 27; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28; +pub const _SC_MAPPED_FILES: ::c_int = 29; +pub const _SC_MEMLOCK: ::c_int = 30; +pub const _SC_MEMLOCK_RANGE: ::c_int = 31; +pub const _SC_MEMORY_PROTECTION: ::c_int = 32; +pub const _SC_MESSAGE_PASSING: ::c_int = 33; +pub const _SC_PRIORITIZED_IO: ::c_int = 34; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35; +pub const _SC_REALTIME_SIGNALS: ::c_int = 36; +pub const _SC_SEMAPHORES: ::c_int = 37; +pub const _SC_FSYNC: ::c_int = 38; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 40; +pub const _SC_TIMERS: ::c_int = 41; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; +pub const _SC_AIO_MAX: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; +pub const _SC_DELAYTIMER_MAX: ::c_int = 45; +pub const _SC_MQ_OPEN_MAX: ::c_int = 46; +pub const _SC_PAGESIZE: ::c_int = 47; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 48; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 49; +pub const _SC_SEM_VALUE_MAX: ::c_int = 50; +pub const _SC_SIGQUEUE_MAX: ::c_int = 51; +pub const _SC_TIMER_MAX: ::c_int = 52; +pub const _SC_IOV_MAX: ::c_int = 56; +pub const _SC_NPROCESSORS_CONF: ::c_int = 57; +pub const _SC_2_PBS: ::c_int = 59; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 60; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 61; +pub const _SC_2_PBS_LOCATE: ::c_int = 62; +pub const _SC_2_PBS_MESSAGE: ::c_int = 63; +pub const _SC_2_PBS_TRACK: ::c_int = 64; +pub const _SC_ADVISORY_INFO: ::c_int = 65; +pub const _SC_BARRIERS: ::c_int = 66; +pub const _SC_CLOCK_SELECTION: ::c_int = 67; +pub const _SC_CPUTIME: ::c_int = 68; +pub const _SC_FILE_LOCKING: ::c_int = 69; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 58; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71; +pub const _SC_HOST_NAME_MAX: ::c_int = 72; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 74; +pub const _SC_MQ_PRIO_MAX: ::c_int = 75; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 76; +pub const _SC_REGEXP: ::c_int = 77; +pub const _SC_SHELL: ::c_int = 78; +pub const _SC_SPAWN: ::c_int = 79; +pub const _SC_SPIN_LOCKS: ::c_int = 80; +pub const _SC_SPORADIC_SERVER: ::c_int = 81; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 86; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 92; +pub const _SC_THREAD_STACK_MIN: ::c_int = 93; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 94; +pub const _SC_TIMEOUTS: ::c_int = 95; +pub const _SC_THREADS: ::c_int = 96; +pub const _SC_TRACE: ::c_int = 97; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 98; +pub const _SC_TRACE_INHERIT: ::c_int = 99; +pub const _SC_TRACE_LOG: ::c_int = 100; +pub const _SC_TTY_NAME_MAX: ::c_int = 101; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 102; +pub const _SC_V6_ILP32_OFF32: ::c_int = 103; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 104; +pub const _SC_V6_LP64_OFF64: ::c_int = 105; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 106; +pub const _SC_ATEXIT_MAX: ::c_int = 107; +pub const _SC_XOPEN_CRYPT: ::c_int = 108; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 109; +pub const _SC_XOPEN_LEGACY: ::c_int = 110; +pub const _SC_XOPEN_REALTIME: ::c_int = 111; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112; +pub const _SC_XOPEN_SHM: ::c_int = 113; +pub const _SC_XOPEN_STREAMS: ::c_int = 114; +pub const _SC_XOPEN_UNIX: ::c_int = 115; +pub const _SC_XOPEN_VERSION: ::c_int = 116; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 117; +pub const _SC_IPV6: ::c_int = 118; +pub const _SC_RAW_SOCKETS: ::c_int = 119; +pub const _SC_SYMLOOP_MAX: ::c_int = 120; +pub const _SC_PHYS_PAGES: ::c_int = 121; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_ERRORCHECK; + +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_OTHER: ::c_int = 2; +pub const SCHED_RR: ::c_int = 3; + +pub const FD_SETSIZE: usize = 1024; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const NI_MAXHOST: ::size_t = 1025; + +pub const XUCRED_VERSION: ::c_uint = 0; + +pub const RTLD_LOCAL: ::c_int = 0; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOLOAD: ::c_int = 0x2000; +pub const RTLD_GLOBAL: ::c_int = 0x100; + +pub const LOG_NTP: ::c_int = 12 << 3; +pub const LOG_SECURITY: ::c_int = 13 << 3; +pub const LOG_CONSOLE: ::c_int = 14 << 3; +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const TIOCEXCL: ::c_ulong = 0x2000740d; +pub const TIOCNXCL: ::c_ulong = 0x2000740e; +pub const TIOCFLUSH: ::c_ulong = 0x80047410; +pub const TIOCGETA: ::c_ulong = 0x402c7413; +pub const TIOCSETA: ::c_ulong = 0x802c7414; +pub const TIOCSETAW: ::c_ulong = 0x802c7415; +pub const TIOCSETAF: ::c_ulong = 0x802c7416; +pub const TIOCGETD: ::c_ulong = 0x4004741a; +pub const TIOCSETD: ::c_ulong = 0x8004741b; +pub const TIOCGDRAINWAIT: ::c_ulong = 0x40047456; +pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457; +pub const TIOCTIMESTAMP: ::c_ulong = 0x40107459; +pub const TIOCMGDTRWAIT: ::c_ulong = 0x4004745a; +pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b; +pub const TIOCDRAIN: ::c_ulong = 0x2000745e; +pub const TIOCEXT: ::c_ulong = 0x80047460; +pub const TIOCSCTTY: ::c_ulong = 0x20007461; +pub const TIOCCONS: ::c_ulong = 0x80047462; +pub const TIOCGSID: ::c_ulong = 0x40047463; +pub const TIOCSTAT: ::c_ulong = 0x20007465; +pub const TIOCUCNTL: ::c_ulong = 0x80047466; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCM_LE: ::c_int = 0x1; +pub const TIOCM_DTR: ::c_int = 0x2; +pub const TIOCM_RTS: ::c_int = 0x4; +pub const TIOCM_ST: ::c_int = 0x8; +pub const TIOCM_SR: ::c_int = 0x10; +pub const TIOCM_CTS: ::c_int = 0x20; +pub const TIOCM_RI: ::c_int = 0x80; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = 0x40; +pub const TIOCM_CAR: ::c_int = 0x40; +pub const TIOCM_RNG: ::c_int = 0x80; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCSTART: ::c_ulong = 0x2000746e; +pub const TIOCSTOP: ::c_ulong = 0x2000746f; +pub const TIOCPKT: ::c_ulong = 0x80047470; +pub const TIOCPKT_DATA: ::c_int = 0x0; +pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2; +pub const TIOCPKT_STOP: ::c_int = 0x4; +pub const TIOCPKT_START: ::c_int = 0x8; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_IOCTL: ::c_int = 0x40; +pub const TIOCNOTTY: ::c_ulong = 0x20007471; +pub const TIOCSTI: ::c_ulong = 0x80017472; +pub const TIOCOUTQ: ::c_ulong = 0x40047473; +pub const TIOCSPGRP: ::c_ulong = 0x80047476; +pub const TIOCGPGRP: ::c_ulong = 0x40047477; +pub const TIOCCDTR: ::c_ulong = 0x20007478; +pub const TIOCSDTR: ::c_ulong = 0x20007479; +pub const TTYDISC: ::c_int = 0x0; +pub const SLIPDISC: ::c_int = 0x4; +pub const PPPDISC: ::c_int = 0x5; +pub const NETGRAPHDISC: ::c_int = 0x6; + +pub const BIOCGRSIG: ::c_ulong = 0x40044272; +pub const BIOCSRSIG: ::c_ulong = 0x80044273; +pub const BIOCSDLT: ::c_ulong = 0x80044278; +pub const BIOCGSEESENT: ::c_ulong = 0x40044276; +pub const BIOCSSEESENT: ::c_ulong = 0x80044277; +pub const BIOCSETF: ::c_ulong = 0x80104267; +pub const BIOCGDLTLIST: ::c_ulong = 0xc0104279; +pub const BIOCSRTIMEOUT: ::c_ulong = 0x8010426d; +pub const BIOCGRTIMEOUT: ::c_ulong = 0x4010426e; + +pub const FIODTYPE: ::c_ulong = 0x4004667a; +pub const FIOGETLBA: ::c_ulong = 0x40046679; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +pub const CRTSCTS: ::tcflag_t = 0x00030000; +pub const CCTS_OFLOW: ::tcflag_t = 0x00010000; +pub const CRTS_IFLOW: ::tcflag_t = 0x00020000; +pub const CDTR_IFLOW: ::tcflag_t = 0x00040000; +pub const CDSR_OFLOW: ::tcflag_t = 0x00080000; +pub const CCAR_OFLOW: ::tcflag_t = 0x00100000; +pub const VERASE2: usize = 7; +pub const OCRNL: ::tcflag_t = 0x10; +pub const ONOCR: ::tcflag_t = 0x20; +pub const ONLRET: ::tcflag_t = 0x40; + +pub const CMGROUP_MAX: usize = 16; + +pub const EUI64_LEN: usize = 8; + +// https://github.com/freebsd/freebsd/blob/HEAD/sys/net/bpf.h +pub const BPF_ALIGNMENT: usize = SIZEOF_LONG; + +// Values for rtprio struct (prio field) and syscall (function argument) +pub const RTP_PRIO_MIN: ::c_ushort = 0; +pub const RTP_PRIO_MAX: ::c_ushort = 31; +pub const RTP_LOOKUP: ::c_int = 0; +pub const RTP_SET: ::c_int = 1; + +// Flags for chflags(2) +pub const UF_SETTABLE: ::c_ulong = 0x0000ffff; +pub const UF_NODUMP: ::c_ulong = 0x00000001; +pub const UF_IMMUTABLE: ::c_ulong = 0x00000002; +pub const UF_APPEND: ::c_ulong = 0x00000004; +pub const UF_OPAQUE: ::c_ulong = 0x00000008; +pub const UF_NOUNLINK: ::c_ulong = 0x00000010; +pub const SF_SETTABLE: ::c_ulong = 0xffff0000; +pub const SF_ARCHIVED: ::c_ulong = 0x00010000; +pub const SF_IMMUTABLE: ::c_ulong = 0x00020000; +pub const SF_APPEND: ::c_ulong = 0x00040000; +pub const SF_NOUNLINK: ::c_ulong = 0x00100000; + +pub const TIMER_ABSTIME: ::c_int = 1; + +// +pub const NTP_API: ::c_int = 4; +pub const MAXPHASE: ::c_long = 500000000; +pub const MAXFREQ: ::c_long = 500000; +pub const MINSEC: ::c_int = 256; +pub const MAXSEC: ::c_int = 2048; +pub const NANOSECOND: ::c_long = 1000000000; +pub const SCALE_PPM: ::c_int = 65; +pub const MAXTC: ::c_int = 10; +pub const MOD_OFFSET: ::c_uint = 0x0001; +pub const MOD_FREQUENCY: ::c_uint = 0x0002; +pub const MOD_MAXERROR: ::c_uint = 0x0004; +pub const MOD_ESTERROR: ::c_uint = 0x0008; +pub const MOD_STATUS: ::c_uint = 0x0010; +pub const MOD_TIMECONST: ::c_uint = 0x0020; +pub const MOD_PPSMAX: ::c_uint = 0x0040; +pub const MOD_TAI: ::c_uint = 0x0080; +pub const MOD_MICRO: ::c_uint = 0x1000; +pub const MOD_NANO: ::c_uint = 0x2000; +pub const MOD_CLKB: ::c_uint = 0x4000; +pub const MOD_CLKA: ::c_uint = 0x8000; +pub const STA_PLL: ::c_int = 0x0001; +pub const STA_PPSFREQ: ::c_int = 0x0002; +pub const STA_PPSTIME: ::c_int = 0x0004; +pub const STA_FLL: ::c_int = 0x0008; +pub const STA_INS: ::c_int = 0x0010; +pub const STA_DEL: ::c_int = 0x0020; +pub const STA_UNSYNC: ::c_int = 0x0040; +pub const STA_FREQHOLD: ::c_int = 0x0080; +pub const STA_PPSSIGNAL: ::c_int = 0x0100; +pub const STA_PPSJITTER: ::c_int = 0x0200; +pub const STA_PPSWANDER: ::c_int = 0x0400; +pub const STA_PPSERROR: ::c_int = 0x0800; +pub const STA_CLOCKERR: ::c_int = 0x1000; +pub const STA_NANO: ::c_int = 0x2000; +pub const STA_MODE: ::c_int = 0x4000; +pub const STA_CLK: ::c_int = 0x8000; +pub const STA_RONLY: ::c_int = STA_PPSSIGNAL + | STA_PPSJITTER + | STA_PPSWANDER + | STA_PPSERROR + | STA_CLOCKERR + | STA_NANO + | STA_MODE + | STA_CLK; +pub const TIME_OK: ::c_int = 0; +pub const TIME_INS: ::c_int = 1; +pub const TIME_DEL: ::c_int = 2; +pub const TIME_OOP: ::c_int = 3; +pub const TIME_WAIT: ::c_int = 4; +pub const TIME_ERROR: ::c_int = 5; + +pub const REG_ENOSYS: ::c_int = -1; +pub const REG_ILLSEQ: ::c_int = 17; + +pub const IPC_PRIVATE: ::key_t = 0; +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_R: ::c_int = 0o400; +pub const IPC_W: ::c_int = 0o200; +pub const IPC_M: ::c_int = 0o10000; + +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; + +pub const KENV_GET: ::c_int = 0; +pub const KENV_SET: ::c_int = 1; +pub const KENV_UNSET: ::c_int = 2; +pub const KENV_DUMP: ::c_int = 3; +pub const KENV_MNAMELEN: ::c_int = 128; +pub const KENV_MVALLEN: ::c_int = 128; + +pub const RB_ASKNAME: ::c_int = 0x001; +pub const RB_SINGLE: ::c_int = 0x002; +pub const RB_NOSYNC: ::c_int = 0x004; +pub const RB_HALT: ::c_int = 0x008; +pub const RB_INITNAME: ::c_int = 0x010; +pub const RB_DFLTROOT: ::c_int = 0x020; +pub const RB_KDB: ::c_int = 0x040; +pub const RB_RDONLY: ::c_int = 0x080; +pub const RB_DUMP: ::c_int = 0x100; +pub const RB_MINIROOT: ::c_int = 0x200; +pub const RB_VERBOSE: ::c_int = 0x800; +pub const RB_SERIAL: ::c_int = 0x1000; +pub const RB_CDROM: ::c_int = 0x2000; +pub const RB_POWEROFF: ::c_int = 0x4000; +pub const RB_GDB: ::c_int = 0x8000; +pub const RB_MUTE: ::c_int = 0x10000; +pub const RB_SELFTEST: ::c_int = 0x20000; + +safe_f! { + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0x13 + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0o177) == 0o177 + } +} + +extern "C" { + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn accept4( + s: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn chflags(path: *const ::c_char, flags: ::c_ulong) -> ::c_int; + pub fn chflagsat( + fd: ::c_int, + path: *const ::c_char, + flags: ::c_ulong, + atflag: ::c_int, + ) -> ::c_int; + + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn endutxent(); + pub fn fchflags(fd: ::c_int, flags: ::c_ulong) -> ::c_int; + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn getdomainname(name: *mut ::c_char, len: ::c_int) -> ::c_int; + pub fn getgrent_r( + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getpwent_r( + pwd: *mut ::passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::passwd, + ) -> ::c_int; + pub fn getgrouplist( + name: *const ::c_char, + basegid: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + servlen: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; + pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t, sgid: *mut ::gid_t) -> ::c_int; + pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t, suid: *mut ::uid_t) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn initgroups(name: *const ::c_char, basegid: ::gid_t) -> ::c_int; + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "kevent@FBSD_1.0" + )] + pub fn kevent( + kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn lchflags(path: *const ::c_char, flags: ::c_ulong) -> ::c_int; + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "mknodat@FBSD_1.1" + )] + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn malloc_usable_size(ptr: *const ::c_void) -> ::size_t; + pub fn mincore(addr: *const ::c_void, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn ppoll( + fds: *mut ::pollfd, + nfds: ::nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn pthread_attr_get_np(tid: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_main_np() -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setpshared( + attr: *mut pthread_mutexattr_t, + pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_getpshared( + attr: *const pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; + pub fn pthread_barrierattr_init(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_destroy(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_getpshared( + attr: *const ::pthread_barrierattr_t, + shared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_barrierattr_setpshared( + attr: *mut ::pthread_barrierattr_t, + shared: ::c_int, + ) -> ::c_int; + pub fn pthread_barrier_init( + barrier: *mut pthread_barrier_t, + attr: *const ::pthread_barrierattr_t, + count: ::c_uint, + ) -> ::c_int; + pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_get_name_np(tid: ::pthread_t, name: *mut ::c_char, len: ::size_t); + pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const sched_param, + ) -> ::c_int; + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut sched_param, + ) -> ::c_int; + pub fn ptrace(request: ::c_int, pid: ::pid_t, addr: *mut ::c_char, data: ::c_int) -> ::c_int; + pub fn utrace(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char; + pub fn rtprio(function: ::c_int, pid: ::pid_t, rtp: *mut rtprio) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, t: *mut ::timespec) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut sched_param) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sendfile( + fd: ::c_int, + s: ::c_int, + offset: ::off_t, + nbytes: ::size_t, + hdtr: *mut ::sf_hdtr, + sbytes: *mut ::off_t, + flags: ::c_int, + ) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; + pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; + pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn setutxent(); + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn sysctl( + name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn sysctlbyname( + name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn sysctlnametomib( + name: *const ::c_char, + mibp: *mut ::c_int, + sizep: *mut ::size_t, + ) -> ::c_int; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + + pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; + pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + + // #include + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + + pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; + + // Added in `FreeBSD` 11.0 + // Added in `DragonFly BSD` 5.4 + pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t); + // ISO/IEC 9899:2011 ("ISO C11") K.3.7.4.1 + pub fn memset_s(s: *mut ::c_void, smax: ::size_t, c: ::c_int, n: ::size_t) -> ::c_int; + pub fn gethostid() -> ::c_long; + pub fn sethostid(hostid: ::c_long); + + pub fn eui64_aton(a: *const ::c_char, e: *mut eui64) -> ::c_int; + pub fn eui64_ntoa(id: *const eui64, a: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn eui64_ntohost(hostname: *mut ::c_char, len: ::size_t, id: *const eui64) -> ::c_int; + pub fn eui64_hostton(hostname: *const ::c_char, id: *mut eui64) -> ::c_int; + + pub fn eaccess(path: *const ::c_char, mode: ::c_int) -> ::c_int; + + pub fn kenv( + action: ::c_int, + name: *const ::c_char, + value: *mut ::c_char, + len: ::c_int, + ) -> ::c_int; + pub fn reboot(howto: ::c_int) -> ::c_int; +} + +#[link(name = "rt")] +extern "C" { + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_notify(mqd: ::mqd_t, notification: *const ::sigevent) -> ::c_int; + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; +} + +#[link(name = "util")] +extern "C" { + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + pub fn login_tty(fd: ::c_int) -> ::c_int; + pub fn fparseln( + stream: *mut ::FILE, + len: *mut ::size_t, + lineno: *mut ::size_t, + delim: *const ::c_char, + flags: ::c_int, + ) -> *mut ::c_char; +} + +#[link(name = "execinfo")] +extern "C" { + pub fn backtrace(addrlist: *mut *mut ::c_void, len: ::size_t) -> ::size_t; + pub fn backtrace_symbols(addrlist: *const *mut ::c_void, len: ::size_t) -> *mut *mut ::c_char; + pub fn backtrace_symbols_fd( + addrlist: *const *mut ::c_void, + len: ::size_t, + fd: ::c_int, + ) -> ::c_int; +} + +#[link(name = "kvm")] +extern "C" { + pub fn kvm_open( + execfile: *const ::c_char, + corefile: *const ::c_char, + swapfile: *const ::c_char, + flags: ::c_int, + errstr: *const ::c_char, + ) -> *mut ::kvm_t; + pub fn kvm_close(kd: *mut ::kvm_t) -> ::c_int; + pub fn kvm_getprocs( + kd: *mut ::kvm_t, + op: ::c_int, + arg: ::c_int, + cnt: *mut ::c_int, + ) -> *mut ::kinfo_proc; + pub fn kvm_getloadavg(kd: *mut kvm_t, loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn kvm_openfiles( + execfile: *const ::c_char, + corefile: *const ::c_char, + swapfile: *const ::c_char, + flags: ::c_int, + errbuf: *mut ::c_char, + ) -> *mut ::kvm_t; + pub fn kvm_read( + kd: *mut ::kvm_t, + addr: ::c_ulong, + buf: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn kvm_write( + kd: *mut ::kvm_t, + addr: ::c_ulong, + buf: *const ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; +} + +cfg_if! { + if #[cfg(target_os = "freebsd")] { + mod freebsd; + pub use self::freebsd::*; + } else if #[cfg(target_os = "dragonfly")] { + mod dragonfly; + pub use self::dragonfly::*; + } else { + // ... + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/mod.rs new file mode 100644 index 0000000..6ce0413 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/mod.rs @@ -0,0 +1,917 @@ +pub type off_t = i64; +pub type useconds_t = u32; +pub type blkcnt_t = i64; +pub type socklen_t = u32; +pub type sa_family_t = u8; +pub type pthread_t = ::uintptr_t; +pub type nfds_t = ::c_uint; +pub type regoff_t = off_t; + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_change: ::time_t, + pub pw_class: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + pub pw_expire: ::time_t, + + #[cfg(not(any(target_os = "macos", + target_os = "ios", + target_os = "tvos", + target_os = "watchos", + target_os = "netbsd", + target_os = "openbsd")))] + pub pw_fields: ::c_int, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut ::c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void, + #[cfg(target_os = "netbsd")] + pub ifa_addrflags: ::c_uint + } + + pub struct fd_set { + #[cfg(all(target_pointer_width = "64", + any(target_os = "freebsd", target_os = "dragonfly")))] + fds_bits: [i64; FD_SETSIZE / 64], + #[cfg(not(all(target_pointer_width = "64", + any(target_os = "freebsd", target_os = "dragonfly"))))] + fds_bits: [i32; FD_SETSIZE / 32], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *mut ::c_char, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct fsid_t { + __fsid_val: [i32; 2], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + pub struct regex_t { + __re_magic: ::c_int, + __re_nsub: ::size_t, + __re_endp: *const ::c_char, + __re_g: *mut ::c_void, + } + + pub struct regmatch_t { + pub rm_so: regoff_t, + pub rm_eo: regoff_t, + } + + pub struct option { + pub name: *const ::c_char, + pub has_arg: ::c_int, + pub flag: *mut ::c_int, + pub val: ::c_int, + } +} + +s_no_extra_traits! { + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [c_char; 104] + } + + pub struct utsname { + #[cfg(not(target_os = "dragonfly"))] + pub sysname: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub sysname: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub nodename: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub nodename: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub release: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub release: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub version: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub version: [::c_char; 32], + #[cfg(not(target_os = "dragonfly"))] + pub machine: [::c_char; 256], + #[cfg(target_os = "dragonfly")] + pub machine: [::c_char; 32], + } + +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_len == other.sun_len + && self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for sockaddr_un {} + + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_len", &self.sun_len) + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_len.hash(state); + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a,b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a,b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a,b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a,b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utsname {} + + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + .finish() + } + } + + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + } + } + } +} + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; +pub const LC_MESSAGES: ::c_int = 6; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONCLEX: ::c_ulong = 0x20006602; +pub const FIONREAD: ::c_ulong = 0x4004667f; +pub const FIONBIO: ::c_ulong = 0x8004667e; +pub const FIOASYNC: ::c_ulong = 0x8004667d; +pub const FIOSETOWN: ::c_ulong = 0x8004667c; +pub const FIOGETOWN: ::c_ulong = 0x4004667b; + +pub const PATH_MAX: ::c_int = 1024; +pub const MAXPATHLEN: ::c_int = PATH_MAX; + +pub const IOV_MAX: ::c_int = 1024; + +pub const SA_ONSTACK: ::c_int = 0x0001; +pub const SA_SIGINFO: ::c_int = 0x0040; +pub const SA_RESTART: ::c_int = 0x0002; +pub const SA_RESETHAND: ::c_int = 0x0004; +pub const SA_NOCLDSTOP: ::c_int = 0x0008; +pub const SA_NODEFER: ::c_int = 0x0010; +pub const SA_NOCLDWAIT: ::c_int = 0x0020; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 4; + +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGINFO: ::c_int = 29; + +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const IP_TOS: ::c_int = 3; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; + +pub const IPV6_UNICAST_HOPS: ::c_int = 4; +pub const IPV6_MULTICAST_IF: ::c_int = 9; +pub const IPV6_MULTICAST_HOPS: ::c_int = 10; +pub const IPV6_MULTICAST_LOOP: ::c_int = 11; +pub const IPV6_V6ONLY: ::c_int = 27; + +pub const IPTOS_ECN_NOTECT: u8 = 0x00; +pub const IPTOS_ECN_MASK: u8 = 0x03; +pub const IPTOS_ECN_ECT1: u8 = 0x01; +pub const IPTOS_ECN_ECT0: u8 = 0x02; +pub const IPTOS_ECN_CE: u8 = 0x03; + +pub const ST_RDONLY: ::c_ulong = 1; + +pub const SCM_RIGHTS: ::c_int = 0x01; + +pub const NCCS: usize = 20; + +pub const O_ACCMODE: ::c_int = 0x3; +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 512; +pub const O_TRUNC: ::c_int = 1024; +pub const O_EXCL: ::c_int = 2048; +pub const O_ASYNC: ::c_int = 0x40; +pub const O_SYNC: ::c_int = 0x80; +pub const O_NONBLOCK: ::c_int = 0x4; +pub const O_NOFOLLOW: ::c_int = 0x100; +pub const O_SHLOCK: ::c_int = 0x10; +pub const O_EXLOCK: ::c_int = 0x20; +pub const O_FSYNC: ::c_int = O_SYNC; +pub const O_NDELAY: ::c_int = O_NONBLOCK; + +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; + +pub const F_RDLCK: ::c_short = 1; +pub const F_UNLCK: ::c_short = 2; +pub const F_WRLCK: ::c_short = 3; + +pub const MNT_RDONLY: ::c_int = 0x00000001; +pub const MNT_SYNCHRONOUS: ::c_int = 0x00000002; +pub const MNT_NOEXEC: ::c_int = 0x00000004; +pub const MNT_NOSUID: ::c_int = 0x00000008; +pub const MNT_ASYNC: ::c_int = 0x00000040; +pub const MNT_EXPORTED: ::c_int = 0x00000100; +pub const MNT_UPDATE: ::c_int = 0x00010000; +pub const MNT_RELOAD: ::c_int = 0x00040000; +pub const MNT_FORCE: ::c_int = 0x00080000; + +pub const Q_SYNC: ::c_int = 0x600; +pub const Q_QUOTAON: ::c_int = 0x100; +pub const Q_QUOTAOFF: ::c_int = 0x200; + +pub const TCIOFF: ::c_int = 3; +pub const TCION: ::c_int = 4; +pub const TCOOFF: ::c_int = 1; +pub const TCOON: ::c_int = 2; +pub const TCIFLUSH: ::c_int = 1; +pub const TCOFLUSH: ::c_int = 2; +pub const TCIOFLUSH: ::c_int = 3; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const VEOF: usize = 0; +pub const VEOL: usize = 1; +pub const VEOL2: usize = 2; +pub const VERASE: usize = 3; +pub const VWERASE: usize = 4; +pub const VKILL: usize = 5; +pub const VREPRINT: usize = 6; +pub const VINTR: usize = 8; +pub const VQUIT: usize = 9; +pub const VSUSP: usize = 10; +pub const VDSUSP: usize = 11; +pub const VSTART: usize = 12; +pub const VSTOP: usize = 13; +pub const VLNEXT: usize = 14; +pub const VDISCARD: usize = 15; +pub const VMIN: usize = 16; +pub const VTIME: usize = 17; +pub const VSTATUS: usize = 18; +pub const _POSIX_VDISABLE: ::cc_t = 0xff; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXON: ::tcflag_t = 0x00000200; +pub const IXOFF: ::tcflag_t = 0x00000400; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const OPOST: ::tcflag_t = 0x1; +pub const ONLCR: ::tcflag_t = 0x2; +pub const OXTABS: ::tcflag_t = 0x4; +pub const ONOEOT: ::tcflag_t = 0x8; +pub const CIGNORE: ::tcflag_t = 0x00000001; +pub const CSIZE: ::tcflag_t = 0x00000300; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CS6: ::tcflag_t = 0x00000100; +pub const CS7: ::tcflag_t = 0x00000200; +pub const CS8: ::tcflag_t = 0x00000300; +pub const CSTOPB: ::tcflag_t = 0x00000400; +pub const CREAD: ::tcflag_t = 0x00000800; +pub const PARENB: ::tcflag_t = 0x00001000; +pub const PARODD: ::tcflag_t = 0x00002000; +pub const HUPCL: ::tcflag_t = 0x00004000; +pub const CLOCAL: ::tcflag_t = 0x00008000; +pub const ECHOKE: ::tcflag_t = 0x00000001; +pub const ECHOE: ::tcflag_t = 0x00000002; +pub const ECHOK: ::tcflag_t = 0x00000004; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const ECHONL: ::tcflag_t = 0x00000010; +pub const ECHOPRT: ::tcflag_t = 0x00000020; +pub const ECHOCTL: ::tcflag_t = 0x00000040; +pub const ISIG: ::tcflag_t = 0x00000080; +pub const ICANON: ::tcflag_t = 0x00000100; +pub const ALTWERASE: ::tcflag_t = 0x00000200; +pub const IEXTEN: ::tcflag_t = 0x00000400; +pub const EXTPROC: ::tcflag_t = 0x00000800; +pub const TOSTOP: ::tcflag_t = 0x00400000; +pub const FLUSHO: ::tcflag_t = 0x00800000; +pub const NOKERNINFO: ::tcflag_t = 0x02000000; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; +pub const MDMBUF: ::tcflag_t = 0x00100000; + +pub const WNOHANG: ::c_int = 0x00000001; +pub const WUNTRACED: ::c_int = 0x00000002; + +pub const RTLD_LAZY: ::c_int = 0x1; +pub const RTLD_NOW: ::c_int = 0x2; +pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; +pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_MAXSEG: ::c_int = 2; + +pub const PIPE_BUF: usize = 512; + +// si_code values for SIGBUS signal +pub const BUS_ADRALN: ::c_int = 1; +pub const BUS_ADRERR: ::c_int = 2; +pub const BUS_OBJERR: ::c_int = 3; + +// si_code values for SIGCHLD signal +pub const CLD_EXITED: ::c_int = 1; +pub const CLD_KILLED: ::c_int = 2; +pub const CLD_DUMPED: ::c_int = 3; +pub const CLD_TRAPPED: ::c_int = 4; +pub const CLD_STOPPED: ::c_int = 5; +pub const CLD_CONTINUED: ::c_int = 6; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLRDBAND: ::c_short = 0x080; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const BIOCGBLEN: ::c_ulong = 0x40044266; +pub const BIOCSBLEN: ::c_ulong = 0xc0044266; +pub const BIOCFLUSH: ::c_uint = 0x20004268; +pub const BIOCPROMISC: ::c_uint = 0x20004269; +pub const BIOCGDLT: ::c_ulong = 0x4004426a; +pub const BIOCGETIF: ::c_ulong = 0x4020426b; +pub const BIOCSETIF: ::c_ulong = 0x8020426c; +pub const BIOCGSTATS: ::c_ulong = 0x4008426f; +pub const BIOCIMMEDIATE: ::c_ulong = 0x80044270; +pub const BIOCVERSION: ::c_ulong = 0x40044271; +pub const BIOCGHDRCMPLT: ::c_ulong = 0x40044274; +pub const BIOCSHDRCMPLT: ::c_ulong = 0x80044275; +pub const SIOCGIFADDR: ::c_ulong = 0xc0206921; + +pub const REG_BASIC: ::c_int = 0o0000; +pub const REG_EXTENDED: ::c_int = 0o0001; +pub const REG_ICASE: ::c_int = 0o0002; +pub const REG_NOSUB: ::c_int = 0o0004; +pub const REG_NEWLINE: ::c_int = 0o0010; +pub const REG_NOSPEC: ::c_int = 0o0020; +pub const REG_PEND: ::c_int = 0o0040; +pub const REG_DUMP: ::c_int = 0o0200; + +pub const REG_NOMATCH: ::c_int = 1; +pub const REG_BADPAT: ::c_int = 2; +pub const REG_ECOLLATE: ::c_int = 3; +pub const REG_ECTYPE: ::c_int = 4; +pub const REG_EESCAPE: ::c_int = 5; +pub const REG_ESUBREG: ::c_int = 6; +pub const REG_EBRACK: ::c_int = 7; +pub const REG_EPAREN: ::c_int = 8; +pub const REG_EBRACE: ::c_int = 9; +pub const REG_BADBR: ::c_int = 10; +pub const REG_ERANGE: ::c_int = 11; +pub const REG_ESPACE: ::c_int = 12; +pub const REG_BADRPT: ::c_int = 13; +pub const REG_EMPTY: ::c_int = 14; +pub const REG_ASSERT: ::c_int = 15; +pub const REG_INVARG: ::c_int = 16; +pub const REG_ATOI: ::c_int = 255; +pub const REG_ITOA: ::c_int = 0o0400; + +pub const REG_NOTBOL: ::c_int = 0o00001; +pub const REG_NOTEOL: ::c_int = 0o00002; +pub const REG_STARTEND: ::c_int = 0o00004; +pub const REG_TRACE: ::c_int = 0o00400; +pub const REG_LARGE: ::c_int = 0o01000; +pub const REG_BACKR: ::c_int = 0o02000; + +pub const TIOCCBRK: ::c_uint = 0x2000747a; +pub const TIOCSBRK: ::c_uint = 0x2000747b; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; + +f! { + pub fn CMSG_FIRSTHDR(mhdr: *const ::msghdr) -> *mut ::cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::<::cmsghdr>() { + (*mhdr).msg_control as *mut ::cmsghdr + } else { + 0 as *mut ::cmsghdr + } + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +safe_f! { + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0o177 + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0o177) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0o200) != 0 + } + + pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { + (cmd << 8) | (type_ & 0x00ff) + } +} + +extern "C" { + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "getrlimit$UNIX2003" + )] + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "setrlimit$UNIX2003" + )] + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + #[cfg_attr( + all(target_os = "freebsd", any(freebsd12, freebsd11, freebsd10)), + link_name = "rand@FBSD_1.0" + )] + pub fn rand() -> ::c_int; + #[cfg_attr( + all(target_os = "freebsd", any(freebsd12, freebsd11, freebsd10)), + link_name = "srand@FBSD_1.0" + )] + pub fn srand(seed: ::c_uint); + + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn setlogin(name: *const ::c_char) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn kqueue() -> ::c_int; + pub fn unmount(target: *const ::c_char, arg: ::c_int) -> ::c_int; + pub fn syscall(num: ::c_int, ...) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwent50")] + pub fn getpwent() -> *mut passwd; + pub fn setpwent(); + pub fn endpwent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + + pub fn getprogname() -> *const ::c_char; + pub fn setprogname(name: *const ::c_char); + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + + pub fn getpeereid(socket: ::c_int, euid: *mut ::uid_t, egid: *mut ::gid_t) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "glob$INODE64" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__glob30")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "glob@FBSD_1.0" + )] + pub fn glob( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__globfree30")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "globfree@FBSD_1.0" + )] + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "seekdir$INODE64" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "seekdir$INODE64$UNIX2003" + )] + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "telldir$INODE64" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "telldir$INODE64$UNIX2003" + )] + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "msync$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__msync13")] + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "recvfrom$UNIX2003" + )] + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__futimes50")] + pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "bind$UNIX2003" + )] + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "writev$UNIX2003" + )] + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "readv$UNIX2003" + )] + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sendmsg$UNIX2003" + )] + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "recvmsg$UNIX2003" + )] + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + + pub fn sync(); + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sigaltstack$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__sigaltstack14")] + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_sigmask$UNIX2003" + )] + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cancel$UNIX2003" + )] + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam_r50")] + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid_r50")] + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sigwait$UNIX2003" + )] + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "popen$UNIX2003" + )] + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn acct(filename: *const ::c_char) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "wait4$UNIX2003" + )] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd12, freebsd11, freebsd10)), + link_name = "wait4@FBSD_1.0" + )] + pub fn wait4( + pid: ::pid_t, + status: *mut ::c_int, + options: ::c_int, + rusage: *mut ::rusage, + ) -> ::pid_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "getitimer$UNIX2003" + )] + pub fn getitimer(which: ::c_int, curr_value: *mut ::itimerval) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "setitimer$UNIX2003" + )] + pub fn setitimer( + which: ::c_int, + new_value: *const ::itimerval, + old_value: *mut ::itimerval, + ) -> ::c_int; + + pub fn regcomp(preg: *mut regex_t, pattern: *const ::c_char, cflags: ::c_int) -> ::c_int; + + pub fn regexec( + preg: *const regex_t, + input: *const ::c_char, + nmatch: ::size_t, + pmatch: *mut regmatch_t, + eflags: ::c_int, + ) -> ::c_int; + + pub fn regerror( + errcode: ::c_int, + preg: *const regex_t, + errbuf: *mut ::c_char, + errbuf_size: ::size_t, + ) -> ::size_t; + + pub fn regfree(preg: *mut regex_t); + + pub fn arc4random() -> u32; + pub fn arc4random_buf(buf: *mut ::c_void, size: ::size_t); + pub fn arc4random_uniform(l: u32) -> u32; + + pub fn drand48() -> ::c_double; + pub fn erand48(xseed: *mut ::c_ushort) -> ::c_double; + pub fn lrand48() -> ::c_long; + pub fn nrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn mrand48() -> ::c_long; + pub fn jrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn srand48(seed: ::c_long); + pub fn seed48(xseed: *mut ::c_ushort) -> *mut ::c_ushort; + pub fn lcong48(p: *mut ::c_ushort); + pub fn getopt_long( + argc: ::c_int, + argv: *const *mut c_char, + optstring: *const c_char, + longopts: *const option, + longindex: *mut ::c_int, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos"))] { + mod apple; + pub use self::apple::*; + } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd"))] { + mod netbsdlike; + pub use self::netbsdlike::*; + } else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] { + mod freebsdlike; + pub use self::freebsdlike::*; + } else { + // Unknown target_os + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/mod.rs new file mode 100644 index 0000000..c43a4b9 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/mod.rs @@ -0,0 +1,762 @@ +pub type wchar_t = i32; +pub type time_t = i64; +pub type mode_t = u32; +pub type nlink_t = u32; +pub type ino_t = u64; +pub type pthread_key_t = ::c_int; +pub type rlim_t = u64; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type nl_item = c_long; +pub type clockid_t = ::c_int; +pub type id_t = u32; +pub type sem_t = *mut sem; +pub type key_t = c_long; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum sem {} +impl ::Copy for sem {} +impl ::Clone for sem { + fn clone(&self) -> sem { + *self + } +} + +s! { + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::c_int, + pub c_ospeed: ::c_int, + } + + pub struct flock { + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_type: ::c_short, + pub l_whence: ::c_short, + } + + pub struct ipc_perm { + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mode: ::mode_t, + #[cfg(target_os = "openbsd")] + pub seq: ::c_ushort, + #[cfg(target_os = "netbsd")] + pub _seq: ::c_ushort, + #[cfg(target_os = "openbsd")] + pub key: ::key_t, + #[cfg(target_os = "netbsd")] + pub _key: ::key_t, + } + + pub struct ptrace_io_desc { + pub piod_op: ::c_int, + pub piod_offs: *mut ::c_void, + pub piod_addr: *mut ::c_void, + pub piod_len: ::size_t, + } +} + +pub const D_T_FMT: ::nl_item = 0; +pub const D_FMT: ::nl_item = 1; +pub const T_FMT: ::nl_item = 2; +pub const T_FMT_AMPM: ::nl_item = 3; +pub const AM_STR: ::nl_item = 4; +pub const PM_STR: ::nl_item = 5; + +pub const DAY_1: ::nl_item = 6; +pub const DAY_2: ::nl_item = 7; +pub const DAY_3: ::nl_item = 8; +pub const DAY_4: ::nl_item = 9; +pub const DAY_5: ::nl_item = 10; +pub const DAY_6: ::nl_item = 11; +pub const DAY_7: ::nl_item = 12; + +pub const ABDAY_1: ::nl_item = 13; +pub const ABDAY_2: ::nl_item = 14; +pub const ABDAY_3: ::nl_item = 15; +pub const ABDAY_4: ::nl_item = 16; +pub const ABDAY_5: ::nl_item = 17; +pub const ABDAY_6: ::nl_item = 18; +pub const ABDAY_7: ::nl_item = 19; + +pub const MON_1: ::nl_item = 20; +pub const MON_2: ::nl_item = 21; +pub const MON_3: ::nl_item = 22; +pub const MON_4: ::nl_item = 23; +pub const MON_5: ::nl_item = 24; +pub const MON_6: ::nl_item = 25; +pub const MON_7: ::nl_item = 26; +pub const MON_8: ::nl_item = 27; +pub const MON_9: ::nl_item = 28; +pub const MON_10: ::nl_item = 29; +pub const MON_11: ::nl_item = 30; +pub const MON_12: ::nl_item = 31; + +pub const ABMON_1: ::nl_item = 32; +pub const ABMON_2: ::nl_item = 33; +pub const ABMON_3: ::nl_item = 34; +pub const ABMON_4: ::nl_item = 35; +pub const ABMON_5: ::nl_item = 36; +pub const ABMON_6: ::nl_item = 37; +pub const ABMON_7: ::nl_item = 38; +pub const ABMON_8: ::nl_item = 39; +pub const ABMON_9: ::nl_item = 40; +pub const ABMON_10: ::nl_item = 41; +pub const ABMON_11: ::nl_item = 42; +pub const ABMON_12: ::nl_item = 43; + +pub const RADIXCHAR: ::nl_item = 44; +pub const THOUSEP: ::nl_item = 45; +pub const YESSTR: ::nl_item = 46; +pub const YESEXPR: ::nl_item = 47; +pub const NOSTR: ::nl_item = 48; +pub const NOEXPR: ::nl_item = 49; +pub const CRNCYSTR: ::nl_item = 50; + +pub const CODESET: ::nl_item = 51; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 1024; +pub const O_NOCTTY: ::c_int = 32768; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_ANON: ::c_int = 0x1000; +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const IPC_CREAT: ::c_int = 0o001000; +pub const IPC_EXCL: ::c_int = 0o002000; +pub const IPC_NOWAIT: ::c_int = 0o004000; + +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; + +pub const IPC_R: ::c_int = 0o000400; +pub const IPC_W: ::c_int = 0o000200; +pub const IPC_M: ::c_int = 0o010000; + +pub const SHM_R: ::c_int = IPC_R; +pub const SHM_W: ::c_int = IPC_W; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_ASYNC: ::c_int = 0x0001; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EDEADLK: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EAGAIN: ::c_int = 35; +pub const EWOULDBLOCK: ::c_int = 35; +pub const EINPROGRESS: ::c_int = 36; +pub const EALREADY: ::c_int = 37; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ELOOP: ::c_int = 62; +pub const ENAMETOOLONG: ::c_int = 63; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const ENOTEMPTY: ::c_int = 66; +pub const EPROCLIM: ::c_int = 67; +pub const EUSERS: ::c_int = 68; +pub const EDQUOT: ::c_int = 69; +pub const ESTALE: ::c_int = 70; +pub const EREMOTE: ::c_int = 71; +pub const EBADRPC: ::c_int = 72; +pub const ERPCMISMATCH: ::c_int = 73; +pub const EPROGUNAVAIL: ::c_int = 74; +pub const EPROGMISMATCH: ::c_int = 75; +pub const EPROCUNAVAIL: ::c_int = 76; +pub const ENOLCK: ::c_int = 77; +pub const ENOSYS: ::c_int = 78; +pub const EFTYPE: ::c_int = 79; +pub const EAUTH: ::c_int = 80; +pub const ENEEDAUTH: ::c_int = 81; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND: ::c_int = 0x0001; +pub const GLOB_DOOFFS: ::c_int = 0x0002; +pub const GLOB_ERR: ::c_int = 0x0004; +pub const GLOB_MARK: ::c_int = 0x0008; +pub const GLOB_NOCHECK: ::c_int = 0x0010; +pub const GLOB_NOSORT: ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x1000; + +pub const GLOB_NOSPACE: ::c_int = -1; +pub const GLOB_ABORTED: ::c_int = -2; +pub const GLOB_NOMATCH: ::c_int = -3; +pub const GLOB_NOSYS: ::c_int = -4; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const PIOD_READ_D: ::c_int = 1; +pub const PIOD_WRITE_D: ::c_int = 2; +pub const PIOD_READ_I: ::c_int = 3; +pub const PIOD_WRITE_I: ::c_int = 4; +pub const PIOD_READ_AUXV: ::c_int = 5; + +pub const PT_TRACE_ME: ::c_int = 0; +pub const PT_READ_I: ::c_int = 1; +pub const PT_READ_D: ::c_int = 2; +pub const PT_WRITE_I: ::c_int = 4; +pub const PT_WRITE_D: ::c_int = 5; +pub const PT_CONTINUE: ::c_int = 7; +pub const PT_KILL: ::c_int = 8; +pub const PT_ATTACH: ::c_int = 9; +pub const PT_DETACH: ::c_int = 10; +pub const PT_IO: ::c_int = 11; + +// http://man.openbsd.org/OpenBSD-current/man2/clock_getres.2 +// The man page says clock_gettime(3) can accept various values as clockid_t but +// http://fxr.watson.org/fxr/source/kern/kern_time.c?v=OPENBSD;im=excerpts#L161 +// the implementation rejects anything other than the below two +// +// http://netbsd.gw.com/cgi-bin/man-cgi?clock_gettime +// https://github.com/jsonn/src/blob/HEAD/sys/kern/subr_time.c#L222 +// Basically the same goes for NetBSD +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_MONOTONIC: ::clockid_t = 3; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_MEMLOCK: ::c_int = 6; +pub const RLIMIT_NPROC: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 8; + +pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff; +pub const RLIM_SAVED_MAX: rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: rlim_t = RLIM_INFINITY; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 6; + +// sys/fstypes.h in NetBSD, or sys/mount.h in OpenBSD +pub const MNT_NODEV: ::c_int = 0x00000010; +pub const MNT_LOCAL: ::c_int = 0x00001000; +pub const MNT_QUOTA: ::c_int = 0x00002000; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_ISO: ::c_int = 7; +pub const AF_OSI: ::c_int = AF_ISO; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_LINK: ::c_int = 18; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const AF_COIP: ::c_int = 20; +pub const AF_CNT: ::c_int = 21; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_INET6: ::c_int = 24; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const AF_ISDN: ::c_int = 26; +pub const AF_E164: ::c_int = AF_ISDN; +pub const AF_NATM: ::c_int = 27; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_ISO: ::c_int = AF_ISO; +pub const PF_OSI: ::c_int = AF_ISO; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_XTP: ::c_int = pseudo_AF_XTP; +pub const PF_COIP: ::c_int = AF_COIP; +pub const PF_CNT: ::c_int = AF_CNT; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_RTIP: ::c_int = pseudo_AF_RTIP; +pub const PF_PIP: ::c_int = pseudo_AF_PIP; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_NATM: ::c_int = AF_NATM; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IPV6_RECVPKTINFO: ::c_int = 36; +pub const IPV6_PKTINFO: ::c_int = 46; +pub const IPV6_RECVTCLASS: ::c_int = 57; +pub const IPV6_TCLASS: ::c_int = 61; + +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_BCAST: ::c_int = 0x100; +pub const MSG_MCAST: ::c_int = 0x200; +pub const MSG_NOSIGNAL: ::c_int = 0x400; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x800; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_BC_BASE_MAX: ::c_int = 9; +pub const _SC_BC_DIM_MAX: ::c_int = 10; +pub const _SC_BC_SCALE_MAX: ::c_int = 11; +pub const _SC_BC_STRING_MAX: ::c_int = 12; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13; +pub const _SC_EXPR_NEST_MAX: ::c_int = 14; +pub const _SC_LINE_MAX: ::c_int = 15; +pub const _SC_RE_DUP_MAX: ::c_int = 16; +pub const _SC_2_VERSION: ::c_int = 17; +pub const _SC_2_C_BIND: ::c_int = 18; +pub const _SC_2_C_DEV: ::c_int = 19; +pub const _SC_2_CHAR_TERM: ::c_int = 20; +pub const _SC_2_FORT_DEV: ::c_int = 21; +pub const _SC_2_FORT_RUN: ::c_int = 22; +pub const _SC_2_LOCALEDEF: ::c_int = 23; +pub const _SC_2_SW_DEV: ::c_int = 24; +pub const _SC_2_UPE: ::c_int = 25; +pub const _SC_STREAM_MAX: ::c_int = 26; +pub const _SC_TZNAME_MAX: ::c_int = 27; +pub const _SC_PAGESIZE: ::c_int = 28; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_FSYNC: ::c_int = 29; +pub const _SC_XOPEN_SHM: ::c_int = 30; + +pub const Q_GETQUOTA: ::c_int = 0x300; +pub const Q_SETQUOTA: ::c_int = 0x400; + +pub const RTLD_GLOBAL: ::c_int = 0x100; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const HW_NCPU: ::c_int = 3; + +pub const B0: speed_t = 0; +pub const B50: speed_t = 50; +pub const B75: speed_t = 75; +pub const B110: speed_t = 110; +pub const B134: speed_t = 134; +pub const B150: speed_t = 150; +pub const B200: speed_t = 200; +pub const B300: speed_t = 300; +pub const B600: speed_t = 600; +pub const B1200: speed_t = 1200; +pub const B1800: speed_t = 1800; +pub const B2400: speed_t = 2400; +pub const B4800: speed_t = 4800; +pub const B9600: speed_t = 9600; +pub const B19200: speed_t = 19200; +pub const B38400: speed_t = 38400; +pub const B7200: speed_t = 7200; +pub const B14400: speed_t = 14400; +pub const B28800: speed_t = 28800; +pub const B57600: speed_t = 57600; +pub const B76800: speed_t = 76800; +pub const B115200: speed_t = 115200; +pub const B230400: speed_t = 230400; +pub const EXTA: speed_t = 19200; +pub const EXTB: speed_t = 38400; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +pub const CRTSCTS: ::tcflag_t = 0x00010000; +pub const CRTS_IFLOW: ::tcflag_t = CRTSCTS; +pub const CCTS_OFLOW: ::tcflag_t = CRTSCTS; +pub const OCRNL: ::tcflag_t = 0x10; + +pub const TIOCEXCL: ::c_ulong = 0x2000740d; +pub const TIOCNXCL: ::c_ulong = 0x2000740e; +pub const TIOCFLUSH: ::c_ulong = 0x80047410; +pub const TIOCGETA: ::c_ulong = 0x402c7413; +pub const TIOCSETA: ::c_ulong = 0x802c7414; +pub const TIOCSETAW: ::c_ulong = 0x802c7415; +pub const TIOCSETAF: ::c_ulong = 0x802c7416; +pub const TIOCGETD: ::c_ulong = 0x4004741a; +pub const TIOCSETD: ::c_ulong = 0x8004741b; +pub const TIOCMGET: ::c_ulong = 0x4004746a; +pub const TIOCMBIC: ::c_ulong = 0x8004746b; +pub const TIOCMBIS: ::c_ulong = 0x8004746c; +pub const TIOCMSET: ::c_ulong = 0x8004746d; +pub const TIOCSTART: ::c_ulong = 0x2000746e; +pub const TIOCSTOP: ::c_ulong = 0x2000746f; +pub const TIOCSCTTY: ::c_ulong = 0x20007461; +pub const TIOCGWINSZ: ::c_ulong = 0x40087468; +pub const TIOCSWINSZ: ::c_ulong = 0x80087467; +pub const TIOCM_LE: ::c_int = 0o0001; +pub const TIOCM_DTR: ::c_int = 0o0002; +pub const TIOCM_RTS: ::c_int = 0o0004; +pub const TIOCM_ST: ::c_int = 0o0010; +pub const TIOCM_SR: ::c_int = 0o0020; +pub const TIOCM_CTS: ::c_int = 0o0040; +pub const TIOCM_CAR: ::c_int = 0o0100; +pub const TIOCM_RNG: ::c_int = 0o0200; +pub const TIOCM_DSR: ::c_int = 0o0400; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; + +pub const TIMER_ABSTIME: ::c_int = 1; + +#[link(name = "util")] +extern "C" { + pub fn setgrent(); + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn accept4( + s: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn mincore(addr: *mut ::c_void, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_getres50")] + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_gettime50")] + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")] + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn __errno() -> *mut ::c_int; + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn login_tty(fd: ::c_int) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> ::c_int; + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const sched_param, + ) -> ::c_int; + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut sched_param, + ) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + + pub fn getgrouplist( + name: *const ::c_char, + basegid: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn initgroups(name: *const ::c_char, basegid: ::gid_t) -> ::c_int; + pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; +} + +extern "C" { + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn gethostid() -> ::c_long; + pub fn sethostid(hostid: ::c_long) -> ::c_int; + pub fn ftok(path: *const ::c_char, id: ::c_int) -> ::key_t; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_os = "netbsd")] { + mod netbsd; + pub use self::netbsd::*; + } else if #[cfg(target_os = "openbsd")] { + mod openbsd; + pub use self::openbsd::*; + } else { + // Unknown target_os + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/aarch64.rs new file mode 100644 index 0000000..7b895f6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/aarch64.rs @@ -0,0 +1,103 @@ +use PT_FIRSTMACH; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = u8; +pub type greg_t = u64; +pub type __cpu_simple_lock_nv_t = ::c_uchar; + +s! { + pub struct __fregset { + #[cfg(libc_union)] + pub __qregs: [__c_anonymous__freg; 32], + pub __fpcr: u32, + pub __fpsr: u32, + } + + pub struct mcontext_t { + pub __gregs: [::greg_t; 32], + pub __fregs: __fregset, + __spare: [::greg_t; 8], + } + + pub struct ucontext_t { + pub uc_flags: ::c_uint, + pub uc_link: *mut ucontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + } +} + +s_no_extra_traits! { + #[cfg(libc_union)] + #[repr(align(16))] + pub union __c_anonymous__freg { + pub __b8: [u8; 16], + pub __h16: [u16; 8], + pub __s32: [u32; 4], + pub __d64: [u64; 2], + pub __q128: [u128; 1], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + #[cfg(libc_union)] + impl PartialEq for __c_anonymous__freg { + fn eq(&self, other: &__c_anonymous__freg) -> bool { + unsafe { + self.__b8 == other.__b8 + || self.__h16 == other.__h16 + || self.__s32 == other.__s32 + || self.__d64 == other.__d64 + || self.__q128 == other.__q128 + } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous__freg {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous__freg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous__freg") + .field("__b8", &self.__b8) + .field("__h16", &self.__h16) + .field("__s32", &self.__s32) + .field("__d64", &self.__d64) + .field("__q128", &self.__q128) + .finish() + } + } + } + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous__freg { + fn hash(&self, state: &mut H) { + unsafe { + self.__b8.hash(state); + self.__h16.hash(state); + self.__s32.hash(state); + self.__d64.hash(state); + self.__q128.hash(state); + } + } + } + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} + +pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 0; +pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 1; +pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 2; +pub const PT_SETFPREGS: ::c_int = PT_FIRSTMACH + 3; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/arm.rs new file mode 100644 index 0000000..4bf3ccd --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/arm.rs @@ -0,0 +1,22 @@ +use PT_FIRSTMACH; + +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = u8; +pub type __cpu_simple_lock_nv_t = ::c_int; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_longlong>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1; +pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2; +pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 3; +pub const PT_SETFPREGS: ::c_int = PT_FIRSTMACH + 4; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs new file mode 100644 index 0000000..46035df --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -0,0 +1,3178 @@ +pub type clock_t = ::c_uint; +pub type suseconds_t = ::c_int; +pub type dev_t = u64; +pub type blksize_t = i32; +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type idtype_t = ::c_int; +pub type mqd_t = ::c_int; +type __pthread_spin_t = __cpu_simple_lock_nv_t; +pub type vm_size_t = ::uintptr_t; // FIXME: deprecated since long time +pub type lwpid_t = ::c_uint; +pub type shmatt_t = ::c_uint; +pub type cpuid_t = u64; +pub type cpuset_t = _cpuset; +pub type pthread_spin_t = ::c_uchar; +pub type timer_t = ::c_int; + +// elf.h + +pub type Elf32_Addr = u32; +pub type Elf32_Half = u16; +pub type Elf32_Lword = u64; +pub type Elf32_Off = u32; +pub type Elf32_Sword = i32; +pub type Elf32_Word = u32; + +pub type Elf64_Addr = u64; +pub type Elf64_Half = u16; +pub type Elf64_Lword = u64; +pub type Elf64_Off = u64; +pub type Elf64_Sword = i32; +pub type Elf64_Sxword = i64; +pub type Elf64_Word = u32; +pub type Elf64_Xword = u64; + +pub type iconv_t = *mut ::c_void; + +e! { + pub enum fae_action { + FAE_OPEN, + FAE_DUP2, + FAE_CLOSE, + } +} + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + type Elf_Addr = Elf64_Addr; + type Elf_Half = Elf64_Half; + type Elf_Phdr = Elf64_Phdr; + } else if #[cfg(target_pointer_width = "32")] { + type Elf_Addr = Elf32_Addr; + type Elf_Half = Elf32_Half; + type Elf_Phdr = Elf32_Phdr; + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + __pad1: ::c_int, + _pid: ::pid_t, + _uid: ::uid_t, + value: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_timer)).value + } + + pub unsafe fn si_status(&self) -> ::c_int { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + __pad1: ::c_int, + _pid: ::pid_t, + _uid: ::uid_t, + _value: ::sigval, + _cpid: ::pid_t, + _cuid: ::uid_t, + status: ::c_int, + } + (*(self as *const siginfo_t as *const siginfo_timer)).status + } +} + +s! { + pub struct aiocb { + pub aio_offset: ::off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_sigevent: ::sigevent, + _state: ::c_int, + _errno: ::c_int, + _retval: ::ssize_t + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::size_t, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + + __unused3: *mut ::c_void, + + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct sigset_t { + __bits: [u32; 4], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_mode: ::mode_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atimensec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtimensec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctimensec: ::c_long, + pub st_birthtime: ::time_t, + pub st_birthtimensec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: u32, + pub st_gen: u32, + pub st_spare: [u32; 2], + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut ::addrinfo, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + __pad1: ::c_int, + pub si_addr: *mut ::c_void, + __pad2: [u64; 13], + } + + pub struct pthread_attr_t { + pta_magic: ::c_uint, + pta_flags: ::c_int, + pta_private: *mut ::c_void, + } + + pub struct pthread_mutex_t { + ptm_magic: ::c_uint, + ptm_errorcheck: __pthread_spin_t, + #[cfg(any(target_arch = "sparc", target_arch = "sparc64", + target_arch = "x86", target_arch = "x86_64"))] + ptm_pad1: [u8; 3], + // actually a union with a non-unused, 0-initialized field + ptm_unused: __pthread_spin_t, + #[cfg(any(target_arch = "sparc", target_arch = "sparc64", + target_arch = "x86", target_arch = "x86_64"))] + ptm_pad2: [u8; 3], + ptm_owner: ::pthread_t, + ptm_waiters: *mut u8, + ptm_recursed: ::c_uint, + ptm_spare2: *mut ::c_void, + } + + pub struct pthread_mutexattr_t { + ptma_magic: ::c_uint, + ptma_private: *mut ::c_void, + } + + pub struct pthread_rwlockattr_t { + ptra_magic: ::c_uint, + ptra_private: *mut ::c_void, + } + + pub struct pthread_cond_t { + ptc_magic: ::c_uint, + ptc_lock: __pthread_spin_t, + ptc_waiters_first: *mut u8, + ptc_waiters_last: *mut u8, + ptc_mutex: *mut ::pthread_mutex_t, + ptc_private: *mut ::c_void, + } + + pub struct pthread_condattr_t { + ptca_magic: ::c_uint, + ptca_private: *mut ::c_void, + } + + pub struct pthread_rwlock_t { + ptr_magic: ::c_uint, + ptr_interlock: __pthread_spin_t, + ptr_rblocked_first: *mut u8, + ptr_rblocked_last: *mut u8, + ptr_wblocked_first: *mut u8, + ptr_wblocked_last: *mut u8, + ptr_nreaders: ::c_uint, + ptr_owner: ::pthread_t, + ptr_private: *mut ::c_void, + } + + pub struct pthread_spinlock_t { + pts_magic: ::c_uint, + pts_spin: ::pthread_spin_t, + pts_flags: ::c_int, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: u32, + pub flags: u32, + pub fflags: u32, + pub data: i64, + pub udata: ::intptr_t, /* FIXME: NetBSD 10.0 will finally have same layout as other BSD */ + } + + pub struct dqblk { + pub dqb_bhardlimit: u32, + pub dqb_bsoftlimit: u32, + pub dqb_curblocks: u32, + pub dqb_ihardlimit: u32, + pub dqb_isoftlimit: u32, + pub dqb_curinodes: u32, + pub dqb_btime: i32, + pub dqb_itime: i32, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *const ::c_void, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct if_data { + pub ifi_type: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_link_state: ::c_int, + pub ifi_mtu: u64, + pub ifi_metric: u64, + pub ifi_baudrate: u64, + pub ifi_ipackets: u64, + pub ifi_ierrors: u64, + pub ifi_opackets: u64, + pub ifi_oerrors: u64, + pub ifi_collisions: u64, + pub ifi_ibytes: u64, + pub ifi_obytes: u64, + pub ifi_imcasts: u64, + pub ifi_omcasts: u64, + pub ifi_iqdrops: u64, + pub ifi_noproto: u64, + pub ifi_lastchange: ::timespec, + } + + pub struct if_msghdr { + pub ifm_msglen: ::c_ushort, + pub ifm_version: ::c_uchar, + pub ifm_type: ::c_uchar, + pub ifm_addrs: ::c_int, + pub ifm_flags: ::c_int, + pub ifm_index: ::c_ushort, + pub ifm_data: if_data, + } + + pub struct sockcred { + pub sc_pid: ::pid_t, + pub sc_uid: ::uid_t, + pub sc_euid: ::uid_t, + pub sc_gid: ::gid_t, + pub sc_egid: ::gid_t, + pub sc_ngroups: ::c_int, + pub sc_groups: [::gid_t; 1], + } + + pub struct uucred { + pub cr_unused: ::c_ushort, + pub cr_uid: ::uid_t, + pub cr_gid: ::gid_t, + pub cr_ngroups: ::c_int, + pub cr_groups: [::gid_t; NGROUPS_MAX as usize], + } + + pub struct unpcbid { + pub unp_pid: ::pid_t, + pub unp_euid: ::uid_t, + pub unp_egid: ::gid_t, + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: u8, + pub sdl_nlen: u8, + pub sdl_alen: u8, + pub sdl_slen: u8, + pub sdl_data: [::c_char; 12], + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::c_uint, + } + + pub struct __exit_status { + pub e_termination: u16, + pub e_exit: u16, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + _shm_internal: *mut ::c_void, + } + + pub struct utmp { + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_name: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_time: ::time_t + } + + pub struct lastlog { + pub ll_line: [::c_char; UT_LINESIZE], + pub ll_host: [::c_char; UT_HOSTSIZE], + pub ll_time: ::time_t + } + + pub struct timex { + pub modes: ::c_uint, + pub offset: ::c_long, + pub freq: ::c_long, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub status: ::c_int, + pub constant: ::c_long, + pub precision: ::c_long, + pub tolerance: ::c_long, + pub ppsfreq: ::c_long, + pub jitter: ::c_long, + pub shift: ::c_int, + pub stabil: ::c_long, + pub jitcnt: ::c_long, + pub calcnt: ::c_long, + pub errcnt: ::c_long, + pub stbcnt: ::c_long, + } + + pub struct ntptimeval { + pub time: ::timespec, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub tai: ::c_long, + pub time_state: ::c_int, + } + + // elf.h + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + pub struct Aux32Info { + pub a_type: Elf32_Word, + pub a_v: Elf32_Word, + } + + pub struct Aux64Info { + pub a_type: Elf64_Word, + pub a_v: Elf64_Xword, + } + + // link.h + + pub struct dl_phdr_info { + pub dlpi_addr: Elf_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const Elf_Phdr, + pub dlpi_phnum: Elf_Half, + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + pub dlpi_tls_modid: usize, + pub dlpi_tls_data: *mut ::c_void, + } + + pub struct _cpuset { + bits: [u32; 0] + } + + pub struct accept_filter_arg { + pub af_name: [::c_char; 16], + af_arg: [[::c_char; 10]; 24], + } + + pub struct ki_sigset_t { + pub __bits: [u32; 4], + } + + pub struct kinfo_proc2 { + pub p_forw: u64, + pub p_back: u64, + pub p_paddr: u64, + pub p_addr: u64, + pub p_fd: u64, + pub p_cwdi: u64, + pub p_stats: u64, + pub p_limit: u64, + pub p_vmspace: u64, + pub p_sigacts: u64, + pub p_sess: u64, + pub p_tsess: u64, + pub p_ru: u64, + pub p_eflag: i32, + pub p_exitsig: i32, + pub p_flag: i32, + pub p_pid: i32, + pub p_ppid: i32, + pub p_sid: i32, + pub p__pgid: i32, + pub p_tpgid: i32, + pub p_uid: u32, + pub p_ruid: u32, + pub p_gid: u32, + pub p_rgid: u32, + pub p_groups: [u32; KI_NGROUPS as usize], + pub p_ngroups: i16, + pub p_jobc: i16, + pub p_tdev: u32, + pub p_estcpu: u32, + pub p_rtime_sec: u32, + pub p_rtime_usec: u32, + pub p_cpticks: i32, + pub p_pctcpu: u32, + pub p_swtime: u32, + pub p_slptime: u32, + pub p_schedflags: i32, + pub p_uticks: u64, + pub p_sticks: u64, + pub p_iticks: u64, + pub p_tracep: u64, + pub p_traceflag: i32, + pub p_holdcnt: i32, + pub p_siglist: ki_sigset_t, + pub p_sigmask: ki_sigset_t, + pub p_sigignore: ki_sigset_t, + pub p_sigcatch: ki_sigset_t, + pub p_stat: i8, + pub p_priority: u8, + pub p_usrpri: u8, + pub p_nice: u8, + pub p_xstat: u16, + pub p_acflag: u16, + pub p_comm: [::c_char; KI_MAXCOMLEN as usize], + pub p_wmesg: [::c_char; KI_WMESGLEN as usize], + pub p_wchan: u64, + pub p_login: [::c_char; KI_MAXLOGNAME as usize], + pub p_vm_rssize: i32, + pub p_vm_tsize: i32, + pub p_vm_dsize: i32, + pub p_vm_ssize: i32, + pub p_uvalid: i64, + pub p_ustart_sec: u32, + pub p_ustart_usec: u32, + pub p_uutime_sec: u32, + pub p_uutime_usec: u32, + pub p_ustime_sec: u32, + pub p_ustime_usec: u32, + pub p_uru_maxrss: u64, + pub p_uru_ixrss: u64, + pub p_uru_idrss: u64, + pub p_uru_isrss: u64, + pub p_uru_minflt: u64, + pub p_uru_majflt: u64, + pub p_uru_nswap: u64, + pub p_uru_inblock: u64, + pub p_uru_oublock: u64, + pub p_uru_msgsnd: u64, + pub p_uru_msgrcv: u64, + pub p_uru_nsignals: u64, + pub p_uru_nvcsw: u64, + pub p_uru_nivcsw: u64, + pub p_uctime_sec: u32, + pub p_uctime_usec: u32, + pub p_cpuid: u64, + pub p_realflag: u64, + pub p_nlwps: u64, + pub p_nrlwps: u64, + pub p_realstat: u64, + pub p_svuid: u32, + pub p_svgid: u32, + pub p_ename: [::c_char; KI_MAXEMULLEN as usize], + pub p_vm_vsize: i64, + pub p_vm_msize: i64, + } + + pub struct kinfo_lwp { + pub l_forw: u64, + pub l_back: u64, + pub l_laddr: u64, + pub l_addr: u64, + pub l_lid: i32, + pub l_flag: i32, + pub l_swtime: u32, + pub l_slptime: u32, + pub l_schedflags: i32, + pub l_holdcnt: i32, + pub l_priority: u8, + pub l_usrpri: u8, + pub l_stat: i8, + l_pad1: i8, + l_pad2: i32, + pub l_wmesg: [::c_char; KI_WMESGLEN as usize], + pub l_wchan: u64, + pub l_cpuid: u64, + pub l_rtime_sec: u32, + pub l_rtime_usec: u32, + pub l_cpticks: u32, + pub l_pctcpu: u32, + pub l_pid: u32, + pub l_name: [::c_char; KI_LNAMELEN as usize], + } + + pub struct kinfo_vmentry { + pub kve_start: u64, + pub kve_end: u64, + pub kve_offset: u64, + pub kve_type: u32, + pub kve_flags: u32, + pub kve_count: u32, + pub kve_wired_count: u32, + pub kve_advice: u32, + pub kve_attributes: u32, + pub kve_protection: u32, + pub kve_max_protection: u32, + pub kve_ref_count: u32, + pub kve_inheritance: u32, + pub kve_vn_fileid: u64, + pub kve_vn_size: u64, + pub kve_vn_fsid: u64, + pub kve_vn_rdev: u64, + pub kve_vn_type: u32, + pub kve_vn_mode: u32, + pub kve_path: [[::c_char; 32]; 32], + } + + pub struct __c_anonymous_posix_spawn_fae_open { + pub path: *mut ::c_char, + pub oflag: ::c_int, + pub mode: ::mode_t, + } + + pub struct __c_anonymous_posix_spawn_fae_dup2 { + pub newfildes: ::c_int, + } + + pub struct posix_spawnattr_t { + pub sa_flags: ::c_short, + pub sa_pgroup: ::pid_t, + pub sa_schedparam: ::sched_param, + pub sa_schedpolicy: ::c_int, + pub sa_sigdefault: sigset_t, + pub sa_sigmask: sigset_t, + } + + pub struct posix_spawn_file_actions_entry_t { + pub fae_action: fae_action, + pub fae_fildes: ::c_int, + #[cfg(libc_union)] + pub fae_data: __c_anonymous_posix_spawn_fae, + } + + pub struct posix_spawn_file_actions_t { + pub size: ::c_uint, + pub len: ::c_uint, + #[cfg(libc_union)] + pub fae: *mut posix_spawn_file_actions_entry_t, + } + + pub struct ptrace_lwpinfo { + pub pl_lwpid: lwpid_t, + pub pl_event: ::c_int, + } + + pub struct ptrace_lwpstatus { + pub pl_lwpid: lwpid_t, + pub pl_sigpend: sigset_t, + pub pl_sigmask: sigset_t, + pub pl_name: [::c_char; 20], + pub pl_private: *mut ::c_void, + } + + pub struct ptrace_siginfo { + pub psi_siginfo: siginfo_t, + pub psi_lwpid: lwpid_t, + } + + pub struct ptrace_event { + pub pe_set_event: ::c_int, + } + + pub struct sysctldesc { + pub descr_num: i32, + pub descr_ver: u32, + pub descr_len: u32, + pub descr_str: [::c_char; 1], + } + + pub struct ifreq { + pub _priv: [[::c_char; 6]; 24], + } + + pub struct ifconf { + pub ifc_len: ::c_int, + #[cfg(libc_union)] + pub ifc_ifcu: __c_anonymous_ifc_ifcu, + } + + pub struct tcp_info { + pub tcpi_state: u8, + pub __tcpi_ca_state: u8, + pub __tcpi_retransmits: u8, + pub __tcpi_probes: u8, + pub __tcpi_backoff: u8, + pub tcpi_options: u8, + pub tcp_snd_wscale: u8, + pub tcp_rcv_wscale: u8, + pub tcpi_rto: u32, + pub __tcpi_ato: u32, + pub tcpi_snd_mss: u32, + pub tcpi_rcv_mss: u32, + pub __tcpi_unacked: u32, + pub __tcpi_sacked: u32, + pub __tcpi_lost: u32, + pub __tcpi_retrans: u32, + pub __tcpi_fackets: u32, + pub __tcpi_last_data_sent: u32, + pub __tcpi_last_ack_sent: u32, + pub tcpi_last_data_recv: u32, + pub __tcpi_last_ack_recv: u32, + pub __tcpi_pmtu: u32, + pub __tcpi_rcv_ssthresh: u32, + pub tcpi_rtt: u32, + pub tcpi_rttvar: u32, + pub tcpi_snd_ssthresh: u32, + pub tcpi_snd_cwnd: u32, + pub __tcpi_advmss: u32, + pub __tcpi_reordering: u32, + pub __tcpi_rcv_rtt: u32, + pub tcpi_rcv_space: u32, + pub tcpi_snd_wnd: u32, + pub tcpi_snd_bwnd: u32, + pub tcpi_snd_nxt: u32, + pub tcpi_rcv_nxt: u32, + pub tcpi_toe_tid: u32, + pub tcpi_snd_rexmitpack: u32, + pub tcpi_rcv_ooopack: u32, + pub tcpi_snd_zerowin: u32, + pub __tcpi_pad: [u32; 26], + } +} + +s_no_extra_traits! { + + pub struct utmpx { + pub ut_name: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_host: [::c_char; _UTX_HOSTSIZE], + pub ut_session: u16, + pub ut_type: u16, + pub ut_pid: ::pid_t, + pub ut_exit: __exit_status, // FIXME: when anonymous struct are supported + pub ut_ss: sockaddr_storage, + pub ut_tv: ::timeval, + pub ut_pad: [u8; _UTX_PADSIZE], + } + + pub struct lastlogx { + pub ll_tv: ::timeval, + pub ll_line: [::c_char; _UTX_LINESIZE], + pub ll_host: [::c_char; _UTX_HOSTSIZE], + pub ll_ss: sockaddr_storage, + } + + pub struct in_pktinfo { + pub ipi_addr: ::in_addr, + pub ipi_ifindex: ::c_uint, + } + + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [i8; 8], + } + + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_reclen: u16, + pub d_namlen: u16, + pub d_type: u8, + pub d_name: [::c_char; 512], + } + + pub struct statvfs { + pub f_flag: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_iosize: ::c_ulong, + + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_bresvd: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fresvd: ::fsfilcnt_t, + + pub f_syncreads: u64, + pub f_syncwrites: u64, + + pub f_asyncreads: u64, + pub f_asyncwrites: u64, + + pub f_fsidx: ::fsid_t, + pub f_fsid: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_owner: ::uid_t, + + pub f_spare: [u32; 4], + + pub f_fstypename: [::c_char; 32], + pub f_mntonname: [::c_char; 1024], + pub f_mntfromname: [::c_char; 1024], + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: i64, + __ss_pad3: [u8; 112], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + __unused1: *mut ::c_void, //actually a function pointer + pub sigev_notify_attributes: *mut ::c_void + } + + #[cfg(libc_union)] + pub union __c_anonymous_posix_spawn_fae { + pub open: __c_anonymous_posix_spawn_fae_open, + pub dup2: __c_anonymous_posix_spawn_fae_dup2, + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifc_ifcu { + pub ifcu_buf: *mut ::c_void, + pub ifcu_req: *mut ifreq, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_name == other.ut_name + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_ss == other.ut_ss + && self + .ut_pad + .iter() + .zip(other.ut_pad.iter()) + .all(|(a,b)| a == b) + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_name", &self.ut_name) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + // FIXME .field("ut_host", &self.ut_host) + .field("ut_session", &self.ut_session) + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) + .field("ut_exit", &self.ut_exit) + .field("ut_ss", &self.ut_ss) + .field("ut_tv", &self.ut_tv) + // FIXME .field("ut_pad", &self.ut_pad) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_name.hash(state); + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_ss.hash(state); + self.ut_pad.hash(state); + } + } + + impl PartialEq for lastlogx { + fn eq(&self, other: &lastlogx) -> bool { + self.ll_tv == other.ll_tv + && self.ll_line == other.ll_line + && self.ll_ss == other.ll_ss + && self + .ll_host + .iter() + .zip(other.ll_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for lastlogx {} + + impl ::fmt::Debug for lastlogx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("lastlogx") + .field("ll_tv", &self.ll_tv) + .field("ll_line", &self.ll_line) + // FIXME.field("ll_host", &self.ll_host) + .field("ll_ss", &self.ll_ss) + .finish() + } + } + + impl ::hash::Hash for lastlogx { + fn hash(&self, state: &mut H) { + self.ll_tv.hash(state); + self.ll_line.hash(state); + self.ll_host.hash(state); + self.ll_ss.hash(state); + } + } + + impl PartialEq for in_pktinfo { + fn eq(&self, other: &in_pktinfo) -> bool { + self.ipi_addr == other.ipi_addr + && self.ipi_ifindex == other.ipi_ifindex + } + } + impl Eq for in_pktinfo {} + impl ::fmt::Debug for in_pktinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("in_pktinfo") + .field("ipi_addr", &self.ipi_addr) + .field("ipi_ifindex", &self.ipi_ifindex) + .finish() + } + } + impl ::hash::Hash for in_pktinfo { + fn hash(&self, state: &mut H) { + self.ipi_addr.hash(state); + self.ipi_ifindex.hash(state); + } + } + + impl PartialEq for arphdr { + fn eq(&self, other: &arphdr) -> bool { + self.ar_hrd == other.ar_hrd + && self.ar_pro == other.ar_pro + && self.ar_hln == other.ar_hln + && self.ar_pln == other.ar_pln + && self.ar_op == other.ar_op + } + } + impl Eq for arphdr {} + impl ::fmt::Debug for arphdr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let ar_hrd = self.ar_hrd; + let ar_pro = self.ar_pro; + let ar_op = self.ar_op; + f.debug_struct("arphdr") + .field("ar_hrd", &ar_hrd) + .field("ar_pro", &ar_pro) + .field("ar_hln", &self.ar_hln) + .field("ar_pln", &self.ar_pln) + .field("ar_op", &ar_op) + .finish() + } + } + impl ::hash::Hash for arphdr { + fn hash(&self, state: &mut H) { + let ar_hrd = self.ar_hrd; + let ar_pro = self.ar_pro; + let ar_op = self.ar_op; + ar_hrd.hash(state); + ar_pro.hash(state); + self.ar_hln.hash(state); + self.ar_pln.hash(state); + ar_op.hash(state); + } + } + + impl PartialEq for in_addr { + fn eq(&self, other: &in_addr) -> bool { + self.s_addr == other.s_addr + } + } + impl Eq for in_addr {} + impl ::fmt::Debug for in_addr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let s_addr = self.s_addr; + f.debug_struct("in_addr") + .field("s_addr", &s_addr) + .finish() + } + } + impl ::hash::Hash for in_addr { + fn hash(&self, state: &mut H) { + let s_addr = self.s_addr; + s_addr.hash(state); + } + } + + impl PartialEq for ip_mreq { + fn eq(&self, other: &ip_mreq) -> bool { + self.imr_multiaddr == other.imr_multiaddr + && self.imr_interface == other.imr_interface + } + } + impl Eq for ip_mreq {} + impl ::fmt::Debug for ip_mreq { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ip_mreq") + .field("imr_multiaddr", &self.imr_multiaddr) + .field("imr_interface", &self.imr_interface) + .finish() + } + } + impl ::hash::Hash for ip_mreq { + fn hash(&self, state: &mut H) { + self.imr_multiaddr.hash(state); + self.imr_interface.hash(state); + } + } + + impl PartialEq for sockaddr_in { + fn eq(&self, other: &sockaddr_in) -> bool { + self.sin_len == other.sin_len + && self.sin_family == other.sin_family + && self.sin_port == other.sin_port + && self.sin_addr == other.sin_addr + && self.sin_zero == other.sin_zero + } + } + impl Eq for sockaddr_in {} + impl ::fmt::Debug for sockaddr_in { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_in") + .field("sin_len", &self.sin_len) + .field("sin_family", &self.sin_family) + .field("sin_port", &self.sin_port) + .field("sin_addr", &self.sin_addr) + .field("sin_zero", &self.sin_zero) + .finish() + } + } + impl ::hash::Hash for sockaddr_in { + fn hash(&self, state: &mut H) { + self.sin_len.hash(state); + self.sin_family.hash(state); + self.sin_port.hash(state); + self.sin_addr.hash(state); + self.sin_zero.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_reclen == other.d_reclen + && self.d_namlen == other.d_namlen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_reclen", &self.d_reclen) + .field("d_namlen", &self.d_namlen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_reclen.hash(state); + self.d_namlen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for statvfs { + fn eq(&self, other: &statvfs) -> bool { + self.f_flag == other.f_flag + && self.f_bsize == other.f_bsize + && self.f_frsize == other.f_frsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_bresvd == other.f_bresvd + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_favail == other.f_favail + && self.f_fresvd == other.f_fresvd + && self.f_syncreads == other.f_syncreads + && self.f_syncwrites == other.f_syncwrites + && self.f_asyncreads == other.f_asyncreads + && self.f_asyncwrites == other.f_asyncwrites + && self.f_fsidx == other.f_fsidx + && self.f_fsid == other.f_fsid + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_spare == other.f_spare + && self.f_fstypename == other.f_fstypename + && self + .f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + && self + .f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for statvfs {} + impl ::fmt::Debug for statvfs { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("statvfs") + .field("f_flag", &self.f_flag) + .field("f_bsize", &self.f_bsize) + .field("f_frsize", &self.f_frsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_bresvd", &self.f_bresvd) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_favail", &self.f_favail) + .field("f_fresvd", &self.f_fresvd) + .field("f_syncreads", &self.f_syncreads) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_fsidx", &self.f_fsidx) + .field("f_fsid", &self.f_fsid) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_spare", &self.f_spare) + .field("f_fstypename", &self.f_fstypename) + // FIXME: .field("f_mntonname", &self.f_mntonname) + // FIXME: .field("f_mntfromname", &self.f_mntfromname) + .finish() + } + } + impl ::hash::Hash for statvfs { + fn hash(&self, state: &mut H) { + self.f_flag.hash(state); + self.f_bsize.hash(state); + self.f_frsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_bresvd.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_favail.hash(state); + self.f_fresvd.hash(state); + self.f_syncreads.hash(state); + self.f_syncwrites.hash(state); + self.f_asyncreads.hash(state); + self.f_asyncwrites.hash(state); + self.f_fsidx.hash(state); + self.f_fsid.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_spare.hash(state); + self.f_fstypename.hash(state); + self.f_mntonname.hash(state); + self.f_mntfromname.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + && self.__ss_pad1 == other.__ss_pad1 + && self.__ss_pad2 == other.__ss_pad2 + && self + .__ss_pad3 + .iter() + .zip(other.__ss_pad3.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_pad2", &self.__ss_pad2) + // FIXME: .field("__ss_pad3", &self.__ss_pad3) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_pad2.hash(state); + self.__ss_pad3.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.sigev_notify_attributes + == other.sigev_notify_attributes + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("sigev_notify_attributes", + &self.sigev_notify_attributes) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.sigev_notify_attributes.hash(state); + } + } + + #[cfg(libc_union)] + impl Eq for __c_anonymous_posix_spawn_fae {} + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_posix_spawn_fae { + fn eq(&self, other: &__c_anonymous_posix_spawn_fae) -> bool { + unsafe { + self.open == other.open + || self.dup2 == other.dup2 + } + } + } + + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_posix_spawn_fae { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous_posix_fae") + .field("open", &self.open) + .field("dup2", &self.dup2) + .finish() + } + } + } + + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_posix_spawn_fae { + fn hash(&self, state: &mut H) { + unsafe { + self.open.hash(state); + self.dup2.hash(state); + } + } + } + + #[cfg(libc_union)] + impl Eq for __c_anonymous_ifc_ifcu {} + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ifc_ifcu { + fn eq(&self, other: &__c_anonymous_ifc_ifcu) -> bool { + unsafe { + self.ifcu_buf == other.ifcu_buf + || self.ifcu_req == other.ifcu_req + } + } + } + + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifc_ifcu { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous_ifc_ifcu") + .field("ifcu_buf", &self.ifcu_buf) + .field("ifcu_req", &self.ifcu_req) + .finish() + } + } + } + + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ifc_ifcu { + fn hash(&self, state: &mut H) { + unsafe { + self.ifcu_buf.hash(state); + self.ifcu_req.hash(state); + } + } + } + } +} + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_REMOVEDIR: ::c_int = 0x800; + +pub const AT_NULL: ::c_int = 0; +pub const AT_IGNORE: ::c_int = 1; +pub const AT_EXECFD: ::c_int = 2; +pub const AT_PHDR: ::c_int = 3; +pub const AT_PHENT: ::c_int = 4; +pub const AT_PHNUM: ::c_int = 5; +pub const AT_PAGESZ: ::c_int = 6; +pub const AT_BASE: ::c_int = 7; +pub const AT_FLAGS: ::c_int = 8; +pub const AT_ENTRY: ::c_int = 9; +pub const AT_DCACHEBSIZE: ::c_int = 10; +pub const AT_ICACHEBSIZE: ::c_int = 11; +pub const AT_UCACHEBSIZE: ::c_int = 12; +pub const AT_STACKBASE: ::c_int = 13; +pub const AT_EUID: ::c_int = 2000; +pub const AT_RUID: ::c_int = 2001; +pub const AT_EGID: ::c_int = 2002; +pub const AT_RGID: ::c_int = 2003; +pub const AT_SUN_LDELF: ::c_int = 2004; +pub const AT_SUN_LDSHDR: ::c_int = 2005; +pub const AT_SUN_LDNAME: ::c_int = 2006; +pub const AT_SUN_LDPGSIZE: ::c_int = 2007; +pub const AT_SUN_PLATFORM: ::c_int = 2008; +pub const AT_SUN_HWCAP: ::c_int = 2009; +pub const AT_SUN_IFLUSH: ::c_int = 2010; +pub const AT_SUN_CPU: ::c_int = 2011; +pub const AT_SUN_EMUL_ENTRY: ::c_int = 2012; +pub const AT_SUN_EMUL_EXECFD: ::c_int = 2013; +pub const AT_SUN_EXECNAME: ::c_int = 2014; + +pub const EXTATTR_NAMESPACE_USER: ::c_int = 1; +pub const EXTATTR_NAMESPACE_SYSTEM: ::c_int = 2; + +pub const LC_COLLATE_MASK: ::c_int = 1 << ::LC_COLLATE; +pub const LC_CTYPE_MASK: ::c_int = 1 << ::LC_CTYPE; +pub const LC_MONETARY_MASK: ::c_int = 1 << ::LC_MONETARY; +pub const LC_NUMERIC_MASK: ::c_int = 1 << ::LC_NUMERIC; +pub const LC_TIME_MASK: ::c_int = 1 << ::LC_TIME; +pub const LC_MESSAGES_MASK: ::c_int = 1 << ::LC_MESSAGES; +pub const LC_ALL_MASK: ::c_int = !0; + +pub const ERA: ::nl_item = 52; +pub const ERA_D_FMT: ::nl_item = 53; +pub const ERA_D_T_FMT: ::nl_item = 54; +pub const ERA_T_FMT: ::nl_item = 55; +pub const ALT_DIGITS: ::nl_item = 56; + +pub const O_CLOEXEC: ::c_int = 0x400000; +pub const O_ALT_IO: ::c_int = 0x40000; +pub const O_NOSIGPIPE: ::c_int = 0x1000000; +pub const O_SEARCH: ::c_int = 0x800000; +pub const O_DIRECTORY: ::c_int = 0x200000; +pub const O_DIRECT: ::c_int = 0x00080000; +pub const O_RSYNC: ::c_int = 0x00020000; + +pub const MS_SYNC: ::c_int = 0x4; +pub const MS_INVALIDATE: ::c_int = 0x2; + +// Here because they are not present on OpenBSD +// (https://github.com/openbsd/src/blob/HEAD/sys/sys/resource.h) +pub const RLIMIT_SBSIZE: ::c_int = 9; +pub const RLIMIT_AS: ::c_int = 10; +pub const RLIMIT_NTHR: ::c_int = 11; + +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: ::c_int = 12; + +pub const EIDRM: ::c_int = 82; +pub const ENOMSG: ::c_int = 83; +pub const EOVERFLOW: ::c_int = 84; +pub const EILSEQ: ::c_int = 85; +pub const ENOTSUP: ::c_int = 86; +pub const ECANCELED: ::c_int = 87; +pub const EBADMSG: ::c_int = 88; +pub const ENODATA: ::c_int = 89; +pub const ENOSR: ::c_int = 90; +pub const ENOSTR: ::c_int = 91; +pub const ETIME: ::c_int = 92; +pub const ENOATTR: ::c_int = 93; +pub const EMULTIHOP: ::c_int = 94; +pub const ENOLINK: ::c_int = 95; +pub const EPROTO: ::c_int = 96; +pub const EOWNERDEAD: ::c_int = 97; +pub const ENOTRECOVERABLE: ::c_int = 98; +#[deprecated( + since = "0.2.143", + note = "This value will always match the highest defined error number \ + and thus is not stable. \ + See #3040 for more info." +)] +pub const ELAST: ::c_int = 98; + +pub const F_DUPFD_CLOEXEC: ::c_int = 12; +pub const F_CLOSEM: ::c_int = 10; +pub const F_GETNOSIGPIPE: ::c_int = 13; +pub const F_SETNOSIGPIPE: ::c_int = 14; +pub const F_MAXFD: ::c_int = 11; +pub const F_GETPATH: ::c_int = 15; + +pub const FUTEX_WAIT: ::c_int = 0; +pub const FUTEX_WAKE: ::c_int = 1; +pub const FUTEX_FD: ::c_int = 2; +pub const FUTEX_REQUEUE: ::c_int = 3; +pub const FUTEX_CMP_REQUEUE: ::c_int = 4; +pub const FUTEX_WAKE_OP: ::c_int = 5; +pub const FUTEX_LOCK_PI: ::c_int = 6; +pub const FUTEX_UNLOCK_PI: ::c_int = 7; +pub const FUTEX_TRYLOCK_PI: ::c_int = 8; +pub const FUTEX_WAIT_BITSET: ::c_int = 9; +pub const FUTEX_WAKE_BITSET: ::c_int = 10; +pub const FUTEX_WAIT_REQUEUE_PI: ::c_int = 11; +pub const FUTEX_CMP_REQUEUE_PI: ::c_int = 12; +pub const FUTEX_PRIVATE_FLAG: ::c_int = 1 << 7; +pub const FUTEX_CLOCK_REALTIME: ::c_int = 1 << 8; +pub const FUTEX_CMD_MASK: ::c_int = !(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME); +pub const FUTEX_WAITERS: u32 = 1 << 31; +pub const FUTEX_OWNER_DIED: u32 = 1 << 30; +pub const FUTEX_SYNCOBJ_1: u32 = 1 << 29; +pub const FUTEX_SYNCOBJ_0: u32 = 1 << 28; +pub const FUTEX_TID_MASK: u32 = (1 << 28) - 1; +pub const FUTEX_BITSET_MATCH_ANY: u32 = !0; + +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_SENDSRCADDR: ::c_int = IP_RECVDSTADDR; +pub const IP_RECVIF: ::c_int = 20; +pub const IP_PKTINFO: ::c_int = 25; +pub const IP_RECVPKTINFO: ::c_int = 26; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const TCP_KEEPIDLE: ::c_int = 3; +pub const TCP_KEEPINTVL: ::c_int = 5; +pub const TCP_KEEPCNT: ::c_int = 6; +pub const TCP_KEEPINIT: ::c_int = 7; +pub const TCP_INFO: ::c_int = 9; +pub const TCP_MD5SIG: ::c_int = 0x10; +pub const TCP_CONGCTL: ::c_int = 0x20; + +pub const SOCK_CONN_DGRAM: ::c_int = 6; +pub const SOCK_DCCP: ::c_int = SOCK_CONN_DGRAM; +pub const SOCK_NOSIGPIPE: ::c_int = 0x40000000; +pub const SOCK_FLAGS_MASK: ::c_int = 0xf0000000; + +pub const SO_SNDTIMEO: ::c_int = 0x100b; +pub const SO_RCVTIMEO: ::c_int = 0x100c; +pub const SO_ACCEPTFILTER: ::c_int = 0x1000; +pub const SO_TIMESTAMP: ::c_int = 0x2000; +pub const SO_OVERFLOWED: ::c_int = 0x1009; +pub const SO_NOHEADER: ::c_int = 0x100a; + +// http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/un.h?annotate +pub const LOCAL_OCREDS: ::c_int = 0x0001; // pass credentials to receiver +pub const LOCAL_CONNWAIT: ::c_int = 0x0002; // connects block until accepted +pub const LOCAL_PEEREID: ::c_int = 0x0003; // get peer identification +pub const LOCAL_CREDS: ::c_int = 0x0004; // pass credentials to receiver + +// https://github.com/NetBSD/src/blob/trunk/sys/net/if.h#L373 +pub const IFF_UP: ::c_int = 0x0001; // interface is up +pub const IFF_BROADCAST: ::c_int = 0x0002; // broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x0004; // turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x0008; // is a loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x0010; // interface is point-to-point link +pub const IFF_NOTRAILERS: ::c_int = 0x0020; // avoid use of trailers +pub const IFF_RUNNING: ::c_int = 0x0040; // resources allocated +pub const IFF_NOARP: ::c_int = 0x0080; // no address resolution protocol +pub const IFF_PROMISC: ::c_int = 0x0100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x0200; // receive all multicast packets +pub const IFF_OACTIVE: ::c_int = 0x0400; // transmission in progress +pub const IFF_SIMPLEX: ::c_int = 0x0800; // can't hear own transmissions +pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + +// sys/netinet/in.h +// Protocols (RFC 1700) +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// Hop-by-hop option header +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// gateway^2 (deprecated) +pub const IPPROTO_GGP: ::c_int = 3; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +// IPPROTO_UDP defined in src/unix/mod.rs +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// DCCP +pub const IPPROTO_DCCP: ::c_int = 33; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +/// IP Mobility RFC 2004 +pub const IPPROTO_MOBILE: ::c_int = 55; +/// IPv6 ICMP +pub const IPPROTO_IPV6_ICMP: ::c_int = 58; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +/// ISO cnlp +pub const IPPROTO_EON: ::c_int = 80; +/// Ethernet-in-IP +pub const IPPROTO_ETHERIP: ::c_int = 97; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// Protocol indep. multicast +pub const IPPROTO_PIM: ::c_int = 103; +/// IP Payload Comp. Protocol +pub const IPPROTO_IPCOMP: ::c_int = 108; +/// VRRP RFC 2338 +pub const IPPROTO_VRRP: ::c_int = 112; +/// Common Address Resolution Protocol +pub const IPPROTO_CARP: ::c_int = 112; +/// L2TPv3 +pub const IPPROTO_L2TP: ::c_int = 115; +/// SCTP +pub const IPPROTO_SCTP: ::c_int = 132; +/// PFSYNC +pub const IPPROTO_PFSYNC: ::c_int = 240; +pub const IPPROTO_MAX: ::c_int = 256; + +/// last return value of *_input(), meaning "all job for this pkt is done". +pub const IPPROTO_DONE: ::c_int = 257; + +/// sysctl placeholder for (FAST_)IPSEC +pub const CTL_IPPROTO_IPSEC: ::c_int = 258; + +pub const AF_OROUTE: ::c_int = 17; +pub const AF_ARP: ::c_int = 28; +pub const pseudo_AF_KEY: ::c_int = 29; +pub const pseudo_AF_HDRCMPLT: ::c_int = 30; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_IEEE80211: ::c_int = 32; +pub const AF_MPLS: ::c_int = 33; +pub const AF_ROUTE: ::c_int = 34; +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_OOOIFLIST: ::c_int = 3; +pub const NET_RT_OOIFLIST: ::c_int = 4; +pub const NET_RT_OIFLIST: ::c_int = 5; +pub const NET_RT_IFLIST: ::c_int = 6; +pub const NET_RT_MAXID: ::c_int = 7; + +pub const PF_OROUTE: ::c_int = AF_OROUTE; +pub const PF_ARP: ::c_int = AF_ARP; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_ROUTE: ::c_int = AF_ROUTE; + +pub const MSG_NBIO: ::c_int = 0x1000; +pub const MSG_WAITFORONE: ::c_int = 0x2000; +pub const MSG_NOTIFICATION: ::c_int = 0x4000; + +pub const SCM_TIMESTAMP: ::c_int = 0x08; +pub const SCM_CREDS: ::c_int = 0x10; + +pub const O_DSYNC: ::c_int = 0x10000; + +pub const MAP_RENAME: ::c_int = 0x20; +pub const MAP_NORESERVE: ::c_int = 0x40; +pub const MAP_HASSEMAPHORE: ::c_int = 0x200; +pub const MAP_WIRED: ::c_int = 0x800; +pub const MAP_STACK: ::c_int = 0x2000; +// map alignment aliases for MAP_ALIGNED +pub const MAP_ALIGNMENT_SHIFT: ::c_int = 24; +pub const MAP_ALIGNMENT_MASK: ::c_int = 0xff << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_64KB: ::c_int = 16 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_16MB: ::c_int = 24 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_4GB: ::c_int = 32 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_1TB: ::c_int = 40 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_256TB: ::c_int = 48 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNMENT_64PB: ::c_int = 56 << MAP_ALIGNMENT_SHIFT; +// mremap flag +pub const MAP_REMAPDUP: ::c_int = 0x004; + +pub const DCCP_TYPE_REQUEST: ::c_int = 0; +pub const DCCP_TYPE_RESPONSE: ::c_int = 1; +pub const DCCP_TYPE_DATA: ::c_int = 2; +pub const DCCP_TYPE_ACK: ::c_int = 3; +pub const DCCP_TYPE_DATAACK: ::c_int = 4; +pub const DCCP_TYPE_CLOSEREQ: ::c_int = 5; +pub const DCCP_TYPE_CLOSE: ::c_int = 6; +pub const DCCP_TYPE_RESET: ::c_int = 7; +pub const DCCP_TYPE_MOVE: ::c_int = 8; + +pub const DCCP_FEATURE_CC: ::c_int = 1; +pub const DCCP_FEATURE_ECN: ::c_int = 2; +pub const DCCP_FEATURE_ACKRATIO: ::c_int = 3; +pub const DCCP_FEATURE_ACKVECTOR: ::c_int = 4; +pub const DCCP_FEATURE_MOBILITY: ::c_int = 5; +pub const DCCP_FEATURE_LOSSWINDOW: ::c_int = 6; +pub const DCCP_FEATURE_CONN_NONCE: ::c_int = 8; +pub const DCCP_FEATURE_IDENTREG: ::c_int = 7; + +pub const DCCP_OPT_PADDING: ::c_int = 0; +pub const DCCP_OPT_DATA_DISCARD: ::c_int = 1; +pub const DCCP_OPT_SLOW_RECV: ::c_int = 2; +pub const DCCP_OPT_BUF_CLOSED: ::c_int = 3; +pub const DCCP_OPT_CHANGE_L: ::c_int = 32; +pub const DCCP_OPT_CONFIRM_L: ::c_int = 33; +pub const DCCP_OPT_CHANGE_R: ::c_int = 34; +pub const DCCP_OPT_CONFIRM_R: ::c_int = 35; +pub const DCCP_OPT_INIT_COOKIE: ::c_int = 36; +pub const DCCP_OPT_NDP_COUNT: ::c_int = 37; +pub const DCCP_OPT_ACK_VECTOR0: ::c_int = 38; +pub const DCCP_OPT_ACK_VECTOR1: ::c_int = 39; +pub const DCCP_OPT_RECV_BUF_DROPS: ::c_int = 40; +pub const DCCP_OPT_TIMESTAMP: ::c_int = 41; +pub const DCCP_OPT_TIMESTAMP_ECHO: ::c_int = 42; +pub const DCCP_OPT_ELAPSEDTIME: ::c_int = 43; +pub const DCCP_OPT_DATACHECKSUM: ::c_int = 44; + +pub const DCCP_REASON_UNSPEC: ::c_int = 0; +pub const DCCP_REASON_CLOSED: ::c_int = 1; +pub const DCCP_REASON_INVALID: ::c_int = 2; +pub const DCCP_REASON_OPTION_ERR: ::c_int = 3; +pub const DCCP_REASON_FEA_ERR: ::c_int = 4; +pub const DCCP_REASON_CONN_REF: ::c_int = 5; +pub const DCCP_REASON_BAD_SNAME: ::c_int = 6; +pub const DCCP_REASON_BAD_COOKIE: ::c_int = 7; +pub const DCCP_REASON_INV_MOVE: ::c_int = 8; +pub const DCCP_REASON_UNANSW_CH: ::c_int = 10; +pub const DCCP_REASON_FRUITLESS_NEG: ::c_int = 11; + +pub const DCCP_CCID: ::c_int = 1; +pub const DCCP_CSLEN: ::c_int = 2; +pub const DCCP_MAXSEG: ::c_int = 4; +pub const DCCP_SERVICE: ::c_int = 8; + +pub const DCCP_NDP_LIMIT: ::c_int = 16; +pub const DCCP_SEQ_NUM_LIMIT: ::c_int = 16777216; +pub const DCCP_MAX_OPTIONS: ::c_int = 32; +pub const DCCP_MAX_PKTS: ::c_int = 100; + +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; +pub const _PC_NO_TRUNC: ::c_int = 8; +pub const _PC_VDISABLE: ::c_int = 9; +pub const _PC_SYNC_IO: ::c_int = 10; +pub const _PC_FILESIZEBITS: ::c_int = 11; +pub const _PC_SYMLINK_MAX: ::c_int = 12; +pub const _PC_2_SYMLINKS: ::c_int = 13; +pub const _PC_ACL_EXTENDED: ::c_int = 14; +pub const _PC_MIN_HOLE_SIZE: ::c_int = 15; + +pub const _SC_SYNCHRONIZED_IO: ::c_int = 31; +pub const _SC_IOV_MAX: ::c_int = 32; +pub const _SC_MAPPED_FILES: ::c_int = 33; +pub const _SC_MEMLOCK: ::c_int = 34; +pub const _SC_MEMLOCK_RANGE: ::c_int = 35; +pub const _SC_MEMORY_PROTECTION: ::c_int = 36; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 37; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 38; +pub const _SC_CLK_TCK: ::c_int = 39; +pub const _SC_ATEXIT_MAX: ::c_int = 40; +pub const _SC_THREADS: ::c_int = 41; +pub const _SC_SEMAPHORES: ::c_int = 42; +pub const _SC_BARRIERS: ::c_int = 43; +pub const _SC_TIMERS: ::c_int = 44; +pub const _SC_SPIN_LOCKS: ::c_int = 45; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 46; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 47; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 48; +pub const _SC_CLOCK_SELECTION: ::c_int = 49; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 50; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 51; +pub const _SC_AIO_MAX: ::c_int = 52; +pub const _SC_MESSAGE_PASSING: ::c_int = 53; +pub const _SC_MQ_OPEN_MAX: ::c_int = 54; +pub const _SC_MQ_PRIO_MAX: ::c_int = 55; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 56; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 57; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 58; +pub const _SC_THREAD_STACK_MIN: ::c_int = 59; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 60; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 61; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 62; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 63; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 64; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 65; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 66; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 67; +pub const _SC_TTY_NAME_MAX: ::c_int = 68; +pub const _SC_HOST_NAME_MAX: ::c_int = 69; +pub const _SC_PASS_MAX: ::c_int = 70; +pub const _SC_REGEXP: ::c_int = 71; +pub const _SC_SHELL: ::c_int = 72; +pub const _SC_SYMLOOP_MAX: ::c_int = 73; +pub const _SC_V6_ILP32_OFF32: ::c_int = 74; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 75; +pub const _SC_V6_LP64_OFF64: ::c_int = 76; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 77; +pub const _SC_2_PBS: ::c_int = 80; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 81; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 82; +pub const _SC_2_PBS_LOCATE: ::c_int = 83; +pub const _SC_2_PBS_MESSAGE: ::c_int = 84; +pub const _SC_2_PBS_TRACK: ::c_int = 85; +pub const _SC_SPAWN: ::c_int = 86; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 87; +pub const _SC_TIMER_MAX: ::c_int = 88; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 89; +pub const _SC_CPUTIME: ::c_int = 90; +pub const _SC_THREAD_CPUTIME: ::c_int = 91; +pub const _SC_DELAYTIMER_MAX: ::c_int = 92; +// These two variables will be supported in NetBSD 8.0 +// pub const _SC_SIGQUEUE_MAX : ::c_int = 93; +// pub const _SC_REALTIME_SIGNALS : ::c_int = 94; +pub const _SC_PHYS_PAGES: ::c_int = 121; +pub const _SC_NPROCESSORS_CONF: ::c_int = 1001; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 1002; +pub const _SC_SCHED_RT_TS: ::c_int = 2001; +pub const _SC_SCHED_PRI_MIN: ::c_int = 2002; +pub const _SC_SCHED_PRI_MAX: ::c_int = 2003; + +pub const FD_SETSIZE: usize = 0x100; + +pub const ST_NOSUID: ::c_ulong = 8; + +pub const BIOCGRSIG: ::c_ulong = 0x40044272; +pub const BIOCSRSIG: ::c_ulong = 0x80044273; +pub const BIOCSDLT: ::c_ulong = 0x80044278; +pub const BIOCGSEESENT: ::c_ulong = 0x40044276; +pub const BIOCSSEESENT: ::c_ulong = 0x80044277; + +// +pub const MNT_UNION: ::c_int = 0x00000020; +pub const MNT_NOCOREDUMP: ::c_int = 0x00008000; +pub const MNT_RELATIME: ::c_int = 0x00020000; +pub const MNT_IGNORE: ::c_int = 0x00100000; +pub const MNT_NFS4ACLS: ::c_int = 0x00200000; +pub const MNT_DISCARD: ::c_int = 0x00800000; +pub const MNT_EXTATTR: ::c_int = 0x01000000; +pub const MNT_LOG: ::c_int = 0x02000000; +pub const MNT_NOATIME: ::c_int = 0x04000000; +pub const MNT_AUTOMOUNTED: ::c_int = 0x10000000; +pub const MNT_SYMPERM: ::c_int = 0x20000000; +pub const MNT_NODEVMTIME: ::c_int = 0x40000000; +pub const MNT_SOFTDEP: ::c_int = 0x80000000; +pub const MNT_POSIX1EACLS: ::c_int = 0x00000800; +pub const MNT_ACLS: ::c_int = MNT_POSIX1EACLS; + +// +pub const NTP_API: ::c_int = 4; +pub const MAXPHASE: ::c_long = 500000000; +pub const MAXFREQ: ::c_long = 500000; +pub const MINSEC: ::c_int = 256; +pub const MAXSEC: ::c_int = 2048; +pub const NANOSECOND: ::c_long = 1000000000; +pub const SCALE_PPM: ::c_int = 65; +pub const MAXTC: ::c_int = 10; +pub const MOD_OFFSET: ::c_uint = 0x0001; +pub const MOD_FREQUENCY: ::c_uint = 0x0002; +pub const MOD_MAXERROR: ::c_uint = 0x0004; +pub const MOD_ESTERROR: ::c_uint = 0x0008; +pub const MOD_STATUS: ::c_uint = 0x0010; +pub const MOD_TIMECONST: ::c_uint = 0x0020; +pub const MOD_PPSMAX: ::c_uint = 0x0040; +pub const MOD_TAI: ::c_uint = 0x0080; +pub const MOD_MICRO: ::c_uint = 0x1000; +pub const MOD_NANO: ::c_uint = 0x2000; +pub const MOD_CLKB: ::c_uint = 0x4000; +pub const MOD_CLKA: ::c_uint = 0x8000; +pub const STA_PLL: ::c_int = 0x0001; +pub const STA_PPSFREQ: ::c_int = 0x0002; +pub const STA_PPSTIME: ::c_int = 0x0004; +pub const STA_FLL: ::c_int = 0x0008; +pub const STA_INS: ::c_int = 0x0010; +pub const STA_DEL: ::c_int = 0x0020; +pub const STA_UNSYNC: ::c_int = 0x0040; +pub const STA_FREQHOLD: ::c_int = 0x0080; +pub const STA_PPSSIGNAL: ::c_int = 0x0100; +pub const STA_PPSJITTER: ::c_int = 0x0200; +pub const STA_PPSWANDER: ::c_int = 0x0400; +pub const STA_PPSERROR: ::c_int = 0x0800; +pub const STA_CLOCKERR: ::c_int = 0x1000; +pub const STA_NANO: ::c_int = 0x2000; +pub const STA_MODE: ::c_int = 0x4000; +pub const STA_CLK: ::c_int = 0x8000; +pub const STA_RONLY: ::c_int = STA_PPSSIGNAL + | STA_PPSJITTER + | STA_PPSWANDER + | STA_PPSERROR + | STA_CLOCKERR + | STA_NANO + | STA_MODE + | STA_CLK; +pub const TIME_OK: ::c_int = 0; +pub const TIME_INS: ::c_int = 1; +pub const TIME_DEL: ::c_int = 2; +pub const TIME_OOP: ::c_int = 3; +pub const TIME_WAIT: ::c_int = 4; +pub const TIME_ERROR: ::c_int = 5; + +pub const LITTLE_ENDIAN: ::c_int = 1234; +pub const BIG_ENDIAN: ::c_int = 4321; + +pub const PL_EVENT_NONE: ::c_int = 0; +pub const PL_EVENT_SIGNAL: ::c_int = 1; +pub const PL_EVENT_SUSPENDED: ::c_int = 2; + +cfg_if! { + if #[cfg(any(target_arch = "sparc", target_arch = "sparc64", + target_arch = "x86", target_arch = "x86_64"))] { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t + = pthread_mutex_t { + ptm_magic: 0x33330003, + ptm_errorcheck: 0, + ptm_pad1: [0; 3], + ptm_unused: 0, + ptm_pad2: [0; 3], + ptm_waiters: 0 as *mut _, + ptm_owner: 0, + ptm_recursed: 0, + ptm_spare2: 0 as *mut _, + }; + } else { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t + = pthread_mutex_t { + ptm_magic: 0x33330003, + ptm_errorcheck: 0, + ptm_unused: 0, + ptm_waiters: 0 as *mut _, + ptm_owner: 0, + ptm_recursed: 0, + ptm_spare2: 0 as *mut _, + }; + } +} + +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + ptc_magic: 0x55550005, + ptc_lock: 0, + ptc_waiters_first: 0 as *mut _, + ptc_waiters_last: 0 as *mut _, + ptc_mutex: 0 as *mut _, + ptc_private: 0 as *mut _, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + ptr_magic: 0x99990009, + ptr_interlock: 0, + ptr_rblocked_first: 0 as *mut _, + ptr_rblocked_last: 0 as *mut _, + ptr_wblocked_first: 0 as *mut _, + ptr_wblocked_last: 0 as *mut _, + ptr_nreaders: 0, + ptr_owner: 0, + ptr_private: 0 as *mut _, +}; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +pub const SCHED_NONE: ::c_int = -1; +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; + +pub const EVFILT_AIO: u32 = 2; +pub const EVFILT_PROC: u32 = 4; +pub const EVFILT_READ: u32 = 0; +pub const EVFILT_SIGNAL: u32 = 5; +pub const EVFILT_TIMER: u32 = 6; +pub const EVFILT_VNODE: u32 = 3; +pub const EVFILT_WRITE: u32 = 1; +pub const EVFILT_FS: u32 = 7; +pub const EVFILT_USER: u32 = 8; +pub const EVFILT_EMPTY: u32 = 9; + +pub const EV_ADD: u32 = 0x1; +pub const EV_DELETE: u32 = 0x2; +pub const EV_ENABLE: u32 = 0x4; +pub const EV_DISABLE: u32 = 0x8; +pub const EV_ONESHOT: u32 = 0x10; +pub const EV_CLEAR: u32 = 0x20; +pub const EV_RECEIPT: u32 = 0x40; +pub const EV_DISPATCH: u32 = 0x80; +pub const EV_FLAG1: u32 = 0x2000; +pub const EV_ERROR: u32 = 0x4000; +pub const EV_EOF: u32 = 0x8000; +pub const EV_SYSFLAGS: u32 = 0xf000; + +pub const NOTE_TRIGGER: u32 = 0x01000000; +pub const NOTE_FFNOP: u32 = 0x00000000; +pub const NOTE_FFAND: u32 = 0x40000000; +pub const NOTE_FFOR: u32 = 0x80000000; +pub const NOTE_FFCOPY: u32 = 0xc0000000; +pub const NOTE_FFCTRLMASK: u32 = 0xc0000000; +pub const NOTE_FFLAGSMASK: u32 = 0x00ffffff; +pub const NOTE_LOWAT: u32 = 0x00000001; +pub const NOTE_DELETE: u32 = 0x00000001; +pub const NOTE_WRITE: u32 = 0x00000002; +pub const NOTE_EXTEND: u32 = 0x00000004; +pub const NOTE_ATTRIB: u32 = 0x00000008; +pub const NOTE_LINK: u32 = 0x00000010; +pub const NOTE_RENAME: u32 = 0x00000020; +pub const NOTE_REVOKE: u32 = 0x00000040; +pub const NOTE_EXIT: u32 = 0x80000000; +pub const NOTE_FORK: u32 = 0x40000000; +pub const NOTE_EXEC: u32 = 0x20000000; +pub const NOTE_PDATAMASK: u32 = 0x000fffff; +pub const NOTE_PCTRLMASK: u32 = 0xf0000000; +pub const NOTE_TRACK: u32 = 0x00000001; +pub const NOTE_TRACKERR: u32 = 0x00000002; +pub const NOTE_CHILD: u32 = 0x00000004; +pub const NOTE_MSECONDS: u32 = 0x00000000; +pub const NOTE_SECONDS: u32 = 0x00000001; +pub const NOTE_USECONDS: u32 = 0x00000002; +pub const NOTE_NSECONDS: u32 = 0x00000003; +pub const NOTE_ABSTIME: u32 = 0x000000010; + +pub const TMP_MAX: ::c_uint = 308915776; + +pub const AI_PASSIVE: ::c_int = 0x00000001; +pub const AI_CANONNAME: ::c_int = 0x00000002; +pub const AI_NUMERICHOST: ::c_int = 0x00000004; +pub const AI_NUMERICSERV: ::c_int = 0x00000008; +pub const AI_ADDRCONFIG: ::c_int = 0x00000400; +pub const AI_SRV: ::c_int = 0x00000800; + +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const NI_MAXSERV: ::socklen_t = 32; + +pub const NI_NOFQDN: ::c_int = 0x00000001; +pub const NI_NUMERICHOST: ::c_int = 0x000000002; +pub const NI_NAMEREQD: ::c_int = 0x000000004; +pub const NI_NUMERICSERV: ::c_int = 0x000000008; +pub const NI_DGRAM: ::c_int = 0x00000010; +pub const NI_WITHSCOPEID: ::c_int = 0x00000020; +pub const NI_NUMERICSCOPE: ::c_int = 0x00000040; + +pub const RTLD_NOLOAD: ::c_int = 0x2000; +pub const RTLD_LOCAL: ::c_int = 0x200; + +pub const CTL_MAXNAME: ::c_int = 12; +pub const SYSCTL_NAMELEN: ::c_int = 32; +pub const SYSCTL_DEFSIZE: ::c_int = 8; +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_STRUCT: ::c_int = 5; +pub const CTLTYPE_BOOL: ::c_int = 6; +pub const CTLFLAG_READONLY: ::c_int = 0x00000000; +pub const CTLFLAG_READWRITE: ::c_int = 0x00000070; +pub const CTLFLAG_ANYWRITE: ::c_int = 0x00000080; +pub const CTLFLAG_PRIVATE: ::c_int = 0x00000100; +pub const CTLFLAG_PERMANENT: ::c_int = 0x00000200; +pub const CTLFLAG_OWNDATA: ::c_int = 0x00000400; +pub const CTLFLAG_IMMEDIATE: ::c_int = 0x00000800; +pub const CTLFLAG_HEX: ::c_int = 0x00001000; +pub const CTLFLAG_ROOT: ::c_int = 0x00002000; +pub const CTLFLAG_ANYNUMBER: ::c_int = 0x00004000; +pub const CTLFLAG_HIDDEN: ::c_int = 0x00008000; +pub const CTLFLAG_ALIAS: ::c_int = 0x00010000; +pub const CTLFLAG_MMAP: ::c_int = 0x00020000; +pub const CTLFLAG_OWNDESC: ::c_int = 0x00040000; +pub const CTLFLAG_UNSIGNED: ::c_int = 0x00080000; +pub const SYSCTL_VERS_MASK: ::c_int = 0xff000000; +pub const SYSCTL_VERS_0: ::c_int = 0x00000000; +pub const SYSCTL_VERS_1: ::c_int = 0x01000000; +pub const SYSCTL_VERSION: ::c_int = SYSCTL_VERS_1; +pub const CTL_EOL: ::c_int = -1; +pub const CTL_QUERY: ::c_int = -2; +pub const CTL_CREATE: ::c_int = -3; +pub const CTL_CREATESYM: ::c_int = -4; +pub const CTL_DESTROY: ::c_int = -5; +pub const CTL_MMAP: ::c_int = -6; +pub const CTL_DESCRIBE: ::c_int = -7; +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_DDB: ::c_int = 9; +pub const CTL_PROC: ::c_int = 10; +pub const CTL_VENDOR: ::c_int = 11; +pub const CTL_EMUL: ::c_int = 12; +pub const CTL_SECURITY: ::c_int = 13; +pub const CTL_MAXID: ::c_int = 14; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_VNODE: ::c_int = 13; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_OBOOTTIME: ::c_int = 21; +pub const KERN_DOMAINNAME: ::c_int = 22; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_RAWPARTITION: ::c_int = 24; +pub const KERN_NTPTIME: ::c_int = 25; +pub const KERN_TIMEX: ::c_int = 26; +pub const KERN_AUTONICETIME: ::c_int = 27; +pub const KERN_AUTONICEVAL: ::c_int = 28; +pub const KERN_RTC_OFFSET: ::c_int = 29; +pub const KERN_ROOT_DEVICE: ::c_int = 30; +pub const KERN_MSGBUFSIZE: ::c_int = 31; +pub const KERN_FSYNC: ::c_int = 32; +pub const KERN_OLDSYSVMSG: ::c_int = 33; +pub const KERN_OLDSYSVSEM: ::c_int = 34; +pub const KERN_OLDSYSVSHM: ::c_int = 35; +pub const KERN_OLDSHORTCORENAME: ::c_int = 36; +pub const KERN_SYNCHRONIZED_IO: ::c_int = 37; +pub const KERN_IOV_MAX: ::c_int = 38; +pub const KERN_MBUF: ::c_int = 39; +pub const KERN_MAPPED_FILES: ::c_int = 40; +pub const KERN_MEMLOCK: ::c_int = 41; +pub const KERN_MEMLOCK_RANGE: ::c_int = 42; +pub const KERN_MEMORY_PROTECTION: ::c_int = 43; +pub const KERN_LOGIN_NAME_MAX: ::c_int = 44; +pub const KERN_DEFCORENAME: ::c_int = 45; +pub const KERN_LOGSIGEXIT: ::c_int = 46; +pub const KERN_PROC2: ::c_int = 47; +pub const KERN_PROC_ARGS: ::c_int = 48; +pub const KERN_FSCALE: ::c_int = 49; +pub const KERN_CCPU: ::c_int = 50; +pub const KERN_CP_TIME: ::c_int = 51; +pub const KERN_OLDSYSVIPC_INFO: ::c_int = 52; +pub const KERN_MSGBUF: ::c_int = 53; +pub const KERN_CONSDEV: ::c_int = 54; +pub const KERN_MAXPTYS: ::c_int = 55; +pub const KERN_PIPE: ::c_int = 56; +pub const KERN_MAXPHYS: ::c_int = 57; +pub const KERN_SBMAX: ::c_int = 58; +pub const KERN_TKSTAT: ::c_int = 59; +pub const KERN_MONOTONIC_CLOCK: ::c_int = 60; +pub const KERN_URND: ::c_int = 61; +pub const KERN_LABELSECTOR: ::c_int = 62; +pub const KERN_LABELOFFSET: ::c_int = 63; +pub const KERN_LWP: ::c_int = 64; +pub const KERN_FORKFSLEEP: ::c_int = 65; +pub const KERN_POSIX_THREADS: ::c_int = 66; +pub const KERN_POSIX_SEMAPHORES: ::c_int = 67; +pub const KERN_POSIX_BARRIERS: ::c_int = 68; +pub const KERN_POSIX_TIMERS: ::c_int = 69; +pub const KERN_POSIX_SPIN_LOCKS: ::c_int = 70; +pub const KERN_POSIX_READER_WRITER_LOCKS: ::c_int = 71; +pub const KERN_DUMP_ON_PANIC: ::c_int = 72; +pub const KERN_SOMAXKVA: ::c_int = 73; +pub const KERN_ROOT_PARTITION: ::c_int = 74; +pub const KERN_DRIVERS: ::c_int = 75; +pub const KERN_BUF: ::c_int = 76; +pub const KERN_FILE2: ::c_int = 77; +pub const KERN_VERIEXEC: ::c_int = 78; +pub const KERN_CP_ID: ::c_int = 79; +pub const KERN_HARDCLOCK_TICKS: ::c_int = 80; +pub const KERN_ARND: ::c_int = 81; +pub const KERN_SYSVIPC: ::c_int = 82; +pub const KERN_BOOTTIME: ::c_int = 83; +pub const KERN_EVCNT: ::c_int = 84; +pub const KERN_MAXID: ::c_int = 85; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_GID: ::c_int = 7; +pub const KERN_PROC_RGID: ::c_int = 8; +pub const KERN_PROC_ARGV: ::c_int = 1; +pub const KERN_PROC_NARGV: ::c_int = 2; +pub const KERN_PROC_ENV: ::c_int = 3; +pub const KERN_PROC_NENV: ::c_int = 4; +pub const KERN_PROC_PATHNAME: ::c_int = 5; +pub const VM_PROC: ::c_int = 16; +pub const VM_PROC_MAP: ::c_int = 1; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const AIO_CANCELED: ::c_int = 1; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const AIO_ALLDONE: ::c_int = 3; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_READ: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 1; +pub const LIO_NOWAIT: ::c_int = 0; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const WSTOPPED: ::c_int = 0x00000002; // same as WUNTRACED +pub const WCONTINUED: ::c_int = 0x00000010; +pub const WEXITED: ::c_int = 0x000000020; +pub const WNOWAIT: ::c_int = 0x00010000; + +pub const WALTSIG: ::c_int = 0x00000004; +pub const WALLSIG: ::c_int = 0x00000008; +pub const WTRAPPED: ::c_int = 0x00000040; +pub const WNOZOMBIE: ::c_int = 0x00020000; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 4; + +pub const UTIME_OMIT: c_long = 1073741822; +pub const UTIME_NOW: c_long = 1073741823; + +pub const B460800: ::speed_t = 460800; +pub const B921600: ::speed_t = 921600; + +pub const ONOCR: ::tcflag_t = 0x20; +pub const ONLRET: ::tcflag_t = 0x40; +pub const CDTRCTS: ::tcflag_t = 0x00020000; +pub const CHWFLOW: ::tcflag_t = ::MDMBUF | ::CRTSCTS | ::CDTRCTS; + +// pub const _PATH_UTMPX: &[::c_char; 14] = b"/var/run/utmpx"; +// pub const _PATH_WTMPX: &[::c_char; 14] = b"/var/log/wtmpx"; +// pub const _PATH_LASTLOGX: &[::c_char; 17] = b"/var/log/lastlogx"; +// pub const _PATH_UTMP_UPDATE: &[::c_char; 24] = b"/usr/libexec/utmp_update"; +pub const UT_NAMESIZE: usize = 8; +pub const UT_LINESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 16; +pub const _UTX_USERSIZE: usize = 32; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_PADSIZE: usize = 40; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 256; +pub const EMPTY: u16 = 0; +pub const RUN_LVL: u16 = 1; +pub const BOOT_TIME: u16 = 2; +pub const OLD_TIME: u16 = 3; +pub const NEW_TIME: u16 = 4; +pub const INIT_PROCESS: u16 = 5; +pub const LOGIN_PROCESS: u16 = 6; +pub const USER_PROCESS: u16 = 7; +pub const DEAD_PROCESS: u16 = 8; +pub const ACCOUNTING: u16 = 9; +pub const SIGNATURE: u16 = 10; +pub const DOWN_TIME: u16 = 11; + +pub const SOCK_CLOEXEC: ::c_int = 0x10000000; +pub const SOCK_NONBLOCK: ::c_int = 0x20000000; + +// Uncomment on next NetBSD release +// pub const FIOSEEKDATA: ::c_ulong = 0xc0086661; +// pub const FIOSEEKHOLE: ::c_ulong = 0xc0086662; +pub const OFIOGETBMAP: ::c_ulong = 0xc004667a; +pub const FIOGETBMAP: ::c_ulong = 0xc008667a; +pub const FIONWRITE: ::c_ulong = 0x40046679; +pub const FIONSPACE: ::c_ulong = 0x40046678; +pub const FIBMAP: ::c_ulong = 0xc008667a; + +pub const SIGSTKSZ: ::size_t = 40960; + +pub const REG_ENOSYS: ::c_int = 17; + +pub const PT_DUMPCORE: ::c_int = 12; +pub const PT_LWPINFO: ::c_int = 13; +pub const PT_SYSCALL: ::c_int = 14; +pub const PT_SYSCALLEMU: ::c_int = 15; +pub const PT_SET_EVENT_MASK: ::c_int = 16; +pub const PT_GET_EVENT_MASK: ::c_int = 17; +pub const PT_GET_PROCESS_STATE: ::c_int = 18; +pub const PT_SET_SIGINFO: ::c_int = 19; +pub const PT_GET_SIGINFO: ::c_int = 20; +pub const PT_RESUME: ::c_int = 21; +pub const PT_SUSPEND: ::c_int = 23; +pub const PT_STOP: ::c_int = 23; +pub const PT_LWPSTATUS: ::c_int = 24; +pub const PT_LWPNEXT: ::c_int = 25; +pub const PT_SET_SIGPASS: ::c_int = 26; +pub const PT_GET_SIGPASS: ::c_int = 27; +pub const PT_FIRSTMACH: ::c_int = 32; + +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x01; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x02; +pub const POSIX_SPAWN_SETSCHEDPARAM: ::c_int = 0x04; +pub const POSIX_SPAWN_SETSCHEDULER: ::c_int = 0x08; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x10; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x20; +pub const POSIX_SPAWN_RETURNERROR: ::c_int = 0x40; + +// Flags for chflags(2) +pub const SF_APPEND: ::c_ulong = 0x00040000; +pub const SF_ARCHIVED: ::c_ulong = 0x00010000; +pub const SF_IMMUTABLE: ::c_ulong = 0x00020000; +pub const SF_LOG: ::c_ulong = 0x00400000; +pub const SF_SETTABLE: ::c_ulong = 0xffff0000; +pub const SF_SNAPINVAL: ::c_ulong = 0x00800000; +pub const SF_SNAPSHOT: ::c_ulong = 0x00200000; +pub const UF_APPEND: ::c_ulong = 0x00000004; +pub const UF_IMMUTABLE: ::c_ulong = 0x00000002; +pub const UF_NODUMP: ::c_ulong = 0x00000001; +pub const UF_OPAQUE: ::c_ulong = 0x00000008; +pub const UF_SETTABLE: ::c_ulong = 0x0000ffff; + +// sys/sysctl.h +pub const KVME_PROT_READ: ::c_int = 0x00000001; +pub const KVME_PROT_WRITE: ::c_int = 0x00000002; +pub const KVME_PROT_EXEC: ::c_int = 0x00000004; + +pub const KVME_FLAG_COW: ::c_int = 0x00000001; +pub const KVME_FLAG_NEEDS_COPY: ::c_int = 0x00000002; +pub const KVME_FLAG_NOCOREDUMP: ::c_int = 0x000000004; +pub const KVME_FLAG_PAGEABLE: ::c_int = 0x000000008; +pub const KVME_FLAG_GROWS_UP: ::c_int = 0x000000010; +pub const KVME_FLAG_GROWS_DOWN: ::c_int = 0x000000020; + +pub const NGROUPS_MAX: ::c_int = 16; + +pub const KI_NGROUPS: ::c_int = 16; +pub const KI_MAXCOMLEN: ::c_int = 24; +pub const KI_WMESGLEN: ::c_int = 8; +pub const KI_MAXLOGNAME: ::c_int = 24; +pub const KI_MAXEMULLEN: ::c_int = 16; +pub const KI_LNAMELEN: ::c_int = 20; + +// sys/lwp.h +pub const LSIDL: ::c_int = 1; +pub const LSRUN: ::c_int = 2; +pub const LSSLEEP: ::c_int = 3; +pub const LSSTOP: ::c_int = 4; +pub const LSZOMB: ::c_int = 5; +pub const LSONPROC: ::c_int = 7; +pub const LSSUSPENDED: ::c_int = 8; + +pub const _REG_RDI: ::c_int = 0; +pub const _REG_RSI: ::c_int = 1; +pub const _REG_RDX: ::c_int = 2; +pub const _REG_RCX: ::c_int = 3; +pub const _REG_R8: ::c_int = 4; +pub const _REG_R9: ::c_int = 5; +pub const _REG_R10: ::c_int = 6; +pub const _REG_R11: ::c_int = 7; +pub const _REG_R12: ::c_int = 8; +pub const _REG_R13: ::c_int = 9; +pub const _REG_R14: ::c_int = 10; +pub const _REG_R15: ::c_int = 11; +pub const _REG_RBP: ::c_int = 12; +pub const _REG_RBX: ::c_int = 13; +pub const _REG_RAX: ::c_int = 14; +pub const _REG_GS: ::c_int = 15; +pub const _REG_FS: ::c_int = 16; +pub const _REG_ES: ::c_int = 17; +pub const _REG_DS: ::c_int = 18; +pub const _REG_TRAPNO: ::c_int = 19; +pub const _REG_ERR: ::c_int = 20; +pub const _REG_RIP: ::c_int = 21; +pub const _REG_CS: ::c_int = 22; +pub const _REG_RFLAGS: ::c_int = 23; +pub const _REG_RSP: ::c_int = 24; +pub const _REG_SS: ::c_int = 25; + +// sys/xattr.h +pub const XATTR_CREATE: ::c_int = 0x01; +pub const XATTR_REPLACE: ::c_int = 0x02; +// sys/extattr.h +pub const EXTATTR_NAMESPACE_EMPTY: ::c_int = 0; + +// For getrandom() +pub const GRND_NONBLOCK: ::c_uint = 0x1; +pub const GRND_RANDOM: ::c_uint = 0x2; +pub const GRND_INSECURE: ::c_uint = 0x4; + +cfg_if! { + + if #[cfg(libc_const_extern_fn)] { + pub const fn MAP_ALIGNED(alignment: ::c_int) -> ::c_int { + alignment << MAP_ALIGNMENT_SHIFT + } + } else { + pub fn MAP_ALIGNED(alignment: ::c_int) -> ::c_int { + alignment << MAP_ALIGNMENT_SHIFT + } + } +} + +const_fn! { + {const} fn _ALIGN(p: usize) -> usize { + (p + _ALIGNBYTES) & !_ALIGNBYTES + } +} + +f! { + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + _ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + + _ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (_ALIGN(::mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize)) + as ::c_uint + } + + // dirfd() is a macro on netbsd to access + // the first field of the struct where dirp points to: + // http://cvsweb.netbsd.org/bsdweb.cgi/src/include/dirent.h?rev=1.36 + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int { + *(dirp as *const ::c_int) + } + + pub fn SOCKCREDSIZE(ngrps: usize) -> usize { + let ngrps = if ngrps > 0 { + ngrps - 1 + } else { + 0 + }; + ::mem::size_of::() + ::mem::size_of::<::gid_t>() * ngrps + } + + pub fn PROT_MPROTECT(x: ::c_int) -> ::c_int { + x << 3 + } + + pub fn PROT_MPROTECT_EXTRACT(x: ::c_int) -> ::c_int { + (x >> 3) & 0x7 + } + + pub fn major(dev: ::dev_t) -> ::c_int { + (((dev as u32) & 0x000fff00) >> 8) as ::c_int + } + + pub fn minor(dev: ::dev_t) -> ::c_int { + let mut res = 0; + res |= ((dev as u32) & 0xfff00000) >> 12; + res |= (dev as u32) & 0x000000ff; + res as ::c_int + } +} + +safe_f! { + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0o177) == 0o177 + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= (major << 8) & 0x000ff00; + dev |= (minor << 12) & 0xfff00000; + dev |= minor & 0xff; + dev + } +} + +extern "C" { + pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; + pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + + pub fn reallocarr(ptr: *mut ::c_void, number: ::size_t, size: ::size_t) -> ::c_int; + + pub fn chflags(path: *const ::c_char, flags: ::c_ulong) -> ::c_int; + pub fn fchflags(fd: ::c_int, flags: ::c_ulong) -> ::c_int; + pub fn lchflags(path: *const ::c_char, flags: ::c_ulong) -> ::c_int; + + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + + pub fn extattr_list_fd( + fd: ::c_int, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_list_file( + path: *const ::c_char, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_list_link( + path: *const ::c_char, + attrnamespace: ::c_int, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_delete_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_delete_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_delete_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + ) -> ::c_int; + pub fn extattr_get_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_get_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_get_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *mut ::c_void, + nbytes: ::size_t, + ) -> ::ssize_t; + pub fn extattr_namespace_to_string( + attrnamespace: ::c_int, + string: *mut *mut ::c_char, + ) -> ::c_int; + pub fn extattr_set_fd( + fd: ::c_int, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::c_int; + pub fn extattr_set_file( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::c_int; + pub fn extattr_set_link( + path: *const ::c_char, + attrnamespace: ::c_int, + attrname: *const ::c_char, + data: *const ::c_void, + nbytes: ::size_t, + ) -> ::c_int; + pub fn extattr_string_to_namespace( + string: *const ::c_char, + attrnamespace: *mut ::c_int, + ) -> ::c_int; + + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut ::termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut ::termios, + winp: *mut ::winsize, + ) -> ::pid_t; + + #[link_name = "__lutimes50"] + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + #[link_name = "__gettimeofday50"] + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn sysctl( + name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn sysctlbyname( + name: *const ::c_char, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *const ::c_void, + newlen: ::size_t, + ) -> ::c_int; + #[link_name = "__kevent50"] + pub fn kevent( + kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::size_t, + eventlist: *mut ::kevent, + nevents: ::size_t, + timeout: *const ::timespec, + ) -> ::c_int; + #[link_name = "__mount50"] + pub fn mount( + src: *const ::c_char, + target: *const ::c_char, + flags: ::c_int, + data: *mut ::c_void, + size: ::size_t, + ) -> ::c_int; + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_notify(mqd: ::mqd_t, notification: *const ::sigevent) -> ::c_int; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; + #[link_name = "__mq_timedreceive50"] + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + #[link_name = "__mq_timedsend50"] + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn ptrace(request: ::c_int, pid: ::pid_t, addr: *mut ::c_void, data: ::c_int) -> ::c_int; + pub fn utrace(label: *const ::c_char, addr: *mut ::c_void, len: ::size_t) -> ::c_int; + pub fn pthread_getname_np(t: ::pthread_t, name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_setname_np( + t: ::pthread_t, + name: *const ::c_char, + arg: *const ::c_void, + ) -> ::c_int; + pub fn pthread_attr_get_np(thread: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_getattr_np(native: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_getaffinity_np( + thread: ::pthread_t, + size: ::size_t, + set: *mut cpuset_t, + ) -> ::c_int; + pub fn pthread_setaffinity_np( + thread: ::pthread_t, + size: ::size_t, + set: *mut cpuset_t, + ) -> ::c_int; + + pub fn _cpuset_create() -> *mut cpuset_t; + pub fn _cpuset_destroy(set: *mut cpuset_t); + pub fn _cpuset_clr(cpu: cpuid_t, set: *mut cpuset_t) -> ::c_int; + pub fn _cpuset_set(cpu: cpuid_t, set: *mut cpuset_t) -> ::c_int; + pub fn _cpuset_isset(cpu: cpuid_t, set: *const cpuset_t) -> ::c_int; + pub fn _cpuset_size(set: *const cpuset_t) -> ::size_t; + pub fn _cpuset_zero(set: *mut cpuset_t); + #[link_name = "__sigtimedwait50"] + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn waitid( + idtype: idtype_t, + id: ::id_t, + infop: *mut ::siginfo_t, + options: ::c_int, + ) -> ::c_int; + + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn localeconv_l(loc: ::locale_t) -> *mut lconv; + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + #[link_name = "__settimeofday50"] + pub fn settimeofday(tv: *const ::timeval, tz: *const ::c_void) -> ::c_int; + + pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int; + + pub fn kqueue1(flags: ::c_int) -> ::c_int; + + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn _lwp_self() -> lwpid_t; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + + // link.h + + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + + // dlfcn.h + + pub fn _dlauxinfo() -> *mut ::c_void; + + pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; + + pub fn timer_create( + clockid: ::clockid_t, + sevp: *mut ::sigevent, + timerid: *mut ::timer_t, + ) -> ::c_int; + pub fn timer_delete(timerid: ::timer_t) -> ::c_int; + pub fn timer_getoverrun(timerid: ::timer_t) -> ::c_int; + pub fn timer_gettime(timerid: ::timer_t, curr_value: *mut ::itimerspec) -> ::c_int; + pub fn timer_settime( + timerid: ::timer_t, + flags: ::c_int, + new_value: *const ::itimerspec, + old_value: *mut ::itimerspec, + ) -> ::c_int; + + // Added in `NetBSD` 7.0 + pub fn explicit_memset(b: *mut ::c_void, c: ::c_int, len: ::size_t); + pub fn consttime_memequal(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int; + + pub fn setproctitle(fmt: *const ::c_char, ...); + pub fn mremap( + oldp: *mut ::c_void, + oldsize: ::size_t, + newp: *mut ::c_void, + newsize: ::size_t, + flags: ::c_int, + ) -> *mut ::c_void; + + pub fn sched_rr_get_interval(pid: ::pid_t, t: *mut ::timespec) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + + #[link_name = "__pollts50"] + pub fn pollts( + fds: *mut ::pollfd, + nfds: ::nfds_t, + ts: *const ::timespec, + sigmask: *const ::sigset_t, + ) -> ::c_int; + pub fn ppoll( + fds: *mut ::pollfd, + nfds: ::nfds_t, + ts: *const ::timespec, + sigmask: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_getschedpolicy( + attr: *const posix_spawnattr_t, + flags: *mut ::c_int, + ) -> ::c_int; + pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; + pub fn posix_spawnattr_getschedparam( + attr: *const posix_spawnattr_t, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_setschedparam( + attr: *mut posix_spawnattr_t, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; +} + +#[link(name = "rt")] +extern "C" { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + #[link_name = "__aio_suspend50"] + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; +} + +#[link(name = "util")] +extern "C" { + #[cfg_attr(target_os = "netbsd", link_name = "__getpwent_r50")] + pub fn getpwent_r( + pwd: *mut ::passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::passwd, + ) -> ::c_int; + pub fn getgrent_r( + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + + pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int; + pub fn getlastlogx(fname: *const ::c_char, uid: ::uid_t, ll: *mut lastlogx) -> *mut lastlogx; + pub fn updlastlogx(fname: *const ::c_char, uid: ::uid_t, ll: *mut lastlogx) -> ::c_int; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + + pub fn getutmp(ux: *const utmpx, u: *mut utmp); + pub fn getutmpx(u: *const utmp, ux: *mut utmpx); + + pub fn utpname(file: *const ::c_char) -> ::c_int; + pub fn setutent(); + pub fn endutent(); + pub fn getutent() -> *mut utmp; + + pub fn efopen(p: *const ::c_char, m: *const ::c_char) -> ::FILE; + pub fn emalloc(n: ::size_t) -> *mut ::c_void; + pub fn ecalloc(n: ::size_t, c: ::size_t) -> *mut ::c_void; + pub fn erealloc(p: *mut ::c_void, n: ::size_t) -> *mut ::c_void; + pub fn ereallocarr(p: *mut ::c_void, n: ::size_t, s: ::size_t); + pub fn estrdup(s: *const ::c_char) -> *mut ::c_char; + pub fn estrndup(s: *const ::c_char, len: ::size_t) -> *mut ::c_char; + pub fn estrlcpy(dst: *mut ::c_char, src: *const ::c_char, len: ::size_t) -> ::size_t; + pub fn estrlcat(dst: *mut ::c_char, src: *const ::c_char, len: ::size_t) -> ::size_t; + pub fn estrtoi( + nptr: *const ::c_char, + base: ::c_int, + lo: ::intmax_t, + hi: ::intmax_t, + ) -> ::intmax_t; + pub fn estrtou( + nptr: *const ::c_char, + base: ::c_int, + lo: ::uintmax_t, + hi: ::uintmax_t, + ) -> ::uintmax_t; + pub fn easprintf(string: *mut *mut ::c_char, fmt: *const ::c_char, ...) -> ::c_int; + pub fn evasprintf(string: *mut *mut ::c_char, fmt: *const ::c_char, ...) -> ::c_int; + pub fn esetfunc( + cb: ::Option, + ) -> ::Option; + pub fn secure_path(path: *const ::c_char) -> ::c_int; + pub fn snprintb( + buf: *mut ::c_char, + buflen: ::size_t, + fmt: *const ::c_char, + val: u64, + ) -> ::c_int; + pub fn snprintb_m( + buf: *mut ::c_char, + buflen: ::size_t, + fmt: *const ::c_char, + val: u64, + max: ::size_t, + ) -> ::c_int; + + pub fn getbootfile() -> *const ::c_char; + pub fn getbyteorder() -> ::c_int; + pub fn getdiskrawname( + buf: *mut ::c_char, + buflen: ::size_t, + name: *const ::c_char, + ) -> *const ::c_char; + pub fn getdiskcookedname( + buf: *mut ::c_char, + buflen: ::size_t, + name: *const ::c_char, + ) -> *const ::c_char; + pub fn getfsspecname( + buf: *mut ::c_char, + buflen: ::size_t, + spec: *const ::c_char, + ) -> *const ::c_char; + + pub fn strpct( + buf: *mut ::c_char, + bufsiz: ::size_t, + numerator: ::uintmax_t, + denominator: ::uintmax_t, + precision: ::size_t, + ) -> *mut ::c_char; + pub fn strspct( + buf: *mut ::c_char, + bufsiz: ::size_t, + numerator: ::intmax_t, + denominator: ::intmax_t, + precision: ::size_t, + ) -> *mut ::c_char; + #[link_name = "__login50"] + pub fn login(ut: *const utmp); + #[link_name = "__loginx50"] + pub fn loginx(ut: *const utmpx); + pub fn logout(line: *const ::c_char); + pub fn logoutx(line: *const ::c_char, status: ::c_int, tpe: ::c_int); + pub fn logwtmp(line: *const ::c_char, name: *const ::c_char, host: *const ::c_char); + pub fn logwtmpx( + line: *const ::c_char, + name: *const ::c_char, + host: *const ::c_char, + status: ::c_int, + tpe: ::c_int, + ); + + pub fn getxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn lgetxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn fgetxattr( + filedes: ::c_int, + name: *const ::c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn setxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *const ::c_void, + size: ::size_t, + ) -> ::c_int; + pub fn lsetxattr( + path: *const ::c_char, + name: *const ::c_char, + value: *const ::c_void, + size: ::size_t, + ) -> ::c_int; + pub fn fsetxattr( + filedes: ::c_int, + name: *const ::c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn listxattr(path: *const ::c_char, list: *mut ::c_char, size: ::size_t) -> ::ssize_t; + pub fn llistxattr(path: *const ::c_char, list: *mut ::c_char, size: ::size_t) -> ::ssize_t; + pub fn flistxattr(filedes: ::c_int, list: *mut ::c_char, size: ::size_t) -> ::ssize_t; + pub fn removexattr(path: *const ::c_char, name: *const ::c_char) -> ::c_int; + pub fn lremovexattr(path: *const ::c_char, name: *const ::c_char) -> ::c_int; + pub fn fremovexattr(fd: ::c_int, path: *const ::c_char, name: *const ::c_char) -> ::c_int; + + pub fn string_to_flags( + string_p: *mut *mut ::c_char, + setp: *mut ::c_ulong, + clrp: *mut ::c_ulong, + ) -> ::c_int; + pub fn flags_to_string(flags: ::c_ulong, def: *const ::c_char) -> ::c_int; + + pub fn kinfo_getvmmap(pid: ::pid_t, cntp: *mut ::size_t) -> *mut kinfo_vmentry; +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(target_arch = "sparc64")] { + mod sparc64; + pub use self::sparc64::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/powerpc.rs new file mode 100644 index 0000000..e12fd5e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/powerpc.rs @@ -0,0 +1,21 @@ +use PT_FIRSTMACH; + +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = u8; +pub type __cpu_simple_lock_nv_t = ::c_int; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_double>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0; +pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1; +pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/sparc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/sparc64.rs new file mode 100644 index 0000000..6a86759 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/sparc64.rs @@ -0,0 +1,8 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; +pub type __cpu_simple_lock_nv_t = ::c_uchar; + +// should be pub(crate), but that requires Rust 1.18.0 +#[doc(hidden)] +pub const _ALIGNBYTES: usize = 0xf; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86.rs new file mode 100644 index 0000000..daa89a1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86.rs @@ -0,0 +1,15 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = i8; +pub type __cpu_simple_lock_nv_t = ::c_uchar; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86_64.rs new file mode 100644 index 0000000..2f6e445 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/netbsd/x86_64.rs @@ -0,0 +1,40 @@ +use PT_FIRSTMACH; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; +pub type c___greg_t = u64; +pub type __cpu_simple_lock_nv_t = ::c_uchar; + +s! { + pub struct mcontext_t { + pub __gregs: [c___greg_t; 26], + pub _mc_tlsbase: c___greg_t, + pub __fpregs: [[::c_char;32]; 16], + } + + pub struct ucontext_t { + pub uc_flags: ::c_uint, + pub uc_link: *mut ::ucontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: ::mcontext_t, + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0; +pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1; +pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2; +pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 3; +pub const PT_SETFPREGS: ::c_int = PT_FIRSTMACH + 4; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/aarch64.rs new file mode 100644 index 0000000..2bc82e4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/aarch64.rs @@ -0,0 +1,30 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = u8; +pub type ucontext_t = sigcontext; + +s! { + pub struct sigcontext { + __sc_unused: ::c_int, + pub sc_mask: ::c_int, + pub sc_sp: ::c_ulong, + pub sc_lr: ::c_ulong, + pub sc_elr: ::c_ulong, + pub sc_spsr: ::c_ulong, + pub sc_x: [::c_ulong; 30], + pub sc_cookie: ::c_long, + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/arm.rs new file mode 100644 index 0000000..f1ab365 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/arm.rs @@ -0,0 +1,16 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = u8; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_double>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mips64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mips64.rs new file mode 100644 index 0000000..15803ce --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mips64.rs @@ -0,0 +1,8 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; + +#[doc(hidden)] +pub const _ALIGNBYTES: usize = 7; + +pub const _MAX_PAGE_SHIFT: u32 = 14; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs new file mode 100644 index 0000000..7fe81b3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -0,0 +1,1988 @@ +use unix::bsd::O_SYNC; + +pub type clock_t = i64; +pub type suseconds_t = ::c_long; +pub type dev_t = i32; +pub type sigset_t = ::c_uint; +pub type blksize_t = i32; +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type idtype_t = ::c_uint; +pub type pthread_attr_t = *mut ::c_void; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; +pub type pthread_rwlockattr_t = *mut ::c_void; +pub type pthread_spinlock_t = ::uintptr_t; +pub type caddr_t = *mut ::c_char; + +// elf.h + +pub type Elf32_Addr = u32; +pub type Elf32_Half = u16; +pub type Elf32_Lword = u64; +pub type Elf32_Off = u32; +pub type Elf32_Sword = i32; +pub type Elf32_Word = u32; + +pub type Elf64_Addr = u64; +pub type Elf64_Half = u16; +pub type Elf64_Lword = u64; +pub type Elf64_Off = u64; +pub type Elf64_Sword = i32; +pub type Elf64_Sxword = i64; +pub type Elf64_Word = u32; +pub type Elf64_Xword = u64; + +// search.h + +pub type ENTRY = entry; +pub type ACTION = ::c_uint; + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + type Elf_Addr = Elf64_Addr; + type Elf_Half = Elf64_Half; + type Elf_Phdr = Elf64_Phdr; + } else if #[cfg(target_pointer_width = "32")] { + type Elf_Addr = Elf32_Addr; + type Elf_Half = Elf32_Half; + type Elf_Phdr = Elf32_Phdr; + } +} + +s! { + pub struct ip_mreqn { + pub imr_multiaddr: in_addr, + pub imr_address: in_addr, + pub imr_ifindex: ::c_int, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::size_t, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_pathv: *mut *mut ::c_char, + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct ufs_args { + pub fspec: *mut ::c_char, + pub export_info: export_args, + } + + pub struct mfs_args { + pub fspec: *mut ::c_char, + pub export_info: export_args, + // https://github.com/openbsd/src/blob/HEAD/sys/sys/types.h#L134 + pub base: *mut ::c_char, + pub size: ::c_ulong, + } + + pub struct iso_args { + pub fspec: *mut ::c_char, + pub export_info: export_args, + pub flags: ::c_int, + pub sess: ::c_int, + } + + pub struct nfs_args { + pub version: ::c_int, + pub addr: *mut ::sockaddr, + pub addrlen: ::c_int, + pub sotype: ::c_int, + pub proto: ::c_int, + pub fh: *mut ::c_uchar, + pub fhsize: ::c_int, + pub flags: ::c_int, + pub wsize: ::c_int, + pub rsize: ::c_int, + pub readdirsize: ::c_int, + pub timeo: ::c_int, + pub retrans: ::c_int, + pub maxgrouplist: ::c_int, + pub readahead: ::c_int, + pub leaseterm: ::c_int, + pub deadthresh: ::c_int, + pub hostname: *mut ::c_char, + pub acregmin: ::c_int, + pub acregmax: ::c_int, + pub acdirmin: ::c_int, + pub acdirmax: ::c_int, + } + + pub struct msdosfs_args { + pub fspec: *mut ::c_char, + pub export_info: export_args, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mask: ::mode_t, + pub flags: ::c_int, + } + + pub struct ntfs_args { + pub fspec: *mut ::c_char, + pub export_info: export_args, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub mode: ::mode_t, + pub flag: ::c_ulong, + } + + pub struct udf_args { + pub fspec: *mut ::c_char, + pub lastblock: u32, + } + + pub struct tmpfs_args { + pub ta_version: ::c_int, + pub ta_nodes_max: ::ino_t, + pub ta_size_max: ::off_t, + pub ta_root_uid: ::uid_t, + pub ta_root_gid: ::gid_t, + pub ta_root_mode: ::mode_t, + } + + pub struct fusefs_args { + pub name: *mut ::c_char, + pub fd: ::c_int, + pub max_read: ::c_int, + pub allow_other: ::c_int, + } + + pub struct xucred { + pub cr_uid: ::uid_t, + pub cr_gid: ::gid_t, + pub cr_ngroups: ::c_short, + //https://github.com/openbsd/src/blob/HEAD/sys/sys/syslimits.h#L44 + pub cr_groups: [::gid_t; 16], + } + + pub struct export_args { + pub ex_flags: ::c_int, + pub ex_root: ::uid_t, + pub ex_anon: xucred, + pub ex_addr: *mut ::sockaddr, + pub ex_addrlen: ::c_int, + pub ex_mask: *mut ::sockaddr, + pub ex_masklen: ::c_int, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [i8; 8], + } + + pub struct splice { + pub sp_fd: ::c_int, + pub sp_max: ::off_t, + pub sp_idle: ::timeval, + } + + pub struct kevent { + pub ident: ::uintptr_t, + pub filter: ::c_short, + pub flags: ::c_ushort, + pub fflags: ::c_uint, + pub data: i64, + pub udata: *mut ::c_void, + } + + pub struct stat { + pub st_mode: ::mode_t, + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_size: ::off_t, + pub st_blocks: ::blkcnt_t, + pub st_blksize: ::blksize_t, + pub st_flags: u32, + pub st_gen: u32, + pub st_birthtime: ::time_t, + pub st_birthtime_nsec: ::c_long, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_addr: *mut ::sockaddr, + pub ai_canonname: *mut ::c_char, + pub ai_next: *mut ::addrinfo, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct if_data { + pub ifi_type: ::c_uchar, + pub ifi_addrlen: ::c_uchar, + pub ifi_hdrlen: ::c_uchar, + pub ifi_link_state: ::c_uchar, + pub ifi_mtu: u32, + pub ifi_metric: u32, + pub ifi_rdomain: u32, + pub ifi_baudrate: u64, + pub ifi_ipackets: u64, + pub ifi_ierrors: u64, + pub ifi_opackets: u64, + pub ifi_oerrors: u64, + pub ifi_collisions: u64, + pub ifi_ibytes: u64, + pub ifi_obytes: u64, + pub ifi_imcasts: u64, + pub ifi_omcasts: u64, + pub ifi_iqdrops: u64, + pub ifi_oqdrops: u64, + pub ifi_noproto: u64, + pub ifi_capabilities: u32, + pub ifi_lastchange: ::timeval, + } + + pub struct if_msghdr { + pub ifm_msglen: ::c_ushort, + pub ifm_version: ::c_uchar, + pub ifm_type: ::c_uchar, + pub ifm_hdrlen: ::c_ushort, + pub ifm_index: ::c_ushort, + pub ifm_tableid: ::c_ushort, + pub ifm_pad1: ::c_uchar, + pub ifm_pad2: ::c_uchar, + pub ifm_addrs: ::c_int, + pub ifm_flags: ::c_int, + pub ifm_xflags: ::c_int, + pub ifm_data: if_data, + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::c_uchar, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 24], + } + + pub struct sockpeercred { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub pid: ::pid_t, + } + + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::c_int, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::c_short, + pub shm_atime: ::time_t, + __shm_atimensec: c_long, + pub shm_dtime: ::time_t, + __shm_dtimensec: c_long, + pub shm_ctime: ::time_t, + __shm_ctimensec: c_long, + pub shm_internal: *mut ::c_void, + } + + // elf.h + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + // link.h + + pub struct dl_phdr_info { + pub dlpi_addr: Elf_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const Elf_Phdr, + pub dlpi_phnum: Elf_Half, + } + + // sys/sysctl.h + pub struct kinfo_proc { + pub p_forw: u64, + pub p_back: u64, + pub p_paddr: u64, + pub p_addr: u64, + pub p_fd: u64, + pub p_stats: u64, + pub p_limit: u64, + pub p_vmspace: u64, + pub p_sigacts: u64, + pub p_sess: u64, + pub p_tsess: u64, + pub p_ru: u64, + pub p_eflag: i32, + pub p_exitsig: i32, + pub p_flag: i32, + pub p_pid: i32, + pub p_ppid: i32, + pub p_sid: i32, + pub p__pgid: i32, + pub p_tpgid: i32, + pub p_uid: u32, + pub p_ruid: u32, + pub p_gid: u32, + pub p_rgid: u32, + pub p_groups: [u32; KI_NGROUPS as usize], + pub p_ngroups: i16, + pub p_jobc: i16, + pub p_tdev: u32, + pub p_estcpu: u32, + pub p_rtime_sec: u32, + pub p_rtime_usec: u32, + pub p_cpticks: i32, + pub p_pctcpu: u32, + pub p_swtime: u32, + pub p_slptime: u32, + pub p_schedflags: i32, + pub p_uticks: u64, + pub p_sticks: u64, + pub p_iticks: u64, + pub p_tracep: u64, + pub p_traceflag: i32, + pub p_holdcnt: i32, + pub p_siglist: i32, + pub p_sigmask: u32, + pub p_sigignore: u32, + pub p_sigcatch: u32, + pub p_stat: i8, + pub p_priority: u8, + pub p_usrpri: u8, + pub p_nice: u8, + pub p_xstat: u16, + pub p_spare: u16, + pub p_comm: [::c_char; KI_MAXCOMLEN as usize], + pub p_wmesg: [::c_char; KI_WMESGLEN as usize], + pub p_wchan: u64, + pub p_login: [::c_char; KI_MAXLOGNAME as usize], + pub p_vm_rssize: i32, + pub p_vm_tsize: i32, + pub p_vm_dsize: i32, + pub p_vm_ssize: i32, + pub p_uvalid: i64, + pub p_ustart_sec: u64, + pub p_ustart_usec: u32, + pub p_uutime_sec: u32, + pub p_uutime_usec: u32, + pub p_ustime_sec: u32, + pub p_ustime_usec: u32, + pub p_uru_maxrss: u64, + pub p_uru_ixrss: u64, + pub p_uru_idrss: u64, + pub p_uru_isrss: u64, + pub p_uru_minflt: u64, + pub p_uru_majflt: u64, + pub p_uru_nswap: u64, + pub p_uru_inblock: u64, + pub p_uru_oublock: u64, + pub p_uru_msgsnd: u64, + pub p_uru_msgrcv: u64, + pub p_uru_nsignals: u64, + pub p_uru_nvcsw: u64, + pub p_uru_nivcsw: u64, + pub p_uctime_sec: u32, + pub p_uctime_usec: u32, + pub p_psflags: u32, + pub p_acflag: u32, + pub p_svuid: u32, + pub p_svgid: u32, + pub p_emul: [::c_char; KI_EMULNAMELEN as usize], + pub p_rlim_rss_cur: u64, + pub p_cpuid: u64, + pub p_vm_map_size: u64, + pub p_tid: i32, + pub p_rtableid: u32, + pub p_pledge: u64, + pub p_name: [::c_char; KI_MAXCOMLEN as usize], + } + + pub struct kinfo_vmentry { + pub kve_start: ::c_ulong, + pub kve_end: ::c_ulong, + pub kve_guard: ::c_ulong, + pub kve_fspace: ::c_ulong, + pub kve_fspace_augment: ::c_ulong, + pub kve_offset: u64, + pub kve_wired_count: ::c_int, + pub kve_etype: ::c_int, + pub kve_protection: ::c_int, + pub kve_max_protection: ::c_int, + pub kve_advice: ::c_int, + pub kve_inheritance: ::c_int, + pub kve_flags: u8, + } + + pub struct ptrace_state { + pub pe_report_event: ::c_int, + pub pe_other_pid: ::pid_t, + pub pe_tid: ::pid_t, + } + + pub struct ptrace_thread_state { + pub pts_tid: ::pid_t, + } + + // search.h + pub struct entry { + pub key: *mut ::c_char, + pub data: *mut ::c_void, + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_char { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _pid: ::pid_t, + _uid: ::uid_t, + value: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_timer)).value + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_fileno: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_type: u8, + pub d_namlen: u8, + __d_padding: [u8; 4], + pub d_name: [::c_char; 256], + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: i64, + __ss_pad3: [u8; 240], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub si_addr: *mut ::c_char, + #[cfg(target_pointer_width = "32")] + __pad: [u8; 112], + #[cfg(target_pointer_width = "64")] + __pad: [u8; 108], + } + + pub struct lastlog { + ll_time: ::time_t, + ll_line: [::c_char; UT_LINESIZE], + ll_host: [::c_char; UT_HOSTSIZE], + } + + pub struct utmp { + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_name: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_time: ::time_t, + } + + pub union mount_info { + pub ufs_args: ufs_args, + pub mfs_args: mfs_args, + pub nfs_args: nfs_args, + pub iso_args: iso_args, + pub msdosfs_args: msdosfs_args, + pub ntfs_args: ntfs_args, + pub tmpfs_args: tmpfs_args, + align: [::c_char; 160], + } + +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_fileno == other.d_fileno + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self.d_namlen == other.d_namlen + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_fileno", &self.d_fileno) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + .field("d_namlen", &self.d_namlen) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_fileno.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_namlen.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + } + } + + impl Eq for sockaddr_storage {} + + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .finish() + } + } + + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + } + } + + impl PartialEq for siginfo_t { + fn eq(&self, other: &siginfo_t) -> bool { + self.si_signo == other.si_signo + && self.si_code == other.si_code + && self.si_errno == other.si_errno + && self.si_addr == other.si_addr + } + } + + impl Eq for siginfo_t {} + + impl ::fmt::Debug for siginfo_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("siginfo_t") + .field("si_signo", &self.si_signo) + .field("si_code", &self.si_code) + .field("si_errno", &self.si_errno) + .field("si_addr", &self.si_addr) + .finish() + } + } + + impl ::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_code.hash(state); + self.si_errno.hash(state); + self.si_addr.hash(state); + } + } + + impl PartialEq for lastlog { + fn eq(&self, other: &lastlog) -> bool { + self.ll_time == other.ll_time + && self + .ll_line + .iter() + .zip(other.ll_line.iter()) + .all(|(a,b)| a == b) + && self + .ll_host + .iter() + .zip(other.ll_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for lastlog {} + + impl ::fmt::Debug for lastlog { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("lastlog") + .field("ll_time", &self.ll_time) + // FIXME: .field("ll_line", &self.ll_line) + // FIXME: .field("ll_host", &self.ll_host) + .finish() + } + } + + impl ::hash::Hash for lastlog { + fn hash(&self, state: &mut H) { + self.ll_time.hash(state); + self.ll_line.hash(state); + self.ll_host.hash(state); + } + } + + impl PartialEq for utmp { + fn eq(&self, other: &utmp) -> bool { + self.ut_time == other.ut_time + && self + .ut_line + .iter() + .zip(other.ut_line.iter()) + .all(|(a,b)| a == b) + && self + .ut_name + .iter() + .zip(other.ut_name.iter()) + .all(|(a,b)| a == b) + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utmp {} + + impl ::fmt::Debug for utmp { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmp") + // FIXME: .field("ut_line", &self.ut_line) + // FIXME: .field("ut_name", &self.ut_name) + // FIXME: .field("ut_host", &self.ut_host) + .field("ut_time", &self.ut_time) + .finish() + } + } + + impl ::hash::Hash for utmp { + fn hash(&self, state: &mut H) { + self.ut_line.hash(state); + self.ut_name.hash(state); + self.ut_host.hash(state); + self.ut_time.hash(state); + } + } + + impl PartialEq for mount_info { + fn eq(&self, other: &mount_info) -> bool { + unsafe { + self.align + .iter() + .zip(other.align.iter()) + .all(|(a,b)| a == b) + } + } + } + + impl Eq for mount_info { } + + impl ::fmt::Debug for mount_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mount_info") + // FIXME: .field("align", &self.align) + .finish() + } + } + + impl ::hash::Hash for mount_info { + fn hash(&self, state: &mut H) { + unsafe { self.align.hash(state) }; + } + } + } +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + // This type uses the union mount_info: + pub struct statfs { + pub f_flags: u32, + pub f_bsize: u32, + pub f_iosize: u32, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: i64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: i64, + pub f_syncwrites: u64, + pub f_syncreads: u64, + pub f_asyncwrites: u64, + pub f_asyncreads: u64, + pub f_fsid: ::fsid_t, + pub f_namemax: u32, + pub f_owner: ::uid_t, + pub f_ctime: u64, + pub f_fstypename: [::c_char; 16], + pub f_mntonname: [::c_char; 90], + pub f_mntfromname: [::c_char; 90], + pub f_mntfromspec: [::c_char; 90], + pub mount_info: mount_info, + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for statfs { + fn eq(&self, other: &statfs) -> bool { + self.f_flags == other.f_flags + && self.f_bsize == other.f_bsize + && self.f_iosize == other.f_iosize + && self.f_blocks == other.f_blocks + && self.f_bfree == other.f_bfree + && self.f_bavail == other.f_bavail + && self.f_files == other.f_files + && self.f_ffree == other.f_ffree + && self.f_favail == other.f_favail + && self.f_syncwrites == other.f_syncwrites + && self.f_syncreads == other.f_syncreads + && self.f_asyncwrites == other.f_asyncwrites + && self.f_asyncreads == other.f_asyncreads + && self.f_fsid == other.f_fsid + && self.f_namemax == other.f_namemax + && self.f_owner == other.f_owner + && self.f_ctime == other.f_ctime + && self.f_fstypename + .iter() + .zip(other.f_fstypename.iter()) + .all(|(a,b)| a == b) + && self.f_mntonname + .iter() + .zip(other.f_mntonname.iter()) + .all(|(a,b)| a == b) + && self.f_mntfromname + .iter() + .zip(other.f_mntfromname.iter()) + .all(|(a,b)| a == b) + && self.f_mntfromspec + .iter() + .zip(other.f_mntfromspec.iter()) + .all(|(a,b)| a == b) + && self.mount_info == other.mount_info + } + } + + impl Eq for statfs { } + + impl ::fmt::Debug for statfs { + fn fmt(&self, f: &mut ::fmt::Formatter) + -> ::fmt::Result { + f.debug_struct("statfs") + .field("f_flags", &self.f_flags) + .field("f_bsize", &self.f_bsize) + .field("f_iosize", &self.f_iosize) + .field("f_blocks", &self.f_blocks) + .field("f_bfree", &self.f_bfree) + .field("f_bavail", &self.f_bavail) + .field("f_files", &self.f_files) + .field("f_ffree", &self.f_ffree) + .field("f_favail", &self.f_favail) + .field("f_syncwrites", &self.f_syncwrites) + .field("f_syncreads", &self.f_syncreads) + .field("f_asyncwrites", &self.f_asyncwrites) + .field("f_asyncreads", &self.f_asyncreads) + .field("f_fsid", &self.f_fsid) + .field("f_namemax", &self.f_namemax) + .field("f_owner", &self.f_owner) + .field("f_ctime", &self.f_ctime) + // FIXME: .field("f_fstypename", &self.f_fstypename) + // FIXME: .field("f_mntonname", &self.f_mntonname) + // FIXME: .field("f_mntfromname", &self.f_mntfromname) + // FIXME: .field("f_mntfromspec", &self.f_mntfromspec) + .field("mount_info", &self.mount_info) + .finish() + } + } + + impl ::hash::Hash for statfs { + fn hash(&self, state: &mut H) { + self.f_flags.hash(state); + self.f_bsize.hash(state); + self.f_iosize.hash(state); + self.f_blocks.hash(state); + self.f_bfree.hash(state); + self.f_bavail.hash(state); + self.f_files.hash(state); + self.f_ffree.hash(state); + self.f_favail.hash(state); + self.f_syncwrites.hash(state); + self.f_syncreads.hash(state); + self.f_asyncwrites.hash(state); + self.f_asyncreads.hash(state); + self.f_fsid.hash(state); + self.f_namemax.hash(state); + self.f_owner.hash(state); + self.f_ctime.hash(state); + self.f_fstypename.hash(state); + self.f_mntonname.hash(state); + self.f_mntfromname.hash(state); + self.f_mntfromspec.hash(state); + self.mount_info.hash(state); + } + } + } + } + } +} + +pub const UT_NAMESIZE: usize = 32; +pub const UT_LINESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 256; + +pub const O_CLOEXEC: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x20000; +pub const O_RSYNC: ::c_int = O_SYNC; + +pub const MS_SYNC: ::c_int = 0x0002; +pub const MS_INVALIDATE: ::c_int = 0x0004; + +pub const POLLNORM: ::c_short = ::POLLRDNORM; + +pub const ENOATTR: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const EOVERFLOW: ::c_int = 87; +pub const ECANCELED: ::c_int = 88; +pub const EIDRM: ::c_int = 89; +pub const ENOMSG: ::c_int = 90; +pub const ENOTSUP: ::c_int = 91; +pub const EBADMSG: ::c_int = 92; +pub const ENOTRECOVERABLE: ::c_int = 93; +pub const EOWNERDEAD: ::c_int = 94; +pub const EPROTO: ::c_int = 95; +pub const ELAST: ::c_int = 95; + +pub const F_DUPFD_CLOEXEC: ::c_int = 10; + +pub const UTIME_OMIT: c_long = -1; +pub const UTIME_NOW: c_long = -2; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x01; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x02; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x04; +pub const AT_REMOVEDIR: ::c_int = 0x08; + +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: ::c_int = 9; + +pub const SO_TIMESTAMP: ::c_int = 0x0800; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_BINDANY: ::c_int = 0x1000; +pub const SO_NETPROC: ::c_int = 0x1020; +pub const SO_RTABLE: ::c_int = 0x1021; +pub const SO_PEERCRED: ::c_int = 0x1022; +pub const SO_SPLICE: ::c_int = 0x1023; + +// sys/netinet/in.h +// Protocols (RFC 1700) +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +// IPPROTO_IP defined in src/unix/mod.rs +/// Hop-by-hop option header +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// gateway^2 (deprecated) +pub const IPPROTO_GGP: ::c_int = 3; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +// IPPROTO_UDP defined in src/unix/mod.rs +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +/// IP Mobility RFC 2004 +pub const IPPROTO_MOBILE: ::c_int = 55; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +/// ISO cnlp +pub const IPPROTO_EON: ::c_int = 80; +/// Ethernet-in-IP +pub const IPPROTO_ETHERIP: ::c_int = 97; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// Protocol indep. multicast +pub const IPPROTO_PIM: ::c_int = 103; +/// IP Payload Comp. Protocol +pub const IPPROTO_IPCOMP: ::c_int = 108; +/// CARP +pub const IPPROTO_CARP: ::c_int = 112; +/// unicast MPLS packet +pub const IPPROTO_MPLS: ::c_int = 137; +/// PFSYNC +pub const IPPROTO_PFSYNC: ::c_int = 240; +pub const IPPROTO_MAX: ::c_int = 256; + +// Only used internally, so it can be outside the range of valid IP protocols +pub const IPPROTO_DIVERT: ::c_int = 258; + +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_SENDSRCADDR: ::c_int = IP_RECVDSTADDR; +pub const IP_RECVIF: ::c_int = 30; + +// sys/netinet/in.h +pub const TCP_MD5SIG: ::c_int = 0x04; +pub const TCP_NOPUSH: ::c_int = 0x10; + +pub const MSG_WAITFORONE: ::c_int = 0x1000; + +pub const AF_ECMA: ::c_int = 8; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_ENCAP: ::c_int = 28; +pub const AF_SIP: ::c_int = 29; +pub const AF_KEY: ::c_int = 30; +pub const pseudo_AF_HDRCMPLT: ::c_int = 31; +pub const AF_BLUETOOTH: ::c_int = 32; +pub const AF_MPLS: ::c_int = 33; +pub const pseudo_AF_PFLOW: ::c_int = 34; +pub const pseudo_AF_PIPEX: ::c_int = 35; +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 3; +pub const NET_RT_STATS: ::c_int = 4; +pub const NET_RT_TABLE: ::c_int = 5; +pub const NET_RT_IFNAMES: ::c_int = 6; +#[doc(hidden)] +#[deprecated( + since = "0.2.95", + note = "Possibly increasing over the releases and might not be so used in the field" +)] +pub const NET_RT_MAXID: ::c_int = 7; + +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; + +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_ENCAP: ::c_int = AF_ENCAP; +pub const PF_SIP: ::c_int = AF_SIP; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_BPF: ::c_int = pseudo_AF_HDRCMPLT; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_PFLOW: ::c_int = pseudo_AF_PFLOW; +pub const PF_PIPEX: ::c_int = pseudo_AF_PIPEX; + +pub const SCM_TIMESTAMP: ::c_int = 0x04; + +pub const O_DSYNC: ::c_int = 128; + +pub const MAP_RENAME: ::c_int = 0x0000; +pub const MAP_NORESERVE: ::c_int = 0x0000; +pub const MAP_HASSEMAPHORE: ::c_int = 0x0000; + +pub const EIPSEC: ::c_int = 82; +pub const ENOMEDIUM: ::c_int = 85; +pub const EMEDIUMTYPE: ::c_int = 86; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_NODATA: ::c_int = -5; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_SYSTEM: ::c_int = -11; +pub const EAI_OVERFLOW: ::c_int = -14; + +pub const RUSAGE_THREAD: ::c_int = 1; + +pub const MAP_COPY: ::c_int = 0x0002; +pub const MAP_NOEXTEND: ::c_int = 0x0000; + +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 7; +pub const _PC_NO_TRUNC: ::c_int = 8; +pub const _PC_VDISABLE: ::c_int = 9; +pub const _PC_2_SYMLINKS: ::c_int = 10; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 11; +pub const _PC_ASYNC_IO: ::c_int = 12; +pub const _PC_FILESIZEBITS: ::c_int = 13; +pub const _PC_PRIO_IO: ::c_int = 14; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 17; +pub const _PC_REC_XFER_ALIGN: ::c_int = 18; +pub const _PC_SYMLINK_MAX: ::c_int = 19; +pub const _PC_SYNC_IO: ::c_int = 20; +pub const _PC_TIMESTAMP_RESOLUTION: ::c_int = 21; + +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 31; +pub const _SC_SEM_VALUE_MAX: ::c_int = 32; +pub const _SC_HOST_NAME_MAX: ::c_int = 33; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 34; +pub const _SC_2_PBS: ::c_int = 35; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 36; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 37; +pub const _SC_2_PBS_LOCATE: ::c_int = 38; +pub const _SC_2_PBS_MESSAGE: ::c_int = 39; +pub const _SC_2_PBS_TRACK: ::c_int = 40; +pub const _SC_ADVISORY_INFO: ::c_int = 41; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 42; +pub const _SC_AIO_MAX: ::c_int = 43; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 45; +pub const _SC_ATEXIT_MAX: ::c_int = 46; +pub const _SC_BARRIERS: ::c_int = 47; +pub const _SC_CLOCK_SELECTION: ::c_int = 48; +pub const _SC_CPUTIME: ::c_int = 49; +pub const _SC_DELAYTIMER_MAX: ::c_int = 50; +pub const _SC_IOV_MAX: ::c_int = 51; +pub const _SC_IPV6: ::c_int = 52; +pub const _SC_MAPPED_FILES: ::c_int = 53; +pub const _SC_MEMLOCK: ::c_int = 54; +pub const _SC_MEMLOCK_RANGE: ::c_int = 55; +pub const _SC_MEMORY_PROTECTION: ::c_int = 56; +pub const _SC_MESSAGE_PASSING: ::c_int = 57; +pub const _SC_MQ_OPEN_MAX: ::c_int = 58; +pub const _SC_MQ_PRIO_MAX: ::c_int = 59; +pub const _SC_PRIORITIZED_IO: ::c_int = 60; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 61; +pub const _SC_RAW_SOCKETS: ::c_int = 62; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 63; +pub const _SC_REALTIME_SIGNALS: ::c_int = 64; +pub const _SC_REGEXP: ::c_int = 65; +pub const _SC_RTSIG_MAX: ::c_int = 66; +pub const _SC_SEMAPHORES: ::c_int = 67; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 68; +pub const _SC_SHELL: ::c_int = 69; +pub const _SC_SIGQUEUE_MAX: ::c_int = 70; +pub const _SC_SPAWN: ::c_int = 71; +pub const _SC_SPIN_LOCKS: ::c_int = 72; +pub const _SC_SPORADIC_SERVER: ::c_int = 73; +pub const _SC_SS_REPL_MAX: ::c_int = 74; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 75; +pub const _SC_SYMLOOP_MAX: ::c_int = 76; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; +pub const _SC_THREAD_CPUTIME: ::c_int = 79; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 80; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 81; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 82; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 83; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 84; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 85; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 86; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 87; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 88; +pub const _SC_THREAD_STACK_MIN: ::c_int = 89; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 90; +pub const _SC_THREADS: ::c_int = 91; +pub const _SC_TIMEOUTS: ::c_int = 92; +pub const _SC_TIMER_MAX: ::c_int = 93; +pub const _SC_TIMERS: ::c_int = 94; +pub const _SC_TRACE: ::c_int = 95; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 96; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 97; +pub const _SC_TRACE_INHERIT: ::c_int = 98; +pub const _SC_TRACE_LOG: ::c_int = 99; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 100; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 101; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 102; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 103; +pub const _SC_TRACE_NAME_MAX: ::c_int = 104; +pub const _SC_TRACE_SYS_MAX: ::c_int = 105; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 106; +pub const _SC_TTY_NAME_MAX: ::c_int = 107; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 108; +pub const _SC_V6_ILP32_OFF32: ::c_int = 109; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 110; +pub const _SC_V6_LP64_OFF64: ::c_int = 111; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 112; +pub const _SC_V7_ILP32_OFF32: ::c_int = 113; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 114; +pub const _SC_V7_LP64_OFF64: ::c_int = 115; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 116; +pub const _SC_XOPEN_CRYPT: ::c_int = 117; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 118; +pub const _SC_XOPEN_LEGACY: ::c_int = 119; +pub const _SC_XOPEN_REALTIME: ::c_int = 120; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 121; +pub const _SC_XOPEN_STREAMS: ::c_int = 122; +pub const _SC_XOPEN_UNIX: ::c_int = 123; +pub const _SC_XOPEN_UUCP: ::c_int = 124; +pub const _SC_XOPEN_VERSION: ::c_int = 125; +pub const _SC_PHYS_PAGES: ::c_int = 500; +pub const _SC_AVPHYS_PAGES: ::c_int = 501; +pub const _SC_NPROCESSORS_CONF: ::c_int = 502; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 503; + +pub const FD_SETSIZE: usize = 1024; + +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_OTHER: ::c_int = 2; +pub const SCHED_RR: ::c_int = 3; + +pub const ST_NOSUID: ::c_ulong = 2; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _; + +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; +pub const PTHREAD_MUTEX_STRICT_NP: ::c_int = 4; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_STRICT_NP; + +pub const EVFILT_READ: i16 = -1; +pub const EVFILT_WRITE: i16 = -2; +pub const EVFILT_AIO: i16 = -3; +pub const EVFILT_VNODE: i16 = -4; +pub const EVFILT_PROC: i16 = -5; +pub const EVFILT_SIGNAL: i16 = -6; +pub const EVFILT_TIMER: i16 = -7; +pub const EVFILT_DEVICE: i16 = -8; +pub const EVFILT_EXCEPT: i16 = -9; + +pub const EV_ADD: u16 = 0x1; +pub const EV_DELETE: u16 = 0x2; +pub const EV_ENABLE: u16 = 0x4; +pub const EV_DISABLE: u16 = 0x8; +pub const EV_ONESHOT: u16 = 0x10; +pub const EV_CLEAR: u16 = 0x20; +pub const EV_RECEIPT: u16 = 0x40; +pub const EV_DISPATCH: u16 = 0x80; +pub const EV_FLAG1: u16 = 0x2000; +pub const EV_ERROR: u16 = 0x4000; +pub const EV_EOF: u16 = 0x8000; + +#[deprecated(since = "0.2.113", note = "Not stable across OS versions")] +pub const EV_SYSFLAGS: u16 = 0xf800; + +pub const NOTE_LOWAT: u32 = 0x00000001; +pub const NOTE_EOF: u32 = 0x00000002; +pub const NOTE_OOB: u32 = 0x00000004; +pub const NOTE_DELETE: u32 = 0x00000001; +pub const NOTE_WRITE: u32 = 0x00000002; +pub const NOTE_EXTEND: u32 = 0x00000004; +pub const NOTE_ATTRIB: u32 = 0x00000008; +pub const NOTE_LINK: u32 = 0x00000010; +pub const NOTE_RENAME: u32 = 0x00000020; +pub const NOTE_REVOKE: u32 = 0x00000040; +pub const NOTE_TRUNCATE: u32 = 0x00000080; +pub const NOTE_EXIT: u32 = 0x80000000; +pub const NOTE_FORK: u32 = 0x40000000; +pub const NOTE_EXEC: u32 = 0x20000000; +pub const NOTE_PDATAMASK: u32 = 0x000fffff; +pub const NOTE_PCTRLMASK: u32 = 0xf0000000; +pub const NOTE_TRACK: u32 = 0x00000001; +pub const NOTE_TRACKERR: u32 = 0x00000002; +pub const NOTE_CHILD: u32 = 0x00000004; +pub const NOTE_CHANGE: u32 = 0x00000001; + +pub const TMP_MAX: ::c_uint = 0x7fffffff; + +pub const AI_PASSIVE: ::c_int = 1; +pub const AI_CANONNAME: ::c_int = 2; +pub const AI_NUMERICHOST: ::c_int = 4; +pub const AI_EXT: ::c_int = 8; +pub const AI_NUMERICSERV: ::c_int = 16; +pub const AI_FQDN: ::c_int = 32; +pub const AI_ADDRCONFIG: ::c_int = 64; + +pub const NI_NUMERICHOST: ::c_int = 1; +pub const NI_NUMERICSERV: ::c_int = 2; +pub const NI_NOFQDN: ::c_int = 4; +pub const NI_NAMEREQD: ::c_int = 8; +pub const NI_DGRAM: ::c_int = 16; + +pub const NI_MAXHOST: ::size_t = 256; + +pub const RTLD_LOCAL: ::c_int = 0; + +pub const CTL_MAXNAME: ::c_int = 12; + +pub const CTLTYPE_NODE: ::c_int = 1; +pub const CTLTYPE_INT: ::c_int = 2; +pub const CTLTYPE_STRING: ::c_int = 3; +pub const CTLTYPE_QUAD: ::c_int = 4; +pub const CTLTYPE_STRUCT: ::c_int = 5; + +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_FS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_DDB: ::c_int = 9; +pub const CTL_VFS: ::c_int = 10; +pub const CTL_MAXID: ::c_int = 11; + +pub const HW_NCPUONLINE: ::c_int = 25; + +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_DOMAINNAME: ::c_int = 22; +pub const KERN_MAXPARTITIONS: ::c_int = 23; +pub const KERN_RAWPARTITION: ::c_int = 24; +pub const KERN_MAXTHREAD: ::c_int = 25; +pub const KERN_NTHREADS: ::c_int = 26; +pub const KERN_OSVERSION: ::c_int = 27; +pub const KERN_SOMAXCONN: ::c_int = 28; +pub const KERN_SOMINCONN: ::c_int = 29; +#[deprecated(since = "0.2.71", note = "Removed in OpenBSD 6.0")] +pub const KERN_USERMOUNT: ::c_int = 30; +pub const KERN_NOSUIDCOREDUMP: ::c_int = 32; +pub const KERN_FSYNC: ::c_int = 33; +pub const KERN_SYSVMSG: ::c_int = 34; +pub const KERN_SYSVSEM: ::c_int = 35; +pub const KERN_SYSVSHM: ::c_int = 36; +#[deprecated(since = "0.2.71", note = "Removed in OpenBSD 6.0")] +pub const KERN_ARND: ::c_int = 37; +pub const KERN_MSGBUFSIZE: ::c_int = 38; +pub const KERN_MALLOCSTATS: ::c_int = 39; +pub const KERN_CPTIME: ::c_int = 40; +pub const KERN_NCHSTATS: ::c_int = 41; +pub const KERN_FORKSTAT: ::c_int = 42; +pub const KERN_NSELCOLL: ::c_int = 43; +pub const KERN_TTY: ::c_int = 44; +pub const KERN_CCPU: ::c_int = 45; +pub const KERN_FSCALE: ::c_int = 46; +pub const KERN_NPROCS: ::c_int = 47; +pub const KERN_MSGBUF: ::c_int = 48; +pub const KERN_POOL: ::c_int = 49; +pub const KERN_STACKGAPRANDOM: ::c_int = 50; +pub const KERN_SYSVIPC_INFO: ::c_int = 51; +pub const KERN_SPLASSERT: ::c_int = 54; +pub const KERN_PROC_ARGS: ::c_int = 55; +pub const KERN_NFILES: ::c_int = 56; +pub const KERN_TTYCOUNT: ::c_int = 57; +pub const KERN_NUMVNODES: ::c_int = 58; +pub const KERN_MBSTAT: ::c_int = 59; +pub const KERN_SEMINFO: ::c_int = 61; +pub const KERN_SHMINFO: ::c_int = 62; +pub const KERN_INTRCNT: ::c_int = 63; +pub const KERN_WATCHDOG: ::c_int = 64; +pub const KERN_PROC: ::c_int = 66; +pub const KERN_MAXCLUSTERS: ::c_int = 67; +pub const KERN_EVCOUNT: ::c_int = 68; +pub const KERN_TIMECOUNTER: ::c_int = 69; +pub const KERN_MAXLOCKSPERUID: ::c_int = 70; +pub const KERN_CPTIME2: ::c_int = 71; +pub const KERN_CACHEPCT: ::c_int = 72; +pub const KERN_FILE: ::c_int = 73; +pub const KERN_CONSDEV: ::c_int = 75; +pub const KERN_NETLIVELOCKS: ::c_int = 76; +pub const KERN_POOL_DEBUG: ::c_int = 77; +pub const KERN_PROC_CWD: ::c_int = 78; +pub const KERN_PROC_NOBROADCASTKILL: ::c_int = 79; +pub const KERN_PROC_VMMAP: ::c_int = 80; +pub const KERN_GLOBAL_PTRACE: ::c_int = 81; +pub const KERN_CONSBUFSIZE: ::c_int = 82; +pub const KERN_CONSBUF: ::c_int = 83; +pub const KERN_AUDIO: ::c_int = 84; +pub const KERN_CPUSTATS: ::c_int = 85; +pub const KERN_PFSTATUS: ::c_int = 86; +pub const KERN_TIMEOUT_STATS: ::c_int = 87; +#[deprecated( + since = "0.2.95", + note = "Possibly increasing over the releases and might not be so used in the field" +)] +pub const KERN_MAXID: ::c_int = 88; + +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_KTHREAD: ::c_int = 7; +pub const KERN_PROC_SHOW_THREADS: ::c_int = 0x40000000; + +pub const KERN_SYSVIPC_MSG_INFO: ::c_int = 1; +pub const KERN_SYSVIPC_SEM_INFO: ::c_int = 2; +pub const KERN_SYSVIPC_SHM_INFO: ::c_int = 3; + +pub const KERN_PROC_ARGV: ::c_int = 1; +pub const KERN_PROC_NARGV: ::c_int = 2; +pub const KERN_PROC_ENV: ::c_int = 3; +pub const KERN_PROC_NENV: ::c_int = 4; + +pub const KI_NGROUPS: ::c_int = 16; +pub const KI_MAXCOMLEN: ::c_int = 24; +pub const KI_WMESGLEN: ::c_int = 8; +pub const KI_MAXLOGNAME: ::c_int = 32; +pub const KI_EMULNAMELEN: ::c_int = 8; + +pub const KVE_ET_OBJ: ::c_int = 0x00000001; +pub const KVE_ET_SUBMAP: ::c_int = 0x00000002; +pub const KVE_ET_COPYONWRITE: ::c_int = 0x00000004; +pub const KVE_ET_NEEDSCOPY: ::c_int = 0x00000008; +pub const KVE_ET_HOLE: ::c_int = 0x00000010; +pub const KVE_ET_NOFAULT: ::c_int = 0x00000020; +pub const KVE_ET_STACK: ::c_int = 0x00000040; +pub const KVE_ET_WC: ::c_int = 0x000000080; +pub const KVE_ET_CONCEAL: ::c_int = 0x000000100; +pub const KVE_ET_SYSCALL: ::c_int = 0x000000200; +pub const KVE_ET_FREEMAPPED: ::c_int = 0x000000800; + +pub const KVE_PROT_NONE: ::c_int = 0x00000000; +pub const KVE_PROT_READ: ::c_int = 0x00000001; +pub const KVE_PROT_WRITE: ::c_int = 0x00000002; +pub const KVE_PROT_EXEC: ::c_int = 0x00000004; + +pub const KVE_ADV_NORMAL: ::c_int = 0x00000000; +pub const KVE_ADV_RANDOM: ::c_int = 0x00000001; +pub const KVE_ADV_SEQUENTIAL: ::c_int = 0x00000002; + +pub const KVE_INH_SHARE: ::c_int = 0x00000000; +pub const KVE_INH_COPY: ::c_int = 0x00000010; +pub const KVE_INH_NONE: ::c_int = 0x00000020; +pub const KVE_INH_ZERO: ::c_int = 0x00000030; + +pub const KVE_F_STATIC: ::c_int = 0x1; +pub const KVE_F_KMEM: ::c_int = 0x2; + +pub const CHWFLOW: ::tcflag_t = ::MDMBUF | ::CRTSCTS; +pub const OLCUC: ::tcflag_t = 0x20; +pub const ONOCR: ::tcflag_t = 0x40; +pub const ONLRET: ::tcflag_t = 0x80; + +//https://github.com/openbsd/src/blob/HEAD/sys/sys/mount.h +pub const ISOFSMNT_NORRIP: ::c_int = 0x1; // disable Rock Ridge Ext +pub const ISOFSMNT_GENS: ::c_int = 0x2; // enable generation numbers +pub const ISOFSMNT_EXTATT: ::c_int = 0x4; // enable extended attr +pub const ISOFSMNT_NOJOLIET: ::c_int = 0x8; // disable Joliet Ext +pub const ISOFSMNT_SESS: ::c_int = 0x10; // use iso_args.sess + +pub const NFS_ARGSVERSION: ::c_int = 4; // change when nfs_args changes + +pub const NFSMNT_RESVPORT: ::c_int = 0; // always use reserved ports +pub const NFSMNT_SOFT: ::c_int = 0x1; // soft mount (hard is default) +pub const NFSMNT_WSIZE: ::c_int = 0x2; // set write size +pub const NFSMNT_RSIZE: ::c_int = 0x4; // set read size +pub const NFSMNT_TIMEO: ::c_int = 0x8; // set initial timeout +pub const NFSMNT_RETRANS: ::c_int = 0x10; // set number of request retries +pub const NFSMNT_MAXGRPS: ::c_int = 0x20; // set maximum grouplist size +pub const NFSMNT_INT: ::c_int = 0x40; // allow interrupts on hard mount +pub const NFSMNT_NOCONN: ::c_int = 0x80; // Don't Connect the socket +pub const NFSMNT_NQNFS: ::c_int = 0x100; // Use Nqnfs protocol +pub const NFSMNT_NFSV3: ::c_int = 0x200; // Use NFS Version 3 protocol +pub const NFSMNT_KERB: ::c_int = 0x400; // Use Kerberos authentication +pub const NFSMNT_DUMBTIMR: ::c_int = 0x800; // Don't estimate rtt dynamically +pub const NFSMNT_LEASETERM: ::c_int = 0x1000; // set lease term (nqnfs) +pub const NFSMNT_READAHEAD: ::c_int = 0x2000; // set read ahead +pub const NFSMNT_DEADTHRESH: ::c_int = 0x4000; // set dead server retry thresh +pub const NFSMNT_NOAC: ::c_int = 0x8000; // disable attribute cache +pub const NFSMNT_RDIRPLUS: ::c_int = 0x10000; // Use Readdirplus for V3 +pub const NFSMNT_READDIRSIZE: ::c_int = 0x20000; // Set readdir size + +/* Flags valid only in mount syscall arguments */ +pub const NFSMNT_ACREGMIN: ::c_int = 0x40000; // acregmin field valid +pub const NFSMNT_ACREGMAX: ::c_int = 0x80000; // acregmax field valid +pub const NFSMNT_ACDIRMIN: ::c_int = 0x100000; // acdirmin field valid +pub const NFSMNT_ACDIRMAX: ::c_int = 0x200000; // acdirmax field valid + +/* Flags valid only in kernel */ +pub const NFSMNT_INTERNAL: ::c_int = 0xfffc0000; // Bits set internally +pub const NFSMNT_HASWRITEVERF: ::c_int = 0x40000; // Has write verifier for V3 +pub const NFSMNT_GOTPATHCONF: ::c_int = 0x80000; // Got the V3 pathconf info +pub const NFSMNT_GOTFSINFO: ::c_int = 0x100000; // Got the V3 fsinfo +pub const NFSMNT_MNTD: ::c_int = 0x200000; // Mnt server for mnt point +pub const NFSMNT_DISMINPROG: ::c_int = 0x400000; // Dismount in progress +pub const NFSMNT_DISMNT: ::c_int = 0x800000; // Dismounted +pub const NFSMNT_SNDLOCK: ::c_int = 0x1000000; // Send socket lock +pub const NFSMNT_WANTSND: ::c_int = 0x2000000; // Want above +pub const NFSMNT_RCVLOCK: ::c_int = 0x4000000; // Rcv socket lock +pub const NFSMNT_WANTRCV: ::c_int = 0x8000000; // Want above +pub const NFSMNT_WAITAUTH: ::c_int = 0x10000000; // Wait for authentication +pub const NFSMNT_HASAUTH: ::c_int = 0x20000000; // Has authenticator +pub const NFSMNT_WANTAUTH: ::c_int = 0x40000000; // Wants an authenticator +pub const NFSMNT_AUTHERR: ::c_int = 0x80000000; // Authentication error + +pub const MSDOSFSMNT_SHORTNAME: ::c_int = 0x1; // Force old DOS short names only +pub const MSDOSFSMNT_LONGNAME: ::c_int = 0x2; // Force Win'95 long names +pub const MSDOSFSMNT_NOWIN95: ::c_int = 0x4; // Completely ignore Win95 entries + +pub const NTFS_MFLAG_CASEINS: ::c_int = 0x1; +pub const NTFS_MFLAG_ALLNAMES: ::c_int = 0x2; + +pub const TMPFS_ARGS_VERSION: ::c_int = 1; + +pub const MAP_STACK: ::c_int = 0x4000; +pub const MAP_CONCEAL: ::c_int = 0x8000; + +// https://github.com/openbsd/src/blob/HEAD/sys/net/if.h#L187 +pub const IFF_UP: ::c_int = 0x1; // interface is up +pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link +pub const IFF_STATICARP: ::c_int = 0x20; // only static ARP +pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated +pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol +pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets +pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress +pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions +pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + +pub const PTHREAD_STACK_MIN: ::size_t = 1_usize << _MAX_PAGE_SHIFT; +pub const MINSIGSTKSZ: ::size_t = 3_usize << _MAX_PAGE_SHIFT; +pub const SIGSTKSZ: ::size_t = MINSIGSTKSZ + (1_usize << _MAX_PAGE_SHIFT) * 4; + +pub const PT_SET_EVENT_MASK: ::c_int = 12; +pub const PT_GET_EVENT_MASK: ::c_int = 13; +pub const PT_GET_PROCESS_STATE: ::c_int = 14; +pub const PT_GET_THREAD_FIRST: ::c_int = 15; +pub const PT_GET_THREAD_NEXT: ::c_int = 16; +pub const PT_FIRSTMACH: ::c_int = 32; + +pub const SOCK_CLOEXEC: ::c_int = 0x8000; +pub const SOCK_NONBLOCK: ::c_int = 0x4000; +pub const SOCK_DNS: ::c_int = 0x1000; + +pub const BIOCGRSIG: ::c_ulong = 0x40044273; +pub const BIOCSRSIG: ::c_ulong = 0x80044272; +pub const BIOCSDLT: ::c_ulong = 0x8004427a; + +pub const PTRACE_FORK: ::c_int = 0x0002; + +pub const WCONTINUED: ::c_int = 0x08; +pub const WEXITED: ::c_int = 0x04; +pub const WSTOPPED: ::c_int = 0x02; // same as WUNTRACED +pub const WNOWAIT: ::c_int = 0x10; +pub const WTRAPPED: ::c_int = 0x20; + +pub const P_ALL: ::idtype_t = 0; +pub const P_PGID: ::idtype_t = 1; +pub const P_PID: ::idtype_t = 2; + +// search.h +pub const FIND: ::ACTION = 0; +pub const ENTER: ::ACTION = 1; + +// futex.h +pub const FUTEX_WAIT: ::c_int = 1; +pub const FUTEX_WAKE: ::c_int = 2; +pub const FUTEX_REQUEUE: ::c_int = 3; +pub const FUTEX_PRIVATE_FLAG: ::c_int = 128; + +// sysctl.h, kinfo_proc p_eflag constants +pub const EPROC_CTTY: i32 = 0x01; // controlling tty vnode active +pub const EPROC_SLEADER: i32 = 0x02; // session leader +pub const EPROC_UNVEIL: i32 = 0x04; // has unveil settings +pub const EPROC_LKUNVEIL: i32 = 0x08; // unveil is locked + +// Flags for chflags(2) +pub const UF_SETTABLE: ::c_uint = 0x0000ffff; +pub const UF_NODUMP: ::c_uint = 0x00000001; +pub const UF_IMMUTABLE: ::c_uint = 0x00000002; +pub const UF_APPEND: ::c_uint = 0x00000004; +pub const UF_OPAQUE: ::c_uint = 0x00000008; +pub const SF_SETTABLE: ::c_uint = 0xffff0000; +pub const SF_ARCHIVED: ::c_uint = 0x00010000; +pub const SF_IMMUTABLE: ::c_uint = 0x00020000; +pub const SF_APPEND: ::c_uint = 0x00040000; + +// sys/mount.h +pub const MNT_NOPERM: ::c_int = 0x00000020; +pub const MNT_WXALLOWED: ::c_int = 0x00000800; +pub const MNT_EXRDONLY: ::c_int = 0x00000080; +pub const MNT_DEFEXPORTED: ::c_int = 0x00000200; +pub const MNT_EXPORTANON: ::c_int = 0x00000400; +pub const MNT_ROOTFS: ::c_int = 0x00004000; +pub const MNT_NOATIME: ::c_int = 0x00008000; +pub const MNT_DELEXPORT: ::c_int = 0x00020000; +pub const MNT_STALLED: ::c_int = 0x00100000; +pub const MNT_SWAPPABLE: ::c_int = 0x00200000; +pub const MNT_WANTRDWR: ::c_int = 0x02000000; +pub const MNT_SOFTDEP: ::c_int = 0x04000000; +pub const MNT_DOOMED: ::c_int = 0x08000000; + +// For use with vfs_fsync and getfsstat +pub const MNT_WAIT: ::c_int = 1; +pub const MNT_NOWAIT: ::c_int = 2; +pub const MNT_LAZY: ::c_int = 3; + +// sys/_time.h +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 4; +pub const CLOCK_UPTIME: ::clockid_t = 5; +pub const CLOCK_BOOTTIME: ::clockid_t = 6; + +pub const LC_COLLATE_MASK: ::c_int = 1 << ::LC_COLLATE; +pub const LC_CTYPE_MASK: ::c_int = 1 << ::LC_CTYPE; +pub const LC_MONETARY_MASK: ::c_int = 1 << ::LC_MONETARY; +pub const LC_NUMERIC_MASK: ::c_int = 1 << ::LC_NUMERIC; +pub const LC_TIME_MASK: ::c_int = 1 << ::LC_TIME; +pub const LC_MESSAGES_MASK: ::c_int = 1 << ::LC_MESSAGES; + +const _LC_LAST: ::c_int = 7; +pub const LC_ALL_MASK: ::c_int = (1 << _LC_LAST) - 2; + +pub const LC_GLOBAL_LOCALE: ::locale_t = -1isize as ::locale_t; + +const_fn! { + {const} fn _ALIGN(p: usize) -> usize { + (p + _ALIGNBYTES) & !_ALIGNBYTES + } +} + +f! { + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + _ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + + _ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (_ALIGN(::mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize)) + as ::c_uint + } + + pub fn major(dev: ::dev_t) -> ::c_uint{ + ((dev as ::c_uint) >> 8) & 0xff + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + let dev = dev as ::c_uint; + let mut res = 0; + res |= (dev) & 0xff; + res |= ((dev) & 0xffff0000) >> 8; + + res + } +} + +safe_f! { + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + status >> 8 + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0o177) != 0o177 && (status & 0o177) != 0 + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0o177 + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + (status & 0o177777) == 0o177777 + } + + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= (major & 0xff) << 8; + dev |= minor & 0xff; + dev |= (minor & 0xffff00) << 8; + dev + } +} + +extern "C" { + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn settimeofday(tp: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn pledge(promises: *const ::c_char, execpromises: *const ::c_char) -> ::c_int; + pub fn unveil(path: *const ::c_char, permissions: *const ::c_char) -> ::c_int; + pub fn strtonum( + nptr: *const ::c_char, + minval: ::c_longlong, + maxval: ::c_longlong, + errstr: *mut *const ::c_char, + ) -> ::c_longlong; + pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int; + pub fn chflags(path: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn fchflags(fd: ::c_int, flags: ::c_uint) -> ::c_int; + pub fn chflagsat( + fd: ::c_int, + path: *const ::c_char, + flags: ::c_uint, + atflag: ::c_int, + ) -> ::c_int; + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + servlen: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t, sgid: *mut ::gid_t) -> ::c_int; + pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t, suid: *mut ::uid_t) -> ::c_int; + pub fn kevent( + kq: ::c_int, + changelist: *const ::kevent, + nchanges: ::c_int, + eventlist: *mut ::kevent, + nevents: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn getthrid() -> ::pid_t; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_main_np() -> ::c_int; + pub fn pthread_get_name_np(tid: ::pthread_t, name: *mut ::c_char, len: ::size_t); + pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char); + pub fn pthread_stackseg_np(thread: ::pthread_t, sinfo: *mut ::stack_t) -> ::c_int; + + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *const ::termios, + winp: *const ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *const ::termios, + winp: *const ::winsize, + ) -> ::pid_t; + + pub fn sysctl( + name: *const ::c_int, + namelen: ::c_uint, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; + pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; + pub fn ptrace(request: ::c_int, pid: ::pid_t, addr: caddr_t, data: ::c_int) -> ::c_int; + pub fn utrace(label: *const ::c_char, addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + // #include + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + + // Added in `OpenBSD` 5.5 + pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t); + + pub fn setproctitle(fmt: *const ::c_char, ...); + + pub fn freezero(ptr: *mut ::c_void, size: ::size_t); + pub fn malloc_conceal(size: ::size_t) -> *mut ::c_void; + pub fn calloc_conceal(nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn srand48_deterministic(seed: ::c_long); + pub fn seed48_deterministic(xseed: *mut ::c_ushort) -> *mut ::c_ushort; + pub fn lcong48_deterministic(p: *mut ::c_ushort); + + pub fn lsearch( + key: *const ::c_void, + base: *mut ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn lfind( + key: *const ::c_void, + base: *const ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn hcreate(nelt: ::size_t) -> ::c_int; + pub fn hdestroy(); + pub fn hsearch(entry: ::ENTRY, action: ::ACTION) -> *mut ::ENTRY; + + // futex.h + pub fn futex( + uaddr: *mut u32, + op: ::c_int, + val: ::c_int, + timeout: *const ::timespec, + uaddr2: *mut u32, + ) -> ::c_int; + + pub fn mimmutable(addr: *mut ::c_void, len: ::size_t) -> ::c_int; +} + +#[link(name = "execinfo")] +extern "C" { + pub fn backtrace(addrlist: *mut *mut ::c_void, len: ::size_t) -> ::size_t; + pub fn backtrace_symbols(addrlist: *const *mut ::c_void, len: ::size_t) -> *mut *mut ::c_char; + pub fn backtrace_symbols_fd( + addrlist: *const *mut ::c_void, + len: ::size_t, + fd: ::c_int, + ) -> ::c_int; + pub fn backtrace_symbols_fmt( + addrlist: *const *mut ::c_void, + len: ::size_t, + fmt: *const ::c_char, + ) -> *mut *mut ::c_char; +} + +cfg_if! { + if #[cfg(libc_union)] { + extern { + // these functions use statfs which uses the union mount_info: + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn getmntinfo(mntbufp: *mut *mut ::statfs, flags: ::c_int) -> ::c_int; + pub fn getfsstat(buf: *mut statfs, bufsize: ::size_t, flags: ::c_int) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "mips64")] { + mod mips64; + pub use self::mips64::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(target_arch = "powerpc64")] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(target_arch = "riscv64")] { + mod riscv64; + pub use self::riscv64::*; + } else if #[cfg(target_arch = "sparc64")] { + mod sparc64; + pub use self::sparc64::*; + } else if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc.rs new file mode 100644 index 0000000..f1ab365 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc.rs @@ -0,0 +1,16 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = u8; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_double>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs new file mode 100644 index 0000000..99350ec --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs @@ -0,0 +1,16 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = u8; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/riscv64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/riscv64.rs new file mode 100644 index 0000000..99350ec --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/riscv64.rs @@ -0,0 +1,16 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = u8; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/sparc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/sparc64.rs new file mode 100644 index 0000000..070fc93 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/sparc64.rs @@ -0,0 +1,8 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; + +#[doc(hidden)] +pub const _ALIGNBYTES: usize = 0xf; + +pub const _MAX_PAGE_SHIFT: u32 = 13; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86.rs new file mode 100644 index 0000000..e87d0ff --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86.rs @@ -0,0 +1,16 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_char = i8; + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 4 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86_64.rs new file mode 100644 index 0000000..60dab00 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/bsd/netbsdlike/openbsd/x86_64.rs @@ -0,0 +1,130 @@ +use PT_FIRSTMACH; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; +pub type ucontext_t = sigcontext; + +s! { + pub struct sigcontext { + pub sc_rdi: ::c_long, + pub sc_rsi: ::c_long, + pub sc_rdx: ::c_long, + pub sc_rcx: ::c_long, + pub sc_r8: ::c_long, + pub sc_r9: ::c_long, + pub sc_r10: ::c_long, + pub sc_r11: ::c_long, + pub sc_r12: ::c_long, + pub sc_r13: ::c_long, + pub sc_r14: ::c_long, + pub sc_r15: ::c_long, + pub sc_rbp: ::c_long, + pub sc_rbx: ::c_long, + pub sc_rax: ::c_long, + pub sc_gs: ::c_long, + pub sc_fs: ::c_long, + pub sc_es: ::c_long, + pub sc_ds: ::c_long, + pub sc_trapno: ::c_long, + pub sc_err: ::c_long, + pub sc_rip: ::c_long, + pub sc_cs: ::c_long, + pub sc_rflags: ::c_long, + pub sc_rsp: ::c_long, + pub sc_ss: ::c_long, + pub sc_fpstate: *mut fxsave64, + __sc_unused: ::c_int, + pub sc_mask: ::c_int, + pub sc_cookie: ::c_long, + } +} + +s_no_extra_traits! { + #[repr(packed)] + pub struct fxsave64 { + pub fx_fcw: u16, + pub fx_fsw: u16, + pub fx_ftw: u8, + __fx_unused1: u8, + pub fx_fop: u16, + pub fx_rip: u64, + pub fx_rdp: u64, + pub fx_mxcsr: u32, + pub fx_mxcsr_mask: u32, + pub fx_st: [[u64; 2]; 8], + pub fx_xmm: [[u64; 2]; 16], + __fx_unused3: [u8; 96], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + // `fxsave64` is packed, so field access is unaligned. + // use {x} to create temporary storage, copy field to it, and do aligned access. + impl PartialEq for fxsave64 { + fn eq(&self, other: &fxsave64) -> bool { + return {self.fx_fcw} == {other.fx_fcw} && + {self.fx_fsw} == {other.fx_fsw} && + {self.fx_ftw} == {other.fx_ftw} && + {self.fx_fop} == {other.fx_fop} && + {self.fx_rip} == {other.fx_rip} && + {self.fx_rdp} == {other.fx_rdp} && + {self.fx_mxcsr} == {other.fx_mxcsr} && + {self.fx_mxcsr_mask} == {other.fx_mxcsr_mask} && + {self.fx_st}.iter().zip({other.fx_st}.iter()).all(|(a,b)| a == b) && + {self.fx_xmm}.iter().zip({other.fx_xmm}.iter()).all(|(a,b)| a == b) + } + } + impl Eq for fxsave64 {} + impl ::fmt::Debug for fxsave64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fxsave64") + .field("fx_fcw", &{self.fx_fcw}) + .field("fx_fsw", &{self.fx_fsw}) + .field("fx_ftw", &{self.fx_ftw}) + .field("fx_fop", &{self.fx_fop}) + .field("fx_rip", &{self.fx_rip}) + .field("fx_rdp", &{self.fx_rdp}) + .field("fx_mxcsr", &{self.fx_mxcsr}) + .field("fx_mxcsr_mask", &{self.fx_mxcsr_mask}) + // FIXME: .field("fx_st", &{self.fx_st}) + // FIXME: .field("fx_xmm", &{self.fx_xmm}) + .finish() + } + } + impl ::hash::Hash for fxsave64 { + fn hash(&self, state: &mut H) { + {self.fx_fcw}.hash(state); + {self.fx_fsw}.hash(state); + {self.fx_ftw}.hash(state); + {self.fx_fop}.hash(state); + {self.fx_rip}.hash(state); + {self.fx_rdp}.hash(state); + {self.fx_mxcsr}.hash(state); + {self.fx_mxcsr_mask}.hash(state); + {self.fx_st}.hash(state); + {self.fx_xmm}.hash(state); + } + } + } +} + +// should be pub(crate), but that requires Rust 1.18.0 +cfg_if! { + if #[cfg(libc_const_size_of)] { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_long>() - 1; + } else { + #[doc(hidden)] + pub const _ALIGNBYTES: usize = 8 - 1; + } +} + +pub const _MAX_PAGE_SHIFT: u32 = 12; + +pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0; +pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1; +pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2; +pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 3; +pub const PT_SETFPREGS: ::c_int = PT_FIRSTMACH + 4; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b32.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b32.rs new file mode 100644 index 0000000..073ae9d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b32.rs @@ -0,0 +1,20 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type time_t = i32; + +pub type Elf_Addr = ::Elf32_Addr; +pub type Elf_Half = ::Elf32_Half; +pub type Elf_Phdr = ::Elf32_Phdr; + +s! { + pub struct Elf32_Phdr { + pub p_type: ::Elf32_Word, + pub p_offset: ::Elf32_Off, + pub p_vaddr: ::Elf32_Addr, + pub p_paddr: ::Elf32_Addr, + pub p_filesz: ::Elf32_Word, + pub p_memsz: ::Elf32_Word, + pub p_flags: ::Elf32_Word, + pub p_align: ::Elf32_Word, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b64.rs new file mode 100644 index 0000000..4569180 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/b64.rs @@ -0,0 +1,20 @@ +pub type c_ulong = u64; +pub type c_long = i64; +pub type time_t = i64; + +pub type Elf_Addr = ::Elf64_Addr; +pub type Elf_Half = ::Elf64_Half; +pub type Elf_Phdr = ::Elf64_Phdr; + +s! { + pub struct Elf64_Phdr { + pub p_type: ::Elf64_Word, + pub p_flags: ::Elf64_Word, + pub p_offset: ::Elf64_Off, + pub p_vaddr: ::Elf64_Addr, + pub p_paddr: ::Elf64_Addr, + pub p_filesz: ::Elf64_Xword, + pub p_memsz: ::Elf64_Xword, + pub p_align: ::Elf64_Xword, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/mod.rs new file mode 100644 index 0000000..24aa599 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/mod.rs @@ -0,0 +1,2094 @@ +pub type rlim_t = ::uintptr_t; +pub type sa_family_t = u8; +pub type pthread_key_t = ::c_int; +pub type nfds_t = ::c_ulong; +pub type tcflag_t = ::c_uint; +pub type speed_t = ::c_uchar; +pub type c_char = i8; +pub type clock_t = i32; +pub type clockid_t = i32; +pub type suseconds_t = i32; +pub type wchar_t = i32; +pub type off_t = i64; +pub type ino_t = i64; +pub type blkcnt_t = i64; +pub type blksize_t = i32; +pub type dev_t = i32; +pub type mode_t = u32; +pub type nlink_t = i32; +pub type useconds_t = u32; +pub type socklen_t = u32; +pub type pthread_t = ::uintptr_t; +pub type pthread_condattr_t = ::uintptr_t; +pub type pthread_mutexattr_t = ::uintptr_t; +pub type pthread_rwlockattr_t = ::uintptr_t; +pub type sigset_t = u64; +pub type fsblkcnt_t = i64; +pub type fsfilcnt_t = i64; +pub type pthread_attr_t = *mut ::c_void; +pub type nl_item = ::c_int; +pub type id_t = i32; +pub type idtype_t = ::c_int; +pub type fd_mask = u32; +pub type regoff_t = ::c_int; +pub type key_t = i32; +pub type msgqnum_t = u32; +pub type msglen_t = u32; + +pub type Elf32_Addr = u32; +pub type Elf32_Half = u16; +pub type Elf32_Off = u32; +pub type Elf32_Sword = i32; +pub type Elf32_Word = u32; + +pub type Elf64_Addr = u64; +pub type Elf64_Half = u16; +pub type Elf64_Off = u64; +pub type Elf64_Sword = i32; +pub type Elf64_Sxword = i64; +pub type Elf64_Word = u32; +pub type Elf64_Xword = u64; + +pub type ENTRY = entry; +pub type ACTION = ::c_int; + +pub type posix_spawnattr_t = *mut ::c_void; +pub type posix_spawn_file_actions_t = *mut ::c_void; + +pub type StringList = _stringlist; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.si_status + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [u8; 30], + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [i8; 24], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: u8, + pub sin6_port: u16, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + pub ai_canonname: *mut c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *const ::c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void, + } + + pub struct fd_set { + // size for 1024 bits, and a fd_mask with size u32 + fds_bits: [fd_mask; 32], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_int, + pub tm_zone: *mut ::c_char, + } + + pub struct utsname { + pub sysname: [::c_char; 32], + pub nodename: [::c_char; 32], + pub release: [::c_char; 32], + pub version: [::c_char; 32], + pub machine: [::c_char; 32], + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::c_char, + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: mode_t, + pub st_nlink: nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_size: off_t, + pub st_rdev: dev_t, + pub st_blksize: blksize_t, + pub st_atime: time_t, + pub st_atime_nsec: c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: c_long, + pub st_crtime: time_t, + pub st_crtime_nsec: c_long, + pub st_type: u32, + pub st_blocks: blkcnt_t, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + __unused1: ::size_t, + pub gl_offs: ::size_t, + __unused2: ::size_t, + pub gl_pathv: *mut *mut c_char, + + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + } + + pub struct pthread_mutex_t { + flags: u32, + lock: i32, + unused: i32, + owner: i32, + owner_count: i32, + } + + pub struct pthread_cond_t { + flags: u32, + unused: i32, + mutex: *mut ::c_void, + waiter_count: i32, + lock: i32, + } + + pub struct pthread_rwlock_t { + flags: u32, + owner: i32, + lock_sem: i32, // this is actually a union + lock_count: i32, + reader_count: i32, + writer_count: i32, + waiters: [*mut ::c_void; 2], + } + + pub struct pthread_spinlock_t { + lock: u32, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub si_pid: ::pid_t, + pub si_uid: ::uid_t, + pub si_addr: *mut ::c_void, + pub si_status: ::c_int, + pub si_band: c_long, + pub sigval: *mut ::c_void, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, //actually a union with sa_handler + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + sa_userdata: *mut ::c_void, + } + + pub struct sem_t { + pub type_: i32, + pub named_sem_id: i32, // actually a union with unnamed_sem (i32) + pub padding: [i32; 2], + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct sockaddr_dl { + pub sdl_len: u8, + pub sdl_family: u8, + pub sdl_e_type: u16, + pub sdl_index: u32, + pub sdl_type: u8, + pub sdl_nlen: u8, + pub sdl_alen: u8, + pub sdl_slen: u8, + pub sdl_data: [u8; 46], + } + + pub struct spwd { + pub sp_namp: *mut ::c_char, + pub sp_pwdp: *mut ::c_char, + pub sp_lstchg: ::c_int, + pub sp_min: ::c_int, + pub sp_max: ::c_int, + pub sp_warn: ::c_int, + pub sp_inact: ::c_int, + pub sp_expire: ::c_int, + pub sp_flag: ::c_int, + } + + pub struct regex_t { + __buffer: *mut ::c_void, + __allocated: ::size_t, + __used: ::size_t, + __syntax: ::c_ulong, + __fastmap: *mut ::c_char, + __translate: *mut ::c_char, + __re_nsub: ::size_t, + __bitfield: u8, + } + + pub struct regmatch_t { + pub rm_so: regoff_t, + pub rm_eo: regoff_t, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + } + + pub struct ipc_perm { + pub key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct entry { + pub key: *mut ::c_char, + pub data: *mut ::c_void, + } + + pub struct option { + pub name: *const ::c_char, + pub has_arg: ::c_int, + pub flag: *mut ::c_int, + pub val: ::c_int, + } + + pub struct _stringlist { + pub sl_str: *mut *mut ::c_char, + pub sl_max: ::size_t, + pub sl_cur: ::size_t, + } + + pub struct dl_phdr_info { + pub dlpi_addr: ::Elf_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const ::Elf_Phdr, + pub dlpi_phnum: ::Elf_Half, + } +} + +s_no_extra_traits! { + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 126] + } + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: sa_family_t, + __ss_pad1: [u8; 6], + __ss_pad2: u64, + __ss_pad3: [u8; 112], + } + pub struct dirent { + pub d_dev: dev_t, + pub d_pdev: dev_t, + pub d_ino: ino_t, + pub d_pino: i64, + pub d_reclen: ::c_ushort, + pub d_name: [::c_char; 1024], // Max length is _POSIX_PATH_MAX + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + __unused1: *mut ::c_void, // actually a function pointer + pub sigev_notify_attributes: *mut ::pthread_attr_t, + } + + pub struct utmpx { + pub ut_type: ::c_short, + pub ut_tv: ::timeval, + pub ut_id: [::c_char; 8], + pub ut_pid: ::pid_t, + pub ut_user: [::c_char; 32], + pub ut_line: [::c_char; 16], + pub ut_host: [::c_char; 128], + __ut_reserved: [::c_char; 64], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_tv == other.ut_tv + && self.ut_id == other.ut_id + && self.ut_pid == other.ut_pid + && self.ut_user == other.ut_user + && self.ut_line == other.ut_line + && self.ut_host.iter().zip(other.ut_host.iter()).all(|(a,b)| a == b) + && self.__ut_reserved == other.__ut_reserved + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_type", &self.ut_type) + .field("ut_tv", &self.ut_tv) + .field("ut_id", &self.ut_id) + .field("ut_pid", &self.ut_pid) + .field("ut_user", &self.ut_user) + .field("ut_line", &self.ut_line) + .field("ut_host", &self.ut_host) + .field("__ut_reserved", &self.__ut_reserved) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_type.hash(state); + self.ut_tv.hash(state); + self.ut_id.hash(state); + self.ut_pid.hash(state); + self.ut_user.hash(state); + self.ut_line.hash(state); + self.ut_host.hash(state); + self.__ut_reserved.hash(state); + } + } + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_len == other.sun_len + && self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_len", &self.sun_len) + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_len.hash(state); + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + && self + .__ss_pad1 + .iter() + .zip(other.__ss_pad1.iter()) + .all(|(a, b)| a == b) + && self.__ss_pad2 == other.__ss_pad2 + && self + .__ss_pad3 + .iter() + .zip(other.__ss_pad3.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_pad2", &self.__ss_pad2) + // FIXME: .field("__ss_pad3", &self.__ss_pad3) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_pad2.hash(state); + self.__ss_pad3.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_dev == other.d_dev + && self.d_pdev == other.d_pdev + && self.d_ino == other.d_ino + && self.d_pino == other.d_pino + && self.d_reclen == other.d_reclen + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_dev", &self.d_dev) + .field("d_pdev", &self.d_pdev) + .field("d_ino", &self.d_ino) + .field("d_pino", &self.d_pino) + .field("d_reclen", &self.d_reclen) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_dev.hash(state); + self.d_pdev.hash(state); + self.d_ino.hash(state); + self.d_pino.hash(state); + self.d_reclen.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.sigev_notify_attributes + == other.sigev_notify_attributes + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("sigev_notify_attributes", + &self.sigev_notify_attributes) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.sigev_notify_attributes.hash(state); + } + } + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const L_SET: ::c_int = SEEK_SET; +pub const L_INCR: ::c_int = SEEK_CUR; +pub const L_XTND: ::c_int = SEEK_END; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0x0001; +pub const F_GETFD: ::c_int = 0x0002; +pub const F_SETFD: ::c_int = 0x0004; +pub const F_GETFL: ::c_int = 0x0008; +pub const F_SETFL: ::c_int = 0x0010; +pub const F_GETLK: ::c_int = 0x0020; +pub const F_SETLK: ::c_int = 0x0080; +pub const F_SETLKW: ::c_int = 0x0100; +pub const F_DUPFD_CLOEXEC: ::c_int = 0x0200; + +pub const F_RDLCK: ::c_int = 0x0040; +pub const F_UNLCK: ::c_int = 0x0200; +pub const F_WRLCK: ::c_int = 0x0400; + +pub const AT_FDCWD: ::c_int = -1; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x01; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x02; +pub const AT_REMOVEDIR: ::c_int = 0x04; +pub const AT_EACCESS: ::c_int = 0x08; + +pub const POLLIN: ::c_short = 0x0001; +pub const POLLOUT: ::c_short = 0x0002; +pub const POLLRDNORM: ::c_short = POLLIN; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLRDBAND: ::c_short = 0x0008; +pub const POLLWRBAND: ::c_short = 0x0010; +pub const POLLPRI: ::c_short = 0x0020; +pub const POLLERR: ::c_short = 0x0004; +pub const POLLHUP: ::c_short = 0x0080; +pub const POLLNVAL: ::c_short = 0x1000; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const CLOCK_REALTIME: ::c_int = -1; +pub const CLOCK_MONOTONIC: ::c_int = 0; +pub const CLOCK_PROCESS_CPUTIME_ID: ::c_int = -2; +pub const CLOCK_THREAD_CPUTIME_ID: ::c_int = -3; + +pub const RLIMIT_CORE: ::c_int = 0; +pub const RLIMIT_CPU: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_FSIZE: ::c_int = 3; +pub const RLIMIT_NOFILE: ::c_int = 4; +pub const RLIMIT_STACK: ::c_int = 5; +pub const RLIMIT_AS: ::c_int = 6; +pub const RLIM_INFINITY: ::rlim_t = 0xffffffff; +// Haiku specific +pub const RLIMIT_NOVMON: ::c_int = 7; +pub const RLIM_NLIMITS: ::c_int = 8; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const RTLD_LAZY: ::c_int = 0; + +pub const NCCS: usize = 11; + +pub const O_RDONLY: ::c_int = 0x0000; +pub const O_WRONLY: ::c_int = 0x0001; +pub const O_RDWR: ::c_int = 0x0002; +pub const O_ACCMODE: ::c_int = 0x0003; + +pub const O_EXCL: ::c_int = 0x0100; +pub const O_CREAT: ::c_int = 0x0200; +pub const O_TRUNC: ::c_int = 0x0400; +pub const O_NOCTTY: ::c_int = 0x1000; +pub const O_NOTRAVERSE: ::c_int = 0x2000; + +pub const O_CLOEXEC: ::c_int = 0x00000040; +pub const O_NONBLOCK: ::c_int = 0x00000080; +pub const O_APPEND: ::c_int = 0x00000800; +pub const O_SYNC: ::c_int = 0x00010000; +pub const O_RSYNC: ::c_int = 0x00020000; +pub const O_DSYNC: ::c_int = 0x00040000; +pub const O_NOFOLLOW: ::c_int = 0x00080000; +pub const O_NOCACHE: ::c_int = 0x00100000; +pub const O_DIRECTORY: ::c_int = 0x00200000; + +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFMT: ::mode_t = 61440; + +pub const S_IRWXU: ::mode_t = 0o00700; +pub const S_IRUSR: ::mode_t = 0o00400; +pub const S_IWUSR: ::mode_t = 0o00200; +pub const S_IXUSR: ::mode_t = 0o00100; +pub const S_IRWXG: ::mode_t = 0o00070; +pub const S_IRGRP: ::mode_t = 0o00040; +pub const S_IWGRP: ::mode_t = 0o00020; +pub const S_IXGRP: ::mode_t = 0o00010; +pub const S_IRWXO: ::mode_t = 0o00007; +pub const S_IROTH: ::mode_t = 0o00004; +pub const S_IWOTH: ::mode_t = 0o00002; +pub const S_IXOTH: ::mode_t = 0o00001; + +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGCHLD: ::c_int = 5; +pub const SIGABRT: ::c_int = 6; +pub const SIGPIPE: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSTOP: ::c_int = 10; +pub const SIGSEGV: ::c_int = 11; +pub const SIGCONT: ::c_int = 12; +pub const SIGTSTP: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGTTIN: ::c_int = 16; +pub const SIGTTOU: ::c_int = 17; +pub const SIGUSR1: ::c_int = 18; +pub const SIGUSR2: ::c_int = 19; +pub const SIGWINCH: ::c_int = 20; +pub const SIGKILLTHR: ::c_int = 21; +pub const SIGTRAP: ::c_int = 22; +pub const SIGPOLL: ::c_int = 23; +pub const SIGPROF: ::c_int = 24; +pub const SIGSYS: ::c_int = 25; +pub const SIGURG: ::c_int = 26; +pub const SIGVTALRM: ::c_int = 27; +pub const SIGXCPU: ::c_int = 28; +pub const SIGXFSZ: ::c_int = 29; +pub const SIGBUS: ::c_int = 30; + +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; +pub const SIG_SETMASK: ::c_int = 3; + +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; +pub const LC_MESSAGES: ::c_int = 6; + +// FIXME: Haiku does not have MAP_FILE, but libstd/os.rs requires it +pub const MAP_FILE: ::c_int = 0x00; +pub const MAP_SHARED: ::c_int = 0x01; +pub const MAP_PRIVATE: ::c_int = 0x02; +pub const MAP_FIXED: ::c_int = 0x04; +pub const MAP_ANONYMOUS: ::c_int = 0x08; +pub const MAP_NORESERVE: ::c_int = 0x10; +pub const MAP_ANON: ::c_int = MAP_ANONYMOUS; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MS_ASYNC: ::c_int = 0x01; +pub const MS_INVALIDATE: ::c_int = 0x04; +pub const MS_SYNC: ::c_int = 0x02; + +pub const E2BIG: ::c_int = -2147454975; +pub const ECHILD: ::c_int = -2147454974; +pub const EDEADLK: ::c_int = -2147454973; +pub const EFBIG: ::c_int = -2147454972; +pub const EMLINK: ::c_int = -2147454971; +pub const ENFILE: ::c_int = -2147454970; +pub const ENODEV: ::c_int = -2147454969; +pub const ENOLCK: ::c_int = -2147454968; +pub const ENOSYS: ::c_int = -2147454967; +pub const ENOTTY: ::c_int = -2147454966; +pub const ENXIO: ::c_int = -2147454965; +pub const ESPIPE: ::c_int = -2147454964; +pub const ESRCH: ::c_int = -2147454963; +pub const EFPOS: ::c_int = -2147454962; +pub const ESIGPARM: ::c_int = -2147454961; +pub const EDOM: ::c_int = -2147454960; +pub const ERANGE: ::c_int = -2147454959; +pub const EPROTOTYPE: ::c_int = -2147454958; +pub const EPROTONOSUPPORT: ::c_int = -2147454957; +pub const EPFNOSUPPORT: ::c_int = -2147454956; +pub const EAFNOSUPPORT: ::c_int = -2147454955; +pub const EADDRINUSE: ::c_int = -2147454954; +pub const EADDRNOTAVAIL: ::c_int = -2147454953; +pub const ENETDOWN: ::c_int = -2147454952; +pub const ENETUNREACH: ::c_int = -2147454951; +pub const ENETRESET: ::c_int = -2147454950; +pub const ECONNABORTED: ::c_int = -2147454949; +pub const ECONNRESET: ::c_int = -2147454948; +pub const EISCONN: ::c_int = -2147454947; +pub const ENOTCONN: ::c_int = -2147454946; +pub const ESHUTDOWN: ::c_int = -2147454945; +pub const ECONNREFUSED: ::c_int = -2147454944; +pub const EHOSTUNREACH: ::c_int = -2147454943; +pub const ENOPROTOOPT: ::c_int = -2147454942; +pub const ENOBUFS: ::c_int = -2147454941; +pub const EINPROGRESS: ::c_int = -2147454940; +pub const EALREADY: ::c_int = -2147454939; +pub const EILSEQ: ::c_int = -2147454938; +pub const ENOMSG: ::c_int = -2147454937; +pub const ESTALE: ::c_int = -2147454936; +pub const EOVERFLOW: ::c_int = -2147454935; +pub const EMSGSIZE: ::c_int = -2147454934; +pub const EOPNOTSUPP: ::c_int = -2147454933; +pub const ENOTSOCK: ::c_int = -2147454932; +pub const EHOSTDOWN: ::c_int = -2147454931; +pub const EBADMSG: ::c_int = -2147454930; +pub const ECANCELED: ::c_int = -2147454929; +pub const EDESTADDRREQ: ::c_int = -2147454928; +pub const EDQUOT: ::c_int = -2147454927; +pub const EIDRM: ::c_int = -2147454926; +pub const EMULTIHOP: ::c_int = -2147454925; +pub const ENODATA: ::c_int = -2147454924; +pub const ENOLINK: ::c_int = -2147454923; +pub const ENOSR: ::c_int = -2147454922; +pub const ENOSTR: ::c_int = -2147454921; +pub const ENOTSUP: ::c_int = -2147454920; +pub const EPROTO: ::c_int = -2147454919; +pub const ETIME: ::c_int = -2147454918; +pub const ETXTBSY: ::c_int = -2147454917; +pub const ENOATTR: ::c_int = -2147454916; + +// INT_MIN +pub const ENOMEM: ::c_int = -2147483648; + +// POSIX errors that can be mapped to BeOS error codes +pub const EACCES: ::c_int = -2147483646; +pub const EINTR: ::c_int = -2147483638; +pub const EIO: ::c_int = -2147483647; +pub const EBUSY: ::c_int = -2147483634; +pub const EFAULT: ::c_int = -2147478783; +pub const ETIMEDOUT: ::c_int = -2147483639; +pub const EAGAIN: ::c_int = -2147483637; +pub const EWOULDBLOCK: ::c_int = -2147483637; +pub const EBADF: ::c_int = -2147459072; +pub const EEXIST: ::c_int = -2147459070; +pub const EINVAL: ::c_int = -2147483643; +pub const ENAMETOOLONG: ::c_int = -2147459068; +pub const ENOENT: ::c_int = -2147459069; +pub const EPERM: ::c_int = -2147483633; +pub const ENOTDIR: ::c_int = -2147459067; +pub const EISDIR: ::c_int = -2147459063; +pub const ENOTEMPTY: ::c_int = -2147459066; +pub const ENOSPC: ::c_int = -2147459065; +pub const EROFS: ::c_int = -2147459064; +pub const EMFILE: ::c_int = -2147459062; +pub const EXDEV: ::c_int = -2147459061; +pub const ELOOP: ::c_int = -2147459060; +pub const ENOEXEC: ::c_int = -2147478782; +pub const EPIPE: ::c_int = -2147459059; + +pub const IPPROTO_RAW: ::c_int = 255; + +// These are prefixed with POSIX_ on Haiku +pub const MADV_NORMAL: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_RANDOM: ::c_int = 3; +pub const MADV_WILLNEED: ::c_int = 4; +pub const MADV_DONTNEED: ::c_int = 5; +pub const MADV_FREE: ::c_int = 6; + +// https://github.com/haiku/haiku/blob/HEAD/headers/posix/net/if.h#L80 +pub const IFF_UP: ::c_int = 0x0001; +pub const IFF_BROADCAST: ::c_int = 0x0002; // valid broadcast address +pub const IFF_LOOPBACK: ::c_int = 0x0008; +pub const IFF_POINTOPOINT: ::c_int = 0x0010; // point-to-point link +pub const IFF_NOARP: ::c_int = 0x0040; // no address resolution +pub const IFF_AUTOUP: ::c_int = 0x0080; // auto dial +pub const IFF_PROMISC: ::c_int = 0x0100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x0200; // receive all multicast packets +pub const IFF_SIMPLEX: ::c_int = 0x0800; // doesn't receive own transmissions +pub const IFF_LINK: ::c_int = 0x1000; // has link +pub const IFF_AUTO_CONFIGURED: ::c_int = 0x2000; +pub const IFF_CONFIGURING: ::c_int = 0x4000; +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_INET: ::c_int = 1; +pub const AF_APPLETALK: ::c_int = 2; +pub const AF_ROUTE: ::c_int = 3; +pub const AF_LINK: ::c_int = 4; +pub const AF_INET6: ::c_int = 5; +pub const AF_DLI: ::c_int = 6; +pub const AF_IPX: ::c_int = 7; +pub const AF_NOTIFY: ::c_int = 8; +pub const AF_LOCAL: ::c_int = 9; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_BLUETOOTH: ::c_int = 10; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; + +pub const IP_OPTIONS: ::c_int = 1; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_TOS: ::c_int = 3; +pub const IP_TTL: ::c_int = 4; +pub const IP_RECVOPTS: ::c_int = 5; +pub const IP_RECVRETOPTS: ::c_int = 6; +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_RETOPTS: ::c_int = 8; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IP_BLOCK_SOURCE: ::c_int = 14; +pub const IP_UNBLOCK_SOURCE: ::c_int = 15; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 16; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 17; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_MAXSEG: ::c_int = 0x02; +pub const TCP_NOPUSH: ::c_int = 0x04; +pub const TCP_NOOPT: ::c_int = 0x08; + +pub const IF_NAMESIZE: ::size_t = 32; +pub const IFNAMSIZ: ::size_t = IF_NAMESIZE; + +pub const IPV6_MULTICAST_IF: ::c_int = 24; +pub const IPV6_MULTICAST_HOPS: ::c_int = 25; +pub const IPV6_MULTICAST_LOOP: ::c_int = 26; +pub const IPV6_UNICAST_HOPS: ::c_int = 27; +pub const IPV6_JOIN_GROUP: ::c_int = 28; +pub const IPV6_LEAVE_GROUP: ::c_int = 29; +pub const IPV6_V6ONLY: ::c_int = 30; +pub const IPV6_PKTINFO: ::c_int = 31; +pub const IPV6_RECVPKTINFO: ::c_int = 32; +pub const IPV6_HOPLIMIT: ::c_int = 33; +pub const IPV6_RECVHOPLIMIT: ::c_int = 34; +pub const IPV6_HOPOPTS: ::c_int = 35; +pub const IPV6_DSTOPTS: ::c_int = 36; +pub const IPV6_RTHDR: ::c_int = 37; + +pub const MSG_OOB: ::c_int = 0x0001; +pub const MSG_PEEK: ::c_int = 0x0002; +pub const MSG_DONTROUTE: ::c_int = 0x0004; +pub const MSG_EOR: ::c_int = 0x0008; +pub const MSG_TRUNC: ::c_int = 0x0010; +pub const MSG_CTRUNC: ::c_int = 0x0020; +pub const MSG_WAITALL: ::c_int = 0x0040; +pub const MSG_DONTWAIT: ::c_int = 0x0080; +pub const MSG_BCAST: ::c_int = 0x0100; +pub const MSG_MCAST: ::c_int = 0x0200; +pub const MSG_EOF: ::c_int = 0x0400; +pub const MSG_NOSIGNAL: ::c_int = 0x0800; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 0x01; +pub const LOCK_EX: ::c_int = 0x02; +pub const LOCK_NB: ::c_int = 0x04; +pub const LOCK_UN: ::c_int = 0x08; + +pub const MINSIGSTKSZ: ::size_t = 8192; +pub const SIGSTKSZ: ::size_t = 16384; + +pub const IOV_MAX: ::c_int = 1024; +pub const PATH_MAX: ::c_int = 1024; + +pub const SA_NOCLDSTOP: ::c_int = 0x01; +pub const SA_NOCLDWAIT: ::c_int = 0x02; +pub const SA_RESETHAND: ::c_int = 0x04; +pub const SA_NODEFER: ::c_int = 0x08; +pub const SA_RESTART: ::c_int = 0x10; +pub const SA_ONSTACK: ::c_int = 0x20; +pub const SA_SIGINFO: ::c_int = 0x40; +pub const SA_NOMASK: ::c_int = SA_NODEFER; +pub const SA_STACK: ::c_int = SA_ONSTACK; +pub const SA_ONESHOT: ::c_int = SA_RESETHAND; + +pub const SS_ONSTACK: ::c_int = 0x1; +pub const SS_DISABLE: ::c_int = 0x2; + +pub const FD_SETSIZE: usize = 1024; + +pub const RTLD_LOCAL: ::c_int = 0x0; +pub const RTLD_NOW: ::c_int = 0x1; +pub const RTLD_GLOBAL: ::c_int = 0x2; +pub const RTLD_DEFAULT: *mut ::c_void = 0isize as *mut ::c_void; + +pub const BUFSIZ: ::c_uint = 8192; +pub const FILENAME_MAX: ::c_uint = 256; +pub const FOPEN_MAX: ::c_uint = 128; +pub const L_tmpnam: ::c_uint = 512; +pub const TMP_MAX: ::c_uint = 32768; + +pub const _PC_CHOWN_RESTRICTED: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_NO_TRUNC: ::c_int = 5; +pub const _PC_PATH_MAX: ::c_int = 6; +pub const _PC_PIPE_BUF: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_LINK_MAX: ::c_int = 25; +pub const _PC_SYNC_IO: ::c_int = 26; +pub const _PC_ASYNC_IO: ::c_int = 27; +pub const _PC_PRIO_IO: ::c_int = 28; +pub const _PC_SOCK_MAXBUF: ::c_int = 29; +pub const _PC_FILESIZEBITS: ::c_int = 30; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 31; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 32; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 33; +pub const _PC_REC_XFER_ALIGN: ::c_int = 34; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 35; +pub const _PC_SYMLINK_MAX: ::c_int = 36; +pub const _PC_2_SYMLINKS: ::c_int = 37; +pub const _PC_XATTR_EXISTS: ::c_int = 38; +pub const _PC_XATTR_ENABLED: ::c_int = 39; + +pub const FIONBIO: ::c_ulong = 0xbe000000; +pub const FIONREAD: ::c_ulong = 0xbe000001; +pub const FIOSEEKDATA: ::c_ulong = 0xbe000002; +pub const FIOSEEKHOLE: ::c_ulong = 0xbe000003; + +pub const _SC_ARG_MAX: ::c_int = 15; +pub const _SC_CHILD_MAX: ::c_int = 16; +pub const _SC_CLK_TCK: ::c_int = 17; +pub const _SC_JOB_CONTROL: ::c_int = 18; +pub const _SC_NGROUPS_MAX: ::c_int = 19; +pub const _SC_OPEN_MAX: ::c_int = 20; +pub const _SC_SAVED_IDS: ::c_int = 21; +pub const _SC_STREAM_MAX: ::c_int = 22; +pub const _SC_TZNAME_MAX: ::c_int = 23; +pub const _SC_VERSION: ::c_int = 24; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 25; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 26; +pub const _SC_PAGESIZE: ::c_int = 27; +pub const _SC_PAGE_SIZE: ::c_int = 27; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 28; +pub const _SC_SEM_VALUE_MAX: ::c_int = 29; +pub const _SC_SEMAPHORES: ::c_int = 30; +pub const _SC_THREADS: ::c_int = 31; +pub const _SC_IOV_MAX: ::c_int = 32; +pub const _SC_UIO_MAXIOV: ::c_int = 32; +pub const _SC_NPROCESSORS_CONF: ::c_int = 34; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 35; +pub const _SC_ATEXIT_MAX: ::c_int = 37; +pub const _SC_PASS_MAX: ::c_int = 39; +pub const _SC_PHYS_PAGES: ::c_int = 40; +pub const _SC_AVPHYS_PAGES: ::c_int = 41; +pub const _SC_PIPE: ::c_int = 42; +pub const _SC_SELECT: ::c_int = 43; +pub const _SC_POLL: ::c_int = 44; +pub const _SC_MAPPED_FILES: ::c_int = 45; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 46; +pub const _SC_THREAD_STACK_MIN: ::c_int = 47; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 48; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 49; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 50; +pub const _SC_REALTIME_SIGNALS: ::c_int = 51; +pub const _SC_MEMORY_PROTECTION: ::c_int = 52; +pub const _SC_SIGQUEUE_MAX: ::c_int = 53; +pub const _SC_RTSIG_MAX: ::c_int = 54; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 55; +pub const _SC_DELAYTIMER_MAX: ::c_int = 56; +pub const _SC_TIMER_MAX: ::c_int = 57; +pub const _SC_TIMERS: ::c_int = 58; +pub const _SC_CPUTIME: ::c_int = 59; +pub const _SC_THREAD_CPUTIME: ::c_int = 60; +pub const _SC_HOST_NAME_MAX: ::c_int = 61; +pub const _SC_REGEXP: ::c_int = 62; +pub const _SC_SYMLOOP_MAX: ::c_int = 63; +pub const _SC_SHELL: ::c_int = 64; +pub const _SC_TTY_NAME_MAX: ::c_int = 65; + +pub const PTHREAD_STACK_MIN: ::size_t = 8192; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + flags: 0, + lock: 0, + unused: -42, + owner: -1, + owner_count: 0, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + flags: 0, + unused: -42, + mutex: 0 as *mut _, + waiter_count: 0, + lock: 0, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + flags: 0, + owner: -1, + lock_sem: 0, + lock_count: 0, + reader_count: 0, + writer_count: 0, + waiters: [0 as *mut _; 2], +}; + +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = 0; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 3; + +pub const FIOCLEX: c_ulong = 0; // FIXME: does not exist on Haiku! + +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SOL_SOCKET: ::c_int = -1; +pub const SO_ACCEPTCONN: ::c_int = 0x00000001; +pub const SO_BROADCAST: ::c_int = 0x00000002; +pub const SO_DEBUG: ::c_int = 0x00000004; +pub const SO_DONTROUTE: ::c_int = 0x00000008; +pub const SO_KEEPALIVE: ::c_int = 0x00000010; +pub const SO_OOBINLINE: ::c_int = 0x00000020; +pub const SO_REUSEADDR: ::c_int = 0x00000040; +pub const SO_REUSEPORT: ::c_int = 0x00000080; +pub const SO_USELOOPBACK: ::c_int = 0x00000100; +pub const SO_LINGER: ::c_int = 0x00000200; +pub const SO_SNDBUF: ::c_int = 0x40000001; +pub const SO_SNDLOWAT: ::c_int = 0x40000002; +pub const SO_SNDTIMEO: ::c_int = 0x40000003; +pub const SO_RCVBUF: ::c_int = 0x40000004; +pub const SO_RCVLOWAT: ::c_int = 0x40000005; +pub const SO_RCVTIMEO: ::c_int = 0x40000006; +pub const SO_ERROR: ::c_int = 0x40000007; +pub const SO_TYPE: ::c_int = 0x40000008; +pub const SO_NONBLOCK: ::c_int = 0x40000009; +pub const SO_BINDTODEVICE: ::c_int = 0x4000000a; +pub const SO_PEERCRED: ::c_int = 0x4000000b; + +pub const SCM_RIGHTS: ::c_int = 0x01; + +pub const SOMAXCONN: ::c_int = 32; + +pub const NI_MAXHOST: ::size_t = 1025; + +pub const WNOHANG: ::c_int = 0x01; +pub const WUNTRACED: ::c_int = 0x02; +pub const WCONTINUED: ::c_int = 0x04; +pub const WEXITED: ::c_int = 0x08; +pub const WSTOPPED: ::c_int = 0x10; +pub const WNOWAIT: ::c_int = 0x20; + +// si_code values for SIGBUS signal +pub const BUS_ADRALN: ::c_int = 40; +pub const BUS_ADRERR: ::c_int = 41; +pub const BUS_OBJERR: ::c_int = 42; + +// si_code values for SIGCHLD signal +pub const CLD_EXITED: ::c_int = 60; +pub const CLD_KILLED: ::c_int = 61; +pub const CLD_DUMPED: ::c_int = 62; +pub const CLD_TRAPPED: ::c_int = 63; +pub const CLD_STOPPED: ::c_int = 64; +pub const CLD_CONTINUED: ::c_int = 65; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; + +pub const UTIME_OMIT: c_long = 1000000001; +pub const UTIME_NOW: c_long = 1000000000; + +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VEOF: usize = 4; +pub const VEOL: usize = 5; +pub const VMIN: usize = 4; +pub const VTIME: usize = 5; +pub const VEOL2: usize = 6; +pub const VSWTCH: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; + +pub const IGNBRK: ::tcflag_t = 0x01; +pub const BRKINT: ::tcflag_t = 0x02; +pub const IGNPAR: ::tcflag_t = 0x04; +pub const PARMRK: ::tcflag_t = 0x08; +pub const INPCK: ::tcflag_t = 0x10; +pub const ISTRIP: ::tcflag_t = 0x20; +pub const INLCR: ::tcflag_t = 0x40; +pub const IGNCR: ::tcflag_t = 0x80; +pub const ICRNL: ::tcflag_t = 0x100; +pub const IUCLC: ::tcflag_t = 0x200; +pub const IXON: ::tcflag_t = 0x400; +pub const IXANY: ::tcflag_t = 0x800; +pub const IXOFF: ::tcflag_t = 0x1000; + +pub const OPOST: ::tcflag_t = 0x00000001; +pub const OLCUC: ::tcflag_t = 0x00000002; +pub const ONLCR: ::tcflag_t = 0x00000004; +pub const OCRNL: ::tcflag_t = 0x00000008; +pub const ONOCR: ::tcflag_t = 0x00000010; +pub const ONLRET: ::tcflag_t = 0x00000020; +pub const OFILL: ::tcflag_t = 0x00000040; +pub const OFDEL: ::tcflag_t = 0x00000080; +pub const NLDLY: ::tcflag_t = 0x00000100; +pub const NL0: ::tcflag_t = 0x00000000; +pub const NL1: ::tcflag_t = 0x00000100; +pub const CRDLY: ::tcflag_t = 0x00000600; +pub const CR0: ::tcflag_t = 0x00000000; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const TABDLY: ::tcflag_t = 0x00001800; +pub const TAB0: ::tcflag_t = 0x00000000; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const BSDLY: ::tcflag_t = 0x00002000; +pub const BS0: ::tcflag_t = 0x00000000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VTDLY: ::tcflag_t = 0x00004000; +pub const VT0: ::tcflag_t = 0x00000000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const FFDLY: ::tcflag_t = 0x00008000; +pub const FF0: ::tcflag_t = 0x00000000; +pub const FF1: ::tcflag_t = 0x00008000; + +pub const CSIZE: ::tcflag_t = 0x00000020; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CS6: ::tcflag_t = 0x00000000; +pub const CS7: ::tcflag_t = 0x00000000; +pub const CS8: ::tcflag_t = 0x00000020; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const XLOBLK: ::tcflag_t = 0x00001000; +pub const CTSFLOW: ::tcflag_t = 0x00002000; +pub const RTSFLOW: ::tcflag_t = 0x00004000; +pub const CRTSCTS: ::tcflag_t = RTSFLOW | CTSFLOW; + +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const XCASE: ::tcflag_t = 0x00000004; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const IEXTEN: ::tcflag_t = 0x00000200; +pub const ECHOCTL: ::tcflag_t = 0x00000400; +pub const ECHOPRT: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00001000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const PENDIN: ::tcflag_t = 0x00004000; + +pub const TCGB_CTS: ::c_int = 0x01; +pub const TCGB_DSR: ::c_int = 0x02; +pub const TCGB_RI: ::c_int = 0x04; +pub const TCGB_DCD: ::c_int = 0x08; +pub const TIOCM_CTS: ::c_int = TCGB_CTS; +pub const TIOCM_CD: ::c_int = TCGB_DCD; +pub const TIOCM_CAR: ::c_int = TIOCM_CD; +pub const TIOCM_RI: ::c_int = TCGB_RI; +pub const TIOCM_DSR: ::c_int = TCGB_DSR; +pub const TIOCM_DTR: ::c_int = 0x10; +pub const TIOCM_RTS: ::c_int = 0x20; + +pub const B0: speed_t = 0x00; +pub const B50: speed_t = 0x01; +pub const B75: speed_t = 0x02; +pub const B110: speed_t = 0x03; +pub const B134: speed_t = 0x04; +pub const B150: speed_t = 0x05; +pub const B200: speed_t = 0x06; +pub const B300: speed_t = 0x07; +pub const B600: speed_t = 0x08; +pub const B1200: speed_t = 0x09; +pub const B1800: speed_t = 0x0A; +pub const B2400: speed_t = 0x0B; +pub const B4800: speed_t = 0x0C; +pub const B9600: speed_t = 0x0D; +pub const B19200: speed_t = 0x0E; +pub const B38400: speed_t = 0x0F; +pub const B57600: speed_t = 0x10; +pub const B115200: speed_t = 0x11; +pub const B230400: speed_t = 0x12; +pub const B31250: speed_t = 0x13; + +pub const TCSANOW: ::c_int = 0x01; +pub const TCSADRAIN: ::c_int = 0x02; +pub const TCSAFLUSH: ::c_int = 0x04; + +pub const TCOOFF: ::c_int = 0x01; +pub const TCOON: ::c_int = 0x02; +pub const TCIOFF: ::c_int = 0x04; +pub const TCION: ::c_int = 0x08; + +pub const TCIFLUSH: ::c_int = 0x01; +pub const TCOFLUSH: ::c_int = 0x02; +pub const TCIOFLUSH: ::c_int = 0x03; + +pub const TCGETA: ::c_ulong = 0x8000; +pub const TCSETA: ::c_ulong = TCGETA + 1; +pub const TCSETAF: ::c_ulong = TCGETA + 2; +pub const TCSETAW: ::c_ulong = TCGETA + 3; +pub const TCWAITEVENT: ::c_ulong = TCGETA + 4; +pub const TCSBRK: ::c_ulong = TCGETA + 5; +pub const TCFLSH: ::c_ulong = TCGETA + 6; +pub const TCXONC: ::c_ulong = TCGETA + 7; +pub const TCQUERYCONNECTED: ::c_ulong = TCGETA + 8; +pub const TCGETBITS: ::c_ulong = TCGETA + 9; +pub const TCSETDTR: ::c_ulong = TCGETA + 10; +pub const TCSETRTS: ::c_ulong = TCGETA + 11; +pub const TIOCGWINSZ: ::c_ulong = TCGETA + 12; +pub const TIOCSWINSZ: ::c_ulong = TCGETA + 13; +pub const TCVTIME: ::c_ulong = TCGETA + 14; +pub const TIOCGPGRP: ::c_ulong = TCGETA + 15; +pub const TIOCSPGRP: ::c_ulong = TCGETA + 16; +pub const TIOCSCTTY: ::c_ulong = TCGETA + 17; +pub const TIOCMGET: ::c_ulong = TCGETA + 18; +pub const TIOCMSET: ::c_ulong = TCGETA + 19; +pub const TIOCSBRK: ::c_ulong = TCGETA + 20; +pub const TIOCCBRK: ::c_ulong = TCGETA + 21; +pub const TIOCMBIS: ::c_ulong = TCGETA + 22; +pub const TIOCMBIC: ::c_ulong = TCGETA + 23; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +// utmpx entry types +pub const EMPTY: ::c_short = 0; +pub const BOOT_TIME: ::c_short = 1; +pub const OLD_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 3; +pub const USER_PROCESS: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const DEAD_PROCESS: ::c_short = 7; + +pub const LOG_PID: ::c_int = 1 << 12; +pub const LOG_CONS: ::c_int = 2 << 12; +pub const LOG_ODELAY: ::c_int = 4 << 12; +pub const LOG_NDELAY: ::c_int = 8 << 12; +pub const LOG_SERIAL: ::c_int = 16 << 12; +pub const LOG_PERROR: ::c_int = 32 << 12; +pub const LOG_NOWAIT: ::c_int = 64 << 12; + +// spawn.h +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x01; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x02; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x10; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x20; +pub const POSIX_SPAWN_SETSID: ::c_int = 0x40; + +const_fn! { + {const} fn CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) + } +} + +f! { + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::())) + as ::c_uint + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + CMSG_ALIGN(::mem::size_of::()) as ::c_uint + length + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize) + + CMSG_ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +safe_f! { + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & !0xff) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + status & 0xff + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status >> 8) & 0xff) != 0 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + ((status >> 16) & 0xff) != 0 + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 16) & 0xff + } + + // actually WIFCORED, but this is used everywhere else + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x10000) != 0 + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + (status & 0x20000) != 0 + } +} + +extern "C" { + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn getpriority(which: ::c_int, who: id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: id_t, priority: ::c_int) -> ::c_int; + + pub fn endusershell(); + pub fn getpass(prompt: *const ::c_char) -> *mut ::c_char; + pub fn getusershell() -> *mut ::c_char; + pub fn issetugid() -> ::c_int; + pub fn setusershell(); + + pub fn utimensat( + fd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + pub fn _errnop() -> *mut ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + pub fn ppoll( + fds: *mut ::pollfd, + numfds: ::nfds_t, + timeout: *const ::timespec, + sigMask: *const sigset_t, + ) -> ::c_int; + + pub fn getspent() -> *mut spwd; + pub fn getspent_r( + pwd: *mut spwd, + buf: *mut ::c_char, + bufferSize: ::size_t, + res: *mut *mut spwd, + ) -> ::c_int; + pub fn setspent(); + pub fn endspent(); + pub fn getspnam(name: *const ::c_char) -> *mut spwd; + pub fn getspnam_r( + name: *const ::c_char, + spwd: *mut spwd, + buffer: *mut ::c_char, + bufferSize: ::size_t, + res: *mut *mut spwd, + ) -> ::c_int; + pub fn sgetspent(line: *const ::c_char) -> *mut spwd; + pub fn sgetspent_r( + line: *const ::c_char, + spwd: *mut spwd, + buffer: *mut ::c_char, + bufferSize: ::size_t, + res: *mut *mut spwd, + ) -> ::c_int; + pub fn fgetspent(file: *mut ::FILE) -> *mut spwd; + pub fn fgetspent_r( + file: *mut ::FILE, + spwd: *mut spwd, + buffer: *mut ::c_char, + bufferSize: ::size_t, + res: *mut *mut spwd, + ) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; + pub fn pthread_create( + thread: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn valloc(numBytes: ::size_t) -> *mut ::c_void; + pub fn malloc_usable_size(ptr: *mut ::c_void) -> ::size_t; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn initgroups(name: *const ::c_char, basegid: ::gid_t) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_spin_init(lock: *mut ::pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + + pub fn glob( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advice: ::c_int) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, count: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + environment: *const *const ::c_char, + ) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getgrouplist( + user: *const ::c_char, + basegroup: ::gid_t, + grouplist: *mut ::gid_t, + groupcount: *mut ::c_int, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwent() -> *mut passwd; + pub fn setpwent(); + pub fn endpwent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + pub fn setgrent(); + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + + pub fn getitimer(which: ::c_int, curr_value: *mut ::itimerval) -> ::c_int; + pub fn setitimer( + which: ::c_int, + new_value: *const ::itimerval, + old_value: *mut ::itimerval, + ) -> ::c_int; + + pub fn regcomp(preg: *mut regex_t, pattern: *const ::c_char, cflags: ::c_int) -> ::c_int; + + pub fn regexec( + preg: *const regex_t, + input: *const ::c_char, + nmatch: ::size_t, + pmatch: *mut regmatch_t, + eflags: ::c_int, + ) -> ::c_int; + + pub fn regerror( + errcode: ::c_int, + preg: *const regex_t, + errbuf: *mut ::c_char, + errbuf_size: ::size_t, + ) -> ::size_t; + + pub fn regfree(preg: *mut regex_t); + + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtype: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + pub fn msgsnd( + msqid: ::c_int, + msgp: *const ::c_void, + msgsz: ::size_t, + msgflg: ::c_int, + ) -> ::c_int; + pub fn semget(key: ::key_t, nsems: ::c_int, semflg: ::c_int) -> ::c_int; + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut sembuf, nsops: ::size_t) -> ::c_int; + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + + pub fn lsearch( + key: *const ::c_void, + base: *mut ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn lfind( + key: *const ::c_void, + base: *const ::c_void, + nelp: *mut ::size_t, + width: ::size_t, + compar: ::Option ::c_int>, + ) -> *mut ::c_void; + pub fn hcreate(nelt: ::size_t) -> ::c_int; + pub fn hdestroy(); + pub fn hsearch(entry: ::ENTRY, action: ::ACTION) -> *mut ::ENTRY; + + pub fn drand48() -> ::c_double; + pub fn erand48(xseed: *mut ::c_ushort) -> ::c_double; + pub fn lrand48() -> ::c_long; + pub fn nrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn mrand48() -> ::c_long; + pub fn jrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn srand48(seed: ::c_long); + pub fn seed48(xseed: *mut ::c_ushort) -> *mut ::c_ushort; + pub fn lcong48(p: *mut ::c_ushort); + + pub fn clearenv() -> ::c_int; + pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; + + pub fn sync(); + pub fn getpagesize() -> ::c_int; + + pub fn brk(addr: *mut ::c_void) -> ::c_int; + pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; + + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(file_actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy( + file_actions: *mut posix_spawn_file_actions_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + file_actions: *mut posix_spawn_file_actions_t, + fildes: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + file_actions: *mut posix_spawn_file_actions_t, + fildes: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + file_actions: *mut posix_spawn_file_actions_t, + fildes: ::c_int, + newfildes: ::c_int, + ) -> ::c_int; + + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + _flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + _pgroup: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, pgroup: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + sigdefault: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + sigdefault: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + _sigmask: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + sigmask: *const ::sigset_t, + ) -> ::c_int; + pub fn getopt_long( + argc: ::c_int, + argv: *const *mut c_char, + optstring: *const c_char, + longopts: *const option, + longindex: *mut ::c_int, + ) -> ::c_int; + pub fn strcasecmp_l( + string1: *const ::c_char, + string2: *const ::c_char, + locale: ::locale_t, + ) -> ::c_int; + pub fn strncasecmp_l( + string1: *const ::c_char, + string2: *const ::c_char, + length: ::size_t, + locale: ::locale_t, + ) -> ::c_int; +} + +#[link(name = "bsd")] +extern "C" { + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn strsep(string: *mut *mut ::c_char, delimiters: *const ::c_char) -> *mut ::c_char; + pub fn explicit_bzero(buf: *mut ::c_void, len: ::size_t); + pub fn login_tty(_fd: ::c_int) -> ::c_int; + + pub fn sl_init() -> *mut StringList; + pub fn sl_add(sl: *mut StringList, n: *mut ::c_char) -> ::c_int; + pub fn sl_free(sl: *mut StringList, i: ::c_int); + pub fn sl_find(sl: *mut StringList, n: *mut ::c_char) -> *mut ::c_char; + + pub fn getprogname() -> *const ::c_char; + pub fn setprogname(progname: *const ::c_char); + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; +} + +#[link(name = "gnu")] +extern "C" { + pub fn memmem( + source: *const ::c_void, + sourceLength: ::size_t, + search: *const ::c_void, + searchLength: ::size_t, + ) -> *mut ::c_void; +} + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + mod b64; + pub use self::b64::*; + } else { + mod b32; + pub use self::b32::*; + } +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + // TODO + // mod x86; + // pub use self::x86::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + // TODO + // mod aarch64; + // pub use self::aarch64::*; + } +} + +mod native; +pub use self::native::*; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/native.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/native.rs new file mode 100644 index 0000000..44bcc1e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/native.rs @@ -0,0 +1,1366 @@ +// This module contains bindings to the native Haiku API. The Haiku API +// originates from BeOS, and it was the original way to perform low level +// system and IO operations. The POSIX API was in that era was like a +// compatibility layer. In current Haiku development, both the POSIX API and +// the Haiku API are considered to be co-equal status. However, they are not +// integrated like they are on other UNIX platforms, which means that for many +// low level concepts there are two versions, like processes (POSIX) and +// teams (Haiku), or pthreads and native threads. +// +// Both the POSIX API and the Haiku API live in libroot.so, the library that is +// linked to any binary by default. +// +// This file follows the Haiku API for Haiku R1 beta 2. It is organized by the +// C/C++ header files in which the concepts can be found, while adhering to the +// style guide for this crate. + +// Helper macro to generate u32 constants. The Haiku API uses (non-standard) +// multi-character constants (like 'UPDA' or 'MSGM') to represent 32 bit +// integer constants. + +macro_rules! haiku_constant { + ($a:tt, $b:tt, $c:tt, $d:tt) => { + (($a as u32) << 24) + (($b as u32) << 16) + (($c as u32) << 8) + ($d as u32) + }; +} + +// support/SupportDefs.h +pub type status_t = i32; +pub type bigtime_t = i64; +pub type nanotime_t = i64; +pub type type_code = u32; +pub type perform_code = u32; + +// kernel/OS.h +pub type area_id = i32; +pub type port_id = i32; +pub type sem_id = i32; +pub type team_id = i32; +pub type thread_id = i32; + +pub type thread_func = extern "C" fn(*mut ::c_void) -> status_t; + +// kernel/image.h +pub type image_id = i32; + +e! { + // kernel/OS.h + pub enum thread_state { + B_THREAD_RUNNING = 1, + B_THREAD_READY, + B_THREAD_RECEIVING, + B_THREAD_ASLEEP, + B_THREAD_SUSPENDED, + B_THREAD_WAITING + } + + // kernel/image.h + pub enum image_type { + B_APP_IMAGE = 1, + B_LIBRARY_IMAGE, + B_ADD_ON_IMAGE, + B_SYSTEM_IMAGE + } + + // kernel/scheduler.h + + pub enum be_task_flags { + B_DEFAULT_MEDIA_PRIORITY = 0x000, + B_OFFLINE_PROCESSING = 0x001, + B_STATUS_RENDERING = 0x002, + B_USER_INPUT_HANDLING = 0x004, + B_LIVE_VIDEO_MANIPULATION = 0x008, + B_VIDEO_PLAYBACK = 0x010, + B_VIDEO_RECORDING = 0x020, + B_LIVE_AUDIO_MANIPULATION = 0x040, + B_AUDIO_PLAYBACK = 0x080, + B_AUDIO_RECORDING = 0x100, + B_LIVE_3D_RENDERING = 0x200, + B_NUMBER_CRUNCHING = 0x400, + B_MIDI_PROCESSING = 0x800, + } + + pub enum schduler_mode { + SCHEDULER_MODE_LOW_LATENCY, + SCHEDULER_MODE_POWER_SAVING, + } + + // FindDirectory.h + pub enum path_base_directory { + B_FIND_PATH_INSTALLATION_LOCATION_DIRECTORY, + B_FIND_PATH_ADD_ONS_DIRECTORY, + B_FIND_PATH_APPS_DIRECTORY, + B_FIND_PATH_BIN_DIRECTORY, + B_FIND_PATH_BOOT_DIRECTORY, + B_FIND_PATH_CACHE_DIRECTORY, + B_FIND_PATH_DATA_DIRECTORY, + B_FIND_PATH_DEVELOP_DIRECTORY, + B_FIND_PATH_DEVELOP_LIB_DIRECTORY, + B_FIND_PATH_DOCUMENTATION_DIRECTORY, + B_FIND_PATH_ETC_DIRECTORY, + B_FIND_PATH_FONTS_DIRECTORY, + B_FIND_PATH_HEADERS_DIRECTORY, + B_FIND_PATH_LIB_DIRECTORY, + B_FIND_PATH_LOG_DIRECTORY, + B_FIND_PATH_MEDIA_NODES_DIRECTORY, + B_FIND_PATH_PACKAGES_DIRECTORY, + B_FIND_PATH_PREFERENCES_DIRECTORY, + B_FIND_PATH_SERVERS_DIRECTORY, + B_FIND_PATH_SETTINGS_DIRECTORY, + B_FIND_PATH_SOUNDS_DIRECTORY, + B_FIND_PATH_SPOOL_DIRECTORY, + B_FIND_PATH_TRANSLATORS_DIRECTORY, + B_FIND_PATH_VAR_DIRECTORY, + B_FIND_PATH_IMAGE_PATH = 1000, + B_FIND_PATH_PACKAGE_PATH, + } + + pub enum directory_which { + B_DESKTOP_DIRECTORY = 0, + B_TRASH_DIRECTORY, + B_SYSTEM_DIRECTORY = 1000, + B_SYSTEM_ADDONS_DIRECTORY = 1002, + B_SYSTEM_BOOT_DIRECTORY, + B_SYSTEM_FONTS_DIRECTORY, + B_SYSTEM_LIB_DIRECTORY, + B_SYSTEM_SERVERS_DIRECTORY, + B_SYSTEM_APPS_DIRECTORY, + B_SYSTEM_BIN_DIRECTORY, + B_SYSTEM_DOCUMENTATION_DIRECTORY = 1010, + B_SYSTEM_PREFERENCES_DIRECTORY, + B_SYSTEM_TRANSLATORS_DIRECTORY, + B_SYSTEM_MEDIA_NODES_DIRECTORY, + B_SYSTEM_SOUNDS_DIRECTORY, + B_SYSTEM_DATA_DIRECTORY, + B_SYSTEM_DEVELOP_DIRECTORY, + B_SYSTEM_PACKAGES_DIRECTORY, + B_SYSTEM_HEADERS_DIRECTORY, + B_SYSTEM_ETC_DIRECTORY = 2008, + B_SYSTEM_SETTINGS_DIRECTORY = 2010, + B_SYSTEM_LOG_DIRECTORY = 2012, + B_SYSTEM_SPOOL_DIRECTORY, + B_SYSTEM_TEMP_DIRECTORY, + B_SYSTEM_VAR_DIRECTORY, + B_SYSTEM_CACHE_DIRECTORY = 2020, + B_SYSTEM_NONPACKAGED_DIRECTORY = 2023, + B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, + B_SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY, + B_SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY, + B_SYSTEM_NONPACKAGED_BIN_DIRECTORY, + B_SYSTEM_NONPACKAGED_DATA_DIRECTORY, + B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY, + B_SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY, + B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY, + B_SYSTEM_NONPACKAGED_LIB_DIRECTORY, + B_SYSTEM_NONPACKAGED_HEADERS_DIRECTORY, + B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY, + B_USER_DIRECTORY = 3000, + B_USER_CONFIG_DIRECTORY, + B_USER_ADDONS_DIRECTORY, + B_USER_BOOT_DIRECTORY, + B_USER_FONTS_DIRECTORY, + B_USER_LIB_DIRECTORY, + B_USER_SETTINGS_DIRECTORY, + B_USER_DESKBAR_DIRECTORY, + B_USER_PRINTERS_DIRECTORY, + B_USER_TRANSLATORS_DIRECTORY, + B_USER_MEDIA_NODES_DIRECTORY, + B_USER_SOUNDS_DIRECTORY, + B_USER_DATA_DIRECTORY, + B_USER_CACHE_DIRECTORY, + B_USER_PACKAGES_DIRECTORY, + B_USER_HEADERS_DIRECTORY, + B_USER_NONPACKAGED_DIRECTORY, + B_USER_NONPACKAGED_ADDONS_DIRECTORY, + B_USER_NONPACKAGED_TRANSLATORS_DIRECTORY, + B_USER_NONPACKAGED_MEDIA_NODES_DIRECTORY, + B_USER_NONPACKAGED_BIN_DIRECTORY, + B_USER_NONPACKAGED_DATA_DIRECTORY, + B_USER_NONPACKAGED_FONTS_DIRECTORY, + B_USER_NONPACKAGED_SOUNDS_DIRECTORY, + B_USER_NONPACKAGED_DOCUMENTATION_DIRECTORY, + B_USER_NONPACKAGED_LIB_DIRECTORY, + B_USER_NONPACKAGED_HEADERS_DIRECTORY, + B_USER_NONPACKAGED_DEVELOP_DIRECTORY, + B_USER_DEVELOP_DIRECTORY, + B_USER_DOCUMENTATION_DIRECTORY, + B_USER_SERVERS_DIRECTORY, + B_USER_APPS_DIRECTORY, + B_USER_BIN_DIRECTORY, + B_USER_PREFERENCES_DIRECTORY, + B_USER_ETC_DIRECTORY, + B_USER_LOG_DIRECTORY, + B_USER_SPOOL_DIRECTORY, + B_USER_VAR_DIRECTORY, + B_APPS_DIRECTORY = 4000, + B_PREFERENCES_DIRECTORY, + B_UTILITIES_DIRECTORY, + B_PACKAGE_LINKS_DIRECTORY, + } +} + +s! { + // kernel/OS.h + pub struct area_info { + pub area: area_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub size: usize, + pub lock: u32, + pub protection: u32, + pub team: team_id, + pub ram_size: u32, + pub copy_count: u32, + pub in_count: u32, + pub out_count: u32, + pub address: *mut ::c_void + } + + pub struct port_info { + pub port: port_id, + pub team: team_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub capacity: i32, + pub queue_count: i32, + pub total_count: i32, + } + + pub struct port_message_info { + pub size: ::size_t, + pub sender: ::uid_t, + pub sender_group: ::gid_t, + pub sender_team: ::team_id + } + + pub struct team_info { + pub team: team_id, + pub thread_count: i32, + pub image_count: i32, + pub area_count: i32, + pub debugger_nub_thread: thread_id, + pub debugger_nub_port: port_id, + pub argc: i32, + pub args: [::c_char; 64], + pub uid: ::uid_t, + pub gid: ::gid_t + } + + pub struct sem_info { + pub sem: sem_id, + pub team: team_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub count: i32, + pub latest_holder: thread_id + } + + pub struct team_usage_info { + pub user_time: bigtime_t, + pub kernel_time: bigtime_t + } + + pub struct thread_info { + pub thread: thread_id, + pub team: team_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub state: thread_state, + pub priority: i32, + pub sem: sem_id, + pub user_time: bigtime_t, + pub kernel_time: bigtime_t, + pub stack_base: *mut ::c_void, + pub stack_end: *mut ::c_void + } + + pub struct cpu_info { + pub active_time: bigtime_t, + pub enabled: bool, + pub current_frequency: u64 + } + + pub struct system_info { + pub boot_time: bigtime_t, + pub cpu_count: u32, + pub max_pages: u64, + pub used_pages: u64, + pub cached_pages: u64, + pub block_cache_pages: u64, + pub ignored_pages: u64, + pub needed_memory: u64, + pub free_memory: u64, + pub max_swap_pages: u64, + pub free_swap_pages: u64, + pub page_faults: u32, + pub max_sems: u32, + pub used_sems: u32, + pub max_ports: u32, + pub used_ports: u32, + pub max_threads: u32, + pub used_threads: u32, + pub max_teams: u32, + pub used_teams: u32, + pub kernel_name: [::c_char; B_FILE_NAME_LENGTH], + pub kernel_build_date: [::c_char; B_OS_NAME_LENGTH], + pub kernel_build_time: [::c_char; B_OS_NAME_LENGTH], + pub kernel_version: i64, + pub abi: u32 + } + + pub struct object_wait_info { + pub object: i32, + pub type_: u16, + pub events: u16 + } + + // kernel/fs_attr.h + pub struct attr_info { + pub type_: u32, + pub size: ::off_t + } + + // kernel/fs_index.h + pub struct index_info { + pub type_: u32, + pub size: ::off_t, + pub modification_time: ::time_t, + pub creation_time: ::time_t, + pub uid: ::uid_t, + pub gid: ::gid_t + } + + //kernel/fs_info.h + pub struct fs_info { + pub dev: ::dev_t, + pub root: ::ino_t, + pub flags: u32, + pub block_size: ::off_t, + pub io_size: ::off_t, + pub total_blocks: ::off_t, + pub free_blocks: ::off_t, + pub total_nodes: ::off_t, + pub free_nodes: ::off_t, + pub device_name: [::c_char; 128], + pub volume_name: [::c_char; B_FILE_NAME_LENGTH], + pub fsh_name: [::c_char; B_OS_NAME_LENGTH] + } + + // kernel/image.h + pub struct image_info { + pub id: image_id, + pub image_type: ::c_int, + pub sequence: i32, + pub init_order: i32, + pub init_routine: extern "C" fn(), + pub term_routine: extern "C" fn(), + pub device: ::dev_t, + pub node: ::ino_t, + pub name: [::c_char; ::PATH_MAX as usize], + pub text: *mut ::c_void, + pub data: *mut ::c_void, + pub text_size: i32, + pub data_size: i32, + pub api_version: i32, + pub abi: i32 + } + + pub struct __c_anonymous_eax_0 { + pub max_eax: u32, + pub vendor_id: [::c_char; 12], + } + + pub struct __c_anonymous_eax_1 { + pub stepping: u32, + pub model: u32, + pub family: u32, + pub tpe: u32, + __reserved_0: u32, + pub extended_model: u32, + pub extended_family: u32, + __reserved_1: u32, + pub brand_index: u32, + pub clflush: u32, + pub logical_cpus: u32, + pub apic_id: u32, + pub features: u32, + pub extended_features: u32, + } + + pub struct __c_anonymous_eax_2 { + pub call_num: u8, + pub cache_descriptors: [u8; 15], + } + + pub struct __c_anonymous_eax_3 { + __reserved: [u32; 2], + pub serial_number_high: u32, + pub serial_number_low: u32, + } + + pub struct __c_anonymous_regs { + pub eax: u32, + pub ebx: u32, + pub edx: u32, + pub ecx: u32, + } +} + +s_no_extra_traits! { + #[cfg(libc_union)] + pub union cpuid_info { + pub eax_0: __c_anonymous_eax_0, + pub eax_1: __c_anonymous_eax_1, + pub eax_2: __c_anonymous_eax_2, + pub eax_3: __c_anonymous_eax_3, + pub as_chars: [::c_char; 16], + pub regs: __c_anonymous_regs, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + #[cfg(libc_union)] + impl PartialEq for cpuid_info { + fn eq(&self, other: &cpuid_info) -> bool { + unsafe { + self.eax_0 == other.eax_0 + || self.eax_1 == other.eax_1 + || self.eax_2 == other.eax_2 + || self.eax_3 == other.eax_3 + || self.as_chars == other.as_chars + || self.regs == other.regs + } + } + } + #[cfg(libc_union)] + impl Eq for cpuid_info {} + #[cfg(libc_union)] + impl ::fmt::Debug for cpuid_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("cpuid_info") + .field("eax_0", &self.eax_0) + .field("eax_1", &self.eax_1) + .field("eax_2", &self.eax_2) + .field("eax_3", &self.eax_3) + .field("as_chars", &self.as_chars) + .field("regs", &self.regs) + .finish() + } + } + } + } +} + +// kernel/OS.h +pub const B_OS_NAME_LENGTH: usize = 32; +pub const B_PAGE_SIZE: usize = 4096; +pub const B_INFINITE_TIMEOUT: usize = 9223372036854775807; + +pub const B_RELATIVE_TIMEOUT: u32 = 0x8; +pub const B_ABSOLUTE_TIMEOUT: u32 = 0x10; +pub const B_TIMEOUT_REAL_TIME_BASE: u32 = 0x40; +pub const B_ABSOLUTE_REAL_TIME_TIMEOUT: u32 = B_ABSOLUTE_TIMEOUT | B_TIMEOUT_REAL_TIME_BASE; + +pub const B_NO_LOCK: u32 = 0; +pub const B_LAZY_LOCK: u32 = 1; +pub const B_FULL_LOCK: u32 = 2; +pub const B_CONTIGUOUS: u32 = 3; +pub const B_LOMEM: u32 = 4; +pub const B_32_BIT_FULL_LOCK: u32 = 5; +pub const B_32_BIT_CONTIGUOUS: u32 = 6; + +pub const B_ANY_ADDRESS: u32 = 0; +pub const B_EXACT_ADDRESS: u32 = 1; +pub const B_BASE_ADDRESS: u32 = 2; +pub const B_CLONE_ADDRESS: u32 = 3; +pub const B_ANY_KERNEL_ADDRESS: u32 = 4; +pub const B_RANDOMIZED_ANY_ADDRESS: u32 = 6; +pub const B_RANDOMIZED_BASE_ADDRESS: u32 = 7; + +pub const B_READ_AREA: u32 = 1 << 0; +pub const B_WRITE_AREA: u32 = 1 << 1; +pub const B_EXECUTE_AREA: u32 = 1 << 2; +pub const B_STACK_AREA: u32 = 1 << 3; +pub const B_CLONEABLE_AREA: u32 = 1 << 8; + +pub const B_CAN_INTERRUPT: u32 = 0x01; +pub const B_CHECK_PERMISSION: u32 = 0x04; +pub const B_KILL_CAN_INTERRUPT: u32 = 0x20; +pub const B_DO_NOT_RESCHEDULE: u32 = 0x02; +pub const B_RELEASE_ALL: u32 = 0x08; +pub const B_RELEASE_IF_WAITING_ONLY: u32 = 0x10; + +pub const B_CURRENT_TEAM: team_id = 0; +pub const B_SYSTEM_TEAM: team_id = 1; + +pub const B_TEAM_USAGE_SELF: i32 = 0; +pub const B_TEAM_USAGE_CHILDREN: i32 = -1; + +pub const B_IDLE_PRIORITY: i32 = 0; +pub const B_LOWEST_ACTIVE_PRIORITY: i32 = 1; +pub const B_LOW_PRIORITY: i32 = 5; +pub const B_NORMAL_PRIORITY: i32 = 10; +pub const B_DISPLAY_PRIORITY: i32 = 15; +pub const B_URGENT_DISPLAY_PRIORITY: i32 = 20; +pub const B_REAL_TIME_DISPLAY_PRIORITY: i32 = 100; +pub const B_URGENT_PRIORITY: i32 = 110; +pub const B_REAL_TIME_PRIORITY: i32 = 120; + +pub const B_SYSTEM_TIMEBASE: i32 = 0; +pub const B_FIRST_REAL_TIME_PRIORITY: i32 = B_REAL_TIME_DISPLAY_PRIORITY; + +pub const B_ONE_SHOT_ABSOLUTE_ALARM: u32 = 1; +pub const B_ONE_SHOT_RELATIVE_ALARM: u32 = 2; +pub const B_PERIODIC_ALARM: u32 = 3; + +pub const B_OBJECT_TYPE_FD: u16 = 0; +pub const B_OBJECT_TYPE_SEMAPHORE: u16 = 1; +pub const B_OBJECT_TYPE_PORT: u16 = 2; +pub const B_OBJECT_TYPE_THREAD: u16 = 3; + +pub const B_EVENT_READ: u16 = 0x0001; +pub const B_EVENT_WRITE: u16 = 0x0002; +pub const B_EVENT_ERROR: u16 = 0x0004; +pub const B_EVENT_PRIORITY_READ: u16 = 0x0008; +pub const B_EVENT_PRIORITY_WRITE: u16 = 0x0010; +pub const B_EVENT_HIGH_PRIORITY_READ: u16 = 0x0020; +pub const B_EVENT_HIGH_PRIORITY_WRITE: u16 = 0x0040; +pub const B_EVENT_DISCONNECTED: u16 = 0x0080; +pub const B_EVENT_ACQUIRE_SEMAPHORE: u16 = 0x0001; +pub const B_EVENT_INVALID: u16 = 0x1000; + +// kernel/fs_info.h +pub const B_FS_IS_READONLY: u32 = 0x00000001; +pub const B_FS_IS_REMOVABLE: u32 = 0x00000002; +pub const B_FS_IS_PERSISTENT: u32 = 0x00000004; +pub const B_FS_IS_SHARED: u32 = 0x00000008; +pub const B_FS_HAS_MIME: u32 = 0x00010000; +pub const B_FS_HAS_ATTR: u32 = 0x00020000; +pub const B_FS_HAS_QUERY: u32 = 0x00040000; +pub const B_FS_HAS_SELF_HEALING_LINKS: u32 = 0x00080000; +pub const B_FS_HAS_ALIASES: u32 = 0x00100000; +pub const B_FS_SUPPORTS_NODE_MONITORING: u32 = 0x00200000; +pub const B_FS_SUPPORTS_MONITOR_CHILDREN: u32 = 0x00400000; + +// kernel/fs_query.h +pub const B_LIVE_QUERY: u32 = 0x00000001; +pub const B_QUERY_NON_INDEXED: u32 = 0x00000002; + +// kernel/fs_volume.h +pub const B_MOUNT_READ_ONLY: u32 = 1; +pub const B_MOUNT_VIRTUAL_DEVICE: u32 = 2; +pub const B_FORCE_UNMOUNT: u32 = 1; + +// kernel/image.h +pub const B_FLUSH_DCACHE: u32 = 0x0001; +pub const B_FLUSH_ICACHE: u32 = 0x0004; +pub const B_INVALIDATE_DCACHE: u32 = 0x0002; +pub const B_INVALIDATE_ICACHE: u32 = 0x0008; + +pub const B_SYMBOL_TYPE_DATA: i32 = 0x1; +pub const B_SYMBOL_TYPE_TEXT: i32 = 0x2; +pub const B_SYMBOL_TYPE_ANY: i32 = 0x5; + +// storage/StorageDefs.h +pub const B_DEV_NAME_LENGTH: usize = 128; +pub const B_FILE_NAME_LENGTH: usize = ::FILENAME_MAX as usize; +pub const B_PATH_NAME_LENGTH: usize = ::PATH_MAX as usize; +pub const B_ATTR_NAME_LENGTH: usize = B_FILE_NAME_LENGTH - 1; +pub const B_MIME_TYPE_LENGTH: usize = B_ATTR_NAME_LENGTH - 15; +pub const B_MAX_SYMLINKS: usize = 16; + +// Haiku open modes in BFile are passed as u32 +pub const B_READ_ONLY: u32 = ::O_RDONLY as u32; +pub const B_WRITE_ONLY: u32 = ::O_WRONLY as u32; +pub const B_READ_WRITE: u32 = ::O_RDWR as u32; + +pub const B_FAIL_IF_EXISTS: u32 = ::O_EXCL as u32; +pub const B_CREATE_FILE: u32 = ::O_CREAT as u32; +pub const B_ERASE_FILE: u32 = ::O_TRUNC as u32; +pub const B_OPEN_AT_END: u32 = ::O_APPEND as u32; + +pub const B_FILE_NODE: u32 = 0x01; +pub const B_SYMLINK_NODE: u32 = 0x02; +pub const B_DIRECTORY_NODE: u32 = 0x04; +pub const B_ANY_NODE: u32 = 0x07; + +// support/Errors.h +pub const B_GENERAL_ERROR_BASE: status_t = core::i32::MIN; +pub const B_OS_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x1000; +pub const B_APP_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x2000; +pub const B_INTERFACE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x3000; +pub const B_MEDIA_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x4000; +pub const B_TRANSLATION_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x4800; +pub const B_MIDI_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x5000; +pub const B_STORAGE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x6000; +pub const B_POSIX_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x7000; +pub const B_MAIL_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x8000; +pub const B_PRINT_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x9000; +pub const B_DEVICE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0xa000; +pub const B_ERRORS_END: status_t = B_GENERAL_ERROR_BASE + 0xffff; + +// General errors +pub const B_NO_MEMORY: status_t = B_GENERAL_ERROR_BASE + 0; +pub const B_IO_ERROR: status_t = B_GENERAL_ERROR_BASE + 1; +pub const B_PERMISSION_DENIED: status_t = B_GENERAL_ERROR_BASE + 2; +pub const B_BAD_INDEX: status_t = B_GENERAL_ERROR_BASE + 3; +pub const B_BAD_TYPE: status_t = B_GENERAL_ERROR_BASE + 4; +pub const B_BAD_VALUE: status_t = B_GENERAL_ERROR_BASE + 5; +pub const B_MISMATCHED_VALUES: status_t = B_GENERAL_ERROR_BASE + 6; +pub const B_NAME_NOT_FOUND: status_t = B_GENERAL_ERROR_BASE + 7; +pub const B_NAME_IN_USE: status_t = B_GENERAL_ERROR_BASE + 8; +pub const B_TIMED_OUT: status_t = B_GENERAL_ERROR_BASE + 9; +pub const B_INTERRUPTED: status_t = B_GENERAL_ERROR_BASE + 10; +pub const B_WOULD_BLOCK: status_t = B_GENERAL_ERROR_BASE + 11; +pub const B_CANCELED: status_t = B_GENERAL_ERROR_BASE + 12; +pub const B_NO_INIT: status_t = B_GENERAL_ERROR_BASE + 13; +pub const B_NOT_INITIALIZED: status_t = B_GENERAL_ERROR_BASE + 13; +pub const B_BUSY: status_t = B_GENERAL_ERROR_BASE + 14; +pub const B_NOT_ALLOWED: status_t = B_GENERAL_ERROR_BASE + 15; +pub const B_BAD_DATA: status_t = B_GENERAL_ERROR_BASE + 16; +pub const B_DONT_DO_THAT: status_t = B_GENERAL_ERROR_BASE + 17; + +pub const B_ERROR: status_t = -1; +pub const B_OK: status_t = 0; +pub const B_NO_ERROR: status_t = 0; + +// Kernel kit errors +pub const B_BAD_SEM_ID: status_t = B_OS_ERROR_BASE + 0; +pub const B_NO_MORE_SEMS: status_t = B_OS_ERROR_BASE + 1; + +pub const B_BAD_THREAD_ID: status_t = B_OS_ERROR_BASE + 0x100; +pub const B_NO_MORE_THREADS: status_t = B_OS_ERROR_BASE + 0x101; +pub const B_BAD_THREAD_STATE: status_t = B_OS_ERROR_BASE + 0x102; +pub const B_BAD_TEAM_ID: status_t = B_OS_ERROR_BASE + 0x103; +pub const B_NO_MORE_TEAMS: status_t = B_OS_ERROR_BASE + 0x104; + +pub const B_BAD_PORT_ID: status_t = B_OS_ERROR_BASE + 0x200; +pub const B_NO_MORE_PORTS: status_t = B_OS_ERROR_BASE + 0x201; + +pub const B_BAD_IMAGE_ID: status_t = B_OS_ERROR_BASE + 0x300; +pub const B_BAD_ADDRESS: status_t = B_OS_ERROR_BASE + 0x301; +pub const B_NOT_AN_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x302; +pub const B_MISSING_LIBRARY: status_t = B_OS_ERROR_BASE + 0x303; +pub const B_MISSING_SYMBOL: status_t = B_OS_ERROR_BASE + 0x304; +pub const B_UNKNOWN_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x305; +pub const B_LEGACY_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x306; + +pub const B_DEBUGGER_ALREADY_INSTALLED: status_t = B_OS_ERROR_BASE + 0x400; + +// Application kit errors +pub const B_BAD_REPLY: status_t = B_APP_ERROR_BASE + 0; +pub const B_DUPLICATE_REPLY: status_t = B_APP_ERROR_BASE + 1; +pub const B_MESSAGE_TO_SELF: status_t = B_APP_ERROR_BASE + 2; +pub const B_BAD_HANDLER: status_t = B_APP_ERROR_BASE + 3; +pub const B_ALREADY_RUNNING: status_t = B_APP_ERROR_BASE + 4; +pub const B_LAUNCH_FAILED: status_t = B_APP_ERROR_BASE + 5; +pub const B_AMBIGUOUS_APP_LAUNCH: status_t = B_APP_ERROR_BASE + 6; +pub const B_UNKNOWN_MIME_TYPE: status_t = B_APP_ERROR_BASE + 7; +pub const B_BAD_SCRIPT_SYNTAX: status_t = B_APP_ERROR_BASE + 8; +pub const B_LAUNCH_FAILED_NO_RESOLVE_LINK: status_t = B_APP_ERROR_BASE + 9; +pub const B_LAUNCH_FAILED_EXECUTABLE: status_t = B_APP_ERROR_BASE + 10; +pub const B_LAUNCH_FAILED_APP_NOT_FOUND: status_t = B_APP_ERROR_BASE + 11; +pub const B_LAUNCH_FAILED_APP_IN_TRASH: status_t = B_APP_ERROR_BASE + 12; +pub const B_LAUNCH_FAILED_NO_PREFERRED_APP: status_t = B_APP_ERROR_BASE + 13; +pub const B_LAUNCH_FAILED_FILES_APP_NOT_FOUND: status_t = B_APP_ERROR_BASE + 14; +pub const B_BAD_MIME_SNIFFER_RULE: status_t = B_APP_ERROR_BASE + 15; +pub const B_NOT_A_MESSAGE: status_t = B_APP_ERROR_BASE + 16; +pub const B_SHUTDOWN_CANCELLED: status_t = B_APP_ERROR_BASE + 17; +pub const B_SHUTTING_DOWN: status_t = B_APP_ERROR_BASE + 18; + +// Storage kit errors +pub const B_FILE_ERROR: status_t = B_STORAGE_ERROR_BASE + 0; +pub const B_FILE_EXISTS: status_t = B_STORAGE_ERROR_BASE + 2; +pub const B_ENTRY_NOT_FOUND: status_t = B_STORAGE_ERROR_BASE + 3; +pub const B_NAME_TOO_LONG: status_t = B_STORAGE_ERROR_BASE + 4; +pub const B_NOT_A_DIRECTORY: status_t = B_STORAGE_ERROR_BASE + 5; +pub const B_DIRECTORY_NOT_EMPTY: status_t = B_STORAGE_ERROR_BASE + 6; +pub const B_DEVICE_FULL: status_t = B_STORAGE_ERROR_BASE + 7; +pub const B_READ_ONLY_DEVICE: status_t = B_STORAGE_ERROR_BASE + 8; +pub const B_IS_A_DIRECTORY: status_t = B_STORAGE_ERROR_BASE + 9; +pub const B_NO_MORE_FDS: status_t = B_STORAGE_ERROR_BASE + 10; +pub const B_CROSS_DEVICE_LINK: status_t = B_STORAGE_ERROR_BASE + 11; +pub const B_LINK_LIMIT: status_t = B_STORAGE_ERROR_BASE + 12; +pub const B_BUSTED_PIPE: status_t = B_STORAGE_ERROR_BASE + 13; +pub const B_UNSUPPORTED: status_t = B_STORAGE_ERROR_BASE + 14; +pub const B_PARTITION_TOO_SMALL: status_t = B_STORAGE_ERROR_BASE + 15; +pub const B_PARTIAL_READ: status_t = B_STORAGE_ERROR_BASE + 16; +pub const B_PARTIAL_WRITE: status_t = B_STORAGE_ERROR_BASE + 17; + +// Mapped posix errors +pub const B_BUFFER_OVERFLOW: status_t = ::EOVERFLOW; +pub const B_TOO_MANY_ARGS: status_t = ::E2BIG; +pub const B_FILE_TOO_LARGE: status_t = ::EFBIG; +pub const B_RESULT_NOT_REPRESENTABLE: status_t = ::ERANGE; +pub const B_DEVICE_NOT_FOUND: status_t = ::ENODEV; +pub const B_NOT_SUPPORTED: status_t = ::EOPNOTSUPP; + +// Media kit errors +pub const B_STREAM_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 0; +pub const B_SERVER_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 1; +pub const B_RESOURCE_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 2; +pub const B_RESOURCE_UNAVAILABLE: status_t = B_MEDIA_ERROR_BASE + 3; +pub const B_BAD_SUBSCRIBER: status_t = B_MEDIA_ERROR_BASE + 4; +pub const B_SUBSCRIBER_NOT_ENTERED: status_t = B_MEDIA_ERROR_BASE + 5; +pub const B_BUFFER_NOT_AVAILABLE: status_t = B_MEDIA_ERROR_BASE + 6; +pub const B_LAST_BUFFER_ERROR: status_t = B_MEDIA_ERROR_BASE + 7; + +pub const B_MEDIA_SYSTEM_FAILURE: status_t = B_MEDIA_ERROR_BASE + 100; +pub const B_MEDIA_BAD_NODE: status_t = B_MEDIA_ERROR_BASE + 101; +pub const B_MEDIA_NODE_BUSY: status_t = B_MEDIA_ERROR_BASE + 102; +pub const B_MEDIA_BAD_FORMAT: status_t = B_MEDIA_ERROR_BASE + 103; +pub const B_MEDIA_BAD_BUFFER: status_t = B_MEDIA_ERROR_BASE + 104; +pub const B_MEDIA_TOO_MANY_NODES: status_t = B_MEDIA_ERROR_BASE + 105; +pub const B_MEDIA_TOO_MANY_BUFFERS: status_t = B_MEDIA_ERROR_BASE + 106; +pub const B_MEDIA_NODE_ALREADY_EXISTS: status_t = B_MEDIA_ERROR_BASE + 107; +pub const B_MEDIA_BUFFER_ALREADY_EXISTS: status_t = B_MEDIA_ERROR_BASE + 108; +pub const B_MEDIA_CANNOT_SEEK: status_t = B_MEDIA_ERROR_BASE + 109; +pub const B_MEDIA_CANNOT_CHANGE_RUN_MODE: status_t = B_MEDIA_ERROR_BASE + 110; +pub const B_MEDIA_APP_ALREADY_REGISTERED: status_t = B_MEDIA_ERROR_BASE + 111; +pub const B_MEDIA_APP_NOT_REGISTERED: status_t = B_MEDIA_ERROR_BASE + 112; +pub const B_MEDIA_CANNOT_RECLAIM_BUFFERS: status_t = B_MEDIA_ERROR_BASE + 113; +pub const B_MEDIA_BUFFERS_NOT_RECLAIMED: status_t = B_MEDIA_ERROR_BASE + 114; +pub const B_MEDIA_TIME_SOURCE_STOPPED: status_t = B_MEDIA_ERROR_BASE + 115; +pub const B_MEDIA_TIME_SOURCE_BUSY: status_t = B_MEDIA_ERROR_BASE + 116; +pub const B_MEDIA_BAD_SOURCE: status_t = B_MEDIA_ERROR_BASE + 117; +pub const B_MEDIA_BAD_DESTINATION: status_t = B_MEDIA_ERROR_BASE + 118; +pub const B_MEDIA_ALREADY_CONNECTED: status_t = B_MEDIA_ERROR_BASE + 119; +pub const B_MEDIA_NOT_CONNECTED: status_t = B_MEDIA_ERROR_BASE + 120; +pub const B_MEDIA_BAD_CLIP_FORMAT: status_t = B_MEDIA_ERROR_BASE + 121; +pub const B_MEDIA_ADDON_FAILED: status_t = B_MEDIA_ERROR_BASE + 122; +pub const B_MEDIA_ADDON_DISABLED: status_t = B_MEDIA_ERROR_BASE + 123; +pub const B_MEDIA_CHANGE_IN_PROGRESS: status_t = B_MEDIA_ERROR_BASE + 124; +pub const B_MEDIA_STALE_CHANGE_COUNT: status_t = B_MEDIA_ERROR_BASE + 125; +pub const B_MEDIA_ADDON_RESTRICTED: status_t = B_MEDIA_ERROR_BASE + 126; +pub const B_MEDIA_NO_HANDLER: status_t = B_MEDIA_ERROR_BASE + 127; +pub const B_MEDIA_DUPLICATE_FORMAT: status_t = B_MEDIA_ERROR_BASE + 128; +pub const B_MEDIA_REALTIME_DISABLED: status_t = B_MEDIA_ERROR_BASE + 129; +pub const B_MEDIA_REALTIME_UNAVAILABLE: status_t = B_MEDIA_ERROR_BASE + 130; + +// Mail kit errors +pub const B_MAIL_NO_DAEMON: status_t = B_MAIL_ERROR_BASE + 0; +pub const B_MAIL_UNKNOWN_USER: status_t = B_MAIL_ERROR_BASE + 1; +pub const B_MAIL_WRONG_PASSWORD: status_t = B_MAIL_ERROR_BASE + 2; +pub const B_MAIL_UNKNOWN_HOST: status_t = B_MAIL_ERROR_BASE + 3; +pub const B_MAIL_ACCESS_ERROR: status_t = B_MAIL_ERROR_BASE + 4; +pub const B_MAIL_UNKNOWN_FIELD: status_t = B_MAIL_ERROR_BASE + 5; +pub const B_MAIL_NO_RECIPIENT: status_t = B_MAIL_ERROR_BASE + 6; +pub const B_MAIL_INVALID_MAIL: status_t = B_MAIL_ERROR_BASE + 7; + +// Print kit errors +pub const B_NO_PRINT_SERVER: status_t = B_PRINT_ERROR_BASE + 0; + +// Device kit errors +pub const B_DEV_INVALID_IOCTL: status_t = B_DEVICE_ERROR_BASE + 0; +pub const B_DEV_NO_MEMORY: status_t = B_DEVICE_ERROR_BASE + 1; +pub const B_DEV_BAD_DRIVE_NUM: status_t = B_DEVICE_ERROR_BASE + 2; +pub const B_DEV_NO_MEDIA: status_t = B_DEVICE_ERROR_BASE + 3; +pub const B_DEV_UNREADABLE: status_t = B_DEVICE_ERROR_BASE + 4; +pub const B_DEV_FORMAT_ERROR: status_t = B_DEVICE_ERROR_BASE + 5; +pub const B_DEV_TIMEOUT: status_t = B_DEVICE_ERROR_BASE + 6; +pub const B_DEV_RECALIBRATE_ERROR: status_t = B_DEVICE_ERROR_BASE + 7; +pub const B_DEV_SEEK_ERROR: status_t = B_DEVICE_ERROR_BASE + 8; +pub const B_DEV_ID_ERROR: status_t = B_DEVICE_ERROR_BASE + 9; +pub const B_DEV_READ_ERROR: status_t = B_DEVICE_ERROR_BASE + 10; +pub const B_DEV_WRITE_ERROR: status_t = B_DEVICE_ERROR_BASE + 11; +pub const B_DEV_NOT_READY: status_t = B_DEVICE_ERROR_BASE + 12; +pub const B_DEV_MEDIA_CHANGED: status_t = B_DEVICE_ERROR_BASE + 13; +pub const B_DEV_MEDIA_CHANGE_REQUESTED: status_t = B_DEVICE_ERROR_BASE + 14; +pub const B_DEV_RESOURCE_CONFLICT: status_t = B_DEVICE_ERROR_BASE + 15; +pub const B_DEV_CONFIGURATION_ERROR: status_t = B_DEVICE_ERROR_BASE + 16; +pub const B_DEV_DISABLED_BY_USER: status_t = B_DEVICE_ERROR_BASE + 17; +pub const B_DEV_DOOR_OPEN: status_t = B_DEVICE_ERROR_BASE + 18; + +pub const B_DEV_INVALID_PIPE: status_t = B_DEVICE_ERROR_BASE + 19; +pub const B_DEV_CRC_ERROR: status_t = B_DEVICE_ERROR_BASE + 20; +pub const B_DEV_STALLED: status_t = B_DEVICE_ERROR_BASE + 21; +pub const B_DEV_BAD_PID: status_t = B_DEVICE_ERROR_BASE + 22; +pub const B_DEV_UNEXPECTED_PID: status_t = B_DEVICE_ERROR_BASE + 23; +pub const B_DEV_DATA_OVERRUN: status_t = B_DEVICE_ERROR_BASE + 24; +pub const B_DEV_DATA_UNDERRUN: status_t = B_DEVICE_ERROR_BASE + 25; +pub const B_DEV_FIFO_OVERRUN: status_t = B_DEVICE_ERROR_BASE + 26; +pub const B_DEV_FIFO_UNDERRUN: status_t = B_DEVICE_ERROR_BASE + 27; +pub const B_DEV_PENDING: status_t = B_DEVICE_ERROR_BASE + 28; +pub const B_DEV_MULTIPLE_ERRORS: status_t = B_DEVICE_ERROR_BASE + 29; +pub const B_DEV_TOO_LATE: status_t = B_DEVICE_ERROR_BASE + 30; + +// translation kit errors +pub const B_TRANSLATION_BASE_ERROR: status_t = B_TRANSLATION_ERROR_BASE + 0; +pub const B_NO_TRANSLATOR: status_t = B_TRANSLATION_ERROR_BASE + 1; +pub const B_ILLEGAL_DATA: status_t = B_TRANSLATION_ERROR_BASE + 2; + +// support/TypeConstants.h +pub const B_AFFINE_TRANSFORM_TYPE: u32 = haiku_constant!('A', 'M', 'T', 'X'); +pub const B_ALIGNMENT_TYPE: u32 = haiku_constant!('A', 'L', 'G', 'N'); +pub const B_ANY_TYPE: u32 = haiku_constant!('A', 'N', 'Y', 'T'); +pub const B_ATOM_TYPE: u32 = haiku_constant!('A', 'T', 'O', 'M'); +pub const B_ATOMREF_TYPE: u32 = haiku_constant!('A', 'T', 'M', 'R'); +pub const B_BOOL_TYPE: u32 = haiku_constant!('B', 'O', 'O', 'L'); +pub const B_CHAR_TYPE: u32 = haiku_constant!('C', 'H', 'A', 'R'); +pub const B_COLOR_8_BIT_TYPE: u32 = haiku_constant!('C', 'L', 'R', 'B'); +pub const B_DOUBLE_TYPE: u32 = haiku_constant!('D', 'B', 'L', 'E'); +pub const B_FLOAT_TYPE: u32 = haiku_constant!('F', 'L', 'O', 'T'); +pub const B_GRAYSCALE_8_BIT_TYPE: u32 = haiku_constant!('G', 'R', 'Y', 'B'); +pub const B_INT16_TYPE: u32 = haiku_constant!('S', 'H', 'R', 'T'); +pub const B_INT32_TYPE: u32 = haiku_constant!('L', 'O', 'N', 'G'); +pub const B_INT64_TYPE: u32 = haiku_constant!('L', 'L', 'N', 'G'); +pub const B_INT8_TYPE: u32 = haiku_constant!('B', 'Y', 'T', 'E'); +pub const B_LARGE_ICON_TYPE: u32 = haiku_constant!('I', 'C', 'O', 'N'); +pub const B_MEDIA_PARAMETER_GROUP_TYPE: u32 = haiku_constant!('B', 'M', 'C', 'G'); +pub const B_MEDIA_PARAMETER_TYPE: u32 = haiku_constant!('B', 'M', 'C', 'T'); +pub const B_MEDIA_PARAMETER_WEB_TYPE: u32 = haiku_constant!('B', 'M', 'C', 'W'); +pub const B_MESSAGE_TYPE: u32 = haiku_constant!('M', 'S', 'G', 'G'); +pub const B_MESSENGER_TYPE: u32 = haiku_constant!('M', 'S', 'N', 'G'); +pub const B_MIME_TYPE: u32 = haiku_constant!('M', 'I', 'M', 'E'); +pub const B_MINI_ICON_TYPE: u32 = haiku_constant!('M', 'I', 'C', 'N'); +pub const B_MONOCHROME_1_BIT_TYPE: u32 = haiku_constant!('M', 'N', 'O', 'B'); +pub const B_OBJECT_TYPE: u32 = haiku_constant!('O', 'P', 'T', 'R'); +pub const B_OFF_T_TYPE: u32 = haiku_constant!('O', 'F', 'F', 'T'); +pub const B_PATTERN_TYPE: u32 = haiku_constant!('P', 'A', 'T', 'N'); +pub const B_POINTER_TYPE: u32 = haiku_constant!('P', 'N', 'T', 'R'); +pub const B_POINT_TYPE: u32 = haiku_constant!('B', 'P', 'N', 'T'); +pub const B_PROPERTY_INFO_TYPE: u32 = haiku_constant!('S', 'C', 'T', 'D'); +pub const B_RAW_TYPE: u32 = haiku_constant!('R', 'A', 'W', 'T'); +pub const B_RECT_TYPE: u32 = haiku_constant!('R', 'E', 'C', 'T'); +pub const B_REF_TYPE: u32 = haiku_constant!('R', 'R', 'E', 'F'); +pub const B_RGB_32_BIT_TYPE: u32 = haiku_constant!('R', 'G', 'B', 'B'); +pub const B_RGB_COLOR_TYPE: u32 = haiku_constant!('R', 'G', 'B', 'C'); +pub const B_SIZE_TYPE: u32 = haiku_constant!('S', 'I', 'Z', 'E'); +pub const B_SIZE_T_TYPE: u32 = haiku_constant!('S', 'I', 'Z', 'T'); +pub const B_SSIZE_T_TYPE: u32 = haiku_constant!('S', 'S', 'Z', 'T'); +pub const B_STRING_TYPE: u32 = haiku_constant!('C', 'S', 'T', 'R'); +pub const B_STRING_LIST_TYPE: u32 = haiku_constant!('S', 'T', 'R', 'L'); +pub const B_TIME_TYPE: u32 = haiku_constant!('T', 'I', 'M', 'E'); +pub const B_UINT16_TYPE: u32 = haiku_constant!('U', 'S', 'H', 'T'); +pub const B_UINT32_TYPE: u32 = haiku_constant!('U', 'L', 'N', 'G'); +pub const B_UINT64_TYPE: u32 = haiku_constant!('U', 'L', 'L', 'G'); +pub const B_UINT8_TYPE: u32 = haiku_constant!('U', 'B', 'Y', 'T'); +pub const B_VECTOR_ICON_TYPE: u32 = haiku_constant!('V', 'I', 'C', 'N'); +pub const B_XATTR_TYPE: u32 = haiku_constant!('X', 'A', 'T', 'R'); +pub const B_NETWORK_ADDRESS_TYPE: u32 = haiku_constant!('N', 'W', 'A', 'D'); +pub const B_MIME_STRING_TYPE: u32 = haiku_constant!('M', 'I', 'M', 'S'); +pub const B_ASCII_TYPE: u32 = haiku_constant!('T', 'E', 'X', 'T'); + +extern "C" { + // kernel/OS.h + pub fn create_area( + name: *const ::c_char, + startAddress: *mut *mut ::c_void, + addressSpec: u32, + size: usize, + lock: u32, + protection: u32, + ) -> area_id; + pub fn clone_area( + name: *const ::c_char, + destAddress: *mut *mut ::c_void, + addressSpec: u32, + protection: u32, + source: area_id, + ) -> area_id; + pub fn find_area(name: *const ::c_char) -> area_id; + pub fn area_for(address: *mut ::c_void) -> area_id; + pub fn delete_area(id: area_id) -> status_t; + pub fn resize_area(id: area_id, newSize: usize) -> status_t; + pub fn set_area_protection(id: area_id, newProtection: u32) -> status_t; + pub fn _get_area_info(id: area_id, areaInfo: *mut area_info, size: usize) -> status_t; + pub fn _get_next_area_info( + team: team_id, + cookie: *mut isize, + areaInfo: *mut area_info, + size: usize, + ) -> status_t; + + pub fn create_port(capacity: i32, name: *const ::c_char) -> port_id; + pub fn find_port(name: *const ::c_char) -> port_id; + pub fn read_port( + port: port_id, + code: *mut i32, + buffer: *mut ::c_void, + bufferSize: ::size_t, + ) -> ::ssize_t; + pub fn read_port_etc( + port: port_id, + code: *mut i32, + buffer: *mut ::c_void, + bufferSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> ::ssize_t; + pub fn write_port( + port: port_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + ) -> status_t; + pub fn write_port_etc( + port: port_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + pub fn close_port(port: port_id) -> status_t; + pub fn delete_port(port: port_id) -> status_t; + pub fn port_buffer_size(port: port_id) -> ::ssize_t; + pub fn port_buffer_size_etc(port: port_id, flags: u32, timeout: bigtime_t) -> ::ssize_t; + pub fn port_count(port: port_id) -> ::ssize_t; + pub fn set_port_owner(port: port_id, team: team_id) -> status_t; + + pub fn _get_port_info(port: port_id, buf: *mut port_info, portInfoSize: ::size_t) -> status_t; + pub fn _get_next_port_info( + port: port_id, + cookie: *mut i32, + portInfo: *mut port_info, + portInfoSize: ::size_t, + ) -> status_t; + pub fn _get_port_message_info_etc( + port: port_id, + info: *mut port_message_info, + infoSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + + pub fn create_sem(count: i32, name: *const ::c_char) -> sem_id; + pub fn delete_sem(id: sem_id) -> status_t; + pub fn acquire_sem(id: sem_id) -> status_t; + pub fn acquire_sem_etc(id: sem_id, count: i32, flags: u32, timeout: bigtime_t) -> status_t; + pub fn release_sem(id: sem_id) -> status_t; + pub fn release_sem_etc(id: sem_id, count: i32, flags: u32) -> status_t; + pub fn switch_sem(semToBeReleased: sem_id, id: sem_id) -> status_t; + pub fn switch_sem_etc( + semToBeReleased: sem_id, + id: sem_id, + count: i32, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + pub fn get_sem_count(id: sem_id, threadCount: *mut i32) -> status_t; + pub fn set_sem_owner(id: sem_id, team: team_id) -> status_t; + pub fn _get_sem_info(id: sem_id, info: *mut sem_info, infoSize: ::size_t) -> status_t; + pub fn _get_next_sem_info( + team: team_id, + cookie: *mut i32, + info: *mut sem_info, + infoSize: ::size_t, + ) -> status_t; + + pub fn kill_team(team: team_id) -> status_t; + pub fn _get_team_info(team: team_id, info: *mut team_info, size: ::size_t) -> status_t; + pub fn _get_next_team_info(cookie: *mut i32, info: *mut team_info, size: ::size_t) -> status_t; + + pub fn spawn_thread( + func: thread_func, + name: *const ::c_char, + priority: i32, + data: *mut ::c_void, + ) -> thread_id; + pub fn kill_thread(thread: thread_id) -> status_t; + pub fn resume_thread(thread: thread_id) -> status_t; + pub fn suspend_thread(thread: thread_id) -> status_t; + + pub fn rename_thread(thread: thread_id, newName: *const ::c_char) -> status_t; + pub fn set_thread_priority(thread: thread_id, newPriority: i32) -> status_t; + pub fn suggest_thread_priority( + what: u32, + period: i32, + jitter: ::bigtime_t, + length: ::bigtime_t, + ) -> i32; + pub fn estimate_max_scheduling_latency(th: ::thread_id) -> ::bigtime_t; + pub fn exit_thread(status: status_t); + pub fn wait_for_thread(thread: thread_id, returnValue: *mut status_t) -> status_t; + pub fn on_exit_thread(callback: extern "C" fn(*mut ::c_void), data: *mut ::c_void) -> status_t; + + pub fn find_thread(name: *const ::c_char) -> thread_id; + + pub fn get_scheduler_mode() -> i32; + pub fn set_scheduler_mode(mode: i32) -> status_t; + + pub fn send_data( + thread: thread_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + ) -> status_t; + pub fn receive_data(sender: *mut thread_id, buffer: *mut ::c_void, bufferSize: ::size_t) + -> i32; + pub fn has_data(thread: thread_id) -> bool; + + pub fn snooze(amount: bigtime_t) -> status_t; + pub fn snooze_etc(amount: bigtime_t, timeBase: ::c_int, flags: u32) -> status_t; + pub fn snooze_until(time: bigtime_t, timeBase: ::c_int) -> status_t; + + pub fn _get_thread_info(id: thread_id, info: *mut thread_info, size: ::size_t) -> status_t; + pub fn _get_next_thread_info( + team: team_id, + cookie: *mut i32, + info: *mut thread_info, + size: ::size_t, + ) -> status_t; + + pub fn get_pthread_thread_id(thread: ::pthread_t) -> thread_id; + + pub fn _get_team_usage_info( + team: team_id, + who: i32, + info: *mut team_usage_info, + size: ::size_t, + ) -> status_t; + + pub fn real_time_clock() -> ::c_ulong; + pub fn set_real_time_clock(secsSinceJan1st1970: ::c_ulong); + pub fn real_time_clock_usecs() -> bigtime_t; + pub fn system_time() -> bigtime_t; + pub fn system_time_nsecs() -> nanotime_t; + // set_timezone() is deprecated and a no-op + + pub fn set_alarm(when: bigtime_t, flags: u32) -> bigtime_t; + pub fn debugger(message: *const ::c_char); + pub fn disable_debugger(state: ::c_int) -> ::c_int; + + pub fn get_system_info(info: *mut system_info) -> status_t; + pub fn _get_cpu_info_etc( + firstCPU: u32, + cpuCount: u32, + info: *mut cpu_info, + size: ::size_t, + ) -> status_t; + pub fn is_computer_on() -> i32; + pub fn is_computer_on_fire() -> ::c_double; + pub fn send_signal(threadID: thread_id, signal: ::c_uint) -> ::c_int; + pub fn set_signal_stack(base: *mut ::c_void, size: ::size_t); + + pub fn wait_for_objects(infos: *mut object_wait_info, numInfos: ::c_int) -> ::ssize_t; + pub fn wait_for_objects_etc( + infos: *mut object_wait_info, + numInfos: ::c_int, + flags: u32, + timeout: bigtime_t, + ) -> ::ssize_t; + + // kernel/fs_attr.h + pub fn fs_read_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + pos: ::off_t, + buffer: *mut ::c_void, + readBytes: ::size_t, + ) -> ::ssize_t; + pub fn fs_write_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + pos: ::off_t, + buffer: *const ::c_void, + writeBytes: ::size_t, + ) -> ::ssize_t; + pub fn fs_remove_attr(fd: ::c_int, attribute: *const ::c_char) -> ::c_int; + pub fn fs_stat_attr( + fd: ::c_int, + attribute: *const ::c_char, + attrInfo: *mut attr_info, + ) -> ::c_int; + + pub fn fs_open_attr( + path: *const ::c_char, + attribute: *const ::c_char, + type_: u32, + openMode: ::c_int, + ) -> ::c_int; + pub fn fs_fopen_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + openMode: ::c_int, + ) -> ::c_int; + pub fn fs_close_attr(fd: ::c_int) -> ::c_int; + + pub fn fs_open_attr_dir(path: *const ::c_char) -> *mut ::DIR; + pub fn fs_lopen_attr_dir(path: *const ::c_char) -> *mut ::DIR; + pub fn fs_fopen_attr_dir(fd: ::c_int) -> *mut ::DIR; + pub fn fs_close_attr_dir(dir: *mut ::DIR) -> ::c_int; + pub fn fs_read_attr_dir(dir: *mut ::DIR) -> *mut ::dirent; + pub fn fs_rewind_attr_dir(dir: *mut ::DIR); + + // kernel/fs_image.h + pub fn fs_create_index( + device: ::dev_t, + name: *const ::c_char, + type_: u32, + flags: u32, + ) -> ::c_int; + pub fn fs_remove_index(device: ::dev_t, name: *const ::c_char) -> ::c_int; + pub fn fs_stat_index( + device: ::dev_t, + name: *const ::c_char, + indexInfo: *mut index_info, + ) -> ::c_int; + + pub fn fs_open_index_dir(device: ::dev_t) -> *mut ::DIR; + pub fn fs_close_index_dir(indexDirectory: *mut ::DIR) -> ::c_int; + pub fn fs_read_index_dir(indexDirectory: *mut ::DIR) -> *mut ::dirent; + pub fn fs_rewind_index_dir(indexDirectory: *mut ::DIR); + + // kernel/fs_info.h + pub fn dev_for_path(path: *const ::c_char) -> ::dev_t; + pub fn next_dev(pos: *mut i32) -> ::dev_t; + pub fn fs_stat_dev(dev: ::dev_t, info: *mut fs_info) -> ::c_int; + + // kernel/fs_query.h + pub fn fs_open_query(device: ::dev_t, query: *const ::c_char, flags: u32) -> *mut ::DIR; + pub fn fs_open_live_query( + device: ::dev_t, + query: *const ::c_char, + flags: u32, + port: port_id, + token: i32, + ) -> *mut ::DIR; + pub fn fs_close_query(d: *mut ::DIR) -> ::c_int; + pub fn fs_read_query(d: *mut ::DIR) -> *mut ::dirent; + pub fn get_path_for_dirent(dent: *mut ::dirent, buf: *mut ::c_char, len: ::size_t) -> status_t; + + // kernel/fs_volume.h + pub fn fs_mount_volume( + where_: *const ::c_char, + device: *const ::c_char, + filesystem: *const ::c_char, + flags: u32, + parameters: *const ::c_char, + ) -> ::dev_t; + pub fn fs_unmount_volume(path: *const ::c_char, flags: u32) -> status_t; + + // kernel/image.h + pub fn load_image( + argc: i32, + argv: *mut *const ::c_char, + environ: *mut *const ::c_char, + ) -> thread_id; + pub fn load_add_on(path: *const ::c_char) -> image_id; + pub fn unload_add_on(image: image_id) -> status_t; + pub fn get_image_symbol( + image: image_id, + name: *const ::c_char, + symbolType: i32, + symbolLocation: *mut *mut ::c_void, + ) -> status_t; + pub fn get_nth_image_symbol( + image: image_id, + n: i32, + nameBuffer: *mut ::c_char, + nameLength: *mut i32, + symbolType: *mut i32, + symbolLocation: *mut *mut ::c_void, + ) -> status_t; + pub fn clear_caches(address: *mut ::c_void, length: ::size_t, flags: u32); + pub fn _get_image_info(image: image_id, info: *mut image_info, size: ::size_t) -> status_t; + pub fn _get_next_image_info( + team: team_id, + cookie: *mut i32, + info: *mut image_info, + size: ::size_t, + ) -> status_t; + pub fn find_path( + codePointer: *const ::c_void, + baseDirectory: path_base_directory, + subPath: *const ::c_char, + pathBuffer: *mut ::c_char, + bufferSize: usize, + ) -> status_t; + pub fn find_path_etc( + codePointer: *const ::c_void, + dependency: *const ::c_char, + architecture: *const ::c_char, + baseDirectory: path_base_directory, + subPath: *const ::c_char, + flags: u32, + pathBuffer: *mut ::c_char, + bufferSize: ::size_t, + ) -> status_t; + pub fn find_path_for_path( + path: *const ::c_char, + baseDirectory: path_base_directory, + subPath: *const ::c_char, + pathBuffer: *mut ::c_char, + bufferSize: ::size_t, + ) -> status_t; + pub fn find_path_for_path_etc( + path: *const ::c_char, + dependency: *const ::c_char, + architectur: *const ::c_char, + baseDirectory: path_base_directory, + subPath: *const ::c_char, + flags: u32, + pathBuffer: *mut ::c_char, + bufferSize: ::size_t, + ) -> status_t; + pub fn find_paths( + baseDirectory: path_base_directory, + subPath: *const ::c_char, + _paths: *mut *mut *mut ::c_char, + pathCount: *mut ::size_t, + ) -> status_t; + pub fn find_paths_etc( + architecture: *const ::c_char, + baseDirectory: path_base_directory, + subPath: *const ::c_char, + flags: u32, + _paths: *mut *mut *mut ::c_char, + pathCount: *mut ::size_t, + ) -> status_t; + pub fn find_directory( + which: directory_which, + volume: ::dev_t, + createIt: bool, + pathString: *mut ::c_char, + length: i32, + ) -> status_t; +} + +cfg_if! { + if #[cfg(libc_union)] { + extern "C" { + pub fn get_cpuid(info: *mut cpuid_info, eaxRegister: u32, cpuNum: u32) -> status_t; + } + } +} + +// The following functions are defined as macros in C/C++ +#[inline] +pub unsafe fn get_cpu_info(firstCPU: u32, cpuCount: u32, info: *mut cpu_info) -> status_t { + _get_cpu_info_etc( + firstCPU, + cpuCount, + info, + core::mem::size_of::() as ::size_t, + ) +} + +#[inline] +pub unsafe fn get_area_info(id: area_id, info: *mut area_info) -> status_t { + _get_area_info(id, info, core::mem::size_of::() as usize) +} + +#[inline] +pub unsafe fn get_next_area_info( + team: team_id, + cookie: *mut isize, + info: *mut area_info, +) -> status_t { + _get_next_area_info( + team, + cookie, + info, + core::mem::size_of::() as usize, + ) +} + +#[inline] +pub unsafe fn get_port_info(port: port_id, buf: *mut port_info) -> status_t { + _get_port_info(port, buf, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_next_port_info( + port: port_id, + cookie: *mut i32, + portInfo: *mut port_info, +) -> status_t { + _get_next_port_info( + port, + cookie, + portInfo, + core::mem::size_of::() as ::size_t, + ) +} + +#[inline] +pub unsafe fn get_port_message_info_etc( + port: port_id, + info: *mut port_message_info, + flags: u32, + timeout: bigtime_t, +) -> status_t { + _get_port_message_info_etc( + port, + info, + core::mem::size_of::() as ::size_t, + flags, + timeout, + ) +} + +#[inline] +pub unsafe fn get_sem_info(id: sem_id, info: *mut sem_info) -> status_t { + _get_sem_info(id, info, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_next_sem_info(team: team_id, cookie: *mut i32, info: *mut sem_info) -> status_t { + _get_next_sem_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} + +#[inline] +pub unsafe fn get_team_info(team: team_id, info: *mut team_info) -> status_t { + _get_team_info(team, info, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_next_team_info(cookie: *mut i32, info: *mut team_info) -> status_t { + _get_next_team_info(cookie, info, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_team_usage_info(team: team_id, who: i32, info: *mut team_usage_info) -> status_t { + _get_team_usage_info( + team, + who, + info, + core::mem::size_of::() as ::size_t, + ) +} + +#[inline] +pub unsafe fn get_thread_info(id: thread_id, info: *mut thread_info) -> status_t { + _get_thread_info(id, info, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_next_thread_info( + team: team_id, + cookie: *mut i32, + info: *mut thread_info, +) -> status_t { + _get_next_thread_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} + +// kernel/image.h +#[inline] +pub unsafe fn get_image_info(image: image_id, info: *mut image_info) -> status_t { + _get_image_info(image, info, core::mem::size_of::() as ::size_t) +} + +#[inline] +pub unsafe fn get_next_image_info( + team: team_id, + cookie: *mut i32, + info: *mut image_info, +) -> status_t { + _get_next_image_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/x86_64.rs new file mode 100644 index 0000000..1b0462f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/haiku/x86_64.rs @@ -0,0 +1,264 @@ +s_no_extra_traits! { + pub struct fpu_state { + pub control: ::c_ushort, + pub status: ::c_ushort, + pub tag: ::c_ushort, + pub opcode: ::c_ushort, + pub rip: ::c_ulong, + pub rdp: ::c_ulong, + pub mxcsr: ::c_uint, + pub mscsr_mask: ::c_uint, + pub _fpreg: [[::c_uchar; 8]; 16], + pub _xmm: [[::c_uchar; 16]; 16], + pub _reserved_416_511: [::c_uchar; 96], + } + + pub struct xstate_hdr { + pub bv: ::c_ulong, + pub xcomp_bv: ::c_ulong, + pub _reserved: [::c_uchar; 48], + } + + pub struct savefpu { + pub fp_fxsave: fpu_state, + pub fp_xstate: xstate_hdr, + pub _fp_ymm: [[::c_uchar; 16]; 16], + } + + pub struct mcontext_t { + pub rax: ::c_ulong, + pub rbx: ::c_ulong, + pub rcx: ::c_ulong, + pub rdx: ::c_ulong, + pub rdi: ::c_ulong, + pub rsi: ::c_ulong, + pub rbp: ::c_ulong, + pub r8: ::c_ulong, + pub r9: ::c_ulong, + pub r10: ::c_ulong, + pub r11: ::c_ulong, + pub r12: ::c_ulong, + pub r13: ::c_ulong, + pub r14: ::c_ulong, + pub r15: ::c_ulong, + pub rsp: ::c_ulong, + pub rip: ::c_ulong, + pub rflags: ::c_ulong, + pub fpu: savefpu, + } + + pub struct ucontext_t { + pub uc_link: *mut ucontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for fpu_state { + fn eq(&self, other: &fpu_state) -> bool { + self.control == other.control + && self.status == other.status + && self.tag == other.tag + && self.opcode == other.opcode + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mscsr_mask == other.mscsr_mask + && self._fpreg.iter().zip(other._fpreg.iter()).all(|(a, b)| a == b) + && self._xmm.iter().zip(other._xmm.iter()).all(|(a, b)| a == b) + && self._reserved_416_511. + iter(). + zip(other._reserved_416_511.iter()). + all(|(a, b)| a == b) + } + } + impl Eq for fpu_state {} + impl ::fmt::Debug for fpu_state { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpu_state") + .field("control", &self.control) + .field("status", &self.status) + .field("tag", &self.tag) + .field("opcode", &self.opcode) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mscsr_mask", &self.mscsr_mask) + // FIXME: .field("_fpreg", &self._fpreg) + // FIXME: .field("_xmm", &self._xmm) + // FIXME: .field("_reserved_416_511", &self._reserved_416_511) + .finish() + } + } + impl ::hash::Hash for fpu_state { + fn hash(&self, state: &mut H) { + self.control.hash(state); + self.status.hash(state); + self.tag.hash(state); + self.opcode.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mscsr_mask.hash(state); + self._fpreg.hash(state); + self._xmm.hash(state); + self._reserved_416_511.hash(state); + } + } + + impl PartialEq for xstate_hdr { + fn eq(&self, other: &xstate_hdr) -> bool { + self.bv == other.bv + && self.xcomp_bv == other.xcomp_bv + && self._reserved.iter().zip(other._reserved.iter()).all(|(a, b)| a == b) + } + } + impl Eq for xstate_hdr {} + impl ::fmt::Debug for xstate_hdr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("xstate_hdr") + .field("bv", &self.bv) + .field("xcomp_bv", &self.xcomp_bv) + // FIXME: .field("_reserved", &field._reserved) + .finish() + } + } + impl ::hash::Hash for xstate_hdr { + fn hash(&self, state: &mut H) { + self.bv.hash(state); + self.xcomp_bv.hash(state); + self._reserved.hash(state); + } + } + + impl PartialEq for savefpu { + fn eq(&self, other: &savefpu) -> bool { + self.fp_fxsave == other.fp_fxsave + && self.fp_xstate == other.fp_xstate + && self._fp_ymm.iter().zip(other._fp_ymm.iter()).all(|(a, b)| a == b) + } + } + impl Eq for savefpu {} + impl ::fmt::Debug for savefpu { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("savefpu") + .field("fp_fxsave", &self.fp_fxsave) + .field("fp_xstate", &self.fp_xstate) + // FIXME: .field("_fp_ymm", &field._fp_ymm) + .finish() + } + } + impl ::hash::Hash for savefpu { + fn hash(&self, state: &mut H) { + self.fp_fxsave.hash(state); + self.fp_xstate.hash(state); + self._fp_ymm.hash(state); + } + } + + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.rax == other.rax + && self.rbx == other.rbx + && self.rbx == other.rbx + && self.rcx == other.rcx + && self.rdx == other.rdx + && self.rdi == other.rdi + && self.rsi == other.rsi + && self.r8 == other.r8 + && self.r9 == other.r9 + && self.r10 == other.r10 + && self.r11 == other.r11 + && self.r12 == other.r12 + && self.r13 == other.r13 + && self.r14 == other.r14 + && self.r15 == other.r15 + && self.rsp == other.rsp + && self.rip == other.rip + && self.rflags == other.rflags + && self.fpu == other.fpu + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("rax", &self.rax) + .field("rbx", &self.rbx) + .field("rcx", &self.rcx) + .field("rdx", &self.rdx) + .field("rdi", &self.rdi) + .field("rsi", &self.rsi) + .field("rbp", &self.rbp) + .field("r8", &self.r8) + .field("r9", &self.r9) + .field("r10", &self.r10) + .field("r11", &self.r11) + .field("r12", &self.r12) + .field("r13", &self.r13) + .field("r14", &self.r14) + .field("r15", &self.r15) + .field("rsp", &self.rsp) + .field("rip", &self.rip) + .field("rflags", &self.rflags) + .field("fpu", &self.fpu) + .finish() + + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.rax.hash(state); + self.rbx.hash(state); + self.rcx.hash(state); + self.rdx.hash(state); + self.rdi.hash(state); + self.rsi.hash(state); + self.rbp.hash(state); + self.r8.hash(state); + self.r9.hash(state); + self.r10.hash(state); + self.r11.hash(state); + self.r12.hash(state); + self.r13.hash(state); + self.r14.hash(state); + self.r15.hash(state); + self.rsp.hash(state); + self.rip.hash(state); + self.rflags.hash(state); + self.fpu.hash(state); + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_link == other.uc_link + && self.uc_sigmask == other.uc_sigmask + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_link", &self.uc_link) + .field("uc_sigmask", &self.uc_sigmask) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_link.hash(state); + self.uc_sigmask.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/aarch64.rs new file mode 100644 index 0000000..1a92e3b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/aarch64.rs @@ -0,0 +1,2 @@ +pub type c_char = u8; +pub type wchar_t = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/mod.rs new file mode 100644 index 0000000..6a656a8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/mod.rs @@ -0,0 +1,1023 @@ +// liblibc port for HermitCore (https://hermitcore.org) +// HermitCore is a unikernel based on lwIP, newlib, and +// pthread-embedded. +// Consider these definitions when porting liblibc to another +// lwIP/newlib/pte-based target. +// +// Ported by Colin Finck + +pub type c_long = i64; +pub type c_ulong = u64; + +pub type speed_t = ::c_uint; +pub type mode_t = u32; +pub type dev_t = i16; +pub type nfds_t = ::c_ulong; +pub type socklen_t = u32; +pub type sa_family_t = u8; +pub type clock_t = c_ulong; +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type off_t = i64; +pub type rlim_t = ::c_ulonglong; +pub type sigset_t = ::c_ulong; +pub type ino_t = u16; +pub type nlink_t = u16; +pub type blksize_t = c_long; +pub type blkcnt_t = c_long; +pub type stat64 = stat; +pub type clockid_t = c_ulong; +pub type pthread_t = pte_handle_t; +pub type pthread_attr_t = usize; +pub type pthread_cond_t = usize; +pub type pthread_condattr_t = usize; +pub type pthread_key_t = usize; +pub type pthread_mutex_t = usize; +pub type pthread_mutexattr_t = usize; +pub type pthread_rwlock_t = usize; +pub type pthread_rwlockattr_t = usize; + +s_no_extra_traits! { + pub struct dirent { + pub d_ino: ::c_long, + pub d_off: off_t, + pub d_reclen: u16, + pub d_name: [::c_char; 256], + } + + // Dummy + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 108], + } + + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct fd_set { + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct sockaddr_storage { + pub s2_len: u8, + pub ss_family: sa_family_t, + pub s2_data1: [::c_char; 2], + pub s2_data2: [u32; 3], + pub s2_data3: [u32; 3], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: dev_t, + pub st_size: off_t, + pub st_atime: time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: blksize_t, + pub st_blocks: blkcnt_t, + pub st_spare4: [::c_long; 2], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr { + fn eq(&self, other: &sockaddr) -> bool { + self.sa_len == other.sa_len + && self.sa_family == other.sa_family + && self + .sa_data + .iter() + .zip(other.sa_data.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr {} + impl ::fmt::Debug for sockaddr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr") + .field("sa_len", &self.sa_len) + .field("sa_family", &self.sa_family) + // FIXME: .field("sa_data", &self.sa_data) + .finish() + } + } + impl ::hash::Hash for sockaddr { + fn hash(&self, state: &mut H) { + self.sa_len.hash(state); + self.sa_family.hash(state); + self.sa_data.hash(state); + } + } + + impl PartialEq for sockaddr_in { + fn eq(&self, other: &sockaddr_in) -> bool { + self.sin_len == other.sin_len + && self.sin_family == other.sin_family + && self.sin_port == other.sin_port + && self.sin_addr == other.sin_addr + && self + .sin_zero + .iter() + .zip(other.sin_zero.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_in {} + impl ::fmt::Debug for sockaddr_in { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_in") + .field("sin_len", &self.sin_len) + .field("sin_family", &self.sin_family) + .field("sin_port", &self.sin_port) + .field("sin_addr", &self.sin_addr) + // FIXME: .field("sin_zero", &self.sin_zero) + .finish() + } + } + impl ::hash::Hash for sockaddr_in { + fn hash(&self, state: &mut H) { + self.sin_len.hash(state); + self.sin_family.hash(state); + self.sin_port.hash(state); + self.sin_addr.hash(state); + self.sin_zero.hash(state); + } + } + + impl PartialEq for fd_set { + fn eq(&self, other: &fd_set) -> bool { + self.fds_bits + .iter() + .zip(other.fds_bits.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for fd_set {} + impl ::fmt::Debug for fd_set { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fd_set") + // FIXME: .field("fds_bits", &self.fds_bits) + .finish() + } + } + impl ::hash::Hash for fd_set { + fn hash(&self, state: &mut H) { + self.fds_bits.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.s2_len == other.s2_len + && self.ss_family == other.ss_family + && self.s2_data1 + .iter() + .zip(other.s2_data1.iter()) + .all(|(a,b)| a == b) + && self.s2_data2 + .iter() + .zip(other.s2_data2.iter()) + .all(|(a,b)| a == b) + && self.s2_data3 + .iter() + .zip(other.s2_data3.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("s2_len", &self.s2_len) + .field("ss_family", &self.ss_family) + // FIXME: .field("s2_data1", &self.s2_data1) + // FIXME: .field("s2_data2", &self.s2_data2) + // FIXME: .field("s2_data3", &self.s2_data3) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.s2_len.hash(state); + self.ss_family.hash(state); + self.s2_data1.hash(state); + self.s2_data2.hash(state); + self.s2_data3.hash(state); + } + } + + impl PartialEq for stat { + fn eq(&self, other: &stat) -> bool { + self.st_dev == other.st_dev + && self.st_ino == other.st_ino + && self.st_mode == other.st_mode + && self.st_nlink == other.st_nlink + && self.st_uid == other.st_uid + && self.st_gid == other.st_gid + && self.st_rdev == other.st_rdev + && self.st_size == other.st_size + && self.st_atime == other.st_atime + && self.st_atime_nsec == other.st_atime_nsec + && self.st_mtime == other.st_mtime + && self.st_mtime_nsec == other.st_mtime_nsec + && self.st_ctime == other.st_ctime + && self.st_ctime_nsec == other.st_ctime_nsec + && self.st_blksize == other.st_blksize + && self.st_blocks == other.st_blocks + && self + .st_spare4 + .iter() + .zip(other.st_spare4.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for stat {} + impl ::fmt::Debug for stat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("stat") + .field("st_dev", &self.st_dev) + .field("st_ino", &self.st_ino) + .field("st_mode", &self.st_mode) + .field("st_nlink", &self.st_nlink) + .field("st_uid", &self.st_uid) + .field("st_gid", &self.st_gid) + .field("st_rdev", &self.st_rdev) + .field("st_size", &self.st_size) + .field("st_atime", &self.st_atime) + .field("st_atime_nsec", &self.st_atime_nsec) + .field("st_mtime", &self.st_mtime) + .field("st_mtime_nsec", &self.st_mtime_nsec) + .field("st_ctime", &self.st_ctime) + .field("st_ctime_nsec", &self.st_ctime_nsec) + .field("st_blksize", &self.st_blksize) + .field("st_blocks", &self.st_blocks) + // FIXME: .field("st_spare4", &self.st_spare4) + .finish() + } + } + impl ::hash::Hash for stat { + fn hash(&self, state: &mut H) { + self.st_dev.hash(state); + self.st_ino.hash(state); + self.st_mode.hash(state); + self.st_nlink.hash(state); + self.st_uid.hash(state); + self.st_gid.hash(state); + self.st_rdev.hash(state); + self.st_size.hash(state); + self.st_atime.hash(state); + self.st_atime_nsec.hash(state); + self.st_mtime.hash(state); + self.st_mtime_nsec.hash(state); + self.st_ctime.hash(state); + self.st_ctime_nsec.hash(state); + self.st_blksize.hash(state); + self.st_blocks.hash(state); + self.st_spare4.hash(state); + } + } + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + pub ai_addr: *mut ::sockaddr, + pub ai_canonname: *mut c_char, + pub ai_next: *mut addrinfo, + } + + pub struct Dl_info {} + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct passwd { // Unverified + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct pte_handle_t { + pub p: usize, + pub x: ::c_uint, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct sem_t { + pub value: i32, + pub lock: usize, + pub sem: usize, + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_mask: sigset_t, + pub sa_handler: usize, + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct statvfs {} + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + } + + pub struct tms { + pub tms_utime: ::clock_t, + pub tms_stime: ::clock_t, + pub tms_cutime: ::clock_t, + pub tms_cstime: ::clock_t, + } + + pub struct termios {} + + pub struct utsname {} +} + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_INET: ::c_int = 2; +pub const AF_INET6: ::c_int = 10; + +// Dummy +pub const AF_UNIX: ::c_int = 1; + +pub const CLOCK_REALTIME: ::clockid_t = 1; +pub const CLOCK_MONOTONIC: ::clockid_t = 4; + +// Dummy +pub const EAI_SYSTEM: ::c_int = -11; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EMULTIHOP: ::c_int = 72; +pub const EDOTDOT: ::c_int = 73; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_RGETLK: ::c_int = 10; +pub const F_RSETLK: ::c_int = 11; +pub const F_CNVT: ::c_int = 12; +pub const F_RSETLKW: ::c_int = 13; +pub const F_DUPFD_CLOEXEC: ::c_int = 14; + +pub const FD_SETSIZE: usize = 1024; + +// Dummy +pub const FIOCLEX: ::c_int = 0x5451; + +pub const FIONBIO: ::c_int = 0x8004667e; +pub const FIONREAD: ::c_int = 0x4004667f; + +pub const IP_ADD_MEMBERSHIP: ::c_int = 3; +pub const IP_DROP_MEMBERSHIP: ::c_int = 4; + +pub const IP_TOS: ::c_int = 1; +pub const IP_TTL: ::c_int = 2; + +pub const IP_MULTICAST_TTL: ::c_int = 5; +pub const IP_MULTICAST_IF: ::c_int = 6; +pub const IP_MULTICAST_LOOP: ::c_int = 7; + +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 13; +pub const IPV6_V6ONLY: ::c_int = 27; + +// Dummy +pub const IPV6_MULTICAST_LOOP: ::c_int = 7; + +pub const MSG_PEEK: ::c_int = 0x01; +pub const MSG_WAITALL: ::c_int = 0x02; +pub const MSG_OOB: ::c_int = 0x04; +pub const MSG_DONTWAIT: ::c_int = 0x08; +pub const MSG_MORE: ::c_int = 0x10; + +pub const O_ACCMODE: ::c_int = 3; +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 524288; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; + +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = usize::max_value(); +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = usize::max_value(); +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = usize::max_value(); + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_STACK_MIN: ::size_t = 0; + +// Dummy +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_JOB_CONTROL: ::c_int = 5; +pub const _SC_SAVED_IDS: ::c_int = 6; +pub const _SC_VERSION: ::c_int = 7; +pub const _SC_PAGESIZE: ::c_int = 8; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_NPROCESSORS_CONF: ::c_int = 9; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 10; +pub const _SC_PHYS_PAGES: ::c_int = 11; +pub const _SC_AVPHYS_PAGES: ::c_int = 12; +pub const _SC_MQ_OPEN_MAX: ::c_int = 13; +pub const _SC_MQ_PRIO_MAX: ::c_int = 14; +pub const _SC_RTSIG_MAX: ::c_int = 15; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 16; +pub const _SC_SEM_VALUE_MAX: ::c_int = 17; +pub const _SC_SIGQUEUE_MAX: ::c_int = 18; +pub const _SC_TIMER_MAX: ::c_int = 19; +pub const _SC_TZNAME_MAX: ::c_int = 20; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21; +pub const _SC_FSYNC: ::c_int = 22; +pub const _SC_MAPPED_FILES: ::c_int = 23; +pub const _SC_MEMLOCK: ::c_int = 24; +pub const _SC_MEMLOCK_RANGE: ::c_int = 25; +pub const _SC_MEMORY_PROTECTION: ::c_int = 26; +pub const _SC_MESSAGE_PASSING: ::c_int = 27; +pub const _SC_PRIORITIZED_IO: ::c_int = 28; +pub const _SC_REALTIME_SIGNALS: ::c_int = 29; +pub const _SC_SEMAPHORES: ::c_int = 30; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 31; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 32; +pub const _SC_TIMERS: ::c_int = 33; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 34; +pub const _SC_AIO_MAX: ::c_int = 35; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 36; +pub const _SC_DELAYTIMER_MAX: ::c_int = 37; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 38; +pub const _SC_THREAD_STACK_MIN: ::c_int = 39; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 40; +pub const _SC_TTY_NAME_MAX: ::c_int = 41; +pub const _SC_THREADS: ::c_int = 42; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 43; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 44; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 45; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 46; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 47; +pub const _SC_THREAD_PRIO_CEILING: ::c_int = _SC_THREAD_PRIO_PROTECT; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 48; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 49; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 50; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 52; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 53; +pub const _SC_ADVISORY_INFO: ::c_int = 54; +pub const _SC_ATEXIT_MAX: ::c_int = 55; +pub const _SC_BARRIERS: ::c_int = 56; +pub const _SC_BC_BASE_MAX: ::c_int = 57; +pub const _SC_BC_DIM_MAX: ::c_int = 58; +pub const _SC_BC_SCALE_MAX: ::c_int = 59; +pub const _SC_BC_STRING_MAX: ::c_int = 60; +pub const _SC_CLOCK_SELECTION: ::c_int = 61; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 62; +pub const _SC_CPUTIME: ::c_int = 63; +pub const _SC_EXPR_NEST_MAX: ::c_int = 64; +pub const _SC_HOST_NAME_MAX: ::c_int = 65; +pub const _SC_IOV_MAX: ::c_int = 66; +pub const _SC_IPV6: ::c_int = 67; +pub const _SC_LINE_MAX: ::c_int = 68; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 69; +pub const _SC_RAW_SOCKETS: ::c_int = 70; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 71; +pub const _SC_REGEXP: ::c_int = 72; +pub const _SC_RE_DUP_MAX: ::c_int = 73; +pub const _SC_SHELL: ::c_int = 74; +pub const _SC_SPAWN: ::c_int = 75; +pub const _SC_SPIN_LOCKS: ::c_int = 76; +pub const _SC_SPORADIC_SERVER: ::c_int = 77; +pub const _SC_SS_REPL_MAX: ::c_int = 78; +pub const _SC_SYMLOOP_MAX: ::c_int = 79; +pub const _SC_THREAD_CPUTIME: ::c_int = 80; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 81; +pub const _SC_TIMEOUTS: ::c_int = 82; +pub const _SC_TRACE: ::c_int = 83; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 84; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 85; +pub const _SC_TRACE_INHERIT: ::c_int = 86; +pub const _SC_TRACE_LOG: ::c_int = 87; +pub const _SC_TRACE_NAME_MAX: ::c_int = 88; +pub const _SC_TRACE_SYS_MAX: ::c_int = 89; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 90; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 91; +pub const _SC_V7_ILP32_OFF32: ::c_int = 92; +pub const _SC_V6_ILP32_OFF32: ::c_int = _SC_V7_ILP32_OFF32; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = _SC_V7_ILP32_OFF32; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 93; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = _SC_V7_ILP32_OFFBIG; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = _SC_V7_ILP32_OFFBIG; +pub const _SC_V7_LP64_OFF64: ::c_int = 94; +pub const _SC_V6_LP64_OFF64: ::c_int = _SC_V7_LP64_OFF64; +pub const _SC_XBS5_LP64_OFF64: ::c_int = _SC_V7_LP64_OFF64; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 95; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = _SC_V7_LPBIG_OFFBIG; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = _SC_V7_LPBIG_OFFBIG; +pub const _SC_XOPEN_CRYPT: ::c_int = 96; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 97; +pub const _SC_XOPEN_LEGACY: ::c_int = 98; +pub const _SC_XOPEN_REALTIME: ::c_int = 99; +pub const _SC_STREAM_MAX: ::c_int = 100; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 101; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 102; +pub const _SC_XOPEN_SHM: ::c_int = 103; +pub const _SC_XOPEN_STREAMS: ::c_int = 104; +pub const _SC_XOPEN_UNIX: ::c_int = 105; +pub const _SC_XOPEN_VERSION: ::c_int = 106; +pub const _SC_2_CHAR_TERM: ::c_int = 107; +pub const _SC_2_C_BIND: ::c_int = 108; +pub const _SC_2_C_DEV: ::c_int = 109; +pub const _SC_2_FORT_DEV: ::c_int = 110; +pub const _SC_2_FORT_RUN: ::c_int = 111; +pub const _SC_2_LOCALEDEF: ::c_int = 112; +pub const _SC_2_PBS: ::c_int = 113; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 114; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 115; +pub const _SC_2_PBS_LOCATE: ::c_int = 116; +pub const _SC_2_PBS_MESSAGE: ::c_int = 117; +pub const _SC_2_PBS_TRACK: ::c_int = 118; +pub const _SC_2_SW_DEV: ::c_int = 119; +pub const _SC_2_UPE: ::c_int = 120; +pub const _SC_2_VERSION: ::c_int = 121; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 122; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 123; +pub const _SC_XOPEN_UUCP: ::c_int = 124; +pub const _SC_LEVEL1_ICACHE_SIZE: ::c_int = 125; +pub const _SC_LEVEL1_ICACHE_ASSOC: ::c_int = 126; +pub const _SC_LEVEL1_ICACHE_LINESIZE: ::c_int = 127; +pub const _SC_LEVEL1_DCACHE_SIZE: ::c_int = 128; +pub const _SC_LEVEL1_DCACHE_ASSOC: ::c_int = 129; +pub const _SC_LEVEL1_DCACHE_LINESIZE: ::c_int = 130; +pub const _SC_LEVEL2_CACHE_SIZE: ::c_int = 131; +pub const _SC_LEVEL2_CACHE_ASSOC: ::c_int = 132; +pub const _SC_LEVEL2_CACHE_LINESIZE: ::c_int = 133; +pub const _SC_LEVEL3_CACHE_SIZE: ::c_int = 134; +pub const _SC_LEVEL3_CACHE_ASSOC: ::c_int = 135; +pub const _SC_LEVEL3_CACHE_LINESIZE: ::c_int = 136; +pub const _SC_LEVEL4_CACHE_SIZE: ::c_int = 137; +pub const _SC_LEVEL4_CACHE_ASSOC: ::c_int = 138; +pub const _SC_LEVEL4_CACHE_LINESIZE: ::c_int = 139; + +pub const S_BLKSIZE: ::mode_t = 1024; +pub const S_IREAD: ::mode_t = 256; +pub const S_IWRITE: ::mode_t = 128; +pub const S_IEXEC: ::mode_t = 64; +pub const S_ENFMT: ::mode_t = 1024; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IROTH: ::mode_t = 4; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IXOTH: ::mode_t = 1; + +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const SIG_SETMASK: ::c_int = 0; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_CONTIMEO: ::c_int = 0x1009; +pub const SO_NO_CHECK: ::c_int = 0x100a; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; + +pub const SOL_SOCKET: ::c_int = 0xfff; + +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_KEEPALIVE: ::c_int = 0x02; +pub const TCP_KEEPIDLE: ::c_int = 0x03; +pub const TCP_KEEPINTVL: ::c_int = 0x04; +pub const TCP_KEEPCNT: ::c_int = 0x05; + +const ULONG_SIZE: usize = 64; + +pub const WNOHANG: ::c_int = 0x00000001; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +safe_f! { + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xff) == 0 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } +} + +extern "C" { + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + pub fn bind(s: ::c_int, name: *const ::sockaddr, namelen: ::socklen_t) -> ::c_int; + + pub fn clock_gettime(clock_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + + // Dummy + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + pub fn memalign(align: ::size_t, nbytes: ::size_t) -> *mut ::c_void; + + pub fn pthread_create( + tid: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + start: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + arg: *mut ::c_void, + ) -> ::c_int; + + pub fn pthread_sigmask(how: ::c_int, set: *const ::sigset_t, oset: *mut ::sigset_t) -> ::c_int; + + pub fn recvfrom( + s: ::c_int, + mem: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + from: *mut ::sockaddr, + fromlen: *mut ::socklen_t, + ) -> ::c_int; + + pub fn setgroups(ngroups: ::c_int, grouplist: *const ::gid_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/x86_64.rs new file mode 100644 index 0000000..76ec3ce --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/hermit/x86_64.rs @@ -0,0 +1,2 @@ +pub type c_char = i8; +pub type wchar_t = i32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/arm.rs new file mode 100644 index 0000000..a062175 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/arm.rs @@ -0,0 +1,550 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type greg_t = i32; +pub type mcontext_t = sigcontext; + +s! { + pub struct sigcontext { + pub trap_no: ::c_ulong, + pub error_code: ::c_ulong, + pub oldmask: ::c_ulong, + pub arm_r0: ::c_ulong, + pub arm_r1: ::c_ulong, + pub arm_r2: ::c_ulong, + pub arm_r3: ::c_ulong, + pub arm_r4: ::c_ulong, + pub arm_r5: ::c_ulong, + pub arm_r6: ::c_ulong, + pub arm_r7: ::c_ulong, + pub arm_r8: ::c_ulong, + pub arm_r9: ::c_ulong, + pub arm_r10: ::c_ulong, + pub arm_fp: ::c_ulong, + pub arm_ip: ::c_ulong, + pub arm_sp: ::c_ulong, + pub arm_lr: ::c_ulong, + pub arm_pc: ::c_ulong, + pub arm_cpsr: ::c_ulong, + pub fault_address: ::c_ulong, + } +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + pub struct __c_anonymous_uc_sigmask_with_padding { + pub uc_sigmask: ::sigset_t, + /* Android has a wrong (smaller) sigset_t on x86. */ + __padding_rt_sigset: u32, + } + + pub union __c_anonymous_uc_sigmask { + uc_sigmask: __c_anonymous_uc_sigmask_with_padding, + uc_sigmask64: ::sigset64_t, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask__c_anonymous_union: __c_anonymous_uc_sigmask, + /* The kernel adds extra padding after uc_sigmask to match + * glibc sigset_t on ARM. */ + __padding: [c_char; 120], + __align: [::c_longlong; 0], + uc_regspace: [::c_ulong; 128], + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for __c_anonymous_uc_sigmask_with_padding { + fn eq( + &self, other: &__c_anonymous_uc_sigmask_with_padding + ) -> bool { + self.uc_sigmask == other.uc_sigmask + // Ignore padding + } + } + impl Eq for __c_anonymous_uc_sigmask_with_padding {} + impl ::fmt::Debug for __c_anonymous_uc_sigmask_with_padding { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uc_sigmask_with_padding") + .field("uc_sigmask_with_padding", &self.uc_sigmask) + // Ignore padding + .finish() + } + } + impl ::hash::Hash for __c_anonymous_uc_sigmask_with_padding { + fn hash(&self, state: &mut H) { + self.uc_sigmask.hash(state) + // Ignore padding + } + } + + impl PartialEq for __c_anonymous_uc_sigmask { + fn eq(&self, other: &__c_anonymous_uc_sigmask) -> bool { + unsafe { self.uc_sigmask == other.uc_sigmask } + } + } + impl Eq for __c_anonymous_uc_sigmask {} + impl ::fmt::Debug for __c_anonymous_uc_sigmask { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uc_sigmask") + .field("uc_sigmask", unsafe { &self.uc_sigmask }) + .finish() + } + } + impl ::hash::Hash for __c_anonymous_uc_sigmask { + fn hash(&self, state: &mut H) { + unsafe { self.uc_sigmask.hash(state) } + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &Self) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask__c_anonymous_union + == other.uc_sigmask__c_anonymous_union + && &self.uc_regspace[..] == &other.uc_regspace[..] + // Ignore padding field + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field( + "uc_sigmask__c_anonymous_union", + &self.uc_sigmask__c_anonymous_union + ) + .field("uc_regspace", &&self.uc_regspace[..]) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask__c_anonymous_union.hash(state); + self.uc_regspace[..].hash(state); + // Ignore padding field + } + } + } + } + } +} + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_LARGEFILE: ::c_int = 0o400000; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_pause: ::c_long = 29; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS_getdents: ::c_long = 141; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_pivot_root: ::c_long = 218; +pub const SYS_mincore: ::c_long = 219; +pub const SYS_madvise: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_lookup_dcookie: ::c_long = 249; +pub const SYS_epoll_create: ::c_long = 250; +pub const SYS_epoll_ctl: ::c_long = 251; +pub const SYS_epoll_wait: ::c_long = 252; +pub const SYS_remap_file_pages: ::c_long = 253; +pub const SYS_set_tid_address: ::c_long = 256; +pub const SYS_timer_create: ::c_long = 257; +pub const SYS_timer_settime: ::c_long = 258; +pub const SYS_timer_gettime: ::c_long = 259; +pub const SYS_timer_getoverrun: ::c_long = 260; +pub const SYS_timer_delete: ::c_long = 261; +pub const SYS_clock_settime: ::c_long = 262; +pub const SYS_clock_gettime: ::c_long = 263; +pub const SYS_clock_getres: ::c_long = 264; +pub const SYS_clock_nanosleep: ::c_long = 265; +pub const SYS_statfs64: ::c_long = 266; +pub const SYS_fstatfs64: ::c_long = 267; +pub const SYS_tgkill: ::c_long = 268; +pub const SYS_utimes: ::c_long = 269; +pub const SYS_arm_fadvise64_64: ::c_long = 270; +pub const SYS_pciconfig_iobase: ::c_long = 271; +pub const SYS_pciconfig_read: ::c_long = 272; +pub const SYS_pciconfig_write: ::c_long = 273; +pub const SYS_mq_open: ::c_long = 274; +pub const SYS_mq_unlink: ::c_long = 275; +pub const SYS_mq_timedsend: ::c_long = 276; +pub const SYS_mq_timedreceive: ::c_long = 277; +pub const SYS_mq_notify: ::c_long = 278; +pub const SYS_mq_getsetattr: ::c_long = 279; +pub const SYS_waitid: ::c_long = 280; +pub const SYS_socket: ::c_long = 281; +pub const SYS_bind: ::c_long = 282; +pub const SYS_connect: ::c_long = 283; +pub const SYS_listen: ::c_long = 284; +pub const SYS_accept: ::c_long = 285; +pub const SYS_getsockname: ::c_long = 286; +pub const SYS_getpeername: ::c_long = 287; +pub const SYS_socketpair: ::c_long = 288; +pub const SYS_send: ::c_long = 289; +pub const SYS_sendto: ::c_long = 290; +pub const SYS_recv: ::c_long = 291; +pub const SYS_recvfrom: ::c_long = 292; +pub const SYS_shutdown: ::c_long = 293; +pub const SYS_setsockopt: ::c_long = 294; +pub const SYS_getsockopt: ::c_long = 295; +pub const SYS_sendmsg: ::c_long = 296; +pub const SYS_recvmsg: ::c_long = 297; +pub const SYS_semop: ::c_long = 298; +pub const SYS_semget: ::c_long = 299; +pub const SYS_semctl: ::c_long = 300; +pub const SYS_msgsnd: ::c_long = 301; +pub const SYS_msgrcv: ::c_long = 302; +pub const SYS_msgget: ::c_long = 303; +pub const SYS_msgctl: ::c_long = 304; +pub const SYS_shmat: ::c_long = 305; +pub const SYS_shmdt: ::c_long = 306; +pub const SYS_shmget: ::c_long = 307; +pub const SYS_shmctl: ::c_long = 308; +pub const SYS_add_key: ::c_long = 309; +pub const SYS_request_key: ::c_long = 310; +pub const SYS_keyctl: ::c_long = 311; +pub const SYS_semtimedop: ::c_long = 312; +pub const SYS_vserver: ::c_long = 313; +pub const SYS_ioprio_set: ::c_long = 314; +pub const SYS_ioprio_get: ::c_long = 315; +pub const SYS_inotify_init: ::c_long = 316; +pub const SYS_inotify_add_watch: ::c_long = 317; +pub const SYS_inotify_rm_watch: ::c_long = 318; +pub const SYS_mbind: ::c_long = 319; +pub const SYS_get_mempolicy: ::c_long = 320; +pub const SYS_set_mempolicy: ::c_long = 321; +pub const SYS_openat: ::c_long = 322; +pub const SYS_mkdirat: ::c_long = 323; +pub const SYS_mknodat: ::c_long = 324; +pub const SYS_fchownat: ::c_long = 325; +pub const SYS_futimesat: ::c_long = 326; +pub const SYS_fstatat64: ::c_long = 327; +pub const SYS_unlinkat: ::c_long = 328; +pub const SYS_renameat: ::c_long = 329; +pub const SYS_linkat: ::c_long = 330; +pub const SYS_symlinkat: ::c_long = 331; +pub const SYS_readlinkat: ::c_long = 332; +pub const SYS_fchmodat: ::c_long = 333; +pub const SYS_faccessat: ::c_long = 334; +pub const SYS_pselect6: ::c_long = 335; +pub const SYS_ppoll: ::c_long = 336; +pub const SYS_unshare: ::c_long = 337; +pub const SYS_set_robust_list: ::c_long = 338; +pub const SYS_get_robust_list: ::c_long = 339; +pub const SYS_splice: ::c_long = 340; +pub const SYS_arm_sync_file_range: ::c_long = 341; +pub const SYS_tee: ::c_long = 342; +pub const SYS_vmsplice: ::c_long = 343; +pub const SYS_move_pages: ::c_long = 344; +pub const SYS_getcpu: ::c_long = 345; +pub const SYS_epoll_pwait: ::c_long = 346; +pub const SYS_kexec_load: ::c_long = 347; +pub const SYS_utimensat: ::c_long = 348; +pub const SYS_signalfd: ::c_long = 349; +pub const SYS_timerfd_create: ::c_long = 350; +pub const SYS_eventfd: ::c_long = 351; +pub const SYS_fallocate: ::c_long = 352; +pub const SYS_timerfd_settime: ::c_long = 353; +pub const SYS_timerfd_gettime: ::c_long = 354; +pub const SYS_signalfd4: ::c_long = 355; +pub const SYS_eventfd2: ::c_long = 356; +pub const SYS_epoll_create1: ::c_long = 357; +pub const SYS_dup3: ::c_long = 358; +pub const SYS_pipe2: ::c_long = 359; +pub const SYS_inotify_init1: ::c_long = 360; +pub const SYS_preadv: ::c_long = 361; +pub const SYS_pwritev: ::c_long = 362; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 363; +pub const SYS_perf_event_open: ::c_long = 364; +pub const SYS_recvmmsg: ::c_long = 365; +pub const SYS_accept4: ::c_long = 366; +pub const SYS_fanotify_init: ::c_long = 367; +pub const SYS_fanotify_mark: ::c_long = 368; +pub const SYS_prlimit64: ::c_long = 369; +pub const SYS_name_to_handle_at: ::c_long = 370; +pub const SYS_open_by_handle_at: ::c_long = 371; +pub const SYS_clock_adjtime: ::c_long = 372; +pub const SYS_syncfs: ::c_long = 373; +pub const SYS_sendmmsg: ::c_long = 374; +pub const SYS_setns: ::c_long = 375; +pub const SYS_process_vm_readv: ::c_long = 376; +pub const SYS_process_vm_writev: ::c_long = 377; +pub const SYS_kcmp: ::c_long = 378; +pub const SYS_finit_module: ::c_long = 379; +pub const SYS_sched_setattr: ::c_long = 380; +pub const SYS_sched_getattr: ::c_long = 381; +pub const SYS_renameat2: ::c_long = 382; +pub const SYS_seccomp: ::c_long = 383; +pub const SYS_getrandom: ::c_long = 384; +pub const SYS_memfd_create: ::c_long = 385; +pub const SYS_bpf: ::c_long = 386; +pub const SYS_execveat: ::c_long = 387; +pub const SYS_userfaultfd: ::c_long = 388; +pub const SYS_membarrier: ::c_long = 389; +pub const SYS_mlock2: ::c_long = 390; +pub const SYS_copy_file_range: ::c_long = 391; +pub const SYS_preadv2: ::c_long = 392; +pub const SYS_pwritev2: ::c_long = 393; +pub const SYS_pkey_mprotect: ::c_long = 394; +pub const SYS_pkey_alloc: ::c_long = 395; +pub const SYS_pkey_free: ::c_long = 396; +pub const SYS_statx: ::c_long = 397; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; + +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_R0: ::c_int = 0; +pub const REG_R1: ::c_int = 1; +pub const REG_R2: ::c_int = 2; +pub const REG_R3: ::c_int = 3; +pub const REG_R4: ::c_int = 4; +pub const REG_R5: ::c_int = 5; +pub const REG_R6: ::c_int = 6; +pub const REG_R7: ::c_int = 7; +pub const REG_R8: ::c_int = 8; +pub const REG_R9: ::c_int = 9; +pub const REG_R10: ::c_int = 10; +pub const REG_R11: ::c_int = 11; +pub const REG_R12: ::c_int = 12; +pub const REG_R13: ::c_int = 13; +pub const REG_R14: ::c_int = 14; +pub const REG_R15: ::c_int = 15; + +pub const NGREG: ::c_int = 18; + +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it through `syscall` + // directly. This workaround can be removed if the minimum version of + // Android is bumped. When the workaround is removed, `accept4` can be + // moved back to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + ::syscall(SYS_accept4, fd, addr, len, flg) as ::c_int + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/mod.rs new file mode 100644 index 0000000..1f4f796 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/mod.rs @@ -0,0 +1,244 @@ +// The following definitions are correct for arm and i686, +// but may be wrong for mips + +pub type c_long = i32; +pub type c_ulong = u32; +pub type mode_t = u16; +pub type off64_t = ::c_longlong; +pub type sigset_t = ::c_ulong; +pub type socklen_t = i32; +pub type time64_t = i64; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct rlimit64 { + pub rlim_cur: u64, + pub rlim_max: u64, + } + + pub struct stat { + pub st_dev: ::c_ulonglong, + __pad0: [::c_uchar; 4], + __st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + __pad3: [::c_uchar; 4], + pub st_size: ::c_longlong, + pub st_blksize: ::blksize_t, + pub st_blocks: ::c_ulonglong, + pub st_atime: ::c_long, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::c_long, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::c_long, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::c_ulonglong, + } + + pub struct stat64 { + pub st_dev: ::c_ulonglong, + __pad0: [::c_uchar; 4], + __st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + __pad3: [::c_uchar; 4], + pub st_size: ::c_longlong, + pub st_blksize: ::blksize_t, + pub st_blocks: ::c_ulonglong, + pub st_atime: ::c_long, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::c_long, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::c_long, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::c_ulonglong, + } + + pub struct statfs64 { + pub f_type: u32, + pub f_bsize: u32, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::__fsid_t, + pub f_namelen: u32, + pub f_frsize: u32, + pub f_flags: u32, + pub f_spare: [u32; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::c_ulong, + pub f_bfree: ::c_ulong, + pub f_bavail: ::c_ulong, + pub f_files: ::c_ulong, + pub f_ffree: ::c_ulong, + pub f_favail: ::c_ulong, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct pthread_attr_t { + pub flags: u32, + pub stack_base: *mut ::c_void, + pub stack_size: ::size_t, + pub guard_size: ::size_t, + pub sched_policy: i32, + pub sched_priority: i32, + } + + pub struct pthread_mutex_t { value: ::c_int } + + pub struct pthread_cond_t { value: ::c_int } + + pub struct pthread_rwlock_t { + lock: pthread_mutex_t, + cond: pthread_cond_t, + numLocks: ::c_int, + writerThreadId: ::c_int, + pendingReaders: ::c_int, + pendingWriters: ::c_int, + attr: i32, + __reserved: [::c_char; 12], + } + + pub struct pthread_barrier_t { + __private: [i32; 8], + } + + pub struct pthread_spinlock_t { + __private: [i32; 2], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct statfs { + pub f_type: u32, + pub f_bsize: u32, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::__fsid_t, + pub f_namelen: u32, + pub f_frsize: u32, + pub f_flags: u32, + pub f_spare: [u32; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } +} + +s_no_extra_traits! { + pub struct sigset64_t { + __bits: [::c_ulong; 2] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl ::fmt::Debug for sigset64_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigset64_t") + .field("__bits", &self.__bits) + .finish() + } + } + } +} + +// These constants must be of the same type of sigaction.sa_flags +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; + +pub const RTLD_GLOBAL: ::c_int = 2; +pub const RTLD_NOW: ::c_int = 0; +pub const RTLD_DEFAULT: *mut ::c_void = -1isize as *mut ::c_void; + +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { value: 0 }; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { value: 0 }; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + lock: PTHREAD_MUTEX_INITIALIZER, + cond: PTHREAD_COND_INITIALIZER, + numLocks: 0, + writerThreadId: 0, + pendingReaders: 0, + pendingWriters: 0, + attr: 0, + __reserved: [0; 12], +}; +pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 2; +pub const CPU_SETSIZE: ::size_t = 32; +pub const __CPU_BITS: ::size_t = 32; + +pub const UT_LINESIZE: usize = 8; +pub const UT_NAMESIZE: usize = 8; +pub const UT_HOSTSIZE: usize = 16; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +extern "C" { + pub fn timegm64(tm: *const ::tm) -> ::time64_t; +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/align.rs new file mode 100644 index 0000000..04df4a0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [f64; 2] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs new file mode 100644 index 0000000..e549f3b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs @@ -0,0 +1,622 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type greg_t = i32; + +s! { + pub struct _libc_fpreg { + pub significand: [u16; 4], + pub exponent: u16, + } + + pub struct _libc_fpstate { + pub cw: ::c_ulong, + pub sw: ::c_ulong, + pub tag: ::c_ulong, + pub ipoff: ::c_ulong, + pub cssel: ::c_ulong, + pub dataoff: ::c_ulong, + pub datasel: ::c_ulong, + pub _st: [_libc_fpreg; 8], + pub status: ::c_ulong, + } + + pub struct mcontext_t { + pub gregs: [greg_t; 19], + pub fpregs: *mut _libc_fpstate, + pub oldmask: ::c_ulong, + pub cr2: ::c_ulong, + } +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + pub struct __c_anonymous_uc_sigmask_with_padding { + pub uc_sigmask: ::sigset_t, + /* Android has a wrong (smaller) sigset_t on x86. */ + __padding_rt_sigset: u32, + } + + pub union __c_anonymous_uc_sigmask { + uc_sigmask: __c_anonymous_uc_sigmask_with_padding, + uc_sigmask64: ::sigset64_t, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask__c_anonymous_union: __c_anonymous_uc_sigmask, + __padding_rt_sigset: u32, + __fpregs_mem: _libc_fpstate, + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for __c_anonymous_uc_sigmask_with_padding { + fn eq( + &self, other: &__c_anonymous_uc_sigmask_with_padding + ) -> bool { + self.uc_sigmask == other.uc_sigmask + // Ignore padding + } + } + impl Eq for __c_anonymous_uc_sigmask_with_padding {} + impl ::fmt::Debug for __c_anonymous_uc_sigmask_with_padding { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uc_sigmask_with_padding") + .field("uc_sigmask_with_padding", &self.uc_sigmask) + // Ignore padding + .finish() + } + } + impl ::hash::Hash for __c_anonymous_uc_sigmask_with_padding { + fn hash(&self, state: &mut H) { + self.uc_sigmask.hash(state) + // Ignore padding + } + } + + impl PartialEq for __c_anonymous_uc_sigmask { + fn eq(&self, other: &__c_anonymous_uc_sigmask) -> bool { + unsafe { self.uc_sigmask == other.uc_sigmask } + } + } + impl Eq for __c_anonymous_uc_sigmask {} + impl ::fmt::Debug for __c_anonymous_uc_sigmask { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uc_sigmask") + .field("uc_sigmask", unsafe { &self.uc_sigmask }) + .finish() + } + } + impl ::hash::Hash for __c_anonymous_uc_sigmask { + fn hash(&self, state: &mut H) { + unsafe { self.uc_sigmask.hash(state) } + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &Self) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask__c_anonymous_union + == other.uc_sigmask__c_anonymous_union + // Ignore padding field + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field( + "uc_sigmask__c_anonymous_union", + &self.uc_sigmask__c_anonymous_union + ) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask__c_anonymous_union.hash(state); + // Ignore padding field + } + } + } + } + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_LARGEFILE: ::c_int = 0o0100000; + +pub const MAP_32BIT: ::c_int = 0x40; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86old: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +// FIXME: SYS__llseek is in the NDK sources but for some reason is +// not available in the tests +// pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +// FIXME: SYS__newselect is in the NDK sources but for some reason is +// not available in the tests +// pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +// FIXME: SYS__llseek is in the NDK sources but for some reason is +// not available in the tests +// pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_vm86: ::c_long = 166; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_set_thread_area: ::c_long = 243; +pub const SYS_get_thread_area: ::c_long = 244; +pub const SYS_io_setup: ::c_long = 245; +pub const SYS_io_destroy: ::c_long = 246; +pub const SYS_io_getevents: ::c_long = 247; +pub const SYS_io_submit: ::c_long = 248; +pub const SYS_io_cancel: ::c_long = 249; +pub const SYS_fadvise64: ::c_long = 250; +pub const SYS_exit_group: ::c_long = 252; +pub const SYS_lookup_dcookie: ::c_long = 253; +pub const SYS_epoll_create: ::c_long = 254; +pub const SYS_epoll_ctl: ::c_long = 255; +pub const SYS_epoll_wait: ::c_long = 256; +pub const SYS_remap_file_pages: ::c_long = 257; +pub const SYS_set_tid_address: ::c_long = 258; +pub const SYS_timer_create: ::c_long = 259; +pub const SYS_timer_settime: ::c_long = 260; +pub const SYS_timer_gettime: ::c_long = 261; +pub const SYS_timer_getoverrun: ::c_long = 262; +pub const SYS_timer_delete: ::c_long = 263; +pub const SYS_clock_settime: ::c_long = 264; +pub const SYS_clock_gettime: ::c_long = 265; +pub const SYS_clock_getres: ::c_long = 266; +pub const SYS_clock_nanosleep: ::c_long = 267; +pub const SYS_statfs64: ::c_long = 268; +pub const SYS_fstatfs64: ::c_long = 269; +pub const SYS_tgkill: ::c_long = 270; +pub const SYS_utimes: ::c_long = 271; +pub const SYS_fadvise64_64: ::c_long = 272; +pub const SYS_vserver: ::c_long = 273; +pub const SYS_mbind: ::c_long = 274; +pub const SYS_get_mempolicy: ::c_long = 275; +pub const SYS_set_mempolicy: ::c_long = 276; +pub const SYS_mq_open: ::c_long = 277; +pub const SYS_mq_unlink: ::c_long = 278; +pub const SYS_mq_timedsend: ::c_long = 279; +pub const SYS_mq_timedreceive: ::c_long = 280; +pub const SYS_mq_notify: ::c_long = 281; +pub const SYS_mq_getsetattr: ::c_long = 282; +pub const SYS_kexec_load: ::c_long = 283; +pub const SYS_waitid: ::c_long = 284; +pub const SYS_add_key: ::c_long = 286; +pub const SYS_request_key: ::c_long = 287; +pub const SYS_keyctl: ::c_long = 288; +pub const SYS_ioprio_set: ::c_long = 289; +pub const SYS_ioprio_get: ::c_long = 290; +pub const SYS_inotify_init: ::c_long = 291; +pub const SYS_inotify_add_watch: ::c_long = 292; +pub const SYS_inotify_rm_watch: ::c_long = 293; +pub const SYS_migrate_pages: ::c_long = 294; +pub const SYS_openat: ::c_long = 295; +pub const SYS_mkdirat: ::c_long = 296; +pub const SYS_mknodat: ::c_long = 297; +pub const SYS_fchownat: ::c_long = 298; +pub const SYS_futimesat: ::c_long = 299; +pub const SYS_fstatat64: ::c_long = 300; +pub const SYS_unlinkat: ::c_long = 301; +pub const SYS_renameat: ::c_long = 302; +pub const SYS_linkat: ::c_long = 303; +pub const SYS_symlinkat: ::c_long = 304; +pub const SYS_readlinkat: ::c_long = 305; +pub const SYS_fchmodat: ::c_long = 306; +pub const SYS_faccessat: ::c_long = 307; +pub const SYS_pselect6: ::c_long = 308; +pub const SYS_ppoll: ::c_long = 309; +pub const SYS_unshare: ::c_long = 310; +pub const SYS_set_robust_list: ::c_long = 311; +pub const SYS_get_robust_list: ::c_long = 312; +pub const SYS_splice: ::c_long = 313; +pub const SYS_sync_file_range: ::c_long = 314; +pub const SYS_tee: ::c_long = 315; +pub const SYS_vmsplice: ::c_long = 316; +pub const SYS_move_pages: ::c_long = 317; +pub const SYS_getcpu: ::c_long = 318; +pub const SYS_epoll_pwait: ::c_long = 319; +pub const SYS_utimensat: ::c_long = 320; +pub const SYS_signalfd: ::c_long = 321; +pub const SYS_timerfd_create: ::c_long = 322; +pub const SYS_eventfd: ::c_long = 323; +pub const SYS_fallocate: ::c_long = 324; +pub const SYS_timerfd_settime: ::c_long = 325; +pub const SYS_timerfd_gettime: ::c_long = 326; +pub const SYS_signalfd4: ::c_long = 327; +pub const SYS_eventfd2: ::c_long = 328; +pub const SYS_epoll_create1: ::c_long = 329; +pub const SYS_dup3: ::c_long = 330; +pub const SYS_pipe2: ::c_long = 331; +pub const SYS_inotify_init1: ::c_long = 332; +pub const SYS_preadv: ::c_long = 333; +pub const SYS_pwritev: ::c_long = 334; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 335; +pub const SYS_perf_event_open: ::c_long = 336; +pub const SYS_recvmmsg: ::c_long = 337; +pub const SYS_fanotify_init: ::c_long = 338; +pub const SYS_fanotify_mark: ::c_long = 339; +pub const SYS_prlimit64: ::c_long = 340; +pub const SYS_name_to_handle_at: ::c_long = 341; +pub const SYS_open_by_handle_at: ::c_long = 342; +pub const SYS_clock_adjtime: ::c_long = 343; +pub const SYS_syncfs: ::c_long = 344; +pub const SYS_sendmmsg: ::c_long = 345; +pub const SYS_setns: ::c_long = 346; +pub const SYS_process_vm_readv: ::c_long = 347; +pub const SYS_process_vm_writev: ::c_long = 348; +pub const SYS_kcmp: ::c_long = 349; +pub const SYS_finit_module: ::c_long = 350; +pub const SYS_sched_setattr: ::c_long = 351; +pub const SYS_sched_getattr: ::c_long = 352; +pub const SYS_renameat2: ::c_long = 353; +pub const SYS_seccomp: ::c_long = 354; +pub const SYS_getrandom: ::c_long = 355; +pub const SYS_memfd_create: ::c_long = 356; +pub const SYS_bpf: ::c_long = 357; +pub const SYS_execveat: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_userfaultfd: ::c_long = 374; +pub const SYS_membarrier: ::c_long = 375; +pub const SYS_mlock2: ::c_long = 376; +pub const SYS_copy_file_range: ::c_long = 377; +pub const SYS_preadv2: ::c_long = 378; +pub const SYS_pwritev2: ::c_long = 379; +pub const SYS_pkey_mprotect: ::c_long = 380; +pub const SYS_pkey_alloc: ::c_long = 381; +pub const SYS_pkey_free: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; + +// offsets in user_regs_structs, from sys/reg.h +pub const EBX: ::c_int = 0; +pub const ECX: ::c_int = 1; +pub const EDX: ::c_int = 2; +pub const ESI: ::c_int = 3; +pub const EDI: ::c_int = 4; +pub const EBP: ::c_int = 5; +pub const EAX: ::c_int = 6; +pub const DS: ::c_int = 7; +pub const ES: ::c_int = 8; +pub const FS: ::c_int = 9; +pub const GS: ::c_int = 10; +pub const ORIG_EAX: ::c_int = 11; +pub const EIP: ::c_int = 12; +pub const CS: ::c_int = 13; +pub const EFL: ::c_int = 14; +pub const UESP: ::c_int = 15; +pub const SS: ::c_int = 16; + +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_GS: ::c_int = 0; +pub const REG_FS: ::c_int = 1; +pub const REG_ES: ::c_int = 2; +pub const REG_DS: ::c_int = 3; +pub const REG_EDI: ::c_int = 4; +pub const REG_ESI: ::c_int = 5; +pub const REG_EBP: ::c_int = 6; +pub const REG_ESP: ::c_int = 7; +pub const REG_EBX: ::c_int = 8; +pub const REG_EDX: ::c_int = 9; +pub const REG_ECX: ::c_int = 10; +pub const REG_EAX: ::c_int = 11; +pub const REG_TRAPNO: ::c_int = 12; +pub const REG_ERR: ::c_int = 13; +pub const REG_EIP: ::c_int = 14; +pub const REG_CS: ::c_int = 15; +pub const REG_EFL: ::c_int = 16; +pub const REG_UESP: ::c_int = 17; +pub const REG_SS: ::c_int = 18; + +// socketcall values from linux/net.h (only the needed ones, and not public) +const SYS_ACCEPT4: ::c_int = 18; + +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it as raw syscall. + // Note that for x86, the `accept4` syscall is not available either, + // and we must use the `socketcall` syscall instead. + // This workaround can be removed if the minimum Android version is bumped. + // When the workaround is removed, `accept4` can be moved back + // to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + // Arguments are passed as array of `long int` + // (which is big enough on x86 for a pointer). + let mut args = [ + fd as ::c_long, + addr as ::c_long, + len as ::c_long, + flg as ::c_long, + ]; + ::syscall(SYS_socketcall, SYS_ACCEPT4, args[..].as_mut_ptr()) + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/align.rs new file mode 100644 index 0000000..154c2c5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/align.rs @@ -0,0 +1,29 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f32; 8] + } +} + +s! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[repr(align(16))] + pub struct mcontext_t { + pub fault_address: ::c_ulonglong, + pub regs: [::c_ulonglong; 31], + pub sp: ::c_ulonglong, + pub pc: ::c_ulonglong, + pub pstate: ::c_ulonglong, + // nested arrays to get the right size/length while being able to + // auto-derive traits like Debug + __reserved: [[u64; 32]; 16], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/int128.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/int128.rs new file mode 100644 index 0000000..4535e73 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/int128.rs @@ -0,0 +1,7 @@ +s! { + pub struct user_fpsimd_struct { + pub vregs: [::__uint128_t; 32], + pub fpsr: u32, + pub fpcr: u32, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs new file mode 100644 index 0000000..e7247fb --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs @@ -0,0 +1,427 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_uint, + __unused5: ::c_uint, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_uint, + __unused5: ::c_uint, + } + + pub struct user_regs_struct { + pub regs: [u64; 31], + pub sp: u64, + pub pc: u64, + pub pstate: u64, + } +} + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_LARGEFILE: ::c_int = 0o400000; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 5120; + +// From NDK's asm/hwcap.h +pub const HWCAP_FP: ::c_ulong = 1 << 0; +pub const HWCAP_ASIMD: ::c_ulong = 1 << 1; +pub const HWCAP_EVTSTRM: ::c_ulong = 1 << 2; +pub const HWCAP_AES: ::c_ulong = 1 << 3; +pub const HWCAP_PMULL: ::c_ulong = 1 << 4; +pub const HWCAP_SHA1: ::c_ulong = 1 << 5; +pub const HWCAP_SHA2: ::c_ulong = 1 << 6; +pub const HWCAP_CRC32: ::c_ulong = 1 << 7; +pub const HWCAP_ATOMICS: ::c_ulong = 1 << 8; +pub const HWCAP_FPHP: ::c_ulong = 1 << 9; +pub const HWCAP_ASIMDHP: ::c_ulong = 1 << 10; +pub const HWCAP_CPUID: ::c_ulong = 1 << 11; +pub const HWCAP_ASIMDRDM: ::c_ulong = 1 << 12; +pub const HWCAP_JSCVT: ::c_ulong = 1 << 13; +pub const HWCAP_FCMA: ::c_ulong = 1 << 14; +pub const HWCAP_LRCPC: ::c_ulong = 1 << 15; +pub const HWCAP_DCPOP: ::c_ulong = 1 << 16; +pub const HWCAP_SHA3: ::c_ulong = 1 << 17; +pub const HWCAP_SM3: ::c_ulong = 1 << 18; +pub const HWCAP_SM4: ::c_ulong = 1 << 19; +pub const HWCAP_ASIMDDP: ::c_ulong = 1 << 20; +pub const HWCAP_SHA512: ::c_ulong = 1 << 21; +pub const HWCAP_SVE: ::c_ulong = 1 << 22; +pub const HWCAP_ASIMDFHM: ::c_ulong = 1 << 23; +pub const HWCAP_DIT: ::c_ulong = 1 << 24; +pub const HWCAP_USCAT: ::c_ulong = 1 << 25; +pub const HWCAP_ILRCPC: ::c_ulong = 1 << 26; +pub const HWCAP_FLAGM: ::c_ulong = 1 << 27; +pub const HWCAP_SSBS: ::c_ulong = 1 << 28; +pub const HWCAP_SB: ::c_ulong = 1 << 29; +pub const HWCAP_PACA: ::c_ulong = 1 << 30; +pub const HWCAP_PACG: ::c_ulong = 1 << 31; +pub const HWCAP2_DCPODP: ::c_ulong = 1 << 0; +pub const HWCAP2_SVE2: ::c_ulong = 1 << 1; +pub const HWCAP2_SVEAES: ::c_ulong = 1 << 2; +pub const HWCAP2_SVEPMULL: ::c_ulong = 1 << 3; +pub const HWCAP2_SVEBITPERM: ::c_ulong = 1 << 4; +pub const HWCAP2_SVESHA3: ::c_ulong = 1 << 5; +pub const HWCAP2_SVESM4: ::c_ulong = 1 << 6; +pub const HWCAP2_FLAGM2: ::c_ulong = 1 << 7; +pub const HWCAP2_FRINT: ::c_ulong = 1 << 8; +pub const HWCAP2_SVEI8MM: ::c_ulong = 1 << 9; +pub const HWCAP2_SVEF32MM: ::c_ulong = 1 << 10; +pub const HWCAP2_SVEF64MM: ::c_ulong = 1 << 11; +pub const HWCAP2_SVEBF16: ::c_ulong = 1 << 12; +pub const HWCAP2_I8MM: ::c_ulong = 1 << 13; +pub const HWCAP2_BF16: ::c_ulong = 1 << 14; +pub const HWCAP2_DGH: ::c_ulong = 1 << 15; +pub const HWCAP2_RNG: ::c_ulong = 1 << 16; +pub const HWCAP2_BTI: ::c_ulong = 1 << 17; +pub const HWCAP2_MTE: ::c_ulong = 1 << 18; +pub const HWCAP2_ECV: ::c_ulong = 1 << 19; +pub const HWCAP2_AFP: ::c_ulong = 1 << 20; +pub const HWCAP2_RPRES: ::c_ulong = 1 << 21; +pub const HWCAP2_MTE3: ::c_ulong = 1 << 22; +pub const HWCAP2_SME: ::c_ulong = 1 << 23; +pub const HWCAP2_SME_I16I64: ::c_ulong = 1 << 24; +pub const HWCAP2_SME_F64F64: ::c_ulong = 1 << 25; +pub const HWCAP2_SME_I8I32: ::c_ulong = 1 << 26; +pub const HWCAP2_SME_F16F32: ::c_ulong = 1 << 27; +pub const HWCAP2_SME_B16F32: ::c_ulong = 1 << 28; +pub const HWCAP2_SME_F32F32: ::c_ulong = 1 << 29; +pub const HWCAP2_SME_FA64: ::c_ulong = 1 << 30; +pub const HWCAP2_WFXT: ::c_ulong = 1 << 31; +pub const HWCAP2_EBF16: ::c_ulong = 1 << 32; +pub const HWCAP2_SVE_EBF16: ::c_ulong = 1 << 33; + +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_dup: ::c_long = 23; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_flock: ::c_long = 32; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_renameat: ::c_long = 38; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_mount: ::c_long = 40; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_openat: ::c_long = 56; +pub const SYS_close: ::c_long = 57; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_sync: ::c_long = 81; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_acct: ::c_long = 89; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_personality: ::c_long = 92; +pub const SYS_exit: ::c_long = 93; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_futex: ::c_long = 98; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_kill: ::c_long = 129; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_times: ::c_long = 153; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_uname: ::c_long = 160; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_umask: ::c_long = 166; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_semop: ::c_long = 193; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_socket: ::c_long = 198; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_accept: ::c_long = 202; +pub const SYS_connect: ::c_long = 203; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_brk: ::c_long = 214; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_arch_specific_syscall: ::c_long = 244; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_setns: ::c_long = 268; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_syscalls: ::c_long = 436; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} + +cfg_if! { + if #[cfg(libc_int128)] { + mod int128; + pub use self::int128::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/mod.rs new file mode 100644 index 0000000..67d0dac --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/mod.rs @@ -0,0 +1,355 @@ +// The following definitions are correct for aarch64 and x86_64, +// but may be wrong for mips64 + +pub type c_long = i64; +pub type c_ulong = u64; +pub type mode_t = u32; +pub type off64_t = i64; +pub type socklen_t = u32; + +s! { + pub struct sigset_t { + __val: [::c_ulong; 1], + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_restorer: ::Option, + } + + pub struct rlimit64 { + pub rlim_cur: ::c_ulonglong, + pub rlim_max: ::c_ulonglong, + } + + pub struct pthread_attr_t { + pub flags: u32, + pub stack_base: *mut ::c_void, + pub stack_size: ::size_t, + pub guard_size: ::size_t, + pub sched_policy: i32, + pub sched_priority: i32, + __reserved: [::c_char; 16], + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct statfs { + pub f_type: u64, + pub f_bsize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::__fsid_t, + pub f_namelen: u64, + pub f_frsize: u64, + pub f_flags: u64, + pub f_spare: [u64; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + pub struct statfs64 { + pub f_type: u64, + pub f_bsize: u64, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::__fsid_t, + pub f_namelen: u64, + pub f_frsize: u64, + pub f_flags: u64, + pub f_spare: [u64; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_barrier_t { + __private: [i64; 4], + } + + pub struct pthread_spinlock_t { + __private: i64, + } +} + +s_no_extra_traits! { + pub struct pthread_mutex_t { + value: ::c_int, + __reserved: [::c_char; 36], + } + + pub struct pthread_cond_t { + value: ::c_int, + __reserved: [::c_char; 44], + } + + pub struct pthread_rwlock_t { + numLocks: ::c_int, + writerThreadId: ::c_int, + pendingReaders: ::c_int, + pendingWriters: ::c_int, + attr: i32, + __reserved: [::c_char; 36], + } + + pub struct sigset64_t { + __bits: [::c_ulong; 1] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_mutex_t { + fn eq(&self, other: &pthread_mutex_t) -> bool { + self.value == other.value + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for pthread_mutex_t {} + + impl ::fmt::Debug for pthread_mutex_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + .field("value", &self.value) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + + impl ::hash::Hash for pthread_mutex_t { + fn hash(&self, state: &mut H) { + self.value.hash(state); + self.__reserved.hash(state); + } + } + + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.value == other.value + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for pthread_cond_t {} + + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + .field("value", &self.value) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.value.hash(state); + self.__reserved.hash(state); + } + } + + impl PartialEq for pthread_rwlock_t { + fn eq(&self, other: &pthread_rwlock_t) -> bool { + self.numLocks == other.numLocks + && self.writerThreadId == other.writerThreadId + && self.pendingReaders == other.pendingReaders + && self.pendingWriters == other.pendingWriters + && self.attr == other.attr + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for pthread_rwlock_t {} + + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + .field("numLocks", &self.numLocks) + .field("writerThreadId", &self.writerThreadId) + .field("pendingReaders", &self.pendingReaders) + .field("pendingWriters", &self.pendingWriters) + .field("attr", &self.attr) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + + impl ::hash::Hash for pthread_rwlock_t { + fn hash(&self, state: &mut H) { + self.numLocks.hash(state); + self.writerThreadId.hash(state); + self.pendingReaders.hash(state); + self.pendingWriters.hash(state); + self.attr.hash(state); + self.__reserved.hash(state); + } + } + + impl ::fmt::Debug for sigset64_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigset64_t") + .field("__bits", &self.__bits) + .finish() + } + } + } +} + +// These constants must be of the same type of sigaction.sa_flags +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; + +pub const RTLD_GLOBAL: ::c_int = 0x00100; +pub const RTLD_NOW: ::c_int = 2; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; + +// From NDK's linux/auxvec.h +pub const AT_NULL: ::c_ulong = 0; +pub const AT_IGNORE: ::c_ulong = 1; +pub const AT_EXECFD: ::c_ulong = 2; +pub const AT_PHDR: ::c_ulong = 3; +pub const AT_PHENT: ::c_ulong = 4; +pub const AT_PHNUM: ::c_ulong = 5; +pub const AT_PAGESZ: ::c_ulong = 6; +pub const AT_BASE: ::c_ulong = 7; +pub const AT_FLAGS: ::c_ulong = 8; +pub const AT_ENTRY: ::c_ulong = 9; +pub const AT_NOTELF: ::c_ulong = 10; +pub const AT_UID: ::c_ulong = 11; +pub const AT_EUID: ::c_ulong = 12; +pub const AT_GID: ::c_ulong = 13; +pub const AT_EGID: ::c_ulong = 14; +pub const AT_PLATFORM: ::c_ulong = 15; +pub const AT_HWCAP: ::c_ulong = 16; +pub const AT_CLKTCK: ::c_ulong = 17; +pub const AT_SECURE: ::c_ulong = 23; +pub const AT_BASE_PLATFORM: ::c_ulong = 24; +pub const AT_RANDOM: ::c_ulong = 25; +pub const AT_HWCAP2: ::c_ulong = 26; +pub const AT_EXECFN: ::c_ulong = 31; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + value: 0, + __reserved: [0; 36], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + value: 0, + __reserved: [0; 44], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + numLocks: 0, + writerThreadId: 0, + pendingReaders: 0, + pendingWriters: 0, + attr: 0, + __reserved: [0; 36], +}; +pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 4; +pub const CPU_SETSIZE: ::size_t = 1024; +pub const __CPU_BITS: ::size_t = 64; + +pub const UT_LINESIZE: usize = 32; +pub const UT_NAMESIZE: usize = 32; +pub const UT_HOSTSIZE: usize = 256; + +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it through `syscall` + // directly. This workaround can be removed if the minimum version of + // Android is bumped. When the workaround is removed, `accept4` can be + // moved back to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + ::syscall(SYS_accept4, fd, addr, len, flg) as ::c_int + } +} + +extern "C" { + pub fn getauxval(type_: ::c_ulong) -> ::c_ulong; + pub fn __system_property_wait( + pi: *const ::prop_info, + __old_serial: u32, + __new_serial_ptr: *mut u32, + __relative_timeout: *const ::timespec, + ) -> bool; +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "riscv64")] { + mod riscv64; + pub use self::riscv64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/align.rs new file mode 100644 index 0000000..8e94996 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f32; 8] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/mod.rs new file mode 100644 index 0000000..9d414dc --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/riscv64/mod.rs @@ -0,0 +1,353 @@ +pub type c_char = i8; +pub type wchar_t = u32; +pub type greg_t = i64; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_uint, + __unused5: ::c_uint, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::c_ulong, + pub st_size: ::off64_t, + pub st_blksize: ::c_int, + __pad2: ::c_int, + pub st_blocks: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_uint, + __unused5: ::c_uint, + } +} + +pub const O_DIRECT: ::c_int = 0x40000; +pub const O_DIRECTORY: ::c_int = 0x200000; +pub const O_NOFOLLOW: ::c_int = 0x400000; +pub const O_LARGEFILE: ::c_int = 0x100000; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +// From NDK's asm/hwcap.h +pub const COMPAT_HWCAP_ISA_I: ::c_ulong = 1 << (b'I' - b'A'); +pub const COMPAT_HWCAP_ISA_M: ::c_ulong = 1 << (b'M' - b'A'); +pub const COMPAT_HWCAP_ISA_A: ::c_ulong = 1 << (b'A' - b'A'); +pub const COMPAT_HWCAP_ISA_F: ::c_ulong = 1 << (b'F' - b'A'); +pub const COMPAT_HWCAP_ISA_D: ::c_ulong = 1 << (b'D' - b'A'); +pub const COMPAT_HWCAP_ISA_C: ::c_ulong = 1 << (b'C' - b'A'); + +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_dup: ::c_long = 23; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_flock: ::c_long = 32; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_renameat: ::c_long = 38; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_mount: ::c_long = 40; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_openat: ::c_long = 56; +pub const SYS_close: ::c_long = 57; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_sync: ::c_long = 81; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_acct: ::c_long = 89; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_personality: ::c_long = 92; +pub const SYS_exit: ::c_long = 93; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_futex: ::c_long = 98; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_kill: ::c_long = 129; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_times: ::c_long = 153; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_uname: ::c_long = 160; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_umask: ::c_long = 166; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_semop: ::c_long = 193; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_socket: ::c_long = 198; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_accept: ::c_long = 202; +pub const SYS_connect: ::c_long = 203; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_brk: ::c_long = 214; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_arch_specific_syscall: ::c_long = 244; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_setns: ::c_long = 268; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_syscalls: ::c_long = 436; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/align.rs new file mode 100644 index 0000000..7ca870f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/mod.rs new file mode 100644 index 0000000..be6b501 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/b64/x86_64/mod.rs @@ -0,0 +1,802 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type greg_t = i64; +pub type __u64 = ::c_ulonglong; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::c_ulong, + pub st_mode: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::c_long, + pub st_blocks: ::c_long, + pub st_atime: ::c_long, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::c_long, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::c_long, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::c_ulong, + pub st_mode: ::c_uint, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::c_long, + pub st_blocks: ::c_long, + pub st_atime: ::c_long, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::c_long, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::c_long, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct _libc_xmmreg { + pub element: [u32; 4], + } + + pub struct user_regs_struct { + pub r15: ::c_ulong, + pub r14: ::c_ulong, + pub r13: ::c_ulong, + pub r12: ::c_ulong, + pub rbp: ::c_ulong, + pub rbx: ::c_ulong, + pub r11: ::c_ulong, + pub r10: ::c_ulong, + pub r9: ::c_ulong, + pub r8: ::c_ulong, + pub rax: ::c_ulong, + pub rcx: ::c_ulong, + pub rdx: ::c_ulong, + pub rsi: ::c_ulong, + pub rdi: ::c_ulong, + pub orig_rax: ::c_ulong, + pub rip: ::c_ulong, + pub cs: ::c_ulong, + pub eflags: ::c_ulong, + pub rsp: ::c_ulong, + pub ss: ::c_ulong, + pub fs_base: ::c_ulong, + pub gs_base: ::c_ulong, + pub ds: ::c_ulong, + pub es: ::c_ulong, + pub fs: ::c_ulong, + pub gs: ::c_ulong, + } + + pub struct user { + pub regs: user_regs_struct, + pub u_fpvalid: ::c_int, + pub i387: user_fpregs_struct, + pub u_tsize: ::c_ulong, + pub u_dsize: ::c_ulong, + pub u_ssize: ::c_ulong, + pub start_code: ::c_ulong, + pub start_stack: ::c_ulong, + pub signal: ::c_long, + __reserved: ::c_int, + #[cfg(target_pointer_width = "32")] + __pad1: u32, + pub u_ar0: *mut user_regs_struct, + #[cfg(target_pointer_width = "32")] + __pad2: u32, + pub u_fpstate: *mut user_fpregs_struct, + pub magic: ::c_ulong, + pub u_comm: [::c_char; 32], + pub u_debugreg: [::c_ulong; 8], + pub error_code: ::c_ulong, + pub fault_address: ::c_ulong, + } + +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + pub union __c_anonymous_uc_sigmask { + uc_sigmask: ::sigset_t, + uc_sigmask64: ::sigset64_t, + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for __c_anonymous_uc_sigmask { + fn eq(&self, other: &__c_anonymous_uc_sigmask) -> bool { + unsafe { self.uc_sigmask == other.uc_sigmask } + } + } + impl Eq for __c_anonymous_uc_sigmask {} + impl ::fmt::Debug for __c_anonymous_uc_sigmask { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uc_sigmask") + .field("uc_sigmask", unsafe { &self.uc_sigmask }) + .finish() + } + } + impl ::hash::Hash for __c_anonymous_uc_sigmask { + fn hash(&self, state: &mut H) { + unsafe { self.uc_sigmask.hash(state) } + } + } + } + } + } +} + +s_no_extra_traits! { + pub struct _libc_fpxreg { + pub significand: [u16; 4], + pub exponent: u16, + __padding: [u16; 3], + } + + pub struct _libc_fpstate { + pub cwd: u16, + pub swd: u16, + pub ftw: u16, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcr_mask: u32, + pub _st: [_libc_fpxreg; 8], + pub _xmm: [_libc_xmmreg; 16], + __private: [u32; 24], + } + + pub struct mcontext_t { + pub gregs: [greg_t; 23], + pub fpregs: *mut _libc_fpstate, + __private: [u64; 8], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask64: __c_anonymous_uc_sigmask, + __fpregs_mem: _libc_fpstate, + } + + pub struct user_fpregs_struct { + pub cwd: ::c_ushort, + pub swd: ::c_ushort, + pub ftw: ::c_ushort, + pub fop: ::c_ushort, + pub rip: ::c_ulong, + pub rdp: ::c_ulong, + pub mxcsr: ::c_uint, + pub mxcr_mask: ::c_uint, + pub st_space: [::c_uint; 32], + pub xmm_space: [::c_uint; 64], + padding: [::c_uint; 24], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for _libc_fpxreg { + fn eq(&self, other: &Self) -> bool { + self.significand == other.significand + && self.exponent == other.exponent + // Ignore padding field + } + } + impl Eq for _libc_fpxreg {} + impl ::fmt::Debug for _libc_fpxreg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("_libc_fpxreg") + .field("significand", &self.significand) + .field("exponent", &self.exponent) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for _libc_fpxreg { + fn hash(&self, state: &mut H) { + self.significand.hash(state); + self.exponent.hash(state); + // Ignore padding field + } + } + + impl PartialEq for _libc_fpstate { + fn eq(&self, other: &Self) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.ftw == other.ftw + && self.fop == other.fop + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mxcr_mask == other.mxcr_mask + && self._st == other._st + && self._xmm == other._xmm + // Ignore padding field + } + } + impl Eq for _libc_fpstate {} + impl ::fmt::Debug for _libc_fpstate { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("_libc_fpstate") + .field("cwd", &self.cwd) + .field("swd", &self.swd) + .field("ftw", &self.ftw) + .field("fop", &self.fop) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mxcr_mask", &self.mxcr_mask) + .field("_st", &self._st) + .field("_xmm", &self._xmm) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for _libc_fpstate { + fn hash(&self, state: &mut H) { + self.cwd.hash(state); + self.swd.hash(state); + self.ftw.hash(state); + self.fop.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mxcr_mask.hash(state); + self._st.hash(state); + self._xmm.hash(state); + // Ignore padding field + } + } + + impl PartialEq for mcontext_t { + fn eq(&self, other: &Self) -> bool { + self.gregs == other.gregs + && self.fpregs == other.fpregs + // Ignore padding field + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("gregs", &self.gregs) + .field("fpregs", &self.fpregs) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for mcontext_t { + fn hash(&self, state: &mut H) { + self.gregs.hash(state); + self.fpregs.hash(state); + // Ignore padding field + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &Self) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask64 == other.uc_sigmask64 + // Ignore padding field + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask64", &self.uc_sigmask64) + // Ignore padding field + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask64.hash(state); + // Ignore padding field + } + } + + impl PartialEq for user_fpregs_struct { + fn eq(&self, other: &user_fpregs_struct) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.ftw == other.ftw + && self.fop == other.fop + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mxcr_mask == other.mxcr_mask + && self.st_space == other.st_space + && self + .xmm_space + .iter() + .zip(other.xmm_space.iter()) + .all(|(a,b)| a == b) + // Ignore padding field + } + } + + impl Eq for user_fpregs_struct {} + + impl ::fmt::Debug for user_fpregs_struct { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("user_fpregs_struct") + .field("cwd", &self.cwd) + .field("swd", &self.swd) + .field("ftw", &self.ftw) + .field("fop", &self.fop) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mxcr_mask", &self.mxcr_mask) + .field("st_space", &self.st_space) + // FIXME: .field("xmm_space", &self.xmm_space) + // Ignore padding field + .finish() + } + } + + impl ::hash::Hash for user_fpregs_struct { + fn hash(&self, state: &mut H) { + self.cwd.hash(state); + self.swd.hash(state); + self.ftw.hash(state); + self.fop.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mxcr_mask.hash(state); + self.st_space.hash(state); + self.xmm_space.hash(state); + // Ignore padding field + } + } + } +} + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_LARGEFILE: ::c_int = 0o0100000; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const MAP_32BIT: ::c_int = 0x40; + +// Syscall table + +pub const SYS_read: ::c_long = 0; +pub const SYS_write: ::c_long = 1; +pub const SYS_open: ::c_long = 2; +pub const SYS_close: ::c_long = 3; +pub const SYS_stat: ::c_long = 4; +pub const SYS_fstat: ::c_long = 5; +pub const SYS_lstat: ::c_long = 6; +pub const SYS_poll: ::c_long = 7; +pub const SYS_lseek: ::c_long = 8; +pub const SYS_mmap: ::c_long = 9; +pub const SYS_mprotect: ::c_long = 10; +pub const SYS_munmap: ::c_long = 11; +pub const SYS_brk: ::c_long = 12; +pub const SYS_rt_sigaction: ::c_long = 13; +pub const SYS_rt_sigprocmask: ::c_long = 14; +pub const SYS_rt_sigreturn: ::c_long = 15; +pub const SYS_ioctl: ::c_long = 16; +pub const SYS_pread64: ::c_long = 17; +pub const SYS_pwrite64: ::c_long = 18; +pub const SYS_readv: ::c_long = 19; +pub const SYS_writev: ::c_long = 20; +pub const SYS_access: ::c_long = 21; +pub const SYS_pipe: ::c_long = 22; +pub const SYS_select: ::c_long = 23; +pub const SYS_sched_yield: ::c_long = 24; +pub const SYS_mremap: ::c_long = 25; +pub const SYS_msync: ::c_long = 26; +pub const SYS_mincore: ::c_long = 27; +pub const SYS_madvise: ::c_long = 28; +pub const SYS_shmget: ::c_long = 29; +pub const SYS_shmat: ::c_long = 30; +pub const SYS_shmctl: ::c_long = 31; +pub const SYS_dup: ::c_long = 32; +pub const SYS_dup2: ::c_long = 33; +pub const SYS_pause: ::c_long = 34; +pub const SYS_nanosleep: ::c_long = 35; +pub const SYS_getitimer: ::c_long = 36; +pub const SYS_alarm: ::c_long = 37; +pub const SYS_setitimer: ::c_long = 38; +pub const SYS_getpid: ::c_long = 39; +pub const SYS_sendfile: ::c_long = 40; +pub const SYS_socket: ::c_long = 41; +pub const SYS_connect: ::c_long = 42; +pub const SYS_accept: ::c_long = 43; +pub const SYS_sendto: ::c_long = 44; +pub const SYS_recvfrom: ::c_long = 45; +pub const SYS_sendmsg: ::c_long = 46; +pub const SYS_recvmsg: ::c_long = 47; +pub const SYS_shutdown: ::c_long = 48; +pub const SYS_bind: ::c_long = 49; +pub const SYS_listen: ::c_long = 50; +pub const SYS_getsockname: ::c_long = 51; +pub const SYS_getpeername: ::c_long = 52; +pub const SYS_socketpair: ::c_long = 53; +pub const SYS_setsockopt: ::c_long = 54; +pub const SYS_getsockopt: ::c_long = 55; +pub const SYS_clone: ::c_long = 56; +pub const SYS_fork: ::c_long = 57; +pub const SYS_vfork: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_exit: ::c_long = 60; +pub const SYS_wait4: ::c_long = 61; +pub const SYS_kill: ::c_long = 62; +pub const SYS_uname: ::c_long = 63; +pub const SYS_semget: ::c_long = 64; +pub const SYS_semop: ::c_long = 65; +pub const SYS_semctl: ::c_long = 66; +pub const SYS_shmdt: ::c_long = 67; +pub const SYS_msgget: ::c_long = 68; +pub const SYS_msgsnd: ::c_long = 69; +pub const SYS_msgrcv: ::c_long = 70; +pub const SYS_msgctl: ::c_long = 71; +pub const SYS_fcntl: ::c_long = 72; +pub const SYS_flock: ::c_long = 73; +pub const SYS_fsync: ::c_long = 74; +pub const SYS_fdatasync: ::c_long = 75; +pub const SYS_truncate: ::c_long = 76; +pub const SYS_ftruncate: ::c_long = 77; +pub const SYS_getdents: ::c_long = 78; +pub const SYS_getcwd: ::c_long = 79; +pub const SYS_chdir: ::c_long = 80; +pub const SYS_fchdir: ::c_long = 81; +pub const SYS_rename: ::c_long = 82; +pub const SYS_mkdir: ::c_long = 83; +pub const SYS_rmdir: ::c_long = 84; +pub const SYS_creat: ::c_long = 85; +pub const SYS_link: ::c_long = 86; +pub const SYS_unlink: ::c_long = 87; +pub const SYS_symlink: ::c_long = 88; +pub const SYS_readlink: ::c_long = 89; +pub const SYS_chmod: ::c_long = 90; +pub const SYS_fchmod: ::c_long = 91; +pub const SYS_chown: ::c_long = 92; +pub const SYS_fchown: ::c_long = 93; +pub const SYS_lchown: ::c_long = 94; +pub const SYS_umask: ::c_long = 95; +pub const SYS_gettimeofday: ::c_long = 96; +pub const SYS_getrlimit: ::c_long = 97; +pub const SYS_getrusage: ::c_long = 98; +pub const SYS_sysinfo: ::c_long = 99; +pub const SYS_times: ::c_long = 100; +pub const SYS_ptrace: ::c_long = 101; +pub const SYS_getuid: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_getgid: ::c_long = 104; +pub const SYS_setuid: ::c_long = 105; +pub const SYS_setgid: ::c_long = 106; +pub const SYS_geteuid: ::c_long = 107; +pub const SYS_getegid: ::c_long = 108; +pub const SYS_setpgid: ::c_long = 109; +pub const SYS_getppid: ::c_long = 110; +pub const SYS_getpgrp: ::c_long = 111; +pub const SYS_setsid: ::c_long = 112; +pub const SYS_setreuid: ::c_long = 113; +pub const SYS_setregid: ::c_long = 114; +pub const SYS_getgroups: ::c_long = 115; +pub const SYS_setgroups: ::c_long = 116; +pub const SYS_setresuid: ::c_long = 117; +pub const SYS_getresuid: ::c_long = 118; +pub const SYS_setresgid: ::c_long = 119; +pub const SYS_getresgid: ::c_long = 120; +pub const SYS_getpgid: ::c_long = 121; +pub const SYS_setfsuid: ::c_long = 122; +pub const SYS_setfsgid: ::c_long = 123; +pub const SYS_getsid: ::c_long = 124; +pub const SYS_capget: ::c_long = 125; +pub const SYS_capset: ::c_long = 126; +pub const SYS_rt_sigpending: ::c_long = 127; +pub const SYS_rt_sigtimedwait: ::c_long = 128; +pub const SYS_rt_sigqueueinfo: ::c_long = 129; +pub const SYS_rt_sigsuspend: ::c_long = 130; +pub const SYS_sigaltstack: ::c_long = 131; +pub const SYS_utime: ::c_long = 132; +pub const SYS_mknod: ::c_long = 133; +pub const SYS_uselib: ::c_long = 134; +pub const SYS_personality: ::c_long = 135; +pub const SYS_ustat: ::c_long = 136; +pub const SYS_statfs: ::c_long = 137; +pub const SYS_fstatfs: ::c_long = 138; +pub const SYS_sysfs: ::c_long = 139; +pub const SYS_getpriority: ::c_long = 140; +pub const SYS_setpriority: ::c_long = 141; +pub const SYS_sched_setparam: ::c_long = 142; +pub const SYS_sched_getparam: ::c_long = 143; +pub const SYS_sched_setscheduler: ::c_long = 144; +pub const SYS_sched_getscheduler: ::c_long = 145; +pub const SYS_sched_get_priority_max: ::c_long = 146; +pub const SYS_sched_get_priority_min: ::c_long = 147; +pub const SYS_sched_rr_get_interval: ::c_long = 148; +pub const SYS_mlock: ::c_long = 149; +pub const SYS_munlock: ::c_long = 150; +pub const SYS_mlockall: ::c_long = 151; +pub const SYS_munlockall: ::c_long = 152; +pub const SYS_vhangup: ::c_long = 153; +pub const SYS_modify_ldt: ::c_long = 154; +pub const SYS_pivot_root: ::c_long = 155; +// FIXME: SYS__sysctl is in the NDK sources but for some reason is +// not available in the tests +// pub const SYS__sysctl: ::c_long = 156; +pub const SYS_prctl: ::c_long = 157; +pub const SYS_arch_prctl: ::c_long = 158; +pub const SYS_adjtimex: ::c_long = 159; +pub const SYS_setrlimit: ::c_long = 160; +pub const SYS_chroot: ::c_long = 161; +pub const SYS_sync: ::c_long = 162; +pub const SYS_acct: ::c_long = 163; +pub const SYS_settimeofday: ::c_long = 164; +pub const SYS_mount: ::c_long = 165; +pub const SYS_umount2: ::c_long = 166; +pub const SYS_swapon: ::c_long = 167; +pub const SYS_swapoff: ::c_long = 168; +pub const SYS_reboot: ::c_long = 169; +pub const SYS_sethostname: ::c_long = 170; +pub const SYS_setdomainname: ::c_long = 171; +pub const SYS_iopl: ::c_long = 172; +pub const SYS_ioperm: ::c_long = 173; +pub const SYS_create_module: ::c_long = 174; +pub const SYS_init_module: ::c_long = 175; +pub const SYS_delete_module: ::c_long = 176; +pub const SYS_get_kernel_syms: ::c_long = 177; +pub const SYS_query_module: ::c_long = 178; +pub const SYS_quotactl: ::c_long = 179; +pub const SYS_nfsservctl: ::c_long = 180; +pub const SYS_getpmsg: ::c_long = 181; +pub const SYS_putpmsg: ::c_long = 182; +pub const SYS_afs_syscall: ::c_long = 183; +pub const SYS_tuxcall: ::c_long = 184; +pub const SYS_security: ::c_long = 185; +pub const SYS_gettid: ::c_long = 186; +pub const SYS_readahead: ::c_long = 187; +pub const SYS_setxattr: ::c_long = 188; +pub const SYS_lsetxattr: ::c_long = 189; +pub const SYS_fsetxattr: ::c_long = 190; +pub const SYS_getxattr: ::c_long = 191; +pub const SYS_lgetxattr: ::c_long = 192; +pub const SYS_fgetxattr: ::c_long = 193; +pub const SYS_listxattr: ::c_long = 194; +pub const SYS_llistxattr: ::c_long = 195; +pub const SYS_flistxattr: ::c_long = 196; +pub const SYS_removexattr: ::c_long = 197; +pub const SYS_lremovexattr: ::c_long = 198; +pub const SYS_fremovexattr: ::c_long = 199; +pub const SYS_tkill: ::c_long = 200; +pub const SYS_time: ::c_long = 201; +pub const SYS_futex: ::c_long = 202; +pub const SYS_sched_setaffinity: ::c_long = 203; +pub const SYS_sched_getaffinity: ::c_long = 204; +pub const SYS_set_thread_area: ::c_long = 205; +pub const SYS_io_setup: ::c_long = 206; +pub const SYS_io_destroy: ::c_long = 207; +pub const SYS_io_getevents: ::c_long = 208; +pub const SYS_io_submit: ::c_long = 209; +pub const SYS_io_cancel: ::c_long = 210; +pub const SYS_get_thread_area: ::c_long = 211; +pub const SYS_lookup_dcookie: ::c_long = 212; +pub const SYS_epoll_create: ::c_long = 213; +pub const SYS_epoll_ctl_old: ::c_long = 214; +pub const SYS_epoll_wait_old: ::c_long = 215; +pub const SYS_remap_file_pages: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_set_tid_address: ::c_long = 218; +pub const SYS_restart_syscall: ::c_long = 219; +pub const SYS_semtimedop: ::c_long = 220; +pub const SYS_fadvise64: ::c_long = 221; +pub const SYS_timer_create: ::c_long = 222; +pub const SYS_timer_settime: ::c_long = 223; +pub const SYS_timer_gettime: ::c_long = 224; +pub const SYS_timer_getoverrun: ::c_long = 225; +pub const SYS_timer_delete: ::c_long = 226; +pub const SYS_clock_settime: ::c_long = 227; +pub const SYS_clock_gettime: ::c_long = 228; +pub const SYS_clock_getres: ::c_long = 229; +pub const SYS_clock_nanosleep: ::c_long = 230; +pub const SYS_exit_group: ::c_long = 231; +pub const SYS_epoll_wait: ::c_long = 232; +pub const SYS_epoll_ctl: ::c_long = 233; +pub const SYS_tgkill: ::c_long = 234; +pub const SYS_utimes: ::c_long = 235; +pub const SYS_vserver: ::c_long = 236; +pub const SYS_mbind: ::c_long = 237; +pub const SYS_set_mempolicy: ::c_long = 238; +pub const SYS_get_mempolicy: ::c_long = 239; +pub const SYS_mq_open: ::c_long = 240; +pub const SYS_mq_unlink: ::c_long = 241; +pub const SYS_mq_timedsend: ::c_long = 242; +pub const SYS_mq_timedreceive: ::c_long = 243; +pub const SYS_mq_notify: ::c_long = 244; +pub const SYS_mq_getsetattr: ::c_long = 245; +pub const SYS_kexec_load: ::c_long = 246; +pub const SYS_waitid: ::c_long = 247; +pub const SYS_add_key: ::c_long = 248; +pub const SYS_request_key: ::c_long = 249; +pub const SYS_keyctl: ::c_long = 250; +pub const SYS_ioprio_set: ::c_long = 251; +pub const SYS_ioprio_get: ::c_long = 252; +pub const SYS_inotify_init: ::c_long = 253; +pub const SYS_inotify_add_watch: ::c_long = 254; +pub const SYS_inotify_rm_watch: ::c_long = 255; +pub const SYS_migrate_pages: ::c_long = 256; +pub const SYS_openat: ::c_long = 257; +pub const SYS_mkdirat: ::c_long = 258; +pub const SYS_mknodat: ::c_long = 259; +pub const SYS_fchownat: ::c_long = 260; +pub const SYS_futimesat: ::c_long = 261; +pub const SYS_newfstatat: ::c_long = 262; +pub const SYS_unlinkat: ::c_long = 263; +pub const SYS_renameat: ::c_long = 264; +pub const SYS_linkat: ::c_long = 265; +pub const SYS_symlinkat: ::c_long = 266; +pub const SYS_readlinkat: ::c_long = 267; +pub const SYS_fchmodat: ::c_long = 268; +pub const SYS_faccessat: ::c_long = 269; +pub const SYS_pselect6: ::c_long = 270; +pub const SYS_ppoll: ::c_long = 271; +pub const SYS_unshare: ::c_long = 272; +pub const SYS_set_robust_list: ::c_long = 273; +pub const SYS_get_robust_list: ::c_long = 274; +pub const SYS_splice: ::c_long = 275; +pub const SYS_tee: ::c_long = 276; +pub const SYS_sync_file_range: ::c_long = 277; +pub const SYS_vmsplice: ::c_long = 278; +pub const SYS_move_pages: ::c_long = 279; +pub const SYS_utimensat: ::c_long = 280; +pub const SYS_epoll_pwait: ::c_long = 281; +pub const SYS_signalfd: ::c_long = 282; +pub const SYS_timerfd_create: ::c_long = 283; +pub const SYS_eventfd: ::c_long = 284; +pub const SYS_fallocate: ::c_long = 285; +pub const SYS_timerfd_settime: ::c_long = 286; +pub const SYS_timerfd_gettime: ::c_long = 287; +pub const SYS_accept4: ::c_long = 288; +pub const SYS_signalfd4: ::c_long = 289; +pub const SYS_eventfd2: ::c_long = 290; +pub const SYS_epoll_create1: ::c_long = 291; +pub const SYS_dup3: ::c_long = 292; +pub const SYS_pipe2: ::c_long = 293; +pub const SYS_inotify_init1: ::c_long = 294; +pub const SYS_preadv: ::c_long = 295; +pub const SYS_pwritev: ::c_long = 296; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 297; +pub const SYS_perf_event_open: ::c_long = 298; +pub const SYS_recvmmsg: ::c_long = 299; +pub const SYS_fanotify_init: ::c_long = 300; +pub const SYS_fanotify_mark: ::c_long = 301; +pub const SYS_prlimit64: ::c_long = 302; +pub const SYS_name_to_handle_at: ::c_long = 303; +pub const SYS_open_by_handle_at: ::c_long = 304; +pub const SYS_clock_adjtime: ::c_long = 305; +pub const SYS_syncfs: ::c_long = 306; +pub const SYS_sendmmsg: ::c_long = 307; +pub const SYS_setns: ::c_long = 308; +pub const SYS_getcpu: ::c_long = 309; +pub const SYS_process_vm_readv: ::c_long = 310; +pub const SYS_process_vm_writev: ::c_long = 311; +pub const SYS_kcmp: ::c_long = 312; +pub const SYS_finit_module: ::c_long = 313; +pub const SYS_sched_setattr: ::c_long = 314; +pub const SYS_sched_getattr: ::c_long = 315; +pub const SYS_renameat2: ::c_long = 316; +pub const SYS_seccomp: ::c_long = 317; +pub const SYS_getrandom: ::c_long = 318; +pub const SYS_memfd_create: ::c_long = 319; +pub const SYS_kexec_file_load: ::c_long = 320; +pub const SYS_bpf: ::c_long = 321; +pub const SYS_execveat: ::c_long = 322; +pub const SYS_userfaultfd: ::c_long = 323; +pub const SYS_membarrier: ::c_long = 324; +pub const SYS_mlock2: ::c_long = 325; +pub const SYS_copy_file_range: ::c_long = 326; +pub const SYS_preadv2: ::c_long = 327; +pub const SYS_pwritev2: ::c_long = 328; +pub const SYS_pkey_mprotect: ::c_long = 329; +pub const SYS_pkey_alloc: ::c_long = 330; +pub const SYS_pkey_free: ::c_long = 331; +pub const SYS_statx: ::c_long = 332; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; + +// offsets in user_regs_structs, from sys/reg.h +pub const R15: ::c_int = 0; +pub const R14: ::c_int = 1; +pub const R13: ::c_int = 2; +pub const R12: ::c_int = 3; +pub const RBP: ::c_int = 4; +pub const RBX: ::c_int = 5; +pub const R11: ::c_int = 6; +pub const R10: ::c_int = 7; +pub const R9: ::c_int = 8; +pub const R8: ::c_int = 9; +pub const RAX: ::c_int = 10; +pub const RCX: ::c_int = 11; +pub const RDX: ::c_int = 12; +pub const RSI: ::c_int = 13; +pub const RDI: ::c_int = 14; +pub const ORIG_RAX: ::c_int = 15; +pub const RIP: ::c_int = 16; +pub const CS: ::c_int = 17; +pub const EFLAGS: ::c_int = 18; +pub const RSP: ::c_int = 19; +pub const SS: ::c_int = 20; +pub const FS_BASE: ::c_int = 21; +pub const GS_BASE: ::c_int = 22; +pub const DS: ::c_int = 23; +pub const ES: ::c_int = 24; +pub const FS: ::c_int = 25; +pub const GS: ::c_int = 26; + +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_R8: ::c_int = 0; +pub const REG_R9: ::c_int = 1; +pub const REG_R10: ::c_int = 2; +pub const REG_R11: ::c_int = 3; +pub const REG_R12: ::c_int = 4; +pub const REG_R13: ::c_int = 5; +pub const REG_R14: ::c_int = 6; +pub const REG_R15: ::c_int = 7; +pub const REG_RDI: ::c_int = 8; +pub const REG_RSI: ::c_int = 9; +pub const REG_RBP: ::c_int = 10; +pub const REG_RBX: ::c_int = 11; +pub const REG_RDX: ::c_int = 12; +pub const REG_RAX: ::c_int = 13; +pub const REG_RCX: ::c_int = 14; +pub const REG_RSP: ::c_int = 15; +pub const REG_RIP: ::c_int = 16; +pub const REG_EFL: ::c_int = 17; +pub const REG_CSGSFS: ::c_int = 18; +pub const REG_ERR: ::c_int = 19; +pub const REG_TRAPNO: ::c_int = 20; +pub const REG_OLDMASK: ::c_int = 21; +pub const REG_CR2: ::c_int = 22; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/mod.rs new file mode 100644 index 0000000..c65e737 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/android/mod.rs @@ -0,0 +1,3699 @@ +//! Android-specific definitions for linux-like values + +pub type clock_t = ::c_long; +pub type time_t = ::c_long; +pub type suseconds_t = ::c_long; +pub type off_t = ::c_long; +pub type blkcnt_t = ::c_ulong; +pub type blksize_t = ::c_ulong; +pub type nlink_t = u32; +pub type useconds_t = u32; +pub type pthread_t = ::c_long; +pub type pthread_mutexattr_t = ::c_long; +pub type pthread_rwlockattr_t = ::c_long; +pub type pthread_barrierattr_t = ::c_int; +pub type pthread_condattr_t = ::c_long; +pub type pthread_key_t = ::c_int; +pub type fsfilcnt_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulong; +pub type nfds_t = ::c_uint; +pub type rlim_t = ::c_ulong; +pub type dev_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type ino64_t = u64; +pub type __CPU_BITTYPE = ::c_ulong; +pub type idtype_t = ::c_int; +pub type loff_t = ::c_longlong; +pub type __kernel_loff_t = ::c_longlong; +pub type __kernel_pid_t = ::c_int; + +pub type __u8 = ::c_uchar; +pub type __u16 = ::c_ushort; +pub type __s16 = ::c_short; +pub type __u32 = ::c_uint; +pub type __s32 = ::c_int; + +// linux/elf.h + +pub type Elf32_Addr = u32; +pub type Elf32_Half = u16; +pub type Elf32_Off = u32; +pub type Elf32_Word = u32; + +pub type Elf64_Addr = u64; +pub type Elf64_Half = u16; +pub type Elf64_Off = u64; +pub type Elf64_Word = u32; +pub type Elf64_Xword = u64; + +s! { + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct __fsid_t { + __val: [::c_int; 2], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 19], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct mallinfo { + pub arena: ::size_t, + pub ordblks: ::size_t, + pub smblks: ::size_t, + pub hblks: ::size_t, + pub hblkhd: ::size_t, + pub usmblks: ::size_t, + pub fsmblks: ::size_t, + pub uordblks: ::size_t, + pub fordblks: ::size_t, + pub keepcost: ::size_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::__kernel_loff_t, + pub l_len: ::__kernel_loff_t, + pub l_pid: ::__kernel_pid_t, + } + + pub struct cpu_set_t { + #[cfg(target_pointer_width = "64")] + __bits: [__CPU_BITTYPE; 16], + #[cfg(target_pointer_width = "32")] + __bits: [__CPU_BITTYPE; 1], + } + + pub struct sem_t { + count: ::c_uint, + #[cfg(target_pointer_width = "64")] + __reserved: [::c_int; 3], + } + + pub struct exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + #[cfg(target_pointer_width = "64")] + __f_reserved: [u32; 6], + } + + pub struct signalfd_siginfo { + pub ssi_signo: u32, + pub ssi_errno: i32, + pub ssi_code: i32, + pub ssi_pid: u32, + pub ssi_uid: u32, + pub ssi_fd: i32, + pub ssi_tid: u32, + pub ssi_band: u32, + pub ssi_overrun: u32, + pub ssi_trapno: u32, + pub ssi_status: i32, + pub ssi_int: i32, + pub ssi_ptr: ::c_ulonglong, + pub ssi_utime: ::c_ulonglong, + pub ssi_stime: ::c_ulonglong, + pub ssi_addr: ::c_ulonglong, + pub ssi_addr_lsb: u16, + _pad2: u16, + pub ssi_syscall: i32, + pub ssi_call_addr: u64, + pub ssi_arch: u32, + _pad: [u8; 28], + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct genlmsghdr { + pub cmd: u8, + pub version: u8, + pub reserved: u16, + } + + pub struct nlmsghdr { + pub nlmsg_len: u32, + pub nlmsg_type: u16, + pub nlmsg_flags: u16, + pub nlmsg_seq: u32, + pub nlmsg_pid: u32, + } + + pub struct nlmsgerr { + pub error: ::c_int, + pub msg: nlmsghdr, + } + + pub struct nl_pktinfo { + pub group: u32, + } + + pub struct nl_mmap_req { + pub nm_block_size: ::c_uint, + pub nm_block_nr: ::c_uint, + pub nm_frame_size: ::c_uint, + pub nm_frame_nr: ::c_uint, + } + + pub struct nl_mmap_hdr { + pub nm_status: ::c_uint, + pub nm_len: ::c_uint, + pub nm_group: u32, + pub nm_pid: u32, + pub nm_uid: u32, + pub nm_gid: u32, + } + + pub struct nlattr { + pub nla_len: u16, + pub nla_type: u16, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_int, + } + + pub struct inotify_event { + pub wd: ::c_int, + pub mask: u32, + pub cookie: u32, + pub len: u32 + } + + pub struct sock_extended_err { + pub ee_errno: u32, + pub ee_origin: u8, + pub ee_type: u8, + pub ee_code: u8, + pub ee_pad: u8, + pub ee_info: u32, + pub ee_data: u32, + } + + pub struct regex_t { + re_magic: ::c_int, + re_nsub: ::size_t, + re_endp: *const ::c_char, + re_guts: *mut ::c_void, + } + + pub struct regmatch_t { + pub rm_so: ::ssize_t, + pub rm_eo: ::ssize_t, + } + + pub struct sockaddr_vm { + pub svm_family: ::sa_family_t, + pub svm_reserved1: ::c_ushort, + pub svm_port: ::c_uint, + pub svm_cid: ::c_uint, + pub svm_zero: [u8; 4] + } + + // linux/elf.h + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + // link.h + + pub struct dl_phdr_info { + #[cfg(target_pointer_width = "64")] + pub dlpi_addr: Elf64_Addr, + #[cfg(target_pointer_width = "32")] + pub dlpi_addr: Elf32_Addr, + + pub dlpi_name: *const ::c_char, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phdr: *const Elf64_Phdr, + #[cfg(target_pointer_width = "32")] + pub dlpi_phdr: *const Elf32_Phdr, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phnum: Elf64_Half, + #[cfg(target_pointer_width = "32")] + pub dlpi_phnum: Elf32_Half, + + // These fields were added in Android R + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + pub dlpi_tls_modid: ::size_t, + pub dlpi_tls_data: *mut ::c_void, + } + + // linux/filter.h + pub struct sock_filter { + pub code: ::__u16, + pub jt: ::__u8, + pub jf: ::__u8, + pub k: ::__u32, + } + + pub struct sock_fprog { + pub len: ::c_ushort, + pub filter: *mut sock_filter, + } + + // linux/seccomp.h + pub struct seccomp_data { + pub nr: ::c_int, + pub arch: ::__u32, + pub instruction_pointer: ::__u64, + pub args: [::__u64; 6], + } + + pub struct ptrace_peeksiginfo_args { + pub off: ::__u64, + pub flags: ::__u32, + pub nr: ::__s32, + } + + // linux/input.h + pub struct input_event { + pub time: ::timeval, + pub type_: ::__u16, + pub code: ::__u16, + pub value: ::__s32, + } + + pub struct input_id { + pub bustype: ::__u16, + pub vendor: ::__u16, + pub product: ::__u16, + pub version: ::__u16, + } + + pub struct input_absinfo { + pub value: ::__s32, + pub minimum: ::__s32, + pub maximum: ::__s32, + pub fuzz: ::__s32, + pub flat: ::__s32, + pub resolution: ::__s32, + } + + pub struct input_keymap_entry { + pub flags: ::__u8, + pub len: ::__u8, + pub index: ::__u16, + pub keycode: ::__u32, + pub scancode: [::__u8; 32], + } + + pub struct input_mask { + pub type_: ::__u32, + pub codes_size: ::__u32, + pub codes_ptr: ::__u64, + } + + pub struct ff_replay { + pub length: ::__u16, + pub delay: ::__u16, + } + + pub struct ff_trigger { + pub button: ::__u16, + pub interval: ::__u16, + } + + pub struct ff_envelope { + pub attack_length: ::__u16, + pub attack_level: ::__u16, + pub fade_length: ::__u16, + pub fade_level: ::__u16, + } + + pub struct ff_constant_effect { + pub level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_ramp_effect { + pub start_level: ::__s16, + pub end_level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_condition_effect { + pub right_saturation: ::__u16, + pub left_saturation: ::__u16, + + pub right_coeff: ::__s16, + pub left_coeff: ::__s16, + + pub deadband: ::__u16, + pub center: ::__s16, + } + + pub struct ff_periodic_effect { + pub waveform: ::__u16, + pub period: ::__u16, + pub magnitude: ::__s16, + pub offset: ::__s16, + pub phase: ::__u16, + + pub envelope: ff_envelope, + + pub custom_len: ::__u32, + pub custom_data: *mut ::__s16, + } + + pub struct ff_rumble_effect { + pub strong_magnitude: ::__u16, + pub weak_magnitude: ::__u16, + } + + pub struct ff_effect { + pub type_: ::__u16, + pub id: ::__s16, + pub direction: ::__u16, + pub trigger: ff_trigger, + pub replay: ff_replay, + // FIXME this is actually a union + #[cfg(target_pointer_width = "64")] + pub u: [u64; 4], + #[cfg(target_pointer_width = "32")] + pub u: [u32; 7], + } + + // linux/uinput.h + pub struct uinput_ff_upload { + pub request_id: ::__u32, + pub retval: ::__s32, + pub effect: ff_effect, + pub old: ff_effect, + } + + pub struct uinput_ff_erase { + pub request_id: ::__u32, + pub retval: ::__s32, + pub effect_id: ::__u32, + } + + pub struct uinput_abs_setup { + pub code: ::__u16, + pub absinfo: input_absinfo, + } + + pub struct option { + pub name: *const ::c_char, + pub has_arg: ::c_int, + pub flag: *mut ::c_int, + pub val: ::c_int, + } +} + +s_no_extra_traits! { + pub struct sockaddr_nl { + pub nl_family: ::sa_family_t, + nl_pad: ::c_ushort, + pub nl_pid: u32, + pub nl_groups: u32 + } + + pub struct dirent { + pub d_ino: u64, + pub d_off: i64, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct dirent64 { + pub d_ino: u64, + pub d_off: i64, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct lastlog { + ll_time: ::time_t, + ll_line: [::c_char; UT_LINESIZE], + ll_host: [::c_char; UT_HOSTSIZE], + } + + pub struct utmp { + pub ut_type: ::c_short, + pub ut_pid: ::pid_t, + pub ut_line: [::c_char; UT_LINESIZE], + pub ut_id: [::c_char; 4], + pub ut_user: [::c_char; UT_NAMESIZE], + pub ut_host: [::c_char; UT_HOSTSIZE], + pub ut_exit: exit_status, + pub ut_session: ::c_long, + pub ut_tv: ::timeval, + pub ut_addr_v6: [i32; 4], + unused: [::c_char; 20], + } + + pub struct sockaddr_alg { + pub salg_family: ::sa_family_t, + pub salg_type: [::c_uchar; 14], + pub salg_feat: u32, + pub salg_mask: u32, + pub salg_name: [::c_uchar; 64], + } + + pub struct uinput_setup { + pub id: input_id, + pub name: [::c_char; UINPUT_MAX_NAME_SIZE], + pub ff_effects_max: ::__u32, + } + + pub struct uinput_user_dev { + pub name: [::c_char; UINPUT_MAX_NAME_SIZE], + pub id: input_id, + pub ff_effects_max: ::__u32, + pub absmax: [::__s32; ABS_CNT], + pub absmin: [::__s32; ABS_CNT], + pub absfuzz: [::__s32; ABS_CNT], + pub absflat: [::__s32; ABS_CNT], + } + + /// WARNING: The `PartialEq`, `Eq` and `Hash` implementations of this + /// type are unsound and will be removed in the future. + #[deprecated( + note = "this struct has unsafe trait implementations that will be \ + removed in the future", + since = "0.2.80" + )] + pub struct af_alg_iv { + pub ivlen: u32, + pub iv: [::c_uchar; 0], + } + + pub struct prop_info { + __name: [::c_char; 32], + __serial: ::c_uint, + __value: [[::c_char; 4]; 23], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sockaddr_nl { + fn eq(&self, other: &sockaddr_nl) -> bool { + self.nl_family == other.nl_family && + self.nl_pid == other.nl_pid && + self.nl_groups == other.nl_groups + } + } + impl Eq for sockaddr_nl {} + impl ::fmt::Debug for sockaddr_nl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_nl") + .field("nl_family", &self.nl_family) + .field("nl_pid", &self.nl_pid) + .field("nl_groups", &self.nl_groups) + .finish() + } + } + impl ::hash::Hash for sockaddr_nl { + fn hash(&self, state: &mut H) { + self.nl_family.hash(state); + self.nl_pid.hash(state); + self.nl_groups.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for dirent64 { + fn eq(&self, other: &dirent64) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent64 {} + + impl ::fmt::Debug for dirent64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent64 { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for siginfo_t { + fn eq(&self, other: &siginfo_t) -> bool { + self.si_signo == other.si_signo + && self.si_errno == other.si_errno + && self.si_code == other.si_code + // Ignore _pad + // Ignore _align + } + } + + impl Eq for siginfo_t {} + + impl ::fmt::Debug for siginfo_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("siginfo_t") + .field("si_signo", &self.si_signo) + .field("si_errno", &self.si_errno) + .field("si_code", &self.si_code) + // Ignore _pad + // Ignore _align + .finish() + } + } + + impl ::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + // Ignore _pad + // Ignore _align + } + } + + impl PartialEq for lastlog { + fn eq(&self, other: &lastlog) -> bool { + self.ll_time == other.ll_time + && self + .ll_line + .iter() + .zip(other.ll_line.iter()) + .all(|(a,b)| a == b) + && self + .ll_host + .iter() + .zip(other.ll_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for lastlog {} + + impl ::fmt::Debug for lastlog { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("lastlog") + .field("ll_time", &self.ll_time) + .field("ll_line", &self.ll_line) + // FIXME: .field("ll_host", &self.ll_host) + .finish() + } + } + + impl ::hash::Hash for lastlog { + fn hash(&self, state: &mut H) { + self.ll_time.hash(state); + self.ll_line.hash(state); + self.ll_host.hash(state); + } + } + + impl PartialEq for utmp { + fn eq(&self, other: &utmp) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self + .ut_line + .iter() + .zip(other.ut_line.iter()) + .all(|(a,b)| a == b) + && self.ut_id == other.ut_id + && self + .ut_user + .iter() + .zip(other.ut_user.iter()) + .all(|(a,b)| a == b) + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_addr_v6 == other.ut_addr_v6 + && self.unused == other.unused + } + } + + impl Eq for utmp {} + + impl ::fmt::Debug for utmp { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmp") + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) + .field("ut_line", &self.ut_line) + .field("ut_id", &self.ut_id) + .field("ut_user", &self.ut_user) + // FIXME: .field("ut_host", &self.ut_host) + .field("ut_exit", &self.ut_exit) + .field("ut_session", &self.ut_session) + .field("ut_tv", &self.ut_tv) + .field("ut_addr_v6", &self.ut_addr_v6) + .field("unused", &self.unused) + .finish() + } + } + + impl ::hash::Hash for utmp { + fn hash(&self, state: &mut H) { + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_user.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_addr_v6.hash(state); + self.unused.hash(state); + } + } + + impl PartialEq for sockaddr_alg { + fn eq(&self, other: &sockaddr_alg) -> bool { + self.salg_family == other.salg_family + && self + .salg_type + .iter() + .zip(other.salg_type.iter()) + .all(|(a, b)| a == b) + && self.salg_feat == other.salg_feat + && self.salg_mask == other.salg_mask + && self + .salg_name + .iter() + .zip(other.salg_name.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for sockaddr_alg {} + + impl ::fmt::Debug for sockaddr_alg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_alg") + .field("salg_family", &self.salg_family) + .field("salg_type", &self.salg_type) + .field("salg_feat", &self.salg_feat) + .field("salg_mask", &self.salg_mask) + .field("salg_name", &&self.salg_name[..]) + .finish() + } + } + + impl ::hash::Hash for sockaddr_alg { + fn hash(&self, state: &mut H) { + self.salg_family.hash(state); + self.salg_type.hash(state); + self.salg_feat.hash(state); + self.salg_mask.hash(state); + self.salg_name.hash(state); + } + } + + impl PartialEq for uinput_setup { + fn eq(&self, other: &uinput_setup) -> bool { + self.id == other.id + && self.name[..] == other.name[..] + && self.ff_effects_max == other.ff_effects_max + } + } + impl Eq for uinput_setup {} + + impl ::fmt::Debug for uinput_setup { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("id", &self.id) + .field("name", &&self.name[..]) + .field("ff_effects_max", &self.ff_effects_max) + .finish() + } + } + + impl ::hash::Hash for uinput_setup { + fn hash(&self, state: &mut H) { + self.id.hash(state); + self.name.hash(state); + self.ff_effects_max.hash(state); + } + } + + impl PartialEq for uinput_user_dev { + fn eq(&self, other: &uinput_user_dev) -> bool { + self.name[..] == other.name[..] + && self.id == other.id + && self.ff_effects_max == other.ff_effects_max + && self.absmax[..] == other.absmax[..] + && self.absmin[..] == other.absmin[..] + && self.absfuzz[..] == other.absfuzz[..] + && self.absflat[..] == other.absflat[..] + } + } + impl Eq for uinput_user_dev {} + + impl ::fmt::Debug for uinput_user_dev { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("name", &&self.name[..]) + .field("id", &self.id) + .field("ff_effects_max", &self.ff_effects_max) + .field("absmax", &&self.absmax[..]) + .field("absmin", &&self.absmin[..]) + .field("absfuzz", &&self.absfuzz[..]) + .field("absflat", &&self.absflat[..]) + .finish() + } + } + + impl ::hash::Hash for uinput_user_dev { + fn hash(&self, state: &mut H) { + self.name.hash(state); + self.id.hash(state); + self.ff_effects_max.hash(state); + self.absmax.hash(state); + self.absmin.hash(state); + self.absfuzz.hash(state); + self.absflat.hash(state); + } + } + + #[allow(deprecated)] + impl af_alg_iv { + fn as_slice(&self) -> &[u8] { + unsafe { + ::core::slice::from_raw_parts( + self.iv.as_ptr(), + self.ivlen as usize + ) + } + } + } + + #[allow(deprecated)] + impl PartialEq for af_alg_iv { + fn eq(&self, other: &af_alg_iv) -> bool { + *self.as_slice() == *other.as_slice() + } + } + + #[allow(deprecated)] + impl Eq for af_alg_iv {} + + #[allow(deprecated)] + impl ::fmt::Debug for af_alg_iv { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("af_alg_iv") + .field("ivlen", &self.ivlen) + .finish() + } + } + + #[allow(deprecated)] + impl ::hash::Hash for af_alg_iv { + fn hash(&self, state: &mut H) { + self.as_slice().hash(state); + } + } + + impl PartialEq for prop_info { + fn eq(&self, other: &prop_info) -> bool { + self.__name == other.__name && + self.__serial == other.__serial && + self.__value == other.__value + } + } + impl Eq for prop_info {} + impl ::fmt::Debug for prop_info { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("prop_info") + .field("__name", &self.__name) + .field("__serial", &self.__serial) + .field("__value", &self.__value) + .finish() + } + } + } +} + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MS_NOUSER: ::c_ulong = 0xffffffff80000000; +pub const MS_RMT_MASK: ::c_ulong = 0x02800051; + +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 0x80000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_NOATIME: ::c_int = 0o1000000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +// sys/eventfd.h +pub const EFD_SEMAPHORE: ::c_int = 0x1; +pub const EFD_CLOEXEC: ::c_int = O_CLOEXEC; +pub const EFD_NONBLOCK: ::c_int = O_NONBLOCK; + +// sys/timerfd.h +pub const TFD_CLOEXEC: ::c_int = O_CLOEXEC; +pub const TFD_NONBLOCK: ::c_int = O_NONBLOCK; +pub const TFD_TIMER_ABSTIME: ::c_int = 1; +pub const TFD_TIMER_CANCEL_ON_SET: ::c_int = 2; + +pub const USER_PROCESS: ::c_short = 7; + +pub const _POSIX_VDISABLE: ::cc_t = 0; + +// linux/falloc.h +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; +pub const FALLOC_FL_NO_HIDE_STALE: ::c_int = 0x04; +pub const FALLOC_FL_COLLAPSE_RANGE: ::c_int = 0x08; +pub const FALLOC_FL_ZERO_RANGE: ::c_int = 0x10; +pub const FALLOC_FL_INSERT_RANGE: ::c_int = 0x20; +pub const FALLOC_FL_UNSHARE_RANGE: ::c_int = 0x40; + +pub const BUFSIZ: ::c_uint = 1024; +pub const FILENAME_MAX: ::c_uint = 4096; +pub const FOPEN_MAX: ::c_uint = 20; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const L_tmpnam: ::c_uint = 4096; +pub const TMP_MAX: ::c_uint = 308915776; +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_2_SYMLINKS: ::c_int = 7; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 8; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 9; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 10; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 11; +pub const _PC_REC_XFER_ALIGN: ::c_int = 12; +pub const _PC_SYMLINK_MAX: ::c_int = 13; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 14; +pub const _PC_NO_TRUNC: ::c_int = 15; +pub const _PC_VDISABLE: ::c_int = 16; +pub const _PC_ASYNC_IO: ::c_int = 17; +pub const _PC_PRIO_IO: ::c_int = 18; +pub const _PC_SYNC_IO: ::c_int = 19; + +pub const FIONBIO: ::c_int = 0x5421; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_BC_BASE_MAX: ::c_int = 1; +pub const _SC_BC_DIM_MAX: ::c_int = 2; +pub const _SC_BC_SCALE_MAX: ::c_int = 3; +pub const _SC_BC_STRING_MAX: ::c_int = 4; +pub const _SC_CHILD_MAX: ::c_int = 5; +pub const _SC_CLK_TCK: ::c_int = 6; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 7; +pub const _SC_EXPR_NEST_MAX: ::c_int = 8; +pub const _SC_LINE_MAX: ::c_int = 9; +pub const _SC_NGROUPS_MAX: ::c_int = 10; +pub const _SC_OPEN_MAX: ::c_int = 11; +pub const _SC_PASS_MAX: ::c_int = 12; +pub const _SC_2_C_BIND: ::c_int = 13; +pub const _SC_2_C_DEV: ::c_int = 14; +pub const _SC_2_C_VERSION: ::c_int = 15; +pub const _SC_2_CHAR_TERM: ::c_int = 16; +pub const _SC_2_FORT_DEV: ::c_int = 17; +pub const _SC_2_FORT_RUN: ::c_int = 18; +pub const _SC_2_LOCALEDEF: ::c_int = 19; +pub const _SC_2_SW_DEV: ::c_int = 20; +pub const _SC_2_UPE: ::c_int = 21; +pub const _SC_2_VERSION: ::c_int = 22; +pub const _SC_JOB_CONTROL: ::c_int = 23; +pub const _SC_SAVED_IDS: ::c_int = 24; +pub const _SC_VERSION: ::c_int = 25; +pub const _SC_RE_DUP_MAX: ::c_int = 26; +pub const _SC_STREAM_MAX: ::c_int = 27; +pub const _SC_TZNAME_MAX: ::c_int = 28; +pub const _SC_XOPEN_CRYPT: ::c_int = 29; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 30; +pub const _SC_XOPEN_SHM: ::c_int = 31; +pub const _SC_XOPEN_VERSION: ::c_int = 32; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 33; +pub const _SC_XOPEN_REALTIME: ::c_int = 34; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 35; +pub const _SC_XOPEN_LEGACY: ::c_int = 36; +pub const _SC_ATEXIT_MAX: ::c_int = 37; +pub const _SC_IOV_MAX: ::c_int = 38; +pub const _SC_PAGESIZE: ::c_int = 39; +pub const _SC_PAGE_SIZE: ::c_int = 40; +pub const _SC_XOPEN_UNIX: ::c_int = 41; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 42; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 43; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 44; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 45; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 46; +pub const _SC_AIO_MAX: ::c_int = 47; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 48; +pub const _SC_DELAYTIMER_MAX: ::c_int = 49; +pub const _SC_MQ_OPEN_MAX: ::c_int = 50; +pub const _SC_MQ_PRIO_MAX: ::c_int = 51; +pub const _SC_RTSIG_MAX: ::c_int = 52; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 53; +pub const _SC_SEM_VALUE_MAX: ::c_int = 54; +pub const _SC_SIGQUEUE_MAX: ::c_int = 55; +pub const _SC_TIMER_MAX: ::c_int = 56; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 57; +pub const _SC_FSYNC: ::c_int = 58; +pub const _SC_MAPPED_FILES: ::c_int = 59; +pub const _SC_MEMLOCK: ::c_int = 60; +pub const _SC_MEMLOCK_RANGE: ::c_int = 61; +pub const _SC_MEMORY_PROTECTION: ::c_int = 62; +pub const _SC_MESSAGE_PASSING: ::c_int = 63; +pub const _SC_PRIORITIZED_IO: ::c_int = 64; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 65; +pub const _SC_REALTIME_SIGNALS: ::c_int = 66; +pub const _SC_SEMAPHORES: ::c_int = 67; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 68; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 69; +pub const _SC_TIMERS: ::c_int = 70; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 71; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 72; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 73; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 74; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 75; +pub const _SC_THREAD_STACK_MIN: ::c_int = 76; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 77; +pub const _SC_TTY_NAME_MAX: ::c_int = 78; +pub const _SC_THREADS: ::c_int = 79; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 80; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 81; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 82; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 83; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 84; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 85; +pub const _SC_NPROCESSORS_CONF: ::c_int = 96; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 97; +pub const _SC_PHYS_PAGES: ::c_int = 98; +pub const _SC_AVPHYS_PAGES: ::c_int = 99; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 100; + +pub const _SC_2_PBS: ::c_int = 101; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 102; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 103; +pub const _SC_2_PBS_LOCATE: ::c_int = 104; +pub const _SC_2_PBS_MESSAGE: ::c_int = 105; +pub const _SC_2_PBS_TRACK: ::c_int = 106; +pub const _SC_ADVISORY_INFO: ::c_int = 107; +pub const _SC_BARRIERS: ::c_int = 108; +pub const _SC_CLOCK_SELECTION: ::c_int = 109; +pub const _SC_CPUTIME: ::c_int = 110; +pub const _SC_HOST_NAME_MAX: ::c_int = 111; +pub const _SC_IPV6: ::c_int = 112; +pub const _SC_RAW_SOCKETS: ::c_int = 113; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 114; +pub const _SC_REGEXP: ::c_int = 115; +pub const _SC_SHELL: ::c_int = 116; +pub const _SC_SPAWN: ::c_int = 117; +pub const _SC_SPIN_LOCKS: ::c_int = 118; +pub const _SC_SPORADIC_SERVER: ::c_int = 119; +pub const _SC_SS_REPL_MAX: ::c_int = 120; +pub const _SC_SYMLOOP_MAX: ::c_int = 121; +pub const _SC_THREAD_CPUTIME: ::c_int = 122; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 123; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 124; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 125; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 126; +pub const _SC_TIMEOUTS: ::c_int = 127; +pub const _SC_TRACE: ::c_int = 128; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 129; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 130; +pub const _SC_TRACE_INHERIT: ::c_int = 131; +pub const _SC_TRACE_LOG: ::c_int = 132; +pub const _SC_TRACE_NAME_MAX: ::c_int = 133; +pub const _SC_TRACE_SYS_MAX: ::c_int = 134; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 135; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 136; +pub const _SC_V7_ILP32_OFF32: ::c_int = 137; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 138; +pub const _SC_V7_LP64_OFF64: ::c_int = 139; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 140; +pub const _SC_XOPEN_STREAMS: ::c_int = 141; +pub const _SC_XOPEN_UUCP: ::c_int = 142; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const F_SEAL_FUTURE_WRITE: ::c_int = 0x0010; + +pub const IFF_LOWER_UP: ::c_int = 0x10000; +pub const IFF_DORMANT: ::c_int = 0x20000; +pub const IFF_ECHO: ::c_int = 0x40000; + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +// stdio.h +pub const RENAME_NOREPLACE: ::c_int = 1; +pub const RENAME_EXCHANGE: ::c_int = 2; +pub const RENAME_WHITEOUT: ::c_int = 4; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONCLEX: ::c_int = 0x5450; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = 1 << LC_PAPER; +pub const LC_NAME_MASK: ::c_int = 1 << LC_NAME; +pub const LC_ADDRESS_MASK: ::c_int = 1 << LC_ADDRESS; +pub const LC_TELEPHONE_MASK: ::c_int = 1 << LC_TELEPHONE; +pub const LC_MEASUREMENT_MASK: ::c_int = 1 << LC_MEASUREMENT; +pub const LC_IDENTIFICATION_MASK: ::c_int = 1 << LC_IDENTIFICATION; +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; + +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_DCCP: ::c_int = 6; +pub const SOCK_PACKET: ::c_int = 10; + +pub const IPPROTO_MAX: ::c_int = 256; + +pub const SOL_SOCKET: ::c_int = 1; +pub const SOL_SCTP: ::c_int = 132; +pub const SOL_IPX: ::c_int = 256; +pub const SOL_AX25: ::c_int = 257; +pub const SOL_ATALK: ::c_int = 258; +pub const SOL_NETROM: ::c_int = 259; +pub const SOL_ROSE: ::c_int = 260; + +/* DCCP socket options */ +pub const DCCP_SOCKOPT_PACKET_SIZE: ::c_int = 1; +pub const DCCP_SOCKOPT_SERVICE: ::c_int = 2; +pub const DCCP_SOCKOPT_CHANGE_L: ::c_int = 3; +pub const DCCP_SOCKOPT_CHANGE_R: ::c_int = 4; +pub const DCCP_SOCKOPT_GET_CUR_MPS: ::c_int = 5; +pub const DCCP_SOCKOPT_SERVER_TIMEWAIT: ::c_int = 6; +pub const DCCP_SOCKOPT_SEND_CSCOV: ::c_int = 10; +pub const DCCP_SOCKOPT_RECV_CSCOV: ::c_int = 11; +pub const DCCP_SOCKOPT_AVAILABLE_CCIDS: ::c_int = 12; +pub const DCCP_SOCKOPT_CCID: ::c_int = 13; +pub const DCCP_SOCKOPT_TX_CCID: ::c_int = 14; +pub const DCCP_SOCKOPT_RX_CCID: ::c_int = 15; +pub const DCCP_SOCKOPT_QPOLICY_ID: ::c_int = 16; +pub const DCCP_SOCKOPT_QPOLICY_TXQLEN: ::c_int = 17; +pub const DCCP_SOCKOPT_CCID_RX_INFO: ::c_int = 128; +pub const DCCP_SOCKOPT_CCID_TX_INFO: ::c_int = 192; + +/// maximum number of services provided on the same listening port +pub const DCCP_SERVICE_LIST_MAX_LEN: ::c_int = 32; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +// pub const SO_TIMESTAMPNS_OLD: ::c_int = 35; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +// pub const SO_TIMESTAMPING_OLD: ::c_int = 37; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SCM_TIMESTAMPING_OPT_STATS: ::c_int = 54; +pub const SCM_TIMESTAMPING_PKTINFO: ::c_int = 58; +pub const SO_TIMESTAMP_NEW: ::c_int = 63; +pub const SO_TIMESTAMPNS_NEW: ::c_int = 64; +pub const SO_TIMESTAMPING_NEW: ::c_int = 65; + +// Defined in unix/linux_like/mod.rs +// pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; + +pub const IPTOS_ECN_NOTECT: u8 = 0x00; + +pub const O_ACCMODE: ::c_int = 3; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; +pub const O_DSYNC: ::c_int = 4096; +pub const O_RSYNC: ::c_int = O_SYNC; + +pub const NI_MAXHOST: ::size_t = 1025; +pub const NI_MAXSERV: ::size_t = 32; + +pub const NI_NOFQDN: ::c_int = 0x00000001; +pub const NI_NUMERICHOST: ::c_int = 0x00000002; +pub const NI_NAMEREQD: ::c_int = 0x00000004; +pub const NI_NUMERICSERV: ::c_int = 0x00000008; +pub const NI_DGRAM: ::c_int = 0x00000010; + +pub const NCCS: usize = 19; +pub const TCSBRKP: ::c_int = 0x5425; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 0x1; +pub const TCSAFLUSH: ::c_int = 0x2; +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0o200000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; + +pub const PTRACE_EVENT_STOP: ::c_int = 128; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_MEMLOCK: ::c_int = 8; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_LOCKS: ::c_int = 10; +pub const RLIMIT_SIGPENDING: ::c_int = 11; +pub const RLIMIT_MSGQUEUE: ::c_int = 12; +pub const RLIMIT_NICE: ::c_int = 13; +pub const RLIMIT_RTPRIO: ::c_int = 14; + +pub const RLIM_NLIMITS: ::c_int = 16; +pub const RLIM_INFINITY: ::rlim_t = !0; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETS2: ::c_int = 0x802c542a; +pub const TCSETS2: ::c_int = 0x402c542b; +pub const TCSETSW2: ::c_int = 0x402c542c; +pub const TCSETSF2: ::c_int = 0x402c542d; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCINQ: ::c_int = 0x541B; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; +pub const TIOCSBRK: ::c_int = 0x5427; +pub const TIOCCBRK: ::c_int = 0x5428; +cfg_if! { + if #[cfg(any(target_arch = "x86", + target_arch = "x86_64", + target_arch = "arm", + target_arch = "aarch64", + target_arch = "riscv64", + target_arch = "s390x"))] { + pub const FICLONE: ::c_int = 0x40049409; + pub const FICLONERANGE: ::c_int = 0x4020940D; + } else if #[cfg(any(target_arch = "mips", + target_arch = "mips64", + target_arch = "powerpc", + target_arch = "powerpc64"))] { + pub const FICLONE: ::c_int = 0x80049409; + pub const FICLONERANGE: ::c_int = 0x8020940D; + } +} + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; +pub const ST_NODEV: ::c_ulong = 4; +pub const ST_NOEXEC: ::c_ulong = 8; +pub const ST_SYNCHRONOUS: ::c_ulong = 16; +pub const ST_MANDLOCK: ::c_ulong = 64; +pub const ST_NOATIME: ::c_ulong = 1024; +pub const ST_NODIRATIME: ::c_ulong = 2048; +pub const ST_RELATIME: ::c_ulong = 4096; + +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t; + +pub const AI_PASSIVE: ::c_int = 0x00000001; +pub const AI_CANONNAME: ::c_int = 0x00000002; +pub const AI_NUMERICHOST: ::c_int = 0x00000004; +pub const AI_NUMERICSERV: ::c_int = 0x00000008; +pub const AI_MASK: ::c_int = + AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_ADDRCONFIG; +pub const AI_ALL: ::c_int = 0x00000100; +pub const AI_V4MAPPED_CFG: ::c_int = 0x00000200; +pub const AI_ADDRCONFIG: ::c_int = 0x00000400; +pub const AI_V4MAPPED: ::c_int = 0x00000800; +pub const AI_DEFAULT: ::c_int = AI_V4MAPPED_CFG | AI_ADDRCONFIG; + +// linux/kexec.h +pub const KEXEC_ON_CRASH: ::c_int = 0x00000001; +pub const KEXEC_PRESERVE_CONTEXT: ::c_int = 0x00000002; +pub const KEXEC_ARCH_MASK: ::c_int = 0xffff0000; +pub const KEXEC_FILE_UNLOAD: ::c_int = 0x00000001; +pub const KEXEC_FILE_ON_CRASH: ::c_int = 0x00000002; +pub const KEXEC_FILE_NO_INITRAMFS: ::c_int = 0x00000004; + +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const REG_BASIC: ::c_int = 0; +pub const REG_EXTENDED: ::c_int = 1; +pub const REG_ICASE: ::c_int = 2; +pub const REG_NOSUB: ::c_int = 4; +pub const REG_NEWLINE: ::c_int = 8; +pub const REG_NOSPEC: ::c_int = 16; +pub const REG_PEND: ::c_int = 32; +pub const REG_DUMP: ::c_int = 128; + +pub const REG_NOMATCH: ::c_int = 1; +pub const REG_BADPAT: ::c_int = 2; +pub const REG_ECOLLATE: ::c_int = 3; +pub const REG_ECTYPE: ::c_int = 4; +pub const REG_EESCAPE: ::c_int = 5; +pub const REG_ESUBREG: ::c_int = 6; +pub const REG_EBRACK: ::c_int = 7; +pub const REG_EPAREN: ::c_int = 8; +pub const REG_EBRACE: ::c_int = 9; +pub const REG_BADBR: ::c_int = 10; +pub const REG_ERANGE: ::c_int = 11; +pub const REG_ESPACE: ::c_int = 12; +pub const REG_BADRPT: ::c_int = 13; +pub const REG_EMPTY: ::c_int = 14; +pub const REG_ASSERT: ::c_int = 15; +pub const REG_INVARG: ::c_int = 16; +pub const REG_ATOI: ::c_int = 255; +pub const REG_ITOA: ::c_int = 256; + +pub const REG_NOTBOL: ::c_int = 1; +pub const REG_NOTEOL: ::c_int = 2; +pub const REG_STARTEND: ::c_int = 4; +pub const REG_TRACE: ::c_int = 256; +pub const REG_LARGE: ::c_int = 512; +pub const REG_BACKR: ::c_int = 1024; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const BOTHER: ::speed_t = 0o010000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; +pub const IBSHIFT: ::tcflag_t = 16; + +pub const BLKIOMIN: ::c_int = 0x1278; +pub const BLKIOOPT: ::c_int = 0x1279; +pub const BLKSSZGET: ::c_int = 0x1268; +pub const BLKPBSZGET: ::c_int = 0x127B; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const NETLINK_ROUTE: ::c_int = 0; +pub const NETLINK_UNUSED: ::c_int = 1; +pub const NETLINK_USERSOCK: ::c_int = 2; +pub const NETLINK_FIREWALL: ::c_int = 3; +pub const NETLINK_SOCK_DIAG: ::c_int = 4; +pub const NETLINK_NFLOG: ::c_int = 5; +pub const NETLINK_XFRM: ::c_int = 6; +pub const NETLINK_SELINUX: ::c_int = 7; +pub const NETLINK_ISCSI: ::c_int = 8; +pub const NETLINK_AUDIT: ::c_int = 9; +pub const NETLINK_FIB_LOOKUP: ::c_int = 10; +pub const NETLINK_CONNECTOR: ::c_int = 11; +pub const NETLINK_NETFILTER: ::c_int = 12; +pub const NETLINK_IP6_FW: ::c_int = 13; +pub const NETLINK_DNRTMSG: ::c_int = 14; +pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; +pub const NETLINK_GENERIC: ::c_int = 16; +pub const NETLINK_SCSITRANSPORT: ::c_int = 18; +pub const NETLINK_ECRYPTFS: ::c_int = 19; +pub const NETLINK_RDMA: ::c_int = 20; +pub const NETLINK_CRYPTO: ::c_int = 21; +pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; + +pub const MAX_LINKS: ::c_int = 32; + +pub const NLM_F_REQUEST: ::c_int = 1; +pub const NLM_F_MULTI: ::c_int = 2; +pub const NLM_F_ACK: ::c_int = 4; +pub const NLM_F_ECHO: ::c_int = 8; +pub const NLM_F_DUMP_INTR: ::c_int = 16; +pub const NLM_F_DUMP_FILTERED: ::c_int = 32; + +pub const NLM_F_ROOT: ::c_int = 0x100; +pub const NLM_F_MATCH: ::c_int = 0x200; +pub const NLM_F_ATOMIC: ::c_int = 0x400; +pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; + +pub const NLM_F_REPLACE: ::c_int = 0x100; +pub const NLM_F_EXCL: ::c_int = 0x200; +pub const NLM_F_CREATE: ::c_int = 0x400; +pub const NLM_F_APPEND: ::c_int = 0x800; + +pub const NLMSG_NOOP: ::c_int = 0x1; +pub const NLMSG_ERROR: ::c_int = 0x2; +pub const NLMSG_DONE: ::c_int = 0x3; +pub const NLMSG_OVERRUN: ::c_int = 0x4; +pub const NLMSG_MIN_TYPE: ::c_int = 0x10; + +// linux/netfilter/nfnetlink.h +pub const NFNLGRP_NONE: ::c_int = 0; +pub const NFNLGRP_CONNTRACK_NEW: ::c_int = 1; +pub const NFNLGRP_CONNTRACK_UPDATE: ::c_int = 2; +pub const NFNLGRP_CONNTRACK_DESTROY: ::c_int = 3; +pub const NFNLGRP_CONNTRACK_EXP_NEW: ::c_int = 4; +pub const NFNLGRP_CONNTRACK_EXP_UPDATE: ::c_int = 5; +pub const NFNLGRP_CONNTRACK_EXP_DESTROY: ::c_int = 6; +pub const NFNLGRP_NFTABLES: ::c_int = 7; +pub const NFNLGRP_ACCT_QUOTA: ::c_int = 8; + +pub const NFNETLINK_V0: ::c_int = 0; + +pub const NFNL_SUBSYS_NONE: ::c_int = 0; +pub const NFNL_SUBSYS_CTNETLINK: ::c_int = 1; +pub const NFNL_SUBSYS_CTNETLINK_EXP: ::c_int = 2; +pub const NFNL_SUBSYS_QUEUE: ::c_int = 3; +pub const NFNL_SUBSYS_ULOG: ::c_int = 4; +pub const NFNL_SUBSYS_OSF: ::c_int = 5; +pub const NFNL_SUBSYS_IPSET: ::c_int = 6; +pub const NFNL_SUBSYS_ACCT: ::c_int = 7; +pub const NFNL_SUBSYS_CTNETLINK_TIMEOUT: ::c_int = 8; +pub const NFNL_SUBSYS_CTHELPER: ::c_int = 9; +pub const NFNL_SUBSYS_NFTABLES: ::c_int = 10; +pub const NFNL_SUBSYS_NFT_COMPAT: ::c_int = 11; +pub const NFNL_SUBSYS_COUNT: ::c_int = 12; + +pub const NFNL_MSG_BATCH_BEGIN: ::c_int = NLMSG_MIN_TYPE; +pub const NFNL_MSG_BATCH_END: ::c_int = NLMSG_MIN_TYPE + 1; + +// linux/netfilter/nfnetlink_log.h +pub const NFULNL_MSG_PACKET: ::c_int = 0; +pub const NFULNL_MSG_CONFIG: ::c_int = 1; + +pub const NFULA_UNSPEC: ::c_int = 0; +pub const NFULA_PACKET_HDR: ::c_int = 1; +pub const NFULA_MARK: ::c_int = 2; +pub const NFULA_TIMESTAMP: ::c_int = 3; +pub const NFULA_IFINDEX_INDEV: ::c_int = 4; +pub const NFULA_IFINDEX_OUTDEV: ::c_int = 5; +pub const NFULA_IFINDEX_PHYSINDEV: ::c_int = 6; +pub const NFULA_IFINDEX_PHYSOUTDEV: ::c_int = 7; +pub const NFULA_HWADDR: ::c_int = 8; +pub const NFULA_PAYLOAD: ::c_int = 9; +pub const NFULA_PREFIX: ::c_int = 10; +pub const NFULA_UID: ::c_int = 11; +pub const NFULA_SEQ: ::c_int = 12; +pub const NFULA_SEQ_GLOBAL: ::c_int = 13; +pub const NFULA_GID: ::c_int = 14; +pub const NFULA_HWTYPE: ::c_int = 15; +pub const NFULA_HWHEADER: ::c_int = 16; +pub const NFULA_HWLEN: ::c_int = 17; +pub const NFULA_CT: ::c_int = 18; +pub const NFULA_CT_INFO: ::c_int = 19; + +pub const NFULNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFULNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFULNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFULNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFULNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFULA_CFG_UNSPEC: ::c_int = 0; +pub const NFULA_CFG_CMD: ::c_int = 1; +pub const NFULA_CFG_MODE: ::c_int = 2; +pub const NFULA_CFG_NLBUFSIZ: ::c_int = 3; +pub const NFULA_CFG_TIMEOUT: ::c_int = 4; +pub const NFULA_CFG_QTHRESH: ::c_int = 5; +pub const NFULA_CFG_FLAGS: ::c_int = 6; + +pub const NFULNL_COPY_NONE: ::c_int = 0x00; +pub const NFULNL_COPY_META: ::c_int = 0x01; +pub const NFULNL_COPY_PACKET: ::c_int = 0x02; + +pub const NFULNL_CFG_F_SEQ: ::c_int = 0x0001; +pub const NFULNL_CFG_F_SEQ_GLOBAL: ::c_int = 0x0002; +pub const NFULNL_CFG_F_CONNTRACK: ::c_int = 0x0004; + +// linux/netfilter/nfnetlink_log.h +pub const NFQNL_MSG_PACKET: ::c_int = 0; +pub const NFQNL_MSG_VERDICT: ::c_int = 1; +pub const NFQNL_MSG_CONFIG: ::c_int = 2; +pub const NFQNL_MSG_VERDICT_BATCH: ::c_int = 3; + +pub const NFQA_UNSPEC: ::c_int = 0; +pub const NFQA_PACKET_HDR: ::c_int = 1; +pub const NFQA_VERDICT_HDR: ::c_int = 2; +pub const NFQA_MARK: ::c_int = 3; +pub const NFQA_TIMESTAMP: ::c_int = 4; +pub const NFQA_IFINDEX_INDEV: ::c_int = 5; +pub const NFQA_IFINDEX_OUTDEV: ::c_int = 6; +pub const NFQA_IFINDEX_PHYSINDEV: ::c_int = 7; +pub const NFQA_IFINDEX_PHYSOUTDEV: ::c_int = 8; +pub const NFQA_HWADDR: ::c_int = 9; +pub const NFQA_PAYLOAD: ::c_int = 10; +pub const NFQA_CT: ::c_int = 11; +pub const NFQA_CT_INFO: ::c_int = 12; +pub const NFQA_CAP_LEN: ::c_int = 13; +pub const NFQA_SKB_INFO: ::c_int = 14; +pub const NFQA_EXP: ::c_int = 15; +pub const NFQA_UID: ::c_int = 16; +pub const NFQA_GID: ::c_int = 17; +pub const NFQA_SECCTX: ::c_int = 18; +/* + FIXME: These are not yet available in musl sanitized kernel headers and + make the tests fail. Enable them once musl has them. + + See https://github.com/rust-lang/libc/pull/1628 for more details. +pub const NFQA_VLAN: ::c_int = 19; +pub const NFQA_L2HDR: ::c_int = 20; + +pub const NFQA_VLAN_UNSPEC: ::c_int = 0; +pub const NFQA_VLAN_PROTO: ::c_int = 1; +pub const NFQA_VLAN_TCI: ::c_int = 2; +*/ + +pub const NFQNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFQNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFQNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFQNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFQNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFQNL_COPY_NONE: ::c_int = 0; +pub const NFQNL_COPY_META: ::c_int = 1; +pub const NFQNL_COPY_PACKET: ::c_int = 2; + +pub const NFQA_CFG_UNSPEC: ::c_int = 0; +pub const NFQA_CFG_CMD: ::c_int = 1; +pub const NFQA_CFG_PARAMS: ::c_int = 2; +pub const NFQA_CFG_QUEUE_MAXLEN: ::c_int = 3; +pub const NFQA_CFG_MASK: ::c_int = 4; +pub const NFQA_CFG_FLAGS: ::c_int = 5; + +pub const NFQA_CFG_F_FAIL_OPEN: ::c_int = 0x0001; +pub const NFQA_CFG_F_CONNTRACK: ::c_int = 0x0002; +pub const NFQA_CFG_F_GSO: ::c_int = 0x0004; +pub const NFQA_CFG_F_UID_GID: ::c_int = 0x0008; +pub const NFQA_CFG_F_SECCTX: ::c_int = 0x0010; +pub const NFQA_CFG_F_MAX: ::c_int = 0x0020; + +pub const NFQA_SKB_CSUMNOTREADY: ::c_int = 0x0001; +pub const NFQA_SKB_GSO: ::c_int = 0x0002; +pub const NFQA_SKB_CSUM_NOTVERIFIED: ::c_int = 0x0004; + +pub const GENL_NAMSIZ: ::c_int = 16; + +pub const GENL_MIN_ID: ::c_int = NLMSG_MIN_TYPE; +pub const GENL_MAX_ID: ::c_int = 1023; + +pub const GENL_ADMIN_PERM: ::c_int = 0x01; +pub const GENL_CMD_CAP_DO: ::c_int = 0x02; +pub const GENL_CMD_CAP_DUMP: ::c_int = 0x04; +pub const GENL_CMD_CAP_HASPOL: ::c_int = 0x08; +pub const GENL_UNS_ADMIN_PERM: ::c_int = 0x10; + +pub const GENL_ID_CTRL: ::c_int = NLMSG_MIN_TYPE; +pub const GENL_ID_VFS_DQUOT: ::c_int = NLMSG_MIN_TYPE + 1; +pub const GENL_ID_PMCRAID: ::c_int = NLMSG_MIN_TYPE + 2; + +pub const CTRL_CMD_UNSPEC: ::c_int = 0; +pub const CTRL_CMD_NEWFAMILY: ::c_int = 1; +pub const CTRL_CMD_DELFAMILY: ::c_int = 2; +pub const CTRL_CMD_GETFAMILY: ::c_int = 3; +pub const CTRL_CMD_NEWOPS: ::c_int = 4; +pub const CTRL_CMD_DELOPS: ::c_int = 5; +pub const CTRL_CMD_GETOPS: ::c_int = 6; +pub const CTRL_CMD_NEWMCAST_GRP: ::c_int = 7; +pub const CTRL_CMD_DELMCAST_GRP: ::c_int = 8; +pub const CTRL_CMD_GETMCAST_GRP: ::c_int = 9; + +pub const CTRL_ATTR_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_FAMILY_ID: ::c_int = 1; +pub const CTRL_ATTR_FAMILY_NAME: ::c_int = 2; +pub const CTRL_ATTR_VERSION: ::c_int = 3; +pub const CTRL_ATTR_HDRSIZE: ::c_int = 4; +pub const CTRL_ATTR_MAXATTR: ::c_int = 5; +pub const CTRL_ATTR_OPS: ::c_int = 6; +pub const CTRL_ATTR_MCAST_GROUPS: ::c_int = 7; + +pub const CTRL_ATTR_OP_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_OP_ID: ::c_int = 1; +pub const CTRL_ATTR_OP_FLAGS: ::c_int = 2; + +pub const CTRL_ATTR_MCAST_GRP_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_MCAST_GRP_NAME: ::c_int = 1; +pub const CTRL_ATTR_MCAST_GRP_ID: ::c_int = 2; + +pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; +pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; +pub const NETLINK_PKTINFO: ::c_int = 3; +pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; +pub const NETLINK_NO_ENOBUFS: ::c_int = 5; +pub const NETLINK_RX_RING: ::c_int = 6; +pub const NETLINK_TX_RING: ::c_int = 7; +pub const NETLINK_LISTEN_ALL_NSID: ::c_int = 8; +pub const NETLINK_LIST_MEMBERSHIPS: ::c_int = 9; +pub const NETLINK_CAP_ACK: ::c_int = 10; +pub const NETLINK_EXT_ACK: ::c_int = 11; +pub const NETLINK_GET_STRICT_CHK: ::c_int = 12; + +pub const GRND_NONBLOCK: ::c_uint = 0x0001; +pub const GRND_RANDOM: ::c_uint = 0x0002; +pub const GRND_INSECURE: ::c_uint = 0x0004; + +pub const SECCOMP_MODE_DISABLED: ::c_uint = 0; +pub const SECCOMP_MODE_STRICT: ::c_uint = 1; +pub const SECCOMP_MODE_FILTER: ::c_uint = 2; + +pub const SECCOMP_FILTER_FLAG_TSYNC: ::c_ulong = 1; +pub const SECCOMP_FILTER_FLAG_LOG: ::c_ulong = 2; +pub const SECCOMP_FILTER_FLAG_SPEC_ALLOW: ::c_ulong = 4; +pub const SECCOMP_FILTER_FLAG_NEW_LISTENER: ::c_ulong = 8; + +pub const SECCOMP_RET_ACTION_FULL: ::c_uint = 0xffff0000; +pub const SECCOMP_RET_ACTION: ::c_uint = 0x7fff0000; +pub const SECCOMP_RET_DATA: ::c_uint = 0x0000ffff; + +pub const SECCOMP_RET_KILL_PROCESS: ::c_uint = 0x80000000; +pub const SECCOMP_RET_KILL_THREAD: ::c_uint = 0x00000000; +pub const SECCOMP_RET_KILL: ::c_uint = SECCOMP_RET_KILL_THREAD; +pub const SECCOMP_RET_TRAP: ::c_uint = 0x00030000; +pub const SECCOMP_RET_ERRNO: ::c_uint = 0x00050000; +pub const SECCOMP_RET_USER_NOTIF: ::c_uint = 0x7fc00000; +pub const SECCOMP_RET_TRACE: ::c_uint = 0x7ff00000; +pub const SECCOMP_RET_LOG: ::c_uint = 0x7ffc0000; +pub const SECCOMP_RET_ALLOW: ::c_uint = 0x7fff0000; + +pub const NLA_F_NESTED: ::c_int = 1 << 15; +pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; +pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); + +pub const NLA_ALIGNTO: ::c_int = 4; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const SFD_CLOEXEC: ::c_int = O_CLOEXEC; +pub const SFD_NONBLOCK: ::c_int = O_NONBLOCK; + +pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; + +pub const SO_ORIGINAL_DST: ::c_int = 80; + +pub const IP_RECVFRAGSIZE: ::c_int = 25; + +pub const IPV6_FLOWINFO: ::c_int = 11; +pub const IPV6_MULTICAST_ALL: ::c_int = 29; +pub const IPV6_ROUTER_ALERT_ISOLATE: ::c_int = 30; +pub const IPV6_FLOWLABEL_MGR: ::c_int = 32; +pub const IPV6_FLOWINFO_SEND: ::c_int = 33; +pub const IPV6_RECVFRAGSIZE: ::c_int = 77; +pub const IPV6_FREEBIND: ::c_int = 78; +pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff; +pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000; + +pub const IUTF8: ::tcflag_t = 0x00004000; +pub const CMSPAR: ::tcflag_t = 0o10000000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const MFD_CLOEXEC: ::c_uint = 0x0001; +pub const MFD_ALLOW_SEALING: ::c_uint = 0x0002; +pub const MFD_HUGETLB: ::c_uint = 0x0004; +pub const MFD_HUGE_64KB: ::c_uint = 0x40000000; +pub const MFD_HUGE_512KB: ::c_uint = 0x4c000000; +pub const MFD_HUGE_1MB: ::c_uint = 0x50000000; +pub const MFD_HUGE_2MB: ::c_uint = 0x54000000; +pub const MFD_HUGE_8MB: ::c_uint = 0x5c000000; +pub const MFD_HUGE_16MB: ::c_uint = 0x60000000; +pub const MFD_HUGE_32MB: ::c_uint = 0x64000000; +pub const MFD_HUGE_256MB: ::c_uint = 0x70000000; +pub const MFD_HUGE_512MB: ::c_uint = 0x74000000; +pub const MFD_HUGE_1GB: ::c_uint = 0x78000000; +pub const MFD_HUGE_2GB: ::c_uint = 0x7c000000; +pub const MFD_HUGE_16GB: ::c_uint = 0x88000000; +pub const MFD_HUGE_MASK: ::c_uint = 63; +pub const MFD_HUGE_SHIFT: ::c_uint = 26; + +// these are used in the p_type field of Elf32_Phdr and Elf64_Phdr, which has +// the type Elf32Word and Elf64Word respectively. Luckily, both of those are u32 +// so we can use that type here to avoid having to cast. +pub const PT_NULL: u32 = 0; +pub const PT_LOAD: u32 = 1; +pub const PT_DYNAMIC: u32 = 2; +pub const PT_INTERP: u32 = 3; +pub const PT_NOTE: u32 = 4; +pub const PT_SHLIB: u32 = 5; +pub const PT_PHDR: u32 = 6; +pub const PT_TLS: u32 = 7; +pub const PT_LOOS: u32 = 0x60000000; +pub const PT_GNU_EH_FRAME: u32 = 0x6474e550; +pub const PT_GNU_STACK: u32 = 0x6474e551; +pub const PT_GNU_RELRO: u32 = 0x6474e552; +pub const PT_HIOS: u32 = 0x6fffffff; +pub const PT_LOPROC: u32 = 0x70000000; +pub const PT_HIPROC: u32 = 0x7fffffff; + +// uapi/linux/mount.h +pub const OPEN_TREE_CLONE: ::c_uint = 0x01; +pub const OPEN_TREE_CLOEXEC: ::c_uint = O_CLOEXEC as ::c_uint; + +// linux/netfilter.h +pub const NF_DROP: ::c_int = 0; +pub const NF_ACCEPT: ::c_int = 1; +pub const NF_STOLEN: ::c_int = 2; +pub const NF_QUEUE: ::c_int = 3; +pub const NF_REPEAT: ::c_int = 4; +pub const NF_STOP: ::c_int = 5; +pub const NF_MAX_VERDICT: ::c_int = NF_STOP; + +pub const NF_VERDICT_MASK: ::c_int = 0x000000ff; +pub const NF_VERDICT_FLAG_QUEUE_BYPASS: ::c_int = 0x00008000; + +pub const NF_VERDICT_QMASK: ::c_int = 0xffff0000; +pub const NF_VERDICT_QBITS: ::c_int = 16; + +pub const NF_VERDICT_BITS: ::c_int = 16; + +pub const NF_INET_PRE_ROUTING: ::c_int = 0; +pub const NF_INET_LOCAL_IN: ::c_int = 1; +pub const NF_INET_FORWARD: ::c_int = 2; +pub const NF_INET_LOCAL_OUT: ::c_int = 3; +pub const NF_INET_POST_ROUTING: ::c_int = 4; +pub const NF_INET_NUMHOOKS: ::c_int = 5; + +pub const NF_NETDEV_INGRESS: ::c_int = 0; +pub const NF_NETDEV_NUMHOOKS: ::c_int = 1; + +pub const NFPROTO_UNSPEC: ::c_int = 0; +pub const NFPROTO_INET: ::c_int = 1; +pub const NFPROTO_IPV4: ::c_int = 2; +pub const NFPROTO_ARP: ::c_int = 3; +pub const NFPROTO_NETDEV: ::c_int = 5; +pub const NFPROTO_BRIDGE: ::c_int = 7; +pub const NFPROTO_IPV6: ::c_int = 10; +pub const NFPROTO_DECNET: ::c_int = 12; +pub const NFPROTO_NUMPROTO: ::c_int = 13; + +// linux/netfilter_ipv4.h +pub const NF_IP_PRE_ROUTING: ::c_int = 0; +pub const NF_IP_LOCAL_IN: ::c_int = 1; +pub const NF_IP_FORWARD: ::c_int = 2; +pub const NF_IP_LOCAL_OUT: ::c_int = 3; +pub const NF_IP_POST_ROUTING: ::c_int = 4; +pub const NF_IP_NUMHOOKS: ::c_int = 5; + +pub const NF_IP_PRI_FIRST: ::c_int = ::INT_MIN; +pub const NF_IP_PRI_CONNTRACK_DEFRAG: ::c_int = -400; +pub const NF_IP_PRI_RAW: ::c_int = -300; +pub const NF_IP_PRI_SELINUX_FIRST: ::c_int = -225; +pub const NF_IP_PRI_CONNTRACK: ::c_int = -200; +pub const NF_IP_PRI_MANGLE: ::c_int = -150; +pub const NF_IP_PRI_NAT_DST: ::c_int = -100; +pub const NF_IP_PRI_FILTER: ::c_int = 0; +pub const NF_IP_PRI_SECURITY: ::c_int = 50; +pub const NF_IP_PRI_NAT_SRC: ::c_int = 100; +pub const NF_IP_PRI_SELINUX_LAST: ::c_int = 225; +pub const NF_IP_PRI_CONNTRACK_HELPER: ::c_int = 300; +pub const NF_IP_PRI_CONNTRACK_CONFIRM: ::c_int = ::INT_MAX; +pub const NF_IP_PRI_LAST: ::c_int = ::INT_MAX; + +// linux/netfilter_ipv6.h +pub const NF_IP6_PRE_ROUTING: ::c_int = 0; +pub const NF_IP6_LOCAL_IN: ::c_int = 1; +pub const NF_IP6_FORWARD: ::c_int = 2; +pub const NF_IP6_LOCAL_OUT: ::c_int = 3; +pub const NF_IP6_POST_ROUTING: ::c_int = 4; +pub const NF_IP6_NUMHOOKS: ::c_int = 5; + +pub const NF_IP6_PRI_FIRST: ::c_int = ::INT_MIN; +pub const NF_IP6_PRI_CONNTRACK_DEFRAG: ::c_int = -400; +pub const NF_IP6_PRI_RAW: ::c_int = -300; +pub const NF_IP6_PRI_SELINUX_FIRST: ::c_int = -225; +pub const NF_IP6_PRI_CONNTRACK: ::c_int = -200; +pub const NF_IP6_PRI_MANGLE: ::c_int = -150; +pub const NF_IP6_PRI_NAT_DST: ::c_int = -100; +pub const NF_IP6_PRI_FILTER: ::c_int = 0; +pub const NF_IP6_PRI_SECURITY: ::c_int = 50; +pub const NF_IP6_PRI_NAT_SRC: ::c_int = 100; +pub const NF_IP6_PRI_SELINUX_LAST: ::c_int = 225; +pub const NF_IP6_PRI_CONNTRACK_HELPER: ::c_int = 300; +pub const NF_IP6_PRI_LAST: ::c_int = ::INT_MAX; + +// linux/netfilter_ipv6/ip6_tables.h +pub const IP6T_SO_ORIGINAL_DST: ::c_int = 80; + +// linux/netfilter/nf_tables.h +pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256; +pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256; +pub const NFT_SET_MAXNAMELEN: ::c_int = 256; +pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256; +pub const NFT_USERDATA_MAXLEN: ::c_int = 256; + +pub const NFT_REG_VERDICT: ::c_int = 0; +pub const NFT_REG_1: ::c_int = 1; +pub const NFT_REG_2: ::c_int = 2; +pub const NFT_REG_3: ::c_int = 3; +pub const NFT_REG_4: ::c_int = 4; +pub const __NFT_REG_MAX: ::c_int = 5; +pub const NFT_REG32_00: ::c_int = 8; +pub const NFT_REG32_01: ::c_int = 9; +pub const NFT_REG32_02: ::c_int = 10; +pub const NFT_REG32_03: ::c_int = 11; +pub const NFT_REG32_04: ::c_int = 12; +pub const NFT_REG32_05: ::c_int = 13; +pub const NFT_REG32_06: ::c_int = 14; +pub const NFT_REG32_07: ::c_int = 15; +pub const NFT_REG32_08: ::c_int = 16; +pub const NFT_REG32_09: ::c_int = 17; +pub const NFT_REG32_10: ::c_int = 18; +pub const NFT_REG32_11: ::c_int = 19; +pub const NFT_REG32_12: ::c_int = 20; +pub const NFT_REG32_13: ::c_int = 21; +pub const NFT_REG32_14: ::c_int = 22; +pub const NFT_REG32_15: ::c_int = 23; + +pub const NFT_REG_SIZE: ::c_int = 16; +pub const NFT_REG32_SIZE: ::c_int = 4; + +pub const NFT_CONTINUE: ::c_int = -1; +pub const NFT_BREAK: ::c_int = -2; +pub const NFT_JUMP: ::c_int = -3; +pub const NFT_GOTO: ::c_int = -4; +pub const NFT_RETURN: ::c_int = -5; + +pub const NFT_MSG_NEWTABLE: ::c_int = 0; +pub const NFT_MSG_GETTABLE: ::c_int = 1; +pub const NFT_MSG_DELTABLE: ::c_int = 2; +pub const NFT_MSG_NEWCHAIN: ::c_int = 3; +pub const NFT_MSG_GETCHAIN: ::c_int = 4; +pub const NFT_MSG_DELCHAIN: ::c_int = 5; +pub const NFT_MSG_NEWRULE: ::c_int = 6; +pub const NFT_MSG_GETRULE: ::c_int = 7; +pub const NFT_MSG_DELRULE: ::c_int = 8; +pub const NFT_MSG_NEWSET: ::c_int = 9; +pub const NFT_MSG_GETSET: ::c_int = 10; +pub const NFT_MSG_DELSET: ::c_int = 11; +pub const NFT_MSG_NEWSETELEM: ::c_int = 12; +pub const NFT_MSG_GETSETELEM: ::c_int = 13; +pub const NFT_MSG_DELSETELEM: ::c_int = 14; +pub const NFT_MSG_NEWGEN: ::c_int = 15; +pub const NFT_MSG_GETGEN: ::c_int = 16; +pub const NFT_MSG_TRACE: ::c_int = 17; +pub const NFT_MSG_NEWOBJ: ::c_int = 18; +pub const NFT_MSG_GETOBJ: ::c_int = 19; +pub const NFT_MSG_DELOBJ: ::c_int = 20; +pub const NFT_MSG_GETOBJ_RESET: ::c_int = 21; +pub const NFT_MSG_MAX: ::c_int = 25; + +pub const NFT_SET_ANONYMOUS: ::c_int = 0x1; +pub const NFT_SET_CONSTANT: ::c_int = 0x2; +pub const NFT_SET_INTERVAL: ::c_int = 0x4; +pub const NFT_SET_MAP: ::c_int = 0x8; +pub const NFT_SET_TIMEOUT: ::c_int = 0x10; +pub const NFT_SET_EVAL: ::c_int = 0x20; + +pub const NFT_SET_POL_PERFORMANCE: ::c_int = 0; +pub const NFT_SET_POL_MEMORY: ::c_int = 1; + +pub const NFT_SET_ELEM_INTERVAL_END: ::c_int = 0x1; + +pub const NFT_DATA_VALUE: ::c_uint = 0; +pub const NFT_DATA_VERDICT: ::c_uint = 0xffffff00; + +pub const NFT_DATA_RESERVED_MASK: ::c_uint = 0xffffff00; + +pub const NFT_DATA_VALUE_MAXLEN: ::c_int = 64; + +pub const NFT_BYTEORDER_NTOH: ::c_int = 0; +pub const NFT_BYTEORDER_HTON: ::c_int = 1; + +pub const NFT_CMP_EQ: ::c_int = 0; +pub const NFT_CMP_NEQ: ::c_int = 1; +pub const NFT_CMP_LT: ::c_int = 2; +pub const NFT_CMP_LTE: ::c_int = 3; +pub const NFT_CMP_GT: ::c_int = 4; +pub const NFT_CMP_GTE: ::c_int = 5; + +pub const NFT_RANGE_EQ: ::c_int = 0; +pub const NFT_RANGE_NEQ: ::c_int = 1; + +pub const NFT_LOOKUP_F_INV: ::c_int = 1 << 0; + +pub const NFT_DYNSET_OP_ADD: ::c_int = 0; +pub const NFT_DYNSET_OP_UPDATE: ::c_int = 1; + +pub const NFT_DYNSET_F_INV: ::c_int = 1 << 0; + +pub const NFT_PAYLOAD_LL_HEADER: ::c_int = 0; +pub const NFT_PAYLOAD_NETWORK_HEADER: ::c_int = 1; +pub const NFT_PAYLOAD_TRANSPORT_HEADER: ::c_int = 2; + +pub const NFT_PAYLOAD_CSUM_NONE: ::c_int = 0; +pub const NFT_PAYLOAD_CSUM_INET: ::c_int = 1; + +pub const NFT_META_LEN: ::c_int = 0; +pub const NFT_META_PROTOCOL: ::c_int = 1; +pub const NFT_META_PRIORITY: ::c_int = 2; +pub const NFT_META_MARK: ::c_int = 3; +pub const NFT_META_IIF: ::c_int = 4; +pub const NFT_META_OIF: ::c_int = 5; +pub const NFT_META_IIFNAME: ::c_int = 6; +pub const NFT_META_OIFNAME: ::c_int = 7; +pub const NFT_META_IIFTYPE: ::c_int = 8; +pub const NFT_META_OIFTYPE: ::c_int = 9; +pub const NFT_META_SKUID: ::c_int = 10; +pub const NFT_META_SKGID: ::c_int = 11; +pub const NFT_META_NFTRACE: ::c_int = 12; +pub const NFT_META_RTCLASSID: ::c_int = 13; +pub const NFT_META_SECMARK: ::c_int = 14; +pub const NFT_META_NFPROTO: ::c_int = 15; +pub const NFT_META_L4PROTO: ::c_int = 16; +pub const NFT_META_BRI_IIFNAME: ::c_int = 17; +pub const NFT_META_BRI_OIFNAME: ::c_int = 18; +pub const NFT_META_PKTTYPE: ::c_int = 19; +pub const NFT_META_CPU: ::c_int = 20; +pub const NFT_META_IIFGROUP: ::c_int = 21; +pub const NFT_META_OIFGROUP: ::c_int = 22; +pub const NFT_META_CGROUP: ::c_int = 23; +pub const NFT_META_PRANDOM: ::c_int = 24; + +pub const NFT_CT_STATE: ::c_int = 0; +pub const NFT_CT_DIRECTION: ::c_int = 1; +pub const NFT_CT_STATUS: ::c_int = 2; +pub const NFT_CT_MARK: ::c_int = 3; +pub const NFT_CT_SECMARK: ::c_int = 4; +pub const NFT_CT_EXPIRATION: ::c_int = 5; +pub const NFT_CT_HELPER: ::c_int = 6; +pub const NFT_CT_L3PROTOCOL: ::c_int = 7; +pub const NFT_CT_SRC: ::c_int = 8; +pub const NFT_CT_DST: ::c_int = 9; +pub const NFT_CT_PROTOCOL: ::c_int = 10; +pub const NFT_CT_PROTO_SRC: ::c_int = 11; +pub const NFT_CT_PROTO_DST: ::c_int = 12; +pub const NFT_CT_LABELS: ::c_int = 13; +pub const NFT_CT_PKTS: ::c_int = 14; +pub const NFT_CT_BYTES: ::c_int = 15; + +pub const NFT_LIMIT_PKTS: ::c_int = 0; +pub const NFT_LIMIT_PKT_BYTES: ::c_int = 1; + +pub const NFT_LIMIT_F_INV: ::c_int = 1 << 0; + +pub const NFT_QUEUE_FLAG_BYPASS: ::c_int = 0x01; +pub const NFT_QUEUE_FLAG_CPU_FANOUT: ::c_int = 0x02; +pub const NFT_QUEUE_FLAG_MASK: ::c_int = 0x03; + +pub const NFT_QUOTA_F_INV: ::c_int = 1 << 0; + +pub const NFT_REJECT_ICMP_UNREACH: ::c_int = 0; +pub const NFT_REJECT_TCP_RST: ::c_int = 1; +pub const NFT_REJECT_ICMPX_UNREACH: ::c_int = 2; + +pub const NFT_REJECT_ICMPX_NO_ROUTE: ::c_int = 0; +pub const NFT_REJECT_ICMPX_PORT_UNREACH: ::c_int = 1; +pub const NFT_REJECT_ICMPX_HOST_UNREACH: ::c_int = 2; +pub const NFT_REJECT_ICMPX_ADMIN_PROHIBITED: ::c_int = 3; + +pub const NFT_NAT_SNAT: ::c_int = 0; +pub const NFT_NAT_DNAT: ::c_int = 1; + +pub const NFT_TRACETYPE_UNSPEC: ::c_int = 0; +pub const NFT_TRACETYPE_POLICY: ::c_int = 1; +pub const NFT_TRACETYPE_RETURN: ::c_int = 2; +pub const NFT_TRACETYPE_RULE: ::c_int = 3; + +pub const NFT_NG_INCREMENTAL: ::c_int = 0; +pub const NFT_NG_RANDOM: ::c_int = 1; + +// linux/input.h +pub const FF_MAX: ::__u16 = 0x7f; +pub const FF_CNT: usize = FF_MAX as usize + 1; + +// linux/input-event-codes.h +pub const INPUT_PROP_MAX: ::__u16 = 0x1f; +pub const INPUT_PROP_CNT: usize = INPUT_PROP_MAX as usize + 1; +pub const EV_MAX: ::__u16 = 0x1f; +pub const EV_CNT: usize = EV_MAX as usize + 1; +pub const SYN_MAX: ::__u16 = 0xf; +pub const SYN_CNT: usize = SYN_MAX as usize + 1; +pub const KEY_MAX: ::__u16 = 0x2ff; +pub const KEY_CNT: usize = KEY_MAX as usize + 1; +pub const REL_MAX: ::__u16 = 0x0f; +pub const REL_CNT: usize = REL_MAX as usize + 1; +pub const ABS_MAX: ::__u16 = 0x3f; +pub const ABS_CNT: usize = ABS_MAX as usize + 1; +pub const SW_MAX: ::__u16 = 0x0f; +pub const SW_CNT: usize = SW_MAX as usize + 1; +pub const MSC_MAX: ::__u16 = 0x07; +pub const MSC_CNT: usize = MSC_MAX as usize + 1; +pub const LED_MAX: ::__u16 = 0x0f; +pub const LED_CNT: usize = LED_MAX as usize + 1; +pub const REP_MAX: ::__u16 = 0x01; +pub const REP_CNT: usize = REP_MAX as usize + 1; +pub const SND_MAX: ::__u16 = 0x07; +pub const SND_CNT: usize = SND_MAX as usize + 1; + +// linux/uinput.h +pub const UINPUT_VERSION: ::c_uint = 5; +pub const UINPUT_MAX_NAME_SIZE: usize = 80; + +// bionic/libc/kernel/uapi/linux/if_tun.h +pub const IFF_TUN: ::c_int = 0x0001; +pub const IFF_TAP: ::c_int = 0x0002; +pub const IFF_NAPI: ::c_int = 0x0010; +pub const IFF_NAPI_FRAGS: ::c_int = 0x0020; +pub const IFF_NO_PI: ::c_int = 0x1000; +pub const IFF_ONE_QUEUE: ::c_int = 0x2000; +pub const IFF_VNET_HDR: ::c_int = 0x4000; +pub const IFF_TUN_EXCL: ::c_int = 0x8000; +pub const IFF_MULTI_QUEUE: ::c_int = 0x0100; +pub const IFF_ATTACH_QUEUE: ::c_int = 0x0200; +pub const IFF_DETACH_QUEUE: ::c_int = 0x0400; +pub const IFF_PERSIST: ::c_int = 0x0800; +pub const IFF_NOFILTER: ::c_int = 0x1000; + +// start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h +// from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h +pub const ETH_ALEN: ::c_int = 6; +pub const ETH_HLEN: ::c_int = 14; +pub const ETH_ZLEN: ::c_int = 60; +pub const ETH_DATA_LEN: ::c_int = 1500; +pub const ETH_FRAME_LEN: ::c_int = 1514; +pub const ETH_FCS_LEN: ::c_int = 4; +pub const ETH_MIN_MTU: ::c_int = 68; +pub const ETH_MAX_MTU: ::c_int = 0xFFFF; +pub const ETH_P_LOOP: ::c_int = 0x0060; +pub const ETH_P_PUP: ::c_int = 0x0200; +pub const ETH_P_PUPAT: ::c_int = 0x0201; +pub const ETH_P_TSN: ::c_int = 0x22F0; +pub const ETH_P_IP: ::c_int = 0x0800; +pub const ETH_P_X25: ::c_int = 0x0805; +pub const ETH_P_ARP: ::c_int = 0x0806; +pub const ETH_P_BPQ: ::c_int = 0x08FF; +pub const ETH_P_IEEEPUP: ::c_int = 0x0a00; +pub const ETH_P_IEEEPUPAT: ::c_int = 0x0a01; +pub const ETH_P_BATMAN: ::c_int = 0x4305; +pub const ETH_P_DEC: ::c_int = 0x6000; +pub const ETH_P_DNA_DL: ::c_int = 0x6001; +pub const ETH_P_DNA_RC: ::c_int = 0x6002; +pub const ETH_P_DNA_RT: ::c_int = 0x6003; +pub const ETH_P_LAT: ::c_int = 0x6004; +pub const ETH_P_DIAG: ::c_int = 0x6005; +pub const ETH_P_CUST: ::c_int = 0x6006; +pub const ETH_P_SCA: ::c_int = 0x6007; +pub const ETH_P_TEB: ::c_int = 0x6558; +pub const ETH_P_RARP: ::c_int = 0x8035; +pub const ETH_P_ATALK: ::c_int = 0x809B; +pub const ETH_P_AARP: ::c_int = 0x80F3; +pub const ETH_P_8021Q: ::c_int = 0x8100; +/* see rust-lang/libc#924 pub const ETH_P_ERSPAN: ::c_int = 0x88BE;*/ +pub const ETH_P_IPX: ::c_int = 0x8137; +pub const ETH_P_IPV6: ::c_int = 0x86DD; +pub const ETH_P_PAUSE: ::c_int = 0x8808; +pub const ETH_P_SLOW: ::c_int = 0x8809; +pub const ETH_P_WCCP: ::c_int = 0x883E; +pub const ETH_P_MPLS_UC: ::c_int = 0x8847; +pub const ETH_P_MPLS_MC: ::c_int = 0x8848; +pub const ETH_P_ATMMPOA: ::c_int = 0x884c; +pub const ETH_P_PPP_DISC: ::c_int = 0x8863; +pub const ETH_P_PPP_SES: ::c_int = 0x8864; +pub const ETH_P_LINK_CTL: ::c_int = 0x886c; +pub const ETH_P_ATMFATE: ::c_int = 0x8884; +pub const ETH_P_PAE: ::c_int = 0x888E; +pub const ETH_P_AOE: ::c_int = 0x88A2; +pub const ETH_P_8021AD: ::c_int = 0x88A8; +pub const ETH_P_802_EX1: ::c_int = 0x88B5; +pub const ETH_P_TIPC: ::c_int = 0x88CA; +pub const ETH_P_MACSEC: ::c_int = 0x88E5; +pub const ETH_P_8021AH: ::c_int = 0x88E7; +pub const ETH_P_MVRP: ::c_int = 0x88F5; +pub const ETH_P_1588: ::c_int = 0x88F7; +pub const ETH_P_NCSI: ::c_int = 0x88F8; +pub const ETH_P_PRP: ::c_int = 0x88FB; +pub const ETH_P_FCOE: ::c_int = 0x8906; +/* see rust-lang/libc#924 pub const ETH_P_IBOE: ::c_int = 0x8915;*/ +pub const ETH_P_TDLS: ::c_int = 0x890D; +pub const ETH_P_FIP: ::c_int = 0x8914; +pub const ETH_P_80221: ::c_int = 0x8917; +pub const ETH_P_HSR: ::c_int = 0x892F; +/* see rust-lang/libc#924 pub const ETH_P_NSH: ::c_int = 0x894F;*/ +pub const ETH_P_LOOPBACK: ::c_int = 0x9000; +pub const ETH_P_QINQ1: ::c_int = 0x9100; +pub const ETH_P_QINQ2: ::c_int = 0x9200; +pub const ETH_P_QINQ3: ::c_int = 0x9300; +pub const ETH_P_EDSA: ::c_int = 0xDADA; +/* see rust-lang/libc#924 pub const ETH_P_IFE: ::c_int = 0xED3E;*/ +pub const ETH_P_AF_IUCV: ::c_int = 0xFBFB; +pub const ETH_P_802_3_MIN: ::c_int = 0x0600; +pub const ETH_P_802_3: ::c_int = 0x0001; +pub const ETH_P_AX25: ::c_int = 0x0002; +pub const ETH_P_ALL: ::c_int = 0x0003; +pub const ETH_P_802_2: ::c_int = 0x0004; +pub const ETH_P_SNAP: ::c_int = 0x0005; +pub const ETH_P_DDCMP: ::c_int = 0x0006; +pub const ETH_P_WAN_PPP: ::c_int = 0x0007; +pub const ETH_P_PPP_MP: ::c_int = 0x0008; +pub const ETH_P_LOCALTALK: ::c_int = 0x0009; +pub const ETH_P_CAN: ::c_int = 0x000C; +pub const ETH_P_CANFD: ::c_int = 0x000D; +pub const ETH_P_PPPTALK: ::c_int = 0x0010; +pub const ETH_P_TR_802_2: ::c_int = 0x0011; +pub const ETH_P_MOBITEX: ::c_int = 0x0015; +pub const ETH_P_CONTROL: ::c_int = 0x0016; +pub const ETH_P_IRDA: ::c_int = 0x0017; +pub const ETH_P_ECONET: ::c_int = 0x0018; +pub const ETH_P_HDLC: ::c_int = 0x0019; +pub const ETH_P_ARCNET: ::c_int = 0x001A; +pub const ETH_P_DSA: ::c_int = 0x001B; +pub const ETH_P_TRAILER: ::c_int = 0x001C; +pub const ETH_P_PHONET: ::c_int = 0x00F5; +pub const ETH_P_IEEE802154: ::c_int = 0x00F6; +pub const ETH_P_CAIF: ::c_int = 0x00F7; +pub const ETH_P_XDSA: ::c_int = 0x00F8; +/* see rust-lang/libc#924 pub const ETH_P_MAP: ::c_int = 0x00F9;*/ +// end android/platform/bionic/libc/kernel/uapi/linux/if_ether.h + +pub const SIOCADDRT: ::c_ulong = 0x0000890B; +pub const SIOCDELRT: ::c_ulong = 0x0000890C; +pub const SIOCGIFNAME: ::c_ulong = 0x00008910; +pub const SIOCSIFLINK: ::c_ulong = 0x00008911; +pub const SIOCGIFCONF: ::c_ulong = 0x00008912; +pub const SIOCGIFFLAGS: ::c_ulong = 0x00008913; +pub const SIOCSIFFLAGS: ::c_ulong = 0x00008914; +pub const SIOCGIFADDR: ::c_ulong = 0x00008915; +pub const SIOCSIFADDR: ::c_ulong = 0x00008916; +pub const SIOCGIFDSTADDR: ::c_ulong = 0x00008917; +pub const SIOCSIFDSTADDR: ::c_ulong = 0x00008918; +pub const SIOCGIFBRDADDR: ::c_ulong = 0x00008919; +pub const SIOCSIFBRDADDR: ::c_ulong = 0x0000891A; +pub const SIOCGIFNETMASK: ::c_ulong = 0x0000891B; +pub const SIOCSIFNETMASK: ::c_ulong = 0x0000891C; +pub const SIOCGIFMETRIC: ::c_ulong = 0x0000891D; +pub const SIOCSIFMETRIC: ::c_ulong = 0x0000891E; +pub const SIOCGIFMEM: ::c_ulong = 0x0000891F; +pub const SIOCSIFMEM: ::c_ulong = 0x00008920; +pub const SIOCGIFMTU: ::c_ulong = 0x00008921; +pub const SIOCSIFMTU: ::c_ulong = 0x00008922; +pub const SIOCSIFHWADDR: ::c_ulong = 0x00008924; +pub const SIOCGIFENCAP: ::c_ulong = 0x00008925; +pub const SIOCSIFENCAP: ::c_ulong = 0x00008926; +pub const SIOCGIFHWADDR: ::c_ulong = 0x00008927; +pub const SIOCGIFSLAVE: ::c_ulong = 0x00008929; +pub const SIOCSIFSLAVE: ::c_ulong = 0x00008930; +pub const SIOCADDMULTI: ::c_ulong = 0x00008931; +pub const SIOCDELMULTI: ::c_ulong = 0x00008932; +pub const SIOCDARP: ::c_ulong = 0x00008953; +pub const SIOCGARP: ::c_ulong = 0x00008954; +pub const SIOCSARP: ::c_ulong = 0x00008955; +pub const SIOCDRARP: ::c_ulong = 0x00008960; +pub const SIOCGRARP: ::c_ulong = 0x00008961; +pub const SIOCSRARP: ::c_ulong = 0x00008962; +pub const SIOCGIFMAP: ::c_ulong = 0x00008970; +pub const SIOCSIFMAP: ::c_ulong = 0x00008971; + +// linux/module.h +pub const MODULE_INIT_IGNORE_MODVERSIONS: ::c_uint = 0x0001; +pub const MODULE_INIT_IGNORE_VERMAGIC: ::c_uint = 0x0002; + +// linux/net_tstamp.h +pub const SOF_TIMESTAMPING_TX_HARDWARE: ::c_uint = 1 << 0; +pub const SOF_TIMESTAMPING_TX_SOFTWARE: ::c_uint = 1 << 1; +pub const SOF_TIMESTAMPING_RX_HARDWARE: ::c_uint = 1 << 2; +pub const SOF_TIMESTAMPING_RX_SOFTWARE: ::c_uint = 1 << 3; +pub const SOF_TIMESTAMPING_SOFTWARE: ::c_uint = 1 << 4; +pub const SOF_TIMESTAMPING_SYS_HARDWARE: ::c_uint = 1 << 5; +pub const SOF_TIMESTAMPING_RAW_HARDWARE: ::c_uint = 1 << 6; +pub const SOF_TIMESTAMPING_OPT_ID: ::c_uint = 1 << 7; +pub const SOF_TIMESTAMPING_TX_SCHED: ::c_uint = 1 << 8; +pub const SOF_TIMESTAMPING_TX_ACK: ::c_uint = 1 << 9; +pub const SOF_TIMESTAMPING_OPT_CMSG: ::c_uint = 1 << 10; +pub const SOF_TIMESTAMPING_OPT_TSONLY: ::c_uint = 1 << 11; +pub const SOF_TIMESTAMPING_OPT_STATS: ::c_uint = 1 << 12; +pub const SOF_TIMESTAMPING_OPT_PKTINFO: ::c_uint = 1 << 13; +pub const SOF_TIMESTAMPING_OPT_TX_SWHW: ::c_uint = 1 << 14; + +#[deprecated( + since = "0.2.55", + note = "ENOATTR is not available on Android; use ENODATA instead" +)] +pub const ENOATTR: ::c_int = ::ENODATA; + +// linux/if_alg.h +pub const ALG_SET_KEY: ::c_int = 1; +pub const ALG_SET_IV: ::c_int = 2; +pub const ALG_SET_OP: ::c_int = 3; +pub const ALG_SET_AEAD_ASSOCLEN: ::c_int = 4; +pub const ALG_SET_AEAD_AUTHSIZE: ::c_int = 5; + +pub const ALG_OP_DECRYPT: ::c_int = 0; +pub const ALG_OP_ENCRYPT: ::c_int = 1; + +// sys/mman.h +pub const MLOCK_ONFAULT: ::c_int = 0x01; + +// uapi/linux/vm_sockets.h +pub const VMADDR_CID_ANY: ::c_uint = 0xFFFFFFFF; +pub const VMADDR_CID_HYPERVISOR: ::c_uint = 0; +pub const VMADDR_CID_LOCAL: ::c_uint = 1; +pub const VMADDR_CID_HOST: ::c_uint = 2; +pub const VMADDR_PORT_ANY: ::c_uint = 0xFFFFFFFF; + +// uapi/linux/inotify.h +pub const IN_ACCESS: u32 = 0x0000_0001; +pub const IN_MODIFY: u32 = 0x0000_0002; +pub const IN_ATTRIB: u32 = 0x0000_0004; +pub const IN_CLOSE_WRITE: u32 = 0x0000_0008; +pub const IN_CLOSE_NOWRITE: u32 = 0x0000_0010; +pub const IN_CLOSE: u32 = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE; +pub const IN_OPEN: u32 = 0x0000_0020; +pub const IN_MOVED_FROM: u32 = 0x0000_0040; +pub const IN_MOVED_TO: u32 = 0x0000_0080; +pub const IN_MOVE: u32 = IN_MOVED_FROM | IN_MOVED_TO; +pub const IN_CREATE: u32 = 0x0000_0100; +pub const IN_DELETE: u32 = 0x0000_0200; +pub const IN_DELETE_SELF: u32 = 0x0000_0400; +pub const IN_MOVE_SELF: u32 = 0x0000_0800; +pub const IN_UNMOUNT: u32 = 0x0000_2000; +pub const IN_Q_OVERFLOW: u32 = 0x0000_4000; +pub const IN_IGNORED: u32 = 0x0000_8000; +pub const IN_ONLYDIR: u32 = 0x0100_0000; +pub const IN_DONT_FOLLOW: u32 = 0x0200_0000; +pub const IN_EXCL_UNLINK: u32 = 0x0400_0000; + +pub const IN_MASK_CREATE: u32 = 0x1000_0000; +pub const IN_MASK_ADD: u32 = 0x2000_0000; +pub const IN_ISDIR: u32 = 0x4000_0000; +pub const IN_ONESHOT: u32 = 0x8000_0000; + +pub const IN_ALL_EVENTS: u32 = IN_ACCESS + | IN_MODIFY + | IN_ATTRIB + | IN_CLOSE_WRITE + | IN_CLOSE_NOWRITE + | IN_OPEN + | IN_MOVED_FROM + | IN_MOVED_TO + | IN_DELETE + | IN_CREATE + | IN_DELETE_SELF + | IN_MOVE_SELF; + +pub const IN_CLOEXEC: ::c_int = O_CLOEXEC; +pub const IN_NONBLOCK: ::c_int = O_NONBLOCK; + +pub const FUTEX_WAIT: ::c_int = 0; +pub const FUTEX_WAKE: ::c_int = 1; +pub const FUTEX_FD: ::c_int = 2; +pub const FUTEX_REQUEUE: ::c_int = 3; +pub const FUTEX_CMP_REQUEUE: ::c_int = 4; +pub const FUTEX_WAKE_OP: ::c_int = 5; +pub const FUTEX_LOCK_PI: ::c_int = 6; +pub const FUTEX_UNLOCK_PI: ::c_int = 7; +pub const FUTEX_TRYLOCK_PI: ::c_int = 8; +pub const FUTEX_WAIT_BITSET: ::c_int = 9; +pub const FUTEX_WAKE_BITSET: ::c_int = 10; +pub const FUTEX_WAIT_REQUEUE_PI: ::c_int = 11; +pub const FUTEX_CMP_REQUEUE_PI: ::c_int = 12; + +pub const FUTEX_PRIVATE_FLAG: ::c_int = 128; +pub const FUTEX_CLOCK_REALTIME: ::c_int = 256; +pub const FUTEX_CMD_MASK: ::c_int = !(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME); + +// linux/errqueue.h +pub const SO_EE_ORIGIN_NONE: u8 = 0; +pub const SO_EE_ORIGIN_LOCAL: u8 = 1; +pub const SO_EE_ORIGIN_ICMP: u8 = 2; +pub const SO_EE_ORIGIN_ICMP6: u8 = 3; +pub const SO_EE_ORIGIN_TXSTATUS: u8 = 4; +pub const SO_EE_ORIGIN_TIMESTAMPING: u8 = SO_EE_ORIGIN_TXSTATUS; + +// errno.h +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EWOULDBLOCK: ::c_int = EAGAIN; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +// linux/sched.h +pub const SCHED_NORMAL: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_BATCH: ::c_int = 3; +pub const SCHED_IDLE: ::c_int = 5; +pub const SCHED_DEADLINE: ::c_int = 6; + +pub const SCHED_RESET_ON_FORK: ::c_int = 0x40000000; + +pub const CLONE_PIDFD: ::c_int = 0x1000; + +// linux/membarrier.h +pub const MEMBARRIER_CMD_QUERY: ::c_int = 0; +pub const MEMBARRIER_CMD_GLOBAL: ::c_int = 1 << 0; +pub const MEMBARRIER_CMD_GLOBAL_EXPEDITED: ::c_int = 1 << 1; +pub const MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED: ::c_int = 1 << 2; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED: ::c_int = 1 << 3; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED: ::c_int = 1 << 4; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE: ::c_int = 1 << 5; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE: ::c_int = 1 << 6; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ: ::c_int = 1 << 7; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ: ::c_int = 1 << 8; + +// linux/mempolicy.h +pub const MPOL_DEFAULT: ::c_int = 0; +pub const MPOL_PREFERRED: ::c_int = 1; +pub const MPOL_BIND: ::c_int = 2; +pub const MPOL_INTERLEAVE: ::c_int = 3; +pub const MPOL_LOCAL: ::c_int = 4; +pub const MPOL_F_NUMA_BALANCING: ::c_int = 1 << 13; +pub const MPOL_F_RELATIVE_NODES: ::c_int = 1 << 14; +pub const MPOL_F_STATIC_NODES: ::c_int = 1 << 15; + +// bits/seek_constants.h +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; + +// sys/socket.h +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; + +pub const SOMAXCONN: ::c_int = 128; + +// sys/prctl.h +pub const PR_SET_PDEATHSIG: ::c_int = 1; +pub const PR_GET_PDEATHSIG: ::c_int = 2; +pub const PR_GET_SECUREBITS: ::c_int = 27; +pub const PR_SET_SECUREBITS: ::c_int = 28; + +// sys/system_properties.h +pub const PROP_VALUE_MAX: ::c_int = 92; +pub const PROP_NAME_MAX: ::c_int = 32; + +// sys/prctl.h +pub const PR_SET_VMA: ::c_int = 0x53564d41; +pub const PR_SET_VMA_ANON_NAME: ::c_int = 0; +pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; +pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; +pub const PR_GET_SECCOMP: ::c_int = 21; +pub const PR_SET_SECCOMP: ::c_int = 22; +pub const PR_GET_TIMING: ::c_int = 13; +pub const PR_SET_TIMING: ::c_int = 14; +pub const PR_TIMING_STATISTICAL: ::c_int = 0; +pub const PR_TIMING_TIMESTAMP: ::c_int = 1; + +// linux/if_addr.h +pub const IFA_UNSPEC: ::c_ushort = 0; +pub const IFA_ADDRESS: ::c_ushort = 1; +pub const IFA_LOCAL: ::c_ushort = 2; +pub const IFA_LABEL: ::c_ushort = 3; +pub const IFA_BROADCAST: ::c_ushort = 4; +pub const IFA_ANYCAST: ::c_ushort = 5; +pub const IFA_CACHEINFO: ::c_ushort = 6; +pub const IFA_MULTICAST: ::c_ushort = 7; + +pub const IFA_F_SECONDARY: u32 = 0x01; +pub const IFA_F_TEMPORARY: u32 = 0x01; +pub const IFA_F_NODAD: u32 = 0x02; +pub const IFA_F_OPTIMISTIC: u32 = 0x04; +pub const IFA_F_DADFAILED: u32 = 0x08; +pub const IFA_F_HOMEADDRESS: u32 = 0x10; +pub const IFA_F_DEPRECATED: u32 = 0x20; +pub const IFA_F_TENTATIVE: u32 = 0x40; +pub const IFA_F_PERMANENT: u32 = 0x80; + +// linux/if_link.h +pub const IFLA_UNSPEC: ::c_ushort = 0; +pub const IFLA_ADDRESS: ::c_ushort = 1; +pub const IFLA_BROADCAST: ::c_ushort = 2; +pub const IFLA_IFNAME: ::c_ushort = 3; +pub const IFLA_MTU: ::c_ushort = 4; +pub const IFLA_LINK: ::c_ushort = 5; +pub const IFLA_QDISC: ::c_ushort = 6; +pub const IFLA_STATS: ::c_ushort = 7; +pub const IFLA_COST: ::c_ushort = 8; +pub const IFLA_PRIORITY: ::c_ushort = 9; +pub const IFLA_MASTER: ::c_ushort = 10; +pub const IFLA_WIRELESS: ::c_ushort = 11; +pub const IFLA_PROTINFO: ::c_ushort = 12; +pub const IFLA_TXQLEN: ::c_ushort = 13; +pub const IFLA_MAP: ::c_ushort = 14; +pub const IFLA_WEIGHT: ::c_ushort = 15; +pub const IFLA_OPERSTATE: ::c_ushort = 16; +pub const IFLA_LINKMODE: ::c_ushort = 17; +pub const IFLA_LINKINFO: ::c_ushort = 18; +pub const IFLA_NET_NS_PID: ::c_ushort = 19; +pub const IFLA_IFALIAS: ::c_ushort = 20; +pub const IFLA_NUM_VF: ::c_ushort = 21; +pub const IFLA_VFINFO_LIST: ::c_ushort = 22; +pub const IFLA_STATS64: ::c_ushort = 23; +pub const IFLA_VF_PORTS: ::c_ushort = 24; +pub const IFLA_PORT_SELF: ::c_ushort = 25; +pub const IFLA_AF_SPEC: ::c_ushort = 26; +pub const IFLA_GROUP: ::c_ushort = 27; +pub const IFLA_NET_NS_FD: ::c_ushort = 28; +pub const IFLA_EXT_MASK: ::c_ushort = 29; +pub const IFLA_PROMISCUITY: ::c_ushort = 30; +pub const IFLA_NUM_TX_QUEUES: ::c_ushort = 31; +pub const IFLA_NUM_RX_QUEUES: ::c_ushort = 32; +pub const IFLA_CARRIER: ::c_ushort = 33; +pub const IFLA_PHYS_PORT_ID: ::c_ushort = 34; +pub const IFLA_CARRIER_CHANGES: ::c_ushort = 35; +pub const IFLA_PHYS_SWITCH_ID: ::c_ushort = 36; +pub const IFLA_LINK_NETNSID: ::c_ushort = 37; +pub const IFLA_PHYS_PORT_NAME: ::c_ushort = 38; +pub const IFLA_PROTO_DOWN: ::c_ushort = 39; +pub const IFLA_GSO_MAX_SEGS: ::c_ushort = 40; +pub const IFLA_GSO_MAX_SIZE: ::c_ushort = 41; +pub const IFLA_PAD: ::c_ushort = 42; +pub const IFLA_XDP: ::c_ushort = 43; +pub const IFLA_EVENT: ::c_ushort = 44; +pub const IFLA_NEW_NETNSID: ::c_ushort = 45; +pub const IFLA_IF_NETNSID: ::c_ushort = 46; +pub const IFLA_TARGET_NETNSID: ::c_ushort = IFLA_IF_NETNSID; +pub const IFLA_CARRIER_UP_COUNT: ::c_ushort = 47; +pub const IFLA_CARRIER_DOWN_COUNT: ::c_ushort = 48; +pub const IFLA_NEW_IFINDEX: ::c_ushort = 49; +pub const IFLA_MIN_MTU: ::c_ushort = 50; +pub const IFLA_MAX_MTU: ::c_ushort = 51; + +pub const IFLA_INFO_UNSPEC: ::c_ushort = 0; +pub const IFLA_INFO_KIND: ::c_ushort = 1; +pub const IFLA_INFO_DATA: ::c_ushort = 2; +pub const IFLA_INFO_XSTATS: ::c_ushort = 3; +pub const IFLA_INFO_SLAVE_KIND: ::c_ushort = 4; +pub const IFLA_INFO_SLAVE_DATA: ::c_ushort = 5; + +// linux/rtnetlink.h +pub const TCA_UNSPEC: ::c_ushort = 0; +pub const TCA_KIND: ::c_ushort = 1; +pub const TCA_OPTIONS: ::c_ushort = 2; +pub const TCA_STATS: ::c_ushort = 3; +pub const TCA_XSTATS: ::c_ushort = 4; +pub const TCA_RATE: ::c_ushort = 5; +pub const TCA_FCNT: ::c_ushort = 6; +pub const TCA_STATS2: ::c_ushort = 7; +pub const TCA_STAB: ::c_ushort = 8; + +pub const RTM_NEWLINK: u16 = 16; +pub const RTM_DELLINK: u16 = 17; +pub const RTM_GETLINK: u16 = 18; +pub const RTM_SETLINK: u16 = 19; +pub const RTM_NEWADDR: u16 = 20; +pub const RTM_DELADDR: u16 = 21; +pub const RTM_GETADDR: u16 = 22; +pub const RTM_NEWROUTE: u16 = 24; +pub const RTM_DELROUTE: u16 = 25; +pub const RTM_GETROUTE: u16 = 26; +pub const RTM_NEWNEIGH: u16 = 28; +pub const RTM_DELNEIGH: u16 = 29; +pub const RTM_GETNEIGH: u16 = 30; +pub const RTM_NEWRULE: u16 = 32; +pub const RTM_DELRULE: u16 = 33; +pub const RTM_GETRULE: u16 = 34; +pub const RTM_NEWQDISC: u16 = 36; +pub const RTM_DELQDISC: u16 = 37; +pub const RTM_GETQDISC: u16 = 38; +pub const RTM_NEWTCLASS: u16 = 40; +pub const RTM_DELTCLASS: u16 = 41; +pub const RTM_GETTCLASS: u16 = 42; +pub const RTM_NEWTFILTER: u16 = 44; +pub const RTM_DELTFILTER: u16 = 45; +pub const RTM_GETTFILTER: u16 = 46; +pub const RTM_NEWACTION: u16 = 48; +pub const RTM_DELACTION: u16 = 49; +pub const RTM_GETACTION: u16 = 50; +pub const RTM_NEWPREFIX: u16 = 52; +pub const RTM_GETMULTICAST: u16 = 58; +pub const RTM_GETANYCAST: u16 = 62; +pub const RTM_NEWNEIGHTBL: u16 = 64; +pub const RTM_GETNEIGHTBL: u16 = 66; +pub const RTM_SETNEIGHTBL: u16 = 67; +pub const RTM_NEWNDUSEROPT: u16 = 68; +pub const RTM_NEWADDRLABEL: u16 = 72; +pub const RTM_DELADDRLABEL: u16 = 73; +pub const RTM_GETADDRLABEL: u16 = 74; +pub const RTM_GETDCB: u16 = 78; +pub const RTM_SETDCB: u16 = 79; +pub const RTM_NEWNETCONF: u16 = 80; +pub const RTM_GETNETCONF: u16 = 82; +pub const RTM_NEWMDB: u16 = 84; +pub const RTM_DELMDB: u16 = 85; +pub const RTM_GETMDB: u16 = 86; +pub const RTM_NEWNSID: u16 = 88; +pub const RTM_DELNSID: u16 = 89; +pub const RTM_GETNSID: u16 = 90; + +pub const RTM_F_NOTIFY: ::c_uint = 0x100; +pub const RTM_F_CLONED: ::c_uint = 0x200; +pub const RTM_F_EQUALIZE: ::c_uint = 0x400; +pub const RTM_F_PREFIX: ::c_uint = 0x800; + +pub const RTA_UNSPEC: ::c_ushort = 0; +pub const RTA_DST: ::c_ushort = 1; +pub const RTA_SRC: ::c_ushort = 2; +pub const RTA_IIF: ::c_ushort = 3; +pub const RTA_OIF: ::c_ushort = 4; +pub const RTA_GATEWAY: ::c_ushort = 5; +pub const RTA_PRIORITY: ::c_ushort = 6; +pub const RTA_PREFSRC: ::c_ushort = 7; +pub const RTA_METRICS: ::c_ushort = 8; +pub const RTA_MULTIPATH: ::c_ushort = 9; +pub const RTA_PROTOINFO: ::c_ushort = 10; // No longer used +pub const RTA_FLOW: ::c_ushort = 11; +pub const RTA_CACHEINFO: ::c_ushort = 12; +pub const RTA_SESSION: ::c_ushort = 13; // No longer used +pub const RTA_MP_ALGO: ::c_ushort = 14; // No longer used +pub const RTA_TABLE: ::c_ushort = 15; +pub const RTA_MARK: ::c_ushort = 16; +pub const RTA_MFC_STATS: ::c_ushort = 17; + +pub const RTN_UNSPEC: ::c_uchar = 0; +pub const RTN_UNICAST: ::c_uchar = 1; +pub const RTN_LOCAL: ::c_uchar = 2; +pub const RTN_BROADCAST: ::c_uchar = 3; +pub const RTN_ANYCAST: ::c_uchar = 4; +pub const RTN_MULTICAST: ::c_uchar = 5; +pub const RTN_BLACKHOLE: ::c_uchar = 6; +pub const RTN_UNREACHABLE: ::c_uchar = 7; +pub const RTN_PROHIBIT: ::c_uchar = 8; +pub const RTN_THROW: ::c_uchar = 9; +pub const RTN_NAT: ::c_uchar = 10; +pub const RTN_XRESOLVE: ::c_uchar = 11; + +pub const RTPROT_UNSPEC: ::c_uchar = 0; +pub const RTPROT_REDIRECT: ::c_uchar = 1; +pub const RTPROT_KERNEL: ::c_uchar = 2; +pub const RTPROT_BOOT: ::c_uchar = 3; +pub const RTPROT_STATIC: ::c_uchar = 4; + +pub const RT_SCOPE_UNIVERSE: ::c_uchar = 0; +pub const RT_SCOPE_SITE: ::c_uchar = 200; +pub const RT_SCOPE_LINK: ::c_uchar = 253; +pub const RT_SCOPE_HOST: ::c_uchar = 254; +pub const RT_SCOPE_NOWHERE: ::c_uchar = 255; + +pub const RT_TABLE_UNSPEC: ::c_uchar = 0; +pub const RT_TABLE_COMPAT: ::c_uchar = 252; +pub const RT_TABLE_DEFAULT: ::c_uchar = 253; +pub const RT_TABLE_MAIN: ::c_uchar = 254; +pub const RT_TABLE_LOCAL: ::c_uchar = 255; + +pub const RTMSG_NEWDEVICE: u32 = 0x11; +pub const RTMSG_DELDEVICE: u32 = 0x12; +pub const RTMSG_NEWROUTE: u32 = 0x21; +pub const RTMSG_DELROUTE: u32 = 0x22; + +// Most `*_SUPER_MAGIC` constants are defined at the `linux_like` level; the +// following are only available on newer Linux versions than the versions +// currently used in CI in some configurations, so we define them here. +cfg_if! { + if #[cfg(not(target_arch = "s390x"))] { + pub const XFS_SUPER_MAGIC: ::c_long = 0x58465342; + } else if #[cfg(target_arch = "s390x")] { + pub const XFS_SUPER_MAGIC: ::c_uint = 0x58465342; + } +} + +f! { + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + let next = (cmsg as usize + + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut cmsghdr; + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if (next.offset(1)) as usize > max { + 0 as *mut cmsghdr + } else { + next as *mut cmsghdr + } + } + + pub fn CPU_ALLOC_SIZE(count: ::c_int) -> ::size_t { + let _dummy: cpu_set_t = ::mem::zeroed(); + let size_in_bits = 8 * ::mem::size_of_val(&_dummy.__bits[0]); + ((count as ::size_t + size_in_bits - 1) / 8) as ::size_t + } + + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.__bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.__bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.__bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.__bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.__bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in_bits = 8 * ::mem::size_of_val(&cpuset.__bits[0]); + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + 0 != (cpuset.__bits[idx] & (1 << offset)) + } + + pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> ::c_int { + let mut s: u32 = 0; + let size_of_mask = ::mem::size_of_val(&cpuset.__bits[0]); + for i in cpuset.__bits[..(size / size_of_mask)].iter() { + s += i.count_ones(); + }; + s as ::c_int + } + + pub fn CPU_COUNT(cpuset: &cpu_set_t) -> ::c_int { + CPU_COUNT_S(::mem::size_of::(), cpuset) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.__bits == set2.__bits + } + + pub fn major(dev: ::dev_t) -> ::c_int { + ((dev >> 8) & 0xfff) as ::c_int + } + pub fn minor(dev: ::dev_t) -> ::c_int { + ((dev & 0xff) | ((dev >> 12) & 0xfff00)) as ::c_int + } + pub fn NLA_ALIGN(len: ::c_int) -> ::c_int { + return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1) + } + + pub fn SO_EE_OFFENDER(ee: *const ::sock_extended_err) -> *mut ::sockaddr { + ee.offset(1) as *mut ::sockaddr + } +} + +safe_f! { + pub {const} fn makedev(ma: ::c_uint, mi: ::c_uint) -> ::dev_t { + let ma = ma as ::dev_t; + let mi = mi as ::dev_t; + ((ma & 0xfff) << 8) | (mi & 0xff) | ((mi & 0xfff00) << 12) + } + +} + +extern "C" { + pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; + pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn prlimit( + pid: ::pid_t, + resource: ::c_int, + new_limit: *const ::rlimit, + old_limit: *mut ::rlimit, + ) -> ::c_int; + pub fn prlimit64( + pid: ::pid_t, + resource: ::c_int, + new_limit: *const ::rlimit64, + old_limit: *mut ::rlimit64, + ) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn mlock2(addr: *const ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::size_t, + serv: *mut ::c_char, + sevlen: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, count: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, count: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn process_vm_readv( + pid: ::pid_t, + local_iov: *const ::iovec, + local_iov_count: ::c_ulong, + remote_iov: *const ::iovec, + remote_iov_count: ::c_ulong, + flags: ::c_ulong, + ) -> ::ssize_t; + pub fn process_vm_writev( + pid: ::pid_t, + local_iov: *const ::iovec, + local_iov_count: ::c_ulong, + remote_iov: *const ::iovec, + remote_iov_count: ::c_ulong, + flags: ::c_ulong, + ) -> ::ssize_t; + pub fn ptrace(request: ::c_int, ...) -> ::c_long; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + pub fn __sched_cpualloc(count: ::size_t) -> *mut ::cpu_set_t; + pub fn __sched_cpufree(set: *mut ::cpu_set_t); + pub fn __sched_cpucount(setsize: ::size_t, set: *const cpu_set_t) -> ::c_int; + pub fn sched_getcpu() -> ::c_int; + pub fn mallinfo() -> ::mallinfo; + // available from API 23 + pub fn malloc_info(options: ::c_int, stream: *mut ::FILE) -> ::c_int; + + pub fn malloc_usable_size(ptr: *const ::c_void) -> ::size_t; + + pub fn utmpname(name: *const ::c_char) -> ::c_int; + pub fn setutent(); + pub fn getutent() -> *mut utmp; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn fallocate(fd: ::c_int, mode: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn fallocate64(fd: ::c_int, mode: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fallocate64(fd: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; + pub fn getxattr( + path: *const c_char, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn lgetxattr( + path: *const c_char, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn fgetxattr( + filedes: ::c_int, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn setxattr( + path: *const c_char, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn lsetxattr( + path: *const c_char, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn fsetxattr( + filedes: ::c_int, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn listxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn llistxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn flistxattr(filedes: ::c_int, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; + pub fn signalfd(fd: ::c_int, mask: *const ::sigset_t, flags: ::c_int) -> ::c_int; + pub fn timerfd_create(clock: ::clockid_t, flags: ::c_int) -> ::c_int; + pub fn timerfd_gettime(fd: ::c_int, current_value: *mut itimerspec) -> ::c_int; + pub fn timerfd_settime( + fd: ::c_int, + flags: ::c_int, + new_value: *const itimerspec, + old_value: *mut itimerspec, + ) -> ::c_int; + pub fn syscall(num: ::c_long, ...) -> ::c_long; + pub fn sched_getaffinity(pid: ::pid_t, cpusetsize: ::size_t, cpuset: *mut cpu_set_t) + -> ::c_int; + pub fn sched_setaffinity( + pid: ::pid_t, + cpusetsize: ::size_t, + cpuset: *const cpu_set_t, + ) -> ::c_int; + pub fn epoll_create(size: ::c_int) -> ::c_int; + pub fn epoll_create1(flags: ::c_int) -> ::c_int; + pub fn epoll_wait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + ) -> ::c_int; + pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) + -> ::c_int; + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn unshare(flags: ::c_int) -> ::c_int; + pub fn umount(target: *const ::c_char) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn tee(fd_in: ::c_int, fd_out: ::c_int, len: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn splice( + fd_in: ::c_int, + off_in: *mut ::loff_t, + fd_out: ::c_int, + off_out: *mut ::loff_t, + len: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int; + pub fn swapoff(puath: *const ::c_char) -> ::c_int; + pub fn vmsplice( + fd: ::c_int, + iov: *const ::iovec, + nr_segs: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn mount( + src: *const ::c_char, + target: *const ::c_char, + fstype: *const ::c_char, + flags: ::c_ulong, + data: *const ::c_void, + ) -> ::c_int; + pub fn personality(persona: ::c_uint) -> ::c_int; + pub fn prctl(option: ::c_int, ...) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; + pub fn ppoll( + fds: *mut ::pollfd, + nfds: nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_barrierattr_init(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_destroy(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_getpshared( + attr: *const ::pthread_barrierattr_t, + shared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_barrierattr_setpshared( + attr: *mut ::pthread_barrierattr_t, + shared: ::c_int, + ) -> ::c_int; + pub fn pthread_barrier_init( + barrier: *mut pthread_barrier_t, + attr: *const ::pthread_barrierattr_t, + count: ::c_uint, + ) -> ::c_int; + pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_spin_init(lock: *mut ::pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn clone( + cb: extern "C" fn(*mut ::c_void) -> ::c_int, + child_stack: *mut ::c_void, + flags: ::c_int, + arg: *mut ::c_void, + ... + ) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn sysinfo(info: *mut ::sysinfo) -> ::c_int; + pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn swapon(path: *const ::c_char, swapflags: ::c_int) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sendfile( + out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut ::off_t, + count: ::size_t, + ) -> ::ssize_t; + pub fn sendfile64( + out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut ::off64_t, + count: ::size_t, + ) -> ::ssize_t; + pub fn setfsgid(gid: ::gid_t) -> ::c_int; + pub fn setfsuid(uid: ::uid_t) -> ::c_int; + pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn getgrouplist( + user: *const ::c_char, + group: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn __errno() -> *mut ::c_int; + pub fn inotify_rm_watch(fd: ::c_int, wd: u32) -> ::c_int; + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *const ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn inotify_init() -> ::c_int; + pub fn inotify_init1(flags: ::c_int) -> ::c_int; + pub fn inotify_add_watch(fd: ::c_int, path: *const ::c_char, mask: u32) -> ::c_int; + + pub fn regcomp(preg: *mut ::regex_t, pattern: *const ::c_char, cflags: ::c_int) -> ::c_int; + + pub fn regexec( + preg: *const ::regex_t, + input: *const ::c_char, + nmatch: ::size_t, + pmatch: *mut regmatch_t, + eflags: ::c_int, + ) -> ::c_int; + + pub fn regerror( + errcode: ::c_int, + preg: *const ::regex_t, + errbuf: *mut ::c_char, + errbuf_size: ::size_t, + ) -> ::size_t; + + pub fn regfree(preg: *mut ::regex_t); + + pub fn android_set_abort_message(msg: *const ::c_char); + + pub fn gettid() -> ::pid_t; + + /// Only available in API Version 28+ + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + + pub fn pthread_setname_np(thread: ::pthread_t, name: *const ::c_char) -> ::c_int; + + pub fn __system_property_set(__name: *const ::c_char, __value: *const ::c_char) -> ::c_int; + pub fn __system_property_get(__name: *const ::c_char, __value: *mut ::c_char) -> ::c_int; + pub fn __system_property_find(__name: *const ::c_char) -> *const prop_info; + pub fn __system_property_find_nth(__n: ::c_uint) -> *const prop_info; + pub fn __system_property_foreach( + __callback: unsafe extern "C" fn(__pi: *const prop_info, __cookie: *mut ::c_void), + __cookie: *mut ::c_void, + ) -> ::c_int; + + // #include + /// Only available in API Version 21+ + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + + pub fn arc4random() -> u32; + pub fn arc4random_uniform(__upper_bound: u32) -> u32; + pub fn arc4random_buf(__buf: *mut ::c_void, __n: ::size_t); + + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn dirname(path: *const ::c_char) -> *mut ::c_char; + pub fn basename(path: *const ::c_char) -> *mut ::c_char; + pub fn getopt_long( + argc: ::c_int, + argv: *const *mut c_char, + optstring: *const c_char, + longopts: *const option, + longindex: *mut ::c_int, + ) -> ::c_int; + + pub fn sync(); + pub fn syncfs(fd: ::c_int) -> ::c_int; + + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; +} + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + mod b32; + pub use self::b32::*; + } else if #[cfg(target_pointer_width = "64")] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_pointer_width + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_sigfault { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _si_tid: ::c_int, + _si_overrun: ::c_int, + si_sigval: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval + } +} + +cfg_if! { + if #[cfg(libc_union)] { + // Internal, for casts to access union fields + #[repr(C)] + struct sifields_sigchld { + si_pid: ::pid_t, + si_uid: ::uid_t, + si_status: ::c_int, + si_utime: ::c_long, + si_stime: ::c_long, + } + impl ::Copy for sifields_sigchld {} + impl ::Clone for sifields_sigchld { + fn clone(&self) -> sifields_sigchld { + *self + } + } + + // Internal, for casts to access union fields + #[repr(C)] + union sifields { + _align_pointer: *mut ::c_void, + sigchld: sifields_sigchld, + } + + // Internal, for casts to access union fields. Note that some variants + // of sifields start with a pointer, which makes the alignment of + // sifields vary on 32-bit and 64-bit architectures. + #[repr(C)] + struct siginfo_f { + _siginfo_base: [::c_int; 3], + sifields: sifields, + } + + impl siginfo_t { + unsafe fn sifields(&self) -> &sifields { + &(*(self as *const siginfo_t as *const siginfo_f)).sifields + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.sifields().sigchld.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.sifields().sigchld.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.sifields().sigchld.si_status + } + + pub unsafe fn si_utime(&self) -> ::c_long { + self.sifields().sigchld.si_utime + } + + pub unsafe fn si_stime(&self) -> ::c_long { + self.sifields().sigchld.si_stime + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/align.rs new file mode 100644 index 0000000..b9ea3f3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/align.rs @@ -0,0 +1,74 @@ +macro_rules! expand_align { + () => { + s! { + #[allow(missing_debug_implementations)] + #[repr(align(4))] + pub struct pthread_mutex_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + #[repr(align(4))] + pub struct pthread_rwlock_t { + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + #[repr(align(4))] + pub struct pthread_mutexattr_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[repr(align(4))] + pub struct pthread_rwlockattr_t { + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + + s_no_extra_traits! { + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct pthread_cond_t { + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } + + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_cond_t {} + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/mod.rs new file mode 100644 index 0000000..5b947b6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/mod.rs @@ -0,0 +1,1898 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type useconds_t = u32; +pub type dev_t = u32; +pub type socklen_t = u32; +pub type pthread_t = c_ulong; +pub type mode_t = u32; +pub type ino64_t = u64; +pub type off64_t = i64; +pub type blkcnt64_t = i32; +pub type rlim64_t = u64; +pub type shmatt_t = ::c_ulong; +pub type mqd_t = ::c_int; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type nfds_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type idtype_t = ::c_uint; +pub type loff_t = i64; +pub type pthread_key_t = ::c_uint; + +pub type clock_t = c_long; +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i32; + +pub type blksize_t = c_long; +pub type fsblkcnt_t = u32; +pub type fsfilcnt_t = u32; +pub type rlim_t = ::c_ulonglong; +pub type c_long = i32; +pub type c_ulong = u32; +pub type nlink_t = u32; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos64_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos64_t {} +impl ::Clone for fpos64_t { + fn clone(&self) -> fpos64_t { + *self + } +} + +s! { + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct spwd { + pub sp_namp: *mut ::c_char, + pub sp_pwdp: *mut ::c_char, + pub sp_lstchg: ::c_long, + pub sp_min: ::c_long, + pub sp_max: ::c_long, + pub sp_warn: ::c_long, + pub sp_inact: ::c_long, + pub sp_expire: ::c_long, + pub sp_flag: ::c_ulong, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct dqblk { + pub dqb_bhardlimit: u64, + pub dqb_bsoftlimit: u64, + pub dqb_curspace: u64, + pub dqb_ihardlimit: u64, + pub dqb_isoftlimit: u64, + pub dqb_curinodes: u64, + pub dqb_btime: u64, + pub dqb_itime: u64, + pub dqb_valid: u32, + } + + pub struct signalfd_siginfo { + pub ssi_signo: u32, + pub ssi_errno: i32, + pub ssi_code: i32, + pub ssi_pid: u32, + pub ssi_uid: u32, + pub ssi_fd: i32, + pub ssi_tid: u32, + pub ssi_band: u32, + pub ssi_overrun: u32, + pub ssi_trapno: u32, + pub ssi_status: i32, + pub ssi_int: i32, + pub ssi_ptr: u64, + pub ssi_utime: u64, + pub ssi_stime: u64, + pub ssi_addr: u64, + pub ssi_addr_lsb: u16, + _pad2: u16, + pub ssi_syscall: i32, + pub ssi_call_addr: u64, + pub ssi_arch: u32, + _pad: [u8; 28], + } + + pub struct fsid_t { + __val: [::c_int; 2], + } + + pub struct cpu_set_t { + bits: [u32; 32], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + // System V IPC + pub struct msginfo { + pub msgpool: ::c_int, + pub msgmap: ::c_int, + pub msgmax: ::c_int, + pub msgmnb: ::c_int, + pub msgmni: ::c_int, + pub msgssz: ::c_int, + pub msgtql: ::c_int, + pub msgseg: ::c_ushort, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __td: *mut ::c_void, + __lock: [::c_int; 2], + __err: ::c_int, + __ret: ::ssize_t, + pub aio_offset: off_t, + __next: *mut ::c_void, + __prev: *mut ::c_void, + __dummy4: [::c_char; 24], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub __c_ispeed: ::speed_t, + pub __c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct pthread_attr_t { + __size: [u32; 11] + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 4], + } + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u32, + pub f_bfree: u32, + pub f_bavail: u32, + pub f_files: u32, + pub f_ffree: u32, + pub f_favail: u32, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct arpd_request { + pub req: ::c_ushort, + pub ip: u32, + pub dev: ::c_ulong, + pub stamp: ::c_ulong, + pub updated: ::c_ulong, + pub ha: [::c_uchar; ::MAX_ADDR_LEN], + } +} + +s_no_extra_traits! { + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct dirent64 { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct sysinfo { + pub uptime: ::c_ulong, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub __reserved: [::c_char; 256], + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + pad: [::c_long; 4] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for dirent64 { + fn eq(&self, other: &dirent64) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent64 {} + impl ::fmt::Debug for dirent64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent64 { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sysinfo { + fn eq(&self, other: &sysinfo) -> bool { + self.uptime == other.uptime + && self.loads == other.loads + && self.totalram == other.totalram + && self.freeram == other.freeram + && self.sharedram == other.sharedram + && self.bufferram == other.bufferram + && self.totalswap == other.totalswap + && self.freeswap == other.freeswap + && self.procs == other.procs + && self.pad == other.pad + && self.totalhigh == other.totalhigh + && self.freehigh == other.freehigh + && self.mem_unit == other.mem_unit + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sysinfo {} + impl ::fmt::Debug for sysinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sysinfo") + .field("uptime", &self.uptime) + .field("loads", &self.loads) + .field("totalram", &self.totalram) + .field("freeram", &self.freeram) + .field("sharedram", &self.sharedram) + .field("bufferram", &self.bufferram) + .field("totalswap", &self.totalswap) + .field("freeswap", &self.freeswap) + .field("procs", &self.procs) + .field("pad", &self.pad) + .field("totalhigh", &self.totalhigh) + .field("freehigh", &self.freehigh) + .field("mem_unit", &self.mem_unit) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + impl ::hash::Hash for sysinfo { + fn hash(&self, state: &mut H) { + self.uptime.hash(state); + self.loads.hash(state); + self.totalram.hash(state); + self.freeram.hash(state); + self.sharedram.hash(state); + self.bufferram.hash(state); + self.totalswap.hash(state); + self.freeswap.hash(state); + self.procs.hash(state); + self.pad.hash(state); + self.totalhigh.hash(state); + self.freehigh.hash(state); + self.mem_unit.hash(state); + self.__reserved.hash(state); + } + } + + impl PartialEq for mq_attr { + fn eq(&self, other: &mq_attr) -> bool { + self.mq_flags == other.mq_flags && + self.mq_maxmsg == other.mq_maxmsg && + self.mq_msgsize == other.mq_msgsize && + self.mq_curmsgs == other.mq_curmsgs + } + } + impl Eq for mq_attr {} + impl ::fmt::Debug for mq_attr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_flags", &self.mq_flags) + .field("mq_maxmsg", &self.mq_maxmsg) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_curmsgs", &self.mq_curmsgs) + .finish() + } + } + impl ::hash::Hash for mq_attr { + fn hash(&self, state: &mut H) { + self.mq_flags.hash(state); + self.mq_maxmsg.hash(state); + self.mq_msgsize.hash(state); + self.mq_curmsgs.hash(state); + } + } + } +} + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MS_NOUSER: ::c_ulong = 0x80000000; +pub const MS_RMT_MASK: ::c_ulong = 0x02800051; + +pub const ABDAY_1: ::nl_item = 0x20000; +pub const ABDAY_2: ::nl_item = 0x20001; +pub const ABDAY_3: ::nl_item = 0x20002; +pub const ABDAY_4: ::nl_item = 0x20003; +pub const ABDAY_5: ::nl_item = 0x20004; +pub const ABDAY_6: ::nl_item = 0x20005; +pub const ABDAY_7: ::nl_item = 0x20006; + +pub const DAY_1: ::nl_item = 0x20007; +pub const DAY_2: ::nl_item = 0x20008; +pub const DAY_3: ::nl_item = 0x20009; +pub const DAY_4: ::nl_item = 0x2000A; +pub const DAY_5: ::nl_item = 0x2000B; +pub const DAY_6: ::nl_item = 0x2000C; +pub const DAY_7: ::nl_item = 0x2000D; + +pub const ABMON_1: ::nl_item = 0x2000E; +pub const ABMON_2: ::nl_item = 0x2000F; +pub const ABMON_3: ::nl_item = 0x20010; +pub const ABMON_4: ::nl_item = 0x20011; +pub const ABMON_5: ::nl_item = 0x20012; +pub const ABMON_6: ::nl_item = 0x20013; +pub const ABMON_7: ::nl_item = 0x20014; +pub const ABMON_8: ::nl_item = 0x20015; +pub const ABMON_9: ::nl_item = 0x20016; +pub const ABMON_10: ::nl_item = 0x20017; +pub const ABMON_11: ::nl_item = 0x20018; +pub const ABMON_12: ::nl_item = 0x20019; + +pub const MON_1: ::nl_item = 0x2001A; +pub const MON_2: ::nl_item = 0x2001B; +pub const MON_3: ::nl_item = 0x2001C; +pub const MON_4: ::nl_item = 0x2001D; +pub const MON_5: ::nl_item = 0x2001E; +pub const MON_6: ::nl_item = 0x2001F; +pub const MON_7: ::nl_item = 0x20020; +pub const MON_8: ::nl_item = 0x20021; +pub const MON_9: ::nl_item = 0x20022; +pub const MON_10: ::nl_item = 0x20023; +pub const MON_11: ::nl_item = 0x20024; +pub const MON_12: ::nl_item = 0x20025; + +pub const AM_STR: ::nl_item = 0x20026; +pub const PM_STR: ::nl_item = 0x20027; + +pub const D_T_FMT: ::nl_item = 0x20028; +pub const D_FMT: ::nl_item = 0x20029; +pub const T_FMT: ::nl_item = 0x2002A; +pub const T_FMT_AMPM: ::nl_item = 0x2002B; + +pub const ERA: ::nl_item = 0x2002C; +pub const ERA_D_FMT: ::nl_item = 0x2002E; +pub const ALT_DIGITS: ::nl_item = 0x2002F; +pub const ERA_D_T_FMT: ::nl_item = 0x20030; +pub const ERA_T_FMT: ::nl_item = 0x20031; + +pub const CODESET: ::nl_item = 14; + +pub const CRNCYSTR: ::nl_item = 0x4000F; + +pub const RUSAGE_THREAD: ::c_int = 1; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const RADIXCHAR: ::nl_item = 0x10000; +pub const THOUSEP: ::nl_item = 0x10001; + +pub const YESEXPR: ::nl_item = 0x50000; +pub const NOEXPR: ::nl_item = 0x50001; +pub const YESSTR: ::nl_item = 0x50002; +pub const NOSTR: ::nl_item = 0x50003; + +pub const FILENAME_MAX: ::c_uint = 4096; +pub const L_tmpnam: ::c_uint = 20; +pub const _PC_LINK_MAX: ::c_int = 0; +pub const _PC_MAX_CANON: ::c_int = 1; +pub const _PC_MAX_INPUT: ::c_int = 2; +pub const _PC_NAME_MAX: ::c_int = 3; +pub const _PC_PATH_MAX: ::c_int = 4; +pub const _PC_PIPE_BUF: ::c_int = 5; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_SYNC_IO: ::c_int = 9; +pub const _PC_ASYNC_IO: ::c_int = 10; +pub const _PC_PRIO_IO: ::c_int = 11; +pub const _PC_SOCK_MAXBUF: ::c_int = 12; +pub const _PC_FILESIZEBITS: ::c_int = 13; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18; +pub const _PC_SYMLINK_MAX: ::c_int = 19; +pub const _PC_2_SYMLINKS: ::c_int = 20; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +pub const _SC_JOB_CONTROL: ::c_int = 7; +pub const _SC_SAVED_IDS: ::c_int = 8; +pub const _SC_REALTIME_SIGNALS: ::c_int = 9; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; +pub const _SC_TIMERS: ::c_int = 11; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; +pub const _SC_PRIORITIZED_IO: ::c_int = 13; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; +pub const _SC_FSYNC: ::c_int = 15; +pub const _SC_MAPPED_FILES: ::c_int = 16; +pub const _SC_MEMLOCK: ::c_int = 17; +pub const _SC_MEMLOCK_RANGE: ::c_int = 18; +pub const _SC_MEMORY_PROTECTION: ::c_int = 19; +pub const _SC_MESSAGE_PASSING: ::c_int = 20; +pub const _SC_SEMAPHORES: ::c_int = 21; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; +pub const _SC_AIO_MAX: ::c_int = 24; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; +pub const _SC_DELAYTIMER_MAX: ::c_int = 26; +pub const _SC_MQ_OPEN_MAX: ::c_int = 27; +pub const _SC_MQ_PRIO_MAX: ::c_int = 28; +pub const _SC_VERSION: ::c_int = 29; +pub const _SC_PAGESIZE: ::c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 31; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; +pub const _SC_SEM_VALUE_MAX: ::c_int = 33; +pub const _SC_SIGQUEUE_MAX: ::c_int = 34; +pub const _SC_TIMER_MAX: ::c_int = 35; +pub const _SC_BC_BASE_MAX: ::c_int = 36; +pub const _SC_BC_DIM_MAX: ::c_int = 37; +pub const _SC_BC_SCALE_MAX: ::c_int = 38; +pub const _SC_BC_STRING_MAX: ::c_int = 39; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; +pub const _SC_EXPR_NEST_MAX: ::c_int = 42; +pub const _SC_LINE_MAX: ::c_int = 43; +pub const _SC_RE_DUP_MAX: ::c_int = 44; +pub const _SC_2_VERSION: ::c_int = 46; +pub const _SC_2_C_BIND: ::c_int = 47; +pub const _SC_2_C_DEV: ::c_int = 48; +pub const _SC_2_FORT_DEV: ::c_int = 49; +pub const _SC_2_FORT_RUN: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_LOCALEDEF: ::c_int = 52; +pub const _SC_UIO_MAXIOV: ::c_int = 60; +pub const _SC_IOV_MAX: ::c_int = 60; +pub const _SC_THREADS: ::c_int = 67; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; +pub const _SC_TTY_NAME_MAX: ::c_int = 72; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; +pub const _SC_THREAD_STACK_MIN: ::c_int = 75; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 82; +pub const _SC_NPROCESSORS_CONF: ::c_int = 83; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; +pub const _SC_PHYS_PAGES: ::c_int = 85; +pub const _SC_AVPHYS_PAGES: ::c_int = 86; +pub const _SC_ATEXIT_MAX: ::c_int = 87; +pub const _SC_PASS_MAX: ::c_int = 88; +pub const _SC_XOPEN_VERSION: ::c_int = 89; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; +pub const _SC_XOPEN_UNIX: ::c_int = 91; +pub const _SC_XOPEN_CRYPT: ::c_int = 92; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; +pub const _SC_XOPEN_SHM: ::c_int = 94; +pub const _SC_2_CHAR_TERM: ::c_int = 95; +pub const _SC_2_UPE: ::c_int = 97; +pub const _SC_XOPEN_XPG2: ::c_int = 98; +pub const _SC_XOPEN_XPG3: ::c_int = 99; +pub const _SC_XOPEN_XPG4: ::c_int = 100; +pub const _SC_NZERO: ::c_int = 109; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 127; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; +pub const _SC_XOPEN_LEGACY: ::c_int = 129; +pub const _SC_XOPEN_REALTIME: ::c_int = 130; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; +pub const _SC_ADVISORY_INFO: ::c_int = 132; +pub const _SC_BARRIERS: ::c_int = 133; +pub const _SC_CLOCK_SELECTION: ::c_int = 137; +pub const _SC_CPUTIME: ::c_int = 138; +pub const _SC_THREAD_CPUTIME: ::c_int = 139; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 149; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 153; +pub const _SC_SPIN_LOCKS: ::c_int = 154; +pub const _SC_REGEXP: ::c_int = 155; +pub const _SC_SHELL: ::c_int = 157; +pub const _SC_SPAWN: ::c_int = 159; +pub const _SC_SPORADIC_SERVER: ::c_int = 160; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 161; +pub const _SC_TIMEOUTS: ::c_int = 164; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 165; +pub const _SC_2_PBS: ::c_int = 168; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 169; +pub const _SC_2_PBS_LOCATE: ::c_int = 170; +pub const _SC_2_PBS_MESSAGE: ::c_int = 171; +pub const _SC_2_PBS_TRACK: ::c_int = 172; +pub const _SC_SYMLOOP_MAX: ::c_int = 173; +pub const _SC_STREAMS: ::c_int = 174; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 175; +pub const _SC_V6_ILP32_OFF32: ::c_int = 176; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 177; +pub const _SC_V6_LP64_OFF64: ::c_int = 178; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 179; +pub const _SC_HOST_NAME_MAX: ::c_int = 180; +pub const _SC_TRACE: ::c_int = 181; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 182; +pub const _SC_TRACE_INHERIT: ::c_int = 183; +pub const _SC_TRACE_LOG: ::c_int = 184; +pub const _SC_IPV6: ::c_int = 235; +pub const _SC_RAW_SOCKETS: ::c_int = 236; +pub const _SC_V7_ILP32_OFF32: ::c_int = 237; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 238; +pub const _SC_V7_LP64_OFF64: ::c_int = 239; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 240; +pub const _SC_SS_REPL_MAX: ::c_int = 241; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 242; +pub const _SC_TRACE_NAME_MAX: ::c_int = 243; +pub const _SC_TRACE_SYS_MAX: ::c_int = 244; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 245; +pub const _SC_XOPEN_STREAMS: ::c_int = 246; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 247; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 248; + +pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; + +pub const GLOB_ERR: ::c_int = 1 << 0; +pub const GLOB_MARK: ::c_int = 1 << 1; +pub const GLOB_NOSORT: ::c_int = 1 << 2; +pub const GLOB_DOOFFS: ::c_int = 1 << 3; +pub const GLOB_NOCHECK: ::c_int = 1 << 4; +pub const GLOB_APPEND: ::c_int = 1 << 5; +pub const GLOB_NOESCAPE: ::c_int = 1 << 6; + +pub const GLOB_NOSPACE: ::c_int = 1; +pub const GLOB_ABORTED: ::c_int = 2; +pub const GLOB_NOMATCH: ::c_int = 3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; + +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; +pub const ST_NODEV: ::c_ulong = 4; +pub const ST_NOEXEC: ::c_ulong = 8; +pub const ST_SYNCHRONOUS: ::c_ulong = 16; +pub const ST_MANDLOCK: ::c_ulong = 64; +pub const ST_WRITE: ::c_ulong = 128; +pub const ST_APPEND: ::c_ulong = 256; +pub const ST_IMMUTABLE: ::c_ulong = 512; +pub const ST_NOATIME: ::c_ulong = 1024; +pub const ST_NODIRATIME: ::c_ulong = 2048; + +pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOW: ::c_int = 0x2; + +align_const! { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + size: [0; __SIZEOF_PTHREAD_MUTEX_T], + }; + pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + size: [0; __SIZEOF_PTHREAD_COND_T], + }; + pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + size: [0; __SIZEOF_PTHREAD_RWLOCK_T], + }; +} + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const __SIZEOF_PTHREAD_COND_T: usize = 48; + +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_BATCH: ::c_int = 3; +pub const SCHED_IDLE: ::c_int = 5; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; + +// System V IPC +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_INFO: ::c_int = 3; +pub const MSG_STAT: ::c_int = 11; +pub const MSG_INFO: ::c_int = 12; + +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const MSG_EXCEPT: ::c_int = 0o20000; + +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; + +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_REMAP: ::c_int = 0o40000; +pub const SHM_EXEC: ::c_int = 0o100000; + +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; + +pub const SHM_HUGETLB: ::c_int = 0o4000; +pub const SHM_NORESERVE: ::c_int = 0o10000; + +pub const QFMT_VFS_OLD: ::c_int = 1; +pub const QFMT_VFS_V0: ::c_int = 2; + +pub const EFD_SEMAPHORE: ::c_int = 0x1; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; + +pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; +pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; +pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; +pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; +pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; +pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; +pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; + +pub const AI_PASSIVE: ::c_int = 0x0001; +pub const AI_CANONNAME: ::c_int = 0x0002; +pub const AI_NUMERICHOST: ::c_int = 0x0004; +pub const AI_V4MAPPED: ::c_int = 0x0008; +pub const AI_ALL: ::c_int = 0x0010; +pub const AI_ADDRCONFIG: ::c_int = 0x0020; + +pub const AI_NUMERICSERV: ::c_int = 0x0400; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_OVERFLOW: ::c_int = -12; + +pub const NI_NUMERICHOST: ::c_int = 1; +pub const NI_NUMERICSERV: ::c_int = 2; +pub const NI_NOFQDN: ::c_int = 4; +pub const NI_NAMEREQD: ::c_int = 8; +pub const NI_DGRAM: ::c_int = 16; + +pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; +pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; +pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; + +pub const EAI_SYSTEM: ::c_int = -11; + +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_NOTCANCELED: ::c_int = 1; +pub const AIO_ALLDONE: ::c_int = 2; +pub const LIO_READ: ::c_int = 0; +pub const LIO_WRITE: ::c_int = 1; +pub const LIO_NOP: ::c_int = 2; +pub const LIO_WAIT: ::c_int = 0; +pub const LIO_NOWAIT: ::c_int = 1; + +pub const MREMAP_MAYMOVE: ::c_int = 1; +pub const MREMAP_FIXED: ::c_int = 2; + +pub const PR_SET_PDEATHSIG: ::c_int = 1; +pub const PR_GET_PDEATHSIG: ::c_int = 2; + +pub const PR_GET_DUMPABLE: ::c_int = 3; +pub const PR_SET_DUMPABLE: ::c_int = 4; + +pub const PR_GET_UNALIGN: ::c_int = 5; +pub const PR_SET_UNALIGN: ::c_int = 6; +pub const PR_UNALIGN_NOPRINT: ::c_int = 1; +pub const PR_UNALIGN_SIGBUS: ::c_int = 2; + +pub const PR_GET_KEEPCAPS: ::c_int = 7; +pub const PR_SET_KEEPCAPS: ::c_int = 8; + +pub const PR_GET_FPEMU: ::c_int = 9; +pub const PR_SET_FPEMU: ::c_int = 10; +pub const PR_FPEMU_NOPRINT: ::c_int = 1; +pub const PR_FPEMU_SIGFPE: ::c_int = 2; + +pub const PR_GET_FPEXC: ::c_int = 11; +pub const PR_SET_FPEXC: ::c_int = 12; +pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; +pub const PR_FP_EXC_DIV: ::c_int = 0x010000; +pub const PR_FP_EXC_OVF: ::c_int = 0x020000; +pub const PR_FP_EXC_UND: ::c_int = 0x040000; +pub const PR_FP_EXC_RES: ::c_int = 0x080000; +pub const PR_FP_EXC_INV: ::c_int = 0x100000; +pub const PR_FP_EXC_DISABLED: ::c_int = 0; +pub const PR_FP_EXC_NONRECOV: ::c_int = 1; +pub const PR_FP_EXC_ASYNC: ::c_int = 2; +pub const PR_FP_EXC_PRECISE: ::c_int = 3; + +pub const PR_GET_TIMING: ::c_int = 13; +pub const PR_SET_TIMING: ::c_int = 14; +pub const PR_TIMING_STATISTICAL: ::c_int = 0; +pub const PR_TIMING_TIMESTAMP: ::c_int = 1; + +pub const PR_SET_NAME: ::c_int = 15; +pub const PR_GET_NAME: ::c_int = 16; + +pub const PR_GET_ENDIAN: ::c_int = 19; +pub const PR_SET_ENDIAN: ::c_int = 20; +pub const PR_ENDIAN_BIG: ::c_int = 0; +pub const PR_ENDIAN_LITTLE: ::c_int = 1; +pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; + +pub const PR_GET_SECCOMP: ::c_int = 21; +pub const PR_SET_SECCOMP: ::c_int = 22; + +pub const PR_CAPBSET_READ: ::c_int = 23; +pub const PR_CAPBSET_DROP: ::c_int = 24; + +pub const PR_GET_TSC: ::c_int = 25; +pub const PR_SET_TSC: ::c_int = 26; +pub const PR_TSC_ENABLE: ::c_int = 1; +pub const PR_TSC_SIGSEGV: ::c_int = 2; + +pub const PR_GET_SECUREBITS: ::c_int = 27; +pub const PR_SET_SECUREBITS: ::c_int = 28; + +pub const PR_SET_TIMERSLACK: ::c_int = 29; +pub const PR_GET_TIMERSLACK: ::c_int = 30; + +pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; +pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; + +pub const PR_MCE_KILL: ::c_int = 33; +pub const PR_MCE_KILL_CLEAR: ::c_int = 0; +pub const PR_MCE_KILL_SET: ::c_int = 1; + +pub const PR_MCE_KILL_LATE: ::c_int = 0; +pub const PR_MCE_KILL_EARLY: ::c_int = 1; +pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; + +pub const PR_MCE_KILL_GET: ::c_int = 34; + +pub const PR_SET_MM: ::c_int = 35; +pub const PR_SET_MM_START_CODE: ::c_int = 1; +pub const PR_SET_MM_END_CODE: ::c_int = 2; +pub const PR_SET_MM_START_DATA: ::c_int = 3; +pub const PR_SET_MM_END_DATA: ::c_int = 4; +pub const PR_SET_MM_START_STACK: ::c_int = 5; +pub const PR_SET_MM_START_BRK: ::c_int = 6; +pub const PR_SET_MM_BRK: ::c_int = 7; +pub const PR_SET_MM_ARG_START: ::c_int = 8; +pub const PR_SET_MM_ARG_END: ::c_int = 9; +pub const PR_SET_MM_ENV_START: ::c_int = 10; +pub const PR_SET_MM_ENV_END: ::c_int = 11; +pub const PR_SET_MM_AUXV: ::c_int = 12; +pub const PR_SET_MM_EXE_FILE: ::c_int = 13; +pub const PR_SET_MM_MAP: ::c_int = 14; +pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; + +pub const PR_SET_PTRACER: ::c_int = 0x59616d61; +pub const PR_SET_PTRACER_ANY: ::c_ulong = 0xffffffffffffffff; + +pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; +pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; + +pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; +pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; + +pub const PR_GET_TID_ADDRESS: ::c_int = 40; + +pub const PR_SET_THP_DISABLE: ::c_int = 41; +pub const PR_GET_THP_DISABLE: ::c_int = 42; + +pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43; +pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44; + +pub const PR_SET_FP_MODE: ::c_int = 45; +pub const PR_GET_FP_MODE: ::c_int = 46; +pub const PR_FP_MODE_FR: ::c_int = 1 << 0; +pub const PR_FP_MODE_FRE: ::c_int = 1 << 1; + +pub const PR_CAP_AMBIENT: ::c_int = 47; +pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1; +pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2; +pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3; +pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4; + +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; + +pub const _POSIX_VDISABLE: ::cc_t = 0; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; + +// On Linux, libc doesn't define this constant, libattr does instead. +// We still define it for Linux as it's defined by libc on other platforms, +// and it's mentioned in the man pages for getxattr and setxattr. +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_CLOEXEC: ::c_int = 0x80000; + +// Defined as wasi value. +pub const EPERM: ::c_int = 63; +pub const ENOENT: ::c_int = 44; +pub const ESRCH: ::c_int = 71; +pub const EINTR: ::c_int = 27; +pub const EIO: ::c_int = 29; +pub const ENXIO: ::c_int = 60; +pub const E2BIG: ::c_int = 1; +pub const ENOEXEC: ::c_int = 45; +pub const EBADF: ::c_int = 8; +pub const ECHILD: ::c_int = 12; +pub const EAGAIN: ::c_int = 6; +pub const ENOMEM: ::c_int = 48; +pub const EACCES: ::c_int = 2; +pub const EFAULT: ::c_int = 21; +pub const ENOTBLK: ::c_int = 105; +pub const EBUSY: ::c_int = 10; +pub const EEXIST: ::c_int = 20; +pub const EXDEV: ::c_int = 75; +pub const ENODEV: ::c_int = 43; +pub const ENOTDIR: ::c_int = 54; +pub const EISDIR: ::c_int = 31; +pub const EINVAL: ::c_int = 28; +pub const ENFILE: ::c_int = 41; +pub const EMFILE: ::c_int = 33; +pub const ENOTTY: ::c_int = 59; +pub const ETXTBSY: ::c_int = 74; +pub const EFBIG: ::c_int = 22; +pub const ENOSPC: ::c_int = 51; +pub const ESPIPE: ::c_int = 70; +pub const EROFS: ::c_int = 69; +pub const EMLINK: ::c_int = 34; +pub const EPIPE: ::c_int = 64; +pub const EDOM: ::c_int = 18; +pub const ERANGE: ::c_int = 68; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const ENOLINK: ::c_int = 47; +pub const EPROTO: ::c_int = 65; +pub const EDEADLK: ::c_int = 16; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const ENAMETOOLONG: ::c_int = 37; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 52; +pub const ENOTEMPTY: ::c_int = 55; +pub const ELOOP: ::c_int = 32; +pub const ENOMSG: ::c_int = 49; +pub const EIDRM: ::c_int = 24; +pub const EMULTIHOP: ::c_int = 36; +pub const EBADMSG: ::c_int = 9; +pub const EOVERFLOW: ::c_int = 61; +pub const EILSEQ: ::c_int = 25; +pub const ENOTSOCK: ::c_int = 57; +pub const EDESTADDRREQ: ::c_int = 17; +pub const EMSGSIZE: ::c_int = 35; +pub const EPROTOTYPE: ::c_int = 67; +pub const ENOPROTOOPT: ::c_int = 50; +pub const EPROTONOSUPPORT: ::c_int = 66; +pub const EAFNOSUPPORT: ::c_int = 5; +pub const EADDRINUSE: ::c_int = 3; +pub const EADDRNOTAVAIL: ::c_int = 4; +pub const ENETDOWN: ::c_int = 38; +pub const ENETUNREACH: ::c_int = 40; +pub const ENETRESET: ::c_int = 39; +pub const ECONNABORTED: ::c_int = 13; +pub const ECONNRESET: ::c_int = 15; +pub const ENOBUFS: ::c_int = 42; +pub const EISCONN: ::c_int = 30; +pub const ENOTCONN: ::c_int = 53; +pub const ETIMEDOUT: ::c_int = 73; +pub const ECONNREFUSED: ::c_int = 14; +pub const EHOSTUNREACH: ::c_int = 23; +pub const EALREADY: ::c_int = 7; +pub const EINPROGRESS: ::c_int = 26; +pub const ESTALE: ::c_int = 72; +pub const EDQUOT: ::c_int = 19; +pub const ECANCELED: ::c_int = 11; +pub const EOWNERDEAD: ::c_int = 62; +pub const ENOTRECOVERABLE: ::c_int = 56; + +pub const ENOSTR: ::c_int = 100; +pub const EBFONT: ::c_int = 101; +pub const EBADSLT: ::c_int = 102; +pub const EBADRQC: ::c_int = 103; +pub const ENOANO: ::c_int = 104; +pub const ECHRNG: ::c_int = 106; +pub const EL3HLT: ::c_int = 107; +pub const EL3RST: ::c_int = 108; +pub const ELNRNG: ::c_int = 109; +pub const EUNATCH: ::c_int = 110; +pub const ENOCSI: ::c_int = 111; +pub const EL2HLT: ::c_int = 112; +pub const EBADE: ::c_int = 113; +pub const EBADR: ::c_int = 114; +pub const EXFULL: ::c_int = 115; +pub const ENODATA: ::c_int = 116; +pub const ETIME: ::c_int = 117; +pub const ENOSR: ::c_int = 118; +pub const ENONET: ::c_int = 119; +pub const ENOPKG: ::c_int = 120; +pub const EREMOTE: ::c_int = 121; +pub const EADV: ::c_int = 122; +pub const ESRMNT: ::c_int = 123; +pub const ECOMM: ::c_int = 124; +pub const EDOTDOT: ::c_int = 125; +pub const ENOTUNIQ: ::c_int = 126; +pub const EBADFD: ::c_int = 127; +pub const EREMCHG: ::c_int = 128; +pub const ELIBACC: ::c_int = 129; +pub const ELIBBAD: ::c_int = 130; +pub const ELIBSCN: ::c_int = 131; +pub const ELIBMAX: ::c_int = 132; +pub const ELIBEXEC: ::c_int = 133; +pub const ERESTART: ::c_int = 134; +pub const ESTRPIPE: ::c_int = 135; +pub const EUSERS: ::c_int = 136; +pub const ESOCKTNOSUPPORT: ::c_int = 137; +pub const EOPNOTSUPP: ::c_int = 138; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 139; +pub const ESHUTDOWN: ::c_int = 140; +pub const ETOOMANYREFS: ::c_int = 141; +pub const EHOSTDOWN: ::c_int = 142; +pub const EUCLEAN: ::c_int = 143; +pub const ENOTNAM: ::c_int = 144; +pub const ENAVAIL: ::c_int = 145; +pub const EISNAM: ::c_int = 146; +pub const EREMOTEIO: ::c_int = 147; +pub const ENOMEDIUM: ::c_int = 148; +pub const EMEDIUMTYPE: ::c_int = 149; +pub const ENOKEY: ::c_int = 150; +pub const EKEYEXPIRED: ::c_int = 151; +pub const EKEYREVOKED: ::c_int = 152; +pub const EKEYREJECTED: ::c_int = 153; +pub const ERFKILL: ::c_int = 154; +pub const EHWPOISON: ::c_int = 155; +pub const EL2NSYNC: ::c_int = 156; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const BUFSIZ: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 10000; +pub const FOPEN_MAX: ::c_uint = 1000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_EXEC: ::c_int = 0o10000000; +pub const O_SEARCH: ::c_int = 0o10000000; +pub const O_ACCMODE: ::c_int = 0o10000003; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const NI_MAXHOST: ::socklen_t = 255; +pub const PTHREAD_STACK_MIN: ::size_t = 2048; +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const POSIX_MADV_DONTNEED: ::c_int = 0; + +pub const RLIM_INFINITY: ::rlim_t = !0; +pub const RLIMIT_NLIMITS: ::c_int = 15; +pub const RLIM_NLIMITS: ::c_int = RLIMIT_NLIMITS; + +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +#[doc(hidden)] +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = ::SIGSYS; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; + +pub const CPU_SETSIZE: ::c_int = 128; + +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const TIOCINQ: ::c_int = ::FIONREAD; + +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SO_MARK: ::c_int = 36; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_BUSY_POLL: ::c_int = 46; + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 28; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const FIOCLEX: ::c_int = 0x5451; +pub const FIONBIO: ::c_int = 0x5421; + +pub const RLIMIT_RSS: ::c_int = 5; +pub const RLIMIT_NOFILE: ::c_int = 7; +pub const RLIMIT_AS: ::c_int = 9; +pub const RLIMIT_NPROC: ::c_int = 6; +pub const RLIMIT_MEMLOCK: ::c_int = 8; +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_LOCKS: ::c_int = 10; +pub const RLIMIT_SIGPENDING: ::c_int = 11; +pub const RLIMIT_MSGQUEUE: ::c_int = 12; +pub const RLIMIT_NICE: ::c_int = 13; +pub const RLIMIT_RTPRIO: ::c_int = 14; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const IPPROTO_MAX: ::c_int = 256; + +pub const SOL_SOCKET: ::c_int = 1; + +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_LINGER: ::c_int = 13; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; + +pub const IPV6_RTHDR_LOOSE: ::c_int = 0; +pub const IPV6_RTHDR_STRICT: ::c_int = 1; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const SYS_gettid: ::c_long = 224; // Valid for arm (32-bit) and x86 (32-bit) + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_DSR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const O_TMPFILE: ::c_int = 0x400000; + +pub const MAX_ADDR_LEN: usize = 7; +pub const ARPD_UPDATE: ::c_ushort = 0x01; +pub const ARPD_LOOKUP: ::c_ushort = 0x02; +pub const ARPD_FLUSH: ::c_ushort = 0x03; +pub const ATF_MAGIC: ::c_int = 0x80; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const SOMAXCONN: ::c_int = 128; + +f! { + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + if ((*cmsg).cmsg_len as usize) < ::mem::size_of::() { + return 0 as *mut cmsghdr; + }; + let next = (cmsg as usize + + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut cmsghdr; + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if (next.offset(1)) as usize > max { + 0 as *mut cmsghdr + } else { + next as *mut cmsghdr + } + } + + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in_bits = 8 * ::mem::size_of_val(&cpuset.bits[0]); + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + 0 != (cpuset.bits[idx] & (1 << offset)) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.bits == set2.bits + } + + pub fn major(dev: ::dev_t) -> ::c_uint { + // see + // https://github.com/emscripten-core/emscripten/blob/ + // main/system/lib/libc/musl/include/sys/sysmacros.h + let mut major = 0; + major |= (dev & 0x00000fff) >> 8; + major |= (dev & 0xfffff000) >> 31 >> 1; + major as ::c_uint + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + // see + // https://github.com/emscripten-core/emscripten/blob/ + // main/system/lib/libc/musl/include/sys/sysmacros.h + let mut minor = 0; + minor |= (dev & 0x000000ff) >> 0; + minor |= (dev & 0xffffff00) >> 12; + minor as ::c_uint + } +} + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= (major & 0x00000fff) << 8; + dev |= (major & 0xfffff000) << 31 << 1; + dev |= (minor & 0x000000ff) << 0; + dev |= (minor & 0xffffff00) << 12; + dev + } +} + +extern "C" { + pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; + pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwent() -> *mut passwd; + + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn __errno_location() -> *mut ::c_int; + + pub fn fopen64(filename: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn freopen64( + filename: *const c_char, + mode: *const c_char, + file: *mut ::FILE, + ) -> *mut ::FILE; + pub fn tmpfile64() -> *mut ::FILE; + pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; + pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; + pub fn fseeko64(stream: *mut ::FILE, offset: ::off64_t, whence: ::c_int) -> ::c_int; + pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + + pub fn mremap( + addr: *mut ::c_void, + len: ::size_t, + new_len: ::size_t, + flags: ::c_int, + ... + ) -> *mut ::c_void; + + pub fn glob( + pattern: *const c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + timeout: *mut ::timespec, + ) -> ::c_int; + pub fn sync(); + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + #[macro_use] + mod align; + } else { + #[macro_use] + mod no_align; + } +} +expand_align!(); diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/no_align.rs new file mode 100644 index 0000000..768dc73 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/emscripten/no_align.rs @@ -0,0 +1,63 @@ +macro_rules! expand_align { + () => { + s! { + pub struct pthread_mutex_t { + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_mutexattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_rwlockattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + pub struct pthread_condattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + + s_no_extra_traits! { + pub struct pthread_cond_t { + __align: [*const ::c_void; 0], + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + } + + cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.size + .iter() + .zip(other.size.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for pthread_cond_t {} + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/align.rs new file mode 100644 index 0000000..97f811d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/align.rs @@ -0,0 +1,192 @@ +macro_rules! expand_align { + () => { + s! { + #[cfg_attr(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "aarch64", + target_arch = "riscv64", + target_arch = "riscv32", + target_arch = "loongarch64"), + repr(align(4)))] + #[cfg_attr(not(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "aarch64", + target_arch = "riscv64", + target_arch = "riscv32", + target_arch = "loongarch64")), + repr(align(8)))] + pub struct pthread_mutexattr_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[cfg_attr(any(target_env = "musl", target_env = "ohos", target_pointer_width = "32"), + repr(align(4)))] + #[cfg_attr(all(not(target_env = "musl"), + not(target_env = "ohos"), + target_pointer_width = "64"), + repr(align(8)))] + pub struct pthread_rwlockattr_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + + #[repr(align(4))] + pub struct pthread_barrierattr_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_BARRIERATTR_T], + } + + #[repr(align(8))] + pub struct fanotify_event_metadata { + pub event_len: __u32, + pub vers: __u8, + pub reserved: __u8, + pub metadata_len: __u16, + pub mask: __u64, + pub fd: ::c_int, + pub pid: ::c_int, + } + } + + s_no_extra_traits! { + #[cfg_attr(all(any(target_env = "musl", target_env = "ohos"), + target_pointer_width = "32"), + repr(align(4)))] + #[cfg_attr(all(any(target_env = "musl", target_env = "ohos"), + target_pointer_width = "64"), + repr(align(8)))] + #[cfg_attr(all(not(any(target_env = "musl", target_env = "ohos")), + target_arch = "x86"), + repr(align(4)))] + #[cfg_attr(all(not(any(target_env = "musl", target_env = "ohos")), + not(target_arch = "x86")), + repr(align(8)))] + pub struct pthread_cond_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86"))), + repr(align(8)))] + pub struct pthread_mutex_t { + #[doc(hidden)] + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86"))), + repr(align(8)))] + pub struct pthread_rwlock_t { + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "hexagon", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "x86_64", + target_arch = "x86"))), + repr(align(8)))] + pub struct pthread_barrier_t { + size: [u8; ::__SIZEOF_PTHREAD_BARRIER_T], + } + + // linux/can.h + #[repr(align(8))] + #[allow(missing_debug_implementations)] + pub struct can_frame { + pub can_id: canid_t, + pub can_dlc: u8, + __pad: u8, + __res0: u8, + __res1: u8, + pub data: [u8; CAN_MAX_DLEN], + } + + #[repr(align(8))] + #[allow(missing_debug_implementations)] + pub struct canfd_frame { + pub can_id: canid_t, + pub len: u8, + pub flags: u8, + __res0: u8, + __res1: u8, + pub data: [u8; CANFD_MAX_DLEN], + } + + #[repr(align(8))] + #[allow(missing_debug_implementations)] + pub struct canxl_frame { + pub prio: canid_t, + pub flags: u8, + pub sdt: u8, + pub len: u16, + pub af: u32, + pub data: [u8; CANXL_MAX_DLEN], + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs new file mode 100644 index 0000000..7bc94c6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs @@ -0,0 +1,292 @@ +s! { + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 19], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } +} + +// include/uapi/asm-generic/socket.h +// arch/alpha/include/uapi/asm/socket.h +// tools/include/uapi/asm-generic/socket.h +// arch/mips/include/uapi/asm/socket.h +pub const SOL_SOCKET: ::c_int = 1; + +// Defined in unix/linux_like/mod.rs +// pub const SO_DEBUG: ::c_int = 1; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +// pub const SO_RCVTIMEO_OLD: ::c_int = 20; +// pub const SO_SNDTIMEO_OLD: ::c_int = 21; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +// pub const SO_TIMESTAMP_OLD: ::c_int = 29; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +// pub const SO_TIMESTAMPNS_OLD: ::c_int = 35; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +// pub const SO_TIMESTAMPING_OLD: ::c_int = 37; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; +pub const SO_ATTACH_REUSEPORT_CBPF: ::c_int = 51; +pub const SO_ATTACH_REUSEPORT_EBPF: ::c_int = 52; +pub const SO_CNX_ADVICE: ::c_int = 53; +pub const SCM_TIMESTAMPING_OPT_STATS: ::c_int = 54; +pub const SO_MEMINFO: ::c_int = 55; +pub const SO_INCOMING_NAPI_ID: ::c_int = 56; +pub const SO_COOKIE: ::c_int = 57; +pub const SCM_TIMESTAMPING_PKTINFO: ::c_int = 58; +pub const SO_PEERGROUPS: ::c_int = 59; +pub const SO_ZEROCOPY: ::c_int = 60; +pub const SO_TXTIME: ::c_int = 61; +pub const SCM_TXTIME: ::c_int = SO_TXTIME; +pub const SO_BINDTOIFINDEX: ::c_int = 62; +cfg_if! { + // Some of these platforms in CI already have these constants. + // But they may still not have those _OLD ones. + if #[cfg(all(any(target_arch = "x86", + target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "loongarch64"), + not(any(target_env = "musl", target_env = "ohos"))))] { + pub const SO_TIMESTAMP_NEW: ::c_int = 63; + pub const SO_TIMESTAMPNS_NEW: ::c_int = 64; + pub const SO_TIMESTAMPING_NEW: ::c_int = 65; + pub const SO_RCVTIMEO_NEW: ::c_int = 66; + pub const SO_SNDTIMEO_NEW: ::c_int = 67; + pub const SO_DETACH_REUSEPORT_BPF: ::c_int = 68; + } +} +// pub const SO_PREFER_BUSY_POLL: ::c_int = 69; +// pub const SO_BUSY_POLL_BUDGET: ::c_int = 70; + +cfg_if! { + if #[cfg(any(target_arch = "x86", + target_arch = "x86_64", + target_arch = "arm", + target_arch = "aarch64", + target_arch = "riscv64", + target_arch = "s390x", + target_arch = "loongarch64"))] { + pub const FICLONE: ::c_ulong = 0x40049409; + pub const FICLONERANGE: ::c_ulong = 0x4020940D; + } +} + +// Defined in unix/linux_like/mod.rs +// pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; + +// Ioctl Constants + +pub const TCGETS: ::Ioctl = 0x5401; +pub const TCSETS: ::Ioctl = 0x5402; +pub const TCSETSW: ::Ioctl = 0x5403; +pub const TCSETSF: ::Ioctl = 0x5404; +pub const TCGETA: ::Ioctl = 0x5405; +pub const TCSETA: ::Ioctl = 0x5406; +pub const TCSETAW: ::Ioctl = 0x5407; +pub const TCSETAF: ::Ioctl = 0x5408; +pub const TCSBRK: ::Ioctl = 0x5409; +pub const TCXONC: ::Ioctl = 0x540A; +pub const TCFLSH: ::Ioctl = 0x540B; +pub const TIOCEXCL: ::Ioctl = 0x540C; +pub const TIOCNXCL: ::Ioctl = 0x540D; +pub const TIOCSCTTY: ::Ioctl = 0x540E; +pub const TIOCGPGRP: ::Ioctl = 0x540F; +pub const TIOCSPGRP: ::Ioctl = 0x5410; +pub const TIOCOUTQ: ::Ioctl = 0x5411; +pub const TIOCSTI: ::Ioctl = 0x5412; +pub const TIOCGWINSZ: ::Ioctl = 0x5413; +pub const TIOCSWINSZ: ::Ioctl = 0x5414; +pub const TIOCMGET: ::Ioctl = 0x5415; +pub const TIOCMBIS: ::Ioctl = 0x5416; +pub const TIOCMBIC: ::Ioctl = 0x5417; +pub const TIOCMSET: ::Ioctl = 0x5418; +pub const TIOCGSOFTCAR: ::Ioctl = 0x5419; +pub const TIOCSSOFTCAR: ::Ioctl = 0x541A; +pub const FIONREAD: ::Ioctl = 0x541B; +pub const TIOCINQ: ::Ioctl = FIONREAD; +pub const TIOCLINUX: ::Ioctl = 0x541C; +pub const TIOCCONS: ::Ioctl = 0x541D; +pub const TIOCGSERIAL: ::Ioctl = 0x541E; +pub const TIOCSSERIAL: ::Ioctl = 0x541F; +pub const TIOCPKT: ::Ioctl = 0x5420; +pub const FIONBIO: ::Ioctl = 0x5421; +pub const TIOCNOTTY: ::Ioctl = 0x5422; +pub const TIOCSETD: ::Ioctl = 0x5423; +pub const TIOCGETD: ::Ioctl = 0x5424; +pub const TCSBRKP: ::Ioctl = 0x5425; +pub const TIOCSBRK: ::Ioctl = 0x5427; +pub const TIOCCBRK: ::Ioctl = 0x5428; +pub const TIOCGSID: ::Ioctl = 0x5429; +pub const TCGETS2: ::Ioctl = 0x802c542a; +pub const TCSETS2: ::Ioctl = 0x402c542b; +pub const TCSETSW2: ::Ioctl = 0x402c542c; +pub const TCSETSF2: ::Ioctl = 0x402c542d; +pub const TIOCGRS485: ::Ioctl = 0x542E; +pub const TIOCSRS485: ::Ioctl = 0x542F; +pub const TIOCGPTN: ::Ioctl = 0x80045430; +pub const TIOCSPTLCK: ::Ioctl = 0x40045431; +pub const TIOCGDEV: ::Ioctl = 0x80045432; +pub const TCGETX: ::Ioctl = 0x5432; +pub const TCSETX: ::Ioctl = 0x5433; +pub const TCSETXF: ::Ioctl = 0x5434; +pub const TCSETXW: ::Ioctl = 0x5435; +pub const TIOCSIG: ::Ioctl = 0x40045436; +pub const TIOCVHANGUP: ::Ioctl = 0x5437; +pub const TIOCGPKT: ::Ioctl = 0x80045438; +pub const TIOCGPTLCK: ::Ioctl = 0x80045439; +pub const TIOCGEXCL: ::Ioctl = 0x80045440; +pub const TIOCGPTPEER: ::Ioctl = 0x5441; +// pub const TIOCGISO7816: ::Ioctl = 0x80285442; +// pub const TIOCSISO7816: ::Ioctl = 0xc0285443; +pub const FIONCLEX: ::Ioctl = 0x5450; +pub const FIOCLEX: ::Ioctl = 0x5451; +pub const FIOASYNC: ::Ioctl = 0x5452; +pub const TIOCSERCONFIG: ::Ioctl = 0x5453; +pub const TIOCSERGWILD: ::Ioctl = 0x5454; +pub const TIOCSERSWILD: ::Ioctl = 0x5455; +pub const TIOCGLCKTRMIOS: ::Ioctl = 0x5456; +pub const TIOCSLCKTRMIOS: ::Ioctl = 0x5457; +pub const TIOCSERGSTRUCT: ::Ioctl = 0x5458; +pub const TIOCSERGETLSR: ::Ioctl = 0x5459; +pub const TIOCSERGETMULTI: ::Ioctl = 0x545A; +pub const TIOCSERSETMULTI: ::Ioctl = 0x545B; +pub const TIOCMIWAIT: ::Ioctl = 0x545C; +pub const TIOCGICOUNT: ::Ioctl = 0x545D; +pub const BLKIOMIN: ::Ioctl = 0x1278; +pub const BLKIOOPT: ::Ioctl = 0x1279; +pub const BLKSSZGET: ::Ioctl = 0x1268; +pub const BLKPBSZGET: ::Ioctl = 0x127B; + +cfg_if! { + if #[cfg(any(target_arch = "arm", + target_arch = "s390x"))] { + pub const FIOQSIZE: ::Ioctl = 0x545E; + } else { + pub const FIOQSIZE: ::Ioctl = 0x5460; + } +} + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const TIOCM_DSR: ::c_int = 0x100; + +pub const BOTHER: ::speed_t = 0o010000; +pub const IBSHIFT: ::tcflag_t = 16; + +// RLIMIT Constants + +cfg_if! { + if #[cfg(any(target_env = "gnu", + target_env = "uclibc"))] { + + pub const RLIMIT_CPU: ::__rlimit_resource_t = 0; + pub const RLIMIT_FSIZE: ::__rlimit_resource_t = 1; + pub const RLIMIT_DATA: ::__rlimit_resource_t = 2; + pub const RLIMIT_STACK: ::__rlimit_resource_t = 3; + pub const RLIMIT_CORE: ::__rlimit_resource_t = 4; + pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; + pub const RLIMIT_NPROC: ::__rlimit_resource_t = 6; + pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 7; + pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 8; + pub const RLIMIT_AS: ::__rlimit_resource_t = 9; + pub const RLIMIT_LOCKS: ::__rlimit_resource_t = 10; + pub const RLIMIT_SIGPENDING: ::__rlimit_resource_t = 11; + pub const RLIMIT_MSGQUEUE: ::__rlimit_resource_t = 12; + pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; + pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; + pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; + pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; + + } else if #[cfg(any(target_env = "musl", target_env = "ohos"))] { + + pub const RLIMIT_CPU: ::c_int = 0; + pub const RLIMIT_FSIZE: ::c_int = 1; + pub const RLIMIT_DATA: ::c_int = 2; + pub const RLIMIT_STACK: ::c_int = 3; + pub const RLIMIT_CORE: ::c_int = 4; + pub const RLIMIT_RSS: ::c_int = 5; + pub const RLIMIT_NPROC: ::c_int = 6; + pub const RLIMIT_NOFILE: ::c_int = 7; + pub const RLIMIT_MEMLOCK: ::c_int = 8; + pub const RLIMIT_AS: ::c_int = 9; + pub const RLIMIT_LOCKS: ::c_int = 10; + pub const RLIMIT_SIGPENDING: ::c_int = 11; + pub const RLIMIT_MSGQUEUE: ::c_int = 12; + pub const RLIMIT_NICE: ::c_int = 13; + pub const RLIMIT_RTPRIO: ::c_int = 14; + pub const RLIMIT_RTTIME: ::c_int = 15; + pub const RLIM_NLIMITS: ::c_int = 15; + pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; + } +} + +cfg_if! { + if #[cfg(target_env = "gnu")] { + pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; + } + else if #[cfg(target_env = "uclibc")] { + pub const RLIM_NLIMITS: ::__rlimit_resource_t = 15; + } +} + +pub const RLIM_INFINITY: ::rlim_t = !0; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs new file mode 100644 index 0000000..34c00a2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs @@ -0,0 +1,288 @@ +s! { + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 23], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } +} + +// arch/mips/include/uapi/asm/socket.h +pub const SOL_SOCKET: ::c_int = 0xffff; + +// Defined in unix/linux_like/mod.rs +// pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TYPE: ::c_int = 0x1008; +// pub const SO_STYLE: ::c_int = SO_TYPE; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +// NOTE: These definitions are now being renamed with _OLD postfix, +// but CI haven't support them yet. +// Some related consts could be found in b32.rs and b64.rs +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +// pub const SO_SNDTIMEO_OLD: ::c_int = 0x1005; +// pub const SO_RCVTIMEO_OLD: ::c_int = 0x1006; +pub const SO_ACCEPTCONN: ::c_int = 0x1009; +pub const SO_PROTOCOL: ::c_int = 0x1028; +pub const SO_DOMAIN: ::c_int = 0x1029; + +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_PASSCRED: ::c_int = 17; +pub const SO_PEERCRED: ::c_int = 18; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_PEERSEC: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 31; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_MARK: ::c_int = 36; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; +pub const SO_ATTACH_REUSEPORT_CBPF: ::c_int = 51; +pub const SO_ATTACH_REUSEPORT_EBPF: ::c_int = 52; +pub const SO_CNX_ADVICE: ::c_int = 53; +pub const SCM_TIMESTAMPING_OPT_STATS: ::c_int = 54; +pub const SO_MEMINFO: ::c_int = 55; +pub const SO_INCOMING_NAPI_ID: ::c_int = 56; +pub const SO_COOKIE: ::c_int = 57; +pub const SCM_TIMESTAMPING_PKTINFO: ::c_int = 58; +pub const SO_PEERGROUPS: ::c_int = 59; +pub const SO_ZEROCOPY: ::c_int = 60; +pub const SO_TXTIME: ::c_int = 61; +pub const SCM_TXTIME: ::c_int = SO_TXTIME; +pub const SO_BINDTOIFINDEX: ::c_int = 62; +// NOTE: These definitions are now being renamed with _OLD postfix, +// but CI haven't support them yet. +// Some related consts could be found in b32.rs and b64.rs +pub const SO_TIMESTAMP: ::c_int = 29; +pub const SO_TIMESTAMPNS: ::c_int = 35; +pub const SO_TIMESTAMPING: ::c_int = 37; +// pub const SO_TIMESTAMP_OLD: ::c_int = 29; +// pub const SO_TIMESTAMPNS_OLD: ::c_int = 35; +// pub const SO_TIMESTAMPING_OLD: ::c_int = 37; +// pub const SO_TIMESTAMP_NEW: ::c_int = 63; +// pub const SO_TIMESTAMPNS_NEW: ::c_int = 64; +// pub const SO_TIMESTAMPING_NEW: ::c_int = 65; +// pub const SO_RCVTIMEO_NEW: ::c_int = 66; +// pub const SO_SNDTIMEO_NEW: ::c_int = 67; +// pub const SO_DETACH_REUSEPORT_BPF: ::c_int = 68; +// pub const SO_PREFER_BUSY_POLL: ::c_int = 69; +// pub const SO_BUSY_POLL_BUDGET: ::c_int = 70; + +pub const FICLONE: ::c_ulong = 0x80049409; +pub const FICLONERANGE: ::c_ulong = 0x8020940D; + +// Defined in unix/linux_like/mod.rs +// pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; + +// Ioctl Constants + +pub const TCGETS: ::Ioctl = 0x540d; +pub const TCSETS: ::Ioctl = 0x540e; +pub const TCSETSW: ::Ioctl = 0x540f; +pub const TCSETSF: ::Ioctl = 0x5410; +pub const TCGETA: ::Ioctl = 0x5401; +pub const TCSETA: ::Ioctl = 0x5402; +pub const TCSETAW: ::Ioctl = 0x5403; +pub const TCSETAF: ::Ioctl = 0x5404; +pub const TCSBRK: ::Ioctl = 0x5405; +pub const TCXONC: ::Ioctl = 0x5406; +pub const TCFLSH: ::Ioctl = 0x5407; +pub const TIOCEXCL: ::Ioctl = 0x740d; +pub const TIOCNXCL: ::Ioctl = 0x740e; +pub const TIOCSCTTY: ::Ioctl = 0x5480; +pub const TIOCGPGRP: ::Ioctl = 0x40047477; +pub const TIOCSPGRP: ::Ioctl = 0x80047476; +pub const TIOCOUTQ: ::Ioctl = 0x7472; +pub const TIOCSTI: ::Ioctl = 0x5472; +pub const TIOCGWINSZ: ::Ioctl = 0x40087468; +pub const TIOCSWINSZ: ::Ioctl = 0x80087467; +pub const TIOCMGET: ::Ioctl = 0x741d; +pub const TIOCMBIS: ::Ioctl = 0x741b; +pub const TIOCMBIC: ::Ioctl = 0x741c; +pub const TIOCMSET: ::Ioctl = 0x741a; +pub const TIOCGSOFTCAR: ::Ioctl = 0x5481; +pub const TIOCSSOFTCAR: ::Ioctl = 0x5482; +pub const FIONREAD: ::Ioctl = 0x467f; +pub const TIOCINQ: ::Ioctl = FIONREAD; +pub const TIOCLINUX: ::Ioctl = 0x5483; +pub const TIOCCONS: ::Ioctl = 0x80047478; +pub const TIOCGSERIAL: ::Ioctl = 0x5484; +pub const TIOCSSERIAL: ::Ioctl = 0x5485; +pub const TIOCPKT: ::Ioctl = 0x5470; +pub const FIONBIO: ::Ioctl = 0x667e; +pub const TIOCNOTTY: ::Ioctl = 0x5471; +pub const TIOCSETD: ::Ioctl = 0x7401; +pub const TIOCGETD: ::Ioctl = 0x7400; +pub const TCSBRKP: ::Ioctl = 0x5486; +pub const TIOCSBRK: ::Ioctl = 0x5427; +pub const TIOCCBRK: ::Ioctl = 0x5428; +pub const TIOCGSID: ::Ioctl = 0x7416; +pub const TCGETS2: ::Ioctl = 0x4030542a; +pub const TCSETS2: ::Ioctl = 0x8030542b; +pub const TCSETSW2: ::Ioctl = 0x8030542c; +pub const TCSETSF2: ::Ioctl = 0x8030542d; +pub const TIOCGPTN: ::Ioctl = 0x40045430; +pub const TIOCSPTLCK: ::Ioctl = 0x80045431; +pub const TIOCGDEV: ::Ioctl = 0x40045432; +pub const TIOCSIG: ::Ioctl = 0x80045436; +pub const TIOCVHANGUP: ::Ioctl = 0x5437; +pub const TIOCGPKT: ::Ioctl = 0x40045438; +pub const TIOCGPTLCK: ::Ioctl = 0x40045439; +pub const TIOCGEXCL: ::Ioctl = 0x40045440; +pub const TIOCGPTPEER: ::Ioctl = 0x20005441; +//pub const TIOCGISO7816: ::Ioctl = 0x40285442; +//pub const TIOCSISO7816: ::Ioctl = 0xc0285443; +pub const FIONCLEX: ::Ioctl = 0x6602; +pub const FIOCLEX: ::Ioctl = 0x6601; +pub const FIOASYNC: ::Ioctl = 0x667d; +pub const TIOCSERCONFIG: ::Ioctl = 0x5488; +pub const TIOCSERGWILD: ::Ioctl = 0x5489; +pub const TIOCSERSWILD: ::Ioctl = 0x548a; +pub const TIOCGLCKTRMIOS: ::Ioctl = 0x548b; +pub const TIOCSLCKTRMIOS: ::Ioctl = 0x548c; +pub const TIOCSERGSTRUCT: ::Ioctl = 0x548d; +pub const TIOCSERGETLSR: ::Ioctl = 0x548e; +pub const TIOCSERGETMULTI: ::Ioctl = 0x548f; +pub const TIOCSERSETMULTI: ::Ioctl = 0x5490; +pub const TIOCMIWAIT: ::Ioctl = 0x5491; +pub const TIOCGICOUNT: ::Ioctl = 0x5492; +pub const FIOQSIZE: ::Ioctl = 0x667f; +pub const TIOCSLTC: ::Ioctl = 0x7475; +pub const TIOCGETP: ::Ioctl = 0x7408; +pub const TIOCSETP: ::Ioctl = 0x7409; +pub const TIOCSETN: ::Ioctl = 0x740a; +pub const BLKIOMIN: ::Ioctl = 0x20001278; +pub const BLKIOOPT: ::Ioctl = 0x20001279; +pub const BLKSSZGET: ::Ioctl = 0x20001268; +pub const BLKPBSZGET: ::Ioctl = 0x2000127B; + +cfg_if! { + if #[cfg(target_env = "musl")] { + pub const TIOCGRS485: ::Ioctl = 0x4020542e; + pub const TIOCSRS485: ::Ioctl = 0xc020542f; + } +} + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x010; +pub const TIOCM_SR: ::c_int = 0x020; +pub const TIOCM_CTS: ::c_int = 0x040; +pub const TIOCM_CAR: ::c_int = 0x100; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RNG: ::c_int = 0x200; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const TIOCM_DSR: ::c_int = 0x400; + +pub const BOTHER: ::speed_t = 0o010000; +pub const IBSHIFT: ::tcflag_t = 16; + +// RLIMIT Constants + +cfg_if! { + if #[cfg(any(target_env = "gnu", + target_env = "uclibc"))] { + + pub const RLIMIT_CPU: ::__rlimit_resource_t = 0; + pub const RLIMIT_FSIZE: ::__rlimit_resource_t = 1; + pub const RLIMIT_DATA: ::__rlimit_resource_t = 2; + pub const RLIMIT_STACK: ::__rlimit_resource_t = 3; + pub const RLIMIT_CORE: ::__rlimit_resource_t = 4; + pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 5; + pub const RLIMIT_AS: ::__rlimit_resource_t = 6; + pub const RLIMIT_RSS: ::__rlimit_resource_t = 7; + pub const RLIMIT_NPROC: ::__rlimit_resource_t = 8; + pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 9; + pub const RLIMIT_LOCKS: ::__rlimit_resource_t = 10; + pub const RLIMIT_SIGPENDING: ::__rlimit_resource_t = 11; + pub const RLIMIT_MSGQUEUE: ::__rlimit_resource_t = 12; + pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; + pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; + pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; + pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; + + } else if #[cfg(target_env = "musl")] { + + pub const RLIMIT_CPU: ::c_int = 0; + pub const RLIMIT_FSIZE: ::c_int = 1; + pub const RLIMIT_DATA: ::c_int = 2; + pub const RLIMIT_STACK: ::c_int = 3; + pub const RLIMIT_CORE: ::c_int = 4; + pub const RLIMIT_NOFILE: ::c_int = 5; + pub const RLIMIT_AS: ::c_int = 6; + pub const RLIMIT_RSS: ::c_int = 7; + pub const RLIMIT_NPROC: ::c_int = 8; + pub const RLIMIT_MEMLOCK: ::c_int = 9; + pub const RLIMIT_LOCKS: ::c_int = 10; + pub const RLIMIT_SIGPENDING: ::c_int = 11; + pub const RLIMIT_MSGQUEUE: ::c_int = 12; + pub const RLIMIT_NICE: ::c_int = 13; + pub const RLIMIT_RTPRIO: ::c_int = 14; + pub const RLIMIT_RTTIME: ::c_int = 15; + pub const RLIM_NLIMITS: ::c_int = 15; + pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; + pub const RLIM_INFINITY: ::rlim_t = !0; + } +} + +cfg_if! { + if #[cfg(target_env = "gnu")] { + pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; + } else if #[cfg(target_env = "uclibc")] { + pub const RLIM_NLIMITS: ::__rlimit_resource_t = 15; + } +} + +cfg_if! { + if #[cfg(target_arch = "mips64", + any(target_env = "gnu", + target_env = "uclibc"))] { + pub const RLIM_INFINITY: ::rlim_t = !0; + } +} + +cfg_if! { + if #[cfg(target_arch = "mips", + any(target_env = "gnu", + target_env = "uclibc"))] { + pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mod.rs new file mode 100644 index 0000000..c1528f5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/mod.rs @@ -0,0 +1,15 @@ +cfg_if! { + if #[cfg(any(target_arch = "mips", target_arch = "mips64"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] { + mod sparc; + pub use self::sparc::*; + } else { + mod generic; + pub use self::generic::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs new file mode 100644 index 0000000..64c3eaa --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs @@ -0,0 +1,243 @@ +// arch/powerpc/include/uapi/asm/socket.h + +pub const SOL_SOCKET: ::c_int = 1; + +// Defined in unix/linux_like/mod.rs +// pub const SO_DEBUG: ::c_int = 1; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +// powerpc only differs in these +pub const SO_RCVLOWAT: ::c_int = 16; +pub const SO_SNDLOWAT: ::c_int = 17; +pub const SO_RCVTIMEO: ::c_int = 18; +pub const SO_SNDTIMEO: ::c_int = 19; +// pub const SO_RCVTIMEO_OLD: ::c_int = 18; +// pub const SO_SNDTIMEO_OLD: ::c_int = 19; +pub const SO_PASSCRED: ::c_int = 20; +pub const SO_PEERCRED: ::c_int = 21; +// end +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24; +pub const SO_BINDTODEVICE: ::c_int = 25; +pub const SO_ATTACH_FILTER: ::c_int = 26; +pub const SO_DETACH_FILTER: ::c_int = 27; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 28; +pub const SO_TIMESTAMP: ::c_int = 29; +// pub const SO_TIMESTAMP_OLD: ::c_int = 29; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PASSSEC: ::c_int = 34; +pub const SO_TIMESTAMPNS: ::c_int = 35; +// pub const SO_TIMESTAMPNS_OLD: ::c_int = 35; +pub const SO_MARK: ::c_int = 36; +pub const SO_TIMESTAMPING: ::c_int = 37; +// pub const SO_TIMESTAMPING_OLD: ::c_int = 37; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SO_RXQ_OVFL: ::c_int = 40; +pub const SO_WIFI_STATUS: ::c_int = 41; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 42; +pub const SO_NOFCS: ::c_int = 43; +pub const SO_LOCK_FILTER: ::c_int = 44; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 45; +pub const SO_BUSY_POLL: ::c_int = 46; +pub const SO_MAX_PACING_RATE: ::c_int = 47; +pub const SO_BPF_EXTENSIONS: ::c_int = 48; +pub const SO_INCOMING_CPU: ::c_int = 49; +pub const SO_ATTACH_BPF: ::c_int = 50; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; +pub const SO_ATTACH_REUSEPORT_CBPF: ::c_int = 51; +pub const SO_ATTACH_REUSEPORT_EBPF: ::c_int = 52; +pub const SO_CNX_ADVICE: ::c_int = 53; +pub const SCM_TIMESTAMPING_OPT_STATS: ::c_int = 54; +pub const SO_MEMINFO: ::c_int = 55; +pub const SO_INCOMING_NAPI_ID: ::c_int = 56; +pub const SO_COOKIE: ::c_int = 57; +pub const SCM_TIMESTAMPING_PKTINFO: ::c_int = 58; +pub const SO_PEERGROUPS: ::c_int = 59; +pub const SO_ZEROCOPY: ::c_int = 60; +pub const SO_TXTIME: ::c_int = 61; +pub const SCM_TXTIME: ::c_int = SO_TXTIME; +pub const SO_BINDTOIFINDEX: ::c_int = 62; +// pub const SO_TIMESTAMP_NEW: ::c_int = 63; +// pub const SO_TIMESTAMPNS_NEW: ::c_int = 64; +// pub const SO_TIMESTAMPING_NEW: ::c_int = 65; +// pub const SO_RCVTIMEO_NEW: ::c_int = 66; +// pub const SO_SNDTIMEO_NEW: ::c_int = 67; +// pub const SO_DETACH_REUSEPORT_BPF: ::c_int = 68; +// pub const SO_PREFER_BUSY_POLL: ::c_int = 69; +// pub const SO_BUSY_POLL_BUDGET: ::c_int = 70; + +pub const FICLONE: ::c_ulong = 0x80049409; +pub const FICLONERANGE: ::c_ulong = 0x8020940D; + +// Defined in unix/linux_like/mod.rs +// pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; + +// Ioctl Constants + +cfg_if! { + if #[cfg(target_env = "gnu")] { + pub const TCGETS: ::Ioctl = 0x403c7413; + pub const TCSETS: ::Ioctl = 0x803c7414; + pub const TCSETSW: ::Ioctl = 0x803c7415; + pub const TCSETSF: ::Ioctl = 0x803c7416; + } else if #[cfg(target_env = "musl")] { + pub const TCGETS: ::Ioctl = 0x402c7413; + pub const TCSETS: ::Ioctl = 0x802c7414; + pub const TCSETSW: ::Ioctl = 0x802c7415; + pub const TCSETSF: ::Ioctl = 0x802c7416; + } +} + +pub const TCGETA: ::Ioctl = 0x40147417; +pub const TCSETA: ::Ioctl = 0x80147418; +pub const TCSETAW: ::Ioctl = 0x80147419; +pub const TCSETAF: ::Ioctl = 0x8014741C; +pub const TCSBRK: ::Ioctl = 0x2000741D; +pub const TCXONC: ::Ioctl = 0x2000741E; +pub const TCFLSH: ::Ioctl = 0x2000741F; +pub const TIOCEXCL: ::Ioctl = 0x540C; +pub const TIOCNXCL: ::Ioctl = 0x540D; +pub const TIOCSCTTY: ::Ioctl = 0x540E; +pub const TIOCGPGRP: ::Ioctl = 0x40047477; +pub const TIOCSPGRP: ::Ioctl = 0x80047476; +pub const TIOCOUTQ: ::Ioctl = 0x40047473; +pub const TIOCSTI: ::Ioctl = 0x5412; +pub const TIOCGWINSZ: ::Ioctl = 0x40087468; +pub const TIOCSWINSZ: ::Ioctl = 0x80087467; +pub const TIOCMGET: ::Ioctl = 0x5415; +pub const TIOCMBIS: ::Ioctl = 0x5416; +pub const TIOCMBIC: ::Ioctl = 0x5417; +pub const TIOCMSET: ::Ioctl = 0x5418; +pub const TIOCGSOFTCAR: ::Ioctl = 0x5419; +pub const TIOCSSOFTCAR: ::Ioctl = 0x541A; +pub const FIONREAD: ::Ioctl = 0x4004667F; +pub const TIOCINQ: ::Ioctl = FIONREAD; +pub const TIOCLINUX: ::Ioctl = 0x541C; +pub const TIOCCONS: ::Ioctl = 0x541D; +pub const TIOCGSERIAL: ::Ioctl = 0x541E; +pub const TIOCSSERIAL: ::Ioctl = 0x541F; +pub const TIOCPKT: ::Ioctl = 0x5420; +pub const FIONBIO: ::Ioctl = 0x8004667e; +pub const TIOCNOTTY: ::Ioctl = 0x5422; +pub const TIOCSETD: ::Ioctl = 0x5423; +pub const TIOCGETD: ::Ioctl = 0x5424; +pub const TCSBRKP: ::Ioctl = 0x5425; +pub const TIOCSBRK: ::Ioctl = 0x5427; +pub const TIOCCBRK: ::Ioctl = 0x5428; +pub const TIOCGSID: ::Ioctl = 0x5429; +pub const TIOCGRS485: ::Ioctl = 0x542e; +pub const TIOCSRS485: ::Ioctl = 0x542f; +pub const TIOCGPTN: ::Ioctl = 0x40045430; +pub const TIOCSPTLCK: ::Ioctl = 0x80045431; +pub const TIOCGDEV: ::Ioctl = 0x40045432; +pub const TIOCSIG: ::Ioctl = 0x80045436; +pub const TIOCVHANGUP: ::Ioctl = 0x5437; +pub const TIOCGPKT: ::Ioctl = 0x40045438; +pub const TIOCGPTLCK: ::Ioctl = 0x40045439; +pub const TIOCGEXCL: ::Ioctl = 0x40045440; +pub const TIOCGPTPEER: ::Ioctl = 0x20005441; +//pub const TIOCGISO7816: ::Ioctl = 0x40285442; +//pub const TIOCSISO7816: ::Ioctl = 0xc0285443; +pub const FIONCLEX: ::Ioctl = 0x20006602; +pub const FIOCLEX: ::Ioctl = 0x20006601; +pub const FIOASYNC: ::Ioctl = 0x8004667d; +pub const TIOCSERCONFIG: ::Ioctl = 0x5453; +pub const TIOCSERGWILD: ::Ioctl = 0x5454; +pub const TIOCSERSWILD: ::Ioctl = 0x5455; +pub const TIOCGLCKTRMIOS: ::Ioctl = 0x5456; +pub const TIOCSLCKTRMIOS: ::Ioctl = 0x5457; +pub const TIOCSERGSTRUCT: ::Ioctl = 0x5458; +pub const TIOCSERGETLSR: ::Ioctl = 0x5459; +pub const TIOCSERGETMULTI: ::Ioctl = 0x545A; +pub const TIOCSERSETMULTI: ::Ioctl = 0x545B; +pub const TIOCMIWAIT: ::Ioctl = 0x545C; +pub const TIOCGICOUNT: ::Ioctl = 0x545D; +pub const BLKIOMIN: ::Ioctl = 0x20001278; +pub const BLKIOOPT: ::Ioctl = 0x20001279; +pub const BLKSSZGET: ::Ioctl = 0x20001268; +pub const BLKPBSZGET: ::Ioctl = 0x2000127B; +//pub const FIOQSIZE: ::Ioctl = 0x40086680; + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const TIOCM_DSR: ::c_int = 0x100; + +pub const BOTHER: ::speed_t = 0o0037; +pub const IBSHIFT: ::tcflag_t = 16; + +// RLIMIT Constants + +cfg_if! { + if #[cfg(target_env = "gnu")] { + + pub const RLIMIT_CPU: ::__rlimit_resource_t = 0; + pub const RLIMIT_FSIZE: ::__rlimit_resource_t = 1; + pub const RLIMIT_DATA: ::__rlimit_resource_t = 2; + pub const RLIMIT_STACK: ::__rlimit_resource_t = 3; + pub const RLIMIT_CORE: ::__rlimit_resource_t = 4; + pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; + pub const RLIMIT_NPROC: ::__rlimit_resource_t = 6; + pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 7; + pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 8; + pub const RLIMIT_AS: ::__rlimit_resource_t = 9; + pub const RLIMIT_LOCKS: ::__rlimit_resource_t = 10; + pub const RLIMIT_SIGPENDING: ::__rlimit_resource_t = 11; + pub const RLIMIT_MSGQUEUE: ::__rlimit_resource_t = 12; + pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; + pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; + pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; + pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; + pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; + + } else if #[cfg(target_env = "musl")] { + + pub const RLIMIT_CPU: ::c_int = 0; + pub const RLIMIT_FSIZE: ::c_int = 1; + pub const RLIMIT_DATA: ::c_int = 2; + pub const RLIMIT_STACK: ::c_int = 3; + pub const RLIMIT_CORE: ::c_int = 4; + pub const RLIMIT_RSS: ::c_int = 5; + pub const RLIMIT_NPROC: ::c_int = 6; + pub const RLIMIT_NOFILE: ::c_int = 7; + pub const RLIMIT_MEMLOCK: ::c_int = 8; + pub const RLIMIT_AS: ::c_int = 9; + pub const RLIMIT_LOCKS: ::c_int = 10; + pub const RLIMIT_SIGPENDING: ::c_int = 11; + pub const RLIMIT_MSGQUEUE: ::c_int = 12; + pub const RLIMIT_NICE: ::c_int = 13; + pub const RLIMIT_RTPRIO: ::c_int = 14; + pub const RLIMIT_RTTIME: ::c_int = 15; + pub const RLIM_NLIMITS: ::c_int = 15; + pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; + } +} +pub const RLIM_INFINITY: ::rlim_t = !0; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs new file mode 100644 index 0000000..da3e388 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs @@ -0,0 +1,228 @@ +s! { + pub struct termios2 { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; 19], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } +} + +// arch/sparc/include/uapi/asm/socket.h +pub const SOL_SOCKET: ::c_int = 0xffff; + +// Defined in unix/linux_like/mod.rs +// pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_PASSCRED: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_PEERCRED: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_BSDCOMPAT: ::c_int = 0x0400; +pub const SO_RCVLOWAT: ::c_int = 0x0800; +pub const SO_SNDLOWAT: ::c_int = 0x1000; +pub const SO_RCVTIMEO: ::c_int = 0x2000; +pub const SO_SNDTIMEO: ::c_int = 0x4000; +// pub const SO_RCVTIMEO_OLD: ::c_int = 0x2000; +// pub const SO_SNDTIMEO_OLD: ::c_int = 0x4000; +pub const SO_ACCEPTCONN: ::c_int = 0x8000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDBUFFORCE: ::c_int = 0x100a; +pub const SO_RCVBUFFORCE: ::c_int = 0x100b; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_PROTOCOL: ::c_int = 0x1028; +pub const SO_DOMAIN: ::c_int = 0x1029; +pub const SO_NO_CHECK: ::c_int = 0x000b; +pub const SO_PRIORITY: ::c_int = 0x000c; +pub const SO_BINDTODEVICE: ::c_int = 0x000d; +pub const SO_ATTACH_FILTER: ::c_int = 0x001a; +pub const SO_DETACH_FILTER: ::c_int = 0x001b; +pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; +pub const SO_PEERNAME: ::c_int = 0x001c; +pub const SO_PEERSEC: ::c_int = 0x001e; +pub const SO_PASSSEC: ::c_int = 0x001f; +pub const SO_MARK: ::c_int = 0x0022; +pub const SO_RXQ_OVFL: ::c_int = 0x0024; +pub const SO_WIFI_STATUS: ::c_int = 0x0025; +pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; +pub const SO_PEEK_OFF: ::c_int = 0x0026; +pub const SO_NOFCS: ::c_int = 0x0027; +pub const SO_LOCK_FILTER: ::c_int = 0x0028; +pub const SO_SELECT_ERR_QUEUE: ::c_int = 0x0029; +pub const SO_BUSY_POLL: ::c_int = 0x0030; +pub const SO_MAX_PACING_RATE: ::c_int = 0x0031; +pub const SO_BPF_EXTENSIONS: ::c_int = 0x0032; +pub const SO_INCOMING_CPU: ::c_int = 0x0033; +pub const SO_ATTACH_BPF: ::c_int = 0x0034; +pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER; +pub const SO_ATTACH_REUSEPORT_CBPF: ::c_int = 0x0035; +pub const SO_ATTACH_REUSEPORT_EBPF: ::c_int = 0x0036; +pub const SO_CNX_ADVICE: ::c_int = 0x0037; +pub const SCM_TIMESTAMPING_OPT_STATS: ::c_int = 0x0038; +pub const SO_MEMINFO: ::c_int = 0x0039; +pub const SO_INCOMING_NAPI_ID: ::c_int = 0x003a; +pub const SO_COOKIE: ::c_int = 0x003b; +pub const SCM_TIMESTAMPING_PKTINFO: ::c_int = 0x003c; +pub const SO_PEERGROUPS: ::c_int = 0x003d; +pub const SO_ZEROCOPY: ::c_int = 0x003e; +pub const SO_TXTIME: ::c_int = 0x003f; +pub const SCM_TXTIME: ::c_int = SO_TXTIME; +pub const SO_BINDTOIFINDEX: ::c_int = 0x0041; +pub const SO_SECURITY_AUTHENTICATION: ::c_int = 0x5001; +pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 0x5002; +pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 0x5004; +pub const SO_TIMESTAMP: ::c_int = 0x001d; +pub const SO_TIMESTAMPNS: ::c_int = 0x0021; +pub const SO_TIMESTAMPING: ::c_int = 0x0023; +// pub const SO_TIMESTAMP_OLD: ::c_int = 0x001d; +// pub const SO_TIMESTAMPNS_OLD: ::c_int = 0x0021; +// pub const SO_TIMESTAMPING_OLD: ::c_int = 0x0023; +// pub const SO_TIMESTAMP_NEW: ::c_int = 0x0046; +// pub const SO_TIMESTAMPNS_NEW: ::c_int = 0x0042; +// pub const SO_TIMESTAMPING_NEW: ::c_int = 0x0043; +// pub const SO_RCVTIMEO_NEW: ::c_int = 0x0044; +// pub const SO_SNDTIMEO_NEW: ::c_int = 0x0045; +// pub const SO_DETACH_REUSEPORT_BPF: ::c_int = 0x0047; +// pub const SO_PREFER_BUSY_POLL: ::c_int = 0x0048; +// pub const SO_BUSY_POLL_BUDGET: ::c_int = 0x0049; + +// Defined in unix/linux_like/mod.rs +// pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; +pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; +pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; + +// Ioctl Constants + +pub const TCGETS: ::Ioctl = 0x40245408; +pub const TCSETS: ::Ioctl = 0x80245409; +pub const TCSETSW: ::Ioctl = 0x8024540a; +pub const TCSETSF: ::Ioctl = 0x8024540b; +pub const TCGETA: ::Ioctl = 0x40125401; +pub const TCSETA: ::Ioctl = 0x80125402; +pub const TCSETAW: ::Ioctl = 0x80125403; +pub const TCSETAF: ::Ioctl = 0x80125404; +pub const TCSBRK: ::Ioctl = 0x20005405; +pub const TCXONC: ::Ioctl = 0x20005406; +pub const TCFLSH: ::Ioctl = 0x20005407; +pub const TIOCEXCL: ::Ioctl = 0x2000740d; +pub const TIOCNXCL: ::Ioctl = 0x2000740e; +pub const TIOCSCTTY: ::Ioctl = 0x20007484; +pub const TIOCGPGRP: ::Ioctl = 0x40047483; +pub const TIOCSPGRP: ::Ioctl = 0x80047482; +pub const TIOCOUTQ: ::Ioctl = 0x40047473; +pub const TIOCSTI: ::Ioctl = 0x80017472; +pub const TIOCGWINSZ: ::Ioctl = 0x40087468; +pub const TIOCSWINSZ: ::Ioctl = 0x80087467; +pub const TIOCMGET: ::Ioctl = 0x4004746a; +pub const TIOCMBIS: ::Ioctl = 0x8004746c; +pub const TIOCMBIC: ::Ioctl = 0x8004746b; +pub const TIOCMSET: ::Ioctl = 0x8004746d; +pub const TIOCGSOFTCAR: ::Ioctl = 0x40047464; +pub const TIOCSSOFTCAR: ::Ioctl = 0x80047465; +pub const FIONREAD: ::Ioctl = 0x4004667f; +pub const TIOCINQ: ::Ioctl = FIONREAD; +pub const TIOCLINUX: ::Ioctl = 0x541C; +pub const TIOCCONS: ::Ioctl = 0x20007424; +pub const TIOCGSERIAL: ::Ioctl = 0x541E; +pub const TIOCSSERIAL: ::Ioctl = 0x541F; +pub const TIOCPKT: ::Ioctl = 0x80047470; +pub const FIONBIO: ::Ioctl = 0x8004667e; +pub const TIOCNOTTY: ::Ioctl = 0x20007471; +pub const TIOCSETD: ::Ioctl = 0x80047401; +pub const TIOCGETD: ::Ioctl = 0x40047400; +pub const TCSBRKP: ::Ioctl = 0x5425; +pub const TIOCSBRK: ::Ioctl = 0x2000747b; +pub const TIOCCBRK: ::Ioctl = 0x2000747a; +pub const TIOCGSID: ::Ioctl = 0x40047485; +pub const TCGETS2: ::Ioctl = 0x402c540c; +pub const TCSETS2: ::Ioctl = 0x802c540d; +pub const TCSETSW2: ::Ioctl = 0x802c540e; +pub const TCSETSF2: ::Ioctl = 0x802c540f; +pub const TIOCGPTN: ::Ioctl = 0x40047486; +pub const TIOCSPTLCK: ::Ioctl = 0x80047487; +pub const TIOCGDEV: ::Ioctl = 0x40045432; +pub const TIOCSIG: ::Ioctl = 0x80047488; +pub const TIOCVHANGUP: ::Ioctl = 0x20005437; +pub const TIOCGPKT: ::Ioctl = 0x40045438; +pub const TIOCGPTLCK: ::Ioctl = 0x40045439; +pub const TIOCGEXCL: ::Ioctl = 0x40045440; +pub const TIOCGPTPEER: ::Ioctl = 0x20007489; +pub const FIONCLEX: ::Ioctl = 0x20006602; +pub const FIOCLEX: ::Ioctl = 0x20006601; +pub const TIOCSERCONFIG: ::Ioctl = 0x5453; +pub const TIOCSERGWILD: ::Ioctl = 0x5454; +pub const TIOCSERSWILD: ::Ioctl = 0x5455; +pub const TIOCGLCKTRMIOS: ::Ioctl = 0x5456; +pub const TIOCSLCKTRMIOS: ::Ioctl = 0x5457; +pub const TIOCSERGSTRUCT: ::Ioctl = 0x5458; +pub const TIOCSERGETLSR: ::Ioctl = 0x5459; +pub const TIOCSERGETMULTI: ::Ioctl = 0x545A; +pub const TIOCSERSETMULTI: ::Ioctl = 0x545B; +pub const TIOCMIWAIT: ::Ioctl = 0x545C; +pub const TIOCGICOUNT: ::Ioctl = 0x545D; +pub const TIOCSTART: ::Ioctl = 0x2000746e; +pub const TIOCSTOP: ::Ioctl = 0x2000746f; +pub const BLKIOMIN: ::Ioctl = 0x20001278; +pub const BLKIOOPT: ::Ioctl = 0x20001279; +pub const BLKSSZGET: ::Ioctl = 0x20001268; +pub const BLKPBSZGET: ::Ioctl = 0x2000127B; + +//pub const FIOASYNC: ::Ioctl = 0x4004667d; +//pub const FIOQSIZE: ::Ioctl = ; +//pub const TIOCGISO7816: ::Ioctl = 0x40285443; +//pub const TIOCSISO7816: ::Ioctl = 0xc0285444; +//pub const TIOCGRS485: ::Ioctl = 0x40205441; +//pub const TIOCSRS485: ::Ioctl = 0xc0205442; + +pub const TIOCM_LE: ::c_int = 0x001; +pub const TIOCM_DTR: ::c_int = 0x002; +pub const TIOCM_RTS: ::c_int = 0x004; +pub const TIOCM_ST: ::c_int = 0x008; +pub const TIOCM_SR: ::c_int = 0x010; +pub const TIOCM_CTS: ::c_int = 0x020; +pub const TIOCM_CAR: ::c_int = 0x040; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RNG: ::c_int = 0x080; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const TIOCM_DSR: ::c_int = 0x100; + +pub const BOTHER: ::speed_t = 0x1000; +pub const IBSHIFT: ::tcflag_t = 16; + +// RLIMIT Constants + +pub const RLIMIT_CPU: ::__rlimit_resource_t = 0; +pub const RLIMIT_FSIZE: ::__rlimit_resource_t = 1; +pub const RLIMIT_DATA: ::__rlimit_resource_t = 2; +pub const RLIMIT_STACK: ::__rlimit_resource_t = 3; +pub const RLIMIT_CORE: ::__rlimit_resource_t = 4; +pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; +pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 6; +pub const RLIMIT_NPROC: ::__rlimit_resource_t = 7; +pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 8; +pub const RLIMIT_AS: ::__rlimit_resource_t = 9; +pub const RLIMIT_LOCKS: ::__rlimit_resource_t = 10; +pub const RLIMIT_SIGPENDING: ::__rlimit_resource_t = 11; +pub const RLIMIT_MSGQUEUE: ::__rlimit_resource_t = 12; +pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; +pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; +pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; +pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; +pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; + +cfg_if! { + if #[cfg(target_arch = "sparc64")] { + pub const RLIM_INFINITY: ::rlim_t = !0; + } else if #[cfg(target_arch = "sparc")] { + pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/align.rs new file mode 100644 index 0000000..4a0e074 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/align.rs @@ -0,0 +1,13 @@ +s! { + // FIXME this is actually a union + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/align.rs new file mode 100644 index 0000000..2645ec4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/align.rs @@ -0,0 +1,53 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [i64; 2] + } + + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: ::mcontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_regspace: [::c_ulong; 128], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_link) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs new file mode 100644 index 0000000..fd690a1 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/arm/mod.rs @@ -0,0 +1,874 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: ::c_uint, + __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_uint, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino64_t, + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_ulong, + pub shm_dtime: ::time_t, + __unused2: ::c_ulong, + pub shm_ctime: ::time_t, + __unused3: ::c_ulong, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __glibc_reserved1: ::c_ulong, + pub msg_rtime: ::time_t, + __glibc_reserved2: ::c_ulong, + pub msg_ctime: ::time_t, + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct seccomp_notif_sizes { + pub seccomp_notif: ::__u16, + pub seccomp_notif_resp: ::__u16, + pub seccomp_data: ::__u16, + } + + pub struct mcontext_t { + pub trap_no: ::c_ulong, + pub error_code: ::c_ulong, + pub oldmask: ::c_ulong, + pub arm_r0: ::c_ulong, + pub arm_r1: ::c_ulong, + pub arm_r2: ::c_ulong, + pub arm_r3: ::c_ulong, + pub arm_r4: ::c_ulong, + pub arm_r5: ::c_ulong, + pub arm_r6: ::c_ulong, + pub arm_r7: ::c_ulong, + pub arm_r8: ::c_ulong, + pub arm_r9: ::c_ulong, + pub arm_r10: ::c_ulong, + pub arm_fp: ::c_ulong, + pub arm_ip: ::c_ulong, + pub arm_sp: ::c_ulong, + pub arm_lr: ::c_ulong, + pub arm_pc: ::c_ulong, + pub arm_cpsr: ::c_ulong, + pub fault_address: ::c_ulong, + } + + pub struct user_regs { + pub arm_r0: ::c_ulong, + pub arm_r1: ::c_ulong, + pub arm_r2: ::c_ulong, + pub arm_r3: ::c_ulong, + pub arm_r4: ::c_ulong, + pub arm_r5: ::c_ulong, + pub arm_r6: ::c_ulong, + pub arm_r7: ::c_ulong, + pub arm_r8: ::c_ulong, + pub arm_r9: ::c_ulong, + pub arm_r10: ::c_ulong, + pub arm_fp: ::c_ulong, + pub arm_ip: ::c_ulong, + pub arm_sp: ::c_ulong, + pub arm_lr: ::c_ulong, + pub arm_pc: ::c_ulong, + pub arm_cpsr: ::c_ulong, + pub arm_orig_r0: ::c_ulong, + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_LARGEFILE: ::c_int = 0o400000; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; + +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const SECCOMP_SET_MODE_STRICT: ::c_uint = 0; +pub const SECCOMP_SET_MODE_FILTER: ::c_uint = 1; +pub const SECCOMP_GET_ACTION_AVAIL: ::c_uint = 2; +pub const SECCOMP_GET_NOTIF_SIZES: ::c_uint = 3; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_pause: ::c_long = 29; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_pivot_root: ::c_long = 218; +pub const SYS_mincore: ::c_long = 219; +pub const SYS_madvise: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_lookup_dcookie: ::c_long = 249; +pub const SYS_epoll_create: ::c_long = 250; +pub const SYS_epoll_ctl: ::c_long = 251; +pub const SYS_epoll_wait: ::c_long = 252; +pub const SYS_remap_file_pages: ::c_long = 253; +pub const SYS_set_tid_address: ::c_long = 256; +pub const SYS_timer_create: ::c_long = 257; +pub const SYS_timer_settime: ::c_long = 258; +pub const SYS_timer_gettime: ::c_long = 259; +pub const SYS_timer_getoverrun: ::c_long = 260; +pub const SYS_timer_delete: ::c_long = 261; +pub const SYS_clock_settime: ::c_long = 262; +pub const SYS_clock_gettime: ::c_long = 263; +pub const SYS_clock_getres: ::c_long = 264; +pub const SYS_clock_nanosleep: ::c_long = 265; +pub const SYS_statfs64: ::c_long = 266; +pub const SYS_fstatfs64: ::c_long = 267; +pub const SYS_tgkill: ::c_long = 268; +pub const SYS_utimes: ::c_long = 269; +pub const SYS_arm_fadvise64_64: ::c_long = 270; +pub const SYS_pciconfig_iobase: ::c_long = 271; +pub const SYS_pciconfig_read: ::c_long = 272; +pub const SYS_pciconfig_write: ::c_long = 273; +pub const SYS_mq_open: ::c_long = 274; +pub const SYS_mq_unlink: ::c_long = 275; +pub const SYS_mq_timedsend: ::c_long = 276; +pub const SYS_mq_timedreceive: ::c_long = 277; +pub const SYS_mq_notify: ::c_long = 278; +pub const SYS_mq_getsetattr: ::c_long = 279; +pub const SYS_waitid: ::c_long = 280; +pub const SYS_socket: ::c_long = 281; +pub const SYS_bind: ::c_long = 282; +pub const SYS_connect: ::c_long = 283; +pub const SYS_listen: ::c_long = 284; +pub const SYS_accept: ::c_long = 285; +pub const SYS_getsockname: ::c_long = 286; +pub const SYS_getpeername: ::c_long = 287; +pub const SYS_socketpair: ::c_long = 288; +pub const SYS_send: ::c_long = 289; +pub const SYS_sendto: ::c_long = 290; +pub const SYS_recv: ::c_long = 291; +pub const SYS_recvfrom: ::c_long = 292; +pub const SYS_shutdown: ::c_long = 293; +pub const SYS_setsockopt: ::c_long = 294; +pub const SYS_getsockopt: ::c_long = 295; +pub const SYS_sendmsg: ::c_long = 296; +pub const SYS_recvmsg: ::c_long = 297; +pub const SYS_semop: ::c_long = 298; +pub const SYS_semget: ::c_long = 299; +pub const SYS_semctl: ::c_long = 300; +pub const SYS_msgsnd: ::c_long = 301; +pub const SYS_msgrcv: ::c_long = 302; +pub const SYS_msgget: ::c_long = 303; +pub const SYS_msgctl: ::c_long = 304; +pub const SYS_shmat: ::c_long = 305; +pub const SYS_shmdt: ::c_long = 306; +pub const SYS_shmget: ::c_long = 307; +pub const SYS_shmctl: ::c_long = 308; +pub const SYS_add_key: ::c_long = 309; +pub const SYS_request_key: ::c_long = 310; +pub const SYS_keyctl: ::c_long = 311; +pub const SYS_semtimedop: ::c_long = 312; +pub const SYS_vserver: ::c_long = 313; +pub const SYS_ioprio_set: ::c_long = 314; +pub const SYS_ioprio_get: ::c_long = 315; +pub const SYS_inotify_init: ::c_long = 316; +pub const SYS_inotify_add_watch: ::c_long = 317; +pub const SYS_inotify_rm_watch: ::c_long = 318; +pub const SYS_mbind: ::c_long = 319; +pub const SYS_get_mempolicy: ::c_long = 320; +pub const SYS_set_mempolicy: ::c_long = 321; +pub const SYS_openat: ::c_long = 322; +pub const SYS_mkdirat: ::c_long = 323; +pub const SYS_mknodat: ::c_long = 324; +pub const SYS_fchownat: ::c_long = 325; +pub const SYS_futimesat: ::c_long = 326; +pub const SYS_fstatat64: ::c_long = 327; +pub const SYS_unlinkat: ::c_long = 328; +pub const SYS_renameat: ::c_long = 329; +pub const SYS_linkat: ::c_long = 330; +pub const SYS_symlinkat: ::c_long = 331; +pub const SYS_readlinkat: ::c_long = 332; +pub const SYS_fchmodat: ::c_long = 333; +pub const SYS_faccessat: ::c_long = 334; +pub const SYS_pselect6: ::c_long = 335; +pub const SYS_ppoll: ::c_long = 336; +pub const SYS_unshare: ::c_long = 337; +pub const SYS_set_robust_list: ::c_long = 338; +pub const SYS_get_robust_list: ::c_long = 339; +pub const SYS_splice: ::c_long = 340; +pub const SYS_arm_sync_file_range: ::c_long = 341; +pub const SYS_tee: ::c_long = 342; +pub const SYS_vmsplice: ::c_long = 343; +pub const SYS_move_pages: ::c_long = 344; +pub const SYS_getcpu: ::c_long = 345; +pub const SYS_epoll_pwait: ::c_long = 346; +pub const SYS_kexec_load: ::c_long = 347; +pub const SYS_utimensat: ::c_long = 348; +pub const SYS_signalfd: ::c_long = 349; +pub const SYS_timerfd_create: ::c_long = 350; +pub const SYS_eventfd: ::c_long = 351; +pub const SYS_fallocate: ::c_long = 352; +pub const SYS_timerfd_settime: ::c_long = 353; +pub const SYS_timerfd_gettime: ::c_long = 354; +pub const SYS_signalfd4: ::c_long = 355; +pub const SYS_eventfd2: ::c_long = 356; +pub const SYS_epoll_create1: ::c_long = 357; +pub const SYS_dup3: ::c_long = 358; +pub const SYS_pipe2: ::c_long = 359; +pub const SYS_inotify_init1: ::c_long = 360; +pub const SYS_preadv: ::c_long = 361; +pub const SYS_pwritev: ::c_long = 362; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 363; +pub const SYS_perf_event_open: ::c_long = 364; +pub const SYS_recvmmsg: ::c_long = 365; +pub const SYS_accept4: ::c_long = 366; +pub const SYS_fanotify_init: ::c_long = 367; +pub const SYS_fanotify_mark: ::c_long = 368; +pub const SYS_prlimit64: ::c_long = 369; +pub const SYS_name_to_handle_at: ::c_long = 370; +pub const SYS_open_by_handle_at: ::c_long = 371; +pub const SYS_clock_adjtime: ::c_long = 372; +pub const SYS_syncfs: ::c_long = 373; +pub const SYS_sendmmsg: ::c_long = 374; +pub const SYS_setns: ::c_long = 375; +pub const SYS_process_vm_readv: ::c_long = 376; +pub const SYS_process_vm_writev: ::c_long = 377; +pub const SYS_kcmp: ::c_long = 378; +pub const SYS_finit_module: ::c_long = 379; +pub const SYS_sched_setattr: ::c_long = 380; +pub const SYS_sched_getattr: ::c_long = 381; +pub const SYS_renameat2: ::c_long = 382; +pub const SYS_seccomp: ::c_long = 383; +pub const SYS_getrandom: ::c_long = 384; +pub const SYS_memfd_create: ::c_long = 385; +pub const SYS_bpf: ::c_long = 386; +pub const SYS_execveat: ::c_long = 387; +pub const SYS_userfaultfd: ::c_long = 388; +pub const SYS_membarrier: ::c_long = 389; +pub const SYS_mlock2: ::c_long = 390; +pub const SYS_copy_file_range: ::c_long = 391; +pub const SYS_preadv2: ::c_long = 392; +pub const SYS_pwritev2: ::c_long = 393; +pub const SYS_pkey_mprotect: ::c_long = 394; +pub const SYS_pkey_alloc: ::c_long = 395; +pub const SYS_pkey_free: ::c_long = 396; +pub const SYS_statx: ::c_long = 397; +pub const SYS_rseq: ::c_long = 398; +pub const SYS_kexec_file_load: ::c_long = 401; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/align.rs new file mode 100644 index 0000000..639394a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(2))] + pub struct max_align_t { + priv_: [i8; 20] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs new file mode 100644 index 0000000..69725ee --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs @@ -0,0 +1,849 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + f_spare: [::__fsword_t; 4], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct ipc_perm { + __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + __seq: ::c_ushort, + __pad1: ::c_ushort, + __glibc_reserved1: ::c_ulong, + __glibc_reserved2: ::c_ulong, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: ::c_ushort, + pub __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_ulong, + pub st_ino: ::ino64_t, + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsblkcnt64_t, + pub f_ffree: ::fsblkcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsblkcnt64_t, + pub f_ffree: ::fsblkcnt64_t, + pub f_favail: ::fsblkcnt64_t, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __glibc_reserved1: ::c_long, + pub shm_dtime: ::time_t, + __glibc_reserved2: ::c_long, + pub shm_ctime: ::time_t, + __glibc_reserved3: ::c_long, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __glibc_reserved5: ::c_ulong, + __glibc_reserved6: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __glibc_reserved1: ::c_uint, + pub msg_rtime: ::time_t, + __glibc_reserved2: ::c_uint, + pub msg_ctime: ::time_t, + __glibc_reserved3: ::c_uint, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_LARGEFILE: ::c_int = 0x20000; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_32BIT: ::c_int = 0x0040; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; + +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_SYSEMU: ::c_uint = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_uint = 32; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time32: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_chown16: ::c_long = 16; +pub const SYS_stat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_oldumount: ::c_long = 22; +pub const SYS_setuid16: ::c_long = 23; +pub const SYS_getuid16: ::c_long = 24; +pub const SYS_stime32: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_fstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime32: ::c_long = 30; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid16: ::c_long = 46; +pub const SYS_getgid16: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid16: ::c_long = 49; +pub const SYS_getegid16: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid16: ::c_long = 70; +pub const SYS_setregid16: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_old_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups16: ::c_long = 80; +pub const SYS_setgroups16: ::c_long = 81; +pub const SYS_old_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_lstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_old_readdir: ::c_long = 89; +pub const SYS_old_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown16: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_newstat: ::c_long = 106; +pub const SYS_newlstat: ::c_long = 107; +pub const SYS_newfstat: ::c_long = 108; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_newuname: ::c_long = 122; +pub const SYS_cacheflush: ::c_long = 123; +pub const SYS_adjtimex_time32: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_setfsuid16: ::c_long = 138; +pub const SYS_setfsgid16: ::c_long = 139; +pub const SYS_llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS_select: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval_time32: ::c_long = 161; +pub const SYS_nanosleep_time32: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid16: ::c_long = 164; +pub const SYS_getresuid16: ::c_long = 165; +pub const SYS_getpagesize: ::c_long = 166; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid16: ::c_long = 170; +pub const SYS_getresgid16: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait_time32: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_lchown16: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_getrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_chown: ::c_long = 198; +pub const SYS_getuid: ::c_long = 199; +pub const SYS_getgid: ::c_long = 200; +pub const SYS_geteuid: ::c_long = 201; +pub const SYS_getegid: ::c_long = 202; +pub const SYS_setreuid: ::c_long = 203; +pub const SYS_setregid: ::c_long = 204; +pub const SYS_getgroups: ::c_long = 205; +pub const SYS_setgroups: ::c_long = 206; +pub const SYS_fchown: ::c_long = 207; +pub const SYS_setresuid: ::c_long = 208; +pub const SYS_getresuid: ::c_long = 209; +pub const SYS_setresgid: ::c_long = 210; +pub const SYS_getresgid: ::c_long = 211; +pub const SYS_lchown: ::c_long = 212; +pub const SYS_setuid: ::c_long = 213; +pub const SYS_setgid: ::c_long = 214; +pub const SYS_setfsuid: ::c_long = 215; +pub const SYS_setfsgid: ::c_long = 216; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_gettid: ::c_long = 221; +pub const SYS_tkill: ::c_long = 222; +pub const SYS_setxattr: ::c_long = 223; +pub const SYS_lsetxattr: ::c_long = 224; +pub const SYS_fsetxattr: ::c_long = 225; +pub const SYS_getxattr: ::c_long = 226; +pub const SYS_lgetxattr: ::c_long = 227; +pub const SYS_fgetxattr: ::c_long = 228; +pub const SYS_listxattr: ::c_long = 229; +pub const SYS_llistxattr: ::c_long = 230; +pub const SYS_flistxattr: ::c_long = 231; +pub const SYS_removexattr: ::c_long = 232; +pub const SYS_lremovexattr: ::c_long = 233; +pub const SYS_fremovexattr: ::c_long = 234; +pub const SYS_futex_time32: ::c_long = 235; +pub const SYS_sendfile64: ::c_long = 236; +pub const SYS_mincore: ::c_long = 237; +pub const SYS_madvise: ::c_long = 238; +pub const SYS_fcntl64: ::c_long = 239; +pub const SYS_readahead: ::c_long = 240; +pub const SYS_io_setup: ::c_long = 241; +pub const SYS_io_destroy: ::c_long = 242; +pub const SYS_io_getevents_time32: ::c_long = 243; +pub const SYS_io_submit: ::c_long = 244; +pub const SYS_io_cancel: ::c_long = 245; +pub const SYS_fadvise64: ::c_long = 246; +pub const SYS_exit_group: ::c_long = 247; +pub const SYS_lookup_dcookie: ::c_long = 248; +pub const SYS_epoll_create: ::c_long = 249; +pub const SYS_epoll_ctl: ::c_long = 250; +pub const SYS_epoll_wait: ::c_long = 251; +pub const SYS_remap_file_pages: ::c_long = 252; +pub const SYS_set_tid_address: ::c_long = 253; +pub const SYS_timer_create: ::c_long = 254; +pub const SYS_timer_settime32: ::c_long = 255; +pub const SYS_timer_gettime32: ::c_long = 256; +pub const SYS_timer_getoverrun: ::c_long = 257; +pub const SYS_timer_delete: ::c_long = 258; +pub const SYS_clock_settime32: ::c_long = 259; +pub const SYS_clock_gettime32: ::c_long = 260; +pub const SYS_clock_getres_time32: ::c_long = 261; +pub const SYS_clock_nanosleep_time32: ::c_long = 262; +pub const SYS_statfs64: ::c_long = 263; +pub const SYS_fstatfs64: ::c_long = 264; +pub const SYS_tgkill: ::c_long = 265; +pub const SYS_utimes_time32: ::c_long = 266; +pub const SYS_fadvise64_64: ::c_long = 267; +pub const SYS_mbind: ::c_long = 268; +pub const SYS_get_mempolicy: ::c_long = 269; +pub const SYS_set_mempolicy: ::c_long = 270; +pub const SYS_mq_open: ::c_long = 271; +pub const SYS_mq_unlink: ::c_long = 272; +pub const SYS_mq_timedsend_time32: ::c_long = 273; +pub const SYS_mq_timedreceive_time32: ::c_long = 274; +pub const SYS_mq_notify: ::c_long = 275; +pub const SYS_mq_getsetattr: ::c_long = 276; +pub const SYS_waitid: ::c_long = 277; +pub const SYS_add_key: ::c_long = 279; +pub const SYS_request_key: ::c_long = 280; +pub const SYS_keyctl: ::c_long = 281; +pub const SYS_ioprio_set: ::c_long = 282; +pub const SYS_ioprio_get: ::c_long = 283; +pub const SYS_inotify_init: ::c_long = 284; +pub const SYS_inotify_add_watch: ::c_long = 285; +pub const SYS_inotify_rm_watch: ::c_long = 286; +pub const SYS_migrate_pages: ::c_long = 287; +pub const SYS_openat: ::c_long = 288; +pub const SYS_mkdirat: ::c_long = 289; +pub const SYS_mknodat: ::c_long = 290; +pub const SYS_fchownat: ::c_long = 291; +pub const SYS_futimesat_time32: ::c_long = 292; +pub const SYS_fstatat64: ::c_long = 293; +pub const SYS_unlinkat: ::c_long = 294; +pub const SYS_renameat: ::c_long = 295; +pub const SYS_linkat: ::c_long = 296; +pub const SYS_symlinkat: ::c_long = 297; +pub const SYS_readlinkat: ::c_long = 298; +pub const SYS_fchmodat: ::c_long = 299; +pub const SYS_faccessat: ::c_long = 300; +pub const SYS_pselect6_time32: ::c_long = 301; +pub const SYS_ppoll_time32: ::c_long = 302; +pub const SYS_unshare: ::c_long = 303; +pub const SYS_set_robust_list: ::c_long = 304; +pub const SYS_get_robust_list: ::c_long = 305; +pub const SYS_splice: ::c_long = 306; +pub const SYS_sync_file_range: ::c_long = 307; +pub const SYS_tee: ::c_long = 308; +pub const SYS_vmsplice: ::c_long = 309; +pub const SYS_move_pages: ::c_long = 310; +pub const SYS_sched_setaffinity: ::c_long = 311; +pub const SYS_sched_getaffinity: ::c_long = 312; +pub const SYS_kexec_load: ::c_long = 313; +pub const SYS_getcpu: ::c_long = 314; +pub const SYS_epoll_pwait: ::c_long = 315; +pub const SYS_utimensat_time32: ::c_long = 316; +pub const SYS_signalfd: ::c_long = 317; +pub const SYS_timerfd_create: ::c_long = 318; +pub const SYS_eventfd: ::c_long = 319; +pub const SYS_fallocate: ::c_long = 320; +pub const SYS_timerfd_settime32: ::c_long = 321; +pub const SYS_timerfd_gettime32: ::c_long = 322; +pub const SYS_signalfd4: ::c_long = 323; +pub const SYS_eventfd2: ::c_long = 324; +pub const SYS_epoll_create1: ::c_long = 325; +pub const SYS_dup3: ::c_long = 326; +pub const SYS_pipe2: ::c_long = 327; +pub const SYS_inotify_init1: ::c_long = 328; +pub const SYS_preadv: ::c_long = 329; +pub const SYS_pwritev: ::c_long = 330; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 331; +pub const SYS_perf_event_open: ::c_long = 332; +pub const SYS_get_thread_area: ::c_long = 333; +pub const SYS_set_thread_area: ::c_long = 334; +pub const SYS_atomic_cmpxchg_32: ::c_long = 335; +pub const SYS_atomic_barrier: ::c_long = 336; +pub const SYS_fanotify_init: ::c_long = 337; +pub const SYS_fanotify_mark: ::c_long = 338; +pub const SYS_prlimit64: ::c_long = 339; +pub const SYS_name_to_handle_at: ::c_long = 340; +pub const SYS_open_by_handle_at: ::c_long = 341; +pub const SYS_clock_adjtime32: ::c_long = 342; +pub const SYS_syncfs: ::c_long = 343; +pub const SYS_setns: ::c_long = 344; +pub const SYS_process_vm_readv: ::c_long = 345; +pub const SYS_process_vm_writev: ::c_long = 346; +pub const SYS_kcmp: ::c_long = 347; +pub const SYS_finit_module: ::c_long = 348; +pub const SYS_sched_setattr: ::c_long = 349; +pub const SYS_sched_getattr: ::c_long = 350; +pub const SYS_renameat2: ::c_long = 351; +pub const SYS_getrandom: ::c_long = 352; +pub const SYS_memfd_create: ::c_long = 353; +pub const SYS_bpf: ::c_long = 354; +pub const SYS_execveat: ::c_long = 355; +pub const SYS_socket: ::c_long = 356; +pub const SYS_socketpair: ::c_long = 357; +pub const SYS_bind: ::c_long = 358; +pub const SYS_connect: ::c_long = 359; +pub const SYS_listen: ::c_long = 360; +pub const SYS_accept4: ::c_long = 361; +pub const SYS_getsockopt: ::c_long = 362; +pub const SYS_setsockopt: ::c_long = 363; +pub const SYS_getsockname: ::c_long = 364; +pub const SYS_getpeername: ::c_long = 365; +pub const SYS_sendto: ::c_long = 366; +pub const SYS_sendmsg: ::c_long = 367; +pub const SYS_recvfrom: ::c_long = 368; +pub const SYS_recvmsg: ::c_long = 369; +pub const SYS_shutdown: ::c_long = 370; +pub const SYS_recvmmsg_time32: ::c_long = 371; +pub const SYS_sendmmsg: ::c_long = 372; +pub const SYS_userfaultfd: ::c_long = 373; +pub const SYS_membarrier: ::c_long = 374; +pub const SYS_mlock2: ::c_long = 375; +pub const SYS_copy_file_range: ::c_long = 376; +pub const SYS_preadv2: ::c_long = 377; +pub const SYS_pwritev2: ::c_long = 378; +pub const SYS_statx: ::c_long = 379; +pub const SYS_seccomp: ::c_long = 380; +pub const SYS_pkey_mprotect: ::c_long = 381; +pub const SYS_pkey_alloc: ::c_long = 382; +pub const SYS_pkey_free: ::c_long = 383; +pub const SYS_rseq: ::c_long = 384; +pub const SYS_semget: ::c_long = 393; +pub const SYS_semctl: ::c_long = 394; +pub const SYS_shmget: ::c_long = 395; +pub const SYS_shmctl: ::c_long = 396; +pub const SYS_shmat: ::c_long = 397; +pub const SYS_shmdt: ::c_long = 398; +pub const SYS_msgget: ::c_long = 399; +pub const SYS_msgsnd: ::c_long = 400; +pub const SYS_msgrcv: ::c_long = 401; +pub const SYS_msgctl: ::c_long = 402; +pub const SYS_clock_gettime: ::c_long = 403; +pub const SYS_clock_settime: ::c_long = 404; +pub const SYS_clock_adjtime: ::c_long = 405; +pub const SYS_clock_getres: ::c_long = 406; +pub const SYS_clock_nanosleep: ::c_long = 407; +pub const SYS_timer_gettime: ::c_long = 408; +pub const SYS_timer_settime: ::c_long = 409; +pub const SYS_timerfd_gettime: ::c_long = 410; +pub const SYS_timerfd_settime: ::c_long = 411; +pub const SYS_utimensat: ::c_long = 412; +pub const SYS_pselect6: ::c_long = 413; +pub const SYS_ppoll: ::c_long = 414; +pub const SYS_io_pgetevents: ::c_long = 416; +pub const SYS_recvmmsg: ::c_long = 417; +pub const SYS_mq_timedsend: ::c_long = 418; +pub const SYS_mq_timedreceive: ::c_long = 419; +pub const SYS_semtimedop: ::c_long = 420; +pub const SYS_rt_sigtimedwait: ::c_long = 421; +pub const SYS_futex: ::c_long = 422; +pub const SYS_sched_rr_get_interval: ::c_long = 423; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/align.rs new file mode 100644 index 0000000..8c228eb --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [f32; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs new file mode 100644 index 0000000..6a03f0b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mips/mod.rs @@ -0,0 +1,818 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct stat64 { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 3], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 14], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_bavail: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 5], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_restorer: ::Option, + _resv: [::c_int; 1], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub _pad: [::c_int; 29], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + #[cfg(target_endian = "big")] + __glibc_reserved1: ::c_ulong, + pub msg_stime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved1: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved2: ::c_ulong, + pub msg_rtime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved2: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved3: ::c_ulong, + pub msg_ctime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_sysid: ::c_long, + pub l_pid: ::pid_t, + pad: [::c_long; 4], + } +} + +pub const O_LARGEFILE: ::c_int = 0x2000; + +pub const SYS_syscall: ::c_long = 4000 + 0; +pub const SYS_exit: ::c_long = 4000 + 1; +pub const SYS_fork: ::c_long = 4000 + 2; +pub const SYS_read: ::c_long = 4000 + 3; +pub const SYS_write: ::c_long = 4000 + 4; +pub const SYS_open: ::c_long = 4000 + 5; +pub const SYS_close: ::c_long = 4000 + 6; +pub const SYS_waitpid: ::c_long = 4000 + 7; +pub const SYS_creat: ::c_long = 4000 + 8; +pub const SYS_link: ::c_long = 4000 + 9; +pub const SYS_unlink: ::c_long = 4000 + 10; +pub const SYS_execve: ::c_long = 4000 + 11; +pub const SYS_chdir: ::c_long = 4000 + 12; +pub const SYS_time: ::c_long = 4000 + 13; +pub const SYS_mknod: ::c_long = 4000 + 14; +pub const SYS_chmod: ::c_long = 4000 + 15; +pub const SYS_lchown: ::c_long = 4000 + 16; +pub const SYS_break: ::c_long = 4000 + 17; +pub const SYS_lseek: ::c_long = 4000 + 19; +pub const SYS_getpid: ::c_long = 4000 + 20; +pub const SYS_mount: ::c_long = 4000 + 21; +pub const SYS_umount: ::c_long = 4000 + 22; +pub const SYS_setuid: ::c_long = 4000 + 23; +pub const SYS_getuid: ::c_long = 4000 + 24; +pub const SYS_stime: ::c_long = 4000 + 25; +pub const SYS_ptrace: ::c_long = 4000 + 26; +pub const SYS_alarm: ::c_long = 4000 + 27; +pub const SYS_pause: ::c_long = 4000 + 29; +pub const SYS_utime: ::c_long = 4000 + 30; +pub const SYS_stty: ::c_long = 4000 + 31; +pub const SYS_gtty: ::c_long = 4000 + 32; +pub const SYS_access: ::c_long = 4000 + 33; +pub const SYS_nice: ::c_long = 4000 + 34; +pub const SYS_ftime: ::c_long = 4000 + 35; +pub const SYS_sync: ::c_long = 4000 + 36; +pub const SYS_kill: ::c_long = 4000 + 37; +pub const SYS_rename: ::c_long = 4000 + 38; +pub const SYS_mkdir: ::c_long = 4000 + 39; +pub const SYS_rmdir: ::c_long = 4000 + 40; +pub const SYS_dup: ::c_long = 4000 + 41; +pub const SYS_pipe: ::c_long = 4000 + 42; +pub const SYS_times: ::c_long = 4000 + 43; +pub const SYS_prof: ::c_long = 4000 + 44; +pub const SYS_brk: ::c_long = 4000 + 45; +pub const SYS_setgid: ::c_long = 4000 + 46; +pub const SYS_getgid: ::c_long = 4000 + 47; +pub const SYS_signal: ::c_long = 4000 + 48; +pub const SYS_geteuid: ::c_long = 4000 + 49; +pub const SYS_getegid: ::c_long = 4000 + 50; +pub const SYS_acct: ::c_long = 4000 + 51; +pub const SYS_umount2: ::c_long = 4000 + 52; +pub const SYS_lock: ::c_long = 4000 + 53; +pub const SYS_ioctl: ::c_long = 4000 + 54; +pub const SYS_fcntl: ::c_long = 4000 + 55; +pub const SYS_mpx: ::c_long = 4000 + 56; +pub const SYS_setpgid: ::c_long = 4000 + 57; +pub const SYS_ulimit: ::c_long = 4000 + 58; +pub const SYS_umask: ::c_long = 4000 + 60; +pub const SYS_chroot: ::c_long = 4000 + 61; +pub const SYS_ustat: ::c_long = 4000 + 62; +pub const SYS_dup2: ::c_long = 4000 + 63; +pub const SYS_getppid: ::c_long = 4000 + 64; +pub const SYS_getpgrp: ::c_long = 4000 + 65; +pub const SYS_setsid: ::c_long = 4000 + 66; +pub const SYS_sigaction: ::c_long = 4000 + 67; +pub const SYS_sgetmask: ::c_long = 4000 + 68; +pub const SYS_ssetmask: ::c_long = 4000 + 69; +pub const SYS_setreuid: ::c_long = 4000 + 70; +pub const SYS_setregid: ::c_long = 4000 + 71; +pub const SYS_sigsuspend: ::c_long = 4000 + 72; +pub const SYS_sigpending: ::c_long = 4000 + 73; +pub const SYS_sethostname: ::c_long = 4000 + 74; +pub const SYS_setrlimit: ::c_long = 4000 + 75; +pub const SYS_getrlimit: ::c_long = 4000 + 76; +pub const SYS_getrusage: ::c_long = 4000 + 77; +pub const SYS_gettimeofday: ::c_long = 4000 + 78; +pub const SYS_settimeofday: ::c_long = 4000 + 79; +pub const SYS_getgroups: ::c_long = 4000 + 80; +pub const SYS_setgroups: ::c_long = 4000 + 81; +pub const SYS_symlink: ::c_long = 4000 + 83; +pub const SYS_readlink: ::c_long = 4000 + 85; +pub const SYS_uselib: ::c_long = 4000 + 86; +pub const SYS_swapon: ::c_long = 4000 + 87; +pub const SYS_reboot: ::c_long = 4000 + 88; +pub const SYS_readdir: ::c_long = 4000 + 89; +pub const SYS_mmap: ::c_long = 4000 + 90; +pub const SYS_munmap: ::c_long = 4000 + 91; +pub const SYS_truncate: ::c_long = 4000 + 92; +pub const SYS_ftruncate: ::c_long = 4000 + 93; +pub const SYS_fchmod: ::c_long = 4000 + 94; +pub const SYS_fchown: ::c_long = 4000 + 95; +pub const SYS_getpriority: ::c_long = 4000 + 96; +pub const SYS_setpriority: ::c_long = 4000 + 97; +pub const SYS_profil: ::c_long = 4000 + 98; +pub const SYS_statfs: ::c_long = 4000 + 99; +pub const SYS_fstatfs: ::c_long = 4000 + 100; +pub const SYS_ioperm: ::c_long = 4000 + 101; +pub const SYS_socketcall: ::c_long = 4000 + 102; +pub const SYS_syslog: ::c_long = 4000 + 103; +pub const SYS_setitimer: ::c_long = 4000 + 104; +pub const SYS_getitimer: ::c_long = 4000 + 105; +pub const SYS_stat: ::c_long = 4000 + 106; +pub const SYS_lstat: ::c_long = 4000 + 107; +pub const SYS_fstat: ::c_long = 4000 + 108; +pub const SYS_iopl: ::c_long = 4000 + 110; +pub const SYS_vhangup: ::c_long = 4000 + 111; +pub const SYS_idle: ::c_long = 4000 + 112; +pub const SYS_vm86: ::c_long = 4000 + 113; +pub const SYS_wait4: ::c_long = 4000 + 114; +pub const SYS_swapoff: ::c_long = 4000 + 115; +pub const SYS_sysinfo: ::c_long = 4000 + 116; +pub const SYS_ipc: ::c_long = 4000 + 117; +pub const SYS_fsync: ::c_long = 4000 + 118; +pub const SYS_sigreturn: ::c_long = 4000 + 119; +pub const SYS_clone: ::c_long = 4000 + 120; +pub const SYS_setdomainname: ::c_long = 4000 + 121; +pub const SYS_uname: ::c_long = 4000 + 122; +pub const SYS_modify_ldt: ::c_long = 4000 + 123; +pub const SYS_adjtimex: ::c_long = 4000 + 124; +pub const SYS_mprotect: ::c_long = 4000 + 125; +pub const SYS_sigprocmask: ::c_long = 4000 + 126; +pub const SYS_create_module: ::c_long = 4000 + 127; +pub const SYS_init_module: ::c_long = 4000 + 128; +pub const SYS_delete_module: ::c_long = 4000 + 129; +pub const SYS_get_kernel_syms: ::c_long = 4000 + 130; +pub const SYS_quotactl: ::c_long = 4000 + 131; +pub const SYS_getpgid: ::c_long = 4000 + 132; +pub const SYS_fchdir: ::c_long = 4000 + 133; +pub const SYS_bdflush: ::c_long = 4000 + 134; +pub const SYS_sysfs: ::c_long = 4000 + 135; +pub const SYS_personality: ::c_long = 4000 + 136; +pub const SYS_afs_syscall: ::c_long = 4000 + 137; +pub const SYS_setfsuid: ::c_long = 4000 + 138; +pub const SYS_setfsgid: ::c_long = 4000 + 139; +pub const SYS__llseek: ::c_long = 4000 + 140; +pub const SYS_getdents: ::c_long = 4000 + 141; +pub const SYS__newselect: ::c_long = 4000 + 142; +pub const SYS_flock: ::c_long = 4000 + 143; +pub const SYS_msync: ::c_long = 4000 + 144; +pub const SYS_readv: ::c_long = 4000 + 145; +pub const SYS_writev: ::c_long = 4000 + 146; +pub const SYS_cacheflush: ::c_long = 4000 + 147; +pub const SYS_cachectl: ::c_long = 4000 + 148; +pub const SYS_sysmips: ::c_long = 4000 + 149; +pub const SYS_getsid: ::c_long = 4000 + 151; +pub const SYS_fdatasync: ::c_long = 4000 + 152; +pub const SYS__sysctl: ::c_long = 4000 + 153; +pub const SYS_mlock: ::c_long = 4000 + 154; +pub const SYS_munlock: ::c_long = 4000 + 155; +pub const SYS_mlockall: ::c_long = 4000 + 156; +pub const SYS_munlockall: ::c_long = 4000 + 157; +pub const SYS_sched_setparam: ::c_long = 4000 + 158; +pub const SYS_sched_getparam: ::c_long = 4000 + 159; +pub const SYS_sched_setscheduler: ::c_long = 4000 + 160; +pub const SYS_sched_getscheduler: ::c_long = 4000 + 161; +pub const SYS_sched_yield: ::c_long = 4000 + 162; +pub const SYS_sched_get_priority_max: ::c_long = 4000 + 163; +pub const SYS_sched_get_priority_min: ::c_long = 4000 + 164; +pub const SYS_sched_rr_get_interval: ::c_long = 4000 + 165; +pub const SYS_nanosleep: ::c_long = 4000 + 166; +pub const SYS_mremap: ::c_long = 4000 + 167; +pub const SYS_accept: ::c_long = 4000 + 168; +pub const SYS_bind: ::c_long = 4000 + 169; +pub const SYS_connect: ::c_long = 4000 + 170; +pub const SYS_getpeername: ::c_long = 4000 + 171; +pub const SYS_getsockname: ::c_long = 4000 + 172; +pub const SYS_getsockopt: ::c_long = 4000 + 173; +pub const SYS_listen: ::c_long = 4000 + 174; +pub const SYS_recv: ::c_long = 4000 + 175; +pub const SYS_recvfrom: ::c_long = 4000 + 176; +pub const SYS_recvmsg: ::c_long = 4000 + 177; +pub const SYS_send: ::c_long = 4000 + 178; +pub const SYS_sendmsg: ::c_long = 4000 + 179; +pub const SYS_sendto: ::c_long = 4000 + 180; +pub const SYS_setsockopt: ::c_long = 4000 + 181; +pub const SYS_shutdown: ::c_long = 4000 + 182; +pub const SYS_socket: ::c_long = 4000 + 183; +pub const SYS_socketpair: ::c_long = 4000 + 184; +pub const SYS_setresuid: ::c_long = 4000 + 185; +pub const SYS_getresuid: ::c_long = 4000 + 186; +pub const SYS_query_module: ::c_long = 4000 + 187; +pub const SYS_poll: ::c_long = 4000 + 188; +pub const SYS_nfsservctl: ::c_long = 4000 + 189; +pub const SYS_setresgid: ::c_long = 4000 + 190; +pub const SYS_getresgid: ::c_long = 4000 + 191; +pub const SYS_prctl: ::c_long = 4000 + 192; +pub const SYS_rt_sigreturn: ::c_long = 4000 + 193; +pub const SYS_rt_sigaction: ::c_long = 4000 + 194; +pub const SYS_rt_sigprocmask: ::c_long = 4000 + 195; +pub const SYS_rt_sigpending: ::c_long = 4000 + 196; +pub const SYS_rt_sigtimedwait: ::c_long = 4000 + 197; +pub const SYS_rt_sigqueueinfo: ::c_long = 4000 + 198; +pub const SYS_rt_sigsuspend: ::c_long = 4000 + 199; +pub const SYS_pread64: ::c_long = 4000 + 200; +pub const SYS_pwrite64: ::c_long = 4000 + 201; +pub const SYS_chown: ::c_long = 4000 + 202; +pub const SYS_getcwd: ::c_long = 4000 + 203; +pub const SYS_capget: ::c_long = 4000 + 204; +pub const SYS_capset: ::c_long = 4000 + 205; +pub const SYS_sigaltstack: ::c_long = 4000 + 206; +pub const SYS_sendfile: ::c_long = 4000 + 207; +pub const SYS_getpmsg: ::c_long = 4000 + 208; +pub const SYS_putpmsg: ::c_long = 4000 + 209; +pub const SYS_mmap2: ::c_long = 4000 + 210; +pub const SYS_truncate64: ::c_long = 4000 + 211; +pub const SYS_ftruncate64: ::c_long = 4000 + 212; +pub const SYS_stat64: ::c_long = 4000 + 213; +pub const SYS_lstat64: ::c_long = 4000 + 214; +pub const SYS_fstat64: ::c_long = 4000 + 215; +pub const SYS_pivot_root: ::c_long = 4000 + 216; +pub const SYS_mincore: ::c_long = 4000 + 217; +pub const SYS_madvise: ::c_long = 4000 + 218; +pub const SYS_getdents64: ::c_long = 4000 + 219; +pub const SYS_fcntl64: ::c_long = 4000 + 220; +pub const SYS_gettid: ::c_long = 4000 + 222; +pub const SYS_readahead: ::c_long = 4000 + 223; +pub const SYS_setxattr: ::c_long = 4000 + 224; +pub const SYS_lsetxattr: ::c_long = 4000 + 225; +pub const SYS_fsetxattr: ::c_long = 4000 + 226; +pub const SYS_getxattr: ::c_long = 4000 + 227; +pub const SYS_lgetxattr: ::c_long = 4000 + 228; +pub const SYS_fgetxattr: ::c_long = 4000 + 229; +pub const SYS_listxattr: ::c_long = 4000 + 230; +pub const SYS_llistxattr: ::c_long = 4000 + 231; +pub const SYS_flistxattr: ::c_long = 4000 + 232; +pub const SYS_removexattr: ::c_long = 4000 + 233; +pub const SYS_lremovexattr: ::c_long = 4000 + 234; +pub const SYS_fremovexattr: ::c_long = 4000 + 235; +pub const SYS_tkill: ::c_long = 4000 + 236; +pub const SYS_sendfile64: ::c_long = 4000 + 237; +pub const SYS_futex: ::c_long = 4000 + 238; +pub const SYS_sched_setaffinity: ::c_long = 4000 + 239; +pub const SYS_sched_getaffinity: ::c_long = 4000 + 240; +pub const SYS_io_setup: ::c_long = 4000 + 241; +pub const SYS_io_destroy: ::c_long = 4000 + 242; +pub const SYS_io_getevents: ::c_long = 4000 + 243; +pub const SYS_io_submit: ::c_long = 4000 + 244; +pub const SYS_io_cancel: ::c_long = 4000 + 245; +pub const SYS_exit_group: ::c_long = 4000 + 246; +pub const SYS_lookup_dcookie: ::c_long = 4000 + 247; +pub const SYS_epoll_create: ::c_long = 4000 + 248; +pub const SYS_epoll_ctl: ::c_long = 4000 + 249; +pub const SYS_epoll_wait: ::c_long = 4000 + 250; +pub const SYS_remap_file_pages: ::c_long = 4000 + 251; +pub const SYS_set_tid_address: ::c_long = 4000 + 252; +pub const SYS_restart_syscall: ::c_long = 4000 + 253; +pub const SYS_fadvise64: ::c_long = 4000 + 254; +pub const SYS_statfs64: ::c_long = 4000 + 255; +pub const SYS_fstatfs64: ::c_long = 4000 + 256; +pub const SYS_timer_create: ::c_long = 4000 + 257; +pub const SYS_timer_settime: ::c_long = 4000 + 258; +pub const SYS_timer_gettime: ::c_long = 4000 + 259; +pub const SYS_timer_getoverrun: ::c_long = 4000 + 260; +pub const SYS_timer_delete: ::c_long = 4000 + 261; +pub const SYS_clock_settime: ::c_long = 4000 + 262; +pub const SYS_clock_gettime: ::c_long = 4000 + 263; +pub const SYS_clock_getres: ::c_long = 4000 + 264; +pub const SYS_clock_nanosleep: ::c_long = 4000 + 265; +pub const SYS_tgkill: ::c_long = 4000 + 266; +pub const SYS_utimes: ::c_long = 4000 + 267; +pub const SYS_mbind: ::c_long = 4000 + 268; +pub const SYS_get_mempolicy: ::c_long = 4000 + 269; +pub const SYS_set_mempolicy: ::c_long = 4000 + 270; +pub const SYS_mq_open: ::c_long = 4000 + 271; +pub const SYS_mq_unlink: ::c_long = 4000 + 272; +pub const SYS_mq_timedsend: ::c_long = 4000 + 273; +pub const SYS_mq_timedreceive: ::c_long = 4000 + 274; +pub const SYS_mq_notify: ::c_long = 4000 + 275; +pub const SYS_mq_getsetattr: ::c_long = 4000 + 276; +pub const SYS_vserver: ::c_long = 4000 + 277; +pub const SYS_waitid: ::c_long = 4000 + 278; +/* pub const SYS_sys_setaltroot: ::c_long = 4000 + 279; */ +pub const SYS_add_key: ::c_long = 4000 + 280; +pub const SYS_request_key: ::c_long = 4000 + 281; +pub const SYS_keyctl: ::c_long = 4000 + 282; +pub const SYS_set_thread_area: ::c_long = 4000 + 283; +pub const SYS_inotify_init: ::c_long = 4000 + 284; +pub const SYS_inotify_add_watch: ::c_long = 4000 + 285; +pub const SYS_inotify_rm_watch: ::c_long = 4000 + 286; +pub const SYS_migrate_pages: ::c_long = 4000 + 287; +pub const SYS_openat: ::c_long = 4000 + 288; +pub const SYS_mkdirat: ::c_long = 4000 + 289; +pub const SYS_mknodat: ::c_long = 4000 + 290; +pub const SYS_fchownat: ::c_long = 4000 + 291; +pub const SYS_futimesat: ::c_long = 4000 + 292; +pub const SYS_fstatat64: ::c_long = 4000 + 293; +pub const SYS_unlinkat: ::c_long = 4000 + 294; +pub const SYS_renameat: ::c_long = 4000 + 295; +pub const SYS_linkat: ::c_long = 4000 + 296; +pub const SYS_symlinkat: ::c_long = 4000 + 297; +pub const SYS_readlinkat: ::c_long = 4000 + 298; +pub const SYS_fchmodat: ::c_long = 4000 + 299; +pub const SYS_faccessat: ::c_long = 4000 + 300; +pub const SYS_pselect6: ::c_long = 4000 + 301; +pub const SYS_ppoll: ::c_long = 4000 + 302; +pub const SYS_unshare: ::c_long = 4000 + 303; +pub const SYS_splice: ::c_long = 4000 + 304; +pub const SYS_sync_file_range: ::c_long = 4000 + 305; +pub const SYS_tee: ::c_long = 4000 + 306; +pub const SYS_vmsplice: ::c_long = 4000 + 307; +pub const SYS_move_pages: ::c_long = 4000 + 308; +pub const SYS_set_robust_list: ::c_long = 4000 + 309; +pub const SYS_get_robust_list: ::c_long = 4000 + 310; +pub const SYS_kexec_load: ::c_long = 4000 + 311; +pub const SYS_getcpu: ::c_long = 4000 + 312; +pub const SYS_epoll_pwait: ::c_long = 4000 + 313; +pub const SYS_ioprio_set: ::c_long = 4000 + 314; +pub const SYS_ioprio_get: ::c_long = 4000 + 315; +pub const SYS_utimensat: ::c_long = 4000 + 316; +pub const SYS_signalfd: ::c_long = 4000 + 317; +pub const SYS_timerfd: ::c_long = 4000 + 318; +pub const SYS_eventfd: ::c_long = 4000 + 319; +pub const SYS_fallocate: ::c_long = 4000 + 320; +pub const SYS_timerfd_create: ::c_long = 4000 + 321; +pub const SYS_timerfd_gettime: ::c_long = 4000 + 322; +pub const SYS_timerfd_settime: ::c_long = 4000 + 323; +pub const SYS_signalfd4: ::c_long = 4000 + 324; +pub const SYS_eventfd2: ::c_long = 4000 + 325; +pub const SYS_epoll_create1: ::c_long = 4000 + 326; +pub const SYS_dup3: ::c_long = 4000 + 327; +pub const SYS_pipe2: ::c_long = 4000 + 328; +pub const SYS_inotify_init1: ::c_long = 4000 + 329; +pub const SYS_preadv: ::c_long = 4000 + 330; +pub const SYS_pwritev: ::c_long = 4000 + 331; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 4000 + 332; +pub const SYS_perf_event_open: ::c_long = 4000 + 333; +pub const SYS_accept4: ::c_long = 4000 + 334; +pub const SYS_recvmmsg: ::c_long = 4000 + 335; +pub const SYS_fanotify_init: ::c_long = 4000 + 336; +pub const SYS_fanotify_mark: ::c_long = 4000 + 337; +pub const SYS_prlimit64: ::c_long = 4000 + 338; +pub const SYS_name_to_handle_at: ::c_long = 4000 + 339; +pub const SYS_open_by_handle_at: ::c_long = 4000 + 340; +pub const SYS_clock_adjtime: ::c_long = 4000 + 341; +pub const SYS_syncfs: ::c_long = 4000 + 342; +pub const SYS_sendmmsg: ::c_long = 4000 + 343; +pub const SYS_setns: ::c_long = 4000 + 344; +pub const SYS_process_vm_readv: ::c_long = 4000 + 345; +pub const SYS_process_vm_writev: ::c_long = 4000 + 346; +pub const SYS_kcmp: ::c_long = 4000 + 347; +pub const SYS_finit_module: ::c_long = 4000 + 348; +pub const SYS_sched_setattr: ::c_long = 4000 + 349; +pub const SYS_sched_getattr: ::c_long = 4000 + 350; +pub const SYS_renameat2: ::c_long = 4000 + 351; +pub const SYS_seccomp: ::c_long = 4000 + 352; +pub const SYS_getrandom: ::c_long = 4000 + 353; +pub const SYS_memfd_create: ::c_long = 4000 + 354; +pub const SYS_bpf: ::c_long = 4000 + 355; +pub const SYS_execveat: ::c_long = 4000 + 356; +pub const SYS_userfaultfd: ::c_long = 4000 + 357; +pub const SYS_membarrier: ::c_long = 4000 + 358; +pub const SYS_mlock2: ::c_long = 4000 + 359; +pub const SYS_copy_file_range: ::c_long = 4000 + 360; +pub const SYS_preadv2: ::c_long = 4000 + 361; +pub const SYS_pwritev2: ::c_long = 4000 + 362; +pub const SYS_pkey_mprotect: ::c_long = 4000 + 363; +pub const SYS_pkey_alloc: ::c_long = 4000 + 364; +pub const SYS_pkey_free: ::c_long = 4000 + 365; +pub const SYS_statx: ::c_long = 4000 + 366; +pub const SYS_rseq: ::c_long = 4000 + 367; +pub const SYS_pidfd_send_signal: ::c_long = 4000 + 424; +pub const SYS_io_uring_setup: ::c_long = 4000 + 425; +pub const SYS_io_uring_enter: ::c_long = 4000 + 426; +pub const SYS_io_uring_register: ::c_long = 4000 + 427; +pub const SYS_open_tree: ::c_long = 4000 + 428; +pub const SYS_move_mount: ::c_long = 4000 + 429; +pub const SYS_fsopen: ::c_long = 4000 + 430; +pub const SYS_fsconfig: ::c_long = 4000 + 431; +pub const SYS_fsmount: ::c_long = 4000 + 432; +pub const SYS_fspick: ::c_long = 4000 + 433; +pub const SYS_pidfd_open: ::c_long = 4000 + 434; +pub const SYS_clone3: ::c_long = 4000 + 435; +pub const SYS_close_range: ::c_long = 4000 + 436; +pub const SYS_openat2: ::c_long = 4000 + 437; +pub const SYS_pidfd_getfd: ::c_long = 4000 + 438; +pub const SYS_faccessat2: ::c_long = 4000 + 439; +pub const SYS_process_madvise: ::c_long = 4000 + 440; +pub const SYS_epoll_pwait2: ::c_long = 4000 + 441; +pub const SYS_mount_setattr: ::c_long = 4000 + 442; +pub const SYS_quotactl_fd: ::c_long = 4000 + 443; +pub const SYS_landlock_create_ruleset: ::c_long = 4000 + 444; +pub const SYS_landlock_add_rule: ::c_long = 4000 + 445; +pub const SYS_landlock_restrict_self: ::c_long = 4000 + 446; +pub const SYS_memfd_secret: ::c_long = 4000 + 447; +pub const SYS_process_mrelease: ::c_long = 4000 + 448; +pub const SYS_futex_waitv: ::c_long = 4000 + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 4000 + 450; + +pub const O_DIRECT: ::c_int = 0x8000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_NONBLOCK: ::c_int = 128; +pub const O_SYNC: ::c_int = 0x4010; +pub const O_RSYNC: ::c_int = 0x4010; +pub const O_DSYNC: ::c_int = 0x10; +pub const O_FSYNC: ::c_int = 0x4010; +pub const O_ASYNC: ::c_int = 0x1000; +pub const O_NDELAY: ::c_int = 0x80; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const ERFKILL: ::c_int = 167; + +pub const MAP_NORESERVE: ::c_int = 0x400; +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_ANONYMOUS: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; + +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 22; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x00000100; +pub const TOSTOP: ::tcflag_t = 0x00008000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const EXTPROC: ::tcflag_t = 0o200000; +pub const TCSANOW: ::c_int = 0x540e; +pub const TCSADRAIN: ::c_int = 0x540f; +pub const TCSAFLUSH: ::c_int = 0x5410; + +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; + +pub const MAP_HUGETLB: ::c_int = 0x080000; + +pub const EFD_NONBLOCK: ::c_int = 0x80; + +pub const F_GETLK: ::c_int = 14; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETOWN: ::c_int = 24; + +pub const SFD_NONBLOCK: ::c_int = 0x80; + +pub const RTLD_DEEPBIND: ::c_int = 0x10; +pub const RTLD_GLOBAL: ::c_int = 0x4; +pub const RTLD_NOLOAD: ::c_int = 0x8; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EHWPOISON: ::c_int = 168; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs new file mode 100644 index 0000000..66d1d01 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs @@ -0,0 +1,358 @@ +//! 32-bit specific definitions for linux-like values + +use pthread_mutex_t; + +pub type c_long = i32; +pub type c_ulong = u32; +pub type clock_t = i32; + +pub type shmatt_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type nlink_t = u32; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; +pub type __fsword_t = i32; +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; +pub type __syscall_ulong_t = ::c_ulong; + +cfg_if! { + if #[cfg(target_arch = "riscv32")] { + pub type time_t = i64; + pub type suseconds_t = i64; + pub type ino_t = u64; + pub type off_t = i64; + pub type blkcnt_t = i64; + pub type fsblkcnt_t = u64; + pub type fsfilcnt_t = u64; + pub type rlim_t = u64; + pub type blksize_t = i64; + } else { + pub type time_t = i32; + pub type suseconds_t = i32; + pub type ino_t = u32; + pub type off_t = i32; + pub type blkcnt_t = i32; + pub type fsblkcnt_t = ::c_ulong; + pub type fsfilcnt_t = ::c_ulong; + pub type rlim_t = c_ulong; + pub type blksize_t = i32; + } +} + +s! { + pub struct stat { + #[cfg(not(target_arch = "mips"))] + pub st_dev: ::dev_t, + #[cfg(target_arch = "mips")] + pub st_dev: ::c_ulong, + + #[cfg(not(target_arch = "mips"))] + __pad1: ::c_short, + #[cfg(target_arch = "mips")] + st_pad1: [::c_long; 3], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + #[cfg(not(target_arch = "mips"))] + pub st_rdev: ::dev_t, + #[cfg(target_arch = "mips")] + pub st_rdev: ::c_ulong, + #[cfg(not(target_arch = "mips"))] + __pad2: ::c_short, + #[cfg(target_arch = "mips")] + st_pad2: [::c_long; 2], + pub st_size: ::off_t, + #[cfg(target_arch = "mips")] + st_pad3: ::c_long, + #[cfg(not(target_arch = "mips"))] + pub st_blksize: ::blksize_t, + #[cfg(not(target_arch = "mips"))] + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + #[cfg(not(target_arch = "mips"))] + __unused4: ::c_long, + #[cfg(not(target_arch = "mips"))] + __unused5: ::c_long, + #[cfg(target_arch = "mips")] + pub st_blksize: ::blksize_t, + #[cfg(target_arch = "mips")] + pub st_blocks: ::blkcnt_t, + #[cfg(target_arch = "mips")] + st_pad5: [::c_long; 14], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + #[deprecated( + since = "0.2.58", + note = "This padding field might become private in the future" + )] + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } + + pub struct semid_ds { + pub sem_perm: ipc_perm, + #[cfg(target_arch = "powerpc")] + __reserved: ::__syscall_ulong_t, + pub sem_otime: ::time_t, + #[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] + __reserved: ::__syscall_ulong_t, + #[cfg(target_arch = "powerpc")] + __reserved2: ::__syscall_ulong_t, + pub sem_ctime: ::time_t, + #[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] + __reserved2: ::__syscall_ulong_t, + pub sem_nsems: ::__syscall_ulong_t, + __glibc_reserved3: ::__syscall_ulong_t, + __glibc_reserved4: ::__syscall_ulong_t, + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +cfg_if! { + if #[cfg(target_arch = "sparc")] { + pub const O_NOATIME: ::c_int = 0x200000; + pub const O_PATH: ::c_int = 0x1000000; + pub const O_TMPFILE: ::c_int = 0x2000000 | O_DIRECTORY; + + pub const SA_ONSTACK: ::c_int = 1; + + pub const PTRACE_DETACH: ::c_uint = 11; + + pub const F_SETLK: ::c_int = 8; + pub const F_SETLKW: ::c_int = 9; + + pub const F_RDLCK: ::c_int = 1; + pub const F_WRLCK: ::c_int = 2; + pub const F_UNLCK: ::c_int = 3; + + pub const SFD_CLOEXEC: ::c_int = 0x400000; + + pub const NCCS: usize = 17; + + pub const O_TRUNC: ::c_int = 0x400; + pub const O_CLOEXEC: ::c_int = 0x400000; + + pub const EBFONT: ::c_int = 109; + pub const ENOSTR: ::c_int = 72; + pub const ENODATA: ::c_int = 111; + pub const ETIME: ::c_int = 73; + pub const ENOSR: ::c_int = 74; + pub const ENONET: ::c_int = 80; + pub const ENOPKG: ::c_int = 113; + pub const EREMOTE: ::c_int = 71; + pub const ENOLINK: ::c_int = 82; + pub const EADV: ::c_int = 83; + pub const ESRMNT: ::c_int = 84; + pub const ECOMM: ::c_int = 85; + pub const EPROTO: ::c_int = 86; + pub const EDOTDOT: ::c_int = 88; + + pub const SA_NODEFER: ::c_int = 0x20; + pub const SA_RESETHAND: ::c_int = 0x4; + pub const SA_RESTART: ::c_int = 0x2; + pub const SA_NOCLDSTOP: ::c_int = 0x00000008; + + pub const EPOLL_CLOEXEC: ::c_int = 0x400000; + + pub const EFD_CLOEXEC: ::c_int = 0x400000; + } else { + pub const O_NOATIME: ::c_int = 0o1000000; + pub const O_PATH: ::c_int = 0o10000000; + pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + + pub const SA_ONSTACK: ::c_int = 0x08000000; + + pub const PTRACE_DETACH: ::c_uint = 17; + + pub const F_SETLK: ::c_int = 6; + pub const F_SETLKW: ::c_int = 7; + + pub const F_RDLCK: ::c_int = 0; + pub const F_WRLCK: ::c_int = 1; + pub const F_UNLCK: ::c_int = 2; + + pub const SFD_CLOEXEC: ::c_int = 0x080000; + + pub const NCCS: usize = 32; + + pub const O_TRUNC: ::c_int = 512; + pub const O_CLOEXEC: ::c_int = 0x80000; + pub const EBFONT: ::c_int = 59; + pub const ENOSTR: ::c_int = 60; + pub const ENODATA: ::c_int = 61; + pub const ETIME: ::c_int = 62; + pub const ENOSR: ::c_int = 63; + pub const ENONET: ::c_int = 64; + pub const ENOPKG: ::c_int = 65; + pub const EREMOTE: ::c_int = 66; + pub const ENOLINK: ::c_int = 67; + pub const EADV: ::c_int = 68; + pub const ESRMNT: ::c_int = 69; + pub const ECOMM: ::c_int = 70; + pub const EPROTO: ::c_int = 71; + pub const EDOTDOT: ::c_int = 73; + + pub const SA_NODEFER: ::c_int = 0x40000000; + pub const SA_RESETHAND: ::c_int = 0x80000000; + pub const SA_RESTART: ::c_int = 0x10000000; + pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + + pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + + pub const EFD_CLOEXEC: ::c_int = 0x80000; + } +} + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, + ], + }; +} + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "x86")] { + mod x86; + pub use self::x86::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "mips")] { + mod mips; + pub use self::mips::*; + } else if #[cfg(target_arch = "m68k")] { + mod m68k; + pub use self::m68k::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(target_arch = "sparc")] { + mod sparc; + pub use self::sparc::*; + } else if #[cfg(target_arch = "riscv32")] { + mod riscv32; + pub use self::riscv32::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs new file mode 100644 index 0000000..e70b216 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/powerpc.rs @@ -0,0 +1,824 @@ +pub type c_char = u8; +pub type wchar_t = i32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct ipc_perm { + __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + __seq: u32, + __pad1: u32, + __glibc_reserved1: u64, + __glibc_reserved2: u64, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + __glibc_reserved1: ::c_uint, + pub shm_atime: ::time_t, + __glibc_reserved2: ::c_uint, + pub shm_dtime: ::time_t, + __glibc_reserved3: ::c_uint, + pub shm_ctime: ::time_t, + __glibc_reserved4: ::c_uint, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __glibc_reserved5: ::c_ulong, + __glibc_reserved6: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __glibc_reserved1: ::c_uint, + pub msg_stime: ::time_t, + __glibc_reserved2: ::c_uint, + pub msg_rtime: ::time_t, + __glibc_reserved3: ::c_uint, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_DIRECT: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_LARGEFILE: ::c_int = 0o200000; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_LOCKED: ::c_int = 0x00080; +pub const MAP_NORESERVE: ::c_int = 0x00040; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 58; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; + +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGSTKSZ: ::size_t = 0x4000; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0xff; +pub const TAB1: ::tcflag_t = 0x400; +pub const TAB2: ::tcflag_t = 0x800; +pub const TAB3: ::tcflag_t = 0xc00; +pub const CR1: ::tcflag_t = 0x1000; +pub const CR2: ::tcflag_t = 0x2000; +pub const CR3: ::tcflag_t = 0x3000; +pub const FF1: ::tcflag_t = 0x4000; +pub const BS1: ::tcflag_t = 0x8000; +pub const VT1: ::tcflag_t = 0x10000; +pub const VWERASE: usize = 0xa; +pub const VREPRINT: usize = 0xb; +pub const VSUSP: usize = 0xc; +pub const VSTART: usize = 0xd; +pub const VSTOP: usize = 0xe; +pub const VDISCARD: usize = 0x10; +pub const VTIME: usize = 0x7; +pub const IXON: ::tcflag_t = 0x200; +pub const IXOFF: ::tcflag_t = 0x400; +pub const ONLCR: ::tcflag_t = 0x2; +pub const CSIZE: ::tcflag_t = 0x300; +pub const CS6: ::tcflag_t = 0x100; +pub const CS7: ::tcflag_t = 0x200; +pub const CS8: ::tcflag_t = 0x300; +pub const CSTOPB: ::tcflag_t = 0x400; +pub const CREAD: ::tcflag_t = 0x800; +pub const PARENB: ::tcflag_t = 0x1000; +pub const PARODD: ::tcflag_t = 0x2000; +pub const HUPCL: ::tcflag_t = 0x4000; +pub const CLOCAL: ::tcflag_t = 0x8000; +pub const ECHOKE: ::tcflag_t = 0x1; +pub const ECHOE: ::tcflag_t = 0x2; +pub const ECHOK: ::tcflag_t = 0x4; +pub const ECHONL: ::tcflag_t = 0x10; +pub const ECHOPRT: ::tcflag_t = 0x20; +pub const ECHOCTL: ::tcflag_t = 0x40; +pub const ISIG: ::tcflag_t = 0x80; +pub const ICANON: ::tcflag_t = 0x100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; +pub const VSWTC: usize = 9; +pub const OLCUC: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o001400; +pub const CRDLY: ::tcflag_t = 0o030000; +pub const TABDLY: ::tcflag_t = 0o006000; +pub const BSDLY: ::tcflag_t = 0o100000; +pub const FFDLY: ::tcflag_t = 0o040000; +pub const VTDLY: ::tcflag_t = 0o200000; +pub const XTABS: ::tcflag_t = 0o006000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const CBAUDEX: ::speed_t = 0o000020; +pub const B57600: ::speed_t = 0o0020; +pub const B115200: ::speed_t = 0o0021; +pub const B230400: ::speed_t = 0o0022; +pub const B460800: ::speed_t = 0o0023; +pub const B500000: ::speed_t = 0o0024; +pub const B576000: ::speed_t = 0o0025; +pub const B921600: ::speed_t = 0o0026; +pub const B1000000: ::speed_t = 0o0027; +pub const B1152000: ::speed_t = 0o0030; +pub const B1500000: ::speed_t = 0o0031; +pub const B2000000: ::speed_t = 0o0032; +pub const B2500000: ::speed_t = 0o0033; +pub const B3000000: ::speed_t = 0o0034; +pub const B3500000: ::speed_t = 0o0035; +pub const B4000000: ::speed_t = 0o0036; + +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x400; +pub const TOSTOP: ::tcflag_t = 0x400000; +pub const FLUSHO: ::tcflag_t = 0x800000; +pub const EXTPROC: ::tcflag_t = 0x10000000; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_query_module: ::c_long = 166; +pub const SYS_poll: ::c_long = 167; +pub const SYS_nfsservctl: ::c_long = 168; +pub const SYS_setresgid: ::c_long = 169; +pub const SYS_getresgid: ::c_long = 170; +pub const SYS_prctl: ::c_long = 171; +pub const SYS_rt_sigreturn: ::c_long = 172; +pub const SYS_rt_sigaction: ::c_long = 173; +pub const SYS_rt_sigprocmask: ::c_long = 174; +pub const SYS_rt_sigpending: ::c_long = 175; +pub const SYS_rt_sigtimedwait: ::c_long = 176; +pub const SYS_rt_sigqueueinfo: ::c_long = 177; +pub const SYS_rt_sigsuspend: ::c_long = 178; +pub const SYS_pread64: ::c_long = 179; +pub const SYS_pwrite64: ::c_long = 180; +pub const SYS_chown: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 182; +pub const SYS_capget: ::c_long = 183; +pub const SYS_capset: ::c_long = 184; +pub const SYS_sigaltstack: ::c_long = 185; +pub const SYS_sendfile: ::c_long = 186; +pub const SYS_getpmsg: ::c_long = 187; /* some people actually want streams */ +pub const SYS_putpmsg: ::c_long = 188; /* some people actually want streams */ +pub const SYS_vfork: ::c_long = 189; +pub const SYS_ugetrlimit: ::c_long = 190; /* SuS compliant getrlimit */ +pub const SYS_readahead: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_pciconfig_read: ::c_long = 198; +pub const SYS_pciconfig_write: ::c_long = 199; +pub const SYS_pciconfig_iobase: ::c_long = 200; +pub const SYS_multiplexer: ::c_long = 201; +pub const SYS_getdents64: ::c_long = 202; +pub const SYS_pivot_root: ::c_long = 203; +pub const SYS_fcntl64: ::c_long = 204; +pub const SYS_madvise: ::c_long = 205; +pub const SYS_mincore: ::c_long = 206; +pub const SYS_gettid: ::c_long = 207; +pub const SYS_tkill: ::c_long = 208; +pub const SYS_setxattr: ::c_long = 209; +pub const SYS_lsetxattr: ::c_long = 210; +pub const SYS_fsetxattr: ::c_long = 211; +pub const SYS_getxattr: ::c_long = 212; +pub const SYS_lgetxattr: ::c_long = 213; +pub const SYS_fgetxattr: ::c_long = 214; +pub const SYS_listxattr: ::c_long = 215; +pub const SYS_llistxattr: ::c_long = 216; +pub const SYS_flistxattr: ::c_long = 217; +pub const SYS_removexattr: ::c_long = 218; +pub const SYS_lremovexattr: ::c_long = 219; +pub const SYS_fremovexattr: ::c_long = 220; +pub const SYS_futex: ::c_long = 221; +pub const SYS_sched_setaffinity: ::c_long = 222; +pub const SYS_sched_getaffinity: ::c_long = 223; +pub const SYS_tuxcall: ::c_long = 225; +pub const SYS_sendfile64: ::c_long = 226; +pub const SYS_io_setup: ::c_long = 227; +pub const SYS_io_destroy: ::c_long = 228; +pub const SYS_io_getevents: ::c_long = 229; +pub const SYS_io_submit: ::c_long = 230; +pub const SYS_io_cancel: ::c_long = 231; +pub const SYS_set_tid_address: ::c_long = 232; +pub const SYS_fadvise64: ::c_long = 233; +pub const SYS_exit_group: ::c_long = 234; +pub const SYS_lookup_dcookie: ::c_long = 235; +pub const SYS_epoll_create: ::c_long = 236; +pub const SYS_epoll_ctl: ::c_long = 237; +pub const SYS_epoll_wait: ::c_long = 238; +pub const SYS_remap_file_pages: ::c_long = 239; +pub const SYS_timer_create: ::c_long = 240; +pub const SYS_timer_settime: ::c_long = 241; +pub const SYS_timer_gettime: ::c_long = 242; +pub const SYS_timer_getoverrun: ::c_long = 243; +pub const SYS_timer_delete: ::c_long = 244; +pub const SYS_clock_settime: ::c_long = 245; +pub const SYS_clock_gettime: ::c_long = 246; +pub const SYS_clock_getres: ::c_long = 247; +pub const SYS_clock_nanosleep: ::c_long = 248; +pub const SYS_swapcontext: ::c_long = 249; +pub const SYS_tgkill: ::c_long = 250; +pub const SYS_utimes: ::c_long = 251; +pub const SYS_statfs64: ::c_long = 252; +pub const SYS_fstatfs64: ::c_long = 253; +pub const SYS_fadvise64_64: ::c_long = 254; +pub const SYS_rtas: ::c_long = 255; +pub const SYS_sys_debug_setcontext: ::c_long = 256; +pub const SYS_migrate_pages: ::c_long = 258; +pub const SYS_mbind: ::c_long = 259; +pub const SYS_get_mempolicy: ::c_long = 260; +pub const SYS_set_mempolicy: ::c_long = 261; +pub const SYS_mq_open: ::c_long = 262; +pub const SYS_mq_unlink: ::c_long = 263; +pub const SYS_mq_timedsend: ::c_long = 264; +pub const SYS_mq_timedreceive: ::c_long = 265; +pub const SYS_mq_notify: ::c_long = 266; +pub const SYS_mq_getsetattr: ::c_long = 267; +pub const SYS_kexec_load: ::c_long = 268; +pub const SYS_add_key: ::c_long = 269; +pub const SYS_request_key: ::c_long = 270; +pub const SYS_keyctl: ::c_long = 271; +pub const SYS_waitid: ::c_long = 272; +pub const SYS_ioprio_set: ::c_long = 273; +pub const SYS_ioprio_get: ::c_long = 274; +pub const SYS_inotify_init: ::c_long = 275; +pub const SYS_inotify_add_watch: ::c_long = 276; +pub const SYS_inotify_rm_watch: ::c_long = 277; +pub const SYS_spu_run: ::c_long = 278; +pub const SYS_spu_create: ::c_long = 279; +pub const SYS_pselect6: ::c_long = 280; +pub const SYS_ppoll: ::c_long = 281; +pub const SYS_unshare: ::c_long = 282; +pub const SYS_splice: ::c_long = 283; +pub const SYS_tee: ::c_long = 284; +pub const SYS_vmsplice: ::c_long = 285; +pub const SYS_openat: ::c_long = 286; +pub const SYS_mkdirat: ::c_long = 287; +pub const SYS_mknodat: ::c_long = 288; +pub const SYS_fchownat: ::c_long = 289; +pub const SYS_futimesat: ::c_long = 290; +pub const SYS_fstatat64: ::c_long = 291; +pub const SYS_unlinkat: ::c_long = 292; +pub const SYS_renameat: ::c_long = 293; +pub const SYS_linkat: ::c_long = 294; +pub const SYS_symlinkat: ::c_long = 295; +pub const SYS_readlinkat: ::c_long = 296; +pub const SYS_fchmodat: ::c_long = 297; +pub const SYS_faccessat: ::c_long = 298; +pub const SYS_get_robust_list: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_move_pages: ::c_long = 301; +pub const SYS_getcpu: ::c_long = 302; +pub const SYS_epoll_pwait: ::c_long = 303; +pub const SYS_utimensat: ::c_long = 304; +pub const SYS_signalfd: ::c_long = 305; +pub const SYS_timerfd_create: ::c_long = 306; +pub const SYS_eventfd: ::c_long = 307; +pub const SYS_sync_file_range2: ::c_long = 308; +pub const SYS_fallocate: ::c_long = 309; +pub const SYS_subpage_prot: ::c_long = 310; +pub const SYS_timerfd_settime: ::c_long = 311; +pub const SYS_timerfd_gettime: ::c_long = 312; +pub const SYS_signalfd4: ::c_long = 313; +pub const SYS_eventfd2: ::c_long = 314; +pub const SYS_epoll_create1: ::c_long = 315; +pub const SYS_dup3: ::c_long = 316; +pub const SYS_pipe2: ::c_long = 317; +pub const SYS_inotify_init1: ::c_long = 318; +pub const SYS_perf_event_open: ::c_long = 319; +pub const SYS_preadv: ::c_long = 320; +pub const SYS_pwritev: ::c_long = 321; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 322; +pub const SYS_fanotify_init: ::c_long = 323; +pub const SYS_fanotify_mark: ::c_long = 324; +pub const SYS_prlimit64: ::c_long = 325; +pub const SYS_socket: ::c_long = 326; +pub const SYS_bind: ::c_long = 327; +pub const SYS_connect: ::c_long = 328; +pub const SYS_listen: ::c_long = 329; +pub const SYS_accept: ::c_long = 330; +pub const SYS_getsockname: ::c_long = 331; +pub const SYS_getpeername: ::c_long = 332; +pub const SYS_socketpair: ::c_long = 333; +pub const SYS_send: ::c_long = 334; +pub const SYS_sendto: ::c_long = 335; +pub const SYS_recv: ::c_long = 336; +pub const SYS_recvfrom: ::c_long = 337; +pub const SYS_shutdown: ::c_long = 338; +pub const SYS_setsockopt: ::c_long = 339; +pub const SYS_getsockopt: ::c_long = 340; +pub const SYS_sendmsg: ::c_long = 341; +pub const SYS_recvmsg: ::c_long = 342; +pub const SYS_recvmmsg: ::c_long = 343; +pub const SYS_accept4: ::c_long = 344; +pub const SYS_name_to_handle_at: ::c_long = 345; +pub const SYS_open_by_handle_at: ::c_long = 346; +pub const SYS_clock_adjtime: ::c_long = 347; +pub const SYS_syncfs: ::c_long = 348; +pub const SYS_sendmmsg: ::c_long = 349; +pub const SYS_setns: ::c_long = 350; +pub const SYS_process_vm_readv: ::c_long = 351; +pub const SYS_process_vm_writev: ::c_long = 352; +pub const SYS_finit_module: ::c_long = 353; +pub const SYS_kcmp: ::c_long = 354; +pub const SYS_sched_setattr: ::c_long = 355; +pub const SYS_sched_getattr: ::c_long = 356; +pub const SYS_renameat2: ::c_long = 357; +pub const SYS_seccomp: ::c_long = 358; +pub const SYS_getrandom: ::c_long = 359; +pub const SYS_memfd_create: ::c_long = 360; +pub const SYS_bpf: ::c_long = 361; +pub const SYS_execveat: ::c_long = 362; +pub const SYS_switch_endian: ::c_long = 363; +pub const SYS_userfaultfd: ::c_long = 364; +pub const SYS_membarrier: ::c_long = 365; +pub const SYS_mlock2: ::c_long = 378; +pub const SYS_copy_file_range: ::c_long = 379; +pub const SYS_preadv2: ::c_long = 380; +pub const SYS_pwritev2: ::c_long = 381; +pub const SYS_kexec_file_load: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_rseq: ::c_long = 387; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs new file mode 100644 index 0000000..48d152a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs @@ -0,0 +1,44 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct ucontext_t { + pub __uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct mcontext_t { + pub __gregs: [::c_ulong; 32], + pub __fpregs: __riscv_mc_fp_state, + } + + #[allow(missing_debug_implementations)] + pub union __riscv_mc_fp_state { + pub __f: __riscv_mc_f_ext_state, + pub __d: __riscv_mc_d_ext_state, + pub __q: __riscv_mc_q_ext_state, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_f_ext_state { + pub __f: [::c_uint; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_d_ext_state { + pub __f: [::c_ulonglong; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct __riscv_mc_q_ext_state { + pub __f: [::c_ulonglong; 64], + pub __fcsr: ::c_uint, + pub __glibc_reserved: [::c_uint; 3], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs new file mode 100644 index 0000000..f3b130c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs @@ -0,0 +1,812 @@ +//! RISC-V-specific definitions for 32-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = ::c_int; + +s! { + pub struct pthread_attr_t { + __size: [::c_ulong; 7], + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2usize], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_favail: ::fsfilcnt64_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused5: ::c_ulong, + __unused6: ::c_ulong, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct user_regs_struct { + pub pc: ::c_ulong, + pub ra: ::c_ulong, + pub sp: ::c_ulong, + pub gp: ::c_ulong, + pub tp: ::c_ulong, + pub t0: ::c_ulong, + pub t1: ::c_ulong, + pub t2: ::c_ulong, + pub s0: ::c_ulong, + pub s1: ::c_ulong, + pub a0: ::c_ulong, + pub a1: ::c_ulong, + pub a2: ::c_ulong, + pub a3: ::c_ulong, + pub a4: ::c_ulong, + pub a5: ::c_ulong, + pub a6: ::c_ulong, + pub a7: ::c_ulong, + pub s2: ::c_ulong, + pub s3: ::c_ulong, + pub s4: ::c_ulong, + pub s5: ::c_ulong, + pub s6: ::c_ulong, + pub s7: ::c_ulong, + pub s8: ::c_ulong, + pub s9: ::c_ulong, + pub s10: ::c_ulong, + pub s11: ::c_ulong, + pub t3: ::c_ulong, + pub t4: ::c_ulong, + pub t5: ::c_ulong, + pub t6: ::c_ulong, + } +} + +pub const O_LARGEFILE: ::c_int = 0; +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 1052672; +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 256; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SA_SIGINFO: ::c_int = 4; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const POLLWRNORM: ::c_short = 256; +pub const POLLWRBAND: ::c_short = 512; +pub const O_ASYNC: ::c_int = 8192; +pub const O_NDELAY: ::c_int = 2048; +pub const EFD_NONBLOCK: ::c_int = 2048; +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const SFD_NONBLOCK: ::c_int = 2048; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const O_DIRECT: ::c_int = 16384; +pub const O_DIRECTORY: ::c_int = 65536; +pub const O_NOFOLLOW: ::c_int = 131072; +pub const MAP_HUGETLB: ::c_int = 262144; +pub const MAP_LOCKED: ::c_int = 8192; +pub const MAP_NORESERVE: ::c_int = 16384; +pub const MAP_ANON: ::c_int = 32; +pub const MAP_ANONYMOUS: ::c_int = 32; +pub const MAP_DENYWRITE: ::c_int = 2048; +pub const MAP_EXECUTABLE: ::c_int = 4096; +pub const MAP_POPULATE: ::c_int = 32768; +pub const MAP_NONBLOCK: ::c_int = 65536; +pub const MAP_STACK: ::c_int = 131072; +pub const MAP_SYNC: ::c_int = 0x080000; +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const MCL_CURRENT: ::c_int = 1; +pub const MCL_FUTURE: ::c_int = 2; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 4111; +pub const TAB1: ::tcflag_t = 2048; +pub const TAB2: ::tcflag_t = 4096; +pub const TAB3: ::tcflag_t = 6144; +pub const CR1: ::tcflag_t = 512; +pub const CR2: ::tcflag_t = 1024; +pub const CR3: ::tcflag_t = 1536; +pub const FF1: ::tcflag_t = 32768; +pub const BS1: ::tcflag_t = 8192; +pub const VT1: ::tcflag_t = 16384; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 1024; +pub const IXOFF: ::tcflag_t = 4096; +pub const ONLCR: ::tcflag_t = 4; +pub const CSIZE: ::tcflag_t = 48; +pub const CS6: ::tcflag_t = 16; +pub const CS7: ::tcflag_t = 32; +pub const CS8: ::tcflag_t = 48; +pub const CSTOPB: ::tcflag_t = 64; +pub const CREAD: ::tcflag_t = 128; +pub const PARENB: ::tcflag_t = 256; +pub const PARODD: ::tcflag_t = 512; +pub const HUPCL: ::tcflag_t = 1024; +pub const CLOCAL: ::tcflag_t = 2048; +pub const ECHOKE: ::tcflag_t = 2048; +pub const ECHOE: ::tcflag_t = 16; +pub const ECHOK: ::tcflag_t = 32; +pub const ECHONL: ::tcflag_t = 64; +pub const ECHOPRT: ::tcflag_t = 1024; +pub const ECHOCTL: ::tcflag_t = 512; +pub const ISIG: ::tcflag_t = 1; +pub const ICANON: ::tcflag_t = 2; +pub const PENDIN: ::tcflag_t = 16384; +pub const NOFLSH: ::tcflag_t = 128; +pub const CIBAUD: ::tcflag_t = 269418496; +pub const CBAUDEX: ::tcflag_t = 4096; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 2; +pub const NLDLY: ::tcflag_t = 256; +pub const CRDLY: ::tcflag_t = 1536; +pub const TABDLY: ::tcflag_t = 6144; +pub const BSDLY: ::tcflag_t = 8192; +pub const FFDLY: ::tcflag_t = 32768; +pub const VTDLY: ::tcflag_t = 16384; +pub const XTABS: ::tcflag_t = 6144; +pub const B0: ::speed_t = 0; +pub const B50: ::speed_t = 1; +pub const B75: ::speed_t = 2; +pub const B110: ::speed_t = 3; +pub const B134: ::speed_t = 4; +pub const B150: ::speed_t = 5; +pub const B200: ::speed_t = 6; +pub const B300: ::speed_t = 7; +pub const B600: ::speed_t = 8; +pub const B1200: ::speed_t = 9; +pub const B1800: ::speed_t = 10; +pub const B2400: ::speed_t = 11; +pub const B4800: ::speed_t = 12; +pub const B9600: ::speed_t = 13; +pub const B19200: ::speed_t = 14; +pub const B38400: ::speed_t = 15; +pub const EXTA: ::speed_t = 14; +pub const EXTB: ::speed_t = 15; +pub const B57600: ::speed_t = 4097; +pub const B115200: ::speed_t = 4098; +pub const B230400: ::speed_t = 4099; +pub const B460800: ::speed_t = 4100; +pub const B500000: ::speed_t = 4101; +pub const B576000: ::speed_t = 4102; +pub const B921600: ::speed_t = 4103; +pub const B1000000: ::speed_t = 4104; +pub const B1152000: ::speed_t = 4105; +pub const B1500000: ::speed_t = 4106; +pub const B2000000: ::speed_t = 4107; +pub const B2500000: ::speed_t = 4108; +pub const B3000000: ::speed_t = 4109; +pub const B3500000: ::speed_t = 4110; +pub const B4000000: ::speed_t = 4111; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 32768; +pub const TOSTOP: ::tcflag_t = 256; +pub const FLUSHO: ::tcflag_t = 4096; +pub const EXTPROC: ::tcflag_t = 65536; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; +pub const NGREG: usize = 32; +pub const REG_PC: usize = 0; +pub const REG_RA: usize = 1; +pub const REG_SP: usize = 2; +pub const REG_TP: usize = 4; +pub const REG_S0: usize = 8; +pub const REG_S1: usize = 9; +pub const REG_A0: usize = 10; +pub const REG_S2: usize = 18; +pub const REG_NARGS: usize = 8; + +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_close: ::c_long = 57; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_brk: ::c_long = 214; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_dup: ::c_long = 23; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_socket: ::c_long = 198; +pub const SYS_connect: ::c_long = 203; +pub const SYS_accept: ::c_long = 202; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_exit: ::c_long = 93; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_kill: ::c_long = 129; +pub const SYS_uname: ::c_long = 160; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semop: ::c_long = 193; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_flock: ::c_long = 32; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_umask: ::c_long = 166; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_times: ::c_long = 153; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_personality: ::c_long = 92; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_sync: ::c_long = 81; +pub const SYS_acct: ::c_long = 89; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_mount: ::c_long = 40; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_futex: ::c_long = 98; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_openat: ::c_long = 56; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_setns: ::c_long = 268; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_rseq: ::c_long = 293; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs new file mode 100644 index 0000000..98fda88 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [i64; 3] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs new file mode 100644 index 0000000..57ad9fe --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs @@ -0,0 +1,856 @@ +//! SPARC-specific definitions for 32-bit linux-like values + +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + __reserved: ::c_short, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_ushort, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 2], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + __pad1: ::c_ushort, + pub mode: ::c_ushort, + __pad2: ::c_ushort, + pub __seq: ::c_ushort, + __unused1: ::c_ulonglong, + __unused2: ::c_ulonglong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + __pad1: ::c_uint, + pub shm_atime: ::time_t, + __pad2: ::c_uint, + pub shm_dtime: ::time_t, + __pad3: ::c_uint, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __reserved1: ::c_ulong, + __reserved2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __pad1: ::c_uint, + pub msg_stime: ::time_t, + __pad2: ::c_uint, + pub msg_rtime: ::time_t, + __pad3: ::c_uint, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ushort, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved1: ::c_ulong, + __glibc_reserved2: ::c_ulong, + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const O_APPEND: ::c_int = 0x8; +pub const O_CREAT: ::c_int = 0x200; +pub const O_EXCL: ::c_int = 0x800; +pub const O_NOCTTY: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 0x4000; +pub const O_SYNC: ::c_int = 0x802000; +pub const O_RSYNC: ::c_int = 0x802000; +pub const O_DSYNC: ::c_int = 0x2000; +pub const O_FSYNC: ::c_int = 0x802000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0200; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLK: ::c_int = 78; +pub const ENAMETOOLONG: ::c_int = 63; +pub const ENOLCK: ::c_int = 79; +pub const ENOSYS: ::c_int = 90; +pub const ENOTEMPTY: ::c_int = 66; +pub const ELOOP: ::c_int = 62; +pub const ENOMSG: ::c_int = 75; +pub const EIDRM: ::c_int = 77; +pub const ECHRNG: ::c_int = 94; +pub const EL2NSYNC: ::c_int = 95; +pub const EL3HLT: ::c_int = 96; +pub const EL3RST: ::c_int = 97; +pub const ELNRNG: ::c_int = 98; +pub const EUNATCH: ::c_int = 99; +pub const ENOCSI: ::c_int = 100; +pub const EL2HLT: ::c_int = 101; +pub const EBADE: ::c_int = 102; +pub const EBADR: ::c_int = 103; +pub const EXFULL: ::c_int = 104; +pub const ENOANO: ::c_int = 105; +pub const EBADRQC: ::c_int = 106; +pub const EBADSLT: ::c_int = 107; +pub const EMULTIHOP: ::c_int = 87; +pub const EOVERFLOW: ::c_int = 92; +pub const ENOTUNIQ: ::c_int = 115; +pub const EBADFD: ::c_int = 93; +pub const EBADMSG: ::c_int = 76; +pub const EREMCHG: ::c_int = 89; +pub const ELIBACC: ::c_int = 114; +pub const ELIBBAD: ::c_int = 112; +pub const ELIBSCN: ::c_int = 124; +pub const ELIBMAX: ::c_int = 123; +pub const ELIBEXEC: ::c_int = 110; +pub const EILSEQ: ::c_int = 122; +pub const ERESTART: ::c_int = 116; +pub const ESTRPIPE: ::c_int = 91; +pub const EUSERS: ::c_int = 68; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const EALREADY: ::c_int = 37; +pub const EINPROGRESS: ::c_int = 36; +pub const ESTALE: ::c_int = 70; +pub const EDQUOT: ::c_int = 69; +pub const ENOMEDIUM: ::c_int = 125; +pub const EMEDIUMTYPE: ::c_int = 126; +pub const ECANCELED: ::c_int = 127; +pub const ENOKEY: ::c_int = 128; +pub const EKEYEXPIRED: ::c_int = 129; +pub const EKEYREVOKED: ::c_int = 130; +pub const EKEYREJECTED: ::c_int = 131; +pub const EOWNERDEAD: ::c_int = 132; +pub const ENOTRECOVERABLE: ::c_int = 133; +pub const EHWPOISON: ::c_int = 135; +pub const ERFKILL: ::c_int = 134; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_SIGINFO: ::c_int = 0x200; +pub const SA_NOCLDWAIT: ::c_int = 0x100; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 23; +pub const SIGPWR: ::c_int = 29; +pub const SIG_SETMASK: ::c_int = 4; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const POLLWRNORM: ::c_short = 4; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const O_ASYNC: ::c_int = 0x40; +pub const O_NDELAY: ::c_int = 0x4004; + +pub const EFD_NONBLOCK: ::c_int = 0x4000; + +pub const F_GETLK: ::c_int = 7; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; + +pub const SFD_NONBLOCK: ::c_int = 0x4000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_LARGEFILE: ::c_int = 0x40000; +pub const O_DIRECT: ::c_int = 0x100000; + +pub const MAP_LOCKED: ::c_int = 0x0100; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 108; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0x0000100f; +pub const TAB1: ::tcflag_t = 0x800; +pub const TAB2: ::tcflag_t = 0x1000; +pub const TAB3: ::tcflag_t = 0x1800; +pub const CR1: ::tcflag_t = 0x200; +pub const CR2: ::tcflag_t = 0x400; +pub const CR3: ::tcflag_t = 0x600; +pub const FF1: ::tcflag_t = 0x8000; +pub const BS1: ::tcflag_t = 0x2000; +pub const VT1: ::tcflag_t = 0x4000; +pub const VWERASE: usize = 0xe; +pub const VREPRINT: usize = 0xc; +pub const VSUSP: usize = 0xa; +pub const VSTART: usize = 0x8; +pub const VSTOP: usize = 0x9; +pub const VDISCARD: usize = 0xd; +pub const VTIME: usize = 0x5; +pub const IXON: ::tcflag_t = 0x400; +pub const IXOFF: ::tcflag_t = 0x1000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x30; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x40; +pub const CREAD: ::tcflag_t = 0x80; +pub const PARENB: ::tcflag_t = 0x100; +pub const PARODD: ::tcflag_t = 0x200; +pub const HUPCL: ::tcflag_t = 0x400; +pub const CLOCAL: ::tcflag_t = 0x800; +pub const ECHOKE: ::tcflag_t = 0x800; +pub const ECHOE: ::tcflag_t = 0x10; +pub const ECHOK: ::tcflag_t = 0x20; +pub const ECHONL: ::tcflag_t = 0x40; +pub const ECHOPRT: ::tcflag_t = 0x400; +pub const ECHOCTL: ::tcflag_t = 0x200; +pub const ISIG: ::tcflag_t = 0x1; +pub const ICANON: ::tcflag_t = 0x2; +pub const PENDIN: ::tcflag_t = 0x4000; +pub const NOFLSH: ::tcflag_t = 0x80; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0x00001000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0x1001; +pub const B115200: ::speed_t = 0x1002; +pub const B230400: ::speed_t = 0x1003; +pub const B460800: ::speed_t = 0x1004; +pub const B76800: ::speed_t = 0x1005; +pub const B153600: ::speed_t = 0x1006; +pub const B307200: ::speed_t = 0x1007; +pub const B614400: ::speed_t = 0x1008; +pub const B921600: ::speed_t = 0x1009; +pub const B500000: ::speed_t = 0x100a; +pub const B576000: ::speed_t = 0x100b; +pub const B1000000: ::speed_t = 0x100c; +pub const B1152000: ::speed_t = 0x100d; +pub const B1500000: ::speed_t = 0x100e; +pub const B2000000: ::speed_t = 0x100f; + +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x8000; +pub const TOSTOP: ::tcflag_t = 0x100; +pub const FLUSHO: ::tcflag_t = 0x1000; +pub const EXTPROC: ::tcflag_t = 0x10000; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_wait4: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execv: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_chown: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_brk: ::c_long = 17; +pub const SYS_perfctr: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_capget: ::c_long = 21; +pub const SYS_capset: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_vmsplice: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_sigaltstack: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_lchown32: ::c_long = 31; +pub const SYS_fchown32: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_chown32: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_stat: ::c_long = 38; +pub const SYS_sendfile: ::c_long = 39; +pub const SYS_lstat: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_getuid32: ::c_long = 44; +pub const SYS_umount2: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_getgid32: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_reboot: ::c_long = 55; +pub const SYS_mmap2: ::c_long = 56; +pub const SYS_symlink: ::c_long = 57; +pub const SYS_readlink: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_fstat: ::c_long = 62; +pub const SYS_fstat64: ::c_long = 63; +pub const SYS_getpagesize: ::c_long = 64; +pub const SYS_msync: ::c_long = 65; +pub const SYS_vfork: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_geteuid32: ::c_long = 69; +pub const SYS_getegid32: ::c_long = 70; +pub const SYS_mmap: ::c_long = 71; +pub const SYS_setreuid32: ::c_long = 72; +pub const SYS_munmap: ::c_long = 73; +pub const SYS_mprotect: ::c_long = 74; +pub const SYS_madvise: ::c_long = 75; +pub const SYS_vhangup: ::c_long = 76; +pub const SYS_truncate64: ::c_long = 77; +pub const SYS_mincore: ::c_long = 78; +pub const SYS_getgroups: ::c_long = 79; +pub const SYS_setgroups: ::c_long = 80; +pub const SYS_getpgrp: ::c_long = 81; +pub const SYS_setgroups32: ::c_long = 82; +pub const SYS_setitimer: ::c_long = 83; +pub const SYS_ftruncate64: ::c_long = 84; +pub const SYS_swapon: ::c_long = 85; +pub const SYS_getitimer: ::c_long = 86; +pub const SYS_setuid32: ::c_long = 87; +pub const SYS_sethostname: ::c_long = 88; +pub const SYS_setgid32: ::c_long = 89; +pub const SYS_dup2: ::c_long = 90; +pub const SYS_setfsuid32: ::c_long = 91; +pub const SYS_fcntl: ::c_long = 92; +pub const SYS_select: ::c_long = 93; +pub const SYS_setfsgid32: ::c_long = 94; +pub const SYS_fsync: ::c_long = 95; +pub const SYS_setpriority: ::c_long = 96; +pub const SYS_socket: ::c_long = 97; +pub const SYS_connect: ::c_long = 98; +pub const SYS_accept: ::c_long = 99; +pub const SYS_getpriority: ::c_long = 100; +pub const SYS_rt_sigreturn: ::c_long = 101; +pub const SYS_rt_sigaction: ::c_long = 102; +pub const SYS_rt_sigprocmask: ::c_long = 103; +pub const SYS_rt_sigpending: ::c_long = 104; +pub const SYS_rt_sigtimedwait: ::c_long = 105; +pub const SYS_rt_sigqueueinfo: ::c_long = 106; +pub const SYS_rt_sigsuspend: ::c_long = 107; +pub const SYS_setresuid32: ::c_long = 108; +pub const SYS_getresuid32: ::c_long = 109; +pub const SYS_setresgid32: ::c_long = 110; +pub const SYS_getresgid32: ::c_long = 111; +pub const SYS_setregid32: ::c_long = 112; +pub const SYS_recvmsg: ::c_long = 113; +pub const SYS_sendmsg: ::c_long = 114; +pub const SYS_getgroups32: ::c_long = 115; +pub const SYS_gettimeofday: ::c_long = 116; +pub const SYS_getrusage: ::c_long = 117; +pub const SYS_getsockopt: ::c_long = 118; +pub const SYS_getcwd: ::c_long = 119; +pub const SYS_readv: ::c_long = 120; +pub const SYS_writev: ::c_long = 121; +pub const SYS_settimeofday: ::c_long = 122; +pub const SYS_fchown: ::c_long = 123; +pub const SYS_fchmod: ::c_long = 124; +pub const SYS_recvfrom: ::c_long = 125; +pub const SYS_setreuid: ::c_long = 126; +pub const SYS_setregid: ::c_long = 127; +pub const SYS_rename: ::c_long = 128; +pub const SYS_truncate: ::c_long = 129; +pub const SYS_ftruncate: ::c_long = 130; +pub const SYS_flock: ::c_long = 131; +pub const SYS_lstat64: ::c_long = 132; +pub const SYS_sendto: ::c_long = 133; +pub const SYS_shutdown: ::c_long = 134; +pub const SYS_socketpair: ::c_long = 135; +pub const SYS_mkdir: ::c_long = 136; +pub const SYS_rmdir: ::c_long = 137; +pub const SYS_utimes: ::c_long = 138; +pub const SYS_stat64: ::c_long = 139; +pub const SYS_sendfile64: ::c_long = 140; +pub const SYS_getpeername: ::c_long = 141; +pub const SYS_futex: ::c_long = 142; +pub const SYS_gettid: ::c_long = 143; +pub const SYS_getrlimit: ::c_long = 144; +pub const SYS_setrlimit: ::c_long = 145; +pub const SYS_pivot_root: ::c_long = 146; +pub const SYS_prctl: ::c_long = 147; +pub const SYS_pciconfig_read: ::c_long = 148; +pub const SYS_pciconfig_write: ::c_long = 149; +pub const SYS_getsockname: ::c_long = 150; +pub const SYS_inotify_init: ::c_long = 151; +pub const SYS_inotify_add_watch: ::c_long = 152; +pub const SYS_poll: ::c_long = 153; +pub const SYS_getdents64: ::c_long = 154; +pub const SYS_fcntl64: ::c_long = 155; +pub const SYS_inotify_rm_watch: ::c_long = 156; +pub const SYS_statfs: ::c_long = 157; +pub const SYS_fstatfs: ::c_long = 158; +pub const SYS_umount: ::c_long = 159; +pub const SYS_sched_set_affinity: ::c_long = 160; +pub const SYS_sched_get_affinity: ::c_long = 161; +pub const SYS_getdomainname: ::c_long = 162; +pub const SYS_setdomainname: ::c_long = 163; +pub const SYS_quotactl: ::c_long = 165; +pub const SYS_set_tid_address: ::c_long = 166; +pub const SYS_mount: ::c_long = 167; +pub const SYS_ustat: ::c_long = 168; +pub const SYS_setxattr: ::c_long = 169; +pub const SYS_lsetxattr: ::c_long = 170; +pub const SYS_fsetxattr: ::c_long = 171; +pub const SYS_getxattr: ::c_long = 172; +pub const SYS_lgetxattr: ::c_long = 173; +pub const SYS_getdents: ::c_long = 174; +pub const SYS_setsid: ::c_long = 175; +pub const SYS_fchdir: ::c_long = 176; +pub const SYS_fgetxattr: ::c_long = 177; +pub const SYS_listxattr: ::c_long = 178; +pub const SYS_llistxattr: ::c_long = 179; +pub const SYS_flistxattr: ::c_long = 180; +pub const SYS_removexattr: ::c_long = 181; +pub const SYS_lremovexattr: ::c_long = 182; +pub const SYS_sigpending: ::c_long = 183; +pub const SYS_query_module: ::c_long = 184; +pub const SYS_setpgid: ::c_long = 185; +pub const SYS_fremovexattr: ::c_long = 186; +pub const SYS_tkill: ::c_long = 187; +pub const SYS_exit_group: ::c_long = 188; +pub const SYS_uname: ::c_long = 189; +pub const SYS_init_module: ::c_long = 190; +pub const SYS_personality: ::c_long = 191; +pub const SYS_remap_file_pages: ::c_long = 192; +pub const SYS_epoll_create: ::c_long = 193; +pub const SYS_epoll_ctl: ::c_long = 194; +pub const SYS_epoll_wait: ::c_long = 195; +pub const SYS_ioprio_set: ::c_long = 196; +pub const SYS_getppid: ::c_long = 197; +pub const SYS_sigaction: ::c_long = 198; +pub const SYS_sgetmask: ::c_long = 199; +pub const SYS_ssetmask: ::c_long = 200; +pub const SYS_sigsuspend: ::c_long = 201; +pub const SYS_oldlstat: ::c_long = 202; +pub const SYS_uselib: ::c_long = 203; +pub const SYS_readdir: ::c_long = 204; +pub const SYS_readahead: ::c_long = 205; +pub const SYS_socketcall: ::c_long = 206; +pub const SYS_syslog: ::c_long = 207; +pub const SYS_lookup_dcookie: ::c_long = 208; +pub const SYS_fadvise64: ::c_long = 209; +pub const SYS_fadvise64_64: ::c_long = 210; +pub const SYS_tgkill: ::c_long = 211; +pub const SYS_waitpid: ::c_long = 212; +pub const SYS_swapoff: ::c_long = 213; +pub const SYS_sysinfo: ::c_long = 214; +pub const SYS_ipc: ::c_long = 215; +pub const SYS_sigreturn: ::c_long = 216; +pub const SYS_clone: ::c_long = 217; +pub const SYS_ioprio_get: ::c_long = 218; +pub const SYS_adjtimex: ::c_long = 219; +pub const SYS_sigprocmask: ::c_long = 220; +pub const SYS_create_module: ::c_long = 221; +pub const SYS_delete_module: ::c_long = 222; +pub const SYS_get_kernel_syms: ::c_long = 223; +pub const SYS_getpgid: ::c_long = 224; +pub const SYS_bdflush: ::c_long = 225; +pub const SYS_sysfs: ::c_long = 226; +pub const SYS_afs_syscall: ::c_long = 227; +pub const SYS_setfsuid: ::c_long = 228; +pub const SYS_setfsgid: ::c_long = 229; +pub const SYS__newselect: ::c_long = 230; +pub const SYS_time: ::c_long = 231; +pub const SYS_splice: ::c_long = 232; +pub const SYS_stime: ::c_long = 233; +pub const SYS_statfs64: ::c_long = 234; +pub const SYS_fstatfs64: ::c_long = 235; +pub const SYS__llseek: ::c_long = 236; +pub const SYS_mlock: ::c_long = 237; +pub const SYS_munlock: ::c_long = 238; +pub const SYS_mlockall: ::c_long = 239; +pub const SYS_munlockall: ::c_long = 240; +pub const SYS_sched_setparam: ::c_long = 241; +pub const SYS_sched_getparam: ::c_long = 242; +pub const SYS_sched_setscheduler: ::c_long = 243; +pub const SYS_sched_getscheduler: ::c_long = 244; +pub const SYS_sched_yield: ::c_long = 245; +pub const SYS_sched_get_priority_max: ::c_long = 246; +pub const SYS_sched_get_priority_min: ::c_long = 247; +pub const SYS_sched_rr_get_interval: ::c_long = 248; +pub const SYS_nanosleep: ::c_long = 249; +pub const SYS_mremap: ::c_long = 250; +pub const SYS__sysctl: ::c_long = 251; +pub const SYS_getsid: ::c_long = 252; +pub const SYS_fdatasync: ::c_long = 253; +pub const SYS_nfsservctl: ::c_long = 254; +pub const SYS_sync_file_range: ::c_long = 255; +pub const SYS_clock_settime: ::c_long = 256; +pub const SYS_clock_gettime: ::c_long = 257; +pub const SYS_clock_getres: ::c_long = 258; +pub const SYS_clock_nanosleep: ::c_long = 259; +pub const SYS_sched_getaffinity: ::c_long = 260; +pub const SYS_sched_setaffinity: ::c_long = 261; +pub const SYS_timer_settime: ::c_long = 262; +pub const SYS_timer_gettime: ::c_long = 263; +pub const SYS_timer_getoverrun: ::c_long = 264; +pub const SYS_timer_delete: ::c_long = 265; +pub const SYS_timer_create: ::c_long = 266; +pub const SYS_io_setup: ::c_long = 268; +pub const SYS_io_destroy: ::c_long = 269; +pub const SYS_io_submit: ::c_long = 270; +pub const SYS_io_cancel: ::c_long = 271; +pub const SYS_io_getevents: ::c_long = 272; +pub const SYS_mq_open: ::c_long = 273; +pub const SYS_mq_unlink: ::c_long = 274; +pub const SYS_mq_timedsend: ::c_long = 275; +pub const SYS_mq_timedreceive: ::c_long = 276; +pub const SYS_mq_notify: ::c_long = 277; +pub const SYS_mq_getsetattr: ::c_long = 278; +pub const SYS_waitid: ::c_long = 279; +pub const SYS_tee: ::c_long = 280; +pub const SYS_add_key: ::c_long = 281; +pub const SYS_request_key: ::c_long = 282; +pub const SYS_keyctl: ::c_long = 283; +pub const SYS_openat: ::c_long = 284; +pub const SYS_mkdirat: ::c_long = 285; +pub const SYS_mknodat: ::c_long = 286; +pub const SYS_fchownat: ::c_long = 287; +pub const SYS_futimesat: ::c_long = 288; +pub const SYS_fstatat64: ::c_long = 289; +pub const SYS_unlinkat: ::c_long = 290; +pub const SYS_renameat: ::c_long = 291; +pub const SYS_linkat: ::c_long = 292; +pub const SYS_symlinkat: ::c_long = 293; +pub const SYS_readlinkat: ::c_long = 294; +pub const SYS_fchmodat: ::c_long = 295; +pub const SYS_faccessat: ::c_long = 296; +pub const SYS_pselect6: ::c_long = 297; +pub const SYS_ppoll: ::c_long = 298; +pub const SYS_unshare: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_get_robust_list: ::c_long = 301; +pub const SYS_migrate_pages: ::c_long = 302; +pub const SYS_mbind: ::c_long = 303; +pub const SYS_get_mempolicy: ::c_long = 304; +pub const SYS_set_mempolicy: ::c_long = 305; +pub const SYS_kexec_load: ::c_long = 306; +pub const SYS_move_pages: ::c_long = 307; +pub const SYS_getcpu: ::c_long = 308; +pub const SYS_epoll_pwait: ::c_long = 309; +pub const SYS_utimensat: ::c_long = 310; +pub const SYS_signalfd: ::c_long = 311; +pub const SYS_timerfd_create: ::c_long = 312; +pub const SYS_eventfd: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_timerfd_settime: ::c_long = 315; +pub const SYS_timerfd_gettime: ::c_long = 316; +pub const SYS_signalfd4: ::c_long = 317; +pub const SYS_eventfd2: ::c_long = 318; +pub const SYS_epoll_create1: ::c_long = 319; +pub const SYS_dup3: ::c_long = 320; +pub const SYS_pipe2: ::c_long = 321; +pub const SYS_inotify_init1: ::c_long = 322; +pub const SYS_accept4: ::c_long = 323; +pub const SYS_preadv: ::c_long = 324; +pub const SYS_pwritev: ::c_long = 325; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 326; +pub const SYS_perf_event_open: ::c_long = 327; +pub const SYS_recvmmsg: ::c_long = 328; +pub const SYS_fanotify_init: ::c_long = 329; +pub const SYS_fanotify_mark: ::c_long = 330; +pub const SYS_prlimit64: ::c_long = 331; +pub const SYS_name_to_handle_at: ::c_long = 332; +pub const SYS_open_by_handle_at: ::c_long = 333; +pub const SYS_clock_adjtime: ::c_long = 334; +pub const SYS_syncfs: ::c_long = 335; +pub const SYS_sendmmsg: ::c_long = 336; +pub const SYS_setns: ::c_long = 337; +pub const SYS_process_vm_readv: ::c_long = 338; +pub const SYS_process_vm_writev: ::c_long = 339; +pub const SYS_kern_features: ::c_long = 340; +pub const SYS_kcmp: ::c_long = 341; +pub const SYS_finit_module: ::c_long = 342; +pub const SYS_sched_setattr: ::c_long = 343; +pub const SYS_sched_getattr: ::c_long = 344; +pub const SYS_renameat2: ::c_long = 345; +pub const SYS_seccomp: ::c_long = 346; +pub const SYS_getrandom: ::c_long = 347; +pub const SYS_memfd_create: ::c_long = 348; +pub const SYS_bpf: ::c_long = 349; +pub const SYS_execveat: ::c_long = 350; +pub const SYS_membarrier: ::c_long = 351; +pub const SYS_userfaultfd: ::c_long = 352; +pub const SYS_bind: ::c_long = 353; +pub const SYS_listen: ::c_long = 354; +pub const SYS_setsockopt: ::c_long = 355; +pub const SYS_mlock2: ::c_long = 356; +pub const SYS_copy_file_range: ::c_long = 357; +pub const SYS_preadv2: ::c_long = 358; +pub const SYS_pwritev2: ::c_long = 359; +pub const SYS_statx: ::c_long = 360; +pub const SYS_rseq: ::c_long = 365; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +// Reserved in the kernel, but not actually implemented yet +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/align.rs new file mode 100644 index 0000000..9663474 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 6] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs new file mode 100644 index 0000000..9362238 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b32/x86/mod.rs @@ -0,0 +1,1109 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type greg_t = i32; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct _libc_fpreg { + pub significand: [u16; 4], + pub exponent: u16, + } + + pub struct _libc_fpstate { + pub cw: ::c_ulong, + pub sw: ::c_ulong, + pub tag: ::c_ulong, + pub ipoff: ::c_ulong, + pub cssel: ::c_ulong, + pub dataoff: ::c_ulong, + pub datasel: ::c_ulong, + pub _st: [_libc_fpreg; 8], + pub status: ::c_ulong, + } + + pub struct user_fpregs_struct { + pub cwd: ::c_long, + pub swd: ::c_long, + pub twd: ::c_long, + pub fip: ::c_long, + pub fcs: ::c_long, + pub foo: ::c_long, + pub fos: ::c_long, + pub st_space: [::c_long; 20], + } + + pub struct user_regs_struct { + pub ebx: ::c_long, + pub ecx: ::c_long, + pub edx: ::c_long, + pub esi: ::c_long, + pub edi: ::c_long, + pub ebp: ::c_long, + pub eax: ::c_long, + pub xds: ::c_long, + pub xes: ::c_long, + pub xfs: ::c_long, + pub xgs: ::c_long, + pub orig_eax: ::c_long, + pub eip: ::c_long, + pub xcs: ::c_long, + pub eflags: ::c_long, + pub esp: ::c_long, + pub xss: ::c_long, + } + + pub struct user { + pub regs: user_regs_struct, + pub u_fpvalid: ::c_int, + pub i387: user_fpregs_struct, + pub u_tsize: ::c_ulong, + pub u_dsize: ::c_ulong, + pub u_ssize: ::c_ulong, + pub start_code: ::c_ulong, + pub start_stack: ::c_ulong, + pub signal: ::c_long, + __reserved: ::c_int, + pub u_ar0: *mut user_regs_struct, + pub u_fpstate: *mut user_fpregs_struct, + pub magic: ::c_ulong, + pub u_comm: [c_char; 32], + pub u_debugreg: [::c_int; 8], + } + + pub struct mcontext_t { + pub gregs: [greg_t; 19], + pub fpregs: *mut _libc_fpstate, + pub oldmask: ::c_ulong, + pub cr2: ::c_ulong, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: ::c_uint, + __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_uint, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino64_t, + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_ulong, + pub shm_dtime: ::time_t, + __unused2: ::c_ulong, + pub shm_ctime: ::time_t, + __unused3: ::c_ulong, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __glibc_reserved1: ::c_ulong, + pub msg_rtime: ::time_t, + __glibc_reserved2: ::c_ulong, + pub msg_ctime: ::time_t, + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct seccomp_notif_sizes { + pub seccomp_notif: ::__u16, + pub seccomp_notif_resp: ::__u16, + pub seccomp_data: ::__u16, + } +} + +s_no_extra_traits! { + pub struct user_fpxregs_struct { + pub cwd: ::c_ushort, + pub swd: ::c_ushort, + pub twd: ::c_ushort, + pub fop: ::c_ushort, + pub fip: ::c_long, + pub fcs: ::c_long, + pub foo: ::c_long, + pub fos: ::c_long, + pub mxcsr: ::c_long, + __reserved: ::c_long, + pub st_space: [::c_long; 32], + pub xmm_space: [::c_long; 32], + padding: [::c_long; 56], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 112], + __ssp: [::c_ulong; 4], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for user_fpxregs_struct { + fn eq(&self, other: &user_fpxregs_struct) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.twd == other.twd + && self.fop == other.fop + && self.fip == other.fip + && self.fcs == other.fcs + && self.foo == other.foo + && self.fos == other.fos + && self.mxcsr == other.mxcsr + // Ignore __reserved field + && self.st_space == other.st_space + && self.xmm_space == other.xmm_space + // Ignore padding field + } + } + + impl Eq for user_fpxregs_struct {} + + impl ::fmt::Debug for user_fpxregs_struct { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("user_fpxregs_struct") + .field("cwd", &self.cwd) + .field("swd", &self.swd) + .field("twd", &self.twd) + .field("fop", &self.fop) + .field("fip", &self.fip) + .field("fcs", &self.fcs) + .field("foo", &self.foo) + .field("fos", &self.fos) + .field("mxcsr", &self.mxcsr) + // Ignore __reserved field + .field("st_space", &self.st_space) + .field("xmm_space", &self.xmm_space) + // Ignore padding field + .finish() + } + } + + impl ::hash::Hash for user_fpxregs_struct { + fn hash(&self, state: &mut H) { + self.cwd.hash(state); + self.swd.hash(state); + self.twd.hash(state); + self.fop.hash(state); + self.fip.hash(state); + self.fcs.hash(state); + self.foo.hash(state); + self.fos.hash(state); + self.mxcsr.hash(state); + // Ignore __reserved field + self.st_space.hash(state); + self.xmm_space.hash(state); + // Ignore padding field + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + // Ignore __private field + } + } + + impl Eq for ucontext_t {} + + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + // Ignore __private field + .finish() + } + } + + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + // Ignore __private field + } + } + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_LARGEFILE: ::c_int = 0o0100000; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_32BIT: ::c_int = 0x0040; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; + +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_SYSEMU: ::c_uint = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_uint = 32; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86old: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_vm86: ::c_long = 166; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_set_thread_area: ::c_long = 243; +pub const SYS_get_thread_area: ::c_long = 244; +pub const SYS_io_setup: ::c_long = 245; +pub const SYS_io_destroy: ::c_long = 246; +pub const SYS_io_getevents: ::c_long = 247; +pub const SYS_io_submit: ::c_long = 248; +pub const SYS_io_cancel: ::c_long = 249; +pub const SYS_fadvise64: ::c_long = 250; +pub const SYS_exit_group: ::c_long = 252; +pub const SYS_lookup_dcookie: ::c_long = 253; +pub const SYS_epoll_create: ::c_long = 254; +pub const SYS_epoll_ctl: ::c_long = 255; +pub const SYS_epoll_wait: ::c_long = 256; +pub const SYS_remap_file_pages: ::c_long = 257; +pub const SYS_set_tid_address: ::c_long = 258; +pub const SYS_timer_create: ::c_long = 259; +pub const SYS_timer_settime: ::c_long = 260; +pub const SYS_timer_gettime: ::c_long = 261; +pub const SYS_timer_getoverrun: ::c_long = 262; +pub const SYS_timer_delete: ::c_long = 263; +pub const SYS_clock_settime: ::c_long = 264; +pub const SYS_clock_gettime: ::c_long = 265; +pub const SYS_clock_getres: ::c_long = 266; +pub const SYS_clock_nanosleep: ::c_long = 267; +pub const SYS_statfs64: ::c_long = 268; +pub const SYS_fstatfs64: ::c_long = 269; +pub const SYS_tgkill: ::c_long = 270; +pub const SYS_utimes: ::c_long = 271; +pub const SYS_fadvise64_64: ::c_long = 272; +pub const SYS_vserver: ::c_long = 273; +pub const SYS_mbind: ::c_long = 274; +pub const SYS_get_mempolicy: ::c_long = 275; +pub const SYS_set_mempolicy: ::c_long = 276; +pub const SYS_mq_open: ::c_long = 277; +pub const SYS_mq_unlink: ::c_long = 278; +pub const SYS_mq_timedsend: ::c_long = 279; +pub const SYS_mq_timedreceive: ::c_long = 280; +pub const SYS_mq_notify: ::c_long = 281; +pub const SYS_mq_getsetattr: ::c_long = 282; +pub const SYS_kexec_load: ::c_long = 283; +pub const SYS_waitid: ::c_long = 284; +pub const SYS_add_key: ::c_long = 286; +pub const SYS_request_key: ::c_long = 287; +pub const SYS_keyctl: ::c_long = 288; +pub const SYS_ioprio_set: ::c_long = 289; +pub const SYS_ioprio_get: ::c_long = 290; +pub const SYS_inotify_init: ::c_long = 291; +pub const SYS_inotify_add_watch: ::c_long = 292; +pub const SYS_inotify_rm_watch: ::c_long = 293; +pub const SYS_migrate_pages: ::c_long = 294; +pub const SYS_openat: ::c_long = 295; +pub const SYS_mkdirat: ::c_long = 296; +pub const SYS_mknodat: ::c_long = 297; +pub const SYS_fchownat: ::c_long = 298; +pub const SYS_futimesat: ::c_long = 299; +pub const SYS_fstatat64: ::c_long = 300; +pub const SYS_unlinkat: ::c_long = 301; +pub const SYS_renameat: ::c_long = 302; +pub const SYS_linkat: ::c_long = 303; +pub const SYS_symlinkat: ::c_long = 304; +pub const SYS_readlinkat: ::c_long = 305; +pub const SYS_fchmodat: ::c_long = 306; +pub const SYS_faccessat: ::c_long = 307; +pub const SYS_pselect6: ::c_long = 308; +pub const SYS_ppoll: ::c_long = 309; +pub const SYS_unshare: ::c_long = 310; +pub const SYS_set_robust_list: ::c_long = 311; +pub const SYS_get_robust_list: ::c_long = 312; +pub const SYS_splice: ::c_long = 313; +pub const SYS_sync_file_range: ::c_long = 314; +pub const SYS_tee: ::c_long = 315; +pub const SYS_vmsplice: ::c_long = 316; +pub const SYS_move_pages: ::c_long = 317; +pub const SYS_getcpu: ::c_long = 318; +pub const SYS_epoll_pwait: ::c_long = 319; +pub const SYS_utimensat: ::c_long = 320; +pub const SYS_signalfd: ::c_long = 321; +pub const SYS_timerfd_create: ::c_long = 322; +pub const SYS_eventfd: ::c_long = 323; +pub const SYS_fallocate: ::c_long = 324; +pub const SYS_timerfd_settime: ::c_long = 325; +pub const SYS_timerfd_gettime: ::c_long = 326; +pub const SYS_signalfd4: ::c_long = 327; +pub const SYS_eventfd2: ::c_long = 328; +pub const SYS_epoll_create1: ::c_long = 329; +pub const SYS_dup3: ::c_long = 330; +pub const SYS_pipe2: ::c_long = 331; +pub const SYS_inotify_init1: ::c_long = 332; +pub const SYS_preadv: ::c_long = 333; +pub const SYS_pwritev: ::c_long = 334; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 335; +pub const SYS_perf_event_open: ::c_long = 336; +pub const SYS_recvmmsg: ::c_long = 337; +pub const SYS_fanotify_init: ::c_long = 338; +pub const SYS_fanotify_mark: ::c_long = 339; +pub const SYS_prlimit64: ::c_long = 340; +pub const SYS_name_to_handle_at: ::c_long = 341; +pub const SYS_open_by_handle_at: ::c_long = 342; +pub const SYS_clock_adjtime: ::c_long = 343; +pub const SYS_syncfs: ::c_long = 344; +pub const SYS_sendmmsg: ::c_long = 345; +pub const SYS_setns: ::c_long = 346; +pub const SYS_process_vm_readv: ::c_long = 347; +pub const SYS_process_vm_writev: ::c_long = 348; +pub const SYS_kcmp: ::c_long = 349; +pub const SYS_finit_module: ::c_long = 350; +pub const SYS_sched_setattr: ::c_long = 351; +pub const SYS_sched_getattr: ::c_long = 352; +pub const SYS_renameat2: ::c_long = 353; +pub const SYS_seccomp: ::c_long = 354; +pub const SYS_getrandom: ::c_long = 355; +pub const SYS_memfd_create: ::c_long = 356; +pub const SYS_bpf: ::c_long = 357; +pub const SYS_execveat: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_userfaultfd: ::c_long = 374; +pub const SYS_membarrier: ::c_long = 375; +pub const SYS_mlock2: ::c_long = 376; +pub const SYS_copy_file_range: ::c_long = 377; +pub const SYS_preadv2: ::c_long = 378; +pub const SYS_pwritev2: ::c_long = 379; +pub const SYS_pkey_mprotect: ::c_long = 380; +pub const SYS_pkey_alloc: ::c_long = 381; +pub const SYS_pkey_free: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_rseq: ::c_long = 386; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +// offsets in user_regs_structs, from sys/reg.h +pub const EBX: ::c_int = 0; +pub const ECX: ::c_int = 1; +pub const EDX: ::c_int = 2; +pub const ESI: ::c_int = 3; +pub const EDI: ::c_int = 4; +pub const EBP: ::c_int = 5; +pub const EAX: ::c_int = 6; +pub const DS: ::c_int = 7; +pub const ES: ::c_int = 8; +pub const FS: ::c_int = 9; +pub const GS: ::c_int = 10; +pub const ORIG_EAX: ::c_int = 11; +pub const EIP: ::c_int = 12; +pub const CS: ::c_int = 13; +pub const EFL: ::c_int = 14; +pub const UESP: ::c_int = 15; +pub const SS: ::c_int = 16; + +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_GS: ::c_int = 0; +pub const REG_FS: ::c_int = 1; +pub const REG_ES: ::c_int = 2; +pub const REG_DS: ::c_int = 3; +pub const REG_EDI: ::c_int = 4; +pub const REG_ESI: ::c_int = 5; +pub const REG_EBP: ::c_int = 6; +pub const REG_ESP: ::c_int = 7; +pub const REG_EBX: ::c_int = 8; +pub const REG_EDX: ::c_int = 9; +pub const REG_ECX: ::c_int = 10; +pub const REG_EAX: ::c_int = 11; +pub const REG_TRAPNO: ::c_int = 12; +pub const REG_ERR: ::c_int = 13; +pub const REG_EIP: ::c_int = 14; +pub const REG_CS: ::c_int = 15; +pub const REG_EFL: ::c_int = 16; +pub const REG_UESP: ::c_int = 17; +pub const REG_SS: ::c_int = 18; + +pub const SECCOMP_SET_MODE_STRICT: ::c_uint = 0; +pub const SECCOMP_SET_MODE_FILTER: ::c_uint = 1; +pub const SECCOMP_GET_ACTION_AVAIL: ::c_uint = 2; +pub const SECCOMP_GET_NOTIF_SIZES: ::c_uint = 3; + +extern "C" { + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, func: extern "C" fn(), argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs new file mode 100644 index 0000000..06173be --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs @@ -0,0 +1,58 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f32; 8] + } +} + +s! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[repr(align(16))] + pub struct mcontext_t { + pub fault_address: ::c_ulonglong, + pub regs: [::c_ulonglong; 31], + pub sp: ::c_ulonglong, + pub pc: ::c_ulonglong, + pub pstate: ::c_ulonglong, + // nested arrays to get the right size/length while being able to + // auto-derive traits like Debug + __reserved: [[u64; 32]; 16], + } + + #[repr(align(16))] + pub struct user_fpsimd_struct { + pub vregs: [[u64; 2]; 32], + pub fpsr: ::c_uint, + pub fpcr: ::c_uint, + } + + #[repr(align(8))] + pub struct clone_args { + pub flags: ::c_ulonglong, + pub pidfd: ::c_ulonglong, + pub child_tid: ::c_ulonglong, + pub parent_tid: ::c_ulonglong, + pub exit_signal: ::c_ulonglong, + pub stack: ::c_ulonglong, + pub stack_size: ::c_ulonglong, + pub tls: ::c_ulonglong, + pub set_tid: ::c_ulonglong, + pub set_tid_size: ::c_ulonglong, + pub cgroup: ::c_ulonglong, + } +} + +extern "C" { + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, func: extern "C" fn(), argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs new file mode 100644 index 0000000..0848fb5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs @@ -0,0 +1,64 @@ +use pthread_mutex_t; + +pub type c_long = i32; +pub type c_ulong = u32; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 48; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const SYS_sync_file_range2: ::c_long = 84; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs new file mode 100644 index 0000000..4535e73 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs @@ -0,0 +1,7 @@ +s! { + pub struct user_fpsimd_struct { + pub vregs: [::__uint128_t; 32], + pub fpsr: u32, + pub fpcr: u32, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs new file mode 100644 index 0000000..3802caf --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs @@ -0,0 +1,73 @@ +use pthread_mutex_t; + +pub type c_long = i64; +pub type c_ulong = u64; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 48; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const SYS_renameat: ::c_long = 38; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_setrlimit: ::c_long = 164; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs new file mode 100644 index 0000000..f46ea94 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs @@ -0,0 +1,938 @@ +//! AArch64-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = u32; +pub type nlink_t = u32; +pub type blksize_t = i32; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + #[cfg(target_arch = "sparc64")] + __reserved0: ::c_int, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + __pad2: ::c_int, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [usize; 8] + } + + pub struct user_regs_struct { + pub regs: [::c_ulonglong; 31], + pub sp: ::c_ulonglong, + pub pc: ::c_ulonglong, + pub pstate: ::c_ulonglong, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct seccomp_notif_sizes { + pub seccomp_notif: ::__u16, + pub seccomp_notif_resp: ::__u16, + pub seccomp_data: ::__u16, + } +} + +pub const VEOF: usize = 4; + +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; + +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 5120; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const SECCOMP_SET_MODE_STRICT: ::c_uint = 0; +pub const SECCOMP_SET_MODE_FILTER: ::c_uint = 1; +pub const SECCOMP_GET_ACTION_AVAIL: ::c_uint = 2; +pub const SECCOMP_GET_NOTIF_SIZES: ::c_uint = 3; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +// sys/auxv.h +pub const HWCAP_FP: ::c_ulong = 1 << 0; +pub const HWCAP_ASIMD: ::c_ulong = 1 << 1; +pub const HWCAP_EVTSTRM: ::c_ulong = 1 << 2; +pub const HWCAP_AES: ::c_ulong = 1 << 3; +pub const HWCAP_PMULL: ::c_ulong = 1 << 4; +pub const HWCAP_SHA1: ::c_ulong = 1 << 5; +pub const HWCAP_SHA2: ::c_ulong = 1 << 6; +pub const HWCAP_CRC32: ::c_ulong = 1 << 7; +pub const HWCAP_ATOMICS: ::c_ulong = 1 << 8; +pub const HWCAP_FPHP: ::c_ulong = 1 << 9; +pub const HWCAP_ASIMDHP: ::c_ulong = 1 << 10; +pub const HWCAP_CPUID: ::c_ulong = 1 << 11; +pub const HWCAP_ASIMDRDM: ::c_ulong = 1 << 12; +pub const HWCAP_JSCVT: ::c_ulong = 1 << 13; +pub const HWCAP_FCMA: ::c_ulong = 1 << 14; +pub const HWCAP_LRCPC: ::c_ulong = 1 << 15; +pub const HWCAP_DCPOP: ::c_ulong = 1 << 16; +pub const HWCAP_SHA3: ::c_ulong = 1 << 17; +pub const HWCAP_SM3: ::c_ulong = 1 << 18; +pub const HWCAP_SM4: ::c_ulong = 1 << 19; +pub const HWCAP_ASIMDDP: ::c_ulong = 1 << 20; +pub const HWCAP_SHA512: ::c_ulong = 1 << 21; +pub const HWCAP_SVE: ::c_ulong = 1 << 22; +pub const HWCAP_ASIMDFHM: ::c_ulong = 1 << 23; +pub const HWCAP_DIT: ::c_ulong = 1 << 24; +pub const HWCAP_USCAT: ::c_ulong = 1 << 25; +pub const HWCAP_ILRCPC: ::c_ulong = 1 << 26; +pub const HWCAP_FLAGM: ::c_ulong = 1 << 27; +pub const HWCAP_SSBS: ::c_ulong = 1 << 28; +pub const HWCAP_SB: ::c_ulong = 1 << 29; +pub const HWCAP_PACA: ::c_ulong = 1 << 30; +pub const HWCAP_PACG: ::c_ulong = 1 << 31; +// FIXME: enable these again once linux-api-headers are up to date enough on CI. +// See discussion in https://github.com/rust-lang/libc/pull/1638 +//pub const HWCAP2_DCPODP: ::c_ulong = 1 << 0; +//pub const HWCAP2_SVE2: ::c_ulong = 1 << 1; +//pub const HWCAP2_SVEAES: ::c_ulong = 1 << 2; +//pub const HWCAP2_SVEPMULL: ::c_ulong = 1 << 3; +//pub const HWCAP2_SVEBITPERM: ::c_ulong = 1 << 4; +//pub const HWCAP2_SVESHA3: ::c_ulong = 1 << 5; +//pub const HWCAP2_SVESM4: ::c_ulong = 1 << 6; +//pub const HWCAP2_FLAGM2: ::c_ulong = 1 << 7; +//pub const HWCAP2_FRINT: ::c_ulong = 1 << 8; +//pub const HWCAP2_MTE: ::c_ulong = 1 << 18; + +// linux/prctl.h +pub const PR_PAC_RESET_KEYS: ::c_int = 54; +pub const PR_SET_TAGGED_ADDR_CTRL: ::c_int = 55; +pub const PR_GET_TAGGED_ADDR_CTRL: ::c_int = 56; +pub const PR_PAC_SET_ENABLED_KEYS: ::c_int = 60; +pub const PR_PAC_GET_ENABLED_KEYS: ::c_int = 61; + +pub const PR_TAGGED_ADDR_ENABLE: ::c_ulong = 1; + +pub const PR_PAC_APIAKEY: ::c_ulong = 1 << 0; +pub const PR_PAC_APIBKEY: ::c_ulong = 1 << 1; +pub const PR_PAC_APDAKEY: ::c_ulong = 1 << 2; +pub const PR_PAC_APDBKEY: ::c_ulong = 1 << 3; +pub const PR_PAC_APGAKEY: ::c_ulong = 1 << 4; + +pub const PR_SME_SET_VL: ::c_int = 63; +pub const PR_SME_GET_VL: ::c_int = 64; +pub const PR_SME_VL_LEN_MAX: ::c_int = 0xffff; + +pub const PR_SME_SET_VL_INHERIT: ::c_ulong = 1 << 17; +pub const PR_SME_SET_VL_ONE_EXEC: ::c_ulong = 1 << 18; + +// Syscall table +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_dup: ::c_long = 23; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_flock: ::c_long = 32; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_linkat: ::c_long = 37; +// 38 is renameat only on LP64 +pub const SYS_umount2: ::c_long = 39; +pub const SYS_mount: ::c_long = 40; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_openat: ::c_long = 56; +pub const SYS_close: ::c_long = 57; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_sync: ::c_long = 81; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +// 84 sync_file_range on LP64 and sync_file_range2 on ILP32 +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_acct: ::c_long = 89; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_personality: ::c_long = 92; +pub const SYS_exit: ::c_long = 93; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_futex: ::c_long = 98; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_kill: ::c_long = 129; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_times: ::c_long = 153; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_uname: ::c_long = 160; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +// 163 is getrlimit only on LP64 +// 164 is setrlimit only on LP64 +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_umask: ::c_long = 166; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_semop: ::c_long = 193; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_socket: ::c_long = 198; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_accept: ::c_long = 202; +pub const SYS_connect: ::c_long = 203; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_brk: ::c_long = 214; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_setns: ::c_long = 268; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_rseq: ::c_long = 293; +pub const SYS_kexec_file_load: ::c_long = 294; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + mod ilp32; + pub use self::ilp32::*; + } else { + mod lp64; + pub use self::lp64::*; + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} + +cfg_if! { + if #[cfg(libc_int128)] { + mod int128; + pub use self::int128::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs new file mode 100644 index 0000000..dc191f5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs @@ -0,0 +1,40 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } +} + +s! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[repr(align(16))] + pub struct mcontext_t { + pub __pc: ::c_ulonglong, + pub __gregs: [::c_ulonglong; 32], + pub __flags: ::c_uint, + pub __extcontext: [::c_ulonglong; 0], + } + + #[repr(align(8))] + pub struct clone_args { + pub flags: ::c_ulonglong, + pub pidfd: ::c_ulonglong, + pub child_tid: ::c_ulonglong, + pub parent_tid: ::c_ulonglong, + pub exit_signal: ::c_ulonglong, + pub stack: ::c_ulonglong, + pub stack_size: ::c_ulonglong, + pub tls: ::c_ulonglong, + pub set_tid: ::c_ulonglong, + pub set_tid_size: ::c_ulonglong, + pub cgroup: ::c_ulonglong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs new file mode 100644 index 0000000..ea59181 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs @@ -0,0 +1,885 @@ +use pthread_mutex_t; + +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = i32; + +pub type blksize_t = i32; +pub type nlink_t = u32; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct user_regs_struct { + pub regs: [u64; 32], + pub orig_a0: u64, + pub csr_era: u64, + pub csr_badv: u64, + pub reserved: [u64; 10], + + } + + pub struct user_fp_struct { + pub fpr: [u64; 32], + pub fcc: u64, + pub fcsr: u32, + } +} + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_dup: ::c_long = 23; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_flock: ::c_long = 32; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_mount: ::c_long = 40; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_openat: ::c_long = 56; +pub const SYS_close: ::c_long = 57; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_sync: ::c_long = 81; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_acct: ::c_long = 89; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_personality: ::c_long = 92; +pub const SYS_exit: ::c_long = 93; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_futex: ::c_long = 98; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_kill: ::c_long = 129; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_times: ::c_long = 153; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_uname: ::c_long = 160; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_umask: ::c_long = 166; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_semop: ::c_long = 193; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_socket: ::c_long = 198; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_accept: ::c_long = 202; +pub const SYS_connect: ::c_long = 203; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_brk: ::c_long = 214; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_recvmmsg: ::c_long = 243; +//pub const SYS_arch_specific_syscall: ::c_long = 244; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_setns: ::c_long = 268; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_io_pgetevents: ::c_long = 292; +pub const SYS_rseq: ::c_long = 293; +pub const SYS_kexec_file_load: ::c_long = 294; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const O_DIRECT: ::c_int = 0o00040000; +pub const O_DIRECTORY: ::c_int = 0o00200000; +pub const O_NOFOLLOW: ::c_int = 0o00400000; +pub const O_TRUNC: ::c_int = 0o00001000; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_CLOEXEC: ::c_int = 0o02000000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; +pub const O_APPEND: ::c_int = 0o00002000; +pub const O_CREAT: ::c_int = 0o00000100; +pub const O_EXCL: ::c_int = 0o00000200; +pub const O_NOCTTY: ::c_int = 0o00000400; +pub const O_NONBLOCK: ::c_int = 0o00004000; +pub const FASYNC: ::c_int = 0o00020000; +pub const O_SYNC: ::c_int = 0o04010000; +pub const O_RSYNC: ::c_int = 0o04010000; +pub const O_FSYNC: ::c_int = O_SYNC; +pub const O_ASYNC: ::c_int = 0o00020000; +pub const O_DSYNC: ::c_int = 0o00010000; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const F_GETLK: ::c_int = 5; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; +pub const F_GETOWN: ::c_int = 9; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const EDEADLK: ::c_int = 35; +pub const EDEADLOCK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; + +pub const MAP_NORESERVE: ::c_int = 0x4000; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x1000; +pub const MAP_LOCKED: ::c_int = 0x2000; +pub const MAP_POPULATE: ::c_int = 0x8000; +pub const MAP_NONBLOCK: ::c_int = 0x10000; +pub const MAP_STACK: ::c_int = 0x20000; +pub const MAP_HUGETLB: ::c_int = 0x40000; +pub const MAP_SYNC: ::c_int = 0x080000; +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const MCL_ONFAULT: ::c_int = 0x0004; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SFD_NONBLOCK: ::c_int = 0x800; +pub const SFD_CLOEXEC: ::c_int = 0x080000; +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGCHLD: ::c_int = 17; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGURG: ::c_int = 23; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGIO: ::c_int = 29; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIGSYS: ::c_int = 31; +pub const SIGUNUSED: ::c_int = 31; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; +pub const PTRACE_SYSEMU: ::c_uint = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_uint = 32; + +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const VEOF: usize = 4; +pub const VTIME: usize = 5; +pub const VMIN: usize = 6; +pub const VSWTC: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VEOL: usize = 11; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const VEOL2: usize = 16; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const XCASE: ::tcflag_t = 0x00000004; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const NCCS: usize = 32; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; +pub const EFD_NONBLOCK: ::c_int = 0x800; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/align.rs new file mode 100644 index 0000000..7ca870f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs new file mode 100644 index 0000000..66b29a8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs @@ -0,0 +1,933 @@ +use pthread_mutex_t; + +pub type blksize_t = i64; +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type nlink_t = u64; +pub type suseconds_t = i64; +pub type wchar_t = i32; +pub type __u64 = ::c_ulong; +pub type __s64 = ::c_long; + +s! { + pub struct stat { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_ulong; 1], + pub st_size: ::off_t, + st_pad3: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad4: ::c_long, + pub st_blocks: ::blkcnt_t, + st_pad5: [::c_long; 7], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct stat64 { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 7], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_bavail: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 5], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_restorer: ::Option, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + _pad: ::c_int, + _pad2: [::c_long; 14], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } +} + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const SYS_read: ::c_long = 5000 + 0; +pub const SYS_write: ::c_long = 5000 + 1; +pub const SYS_open: ::c_long = 5000 + 2; +pub const SYS_close: ::c_long = 5000 + 3; +pub const SYS_stat: ::c_long = 5000 + 4; +pub const SYS_fstat: ::c_long = 5000 + 5; +pub const SYS_lstat: ::c_long = 5000 + 6; +pub const SYS_poll: ::c_long = 5000 + 7; +pub const SYS_lseek: ::c_long = 5000 + 8; +pub const SYS_mmap: ::c_long = 5000 + 9; +pub const SYS_mprotect: ::c_long = 5000 + 10; +pub const SYS_munmap: ::c_long = 5000 + 11; +pub const SYS_brk: ::c_long = 5000 + 12; +pub const SYS_rt_sigaction: ::c_long = 5000 + 13; +pub const SYS_rt_sigprocmask: ::c_long = 5000 + 14; +pub const SYS_ioctl: ::c_long = 5000 + 15; +pub const SYS_pread64: ::c_long = 5000 + 16; +pub const SYS_pwrite64: ::c_long = 5000 + 17; +pub const SYS_readv: ::c_long = 5000 + 18; +pub const SYS_writev: ::c_long = 5000 + 19; +pub const SYS_access: ::c_long = 5000 + 20; +pub const SYS_pipe: ::c_long = 5000 + 21; +pub const SYS__newselect: ::c_long = 5000 + 22; +pub const SYS_sched_yield: ::c_long = 5000 + 23; +pub const SYS_mremap: ::c_long = 5000 + 24; +pub const SYS_msync: ::c_long = 5000 + 25; +pub const SYS_mincore: ::c_long = 5000 + 26; +pub const SYS_madvise: ::c_long = 5000 + 27; +pub const SYS_shmget: ::c_long = 5000 + 28; +pub const SYS_shmat: ::c_long = 5000 + 29; +pub const SYS_shmctl: ::c_long = 5000 + 30; +pub const SYS_dup: ::c_long = 5000 + 31; +pub const SYS_dup2: ::c_long = 5000 + 32; +pub const SYS_pause: ::c_long = 5000 + 33; +pub const SYS_nanosleep: ::c_long = 5000 + 34; +pub const SYS_getitimer: ::c_long = 5000 + 35; +pub const SYS_setitimer: ::c_long = 5000 + 36; +pub const SYS_alarm: ::c_long = 5000 + 37; +pub const SYS_getpid: ::c_long = 5000 + 38; +pub const SYS_sendfile: ::c_long = 5000 + 39; +pub const SYS_socket: ::c_long = 5000 + 40; +pub const SYS_connect: ::c_long = 5000 + 41; +pub const SYS_accept: ::c_long = 5000 + 42; +pub const SYS_sendto: ::c_long = 5000 + 43; +pub const SYS_recvfrom: ::c_long = 5000 + 44; +pub const SYS_sendmsg: ::c_long = 5000 + 45; +pub const SYS_recvmsg: ::c_long = 5000 + 46; +pub const SYS_shutdown: ::c_long = 5000 + 47; +pub const SYS_bind: ::c_long = 5000 + 48; +pub const SYS_listen: ::c_long = 5000 + 49; +pub const SYS_getsockname: ::c_long = 5000 + 50; +pub const SYS_getpeername: ::c_long = 5000 + 51; +pub const SYS_socketpair: ::c_long = 5000 + 52; +pub const SYS_setsockopt: ::c_long = 5000 + 53; +pub const SYS_getsockopt: ::c_long = 5000 + 54; +pub const SYS_clone: ::c_long = 5000 + 55; +pub const SYS_fork: ::c_long = 5000 + 56; +pub const SYS_execve: ::c_long = 5000 + 57; +pub const SYS_exit: ::c_long = 5000 + 58; +pub const SYS_wait4: ::c_long = 5000 + 59; +pub const SYS_kill: ::c_long = 5000 + 60; +pub const SYS_uname: ::c_long = 5000 + 61; +pub const SYS_semget: ::c_long = 5000 + 62; +pub const SYS_semop: ::c_long = 5000 + 63; +pub const SYS_semctl: ::c_long = 5000 + 64; +pub const SYS_shmdt: ::c_long = 5000 + 65; +pub const SYS_msgget: ::c_long = 5000 + 66; +pub const SYS_msgsnd: ::c_long = 5000 + 67; +pub const SYS_msgrcv: ::c_long = 5000 + 68; +pub const SYS_msgctl: ::c_long = 5000 + 69; +pub const SYS_fcntl: ::c_long = 5000 + 70; +pub const SYS_flock: ::c_long = 5000 + 71; +pub const SYS_fsync: ::c_long = 5000 + 72; +pub const SYS_fdatasync: ::c_long = 5000 + 73; +pub const SYS_truncate: ::c_long = 5000 + 74; +pub const SYS_ftruncate: ::c_long = 5000 + 75; +pub const SYS_getdents: ::c_long = 5000 + 76; +pub const SYS_getcwd: ::c_long = 5000 + 77; +pub const SYS_chdir: ::c_long = 5000 + 78; +pub const SYS_fchdir: ::c_long = 5000 + 79; +pub const SYS_rename: ::c_long = 5000 + 80; +pub const SYS_mkdir: ::c_long = 5000 + 81; +pub const SYS_rmdir: ::c_long = 5000 + 82; +pub const SYS_creat: ::c_long = 5000 + 83; +pub const SYS_link: ::c_long = 5000 + 84; +pub const SYS_unlink: ::c_long = 5000 + 85; +pub const SYS_symlink: ::c_long = 5000 + 86; +pub const SYS_readlink: ::c_long = 5000 + 87; +pub const SYS_chmod: ::c_long = 5000 + 88; +pub const SYS_fchmod: ::c_long = 5000 + 89; +pub const SYS_chown: ::c_long = 5000 + 90; +pub const SYS_fchown: ::c_long = 5000 + 91; +pub const SYS_lchown: ::c_long = 5000 + 92; +pub const SYS_umask: ::c_long = 5000 + 93; +pub const SYS_gettimeofday: ::c_long = 5000 + 94; +pub const SYS_getrlimit: ::c_long = 5000 + 95; +pub const SYS_getrusage: ::c_long = 5000 + 96; +pub const SYS_sysinfo: ::c_long = 5000 + 97; +pub const SYS_times: ::c_long = 5000 + 98; +pub const SYS_ptrace: ::c_long = 5000 + 99; +pub const SYS_getuid: ::c_long = 5000 + 100; +pub const SYS_syslog: ::c_long = 5000 + 101; +pub const SYS_getgid: ::c_long = 5000 + 102; +pub const SYS_setuid: ::c_long = 5000 + 103; +pub const SYS_setgid: ::c_long = 5000 + 104; +pub const SYS_geteuid: ::c_long = 5000 + 105; +pub const SYS_getegid: ::c_long = 5000 + 106; +pub const SYS_setpgid: ::c_long = 5000 + 107; +pub const SYS_getppid: ::c_long = 5000 + 108; +pub const SYS_getpgrp: ::c_long = 5000 + 109; +pub const SYS_setsid: ::c_long = 5000 + 110; +pub const SYS_setreuid: ::c_long = 5000 + 111; +pub const SYS_setregid: ::c_long = 5000 + 112; +pub const SYS_getgroups: ::c_long = 5000 + 113; +pub const SYS_setgroups: ::c_long = 5000 + 114; +pub const SYS_setresuid: ::c_long = 5000 + 115; +pub const SYS_getresuid: ::c_long = 5000 + 116; +pub const SYS_setresgid: ::c_long = 5000 + 117; +pub const SYS_getresgid: ::c_long = 5000 + 118; +pub const SYS_getpgid: ::c_long = 5000 + 119; +pub const SYS_setfsuid: ::c_long = 5000 + 120; +pub const SYS_setfsgid: ::c_long = 5000 + 121; +pub const SYS_getsid: ::c_long = 5000 + 122; +pub const SYS_capget: ::c_long = 5000 + 123; +pub const SYS_capset: ::c_long = 5000 + 124; +pub const SYS_rt_sigpending: ::c_long = 5000 + 125; +pub const SYS_rt_sigtimedwait: ::c_long = 5000 + 126; +pub const SYS_rt_sigqueueinfo: ::c_long = 5000 + 127; +pub const SYS_rt_sigsuspend: ::c_long = 5000 + 128; +pub const SYS_sigaltstack: ::c_long = 5000 + 129; +pub const SYS_utime: ::c_long = 5000 + 130; +pub const SYS_mknod: ::c_long = 5000 + 131; +pub const SYS_personality: ::c_long = 5000 + 132; +pub const SYS_ustat: ::c_long = 5000 + 133; +pub const SYS_statfs: ::c_long = 5000 + 134; +pub const SYS_fstatfs: ::c_long = 5000 + 135; +pub const SYS_sysfs: ::c_long = 5000 + 136; +pub const SYS_getpriority: ::c_long = 5000 + 137; +pub const SYS_setpriority: ::c_long = 5000 + 138; +pub const SYS_sched_setparam: ::c_long = 5000 + 139; +pub const SYS_sched_getparam: ::c_long = 5000 + 140; +pub const SYS_sched_setscheduler: ::c_long = 5000 + 141; +pub const SYS_sched_getscheduler: ::c_long = 5000 + 142; +pub const SYS_sched_get_priority_max: ::c_long = 5000 + 143; +pub const SYS_sched_get_priority_min: ::c_long = 5000 + 144; +pub const SYS_sched_rr_get_interval: ::c_long = 5000 + 145; +pub const SYS_mlock: ::c_long = 5000 + 146; +pub const SYS_munlock: ::c_long = 5000 + 147; +pub const SYS_mlockall: ::c_long = 5000 + 148; +pub const SYS_munlockall: ::c_long = 5000 + 149; +pub const SYS_vhangup: ::c_long = 5000 + 150; +pub const SYS_pivot_root: ::c_long = 5000 + 151; +pub const SYS__sysctl: ::c_long = 5000 + 152; +pub const SYS_prctl: ::c_long = 5000 + 153; +pub const SYS_adjtimex: ::c_long = 5000 + 154; +pub const SYS_setrlimit: ::c_long = 5000 + 155; +pub const SYS_chroot: ::c_long = 5000 + 156; +pub const SYS_sync: ::c_long = 5000 + 157; +pub const SYS_acct: ::c_long = 5000 + 158; +pub const SYS_settimeofday: ::c_long = 5000 + 159; +pub const SYS_mount: ::c_long = 5000 + 160; +pub const SYS_umount2: ::c_long = 5000 + 161; +pub const SYS_swapon: ::c_long = 5000 + 162; +pub const SYS_swapoff: ::c_long = 5000 + 163; +pub const SYS_reboot: ::c_long = 5000 + 164; +pub const SYS_sethostname: ::c_long = 5000 + 165; +pub const SYS_setdomainname: ::c_long = 5000 + 166; +pub const SYS_create_module: ::c_long = 5000 + 167; +pub const SYS_init_module: ::c_long = 5000 + 168; +pub const SYS_delete_module: ::c_long = 5000 + 169; +pub const SYS_get_kernel_syms: ::c_long = 5000 + 170; +pub const SYS_query_module: ::c_long = 5000 + 171; +pub const SYS_quotactl: ::c_long = 5000 + 172; +pub const SYS_nfsservctl: ::c_long = 5000 + 173; +pub const SYS_getpmsg: ::c_long = 5000 + 174; +pub const SYS_putpmsg: ::c_long = 5000 + 175; +pub const SYS_afs_syscall: ::c_long = 5000 + 176; +pub const SYS_gettid: ::c_long = 5000 + 178; +pub const SYS_readahead: ::c_long = 5000 + 179; +pub const SYS_setxattr: ::c_long = 5000 + 180; +pub const SYS_lsetxattr: ::c_long = 5000 + 181; +pub const SYS_fsetxattr: ::c_long = 5000 + 182; +pub const SYS_getxattr: ::c_long = 5000 + 183; +pub const SYS_lgetxattr: ::c_long = 5000 + 184; +pub const SYS_fgetxattr: ::c_long = 5000 + 185; +pub const SYS_listxattr: ::c_long = 5000 + 186; +pub const SYS_llistxattr: ::c_long = 5000 + 187; +pub const SYS_flistxattr: ::c_long = 5000 + 188; +pub const SYS_removexattr: ::c_long = 5000 + 189; +pub const SYS_lremovexattr: ::c_long = 5000 + 190; +pub const SYS_fremovexattr: ::c_long = 5000 + 191; +pub const SYS_tkill: ::c_long = 5000 + 192; +pub const SYS_futex: ::c_long = 5000 + 194; +pub const SYS_sched_setaffinity: ::c_long = 5000 + 195; +pub const SYS_sched_getaffinity: ::c_long = 5000 + 196; +pub const SYS_cacheflush: ::c_long = 5000 + 197; +pub const SYS_cachectl: ::c_long = 5000 + 198; +pub const SYS_sysmips: ::c_long = 5000 + 199; +pub const SYS_io_setup: ::c_long = 5000 + 200; +pub const SYS_io_destroy: ::c_long = 5000 + 201; +pub const SYS_io_getevents: ::c_long = 5000 + 202; +pub const SYS_io_submit: ::c_long = 5000 + 203; +pub const SYS_io_cancel: ::c_long = 5000 + 204; +pub const SYS_exit_group: ::c_long = 5000 + 205; +pub const SYS_lookup_dcookie: ::c_long = 5000 + 206; +pub const SYS_epoll_create: ::c_long = 5000 + 207; +pub const SYS_epoll_ctl: ::c_long = 5000 + 208; +pub const SYS_epoll_wait: ::c_long = 5000 + 209; +pub const SYS_remap_file_pages: ::c_long = 5000 + 210; +pub const SYS_rt_sigreturn: ::c_long = 5000 + 211; +pub const SYS_set_tid_address: ::c_long = 5000 + 212; +pub const SYS_restart_syscall: ::c_long = 5000 + 213; +pub const SYS_semtimedop: ::c_long = 5000 + 214; +pub const SYS_fadvise64: ::c_long = 5000 + 215; +pub const SYS_timer_create: ::c_long = 5000 + 216; +pub const SYS_timer_settime: ::c_long = 5000 + 217; +pub const SYS_timer_gettime: ::c_long = 5000 + 218; +pub const SYS_timer_getoverrun: ::c_long = 5000 + 219; +pub const SYS_timer_delete: ::c_long = 5000 + 220; +pub const SYS_clock_settime: ::c_long = 5000 + 221; +pub const SYS_clock_gettime: ::c_long = 5000 + 222; +pub const SYS_clock_getres: ::c_long = 5000 + 223; +pub const SYS_clock_nanosleep: ::c_long = 5000 + 224; +pub const SYS_tgkill: ::c_long = 5000 + 225; +pub const SYS_utimes: ::c_long = 5000 + 226; +pub const SYS_mbind: ::c_long = 5000 + 227; +pub const SYS_get_mempolicy: ::c_long = 5000 + 228; +pub const SYS_set_mempolicy: ::c_long = 5000 + 229; +pub const SYS_mq_open: ::c_long = 5000 + 230; +pub const SYS_mq_unlink: ::c_long = 5000 + 231; +pub const SYS_mq_timedsend: ::c_long = 5000 + 232; +pub const SYS_mq_timedreceive: ::c_long = 5000 + 233; +pub const SYS_mq_notify: ::c_long = 5000 + 234; +pub const SYS_mq_getsetattr: ::c_long = 5000 + 235; +pub const SYS_vserver: ::c_long = 5000 + 236; +pub const SYS_waitid: ::c_long = 5000 + 237; +/* pub const SYS_sys_setaltroot: ::c_long = 5000 + 238; */ +pub const SYS_add_key: ::c_long = 5000 + 239; +pub const SYS_request_key: ::c_long = 5000 + 240; +pub const SYS_keyctl: ::c_long = 5000 + 241; +pub const SYS_set_thread_area: ::c_long = 5000 + 242; +pub const SYS_inotify_init: ::c_long = 5000 + 243; +pub const SYS_inotify_add_watch: ::c_long = 5000 + 244; +pub const SYS_inotify_rm_watch: ::c_long = 5000 + 245; +pub const SYS_migrate_pages: ::c_long = 5000 + 246; +pub const SYS_openat: ::c_long = 5000 + 247; +pub const SYS_mkdirat: ::c_long = 5000 + 248; +pub const SYS_mknodat: ::c_long = 5000 + 249; +pub const SYS_fchownat: ::c_long = 5000 + 250; +pub const SYS_futimesat: ::c_long = 5000 + 251; +pub const SYS_newfstatat: ::c_long = 5000 + 252; +pub const SYS_unlinkat: ::c_long = 5000 + 253; +pub const SYS_renameat: ::c_long = 5000 + 254; +pub const SYS_linkat: ::c_long = 5000 + 255; +pub const SYS_symlinkat: ::c_long = 5000 + 256; +pub const SYS_readlinkat: ::c_long = 5000 + 257; +pub const SYS_fchmodat: ::c_long = 5000 + 258; +pub const SYS_faccessat: ::c_long = 5000 + 259; +pub const SYS_pselect6: ::c_long = 5000 + 260; +pub const SYS_ppoll: ::c_long = 5000 + 261; +pub const SYS_unshare: ::c_long = 5000 + 262; +pub const SYS_splice: ::c_long = 5000 + 263; +pub const SYS_sync_file_range: ::c_long = 5000 + 264; +pub const SYS_tee: ::c_long = 5000 + 265; +pub const SYS_vmsplice: ::c_long = 5000 + 266; +pub const SYS_move_pages: ::c_long = 5000 + 267; +pub const SYS_set_robust_list: ::c_long = 5000 + 268; +pub const SYS_get_robust_list: ::c_long = 5000 + 269; +pub const SYS_kexec_load: ::c_long = 5000 + 270; +pub const SYS_getcpu: ::c_long = 5000 + 271; +pub const SYS_epoll_pwait: ::c_long = 5000 + 272; +pub const SYS_ioprio_set: ::c_long = 5000 + 273; +pub const SYS_ioprio_get: ::c_long = 5000 + 274; +pub const SYS_utimensat: ::c_long = 5000 + 275; +pub const SYS_signalfd: ::c_long = 5000 + 276; +pub const SYS_timerfd: ::c_long = 5000 + 277; +pub const SYS_eventfd: ::c_long = 5000 + 278; +pub const SYS_fallocate: ::c_long = 5000 + 279; +pub const SYS_timerfd_create: ::c_long = 5000 + 280; +pub const SYS_timerfd_gettime: ::c_long = 5000 + 281; +pub const SYS_timerfd_settime: ::c_long = 5000 + 282; +pub const SYS_signalfd4: ::c_long = 5000 + 283; +pub const SYS_eventfd2: ::c_long = 5000 + 284; +pub const SYS_epoll_create1: ::c_long = 5000 + 285; +pub const SYS_dup3: ::c_long = 5000 + 286; +pub const SYS_pipe2: ::c_long = 5000 + 287; +pub const SYS_inotify_init1: ::c_long = 5000 + 288; +pub const SYS_preadv: ::c_long = 5000 + 289; +pub const SYS_pwritev: ::c_long = 5000 + 290; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 5000 + 291; +pub const SYS_perf_event_open: ::c_long = 5000 + 292; +pub const SYS_accept4: ::c_long = 5000 + 293; +pub const SYS_recvmmsg: ::c_long = 5000 + 294; +pub const SYS_fanotify_init: ::c_long = 5000 + 295; +pub const SYS_fanotify_mark: ::c_long = 5000 + 296; +pub const SYS_prlimit64: ::c_long = 5000 + 297; +pub const SYS_name_to_handle_at: ::c_long = 5000 + 298; +pub const SYS_open_by_handle_at: ::c_long = 5000 + 299; +pub const SYS_clock_adjtime: ::c_long = 5000 + 300; +pub const SYS_syncfs: ::c_long = 5000 + 301; +pub const SYS_sendmmsg: ::c_long = 5000 + 302; +pub const SYS_setns: ::c_long = 5000 + 303; +pub const SYS_process_vm_readv: ::c_long = 5000 + 304; +pub const SYS_process_vm_writev: ::c_long = 5000 + 305; +pub const SYS_kcmp: ::c_long = 5000 + 306; +pub const SYS_finit_module: ::c_long = 5000 + 307; +pub const SYS_getdents64: ::c_long = 5000 + 308; +pub const SYS_sched_setattr: ::c_long = 5000 + 309; +pub const SYS_sched_getattr: ::c_long = 5000 + 310; +pub const SYS_renameat2: ::c_long = 5000 + 311; +pub const SYS_seccomp: ::c_long = 5000 + 312; +pub const SYS_getrandom: ::c_long = 5000 + 313; +pub const SYS_memfd_create: ::c_long = 5000 + 314; +pub const SYS_bpf: ::c_long = 5000 + 315; +pub const SYS_execveat: ::c_long = 5000 + 316; +pub const SYS_userfaultfd: ::c_long = 5000 + 317; +pub const SYS_membarrier: ::c_long = 5000 + 318; +pub const SYS_mlock2: ::c_long = 5000 + 319; +pub const SYS_copy_file_range: ::c_long = 5000 + 320; +pub const SYS_preadv2: ::c_long = 5000 + 321; +pub const SYS_pwritev2: ::c_long = 5000 + 322; +pub const SYS_pkey_mprotect: ::c_long = 5000 + 323; +pub const SYS_pkey_alloc: ::c_long = 5000 + 324; +pub const SYS_pkey_free: ::c_long = 5000 + 325; +pub const SYS_statx: ::c_long = 5000 + 326; +pub const SYS_rseq: ::c_long = 5000 + 327; +pub const SYS_pidfd_send_signal: ::c_long = 5000 + 424; +pub const SYS_io_uring_setup: ::c_long = 5000 + 425; +pub const SYS_io_uring_enter: ::c_long = 5000 + 426; +pub const SYS_io_uring_register: ::c_long = 5000 + 427; +pub const SYS_open_tree: ::c_long = 5000 + 428; +pub const SYS_move_mount: ::c_long = 5000 + 429; +pub const SYS_fsopen: ::c_long = 5000 + 430; +pub const SYS_fsconfig: ::c_long = 5000 + 431; +pub const SYS_fsmount: ::c_long = 5000 + 432; +pub const SYS_fspick: ::c_long = 5000 + 433; +pub const SYS_pidfd_open: ::c_long = 5000 + 434; +pub const SYS_clone3: ::c_long = 5000 + 435; +pub const SYS_close_range: ::c_long = 5000 + 436; +pub const SYS_openat2: ::c_long = 5000 + 437; +pub const SYS_pidfd_getfd: ::c_long = 5000 + 438; +pub const SYS_faccessat2: ::c_long = 5000 + 439; +pub const SYS_process_madvise: ::c_long = 5000 + 440; +pub const SYS_epoll_pwait2: ::c_long = 5000 + 441; +pub const SYS_mount_setattr: ::c_long = 5000 + 442; +pub const SYS_quotactl_fd: ::c_long = 5000 + 443; +pub const SYS_landlock_create_ruleset: ::c_long = 5000 + 444; +pub const SYS_landlock_add_rule: ::c_long = 5000 + 445; +pub const SYS_landlock_restrict_self: ::c_long = 5000 + 446; +pub const SYS_memfd_secret: ::c_long = 5000 + 447; +pub const SYS_process_mrelease: ::c_long = 5000 + 448; +pub const SYS_futex_waitv: ::c_long = 5000 + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 5000 + 450; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_CLOEXEC: ::c_int = 0x80000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const O_DIRECT: ::c_int = 0x8000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_NONBLOCK: ::c_int = 128; +pub const O_SYNC: ::c_int = 0x4010; +pub const O_RSYNC: ::c_int = 0x4010; +pub const O_DSYNC: ::c_int = 0x10; +pub const O_FSYNC: ::c_int = 0x4010; +pub const O_ASYNC: ::c_int = 0x1000; +pub const O_NDELAY: ::c_int = 0x80; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const ERFKILL: ::c_int = 167; + +pub const MAP_NORESERVE: ::c_int = 0x400; +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_ANONYMOUS: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; +pub const MAP_HUGETLB: ::c_int = 0x080000; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 22; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x00000100; +pub const TOSTOP: ::tcflag_t = 0x00008000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const EXTPROC: ::tcflag_t = 0o200000; +pub const TCSANOW: ::c_int = 0x540e; +pub const TCSADRAIN: ::c_int = 0x540f; +pub const TCSAFLUSH: ::c_int = 0x5410; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; + +pub const EFD_NONBLOCK: ::c_int = 0x80; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const F_GETLK: ::c_int = 14; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETOWN: ::c_int = 24; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const SFD_NONBLOCK: ::c_int = 0x80; + +pub const RTLD_DEEPBIND: ::c_int = 0x10; +pub const RTLD_GLOBAL: ::c_int = 0x4; +pub const RTLD_NOLOAD: ::c_int = 0x8; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EHWPOISON: ::c_int = 168; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs new file mode 100644 index 0000000..443958c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs @@ -0,0 +1,126 @@ +//! 64-bit specific definitions for linux-like values + +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i64; +pub type shmatt_t = u64; +pub type msgqnum_t = u64; +pub type msglen_t = u64; +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type rlim_t = u64; +#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] +pub type __syscall_ulong_t = ::c_ulonglong; +#[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] +pub type __syscall_ulong_t = ::c_ulong; + +cfg_if! { + if #[cfg(all(target_arch = "aarch64", target_pointer_width = "32"))] { + pub type clock_t = i32; + pub type time_t = i32; + pub type __fsword_t = i32; + } else { + pub type __fsword_t = i64; + pub type clock_t = i64; + pub type time_t = i64; + } +} + +s! { + pub struct sigset_t { + #[cfg(target_pointer_width = "32")] + __val: [u32; 32], + #[cfg(target_pointer_width = "64")] + __val: [u64; 16], + } + + pub struct sysinfo { + pub uptime: i64, + pub loads: [u64; 3], + pub totalram: u64, + pub freeram: u64, + pub sharedram: u64, + pub bufferram: u64, + pub totalswap: u64, + pub freeswap: u64, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: u64, + pub freehigh: u64, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: u64, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: u64, + __glibc_reserved5: u64, + } + + pub struct semid_ds { + pub sem_perm: ipc_perm, + pub sem_otime: ::time_t, + #[cfg(not(any( + target_arch = "aarch64", + target_arch = "loongarch64", + target_arch = "mips64", + target_arch = "powerpc64", + target_arch = "riscv64", + target_arch = "sparc64")))] + __reserved: ::__syscall_ulong_t, + pub sem_ctime: ::time_t, + #[cfg(not(any( + target_arch = "aarch64", + target_arch = "loongarch64", + target_arch = "mips64", + target_arch = "powerpc64", + target_arch = "riscv64", + target_arch = "sparc64")))] + __reserved2: ::__syscall_ulong_t, + pub sem_nsems: ::__syscall_ulong_t, + __glibc_reserved3: ::__syscall_ulong_t, + __glibc_reserved4: ::__syscall_ulong_t, + } +} + +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; + +pub const O_LARGEFILE: ::c_int = 0; + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "powerpc64"))] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(any(target_arch = "sparc64"))] { + mod sparc64; + pub use self::sparc64::*; + } else if #[cfg(any(target_arch = "mips64"))] { + mod mips64; + pub use self::mips64::*; + } else if #[cfg(any(target_arch = "s390x"))] { + mod s390x; + pub use self::s390x::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(any(target_arch = "riscv64"))] { + mod riscv64; + pub use self::riscv64::*; + } else if #[cfg(any(target_arch = "loongarch64"))] { + mod loongarch64; + pub use self::loongarch64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs new file mode 100644 index 0000000..29d1e1c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [i64; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs new file mode 100644 index 0000000..2b225e4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs @@ -0,0 +1,978 @@ +//! PowerPC64-specific definitions for 64-bit linux-like values + +use pthread_mutex_t; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = u8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = i64; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulong; +pub type __s64 = ::c_long; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + #[cfg(target_arch = "sparc64")] + __reserved0: ::c_int, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: u32, + __pad1: u32, + __unused1: u64, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const VEOF: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_DIRECT: ::c_int = 0x20000; + +pub const MAP_LOCKED: ::c_int = 0x00080; +pub const MAP_NORESERVE: ::c_int = 0x00040; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 58; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 0x4000; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0xff; +pub const TAB1: ::tcflag_t = 0x400; +pub const TAB2: ::tcflag_t = 0x800; +pub const TAB3: ::tcflag_t = 0xc00; +pub const CR1: ::tcflag_t = 0x1000; +pub const CR2: ::tcflag_t = 0x2000; +pub const CR3: ::tcflag_t = 0x3000; +pub const FF1: ::tcflag_t = 0x4000; +pub const BS1: ::tcflag_t = 0x8000; +pub const VT1: ::tcflag_t = 0x10000; +pub const VWERASE: usize = 0xa; +pub const VREPRINT: usize = 0xb; +pub const VSUSP: usize = 0xc; +pub const VSTART: usize = 0xd; +pub const VSTOP: usize = 0xe; +pub const VDISCARD: usize = 0x10; +pub const VTIME: usize = 0x7; +pub const IXON: ::tcflag_t = 0x200; +pub const IXOFF: ::tcflag_t = 0x400; +pub const ONLCR: ::tcflag_t = 0x2; +pub const CSIZE: ::tcflag_t = 0x300; +pub const CS6: ::tcflag_t = 0x100; +pub const CS7: ::tcflag_t = 0x200; +pub const CS8: ::tcflag_t = 0x300; +pub const CSTOPB: ::tcflag_t = 0x400; +pub const CREAD: ::tcflag_t = 0x800; +pub const PARENB: ::tcflag_t = 0x1000; +pub const PARODD: ::tcflag_t = 0x2000; +pub const HUPCL: ::tcflag_t = 0x4000; +pub const CLOCAL: ::tcflag_t = 0x8000; +pub const ECHOKE: ::tcflag_t = 0x1; +pub const ECHOE: ::tcflag_t = 0x2; +pub const ECHOK: ::tcflag_t = 0x4; +pub const ECHONL: ::tcflag_t = 0x10; +pub const ECHOPRT: ::tcflag_t = 0x20; +pub const ECHOCTL: ::tcflag_t = 0x40; +pub const ISIG: ::tcflag_t = 0x80; +pub const ICANON: ::tcflag_t = 0x100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; +pub const VSWTC: usize = 9; +pub const OLCUC: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o001400; +pub const CRDLY: ::tcflag_t = 0o030000; +pub const TABDLY: ::tcflag_t = 0o006000; +pub const BSDLY: ::tcflag_t = 0o100000; +pub const FFDLY: ::tcflag_t = 0o040000; +pub const VTDLY: ::tcflag_t = 0o200000; +pub const XTABS: ::tcflag_t = 0o006000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const CBAUDEX: ::speed_t = 0o000020; +pub const B57600: ::speed_t = 0o0020; +pub const B115200: ::speed_t = 0o0021; +pub const B230400: ::speed_t = 0o0022; +pub const B460800: ::speed_t = 0o0023; +pub const B500000: ::speed_t = 0o0024; +pub const B576000: ::speed_t = 0o0025; +pub const B921600: ::speed_t = 0o0026; +pub const B1000000: ::speed_t = 0o0027; +pub const B1152000: ::speed_t = 0o0030; +pub const B1500000: ::speed_t = 0o0031; +pub const B2000000: ::speed_t = 0o0032; +pub const B2500000: ::speed_t = 0o0033; +pub const B3000000: ::speed_t = 0o0034; +pub const B3500000: ::speed_t = 0o0035; +pub const B4000000: ::speed_t = 0o0036; + +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x400; +pub const TOSTOP: ::tcflag_t = 0x400000; +pub const FLUSHO: ::tcflag_t = 0x800000; +pub const EXTPROC: ::tcflag_t = 0x10000000; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_query_module: ::c_long = 166; +pub const SYS_poll: ::c_long = 167; +pub const SYS_nfsservctl: ::c_long = 168; +pub const SYS_setresgid: ::c_long = 169; +pub const SYS_getresgid: ::c_long = 170; +pub const SYS_prctl: ::c_long = 171; +pub const SYS_rt_sigreturn: ::c_long = 172; +pub const SYS_rt_sigaction: ::c_long = 173; +pub const SYS_rt_sigprocmask: ::c_long = 174; +pub const SYS_rt_sigpending: ::c_long = 175; +pub const SYS_rt_sigtimedwait: ::c_long = 176; +pub const SYS_rt_sigqueueinfo: ::c_long = 177; +pub const SYS_rt_sigsuspend: ::c_long = 178; +pub const SYS_pread64: ::c_long = 179; +pub const SYS_pwrite64: ::c_long = 180; +pub const SYS_chown: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 182; +pub const SYS_capget: ::c_long = 183; +pub const SYS_capset: ::c_long = 184; +pub const SYS_sigaltstack: ::c_long = 185; +pub const SYS_sendfile: ::c_long = 186; +pub const SYS_getpmsg: ::c_long = 187; /* some people actually want streams */ +pub const SYS_putpmsg: ::c_long = 188; /* some people actually want streams */ +pub const SYS_vfork: ::c_long = 189; +pub const SYS_ugetrlimit: ::c_long = 190; /* SuS compliant getrlimit */ +pub const SYS_readahead: ::c_long = 191; +pub const SYS_pciconfig_read: ::c_long = 198; +pub const SYS_pciconfig_write: ::c_long = 199; +pub const SYS_pciconfig_iobase: ::c_long = 200; +pub const SYS_multiplexer: ::c_long = 201; +pub const SYS_getdents64: ::c_long = 202; +pub const SYS_pivot_root: ::c_long = 203; +pub const SYS_madvise: ::c_long = 205; +pub const SYS_mincore: ::c_long = 206; +pub const SYS_gettid: ::c_long = 207; +pub const SYS_tkill: ::c_long = 208; +pub const SYS_setxattr: ::c_long = 209; +pub const SYS_lsetxattr: ::c_long = 210; +pub const SYS_fsetxattr: ::c_long = 211; +pub const SYS_getxattr: ::c_long = 212; +pub const SYS_lgetxattr: ::c_long = 213; +pub const SYS_fgetxattr: ::c_long = 214; +pub const SYS_listxattr: ::c_long = 215; +pub const SYS_llistxattr: ::c_long = 216; +pub const SYS_flistxattr: ::c_long = 217; +pub const SYS_removexattr: ::c_long = 218; +pub const SYS_lremovexattr: ::c_long = 219; +pub const SYS_fremovexattr: ::c_long = 220; +pub const SYS_futex: ::c_long = 221; +pub const SYS_sched_setaffinity: ::c_long = 222; +pub const SYS_sched_getaffinity: ::c_long = 223; +pub const SYS_tuxcall: ::c_long = 225; +pub const SYS_io_setup: ::c_long = 227; +pub const SYS_io_destroy: ::c_long = 228; +pub const SYS_io_getevents: ::c_long = 229; +pub const SYS_io_submit: ::c_long = 230; +pub const SYS_io_cancel: ::c_long = 231; +pub const SYS_set_tid_address: ::c_long = 232; +pub const SYS_exit_group: ::c_long = 234; +pub const SYS_lookup_dcookie: ::c_long = 235; +pub const SYS_epoll_create: ::c_long = 236; +pub const SYS_epoll_ctl: ::c_long = 237; +pub const SYS_epoll_wait: ::c_long = 238; +pub const SYS_remap_file_pages: ::c_long = 239; +pub const SYS_timer_create: ::c_long = 240; +pub const SYS_timer_settime: ::c_long = 241; +pub const SYS_timer_gettime: ::c_long = 242; +pub const SYS_timer_getoverrun: ::c_long = 243; +pub const SYS_timer_delete: ::c_long = 244; +pub const SYS_clock_settime: ::c_long = 245; +pub const SYS_clock_gettime: ::c_long = 246; +pub const SYS_clock_getres: ::c_long = 247; +pub const SYS_clock_nanosleep: ::c_long = 248; +pub const SYS_swapcontext: ::c_long = 249; +pub const SYS_tgkill: ::c_long = 250; +pub const SYS_utimes: ::c_long = 251; +pub const SYS_statfs64: ::c_long = 252; +pub const SYS_fstatfs64: ::c_long = 253; +pub const SYS_rtas: ::c_long = 255; +pub const SYS_sys_debug_setcontext: ::c_long = 256; +pub const SYS_migrate_pages: ::c_long = 258; +pub const SYS_mbind: ::c_long = 259; +pub const SYS_get_mempolicy: ::c_long = 260; +pub const SYS_set_mempolicy: ::c_long = 261; +pub const SYS_mq_open: ::c_long = 262; +pub const SYS_mq_unlink: ::c_long = 263; +pub const SYS_mq_timedsend: ::c_long = 264; +pub const SYS_mq_timedreceive: ::c_long = 265; +pub const SYS_mq_notify: ::c_long = 266; +pub const SYS_mq_getsetattr: ::c_long = 267; +pub const SYS_kexec_load: ::c_long = 268; +pub const SYS_add_key: ::c_long = 269; +pub const SYS_request_key: ::c_long = 270; +pub const SYS_keyctl: ::c_long = 271; +pub const SYS_waitid: ::c_long = 272; +pub const SYS_ioprio_set: ::c_long = 273; +pub const SYS_ioprio_get: ::c_long = 274; +pub const SYS_inotify_init: ::c_long = 275; +pub const SYS_inotify_add_watch: ::c_long = 276; +pub const SYS_inotify_rm_watch: ::c_long = 277; +pub const SYS_spu_run: ::c_long = 278; +pub const SYS_spu_create: ::c_long = 279; +pub const SYS_pselect6: ::c_long = 280; +pub const SYS_ppoll: ::c_long = 281; +pub const SYS_unshare: ::c_long = 282; +pub const SYS_splice: ::c_long = 283; +pub const SYS_tee: ::c_long = 284; +pub const SYS_vmsplice: ::c_long = 285; +pub const SYS_openat: ::c_long = 286; +pub const SYS_mkdirat: ::c_long = 287; +pub const SYS_mknodat: ::c_long = 288; +pub const SYS_fchownat: ::c_long = 289; +pub const SYS_futimesat: ::c_long = 290; +pub const SYS_newfstatat: ::c_long = 291; +pub const SYS_unlinkat: ::c_long = 292; +pub const SYS_renameat: ::c_long = 293; +pub const SYS_linkat: ::c_long = 294; +pub const SYS_symlinkat: ::c_long = 295; +pub const SYS_readlinkat: ::c_long = 296; +pub const SYS_fchmodat: ::c_long = 297; +pub const SYS_faccessat: ::c_long = 298; +pub const SYS_get_robust_list: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_move_pages: ::c_long = 301; +pub const SYS_getcpu: ::c_long = 302; +pub const SYS_epoll_pwait: ::c_long = 303; +pub const SYS_utimensat: ::c_long = 304; +pub const SYS_signalfd: ::c_long = 305; +pub const SYS_timerfd_create: ::c_long = 306; +pub const SYS_eventfd: ::c_long = 307; +pub const SYS_sync_file_range2: ::c_long = 308; +pub const SYS_fallocate: ::c_long = 309; +pub const SYS_subpage_prot: ::c_long = 310; +pub const SYS_timerfd_settime: ::c_long = 311; +pub const SYS_timerfd_gettime: ::c_long = 312; +pub const SYS_signalfd4: ::c_long = 313; +pub const SYS_eventfd2: ::c_long = 314; +pub const SYS_epoll_create1: ::c_long = 315; +pub const SYS_dup3: ::c_long = 316; +pub const SYS_pipe2: ::c_long = 317; +pub const SYS_inotify_init1: ::c_long = 318; +pub const SYS_perf_event_open: ::c_long = 319; +pub const SYS_preadv: ::c_long = 320; +pub const SYS_pwritev: ::c_long = 321; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 322; +pub const SYS_fanotify_init: ::c_long = 323; +pub const SYS_fanotify_mark: ::c_long = 324; +pub const SYS_prlimit64: ::c_long = 325; +pub const SYS_socket: ::c_long = 326; +pub const SYS_bind: ::c_long = 327; +pub const SYS_connect: ::c_long = 328; +pub const SYS_listen: ::c_long = 329; +pub const SYS_accept: ::c_long = 330; +pub const SYS_getsockname: ::c_long = 331; +pub const SYS_getpeername: ::c_long = 332; +pub const SYS_socketpair: ::c_long = 333; +pub const SYS_send: ::c_long = 334; +pub const SYS_sendto: ::c_long = 335; +pub const SYS_recv: ::c_long = 336; +pub const SYS_recvfrom: ::c_long = 337; +pub const SYS_shutdown: ::c_long = 338; +pub const SYS_setsockopt: ::c_long = 339; +pub const SYS_getsockopt: ::c_long = 340; +pub const SYS_sendmsg: ::c_long = 341; +pub const SYS_recvmsg: ::c_long = 342; +pub const SYS_recvmmsg: ::c_long = 343; +pub const SYS_accept4: ::c_long = 344; +pub const SYS_name_to_handle_at: ::c_long = 345; +pub const SYS_open_by_handle_at: ::c_long = 346; +pub const SYS_clock_adjtime: ::c_long = 347; +pub const SYS_syncfs: ::c_long = 348; +pub const SYS_sendmmsg: ::c_long = 349; +pub const SYS_setns: ::c_long = 350; +pub const SYS_process_vm_readv: ::c_long = 351; +pub const SYS_process_vm_writev: ::c_long = 352; +pub const SYS_finit_module: ::c_long = 353; +pub const SYS_kcmp: ::c_long = 354; +pub const SYS_sched_setattr: ::c_long = 355; +pub const SYS_sched_getattr: ::c_long = 356; +pub const SYS_renameat2: ::c_long = 357; +pub const SYS_seccomp: ::c_long = 358; +pub const SYS_getrandom: ::c_long = 359; +pub const SYS_memfd_create: ::c_long = 360; +pub const SYS_bpf: ::c_long = 361; +pub const SYS_execveat: ::c_long = 362; +pub const SYS_switch_endian: ::c_long = 363; +pub const SYS_userfaultfd: ::c_long = 364; +pub const SYS_membarrier: ::c_long = 365; +pub const SYS_mlock2: ::c_long = 378; +pub const SYS_copy_file_range: ::c_long = 379; +pub const SYS_preadv2: ::c_long = 380; +pub const SYS_pwritev2: ::c_long = 381; +pub const SYS_kexec_file_load: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_rseq: ::c_long = 387; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs new file mode 100644 index 0000000..48d152a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs @@ -0,0 +1,44 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct ucontext_t { + pub __uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct mcontext_t { + pub __gregs: [::c_ulong; 32], + pub __fpregs: __riscv_mc_fp_state, + } + + #[allow(missing_debug_implementations)] + pub union __riscv_mc_fp_state { + pub __f: __riscv_mc_f_ext_state, + pub __d: __riscv_mc_d_ext_state, + pub __q: __riscv_mc_q_ext_state, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_f_ext_state { + pub __f: [::c_uint; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_d_ext_state { + pub __f: [::c_ulonglong; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct __riscv_mc_q_ext_state { + pub __f: [::c_ulonglong; 64], + pub __fcsr: ::c_uint, + pub __glibc_reserved: [::c_uint; 3], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs new file mode 100644 index 0000000..c65a562 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs @@ -0,0 +1,851 @@ +//! RISC-V-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = ::c_int; + +pub type nlink_t = ::c_uint; +pub type blksize_t = ::c_int; +pub type fsblkcnt64_t = ::c_ulong; +pub type fsfilcnt64_t = ::c_ulong; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct pthread_attr_t { + __size: [::c_ulong; 7], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2usize], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_favail: ::fsfilcnt64_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused5: ::c_ulong, + __unused6: ::c_ulong, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct user_regs_struct { + pub pc: ::c_ulong, + pub ra: ::c_ulong, + pub sp: ::c_ulong, + pub gp: ::c_ulong, + pub tp: ::c_ulong, + pub t0: ::c_ulong, + pub t1: ::c_ulong, + pub t2: ::c_ulong, + pub s0: ::c_ulong, + pub s1: ::c_ulong, + pub a0: ::c_ulong, + pub a1: ::c_ulong, + pub a2: ::c_ulong, + pub a3: ::c_ulong, + pub a4: ::c_ulong, + pub a5: ::c_ulong, + pub a6: ::c_ulong, + pub a7: ::c_ulong, + pub s2: ::c_ulong, + pub s3: ::c_ulong, + pub s4: ::c_ulong, + pub s5: ::c_ulong, + pub s6: ::c_ulong, + pub s7: ::c_ulong, + pub s8: ::c_ulong, + pub s9: ::c_ulong, + pub s10: ::c_ulong, + pub s11: ::c_ulong, + pub t3: ::c_ulong, + pub t4: ::c_ulong, + pub t5: ::c_ulong, + pub t6: ::c_ulong, + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 1052672; +pub const O_NOATIME: ::c_int = 262144; +pub const O_PATH: ::c_int = 2097152; +pub const O_TMPFILE: ::c_int = 4259840; +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 256; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 134217728; +pub const SA_SIGINFO: ::c_int = 4; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const POLLWRNORM: ::c_short = 256; +pub const POLLWRBAND: ::c_short = 512; +pub const O_ASYNC: ::c_int = 8192; +pub const O_NDELAY: ::c_int = 2048; +pub const PTRACE_DETACH: ::c_uint = 17; +pub const EFD_NONBLOCK: ::c_int = 2048; +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; +pub const SFD_NONBLOCK: ::c_int = 2048; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const SFD_CLOEXEC: ::c_int = 524288; +pub const NCCS: usize = 32; +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 524288; +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; +pub const SA_NODEFER: ::c_int = 1073741824; +pub const SA_RESETHAND: ::c_int = -2147483648; +pub const SA_RESTART: ::c_int = 268435456; +pub const SA_NOCLDSTOP: ::c_int = 1; +pub const EPOLL_CLOEXEC: ::c_int = 524288; +pub const EFD_CLOEXEC: ::c_int = 524288; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const O_DIRECT: ::c_int = 16384; +pub const O_DIRECTORY: ::c_int = 65536; +pub const O_NOFOLLOW: ::c_int = 131072; +pub const MAP_HUGETLB: ::c_int = 262144; +pub const MAP_LOCKED: ::c_int = 8192; +pub const MAP_NORESERVE: ::c_int = 16384; +pub const MAP_ANON: ::c_int = 32; +pub const MAP_ANONYMOUS: ::c_int = 32; +pub const MAP_DENYWRITE: ::c_int = 2048; +pub const MAP_EXECUTABLE: ::c_int = 4096; +pub const MAP_POPULATE: ::c_int = 32768; +pub const MAP_NONBLOCK: ::c_int = 65536; +pub const MAP_STACK: ::c_int = 131072; +pub const MAP_SYNC: ::c_int = 0x080000; +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; +pub const MCL_CURRENT: ::c_int = 1; +pub const MCL_FUTURE: ::c_int = 2; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 4111; +pub const TAB1: ::tcflag_t = 2048; +pub const TAB2: ::tcflag_t = 4096; +pub const TAB3: ::tcflag_t = 6144; +pub const CR1: ::tcflag_t = 512; +pub const CR2: ::tcflag_t = 1024; +pub const CR3: ::tcflag_t = 1536; +pub const FF1: ::tcflag_t = 32768; +pub const BS1: ::tcflag_t = 8192; +pub const VT1: ::tcflag_t = 16384; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 1024; +pub const IXOFF: ::tcflag_t = 4096; +pub const ONLCR: ::tcflag_t = 4; +pub const CSIZE: ::tcflag_t = 48; +pub const CS6: ::tcflag_t = 16; +pub const CS7: ::tcflag_t = 32; +pub const CS8: ::tcflag_t = 48; +pub const CSTOPB: ::tcflag_t = 64; +pub const CREAD: ::tcflag_t = 128; +pub const PARENB: ::tcflag_t = 256; +pub const PARODD: ::tcflag_t = 512; +pub const HUPCL: ::tcflag_t = 1024; +pub const CLOCAL: ::tcflag_t = 2048; +pub const ECHOKE: ::tcflag_t = 2048; +pub const ECHOE: ::tcflag_t = 16; +pub const ECHOK: ::tcflag_t = 32; +pub const ECHONL: ::tcflag_t = 64; +pub const ECHOPRT: ::tcflag_t = 1024; +pub const ECHOCTL: ::tcflag_t = 512; +pub const ISIG: ::tcflag_t = 1; +pub const ICANON: ::tcflag_t = 2; +pub const PENDIN: ::tcflag_t = 16384; +pub const NOFLSH: ::tcflag_t = 128; +pub const CIBAUD: ::tcflag_t = 269418496; +pub const CBAUDEX: ::tcflag_t = 4096; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 2; +pub const NLDLY: ::tcflag_t = 256; +pub const CRDLY: ::tcflag_t = 1536; +pub const TABDLY: ::tcflag_t = 6144; +pub const BSDLY: ::tcflag_t = 8192; +pub const FFDLY: ::tcflag_t = 32768; +pub const VTDLY: ::tcflag_t = 16384; +pub const XTABS: ::tcflag_t = 6144; +pub const B0: ::speed_t = 0; +pub const B50: ::speed_t = 1; +pub const B75: ::speed_t = 2; +pub const B110: ::speed_t = 3; +pub const B134: ::speed_t = 4; +pub const B150: ::speed_t = 5; +pub const B200: ::speed_t = 6; +pub const B300: ::speed_t = 7; +pub const B600: ::speed_t = 8; +pub const B1200: ::speed_t = 9; +pub const B1800: ::speed_t = 10; +pub const B2400: ::speed_t = 11; +pub const B4800: ::speed_t = 12; +pub const B9600: ::speed_t = 13; +pub const B19200: ::speed_t = 14; +pub const B38400: ::speed_t = 15; +pub const EXTA: ::speed_t = 14; +pub const EXTB: ::speed_t = 15; +pub const B57600: ::speed_t = 4097; +pub const B115200: ::speed_t = 4098; +pub const B230400: ::speed_t = 4099; +pub const B460800: ::speed_t = 4100; +pub const B500000: ::speed_t = 4101; +pub const B576000: ::speed_t = 4102; +pub const B921600: ::speed_t = 4103; +pub const B1000000: ::speed_t = 4104; +pub const B1152000: ::speed_t = 4105; +pub const B1500000: ::speed_t = 4106; +pub const B2000000: ::speed_t = 4107; +pub const B2500000: ::speed_t = 4108; +pub const B3000000: ::speed_t = 4109; +pub const B3500000: ::speed_t = 4110; +pub const B4000000: ::speed_t = 4111; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 32768; +pub const TOSTOP: ::tcflag_t = 256; +pub const FLUSHO: ::tcflag_t = 4096; +pub const EXTPROC: ::tcflag_t = 65536; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; +pub const NGREG: usize = 32; +pub const REG_PC: usize = 0; +pub const REG_RA: usize = 1; +pub const REG_SP: usize = 2; +pub const REG_TP: usize = 4; +pub const REG_S0: usize = 8; +pub const REG_S1: usize = 9; +pub const REG_A0: usize = 10; +pub const REG_S2: usize = 18; +pub const REG_NARGS: usize = 8; + +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_close: ::c_long = 57; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_brk: ::c_long = 214; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_dup: ::c_long = 23; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_socket: ::c_long = 198; +pub const SYS_connect: ::c_long = 203; +pub const SYS_accept: ::c_long = 202; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_exit: ::c_long = 93; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_kill: ::c_long = 129; +pub const SYS_uname: ::c_long = 160; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semop: ::c_long = 193; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_flock: ::c_long = 32; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_umask: ::c_long = 166; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_times: ::c_long = 153; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_personality: ::c_long = 92; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_sync: ::c_long = 81; +pub const SYS_acct: ::c_long = 89; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_mount: ::c_long = 40; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_futex: ::c_long = 98; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_openat: ::c_long = 56; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_setns: ::c_long = 268; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_rseq: ::c_long = 293; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs new file mode 100644 index 0000000..c2c4f31 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/s390x.rs @@ -0,0 +1,963 @@ +//! s390x + +use pthread_mutex_t; + +pub type blksize_t = i64; +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type nlink_t = u64; +pub type suseconds_t = i64; +pub type wchar_t = i32; +pub type greg_t = u64; +pub type __u64 = u64; +pub type __s64 = i64; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + __glibc_reserved0: ::c_int, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + pub sa_mask: ::sigset_t, + } + + pub struct statfs { + pub f_type: ::c_uint, + pub f_bsize: ::c_uint, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_uint, + pub f_frsize: ::c_uint, + pub f_flags: ::c_uint, + f_spare: [::c_uint; 4], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + _pad: ::c_int, + _pad2: [::c_long; 14], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __glibc_reserved: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + st_pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + __glibc_reserved: [::c_long; 3], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct __psw_t { + pub mask: u64, + pub addr: u64, + } + + pub struct fpregset_t { + pub fpc: u32, + __pad: u32, + pub fprs: [fpreg_t; 16], + } + + pub struct mcontext_t { + pub psw: __psw_t, + pub gregs: [u64; 16], + pub aregs: [u32; 16], + pub fpregs: fpregset_t, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + } + + pub struct statfs64 { + pub f_type: ::c_uint, + pub f_bsize: ::c_uint, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_uint, + pub f_frsize: ::c_uint, + pub f_flags: ::c_uint, + pub f_spare: [::c_uint; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +s_no_extra_traits! { + // FIXME: This is actually a union. + pub struct fpreg_t { + pub d: ::c_double, + // f: ::c_float, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for fpreg_t { + fn eq(&self, other: &fpreg_t) -> bool { + self.d == other.d + } + } + + impl Eq for fpreg_t {} + + impl ::fmt::Debug for fpreg_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpreg_t") + .field("d", &self.d) + .finish() + } + } + + impl ::hash::Hash for fpreg_t { + fn hash(&self, state: &mut H) { + let d: u64 = unsafe { ::mem::transmute(self.d) }; + d.hash(state); + } + } + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 6; +pub const POSIX_FADV_NOREUSE: ::c_int = 7; + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_CLOEXEC: ::c_int = 0x80000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +align_const! { + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNREFUSED: ::c_int = 111; +pub const ECONNRESET: ::c_int = 104; +pub const EDEADLK: ::c_int = 35; +pub const ENOSYS: ::c_int = 38; +pub const ENOTCONN: ::c_int = 107; +pub const ETIMEDOUT: ::c_int = 110; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NONBLOCK: ::c_int = 2048; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 4; +pub const SIGBUS: ::c_int = 7; +pub const SIGSTKSZ: ::size_t = 0x2000; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const SIG_SETMASK: ::c_int = 2; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const O_NOCTTY: ::c_int = 256; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const VTIME: usize = 5; +pub const VSWTC: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const ONLCR: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const FF1: ::tcflag_t = 0x00008000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const CBAUD: ::speed_t = 0o010017; +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const CSIZE: ::tcflag_t = 0o000060; +pub const CS6: ::tcflag_t = 0o000020; +pub const CS7: ::tcflag_t = 0o000040; +pub const CS8: ::tcflag_t = 0o000060; +pub const CSTOPB: ::tcflag_t = 0o000100; +pub const CREAD: ::tcflag_t = 0o000200; +pub const PARENB: ::tcflag_t = 0o000400; +pub const PARODD: ::tcflag_t = 0o001000; +pub const HUPCL: ::tcflag_t = 0o002000; +pub const CLOCAL: ::tcflag_t = 0o004000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; +pub const CIBAUD: ::tcflag_t = 0o02003600000; + +pub const ISIG: ::tcflag_t = 0o000001; +pub const ICANON: ::tcflag_t = 0o000002; +pub const XCASE: ::tcflag_t = 0o000004; +pub const ECHOE: ::tcflag_t = 0o000020; +pub const ECHOK: ::tcflag_t = 0o000040; +pub const ECHONL: ::tcflag_t = 0o000100; +pub const NOFLSH: ::tcflag_t = 0o000200; +pub const ECHOCTL: ::tcflag_t = 0o001000; +pub const ECHOPRT: ::tcflag_t = 0o002000; +pub const ECHOKE: ::tcflag_t = 0o004000; +pub const PENDIN: ::tcflag_t = 0o040000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const IXON: ::tcflag_t = 0o002000; +pub const IXOFF: ::tcflag_t = 0o010000; + +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_restart_syscall: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_signal: ::c_long = 48; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_lookup_dcookie: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_getdents: ::c_long = 141; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_readahead: ::c_long = 222; +pub const SYS_setxattr: ::c_long = 224; +pub const SYS_lsetxattr: ::c_long = 225; +pub const SYS_fsetxattr: ::c_long = 226; +pub const SYS_getxattr: ::c_long = 227; +pub const SYS_lgetxattr: ::c_long = 228; +pub const SYS_fgetxattr: ::c_long = 229; +pub const SYS_listxattr: ::c_long = 230; +pub const SYS_llistxattr: ::c_long = 231; +pub const SYS_flistxattr: ::c_long = 232; +pub const SYS_removexattr: ::c_long = 233; +pub const SYS_lremovexattr: ::c_long = 234; +pub const SYS_fremovexattr: ::c_long = 235; +pub const SYS_gettid: ::c_long = 236; +pub const SYS_tkill: ::c_long = 237; +pub const SYS_futex: ::c_long = 238; +pub const SYS_sched_setaffinity: ::c_long = 239; +pub const SYS_sched_getaffinity: ::c_long = 240; +pub const SYS_tgkill: ::c_long = 241; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_epoll_create: ::c_long = 249; +pub const SYS_epoll_ctl: ::c_long = 250; +pub const SYS_epoll_wait: ::c_long = 251; +pub const SYS_set_tid_address: ::c_long = 252; +pub const SYS_fadvise64: ::c_long = 253; +pub const SYS_timer_create: ::c_long = 254; +pub const SYS_timer_settime: ::c_long = 255; +pub const SYS_timer_gettime: ::c_long = 256; +pub const SYS_timer_getoverrun: ::c_long = 257; +pub const SYS_timer_delete: ::c_long = 258; +pub const SYS_clock_settime: ::c_long = 259; +pub const SYS_clock_gettime: ::c_long = 260; +pub const SYS_clock_getres: ::c_long = 261; +pub const SYS_clock_nanosleep: ::c_long = 262; +pub const SYS_statfs64: ::c_long = 265; +pub const SYS_fstatfs64: ::c_long = 266; +pub const SYS_remap_file_pages: ::c_long = 267; +pub const SYS_mbind: ::c_long = 268; +pub const SYS_get_mempolicy: ::c_long = 269; +pub const SYS_set_mempolicy: ::c_long = 270; +pub const SYS_mq_open: ::c_long = 271; +pub const SYS_mq_unlink: ::c_long = 272; +pub const SYS_mq_timedsend: ::c_long = 273; +pub const SYS_mq_timedreceive: ::c_long = 274; +pub const SYS_mq_notify: ::c_long = 275; +pub const SYS_mq_getsetattr: ::c_long = 276; +pub const SYS_kexec_load: ::c_long = 277; +pub const SYS_add_key: ::c_long = 278; +pub const SYS_request_key: ::c_long = 279; +pub const SYS_keyctl: ::c_long = 280; +pub const SYS_waitid: ::c_long = 281; +pub const SYS_ioprio_set: ::c_long = 282; +pub const SYS_ioprio_get: ::c_long = 283; +pub const SYS_inotify_init: ::c_long = 284; +pub const SYS_inotify_add_watch: ::c_long = 285; +pub const SYS_inotify_rm_watch: ::c_long = 286; +pub const SYS_migrate_pages: ::c_long = 287; +pub const SYS_openat: ::c_long = 288; +pub const SYS_mkdirat: ::c_long = 289; +pub const SYS_mknodat: ::c_long = 290; +pub const SYS_fchownat: ::c_long = 291; +pub const SYS_futimesat: ::c_long = 292; +pub const SYS_unlinkat: ::c_long = 294; +pub const SYS_renameat: ::c_long = 295; +pub const SYS_linkat: ::c_long = 296; +pub const SYS_symlinkat: ::c_long = 297; +pub const SYS_readlinkat: ::c_long = 298; +pub const SYS_fchmodat: ::c_long = 299; +pub const SYS_faccessat: ::c_long = 300; +pub const SYS_pselect6: ::c_long = 301; +pub const SYS_ppoll: ::c_long = 302; +pub const SYS_unshare: ::c_long = 303; +pub const SYS_set_robust_list: ::c_long = 304; +pub const SYS_get_robust_list: ::c_long = 305; +pub const SYS_splice: ::c_long = 306; +pub const SYS_sync_file_range: ::c_long = 307; +pub const SYS_tee: ::c_long = 308; +pub const SYS_vmsplice: ::c_long = 309; +pub const SYS_move_pages: ::c_long = 310; +pub const SYS_getcpu: ::c_long = 311; +pub const SYS_epoll_pwait: ::c_long = 312; +pub const SYS_utimes: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_utimensat: ::c_long = 315; +pub const SYS_signalfd: ::c_long = 316; +pub const SYS_timerfd: ::c_long = 317; +pub const SYS_eventfd: ::c_long = 318; +pub const SYS_timerfd_create: ::c_long = 319; +pub const SYS_timerfd_settime: ::c_long = 320; +pub const SYS_timerfd_gettime: ::c_long = 321; +pub const SYS_signalfd4: ::c_long = 322; +pub const SYS_eventfd2: ::c_long = 323; +pub const SYS_inotify_init1: ::c_long = 324; +pub const SYS_pipe2: ::c_long = 325; +pub const SYS_dup3: ::c_long = 326; +pub const SYS_epoll_create1: ::c_long = 327; +pub const SYS_preadv: ::c_long = 328; +pub const SYS_pwritev: ::c_long = 329; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 330; +pub const SYS_perf_event_open: ::c_long = 331; +pub const SYS_fanotify_init: ::c_long = 332; +pub const SYS_fanotify_mark: ::c_long = 333; +pub const SYS_prlimit64: ::c_long = 334; +pub const SYS_name_to_handle_at: ::c_long = 335; +pub const SYS_open_by_handle_at: ::c_long = 336; +pub const SYS_clock_adjtime: ::c_long = 337; +pub const SYS_syncfs: ::c_long = 338; +pub const SYS_setns: ::c_long = 339; +pub const SYS_process_vm_readv: ::c_long = 340; +pub const SYS_process_vm_writev: ::c_long = 341; +pub const SYS_s390_runtime_instr: ::c_long = 342; +pub const SYS_kcmp: ::c_long = 343; +pub const SYS_finit_module: ::c_long = 344; +pub const SYS_sched_setattr: ::c_long = 345; +pub const SYS_sched_getattr: ::c_long = 346; +pub const SYS_renameat2: ::c_long = 347; +pub const SYS_seccomp: ::c_long = 348; +pub const SYS_getrandom: ::c_long = 349; +pub const SYS_memfd_create: ::c_long = 350; +pub const SYS_bpf: ::c_long = 351; +pub const SYS_s390_pci_mmio_write: ::c_long = 352; +pub const SYS_s390_pci_mmio_read: ::c_long = 353; +pub const SYS_execveat: ::c_long = 354; +pub const SYS_userfaultfd: ::c_long = 355; +pub const SYS_membarrier: ::c_long = 356; +pub const SYS_recvmmsg: ::c_long = 357; +pub const SYS_sendmmsg: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_mlock2: ::c_long = 374; +pub const SYS_copy_file_range: ::c_long = 375; +pub const SYS_preadv2: ::c_long = 376; +pub const SYS_pwritev2: ::c_long = 377; +pub const SYS_lchown: ::c_long = 198; +pub const SYS_setuid: ::c_long = 213; +pub const SYS_getuid: ::c_long = 199; +pub const SYS_setgid: ::c_long = 214; +pub const SYS_getgid: ::c_long = 200; +pub const SYS_geteuid: ::c_long = 201; +pub const SYS_setreuid: ::c_long = 203; +pub const SYS_setregid: ::c_long = 204; +pub const SYS_getrlimit: ::c_long = 191; +pub const SYS_getgroups: ::c_long = 205; +pub const SYS_fchown: ::c_long = 207; +pub const SYS_setresuid: ::c_long = 208; +pub const SYS_setresgid: ::c_long = 210; +pub const SYS_getresgid: ::c_long = 211; +pub const SYS_select: ::c_long = 142; +pub const SYS_getegid: ::c_long = 202; +pub const SYS_setgroups: ::c_long = 206; +pub const SYS_getresuid: ::c_long = 209; +pub const SYS_chown: ::c_long = 212; +pub const SYS_setfsuid: ::c_long = 215; +pub const SYS_setfsgid: ::c_long = 216; +pub const SYS_newfstatat: ::c_long = 293; +pub const SYS_statx: ::c_long = 379; +pub const SYS_rseq: ::c_long = 383; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn getcontext(ucp: *mut ::ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ::ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ::ucontext_t, func: extern "C" fn(), argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ::ucontext_t, ucp: *const ::ucontext_t) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs new file mode 100644 index 0000000..29d1e1c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [i64; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs new file mode 100644 index 0000000..2427c7a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs @@ -0,0 +1,930 @@ +//! SPARC64-specific definitions for 64-bit linux-like values + +use pthread_mutex_t; + +pub type c_long = i64; +pub type c_ulong = u64; +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u32; +pub type blksize_t = i64; +pub type suseconds_t = i32; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + #[cfg(target_arch = "sparc64")] + __reserved0: ::c_int, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + __reserved: ::c_short, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct stat { + pub st_dev: ::dev_t, + __pad0: u64, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad1: u64, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad0: u64, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: ::c_int, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 2], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + __pad0: u16, + pub __seq: ::c_ushort, + __unused1: ::c_ulonglong, + __unused2: ::c_ulonglong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __reserved1: ::c_ulong, + __reserved2: ::c_ulong + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +pub const O_APPEND: ::c_int = 0x8; +pub const O_CREAT: ::c_int = 0x200; +pub const O_EXCL: ::c_int = 0x800; +pub const O_NOCTTY: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 0x4000; +pub const O_SYNC: ::c_int = 0x802000; +pub const O_RSYNC: ::c_int = 0x802000; +pub const O_DSYNC: ::c_int = 0x2000; +pub const O_FSYNC: ::c_int = 0x802000; +pub const O_NOATIME: ::c_int = 0x200000; +pub const O_PATH: ::c_int = 0x1000000; +pub const O_TMPFILE: ::c_int = 0x2000000 | O_DIRECTORY; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0200; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLK: ::c_int = 78; +pub const ENAMETOOLONG: ::c_int = 63; +pub const ENOLCK: ::c_int = 79; +pub const ENOSYS: ::c_int = 90; +pub const ENOTEMPTY: ::c_int = 66; +pub const ELOOP: ::c_int = 62; +pub const ENOMSG: ::c_int = 75; +pub const EIDRM: ::c_int = 77; +pub const ECHRNG: ::c_int = 94; +pub const EL2NSYNC: ::c_int = 95; +pub const EL3HLT: ::c_int = 96; +pub const EL3RST: ::c_int = 97; +pub const ELNRNG: ::c_int = 98; +pub const EUNATCH: ::c_int = 99; +pub const ENOCSI: ::c_int = 100; +pub const EL2HLT: ::c_int = 101; +pub const EBADE: ::c_int = 102; +pub const EBADR: ::c_int = 103; +pub const EXFULL: ::c_int = 104; +pub const ENOANO: ::c_int = 105; +pub const EBADRQC: ::c_int = 106; +pub const EBADSLT: ::c_int = 107; +pub const EMULTIHOP: ::c_int = 87; +pub const EOVERFLOW: ::c_int = 92; +pub const ENOTUNIQ: ::c_int = 115; +pub const EBADFD: ::c_int = 93; +pub const EBADMSG: ::c_int = 76; +pub const EREMCHG: ::c_int = 89; +pub const ELIBACC: ::c_int = 114; +pub const ELIBBAD: ::c_int = 112; +pub const ELIBSCN: ::c_int = 124; +pub const ELIBMAX: ::c_int = 123; +pub const ELIBEXEC: ::c_int = 110; +pub const EILSEQ: ::c_int = 122; +pub const ERESTART: ::c_int = 116; +pub const ESTRPIPE: ::c_int = 91; +pub const EUSERS: ::c_int = 68; +pub const ENOTSOCK: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 39; +pub const EMSGSIZE: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENETDOWN: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const EHOSTDOWN: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const EALREADY: ::c_int = 37; +pub const EINPROGRESS: ::c_int = 36; +pub const ESTALE: ::c_int = 70; +pub const EDQUOT: ::c_int = 69; +pub const ENOMEDIUM: ::c_int = 125; +pub const EMEDIUMTYPE: ::c_int = 126; +pub const ECANCELED: ::c_int = 127; +pub const ENOKEY: ::c_int = 128; +pub const EKEYEXPIRED: ::c_int = 129; +pub const EKEYREVOKED: ::c_int = 130; +pub const EKEYREJECTED: ::c_int = 131; +pub const EOWNERDEAD: ::c_int = 132; +pub const ENOTRECOVERABLE: ::c_int = 133; +pub const EHWPOISON: ::c_int = 135; +pub const ERFKILL: ::c_int = 134; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 1; +pub const SA_SIGINFO: ::c_int = 0x200; +pub const SA_NOCLDWAIT: ::c_int = 0x100; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 20; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const SIGCONT: ::c_int = 19; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGURG: ::c_int = 16; +pub const SIGIO: ::c_int = 23; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 23; +pub const SIGPWR: ::c_int = 29; +pub const SIG_SETMASK: ::c_int = 4; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const POLLWRNORM: ::c_short = 4; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const O_ASYNC: ::c_int = 0x40; +pub const O_NDELAY: ::c_int = 0x4004; + +pub const PTRACE_DETACH: ::c_uint = 17; + +pub const EFD_NONBLOCK: ::c_int = 0x4000; + +pub const F_GETLK: ::c_int = 7; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const F_RDLCK: ::c_int = 1; +pub const F_WRLCK: ::c_int = 2; +pub const F_UNLCK: ::c_int = 3; + +pub const SFD_NONBLOCK: ::c_int = 0x4000; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const SFD_CLOEXEC: ::c_int = 0x400000; + +pub const NCCS: usize = 17; +pub const O_TRUNC: ::c_int = 0x400; + +pub const O_CLOEXEC: ::c_int = 0x400000; + +pub const EBFONT: ::c_int = 109; +pub const ENOSTR: ::c_int = 72; +pub const ENODATA: ::c_int = 111; +pub const ETIME: ::c_int = 73; +pub const ENOSR: ::c_int = 74; +pub const ENONET: ::c_int = 80; +pub const ENOPKG: ::c_int = 113; +pub const EREMOTE: ::c_int = 71; +pub const ENOLINK: ::c_int = 82; +pub const EADV: ::c_int = 83; +pub const ESRMNT: ::c_int = 84; +pub const ECOMM: ::c_int = 85; +pub const EPROTO: ::c_int = 86; +pub const EDOTDOT: ::c_int = 88; + +pub const SA_NODEFER: ::c_int = 0x20; +pub const SA_RESETHAND: ::c_int = 0x4; +pub const SA_RESTART: ::c_int = 0x2; +pub const SA_NOCLDSTOP: ::c_int = 0x00000008; + +pub const EPOLL_CLOEXEC: ::c_int = 0x400000; + +pub const EFD_CLOEXEC: ::c_int = 0x400000; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +align_const! { + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_DIRECT: ::c_int = 0x100000; + +pub const MAP_LOCKED: ::c_int = 0x0100; +pub const MAP_NORESERVE: ::c_int = 0x00040; + +pub const EDEADLOCK: ::c_int = 108; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; + +pub const SIGSTKSZ: ::size_t = 16384; +pub const MINSIGSTKSZ: ::size_t = 4096; +pub const CBAUD: ::tcflag_t = 0x0000100f; +pub const TAB1: ::tcflag_t = 0x800; +pub const TAB2: ::tcflag_t = 0x1000; +pub const TAB3: ::tcflag_t = 0x1800; +pub const CR1: ::tcflag_t = 0x200; +pub const CR2: ::tcflag_t = 0x400; +pub const CR3: ::tcflag_t = 0x600; +pub const FF1: ::tcflag_t = 0x8000; +pub const BS1: ::tcflag_t = 0x2000; +pub const VT1: ::tcflag_t = 0x4000; +pub const VWERASE: usize = 0xe; +pub const VREPRINT: usize = 0xc; +pub const VSUSP: usize = 0xa; +pub const VSTART: usize = 0x8; +pub const VSTOP: usize = 0x9; +pub const VDISCARD: usize = 0xd; +pub const VTIME: usize = 0x5; +pub const IXON: ::tcflag_t = 0x400; +pub const IXOFF: ::tcflag_t = 0x1000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x30; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x40; +pub const CREAD: ::tcflag_t = 0x80; +pub const PARENB: ::tcflag_t = 0x100; +pub const PARODD: ::tcflag_t = 0x200; +pub const HUPCL: ::tcflag_t = 0x400; +pub const CLOCAL: ::tcflag_t = 0x800; +pub const ECHOKE: ::tcflag_t = 0x800; +pub const ECHOE: ::tcflag_t = 0x10; +pub const ECHOK: ::tcflag_t = 0x20; +pub const ECHONL: ::tcflag_t = 0x40; +pub const ECHOPRT: ::tcflag_t = 0x400; +pub const ECHOCTL: ::tcflag_t = 0x200; +pub const ISIG: ::tcflag_t = 0x1; +pub const ICANON: ::tcflag_t = 0x2; +pub const PENDIN: ::tcflag_t = 0x4000; +pub const NOFLSH: ::tcflag_t = 0x80; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0x00001000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0x1001; +pub const B115200: ::speed_t = 0x1002; +pub const B230400: ::speed_t = 0x1003; +pub const B460800: ::speed_t = 0x1004; +pub const B76800: ::speed_t = 0x1005; +pub const B153600: ::speed_t = 0x1006; +pub const B307200: ::speed_t = 0x1007; +pub const B614400: ::speed_t = 0x1008; +pub const B921600: ::speed_t = 0x1009; +pub const B500000: ::speed_t = 0x100a; +pub const B576000: ::speed_t = 0x100b; +pub const B1000000: ::speed_t = 0x100c; +pub const B1152000: ::speed_t = 0x100d; +pub const B1500000: ::speed_t = 0x100e; +pub const B2000000: ::speed_t = 0x100f; + +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x8000; +pub const TOSTOP: ::tcflag_t = 0x100; +pub const FLUSHO: ::tcflag_t = 0x1000; +pub const EXTPROC: ::tcflag_t = 0x10000; + +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_wait4: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execv: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_chown: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_brk: ::c_long = 17; +pub const SYS_perfctr: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_capget: ::c_long = 21; +pub const SYS_capset: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_vmsplice: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_sigaltstack: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_stat: ::c_long = 38; +pub const SYS_sendfile: ::c_long = 39; +pub const SYS_lstat: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_umount2: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_memory_ordering: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_reboot: ::c_long = 55; +pub const SYS_symlink: ::c_long = 57; +pub const SYS_readlink: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_fstat: ::c_long = 62; +pub const SYS_fstat64: ::c_long = 63; +pub const SYS_getpagesize: ::c_long = 64; +pub const SYS_msync: ::c_long = 65; +pub const SYS_vfork: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_mmap: ::c_long = 71; +pub const SYS_munmap: ::c_long = 73; +pub const SYS_mprotect: ::c_long = 74; +pub const SYS_madvise: ::c_long = 75; +pub const SYS_vhangup: ::c_long = 76; +pub const SYS_mincore: ::c_long = 78; +pub const SYS_getgroups: ::c_long = 79; +pub const SYS_setgroups: ::c_long = 80; +pub const SYS_getpgrp: ::c_long = 81; +pub const SYS_setitimer: ::c_long = 83; +pub const SYS_swapon: ::c_long = 85; +pub const SYS_getitimer: ::c_long = 86; +pub const SYS_sethostname: ::c_long = 88; +pub const SYS_dup2: ::c_long = 90; +pub const SYS_fcntl: ::c_long = 92; +pub const SYS_select: ::c_long = 93; +pub const SYS_fsync: ::c_long = 95; +pub const SYS_setpriority: ::c_long = 96; +pub const SYS_socket: ::c_long = 97; +pub const SYS_connect: ::c_long = 98; +pub const SYS_accept: ::c_long = 99; +pub const SYS_getpriority: ::c_long = 100; +pub const SYS_rt_sigreturn: ::c_long = 101; +pub const SYS_rt_sigaction: ::c_long = 102; +pub const SYS_rt_sigprocmask: ::c_long = 103; +pub const SYS_rt_sigpending: ::c_long = 104; +pub const SYS_rt_sigtimedwait: ::c_long = 105; +pub const SYS_rt_sigqueueinfo: ::c_long = 106; +pub const SYS_rt_sigsuspend: ::c_long = 107; +pub const SYS_setresuid: ::c_long = 108; +pub const SYS_getresuid: ::c_long = 109; +pub const SYS_setresgid: ::c_long = 110; +pub const SYS_getresgid: ::c_long = 111; +pub const SYS_recvmsg: ::c_long = 113; +pub const SYS_sendmsg: ::c_long = 114; +pub const SYS_gettimeofday: ::c_long = 116; +pub const SYS_getrusage: ::c_long = 117; +pub const SYS_getsockopt: ::c_long = 118; +pub const SYS_getcwd: ::c_long = 119; +pub const SYS_readv: ::c_long = 120; +pub const SYS_writev: ::c_long = 121; +pub const SYS_settimeofday: ::c_long = 122; +pub const SYS_fchown: ::c_long = 123; +pub const SYS_fchmod: ::c_long = 124; +pub const SYS_recvfrom: ::c_long = 125; +pub const SYS_setreuid: ::c_long = 126; +pub const SYS_setregid: ::c_long = 127; +pub const SYS_rename: ::c_long = 128; +pub const SYS_truncate: ::c_long = 129; +pub const SYS_ftruncate: ::c_long = 130; +pub const SYS_flock: ::c_long = 131; +pub const SYS_lstat64: ::c_long = 132; +pub const SYS_sendto: ::c_long = 133; +pub const SYS_shutdown: ::c_long = 134; +pub const SYS_socketpair: ::c_long = 135; +pub const SYS_mkdir: ::c_long = 136; +pub const SYS_rmdir: ::c_long = 137; +pub const SYS_utimes: ::c_long = 138; +pub const SYS_stat64: ::c_long = 139; +pub const SYS_sendfile64: ::c_long = 140; +pub const SYS_getpeername: ::c_long = 141; +pub const SYS_futex: ::c_long = 142; +pub const SYS_gettid: ::c_long = 143; +pub const SYS_getrlimit: ::c_long = 144; +pub const SYS_setrlimit: ::c_long = 145; +pub const SYS_pivot_root: ::c_long = 146; +pub const SYS_prctl: ::c_long = 147; +pub const SYS_pciconfig_read: ::c_long = 148; +pub const SYS_pciconfig_write: ::c_long = 149; +pub const SYS_getsockname: ::c_long = 150; +pub const SYS_inotify_init: ::c_long = 151; +pub const SYS_inotify_add_watch: ::c_long = 152; +pub const SYS_poll: ::c_long = 153; +pub const SYS_getdents64: ::c_long = 154; +pub const SYS_inotify_rm_watch: ::c_long = 156; +pub const SYS_statfs: ::c_long = 157; +pub const SYS_fstatfs: ::c_long = 158; +pub const SYS_umount: ::c_long = 159; +pub const SYS_sched_set_affinity: ::c_long = 160; +pub const SYS_sched_get_affinity: ::c_long = 161; +pub const SYS_getdomainname: ::c_long = 162; +pub const SYS_setdomainname: ::c_long = 163; +pub const SYS_utrap_install: ::c_long = 164; +pub const SYS_quotactl: ::c_long = 165; +pub const SYS_set_tid_address: ::c_long = 166; +pub const SYS_mount: ::c_long = 167; +pub const SYS_ustat: ::c_long = 168; +pub const SYS_setxattr: ::c_long = 169; +pub const SYS_lsetxattr: ::c_long = 170; +pub const SYS_fsetxattr: ::c_long = 171; +pub const SYS_getxattr: ::c_long = 172; +pub const SYS_lgetxattr: ::c_long = 173; +pub const SYS_getdents: ::c_long = 174; +pub const SYS_setsid: ::c_long = 175; +pub const SYS_fchdir: ::c_long = 176; +pub const SYS_fgetxattr: ::c_long = 177; +pub const SYS_listxattr: ::c_long = 178; +pub const SYS_llistxattr: ::c_long = 179; +pub const SYS_flistxattr: ::c_long = 180; +pub const SYS_removexattr: ::c_long = 181; +pub const SYS_lremovexattr: ::c_long = 182; +pub const SYS_sigpending: ::c_long = 183; +pub const SYS_query_module: ::c_long = 184; +pub const SYS_setpgid: ::c_long = 185; +pub const SYS_fremovexattr: ::c_long = 186; +pub const SYS_tkill: ::c_long = 187; +pub const SYS_exit_group: ::c_long = 188; +pub const SYS_uname: ::c_long = 189; +pub const SYS_init_module: ::c_long = 190; +pub const SYS_personality: ::c_long = 191; +pub const SYS_remap_file_pages: ::c_long = 192; +pub const SYS_epoll_create: ::c_long = 193; +pub const SYS_epoll_ctl: ::c_long = 194; +pub const SYS_epoll_wait: ::c_long = 195; +pub const SYS_ioprio_set: ::c_long = 196; +pub const SYS_getppid: ::c_long = 197; +pub const SYS_sigaction: ::c_long = 198; +pub const SYS_sgetmask: ::c_long = 199; +pub const SYS_ssetmask: ::c_long = 200; +pub const SYS_sigsuspend: ::c_long = 201; +pub const SYS_oldlstat: ::c_long = 202; +pub const SYS_uselib: ::c_long = 203; +pub const SYS_readdir: ::c_long = 204; +pub const SYS_readahead: ::c_long = 205; +pub const SYS_socketcall: ::c_long = 206; +pub const SYS_syslog: ::c_long = 207; +pub const SYS_lookup_dcookie: ::c_long = 208; +pub const SYS_fadvise64: ::c_long = 209; +pub const SYS_fadvise64_64: ::c_long = 210; +pub const SYS_tgkill: ::c_long = 211; +pub const SYS_waitpid: ::c_long = 212; +pub const SYS_swapoff: ::c_long = 213; +pub const SYS_sysinfo: ::c_long = 214; +pub const SYS_ipc: ::c_long = 215; +pub const SYS_sigreturn: ::c_long = 216; +pub const SYS_clone: ::c_long = 217; +pub const SYS_ioprio_get: ::c_long = 218; +pub const SYS_adjtimex: ::c_long = 219; +pub const SYS_sigprocmask: ::c_long = 220; +pub const SYS_create_module: ::c_long = 221; +pub const SYS_delete_module: ::c_long = 222; +pub const SYS_get_kernel_syms: ::c_long = 223; +pub const SYS_getpgid: ::c_long = 224; +pub const SYS_bdflush: ::c_long = 225; +pub const SYS_sysfs: ::c_long = 226; +pub const SYS_afs_syscall: ::c_long = 227; +pub const SYS_setfsuid: ::c_long = 228; +pub const SYS_setfsgid: ::c_long = 229; +pub const SYS__newselect: ::c_long = 230; +pub const SYS_splice: ::c_long = 232; +pub const SYS_stime: ::c_long = 233; +pub const SYS_statfs64: ::c_long = 234; +pub const SYS_fstatfs64: ::c_long = 235; +pub const SYS__llseek: ::c_long = 236; +pub const SYS_mlock: ::c_long = 237; +pub const SYS_munlock: ::c_long = 238; +pub const SYS_mlockall: ::c_long = 239; +pub const SYS_munlockall: ::c_long = 240; +pub const SYS_sched_setparam: ::c_long = 241; +pub const SYS_sched_getparam: ::c_long = 242; +pub const SYS_sched_setscheduler: ::c_long = 243; +pub const SYS_sched_getscheduler: ::c_long = 244; +pub const SYS_sched_yield: ::c_long = 245; +pub const SYS_sched_get_priority_max: ::c_long = 246; +pub const SYS_sched_get_priority_min: ::c_long = 247; +pub const SYS_sched_rr_get_interval: ::c_long = 248; +pub const SYS_nanosleep: ::c_long = 249; +pub const SYS_mremap: ::c_long = 250; +pub const SYS__sysctl: ::c_long = 251; +pub const SYS_getsid: ::c_long = 252; +pub const SYS_fdatasync: ::c_long = 253; +pub const SYS_nfsservctl: ::c_long = 254; +pub const SYS_sync_file_range: ::c_long = 255; +pub const SYS_clock_settime: ::c_long = 256; +pub const SYS_clock_gettime: ::c_long = 257; +pub const SYS_clock_getres: ::c_long = 258; +pub const SYS_clock_nanosleep: ::c_long = 259; +pub const SYS_sched_getaffinity: ::c_long = 260; +pub const SYS_sched_setaffinity: ::c_long = 261; +pub const SYS_timer_settime: ::c_long = 262; +pub const SYS_timer_gettime: ::c_long = 263; +pub const SYS_timer_getoverrun: ::c_long = 264; +pub const SYS_timer_delete: ::c_long = 265; +pub const SYS_timer_create: ::c_long = 266; +pub const SYS_io_setup: ::c_long = 268; +pub const SYS_io_destroy: ::c_long = 269; +pub const SYS_io_submit: ::c_long = 270; +pub const SYS_io_cancel: ::c_long = 271; +pub const SYS_io_getevents: ::c_long = 272; +pub const SYS_mq_open: ::c_long = 273; +pub const SYS_mq_unlink: ::c_long = 274; +pub const SYS_mq_timedsend: ::c_long = 275; +pub const SYS_mq_timedreceive: ::c_long = 276; +pub const SYS_mq_notify: ::c_long = 277; +pub const SYS_mq_getsetattr: ::c_long = 278; +pub const SYS_waitid: ::c_long = 279; +pub const SYS_tee: ::c_long = 280; +pub const SYS_add_key: ::c_long = 281; +pub const SYS_request_key: ::c_long = 282; +pub const SYS_keyctl: ::c_long = 283; +pub const SYS_openat: ::c_long = 284; +pub const SYS_mkdirat: ::c_long = 285; +pub const SYS_mknodat: ::c_long = 286; +pub const SYS_fchownat: ::c_long = 287; +pub const SYS_futimesat: ::c_long = 288; +pub const SYS_fstatat64: ::c_long = 289; +pub const SYS_unlinkat: ::c_long = 290; +pub const SYS_renameat: ::c_long = 291; +pub const SYS_linkat: ::c_long = 292; +pub const SYS_symlinkat: ::c_long = 293; +pub const SYS_readlinkat: ::c_long = 294; +pub const SYS_fchmodat: ::c_long = 295; +pub const SYS_faccessat: ::c_long = 296; +pub const SYS_pselect6: ::c_long = 297; +pub const SYS_ppoll: ::c_long = 298; +pub const SYS_unshare: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_get_robust_list: ::c_long = 301; +pub const SYS_migrate_pages: ::c_long = 302; +pub const SYS_mbind: ::c_long = 303; +pub const SYS_get_mempolicy: ::c_long = 304; +pub const SYS_set_mempolicy: ::c_long = 305; +pub const SYS_kexec_load: ::c_long = 306; +pub const SYS_move_pages: ::c_long = 307; +pub const SYS_getcpu: ::c_long = 308; +pub const SYS_epoll_pwait: ::c_long = 309; +pub const SYS_utimensat: ::c_long = 310; +pub const SYS_signalfd: ::c_long = 311; +pub const SYS_timerfd_create: ::c_long = 312; +pub const SYS_eventfd: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_timerfd_settime: ::c_long = 315; +pub const SYS_timerfd_gettime: ::c_long = 316; +pub const SYS_signalfd4: ::c_long = 317; +pub const SYS_eventfd2: ::c_long = 318; +pub const SYS_epoll_create1: ::c_long = 319; +pub const SYS_dup3: ::c_long = 320; +pub const SYS_pipe2: ::c_long = 321; +pub const SYS_inotify_init1: ::c_long = 322; +pub const SYS_accept4: ::c_long = 323; +pub const SYS_preadv: ::c_long = 324; +pub const SYS_pwritev: ::c_long = 325; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 326; +pub const SYS_perf_event_open: ::c_long = 327; +pub const SYS_recvmmsg: ::c_long = 328; +pub const SYS_fanotify_init: ::c_long = 329; +pub const SYS_fanotify_mark: ::c_long = 330; +pub const SYS_prlimit64: ::c_long = 331; +pub const SYS_name_to_handle_at: ::c_long = 332; +pub const SYS_open_by_handle_at: ::c_long = 333; +pub const SYS_clock_adjtime: ::c_long = 334; +pub const SYS_syncfs: ::c_long = 335; +pub const SYS_sendmmsg: ::c_long = 336; +pub const SYS_setns: ::c_long = 337; +pub const SYS_process_vm_readv: ::c_long = 338; +pub const SYS_process_vm_writev: ::c_long = 339; +pub const SYS_kern_features: ::c_long = 340; +pub const SYS_kcmp: ::c_long = 341; +pub const SYS_finit_module: ::c_long = 342; +pub const SYS_sched_setattr: ::c_long = 343; +pub const SYS_sched_getattr: ::c_long = 344; +pub const SYS_renameat2: ::c_long = 345; +pub const SYS_seccomp: ::c_long = 346; +pub const SYS_getrandom: ::c_long = 347; +pub const SYS_memfd_create: ::c_long = 348; +pub const SYS_bpf: ::c_long = 349; +pub const SYS_execveat: ::c_long = 350; +pub const SYS_membarrier: ::c_long = 351; +pub const SYS_userfaultfd: ::c_long = 352; +pub const SYS_bind: ::c_long = 353; +pub const SYS_listen: ::c_long = 354; +pub const SYS_setsockopt: ::c_long = 355; +pub const SYS_mlock2: ::c_long = 356; +pub const SYS_copy_file_range: ::c_long = 357; +pub const SYS_preadv2: ::c_long = 358; +pub const SYS_pwritev2: ::c_long = 359; +pub const SYS_statx: ::c_long = 360; +pub const SYS_rseq: ::c_long = 365; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +// Reserved in the kernel, but not actually implemented yet +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs new file mode 100644 index 0000000..ba3075e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs @@ -0,0 +1,24 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } +} + +s! { + #[repr(align(8))] + pub struct clone_args { + pub flags: ::c_ulonglong, + pub pidfd: ::c_ulonglong, + pub child_tid: ::c_ulonglong, + pub parent_tid: ::c_ulonglong, + pub exit_signal: ::c_ulonglong, + pub stack: ::c_ulonglong, + pub stack_size: ::c_ulonglong, + pub tls: ::c_ulonglong, + pub set_tid: ::c_ulonglong, + pub set_tid_size: ::c_ulonglong, + pub cgroup: ::c_ulonglong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs new file mode 100644 index 0000000..e6307e2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs @@ -0,0 +1,834 @@ +//! x86_64-specific definitions for 64-bit linux-like values + +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = i64; +pub type greg_t = i64; +pub type suseconds_t = i64; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + #[cfg(target_arch = "sparc64")] + __reserved0: ::c_int, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statfs { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + f_spare: [::__fsword_t; 5], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: i64, + pub st_mtime: ::time_t, + pub st_mtime_nsec: i64, + pub st_ctime: ::time_t, + pub st_ctime_nsec: i64, + __unused: [i64; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: i64, + pub st_mtime: ::time_t, + pub st_mtime_nsec: i64, + pub st_ctime: ::time_t, + pub st_ctime_nsec: i64, + __reserved: [i64; 3], + } + + pub struct statfs64 { + pub f_type: ::__fsword_t, + pub f_bsize: ::__fsword_t, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_fsid: ::fsid_t, + pub f_namelen: ::__fsword_t, + pub f_frsize: ::__fsword_t, + pub f_flags: ::__fsword_t, + pub f_spare: [::__fsword_t; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + #[cfg(target_pointer_width = "32")] + __size: [u32; 8], + #[cfg(target_pointer_width = "64")] + __size: [u64; 7] + } + + pub struct _libc_fpxreg { + pub significand: [u16; 4], + pub exponent: u16, + __private: [u16; 3], + } + + pub struct _libc_xmmreg { + pub element: [u32; 4], + } + + pub struct _libc_fpstate { + pub cwd: u16, + pub swd: u16, + pub ftw: u16, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcr_mask: u32, + pub _st: [_libc_fpxreg; 8], + pub _xmm: [_libc_xmmreg; 16], + __private: [u64; 12], + } + + pub struct user_regs_struct { + pub r15: ::c_ulonglong, + pub r14: ::c_ulonglong, + pub r13: ::c_ulonglong, + pub r12: ::c_ulonglong, + pub rbp: ::c_ulonglong, + pub rbx: ::c_ulonglong, + pub r11: ::c_ulonglong, + pub r10: ::c_ulonglong, + pub r9: ::c_ulonglong, + pub r8: ::c_ulonglong, + pub rax: ::c_ulonglong, + pub rcx: ::c_ulonglong, + pub rdx: ::c_ulonglong, + pub rsi: ::c_ulonglong, + pub rdi: ::c_ulonglong, + pub orig_rax: ::c_ulonglong, + pub rip: ::c_ulonglong, + pub cs: ::c_ulonglong, + pub eflags: ::c_ulonglong, + pub rsp: ::c_ulonglong, + pub ss: ::c_ulonglong, + pub fs_base: ::c_ulonglong, + pub gs_base: ::c_ulonglong, + pub ds: ::c_ulonglong, + pub es: ::c_ulonglong, + pub fs: ::c_ulonglong, + pub gs: ::c_ulonglong, + } + + pub struct user { + pub regs: user_regs_struct, + pub u_fpvalid: ::c_int, + pub i387: user_fpregs_struct, + pub u_tsize: ::c_ulonglong, + pub u_dsize: ::c_ulonglong, + pub u_ssize: ::c_ulonglong, + pub start_code: ::c_ulonglong, + pub start_stack: ::c_ulonglong, + pub signal: ::c_longlong, + __reserved: ::c_int, + #[cfg(target_pointer_width = "32")] + __pad1: u32, + pub u_ar0: *mut user_regs_struct, + #[cfg(target_pointer_width = "32")] + __pad2: u32, + pub u_fpstate: *mut user_fpregs_struct, + pub magic: ::c_ulonglong, + pub u_comm: [::c_char; 32], + pub u_debugreg: [::c_ulonglong; 8], + } + + pub struct mcontext_t { + pub gregs: [greg_t; 23], + pub fpregs: *mut _libc_fpstate, + __private: [u64; 8], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: u64, + __unused2: u64 + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: u64, + __unused5: u64 + } + + pub struct seccomp_notif_sizes { + pub seccomp_notif: ::__u16, + pub seccomp_notif_resp: ::__u16, + pub seccomp_data: ::__u16, + } + + pub struct ptrace_rseq_configuration { + pub rseq_abi_pointer: ::__u64, + pub rseq_abi_size: ::__u32, + pub signature: ::__u32, + pub flags: ::__u32, + pub pad: ::__u32, + } +} + +s_no_extra_traits! { + pub struct user_fpregs_struct { + pub cwd: ::c_ushort, + pub swd: ::c_ushort, + pub ftw: ::c_ushort, + pub fop: ::c_ushort, + pub rip: ::c_ulonglong, + pub rdp: ::c_ulonglong, + pub mxcsr: ::c_uint, + pub mxcr_mask: ::c_uint, + pub st_space: [::c_uint; 32], + pub xmm_space: [::c_uint; 64], + padding: [::c_uint; 24], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 512], + // FIXME: the shadow stack field requires glibc >= 2.28. + // Re-add once we drop compatibility with glibc versions older than + // 2.28. + // + // __ssp: [::c_ulonglong; 4], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for user_fpregs_struct { + fn eq(&self, other: &user_fpregs_struct) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.ftw == other.ftw + && self.fop == other.fop + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mxcr_mask == other.mxcr_mask + && self.st_space == other.st_space + && self + .xmm_space + .iter() + .zip(other.xmm_space.iter()) + .all(|(a,b)| a == b) + // Ignore padding field + } + } + + impl Eq for user_fpregs_struct {} + + impl ::fmt::Debug for user_fpregs_struct { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("user_fpregs_struct") + .field("cwd", &self.cwd) + .field("ftw", &self.ftw) + .field("fop", &self.fop) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mxcr_mask", &self.mxcr_mask) + .field("st_space", &self.st_space) + // FIXME: .field("xmm_space", &self.xmm_space) + // Ignore padding field + .finish() + } + } + + impl ::hash::Hash for user_fpregs_struct { + fn hash(&self, state: &mut H) { + self.cwd.hash(state); + self.ftw.hash(state); + self.fop.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mxcr_mask.hash(state); + self.st_space.hash(state); + self.xmm_space.hash(state); + // Ignore padding field + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + // Ignore __private field + } + } + + impl Eq for ucontext_t {} + + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + // Ignore __private field + .finish() + } + } + + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + // Ignore __private field + } + } + } +} + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = 31; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x800; + +pub const PTRACE_DETACH: ::c_uint = 17; +pub const PTRACE_GET_RSEQ_CONFIGURATION: ::c_uint = 0x420f; + +pub const EFD_NONBLOCK: ::c_int = 0x800; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; + +pub const SFD_NONBLOCK: ::c_int = 0x0800; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_32BIT: ::c_int = 0x0040; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; + +pub const PTRACE_GETFPREGS: ::c_uint = 14; +pub const PTRACE_SETFPREGS: ::c_uint = 15; +pub const PTRACE_GETFPXREGS: ::c_uint = 18; +pub const PTRACE_SETFPXREGS: ::c_uint = 19; +pub const PTRACE_GETREGS: ::c_uint = 12; +pub const PTRACE_SETREGS: ::c_uint = 13; +pub const PTRACE_PEEKSIGINFO_SHARED: ::c_uint = 1; +pub const PTRACE_SYSEMU: ::c_uint = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_uint = 32; + +pub const PR_GET_SPECULATION_CTRL: ::c_int = 52; +pub const PR_SET_SPECULATION_CTRL: ::c_int = 53; +pub const PR_SPEC_NOT_AFFECTED: ::c_uint = 0; +pub const PR_SPEC_PRCTL: ::c_uint = 1 << 0; +pub const PR_SPEC_ENABLE: ::c_uint = 1 << 1; +pub const PR_SPEC_DISABLE: ::c_uint = 1 << 2; +pub const PR_SPEC_FORCE_DISABLE: ::c_uint = 1 << 3; +pub const PR_SPEC_DISABLE_NOEXEC: ::c_uint = 1 << 4; +pub const PR_SPEC_STORE_BYPASS: ::c_int = 0; +pub const PR_SPEC_INDIRECT_BRANCH: ::c_int = 1; +// FIXME: perharps for later +//pub const PR_SPEC_L1D_FLUSH: ::c_int = 2; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; +pub const EXTPROC: ::tcflag_t = 0x00010000; + +// offsets in user_regs_structs, from sys/reg.h +pub const R15: ::c_int = 0; +pub const R14: ::c_int = 1; +pub const R13: ::c_int = 2; +pub const R12: ::c_int = 3; +pub const RBP: ::c_int = 4; +pub const RBX: ::c_int = 5; +pub const R11: ::c_int = 6; +pub const R10: ::c_int = 7; +pub const R9: ::c_int = 8; +pub const R8: ::c_int = 9; +pub const RAX: ::c_int = 10; +pub const RCX: ::c_int = 11; +pub const RDX: ::c_int = 12; +pub const RSI: ::c_int = 13; +pub const RDI: ::c_int = 14; +pub const ORIG_RAX: ::c_int = 15; +pub const RIP: ::c_int = 16; +pub const CS: ::c_int = 17; +pub const EFLAGS: ::c_int = 18; +pub const RSP: ::c_int = 19; +pub const SS: ::c_int = 20; +pub const FS_BASE: ::c_int = 21; +pub const GS_BASE: ::c_int = 22; +pub const DS: ::c_int = 23; +pub const ES: ::c_int = 24; +pub const FS: ::c_int = 25; +pub const GS: ::c_int = 26; + +// offsets in mcontext_t.gregs from sys/ucontext.h +pub const REG_R8: ::c_int = 0; +pub const REG_R9: ::c_int = 1; +pub const REG_R10: ::c_int = 2; +pub const REG_R11: ::c_int = 3; +pub const REG_R12: ::c_int = 4; +pub const REG_R13: ::c_int = 5; +pub const REG_R14: ::c_int = 6; +pub const REG_R15: ::c_int = 7; +pub const REG_RDI: ::c_int = 8; +pub const REG_RSI: ::c_int = 9; +pub const REG_RBP: ::c_int = 10; +pub const REG_RBX: ::c_int = 11; +pub const REG_RDX: ::c_int = 12; +pub const REG_RAX: ::c_int = 13; +pub const REG_RCX: ::c_int = 14; +pub const REG_RSP: ::c_int = 15; +pub const REG_RIP: ::c_int = 16; +pub const REG_EFL: ::c_int = 17; +pub const REG_CSGSFS: ::c_int = 18; +pub const REG_ERR: ::c_int = 19; +pub const REG_TRAPNO: ::c_int = 20; +pub const REG_OLDMASK: ::c_int = 21; +pub const REG_CR2: ::c_int = 22; + +pub const SECCOMP_SET_MODE_STRICT: ::c_uint = 0; +pub const SECCOMP_SET_MODE_FILTER: ::c_uint = 1; +pub const SECCOMP_GET_ACTION_AVAIL: ::c_uint = 2; +pub const SECCOMP_GET_NOTIF_SIZES: ::c_uint = 3; + +extern "C" { + pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int; + pub fn setcontext(ucp: *const ucontext_t) -> ::c_int; + pub fn makecontext(ucp: *mut ucontext_t, func: extern "C" fn(), argc: ::c_int, ...); + pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> ::c_int; + pub fn iopl(level: ::c_int) -> ::c_int; + pub fn ioperm(from: ::c_ulong, num: ::c_ulong, turn_on: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + mod x32; + pub use self::x32::*; + } else { + mod not_x32; + pub use self::not_x32::*; + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs new file mode 100644 index 0000000..3831dfa --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs @@ -0,0 +1,451 @@ +use pthread_mutex_t; + +pub type c_long = i64; +pub type c_ulong = u64; + +s! { + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +align_const! { + #[cfg(target_endian = "little")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "little")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + #[cfg(target_endian = "big")] + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +// Syscall table + +pub const SYS_read: ::c_long = 0; +pub const SYS_write: ::c_long = 1; +pub const SYS_open: ::c_long = 2; +pub const SYS_close: ::c_long = 3; +pub const SYS_stat: ::c_long = 4; +pub const SYS_fstat: ::c_long = 5; +pub const SYS_lstat: ::c_long = 6; +pub const SYS_poll: ::c_long = 7; +pub const SYS_lseek: ::c_long = 8; +pub const SYS_mmap: ::c_long = 9; +pub const SYS_mprotect: ::c_long = 10; +pub const SYS_munmap: ::c_long = 11; +pub const SYS_brk: ::c_long = 12; +pub const SYS_rt_sigaction: ::c_long = 13; +pub const SYS_rt_sigprocmask: ::c_long = 14; +pub const SYS_rt_sigreturn: ::c_long = 15; +pub const SYS_ioctl: ::c_long = 16; +pub const SYS_pread64: ::c_long = 17; +pub const SYS_pwrite64: ::c_long = 18; +pub const SYS_readv: ::c_long = 19; +pub const SYS_writev: ::c_long = 20; +pub const SYS_access: ::c_long = 21; +pub const SYS_pipe: ::c_long = 22; +pub const SYS_select: ::c_long = 23; +pub const SYS_sched_yield: ::c_long = 24; +pub const SYS_mremap: ::c_long = 25; +pub const SYS_msync: ::c_long = 26; +pub const SYS_mincore: ::c_long = 27; +pub const SYS_madvise: ::c_long = 28; +pub const SYS_shmget: ::c_long = 29; +pub const SYS_shmat: ::c_long = 30; +pub const SYS_shmctl: ::c_long = 31; +pub const SYS_dup: ::c_long = 32; +pub const SYS_dup2: ::c_long = 33; +pub const SYS_pause: ::c_long = 34; +pub const SYS_nanosleep: ::c_long = 35; +pub const SYS_getitimer: ::c_long = 36; +pub const SYS_alarm: ::c_long = 37; +pub const SYS_setitimer: ::c_long = 38; +pub const SYS_getpid: ::c_long = 39; +pub const SYS_sendfile: ::c_long = 40; +pub const SYS_socket: ::c_long = 41; +pub const SYS_connect: ::c_long = 42; +pub const SYS_accept: ::c_long = 43; +pub const SYS_sendto: ::c_long = 44; +pub const SYS_recvfrom: ::c_long = 45; +pub const SYS_sendmsg: ::c_long = 46; +pub const SYS_recvmsg: ::c_long = 47; +pub const SYS_shutdown: ::c_long = 48; +pub const SYS_bind: ::c_long = 49; +pub const SYS_listen: ::c_long = 50; +pub const SYS_getsockname: ::c_long = 51; +pub const SYS_getpeername: ::c_long = 52; +pub const SYS_socketpair: ::c_long = 53; +pub const SYS_setsockopt: ::c_long = 54; +pub const SYS_getsockopt: ::c_long = 55; +pub const SYS_clone: ::c_long = 56; +pub const SYS_fork: ::c_long = 57; +pub const SYS_vfork: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_exit: ::c_long = 60; +pub const SYS_wait4: ::c_long = 61; +pub const SYS_kill: ::c_long = 62; +pub const SYS_uname: ::c_long = 63; +pub const SYS_semget: ::c_long = 64; +pub const SYS_semop: ::c_long = 65; +pub const SYS_semctl: ::c_long = 66; +pub const SYS_shmdt: ::c_long = 67; +pub const SYS_msgget: ::c_long = 68; +pub const SYS_msgsnd: ::c_long = 69; +pub const SYS_msgrcv: ::c_long = 70; +pub const SYS_msgctl: ::c_long = 71; +pub const SYS_fcntl: ::c_long = 72; +pub const SYS_flock: ::c_long = 73; +pub const SYS_fsync: ::c_long = 74; +pub const SYS_fdatasync: ::c_long = 75; +pub const SYS_truncate: ::c_long = 76; +pub const SYS_ftruncate: ::c_long = 77; +pub const SYS_getdents: ::c_long = 78; +pub const SYS_getcwd: ::c_long = 79; +pub const SYS_chdir: ::c_long = 80; +pub const SYS_fchdir: ::c_long = 81; +pub const SYS_rename: ::c_long = 82; +pub const SYS_mkdir: ::c_long = 83; +pub const SYS_rmdir: ::c_long = 84; +pub const SYS_creat: ::c_long = 85; +pub const SYS_link: ::c_long = 86; +pub const SYS_unlink: ::c_long = 87; +pub const SYS_symlink: ::c_long = 88; +pub const SYS_readlink: ::c_long = 89; +pub const SYS_chmod: ::c_long = 90; +pub const SYS_fchmod: ::c_long = 91; +pub const SYS_chown: ::c_long = 92; +pub const SYS_fchown: ::c_long = 93; +pub const SYS_lchown: ::c_long = 94; +pub const SYS_umask: ::c_long = 95; +pub const SYS_gettimeofday: ::c_long = 96; +pub const SYS_getrlimit: ::c_long = 97; +pub const SYS_getrusage: ::c_long = 98; +pub const SYS_sysinfo: ::c_long = 99; +pub const SYS_times: ::c_long = 100; +pub const SYS_ptrace: ::c_long = 101; +pub const SYS_getuid: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_getgid: ::c_long = 104; +pub const SYS_setuid: ::c_long = 105; +pub const SYS_setgid: ::c_long = 106; +pub const SYS_geteuid: ::c_long = 107; +pub const SYS_getegid: ::c_long = 108; +pub const SYS_setpgid: ::c_long = 109; +pub const SYS_getppid: ::c_long = 110; +pub const SYS_getpgrp: ::c_long = 111; +pub const SYS_setsid: ::c_long = 112; +pub const SYS_setreuid: ::c_long = 113; +pub const SYS_setregid: ::c_long = 114; +pub const SYS_getgroups: ::c_long = 115; +pub const SYS_setgroups: ::c_long = 116; +pub const SYS_setresuid: ::c_long = 117; +pub const SYS_getresuid: ::c_long = 118; +pub const SYS_setresgid: ::c_long = 119; +pub const SYS_getresgid: ::c_long = 120; +pub const SYS_getpgid: ::c_long = 121; +pub const SYS_setfsuid: ::c_long = 122; +pub const SYS_setfsgid: ::c_long = 123; +pub const SYS_getsid: ::c_long = 124; +pub const SYS_capget: ::c_long = 125; +pub const SYS_capset: ::c_long = 126; +pub const SYS_rt_sigpending: ::c_long = 127; +pub const SYS_rt_sigtimedwait: ::c_long = 128; +pub const SYS_rt_sigqueueinfo: ::c_long = 129; +pub const SYS_rt_sigsuspend: ::c_long = 130; +pub const SYS_sigaltstack: ::c_long = 131; +pub const SYS_utime: ::c_long = 132; +pub const SYS_mknod: ::c_long = 133; +pub const SYS_uselib: ::c_long = 134; +pub const SYS_personality: ::c_long = 135; +pub const SYS_ustat: ::c_long = 136; +pub const SYS_statfs: ::c_long = 137; +pub const SYS_fstatfs: ::c_long = 138; +pub const SYS_sysfs: ::c_long = 139; +pub const SYS_getpriority: ::c_long = 140; +pub const SYS_setpriority: ::c_long = 141; +pub const SYS_sched_setparam: ::c_long = 142; +pub const SYS_sched_getparam: ::c_long = 143; +pub const SYS_sched_setscheduler: ::c_long = 144; +pub const SYS_sched_getscheduler: ::c_long = 145; +pub const SYS_sched_get_priority_max: ::c_long = 146; +pub const SYS_sched_get_priority_min: ::c_long = 147; +pub const SYS_sched_rr_get_interval: ::c_long = 148; +pub const SYS_mlock: ::c_long = 149; +pub const SYS_munlock: ::c_long = 150; +pub const SYS_mlockall: ::c_long = 151; +pub const SYS_munlockall: ::c_long = 152; +pub const SYS_vhangup: ::c_long = 153; +pub const SYS_modify_ldt: ::c_long = 154; +pub const SYS_pivot_root: ::c_long = 155; +pub const SYS__sysctl: ::c_long = 156; +pub const SYS_prctl: ::c_long = 157; +pub const SYS_arch_prctl: ::c_long = 158; +pub const SYS_adjtimex: ::c_long = 159; +pub const SYS_setrlimit: ::c_long = 160; +pub const SYS_chroot: ::c_long = 161; +pub const SYS_sync: ::c_long = 162; +pub const SYS_acct: ::c_long = 163; +pub const SYS_settimeofday: ::c_long = 164; +pub const SYS_mount: ::c_long = 165; +pub const SYS_umount2: ::c_long = 166; +pub const SYS_swapon: ::c_long = 167; +pub const SYS_swapoff: ::c_long = 168; +pub const SYS_reboot: ::c_long = 169; +pub const SYS_sethostname: ::c_long = 170; +pub const SYS_setdomainname: ::c_long = 171; +pub const SYS_iopl: ::c_long = 172; +pub const SYS_ioperm: ::c_long = 173; +pub const SYS_create_module: ::c_long = 174; +pub const SYS_init_module: ::c_long = 175; +pub const SYS_delete_module: ::c_long = 176; +pub const SYS_get_kernel_syms: ::c_long = 177; +pub const SYS_query_module: ::c_long = 178; +pub const SYS_quotactl: ::c_long = 179; +pub const SYS_nfsservctl: ::c_long = 180; +pub const SYS_getpmsg: ::c_long = 181; +pub const SYS_putpmsg: ::c_long = 182; +pub const SYS_afs_syscall: ::c_long = 183; +pub const SYS_tuxcall: ::c_long = 184; +pub const SYS_security: ::c_long = 185; +pub const SYS_gettid: ::c_long = 186; +pub const SYS_readahead: ::c_long = 187; +pub const SYS_setxattr: ::c_long = 188; +pub const SYS_lsetxattr: ::c_long = 189; +pub const SYS_fsetxattr: ::c_long = 190; +pub const SYS_getxattr: ::c_long = 191; +pub const SYS_lgetxattr: ::c_long = 192; +pub const SYS_fgetxattr: ::c_long = 193; +pub const SYS_listxattr: ::c_long = 194; +pub const SYS_llistxattr: ::c_long = 195; +pub const SYS_flistxattr: ::c_long = 196; +pub const SYS_removexattr: ::c_long = 197; +pub const SYS_lremovexattr: ::c_long = 198; +pub const SYS_fremovexattr: ::c_long = 199; +pub const SYS_tkill: ::c_long = 200; +pub const SYS_time: ::c_long = 201; +pub const SYS_futex: ::c_long = 202; +pub const SYS_sched_setaffinity: ::c_long = 203; +pub const SYS_sched_getaffinity: ::c_long = 204; +pub const SYS_set_thread_area: ::c_long = 205; +pub const SYS_io_setup: ::c_long = 206; +pub const SYS_io_destroy: ::c_long = 207; +pub const SYS_io_getevents: ::c_long = 208; +pub const SYS_io_submit: ::c_long = 209; +pub const SYS_io_cancel: ::c_long = 210; +pub const SYS_get_thread_area: ::c_long = 211; +pub const SYS_lookup_dcookie: ::c_long = 212; +pub const SYS_epoll_create: ::c_long = 213; +pub const SYS_epoll_ctl_old: ::c_long = 214; +pub const SYS_epoll_wait_old: ::c_long = 215; +pub const SYS_remap_file_pages: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_set_tid_address: ::c_long = 218; +pub const SYS_restart_syscall: ::c_long = 219; +pub const SYS_semtimedop: ::c_long = 220; +pub const SYS_fadvise64: ::c_long = 221; +pub const SYS_timer_create: ::c_long = 222; +pub const SYS_timer_settime: ::c_long = 223; +pub const SYS_timer_gettime: ::c_long = 224; +pub const SYS_timer_getoverrun: ::c_long = 225; +pub const SYS_timer_delete: ::c_long = 226; +pub const SYS_clock_settime: ::c_long = 227; +pub const SYS_clock_gettime: ::c_long = 228; +pub const SYS_clock_getres: ::c_long = 229; +pub const SYS_clock_nanosleep: ::c_long = 230; +pub const SYS_exit_group: ::c_long = 231; +pub const SYS_epoll_wait: ::c_long = 232; +pub const SYS_epoll_ctl: ::c_long = 233; +pub const SYS_tgkill: ::c_long = 234; +pub const SYS_utimes: ::c_long = 235; +pub const SYS_vserver: ::c_long = 236; +pub const SYS_mbind: ::c_long = 237; +pub const SYS_set_mempolicy: ::c_long = 238; +pub const SYS_get_mempolicy: ::c_long = 239; +pub const SYS_mq_open: ::c_long = 240; +pub const SYS_mq_unlink: ::c_long = 241; +pub const SYS_mq_timedsend: ::c_long = 242; +pub const SYS_mq_timedreceive: ::c_long = 243; +pub const SYS_mq_notify: ::c_long = 244; +pub const SYS_mq_getsetattr: ::c_long = 245; +pub const SYS_kexec_load: ::c_long = 246; +pub const SYS_waitid: ::c_long = 247; +pub const SYS_add_key: ::c_long = 248; +pub const SYS_request_key: ::c_long = 249; +pub const SYS_keyctl: ::c_long = 250; +pub const SYS_ioprio_set: ::c_long = 251; +pub const SYS_ioprio_get: ::c_long = 252; +pub const SYS_inotify_init: ::c_long = 253; +pub const SYS_inotify_add_watch: ::c_long = 254; +pub const SYS_inotify_rm_watch: ::c_long = 255; +pub const SYS_migrate_pages: ::c_long = 256; +pub const SYS_openat: ::c_long = 257; +pub const SYS_mkdirat: ::c_long = 258; +pub const SYS_mknodat: ::c_long = 259; +pub const SYS_fchownat: ::c_long = 260; +pub const SYS_futimesat: ::c_long = 261; +pub const SYS_newfstatat: ::c_long = 262; +pub const SYS_unlinkat: ::c_long = 263; +pub const SYS_renameat: ::c_long = 264; +pub const SYS_linkat: ::c_long = 265; +pub const SYS_symlinkat: ::c_long = 266; +pub const SYS_readlinkat: ::c_long = 267; +pub const SYS_fchmodat: ::c_long = 268; +pub const SYS_faccessat: ::c_long = 269; +pub const SYS_pselect6: ::c_long = 270; +pub const SYS_ppoll: ::c_long = 271; +pub const SYS_unshare: ::c_long = 272; +pub const SYS_set_robust_list: ::c_long = 273; +pub const SYS_get_robust_list: ::c_long = 274; +pub const SYS_splice: ::c_long = 275; +pub const SYS_tee: ::c_long = 276; +pub const SYS_sync_file_range: ::c_long = 277; +pub const SYS_vmsplice: ::c_long = 278; +pub const SYS_move_pages: ::c_long = 279; +pub const SYS_utimensat: ::c_long = 280; +pub const SYS_epoll_pwait: ::c_long = 281; +pub const SYS_signalfd: ::c_long = 282; +pub const SYS_timerfd_create: ::c_long = 283; +pub const SYS_eventfd: ::c_long = 284; +pub const SYS_fallocate: ::c_long = 285; +pub const SYS_timerfd_settime: ::c_long = 286; +pub const SYS_timerfd_gettime: ::c_long = 287; +pub const SYS_accept4: ::c_long = 288; +pub const SYS_signalfd4: ::c_long = 289; +pub const SYS_eventfd2: ::c_long = 290; +pub const SYS_epoll_create1: ::c_long = 291; +pub const SYS_dup3: ::c_long = 292; +pub const SYS_pipe2: ::c_long = 293; +pub const SYS_inotify_init1: ::c_long = 294; +pub const SYS_preadv: ::c_long = 295; +pub const SYS_pwritev: ::c_long = 296; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 297; +pub const SYS_perf_event_open: ::c_long = 298; +pub const SYS_recvmmsg: ::c_long = 299; +pub const SYS_fanotify_init: ::c_long = 300; +pub const SYS_fanotify_mark: ::c_long = 301; +pub const SYS_prlimit64: ::c_long = 302; +pub const SYS_name_to_handle_at: ::c_long = 303; +pub const SYS_open_by_handle_at: ::c_long = 304; +pub const SYS_clock_adjtime: ::c_long = 305; +pub const SYS_syncfs: ::c_long = 306; +pub const SYS_sendmmsg: ::c_long = 307; +pub const SYS_setns: ::c_long = 308; +pub const SYS_getcpu: ::c_long = 309; +pub const SYS_process_vm_readv: ::c_long = 310; +pub const SYS_process_vm_writev: ::c_long = 311; +pub const SYS_kcmp: ::c_long = 312; +pub const SYS_finit_module: ::c_long = 313; +pub const SYS_sched_setattr: ::c_long = 314; +pub const SYS_sched_getattr: ::c_long = 315; +pub const SYS_renameat2: ::c_long = 316; +pub const SYS_seccomp: ::c_long = 317; +pub const SYS_getrandom: ::c_long = 318; +pub const SYS_memfd_create: ::c_long = 319; +pub const SYS_kexec_file_load: ::c_long = 320; +pub const SYS_bpf: ::c_long = 321; +pub const SYS_execveat: ::c_long = 322; +pub const SYS_userfaultfd: ::c_long = 323; +pub const SYS_membarrier: ::c_long = 324; +pub const SYS_mlock2: ::c_long = 325; +pub const SYS_copy_file_range: ::c_long = 326; +pub const SYS_preadv2: ::c_long = 327; +pub const SYS_pwritev2: ::c_long = 328; +pub const SYS_pkey_mprotect: ::c_long = 329; +pub const SYS_pkey_alloc: ::c_long = 330; +pub const SYS_pkey_free: ::c_long = 331; +pub const SYS_statx: ::c_long = 332; +pub const SYS_rseq: ::c_long = 334; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs new file mode 100644 index 0000000..06aa0da --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs @@ -0,0 +1,404 @@ +use pthread_mutex_t; + +pub type c_long = i32; +pub type c_ulong = u32; + +s! { + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 32; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 44; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; + +align_const! { + pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; + pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t = + pthread_mutex_t { + size: [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }; +} + +// Syscall table + +pub const __X32_SYSCALL_BIT: ::c_long = 0x40000000; + +pub const SYS_read: ::c_long = __X32_SYSCALL_BIT + 0; +pub const SYS_write: ::c_long = __X32_SYSCALL_BIT + 1; +pub const SYS_open: ::c_long = __X32_SYSCALL_BIT + 2; +pub const SYS_close: ::c_long = __X32_SYSCALL_BIT + 3; +pub const SYS_stat: ::c_long = __X32_SYSCALL_BIT + 4; +pub const SYS_fstat: ::c_long = __X32_SYSCALL_BIT + 5; +pub const SYS_lstat: ::c_long = __X32_SYSCALL_BIT + 6; +pub const SYS_poll: ::c_long = __X32_SYSCALL_BIT + 7; +pub const SYS_lseek: ::c_long = __X32_SYSCALL_BIT + 8; +pub const SYS_mmap: ::c_long = __X32_SYSCALL_BIT + 9; +pub const SYS_mprotect: ::c_long = __X32_SYSCALL_BIT + 10; +pub const SYS_munmap: ::c_long = __X32_SYSCALL_BIT + 11; +pub const SYS_brk: ::c_long = __X32_SYSCALL_BIT + 12; +pub const SYS_rt_sigprocmask: ::c_long = __X32_SYSCALL_BIT + 14; +pub const SYS_pread64: ::c_long = __X32_SYSCALL_BIT + 17; +pub const SYS_pwrite64: ::c_long = __X32_SYSCALL_BIT + 18; +pub const SYS_access: ::c_long = __X32_SYSCALL_BIT + 21; +pub const SYS_pipe: ::c_long = __X32_SYSCALL_BIT + 22; +pub const SYS_select: ::c_long = __X32_SYSCALL_BIT + 23; +pub const SYS_sched_yield: ::c_long = __X32_SYSCALL_BIT + 24; +pub const SYS_mremap: ::c_long = __X32_SYSCALL_BIT + 25; +pub const SYS_msync: ::c_long = __X32_SYSCALL_BIT + 26; +pub const SYS_mincore: ::c_long = __X32_SYSCALL_BIT + 27; +pub const SYS_madvise: ::c_long = __X32_SYSCALL_BIT + 28; +pub const SYS_shmget: ::c_long = __X32_SYSCALL_BIT + 29; +pub const SYS_shmat: ::c_long = __X32_SYSCALL_BIT + 30; +pub const SYS_shmctl: ::c_long = __X32_SYSCALL_BIT + 31; +pub const SYS_dup: ::c_long = __X32_SYSCALL_BIT + 32; +pub const SYS_dup2: ::c_long = __X32_SYSCALL_BIT + 33; +pub const SYS_pause: ::c_long = __X32_SYSCALL_BIT + 34; +pub const SYS_nanosleep: ::c_long = __X32_SYSCALL_BIT + 35; +pub const SYS_getitimer: ::c_long = __X32_SYSCALL_BIT + 36; +pub const SYS_alarm: ::c_long = __X32_SYSCALL_BIT + 37; +pub const SYS_setitimer: ::c_long = __X32_SYSCALL_BIT + 38; +pub const SYS_getpid: ::c_long = __X32_SYSCALL_BIT + 39; +pub const SYS_sendfile: ::c_long = __X32_SYSCALL_BIT + 40; +pub const SYS_socket: ::c_long = __X32_SYSCALL_BIT + 41; +pub const SYS_connect: ::c_long = __X32_SYSCALL_BIT + 42; +pub const SYS_accept: ::c_long = __X32_SYSCALL_BIT + 43; +pub const SYS_sendto: ::c_long = __X32_SYSCALL_BIT + 44; +pub const SYS_shutdown: ::c_long = __X32_SYSCALL_BIT + 48; +pub const SYS_bind: ::c_long = __X32_SYSCALL_BIT + 49; +pub const SYS_listen: ::c_long = __X32_SYSCALL_BIT + 50; +pub const SYS_getsockname: ::c_long = __X32_SYSCALL_BIT + 51; +pub const SYS_getpeername: ::c_long = __X32_SYSCALL_BIT + 52; +pub const SYS_socketpair: ::c_long = __X32_SYSCALL_BIT + 53; +pub const SYS_clone: ::c_long = __X32_SYSCALL_BIT + 56; +pub const SYS_fork: ::c_long = __X32_SYSCALL_BIT + 57; +pub const SYS_vfork: ::c_long = __X32_SYSCALL_BIT + 58; +pub const SYS_exit: ::c_long = __X32_SYSCALL_BIT + 60; +pub const SYS_wait4: ::c_long = __X32_SYSCALL_BIT + 61; +pub const SYS_kill: ::c_long = __X32_SYSCALL_BIT + 62; +pub const SYS_uname: ::c_long = __X32_SYSCALL_BIT + 63; +pub const SYS_semget: ::c_long = __X32_SYSCALL_BIT + 64; +pub const SYS_semop: ::c_long = __X32_SYSCALL_BIT + 65; +pub const SYS_semctl: ::c_long = __X32_SYSCALL_BIT + 66; +pub const SYS_shmdt: ::c_long = __X32_SYSCALL_BIT + 67; +pub const SYS_msgget: ::c_long = __X32_SYSCALL_BIT + 68; +pub const SYS_msgsnd: ::c_long = __X32_SYSCALL_BIT + 69; +pub const SYS_msgrcv: ::c_long = __X32_SYSCALL_BIT + 70; +pub const SYS_msgctl: ::c_long = __X32_SYSCALL_BIT + 71; +pub const SYS_fcntl: ::c_long = __X32_SYSCALL_BIT + 72; +pub const SYS_flock: ::c_long = __X32_SYSCALL_BIT + 73; +pub const SYS_fsync: ::c_long = __X32_SYSCALL_BIT + 74; +pub const SYS_fdatasync: ::c_long = __X32_SYSCALL_BIT + 75; +pub const SYS_truncate: ::c_long = __X32_SYSCALL_BIT + 76; +pub const SYS_ftruncate: ::c_long = __X32_SYSCALL_BIT + 77; +pub const SYS_getdents: ::c_long = __X32_SYSCALL_BIT + 78; +pub const SYS_getcwd: ::c_long = __X32_SYSCALL_BIT + 79; +pub const SYS_chdir: ::c_long = __X32_SYSCALL_BIT + 80; +pub const SYS_fchdir: ::c_long = __X32_SYSCALL_BIT + 81; +pub const SYS_rename: ::c_long = __X32_SYSCALL_BIT + 82; +pub const SYS_mkdir: ::c_long = __X32_SYSCALL_BIT + 83; +pub const SYS_rmdir: ::c_long = __X32_SYSCALL_BIT + 84; +pub const SYS_creat: ::c_long = __X32_SYSCALL_BIT + 85; +pub const SYS_link: ::c_long = __X32_SYSCALL_BIT + 86; +pub const SYS_unlink: ::c_long = __X32_SYSCALL_BIT + 87; +pub const SYS_symlink: ::c_long = __X32_SYSCALL_BIT + 88; +pub const SYS_readlink: ::c_long = __X32_SYSCALL_BIT + 89; +pub const SYS_chmod: ::c_long = __X32_SYSCALL_BIT + 90; +pub const SYS_fchmod: ::c_long = __X32_SYSCALL_BIT + 91; +pub const SYS_chown: ::c_long = __X32_SYSCALL_BIT + 92; +pub const SYS_fchown: ::c_long = __X32_SYSCALL_BIT + 93; +pub const SYS_lchown: ::c_long = __X32_SYSCALL_BIT + 94; +pub const SYS_umask: ::c_long = __X32_SYSCALL_BIT + 95; +pub const SYS_gettimeofday: ::c_long = __X32_SYSCALL_BIT + 96; +pub const SYS_getrlimit: ::c_long = __X32_SYSCALL_BIT + 97; +pub const SYS_getrusage: ::c_long = __X32_SYSCALL_BIT + 98; +pub const SYS_sysinfo: ::c_long = __X32_SYSCALL_BIT + 99; +pub const SYS_times: ::c_long = __X32_SYSCALL_BIT + 100; +pub const SYS_getuid: ::c_long = __X32_SYSCALL_BIT + 102; +pub const SYS_syslog: ::c_long = __X32_SYSCALL_BIT + 103; +pub const SYS_getgid: ::c_long = __X32_SYSCALL_BIT + 104; +pub const SYS_setuid: ::c_long = __X32_SYSCALL_BIT + 105; +pub const SYS_setgid: ::c_long = __X32_SYSCALL_BIT + 106; +pub const SYS_geteuid: ::c_long = __X32_SYSCALL_BIT + 107; +pub const SYS_getegid: ::c_long = __X32_SYSCALL_BIT + 108; +pub const SYS_setpgid: ::c_long = __X32_SYSCALL_BIT + 109; +pub const SYS_getppid: ::c_long = __X32_SYSCALL_BIT + 110; +pub const SYS_getpgrp: ::c_long = __X32_SYSCALL_BIT + 111; +pub const SYS_setsid: ::c_long = __X32_SYSCALL_BIT + 112; +pub const SYS_setreuid: ::c_long = __X32_SYSCALL_BIT + 113; +pub const SYS_setregid: ::c_long = __X32_SYSCALL_BIT + 114; +pub const SYS_getgroups: ::c_long = __X32_SYSCALL_BIT + 115; +pub const SYS_setgroups: ::c_long = __X32_SYSCALL_BIT + 116; +pub const SYS_setresuid: ::c_long = __X32_SYSCALL_BIT + 117; +pub const SYS_getresuid: ::c_long = __X32_SYSCALL_BIT + 118; +pub const SYS_setresgid: ::c_long = __X32_SYSCALL_BIT + 119; +pub const SYS_getresgid: ::c_long = __X32_SYSCALL_BIT + 120; +pub const SYS_getpgid: ::c_long = __X32_SYSCALL_BIT + 121; +pub const SYS_setfsuid: ::c_long = __X32_SYSCALL_BIT + 122; +pub const SYS_setfsgid: ::c_long = __X32_SYSCALL_BIT + 123; +pub const SYS_getsid: ::c_long = __X32_SYSCALL_BIT + 124; +pub const SYS_capget: ::c_long = __X32_SYSCALL_BIT + 125; +pub const SYS_capset: ::c_long = __X32_SYSCALL_BIT + 126; +pub const SYS_rt_sigsuspend: ::c_long = __X32_SYSCALL_BIT + 130; +pub const SYS_utime: ::c_long = __X32_SYSCALL_BIT + 132; +pub const SYS_mknod: ::c_long = __X32_SYSCALL_BIT + 133; +pub const SYS_personality: ::c_long = __X32_SYSCALL_BIT + 135; +pub const SYS_ustat: ::c_long = __X32_SYSCALL_BIT + 136; +pub const SYS_statfs: ::c_long = __X32_SYSCALL_BIT + 137; +pub const SYS_fstatfs: ::c_long = __X32_SYSCALL_BIT + 138; +pub const SYS_sysfs: ::c_long = __X32_SYSCALL_BIT + 139; +pub const SYS_getpriority: ::c_long = __X32_SYSCALL_BIT + 140; +pub const SYS_setpriority: ::c_long = __X32_SYSCALL_BIT + 141; +pub const SYS_sched_setparam: ::c_long = __X32_SYSCALL_BIT + 142; +pub const SYS_sched_getparam: ::c_long = __X32_SYSCALL_BIT + 143; +pub const SYS_sched_setscheduler: ::c_long = __X32_SYSCALL_BIT + 144; +pub const SYS_sched_getscheduler: ::c_long = __X32_SYSCALL_BIT + 145; +pub const SYS_sched_get_priority_max: ::c_long = __X32_SYSCALL_BIT + 146; +pub const SYS_sched_get_priority_min: ::c_long = __X32_SYSCALL_BIT + 147; +pub const SYS_sched_rr_get_interval: ::c_long = __X32_SYSCALL_BIT + 148; +pub const SYS_mlock: ::c_long = __X32_SYSCALL_BIT + 149; +pub const SYS_munlock: ::c_long = __X32_SYSCALL_BIT + 150; +pub const SYS_mlockall: ::c_long = __X32_SYSCALL_BIT + 151; +pub const SYS_munlockall: ::c_long = __X32_SYSCALL_BIT + 152; +pub const SYS_vhangup: ::c_long = __X32_SYSCALL_BIT + 153; +pub const SYS_modify_ldt: ::c_long = __X32_SYSCALL_BIT + 154; +pub const SYS_pivot_root: ::c_long = __X32_SYSCALL_BIT + 155; +pub const SYS_prctl: ::c_long = __X32_SYSCALL_BIT + 157; +pub const SYS_arch_prctl: ::c_long = __X32_SYSCALL_BIT + 158; +pub const SYS_adjtimex: ::c_long = __X32_SYSCALL_BIT + 159; +pub const SYS_setrlimit: ::c_long = __X32_SYSCALL_BIT + 160; +pub const SYS_chroot: ::c_long = __X32_SYSCALL_BIT + 161; +pub const SYS_sync: ::c_long = __X32_SYSCALL_BIT + 162; +pub const SYS_acct: ::c_long = __X32_SYSCALL_BIT + 163; +pub const SYS_settimeofday: ::c_long = __X32_SYSCALL_BIT + 164; +pub const SYS_mount: ::c_long = __X32_SYSCALL_BIT + 165; +pub const SYS_umount2: ::c_long = __X32_SYSCALL_BIT + 166; +pub const SYS_swapon: ::c_long = __X32_SYSCALL_BIT + 167; +pub const SYS_swapoff: ::c_long = __X32_SYSCALL_BIT + 168; +pub const SYS_reboot: ::c_long = __X32_SYSCALL_BIT + 169; +pub const SYS_sethostname: ::c_long = __X32_SYSCALL_BIT + 170; +pub const SYS_setdomainname: ::c_long = __X32_SYSCALL_BIT + 171; +pub const SYS_iopl: ::c_long = __X32_SYSCALL_BIT + 172; +pub const SYS_ioperm: ::c_long = __X32_SYSCALL_BIT + 173; +pub const SYS_init_module: ::c_long = __X32_SYSCALL_BIT + 175; +pub const SYS_delete_module: ::c_long = __X32_SYSCALL_BIT + 176; +pub const SYS_quotactl: ::c_long = __X32_SYSCALL_BIT + 179; +pub const SYS_getpmsg: ::c_long = __X32_SYSCALL_BIT + 181; +pub const SYS_putpmsg: ::c_long = __X32_SYSCALL_BIT + 182; +pub const SYS_afs_syscall: ::c_long = __X32_SYSCALL_BIT + 183; +pub const SYS_tuxcall: ::c_long = __X32_SYSCALL_BIT + 184; +pub const SYS_security: ::c_long = __X32_SYSCALL_BIT + 185; +pub const SYS_gettid: ::c_long = __X32_SYSCALL_BIT + 186; +pub const SYS_readahead: ::c_long = __X32_SYSCALL_BIT + 187; +pub const SYS_setxattr: ::c_long = __X32_SYSCALL_BIT + 188; +pub const SYS_lsetxattr: ::c_long = __X32_SYSCALL_BIT + 189; +pub const SYS_fsetxattr: ::c_long = __X32_SYSCALL_BIT + 190; +pub const SYS_getxattr: ::c_long = __X32_SYSCALL_BIT + 191; +pub const SYS_lgetxattr: ::c_long = __X32_SYSCALL_BIT + 192; +pub const SYS_fgetxattr: ::c_long = __X32_SYSCALL_BIT + 193; +pub const SYS_listxattr: ::c_long = __X32_SYSCALL_BIT + 194; +pub const SYS_llistxattr: ::c_long = __X32_SYSCALL_BIT + 195; +pub const SYS_flistxattr: ::c_long = __X32_SYSCALL_BIT + 196; +pub const SYS_removexattr: ::c_long = __X32_SYSCALL_BIT + 197; +pub const SYS_lremovexattr: ::c_long = __X32_SYSCALL_BIT + 198; +pub const SYS_fremovexattr: ::c_long = __X32_SYSCALL_BIT + 199; +pub const SYS_tkill: ::c_long = __X32_SYSCALL_BIT + 200; +pub const SYS_time: ::c_long = __X32_SYSCALL_BIT + 201; +pub const SYS_futex: ::c_long = __X32_SYSCALL_BIT + 202; +pub const SYS_sched_setaffinity: ::c_long = __X32_SYSCALL_BIT + 203; +pub const SYS_sched_getaffinity: ::c_long = __X32_SYSCALL_BIT + 204; +pub const SYS_io_destroy: ::c_long = __X32_SYSCALL_BIT + 207; +pub const SYS_io_getevents: ::c_long = __X32_SYSCALL_BIT + 208; +pub const SYS_io_cancel: ::c_long = __X32_SYSCALL_BIT + 210; +pub const SYS_lookup_dcookie: ::c_long = __X32_SYSCALL_BIT + 212; +pub const SYS_epoll_create: ::c_long = __X32_SYSCALL_BIT + 213; +pub const SYS_remap_file_pages: ::c_long = __X32_SYSCALL_BIT + 216; +pub const SYS_getdents64: ::c_long = __X32_SYSCALL_BIT + 217; +pub const SYS_set_tid_address: ::c_long = __X32_SYSCALL_BIT + 218; +pub const SYS_restart_syscall: ::c_long = __X32_SYSCALL_BIT + 219; +pub const SYS_semtimedop: ::c_long = __X32_SYSCALL_BIT + 220; +pub const SYS_fadvise64: ::c_long = __X32_SYSCALL_BIT + 221; +pub const SYS_timer_settime: ::c_long = __X32_SYSCALL_BIT + 223; +pub const SYS_timer_gettime: ::c_long = __X32_SYSCALL_BIT + 224; +pub const SYS_timer_getoverrun: ::c_long = __X32_SYSCALL_BIT + 225; +pub const SYS_timer_delete: ::c_long = __X32_SYSCALL_BIT + 226; +pub const SYS_clock_settime: ::c_long = __X32_SYSCALL_BIT + 227; +pub const SYS_clock_gettime: ::c_long = __X32_SYSCALL_BIT + 228; +pub const SYS_clock_getres: ::c_long = __X32_SYSCALL_BIT + 229; +pub const SYS_clock_nanosleep: ::c_long = __X32_SYSCALL_BIT + 230; +pub const SYS_exit_group: ::c_long = __X32_SYSCALL_BIT + 231; +pub const SYS_epoll_wait: ::c_long = __X32_SYSCALL_BIT + 232; +pub const SYS_epoll_ctl: ::c_long = __X32_SYSCALL_BIT + 233; +pub const SYS_tgkill: ::c_long = __X32_SYSCALL_BIT + 234; +pub const SYS_utimes: ::c_long = __X32_SYSCALL_BIT + 235; +pub const SYS_mbind: ::c_long = __X32_SYSCALL_BIT + 237; +pub const SYS_set_mempolicy: ::c_long = __X32_SYSCALL_BIT + 238; +pub const SYS_get_mempolicy: ::c_long = __X32_SYSCALL_BIT + 239; +pub const SYS_mq_open: ::c_long = __X32_SYSCALL_BIT + 240; +pub const SYS_mq_unlink: ::c_long = __X32_SYSCALL_BIT + 241; +pub const SYS_mq_timedsend: ::c_long = __X32_SYSCALL_BIT + 242; +pub const SYS_mq_timedreceive: ::c_long = __X32_SYSCALL_BIT + 243; +pub const SYS_mq_getsetattr: ::c_long = __X32_SYSCALL_BIT + 245; +pub const SYS_add_key: ::c_long = __X32_SYSCALL_BIT + 248; +pub const SYS_request_key: ::c_long = __X32_SYSCALL_BIT + 249; +pub const SYS_keyctl: ::c_long = __X32_SYSCALL_BIT + 250; +pub const SYS_ioprio_set: ::c_long = __X32_SYSCALL_BIT + 251; +pub const SYS_ioprio_get: ::c_long = __X32_SYSCALL_BIT + 252; +pub const SYS_inotify_init: ::c_long = __X32_SYSCALL_BIT + 253; +pub const SYS_inotify_add_watch: ::c_long = __X32_SYSCALL_BIT + 254; +pub const SYS_inotify_rm_watch: ::c_long = __X32_SYSCALL_BIT + 255; +pub const SYS_migrate_pages: ::c_long = __X32_SYSCALL_BIT + 256; +pub const SYS_openat: ::c_long = __X32_SYSCALL_BIT + 257; +pub const SYS_mkdirat: ::c_long = __X32_SYSCALL_BIT + 258; +pub const SYS_mknodat: ::c_long = __X32_SYSCALL_BIT + 259; +pub const SYS_fchownat: ::c_long = __X32_SYSCALL_BIT + 260; +pub const SYS_futimesat: ::c_long = __X32_SYSCALL_BIT + 261; +pub const SYS_newfstatat: ::c_long = __X32_SYSCALL_BIT + 262; +pub const SYS_unlinkat: ::c_long = __X32_SYSCALL_BIT + 263; +pub const SYS_renameat: ::c_long = __X32_SYSCALL_BIT + 264; +pub const SYS_linkat: ::c_long = __X32_SYSCALL_BIT + 265; +pub const SYS_symlinkat: ::c_long = __X32_SYSCALL_BIT + 266; +pub const SYS_readlinkat: ::c_long = __X32_SYSCALL_BIT + 267; +pub const SYS_fchmodat: ::c_long = __X32_SYSCALL_BIT + 268; +pub const SYS_faccessat: ::c_long = __X32_SYSCALL_BIT + 269; +pub const SYS_pselect6: ::c_long = __X32_SYSCALL_BIT + 270; +pub const SYS_ppoll: ::c_long = __X32_SYSCALL_BIT + 271; +pub const SYS_unshare: ::c_long = __X32_SYSCALL_BIT + 272; +pub const SYS_splice: ::c_long = __X32_SYSCALL_BIT + 275; +pub const SYS_tee: ::c_long = __X32_SYSCALL_BIT + 276; +pub const SYS_sync_file_range: ::c_long = __X32_SYSCALL_BIT + 277; +pub const SYS_utimensat: ::c_long = __X32_SYSCALL_BIT + 280; +pub const SYS_epoll_pwait: ::c_long = __X32_SYSCALL_BIT + 281; +pub const SYS_signalfd: ::c_long = __X32_SYSCALL_BIT + 282; +pub const SYS_timerfd_create: ::c_long = __X32_SYSCALL_BIT + 283; +pub const SYS_eventfd: ::c_long = __X32_SYSCALL_BIT + 284; +pub const SYS_fallocate: ::c_long = __X32_SYSCALL_BIT + 285; +pub const SYS_timerfd_settime: ::c_long = __X32_SYSCALL_BIT + 286; +pub const SYS_timerfd_gettime: ::c_long = __X32_SYSCALL_BIT + 287; +pub const SYS_accept4: ::c_long = __X32_SYSCALL_BIT + 288; +pub const SYS_signalfd4: ::c_long = __X32_SYSCALL_BIT + 289; +pub const SYS_eventfd2: ::c_long = __X32_SYSCALL_BIT + 290; +pub const SYS_epoll_create1: ::c_long = __X32_SYSCALL_BIT + 291; +pub const SYS_dup3: ::c_long = __X32_SYSCALL_BIT + 292; +pub const SYS_pipe2: ::c_long = __X32_SYSCALL_BIT + 293; +pub const SYS_inotify_init1: ::c_long = __X32_SYSCALL_BIT + 294; +pub const SYS_perf_event_open: ::c_long = __X32_SYSCALL_BIT + 298; +pub const SYS_fanotify_init: ::c_long = __X32_SYSCALL_BIT + 300; +pub const SYS_fanotify_mark: ::c_long = __X32_SYSCALL_BIT + 301; +pub const SYS_prlimit64: ::c_long = __X32_SYSCALL_BIT + 302; +pub const SYS_name_to_handle_at: ::c_long = __X32_SYSCALL_BIT + 303; +pub const SYS_open_by_handle_at: ::c_long = __X32_SYSCALL_BIT + 304; +pub const SYS_clock_adjtime: ::c_long = __X32_SYSCALL_BIT + 305; +pub const SYS_syncfs: ::c_long = __X32_SYSCALL_BIT + 306; +pub const SYS_setns: ::c_long = __X32_SYSCALL_BIT + 308; +pub const SYS_getcpu: ::c_long = __X32_SYSCALL_BIT + 309; +pub const SYS_kcmp: ::c_long = __X32_SYSCALL_BIT + 312; +pub const SYS_finit_module: ::c_long = __X32_SYSCALL_BIT + 313; +pub const SYS_sched_setattr: ::c_long = __X32_SYSCALL_BIT + 314; +pub const SYS_sched_getattr: ::c_long = __X32_SYSCALL_BIT + 315; +pub const SYS_renameat2: ::c_long = __X32_SYSCALL_BIT + 316; +pub const SYS_seccomp: ::c_long = __X32_SYSCALL_BIT + 317; +pub const SYS_getrandom: ::c_long = __X32_SYSCALL_BIT + 318; +pub const SYS_memfd_create: ::c_long = __X32_SYSCALL_BIT + 319; +pub const SYS_kexec_file_load: ::c_long = __X32_SYSCALL_BIT + 320; +pub const SYS_bpf: ::c_long = __X32_SYSCALL_BIT + 321; +pub const SYS_userfaultfd: ::c_long = __X32_SYSCALL_BIT + 323; +pub const SYS_membarrier: ::c_long = __X32_SYSCALL_BIT + 324; +pub const SYS_mlock2: ::c_long = __X32_SYSCALL_BIT + 325; +pub const SYS_copy_file_range: ::c_long = __X32_SYSCALL_BIT + 326; +pub const SYS_pkey_mprotect: ::c_long = __X32_SYSCALL_BIT + 329; +pub const SYS_pkey_alloc: ::c_long = __X32_SYSCALL_BIT + 330; +pub const SYS_pkey_free: ::c_long = __X32_SYSCALL_BIT + 331; +pub const SYS_statx: ::c_long = __X32_SYSCALL_BIT + 332; +pub const SYS_rseq: ::c_long = __X32_SYSCALL_BIT + 334; +pub const SYS_pidfd_send_signal: ::c_long = __X32_SYSCALL_BIT + 424; +pub const SYS_io_uring_setup: ::c_long = __X32_SYSCALL_BIT + 425; +pub const SYS_io_uring_enter: ::c_long = __X32_SYSCALL_BIT + 426; +pub const SYS_io_uring_register: ::c_long = __X32_SYSCALL_BIT + 427; +pub const SYS_open_tree: ::c_long = __X32_SYSCALL_BIT + 428; +pub const SYS_move_mount: ::c_long = __X32_SYSCALL_BIT + 429; +pub const SYS_fsopen: ::c_long = __X32_SYSCALL_BIT + 430; +pub const SYS_fsconfig: ::c_long = __X32_SYSCALL_BIT + 431; +pub const SYS_fsmount: ::c_long = __X32_SYSCALL_BIT + 432; +pub const SYS_fspick: ::c_long = __X32_SYSCALL_BIT + 433; +pub const SYS_pidfd_open: ::c_long = __X32_SYSCALL_BIT + 434; +pub const SYS_clone3: ::c_long = __X32_SYSCALL_BIT + 435; +pub const SYS_close_range: ::c_long = __X32_SYSCALL_BIT + 436; +pub const SYS_openat2: ::c_long = __X32_SYSCALL_BIT + 437; +pub const SYS_pidfd_getfd: ::c_long = __X32_SYSCALL_BIT + 438; +pub const SYS_faccessat2: ::c_long = __X32_SYSCALL_BIT + 439; +pub const SYS_process_madvise: ::c_long = __X32_SYSCALL_BIT + 440; +pub const SYS_epoll_pwait2: ::c_long = __X32_SYSCALL_BIT + 441; +pub const SYS_mount_setattr: ::c_long = __X32_SYSCALL_BIT + 442; +pub const SYS_quotactl_fd: ::c_long = __X32_SYSCALL_BIT + 443; +pub const SYS_landlock_create_ruleset: ::c_long = __X32_SYSCALL_BIT + 444; +pub const SYS_landlock_add_rule: ::c_long = __X32_SYSCALL_BIT + 445; +pub const SYS_landlock_restrict_self: ::c_long = __X32_SYSCALL_BIT + 446; +pub const SYS_memfd_secret: ::c_long = __X32_SYSCALL_BIT + 447; +pub const SYS_process_mrelease: ::c_long = __X32_SYSCALL_BIT + 448; +pub const SYS_futex_waitv: ::c_long = __X32_SYSCALL_BIT + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = __X32_SYSCALL_BIT + 450; +pub const SYS_rt_sigaction: ::c_long = __X32_SYSCALL_BIT + 512; +pub const SYS_rt_sigreturn: ::c_long = __X32_SYSCALL_BIT + 513; +pub const SYS_ioctl: ::c_long = __X32_SYSCALL_BIT + 514; +pub const SYS_readv: ::c_long = __X32_SYSCALL_BIT + 515; +pub const SYS_writev: ::c_long = __X32_SYSCALL_BIT + 516; +pub const SYS_recvfrom: ::c_long = __X32_SYSCALL_BIT + 517; +pub const SYS_sendmsg: ::c_long = __X32_SYSCALL_BIT + 518; +pub const SYS_recvmsg: ::c_long = __X32_SYSCALL_BIT + 519; +pub const SYS_execve: ::c_long = __X32_SYSCALL_BIT + 520; +pub const SYS_ptrace: ::c_long = __X32_SYSCALL_BIT + 521; +pub const SYS_rt_sigpending: ::c_long = __X32_SYSCALL_BIT + 522; +pub const SYS_rt_sigtimedwait: ::c_long = __X32_SYSCALL_BIT + 523; +pub const SYS_rt_sigqueueinfo: ::c_long = __X32_SYSCALL_BIT + 524; +pub const SYS_sigaltstack: ::c_long = __X32_SYSCALL_BIT + 525; +pub const SYS_timer_create: ::c_long = __X32_SYSCALL_BIT + 526; +pub const SYS_mq_notify: ::c_long = __X32_SYSCALL_BIT + 527; +pub const SYS_kexec_load: ::c_long = __X32_SYSCALL_BIT + 528; +pub const SYS_waitid: ::c_long = __X32_SYSCALL_BIT + 529; +pub const SYS_set_robust_list: ::c_long = __X32_SYSCALL_BIT + 530; +pub const SYS_get_robust_list: ::c_long = __X32_SYSCALL_BIT + 531; +pub const SYS_vmsplice: ::c_long = __X32_SYSCALL_BIT + 532; +pub const SYS_move_pages: ::c_long = __X32_SYSCALL_BIT + 533; +pub const SYS_preadv: ::c_long = __X32_SYSCALL_BIT + 534; +pub const SYS_pwritev: ::c_long = __X32_SYSCALL_BIT + 535; +pub const SYS_rt_tgsigqueueinfo: ::c_long = __X32_SYSCALL_BIT + 536; +pub const SYS_recvmmsg: ::c_long = __X32_SYSCALL_BIT + 537; +pub const SYS_sendmmsg: ::c_long = __X32_SYSCALL_BIT + 538; +pub const SYS_process_vm_readv: ::c_long = __X32_SYSCALL_BIT + 539; +pub const SYS_process_vm_writev: ::c_long = __X32_SYSCALL_BIT + 540; +pub const SYS_setsockopt: ::c_long = __X32_SYSCALL_BIT + 541; +pub const SYS_getsockopt: ::c_long = __X32_SYSCALL_BIT + 542; +pub const SYS_io_setup: ::c_long = __X32_SYSCALL_BIT + 543; +pub const SYS_io_submit: ::c_long = __X32_SYSCALL_BIT + 544; +pub const SYS_execveat: ::c_long = __X32_SYSCALL_BIT + 545; +pub const SYS_preadv2: ::c_long = __X32_SYSCALL_BIT + 546; +pub const SYS_pwritev2: ::c_long = __X32_SYSCALL_BIT + 547; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs new file mode 100644 index 0000000..ba4664b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs @@ -0,0 +1,1410 @@ +pub type pthread_t = c_ulong; +pub type __priority_which_t = ::c_uint; +pub type __rlimit_resource_t = ::c_uint; +pub type Lmid_t = ::c_long; +pub type regoff_t = ::c_int; + +cfg_if! { + if #[cfg(doc)] { + // Used in `linux::arch` to define ioctl constants. + pub(crate) type Ioctl = ::c_ulong; + } else { + #[doc(hidden)] + pub type Ioctl = ::c_ulong; + } +} + +s! { + pub struct statx { + pub stx_mask: u32, + pub stx_blksize: u32, + pub stx_attributes: u64, + pub stx_nlink: u32, + pub stx_uid: u32, + pub stx_gid: u32, + pub stx_mode: u16, + __statx_pad1: [u16; 1], + pub stx_ino: u64, + pub stx_size: u64, + pub stx_blocks: u64, + pub stx_attributes_mask: u64, + pub stx_atime: ::statx_timestamp, + pub stx_btime: ::statx_timestamp, + pub stx_ctime: ::statx_timestamp, + pub stx_mtime: ::statx_timestamp, + pub stx_rdev_major: u32, + pub stx_rdev_minor: u32, + pub stx_dev_major: u32, + pub stx_dev_minor: u32, + pub stx_mnt_id: u64, + pub stx_dio_mem_align: u32, + pub stx_dio_offset_align: u32, + __statx_pad3: [u64; 12], + } + + pub struct statx_timestamp { + pub tv_sec: i64, + pub tv_nsec: u32, + pub __statx_timestamp_pad1: [i32; 1], + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __next_prio: *mut aiocb, + __abs_prio: ::c_int, + __policy: ::c_int, + __error_code: ::c_int, + __return_value: ::ssize_t, + pub aio_offset: off_t, + #[cfg(all(not(target_arch = "x86_64"), target_pointer_width = "32"))] + __unused1: [::c_char; 4], + __glibc_reserved: [::c_char; 32] + } + + pub struct __exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct __timeval { + pub tv_sec: i32, + pub tv_usec: i32, + } + + pub struct glob64_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + #[cfg(not(any( + target_arch = "sparc", + target_arch = "sparc64", + target_arch = "mips", + target_arch = "mips64")))] + pub c_ispeed: ::speed_t, + #[cfg(not(any( + target_arch = "sparc", + target_arch = "sparc64", + target_arch = "mips", + target_arch = "mips64")))] + pub c_ospeed: ::speed_t, + } + + pub struct mallinfo { + pub arena: ::c_int, + pub ordblks: ::c_int, + pub smblks: ::c_int, + pub hblks: ::c_int, + pub hblkhd: ::c_int, + pub usmblks: ::c_int, + pub fsmblks: ::c_int, + pub uordblks: ::c_int, + pub fordblks: ::c_int, + pub keepcost: ::c_int, + } + + pub struct mallinfo2 { + pub arena: ::size_t, + pub ordblks: ::size_t, + pub smblks: ::size_t, + pub hblks: ::size_t, + pub hblkhd: ::size_t, + pub usmblks: ::size_t, + pub fsmblks: ::size_t, + pub uordblks: ::size_t, + pub fordblks: ::size_t, + pub keepcost: ::size_t, + } + + pub struct nl_pktinfo { + pub group: u32, + } + + pub struct nl_mmap_req { + pub nm_block_size: ::c_uint, + pub nm_block_nr: ::c_uint, + pub nm_frame_size: ::c_uint, + pub nm_frame_nr: ::c_uint, + } + + pub struct nl_mmap_hdr { + pub nm_status: ::c_uint, + pub nm_len: ::c_uint, + pub nm_group: u32, + pub nm_pid: u32, + pub nm_uid: u32, + pub nm_gid: u32, + } + + pub struct rtentry { + pub rt_pad1: ::c_ulong, + pub rt_dst: ::sockaddr, + pub rt_gateway: ::sockaddr, + pub rt_genmask: ::sockaddr, + pub rt_flags: ::c_ushort, + pub rt_pad2: ::c_short, + pub rt_pad3: ::c_ulong, + pub rt_tos: ::c_uchar, + pub rt_class: ::c_uchar, + #[cfg(target_pointer_width = "64")] + pub rt_pad4: [::c_short; 3usize], + #[cfg(not(target_pointer_width = "64"))] + pub rt_pad4: ::c_short, + pub rt_metric: ::c_short, + pub rt_dev: *mut ::c_char, + pub rt_mtu: ::c_ulong, + pub rt_window: ::c_ulong, + pub rt_irtt: ::c_ushort, + } + + pub struct timex { + pub modes: ::c_uint, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub offset: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub offset: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub freq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub freq: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub maxerror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub maxerror: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub esterror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub esterror: ::c_long, + pub status: ::c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub constant: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub constant: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub precision: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub precision: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tolerance: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tolerance: ::c_long, + pub time: ::timeval, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tick: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tick: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub ppsfreq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub ppsfreq: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitter: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitter: ::c_long, + pub shift: ::c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stabil: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stabil: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitcnt: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub calcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub calcnt: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub errcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub errcnt: ::c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stbcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stbcnt: ::c_long, + pub tai: ::c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } + + pub struct ntptimeval { + pub time: ::timeval, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub tai: ::c_long, + pub __glibc_reserved1: ::c_long, + pub __glibc_reserved2: ::c_long, + pub __glibc_reserved3: ::c_long, + pub __glibc_reserved4: ::c_long, + } + + pub struct regex_t { + __buffer: *mut ::c_void, + __allocated: ::size_t, + __used: ::size_t, + __syntax: ::c_ulong, + __fastmap: *mut ::c_char, + __translate: *mut ::c_char, + __re_nsub: ::size_t, + __bitfield: u8, + } + + pub struct Elf64_Chdr { + pub ch_type: ::Elf64_Word, + pub ch_reserved: ::Elf64_Word, + pub ch_size: ::Elf64_Xword, + pub ch_addralign: ::Elf64_Xword, + } + + pub struct Elf32_Chdr { + pub ch_type: ::Elf32_Word, + pub ch_size: ::Elf32_Word, + pub ch_addralign: ::Elf32_Word, + } + + pub struct seminfo { + pub semmap: ::c_int, + pub semmni: ::c_int, + pub semmns: ::c_int, + pub semmnu: ::c_int, + pub semmsl: ::c_int, + pub semopm: ::c_int, + pub semume: ::c_int, + pub semusz: ::c_int, + pub semvmx: ::c_int, + pub semaem: ::c_int, + } + + pub struct ptrace_peeksiginfo_args { + pub off: ::__u64, + pub flags: ::__u32, + pub nr: ::__s32, + } + + pub struct __c_anonymous_ptrace_syscall_info_entry { + pub nr: ::__u64, + pub args: [::__u64; 6], + } + + pub struct __c_anonymous_ptrace_syscall_info_exit { + pub sval: ::__s64, + pub is_error: ::__u8, + } + + pub struct __c_anonymous_ptrace_syscall_info_seccomp { + pub nr: ::__u64, + pub args: [::__u64; 6], + pub ret_data: ::__u32, + } + + pub struct ptrace_syscall_info { + pub op: ::__u8, + pub pad: [::__u8; 3], + pub arch: ::__u32, + pub instruction_pointer: ::__u64, + pub stack_pointer: ::__u64, + #[cfg(libc_union)] + pub u: __c_anonymous_ptrace_syscall_info_data, + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_sigfault { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_timer { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _si_tid: ::c_int, + _si_overrun: ::c_int, + si_sigval: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval + } +} + +cfg_if! { + if #[cfg(libc_union)] { + // Internal, for casts to access union fields + #[repr(C)] + struct sifields_sigchld { + si_pid: ::pid_t, + si_uid: ::uid_t, + si_status: ::c_int, + si_utime: ::c_long, + si_stime: ::c_long, + } + impl ::Copy for sifields_sigchld {} + impl ::Clone for sifields_sigchld { + fn clone(&self) -> sifields_sigchld { + *self + } + } + + // Internal, for casts to access union fields + #[repr(C)] + union sifields { + _align_pointer: *mut ::c_void, + sigchld: sifields_sigchld, + } + + // Internal, for casts to access union fields. Note that some variants + // of sifields start with a pointer, which makes the alignment of + // sifields vary on 32-bit and 64-bit architectures. + #[repr(C)] + struct siginfo_f { + _siginfo_base: [::c_int; 3], + sifields: sifields, + } + + impl siginfo_t { + unsafe fn sifields(&self) -> &sifields { + &(*(self as *const siginfo_t as *const siginfo_f)).sifields + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.sifields().sigchld.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.sifields().sigchld.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.sifields().sigchld.si_status + } + + pub unsafe fn si_utime(&self) -> ::c_long { + self.sifields().sigchld.si_utime + } + + pub unsafe fn si_stime(&self) -> ::c_long { + self.sifields().sigchld.si_stime + } + } + + pub union __c_anonymous_ptrace_syscall_info_data { + pub entry: __c_anonymous_ptrace_syscall_info_entry, + pub exit: __c_anonymous_ptrace_syscall_info_exit, + pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp, + } + impl ::Copy for __c_anonymous_ptrace_syscall_info_data {} + impl ::Clone for __c_anonymous_ptrace_syscall_info_data { + fn clone(&self) -> __c_anonymous_ptrace_syscall_info_data { + *self + } + } + } +} + +s_no_extra_traits! { + pub struct utmpx { + pub ut_type: ::c_short, + pub ut_pid: ::pid_t, + pub ut_line: [::c_char; __UT_LINESIZE], + pub ut_id: [::c_char; 4], + + pub ut_user: [::c_char; __UT_NAMESIZE], + pub ut_host: [::c_char; __UT_HOSTSIZE], + pub ut_exit: __exit_status, + + #[cfg(any(target_arch = "aarch64", + target_arch = "s390x", + target_arch = "loongarch64", + all(target_pointer_width = "32", + not(target_arch = "x86_64"))))] + pub ut_session: ::c_long, + #[cfg(any(target_arch = "aarch64", + target_arch = "s390x", + target_arch = "loongarch64", + all(target_pointer_width = "32", + not(target_arch = "x86_64"))))] + pub ut_tv: ::timeval, + + #[cfg(not(any(target_arch = "aarch64", + target_arch = "s390x", + target_arch = "loongarch64", + all(target_pointer_width = "32", + not(target_arch = "x86_64")))))] + pub ut_session: i32, + #[cfg(not(any(target_arch = "aarch64", + target_arch = "s390x", + target_arch = "loongarch64", + all(target_pointer_width = "32", + not(target_arch = "x86_64")))))] + pub ut_tv: __timeval, + + pub ut_addr_v6: [i32; 4], + __glibc_reserved: [::c_char; 20], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_user == other.ut_user + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_addr_v6 == other.ut_addr_v6 + && self.__glibc_reserved == other.__glibc_reserved + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_type", &self.ut_type) + .field("ut_pid", &self.ut_pid) + .field("ut_line", &self.ut_line) + .field("ut_id", &self.ut_id) + .field("ut_user", &self.ut_user) + // FIXME: .field("ut_host", &self.ut_host) + .field("ut_exit", &self.ut_exit) + .field("ut_session", &self.ut_session) + .field("ut_tv", &self.ut_tv) + .field("ut_addr_v6", &self.ut_addr_v6) + .field("__glibc_reserved", &self.__glibc_reserved) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_user.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_addr_v6.hash(state); + self.__glibc_reserved.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_ptrace_syscall_info_data { + fn eq(&self, other: &__c_anonymous_ptrace_syscall_info_data) -> bool { + unsafe { + self.entry == other.entry || + self.exit == other.exit || + self.seccomp == other.seccomp + } + } + } + + #[cfg(libc_union)] + impl Eq for __c_anonymous_ptrace_syscall_info_data {} + + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ptrace_syscall_info_data { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous_ptrace_syscall_info_data") + .field("entry", &self.entry) + .field("exit", &self.exit) + .field("seccomp", &self.seccomp) + .finish() + } + } + } + + #[cfg(libc_union)] + impl ::hash::Hash for __c_anonymous_ptrace_syscall_info_data { + fn hash(&self, state: &mut H) { + unsafe { + self.entry.hash(state); + self.exit.hash(state); + self.seccomp.hash(state); + } + } + } + } +} + +// include/uapi/asm-generic/hugetlb_encode.h +pub const HUGETLB_FLAG_ENCODE_SHIFT: ::c_int = 26; +pub const HUGETLB_FLAG_ENCODE_MASK: ::c_int = 0x3f; + +pub const HUGETLB_FLAG_ENCODE_64KB: ::c_int = 16 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_512KB: ::c_int = 19 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_1MB: ::c_int = 20 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_2MB: ::c_int = 21 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_8MB: ::c_int = 23 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_16MB: ::c_int = 24 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_32MB: ::c_int = 25 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_256MB: ::c_int = 28 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_512MB: ::c_int = 29 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_1GB: ::c_int = 30 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_2GB: ::c_int = 31 << HUGETLB_FLAG_ENCODE_SHIFT; +pub const HUGETLB_FLAG_ENCODE_16GB: ::c_int = 34 << HUGETLB_FLAG_ENCODE_SHIFT; + +// include/uapi/linux/mman.h +/* + * Huge page size encoding when MAP_HUGETLB is specified, and a huge page + * size other than the default is desired. See hugetlb_encode.h. + * All known huge page size encodings are provided here. It is the + * responsibility of the application to know which sizes are supported on + * the running system. See mmap(2) man page for details. + */ +pub const MAP_HUGE_SHIFT: ::c_int = HUGETLB_FLAG_ENCODE_SHIFT; +pub const MAP_HUGE_MASK: ::c_int = HUGETLB_FLAG_ENCODE_MASK; + +pub const MAP_HUGE_64KB: ::c_int = HUGETLB_FLAG_ENCODE_64KB; +pub const MAP_HUGE_512KB: ::c_int = HUGETLB_FLAG_ENCODE_512KB; +pub const MAP_HUGE_1MB: ::c_int = HUGETLB_FLAG_ENCODE_1MB; +pub const MAP_HUGE_2MB: ::c_int = HUGETLB_FLAG_ENCODE_2MB; +pub const MAP_HUGE_8MB: ::c_int = HUGETLB_FLAG_ENCODE_8MB; +pub const MAP_HUGE_16MB: ::c_int = HUGETLB_FLAG_ENCODE_16MB; +pub const MAP_HUGE_32MB: ::c_int = HUGETLB_FLAG_ENCODE_32MB; +pub const MAP_HUGE_256MB: ::c_int = HUGETLB_FLAG_ENCODE_256MB; +pub const MAP_HUGE_512MB: ::c_int = HUGETLB_FLAG_ENCODE_512MB; +pub const MAP_HUGE_1GB: ::c_int = HUGETLB_FLAG_ENCODE_1GB; +pub const MAP_HUGE_2GB: ::c_int = HUGETLB_FLAG_ENCODE_2GB; +pub const MAP_HUGE_16GB: ::c_int = HUGETLB_FLAG_ENCODE_16GB; + +pub const PRIO_PROCESS: ::__priority_which_t = 0; +pub const PRIO_PGRP: ::__priority_which_t = 1; +pub const PRIO_USER: ::__priority_which_t = 2; + +pub const MS_RMT_MASK: ::c_ulong = 0x02800051; + +pub const __UT_LINESIZE: usize = 32; +pub const __UT_NAMESIZE: usize = 32; +pub const __UT_HOSTSIZE: usize = 256; +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 3; +pub const OLD_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; + +// dlfcn.h +pub const LM_ID_BASE: ::c_long = 0; +pub const LM_ID_NEWLM: ::c_long = -1; + +pub const RTLD_DI_LMID: ::c_int = 1; +pub const RTLD_DI_LINKMAP: ::c_int = 2; +pub const RTLD_DI_CONFIGADDR: ::c_int = 3; +pub const RTLD_DI_SERINFO: ::c_int = 4; +pub const RTLD_DI_SERINFOSIZE: ::c_int = 5; +pub const RTLD_DI_ORIGIN: ::c_int = 6; +pub const RTLD_DI_PROFILENAME: ::c_int = 7; +pub const RTLD_DI_PROFILEOUT: ::c_int = 8; +pub const RTLD_DI_TLS_MODID: ::c_int = 9; +pub const RTLD_DI_TLS_DATA: ::c_int = 10; + +pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK; +pub const PIDFD_NONBLOCK: ::c_uint = O_NONBLOCK as ::c_uint; + +pub const SOL_RXRPC: ::c_int = 272; +pub const SOL_PPPOL2TP: ::c_int = 273; +pub const SOL_PNPIPE: ::c_int = 275; +pub const SOL_RDS: ::c_int = 276; +pub const SOL_IUCV: ::c_int = 277; +pub const SOL_CAIF: ::c_int = 278; +pub const SOL_NFC: ::c_int = 280; +pub const SOL_XDP: ::c_int = 283; + +pub const MSG_TRYHARD: ::c_int = 4; + +pub const LC_PAPER: ::c_int = 7; +pub const LC_NAME: ::c_int = 8; +pub const LC_ADDRESS: ::c_int = 9; +pub const LC_TELEPHONE: ::c_int = 10; +pub const LC_MEASUREMENT: ::c_int = 11; +pub const LC_IDENTIFICATION: ::c_int = 12; +pub const LC_PAPER_MASK: ::c_int = 1 << LC_PAPER; +pub const LC_NAME_MASK: ::c_int = 1 << LC_NAME; +pub const LC_ADDRESS_MASK: ::c_int = 1 << LC_ADDRESS; +pub const LC_TELEPHONE_MASK: ::c_int = 1 << LC_TELEPHONE; +pub const LC_MEASUREMENT_MASK: ::c_int = 1 << LC_MEASUREMENT; +pub const LC_IDENTIFICATION_MASK: ::c_int = 1 << LC_IDENTIFICATION; +pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK + | ::LC_NUMERIC_MASK + | ::LC_TIME_MASK + | ::LC_COLLATE_MASK + | ::LC_MONETARY_MASK + | ::LC_MESSAGES_MASK + | LC_PAPER_MASK + | LC_NAME_MASK + | LC_ADDRESS_MASK + | LC_TELEPHONE_MASK + | LC_MEASUREMENT_MASK + | LC_IDENTIFICATION_MASK; + +pub const ENOTSUP: ::c_int = EOPNOTSUPP; + +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_DCCP: ::c_int = 6; +pub const SOCK_PACKET: ::c_int = 10; + +pub const FAN_MARK_INODE: ::c_uint = 0x0000_0000; +pub const FAN_MARK_MOUNT: ::c_uint = 0x0000_0010; +// NOTE: FAN_MARK_FILESYSTEM requires Linux Kernel >= 4.20.0 +pub const FAN_MARK_FILESYSTEM: ::c_uint = 0x0000_0100; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const AF_XDP: ::c_int = 44; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; +pub const PF_XDP: ::c_int = AF_XDP; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const BUFSIZ: ::c_uint = 8192; +pub const TMP_MAX: ::c_uint = 238328; +pub const FOPEN_MAX: ::c_uint = 16; +pub const FILENAME_MAX: ::c_uint = 4096; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const _SC_EQUIV_CLASS_MAX: ::c_int = 41; +pub const _SC_CHARCLASS_NAME_MAX: ::c_int = 45; +pub const _SC_PII: ::c_int = 53; +pub const _SC_PII_XTI: ::c_int = 54; +pub const _SC_PII_SOCKET: ::c_int = 55; +pub const _SC_PII_INTERNET: ::c_int = 56; +pub const _SC_PII_OSI: ::c_int = 57; +pub const _SC_POLL: ::c_int = 58; +pub const _SC_SELECT: ::c_int = 59; +pub const _SC_PII_INTERNET_STREAM: ::c_int = 61; +pub const _SC_PII_INTERNET_DGRAM: ::c_int = 62; +pub const _SC_PII_OSI_COTS: ::c_int = 63; +pub const _SC_PII_OSI_CLTS: ::c_int = 64; +pub const _SC_PII_OSI_M: ::c_int = 65; +pub const _SC_T_IOV_MAX: ::c_int = 66; +pub const _SC_2_C_VERSION: ::c_int = 96; +pub const _SC_CHAR_BIT: ::c_int = 101; +pub const _SC_CHAR_MAX: ::c_int = 102; +pub const _SC_CHAR_MIN: ::c_int = 103; +pub const _SC_INT_MAX: ::c_int = 104; +pub const _SC_INT_MIN: ::c_int = 105; +pub const _SC_LONG_BIT: ::c_int = 106; +pub const _SC_WORD_BIT: ::c_int = 107; +pub const _SC_MB_LEN_MAX: ::c_int = 108; +pub const _SC_SSIZE_MAX: ::c_int = 110; +pub const _SC_SCHAR_MAX: ::c_int = 111; +pub const _SC_SCHAR_MIN: ::c_int = 112; +pub const _SC_SHRT_MAX: ::c_int = 113; +pub const _SC_SHRT_MIN: ::c_int = 114; +pub const _SC_UCHAR_MAX: ::c_int = 115; +pub const _SC_UINT_MAX: ::c_int = 116; +pub const _SC_ULONG_MAX: ::c_int = 117; +pub const _SC_USHRT_MAX: ::c_int = 118; +pub const _SC_NL_ARGMAX: ::c_int = 119; +pub const _SC_NL_LANGMAX: ::c_int = 120; +pub const _SC_NL_MSGMAX: ::c_int = 121; +pub const _SC_NL_NMAX: ::c_int = 122; +pub const _SC_NL_SETMAX: ::c_int = 123; +pub const _SC_NL_TEXTMAX: ::c_int = 124; +pub const _SC_BASE: ::c_int = 134; +pub const _SC_C_LANG_SUPPORT: ::c_int = 135; +pub const _SC_C_LANG_SUPPORT_R: ::c_int = 136; +pub const _SC_DEVICE_IO: ::c_int = 140; +pub const _SC_DEVICE_SPECIFIC: ::c_int = 141; +pub const _SC_DEVICE_SPECIFIC_R: ::c_int = 142; +pub const _SC_FD_MGMT: ::c_int = 143; +pub const _SC_FIFO: ::c_int = 144; +pub const _SC_PIPE: ::c_int = 145; +pub const _SC_FILE_ATTRIBUTES: ::c_int = 146; +pub const _SC_FILE_LOCKING: ::c_int = 147; +pub const _SC_FILE_SYSTEM: ::c_int = 148; +pub const _SC_MULTI_PROCESS: ::c_int = 150; +pub const _SC_SINGLE_PROCESS: ::c_int = 151; +pub const _SC_NETWORKING: ::c_int = 152; +pub const _SC_REGEX_VERSION: ::c_int = 156; +pub const _SC_SIGNALS: ::c_int = 158; +pub const _SC_SYSTEM_DATABASE: ::c_int = 162; +pub const _SC_SYSTEM_DATABASE_R: ::c_int = 163; +pub const _SC_USER_GROUPS: ::c_int = 166; +pub const _SC_USER_GROUPS_R: ::c_int = 167; +pub const _SC_LEVEL1_ICACHE_SIZE: ::c_int = 185; +pub const _SC_LEVEL1_ICACHE_ASSOC: ::c_int = 186; +pub const _SC_LEVEL1_ICACHE_LINESIZE: ::c_int = 187; +pub const _SC_LEVEL1_DCACHE_SIZE: ::c_int = 188; +pub const _SC_LEVEL1_DCACHE_ASSOC: ::c_int = 189; +pub const _SC_LEVEL1_DCACHE_LINESIZE: ::c_int = 190; +pub const _SC_LEVEL2_CACHE_SIZE: ::c_int = 191; +pub const _SC_LEVEL2_CACHE_ASSOC: ::c_int = 192; +pub const _SC_LEVEL2_CACHE_LINESIZE: ::c_int = 193; +pub const _SC_LEVEL3_CACHE_SIZE: ::c_int = 194; +pub const _SC_LEVEL3_CACHE_ASSOC: ::c_int = 195; +pub const _SC_LEVEL3_CACHE_LINESIZE: ::c_int = 196; +pub const _SC_LEVEL4_CACHE_SIZE: ::c_int = 197; +pub const _SC_LEVEL4_CACHE_ASSOC: ::c_int = 198; +pub const _SC_LEVEL4_CACHE_LINESIZE: ::c_int = 199; +pub const O_ACCMODE: ::c_int = 3; +pub const ST_RELATIME: ::c_ulong = 4096; +pub const NI_MAXHOST: ::socklen_t = 1025; + +// Most `*_SUPER_MAGIC` constants are defined at the `linux_like` level; the +// following are only available on newer Linux versions than the versions +// currently used in CI in some configurations, so we define them here. +cfg_if! { + if #[cfg(not(target_arch = "s390x"))] { + pub const BINDERFS_SUPER_MAGIC: ::c_long = 0x6c6f6f70; + pub const XFS_SUPER_MAGIC: ::c_long = 0x58465342; + } else if #[cfg(target_arch = "s390x")] { + pub const BINDERFS_SUPER_MAGIC: ::c_uint = 0x6c6f6f70; + pub const XFS_SUPER_MAGIC: ::c_uint = 0x58465342; + } +} + +pub const CPU_SETSIZE: ::c_int = 0x400; + +pub const PTRACE_TRACEME: ::c_uint = 0; +pub const PTRACE_PEEKTEXT: ::c_uint = 1; +pub const PTRACE_PEEKDATA: ::c_uint = 2; +pub const PTRACE_PEEKUSER: ::c_uint = 3; +pub const PTRACE_POKETEXT: ::c_uint = 4; +pub const PTRACE_POKEDATA: ::c_uint = 5; +pub const PTRACE_POKEUSER: ::c_uint = 6; +pub const PTRACE_CONT: ::c_uint = 7; +pub const PTRACE_KILL: ::c_uint = 8; +pub const PTRACE_SINGLESTEP: ::c_uint = 9; +pub const PTRACE_ATTACH: ::c_uint = 16; +pub const PTRACE_SYSCALL: ::c_uint = 24; +pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; +pub const PTRACE_GETREGSET: ::c_uint = 0x4204; +pub const PTRACE_SETREGSET: ::c_uint = 0x4205; +pub const PTRACE_SEIZE: ::c_uint = 0x4206; +pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; +pub const PTRACE_LISTEN: ::c_uint = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; +pub const PTRACE_GET_SYSCALL_INFO: ::c_uint = 0x420e; +pub const PTRACE_SYSCALL_INFO_NONE: ::__u8 = 0; +pub const PTRACE_SYSCALL_INFO_ENTRY: ::__u8 = 1; +pub const PTRACE_SYSCALL_INFO_EXIT: ::__u8 = 2; +pub const PTRACE_SYSCALL_INFO_SECCOMP: ::__u8 = 3; + +// linux/fs.h + +// Flags for preadv2/pwritev2 +pub const RWF_HIPRI: ::c_int = 0x00000001; +pub const RWF_DSYNC: ::c_int = 0x00000002; +pub const RWF_SYNC: ::c_int = 0x00000004; +pub const RWF_NOWAIT: ::c_int = 0x00000008; +pub const RWF_APPEND: ::c_int = 0x00000010; + +// linux/rtnetlink.h +pub const TCA_PAD: ::c_ushort = 9; +pub const TCA_DUMP_INVISIBLE: ::c_ushort = 10; +pub const TCA_CHAIN: ::c_ushort = 11; +pub const TCA_HW_OFFLOAD: ::c_ushort = 12; + +pub const RTM_DELNETCONF: u16 = 81; +pub const RTM_NEWSTATS: u16 = 92; +pub const RTM_GETSTATS: u16 = 94; +pub const RTM_NEWCACHEREPORT: u16 = 96; + +pub const RTM_F_LOOKUP_TABLE: ::c_uint = 0x1000; +pub const RTM_F_FIB_MATCH: ::c_uint = 0x2000; + +pub const RTA_VIA: ::c_ushort = 18; +pub const RTA_NEWDST: ::c_ushort = 19; +pub const RTA_PREF: ::c_ushort = 20; +pub const RTA_ENCAP_TYPE: ::c_ushort = 21; +pub const RTA_ENCAP: ::c_ushort = 22; +pub const RTA_EXPIRES: ::c_ushort = 23; +pub const RTA_PAD: ::c_ushort = 24; +pub const RTA_UID: ::c_ushort = 25; +pub const RTA_TTL_PROPAGATE: ::c_ushort = 26; + +// linux/neighbor.h +pub const NTF_EXT_LEARNED: u8 = 0x10; +pub const NTF_OFFLOADED: u8 = 0x20; + +pub const NDA_MASTER: ::c_ushort = 9; +pub const NDA_LINK_NETNSID: ::c_ushort = 10; +pub const NDA_SRC_VNI: ::c_ushort = 11; + +// linux/personality.h +pub const UNAME26: ::c_int = 0x0020000; +pub const FDPIC_FUNCPTRS: ::c_int = 0x0080000; + +// linux/if_addr.h +pub const IFA_FLAGS: ::c_ushort = 8; + +pub const IFA_F_MANAGETEMPADDR: u32 = 0x100; +pub const IFA_F_NOPREFIXROUTE: u32 = 0x200; +pub const IFA_F_MCAUTOJOIN: u32 = 0x400; +pub const IFA_F_STABLE_PRIVACY: u32 = 0x800; + +pub const MAX_LINKS: ::c_int = 32; + +pub const GENL_UNS_ADMIN_PERM: ::c_int = 0x10; + +pub const GENL_ID_VFS_DQUOT: ::c_int = ::NLMSG_MIN_TYPE + 1; +pub const GENL_ID_PMCRAID: ::c_int = ::NLMSG_MIN_TYPE + 2; + +// elf.h +pub const NT_PRSTATUS: ::c_int = 1; +pub const NT_PRFPREG: ::c_int = 2; +pub const NT_FPREGSET: ::c_int = 2; +pub const NT_PRPSINFO: ::c_int = 3; +pub const NT_PRXREG: ::c_int = 4; +pub const NT_TASKSTRUCT: ::c_int = 4; +pub const NT_PLATFORM: ::c_int = 5; +pub const NT_AUXV: ::c_int = 6; +pub const NT_GWINDOWS: ::c_int = 7; +pub const NT_ASRS: ::c_int = 8; +pub const NT_PSTATUS: ::c_int = 10; +pub const NT_PSINFO: ::c_int = 13; +pub const NT_PRCRED: ::c_int = 14; +pub const NT_UTSNAME: ::c_int = 15; +pub const NT_LWPSTATUS: ::c_int = 16; +pub const NT_LWPSINFO: ::c_int = 17; +pub const NT_PRFPXREG: ::c_int = 20; + +pub const ELFOSABI_ARM_AEABI: u8 = 64; + +// linux/keyctl.h +pub const KEYCTL_DH_COMPUTE: u32 = 23; +pub const KEYCTL_PKEY_QUERY: u32 = 24; +pub const KEYCTL_PKEY_ENCRYPT: u32 = 25; +pub const KEYCTL_PKEY_DECRYPT: u32 = 26; +pub const KEYCTL_PKEY_SIGN: u32 = 27; +pub const KEYCTL_PKEY_VERIFY: u32 = 28; +pub const KEYCTL_RESTRICT_KEYRING: u32 = 29; + +pub const KEYCTL_SUPPORTS_ENCRYPT: u32 = 0x01; +pub const KEYCTL_SUPPORTS_DECRYPT: u32 = 0x02; +pub const KEYCTL_SUPPORTS_SIGN: u32 = 0x04; +pub const KEYCTL_SUPPORTS_VERIFY: u32 = 0x08; +cfg_if! { + if #[cfg(not(any(target_arch="mips", target_arch="mips64")))] { + pub const KEYCTL_MOVE: u32 = 30; + pub const KEYCTL_CAPABILITIES: u32 = 31; + + pub const KEYCTL_CAPS0_CAPABILITIES: u32 = 0x01; + pub const KEYCTL_CAPS0_PERSISTENT_KEYRINGS: u32 = 0x02; + pub const KEYCTL_CAPS0_DIFFIE_HELLMAN: u32 = 0x04; + pub const KEYCTL_CAPS0_PUBLIC_KEY: u32 = 0x08; + pub const KEYCTL_CAPS0_BIG_KEY: u32 = 0x10; + pub const KEYCTL_CAPS0_INVALIDATE: u32 = 0x20; + pub const KEYCTL_CAPS0_RESTRICT_KEYRING: u32 = 0x40; + pub const KEYCTL_CAPS0_MOVE: u32 = 0x80; + pub const KEYCTL_CAPS1_NS_KEYRING_NAME: u32 = 0x01; + pub const KEYCTL_CAPS1_NS_KEY_TAG: u32 = 0x02; + } +} + +pub const M_MXFAST: ::c_int = 1; +pub const M_NLBLKS: ::c_int = 2; +pub const M_GRAIN: ::c_int = 3; +pub const M_KEEP: ::c_int = 4; +pub const M_TRIM_THRESHOLD: ::c_int = -1; +pub const M_TOP_PAD: ::c_int = -2; +pub const M_MMAP_THRESHOLD: ::c_int = -3; +pub const M_MMAP_MAX: ::c_int = -4; +pub const M_CHECK_ACTION: ::c_int = -5; +pub const M_PERTURB: ::c_int = -6; +pub const M_ARENA_TEST: ::c_int = -7; +pub const M_ARENA_MAX: ::c_int = -8; + +pub const AT_STATX_SYNC_TYPE: ::c_int = 0x6000; +pub const AT_STATX_SYNC_AS_STAT: ::c_int = 0x0000; +pub const AT_STATX_FORCE_SYNC: ::c_int = 0x2000; +pub const AT_STATX_DONT_SYNC: ::c_int = 0x4000; +pub const STATX_TYPE: ::c_uint = 0x0001; +pub const STATX_MODE: ::c_uint = 0x0002; +pub const STATX_NLINK: ::c_uint = 0x0004; +pub const STATX_UID: ::c_uint = 0x0008; +pub const STATX_GID: ::c_uint = 0x0010; +pub const STATX_ATIME: ::c_uint = 0x0020; +pub const STATX_MTIME: ::c_uint = 0x0040; +pub const STATX_CTIME: ::c_uint = 0x0080; +pub const STATX_INO: ::c_uint = 0x0100; +pub const STATX_SIZE: ::c_uint = 0x0200; +pub const STATX_BLOCKS: ::c_uint = 0x0400; +pub const STATX_BASIC_STATS: ::c_uint = 0x07ff; +pub const STATX_BTIME: ::c_uint = 0x0800; +pub const STATX_MNT_ID: ::c_uint = 0x1000; +pub const STATX_DIOALIGN: ::c_uint = 0x2000; +pub const STATX_ALL: ::c_uint = 0x0fff; +pub const STATX__RESERVED: ::c_int = 0x80000000; +pub const STATX_ATTR_COMPRESSED: ::c_int = 0x0004; +pub const STATX_ATTR_IMMUTABLE: ::c_int = 0x0010; +pub const STATX_ATTR_APPEND: ::c_int = 0x0020; +pub const STATX_ATTR_NODUMP: ::c_int = 0x0040; +pub const STATX_ATTR_ENCRYPTED: ::c_int = 0x0800; +pub const STATX_ATTR_AUTOMOUNT: ::c_int = 0x1000; +pub const STATX_ATTR_MOUNT_ROOT: ::c_int = 0x2000; +pub const STATX_ATTR_VERITY: ::c_int = 0x00100000; +pub const STATX_ATTR_DAX: ::c_int = 0x00200000; + +pub const SOMAXCONN: ::c_int = 4096; + +//sys/timex.h +pub const ADJ_OFFSET: ::c_uint = 0x0001; +pub const ADJ_FREQUENCY: ::c_uint = 0x0002; +pub const ADJ_MAXERROR: ::c_uint = 0x0004; +pub const ADJ_ESTERROR: ::c_uint = 0x0008; +pub const ADJ_STATUS: ::c_uint = 0x0010; +pub const ADJ_TIMECONST: ::c_uint = 0x0020; +pub const ADJ_TAI: ::c_uint = 0x0080; +pub const ADJ_SETOFFSET: ::c_uint = 0x0100; +pub const ADJ_MICRO: ::c_uint = 0x1000; +pub const ADJ_NANO: ::c_uint = 0x2000; +pub const ADJ_TICK: ::c_uint = 0x4000; +pub const ADJ_OFFSET_SINGLESHOT: ::c_uint = 0x8001; +pub const ADJ_OFFSET_SS_READ: ::c_uint = 0xa001; +pub const MOD_OFFSET: ::c_uint = ADJ_OFFSET; +pub const MOD_FREQUENCY: ::c_uint = ADJ_FREQUENCY; +pub const MOD_MAXERROR: ::c_uint = ADJ_MAXERROR; +pub const MOD_ESTERROR: ::c_uint = ADJ_ESTERROR; +pub const MOD_STATUS: ::c_uint = ADJ_STATUS; +pub const MOD_TIMECONST: ::c_uint = ADJ_TIMECONST; +pub const MOD_CLKB: ::c_uint = ADJ_TICK; +pub const MOD_CLKA: ::c_uint = ADJ_OFFSET_SINGLESHOT; +pub const MOD_TAI: ::c_uint = ADJ_TAI; +pub const MOD_MICRO: ::c_uint = ADJ_MICRO; +pub const MOD_NANO: ::c_uint = ADJ_NANO; +pub const STA_PLL: ::c_int = 0x0001; +pub const STA_PPSFREQ: ::c_int = 0x0002; +pub const STA_PPSTIME: ::c_int = 0x0004; +pub const STA_FLL: ::c_int = 0x0008; +pub const STA_INS: ::c_int = 0x0010; +pub const STA_DEL: ::c_int = 0x0020; +pub const STA_UNSYNC: ::c_int = 0x0040; +pub const STA_FREQHOLD: ::c_int = 0x0080; +pub const STA_PPSSIGNAL: ::c_int = 0x0100; +pub const STA_PPSJITTER: ::c_int = 0x0200; +pub const STA_PPSWANDER: ::c_int = 0x0400; +pub const STA_PPSERROR: ::c_int = 0x0800; +pub const STA_CLOCKERR: ::c_int = 0x1000; +pub const STA_NANO: ::c_int = 0x2000; +pub const STA_MODE: ::c_int = 0x4000; +pub const STA_CLK: ::c_int = 0x8000; +pub const STA_RONLY: ::c_int = STA_PPSSIGNAL + | STA_PPSJITTER + | STA_PPSWANDER + | STA_PPSERROR + | STA_CLOCKERR + | STA_NANO + | STA_MODE + | STA_CLK; +pub const NTP_API: ::c_int = 4; +pub const TIME_OK: ::c_int = 0; +pub const TIME_INS: ::c_int = 1; +pub const TIME_DEL: ::c_int = 2; +pub const TIME_OOP: ::c_int = 3; +pub const TIME_WAIT: ::c_int = 4; +pub const TIME_ERROR: ::c_int = 5; +pub const TIME_BAD: ::c_int = TIME_ERROR; +pub const MAXTC: ::c_long = 6; + +cfg_if! { + if #[cfg(any( + target_arch = "arm", + target_arch = "x86", + target_arch = "x86_64", + target_arch = "s390x", + target_arch = "riscv64", + target_arch = "riscv32" + ))] { + pub const PTHREAD_STACK_MIN: ::size_t = 16384; + } else if #[cfg(any( + target_arch = "sparc", + target_arch = "sparc64" + ))] { + pub const PTHREAD_STACK_MIN: ::size_t = 0x6000; + } else { + pub const PTHREAD_STACK_MIN: ::size_t = 131072; + } +} +pub const PTHREAD_MUTEX_ADAPTIVE_NP: ::c_int = 3; + +pub const REG_STARTEND: ::c_int = 4; + +pub const REG_EEND: ::c_int = 14; +pub const REG_ESIZE: ::c_int = 15; +pub const REG_ERPAREN: ::c_int = 16; + +extern "C" { + pub fn fgetspent_r( + fp: *mut ::FILE, + spbuf: *mut ::spwd, + buf: *mut ::c_char, + buflen: ::size_t, + spbufp: *mut *mut ::spwd, + ) -> ::c_int; + pub fn sgetspent_r( + s: *const ::c_char, + spbuf: *mut ::spwd, + buf: *mut ::c_char, + buflen: ::size_t, + spbufp: *mut *mut ::spwd, + ) -> ::c_int; + pub fn getspent_r( + spbuf: *mut ::spwd, + buf: *mut ::c_char, + buflen: ::size_t, + spbufp: *mut *mut ::spwd, + ) -> ::c_int; + pub fn qsort_r( + base: *mut ::c_void, + num: ::size_t, + size: ::size_t, + compar: ::Option< + unsafe extern "C" fn(*const ::c_void, *const ::c_void, *mut ::c_void) -> ::c_int, + >, + arg: *mut ::c_void, + ); + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn getrlimit64(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit64) -> ::c_int; + pub fn setrlimit64(resource: ::__rlimit_resource_t, rlim: *const ::rlimit64) -> ::c_int; + pub fn getrlimit(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::__rlimit_resource_t, rlim: *const ::rlimit) -> ::c_int; + pub fn prlimit( + pid: ::pid_t, + resource: ::__rlimit_resource_t, + new_limit: *const ::rlimit, + old_limit: *mut ::rlimit, + ) -> ::c_int; + pub fn prlimit64( + pid: ::pid_t, + resource: ::__rlimit_resource_t, + new_limit: *const ::rlimit64, + old_limit: *mut ::rlimit64, + ) -> ::c_int; + pub fn utmpname(file: *const ::c_char) -> ::c_int; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + pub fn getpt() -> ::c_int; + pub fn mallopt(param: ::c_int, value: ::c_int) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn statx( + dirfd: ::c_int, + pathname: *const c_char, + flags: ::c_int, + mask: ::c_uint, + statxbuf: *mut statx, + ) -> ::c_int; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn getauxval(type_: ::c_ulong) -> ::c_ulong; + + pub fn adjtimex(buf: *mut timex) -> ::c_int; + pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; + #[link_name = "ntp_gettimex"] + pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + pub fn clock_adjtime(clk_id: ::clockid_t, buf: *mut ::timex) -> ::c_int; + + pub fn fanotify_mark( + fd: ::c_int, + flags: ::c_uint, + mask: u64, + dirfd: ::c_int, + path: *const ::c_char, + ) -> ::c_int; + pub fn preadv2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn pwritev2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn preadv64v2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn pwritev64v2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn renameat2( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + flags: ::c_uint, + ) -> ::c_int; + + // Added in `glibc` 2.25 + pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t); + // Added in `glibc` 2.29 + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; + pub fn glob64( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut glob64_t, + ) -> ::c_int; + pub fn globfree64(pglob: *mut glob64_t); + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + pub fn pthread_attr_getaffinity_np( + attr: *const ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t, + ) -> ::c_int; + pub fn pthread_attr_setaffinity_np( + attr: *mut ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t, + ) -> ::c_int; + pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::__priority_which_t, who: ::id_t, prio: ::c_int) -> ::c_int; + pub fn pthread_rwlockattr_getkind_np( + attr: *const ::pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setkind_np( + attr: *mut ::pthread_rwlockattr_t, + val: ::c_int, + ) -> ::c_int; + pub fn pthread_sigqueue(thread: ::pthread_t, sig: ::c_int, value: ::sigval) -> ::c_int; + pub fn mallinfo() -> ::mallinfo; + pub fn mallinfo2() -> ::mallinfo2; + pub fn malloc_info(options: ::c_int, stream: *mut ::FILE) -> ::c_int; + pub fn malloc_usable_size(ptr: *mut ::c_void) -> ::size_t; + pub fn getpwent_r( + pwd: *mut ::passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::passwd, + ) -> ::c_int; + pub fn getgrent_r( + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn fgetpwent_r( + stream: *mut ::FILE, + pwd: *mut ::passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::passwd, + ) -> ::c_int; + pub fn fgetgrent_r( + stream: *mut ::FILE, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + + pub fn putpwent(p: *const ::passwd, stream: *mut ::FILE) -> ::c_int; + pub fn putgrent(grp: *const ::group, stream: *mut ::FILE) -> ::c_int; + + pub fn sethostid(hostid: ::c_long) -> ::c_int; + + pub fn memfd_create(name: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn mlock2(addr: *const ::c_void, len: ::size_t, flags: ::c_uint) -> ::c_int; + + pub fn euidaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; + pub fn eaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; + + pub fn asctime_r(tm: *const ::tm, buf: *mut ::c_char) -> *mut ::c_char; + pub fn ctime_r(timep: *const time_t, buf: *mut ::c_char) -> *mut ::c_char; + + pub fn strftime( + s: *mut ::c_char, + max: ::size_t, + format: *const ::c_char, + tm: *const ::tm, + ) -> ::size_t; + pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + /// POSIX version of `basename(3)`, defined in `libgen.h`. + #[link_name = "__xpg_basename"] + pub fn posix_basename(path: *mut ::c_char) -> *mut ::c_char; + /// GNU version of `basename(3)`, defined in `string.h`. + #[link_name = "basename"] + pub fn gnu_basename(path: *const ::c_char) -> *mut ::c_char; + pub fn dlmopen(lmid: Lmid_t, filename: *const ::c_char, flag: ::c_int) -> *mut ::c_void; + pub fn dlinfo(handle: *mut ::c_void, request: ::c_int, info: *mut ::c_void) -> ::c_int; + pub fn dladdr1( + addr: *const ::c_void, + info: *mut ::Dl_info, + extra_info: *mut *mut ::c_void, + flags: ::c_int, + ) -> ::c_int; + pub fn malloc_trim(__pad: ::size_t) -> ::c_int; + pub fn gnu_get_libc_release() -> *const ::c_char; + pub fn gnu_get_libc_version() -> *const ::c_char; + + // posix/spawn.h + // Added in `glibc` 2.29 + pub fn posix_spawn_file_actions_addchdir_np( + actions: *mut ::posix_spawn_file_actions_t, + path: *const ::c_char, + ) -> ::c_int; + // Added in `glibc` 2.29 + pub fn posix_spawn_file_actions_addfchdir_np( + actions: *mut ::posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + // Added in `glibc` 2.34 + pub fn posix_spawn_file_actions_addclosefrom_np( + actions: *mut ::posix_spawn_file_actions_t, + from: ::c_int, + ) -> ::c_int; + // Added in `glibc` 2.35 + pub fn posix_spawn_file_actions_addtcsetpgrp_np( + actions: *mut ::posix_spawn_file_actions_t, + tcfd: ::c_int, + ) -> ::c_int; + + // mntent.h + pub fn getmntent_r( + stream: *mut ::FILE, + mntbuf: *mut ::mntent, + buf: *mut ::c_char, + buflen: ::c_int, + ) -> *mut ::mntent; +} + +cfg_if! { + if #[cfg(any(target_arch = "x86", + target_arch = "arm", + target_arch = "m68k", + target_arch = "mips", + target_arch = "powerpc", + target_arch = "sparc", + target_arch = "riscv32"))] { + mod b32; + pub use self::b32::*; + } else if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "riscv64", + target_arch = "loongarch64"))] { + mod b64; + pub use self::b64::*; + } else { + // Unknown target_arch + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } else { + mod no_align; + pub use self::no_align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/no_align.rs new file mode 100644 index 0000000..e32bf67 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/gnu/no_align.rs @@ -0,0 +1,10 @@ +s! { + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/mod.rs new file mode 100644 index 0000000..e52b3d3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/mod.rs @@ -0,0 +1,4921 @@ +//! Linux-specific definitions for linux-like values + +pub type useconds_t = u32; +pub type dev_t = u64; +pub type socklen_t = u32; +pub type mode_t = u32; +pub type ino64_t = u64; +pub type off64_t = i64; +pub type blkcnt64_t = i64; +pub type rlim64_t = u64; +pub type mqd_t = ::c_int; +pub type nfds_t = ::c_ulong; +pub type nl_item = ::c_int; +pub type idtype_t = ::c_uint; +pub type loff_t = ::c_longlong; +pub type pthread_key_t = ::c_uint; +pub type pthread_spinlock_t = ::c_int; + +pub type __u8 = ::c_uchar; +pub type __u16 = ::c_ushort; +pub type __s16 = ::c_short; +pub type __u32 = ::c_uint; +pub type __s32 = ::c_int; + +pub type Elf32_Half = u16; +pub type Elf32_Word = u32; +pub type Elf32_Off = u32; +pub type Elf32_Addr = u32; + +pub type Elf64_Half = u16; +pub type Elf64_Word = u32; +pub type Elf64_Off = u64; +pub type Elf64_Addr = u64; +pub type Elf64_Xword = u64; +pub type Elf64_Sxword = i64; + +pub type Elf32_Section = u16; +pub type Elf64_Section = u16; + +// linux/can.h +pub type canid_t = u32; + +// linux/can/j1939.h +pub type can_err_mask_t = u32; +pub type pgn_t = u32; +pub type priority_t = u8; +pub type name_t = u64; + +pub type iconv_t = *mut ::c_void; + +// linux/sctp.h +pub type sctp_assoc_t = ::__s32; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos64_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos64_t {} +impl ::Clone for fpos64_t { + fn clone(&self) -> fpos64_t { + *self + } +} + +s! { + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct spwd { + pub sp_namp: *mut ::c_char, + pub sp_pwdp: *mut ::c_char, + pub sp_lstchg: ::c_long, + pub sp_min: ::c_long, + pub sp_max: ::c_long, + pub sp_warn: ::c_long, + pub sp_inact: ::c_long, + pub sp_expire: ::c_long, + pub sp_flag: ::c_ulong, + } + + pub struct dqblk { + pub dqb_bhardlimit: u64, + pub dqb_bsoftlimit: u64, + pub dqb_curspace: u64, + pub dqb_ihardlimit: u64, + pub dqb_isoftlimit: u64, + pub dqb_curinodes: u64, + pub dqb_btime: u64, + pub dqb_itime: u64, + pub dqb_valid: u32, + } + + pub struct signalfd_siginfo { + pub ssi_signo: u32, + pub ssi_errno: i32, + pub ssi_code: i32, + pub ssi_pid: u32, + pub ssi_uid: u32, + pub ssi_fd: i32, + pub ssi_tid: u32, + pub ssi_band: u32, + pub ssi_overrun: u32, + pub ssi_trapno: u32, + pub ssi_status: i32, + pub ssi_int: i32, + pub ssi_ptr: u64, + pub ssi_utime: u64, + pub ssi_stime: u64, + pub ssi_addr: u64, + pub ssi_addr_lsb: u16, + _pad2: u16, + pub ssi_syscall: i32, + pub ssi_call_addr: u64, + pub ssi_arch: u32, + _pad: [u8; 28], + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct fsid_t { + __val: [::c_int; 2], + } + + pub struct packet_mreq { + pub mr_ifindex: ::c_int, + pub mr_type: ::c_ushort, + pub mr_alen: ::c_ushort, + pub mr_address: [::c_uchar; 8], + } + + pub struct cpu_set_t { + #[cfg(all(target_pointer_width = "32", + not(target_arch = "x86_64")))] + bits: [u32; 32], + #[cfg(not(all(target_pointer_width = "32", + not(target_arch = "x86_64"))))] + bits: [u64; 16], + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + // System V IPC + pub struct msginfo { + pub msgpool: ::c_int, + pub msgmap: ::c_int, + pub msgmax: ::c_int, + pub msgmnb: ::c_int, + pub msgmni: ::c_int, + pub msgssz: ::c_int, + pub msgtql: ::c_int, + pub msgseg: ::c_ushort, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct input_event { + pub time: ::timeval, + pub type_: ::__u16, + pub code: ::__u16, + pub value: ::__s32, + } + + pub struct input_id { + pub bustype: ::__u16, + pub vendor: ::__u16, + pub product: ::__u16, + pub version: ::__u16, + } + + pub struct input_absinfo { + pub value: ::__s32, + pub minimum: ::__s32, + pub maximum: ::__s32, + pub fuzz: ::__s32, + pub flat: ::__s32, + pub resolution: ::__s32, + } + + pub struct input_keymap_entry { + pub flags: ::__u8, + pub len: ::__u8, + pub index: ::__u16, + pub keycode: ::__u32, + pub scancode: [::__u8; 32], + } + + pub struct input_mask { + pub type_: ::__u32, + pub codes_size: ::__u32, + pub codes_ptr: ::__u64, + } + + pub struct ff_replay { + pub length: ::__u16, + pub delay: ::__u16, + } + + pub struct ff_trigger { + pub button: ::__u16, + pub interval: ::__u16, + } + + pub struct ff_envelope { + pub attack_length: ::__u16, + pub attack_level: ::__u16, + pub fade_length: ::__u16, + pub fade_level: ::__u16, + } + + pub struct ff_constant_effect { + pub level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_ramp_effect { + pub start_level: ::__s16, + pub end_level: ::__s16, + pub envelope: ff_envelope, + } + + pub struct ff_condition_effect { + pub right_saturation: ::__u16, + pub left_saturation: ::__u16, + + pub right_coeff: ::__s16, + pub left_coeff: ::__s16, + + pub deadband: ::__u16, + pub center: ::__s16, + } + + pub struct ff_periodic_effect { + pub waveform: ::__u16, + pub period: ::__u16, + pub magnitude: ::__s16, + pub offset: ::__s16, + pub phase: ::__u16, + + pub envelope: ff_envelope, + + pub custom_len: ::__u32, + pub custom_data: *mut ::__s16, + } + + pub struct ff_rumble_effect { + pub strong_magnitude: ::__u16, + pub weak_magnitude: ::__u16, + } + + pub struct ff_effect { + pub type_: ::__u16, + pub id: ::__s16, + pub direction: ::__u16, + pub trigger: ff_trigger, + pub replay: ff_replay, + // FIXME this is actually a union + #[cfg(target_pointer_width = "64")] + pub u: [u64; 4], + #[cfg(target_pointer_width = "32")] + pub u: [u32; 7], + } + + pub struct uinput_ff_upload { + pub request_id: ::__u32, + pub retval: ::__s32, + pub effect: ff_effect, + pub old: ff_effect, + } + + pub struct uinput_ff_erase { + pub request_id: ::__u32, + pub retval: ::__s32, + pub effect_id: ::__u32, + } + + pub struct uinput_abs_setup { + pub code: ::__u16, + pub absinfo: input_absinfo, + } + + pub struct dl_phdr_info { + #[cfg(target_pointer_width = "64")] + pub dlpi_addr: Elf64_Addr, + #[cfg(target_pointer_width = "32")] + pub dlpi_addr: Elf32_Addr, + + pub dlpi_name: *const ::c_char, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phdr: *const Elf64_Phdr, + #[cfg(target_pointer_width = "32")] + pub dlpi_phdr: *const Elf32_Phdr, + + #[cfg(target_pointer_width = "64")] + pub dlpi_phnum: Elf64_Half, + #[cfg(target_pointer_width = "32")] + pub dlpi_phnum: Elf32_Half, + + // As of uClibc 1.0.36, the following fields are + // gated behind a "#if 0" block which always evaluates + // to false. So I'm just removing these, and if uClibc changes + // the #if block in the future to include the following fields, these + // will probably need including here. tsidea, skrap + #[cfg(not(target_env = "uclibc"))] + pub dlpi_adds: ::c_ulonglong, + #[cfg(not(target_env = "uclibc"))] + pub dlpi_subs: ::c_ulonglong, + #[cfg(not(target_env = "uclibc"))] + pub dlpi_tls_modid: ::size_t, + #[cfg(not(target_env = "uclibc"))] + pub dlpi_tls_data: *mut ::c_void, + } + + pub struct Elf32_Ehdr { + pub e_ident: [::c_uchar; 16], + pub e_type: Elf32_Half, + pub e_machine: Elf32_Half, + pub e_version: Elf32_Word, + pub e_entry: Elf32_Addr, + pub e_phoff: Elf32_Off, + pub e_shoff: Elf32_Off, + pub e_flags: Elf32_Word, + pub e_ehsize: Elf32_Half, + pub e_phentsize: Elf32_Half, + pub e_phnum: Elf32_Half, + pub e_shentsize: Elf32_Half, + pub e_shnum: Elf32_Half, + pub e_shstrndx: Elf32_Half, + } + + pub struct Elf64_Ehdr { + pub e_ident: [::c_uchar; 16], + pub e_type: Elf64_Half, + pub e_machine: Elf64_Half, + pub e_version: Elf64_Word, + pub e_entry: Elf64_Addr, + pub e_phoff: Elf64_Off, + pub e_shoff: Elf64_Off, + pub e_flags: Elf64_Word, + pub e_ehsize: Elf64_Half, + pub e_phentsize: Elf64_Half, + pub e_phnum: Elf64_Half, + pub e_shentsize: Elf64_Half, + pub e_shnum: Elf64_Half, + pub e_shstrndx: Elf64_Half, + } + + pub struct Elf32_Sym { + pub st_name: Elf32_Word, + pub st_value: Elf32_Addr, + pub st_size: Elf32_Word, + pub st_info: ::c_uchar, + pub st_other: ::c_uchar, + pub st_shndx: Elf32_Section, + } + + pub struct Elf64_Sym { + pub st_name: Elf64_Word, + pub st_info: ::c_uchar, + pub st_other: ::c_uchar, + pub st_shndx: Elf64_Section, + pub st_value: Elf64_Addr, + pub st_size: Elf64_Xword, + } + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + pub struct Elf32_Shdr { + pub sh_name: Elf32_Word, + pub sh_type: Elf32_Word, + pub sh_flags: Elf32_Word, + pub sh_addr: Elf32_Addr, + pub sh_offset: Elf32_Off, + pub sh_size: Elf32_Word, + pub sh_link: Elf32_Word, + pub sh_info: Elf32_Word, + pub sh_addralign: Elf32_Word, + pub sh_entsize: Elf32_Word, + } + + pub struct Elf64_Shdr { + pub sh_name: Elf64_Word, + pub sh_type: Elf64_Word, + pub sh_flags: Elf64_Xword, + pub sh_addr: Elf64_Addr, + pub sh_offset: Elf64_Off, + pub sh_size: Elf64_Xword, + pub sh_link: Elf64_Word, + pub sh_info: Elf64_Word, + pub sh_addralign: Elf64_Xword, + pub sh_entsize: Elf64_Xword, + } + + pub struct ucred { + pub pid: ::pid_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + } + + pub struct mntent { + pub mnt_fsname: *mut ::c_char, + pub mnt_dir: *mut ::c_char, + pub mnt_type: *mut ::c_char, + pub mnt_opts: *mut ::c_char, + pub mnt_freq: ::c_int, + pub mnt_passno: ::c_int, + } + + pub struct posix_spawn_file_actions_t { + __allocated: ::c_int, + __used: ::c_int, + __actions: *mut ::c_int, + __pad: [::c_int; 16], + } + + pub struct posix_spawnattr_t { + __flags: ::c_short, + __pgrp: ::pid_t, + __sd: ::sigset_t, + __ss: ::sigset_t, + #[cfg(any(target_env = "musl", target_env = "ohos"))] + __prio: ::c_int, + #[cfg(not(any(target_env = "musl", target_env = "ohos")))] + __sp: ::sched_param, + __policy: ::c_int, + __pad: [::c_int; 16], + } + + pub struct genlmsghdr { + pub cmd: u8, + pub version: u8, + pub reserved: u16, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } + + pub struct arpd_request { + pub req: ::c_ushort, + pub ip: u32, + pub dev: ::c_ulong, + pub stamp: ::c_ulong, + pub updated: ::c_ulong, + pub ha: [::c_uchar; ::MAX_ADDR_LEN], + } + + pub struct inotify_event { + pub wd: ::c_int, + pub mask: u32, + pub cookie: u32, + pub len: u32 + } + + pub struct fanotify_response { + pub fd: ::c_int, + pub response: __u32, + } + + pub struct sockaddr_vm { + pub svm_family: ::sa_family_t, + pub svm_reserved1: ::c_ushort, + pub svm_port: ::c_uint, + pub svm_cid: ::c_uint, + pub svm_zero: [u8; 4] + } + + pub struct regmatch_t { + pub rm_so: regoff_t, + pub rm_eo: regoff_t, + } + + pub struct sock_extended_err { + pub ee_errno: u32, + pub ee_origin: u8, + pub ee_type: u8, + pub ee_code: u8, + pub ee_pad: u8, + pub ee_info: u32, + pub ee_data: u32, + } + + // linux/can.h + pub struct __c_anonymous_sockaddr_can_tp { + pub rx_id: canid_t, + pub tx_id: canid_t, + } + + pub struct __c_anonymous_sockaddr_can_j1939 { + pub name: u64, + pub pgn: u32, + pub addr: u8, + } + + pub struct can_filter { + pub can_id: canid_t, + pub can_mask: canid_t, + } + + // linux/can/j1939.h + pub struct j1939_filter { + pub name: name_t, + pub name_mask: name_t, + pub pgn: pgn_t, + pub pgn_mask: pgn_t, + pub addr: u8, + pub addr_mask: u8, + } + + // linux/filter.h + pub struct sock_filter { + pub code: ::__u16, + pub jt: ::__u8, + pub jf: ::__u8, + pub k: ::__u32, + } + + pub struct sock_fprog { + pub len: ::c_ushort, + pub filter: *mut sock_filter, + } + + // linux/seccomp.h + pub struct seccomp_data { + pub nr: ::c_int, + pub arch: ::__u32, + pub instruction_pointer: ::__u64, + pub args: [::__u64; 6], + } + + pub struct nlmsghdr { + pub nlmsg_len: u32, + pub nlmsg_type: u16, + pub nlmsg_flags: u16, + pub nlmsg_seq: u32, + pub nlmsg_pid: u32, + } + + pub struct nlmsgerr { + pub error: ::c_int, + pub msg: nlmsghdr, + } + + pub struct nlattr { + pub nla_len: u16, + pub nla_type: u16, + } + + pub struct file_clone_range { + pub src_fd: ::__s64, + pub src_offset: ::__u64, + pub src_length: ::__u64, + pub dest_offset: ::__u64, + } + + pub struct __c_anonymous_ifru_map { + pub mem_start: ::c_ulong, + pub mem_end: ::c_ulong, + pub base_addr: ::c_ushort, + pub irq: ::c_uchar, + pub dma: ::c_uchar, + pub port: ::c_uchar, + } + + pub struct in6_ifreq { + pub ifr6_addr: ::in6_addr, + pub ifr6_prefixlen: u32, + pub ifr6_ifindex: ::c_int, + } + + pub struct option { + pub name: *const ::c_char, + pub has_arg: ::c_int, + pub flag: *mut ::c_int, + pub val: ::c_int, + } + + // linux/sctp.h + + pub struct sctp_initmsg { + pub sinit_num_ostreams: ::__u16, + pub sinit_max_instreams: ::__u16, + pub sinit_max_attempts: ::__u16, + pub sinit_max_init_timeo: ::__u16, + } + + pub struct sctp_sndrcvinfo { + pub sinfo_stream: ::__u16, + pub sinfo_ssn: ::__u16, + pub sinfo_flags: ::__u16, + pub sinfo_ppid: ::__u32, + pub sinfo_context: ::__u32, + pub sinfo_timetolive: ::__u32, + pub sinfo_tsn: ::__u32, + pub sinfo_cumtsn: ::__u32, + pub sinfo_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_sndinfo { + pub snd_sid: ::__u16, + pub snd_flags: ::__u16, + pub snd_ppid: ::__u32, + pub snd_context: ::__u32, + pub snd_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_rcvinfo { + pub rcv_sid: ::__u16, + pub rcv_ssn: ::__u16, + pub rcv_flags: ::__u16, + pub rcv_ppid: ::__u32, + pub rcv_tsn: ::__u32, + pub rcv_cumtsn: ::__u32, + pub rcv_context: ::__u32, + pub rcv_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_nxtinfo { + pub nxt_sid: ::__u16, + pub nxt_flags: ::__u16, + pub nxt_ppid: ::__u32, + pub nxt_length: ::__u32, + pub nxt_assoc_id: ::sctp_assoc_t, + } + + pub struct sctp_prinfo { + pub pr_policy: ::__u16, + pub pr_value: ::__u32, + } + + pub struct sctp_authinfo { + pub auth_keynumber: ::__u16, + } + + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } +} + +s_no_extra_traits! { + pub struct sockaddr_nl { + pub nl_family: ::sa_family_t, + nl_pad: ::c_ushort, + pub nl_pid: u32, + pub nl_groups: u32 + } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct sockaddr_alg { + pub salg_family: ::sa_family_t, + pub salg_type: [::c_uchar; 14], + pub salg_feat: u32, + pub salg_mask: u32, + pub salg_name: [::c_uchar; 64], + } + + pub struct uinput_setup { + pub id: input_id, + pub name: [::c_char; UINPUT_MAX_NAME_SIZE], + pub ff_effects_max: ::__u32, + } + + pub struct uinput_user_dev { + pub name: [::c_char; UINPUT_MAX_NAME_SIZE], + pub id: input_id, + pub ff_effects_max: ::__u32, + pub absmax: [::__s32; ABS_CNT], + pub absmin: [::__s32; ABS_CNT], + pub absfuzz: [::__s32; ABS_CNT], + pub absflat: [::__s32; ABS_CNT], + } + + /// WARNING: The `PartialEq`, `Eq` and `Hash` implementations of this + /// type are unsound and will be removed in the future. + #[deprecated( + note = "this struct has unsafe trait implementations that will be \ + removed in the future", + since = "0.2.80" + )] + pub struct af_alg_iv { + pub ivlen: u32, + pub iv: [::c_uchar; 0], + } + + // x32 compatibility + // See https://sourceware.org/bugzilla/show_bug.cgi?id=21279 + pub struct mq_attr { + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_flags: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_maxmsg: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_msgsize: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub mq_curmsgs: i64, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pad: [i64; 4], + + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_flags: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_maxmsg: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_msgsize: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub mq_curmsgs: ::c_long, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pad: [::c_long; 4], + } + + #[cfg(libc_union)] + pub union __c_anonymous_ifr_ifru { + pub ifru_addr: ::sockaddr, + pub ifru_dstaddr: ::sockaddr, + pub ifru_broadaddr: ::sockaddr, + pub ifru_netmask: ::sockaddr, + pub ifru_hwaddr: ::sockaddr, + pub ifru_flags: ::c_short, + pub ifru_ifindex: ::c_int, + pub ifru_metric: ::c_int, + pub ifru_mtu: ::c_int, + pub ifru_map: __c_anonymous_ifru_map, + pub ifru_slave: [::c_char; ::IFNAMSIZ], + pub ifru_newname: [::c_char; ::IFNAMSIZ], + pub ifru_data: *mut ::c_char, + } + + pub struct ifreq { + /// interface name, e.g. "en0" + pub ifr_name: [::c_char; ::IFNAMSIZ], + #[cfg(libc_union)] + pub ifr_ifru: __c_anonymous_ifr_ifru, + #[cfg(not(libc_union))] + pub ifr_ifru: ::sockaddr, + } + + pub struct hwtstamp_config { + pub flags: ::c_int, + pub tx_type: ::c_int, + pub rx_filter: ::c_int, + } + + pub struct dirent64 { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } +} + +s_no_extra_traits! { + // linux/net_tstamp.h + #[allow(missing_debug_implementations)] + pub struct sock_txtime { + pub clockid: ::clockid_t, + pub flags: ::__u32, + } +} + +cfg_if! { + if #[cfg(libc_union)] { + s_no_extra_traits! { + // linux/can.h + #[allow(missing_debug_implementations)] + pub union __c_anonymous_sockaddr_can_can_addr { + pub tp: __c_anonymous_sockaddr_can_tp, + pub j1939: __c_anonymous_sockaddr_can_j1939, + } + + #[allow(missing_debug_implementations)] + pub struct sockaddr_can { + pub can_family: ::sa_family_t, + pub can_ifindex: ::c_int, + pub can_addr: __c_anonymous_sockaddr_can_can_addr, + } + } + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sockaddr_nl { + fn eq(&self, other: &sockaddr_nl) -> bool { + self.nl_family == other.nl_family && + self.nl_pid == other.nl_pid && + self.nl_groups == other.nl_groups + } + } + impl Eq for sockaddr_nl {} + impl ::fmt::Debug for sockaddr_nl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_nl") + .field("nl_family", &self.nl_family) + .field("nl_pid", &self.nl_pid) + .field("nl_groups", &self.nl_groups) + .finish() + } + } + impl ::hash::Hash for sockaddr_nl { + fn hash(&self, state: &mut H) { + self.nl_family.hash(state); + self.nl_pid.hash(state); + self.nl_groups.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for dirent64 { + fn eq(&self, other: &dirent64) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent64 {} + + impl ::fmt::Debug for dirent64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent64 { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for pthread_cond_t { + fn eq(&self, other: &pthread_cond_t) -> bool { + self.size.iter().zip(other.size.iter()).all(|(a,b)| a == b) + } + } + + impl Eq for pthread_cond_t {} + + impl ::fmt::Debug for pthread_cond_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_cond_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + + impl ::hash::Hash for pthread_cond_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for pthread_mutex_t { + fn eq(&self, other: &pthread_mutex_t) -> bool { + self.size.iter().zip(other.size.iter()).all(|(a,b)| a == b) + } + } + + impl Eq for pthread_mutex_t {} + + impl ::fmt::Debug for pthread_mutex_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_mutex_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + + impl ::hash::Hash for pthread_mutex_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for pthread_rwlock_t { + fn eq(&self, other: &pthread_rwlock_t) -> bool { + self.size.iter().zip(other.size.iter()).all(|(a,b)| a == b) + } + } + + impl Eq for pthread_rwlock_t {} + + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + // FIXME: .field("size", &self.size) + .finish() + } + } + + impl ::hash::Hash for pthread_rwlock_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for pthread_barrier_t { + fn eq(&self, other: &pthread_barrier_t) -> bool { + self.size.iter().zip(other.size.iter()).all(|(a,b)| a == b) + } + } + + impl Eq for pthread_barrier_t {} + + impl ::fmt::Debug for pthread_barrier_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_barrier_t") + .field("size", &self.size) + .finish() + } + } + + impl ::hash::Hash for pthread_barrier_t { + fn hash(&self, state: &mut H) { + self.size.hash(state); + } + } + + impl PartialEq for sockaddr_alg { + fn eq(&self, other: &sockaddr_alg) -> bool { + self.salg_family == other.salg_family + && self + .salg_type + .iter() + .zip(other.salg_type.iter()) + .all(|(a, b)| a == b) + && self.salg_feat == other.salg_feat + && self.salg_mask == other.salg_mask + && self + .salg_name + .iter() + .zip(other.salg_name.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for sockaddr_alg {} + + impl ::fmt::Debug for sockaddr_alg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_alg") + .field("salg_family", &self.salg_family) + .field("salg_type", &self.salg_type) + .field("salg_feat", &self.salg_feat) + .field("salg_mask", &self.salg_mask) + .field("salg_name", &&self.salg_name[..]) + .finish() + } + } + + impl ::hash::Hash for sockaddr_alg { + fn hash(&self, state: &mut H) { + self.salg_family.hash(state); + self.salg_type.hash(state); + self.salg_feat.hash(state); + self.salg_mask.hash(state); + self.salg_name.hash(state); + } + } + + impl PartialEq for uinput_setup { + fn eq(&self, other: &uinput_setup) -> bool { + self.id == other.id + && self.name[..] == other.name[..] + && self.ff_effects_max == other.ff_effects_max + } + } + impl Eq for uinput_setup {} + + impl ::fmt::Debug for uinput_setup { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("id", &self.id) + .field("name", &&self.name[..]) + .field("ff_effects_max", &self.ff_effects_max) + .finish() + } + } + + impl ::hash::Hash for uinput_setup { + fn hash(&self, state: &mut H) { + self.id.hash(state); + self.name.hash(state); + self.ff_effects_max.hash(state); + } + } + + impl PartialEq for uinput_user_dev { + fn eq(&self, other: &uinput_user_dev) -> bool { + self.name[..] == other.name[..] + && self.id == other.id + && self.ff_effects_max == other.ff_effects_max + && self.absmax[..] == other.absmax[..] + && self.absmin[..] == other.absmin[..] + && self.absfuzz[..] == other.absfuzz[..] + && self.absflat[..] == other.absflat[..] + } + } + impl Eq for uinput_user_dev {} + + impl ::fmt::Debug for uinput_user_dev { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("uinput_setup") + .field("name", &&self.name[..]) + .field("id", &self.id) + .field("ff_effects_max", &self.ff_effects_max) + .field("absmax", &&self.absmax[..]) + .field("absmin", &&self.absmin[..]) + .field("absfuzz", &&self.absfuzz[..]) + .field("absflat", &&self.absflat[..]) + .finish() + } + } + + impl ::hash::Hash for uinput_user_dev { + fn hash(&self, state: &mut H) { + self.name.hash(state); + self.id.hash(state); + self.ff_effects_max.hash(state); + self.absmax.hash(state); + self.absmin.hash(state); + self.absfuzz.hash(state); + self.absflat.hash(state); + } + } + + #[allow(deprecated)] + impl af_alg_iv { + fn as_slice(&self) -> &[u8] { + unsafe { + ::core::slice::from_raw_parts( + self.iv.as_ptr(), + self.ivlen as usize + ) + } + } + } + + #[allow(deprecated)] + impl PartialEq for af_alg_iv { + fn eq(&self, other: &af_alg_iv) -> bool { + *self.as_slice() == *other.as_slice() + } + } + + #[allow(deprecated)] + impl Eq for af_alg_iv {} + + #[allow(deprecated)] + impl ::fmt::Debug for af_alg_iv { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("af_alg_iv") + .field("ivlen", &self.ivlen) + .finish() + } + } + + #[allow(deprecated)] + impl ::hash::Hash for af_alg_iv { + fn hash(&self, state: &mut H) { + self.as_slice().hash(state); + } + } + + impl PartialEq for mq_attr { + fn eq(&self, other: &mq_attr) -> bool { + self.mq_flags == other.mq_flags && + self.mq_maxmsg == other.mq_maxmsg && + self.mq_msgsize == other.mq_msgsize && + self.mq_curmsgs == other.mq_curmsgs + } + } + impl Eq for mq_attr {} + impl ::fmt::Debug for mq_attr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_flags", &self.mq_flags) + .field("mq_maxmsg", &self.mq_maxmsg) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_curmsgs", &self.mq_curmsgs) + .finish() + } + } + impl ::hash::Hash for mq_attr { + fn hash(&self, state: &mut H) { + self.mq_flags.hash(state); + self.mq_maxmsg.hash(state); + self.mq_msgsize.hash(state); + self.mq_curmsgs.hash(state); + } + } + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_ifr_ifru { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ifr_ifru") + .field("ifru_addr", unsafe { &self.ifru_addr }) + .field("ifru_dstaddr", unsafe { &self.ifru_dstaddr }) + .field("ifru_broadaddr", unsafe { &self.ifru_broadaddr }) + .field("ifru_netmask", unsafe { &self.ifru_netmask }) + .field("ifru_hwaddr", unsafe { &self.ifru_hwaddr }) + .field("ifru_flags", unsafe { &self.ifru_flags }) + .field("ifru_ifindex", unsafe { &self.ifru_ifindex }) + .field("ifru_metric", unsafe { &self.ifru_metric }) + .field("ifru_mtu", unsafe { &self.ifru_mtu }) + .field("ifru_map", unsafe { &self.ifru_map }) + .field("ifru_slave", unsafe { &self.ifru_slave }) + .field("ifru_newname", unsafe { &self.ifru_newname }) + .field("ifru_data", unsafe { &self.ifru_data }) + .finish() + } + } + impl ::fmt::Debug for ifreq { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ifreq") + .field("ifr_name", &self.ifr_name) + .field("ifr_ifru", &self.ifr_ifru) + .finish() + } + } + + impl ::fmt::Debug for hwtstamp_config { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("hwtstamp_config") + .field("flags", &self.flags) + .field("tx_type", &self.tx_type) + .field("rx_filter", &self.rx_filter) + .finish() + } + } + impl PartialEq for hwtstamp_config { + fn eq(&self, other: &hwtstamp_config) -> bool { + self.flags == other.flags && + self.tx_type == other.tx_type && + self.rx_filter == other.rx_filter + } + } + impl Eq for hwtstamp_config {} + impl ::hash::Hash for hwtstamp_config { + fn hash(&self, state: &mut H) { + self.flags.hash(state); + self.tx_type.hash(state); + self.rx_filter.hash(state); + } + } + } +} + +cfg_if! { + if #[cfg(any(target_env = "gnu", target_env = "musl", target_env = "ohos"))] { + pub const ABDAY_1: ::nl_item = 0x20000; + pub const ABDAY_2: ::nl_item = 0x20001; + pub const ABDAY_3: ::nl_item = 0x20002; + pub const ABDAY_4: ::nl_item = 0x20003; + pub const ABDAY_5: ::nl_item = 0x20004; + pub const ABDAY_6: ::nl_item = 0x20005; + pub const ABDAY_7: ::nl_item = 0x20006; + + pub const DAY_1: ::nl_item = 0x20007; + pub const DAY_2: ::nl_item = 0x20008; + pub const DAY_3: ::nl_item = 0x20009; + pub const DAY_4: ::nl_item = 0x2000A; + pub const DAY_5: ::nl_item = 0x2000B; + pub const DAY_6: ::nl_item = 0x2000C; + pub const DAY_7: ::nl_item = 0x2000D; + + pub const ABMON_1: ::nl_item = 0x2000E; + pub const ABMON_2: ::nl_item = 0x2000F; + pub const ABMON_3: ::nl_item = 0x20010; + pub const ABMON_4: ::nl_item = 0x20011; + pub const ABMON_5: ::nl_item = 0x20012; + pub const ABMON_6: ::nl_item = 0x20013; + pub const ABMON_7: ::nl_item = 0x20014; + pub const ABMON_8: ::nl_item = 0x20015; + pub const ABMON_9: ::nl_item = 0x20016; + pub const ABMON_10: ::nl_item = 0x20017; + pub const ABMON_11: ::nl_item = 0x20018; + pub const ABMON_12: ::nl_item = 0x20019; + + pub const MON_1: ::nl_item = 0x2001A; + pub const MON_2: ::nl_item = 0x2001B; + pub const MON_3: ::nl_item = 0x2001C; + pub const MON_4: ::nl_item = 0x2001D; + pub const MON_5: ::nl_item = 0x2001E; + pub const MON_6: ::nl_item = 0x2001F; + pub const MON_7: ::nl_item = 0x20020; + pub const MON_8: ::nl_item = 0x20021; + pub const MON_9: ::nl_item = 0x20022; + pub const MON_10: ::nl_item = 0x20023; + pub const MON_11: ::nl_item = 0x20024; + pub const MON_12: ::nl_item = 0x20025; + + pub const AM_STR: ::nl_item = 0x20026; + pub const PM_STR: ::nl_item = 0x20027; + + pub const D_T_FMT: ::nl_item = 0x20028; + pub const D_FMT: ::nl_item = 0x20029; + pub const T_FMT: ::nl_item = 0x2002A; + pub const T_FMT_AMPM: ::nl_item = 0x2002B; + + pub const ERA: ::nl_item = 0x2002C; + pub const ERA_D_FMT: ::nl_item = 0x2002E; + pub const ALT_DIGITS: ::nl_item = 0x2002F; + pub const ERA_D_T_FMT: ::nl_item = 0x20030; + pub const ERA_T_FMT: ::nl_item = 0x20031; + + pub const CODESET: ::nl_item = 14; + pub const CRNCYSTR: ::nl_item = 0x4000F; + pub const RADIXCHAR: ::nl_item = 0x10000; + pub const THOUSEP: ::nl_item = 0x10001; + pub const YESEXPR: ::nl_item = 0x50000; + pub const NOEXPR: ::nl_item = 0x50001; + pub const YESSTR: ::nl_item = 0x50002; + pub const NOSTR: ::nl_item = 0x50003; + } +} + +pub const RUSAGE_CHILDREN: ::c_int = -1; +pub const L_tmpnam: ::c_uint = 20; +pub const _PC_LINK_MAX: ::c_int = 0; +pub const _PC_MAX_CANON: ::c_int = 1; +pub const _PC_MAX_INPUT: ::c_int = 2; +pub const _PC_NAME_MAX: ::c_int = 3; +pub const _PC_PATH_MAX: ::c_int = 4; +pub const _PC_PIPE_BUF: ::c_int = 5; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_SYNC_IO: ::c_int = 9; +pub const _PC_ASYNC_IO: ::c_int = 10; +pub const _PC_PRIO_IO: ::c_int = 11; +pub const _PC_SOCK_MAXBUF: ::c_int = 12; +pub const _PC_FILESIZEBITS: ::c_int = 13; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18; +pub const _PC_SYMLINK_MAX: ::c_int = 19; +pub const _PC_2_SYMLINKS: ::c_int = 20; + +pub const MS_NOUSER: ::c_ulong = 0xffffffff80000000; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +pub const _SC_JOB_CONTROL: ::c_int = 7; +pub const _SC_SAVED_IDS: ::c_int = 8; +pub const _SC_REALTIME_SIGNALS: ::c_int = 9; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; +pub const _SC_TIMERS: ::c_int = 11; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; +pub const _SC_PRIORITIZED_IO: ::c_int = 13; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; +pub const _SC_FSYNC: ::c_int = 15; +pub const _SC_MAPPED_FILES: ::c_int = 16; +pub const _SC_MEMLOCK: ::c_int = 17; +pub const _SC_MEMLOCK_RANGE: ::c_int = 18; +pub const _SC_MEMORY_PROTECTION: ::c_int = 19; +pub const _SC_MESSAGE_PASSING: ::c_int = 20; +pub const _SC_SEMAPHORES: ::c_int = 21; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; +pub const _SC_AIO_MAX: ::c_int = 24; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; +pub const _SC_DELAYTIMER_MAX: ::c_int = 26; +pub const _SC_MQ_OPEN_MAX: ::c_int = 27; +pub const _SC_MQ_PRIO_MAX: ::c_int = 28; +pub const _SC_VERSION: ::c_int = 29; +pub const _SC_PAGESIZE: ::c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_RTSIG_MAX: ::c_int = 31; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; +pub const _SC_SEM_VALUE_MAX: ::c_int = 33; +pub const _SC_SIGQUEUE_MAX: ::c_int = 34; +pub const _SC_TIMER_MAX: ::c_int = 35; +pub const _SC_BC_BASE_MAX: ::c_int = 36; +pub const _SC_BC_DIM_MAX: ::c_int = 37; +pub const _SC_BC_SCALE_MAX: ::c_int = 38; +pub const _SC_BC_STRING_MAX: ::c_int = 39; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; +pub const _SC_EXPR_NEST_MAX: ::c_int = 42; +pub const _SC_LINE_MAX: ::c_int = 43; +pub const _SC_RE_DUP_MAX: ::c_int = 44; +pub const _SC_2_VERSION: ::c_int = 46; +pub const _SC_2_C_BIND: ::c_int = 47; +pub const _SC_2_C_DEV: ::c_int = 48; +pub const _SC_2_FORT_DEV: ::c_int = 49; +pub const _SC_2_FORT_RUN: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_LOCALEDEF: ::c_int = 52; +pub const _SC_UIO_MAXIOV: ::c_int = 60; +pub const _SC_IOV_MAX: ::c_int = 60; +pub const _SC_THREADS: ::c_int = 67; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; +pub const _SC_TTY_NAME_MAX: ::c_int = 72; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; +pub const _SC_THREAD_STACK_MIN: ::c_int = 75; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 82; +pub const _SC_NPROCESSORS_CONF: ::c_int = 83; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; +pub const _SC_PHYS_PAGES: ::c_int = 85; +pub const _SC_AVPHYS_PAGES: ::c_int = 86; +pub const _SC_ATEXIT_MAX: ::c_int = 87; +pub const _SC_PASS_MAX: ::c_int = 88; +pub const _SC_XOPEN_VERSION: ::c_int = 89; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; +pub const _SC_XOPEN_UNIX: ::c_int = 91; +pub const _SC_XOPEN_CRYPT: ::c_int = 92; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; +pub const _SC_XOPEN_SHM: ::c_int = 94; +pub const _SC_2_CHAR_TERM: ::c_int = 95; +pub const _SC_2_UPE: ::c_int = 97; +pub const _SC_XOPEN_XPG2: ::c_int = 98; +pub const _SC_XOPEN_XPG3: ::c_int = 99; +pub const _SC_XOPEN_XPG4: ::c_int = 100; +pub const _SC_NZERO: ::c_int = 109; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 127; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; +pub const _SC_XOPEN_LEGACY: ::c_int = 129; +pub const _SC_XOPEN_REALTIME: ::c_int = 130; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; +pub const _SC_ADVISORY_INFO: ::c_int = 132; +pub const _SC_BARRIERS: ::c_int = 133; +pub const _SC_CLOCK_SELECTION: ::c_int = 137; +pub const _SC_CPUTIME: ::c_int = 138; +pub const _SC_THREAD_CPUTIME: ::c_int = 139; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 149; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 153; +pub const _SC_SPIN_LOCKS: ::c_int = 154; +pub const _SC_REGEXP: ::c_int = 155; +pub const _SC_SHELL: ::c_int = 157; +pub const _SC_SPAWN: ::c_int = 159; +pub const _SC_SPORADIC_SERVER: ::c_int = 160; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 161; +pub const _SC_TIMEOUTS: ::c_int = 164; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 165; +pub const _SC_2_PBS: ::c_int = 168; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 169; +pub const _SC_2_PBS_LOCATE: ::c_int = 170; +pub const _SC_2_PBS_MESSAGE: ::c_int = 171; +pub const _SC_2_PBS_TRACK: ::c_int = 172; +pub const _SC_SYMLOOP_MAX: ::c_int = 173; +pub const _SC_STREAMS: ::c_int = 174; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 175; +pub const _SC_V6_ILP32_OFF32: ::c_int = 176; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 177; +pub const _SC_V6_LP64_OFF64: ::c_int = 178; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 179; +pub const _SC_HOST_NAME_MAX: ::c_int = 180; +pub const _SC_TRACE: ::c_int = 181; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 182; +pub const _SC_TRACE_INHERIT: ::c_int = 183; +pub const _SC_TRACE_LOG: ::c_int = 184; +pub const _SC_IPV6: ::c_int = 235; +pub const _SC_RAW_SOCKETS: ::c_int = 236; +pub const _SC_V7_ILP32_OFF32: ::c_int = 237; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 238; +pub const _SC_V7_LP64_OFF64: ::c_int = 239; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 240; +pub const _SC_SS_REPL_MAX: ::c_int = 241; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 242; +pub const _SC_TRACE_NAME_MAX: ::c_int = 243; +pub const _SC_TRACE_SYS_MAX: ::c_int = 244; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 245; +pub const _SC_XOPEN_STREAMS: ::c_int = 246; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 247; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 248; + +pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; +pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; + +// elf.h - Fields in the e_ident array. +pub const EI_NIDENT: usize = 16; + +pub const EI_MAG0: usize = 0; +pub const ELFMAG0: u8 = 0x7f; +pub const EI_MAG1: usize = 1; +pub const ELFMAG1: u8 = b'E'; +pub const EI_MAG2: usize = 2; +pub const ELFMAG2: u8 = b'L'; +pub const EI_MAG3: usize = 3; +pub const ELFMAG3: u8 = b'F'; +pub const SELFMAG: usize = 4; + +pub const EI_CLASS: usize = 4; +pub const ELFCLASSNONE: u8 = 0; +pub const ELFCLASS32: u8 = 1; +pub const ELFCLASS64: u8 = 2; +pub const ELFCLASSNUM: usize = 3; + +pub const EI_DATA: usize = 5; +pub const ELFDATANONE: u8 = 0; +pub const ELFDATA2LSB: u8 = 1; +pub const ELFDATA2MSB: u8 = 2; +pub const ELFDATANUM: usize = 3; + +pub const EI_VERSION: usize = 6; + +pub const EI_OSABI: usize = 7; +pub const ELFOSABI_NONE: u8 = 0; +pub const ELFOSABI_SYSV: u8 = 0; +pub const ELFOSABI_HPUX: u8 = 1; +pub const ELFOSABI_NETBSD: u8 = 2; +pub const ELFOSABI_GNU: u8 = 3; +pub const ELFOSABI_LINUX: u8 = ELFOSABI_GNU; +pub const ELFOSABI_SOLARIS: u8 = 6; +pub const ELFOSABI_AIX: u8 = 7; +pub const ELFOSABI_IRIX: u8 = 8; +pub const ELFOSABI_FREEBSD: u8 = 9; +pub const ELFOSABI_TRU64: u8 = 10; +pub const ELFOSABI_MODESTO: u8 = 11; +pub const ELFOSABI_OPENBSD: u8 = 12; +pub const ELFOSABI_ARM: u8 = 97; +pub const ELFOSABI_STANDALONE: u8 = 255; + +pub const EI_ABIVERSION: usize = 8; + +pub const EI_PAD: usize = 9; + +// elf.h - Legal values for e_type (object file type). +pub const ET_NONE: u16 = 0; +pub const ET_REL: u16 = 1; +pub const ET_EXEC: u16 = 2; +pub const ET_DYN: u16 = 3; +pub const ET_CORE: u16 = 4; +pub const ET_NUM: u16 = 5; +pub const ET_LOOS: u16 = 0xfe00; +pub const ET_HIOS: u16 = 0xfeff; +pub const ET_LOPROC: u16 = 0xff00; +pub const ET_HIPROC: u16 = 0xffff; + +// elf.h - Legal values for e_machine (architecture). +pub const EM_NONE: u16 = 0; +pub const EM_M32: u16 = 1; +pub const EM_SPARC: u16 = 2; +pub const EM_386: u16 = 3; +pub const EM_68K: u16 = 4; +pub const EM_88K: u16 = 5; +pub const EM_860: u16 = 7; +pub const EM_MIPS: u16 = 8; +pub const EM_S370: u16 = 9; +pub const EM_MIPS_RS3_LE: u16 = 10; +pub const EM_PARISC: u16 = 15; +pub const EM_VPP500: u16 = 17; +pub const EM_SPARC32PLUS: u16 = 18; +pub const EM_960: u16 = 19; +pub const EM_PPC: u16 = 20; +pub const EM_PPC64: u16 = 21; +pub const EM_S390: u16 = 22; +pub const EM_V800: u16 = 36; +pub const EM_FR20: u16 = 37; +pub const EM_RH32: u16 = 38; +pub const EM_RCE: u16 = 39; +pub const EM_ARM: u16 = 40; +pub const EM_FAKE_ALPHA: u16 = 41; +pub const EM_SH: u16 = 42; +pub const EM_SPARCV9: u16 = 43; +pub const EM_TRICORE: u16 = 44; +pub const EM_ARC: u16 = 45; +pub const EM_H8_300: u16 = 46; +pub const EM_H8_300H: u16 = 47; +pub const EM_H8S: u16 = 48; +pub const EM_H8_500: u16 = 49; +pub const EM_IA_64: u16 = 50; +pub const EM_MIPS_X: u16 = 51; +pub const EM_COLDFIRE: u16 = 52; +pub const EM_68HC12: u16 = 53; +pub const EM_MMA: u16 = 54; +pub const EM_PCP: u16 = 55; +pub const EM_NCPU: u16 = 56; +pub const EM_NDR1: u16 = 57; +pub const EM_STARCORE: u16 = 58; +pub const EM_ME16: u16 = 59; +pub const EM_ST100: u16 = 60; +pub const EM_TINYJ: u16 = 61; +pub const EM_X86_64: u16 = 62; +pub const EM_PDSP: u16 = 63; +pub const EM_FX66: u16 = 66; +pub const EM_ST9PLUS: u16 = 67; +pub const EM_ST7: u16 = 68; +pub const EM_68HC16: u16 = 69; +pub const EM_68HC11: u16 = 70; +pub const EM_68HC08: u16 = 71; +pub const EM_68HC05: u16 = 72; +pub const EM_SVX: u16 = 73; +pub const EM_ST19: u16 = 74; +pub const EM_VAX: u16 = 75; +pub const EM_CRIS: u16 = 76; +pub const EM_JAVELIN: u16 = 77; +pub const EM_FIREPATH: u16 = 78; +pub const EM_ZSP: u16 = 79; +pub const EM_MMIX: u16 = 80; +pub const EM_HUANY: u16 = 81; +pub const EM_PRISM: u16 = 82; +pub const EM_AVR: u16 = 83; +pub const EM_FR30: u16 = 84; +pub const EM_D10V: u16 = 85; +pub const EM_D30V: u16 = 86; +pub const EM_V850: u16 = 87; +pub const EM_M32R: u16 = 88; +pub const EM_MN10300: u16 = 89; +pub const EM_MN10200: u16 = 90; +pub const EM_PJ: u16 = 91; +pub const EM_OPENRISC: u16 = 92; +pub const EM_ARC_A5: u16 = 93; +pub const EM_XTENSA: u16 = 94; +pub const EM_AARCH64: u16 = 183; +pub const EM_TILEPRO: u16 = 188; +pub const EM_TILEGX: u16 = 191; +pub const EM_ALPHA: u16 = 0x9026; + +// elf.h - Legal values for e_version (version). +pub const EV_NONE: u32 = 0; +pub const EV_CURRENT: u32 = 1; +pub const EV_NUM: u32 = 2; + +// elf.h - Legal values for p_type (segment type). +pub const PT_NULL: u32 = 0; +pub const PT_LOAD: u32 = 1; +pub const PT_DYNAMIC: u32 = 2; +pub const PT_INTERP: u32 = 3; +pub const PT_NOTE: u32 = 4; +pub const PT_SHLIB: u32 = 5; +pub const PT_PHDR: u32 = 6; +pub const PT_TLS: u32 = 7; +pub const PT_NUM: u32 = 8; +pub const PT_LOOS: u32 = 0x60000000; +pub const PT_GNU_EH_FRAME: u32 = 0x6474e550; +pub const PT_GNU_STACK: u32 = 0x6474e551; +pub const PT_GNU_RELRO: u32 = 0x6474e552; +pub const PT_LOSUNW: u32 = 0x6ffffffa; +pub const PT_SUNWBSS: u32 = 0x6ffffffa; +pub const PT_SUNWSTACK: u32 = 0x6ffffffb; +pub const PT_HISUNW: u32 = 0x6fffffff; +pub const PT_HIOS: u32 = 0x6fffffff; +pub const PT_LOPROC: u32 = 0x70000000; +pub const PT_HIPROC: u32 = 0x7fffffff; + +// Legal values for p_flags (segment flags). +pub const PF_X: u32 = 1 << 0; +pub const PF_W: u32 = 1 << 1; +pub const PF_R: u32 = 1 << 2; +pub const PF_MASKOS: u32 = 0x0ff00000; +pub const PF_MASKPROC: u32 = 0xf0000000; + +// elf.h - Legal values for a_type (entry type). +pub const AT_NULL: ::c_ulong = 0; +pub const AT_IGNORE: ::c_ulong = 1; +pub const AT_EXECFD: ::c_ulong = 2; +pub const AT_PHDR: ::c_ulong = 3; +pub const AT_PHENT: ::c_ulong = 4; +pub const AT_PHNUM: ::c_ulong = 5; +pub const AT_PAGESZ: ::c_ulong = 6; +pub const AT_BASE: ::c_ulong = 7; +pub const AT_FLAGS: ::c_ulong = 8; +pub const AT_ENTRY: ::c_ulong = 9; +pub const AT_NOTELF: ::c_ulong = 10; +pub const AT_UID: ::c_ulong = 11; +pub const AT_EUID: ::c_ulong = 12; +pub const AT_GID: ::c_ulong = 13; +pub const AT_EGID: ::c_ulong = 14; +pub const AT_PLATFORM: ::c_ulong = 15; +pub const AT_HWCAP: ::c_ulong = 16; +pub const AT_CLKTCK: ::c_ulong = 17; + +pub const AT_SECURE: ::c_ulong = 23; +pub const AT_BASE_PLATFORM: ::c_ulong = 24; +pub const AT_RANDOM: ::c_ulong = 25; +pub const AT_HWCAP2: ::c_ulong = 26; + +pub const AT_EXECFN: ::c_ulong = 31; + +// defined in arch//include/uapi/asm/auxvec.h but has the same value +// wherever it is defined. +pub const AT_SYSINFO_EHDR: ::c_ulong = 33; + +pub const GLOB_ERR: ::c_int = 1 << 0; +pub const GLOB_MARK: ::c_int = 1 << 1; +pub const GLOB_NOSORT: ::c_int = 1 << 2; +pub const GLOB_DOOFFS: ::c_int = 1 << 3; +pub const GLOB_NOCHECK: ::c_int = 1 << 4; +pub const GLOB_APPEND: ::c_int = 1 << 5; +pub const GLOB_NOESCAPE: ::c_int = 1 << 6; + +pub const GLOB_NOSPACE: ::c_int = 1; +pub const GLOB_ABORTED: ::c_int = 2; +pub const GLOB_NOMATCH: ::c_int = 3; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_SPAWN_USEVFORK: ::c_int = 64; +pub const POSIX_SPAWN_SETSID: ::c_int = 128; + +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const F_SEAL_FUTURE_WRITE: ::c_int = 0x0010; + +pub const IFF_LOWER_UP: ::c_int = 0x10000; +pub const IFF_DORMANT: ::c_int = 0x20000; +pub const IFF_ECHO: ::c_int = 0x40000; + +// linux/if_addr.h +pub const IFA_UNSPEC: ::c_ushort = 0; +pub const IFA_ADDRESS: ::c_ushort = 1; +pub const IFA_LOCAL: ::c_ushort = 2; +pub const IFA_LABEL: ::c_ushort = 3; +pub const IFA_BROADCAST: ::c_ushort = 4; +pub const IFA_ANYCAST: ::c_ushort = 5; +pub const IFA_CACHEINFO: ::c_ushort = 6; +pub const IFA_MULTICAST: ::c_ushort = 7; + +pub const IFA_F_SECONDARY: u32 = 0x01; +pub const IFA_F_TEMPORARY: u32 = 0x01; +pub const IFA_F_NODAD: u32 = 0x02; +pub const IFA_F_OPTIMISTIC: u32 = 0x04; +pub const IFA_F_DADFAILED: u32 = 0x08; +pub const IFA_F_HOMEADDRESS: u32 = 0x10; +pub const IFA_F_DEPRECATED: u32 = 0x20; +pub const IFA_F_TENTATIVE: u32 = 0x40; +pub const IFA_F_PERMANENT: u32 = 0x80; + +// linux/if_link.h +pub const IFLA_UNSPEC: ::c_ushort = 0; +pub const IFLA_ADDRESS: ::c_ushort = 1; +pub const IFLA_BROADCAST: ::c_ushort = 2; +pub const IFLA_IFNAME: ::c_ushort = 3; +pub const IFLA_MTU: ::c_ushort = 4; +pub const IFLA_LINK: ::c_ushort = 5; +pub const IFLA_QDISC: ::c_ushort = 6; +pub const IFLA_STATS: ::c_ushort = 7; +pub const IFLA_COST: ::c_ushort = 8; +pub const IFLA_PRIORITY: ::c_ushort = 9; +pub const IFLA_MASTER: ::c_ushort = 10; +pub const IFLA_WIRELESS: ::c_ushort = 11; +pub const IFLA_PROTINFO: ::c_ushort = 12; +pub const IFLA_TXQLEN: ::c_ushort = 13; +pub const IFLA_MAP: ::c_ushort = 14; +pub const IFLA_WEIGHT: ::c_ushort = 15; +pub const IFLA_OPERSTATE: ::c_ushort = 16; +pub const IFLA_LINKMODE: ::c_ushort = 17; +pub const IFLA_LINKINFO: ::c_ushort = 18; +pub const IFLA_NET_NS_PID: ::c_ushort = 19; +pub const IFLA_IFALIAS: ::c_ushort = 20; +pub const IFLA_NUM_VF: ::c_ushort = 21; +pub const IFLA_VFINFO_LIST: ::c_ushort = 22; +pub const IFLA_STATS64: ::c_ushort = 23; +pub const IFLA_VF_PORTS: ::c_ushort = 24; +pub const IFLA_PORT_SELF: ::c_ushort = 25; +pub const IFLA_AF_SPEC: ::c_ushort = 26; +pub const IFLA_GROUP: ::c_ushort = 27; +pub const IFLA_NET_NS_FD: ::c_ushort = 28; +pub const IFLA_EXT_MASK: ::c_ushort = 29; +pub const IFLA_PROMISCUITY: ::c_ushort = 30; +pub const IFLA_NUM_TX_QUEUES: ::c_ushort = 31; +pub const IFLA_NUM_RX_QUEUES: ::c_ushort = 32; +pub const IFLA_CARRIER: ::c_ushort = 33; +pub const IFLA_PHYS_PORT_ID: ::c_ushort = 34; +pub const IFLA_CARRIER_CHANGES: ::c_ushort = 35; +pub const IFLA_PHYS_SWITCH_ID: ::c_ushort = 36; +pub const IFLA_LINK_NETNSID: ::c_ushort = 37; +pub const IFLA_PHYS_PORT_NAME: ::c_ushort = 38; +pub const IFLA_PROTO_DOWN: ::c_ushort = 39; +pub const IFLA_GSO_MAX_SEGS: ::c_ushort = 40; +pub const IFLA_GSO_MAX_SIZE: ::c_ushort = 41; +pub const IFLA_PAD: ::c_ushort = 42; +pub const IFLA_XDP: ::c_ushort = 43; +pub const IFLA_EVENT: ::c_ushort = 44; +pub const IFLA_NEW_NETNSID: ::c_ushort = 45; +pub const IFLA_IF_NETNSID: ::c_ushort = 46; +pub const IFLA_TARGET_NETNSID: ::c_ushort = IFLA_IF_NETNSID; +pub const IFLA_CARRIER_UP_COUNT: ::c_ushort = 47; +pub const IFLA_CARRIER_DOWN_COUNT: ::c_ushort = 48; +pub const IFLA_NEW_IFINDEX: ::c_ushort = 49; +pub const IFLA_MIN_MTU: ::c_ushort = 50; +pub const IFLA_MAX_MTU: ::c_ushort = 51; +pub const IFLA_PROP_LIST: ::c_ushort = 52; +pub const IFLA_ALT_IFNAME: ::c_ushort = 53; +pub const IFLA_PERM_ADDRESS: ::c_ushort = 54; +pub const IFLA_PROTO_DOWN_REASON: ::c_ushort = 55; +pub const IFLA_PARENT_DEV_NAME: ::c_ushort = 56; +pub const IFLA_PARENT_DEV_BUS_NAME: ::c_ushort = 57; +pub const IFLA_GRO_MAX_SIZE: ::c_ushort = 58; +pub const IFLA_TSO_MAX_SIZE: ::c_ushort = 59; +pub const IFLA_TSO_MAX_SEGS: ::c_ushort = 60; +pub const IFLA_ALLMULTI: ::c_ushort = 61; + +pub const IFLA_INFO_UNSPEC: ::c_ushort = 0; +pub const IFLA_INFO_KIND: ::c_ushort = 1; +pub const IFLA_INFO_DATA: ::c_ushort = 2; +pub const IFLA_INFO_XSTATS: ::c_ushort = 3; +pub const IFLA_INFO_SLAVE_KIND: ::c_ushort = 4; +pub const IFLA_INFO_SLAVE_DATA: ::c_ushort = 5; + +// linux/if_tun.h +pub const IFF_TUN: ::c_int = 0x0001; +pub const IFF_TAP: ::c_int = 0x0002; +pub const IFF_NO_PI: ::c_int = 0x1000; +// Read queue size +pub const TUN_READQ_SIZE: ::c_short = 500; +// TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. +pub const TUN_TUN_DEV: ::c_short = ::IFF_TUN as ::c_short; +pub const TUN_TAP_DEV: ::c_short = ::IFF_TAP as ::c_short; +pub const TUN_TYPE_MASK: ::c_short = 0x000f; +// This flag has no real effect +pub const IFF_ONE_QUEUE: ::c_int = 0x2000; +pub const IFF_VNET_HDR: ::c_int = 0x4000; +pub const IFF_TUN_EXCL: ::c_int = 0x8000; +pub const IFF_MULTI_QUEUE: ::c_int = 0x0100; +pub const IFF_ATTACH_QUEUE: ::c_int = 0x0200; +pub const IFF_DETACH_QUEUE: ::c_int = 0x0400; +// read-only flag +pub const IFF_PERSIST: ::c_int = 0x0800; +pub const IFF_NOFILTER: ::c_int = 0x1000; + +// Since Linux 3.1 +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; +pub const ST_NODEV: ::c_ulong = 4; +pub const ST_NOEXEC: ::c_ulong = 8; +pub const ST_SYNCHRONOUS: ::c_ulong = 16; +pub const ST_MANDLOCK: ::c_ulong = 64; +pub const ST_WRITE: ::c_ulong = 128; +pub const ST_APPEND: ::c_ulong = 256; +pub const ST_IMMUTABLE: ::c_ulong = 512; +pub const ST_NOATIME: ::c_ulong = 1024; +pub const ST_NODIRATIME: ::c_ulong = 2048; + +pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOW: ::c_int = 0x2; + +pub const AT_EACCESS: ::c_int = 0x200; + +// linux/mempolicy.h +pub const MPOL_DEFAULT: ::c_int = 0; +pub const MPOL_PREFERRED: ::c_int = 1; +pub const MPOL_BIND: ::c_int = 2; +pub const MPOL_INTERLEAVE: ::c_int = 3; +pub const MPOL_LOCAL: ::c_int = 4; +pub const MPOL_F_NUMA_BALANCING: ::c_int = 1 << 13; +pub const MPOL_F_RELATIVE_NODES: ::c_int = 1 << 14; +pub const MPOL_F_STATIC_NODES: ::c_int = 1 << 15; + +// linux/membarrier.h +pub const MEMBARRIER_CMD_QUERY: ::c_int = 0; +pub const MEMBARRIER_CMD_GLOBAL: ::c_int = 1 << 0; +pub const MEMBARRIER_CMD_GLOBAL_EXPEDITED: ::c_int = 1 << 1; +pub const MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED: ::c_int = 1 << 2; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED: ::c_int = 1 << 3; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED: ::c_int = 1 << 4; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE: ::c_int = 1 << 5; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE: ::c_int = 1 << 6; +pub const MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ: ::c_int = 1 << 7; +pub const MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ: ::c_int = 1 << 8; + +align_const! { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + size: [0; __SIZEOF_PTHREAD_MUTEX_T], + }; + pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + size: [0; __SIZEOF_PTHREAD_COND_T], + }; + pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + size: [0; __SIZEOF_PTHREAD_RWLOCK_T], + }; +} +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const PTHREAD_MUTEX_STALLED: ::c_int = 0; +pub const PTHREAD_MUTEX_ROBUST: ::c_int = 1; +pub const PTHREAD_PRIO_NONE: ::c_int = 0; +pub const PTHREAD_PRIO_INHERIT: ::c_int = 1; +pub const PTHREAD_PRIO_PROTECT: ::c_int = 2; +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const __SIZEOF_PTHREAD_COND_T: usize = 48; + +pub const RENAME_NOREPLACE: ::c_uint = 1; +pub const RENAME_EXCHANGE: ::c_uint = 2; +pub const RENAME_WHITEOUT: ::c_uint = 4; + +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_BATCH: ::c_int = 3; +pub const SCHED_IDLE: ::c_int = 5; + +pub const SCHED_RESET_ON_FORK: ::c_int = 0x40000000; + +pub const CLONE_PIDFD: ::c_int = 0x1000; + +// netinet/in.h +// NOTE: These are in addition to the constants defined in src/unix/mod.rs + +#[deprecated( + since = "0.2.80", + note = "This value was increased in the newer kernel \ + and we'll change this following upstream in the future release. \ + See #1896 for more info." +)] +pub const IPPROTO_MAX: ::c_int = 256; + +// System V IPC +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_CREAT: ::c_int = 0o1000; +pub const IPC_EXCL: ::c_int = 0o2000; +pub const IPC_NOWAIT: ::c_int = 0o4000; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; +pub const IPC_INFO: ::c_int = 3; +pub const MSG_STAT: ::c_int = 11; +pub const MSG_INFO: ::c_int = 12; +pub const MSG_NOTIFICATION: ::c_int = 0x8000; + +pub const MSG_NOERROR: ::c_int = 0o10000; +pub const MSG_EXCEPT: ::c_int = 0o20000; +pub const MSG_ZEROCOPY: ::c_int = 0x4000000; + +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; + +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_REMAP: ::c_int = 0o40000; + +pub const SHM_LOCK: ::c_int = 11; +pub const SHM_UNLOCK: ::c_int = 12; + +pub const SHM_HUGETLB: ::c_int = 0o4000; +#[cfg(not(all(target_env = "uclibc", target_arch = "mips")))] +pub const SHM_NORESERVE: ::c_int = 0o10000; + +pub const QFMT_VFS_OLD: ::c_int = 1; +pub const QFMT_VFS_V0: ::c_int = 2; +pub const QFMT_VFS_V1: ::c_int = 4; + +pub const EFD_SEMAPHORE: ::c_int = 0x1; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; + +pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; +pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; +pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; +pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; +pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; +pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; +pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; + +pub const AI_PASSIVE: ::c_int = 0x0001; +pub const AI_CANONNAME: ::c_int = 0x0002; +pub const AI_NUMERICHOST: ::c_int = 0x0004; +pub const AI_V4MAPPED: ::c_int = 0x0008; +pub const AI_ALL: ::c_int = 0x0010; +pub const AI_ADDRCONFIG: ::c_int = 0x0020; + +pub const AI_NUMERICSERV: ::c_int = 0x0400; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_NODATA: ::c_int = -5; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_SYSTEM: ::c_int = -11; +pub const EAI_OVERFLOW: ::c_int = -12; + +pub const NI_NUMERICHOST: ::c_int = 1; +pub const NI_NUMERICSERV: ::c_int = 2; +pub const NI_NOFQDN: ::c_int = 4; +pub const NI_NAMEREQD: ::c_int = 8; +pub const NI_DGRAM: ::c_int = 16; + +pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; +pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; +pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; + +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + pub const AIO_CANCELED: ::c_int = 0; + pub const AIO_NOTCANCELED: ::c_int = 1; + pub const AIO_ALLDONE: ::c_int = 2; + pub const LIO_READ: ::c_int = 0; + pub const LIO_WRITE: ::c_int = 1; + pub const LIO_NOP: ::c_int = 2; + pub const LIO_WAIT: ::c_int = 0; + pub const LIO_NOWAIT: ::c_int = 1; + pub const RUSAGE_THREAD: ::c_int = 1; + pub const MSG_COPY: ::c_int = 0o40000; + pub const SHM_EXEC: ::c_int = 0o100000; + pub const IPV6_MULTICAST_ALL: ::c_int = 29; + pub const IPV6_ROUTER_ALERT_ISOLATE: ::c_int = 30; + pub const PACKET_MR_UNICAST: ::c_int = 3; + pub const PTRACE_EVENT_STOP: ::c_int = 128; + pub const UDP_SEGMENT: ::c_int = 103; + pub const UDP_GRO: ::c_int = 104; + } +} + +pub const MREMAP_MAYMOVE: ::c_int = 1; +pub const MREMAP_FIXED: ::c_int = 2; +pub const MREMAP_DONTUNMAP: ::c_int = 4; + +pub const PR_SET_PDEATHSIG: ::c_int = 1; +pub const PR_GET_PDEATHSIG: ::c_int = 2; + +pub const PR_GET_DUMPABLE: ::c_int = 3; +pub const PR_SET_DUMPABLE: ::c_int = 4; + +pub const PR_GET_UNALIGN: ::c_int = 5; +pub const PR_SET_UNALIGN: ::c_int = 6; +pub const PR_UNALIGN_NOPRINT: ::c_int = 1; +pub const PR_UNALIGN_SIGBUS: ::c_int = 2; + +pub const PR_GET_KEEPCAPS: ::c_int = 7; +pub const PR_SET_KEEPCAPS: ::c_int = 8; + +pub const PR_GET_FPEMU: ::c_int = 9; +pub const PR_SET_FPEMU: ::c_int = 10; +pub const PR_FPEMU_NOPRINT: ::c_int = 1; +pub const PR_FPEMU_SIGFPE: ::c_int = 2; + +pub const PR_GET_FPEXC: ::c_int = 11; +pub const PR_SET_FPEXC: ::c_int = 12; +pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; +pub const PR_FP_EXC_DIV: ::c_int = 0x010000; +pub const PR_FP_EXC_OVF: ::c_int = 0x020000; +pub const PR_FP_EXC_UND: ::c_int = 0x040000; +pub const PR_FP_EXC_RES: ::c_int = 0x080000; +pub const PR_FP_EXC_INV: ::c_int = 0x100000; +pub const PR_FP_EXC_DISABLED: ::c_int = 0; +pub const PR_FP_EXC_NONRECOV: ::c_int = 1; +pub const PR_FP_EXC_ASYNC: ::c_int = 2; +pub const PR_FP_EXC_PRECISE: ::c_int = 3; + +pub const PR_GET_TIMING: ::c_int = 13; +pub const PR_SET_TIMING: ::c_int = 14; +pub const PR_TIMING_STATISTICAL: ::c_int = 0; +pub const PR_TIMING_TIMESTAMP: ::c_int = 1; + +pub const PR_SET_NAME: ::c_int = 15; +pub const PR_GET_NAME: ::c_int = 16; + +pub const PR_GET_ENDIAN: ::c_int = 19; +pub const PR_SET_ENDIAN: ::c_int = 20; +pub const PR_ENDIAN_BIG: ::c_int = 0; +pub const PR_ENDIAN_LITTLE: ::c_int = 1; +pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; + +pub const PR_GET_SECCOMP: ::c_int = 21; +pub const PR_SET_SECCOMP: ::c_int = 22; + +pub const PR_CAPBSET_READ: ::c_int = 23; +pub const PR_CAPBSET_DROP: ::c_int = 24; + +pub const PR_GET_TSC: ::c_int = 25; +pub const PR_SET_TSC: ::c_int = 26; +pub const PR_TSC_ENABLE: ::c_int = 1; +pub const PR_TSC_SIGSEGV: ::c_int = 2; + +pub const PR_GET_SECUREBITS: ::c_int = 27; +pub const PR_SET_SECUREBITS: ::c_int = 28; + +pub const PR_SET_TIMERSLACK: ::c_int = 29; +pub const PR_GET_TIMERSLACK: ::c_int = 30; + +pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; +pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; + +pub const PR_MCE_KILL: ::c_int = 33; +pub const PR_MCE_KILL_CLEAR: ::c_int = 0; +pub const PR_MCE_KILL_SET: ::c_int = 1; + +pub const PR_MCE_KILL_LATE: ::c_int = 0; +pub const PR_MCE_KILL_EARLY: ::c_int = 1; +pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; + +pub const PR_MCE_KILL_GET: ::c_int = 34; + +pub const PR_SET_MM: ::c_int = 35; +pub const PR_SET_MM_START_CODE: ::c_int = 1; +pub const PR_SET_MM_END_CODE: ::c_int = 2; +pub const PR_SET_MM_START_DATA: ::c_int = 3; +pub const PR_SET_MM_END_DATA: ::c_int = 4; +pub const PR_SET_MM_START_STACK: ::c_int = 5; +pub const PR_SET_MM_START_BRK: ::c_int = 6; +pub const PR_SET_MM_BRK: ::c_int = 7; +pub const PR_SET_MM_ARG_START: ::c_int = 8; +pub const PR_SET_MM_ARG_END: ::c_int = 9; +pub const PR_SET_MM_ENV_START: ::c_int = 10; +pub const PR_SET_MM_ENV_END: ::c_int = 11; +pub const PR_SET_MM_AUXV: ::c_int = 12; +pub const PR_SET_MM_EXE_FILE: ::c_int = 13; +pub const PR_SET_MM_MAP: ::c_int = 14; +pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; + +pub const PR_SET_PTRACER: ::c_int = 0x59616d61; +pub const PR_SET_PTRACER_ANY: ::c_ulong = 0xffffffffffffffff; + +pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; +pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; + +pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; +pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; + +pub const PR_GET_TID_ADDRESS: ::c_int = 40; + +pub const PR_SET_THP_DISABLE: ::c_int = 41; +pub const PR_GET_THP_DISABLE: ::c_int = 42; + +pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43; +pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44; + +pub const PR_SET_FP_MODE: ::c_int = 45; +pub const PR_GET_FP_MODE: ::c_int = 46; +pub const PR_FP_MODE_FR: ::c_int = 1 << 0; +pub const PR_FP_MODE_FRE: ::c_int = 1 << 1; + +pub const PR_CAP_AMBIENT: ::c_int = 47; +pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1; +pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2; +pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3; +pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4; + +pub const PR_SET_VMA: ::c_int = 0x53564d41; +pub const PR_SET_VMA_ANON_NAME: ::c_int = 0; + +pub const PR_SCHED_CORE: ::c_int = 62; +pub const PR_SCHED_CORE_GET: ::c_int = 0; +pub const PR_SCHED_CORE_CREATE: ::c_int = 1; +pub const PR_SCHED_CORE_SHARE_TO: ::c_int = 2; +pub const PR_SCHED_CORE_SHARE_FROM: ::c_int = 3; +pub const PR_SCHED_CORE_MAX: ::c_int = 4; +pub const PR_SCHED_CORE_SCOPE_THREAD: ::c_int = 0; +pub const PR_SCHED_CORE_SCOPE_THREAD_GROUP: ::c_int = 1; +pub const PR_SCHED_CORE_SCOPE_PROCESS_GROUP: ::c_int = 2; + +pub const GRND_NONBLOCK: ::c_uint = 0x0001; +pub const GRND_RANDOM: ::c_uint = 0x0002; +pub const GRND_INSECURE: ::c_uint = 0x0004; + +pub const SECCOMP_MODE_DISABLED: ::c_uint = 0; +pub const SECCOMP_MODE_STRICT: ::c_uint = 1; +pub const SECCOMP_MODE_FILTER: ::c_uint = 2; + +pub const SECCOMP_FILTER_FLAG_TSYNC: ::c_ulong = 1; +pub const SECCOMP_FILTER_FLAG_LOG: ::c_ulong = 2; +pub const SECCOMP_FILTER_FLAG_SPEC_ALLOW: ::c_ulong = 4; + +pub const SECCOMP_RET_KILL_PROCESS: ::c_uint = 0x80000000; +pub const SECCOMP_RET_KILL_THREAD: ::c_uint = 0x00000000; +pub const SECCOMP_RET_KILL: ::c_uint = SECCOMP_RET_KILL_THREAD; +pub const SECCOMP_RET_TRAP: ::c_uint = 0x00030000; +pub const SECCOMP_RET_ERRNO: ::c_uint = 0x00050000; +pub const SECCOMP_RET_TRACE: ::c_uint = 0x7ff00000; +pub const SECCOMP_RET_LOG: ::c_uint = 0x7ffc0000; +pub const SECCOMP_RET_ALLOW: ::c_uint = 0x7fff0000; + +pub const SECCOMP_RET_ACTION_FULL: ::c_uint = 0xffff0000; +pub const SECCOMP_RET_ACTION: ::c_uint = 0x7fff0000; +pub const SECCOMP_RET_DATA: ::c_uint = 0x0000ffff; + +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; + +pub const TFD_CLOEXEC: ::c_int = O_CLOEXEC; +pub const TFD_NONBLOCK: ::c_int = O_NONBLOCK; +pub const TFD_TIMER_ABSTIME: ::c_int = 1; +pub const TFD_TIMER_CANCEL_ON_SET: ::c_int = 2; + +pub const _POSIX_VDISABLE: ::cc_t = 0; + +pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01; +pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02; +pub const FALLOC_FL_COLLAPSE_RANGE: ::c_int = 0x08; +pub const FALLOC_FL_ZERO_RANGE: ::c_int = 0x10; +pub const FALLOC_FL_INSERT_RANGE: ::c_int = 0x20; +pub const FALLOC_FL_UNSHARE_RANGE: ::c_int = 0x40; + +#[deprecated( + since = "0.2.55", + note = "ENOATTR is not available on Linux; use ENODATA instead" +)] +pub const ENOATTR: ::c_int = ::ENODATA; + +pub const SO_ORIGINAL_DST: ::c_int = 80; + +pub const IP_RECVFRAGSIZE: ::c_int = 25; + +pub const IPV6_FLOWINFO: ::c_int = 11; +pub const IPV6_FLOWLABEL_MGR: ::c_int = 32; +pub const IPV6_FLOWINFO_SEND: ::c_int = 33; +pub const IPV6_RECVFRAGSIZE: ::c_int = 77; +pub const IPV6_FREEBIND: ::c_int = 78; +pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff; +pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000; + +pub const IPV6_RTHDR_LOOSE: ::c_int = 0; +pub const IPV6_RTHDR_STRICT: ::c_int = 1; + +// SO_MEMINFO offsets +pub const SK_MEMINFO_RMEM_ALLOC: ::c_int = 0; +pub const SK_MEMINFO_RCVBUF: ::c_int = 1; +pub const SK_MEMINFO_WMEM_ALLOC: ::c_int = 2; +pub const SK_MEMINFO_SNDBUF: ::c_int = 3; +pub const SK_MEMINFO_FWD_ALLOC: ::c_int = 4; +pub const SK_MEMINFO_WMEM_QUEUED: ::c_int = 5; +pub const SK_MEMINFO_OPTMEM: ::c_int = 6; +pub const SK_MEMINFO_BACKLOG: ::c_int = 7; +pub const SK_MEMINFO_DROPS: ::c_int = 8; + +pub const IUTF8: ::tcflag_t = 0x00004000; +#[cfg(not(all(target_env = "uclibc", target_arch = "mips")))] +pub const CMSPAR: ::tcflag_t = 0o10000000000; + +pub const MFD_CLOEXEC: ::c_uint = 0x0001; +pub const MFD_ALLOW_SEALING: ::c_uint = 0x0002; +pub const MFD_HUGETLB: ::c_uint = 0x0004; +pub const MFD_HUGE_64KB: ::c_uint = 0x40000000; +pub const MFD_HUGE_512KB: ::c_uint = 0x4c000000; +pub const MFD_HUGE_1MB: ::c_uint = 0x50000000; +pub const MFD_HUGE_2MB: ::c_uint = 0x54000000; +pub const MFD_HUGE_8MB: ::c_uint = 0x5c000000; +pub const MFD_HUGE_16MB: ::c_uint = 0x60000000; +pub const MFD_HUGE_32MB: ::c_uint = 0x64000000; +pub const MFD_HUGE_256MB: ::c_uint = 0x70000000; +pub const MFD_HUGE_512MB: ::c_uint = 0x74000000; +pub const MFD_HUGE_1GB: ::c_uint = 0x78000000; +pub const MFD_HUGE_2GB: ::c_uint = 0x7c000000; +pub const MFD_HUGE_16GB: ::c_uint = 0x88000000; +pub const MFD_HUGE_MASK: ::c_uint = 63; +pub const MFD_HUGE_SHIFT: ::c_uint = 26; + +// linux/close_range.h +pub const CLOSE_RANGE_UNSHARE: ::c_uint = 1 << 1; +pub const CLOSE_RANGE_CLOEXEC: ::c_uint = 1 << 2; + +// linux/filter.h +pub const SKF_AD_OFF: ::c_int = -0x1000; +pub const SKF_AD_PROTOCOL: ::c_int = 0; +pub const SKF_AD_PKTTYPE: ::c_int = 4; +pub const SKF_AD_IFINDEX: ::c_int = 8; +pub const SKF_AD_NLATTR: ::c_int = 12; +pub const SKF_AD_NLATTR_NEST: ::c_int = 16; +pub const SKF_AD_MARK: ::c_int = 20; +pub const SKF_AD_QUEUE: ::c_int = 24; +pub const SKF_AD_HATYPE: ::c_int = 28; +pub const SKF_AD_RXHASH: ::c_int = 32; +pub const SKF_AD_CPU: ::c_int = 36; +pub const SKF_AD_ALU_XOR_X: ::c_int = 40; +pub const SKF_AD_VLAN_TAG: ::c_int = 44; +pub const SKF_AD_VLAN_TAG_PRESENT: ::c_int = 48; +pub const SKF_AD_PAY_OFFSET: ::c_int = 52; +pub const SKF_AD_RANDOM: ::c_int = 56; +pub const SKF_AD_VLAN_TPID: ::c_int = 60; +pub const SKF_AD_MAX: ::c_int = 64; +pub const SKF_NET_OFF: ::c_int = -0x100000; +pub const SKF_LL_OFF: ::c_int = -0x200000; +pub const BPF_NET_OFF: ::c_int = SKF_NET_OFF; +pub const BPF_LL_OFF: ::c_int = SKF_LL_OFF; +pub const BPF_MEMWORDS: ::c_int = 16; +pub const BPF_MAXINSNS: ::c_int = 4096; + +// linux/bpf_common.h +pub const BPF_LD: ::__u32 = 0x00; +pub const BPF_LDX: ::__u32 = 0x01; +pub const BPF_ST: ::__u32 = 0x02; +pub const BPF_STX: ::__u32 = 0x03; +pub const BPF_ALU: ::__u32 = 0x04; +pub const BPF_JMP: ::__u32 = 0x05; +pub const BPF_RET: ::__u32 = 0x06; +pub const BPF_MISC: ::__u32 = 0x07; +pub const BPF_W: ::__u32 = 0x00; +pub const BPF_H: ::__u32 = 0x08; +pub const BPF_B: ::__u32 = 0x10; +pub const BPF_IMM: ::__u32 = 0x00; +pub const BPF_ABS: ::__u32 = 0x20; +pub const BPF_IND: ::__u32 = 0x40; +pub const BPF_MEM: ::__u32 = 0x60; +pub const BPF_LEN: ::__u32 = 0x80; +pub const BPF_MSH: ::__u32 = 0xa0; +pub const BPF_ADD: ::__u32 = 0x00; +pub const BPF_SUB: ::__u32 = 0x10; +pub const BPF_MUL: ::__u32 = 0x20; +pub const BPF_DIV: ::__u32 = 0x30; +pub const BPF_OR: ::__u32 = 0x40; +pub const BPF_AND: ::__u32 = 0x50; +pub const BPF_LSH: ::__u32 = 0x60; +pub const BPF_RSH: ::__u32 = 0x70; +pub const BPF_NEG: ::__u32 = 0x80; +pub const BPF_MOD: ::__u32 = 0x90; +pub const BPF_XOR: ::__u32 = 0xa0; +pub const BPF_JA: ::__u32 = 0x00; +pub const BPF_JEQ: ::__u32 = 0x10; +pub const BPF_JGT: ::__u32 = 0x20; +pub const BPF_JGE: ::__u32 = 0x30; +pub const BPF_JSET: ::__u32 = 0x40; +pub const BPF_K: ::__u32 = 0x00; +pub const BPF_X: ::__u32 = 0x08; + +// linux/openat2.h +pub const RESOLVE_NO_XDEV: ::__u64 = 0x01; +pub const RESOLVE_NO_MAGICLINKS: ::__u64 = 0x02; +pub const RESOLVE_NO_SYMLINKS: ::__u64 = 0x04; +pub const RESOLVE_BENEATH: ::__u64 = 0x08; +pub const RESOLVE_IN_ROOT: ::__u64 = 0x10; +pub const RESOLVE_CACHED: ::__u64 = 0x20; + +// linux/if_ether.h +pub const ETH_ALEN: ::c_int = 6; +pub const ETH_HLEN: ::c_int = 14; +pub const ETH_ZLEN: ::c_int = 60; +pub const ETH_DATA_LEN: ::c_int = 1500; +pub const ETH_FRAME_LEN: ::c_int = 1514; +pub const ETH_FCS_LEN: ::c_int = 4; + +// These are the defined Ethernet Protocol ID's. +pub const ETH_P_LOOP: ::c_int = 0x0060; +pub const ETH_P_PUP: ::c_int = 0x0200; +pub const ETH_P_PUPAT: ::c_int = 0x0201; +pub const ETH_P_IP: ::c_int = 0x0800; +pub const ETH_P_X25: ::c_int = 0x0805; +pub const ETH_P_ARP: ::c_int = 0x0806; +pub const ETH_P_BPQ: ::c_int = 0x08FF; +pub const ETH_P_IEEEPUP: ::c_int = 0x0a00; +pub const ETH_P_IEEEPUPAT: ::c_int = 0x0a01; +pub const ETH_P_BATMAN: ::c_int = 0x4305; +pub const ETH_P_DEC: ::c_int = 0x6000; +pub const ETH_P_DNA_DL: ::c_int = 0x6001; +pub const ETH_P_DNA_RC: ::c_int = 0x6002; +pub const ETH_P_DNA_RT: ::c_int = 0x6003; +pub const ETH_P_LAT: ::c_int = 0x6004; +pub const ETH_P_DIAG: ::c_int = 0x6005; +pub const ETH_P_CUST: ::c_int = 0x6006; +pub const ETH_P_SCA: ::c_int = 0x6007; +pub const ETH_P_TEB: ::c_int = 0x6558; +pub const ETH_P_RARP: ::c_int = 0x8035; +pub const ETH_P_ATALK: ::c_int = 0x809B; +pub const ETH_P_AARP: ::c_int = 0x80F3; +pub const ETH_P_8021Q: ::c_int = 0x8100; +pub const ETH_P_IPX: ::c_int = 0x8137; +pub const ETH_P_IPV6: ::c_int = 0x86DD; +pub const ETH_P_PAUSE: ::c_int = 0x8808; +pub const ETH_P_SLOW: ::c_int = 0x8809; +pub const ETH_P_WCCP: ::c_int = 0x883E; +pub const ETH_P_MPLS_UC: ::c_int = 0x8847; +pub const ETH_P_MPLS_MC: ::c_int = 0x8848; +pub const ETH_P_ATMMPOA: ::c_int = 0x884c; +pub const ETH_P_PPP_DISC: ::c_int = 0x8863; +pub const ETH_P_PPP_SES: ::c_int = 0x8864; +pub const ETH_P_LINK_CTL: ::c_int = 0x886c; +pub const ETH_P_ATMFATE: ::c_int = 0x8884; +pub const ETH_P_PAE: ::c_int = 0x888E; +pub const ETH_P_AOE: ::c_int = 0x88A2; +pub const ETH_P_8021AD: ::c_int = 0x88A8; +pub const ETH_P_802_EX1: ::c_int = 0x88B5; +pub const ETH_P_TIPC: ::c_int = 0x88CA; +pub const ETH_P_MACSEC: ::c_int = 0x88E5; +pub const ETH_P_8021AH: ::c_int = 0x88E7; +pub const ETH_P_MVRP: ::c_int = 0x88F5; +pub const ETH_P_1588: ::c_int = 0x88F7; +pub const ETH_P_PRP: ::c_int = 0x88FB; +pub const ETH_P_FCOE: ::c_int = 0x8906; +pub const ETH_P_TDLS: ::c_int = 0x890D; +pub const ETH_P_FIP: ::c_int = 0x8914; +pub const ETH_P_80221: ::c_int = 0x8917; +pub const ETH_P_LOOPBACK: ::c_int = 0x9000; +pub const ETH_P_QINQ1: ::c_int = 0x9100; +pub const ETH_P_QINQ2: ::c_int = 0x9200; +pub const ETH_P_QINQ3: ::c_int = 0x9300; +pub const ETH_P_EDSA: ::c_int = 0xDADA; +pub const ETH_P_AF_IUCV: ::c_int = 0xFBFB; + +pub const ETH_P_802_3_MIN: ::c_int = 0x0600; + +// Non DIX types. Won't clash for 1500 types. +pub const ETH_P_802_3: ::c_int = 0x0001; +pub const ETH_P_AX25: ::c_int = 0x0002; +pub const ETH_P_ALL: ::c_int = 0x0003; +pub const ETH_P_802_2: ::c_int = 0x0004; +pub const ETH_P_SNAP: ::c_int = 0x0005; +pub const ETH_P_DDCMP: ::c_int = 0x0006; +pub const ETH_P_WAN_PPP: ::c_int = 0x0007; +pub const ETH_P_PPP_MP: ::c_int = 0x0008; +pub const ETH_P_LOCALTALK: ::c_int = 0x0009; +pub const ETH_P_CANFD: ::c_int = 0x000D; +pub const ETH_P_PPPTALK: ::c_int = 0x0010; +pub const ETH_P_TR_802_2: ::c_int = 0x0011; +pub const ETH_P_MOBITEX: ::c_int = 0x0015; +pub const ETH_P_CONTROL: ::c_int = 0x0016; +pub const ETH_P_IRDA: ::c_int = 0x0017; +pub const ETH_P_ECONET: ::c_int = 0x0018; +pub const ETH_P_HDLC: ::c_int = 0x0019; +pub const ETH_P_ARCNET: ::c_int = 0x001A; +pub const ETH_P_DSA: ::c_int = 0x001B; +pub const ETH_P_TRAILER: ::c_int = 0x001C; +pub const ETH_P_PHONET: ::c_int = 0x00F5; +pub const ETH_P_IEEE802154: ::c_int = 0x00F6; +pub const ETH_P_CAIF: ::c_int = 0x00F7; + +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x01; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x02; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x04; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x08; +pub const POSIX_SPAWN_SETSCHEDPARAM: ::c_int = 0x10; +pub const POSIX_SPAWN_SETSCHEDULER: ::c_int = 0x20; + +pub const NLMSG_NOOP: ::c_int = 0x1; +pub const NLMSG_ERROR: ::c_int = 0x2; +pub const NLMSG_DONE: ::c_int = 0x3; +pub const NLMSG_OVERRUN: ::c_int = 0x4; +pub const NLMSG_MIN_TYPE: ::c_int = 0x10; + +// linux/netfilter/nfnetlink.h +pub const NFNLGRP_NONE: ::c_int = 0; +pub const NFNLGRP_CONNTRACK_NEW: ::c_int = 1; +pub const NFNLGRP_CONNTRACK_UPDATE: ::c_int = 2; +pub const NFNLGRP_CONNTRACK_DESTROY: ::c_int = 3; +pub const NFNLGRP_CONNTRACK_EXP_NEW: ::c_int = 4; +pub const NFNLGRP_CONNTRACK_EXP_UPDATE: ::c_int = 5; +pub const NFNLGRP_CONNTRACK_EXP_DESTROY: ::c_int = 6; +pub const NFNLGRP_NFTABLES: ::c_int = 7; +pub const NFNLGRP_ACCT_QUOTA: ::c_int = 8; +pub const NFNLGRP_NFTRACE: ::c_int = 9; + +pub const NFNETLINK_V0: ::c_int = 0; + +pub const NFNL_SUBSYS_NONE: ::c_int = 0; +pub const NFNL_SUBSYS_CTNETLINK: ::c_int = 1; +pub const NFNL_SUBSYS_CTNETLINK_EXP: ::c_int = 2; +pub const NFNL_SUBSYS_QUEUE: ::c_int = 3; +pub const NFNL_SUBSYS_ULOG: ::c_int = 4; +pub const NFNL_SUBSYS_OSF: ::c_int = 5; +pub const NFNL_SUBSYS_IPSET: ::c_int = 6; +pub const NFNL_SUBSYS_ACCT: ::c_int = 7; +pub const NFNL_SUBSYS_CTNETLINK_TIMEOUT: ::c_int = 8; +pub const NFNL_SUBSYS_CTHELPER: ::c_int = 9; +pub const NFNL_SUBSYS_NFTABLES: ::c_int = 10; +pub const NFNL_SUBSYS_NFT_COMPAT: ::c_int = 11; +pub const NFNL_SUBSYS_HOOK: ::c_int = 12; +pub const NFNL_SUBSYS_COUNT: ::c_int = 13; + +pub const NFNL_MSG_BATCH_BEGIN: ::c_int = NLMSG_MIN_TYPE; +pub const NFNL_MSG_BATCH_END: ::c_int = NLMSG_MIN_TYPE + 1; + +pub const NFNL_BATCH_UNSPEC: ::c_int = 0; +pub const NFNL_BATCH_GENID: ::c_int = 1; + +// linux/netfilter/nfnetlink_log.h +pub const NFULNL_MSG_PACKET: ::c_int = 0; +pub const NFULNL_MSG_CONFIG: ::c_int = 1; + +pub const NFULA_VLAN_UNSPEC: ::c_int = 0; +pub const NFULA_VLAN_PROTO: ::c_int = 1; +pub const NFULA_VLAN_TCI: ::c_int = 2; + +pub const NFULA_UNSPEC: ::c_int = 0; +pub const NFULA_PACKET_HDR: ::c_int = 1; +pub const NFULA_MARK: ::c_int = 2; +pub const NFULA_TIMESTAMP: ::c_int = 3; +pub const NFULA_IFINDEX_INDEV: ::c_int = 4; +pub const NFULA_IFINDEX_OUTDEV: ::c_int = 5; +pub const NFULA_IFINDEX_PHYSINDEV: ::c_int = 6; +pub const NFULA_IFINDEX_PHYSOUTDEV: ::c_int = 7; +pub const NFULA_HWADDR: ::c_int = 8; +pub const NFULA_PAYLOAD: ::c_int = 9; +pub const NFULA_PREFIX: ::c_int = 10; +pub const NFULA_UID: ::c_int = 11; +pub const NFULA_SEQ: ::c_int = 12; +pub const NFULA_SEQ_GLOBAL: ::c_int = 13; +pub const NFULA_GID: ::c_int = 14; +pub const NFULA_HWTYPE: ::c_int = 15; +pub const NFULA_HWHEADER: ::c_int = 16; +pub const NFULA_HWLEN: ::c_int = 17; +pub const NFULA_CT: ::c_int = 18; +pub const NFULA_CT_INFO: ::c_int = 19; +pub const NFULA_VLAN: ::c_int = 20; +pub const NFULA_L2HDR: ::c_int = 21; + +pub const NFULNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFULNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFULNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFULNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFULNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFULA_CFG_UNSPEC: ::c_int = 0; +pub const NFULA_CFG_CMD: ::c_int = 1; +pub const NFULA_CFG_MODE: ::c_int = 2; +pub const NFULA_CFG_NLBUFSIZ: ::c_int = 3; +pub const NFULA_CFG_TIMEOUT: ::c_int = 4; +pub const NFULA_CFG_QTHRESH: ::c_int = 5; +pub const NFULA_CFG_FLAGS: ::c_int = 6; + +pub const NFULNL_COPY_NONE: ::c_int = 0x00; +pub const NFULNL_COPY_META: ::c_int = 0x01; +pub const NFULNL_COPY_PACKET: ::c_int = 0x02; + +pub const NFULNL_CFG_F_SEQ: ::c_int = 0x0001; +pub const NFULNL_CFG_F_SEQ_GLOBAL: ::c_int = 0x0002; +pub const NFULNL_CFG_F_CONNTRACK: ::c_int = 0x0004; + +// linux/netfilter/nfnetlink_queue.h +pub const NFQNL_MSG_PACKET: ::c_int = 0; +pub const NFQNL_MSG_VERDICT: ::c_int = 1; +pub const NFQNL_MSG_CONFIG: ::c_int = 2; +pub const NFQNL_MSG_VERDICT_BATCH: ::c_int = 3; + +pub const NFQA_UNSPEC: ::c_int = 0; +pub const NFQA_PACKET_HDR: ::c_int = 1; +pub const NFQA_VERDICT_HDR: ::c_int = 2; +pub const NFQA_MARK: ::c_int = 3; +pub const NFQA_TIMESTAMP: ::c_int = 4; +pub const NFQA_IFINDEX_INDEV: ::c_int = 5; +pub const NFQA_IFINDEX_OUTDEV: ::c_int = 6; +pub const NFQA_IFINDEX_PHYSINDEV: ::c_int = 7; +pub const NFQA_IFINDEX_PHYSOUTDEV: ::c_int = 8; +pub const NFQA_HWADDR: ::c_int = 9; +pub const NFQA_PAYLOAD: ::c_int = 10; +pub const NFQA_CT: ::c_int = 11; +pub const NFQA_CT_INFO: ::c_int = 12; +pub const NFQA_CAP_LEN: ::c_int = 13; +pub const NFQA_SKB_INFO: ::c_int = 14; +pub const NFQA_EXP: ::c_int = 15; +pub const NFQA_UID: ::c_int = 16; +pub const NFQA_GID: ::c_int = 17; +pub const NFQA_SECCTX: ::c_int = 18; +pub const NFQA_VLAN: ::c_int = 19; +pub const NFQA_L2HDR: ::c_int = 20; +pub const NFQA_PRIORITY: ::c_int = 21; + +pub const NFQA_VLAN_UNSPEC: ::c_int = 0; +pub const NFQA_VLAN_PROTO: ::c_int = 1; +pub const NFQA_VLAN_TCI: ::c_int = 2; + +pub const NFQNL_CFG_CMD_NONE: ::c_int = 0; +pub const NFQNL_CFG_CMD_BIND: ::c_int = 1; +pub const NFQNL_CFG_CMD_UNBIND: ::c_int = 2; +pub const NFQNL_CFG_CMD_PF_BIND: ::c_int = 3; +pub const NFQNL_CFG_CMD_PF_UNBIND: ::c_int = 4; + +pub const NFQNL_COPY_NONE: ::c_int = 0; +pub const NFQNL_COPY_META: ::c_int = 1; +pub const NFQNL_COPY_PACKET: ::c_int = 2; + +pub const NFQA_CFG_UNSPEC: ::c_int = 0; +pub const NFQA_CFG_CMD: ::c_int = 1; +pub const NFQA_CFG_PARAMS: ::c_int = 2; +pub const NFQA_CFG_QUEUE_MAXLEN: ::c_int = 3; +pub const NFQA_CFG_MASK: ::c_int = 4; +pub const NFQA_CFG_FLAGS: ::c_int = 5; + +pub const NFQA_CFG_F_FAIL_OPEN: ::c_int = 0x0001; +pub const NFQA_CFG_F_CONNTRACK: ::c_int = 0x0002; +pub const NFQA_CFG_F_GSO: ::c_int = 0x0004; +pub const NFQA_CFG_F_UID_GID: ::c_int = 0x0008; +pub const NFQA_CFG_F_SECCTX: ::c_int = 0x0010; +pub const NFQA_CFG_F_MAX: ::c_int = 0x0020; + +pub const NFQA_SKB_CSUMNOTREADY: ::c_int = 0x0001; +pub const NFQA_SKB_GSO: ::c_int = 0x0002; +pub const NFQA_SKB_CSUM_NOTVERIFIED: ::c_int = 0x0004; + +// linux/genetlink.h + +pub const GENL_NAMSIZ: ::c_int = 16; + +pub const GENL_MIN_ID: ::c_int = NLMSG_MIN_TYPE; +pub const GENL_MAX_ID: ::c_int = 1023; + +pub const GENL_ADMIN_PERM: ::c_int = 0x01; +pub const GENL_CMD_CAP_DO: ::c_int = 0x02; +pub const GENL_CMD_CAP_DUMP: ::c_int = 0x04; +pub const GENL_CMD_CAP_HASPOL: ::c_int = 0x08; + +pub const GENL_ID_CTRL: ::c_int = NLMSG_MIN_TYPE; + +pub const CTRL_CMD_UNSPEC: ::c_int = 0; +pub const CTRL_CMD_NEWFAMILY: ::c_int = 1; +pub const CTRL_CMD_DELFAMILY: ::c_int = 2; +pub const CTRL_CMD_GETFAMILY: ::c_int = 3; +pub const CTRL_CMD_NEWOPS: ::c_int = 4; +pub const CTRL_CMD_DELOPS: ::c_int = 5; +pub const CTRL_CMD_GETOPS: ::c_int = 6; +pub const CTRL_CMD_NEWMCAST_GRP: ::c_int = 7; +pub const CTRL_CMD_DELMCAST_GRP: ::c_int = 8; +pub const CTRL_CMD_GETMCAST_GRP: ::c_int = 9; + +pub const CTRL_ATTR_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_FAMILY_ID: ::c_int = 1; +pub const CTRL_ATTR_FAMILY_NAME: ::c_int = 2; +pub const CTRL_ATTR_VERSION: ::c_int = 3; +pub const CTRL_ATTR_HDRSIZE: ::c_int = 4; +pub const CTRL_ATTR_MAXATTR: ::c_int = 5; +pub const CTRL_ATTR_OPS: ::c_int = 6; +pub const CTRL_ATTR_MCAST_GROUPS: ::c_int = 7; + +pub const CTRL_ATTR_OP_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_OP_ID: ::c_int = 1; +pub const CTRL_ATTR_OP_FLAGS: ::c_int = 2; + +pub const CTRL_ATTR_MCAST_GRP_UNSPEC: ::c_int = 0; +pub const CTRL_ATTR_MCAST_GRP_NAME: ::c_int = 1; +pub const CTRL_ATTR_MCAST_GRP_ID: ::c_int = 2; + +// linux/if_packet.h +pub const PACKET_ADD_MEMBERSHIP: ::c_int = 1; +pub const PACKET_DROP_MEMBERSHIP: ::c_int = 2; + +pub const PACKET_MR_MULTICAST: ::c_int = 0; +pub const PACKET_MR_PROMISC: ::c_int = 1; +pub const PACKET_MR_ALLMULTI: ::c_int = 2; + +// linux/netfilter.h +pub const NF_DROP: ::c_int = 0; +pub const NF_ACCEPT: ::c_int = 1; +pub const NF_STOLEN: ::c_int = 2; +pub const NF_QUEUE: ::c_int = 3; +pub const NF_REPEAT: ::c_int = 4; +pub const NF_STOP: ::c_int = 5; +pub const NF_MAX_VERDICT: ::c_int = NF_STOP; + +pub const NF_VERDICT_MASK: ::c_int = 0x000000ff; +pub const NF_VERDICT_FLAG_QUEUE_BYPASS: ::c_int = 0x00008000; + +pub const NF_VERDICT_QMASK: ::c_int = 0xffff0000; +pub const NF_VERDICT_QBITS: ::c_int = 16; + +pub const NF_VERDICT_BITS: ::c_int = 16; + +pub const NF_INET_PRE_ROUTING: ::c_int = 0; +pub const NF_INET_LOCAL_IN: ::c_int = 1; +pub const NF_INET_FORWARD: ::c_int = 2; +pub const NF_INET_LOCAL_OUT: ::c_int = 3; +pub const NF_INET_POST_ROUTING: ::c_int = 4; +pub const NF_INET_NUMHOOKS: ::c_int = 5; + +// Some NFPROTO are not compatible with musl and are defined in submodules. +pub const NFPROTO_UNSPEC: ::c_int = 0; +pub const NFPROTO_IPV4: ::c_int = 2; +pub const NFPROTO_ARP: ::c_int = 3; +pub const NFPROTO_BRIDGE: ::c_int = 7; +pub const NFPROTO_IPV6: ::c_int = 10; +pub const NFPROTO_DECNET: ::c_int = 12; +pub const NFPROTO_NUMPROTO: ::c_int = 13; +pub const NFPROTO_INET: ::c_int = 1; +pub const NFPROTO_NETDEV: ::c_int = 5; + +pub const NF_NETDEV_INGRESS: ::c_int = 0; +pub const NF_NETDEV_NUMHOOKS: ::c_int = 1; + +// linux/netfilter_ipv4.h +pub const NF_IP_PRE_ROUTING: ::c_int = 0; +pub const NF_IP_LOCAL_IN: ::c_int = 1; +pub const NF_IP_FORWARD: ::c_int = 2; +pub const NF_IP_LOCAL_OUT: ::c_int = 3; +pub const NF_IP_POST_ROUTING: ::c_int = 4; +pub const NF_IP_NUMHOOKS: ::c_int = 5; + +pub const NF_IP_PRI_FIRST: ::c_int = ::INT_MIN; +pub const NF_IP_PRI_CONNTRACK_DEFRAG: ::c_int = -400; +pub const NF_IP_PRI_RAW: ::c_int = -300; +pub const NF_IP_PRI_SELINUX_FIRST: ::c_int = -225; +pub const NF_IP_PRI_CONNTRACK: ::c_int = -200; +pub const NF_IP_PRI_MANGLE: ::c_int = -150; +pub const NF_IP_PRI_NAT_DST: ::c_int = -100; +pub const NF_IP_PRI_FILTER: ::c_int = 0; +pub const NF_IP_PRI_SECURITY: ::c_int = 50; +pub const NF_IP_PRI_NAT_SRC: ::c_int = 100; +pub const NF_IP_PRI_SELINUX_LAST: ::c_int = 225; +pub const NF_IP_PRI_CONNTRACK_HELPER: ::c_int = 300; +pub const NF_IP_PRI_CONNTRACK_CONFIRM: ::c_int = ::INT_MAX; +pub const NF_IP_PRI_LAST: ::c_int = ::INT_MAX; + +// linux/netfilter_ipv6.h +pub const NF_IP6_PRE_ROUTING: ::c_int = 0; +pub const NF_IP6_LOCAL_IN: ::c_int = 1; +pub const NF_IP6_FORWARD: ::c_int = 2; +pub const NF_IP6_LOCAL_OUT: ::c_int = 3; +pub const NF_IP6_POST_ROUTING: ::c_int = 4; +pub const NF_IP6_NUMHOOKS: ::c_int = 5; + +pub const NF_IP6_PRI_FIRST: ::c_int = ::INT_MIN; +pub const NF_IP6_PRI_CONNTRACK_DEFRAG: ::c_int = -400; +pub const NF_IP6_PRI_RAW: ::c_int = -300; +pub const NF_IP6_PRI_SELINUX_FIRST: ::c_int = -225; +pub const NF_IP6_PRI_CONNTRACK: ::c_int = -200; +pub const NF_IP6_PRI_MANGLE: ::c_int = -150; +pub const NF_IP6_PRI_NAT_DST: ::c_int = -100; +pub const NF_IP6_PRI_FILTER: ::c_int = 0; +pub const NF_IP6_PRI_SECURITY: ::c_int = 50; +pub const NF_IP6_PRI_NAT_SRC: ::c_int = 100; +pub const NF_IP6_PRI_SELINUX_LAST: ::c_int = 225; +pub const NF_IP6_PRI_CONNTRACK_HELPER: ::c_int = 300; +pub const NF_IP6_PRI_LAST: ::c_int = ::INT_MAX; + +// linux/netfilter_ipv6/ip6_tables.h +pub const IP6T_SO_ORIGINAL_DST: ::c_int = 80; + +pub const SIOCADDRT: ::c_ulong = 0x0000890B; +pub const SIOCDELRT: ::c_ulong = 0x0000890C; +pub const SIOCGIFNAME: ::c_ulong = 0x00008910; +pub const SIOCSIFLINK: ::c_ulong = 0x00008911; +pub const SIOCGIFCONF: ::c_ulong = 0x00008912; +pub const SIOCGIFFLAGS: ::c_ulong = 0x00008913; +pub const SIOCSIFFLAGS: ::c_ulong = 0x00008914; +pub const SIOCGIFADDR: ::c_ulong = 0x00008915; +pub const SIOCSIFADDR: ::c_ulong = 0x00008916; +pub const SIOCGIFDSTADDR: ::c_ulong = 0x00008917; +pub const SIOCSIFDSTADDR: ::c_ulong = 0x00008918; +pub const SIOCGIFBRDADDR: ::c_ulong = 0x00008919; +pub const SIOCSIFBRDADDR: ::c_ulong = 0x0000891A; +pub const SIOCGIFNETMASK: ::c_ulong = 0x0000891B; +pub const SIOCSIFNETMASK: ::c_ulong = 0x0000891C; +pub const SIOCGIFMETRIC: ::c_ulong = 0x0000891D; +pub const SIOCSIFMETRIC: ::c_ulong = 0x0000891E; +pub const SIOCGIFMEM: ::c_ulong = 0x0000891F; +pub const SIOCSIFMEM: ::c_ulong = 0x00008920; +pub const SIOCGIFMTU: ::c_ulong = 0x00008921; +pub const SIOCSIFMTU: ::c_ulong = 0x00008922; +pub const SIOCSIFHWADDR: ::c_ulong = 0x00008924; +pub const SIOCGIFENCAP: ::c_ulong = 0x00008925; +pub const SIOCSIFENCAP: ::c_ulong = 0x00008926; +pub const SIOCGIFHWADDR: ::c_ulong = 0x00008927; +pub const SIOCGIFSLAVE: ::c_ulong = 0x00008929; +pub const SIOCSIFSLAVE: ::c_ulong = 0x00008930; +pub const SIOCADDMULTI: ::c_ulong = 0x00008931; +pub const SIOCDELMULTI: ::c_ulong = 0x00008932; +pub const SIOCGIFINDEX: ::c_ulong = 0x00008933; +pub const SIOGIFINDEX: ::c_ulong = SIOCGIFINDEX; +pub const SIOCSIFPFLAGS: ::c_ulong = 0x00008934; +pub const SIOCGIFPFLAGS: ::c_ulong = 0x00008935; +pub const SIOCDIFADDR: ::c_ulong = 0x00008936; +pub const SIOCSIFHWBROADCAST: ::c_ulong = 0x00008937; +pub const SIOCGIFCOUNT: ::c_ulong = 0x00008938; +pub const SIOCGIFBR: ::c_ulong = 0x00008940; +pub const SIOCSIFBR: ::c_ulong = 0x00008941; +pub const SIOCGIFTXQLEN: ::c_ulong = 0x00008942; +pub const SIOCSIFTXQLEN: ::c_ulong = 0x00008943; +pub const SIOCETHTOOL: ::c_ulong = 0x00008946; +pub const SIOCGMIIPHY: ::c_ulong = 0x00008947; +pub const SIOCGMIIREG: ::c_ulong = 0x00008948; +pub const SIOCSMIIREG: ::c_ulong = 0x00008949; +pub const SIOCWANDEV: ::c_ulong = 0x0000894A; +pub const SIOCOUTQNSD: ::c_ulong = 0x0000894B; +pub const SIOCGSKNS: ::c_ulong = 0x0000894C; +pub const SIOCDARP: ::c_ulong = 0x00008953; +pub const SIOCGARP: ::c_ulong = 0x00008954; +pub const SIOCSARP: ::c_ulong = 0x00008955; +pub const SIOCDRARP: ::c_ulong = 0x00008960; +pub const SIOCGRARP: ::c_ulong = 0x00008961; +pub const SIOCSRARP: ::c_ulong = 0x00008962; +pub const SIOCGIFMAP: ::c_ulong = 0x00008970; +pub const SIOCSIFMAP: ::c_ulong = 0x00008971; +pub const SIOCSHWTSTAMP: ::c_ulong = 0x000089b0; +pub const SIOCGHWTSTAMP: ::c_ulong = 0x000089b1; + +pub const IPTOS_TOS_MASK: u8 = 0x1E; +pub const IPTOS_PREC_MASK: u8 = 0xE0; + +pub const IPTOS_ECN_NOT_ECT: u8 = 0x00; + +pub const RTF_UP: ::c_ushort = 0x0001; +pub const RTF_GATEWAY: ::c_ushort = 0x0002; + +pub const RTF_HOST: ::c_ushort = 0x0004; +pub const RTF_REINSTATE: ::c_ushort = 0x0008; +pub const RTF_DYNAMIC: ::c_ushort = 0x0010; +pub const RTF_MODIFIED: ::c_ushort = 0x0020; +pub const RTF_MTU: ::c_ushort = 0x0040; +pub const RTF_MSS: ::c_ushort = RTF_MTU; +pub const RTF_WINDOW: ::c_ushort = 0x0080; +pub const RTF_IRTT: ::c_ushort = 0x0100; +pub const RTF_REJECT: ::c_ushort = 0x0200; +pub const RTF_STATIC: ::c_ushort = 0x0400; +pub const RTF_XRESOLVE: ::c_ushort = 0x0800; +pub const RTF_NOFORWARD: ::c_ushort = 0x1000; +pub const RTF_THROW: ::c_ushort = 0x2000; +pub const RTF_NOPMTUDISC: ::c_ushort = 0x4000; + +pub const RTF_DEFAULT: u32 = 0x00010000; +pub const RTF_ALLONLINK: u32 = 0x00020000; +pub const RTF_ADDRCONF: u32 = 0x00040000; +pub const RTF_LINKRT: u32 = 0x00100000; +pub const RTF_NONEXTHOP: u32 = 0x00200000; +pub const RTF_CACHE: u32 = 0x01000000; +pub const RTF_FLOW: u32 = 0x02000000; +pub const RTF_POLICY: u32 = 0x04000000; + +pub const RTCF_VALVE: u32 = 0x00200000; +pub const RTCF_MASQ: u32 = 0x00400000; +pub const RTCF_NAT: u32 = 0x00800000; +pub const RTCF_DOREDIRECT: u32 = 0x01000000; +pub const RTCF_LOG: u32 = 0x02000000; +pub const RTCF_DIRECTSRC: u32 = 0x04000000; + +pub const RTF_LOCAL: u32 = 0x80000000; +pub const RTF_INTERFACE: u32 = 0x40000000; +pub const RTF_MULTICAST: u32 = 0x20000000; +pub const RTF_BROADCAST: u32 = 0x10000000; +pub const RTF_NAT: u32 = 0x08000000; +pub const RTF_ADDRCLASSMASK: u32 = 0xF8000000; + +pub const RT_CLASS_UNSPEC: u8 = 0; +pub const RT_CLASS_DEFAULT: u8 = 253; +pub const RT_CLASS_MAIN: u8 = 254; +pub const RT_CLASS_LOCAL: u8 = 255; +pub const RT_CLASS_MAX: u8 = 255; + +// linux/neighbor.h +pub const NUD_NONE: u16 = 0x00; +pub const NUD_INCOMPLETE: u16 = 0x01; +pub const NUD_REACHABLE: u16 = 0x02; +pub const NUD_STALE: u16 = 0x04; +pub const NUD_DELAY: u16 = 0x08; +pub const NUD_PROBE: u16 = 0x10; +pub const NUD_FAILED: u16 = 0x20; +pub const NUD_NOARP: u16 = 0x40; +pub const NUD_PERMANENT: u16 = 0x80; + +pub const NTF_USE: u8 = 0x01; +pub const NTF_SELF: u8 = 0x02; +pub const NTF_MASTER: u8 = 0x04; +pub const NTF_PROXY: u8 = 0x08; +pub const NTF_ROUTER: u8 = 0x80; + +pub const NDA_UNSPEC: ::c_ushort = 0; +pub const NDA_DST: ::c_ushort = 1; +pub const NDA_LLADDR: ::c_ushort = 2; +pub const NDA_CACHEINFO: ::c_ushort = 3; +pub const NDA_PROBES: ::c_ushort = 4; +pub const NDA_VLAN: ::c_ushort = 5; +pub const NDA_PORT: ::c_ushort = 6; +pub const NDA_VNI: ::c_ushort = 7; +pub const NDA_IFINDEX: ::c_ushort = 8; + +// linux/netlink.h +pub const NLA_ALIGNTO: ::c_int = 4; + +pub const NETLINK_ROUTE: ::c_int = 0; +pub const NETLINK_UNUSED: ::c_int = 1; +pub const NETLINK_USERSOCK: ::c_int = 2; +pub const NETLINK_FIREWALL: ::c_int = 3; +pub const NETLINK_SOCK_DIAG: ::c_int = 4; +pub const NETLINK_NFLOG: ::c_int = 5; +pub const NETLINK_XFRM: ::c_int = 6; +pub const NETLINK_SELINUX: ::c_int = 7; +pub const NETLINK_ISCSI: ::c_int = 8; +pub const NETLINK_AUDIT: ::c_int = 9; +pub const NETLINK_FIB_LOOKUP: ::c_int = 10; +pub const NETLINK_CONNECTOR: ::c_int = 11; +pub const NETLINK_NETFILTER: ::c_int = 12; +pub const NETLINK_IP6_FW: ::c_int = 13; +pub const NETLINK_DNRTMSG: ::c_int = 14; +pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15; +pub const NETLINK_GENERIC: ::c_int = 16; +pub const NETLINK_SCSITRANSPORT: ::c_int = 18; +pub const NETLINK_ECRYPTFS: ::c_int = 19; +pub const NETLINK_RDMA: ::c_int = 20; +pub const NETLINK_CRYPTO: ::c_int = 21; +pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG; + +pub const NLM_F_REQUEST: ::c_int = 1; +pub const NLM_F_MULTI: ::c_int = 2; +pub const NLM_F_ACK: ::c_int = 4; +pub const NLM_F_ECHO: ::c_int = 8; +pub const NLM_F_DUMP_INTR: ::c_int = 16; +pub const NLM_F_DUMP_FILTERED: ::c_int = 32; + +pub const NLM_F_ROOT: ::c_int = 0x100; +pub const NLM_F_MATCH: ::c_int = 0x200; +pub const NLM_F_ATOMIC: ::c_int = 0x400; +pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH; + +pub const NLM_F_REPLACE: ::c_int = 0x100; +pub const NLM_F_EXCL: ::c_int = 0x200; +pub const NLM_F_CREATE: ::c_int = 0x400; +pub const NLM_F_APPEND: ::c_int = 0x800; + +pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1; +pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2; +pub const NETLINK_PKTINFO: ::c_int = 3; +pub const NETLINK_BROADCAST_ERROR: ::c_int = 4; +pub const NETLINK_NO_ENOBUFS: ::c_int = 5; +pub const NETLINK_RX_RING: ::c_int = 6; +pub const NETLINK_TX_RING: ::c_int = 7; +pub const NETLINK_LISTEN_ALL_NSID: ::c_int = 8; +pub const NETLINK_LIST_MEMBERSHIPS: ::c_int = 9; +pub const NETLINK_CAP_ACK: ::c_int = 10; +pub const NETLINK_EXT_ACK: ::c_int = 11; +pub const NETLINK_GET_STRICT_CHK: ::c_int = 12; + +pub const NLA_F_NESTED: ::c_int = 1 << 15; +pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14; +pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); + +// linux/rtnetlink.h +pub const TCA_UNSPEC: ::c_ushort = 0; +pub const TCA_KIND: ::c_ushort = 1; +pub const TCA_OPTIONS: ::c_ushort = 2; +pub const TCA_STATS: ::c_ushort = 3; +pub const TCA_XSTATS: ::c_ushort = 4; +pub const TCA_RATE: ::c_ushort = 5; +pub const TCA_FCNT: ::c_ushort = 6; +pub const TCA_STATS2: ::c_ushort = 7; +pub const TCA_STAB: ::c_ushort = 8; + +pub const RTM_NEWLINK: u16 = 16; +pub const RTM_DELLINK: u16 = 17; +pub const RTM_GETLINK: u16 = 18; +pub const RTM_SETLINK: u16 = 19; +pub const RTM_NEWADDR: u16 = 20; +pub const RTM_DELADDR: u16 = 21; +pub const RTM_GETADDR: u16 = 22; +pub const RTM_NEWROUTE: u16 = 24; +pub const RTM_DELROUTE: u16 = 25; +pub const RTM_GETROUTE: u16 = 26; +pub const RTM_NEWNEIGH: u16 = 28; +pub const RTM_DELNEIGH: u16 = 29; +pub const RTM_GETNEIGH: u16 = 30; +pub const RTM_NEWRULE: u16 = 32; +pub const RTM_DELRULE: u16 = 33; +pub const RTM_GETRULE: u16 = 34; +pub const RTM_NEWQDISC: u16 = 36; +pub const RTM_DELQDISC: u16 = 37; +pub const RTM_GETQDISC: u16 = 38; +pub const RTM_NEWTCLASS: u16 = 40; +pub const RTM_DELTCLASS: u16 = 41; +pub const RTM_GETTCLASS: u16 = 42; +pub const RTM_NEWTFILTER: u16 = 44; +pub const RTM_DELTFILTER: u16 = 45; +pub const RTM_GETTFILTER: u16 = 46; +pub const RTM_NEWACTION: u16 = 48; +pub const RTM_DELACTION: u16 = 49; +pub const RTM_GETACTION: u16 = 50; +pub const RTM_NEWPREFIX: u16 = 52; +pub const RTM_GETMULTICAST: u16 = 58; +pub const RTM_GETANYCAST: u16 = 62; +pub const RTM_NEWNEIGHTBL: u16 = 64; +pub const RTM_GETNEIGHTBL: u16 = 66; +pub const RTM_SETNEIGHTBL: u16 = 67; +pub const RTM_NEWNDUSEROPT: u16 = 68; +pub const RTM_NEWADDRLABEL: u16 = 72; +pub const RTM_DELADDRLABEL: u16 = 73; +pub const RTM_GETADDRLABEL: u16 = 74; +pub const RTM_GETDCB: u16 = 78; +pub const RTM_SETDCB: u16 = 79; +pub const RTM_NEWNETCONF: u16 = 80; +pub const RTM_GETNETCONF: u16 = 82; +pub const RTM_NEWMDB: u16 = 84; +pub const RTM_DELMDB: u16 = 85; +pub const RTM_GETMDB: u16 = 86; +pub const RTM_NEWNSID: u16 = 88; +pub const RTM_DELNSID: u16 = 89; +pub const RTM_GETNSID: u16 = 90; + +pub const RTM_F_NOTIFY: ::c_uint = 0x100; +pub const RTM_F_CLONED: ::c_uint = 0x200; +pub const RTM_F_EQUALIZE: ::c_uint = 0x400; +pub const RTM_F_PREFIX: ::c_uint = 0x800; + +pub const RTA_UNSPEC: ::c_ushort = 0; +pub const RTA_DST: ::c_ushort = 1; +pub const RTA_SRC: ::c_ushort = 2; +pub const RTA_IIF: ::c_ushort = 3; +pub const RTA_OIF: ::c_ushort = 4; +pub const RTA_GATEWAY: ::c_ushort = 5; +pub const RTA_PRIORITY: ::c_ushort = 6; +pub const RTA_PREFSRC: ::c_ushort = 7; +pub const RTA_METRICS: ::c_ushort = 8; +pub const RTA_MULTIPATH: ::c_ushort = 9; +pub const RTA_PROTOINFO: ::c_ushort = 10; // No longer used +pub const RTA_FLOW: ::c_ushort = 11; +pub const RTA_CACHEINFO: ::c_ushort = 12; +pub const RTA_SESSION: ::c_ushort = 13; // No longer used +pub const RTA_MP_ALGO: ::c_ushort = 14; // No longer used +pub const RTA_TABLE: ::c_ushort = 15; +pub const RTA_MARK: ::c_ushort = 16; +pub const RTA_MFC_STATS: ::c_ushort = 17; + +pub const RTN_UNSPEC: ::c_uchar = 0; +pub const RTN_UNICAST: ::c_uchar = 1; +pub const RTN_LOCAL: ::c_uchar = 2; +pub const RTN_BROADCAST: ::c_uchar = 3; +pub const RTN_ANYCAST: ::c_uchar = 4; +pub const RTN_MULTICAST: ::c_uchar = 5; +pub const RTN_BLACKHOLE: ::c_uchar = 6; +pub const RTN_UNREACHABLE: ::c_uchar = 7; +pub const RTN_PROHIBIT: ::c_uchar = 8; +pub const RTN_THROW: ::c_uchar = 9; +pub const RTN_NAT: ::c_uchar = 10; +pub const RTN_XRESOLVE: ::c_uchar = 11; + +pub const RTPROT_UNSPEC: ::c_uchar = 0; +pub const RTPROT_REDIRECT: ::c_uchar = 1; +pub const RTPROT_KERNEL: ::c_uchar = 2; +pub const RTPROT_BOOT: ::c_uchar = 3; +pub const RTPROT_STATIC: ::c_uchar = 4; + +pub const RT_SCOPE_UNIVERSE: ::c_uchar = 0; +pub const RT_SCOPE_SITE: ::c_uchar = 200; +pub const RT_SCOPE_LINK: ::c_uchar = 253; +pub const RT_SCOPE_HOST: ::c_uchar = 254; +pub const RT_SCOPE_NOWHERE: ::c_uchar = 255; + +pub const RT_TABLE_UNSPEC: ::c_uchar = 0; +pub const RT_TABLE_COMPAT: ::c_uchar = 252; +pub const RT_TABLE_DEFAULT: ::c_uchar = 253; +pub const RT_TABLE_MAIN: ::c_uchar = 254; +pub const RT_TABLE_LOCAL: ::c_uchar = 255; + +pub const RTMSG_OVERRUN: u32 = ::NLMSG_OVERRUN as u32; +pub const RTMSG_NEWDEVICE: u32 = 0x11; +pub const RTMSG_DELDEVICE: u32 = 0x12; +pub const RTMSG_NEWROUTE: u32 = 0x21; +pub const RTMSG_DELROUTE: u32 = 0x22; +pub const RTMSG_NEWRULE: u32 = 0x31; +pub const RTMSG_DELRULE: u32 = 0x32; +pub const RTMSG_CONTROL: u32 = 0x40; +pub const RTMSG_AR_FAILED: u32 = 0x51; + +pub const MAX_ADDR_LEN: usize = 7; +pub const ARPD_UPDATE: ::c_ushort = 0x01; +pub const ARPD_LOOKUP: ::c_ushort = 0x02; +pub const ARPD_FLUSH: ::c_ushort = 0x03; +pub const ATF_MAGIC: ::c_int = 0x80; + +pub const RTEXT_FILTER_VF: ::c_int = 1 << 0; +pub const RTEXT_FILTER_BRVLAN: ::c_int = 1 << 1; +pub const RTEXT_FILTER_BRVLAN_COMPRESSED: ::c_int = 1 << 2; +pub const RTEXT_FILTER_SKIP_STATS: ::c_int = 1 << 3; +pub const RTEXT_FILTER_MRP: ::c_int = 1 << 4; +pub const RTEXT_FILTER_CFM_CONFIG: ::c_int = 1 << 5; +pub const RTEXT_FILTER_CFM_STATUS: ::c_int = 1 << 6; + +// userspace compat definitions for RTNLGRP_* +pub const RTMGRP_LINK: ::c_int = 0x00001; +pub const RTMGRP_NOTIFY: ::c_int = 0x00002; +pub const RTMGRP_NEIGH: ::c_int = 0x00004; +pub const RTMGRP_TC: ::c_int = 0x00008; +pub const RTMGRP_IPV4_IFADDR: ::c_int = 0x00010; +pub const RTMGRP_IPV4_MROUTE: ::c_int = 0x00020; +pub const RTMGRP_IPV4_ROUTE: ::c_int = 0x00040; +pub const RTMGRP_IPV4_RULE: ::c_int = 0x00080; +pub const RTMGRP_IPV6_IFADDR: ::c_int = 0x00100; +pub const RTMGRP_IPV6_MROUTE: ::c_int = 0x00200; +pub const RTMGRP_IPV6_ROUTE: ::c_int = 0x00400; +pub const RTMGRP_IPV6_IFINFO: ::c_int = 0x00800; +pub const RTMGRP_DECnet_IFADDR: ::c_int = 0x01000; +pub const RTMGRP_DECnet_ROUTE: ::c_int = 0x04000; +pub const RTMGRP_IPV6_PREFIX: ::c_int = 0x20000; + +// enum rtnetlink_groups +pub const RTNLGRP_NONE: ::c_uint = 0x00; +pub const RTNLGRP_LINK: ::c_uint = 0x01; +pub const RTNLGRP_NOTIFY: ::c_uint = 0x02; +pub const RTNLGRP_NEIGH: ::c_uint = 0x03; +pub const RTNLGRP_TC: ::c_uint = 0x04; +pub const RTNLGRP_IPV4_IFADDR: ::c_uint = 0x05; +pub const RTNLGRP_IPV4_MROUTE: ::c_uint = 0x06; +pub const RTNLGRP_IPV4_ROUTE: ::c_uint = 0x07; +pub const RTNLGRP_IPV4_RULE: ::c_uint = 0x08; +pub const RTNLGRP_IPV6_IFADDR: ::c_uint = 0x09; +pub const RTNLGRP_IPV6_MROUTE: ::c_uint = 0x0a; +pub const RTNLGRP_IPV6_ROUTE: ::c_uint = 0x0b; +pub const RTNLGRP_IPV6_IFINFO: ::c_uint = 0x0c; +pub const RTNLGRP_DECnet_IFADDR: ::c_uint = 0x0d; +pub const RTNLGRP_NOP2: ::c_uint = 0x0e; +pub const RTNLGRP_DECnet_ROUTE: ::c_uint = 0x0f; +pub const RTNLGRP_DECnet_RULE: ::c_uint = 0x10; +pub const RTNLGRP_NOP4: ::c_uint = 0x11; +pub const RTNLGRP_IPV6_PREFIX: ::c_uint = 0x12; +pub const RTNLGRP_IPV6_RULE: ::c_uint = 0x13; +pub const RTNLGRP_ND_USEROPT: ::c_uint = 0x14; +pub const RTNLGRP_PHONET_IFADDR: ::c_uint = 0x15; +pub const RTNLGRP_PHONET_ROUTE: ::c_uint = 0x16; +pub const RTNLGRP_DCB: ::c_uint = 0x17; +pub const RTNLGRP_IPV4_NETCONF: ::c_uint = 0x18; +pub const RTNLGRP_IPV6_NETCONF: ::c_uint = 0x19; +pub const RTNLGRP_MDB: ::c_uint = 0x1a; +pub const RTNLGRP_MPLS_ROUTE: ::c_uint = 0x1b; +pub const RTNLGRP_NSID: ::c_uint = 0x1c; +pub const RTNLGRP_MPLS_NETCONF: ::c_uint = 0x1d; +pub const RTNLGRP_IPV4_MROUTE_R: ::c_uint = 0x1e; +pub const RTNLGRP_IPV6_MROUTE_R: ::c_uint = 0x1f; +pub const RTNLGRP_NEXTHOP: ::c_uint = 0x20; +pub const RTNLGRP_BRVLAN: ::c_uint = 0x21; +pub const RTNLGRP_MCTP_IFADDR: ::c_uint = 0x22; +pub const RTNLGRP_TUNNEL: ::c_uint = 0x23; +pub const RTNLGRP_STATS: ::c_uint = 0x24; + +// linux/module.h +pub const MODULE_INIT_IGNORE_MODVERSIONS: ::c_uint = 0x0001; +pub const MODULE_INIT_IGNORE_VERMAGIC: ::c_uint = 0x0002; + +// linux/net_tstamp.h +pub const SOF_TIMESTAMPING_TX_HARDWARE: ::c_uint = 1 << 0; +pub const SOF_TIMESTAMPING_TX_SOFTWARE: ::c_uint = 1 << 1; +pub const SOF_TIMESTAMPING_RX_HARDWARE: ::c_uint = 1 << 2; +pub const SOF_TIMESTAMPING_RX_SOFTWARE: ::c_uint = 1 << 3; +pub const SOF_TIMESTAMPING_SOFTWARE: ::c_uint = 1 << 4; +pub const SOF_TIMESTAMPING_SYS_HARDWARE: ::c_uint = 1 << 5; +pub const SOF_TIMESTAMPING_RAW_HARDWARE: ::c_uint = 1 << 6; +pub const SOF_TIMESTAMPING_OPT_ID: ::c_uint = 1 << 7; +pub const SOF_TIMESTAMPING_TX_SCHED: ::c_uint = 1 << 8; +pub const SOF_TIMESTAMPING_TX_ACK: ::c_uint = 1 << 9; +pub const SOF_TIMESTAMPING_OPT_CMSG: ::c_uint = 1 << 10; +pub const SOF_TIMESTAMPING_OPT_TSONLY: ::c_uint = 1 << 11; +pub const SOF_TIMESTAMPING_OPT_STATS: ::c_uint = 1 << 12; +pub const SOF_TIMESTAMPING_OPT_PKTINFO: ::c_uint = 1 << 13; +pub const SOF_TIMESTAMPING_OPT_TX_SWHW: ::c_uint = 1 << 14; +pub const SOF_TXTIME_DEADLINE_MODE: u32 = 1 << 0; +pub const SOF_TXTIME_REPORT_ERRORS: u32 = 1 << 1; + +pub const HWTSTAMP_TX_OFF: ::c_uint = 0; +pub const HWTSTAMP_TX_ON: ::c_uint = 1; +pub const HWTSTAMP_TX_ONESTEP_SYNC: ::c_uint = 2; +pub const HWTSTAMP_TX_ONESTEP_P2P: ::c_uint = 3; + +pub const HWTSTAMP_FILTER_NONE: ::c_uint = 0; +pub const HWTSTAMP_FILTER_ALL: ::c_uint = 1; +pub const HWTSTAMP_FILTER_SOME: ::c_uint = 2; +pub const HWTSTAMP_FILTER_PTP_V1_L4_EVENT: ::c_uint = 3; +pub const HWTSTAMP_FILTER_PTP_V1_L4_SYNC: ::c_uint = 4; +pub const HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: ::c_uint = 5; +pub const HWTSTAMP_FILTER_PTP_V2_L4_EVENT: ::c_uint = 6; +pub const HWTSTAMP_FILTER_PTP_V2_L4_SYNC: ::c_uint = 7; +pub const HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: ::c_uint = 8; +pub const HWTSTAMP_FILTER_PTP_V2_L2_EVENT: ::c_uint = 9; +pub const HWTSTAMP_FILTER_PTP_V2_L2_SYNC: ::c_uint = 10; +pub const HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: ::c_uint = 11; +pub const HWTSTAMP_FILTER_PTP_V2_EVENT: ::c_uint = 12; +pub const HWTSTAMP_FILTER_PTP_V2_SYNC: ::c_uint = 13; +pub const HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: ::c_uint = 14; +pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15; + +// linux/if_alg.h +pub const ALG_SET_KEY: ::c_int = 1; +pub const ALG_SET_IV: ::c_int = 2; +pub const ALG_SET_OP: ::c_int = 3; +pub const ALG_SET_AEAD_ASSOCLEN: ::c_int = 4; +pub const ALG_SET_AEAD_AUTHSIZE: ::c_int = 5; + +pub const ALG_OP_DECRYPT: ::c_int = 0; +pub const ALG_OP_ENCRYPT: ::c_int = 1; + +// include/uapi/linux/if.h +pub const IF_OPER_UNKNOWN: ::c_int = 0; +pub const IF_OPER_NOTPRESENT: ::c_int = 1; +pub const IF_OPER_DOWN: ::c_int = 2; +pub const IF_OPER_LOWERLAYERDOWN: ::c_int = 3; +pub const IF_OPER_TESTING: ::c_int = 4; +pub const IF_OPER_DORMANT: ::c_int = 5; +pub const IF_OPER_UP: ::c_int = 6; + +pub const IF_LINK_MODE_DEFAULT: ::c_int = 0; +pub const IF_LINK_MODE_DORMANT: ::c_int = 1; +pub const IF_LINK_MODE_TESTING: ::c_int = 2; + +// include/uapi/linux/udp.h +pub const UDP_CORK: ::c_int = 1; +pub const UDP_ENCAP: ::c_int = 100; +pub const UDP_NO_CHECK6_TX: ::c_int = 101; +pub const UDP_NO_CHECK6_RX: ::c_int = 102; + +// include/uapi/linux/mman.h +pub const MAP_SHARED_VALIDATE: ::c_int = 0x3; + +// include/uapi/asm-generic/mman-common.h +pub const MAP_FIXED_NOREPLACE: ::c_int = 0x100000; +pub const MLOCK_ONFAULT: ::c_uint = 0x01; + +// uapi/linux/vm_sockets.h +pub const VMADDR_CID_ANY: ::c_uint = 0xFFFFFFFF; +pub const VMADDR_CID_HYPERVISOR: ::c_uint = 0; +#[deprecated( + since = "0.2.74", + note = "VMADDR_CID_RESERVED is removed since Linux v5.6 and \ + replaced with VMADDR_CID_LOCAL" +)] +pub const VMADDR_CID_RESERVED: ::c_uint = 1; +pub const VMADDR_CID_LOCAL: ::c_uint = 1; +pub const VMADDR_CID_HOST: ::c_uint = 2; +pub const VMADDR_PORT_ANY: ::c_uint = 0xFFFFFFFF; + +// uapi/linux/inotify.h +pub const IN_ACCESS: u32 = 0x0000_0001; +pub const IN_MODIFY: u32 = 0x0000_0002; +pub const IN_ATTRIB: u32 = 0x0000_0004; +pub const IN_CLOSE_WRITE: u32 = 0x0000_0008; +pub const IN_CLOSE_NOWRITE: u32 = 0x0000_0010; +pub const IN_CLOSE: u32 = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE; +pub const IN_OPEN: u32 = 0x0000_0020; +pub const IN_MOVED_FROM: u32 = 0x0000_0040; +pub const IN_MOVED_TO: u32 = 0x0000_0080; +pub const IN_MOVE: u32 = IN_MOVED_FROM | IN_MOVED_TO; +pub const IN_CREATE: u32 = 0x0000_0100; +pub const IN_DELETE: u32 = 0x0000_0200; +pub const IN_DELETE_SELF: u32 = 0x0000_0400; +pub const IN_MOVE_SELF: u32 = 0x0000_0800; +pub const IN_UNMOUNT: u32 = 0x0000_2000; +pub const IN_Q_OVERFLOW: u32 = 0x0000_4000; +pub const IN_IGNORED: u32 = 0x0000_8000; +pub const IN_ONLYDIR: u32 = 0x0100_0000; +pub const IN_DONT_FOLLOW: u32 = 0x0200_0000; +pub const IN_EXCL_UNLINK: u32 = 0x0400_0000; + +// linux/keyctl.h +pub const KEY_SPEC_THREAD_KEYRING: i32 = -1; +pub const KEY_SPEC_PROCESS_KEYRING: i32 = -2; +pub const KEY_SPEC_SESSION_KEYRING: i32 = -3; +pub const KEY_SPEC_USER_KEYRING: i32 = -4; +pub const KEY_SPEC_USER_SESSION_KEYRING: i32 = -5; +pub const KEY_SPEC_GROUP_KEYRING: i32 = -6; +pub const KEY_SPEC_REQKEY_AUTH_KEY: i32 = -7; +pub const KEY_SPEC_REQUESTOR_KEYRING: i32 = -8; + +pub const KEY_REQKEY_DEFL_NO_CHANGE: i32 = -1; +pub const KEY_REQKEY_DEFL_DEFAULT: i32 = 0; +pub const KEY_REQKEY_DEFL_THREAD_KEYRING: i32 = 1; +pub const KEY_REQKEY_DEFL_PROCESS_KEYRING: i32 = 2; +pub const KEY_REQKEY_DEFL_SESSION_KEYRING: i32 = 3; +pub const KEY_REQKEY_DEFL_USER_KEYRING: i32 = 4; +pub const KEY_REQKEY_DEFL_USER_SESSION_KEYRING: i32 = 5; +pub const KEY_REQKEY_DEFL_GROUP_KEYRING: i32 = 6; +pub const KEY_REQKEY_DEFL_REQUESTOR_KEYRING: i32 = 7; + +pub const KEYCTL_GET_KEYRING_ID: u32 = 0; +pub const KEYCTL_JOIN_SESSION_KEYRING: u32 = 1; +pub const KEYCTL_UPDATE: u32 = 2; +pub const KEYCTL_REVOKE: u32 = 3; +pub const KEYCTL_CHOWN: u32 = 4; +pub const KEYCTL_SETPERM: u32 = 5; +pub const KEYCTL_DESCRIBE: u32 = 6; +pub const KEYCTL_CLEAR: u32 = 7; +pub const KEYCTL_LINK: u32 = 8; +pub const KEYCTL_UNLINK: u32 = 9; +pub const KEYCTL_SEARCH: u32 = 10; +pub const KEYCTL_READ: u32 = 11; +pub const KEYCTL_INSTANTIATE: u32 = 12; +pub const KEYCTL_NEGATE: u32 = 13; +pub const KEYCTL_SET_REQKEY_KEYRING: u32 = 14; +pub const KEYCTL_SET_TIMEOUT: u32 = 15; +pub const KEYCTL_ASSUME_AUTHORITY: u32 = 16; +pub const KEYCTL_GET_SECURITY: u32 = 17; +pub const KEYCTL_SESSION_TO_PARENT: u32 = 18; +pub const KEYCTL_REJECT: u32 = 19; +pub const KEYCTL_INSTANTIATE_IOV: u32 = 20; +pub const KEYCTL_INVALIDATE: u32 = 21; +pub const KEYCTL_GET_PERSISTENT: u32 = 22; + +pub const IN_MASK_CREATE: u32 = 0x1000_0000; +pub const IN_MASK_ADD: u32 = 0x2000_0000; +pub const IN_ISDIR: u32 = 0x4000_0000; +pub const IN_ONESHOT: u32 = 0x8000_0000; + +pub const IN_ALL_EVENTS: u32 = IN_ACCESS + | IN_MODIFY + | IN_ATTRIB + | IN_CLOSE_WRITE + | IN_CLOSE_NOWRITE + | IN_OPEN + | IN_MOVED_FROM + | IN_MOVED_TO + | IN_DELETE + | IN_CREATE + | IN_DELETE_SELF + | IN_MOVE_SELF; + +pub const IN_CLOEXEC: ::c_int = O_CLOEXEC; +pub const IN_NONBLOCK: ::c_int = O_NONBLOCK; + +// uapi/linux/mount.h +pub const OPEN_TREE_CLONE: ::c_uint = 0x01; +pub const OPEN_TREE_CLOEXEC: ::c_uint = O_CLOEXEC as ::c_uint; + +// uapi/linux/netfilter/nf_tables.h +pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256; +pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256; +pub const NFT_SET_MAXNAMELEN: ::c_int = 256; +pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256; +pub const NFT_USERDATA_MAXLEN: ::c_int = 256; + +pub const NFT_REG_VERDICT: ::c_int = 0; +pub const NFT_REG_1: ::c_int = 1; +pub const NFT_REG_2: ::c_int = 2; +pub const NFT_REG_3: ::c_int = 3; +pub const NFT_REG_4: ::c_int = 4; +pub const __NFT_REG_MAX: ::c_int = 5; +pub const NFT_REG32_00: ::c_int = 8; +pub const NFT_REG32_01: ::c_int = 9; +pub const NFT_REG32_02: ::c_int = 10; +pub const NFT_REG32_03: ::c_int = 11; +pub const NFT_REG32_04: ::c_int = 12; +pub const NFT_REG32_05: ::c_int = 13; +pub const NFT_REG32_06: ::c_int = 14; +pub const NFT_REG32_07: ::c_int = 15; +pub const NFT_REG32_08: ::c_int = 16; +pub const NFT_REG32_09: ::c_int = 17; +pub const NFT_REG32_10: ::c_int = 18; +pub const NFT_REG32_11: ::c_int = 19; +pub const NFT_REG32_12: ::c_int = 20; +pub const NFT_REG32_13: ::c_int = 21; +pub const NFT_REG32_14: ::c_int = 22; +pub const NFT_REG32_15: ::c_int = 23; + +pub const NFT_REG_SIZE: ::c_int = 16; +pub const NFT_REG32_SIZE: ::c_int = 4; + +pub const NFT_CONTINUE: ::c_int = -1; +pub const NFT_BREAK: ::c_int = -2; +pub const NFT_JUMP: ::c_int = -3; +pub const NFT_GOTO: ::c_int = -4; +pub const NFT_RETURN: ::c_int = -5; + +pub const NFT_MSG_NEWTABLE: ::c_int = 0; +pub const NFT_MSG_GETTABLE: ::c_int = 1; +pub const NFT_MSG_DELTABLE: ::c_int = 2; +pub const NFT_MSG_NEWCHAIN: ::c_int = 3; +pub const NFT_MSG_GETCHAIN: ::c_int = 4; +pub const NFT_MSG_DELCHAIN: ::c_int = 5; +pub const NFT_MSG_NEWRULE: ::c_int = 6; +pub const NFT_MSG_GETRULE: ::c_int = 7; +pub const NFT_MSG_DELRULE: ::c_int = 8; +pub const NFT_MSG_NEWSET: ::c_int = 9; +pub const NFT_MSG_GETSET: ::c_int = 10; +pub const NFT_MSG_DELSET: ::c_int = 11; +pub const NFT_MSG_NEWSETELEM: ::c_int = 12; +pub const NFT_MSG_GETSETELEM: ::c_int = 13; +pub const NFT_MSG_DELSETELEM: ::c_int = 14; +pub const NFT_MSG_NEWGEN: ::c_int = 15; +pub const NFT_MSG_GETGEN: ::c_int = 16; +pub const NFT_MSG_TRACE: ::c_int = 17; +cfg_if! { + if #[cfg(not(target_arch = "sparc64"))] { + pub const NFT_MSG_NEWOBJ: ::c_int = 18; + pub const NFT_MSG_GETOBJ: ::c_int = 19; + pub const NFT_MSG_DELOBJ: ::c_int = 20; + pub const NFT_MSG_GETOBJ_RESET: ::c_int = 21; + } +} +pub const NFT_MSG_MAX: ::c_int = 25; + +pub const NFT_SET_ANONYMOUS: ::c_int = 0x1; +pub const NFT_SET_CONSTANT: ::c_int = 0x2; +pub const NFT_SET_INTERVAL: ::c_int = 0x4; +pub const NFT_SET_MAP: ::c_int = 0x8; +pub const NFT_SET_TIMEOUT: ::c_int = 0x10; +pub const NFT_SET_EVAL: ::c_int = 0x20; + +pub const NFT_SET_POL_PERFORMANCE: ::c_int = 0; +pub const NFT_SET_POL_MEMORY: ::c_int = 1; + +pub const NFT_SET_ELEM_INTERVAL_END: ::c_int = 0x1; + +pub const NFT_DATA_VALUE: ::c_uint = 0; +pub const NFT_DATA_VERDICT: ::c_uint = 0xffffff00; + +pub const NFT_DATA_RESERVED_MASK: ::c_uint = 0xffffff00; + +pub const NFT_DATA_VALUE_MAXLEN: ::c_int = 64; + +pub const NFT_BYTEORDER_NTOH: ::c_int = 0; +pub const NFT_BYTEORDER_HTON: ::c_int = 1; + +pub const NFT_CMP_EQ: ::c_int = 0; +pub const NFT_CMP_NEQ: ::c_int = 1; +pub const NFT_CMP_LT: ::c_int = 2; +pub const NFT_CMP_LTE: ::c_int = 3; +pub const NFT_CMP_GT: ::c_int = 4; +pub const NFT_CMP_GTE: ::c_int = 5; + +pub const NFT_RANGE_EQ: ::c_int = 0; +pub const NFT_RANGE_NEQ: ::c_int = 1; + +pub const NFT_LOOKUP_F_INV: ::c_int = 1 << 0; + +pub const NFT_DYNSET_OP_ADD: ::c_int = 0; +pub const NFT_DYNSET_OP_UPDATE: ::c_int = 1; + +pub const NFT_DYNSET_F_INV: ::c_int = 1 << 0; + +pub const NFT_PAYLOAD_LL_HEADER: ::c_int = 0; +pub const NFT_PAYLOAD_NETWORK_HEADER: ::c_int = 1; +pub const NFT_PAYLOAD_TRANSPORT_HEADER: ::c_int = 2; + +pub const NFT_PAYLOAD_CSUM_NONE: ::c_int = 0; +pub const NFT_PAYLOAD_CSUM_INET: ::c_int = 1; + +pub const NFT_META_LEN: ::c_int = 0; +pub const NFT_META_PROTOCOL: ::c_int = 1; +pub const NFT_META_PRIORITY: ::c_int = 2; +pub const NFT_META_MARK: ::c_int = 3; +pub const NFT_META_IIF: ::c_int = 4; +pub const NFT_META_OIF: ::c_int = 5; +pub const NFT_META_IIFNAME: ::c_int = 6; +pub const NFT_META_OIFNAME: ::c_int = 7; +pub const NFT_META_IIFTYPE: ::c_int = 8; +pub const NFT_META_OIFTYPE: ::c_int = 9; +pub const NFT_META_SKUID: ::c_int = 10; +pub const NFT_META_SKGID: ::c_int = 11; +pub const NFT_META_NFTRACE: ::c_int = 12; +pub const NFT_META_RTCLASSID: ::c_int = 13; +pub const NFT_META_SECMARK: ::c_int = 14; +pub const NFT_META_NFPROTO: ::c_int = 15; +pub const NFT_META_L4PROTO: ::c_int = 16; +pub const NFT_META_BRI_IIFNAME: ::c_int = 17; +pub const NFT_META_BRI_OIFNAME: ::c_int = 18; +pub const NFT_META_PKTTYPE: ::c_int = 19; +pub const NFT_META_CPU: ::c_int = 20; +pub const NFT_META_IIFGROUP: ::c_int = 21; +pub const NFT_META_OIFGROUP: ::c_int = 22; +pub const NFT_META_CGROUP: ::c_int = 23; +pub const NFT_META_PRANDOM: ::c_int = 24; + +pub const NFT_CT_STATE: ::c_int = 0; +pub const NFT_CT_DIRECTION: ::c_int = 1; +pub const NFT_CT_STATUS: ::c_int = 2; +pub const NFT_CT_MARK: ::c_int = 3; +pub const NFT_CT_SECMARK: ::c_int = 4; +pub const NFT_CT_EXPIRATION: ::c_int = 5; +pub const NFT_CT_HELPER: ::c_int = 6; +pub const NFT_CT_L3PROTOCOL: ::c_int = 7; +pub const NFT_CT_SRC: ::c_int = 8; +pub const NFT_CT_DST: ::c_int = 9; +pub const NFT_CT_PROTOCOL: ::c_int = 10; +pub const NFT_CT_PROTO_SRC: ::c_int = 11; +pub const NFT_CT_PROTO_DST: ::c_int = 12; +pub const NFT_CT_LABELS: ::c_int = 13; +pub const NFT_CT_PKTS: ::c_int = 14; +pub const NFT_CT_BYTES: ::c_int = 15; + +pub const NFT_LIMIT_PKTS: ::c_int = 0; +pub const NFT_LIMIT_PKT_BYTES: ::c_int = 1; + +pub const NFT_LIMIT_F_INV: ::c_int = 1 << 0; + +pub const NFT_QUEUE_FLAG_BYPASS: ::c_int = 0x01; +pub const NFT_QUEUE_FLAG_CPU_FANOUT: ::c_int = 0x02; +pub const NFT_QUEUE_FLAG_MASK: ::c_int = 0x03; + +pub const NFT_QUOTA_F_INV: ::c_int = 1 << 0; + +pub const NFT_REJECT_ICMP_UNREACH: ::c_int = 0; +pub const NFT_REJECT_TCP_RST: ::c_int = 1; +pub const NFT_REJECT_ICMPX_UNREACH: ::c_int = 2; + +pub const NFT_REJECT_ICMPX_NO_ROUTE: ::c_int = 0; +pub const NFT_REJECT_ICMPX_PORT_UNREACH: ::c_int = 1; +pub const NFT_REJECT_ICMPX_HOST_UNREACH: ::c_int = 2; +pub const NFT_REJECT_ICMPX_ADMIN_PROHIBITED: ::c_int = 3; + +pub const NFT_NAT_SNAT: ::c_int = 0; +pub const NFT_NAT_DNAT: ::c_int = 1; + +pub const NFT_TRACETYPE_UNSPEC: ::c_int = 0; +pub const NFT_TRACETYPE_POLICY: ::c_int = 1; +pub const NFT_TRACETYPE_RETURN: ::c_int = 2; +pub const NFT_TRACETYPE_RULE: ::c_int = 3; + +pub const NFT_NG_INCREMENTAL: ::c_int = 0; +pub const NFT_NG_RANDOM: ::c_int = 1; + +// linux/input.h +pub const FF_MAX: ::__u16 = 0x7f; +pub const FF_CNT: usize = FF_MAX as usize + 1; + +// linux/input-event-codes.h +pub const INPUT_PROP_MAX: ::__u16 = 0x1f; +pub const INPUT_PROP_CNT: usize = INPUT_PROP_MAX as usize + 1; +pub const EV_MAX: ::__u16 = 0x1f; +pub const EV_CNT: usize = EV_MAX as usize + 1; +pub const SYN_MAX: ::__u16 = 0xf; +pub const SYN_CNT: usize = SYN_MAX as usize + 1; +pub const KEY_MAX: ::__u16 = 0x2ff; +pub const KEY_CNT: usize = KEY_MAX as usize + 1; +pub const REL_MAX: ::__u16 = 0x0f; +pub const REL_CNT: usize = REL_MAX as usize + 1; +pub const ABS_MAX: ::__u16 = 0x3f; +pub const ABS_CNT: usize = ABS_MAX as usize + 1; +pub const SW_MAX: ::__u16 = 0x10; +pub const SW_CNT: usize = SW_MAX as usize + 1; +pub const MSC_MAX: ::__u16 = 0x07; +pub const MSC_CNT: usize = MSC_MAX as usize + 1; +pub const LED_MAX: ::__u16 = 0x0f; +pub const LED_CNT: usize = LED_MAX as usize + 1; +pub const REP_MAX: ::__u16 = 0x01; +pub const REP_CNT: usize = REP_MAX as usize + 1; +pub const SND_MAX: ::__u16 = 0x07; +pub const SND_CNT: usize = SND_MAX as usize + 1; + +// linux/uinput.h +pub const UINPUT_VERSION: ::c_uint = 5; +pub const UINPUT_MAX_NAME_SIZE: usize = 80; + +// uapi/linux/fanotify.h +pub const FAN_ACCESS: u64 = 0x0000_0001; +pub const FAN_MODIFY: u64 = 0x0000_0002; +pub const FAN_CLOSE_WRITE: u64 = 0x0000_0008; +pub const FAN_CLOSE_NOWRITE: u64 = 0x0000_0010; +pub const FAN_OPEN: u64 = 0x0000_0020; + +pub const FAN_Q_OVERFLOW: u64 = 0x0000_4000; + +pub const FAN_OPEN_PERM: u64 = 0x0001_0000; +pub const FAN_ACCESS_PERM: u64 = 0x0002_0000; + +pub const FAN_ONDIR: u64 = 0x4000_0000; + +pub const FAN_EVENT_ON_CHILD: u64 = 0x0800_0000; + +pub const FAN_CLOSE: u64 = FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE; + +pub const FAN_CLOEXEC: ::c_uint = 0x0000_0001; +pub const FAN_NONBLOCK: ::c_uint = 0x0000_0002; + +pub const FAN_CLASS_NOTIF: ::c_uint = 0x0000_0000; +pub const FAN_CLASS_CONTENT: ::c_uint = 0x0000_0004; +pub const FAN_CLASS_PRE_CONTENT: ::c_uint = 0x0000_0008; + +pub const FAN_UNLIMITED_QUEUE: ::c_uint = 0x0000_0010; +pub const FAN_UNLIMITED_MARKS: ::c_uint = 0x0000_0020; + +pub const FAN_MARK_ADD: ::c_uint = 0x0000_0001; +pub const FAN_MARK_REMOVE: ::c_uint = 0x0000_0002; +pub const FAN_MARK_DONT_FOLLOW: ::c_uint = 0x0000_0004; +pub const FAN_MARK_ONLYDIR: ::c_uint = 0x0000_0008; +pub const FAN_MARK_IGNORED_MASK: ::c_uint = 0x0000_0020; +pub const FAN_MARK_IGNORED_SURV_MODIFY: ::c_uint = 0x0000_0040; +pub const FAN_MARK_FLUSH: ::c_uint = 0x0000_0080; + +pub const FANOTIFY_METADATA_VERSION: u8 = 3; + +pub const FAN_ALLOW: u32 = 0x01; +pub const FAN_DENY: u32 = 0x02; + +pub const FAN_NOFD: ::c_int = -1; + +pub const FUTEX_WAIT: ::c_int = 0; +pub const FUTEX_WAKE: ::c_int = 1; +pub const FUTEX_FD: ::c_int = 2; +pub const FUTEX_REQUEUE: ::c_int = 3; +pub const FUTEX_CMP_REQUEUE: ::c_int = 4; +pub const FUTEX_WAKE_OP: ::c_int = 5; +pub const FUTEX_LOCK_PI: ::c_int = 6; +pub const FUTEX_UNLOCK_PI: ::c_int = 7; +pub const FUTEX_TRYLOCK_PI: ::c_int = 8; +pub const FUTEX_WAIT_BITSET: ::c_int = 9; +pub const FUTEX_WAKE_BITSET: ::c_int = 10; +pub const FUTEX_WAIT_REQUEUE_PI: ::c_int = 11; +pub const FUTEX_CMP_REQUEUE_PI: ::c_int = 12; +pub const FUTEX_LOCK_PI2: ::c_int = 13; + +pub const FUTEX_PRIVATE_FLAG: ::c_int = 128; +pub const FUTEX_CLOCK_REALTIME: ::c_int = 256; +pub const FUTEX_CMD_MASK: ::c_int = !(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME); + +pub const FUTEX_BITSET_MATCH_ANY: ::c_int = 0xffffffff; + +pub const FUTEX_OP_SET: ::c_int = 0; +pub const FUTEX_OP_ADD: ::c_int = 1; +pub const FUTEX_OP_OR: ::c_int = 2; +pub const FUTEX_OP_ANDN: ::c_int = 3; +pub const FUTEX_OP_XOR: ::c_int = 4; + +pub const FUTEX_OP_OPARG_SHIFT: ::c_int = 8; + +pub const FUTEX_OP_CMP_EQ: ::c_int = 0; +pub const FUTEX_OP_CMP_NE: ::c_int = 1; +pub const FUTEX_OP_CMP_LT: ::c_int = 2; +pub const FUTEX_OP_CMP_LE: ::c_int = 3; +pub const FUTEX_OP_CMP_GT: ::c_int = 4; +pub const FUTEX_OP_CMP_GE: ::c_int = 5; + +pub fn FUTEX_OP(op: ::c_int, oparg: ::c_int, cmp: ::c_int, cmparg: ::c_int) -> ::c_int { + ((op & 0xf) << 28) | ((cmp & 0xf) << 24) | ((oparg & 0xfff) << 12) | (cmparg & 0xfff) +} + +// linux/kexec.h +pub const KEXEC_ON_CRASH: ::c_int = 0x00000001; +pub const KEXEC_PRESERVE_CONTEXT: ::c_int = 0x00000002; +pub const KEXEC_ARCH_MASK: ::c_int = 0xffff0000; +pub const KEXEC_FILE_UNLOAD: ::c_int = 0x00000001; +pub const KEXEC_FILE_ON_CRASH: ::c_int = 0x00000002; +pub const KEXEC_FILE_NO_INITRAMFS: ::c_int = 0x00000004; + +// linux/reboot.h +pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; +pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; +pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; +pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; +pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; + +pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; +pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; +pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; +pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; +pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; +pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; +pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; +pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; + +pub const REG_EXTENDED: ::c_int = 1; +pub const REG_ICASE: ::c_int = 2; +pub const REG_NEWLINE: ::c_int = 4; +pub const REG_NOSUB: ::c_int = 8; + +pub const REG_NOTBOL: ::c_int = 1; +pub const REG_NOTEOL: ::c_int = 2; + +pub const REG_ENOSYS: ::c_int = -1; +pub const REG_NOMATCH: ::c_int = 1; +pub const REG_BADPAT: ::c_int = 2; +pub const REG_ECOLLATE: ::c_int = 3; +pub const REG_ECTYPE: ::c_int = 4; +pub const REG_EESCAPE: ::c_int = 5; +pub const REG_ESUBREG: ::c_int = 6; +pub const REG_EBRACK: ::c_int = 7; +pub const REG_EPAREN: ::c_int = 8; +pub const REG_EBRACE: ::c_int = 9; +pub const REG_BADBR: ::c_int = 10; +pub const REG_ERANGE: ::c_int = 11; +pub const REG_ESPACE: ::c_int = 12; +pub const REG_BADRPT: ::c_int = 13; + +// linux/errqueue.h +pub const SO_EE_ORIGIN_NONE: u8 = 0; +pub const SO_EE_ORIGIN_LOCAL: u8 = 1; +pub const SO_EE_ORIGIN_ICMP: u8 = 2; +pub const SO_EE_ORIGIN_ICMP6: u8 = 3; +pub const SO_EE_ORIGIN_TXSTATUS: u8 = 4; +pub const SO_EE_ORIGIN_TIMESTAMPING: u8 = SO_EE_ORIGIN_TXSTATUS; + +// errno.h +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EWOULDBLOCK: ::c_int = EAGAIN; + +// linux/can.h +pub const CAN_EFF_FLAG: canid_t = 0x80000000; +pub const CAN_RTR_FLAG: canid_t = 0x40000000; +pub const CAN_ERR_FLAG: canid_t = 0x20000000; +pub const CAN_SFF_MASK: canid_t = 0x000007FF; +pub const CAN_EFF_MASK: canid_t = 0x1FFFFFFF; +pub const CAN_ERR_MASK: canid_t = 0x1FFFFFFF; +pub const CANXL_PRIO_MASK: ::canid_t = CAN_SFF_MASK; + +pub const CAN_SFF_ID_BITS: ::c_int = 11; +pub const CAN_EFF_ID_BITS: ::c_int = 29; +pub const CANXL_PRIO_BITS: ::c_int = CAN_SFF_ID_BITS; + +pub const CAN_MAX_DLC: ::c_int = 8; +pub const CAN_MAX_DLEN: usize = 8; +pub const CANFD_MAX_DLC: ::c_int = 15; +pub const CANFD_MAX_DLEN: usize = 64; + +pub const CANFD_BRS: ::c_int = 0x01; +pub const CANFD_ESI: ::c_int = 0x02; + +pub const CANXL_MIN_DLC: ::c_int = 0; +pub const CANXL_MAX_DLC: ::c_int = 2047; +pub const CANXL_MAX_DLC_MASK: ::c_int = 0x07FF; +pub const CANXL_MIN_DLEN: usize = 1; +pub const CANXL_MAX_DLEN: usize = 2048; + +pub const CANXL_XLF: ::c_int = 0x80; +pub const CANXL_SEC: ::c_int = 0x01; + +cfg_if! { + if #[cfg(libc_align)] { + pub const CAN_MTU: usize = ::mem::size_of::(); + pub const CANFD_MTU: usize = ::mem::size_of::(); + pub const CANXL_MTU: usize = ::mem::size_of::(); + // FIXME: use `core::mem::offset_of!` once that is available + // https://github.com/rust-lang/rfcs/pull/3308 + // pub const CANXL_HDR_SIZE: usize = core::mem::offset_of!(canxl_frame, data); + pub const CANXL_HDR_SIZE: usize = 12; + pub const CANXL_MIN_MTU: usize = CANXL_HDR_SIZE + 64; + pub const CANXL_MAX_MTU: usize = CANXL_MTU; + } +} + +pub const CAN_RAW: ::c_int = 1; +pub const CAN_BCM: ::c_int = 2; +pub const CAN_TP16: ::c_int = 3; +pub const CAN_TP20: ::c_int = 4; +pub const CAN_MCNET: ::c_int = 5; +pub const CAN_ISOTP: ::c_int = 6; +pub const CAN_J1939: ::c_int = 7; +pub const CAN_NPROTO: ::c_int = 8; + +pub const SOL_CAN_BASE: ::c_int = 100; + +pub const CAN_INV_FILTER: canid_t = 0x20000000; +pub const CAN_RAW_FILTER_MAX: ::c_int = 512; + +// linux/can/raw.h +pub const SOL_CAN_RAW: ::c_int = SOL_CAN_BASE + CAN_RAW; +pub const CAN_RAW_FILTER: ::c_int = 1; +pub const CAN_RAW_ERR_FILTER: ::c_int = 2; +pub const CAN_RAW_LOOPBACK: ::c_int = 3; +pub const CAN_RAW_RECV_OWN_MSGS: ::c_int = 4; +pub const CAN_RAW_FD_FRAMES: ::c_int = 5; +pub const CAN_RAW_JOIN_FILTERS: ::c_int = 6; +pub const CAN_RAW_XL_FRAMES: ::c_int = 7; + +// linux/can/j1939.h +pub const SOL_CAN_J1939: ::c_int = SOL_CAN_BASE + CAN_J1939; + +pub const J1939_MAX_UNICAST_ADDR: ::c_uchar = 0xfd; +pub const J1939_IDLE_ADDR: ::c_uchar = 0xfe; +pub const J1939_NO_ADDR: ::c_uchar = 0xff; +pub const J1939_NO_NAME: ::c_ulong = 0; +pub const J1939_PGN_REQUEST: ::c_uint = 0x0ea00; +pub const J1939_PGN_ADDRESS_CLAIMED: ::c_uint = 0x0ee00; +pub const J1939_PGN_ADDRESS_COMMANDED: ::c_uint = 0x0fed8; +pub const J1939_PGN_PDU1_MAX: ::c_uint = 0x3ff00; +pub const J1939_PGN_MAX: ::c_uint = 0x3ffff; +pub const J1939_NO_PGN: ::c_uint = 0x40000; + +pub const SO_J1939_FILTER: ::c_int = 1; +pub const SO_J1939_PROMISC: ::c_int = 2; +pub const SO_J1939_SEND_PRIO: ::c_int = 3; +pub const SO_J1939_ERRQUEUE: ::c_int = 4; + +pub const SCM_J1939_DEST_ADDR: ::c_int = 1; +pub const SCM_J1939_DEST_NAME: ::c_int = 2; +pub const SCM_J1939_PRIO: ::c_int = 3; +pub const SCM_J1939_ERRQUEUE: ::c_int = 4; + +pub const J1939_NLA_PAD: ::c_int = 0; +pub const J1939_NLA_BYTES_ACKED: ::c_int = 1; +pub const J1939_NLA_TOTAL_SIZE: ::c_int = 2; +pub const J1939_NLA_PGN: ::c_int = 3; +pub const J1939_NLA_SRC_NAME: ::c_int = 4; +pub const J1939_NLA_DEST_NAME: ::c_int = 5; +pub const J1939_NLA_SRC_ADDR: ::c_int = 6; +pub const J1939_NLA_DEST_ADDR: ::c_int = 7; + +pub const J1939_EE_INFO_NONE: ::c_int = 0; +pub const J1939_EE_INFO_TX_ABORT: ::c_int = 1; +pub const J1939_EE_INFO_RX_RTS: ::c_int = 2; +pub const J1939_EE_INFO_RX_DPO: ::c_int = 3; +pub const J1939_EE_INFO_RX_ABORT: ::c_int = 4; + +pub const J1939_FILTER_MAX: ::c_int = 512; + +// linux/sctp.h +pub const SCTP_FUTURE_ASSOC: ::c_int = 0; +pub const SCTP_CURRENT_ASSOC: ::c_int = 1; +pub const SCTP_ALL_ASSOC: ::c_int = 2; +pub const SCTP_RTOINFO: ::c_int = 0; +pub const SCTP_ASSOCINFO: ::c_int = 1; +pub const SCTP_INITMSG: ::c_int = 2; +pub const SCTP_NODELAY: ::c_int = 3; +pub const SCTP_AUTOCLOSE: ::c_int = 4; +pub const SCTP_SET_PEER_PRIMARY_ADDR: ::c_int = 5; +pub const SCTP_PRIMARY_ADDR: ::c_int = 6; +pub const SCTP_ADAPTATION_LAYER: ::c_int = 7; +pub const SCTP_DISABLE_FRAGMENTS: ::c_int = 8; +pub const SCTP_PEER_ADDR_PARAMS: ::c_int = 9; +pub const SCTP_DEFAULT_SEND_PARAM: ::c_int = 10; +pub const SCTP_EVENTS: ::c_int = 11; +pub const SCTP_I_WANT_MAPPED_V4_ADDR: ::c_int = 12; +pub const SCTP_MAXSEG: ::c_int = 13; +pub const SCTP_STATUS: ::c_int = 14; +pub const SCTP_GET_PEER_ADDR_INFO: ::c_int = 15; +pub const SCTP_DELAYED_ACK_TIME: ::c_int = 16; +pub const SCTP_DELAYED_ACK: ::c_int = SCTP_DELAYED_ACK_TIME; +pub const SCTP_DELAYED_SACK: ::c_int = SCTP_DELAYED_ACK_TIME; +pub const SCTP_CONTEXT: ::c_int = 17; +pub const SCTP_FRAGMENT_INTERLEAVE: ::c_int = 18; +pub const SCTP_PARTIAL_DELIVERY_POINT: ::c_int = 19; +pub const SCTP_MAX_BURST: ::c_int = 20; +pub const SCTP_AUTH_CHUNK: ::c_int = 21; +pub const SCTP_HMAC_IDENT: ::c_int = 22; +pub const SCTP_AUTH_KEY: ::c_int = 23; +pub const SCTP_AUTH_ACTIVE_KEY: ::c_int = 24; +pub const SCTP_AUTH_DELETE_KEY: ::c_int = 25; +pub const SCTP_PEER_AUTH_CHUNKS: ::c_int = 26; +pub const SCTP_LOCAL_AUTH_CHUNKS: ::c_int = 27; +pub const SCTP_GET_ASSOC_NUMBER: ::c_int = 28; +pub const SCTP_GET_ASSOC_ID_LIST: ::c_int = 29; +pub const SCTP_AUTO_ASCONF: ::c_int = 30; +pub const SCTP_PEER_ADDR_THLDS: ::c_int = 31; +pub const SCTP_RECVRCVINFO: ::c_int = 32; +pub const SCTP_RECVNXTINFO: ::c_int = 33; +pub const SCTP_DEFAULT_SNDINFO: ::c_int = 34; +pub const SCTP_AUTH_DEACTIVATE_KEY: ::c_int = 35; +pub const SCTP_REUSE_PORT: ::c_int = 36; +pub const SCTP_PEER_ADDR_THLDS_V2: ::c_int = 37; +pub const SCTP_PR_SCTP_NONE: ::c_int = 0x0000; +pub const SCTP_PR_SCTP_TTL: ::c_int = 0x0010; +pub const SCTP_PR_SCTP_RTX: ::c_int = 0x0020; +pub const SCTP_PR_SCTP_PRIO: ::c_int = 0x0030; +pub const SCTP_PR_SCTP_MAX: ::c_int = SCTP_PR_SCTP_PRIO; +pub const SCTP_PR_SCTP_MASK: ::c_int = 0x0030; +pub const SCTP_ENABLE_RESET_STREAM_REQ: ::c_int = 0x01; +pub const SCTP_ENABLE_RESET_ASSOC_REQ: ::c_int = 0x02; +pub const SCTP_ENABLE_CHANGE_ASSOC_REQ: ::c_int = 0x04; +pub const SCTP_ENABLE_STRRESET_MASK: ::c_int = 0x07; +pub const SCTP_STREAM_RESET_INCOMING: ::c_int = 0x01; +pub const SCTP_STREAM_RESET_OUTGOING: ::c_int = 0x02; + +pub const SCTP_INIT: ::c_int = 0; +pub const SCTP_SNDRCV: ::c_int = 1; +pub const SCTP_SNDINFO: ::c_int = 2; +pub const SCTP_RCVINFO: ::c_int = 3; +pub const SCTP_NXTINFO: ::c_int = 4; +pub const SCTP_PRINFO: ::c_int = 5; +pub const SCTP_AUTHINFO: ::c_int = 6; +pub const SCTP_DSTADDRV4: ::c_int = 7; +pub const SCTP_DSTADDRV6: ::c_int = 8; + +pub const SCTP_UNORDERED: ::c_int = 1 << 0; +pub const SCTP_ADDR_OVER: ::c_int = 1 << 1; +pub const SCTP_ABORT: ::c_int = 1 << 2; +pub const SCTP_SACK_IMMEDIATELY: ::c_int = 1 << 3; +pub const SCTP_SENDALL: ::c_int = 1 << 6; +pub const SCTP_PR_SCTP_ALL: ::c_int = 1 << 7; +pub const SCTP_NOTIFICATION: ::c_int = MSG_NOTIFICATION; +pub const SCTP_EOF: ::c_int = ::MSG_FIN; + +/* DCCP socket options */ +pub const DCCP_SOCKOPT_PACKET_SIZE: ::c_int = 1; +pub const DCCP_SOCKOPT_SERVICE: ::c_int = 2; +pub const DCCP_SOCKOPT_CHANGE_L: ::c_int = 3; +pub const DCCP_SOCKOPT_CHANGE_R: ::c_int = 4; +pub const DCCP_SOCKOPT_GET_CUR_MPS: ::c_int = 5; +pub const DCCP_SOCKOPT_SERVER_TIMEWAIT: ::c_int = 6; +pub const DCCP_SOCKOPT_SEND_CSCOV: ::c_int = 10; +pub const DCCP_SOCKOPT_RECV_CSCOV: ::c_int = 11; +pub const DCCP_SOCKOPT_AVAILABLE_CCIDS: ::c_int = 12; +pub const DCCP_SOCKOPT_CCID: ::c_int = 13; +pub const DCCP_SOCKOPT_TX_CCID: ::c_int = 14; +pub const DCCP_SOCKOPT_RX_CCID: ::c_int = 15; +pub const DCCP_SOCKOPT_QPOLICY_ID: ::c_int = 16; +pub const DCCP_SOCKOPT_QPOLICY_TXQLEN: ::c_int = 17; +pub const DCCP_SOCKOPT_CCID_RX_INFO: ::c_int = 128; +pub const DCCP_SOCKOPT_CCID_TX_INFO: ::c_int = 192; + +/// maximum number of services provided on the same listening port +pub const DCCP_SERVICE_LIST_MAX_LEN: ::c_int = 32; + +f! { + pub fn NLA_ALIGN(len: ::c_int) -> ::c_int { + return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1) + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + if ((*cmsg).cmsg_len as usize) < ::mem::size_of::() { + return 0 as *mut cmsghdr; + }; + let next = (cmsg as usize + + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut cmsghdr; + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if (next.offset(1)) as usize > max || + next as usize + super::CMSG_ALIGN((*next).cmsg_len as usize) > max + { + 0 as *mut cmsghdr + } else { + next as *mut cmsghdr + } + } + + pub fn CPU_ALLOC_SIZE(count: ::c_int) -> ::size_t { + let _dummy: cpu_set_t = ::mem::zeroed(); + let size_in_bits = 8 * ::mem::size_of_val(&_dummy.bits[0]); + ((count as ::size_t + size_in_bits - 1) / 8) as ::size_t + } + + pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { + for slot in cpuset.bits.iter_mut() { + *slot = 0; + } + } + + pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] |= 1 << offset; + () + } + + pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { + let size_in_bits + = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + cpuset.bits[idx] &= !(1 << offset); + () + } + + pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { + let size_in_bits = 8 * ::mem::size_of_val(&cpuset.bits[0]); + let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); + 0 != (cpuset.bits[idx] & (1 << offset)) + } + + pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> ::c_int { + let mut s: u32 = 0; + let size_of_mask = ::mem::size_of_val(&cpuset.bits[0]); + for i in cpuset.bits[..(size / size_of_mask)].iter() { + s += i.count_ones(); + }; + s as ::c_int + } + + pub fn CPU_COUNT(cpuset: &cpu_set_t) -> ::c_int { + CPU_COUNT_S(::mem::size_of::(), cpuset) + } + + pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { + set1.bits == set2.bits + } + + pub fn SCTP_PR_INDEX(policy: ::c_int) -> ::c_int { + policy >> 4 - 1 + } + + pub fn SCTP_PR_POLICY(policy: ::c_int) -> ::c_int { + policy & SCTP_PR_SCTP_MASK + } + + pub fn SCTP_PR_SET_POLICY(flags: &mut ::c_int, policy: ::c_int) -> () { + *flags &= !SCTP_PR_SCTP_MASK; + *flags |= policy; + () + } + + pub fn major(dev: ::dev_t) -> ::c_uint { + let mut major = 0; + major |= (dev & 0x00000000000fff00) >> 8; + major |= (dev & 0xfffff00000000000) >> 32; + major as ::c_uint + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + let mut minor = 0; + minor |= (dev & 0x00000000000000ff) >> 0; + minor |= (dev & 0x00000ffffff00000) >> 12; + minor as ::c_uint + } + + pub fn IPTOS_TOS(tos: u8) -> u8 { + tos & IPTOS_TOS_MASK + } + + pub fn IPTOS_PREC(tos: u8) -> u8 { + tos & IPTOS_PREC_MASK + } + + pub fn RT_TOS(tos: u8) -> u8 { + tos & ::IPTOS_TOS_MASK + } + + pub fn RT_ADDRCLASS(flags: u32) -> u32 { + flags >> 23 + } + + pub fn RT_LOCALADDR(flags: u32) -> bool { + (flags & RTF_ADDRCLASSMASK) == (RTF_LOCAL | RTF_INTERFACE) + } + + pub fn SO_EE_OFFENDER(ee: *const ::sock_extended_err) -> *mut ::sockaddr { + ee.offset(1) as *mut ::sockaddr + } + + pub fn BPF_RVAL(code: ::__u32) -> ::__u32 { + code & 0x18 + } + + pub fn BPF_MISCOP(code: ::__u32) -> ::__u32 { + code & 0xf8 + } + + pub fn BPF_STMT(code: ::__u16, k: ::__u32) -> sock_filter { + sock_filter{code: code, jt: 0, jf: 0, k: k} + } + + pub fn BPF_JUMP(code: ::__u16, k: ::__u32, jt: ::__u8, jf: ::__u8) -> sock_filter { + sock_filter{code: code, jt: jt, jf: jf, k: k} + } +} + +safe_f! { + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + let major = major as ::dev_t; + let minor = minor as ::dev_t; + let mut dev = 0; + dev |= (major & 0x00000fff) << 8; + dev |= (major & 0xfffff000) << 32; + dev |= (minor & 0x000000ff) << 0; + dev |= (minor & 0xffffff00) << 12; + dev + } + + pub {const} fn SCTP_PR_TTL_ENABLED(policy: ::c_int) -> bool { + policy == SCTP_PR_SCTP_TTL + } + + pub {const} fn SCTP_PR_RTX_ENABLED(policy: ::c_int) -> bool { + policy == SCTP_PR_SCTP_RTX + } + + pub {const} fn SCTP_PR_PRIO_ENABLED(policy: ::c_int) -> bool { + policy == SCTP_PR_SCTP_PRIO + } +} + +cfg_if! { + if #[cfg(all(not(target_env = "uclibc"), not(target_env = "ohos")))] { + extern "C" { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut ::sigevent, + ) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + extern "C" { + pub fn pwritev( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + ) -> ::ssize_t; + pub fn preadv( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + ) -> ::ssize_t; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getloadavg( + loadavg: *mut ::c_double, + nelem: ::c_int + ) -> ::c_int; + pub fn process_vm_readv( + pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong, + ) -> isize; + pub fn process_vm_writev( + pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong, + ) -> isize; + pub fn futimes( + fd: ::c_int, + times: *const ::timeval + ) -> ::c_int; + } + } +} + +// These functions are not available on OpenHarmony +cfg_if! { + if #[cfg(not(target_env = "ohos"))] { + extern "C" { + // Only `getspnam_r` is implemented for musl, out of all of the reenterant + // functions from `shadow.h`. + // https://git.musl-libc.org/cgit/musl/tree/include/shadow.h + pub fn getspnam_r( + name: *const ::c_char, + spbuf: *mut spwd, + buf: *mut ::c_char, + buflen: ::size_t, + spbufp: *mut *mut spwd, + ) -> ::c_int; + + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_setattr( + mqd: ::mqd_t, + newattr: *const ::mq_attr, + oldattr: *mut ::mq_attr + ) -> ::c_int; + + pub fn pthread_mutex_consistent(mutex: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_mutexattr_getrobust( + attr: *const pthread_mutexattr_t, + robustness: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setrobust( + attr: *mut pthread_mutexattr_t, + robustness: ::c_int, + ) -> ::c_int; + } + } +} + +extern "C" { + #[cfg_attr( + not(any(target_env = "musl", target_env = "ohos")), + link_name = "__xpg_strerror_r" + )] + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + pub fn drand48() -> ::c_double; + pub fn erand48(xseed: *mut ::c_ushort) -> ::c_double; + pub fn lrand48() -> ::c_long; + pub fn nrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn mrand48() -> ::c_long; + pub fn jrand48(xseed: *mut ::c_ushort) -> ::c_long; + pub fn srand48(seed: ::c_long); + pub fn seed48(xseed: *mut ::c_ushort) -> *mut ::c_ushort; + pub fn lcong48(p: *mut ::c_ushort); + + pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; + + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwent() -> *mut passwd; + pub fn setgrent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + pub fn setspent(); + pub fn endspent(); + pub fn getspent() -> *mut spwd; + + pub fn getspnam(name: *const ::c_char) -> *mut spwd; + + // System V IPC + pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn semget(key: ::key_t, nsems: ::c_int, semflag: ::c_int) -> ::c_int; + pub fn semop(semid: ::c_int, sops: *mut ::sembuf, nsops: ::size_t) -> ::c_int; + pub fn semctl(semid: ::c_int, semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int; + pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; + pub fn msgrcv( + msqid: ::c_int, + msgp: *mut ::c_void, + msgsz: ::size_t, + msgtyp: ::c_long, + msgflg: ::c_int, + ) -> ::ssize_t; + pub fn msgsnd( + msqid: ::c_int, + msgp: *const ::c_void, + msgsz: ::size_t, + msgflg: ::c_int, + ) -> ::c_int; + + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn __errno_location() -> *mut ::c_int; + + pub fn fallocate(fd: ::c_int, mode: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn readahead(fd: ::c_int, offset: ::off64_t, count: ::size_t) -> ::ssize_t; + pub fn getxattr( + path: *const c_char, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn lgetxattr( + path: *const c_char, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn fgetxattr( + filedes: ::c_int, + name: *const c_char, + value: *mut ::c_void, + size: ::size_t, + ) -> ::ssize_t; + pub fn setxattr( + path: *const c_char, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn lsetxattr( + path: *const c_char, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn fsetxattr( + filedes: ::c_int, + name: *const c_char, + value: *const ::c_void, + size: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn listxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn llistxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn flistxattr(filedes: ::c_int, list: *mut c_char, size: ::size_t) -> ::ssize_t; + pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; + pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; + pub fn signalfd(fd: ::c_int, mask: *const ::sigset_t, flags: ::c_int) -> ::c_int; + pub fn timerfd_create(clockid: ::clockid_t, flags: ::c_int) -> ::c_int; + pub fn timerfd_gettime(fd: ::c_int, curr_value: *mut itimerspec) -> ::c_int; + pub fn timerfd_settime( + fd: ::c_int, + flags: ::c_int, + new_value: *const itimerspec, + old_value: *mut itimerspec, + ) -> ::c_int; + pub fn quotactl( + cmd: ::c_int, + special: *const ::c_char, + id: ::c_int, + data: *mut ::c_char, + ) -> ::c_int; + pub fn epoll_pwait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + sigmask: *const ::sigset_t, + ) -> ::c_int; + pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int, + ) -> ::c_int; + pub fn pthread_getaffinity_np( + thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t, + ) -> ::c_int; + pub fn pthread_setaffinity_np( + thread: ::pthread_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t, + ) -> ::c_int; + pub fn pthread_setschedprio(native: ::pthread_t, priority: ::c_int) -> ::c_int; + pub fn reboot(how_to: ::c_int) -> ::c_int; + pub fn setfsgid(gid: ::gid_t) -> ::c_int; + pub fn setfsuid(uid: ::uid_t) -> ::c_int; + + // Not available now on Android + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn sync_file_range( + fd: ::c_int, + offset: ::off64_t, + nbytes: ::off64_t, + flags: ::c_uint, + ) -> ::c_int; + pub fn mremap( + addr: *mut ::c_void, + len: ::size_t, + new_len: ::size_t, + flags: ::c_int, + ... + ) -> *mut ::c_void; + + pub fn glob( + pattern: *const c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn remap_file_pages( + addr: *mut ::c_void, + size: ::size_t, + prot: ::c_int, + pgoff: ::size_t, + flags: ::c_int, + ) -> ::c_int; + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn vhangup() -> ::c_int; + pub fn sync(); + pub fn syncfs(fd: ::c_int) -> ::c_int; + pub fn syscall(num: ::c_long, ...) -> ::c_long; + pub fn sched_getaffinity(pid: ::pid_t, cpusetsize: ::size_t, cpuset: *mut cpu_set_t) + -> ::c_int; + pub fn sched_setaffinity( + pid: ::pid_t, + cpusetsize: ::size_t, + cpuset: *const cpu_set_t, + ) -> ::c_int; + pub fn epoll_create(size: ::c_int) -> ::c_int; + pub fn epoll_create1(flags: ::c_int) -> ::c_int; + pub fn epoll_wait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + ) -> ::c_int; + pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) + -> ::c_int; + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn unshare(flags: ::c_int) -> ::c_int; + pub fn umount(target: *const ::c_char) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn tee(fd_in: ::c_int, fd_out: ::c_int, len: ::size_t, flags: ::c_uint) -> ::ssize_t; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; + pub fn splice( + fd_in: ::c_int, + off_in: *mut ::loff_t, + fd_out: ::c_int, + off_out: *mut ::loff_t, + len: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int; + pub fn swapoff(path: *const ::c_char) -> ::c_int; + pub fn vmsplice( + fd: ::c_int, + iov: *const ::iovec, + nr_segs: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; + pub fn mount( + src: *const ::c_char, + target: *const ::c_char, + fstype: *const ::c_char, + flags: ::c_ulong, + data: *const ::c_void, + ) -> ::c_int; + pub fn personality(persona: ::c_ulong) -> ::c_int; + pub fn prctl(option: ::c_int, ...) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; + pub fn ppoll( + fds: *mut ::pollfd, + nfds: nfds_t, + timeout: *const ::timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn pthread_mutexattr_getprotocol( + attr: *const pthread_mutexattr_t, + protocol: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setprotocol( + attr: *mut pthread_mutexattr_t, + protocol: ::c_int, + ) -> ::c_int; + + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_barrierattr_init(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_destroy(attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_getpshared( + attr: *const ::pthread_barrierattr_t, + shared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_barrierattr_setpshared( + attr: *mut ::pthread_barrierattr_t, + shared: ::c_int, + ) -> ::c_int; + pub fn pthread_barrier_init( + barrier: *mut pthread_barrier_t, + attr: *const ::pthread_barrierattr_t, + count: ::c_uint, + ) -> ::c_int; + pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> ::c_int; + pub fn pthread_spin_init(lock: *mut ::pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn clone( + cb: extern "C" fn(*mut ::c_void) -> ::c_int, + child_stack: *mut ::c_void, + flags: ::c_int, + arg: *mut ::c_void, + ... + ) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn sysinfo(info: *mut ::sysinfo) -> ::c_int; + pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn swapon(path: *const ::c_char, swapflags: ::c_int) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sendfile( + out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut off_t, + count: ::size_t, + ) -> ::ssize_t; + pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn getgrouplist( + user: *const ::c_char, + group: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut ::dl_phdr_info, + size: ::size_t, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + + pub fn setmntent(filename: *const ::c_char, ty: *const ::c_char) -> *mut ::FILE; + pub fn getmntent(stream: *mut ::FILE) -> *mut ::mntent; + pub fn addmntent(stream: *mut ::FILE, mnt: *const ::mntent) -> ::c_int; + pub fn endmntent(streamp: *mut ::FILE) -> ::c_int; + pub fn hasmntopt(mnt: *const ::mntent, opt: *const ::c_char) -> *mut ::c_char; + + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_getschedpolicy( + attr: *const posix_spawnattr_t, + flags: *mut ::c_int, + ) -> ::c_int; + pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; + pub fn posix_spawnattr_getschedparam( + attr: *const posix_spawnattr_t, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_setschedparam( + attr: *mut posix_spawnattr_t, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + pub fn fread_unlocked( + ptr: *mut ::c_void, + size: ::size_t, + nobj: ::size_t, + stream: *mut ::FILE, + ) -> ::size_t; + pub fn inotify_rm_watch(fd: ::c_int, wd: ::c_int) -> ::c_int; + pub fn inotify_init() -> ::c_int; + pub fn inotify_init1(flags: ::c_int) -> ::c_int; + pub fn inotify_add_watch(fd: ::c_int, path: *const ::c_char, mask: u32) -> ::c_int; + pub fn fanotify_init(flags: ::c_uint, event_f_flags: ::c_uint) -> ::c_int; + + pub fn regcomp(preg: *mut ::regex_t, pattern: *const ::c_char, cflags: ::c_int) -> ::c_int; + + pub fn regexec( + preg: *const ::regex_t, + input: *const ::c_char, + nmatch: ::size_t, + pmatch: *mut regmatch_t, + eflags: ::c_int, + ) -> ::c_int; + + pub fn regerror( + errcode: ::c_int, + preg: *const ::regex_t, + errbuf: *mut ::c_char, + errbuf_size: ::size_t, + ) -> ::size_t; + + pub fn regfree(preg: *mut ::regex_t); + + pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; + + pub fn gettid() -> ::pid_t; + + pub fn timer_create( + clockid: ::clockid_t, + sevp: *mut ::sigevent, + timerid: *mut ::timer_t, + ) -> ::c_int; + pub fn timer_delete(timerid: ::timer_t) -> ::c_int; + pub fn timer_getoverrun(timerid: ::timer_t) -> ::c_int; + pub fn timer_gettime(timerid: ::timer_t, curr_value: *mut ::itimerspec) -> ::c_int; + pub fn timer_settime( + timerid: ::timer_t, + flags: ::c_int, + new_value: *const ::itimerspec, + old_value: *mut ::itimerspec, + ) -> ::c_int; + + pub fn gethostid() -> ::c_long; + + pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; + pub fn memmem( + haystack: *const ::c_void, + haystacklen: ::size_t, + needle: *const ::c_void, + needlelen: ::size_t, + ) -> *mut ::c_void; + pub fn sched_getcpu() -> ::c_int; + + pub fn pthread_getname_np(thread: ::pthread_t, name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_setname_np(thread: ::pthread_t, name: *const ::c_char) -> ::c_int; + pub fn getopt_long( + argc: ::c_int, + argv: *const *mut c_char, + optstring: *const c_char, + longopts: *const option, + longindex: *mut ::c_int, + ) -> ::c_int; + + pub fn copy_file_range( + fd_in: ::c_int, + off_in: *mut ::off64_t, + fd_out: ::c_int, + off_out: *mut ::off64_t, + len: ::size_t, + flags: ::c_uint, + ) -> ::ssize_t; +} + +// LFS64 extensions +// +// * musl has 64-bit versions only so aliases the LFS64 symbols to the standard ones +cfg_if! { + if #[cfg(not(target_env = "musl"))] { + extern "C" { + pub fn fallocate64( + fd: ::c_int, + mode: ::c_int, + offset: ::off64_t, + len: ::off64_t + ) -> ::c_int; + pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; + pub fn fopen64(filename: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn freopen64( + filename: *const c_char, + mode: *const c_char, + file: *mut ::FILE, + ) -> *mut ::FILE; + pub fn fseeko64(stream: *mut ::FILE, offset: ::off64_t, whence: ::c_int) -> ::c_int; + pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; + pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; + pub fn posix_fallocate64(fd: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; + pub fn sendfile64( + out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut off64_t, + count: ::size_t, + ) -> ::ssize_t; + pub fn tmpfile64() -> *mut ::FILE; + } + } +} + +cfg_if! { + if #[cfg(target_env = "uclibc")] { + mod uclibc; + pub use self::uclibc::*; + } else if #[cfg(any(target_env = "musl", target_env = "ohos"))] { + mod musl; + pub use self::musl::*; + } else if #[cfg(target_env = "gnu")] { + mod gnu; + pub use self::gnu::*; + } +} + +mod arch; +pub use self::arch::*; + +cfg_if! { + if #[cfg(libc_align)] { + #[macro_use] + mod align; + } else { + #[macro_use] + mod no_align; + } +} +expand_align!(); + +cfg_if! { + if #[cfg(libc_non_exhaustive)] { + mod non_exhaustive; + pub use self::non_exhaustive::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/align.rs new file mode 100644 index 0000000..aedbf7a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: (i64, i64) + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs new file mode 100644 index 0000000..c47fa2c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/arm/mod.rs @@ -0,0 +1,858 @@ +pub type c_char = u8; +pub type wchar_t = u32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct mcontext_t { + pub trap_no: ::c_ulong, + pub error_code: ::c_ulong, + pub oldmask: ::c_ulong, + pub arm_r0: ::c_ulong, + pub arm_r1: ::c_ulong, + pub arm_r2: ::c_ulong, + pub arm_r3: ::c_ulong, + pub arm_r4: ::c_ulong, + pub arm_r5: ::c_ulong, + pub arm_r6: ::c_ulong, + pub arm_r7: ::c_ulong, + pub arm_r8: ::c_ulong, + pub arm_r9: ::c_ulong, + pub arm_r10: ::c_ulong, + pub arm_fp: ::c_ulong, + pub arm_ip: ::c_ulong, + pub arm_sp: ::c_ulong, + pub arm_lr: ::c_ulong, + pub arm_pc: ::c_ulong, + pub arm_cpsr: ::c_ulong, + pub fault_address: ::c_ulong, + } +} + +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_regspace: [::c_ulonglong; 64], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_link) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + .finish() + } + } + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + } + } + } +} + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_LARGEFILE: ::c_int = 0o400000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_pause: ::c_long = 29; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_pivot_root: ::c_long = 218; +pub const SYS_mincore: ::c_long = 219; +pub const SYS_madvise: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_lookup_dcookie: ::c_long = 249; +pub const SYS_epoll_create: ::c_long = 250; +pub const SYS_epoll_ctl: ::c_long = 251; +pub const SYS_epoll_wait: ::c_long = 252; +pub const SYS_remap_file_pages: ::c_long = 253; +pub const SYS_set_tid_address: ::c_long = 256; +pub const SYS_timer_create: ::c_long = 257; +pub const SYS_timer_settime: ::c_long = 258; +pub const SYS_timer_gettime: ::c_long = 259; +pub const SYS_timer_getoverrun: ::c_long = 260; +pub const SYS_timer_delete: ::c_long = 261; +pub const SYS_clock_settime: ::c_long = 262; +pub const SYS_clock_gettime: ::c_long = 263; +pub const SYS_clock_getres: ::c_long = 264; +pub const SYS_clock_nanosleep: ::c_long = 265; +pub const SYS_statfs64: ::c_long = 266; +pub const SYS_fstatfs64: ::c_long = 267; +pub const SYS_tgkill: ::c_long = 268; +pub const SYS_utimes: ::c_long = 269; +pub const SYS_pciconfig_iobase: ::c_long = 271; +pub const SYS_pciconfig_read: ::c_long = 272; +pub const SYS_pciconfig_write: ::c_long = 273; +pub const SYS_mq_open: ::c_long = 274; +pub const SYS_mq_unlink: ::c_long = 275; +pub const SYS_mq_timedsend: ::c_long = 276; +pub const SYS_mq_timedreceive: ::c_long = 277; +pub const SYS_mq_notify: ::c_long = 278; +pub const SYS_mq_getsetattr: ::c_long = 279; +pub const SYS_waitid: ::c_long = 280; +pub const SYS_socket: ::c_long = 281; +pub const SYS_bind: ::c_long = 282; +pub const SYS_connect: ::c_long = 283; +pub const SYS_listen: ::c_long = 284; +pub const SYS_accept: ::c_long = 285; +pub const SYS_getsockname: ::c_long = 286; +pub const SYS_getpeername: ::c_long = 287; +pub const SYS_socketpair: ::c_long = 288; +pub const SYS_send: ::c_long = 289; +pub const SYS_sendto: ::c_long = 290; +pub const SYS_recv: ::c_long = 291; +pub const SYS_recvfrom: ::c_long = 292; +pub const SYS_shutdown: ::c_long = 293; +pub const SYS_setsockopt: ::c_long = 294; +pub const SYS_getsockopt: ::c_long = 295; +pub const SYS_sendmsg: ::c_long = 296; +pub const SYS_recvmsg: ::c_long = 297; +pub const SYS_semop: ::c_long = 298; +pub const SYS_semget: ::c_long = 299; +pub const SYS_semctl: ::c_long = 300; +pub const SYS_msgsnd: ::c_long = 301; +pub const SYS_msgrcv: ::c_long = 302; +pub const SYS_msgget: ::c_long = 303; +pub const SYS_msgctl: ::c_long = 304; +pub const SYS_shmat: ::c_long = 305; +pub const SYS_shmdt: ::c_long = 306; +pub const SYS_shmget: ::c_long = 307; +pub const SYS_shmctl: ::c_long = 308; +pub const SYS_add_key: ::c_long = 309; +pub const SYS_request_key: ::c_long = 310; +pub const SYS_keyctl: ::c_long = 311; +pub const SYS_semtimedop: ::c_long = 312; +pub const SYS_vserver: ::c_long = 313; +pub const SYS_ioprio_set: ::c_long = 314; +pub const SYS_ioprio_get: ::c_long = 315; +pub const SYS_inotify_init: ::c_long = 316; +pub const SYS_inotify_add_watch: ::c_long = 317; +pub const SYS_inotify_rm_watch: ::c_long = 318; +pub const SYS_mbind: ::c_long = 319; +pub const SYS_get_mempolicy: ::c_long = 320; +pub const SYS_set_mempolicy: ::c_long = 321; +pub const SYS_openat: ::c_long = 322; +pub const SYS_mkdirat: ::c_long = 323; +pub const SYS_mknodat: ::c_long = 324; +pub const SYS_fchownat: ::c_long = 325; +pub const SYS_futimesat: ::c_long = 326; +pub const SYS_fstatat64: ::c_long = 327; +pub const SYS_unlinkat: ::c_long = 328; +pub const SYS_renameat: ::c_long = 329; +pub const SYS_linkat: ::c_long = 330; +pub const SYS_symlinkat: ::c_long = 331; +pub const SYS_readlinkat: ::c_long = 332; +pub const SYS_fchmodat: ::c_long = 333; +pub const SYS_faccessat: ::c_long = 334; +pub const SYS_pselect6: ::c_long = 335; +pub const SYS_ppoll: ::c_long = 336; +pub const SYS_unshare: ::c_long = 337; +pub const SYS_set_robust_list: ::c_long = 338; +pub const SYS_get_robust_list: ::c_long = 339; +pub const SYS_splice: ::c_long = 340; +pub const SYS_tee: ::c_long = 342; +pub const SYS_vmsplice: ::c_long = 343; +pub const SYS_move_pages: ::c_long = 344; +pub const SYS_getcpu: ::c_long = 345; +pub const SYS_epoll_pwait: ::c_long = 346; +pub const SYS_kexec_load: ::c_long = 347; +pub const SYS_utimensat: ::c_long = 348; +pub const SYS_signalfd: ::c_long = 349; +pub const SYS_timerfd_create: ::c_long = 350; +pub const SYS_eventfd: ::c_long = 351; +pub const SYS_fallocate: ::c_long = 352; +pub const SYS_timerfd_settime: ::c_long = 353; +pub const SYS_timerfd_gettime: ::c_long = 354; +pub const SYS_signalfd4: ::c_long = 355; +pub const SYS_eventfd2: ::c_long = 356; +pub const SYS_epoll_create1: ::c_long = 357; +pub const SYS_dup3: ::c_long = 358; +pub const SYS_pipe2: ::c_long = 359; +pub const SYS_inotify_init1: ::c_long = 360; +pub const SYS_preadv: ::c_long = 361; +pub const SYS_pwritev: ::c_long = 362; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 363; +pub const SYS_perf_event_open: ::c_long = 364; +pub const SYS_recvmmsg: ::c_long = 365; +pub const SYS_accept4: ::c_long = 366; +pub const SYS_fanotify_init: ::c_long = 367; +pub const SYS_fanotify_mark: ::c_long = 368; +pub const SYS_prlimit64: ::c_long = 369; +pub const SYS_name_to_handle_at: ::c_long = 370; +pub const SYS_open_by_handle_at: ::c_long = 371; +pub const SYS_clock_adjtime: ::c_long = 372; +pub const SYS_syncfs: ::c_long = 373; +pub const SYS_sendmmsg: ::c_long = 374; +pub const SYS_setns: ::c_long = 375; +pub const SYS_process_vm_readv: ::c_long = 376; +pub const SYS_process_vm_writev: ::c_long = 377; +pub const SYS_kcmp: ::c_long = 378; +pub const SYS_finit_module: ::c_long = 379; +pub const SYS_sched_setattr: ::c_long = 380; +pub const SYS_sched_getattr: ::c_long = 381; +pub const SYS_renameat2: ::c_long = 382; +pub const SYS_seccomp: ::c_long = 383; +pub const SYS_getrandom: ::c_long = 384; +pub const SYS_memfd_create: ::c_long = 385; +pub const SYS_bpf: ::c_long = 386; +pub const SYS_execveat: ::c_long = 387; +pub const SYS_userfaultfd: ::c_long = 388; +pub const SYS_membarrier: ::c_long = 389; +pub const SYS_mlock2: ::c_long = 390; +pub const SYS_copy_file_range: ::c_long = 391; +pub const SYS_preadv2: ::c_long = 392; +pub const SYS_pwritev2: ::c_long = 393; +pub const SYS_pkey_mprotect: ::c_long = 394; +pub const SYS_pkey_alloc: ::c_long = 395; +pub const SYS_pkey_free: ::c_long = 396; +pub const SYS_statx: ::c_long = 397; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs new file mode 100644 index 0000000..f83d208 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs @@ -0,0 +1,673 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type stat64 = ::stat; + +s! { + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::c_ulonglong, + pub st_mode: ::c_uint, + pub st_nlink: ::c_uint, + pub st_uid: ::c_uint, + pub st_gid: ::c_uint, + pub st_rdev: ::c_ulonglong, + __st_rdev_padding: ::c_ulong, + pub st_size: ::c_longlong, + pub st_blksize: ::blksize_t, + __st_blksize_padding: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + + __unused: [::c_int;2], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +pub const AF_FILE: ::c_int = 1; +pub const AF_KCM: ::c_int = 41; +pub const AF_MAX: ::c_int = 43; +pub const AF_QIPCRTR: ::c_int = 42; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EALREADY: ::c_int = 114; +pub const EBADE: ::c_int = 52; +pub const EBADMSG: ::c_int = 74; +pub const EBADR: ::c_int = 53; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const ECANCELED: ::c_int = 125; +pub const ECHRNG: ::c_int = 44; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNREFUSED: ::c_int = 111; +pub const ECONNRESET: ::c_int = 104; +pub const EDEADLK: ::c_int = 35; +pub const EDEADLOCK: ::c_int = 35; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EDQUOT: ::c_int = 122; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EHWPOISON: ::c_int = 133; +pub const EIDRM: ::c_int = 43; +pub const EILSEQ: ::c_int = 84; +pub const EINPROGRESS: ::c_int = 115; +pub const EISCONN: ::c_int = 106; +pub const EISNAM: ::c_int = 120; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREJECTED: ::c_int = 129; +pub const EKEYREVOKED: ::c_int = 128; +pub const EL2HLT: ::c_int = 51; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBEXEC: ::c_int = 83; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBSCN: ::c_int = 81; +pub const ELNRNG: ::c_int = 48; +pub const ELOOP: ::c_int = 40; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const EMSGSIZE: ::c_int = 90; +pub const EMULTIHOP: ::c_int = 72; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENAVAIL: ::c_int = 119; +pub const ENETDOWN: ::c_int = 100; +pub const ENETRESET: ::c_int = 102; +pub const ENETUNREACH: ::c_int = 101; +pub const ENOANO: ::c_int = 55; +pub const ENOBUFS: ::c_int = 105; +pub const ENOCSI: ::c_int = 50; +pub const ENOKEY: ::c_int = 126; +pub const ENOLCK: ::c_int = 37; +pub const ENOMEDIUM: ::c_int = 123; +pub const ENOMSG: ::c_int = 42; +pub const ENOPROTOOPT: ::c_int = 92; +pub const ENOSYS: ::c_int = 38; +pub const ENOTCONN: ::c_int = 107; +pub const ENOTEMPTY: ::c_int = 39; +pub const ENOTNAM: ::c_int = 118; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ENOTSOCK: ::c_int = 88; +pub const ENOTSUP: ::c_int = 95; +pub const ENOTUNIQ: ::c_int = 76; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EOVERFLOW: ::c_int = 75; +pub const EOWNERDEAD: ::c_int = 130; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EREMCHG: ::c_int = 78; +pub const ERESTART: ::c_int = 85; +pub const ERFKILL: ::c_int = 132; +pub const ESHUTDOWN: ::c_int = 108; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const ESTALE: ::c_int = 116; +pub const ESTRPIPE: ::c_int = 86; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const EUCLEAN: ::c_int = 117; +pub const EUNATCH: ::c_int = 49; +pub const EUSERS: ::c_int = 87; +pub const EXFULL: ::c_int = 54; +pub const EXTPROC: ::c_int = 65536; +pub const F_EXLCK: ::c_int = 4; +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_GETOWNER_UIDS: ::c_int = 17; +pub const F_GETOWN_EX: ::c_int = 16; +pub const F_GETSIG: ::c_int = 11; +pub const F_LINUX_SPECIFIC_BASE: ::c_int = 1024; +pub const FLUSHO: ::c_int = 4096; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; +pub const F_OWNER_PGRP: ::c_int = 2; +pub const F_OWNER_PID: ::c_int = 1; +pub const F_OWNER_TID: ::c_int = 0; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETOWN_EX: ::c_int = 15; +pub const F_SETSIG: ::c_int = 10; +pub const F_SHLCK: ::c_int = 8; +pub const IEXTEN: ::c_int = 32768; +pub const MAP_ANON: ::c_int = 32; +pub const MAP_DENYWRITE: ::c_int = 2048; +pub const MAP_EXECUTABLE: ::c_int = 4096; +pub const MAP_GROWSDOWN: ::c_int = 256; +pub const MAP_HUGETLB: ::c_int = 262144; +pub const MAP_LOCKED: ::c_int = 8192; +pub const MAP_NONBLOCK: ::c_int = 65536; +pub const MAP_NORESERVE: ::c_int = 16384; +pub const MAP_POPULATE: ::c_int = 32768; +pub const MAP_STACK: ::c_int = 131072; +pub const MAP_UNINITIALIZED: ::c_int = 0; +pub const O_APPEND: ::c_int = 1024; +pub const O_ASYNC: ::c_int = 8192; +pub const O_CREAT: ::c_int = 64; +pub const O_DIRECT: ::c_int = 16384; +pub const O_DIRECTORY: ::c_int = 65536; +pub const O_DSYNC: ::c_int = 4096; +pub const O_EXCL: ::c_int = 128; +pub const O_LARGEFILE: ::c_int = 32768; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NOFOLLOW: ::c_int = 131072; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const PF_FILE: ::c_int = 1; +pub const PF_KCM: ::c_int = 41; +pub const PF_MAX: ::c_int = 43; +pub const PF_QIPCRTR: ::c_int = 42; +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; +pub const SIGBUS: ::c_int = 7; +pub const SIGCHLD: ::c_int = 17; +pub const SIGCONT: ::c_int = 18; +pub const SIGIO: ::c_int = 29; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPROF: ::c_int = 27; +pub const SIGPWR: ::c_int = 30; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const SIGSTOP: ::c_int = 19; +pub const SIGSYS: ::c_int = 31; +pub const SIGTSTP: ::c_int = 20; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGURG: ::c_int = 23; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGWINCH: ::c_int = 28; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIG_SETMASK: ::c_int = 2; // FIXME check these +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_NONBLOCK: ::c_int = 2048; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOL_CAIF: ::c_int = 278; +pub const SOL_IUCV: ::c_int = 277; +pub const SOL_KCM: ::c_int = 281; +pub const SOL_NFC: ::c_int = 280; +pub const SOL_PNPIPE: ::c_int = 275; +pub const SOL_PPPOL2TP: ::c_int = 273; +pub const SOL_RDS: ::c_int = 276; +pub const SOL_RXRPC: ::c_int = 272; + +pub const SYS3264_fadvise64: ::c_int = 223; +pub const SYS3264_fcntl: ::c_int = 25; +pub const SYS3264_fstatat: ::c_int = 79; +pub const SYS3264_fstat: ::c_int = 80; +pub const SYS3264_fstatfs: ::c_int = 44; +pub const SYS3264_ftruncate: ::c_int = 46; +pub const SYS3264_lseek: ::c_int = 62; +pub const SYS3264_lstat: ::c_int = 1039; +pub const SYS3264_mmap: ::c_int = 222; +pub const SYS3264_sendfile: ::c_int = 71; +pub const SYS3264_stat: ::c_int = 1038; +pub const SYS3264_statfs: ::c_int = 43; +pub const SYS3264_truncate: ::c_int = 45; +pub const SYS_accept4: ::c_int = 242; +pub const SYS_accept: ::c_int = 202; +pub const SYS_access: ::c_int = 1033; +pub const SYS_acct: ::c_int = 89; +pub const SYS_add_key: ::c_int = 217; +pub const SYS_adjtimex: ::c_int = 171; +pub const SYS_alarm: ::c_int = 1059; +pub const SYS_arch_specific_syscall: ::c_int = 244; +pub const SYS_bdflush: ::c_int = 1075; +pub const SYS_bind: ::c_int = 200; +pub const SYS_bpf: ::c_int = 280; +pub const SYS_brk: ::c_int = 214; +pub const SYS_capget: ::c_int = 90; +pub const SYS_capset: ::c_int = 91; +pub const SYS_chdir: ::c_int = 49; +pub const SYS_chmod: ::c_int = 1028; +pub const SYS_chown: ::c_int = 1029; +pub const SYS_chroot: ::c_int = 51; +pub const SYS_clock_adjtime: ::c_int = 266; +pub const SYS_clock_getres: ::c_int = 114; +pub const SYS_clock_gettime: ::c_int = 113; +pub const SYS_clock_nanosleep: ::c_int = 115; +pub const SYS_clock_settime: ::c_int = 112; +pub const SYS_clone: ::c_int = 220; +pub const SYS_close: ::c_int = 57; +pub const SYS_connect: ::c_int = 203; +pub const SYS_copy_file_range: ::c_int = -1; // FIXME +pub const SYS_creat: ::c_int = 1064; +pub const SYS_delete_module: ::c_int = 106; +pub const SYS_dup2: ::c_int = 1041; +pub const SYS_dup3: ::c_int = 24; +pub const SYS_dup: ::c_int = 23; +pub const SYS_epoll_create1: ::c_int = 20; +pub const SYS_epoll_create: ::c_int = 1042; +pub const SYS_epoll_ctl: ::c_int = 21; +pub const SYS_epoll_pwait: ::c_int = 22; +pub const SYS_epoll_wait: ::c_int = 1069; +pub const SYS_eventfd2: ::c_int = 19; +pub const SYS_eventfd: ::c_int = 1044; +pub const SYS_execveat: ::c_int = 281; +pub const SYS_execve: ::c_int = 221; +pub const SYS_exit: ::c_int = 93; +pub const SYS_exit_group: ::c_int = 94; +pub const SYS_faccessat: ::c_int = 48; +pub const SYS_fadvise64_64: ::c_int = 223; +pub const SYS_fallocate: ::c_int = 47; +pub const SYS_fanotify_init: ::c_int = 262; +pub const SYS_fanotify_mark: ::c_int = 263; +pub const SYS_fchdir: ::c_int = 50; +pub const SYS_fchmodat: ::c_int = 53; +pub const SYS_fchmod: ::c_int = 52; +pub const SYS_fchownat: ::c_int = 54; +pub const SYS_fchown: ::c_int = 55; +pub const SYS_fcntl64: ::c_int = 25; +pub const SYS_fcntl: ::c_int = 25; +pub const SYS_fdatasync: ::c_int = 83; +pub const SYS_fgetxattr: ::c_int = 10; +pub const SYS_finit_module: ::c_int = 273; +pub const SYS_flistxattr: ::c_int = 13; +pub const SYS_flock: ::c_int = 32; +pub const SYS_fork: ::c_int = 1079; +pub const SYS_fremovexattr: ::c_int = 16; +pub const SYS_fsetxattr: ::c_int = 7; +pub const SYS_fstat64: ::c_int = 80; +pub const SYS_fstatat64: ::c_int = 79; +pub const SYS_fstatfs64: ::c_int = 44; +pub const SYS_fstatfs: ::c_int = 44; +pub const SYS_fsync: ::c_int = 82; +pub const SYS_ftruncate64: ::c_int = 46; +pub const SYS_ftruncate: ::c_int = 46; +pub const SYS_futex: ::c_int = 98; +pub const SYS_futimesat: ::c_int = 1066; +pub const SYS_getcpu: ::c_int = 168; +pub const SYS_getcwd: ::c_int = 17; +pub const SYS_getdents64: ::c_int = 61; +pub const SYS_getdents: ::c_int = 1065; +pub const SYS_getegid: ::c_int = 177; +pub const SYS_geteuid: ::c_int = 175; +pub const SYS_getgid: ::c_int = 176; +pub const SYS_getgroups: ::c_int = 158; +pub const SYS_getitimer: ::c_int = 102; +pub const SYS_get_mempolicy: ::c_int = 236; +pub const SYS_getpeername: ::c_int = 205; +pub const SYS_getpgid: ::c_int = 155; +pub const SYS_getpgrp: ::c_int = 1060; +pub const SYS_getpid: ::c_int = 172; +pub const SYS_getppid: ::c_int = 173; +pub const SYS_getpriority: ::c_int = 141; +pub const SYS_getrandom: ::c_int = 278; +pub const SYS_getresgid: ::c_int = 150; +pub const SYS_getresuid: ::c_int = 148; +pub const SYS_getrlimit: ::c_int = 163; +pub const SYS_get_robust_list: ::c_int = 100; +pub const SYS_getrusage: ::c_int = 165; +pub const SYS_getsid: ::c_int = 156; +pub const SYS_getsockname: ::c_int = 204; +pub const SYS_getsockopt: ::c_int = 209; +pub const SYS_gettid: ::c_int = 178; +pub const SYS_gettimeofday: ::c_int = 169; +pub const SYS_getuid: ::c_int = 174; +pub const SYS_getxattr: ::c_int = 8; +pub const SYS_init_module: ::c_int = 105; +pub const SYS_inotify_add_watch: ::c_int = 27; +pub const SYS_inotify_init1: ::c_int = 26; +pub const SYS_inotify_init: ::c_int = 1043; +pub const SYS_inotify_rm_watch: ::c_int = 28; +pub const SYS_io_cancel: ::c_int = 3; +pub const SYS_ioctl: ::c_int = 29; +pub const SYS_io_destroy: ::c_int = 1; +pub const SYS_io_getevents: ::c_int = 4; +pub const SYS_ioprio_get: ::c_int = 31; +pub const SYS_ioprio_set: ::c_int = 30; +pub const SYS_io_setup: ::c_int = 0; +pub const SYS_io_submit: ::c_int = 2; +pub const SYS_kcmp: ::c_int = 272; +pub const SYS_kexec_load: ::c_int = 104; +pub const SYS_keyctl: ::c_int = 219; +pub const SYS_kill: ::c_int = 129; +pub const SYS_lchown: ::c_int = 1032; +pub const SYS_lgetxattr: ::c_int = 9; +pub const SYS_linkat: ::c_int = 37; +pub const SYS_link: ::c_int = 1025; +pub const SYS_listen: ::c_int = 201; +pub const SYS_listxattr: ::c_int = 11; +pub const SYS_llistxattr: ::c_int = 12; +pub const SYS__llseek: ::c_int = 62; +pub const SYS_lookup_dcookie: ::c_int = 18; +pub const SYS_lremovexattr: ::c_int = 15; +pub const SYS_lseek: ::c_int = 62; +pub const SYS_lsetxattr: ::c_int = 6; +pub const SYS_lstat64: ::c_int = 1039; +pub const SYS_lstat: ::c_int = 1039; +pub const SYS_madvise: ::c_int = 233; +pub const SYS_mbind: ::c_int = 235; +pub const SYS_memfd_create: ::c_int = 279; +pub const SYS_migrate_pages: ::c_int = 238; +pub const SYS_mincore: ::c_int = 232; +pub const SYS_mkdirat: ::c_int = 34; +pub const SYS_mkdir: ::c_int = 1030; +pub const SYS_mknodat: ::c_int = 33; +pub const SYS_mknod: ::c_int = 1027; +pub const SYS_mlockall: ::c_int = 230; +pub const SYS_mlock: ::c_int = 228; +pub const SYS_mmap2: ::c_int = 222; +pub const SYS_mount: ::c_int = 40; +pub const SYS_move_pages: ::c_int = 239; +pub const SYS_mprotect: ::c_int = 226; +pub const SYS_mq_getsetattr: ::c_int = 185; +pub const SYS_mq_notify: ::c_int = 184; +pub const SYS_mq_open: ::c_int = 180; +pub const SYS_mq_timedreceive: ::c_int = 183; +pub const SYS_mq_timedsend: ::c_int = 182; +pub const SYS_mq_unlink: ::c_int = 181; +pub const SYS_mremap: ::c_int = 216; +pub const SYS_msgctl: ::c_int = 187; +pub const SYS_msgget: ::c_int = 186; +pub const SYS_msgrcv: ::c_int = 188; +pub const SYS_msgsnd: ::c_int = 189; +pub const SYS_msync: ::c_int = 227; +pub const SYS_munlockall: ::c_int = 231; +pub const SYS_munlock: ::c_int = 229; +pub const SYS_munmap: ::c_int = 215; +pub const SYS_name_to_handle_at: ::c_int = 264; +pub const SYS_nanosleep: ::c_int = 101; +pub const SYS_newfstatat: ::c_int = 79; +pub const SYS_nfsservctl: ::c_int = 42; +pub const SYS_oldwait4: ::c_int = 1072; +pub const SYS_openat: ::c_int = 56; +pub const SYS_open_by_handle_at: ::c_int = 265; +pub const SYS_open: ::c_int = 1024; +pub const SYS_pause: ::c_int = 1061; +pub const SYS_perf_event_open: ::c_int = 241; +pub const SYS_personality: ::c_int = 92; +pub const SYS_pipe2: ::c_int = 59; +pub const SYS_pipe: ::c_int = 1040; +pub const SYS_pivot_root: ::c_int = 41; +pub const SYS_poll: ::c_int = 1068; +pub const SYS_ppoll: ::c_int = 73; +pub const SYS_prctl: ::c_int = 167; +pub const SYS_pread64: ::c_int = 67; +pub const SYS_preadv: ::c_int = 69; +pub const SYS_prlimit64: ::c_int = 261; +pub const SYS_process_vm_readv: ::c_int = 270; +pub const SYS_process_vm_writev: ::c_int = 271; +pub const SYS_pselect6: ::c_int = 72; +pub const SYS_ptrace: ::c_int = 117; +pub const SYS_pwrite64: ::c_int = 68; +pub const SYS_pwritev: ::c_int = 70; +pub const SYS_quotactl: ::c_int = 60; +pub const SYS_readahead: ::c_int = 213; +pub const SYS_read: ::c_int = 63; +pub const SYS_readlinkat: ::c_int = 78; +pub const SYS_readlink: ::c_int = 1035; +pub const SYS_readv: ::c_int = 65; +pub const SYS_reboot: ::c_int = 142; +pub const SYS_recv: ::c_int = 1073; +pub const SYS_recvfrom: ::c_int = 207; +pub const SYS_recvmmsg: ::c_int = 243; +pub const SYS_recvmsg: ::c_int = 212; +pub const SYS_remap_file_pages: ::c_int = 234; +pub const SYS_removexattr: ::c_int = 14; +pub const SYS_renameat2: ::c_int = 276; +pub const SYS_renameat: ::c_int = 38; +pub const SYS_rename: ::c_int = 1034; +pub const SYS_request_key: ::c_int = 218; +pub const SYS_restart_syscall: ::c_int = 128; +pub const SYS_rmdir: ::c_int = 1031; +pub const SYS_rt_sigaction: ::c_int = 134; +pub const SYS_rt_sigpending: ::c_int = 136; +pub const SYS_rt_sigprocmask: ::c_int = 135; +pub const SYS_rt_sigqueueinfo: ::c_int = 138; +pub const SYS_rt_sigreturn: ::c_int = 139; +pub const SYS_rt_sigsuspend: ::c_int = 133; +pub const SYS_rt_sigtimedwait: ::c_int = 137; +pub const SYS_rt_tgsigqueueinfo: ::c_int = 240; +pub const SYS_sched_getaffinity: ::c_int = 123; +pub const SYS_sched_getattr: ::c_int = 275; +pub const SYS_sched_getparam: ::c_int = 121; +pub const SYS_sched_get_priority_max: ::c_int = 125; +pub const SYS_sched_get_priority_min: ::c_int = 126; +pub const SYS_sched_getscheduler: ::c_int = 120; +pub const SYS_sched_rr_get_interval: ::c_int = 127; +pub const SYS_sched_setaffinity: ::c_int = 122; +pub const SYS_sched_setattr: ::c_int = 274; +pub const SYS_sched_setparam: ::c_int = 118; +pub const SYS_sched_setscheduler: ::c_int = 119; +pub const SYS_sched_yield: ::c_int = 124; +pub const SYS_seccomp: ::c_int = 277; +pub const SYS_select: ::c_int = 1067; +pub const SYS_semctl: ::c_int = 191; +pub const SYS_semget: ::c_int = 190; +pub const SYS_semop: ::c_int = 193; +pub const SYS_semtimedop: ::c_int = 192; +pub const SYS_send: ::c_int = 1074; +pub const SYS_sendfile64: ::c_int = 71; +pub const SYS_sendfile: ::c_int = 71; +pub const SYS_sendmmsg: ::c_int = 269; +pub const SYS_sendmsg: ::c_int = 211; +pub const SYS_sendto: ::c_int = 206; +pub const SYS_setdomainname: ::c_int = 162; +pub const SYS_setfsgid: ::c_int = 152; +pub const SYS_setfsuid: ::c_int = 151; +pub const SYS_setgid: ::c_int = 144; +pub const SYS_setgroups: ::c_int = 159; +pub const SYS_sethostname: ::c_int = 161; +pub const SYS_setitimer: ::c_int = 103; +pub const SYS_set_mempolicy: ::c_int = 237; +pub const SYS_setns: ::c_int = 268; +pub const SYS_setpgid: ::c_int = 154; +pub const SYS_setpriority: ::c_int = 140; +pub const SYS_setregid: ::c_int = 143; +pub const SYS_setresgid: ::c_int = 149; +pub const SYS_setresuid: ::c_int = 147; +pub const SYS_setreuid: ::c_int = 145; +pub const SYS_setrlimit: ::c_int = 164; +pub const SYS_set_robust_list: ::c_int = 99; +pub const SYS_setsid: ::c_int = 157; +pub const SYS_setsockopt: ::c_int = 208; +pub const SYS_set_tid_address: ::c_int = 96; +pub const SYS_settimeofday: ::c_int = 170; +pub const SYS_setuid: ::c_int = 146; +pub const SYS_setxattr: ::c_int = 5; +pub const SYS_shmat: ::c_int = 196; +pub const SYS_shmctl: ::c_int = 195; +pub const SYS_shmdt: ::c_int = 197; +pub const SYS_shmget: ::c_int = 194; +pub const SYS_shutdown: ::c_int = 210; +pub const SYS_sigaltstack: ::c_int = 132; +pub const SYS_signalfd4: ::c_int = 74; +pub const SYS_signalfd: ::c_int = 1045; +pub const SYS_socket: ::c_int = 198; +pub const SYS_socketpair: ::c_int = 199; +pub const SYS_splice: ::c_int = 76; +pub const SYS_stat64: ::c_int = 1038; +pub const SYS_stat: ::c_int = 1038; +pub const SYS_statfs64: ::c_int = 43; +pub const SYS_swapoff: ::c_int = 225; +pub const SYS_swapon: ::c_int = 224; +pub const SYS_symlinkat: ::c_int = 36; +pub const SYS_symlink: ::c_int = 1036; +pub const SYS_sync: ::c_int = 81; +pub const SYS_sync_file_range2: ::c_int = 84; +pub const SYS_sync_file_range: ::c_int = 84; +pub const SYS_syncfs: ::c_int = 267; +pub const SYS_syscalls: ::c_int = 1080; +pub const SYS__sysctl: ::c_int = 1078; +pub const SYS_sysinfo: ::c_int = 179; +pub const SYS_syslog: ::c_int = 116; +pub const SYS_tee: ::c_int = 77; +pub const SYS_tgkill: ::c_int = 131; +pub const SYS_time: ::c_int = 1062; +pub const SYS_timer_create: ::c_int = 107; +pub const SYS_timer_delete: ::c_int = 111; +pub const SYS_timerfd_create: ::c_int = 85; +pub const SYS_timerfd_gettime: ::c_int = 87; +pub const SYS_timerfd_settime: ::c_int = 86; +pub const SYS_timer_getoverrun: ::c_int = 109; +pub const SYS_timer_gettime: ::c_int = 108; +pub const SYS_timer_settime: ::c_int = 110; +pub const SYS_times: ::c_int = 153; +pub const SYS_tkill: ::c_int = 130; +pub const SYS_truncate64: ::c_int = 45; +pub const SYS_truncate: ::c_int = 45; +pub const SYS_umask: ::c_int = 166; +pub const SYS_umount2: ::c_int = 39; +pub const SYS_umount: ::c_int = 1076; +pub const SYS_uname: ::c_int = 160; +pub const SYS_unlinkat: ::c_int = 35; +pub const SYS_unlink: ::c_int = 1026; +pub const SYS_unshare: ::c_int = 97; +pub const SYS_uselib: ::c_int = 1077; +pub const SYS_ustat: ::c_int = 1070; +pub const SYS_utime: ::c_int = 1063; +pub const SYS_utimensat: ::c_int = 88; +pub const SYS_utimes: ::c_int = 1037; +pub const SYS_vfork: ::c_int = 1071; +pub const SYS_vhangup: ::c_int = 58; +pub const SYS_vmsplice: ::c_int = 75; +pub const SYS_wait4: ::c_int = 260; +pub const SYS_waitid: ::c_int = 95; +pub const SYS_write: ::c_int = 64; +pub const SYS_writev: ::c_int = 66; +pub const SYS_statx: ::c_int = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const TIOCM_LOOP: ::c_int = 32768; +pub const TIOCM_OUT1: ::c_int = 8192; +pub const TIOCM_OUT2: ::c_int = 16384; +pub const TIOCSER_TEMT: ::c_int = 1; +pub const TOSTOP: ::c_int = 256; +pub const VEOF: ::c_int = 4; +pub const VEOL2: ::c_int = 16; +pub const VEOL: ::c_int = 11; +pub const VMIN: ::c_int = 6; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/align.rs new file mode 100644 index 0000000..8c228eb --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [f32; 4] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs new file mode 100644 index 0000000..d09b827 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mips/mod.rs @@ -0,0 +1,793 @@ +pub type c_char = i8; +pub type wchar_t = ::c_int; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_padding1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_padding2: [::c_long; 2], + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __st_padding3: ::c_long, + pub st_blocks: ::blkcnt_t, + __st_padding4: [::c_long; 14], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_padding1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_padding2: [::c_long; 2], + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __st_padding3: ::c_long, + pub st_blocks: ::blkcnt64_t, + __st_padding4: [::c_long; 14], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + #[cfg(target_endian = "big")] + __unused1: ::c_int, + pub msg_stime: ::time_t, + #[cfg(target_endian = "little")] + __unused1: ::c_int, + #[cfg(target_endian = "big")] + __unused2: ::c_int, + pub msg_rtime: ::time_t, + #[cfg(target_endian = "little")] + __unused2: ::c_int, + #[cfg(target_endian = "big")] + __unused3: ::c_int, + pub msg_ctime: ::time_t, + #[cfg(target_endian = "little")] + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 5], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 5], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const O_DIRECT: ::c_int = 0o100000; +pub const O_DIRECTORY: ::c_int = 0o200000; +pub const O_NOFOLLOW: ::c_int = 0o400000; +pub const O_ASYNC: ::c_int = 0o10000; +pub const O_LARGEFILE: ::c_int = 0x2000; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const O_APPEND: ::c_int = 0o010; +pub const O_CREAT: ::c_int = 0o400; +pub const O_EXCL: ::c_int = 0o2000; +pub const O_NOCTTY: ::c_int = 0o4000; +pub const O_NONBLOCK: ::c_int = 0o200; +pub const O_SYNC: ::c_int = 0o40020; +pub const O_RSYNC: ::c_int = 0o40020; +pub const O_DSYNC: ::c_int = 0o020; + +pub const SOCK_NONBLOCK: ::c_int = 0o200; + +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_NORESERVE: ::c_int = 0x0400; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; +pub const MAP_HUGETLB: ::c_int = 0x80000; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const EHWPOISON: ::c_int = 168; +pub const ERFKILL: ::c_int = 167; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 8; +pub const SA_NOCLDWAIT: ::c_int = 0x10000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGSTKFLT: ::c_int = 7; +pub const SIGPOLL: ::c_int = ::SIGIO; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; + +pub const EXTPROC: ::tcflag_t = 0o200000; + +pub const F_GETLK: ::c_int = 33; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETLK: ::c_int = 34; +pub const F_SETLKW: ::c_int = 35; +pub const F_SETOWN: ::c_int = 24; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0o000400; +pub const TOSTOP: ::tcflag_t = 0o100000; +pub const FLUSHO: ::tcflag_t = 0o020000; + +pub const POLLWRNORM: ::c_short = 0x4; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const SYS_syscall: ::c_long = 4000 + 0; +pub const SYS_exit: ::c_long = 4000 + 1; +pub const SYS_fork: ::c_long = 4000 + 2; +pub const SYS_read: ::c_long = 4000 + 3; +pub const SYS_write: ::c_long = 4000 + 4; +pub const SYS_open: ::c_long = 4000 + 5; +pub const SYS_close: ::c_long = 4000 + 6; +pub const SYS_waitpid: ::c_long = 4000 + 7; +pub const SYS_creat: ::c_long = 4000 + 8; +pub const SYS_link: ::c_long = 4000 + 9; +pub const SYS_unlink: ::c_long = 4000 + 10; +pub const SYS_execve: ::c_long = 4000 + 11; +pub const SYS_chdir: ::c_long = 4000 + 12; +pub const SYS_time: ::c_long = 4000 + 13; +pub const SYS_mknod: ::c_long = 4000 + 14; +pub const SYS_chmod: ::c_long = 4000 + 15; +pub const SYS_lchown: ::c_long = 4000 + 16; +pub const SYS_break: ::c_long = 4000 + 17; +pub const SYS_lseek: ::c_long = 4000 + 19; +pub const SYS_getpid: ::c_long = 4000 + 20; +pub const SYS_mount: ::c_long = 4000 + 21; +pub const SYS_umount: ::c_long = 4000 + 22; +pub const SYS_setuid: ::c_long = 4000 + 23; +pub const SYS_getuid: ::c_long = 4000 + 24; +pub const SYS_stime: ::c_long = 4000 + 25; +pub const SYS_ptrace: ::c_long = 4000 + 26; +pub const SYS_alarm: ::c_long = 4000 + 27; +pub const SYS_pause: ::c_long = 4000 + 29; +pub const SYS_utime: ::c_long = 4000 + 30; +pub const SYS_stty: ::c_long = 4000 + 31; +pub const SYS_gtty: ::c_long = 4000 + 32; +pub const SYS_access: ::c_long = 4000 + 33; +pub const SYS_nice: ::c_long = 4000 + 34; +pub const SYS_ftime: ::c_long = 4000 + 35; +pub const SYS_sync: ::c_long = 4000 + 36; +pub const SYS_kill: ::c_long = 4000 + 37; +pub const SYS_rename: ::c_long = 4000 + 38; +pub const SYS_mkdir: ::c_long = 4000 + 39; +pub const SYS_rmdir: ::c_long = 4000 + 40; +pub const SYS_dup: ::c_long = 4000 + 41; +pub const SYS_pipe: ::c_long = 4000 + 42; +pub const SYS_times: ::c_long = 4000 + 43; +pub const SYS_prof: ::c_long = 4000 + 44; +pub const SYS_brk: ::c_long = 4000 + 45; +pub const SYS_setgid: ::c_long = 4000 + 46; +pub const SYS_getgid: ::c_long = 4000 + 47; +pub const SYS_signal: ::c_long = 4000 + 48; +pub const SYS_geteuid: ::c_long = 4000 + 49; +pub const SYS_getegid: ::c_long = 4000 + 50; +pub const SYS_acct: ::c_long = 4000 + 51; +pub const SYS_umount2: ::c_long = 4000 + 52; +pub const SYS_lock: ::c_long = 4000 + 53; +pub const SYS_ioctl: ::c_long = 4000 + 54; +pub const SYS_fcntl: ::c_long = 4000 + 55; +pub const SYS_mpx: ::c_long = 4000 + 56; +pub const SYS_setpgid: ::c_long = 4000 + 57; +pub const SYS_ulimit: ::c_long = 4000 + 58; +pub const SYS_umask: ::c_long = 4000 + 60; +pub const SYS_chroot: ::c_long = 4000 + 61; +pub const SYS_ustat: ::c_long = 4000 + 62; +pub const SYS_dup2: ::c_long = 4000 + 63; +pub const SYS_getppid: ::c_long = 4000 + 64; +pub const SYS_getpgrp: ::c_long = 4000 + 65; +pub const SYS_setsid: ::c_long = 4000 + 66; +pub const SYS_sigaction: ::c_long = 4000 + 67; +pub const SYS_sgetmask: ::c_long = 4000 + 68; +pub const SYS_ssetmask: ::c_long = 4000 + 69; +pub const SYS_setreuid: ::c_long = 4000 + 70; +pub const SYS_setregid: ::c_long = 4000 + 71; +pub const SYS_sigsuspend: ::c_long = 4000 + 72; +pub const SYS_sigpending: ::c_long = 4000 + 73; +pub const SYS_sethostname: ::c_long = 4000 + 74; +pub const SYS_setrlimit: ::c_long = 4000 + 75; +pub const SYS_getrlimit: ::c_long = 4000 + 76; +pub const SYS_getrusage: ::c_long = 4000 + 77; +pub const SYS_gettimeofday: ::c_long = 4000 + 78; +pub const SYS_settimeofday: ::c_long = 4000 + 79; +pub const SYS_getgroups: ::c_long = 4000 + 80; +pub const SYS_setgroups: ::c_long = 4000 + 81; +pub const SYS_symlink: ::c_long = 4000 + 83; +pub const SYS_readlink: ::c_long = 4000 + 85; +pub const SYS_uselib: ::c_long = 4000 + 86; +pub const SYS_swapon: ::c_long = 4000 + 87; +pub const SYS_reboot: ::c_long = 4000 + 88; +pub const SYS_readdir: ::c_long = 4000 + 89; +pub const SYS_mmap: ::c_long = 4000 + 90; +pub const SYS_munmap: ::c_long = 4000 + 91; +pub const SYS_truncate: ::c_long = 4000 + 92; +pub const SYS_ftruncate: ::c_long = 4000 + 93; +pub const SYS_fchmod: ::c_long = 4000 + 94; +pub const SYS_fchown: ::c_long = 4000 + 95; +pub const SYS_getpriority: ::c_long = 4000 + 96; +pub const SYS_setpriority: ::c_long = 4000 + 97; +pub const SYS_profil: ::c_long = 4000 + 98; +pub const SYS_statfs: ::c_long = 4000 + 99; +pub const SYS_fstatfs: ::c_long = 4000 + 100; +pub const SYS_ioperm: ::c_long = 4000 + 101; +pub const SYS_socketcall: ::c_long = 4000 + 102; +pub const SYS_syslog: ::c_long = 4000 + 103; +pub const SYS_setitimer: ::c_long = 4000 + 104; +pub const SYS_getitimer: ::c_long = 4000 + 105; +pub const SYS_stat: ::c_long = 4000 + 106; +pub const SYS_lstat: ::c_long = 4000 + 107; +pub const SYS_fstat: ::c_long = 4000 + 108; +pub const SYS_iopl: ::c_long = 4000 + 110; +pub const SYS_vhangup: ::c_long = 4000 + 111; +pub const SYS_idle: ::c_long = 4000 + 112; +pub const SYS_vm86: ::c_long = 4000 + 113; +pub const SYS_wait4: ::c_long = 4000 + 114; +pub const SYS_swapoff: ::c_long = 4000 + 115; +pub const SYS_sysinfo: ::c_long = 4000 + 116; +pub const SYS_ipc: ::c_long = 4000 + 117; +pub const SYS_fsync: ::c_long = 4000 + 118; +pub const SYS_sigreturn: ::c_long = 4000 + 119; +pub const SYS_clone: ::c_long = 4000 + 120; +pub const SYS_setdomainname: ::c_long = 4000 + 121; +pub const SYS_uname: ::c_long = 4000 + 122; +pub const SYS_modify_ldt: ::c_long = 4000 + 123; +pub const SYS_adjtimex: ::c_long = 4000 + 124; +pub const SYS_mprotect: ::c_long = 4000 + 125; +pub const SYS_sigprocmask: ::c_long = 4000 + 126; +pub const SYS_create_module: ::c_long = 4000 + 127; +pub const SYS_init_module: ::c_long = 4000 + 128; +pub const SYS_delete_module: ::c_long = 4000 + 129; +pub const SYS_get_kernel_syms: ::c_long = 4000 + 130; +pub const SYS_quotactl: ::c_long = 4000 + 131; +pub const SYS_getpgid: ::c_long = 4000 + 132; +pub const SYS_fchdir: ::c_long = 4000 + 133; +pub const SYS_bdflush: ::c_long = 4000 + 134; +pub const SYS_sysfs: ::c_long = 4000 + 135; +pub const SYS_personality: ::c_long = 4000 + 136; +pub const SYS_afs_syscall: ::c_long = 4000 + 137; +pub const SYS_setfsuid: ::c_long = 4000 + 138; +pub const SYS_setfsgid: ::c_long = 4000 + 139; +pub const SYS__llseek: ::c_long = 4000 + 140; +pub const SYS_getdents: ::c_long = 4000 + 141; +pub const SYS_flock: ::c_long = 4000 + 143; +pub const SYS_msync: ::c_long = 4000 + 144; +pub const SYS_readv: ::c_long = 4000 + 145; +pub const SYS_writev: ::c_long = 4000 + 146; +pub const SYS_cacheflush: ::c_long = 4000 + 147; +pub const SYS_cachectl: ::c_long = 4000 + 148; +pub const SYS_sysmips: ::c_long = 4000 + 149; +pub const SYS_getsid: ::c_long = 4000 + 151; +pub const SYS_fdatasync: ::c_long = 4000 + 152; +pub const SYS__sysctl: ::c_long = 4000 + 153; +pub const SYS_mlock: ::c_long = 4000 + 154; +pub const SYS_munlock: ::c_long = 4000 + 155; +pub const SYS_mlockall: ::c_long = 4000 + 156; +pub const SYS_munlockall: ::c_long = 4000 + 157; +pub const SYS_sched_setparam: ::c_long = 4000 + 158; +pub const SYS_sched_getparam: ::c_long = 4000 + 159; +pub const SYS_sched_setscheduler: ::c_long = 4000 + 160; +pub const SYS_sched_getscheduler: ::c_long = 4000 + 161; +pub const SYS_sched_yield: ::c_long = 4000 + 162; +pub const SYS_sched_get_priority_max: ::c_long = 4000 + 163; +pub const SYS_sched_get_priority_min: ::c_long = 4000 + 164; +pub const SYS_sched_rr_get_interval: ::c_long = 4000 + 165; +pub const SYS_nanosleep: ::c_long = 4000 + 166; +pub const SYS_mremap: ::c_long = 4000 + 167; +pub const SYS_accept: ::c_long = 4000 + 168; +pub const SYS_bind: ::c_long = 4000 + 169; +pub const SYS_connect: ::c_long = 4000 + 170; +pub const SYS_getpeername: ::c_long = 4000 + 171; +pub const SYS_getsockname: ::c_long = 4000 + 172; +pub const SYS_getsockopt: ::c_long = 4000 + 173; +pub const SYS_listen: ::c_long = 4000 + 174; +pub const SYS_recv: ::c_long = 4000 + 175; +pub const SYS_recvfrom: ::c_long = 4000 + 176; +pub const SYS_recvmsg: ::c_long = 4000 + 177; +pub const SYS_send: ::c_long = 4000 + 178; +pub const SYS_sendmsg: ::c_long = 4000 + 179; +pub const SYS_sendto: ::c_long = 4000 + 180; +pub const SYS_setsockopt: ::c_long = 4000 + 181; +pub const SYS_shutdown: ::c_long = 4000 + 182; +pub const SYS_socket: ::c_long = 4000 + 183; +pub const SYS_socketpair: ::c_long = 4000 + 184; +pub const SYS_setresuid: ::c_long = 4000 + 185; +pub const SYS_getresuid: ::c_long = 4000 + 186; +pub const SYS_query_module: ::c_long = 4000 + 187; +pub const SYS_poll: ::c_long = 4000 + 188; +pub const SYS_nfsservctl: ::c_long = 4000 + 189; +pub const SYS_setresgid: ::c_long = 4000 + 190; +pub const SYS_getresgid: ::c_long = 4000 + 191; +pub const SYS_prctl: ::c_long = 4000 + 192; +pub const SYS_rt_sigreturn: ::c_long = 4000 + 193; +pub const SYS_rt_sigaction: ::c_long = 4000 + 194; +pub const SYS_rt_sigprocmask: ::c_long = 4000 + 195; +pub const SYS_rt_sigpending: ::c_long = 4000 + 196; +pub const SYS_rt_sigtimedwait: ::c_long = 4000 + 197; +pub const SYS_rt_sigqueueinfo: ::c_long = 4000 + 198; +pub const SYS_rt_sigsuspend: ::c_long = 4000 + 199; +pub const SYS_chown: ::c_long = 4000 + 202; +pub const SYS_getcwd: ::c_long = 4000 + 203; +pub const SYS_capget: ::c_long = 4000 + 204; +pub const SYS_capset: ::c_long = 4000 + 205; +pub const SYS_sigaltstack: ::c_long = 4000 + 206; +pub const SYS_sendfile: ::c_long = 4000 + 207; +pub const SYS_getpmsg: ::c_long = 4000 + 208; +pub const SYS_putpmsg: ::c_long = 4000 + 209; +pub const SYS_mmap2: ::c_long = 4000 + 210; +pub const SYS_truncate64: ::c_long = 4000 + 211; +pub const SYS_ftruncate64: ::c_long = 4000 + 212; +pub const SYS_stat64: ::c_long = 4000 + 213; +pub const SYS_lstat64: ::c_long = 4000 + 214; +pub const SYS_fstat64: ::c_long = 4000 + 215; +pub const SYS_pivot_root: ::c_long = 4000 + 216; +pub const SYS_mincore: ::c_long = 4000 + 217; +pub const SYS_madvise: ::c_long = 4000 + 218; +pub const SYS_getdents64: ::c_long = 4000 + 219; +pub const SYS_fcntl64: ::c_long = 4000 + 220; +pub const SYS_gettid: ::c_long = 4000 + 222; +pub const SYS_readahead: ::c_long = 4000 + 223; +pub const SYS_setxattr: ::c_long = 4000 + 224; +pub const SYS_lsetxattr: ::c_long = 4000 + 225; +pub const SYS_fsetxattr: ::c_long = 4000 + 226; +pub const SYS_getxattr: ::c_long = 4000 + 227; +pub const SYS_lgetxattr: ::c_long = 4000 + 228; +pub const SYS_fgetxattr: ::c_long = 4000 + 229; +pub const SYS_listxattr: ::c_long = 4000 + 230; +pub const SYS_llistxattr: ::c_long = 4000 + 231; +pub const SYS_flistxattr: ::c_long = 4000 + 232; +pub const SYS_removexattr: ::c_long = 4000 + 233; +pub const SYS_lremovexattr: ::c_long = 4000 + 234; +pub const SYS_fremovexattr: ::c_long = 4000 + 235; +pub const SYS_tkill: ::c_long = 4000 + 236; +pub const SYS_sendfile64: ::c_long = 4000 + 237; +pub const SYS_futex: ::c_long = 4000 + 238; +pub const SYS_sched_setaffinity: ::c_long = 4000 + 239; +pub const SYS_sched_getaffinity: ::c_long = 4000 + 240; +pub const SYS_io_setup: ::c_long = 4000 + 241; +pub const SYS_io_destroy: ::c_long = 4000 + 242; +pub const SYS_io_getevents: ::c_long = 4000 + 243; +pub const SYS_io_submit: ::c_long = 4000 + 244; +pub const SYS_io_cancel: ::c_long = 4000 + 245; +pub const SYS_exit_group: ::c_long = 4000 + 246; +pub const SYS_lookup_dcookie: ::c_long = 4000 + 247; +pub const SYS_epoll_create: ::c_long = 4000 + 248; +pub const SYS_epoll_ctl: ::c_long = 4000 + 249; +pub const SYS_epoll_wait: ::c_long = 4000 + 250; +pub const SYS_remap_file_pages: ::c_long = 4000 + 251; +pub const SYS_set_tid_address: ::c_long = 4000 + 252; +pub const SYS_restart_syscall: ::c_long = 4000 + 253; +pub const SYS_statfs64: ::c_long = 4000 + 255; +pub const SYS_fstatfs64: ::c_long = 4000 + 256; +pub const SYS_timer_create: ::c_long = 4000 + 257; +pub const SYS_timer_settime: ::c_long = 4000 + 258; +pub const SYS_timer_gettime: ::c_long = 4000 + 259; +pub const SYS_timer_getoverrun: ::c_long = 4000 + 260; +pub const SYS_timer_delete: ::c_long = 4000 + 261; +pub const SYS_clock_settime: ::c_long = 4000 + 262; +pub const SYS_clock_gettime: ::c_long = 4000 + 263; +pub const SYS_clock_getres: ::c_long = 4000 + 264; +pub const SYS_clock_nanosleep: ::c_long = 4000 + 265; +pub const SYS_tgkill: ::c_long = 4000 + 266; +pub const SYS_utimes: ::c_long = 4000 + 267; +pub const SYS_mbind: ::c_long = 4000 + 268; +pub const SYS_get_mempolicy: ::c_long = 4000 + 269; +pub const SYS_set_mempolicy: ::c_long = 4000 + 270; +pub const SYS_mq_open: ::c_long = 4000 + 271; +pub const SYS_mq_unlink: ::c_long = 4000 + 272; +pub const SYS_mq_timedsend: ::c_long = 4000 + 273; +pub const SYS_mq_timedreceive: ::c_long = 4000 + 274; +pub const SYS_mq_notify: ::c_long = 4000 + 275; +pub const SYS_mq_getsetattr: ::c_long = 4000 + 276; +pub const SYS_vserver: ::c_long = 4000 + 277; +pub const SYS_waitid: ::c_long = 4000 + 278; +/* pub const SYS_sys_setaltroot: ::c_long = 4000 + 279; */ +pub const SYS_add_key: ::c_long = 4000 + 280; +pub const SYS_request_key: ::c_long = 4000 + 281; +pub const SYS_keyctl: ::c_long = 4000 + 282; +pub const SYS_set_thread_area: ::c_long = 4000 + 283; +pub const SYS_inotify_init: ::c_long = 4000 + 284; +pub const SYS_inotify_add_watch: ::c_long = 4000 + 285; +pub const SYS_inotify_rm_watch: ::c_long = 4000 + 286; +pub const SYS_migrate_pages: ::c_long = 4000 + 287; +pub const SYS_openat: ::c_long = 4000 + 288; +pub const SYS_mkdirat: ::c_long = 4000 + 289; +pub const SYS_mknodat: ::c_long = 4000 + 290; +pub const SYS_fchownat: ::c_long = 4000 + 291; +pub const SYS_futimesat: ::c_long = 4000 + 292; +pub const SYS_unlinkat: ::c_long = 4000 + 294; +pub const SYS_renameat: ::c_long = 4000 + 295; +pub const SYS_linkat: ::c_long = 4000 + 296; +pub const SYS_symlinkat: ::c_long = 4000 + 297; +pub const SYS_readlinkat: ::c_long = 4000 + 298; +pub const SYS_fchmodat: ::c_long = 4000 + 299; +pub const SYS_faccessat: ::c_long = 4000 + 300; +pub const SYS_pselect6: ::c_long = 4000 + 301; +pub const SYS_ppoll: ::c_long = 4000 + 302; +pub const SYS_unshare: ::c_long = 4000 + 303; +pub const SYS_splice: ::c_long = 4000 + 304; +pub const SYS_sync_file_range: ::c_long = 4000 + 305; +pub const SYS_tee: ::c_long = 4000 + 306; +pub const SYS_vmsplice: ::c_long = 4000 + 307; +pub const SYS_move_pages: ::c_long = 4000 + 308; +pub const SYS_set_robust_list: ::c_long = 4000 + 309; +pub const SYS_get_robust_list: ::c_long = 4000 + 310; +pub const SYS_kexec_load: ::c_long = 4000 + 311; +pub const SYS_getcpu: ::c_long = 4000 + 312; +pub const SYS_epoll_pwait: ::c_long = 4000 + 313; +pub const SYS_ioprio_set: ::c_long = 4000 + 314; +pub const SYS_ioprio_get: ::c_long = 4000 + 315; +pub const SYS_utimensat: ::c_long = 4000 + 316; +pub const SYS_signalfd: ::c_long = 4000 + 317; +pub const SYS_timerfd: ::c_long = 4000 + 318; +pub const SYS_eventfd: ::c_long = 4000 + 319; +pub const SYS_fallocate: ::c_long = 4000 + 320; +pub const SYS_timerfd_create: ::c_long = 4000 + 321; +pub const SYS_timerfd_gettime: ::c_long = 4000 + 322; +pub const SYS_timerfd_settime: ::c_long = 4000 + 323; +pub const SYS_signalfd4: ::c_long = 4000 + 324; +pub const SYS_eventfd2: ::c_long = 4000 + 325; +pub const SYS_epoll_create1: ::c_long = 4000 + 326; +pub const SYS_dup3: ::c_long = 4000 + 327; +pub const SYS_pipe2: ::c_long = 4000 + 328; +pub const SYS_inotify_init1: ::c_long = 4000 + 329; +pub const SYS_preadv: ::c_long = 4000 + 330; +pub const SYS_pwritev: ::c_long = 4000 + 331; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 4000 + 332; +pub const SYS_perf_event_open: ::c_long = 4000 + 333; +pub const SYS_accept4: ::c_long = 4000 + 334; +pub const SYS_recvmmsg: ::c_long = 4000 + 335; +pub const SYS_fanotify_init: ::c_long = 4000 + 336; +pub const SYS_fanotify_mark: ::c_long = 4000 + 337; +pub const SYS_prlimit64: ::c_long = 4000 + 338; +pub const SYS_name_to_handle_at: ::c_long = 4000 + 339; +pub const SYS_open_by_handle_at: ::c_long = 4000 + 340; +pub const SYS_clock_adjtime: ::c_long = 4000 + 341; +pub const SYS_syncfs: ::c_long = 4000 + 342; +pub const SYS_sendmmsg: ::c_long = 4000 + 343; +pub const SYS_setns: ::c_long = 4000 + 344; +pub const SYS_process_vm_readv: ::c_long = 4000 + 345; +pub const SYS_process_vm_writev: ::c_long = 4000 + 346; +pub const SYS_kcmp: ::c_long = 4000 + 347; +pub const SYS_finit_module: ::c_long = 4000 + 348; +pub const SYS_sched_setattr: ::c_long = 4000 + 349; +pub const SYS_sched_getattr: ::c_long = 4000 + 350; +pub const SYS_renameat2: ::c_long = 4000 + 351; +pub const SYS_seccomp: ::c_long = 4000 + 352; +pub const SYS_getrandom: ::c_long = 4000 + 353; +pub const SYS_memfd_create: ::c_long = 4000 + 354; +pub const SYS_bpf: ::c_long = 4000 + 355; +pub const SYS_execveat: ::c_long = 4000 + 356; +pub const SYS_userfaultfd: ::c_long = 4000 + 357; +pub const SYS_membarrier: ::c_long = 4000 + 358; +pub const SYS_mlock2: ::c_long = 4000 + 359; +pub const SYS_copy_file_range: ::c_long = 4000 + 360; +pub const SYS_preadv2: ::c_long = 4000 + 361; +pub const SYS_pwritev2: ::c_long = 4000 + 362; +pub const SYS_pkey_mprotect: ::c_long = 4000 + 363; +pub const SYS_pkey_alloc: ::c_long = 4000 + 364; +pub const SYS_pkey_free: ::c_long = 4000 + 365; +pub const SYS_statx: ::c_long = 4000 + 366; +pub const SYS_pidfd_send_signal: ::c_long = 4000 + 424; +pub const SYS_io_uring_setup: ::c_long = 4000 + 425; +pub const SYS_io_uring_enter: ::c_long = 4000 + 426; +pub const SYS_io_uring_register: ::c_long = 4000 + 427; +pub const SYS_open_tree: ::c_long = 4000 + 428; +pub const SYS_move_mount: ::c_long = 4000 + 429; +pub const SYS_fsopen: ::c_long = 4000 + 430; +pub const SYS_fsconfig: ::c_long = 4000 + 431; +pub const SYS_fsmount: ::c_long = 4000 + 432; +pub const SYS_fspick: ::c_long = 4000 + 433; +pub const SYS_pidfd_open: ::c_long = 4000 + 434; +pub const SYS_clone3: ::c_long = 4000 + 435; +pub const SYS_close_range: ::c_long = 4000 + 436; +pub const SYS_openat2: ::c_long = 4000 + 437; +pub const SYS_pidfd_getfd: ::c_long = 4000 + 438; +pub const SYS_faccessat2: ::c_long = 4000 + 439; +pub const SYS_process_madvise: ::c_long = 4000 + 440; +pub const SYS_epoll_pwait2: ::c_long = 4000 + 441; +pub const SYS_mount_setattr: ::c_long = 4000 + 442; +pub const SYS_quotactl_fd: ::c_long = 4000 + 443; +pub const SYS_landlock_create_ruleset: ::c_long = 4000 + 444; +pub const SYS_landlock_add_rule: ::c_long = 4000 + 445; +pub const SYS_landlock_restrict_self: ::c_long = 4000 + 446; +pub const SYS_memfd_secret: ::c_long = 4000 + 447; +pub const SYS_process_mrelease: ::c_long = 4000 + 448; +pub const SYS_futex_waitv: ::c_long = 4000 + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 4000 + 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mod.rs new file mode 100644 index 0000000..cecd6dc --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/mod.rs @@ -0,0 +1,65 @@ +pub type c_long = i32; +pub type c_ulong = u32; +pub type nlink_t = u32; +pub type blksize_t = ::c_long; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; +pub type regoff_t = ::c_int; + +s! { + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigset_t { + __val: [::c_ulong; 32], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 4], + } +} + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; + +cfg_if! { + if #[cfg(any(target_arch = "x86"))] { + mod x86; + pub use self::x86::*; + } else if #[cfg(any(target_arch = "mips"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(any(target_arch = "arm"))] { + mod arm; + pub use self::arm::*; + } else if #[cfg(any(target_arch = "powerpc"))] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(any(target_arch = "hexagon"))] { + mod hexagon; + pub use self::hexagon::*; + } else if #[cfg(any(target_arch = "riscv32"))] { + mod riscv32; + pub use self::riscv32::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs new file mode 100644 index 0000000..b1669ad --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs @@ -0,0 +1,809 @@ +pub type c_char = u8; +pub type wchar_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_short, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_short, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 2], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __pad1: ::c_int, + __pad2: ::c_longlong, + __pad3: ::c_longlong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + __unused1: ::c_int, + pub shm_atime: ::time_t, + __unused2: ::c_int, + pub shm_dtime: ::time_t, + __unused3: ::c_int, + pub shm_ctime: ::time_t, + __unused4: ::c_int, + pub shm_segsz: ::size_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + __unused1: ::c_int, + pub msg_stime: ::time_t, + __unused2: ::c_int, + pub msg_rtime: ::time_t, + __unused3: ::c_int, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const SIGSTKSZ: ::size_t = 10240; +pub const MINSIGSTKSZ: ::size_t = 4096; + +pub const O_DIRECT: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_LARGEFILE: ::c_int = 0x10000; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; +pub const CBAUD: ::tcflag_t = 0o0000377; +pub const TAB1: ::c_int = 0x00000400; +pub const TAB2: ::c_int = 0x00000800; +pub const TAB3: ::c_int = 0x00000C00; +pub const CR1: ::c_int = 0x00001000; +pub const CR2: ::c_int = 0x00002000; +pub const CR3: ::c_int = 0x00003000; +pub const FF1: ::c_int = 0x00004000; +pub const BS1: ::c_int = 0x00008000; +pub const VT1: ::c_int = 0x00010000; +pub const VWERASE: usize = 10; +pub const VREPRINT: usize = 11; +pub const VSUSP: usize = 12; +pub const VSTART: usize = 13; +pub const VSTOP: usize = 14; +pub const VDISCARD: usize = 16; +pub const VTIME: usize = 7; +pub const IXON: ::tcflag_t = 0x00000200; +pub const IXOFF: ::tcflag_t = 0x00000400; +pub const ONLCR: ::tcflag_t = 0x00000002; +pub const CSIZE: ::tcflag_t = 0x00000300; +pub const CS6: ::tcflag_t = 0x00000100; +pub const CS7: ::tcflag_t = 0x00000200; +pub const CS8: ::tcflag_t = 0x00000300; +pub const CSTOPB: ::tcflag_t = 0x00000400; +pub const CREAD: ::tcflag_t = 0x00000800; +pub const PARENB: ::tcflag_t = 0x00001000; +pub const PARODD: ::tcflag_t = 0x00002000; +pub const HUPCL: ::tcflag_t = 0x00004000; +pub const CLOCAL: ::tcflag_t = 0x00008000; +pub const ECHOKE: ::tcflag_t = 0x00000001; +pub const ECHOE: ::tcflag_t = 0x00000002; +pub const ECHOK: ::tcflag_t = 0x00000004; +pub const ECHONL: ::tcflag_t = 0x00000010; +pub const ECHOPRT: ::tcflag_t = 0x00000020; +pub const ECHOCTL: ::tcflag_t = 0x00000040; +pub const ISIG: ::tcflag_t = 0x00000080; +pub const ICANON: ::tcflag_t = 0x00000100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; +pub const CIBAUD: ::tcflag_t = 0o00077600000; +pub const CBAUDEX: ::tcflag_t = 0o000020; +pub const VSWTC: usize = 9; +pub const OLCUC: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o001400; +pub const CRDLY: ::tcflag_t = 0o030000; +pub const TABDLY: ::tcflag_t = 0o006000; +pub const BSDLY: ::tcflag_t = 0o100000; +pub const FFDLY: ::tcflag_t = 0o040000; +pub const VTDLY: ::tcflag_t = 0o200000; +pub const XTABS: ::tcflag_t = 0o006000; +pub const B57600: ::speed_t = 0o000020; +pub const B115200: ::speed_t = 0o000021; +pub const B230400: ::speed_t = 0o000022; +pub const B460800: ::speed_t = 0o000023; +pub const B500000: ::speed_t = 0o000024; +pub const B576000: ::speed_t = 0o000025; +pub const B921600: ::speed_t = 0o000026; +pub const B1000000: ::speed_t = 0o000027; +pub const B1152000: ::speed_t = 0o000030; +pub const B1500000: ::speed_t = 0o000031; +pub const B2000000: ::speed_t = 0o000032; +pub const B2500000: ::speed_t = 0o000033; +pub const B3000000: ::speed_t = 0o000034; +pub const B3500000: ::speed_t = 0o000035; +pub const B4000000: ::speed_t = 0o000036; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x00080; +pub const MAP_NORESERVE: ::c_int = 0x00040; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const PTRACE_SYSEMU: ::c_int = 0x1d; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_int = 0x1e; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = 58; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x10000000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x00000400; +pub const TOSTOP: ::tcflag_t = 0x00400000; +pub const FLUSHO: ::tcflag_t = 0x00800000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_query_module: ::c_long = 166; +pub const SYS_poll: ::c_long = 167; +pub const SYS_nfsservctl: ::c_long = 168; +pub const SYS_setresgid: ::c_long = 169; +pub const SYS_getresgid: ::c_long = 170; +pub const SYS_prctl: ::c_long = 171; +pub const SYS_rt_sigreturn: ::c_long = 172; +pub const SYS_rt_sigaction: ::c_long = 173; +pub const SYS_rt_sigprocmask: ::c_long = 174; +pub const SYS_rt_sigpending: ::c_long = 175; +pub const SYS_rt_sigtimedwait: ::c_long = 176; +pub const SYS_rt_sigqueueinfo: ::c_long = 177; +pub const SYS_rt_sigsuspend: ::c_long = 178; +pub const SYS_pread64: ::c_long = 179; +pub const SYS_pwrite64: ::c_long = 180; +pub const SYS_chown: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 182; +pub const SYS_capget: ::c_long = 183; +pub const SYS_capset: ::c_long = 184; +pub const SYS_sigaltstack: ::c_long = 185; +pub const SYS_sendfile: ::c_long = 186; +pub const SYS_getpmsg: ::c_long = 187; +pub const SYS_putpmsg: ::c_long = 188; +pub const SYS_vfork: ::c_long = 189; +pub const SYS_ugetrlimit: ::c_long = 190; +pub const SYS_readahead: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_pciconfig_read: ::c_long = 198; +pub const SYS_pciconfig_write: ::c_long = 199; +pub const SYS_pciconfig_iobase: ::c_long = 200; +pub const SYS_multiplexer: ::c_long = 201; +pub const SYS_getdents64: ::c_long = 202; +pub const SYS_pivot_root: ::c_long = 203; +pub const SYS_fcntl64: ::c_long = 204; +pub const SYS_madvise: ::c_long = 205; +pub const SYS_mincore: ::c_long = 206; +pub const SYS_gettid: ::c_long = 207; +pub const SYS_tkill: ::c_long = 208; +pub const SYS_setxattr: ::c_long = 209; +pub const SYS_lsetxattr: ::c_long = 210; +pub const SYS_fsetxattr: ::c_long = 211; +pub const SYS_getxattr: ::c_long = 212; +pub const SYS_lgetxattr: ::c_long = 213; +pub const SYS_fgetxattr: ::c_long = 214; +pub const SYS_listxattr: ::c_long = 215; +pub const SYS_llistxattr: ::c_long = 216; +pub const SYS_flistxattr: ::c_long = 217; +pub const SYS_removexattr: ::c_long = 218; +pub const SYS_lremovexattr: ::c_long = 219; +pub const SYS_fremovexattr: ::c_long = 220; +pub const SYS_futex: ::c_long = 221; +pub const SYS_sched_setaffinity: ::c_long = 222; +pub const SYS_sched_getaffinity: ::c_long = 223; +pub const SYS_tuxcall: ::c_long = 225; +pub const SYS_sendfile64: ::c_long = 226; +pub const SYS_io_setup: ::c_long = 227; +pub const SYS_io_destroy: ::c_long = 228; +pub const SYS_io_getevents: ::c_long = 229; +pub const SYS_io_submit: ::c_long = 230; +pub const SYS_io_cancel: ::c_long = 231; +pub const SYS_set_tid_address: ::c_long = 232; +pub const SYS_fadvise64: ::c_long = 233; +pub const SYS_exit_group: ::c_long = 234; +pub const SYS_lookup_dcookie: ::c_long = 235; +pub const SYS_epoll_create: ::c_long = 236; +pub const SYS_epoll_ctl: ::c_long = 237; +pub const SYS_epoll_wait: ::c_long = 238; +pub const SYS_remap_file_pages: ::c_long = 239; +pub const SYS_timer_create: ::c_long = 240; +pub const SYS_timer_settime: ::c_long = 241; +pub const SYS_timer_gettime: ::c_long = 242; +pub const SYS_timer_getoverrun: ::c_long = 243; +pub const SYS_timer_delete: ::c_long = 244; +pub const SYS_clock_settime: ::c_long = 245; +pub const SYS_clock_gettime: ::c_long = 246; +pub const SYS_clock_getres: ::c_long = 247; +pub const SYS_clock_nanosleep: ::c_long = 248; +pub const SYS_swapcontext: ::c_long = 249; +pub const SYS_tgkill: ::c_long = 250; +pub const SYS_utimes: ::c_long = 251; +pub const SYS_statfs64: ::c_long = 252; +pub const SYS_fstatfs64: ::c_long = 253; +pub const SYS_fadvise64_64: ::c_long = 254; +pub const SYS_rtas: ::c_long = 255; +pub const SYS_sys_debug_setcontext: ::c_long = 256; +pub const SYS_migrate_pages: ::c_long = 258; +pub const SYS_mbind: ::c_long = 259; +pub const SYS_get_mempolicy: ::c_long = 260; +pub const SYS_set_mempolicy: ::c_long = 261; +pub const SYS_mq_open: ::c_long = 262; +pub const SYS_mq_unlink: ::c_long = 263; +pub const SYS_mq_timedsend: ::c_long = 264; +pub const SYS_mq_timedreceive: ::c_long = 265; +pub const SYS_mq_notify: ::c_long = 266; +pub const SYS_mq_getsetattr: ::c_long = 267; +pub const SYS_kexec_load: ::c_long = 268; +pub const SYS_add_key: ::c_long = 269; +pub const SYS_request_key: ::c_long = 270; +pub const SYS_keyctl: ::c_long = 271; +pub const SYS_waitid: ::c_long = 272; +pub const SYS_ioprio_set: ::c_long = 273; +pub const SYS_ioprio_get: ::c_long = 274; +pub const SYS_inotify_init: ::c_long = 275; +pub const SYS_inotify_add_watch: ::c_long = 276; +pub const SYS_inotify_rm_watch: ::c_long = 277; +pub const SYS_spu_run: ::c_long = 278; +pub const SYS_spu_create: ::c_long = 279; +pub const SYS_pselect6: ::c_long = 280; +pub const SYS_ppoll: ::c_long = 281; +pub const SYS_unshare: ::c_long = 282; +pub const SYS_splice: ::c_long = 283; +pub const SYS_tee: ::c_long = 284; +pub const SYS_vmsplice: ::c_long = 285; +pub const SYS_openat: ::c_long = 286; +pub const SYS_mkdirat: ::c_long = 287; +pub const SYS_mknodat: ::c_long = 288; +pub const SYS_fchownat: ::c_long = 289; +pub const SYS_futimesat: ::c_long = 290; +pub const SYS_fstatat64: ::c_long = 291; +pub const SYS_unlinkat: ::c_long = 292; +pub const SYS_renameat: ::c_long = 293; +pub const SYS_linkat: ::c_long = 294; +pub const SYS_symlinkat: ::c_long = 295; +pub const SYS_readlinkat: ::c_long = 296; +pub const SYS_fchmodat: ::c_long = 297; +pub const SYS_faccessat: ::c_long = 298; +pub const SYS_get_robust_list: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_move_pages: ::c_long = 301; +pub const SYS_getcpu: ::c_long = 302; +pub const SYS_epoll_pwait: ::c_long = 303; +pub const SYS_utimensat: ::c_long = 304; +pub const SYS_signalfd: ::c_long = 305; +pub const SYS_timerfd_create: ::c_long = 306; +pub const SYS_eventfd: ::c_long = 307; +pub const SYS_sync_file_range2: ::c_long = 308; +pub const SYS_fallocate: ::c_long = 309; +pub const SYS_subpage_prot: ::c_long = 310; +pub const SYS_timerfd_settime: ::c_long = 311; +pub const SYS_timerfd_gettime: ::c_long = 312; +pub const SYS_signalfd4: ::c_long = 313; +pub const SYS_eventfd2: ::c_long = 314; +pub const SYS_epoll_create1: ::c_long = 315; +pub const SYS_dup3: ::c_long = 316; +pub const SYS_pipe2: ::c_long = 317; +pub const SYS_inotify_init1: ::c_long = 318; +pub const SYS_perf_event_open: ::c_long = 319; +pub const SYS_preadv: ::c_long = 320; +pub const SYS_pwritev: ::c_long = 321; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 322; +pub const SYS_fanotify_init: ::c_long = 323; +pub const SYS_fanotify_mark: ::c_long = 324; +pub const SYS_prlimit64: ::c_long = 325; +pub const SYS_socket: ::c_long = 326; +pub const SYS_bind: ::c_long = 327; +pub const SYS_connect: ::c_long = 328; +pub const SYS_listen: ::c_long = 329; +pub const SYS_accept: ::c_long = 330; +pub const SYS_getsockname: ::c_long = 331; +pub const SYS_getpeername: ::c_long = 332; +pub const SYS_socketpair: ::c_long = 333; +pub const SYS_send: ::c_long = 334; +pub const SYS_sendto: ::c_long = 335; +pub const SYS_recv: ::c_long = 336; +pub const SYS_recvfrom: ::c_long = 337; +pub const SYS_shutdown: ::c_long = 338; +pub const SYS_setsockopt: ::c_long = 339; +pub const SYS_getsockopt: ::c_long = 340; +pub const SYS_sendmsg: ::c_long = 341; +pub const SYS_recvmsg: ::c_long = 342; +pub const SYS_recvmmsg: ::c_long = 343; +pub const SYS_accept4: ::c_long = 344; +pub const SYS_name_to_handle_at: ::c_long = 345; +pub const SYS_open_by_handle_at: ::c_long = 346; +pub const SYS_clock_adjtime: ::c_long = 347; +pub const SYS_syncfs: ::c_long = 348; +pub const SYS_sendmmsg: ::c_long = 349; +pub const SYS_setns: ::c_long = 350; +pub const SYS_process_vm_readv: ::c_long = 351; +pub const SYS_process_vm_writev: ::c_long = 352; +pub const SYS_finit_module: ::c_long = 353; +pub const SYS_kcmp: ::c_long = 354; +pub const SYS_sched_setattr: ::c_long = 355; +pub const SYS_sched_getattr: ::c_long = 356; +pub const SYS_renameat2: ::c_long = 357; +pub const SYS_seccomp: ::c_long = 358; +pub const SYS_getrandom: ::c_long = 359; +pub const SYS_memfd_create: ::c_long = 360; +pub const SYS_bpf: ::c_long = 361; +pub const SYS_execveat: ::c_long = 362; +pub const SYS_switch_endian: ::c_long = 363; +pub const SYS_userfaultfd: ::c_long = 364; +pub const SYS_membarrier: ::c_long = 365; +pub const SYS_mlock2: ::c_long = 378; +pub const SYS_copy_file_range: ::c_long = 379; +pub const SYS_preadv2: ::c_long = 380; +pub const SYS_pwritev2: ::c_long = 381; +pub const SYS_kexec_file_load: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_pkey_alloc: ::c_long = 384; +pub const SYS_pkey_free: ::c_long = 385; +pub const SYS_pkey_mprotect: ::c_long = 386; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +extern "C" { + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/align.rs new file mode 100644 index 0000000..048268c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: (i64, f64) + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs new file mode 100644 index 0000000..bf7a4f5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs @@ -0,0 +1,794 @@ +//! RISC-V-specific definitions for 32-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = ::c_int; + +s! { + pub struct pthread_attr_t { + __size: [::c_ulong; 7], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2usize], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused5: ::c_ulong, + __unused6: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } +} + +//pub const RLIM_INFINITY: ::rlim_t = !0; +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const TIOCGSOFTCAR: ::c_ulong = 21529; +pub const TIOCSSOFTCAR: ::c_ulong = 21530; +pub const TIOCGRS485: ::c_int = 21550; +pub const TIOCSRS485: ::c_int = 21551; +//pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; +//pub const RLIMIT_AS: ::__rlimit_resource_t = 9; +//pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 8; +//pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 7; +//pub const RLIMIT_NPROC: ::__rlimit_resource_t = 6; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 1052672; +pub const MAP_GROWSDOWN: ::c_int = 256; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 8; +pub const SA_SIGINFO: ::c_int = 4; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const POLLWRNORM: ::c_short = 256; +pub const POLLWRBAND: ::c_short = 512; +pub const O_ASYNC: ::c_int = 8192; +pub const O_NDELAY: ::c_int = 2048; +pub const EFD_NONBLOCK: ::c_int = 2048; +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const SFD_NONBLOCK: ::c_int = 2048; +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; +pub const TIOCLINUX: ::c_ulong = 21532; +pub const TIOCGSERIAL: ::c_ulong = 21534; +pub const TIOCEXCL: ::c_ulong = 21516; +pub const TIOCNXCL: ::c_ulong = 21517; +pub const TIOCSCTTY: ::c_ulong = 21518; +pub const TIOCSTI: ::c_ulong = 21522; +pub const TIOCMGET: ::c_ulong = 21525; +pub const TIOCMBIS: ::c_ulong = 21526; +pub const TIOCMBIC: ::c_ulong = 21527; +pub const TIOCMSET: ::c_ulong = 21528; +pub const TIOCCONS: ::c_ulong = 21533; +pub const TIOCM_ST: ::c_int = 8; +pub const TIOCM_SR: ::c_int = 16; +pub const TIOCM_CTS: ::c_int = 32; +pub const TIOCM_CAR: ::c_int = 64; +pub const TIOCM_RNG: ::c_int = 128; +pub const TIOCM_DSR: ::c_int = 256; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const O_DIRECT: ::c_int = 16384; +pub const O_DIRECTORY: ::c_int = 65536; +pub const O_NOFOLLOW: ::c_int = 131072; +pub const MAP_HUGETLB: ::c_int = 262144; +pub const MAP_LOCKED: ::c_int = 8192; +pub const MAP_NORESERVE: ::c_int = 16384; +pub const MAP_ANON: ::c_int = 32; +pub const MAP_ANONYMOUS: ::c_int = 32; +pub const MAP_DENYWRITE: ::c_int = 2048; +pub const MAP_EXECUTABLE: ::c_int = 4096; +pub const MAP_POPULATE: ::c_int = 32768; +pub const MAP_NONBLOCK: ::c_int = 65536; +pub const MAP_STACK: ::c_int = 131072; +pub const MAP_SYNC: ::c_int = 0x080000; +pub const EDEADLOCK: ::c_int = 35; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const FIOCLEX: ::c_int = 21585; +pub const FIONCLEX: ::c_int = 21584; +pub const FIONBIO: ::c_int = 21537; +pub const MCL_CURRENT: ::c_int = 1; +pub const MCL_FUTURE: ::c_int = 2; +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const CBAUD: ::tcflag_t = 4111; +pub const TAB1: ::tcflag_t = 2048; +pub const TAB2: ::tcflag_t = 4096; +pub const TAB3: ::tcflag_t = 6144; +pub const CR1: ::tcflag_t = 512; +pub const CR2: ::tcflag_t = 1024; +pub const CR3: ::tcflag_t = 1536; +pub const FF1: ::tcflag_t = 32768; +pub const BS1: ::tcflag_t = 8192; +pub const VT1: ::tcflag_t = 16384; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 1024; +pub const IXOFF: ::tcflag_t = 4096; +pub const ONLCR: ::tcflag_t = 4; +pub const CSIZE: ::tcflag_t = 48; +pub const CS6: ::tcflag_t = 16; +pub const CS7: ::tcflag_t = 32; +pub const CS8: ::tcflag_t = 48; +pub const CSTOPB: ::tcflag_t = 64; +pub const CREAD: ::tcflag_t = 128; +pub const PARENB: ::tcflag_t = 256; +pub const PARODD: ::tcflag_t = 512; +pub const HUPCL: ::tcflag_t = 1024; +pub const CLOCAL: ::tcflag_t = 2048; +pub const ECHOKE: ::tcflag_t = 2048; +pub const ECHOE: ::tcflag_t = 16; +pub const ECHOK: ::tcflag_t = 32; +pub const ECHONL: ::tcflag_t = 64; +pub const ECHOPRT: ::tcflag_t = 1024; +pub const ECHOCTL: ::tcflag_t = 512; +pub const ISIG: ::tcflag_t = 1; +pub const ICANON: ::tcflag_t = 2; +pub const PENDIN: ::tcflag_t = 16384; +pub const NOFLSH: ::tcflag_t = 128; +pub const CIBAUD: ::tcflag_t = 269418496; +pub const CBAUDEX: ::tcflag_t = 4096; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 2; +pub const NLDLY: ::tcflag_t = 256; +pub const CRDLY: ::tcflag_t = 1536; +pub const TABDLY: ::tcflag_t = 6144; +pub const BSDLY: ::tcflag_t = 8192; +pub const FFDLY: ::tcflag_t = 32768; +pub const VTDLY: ::tcflag_t = 16384; +pub const XTABS: ::tcflag_t = 6144; +pub const B0: ::speed_t = 0; +pub const B50: ::speed_t = 1; +pub const B75: ::speed_t = 2; +pub const B110: ::speed_t = 3; +pub const B134: ::speed_t = 4; +pub const B150: ::speed_t = 5; +pub const B200: ::speed_t = 6; +pub const B300: ::speed_t = 7; +pub const B600: ::speed_t = 8; +pub const B1200: ::speed_t = 9; +pub const B1800: ::speed_t = 10; +pub const B2400: ::speed_t = 11; +pub const B4800: ::speed_t = 12; +pub const B9600: ::speed_t = 13; +pub const B19200: ::speed_t = 14; +pub const B38400: ::speed_t = 15; +pub const EXTA: ::speed_t = 14; +pub const EXTB: ::speed_t = 15; +pub const B57600: ::speed_t = 4097; +pub const B115200: ::speed_t = 4098; +pub const B230400: ::speed_t = 4099; +pub const B460800: ::speed_t = 4100; +pub const B500000: ::speed_t = 4101; +pub const B576000: ::speed_t = 4102; +pub const B921600: ::speed_t = 4103; +pub const B1000000: ::speed_t = 4104; +pub const B1152000: ::speed_t = 4105; +pub const B1500000: ::speed_t = 4106; +pub const B2000000: ::speed_t = 4107; +pub const B2500000: ::speed_t = 4108; +pub const B3000000: ::speed_t = 4109; +pub const B3500000: ::speed_t = 4110; +pub const B4000000: ::speed_t = 4111; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 32768; +pub const TOSTOP: ::tcflag_t = 256; +pub const FLUSHO: ::tcflag_t = 4096; +pub const EXTPROC: ::tcflag_t = 65536; +pub const TCGETS: ::c_int = 21505; +pub const TCSETS: ::c_int = 21506; +pub const TCSETSW: ::c_int = 21507; +pub const TCSETSF: ::c_int = 21508; +pub const TCGETA: ::c_int = 21509; +pub const TCSETA: ::c_int = 21510; +pub const TCSETAW: ::c_int = 21511; +pub const TCSETAF: ::c_int = 21512; +pub const TCSBRK: ::c_int = 21513; +pub const TCXONC: ::c_int = 21514; +pub const TCFLSH: ::c_int = 21515; +pub const TIOCINQ: ::c_int = 21531; +pub const TIOCGPGRP: ::c_int = 21519; +pub const TIOCSPGRP: ::c_int = 21520; +pub const TIOCOUTQ: ::c_int = 21521; +pub const TIOCGWINSZ: ::c_int = 21523; +pub const TIOCSWINSZ: ::c_int = 21524; +pub const FIONREAD: ::c_int = 21531; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_close: ::c_long = 57; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_brk: ::c_long = 214; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_dup: ::c_long = 23; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_socket: ::c_long = 198; +pub const SYS_connect: ::c_long = 203; +pub const SYS_accept: ::c_long = 202; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_exit: ::c_long = 93; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_kill: ::c_long = 129; +pub const SYS_uname: ::c_long = 160; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semop: ::c_long = 193; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_flock: ::c_long = 32; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_umask: ::c_long = 166; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_times: ::c_long = 153; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_personality: ::c_long = 92; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_sync: ::c_long = 81; +pub const SYS_acct: ::c_long = 89; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_mount: ::c_long = 40; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_futex: ::c_long = 98; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_openat: ::c_long = 56; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_setns: ::c_long = 268; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/align.rs new file mode 100644 index 0000000..7954417 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/align.rs @@ -0,0 +1,7 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(8))] + pub struct max_align_t { + priv_: [f64; 3] + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs new file mode 100644 index 0000000..aaca917 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b32/x86/mod.rs @@ -0,0 +1,899 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_int, + pub shm_dtime: ::time_t, + __unused2: ::c_int, + pub shm_ctime: ::time_t, + __unused3: ::c_int, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_int, + pub msg_rtime: ::time_t, + __unused2: ::c_int, + pub msg_ctime: ::time_t, + __unused3: ::c_int, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct mcontext_t { + __private: [u32; 22] + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } +} + +s_no_extra_traits! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 112], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + && self + .__private + .iter() + .zip(other.__private.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for ucontext_t {} + + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + // Ignore __private field + .finish() + } + } + + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + self.__private.hash(state); + } + } + } +} + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_ASYNC: ::c_int = 0x2000; +pub const O_LARGEFILE: ::c_int = 0o0100000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_32BIT: ::c_int = 0x0040; + +pub const F_GETLK: ::c_int = 12; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 13; +pub const F_SETLKW: ::c_int = 14; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const PTRACE_SYSEMU: ::c_int = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_int = 32; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86old: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_vm86: ::c_long = 166; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_set_thread_area: ::c_long = 243; +pub const SYS_get_thread_area: ::c_long = 244; +pub const SYS_io_setup: ::c_long = 245; +pub const SYS_io_destroy: ::c_long = 246; +pub const SYS_io_getevents: ::c_long = 247; +pub const SYS_io_submit: ::c_long = 248; +pub const SYS_io_cancel: ::c_long = 249; +pub const SYS_fadvise64: ::c_long = 250; +pub const SYS_exit_group: ::c_long = 252; +pub const SYS_lookup_dcookie: ::c_long = 253; +pub const SYS_epoll_create: ::c_long = 254; +pub const SYS_epoll_ctl: ::c_long = 255; +pub const SYS_epoll_wait: ::c_long = 256; +pub const SYS_remap_file_pages: ::c_long = 257; +pub const SYS_set_tid_address: ::c_long = 258; +pub const SYS_timer_create: ::c_long = 259; +pub const SYS_timer_settime: ::c_long = 260; +pub const SYS_timer_gettime: ::c_long = 261; +pub const SYS_timer_getoverrun: ::c_long = 262; +pub const SYS_timer_delete: ::c_long = 263; +pub const SYS_clock_settime: ::c_long = 264; +pub const SYS_clock_gettime: ::c_long = 265; +pub const SYS_clock_getres: ::c_long = 266; +pub const SYS_clock_nanosleep: ::c_long = 267; +pub const SYS_statfs64: ::c_long = 268; +pub const SYS_fstatfs64: ::c_long = 269; +pub const SYS_tgkill: ::c_long = 270; +pub const SYS_utimes: ::c_long = 271; +pub const SYS_fadvise64_64: ::c_long = 272; +pub const SYS_vserver: ::c_long = 273; +pub const SYS_mbind: ::c_long = 274; +pub const SYS_get_mempolicy: ::c_long = 275; +pub const SYS_set_mempolicy: ::c_long = 276; +pub const SYS_mq_open: ::c_long = 277; +pub const SYS_mq_unlink: ::c_long = 278; +pub const SYS_mq_timedsend: ::c_long = 279; +pub const SYS_mq_timedreceive: ::c_long = 280; +pub const SYS_mq_notify: ::c_long = 281; +pub const SYS_mq_getsetattr: ::c_long = 282; +pub const SYS_kexec_load: ::c_long = 283; +pub const SYS_waitid: ::c_long = 284; +pub const SYS_add_key: ::c_long = 286; +pub const SYS_request_key: ::c_long = 287; +pub const SYS_keyctl: ::c_long = 288; +pub const SYS_ioprio_set: ::c_long = 289; +pub const SYS_ioprio_get: ::c_long = 290; +pub const SYS_inotify_init: ::c_long = 291; +pub const SYS_inotify_add_watch: ::c_long = 292; +pub const SYS_inotify_rm_watch: ::c_long = 293; +pub const SYS_migrate_pages: ::c_long = 294; +pub const SYS_openat: ::c_long = 295; +pub const SYS_mkdirat: ::c_long = 296; +pub const SYS_mknodat: ::c_long = 297; +pub const SYS_fchownat: ::c_long = 298; +pub const SYS_futimesat: ::c_long = 299; +pub const SYS_fstatat64: ::c_long = 300; +pub const SYS_unlinkat: ::c_long = 301; +pub const SYS_renameat: ::c_long = 302; +pub const SYS_linkat: ::c_long = 303; +pub const SYS_symlinkat: ::c_long = 304; +pub const SYS_readlinkat: ::c_long = 305; +pub const SYS_fchmodat: ::c_long = 306; +pub const SYS_faccessat: ::c_long = 307; +pub const SYS_pselect6: ::c_long = 308; +pub const SYS_ppoll: ::c_long = 309; +pub const SYS_unshare: ::c_long = 310; +pub const SYS_set_robust_list: ::c_long = 311; +pub const SYS_get_robust_list: ::c_long = 312; +pub const SYS_splice: ::c_long = 313; +pub const SYS_sync_file_range: ::c_long = 314; +pub const SYS_tee: ::c_long = 315; +pub const SYS_vmsplice: ::c_long = 316; +pub const SYS_move_pages: ::c_long = 317; +pub const SYS_getcpu: ::c_long = 318; +pub const SYS_epoll_pwait: ::c_long = 319; +pub const SYS_utimensat: ::c_long = 320; +pub const SYS_signalfd: ::c_long = 321; +pub const SYS_timerfd_create: ::c_long = 322; +pub const SYS_eventfd: ::c_long = 323; +pub const SYS_fallocate: ::c_long = 324; +pub const SYS_timerfd_settime: ::c_long = 325; +pub const SYS_timerfd_gettime: ::c_long = 326; +pub const SYS_signalfd4: ::c_long = 327; +pub const SYS_eventfd2: ::c_long = 328; +pub const SYS_epoll_create1: ::c_long = 329; +pub const SYS_dup3: ::c_long = 330; +pub const SYS_pipe2: ::c_long = 331; +pub const SYS_inotify_init1: ::c_long = 332; +pub const SYS_preadv: ::c_long = 333; +pub const SYS_pwritev: ::c_long = 334; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 335; +pub const SYS_perf_event_open: ::c_long = 336; +pub const SYS_recvmmsg: ::c_long = 337; +pub const SYS_fanotify_init: ::c_long = 338; +pub const SYS_fanotify_mark: ::c_long = 339; +pub const SYS_prlimit64: ::c_long = 340; +pub const SYS_name_to_handle_at: ::c_long = 341; +pub const SYS_open_by_handle_at: ::c_long = 342; +pub const SYS_clock_adjtime: ::c_long = 343; +pub const SYS_syncfs: ::c_long = 344; +pub const SYS_sendmmsg: ::c_long = 345; +pub const SYS_setns: ::c_long = 346; +pub const SYS_process_vm_readv: ::c_long = 347; +pub const SYS_process_vm_writev: ::c_long = 348; +pub const SYS_kcmp: ::c_long = 349; +pub const SYS_finit_module: ::c_long = 350; +pub const SYS_sched_setattr: ::c_long = 351; +pub const SYS_sched_getattr: ::c_long = 352; +pub const SYS_renameat2: ::c_long = 353; +pub const SYS_seccomp: ::c_long = 354; +pub const SYS_getrandom: ::c_long = 355; +pub const SYS_memfd_create: ::c_long = 356; +pub const SYS_bpf: ::c_long = 357; +pub const SYS_execveat: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_userfaultfd: ::c_long = 374; +pub const SYS_membarrier: ::c_long = 375; +pub const SYS_mlock2: ::c_long = 376; +pub const SYS_copy_file_range: ::c_long = 377; +pub const SYS_preadv2: ::c_long = 378; +pub const SYS_pwritev2: ::c_long = 379; +pub const SYS_pkey_mprotect: ::c_long = 380; +pub const SYS_pkey_alloc: ::c_long = 381; +pub const SYS_pkey_free: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +// offsets in user_regs_structs, from sys/reg.h +pub const EBX: ::c_int = 0; +pub const ECX: ::c_int = 1; +pub const EDX: ::c_int = 2; +pub const ESI: ::c_int = 3; +pub const EDI: ::c_int = 4; +pub const EBP: ::c_int = 5; +pub const EAX: ::c_int = 6; +pub const DS: ::c_int = 7; +pub const ES: ::c_int = 8; +pub const FS: ::c_int = 9; +pub const GS: ::c_int = 10; +pub const ORIG_EAX: ::c_int = 11; +pub const EIP: ::c_int = 12; +pub const CS: ::c_int = 13; +pub const EFL: ::c_int = 14; +pub const UESP: ::c_int = 15; +pub const SS: ::c_int = 16; + +extern "C" { + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/align.rs new file mode 100644 index 0000000..a4bf9bf --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/align.rs @@ -0,0 +1,42 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f32; 8] + } +} + +s! { + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[repr(align(16))] + pub struct mcontext_t { + pub fault_address: ::c_ulong, + pub regs: [::c_ulong; 31], + pub sp: ::c_ulong, + pub pc: ::c_ulong, + pub pstate: ::c_ulong, + __reserved: [[u64; 32]; 16], + } + + #[repr(align(8))] + pub struct clone_args { + pub flags: ::c_ulonglong, + pub pidfd: ::c_ulonglong, + pub child_tid: ::c_ulonglong, + pub parent_tid: ::c_ulonglong, + pub exit_signal: ::c_ulonglong, + pub stack: ::c_ulonglong, + pub stack_size: ::c_ulonglong, + pub tls: ::c_ulonglong, + pub set_tid: ::c_ulonglong, + pub set_tid_size: ::c_ulonglong, + pub cgroup: ::c_ulonglong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs new file mode 100644 index 0000000..4535e73 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs @@ -0,0 +1,7 @@ +s! { + pub struct user_fpsimd_struct { + pub vregs: [::__uint128_t; 32], + pub fpsr: u32, + pub fpcr: u32, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs new file mode 100644 index 0000000..14b4bc6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs @@ -0,0 +1,660 @@ +pub type c_char = u8; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; +pub type wchar_t = u32; +pub type nlink_t = u32; +pub type blksize_t = ::c_int; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad0: ::c_ulong, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad1: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_uint; 2], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad0: ::c_ulong, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + __pad1: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_uint; 2], + } + + pub struct user_regs_struct { + pub regs: [::c_ulonglong; 31], + pub sp: ::c_ulonglong, + pub pc: ::c_ulonglong, + pub pstate: ::c_ulonglong, + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } +} + +pub const O_APPEND: ::c_int = 1024; +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_LARGEFILE: ::c_int = 0x20000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +// bits/hwcap.h +pub const HWCAP_FP: ::c_ulong = 1 << 0; +pub const HWCAP_ASIMD: ::c_ulong = 1 << 1; +pub const HWCAP_EVTSTRM: ::c_ulong = 1 << 2; +pub const HWCAP_AES: ::c_ulong = 1 << 3; +pub const HWCAP_PMULL: ::c_ulong = 1 << 4; +pub const HWCAP_SHA1: ::c_ulong = 1 << 5; +pub const HWCAP_SHA2: ::c_ulong = 1 << 6; +pub const HWCAP_CRC32: ::c_ulong = 1 << 7; +pub const HWCAP_ATOMICS: ::c_ulong = 1 << 8; +pub const HWCAP_FPHP: ::c_ulong = 1 << 9; +pub const HWCAP_ASIMDHP: ::c_ulong = 1 << 10; +pub const HWCAP_CPUID: ::c_ulong = 1 << 11; +pub const HWCAP_ASIMDRDM: ::c_ulong = 1 << 12; +pub const HWCAP_JSCVT: ::c_ulong = 1 << 13; +pub const HWCAP_FCMA: ::c_ulong = 1 << 14; +pub const HWCAP_LRCPC: ::c_ulong = 1 << 15; +pub const HWCAP_DCPOP: ::c_ulong = 1 << 16; +pub const HWCAP_SHA3: ::c_ulong = 1 << 17; +pub const HWCAP_SM3: ::c_ulong = 1 << 18; +pub const HWCAP_SM4: ::c_ulong = 1 << 19; +pub const HWCAP_ASIMDDP: ::c_ulong = 1 << 20; +pub const HWCAP_SHA512: ::c_ulong = 1 << 21; +pub const HWCAP_SVE: ::c_ulong = 1 << 22; +pub const HWCAP_ASIMDFHM: ::c_ulong = 1 << 23; +pub const HWCAP_DIT: ::c_ulong = 1 << 24; +pub const HWCAP_USCAT: ::c_ulong = 1 << 25; +pub const HWCAP_ILRCPC: ::c_ulong = 1 << 26; +pub const HWCAP_FLAGM: ::c_ulong = 1 << 27; +pub const HWCAP_SSBS: ::c_ulong = 1 << 28; +pub const HWCAP_SB: ::c_ulong = 1 << 29; +pub const HWCAP_PACA: ::c_ulong = 1 << 30; +pub const HWCAP_PACG: ::c_ulong = 1 << 31; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const MINSIGSTKSZ: ::size_t = 6144; +pub const SIGSTKSZ: ::size_t = 12288; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_dup: ::c_long = 23; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_flock: ::c_long = 32; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_renameat: ::c_long = 38; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_mount: ::c_long = 40; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_openat: ::c_long = 56; +pub const SYS_close: ::c_long = 57; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_sync: ::c_long = 81; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_acct: ::c_long = 89; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_personality: ::c_long = 92; +pub const SYS_exit: ::c_long = 93; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_futex: ::c_long = 98; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_kill: ::c_long = 129; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_times: ::c_long = 153; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_uname: ::c_long = 160; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_umask: ::c_long = 166; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_semop: ::c_long = 193; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_socket: ::c_long = 198; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_accept: ::c_long = 202; +pub const SYS_connect: ::c_long = 203; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_brk: ::c_long = 214; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_setns: ::c_long = 268; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EDEADLK: ::c_int = 35; +pub const EDEADLOCK: ::c_int = EDEADLK; + +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} + +cfg_if! { + if #[cfg(libc_int128)] { + mod int128; + pub use self::int128::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs new file mode 100644 index 0000000..22ac916 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mips64.rs @@ -0,0 +1,690 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type __u64 = ::c_ulong; +pub type __s64 = ::c_long; +pub type nlink_t = u64; +pub type blksize_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + __pad1: [::c_int; 3], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: [::c_uint; 2], + pub st_size: ::off_t, + __pad3: ::c_int, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __pad4: ::c_uint, + pub st_blocks: ::blkcnt_t, + __pad5: [::c_int; 14], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __pad1: [::c_int; 3], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + __pad2: [::c_uint; 2], + pub st_size: ::off_t, + __pad3: ::c_int, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + __pad4: ::c_uint, + pub st_blocks: ::blkcnt_t, + __pad5: [::c_int; 14], + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 5], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 5], + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __pad1: ::c_int, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } +} + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const SYS_read: ::c_long = 5000 + 0; +pub const SYS_write: ::c_long = 5000 + 1; +pub const SYS_open: ::c_long = 5000 + 2; +pub const SYS_close: ::c_long = 5000 + 3; +pub const SYS_stat: ::c_long = 5000 + 4; +pub const SYS_fstat: ::c_long = 5000 + 5; +pub const SYS_lstat: ::c_long = 5000 + 6; +pub const SYS_poll: ::c_long = 5000 + 7; +pub const SYS_lseek: ::c_long = 5000 + 8; +pub const SYS_mmap: ::c_long = 5000 + 9; +pub const SYS_mprotect: ::c_long = 5000 + 10; +pub const SYS_munmap: ::c_long = 5000 + 11; +pub const SYS_brk: ::c_long = 5000 + 12; +pub const SYS_rt_sigaction: ::c_long = 5000 + 13; +pub const SYS_rt_sigprocmask: ::c_long = 5000 + 14; +pub const SYS_ioctl: ::c_long = 5000 + 15; +pub const SYS_pread64: ::c_long = 5000 + 16; +pub const SYS_pwrite64: ::c_long = 5000 + 17; +pub const SYS_readv: ::c_long = 5000 + 18; +pub const SYS_writev: ::c_long = 5000 + 19; +pub const SYS_access: ::c_long = 5000 + 20; +pub const SYS_pipe: ::c_long = 5000 + 21; +pub const SYS__newselect: ::c_long = 5000 + 22; +pub const SYS_sched_yield: ::c_long = 5000 + 23; +pub const SYS_mremap: ::c_long = 5000 + 24; +pub const SYS_msync: ::c_long = 5000 + 25; +pub const SYS_mincore: ::c_long = 5000 + 26; +pub const SYS_madvise: ::c_long = 5000 + 27; +pub const SYS_shmget: ::c_long = 5000 + 28; +pub const SYS_shmat: ::c_long = 5000 + 29; +pub const SYS_shmctl: ::c_long = 5000 + 30; +pub const SYS_dup: ::c_long = 5000 + 31; +pub const SYS_dup2: ::c_long = 5000 + 32; +pub const SYS_pause: ::c_long = 5000 + 33; +pub const SYS_nanosleep: ::c_long = 5000 + 34; +pub const SYS_getitimer: ::c_long = 5000 + 35; +pub const SYS_setitimer: ::c_long = 5000 + 36; +pub const SYS_alarm: ::c_long = 5000 + 37; +pub const SYS_getpid: ::c_long = 5000 + 38; +pub const SYS_sendfile: ::c_long = 5000 + 39; +pub const SYS_socket: ::c_long = 5000 + 40; +pub const SYS_connect: ::c_long = 5000 + 41; +pub const SYS_accept: ::c_long = 5000 + 42; +pub const SYS_sendto: ::c_long = 5000 + 43; +pub const SYS_recvfrom: ::c_long = 5000 + 44; +pub const SYS_sendmsg: ::c_long = 5000 + 45; +pub const SYS_recvmsg: ::c_long = 5000 + 46; +pub const SYS_shutdown: ::c_long = 5000 + 47; +pub const SYS_bind: ::c_long = 5000 + 48; +pub const SYS_listen: ::c_long = 5000 + 49; +pub const SYS_getsockname: ::c_long = 5000 + 50; +pub const SYS_getpeername: ::c_long = 5000 + 51; +pub const SYS_socketpair: ::c_long = 5000 + 52; +pub const SYS_setsockopt: ::c_long = 5000 + 53; +pub const SYS_getsockopt: ::c_long = 5000 + 54; +pub const SYS_clone: ::c_long = 5000 + 55; +pub const SYS_fork: ::c_long = 5000 + 56; +pub const SYS_execve: ::c_long = 5000 + 57; +pub const SYS_exit: ::c_long = 5000 + 58; +pub const SYS_wait4: ::c_long = 5000 + 59; +pub const SYS_kill: ::c_long = 5000 + 60; +pub const SYS_uname: ::c_long = 5000 + 61; +pub const SYS_semget: ::c_long = 5000 + 62; +pub const SYS_semop: ::c_long = 5000 + 63; +pub const SYS_semctl: ::c_long = 5000 + 64; +pub const SYS_shmdt: ::c_long = 5000 + 65; +pub const SYS_msgget: ::c_long = 5000 + 66; +pub const SYS_msgsnd: ::c_long = 5000 + 67; +pub const SYS_msgrcv: ::c_long = 5000 + 68; +pub const SYS_msgctl: ::c_long = 5000 + 69; +pub const SYS_fcntl: ::c_long = 5000 + 70; +pub const SYS_flock: ::c_long = 5000 + 71; +pub const SYS_fsync: ::c_long = 5000 + 72; +pub const SYS_fdatasync: ::c_long = 5000 + 73; +pub const SYS_truncate: ::c_long = 5000 + 74; +pub const SYS_ftruncate: ::c_long = 5000 + 75; +pub const SYS_getdents: ::c_long = 5000 + 76; +pub const SYS_getcwd: ::c_long = 5000 + 77; +pub const SYS_chdir: ::c_long = 5000 + 78; +pub const SYS_fchdir: ::c_long = 5000 + 79; +pub const SYS_rename: ::c_long = 5000 + 80; +pub const SYS_mkdir: ::c_long = 5000 + 81; +pub const SYS_rmdir: ::c_long = 5000 + 82; +pub const SYS_creat: ::c_long = 5000 + 83; +pub const SYS_link: ::c_long = 5000 + 84; +pub const SYS_unlink: ::c_long = 5000 + 85; +pub const SYS_symlink: ::c_long = 5000 + 86; +pub const SYS_readlink: ::c_long = 5000 + 87; +pub const SYS_chmod: ::c_long = 5000 + 88; +pub const SYS_fchmod: ::c_long = 5000 + 89; +pub const SYS_chown: ::c_long = 5000 + 90; +pub const SYS_fchown: ::c_long = 5000 + 91; +pub const SYS_lchown: ::c_long = 5000 + 92; +pub const SYS_umask: ::c_long = 5000 + 93; +pub const SYS_gettimeofday: ::c_long = 5000 + 94; +pub const SYS_getrlimit: ::c_long = 5000 + 95; +pub const SYS_getrusage: ::c_long = 5000 + 96; +pub const SYS_sysinfo: ::c_long = 5000 + 97; +pub const SYS_times: ::c_long = 5000 + 98; +pub const SYS_ptrace: ::c_long = 5000 + 99; +pub const SYS_getuid: ::c_long = 5000 + 100; +pub const SYS_syslog: ::c_long = 5000 + 101; +pub const SYS_getgid: ::c_long = 5000 + 102; +pub const SYS_setuid: ::c_long = 5000 + 103; +pub const SYS_setgid: ::c_long = 5000 + 104; +pub const SYS_geteuid: ::c_long = 5000 + 105; +pub const SYS_getegid: ::c_long = 5000 + 106; +pub const SYS_setpgid: ::c_long = 5000 + 107; +pub const SYS_getppid: ::c_long = 5000 + 108; +pub const SYS_getpgrp: ::c_long = 5000 + 109; +pub const SYS_setsid: ::c_long = 5000 + 110; +pub const SYS_setreuid: ::c_long = 5000 + 111; +pub const SYS_setregid: ::c_long = 5000 + 112; +pub const SYS_getgroups: ::c_long = 5000 + 113; +pub const SYS_setgroups: ::c_long = 5000 + 114; +pub const SYS_setresuid: ::c_long = 5000 + 115; +pub const SYS_getresuid: ::c_long = 5000 + 116; +pub const SYS_setresgid: ::c_long = 5000 + 117; +pub const SYS_getresgid: ::c_long = 5000 + 118; +pub const SYS_getpgid: ::c_long = 5000 + 119; +pub const SYS_setfsuid: ::c_long = 5000 + 120; +pub const SYS_setfsgid: ::c_long = 5000 + 121; +pub const SYS_getsid: ::c_long = 5000 + 122; +pub const SYS_capget: ::c_long = 5000 + 123; +pub const SYS_capset: ::c_long = 5000 + 124; +pub const SYS_rt_sigpending: ::c_long = 5000 + 125; +pub const SYS_rt_sigtimedwait: ::c_long = 5000 + 126; +pub const SYS_rt_sigqueueinfo: ::c_long = 5000 + 127; +pub const SYS_rt_sigsuspend: ::c_long = 5000 + 128; +pub const SYS_sigaltstack: ::c_long = 5000 + 129; +pub const SYS_utime: ::c_long = 5000 + 130; +pub const SYS_mknod: ::c_long = 5000 + 131; +pub const SYS_personality: ::c_long = 5000 + 132; +pub const SYS_ustat: ::c_long = 5000 + 133; +pub const SYS_statfs: ::c_long = 5000 + 134; +pub const SYS_fstatfs: ::c_long = 5000 + 135; +pub const SYS_sysfs: ::c_long = 5000 + 136; +pub const SYS_getpriority: ::c_long = 5000 + 137; +pub const SYS_setpriority: ::c_long = 5000 + 138; +pub const SYS_sched_setparam: ::c_long = 5000 + 139; +pub const SYS_sched_getparam: ::c_long = 5000 + 140; +pub const SYS_sched_setscheduler: ::c_long = 5000 + 141; +pub const SYS_sched_getscheduler: ::c_long = 5000 + 142; +pub const SYS_sched_get_priority_max: ::c_long = 5000 + 143; +pub const SYS_sched_get_priority_min: ::c_long = 5000 + 144; +pub const SYS_sched_rr_get_interval: ::c_long = 5000 + 145; +pub const SYS_mlock: ::c_long = 5000 + 146; +pub const SYS_munlock: ::c_long = 5000 + 147; +pub const SYS_mlockall: ::c_long = 5000 + 148; +pub const SYS_munlockall: ::c_long = 5000 + 149; +pub const SYS_vhangup: ::c_long = 5000 + 150; +pub const SYS_pivot_root: ::c_long = 5000 + 151; +pub const SYS__sysctl: ::c_long = 5000 + 152; +pub const SYS_prctl: ::c_long = 5000 + 153; +pub const SYS_adjtimex: ::c_long = 5000 + 154; +pub const SYS_setrlimit: ::c_long = 5000 + 155; +pub const SYS_chroot: ::c_long = 5000 + 156; +pub const SYS_sync: ::c_long = 5000 + 157; +pub const SYS_acct: ::c_long = 5000 + 158; +pub const SYS_settimeofday: ::c_long = 5000 + 159; +pub const SYS_mount: ::c_long = 5000 + 160; +pub const SYS_umount2: ::c_long = 5000 + 161; +pub const SYS_swapon: ::c_long = 5000 + 162; +pub const SYS_swapoff: ::c_long = 5000 + 163; +pub const SYS_reboot: ::c_long = 5000 + 164; +pub const SYS_sethostname: ::c_long = 5000 + 165; +pub const SYS_setdomainname: ::c_long = 5000 + 166; +pub const SYS_create_module: ::c_long = 5000 + 167; +pub const SYS_init_module: ::c_long = 5000 + 168; +pub const SYS_delete_module: ::c_long = 5000 + 169; +pub const SYS_get_kernel_syms: ::c_long = 5000 + 170; +pub const SYS_query_module: ::c_long = 5000 + 171; +pub const SYS_quotactl: ::c_long = 5000 + 172; +pub const SYS_nfsservctl: ::c_long = 5000 + 173; +pub const SYS_getpmsg: ::c_long = 5000 + 174; +pub const SYS_putpmsg: ::c_long = 5000 + 175; +pub const SYS_afs_syscall: ::c_long = 5000 + 176; +pub const SYS_gettid: ::c_long = 5000 + 178; +pub const SYS_readahead: ::c_long = 5000 + 179; +pub const SYS_setxattr: ::c_long = 5000 + 180; +pub const SYS_lsetxattr: ::c_long = 5000 + 181; +pub const SYS_fsetxattr: ::c_long = 5000 + 182; +pub const SYS_getxattr: ::c_long = 5000 + 183; +pub const SYS_lgetxattr: ::c_long = 5000 + 184; +pub const SYS_fgetxattr: ::c_long = 5000 + 185; +pub const SYS_listxattr: ::c_long = 5000 + 186; +pub const SYS_llistxattr: ::c_long = 5000 + 187; +pub const SYS_flistxattr: ::c_long = 5000 + 188; +pub const SYS_removexattr: ::c_long = 5000 + 189; +pub const SYS_lremovexattr: ::c_long = 5000 + 190; +pub const SYS_fremovexattr: ::c_long = 5000 + 191; +pub const SYS_tkill: ::c_long = 5000 + 192; +pub const SYS_futex: ::c_long = 5000 + 194; +pub const SYS_sched_setaffinity: ::c_long = 5000 + 195; +pub const SYS_sched_getaffinity: ::c_long = 5000 + 196; +pub const SYS_cacheflush: ::c_long = 5000 + 197; +pub const SYS_cachectl: ::c_long = 5000 + 198; +pub const SYS_sysmips: ::c_long = 5000 + 199; +pub const SYS_io_setup: ::c_long = 5000 + 200; +pub const SYS_io_destroy: ::c_long = 5000 + 201; +pub const SYS_io_getevents: ::c_long = 5000 + 202; +pub const SYS_io_submit: ::c_long = 5000 + 203; +pub const SYS_io_cancel: ::c_long = 5000 + 204; +pub const SYS_exit_group: ::c_long = 5000 + 205; +pub const SYS_lookup_dcookie: ::c_long = 5000 + 206; +pub const SYS_epoll_create: ::c_long = 5000 + 207; +pub const SYS_epoll_ctl: ::c_long = 5000 + 208; +pub const SYS_epoll_wait: ::c_long = 5000 + 209; +pub const SYS_remap_file_pages: ::c_long = 5000 + 210; +pub const SYS_rt_sigreturn: ::c_long = 5000 + 211; +pub const SYS_set_tid_address: ::c_long = 5000 + 212; +pub const SYS_restart_syscall: ::c_long = 5000 + 213; +pub const SYS_semtimedop: ::c_long = 5000 + 214; +pub const SYS_fadvise64: ::c_long = 5000 + 215; +pub const SYS_timer_create: ::c_long = 5000 + 216; +pub const SYS_timer_settime: ::c_long = 5000 + 217; +pub const SYS_timer_gettime: ::c_long = 5000 + 218; +pub const SYS_timer_getoverrun: ::c_long = 5000 + 219; +pub const SYS_timer_delete: ::c_long = 5000 + 220; +pub const SYS_clock_settime: ::c_long = 5000 + 221; +pub const SYS_clock_gettime: ::c_long = 5000 + 222; +pub const SYS_clock_getres: ::c_long = 5000 + 223; +pub const SYS_clock_nanosleep: ::c_long = 5000 + 224; +pub const SYS_tgkill: ::c_long = 5000 + 225; +pub const SYS_utimes: ::c_long = 5000 + 226; +pub const SYS_mbind: ::c_long = 5000 + 227; +pub const SYS_get_mempolicy: ::c_long = 5000 + 228; +pub const SYS_set_mempolicy: ::c_long = 5000 + 229; +pub const SYS_mq_open: ::c_long = 5000 + 230; +pub const SYS_mq_unlink: ::c_long = 5000 + 231; +pub const SYS_mq_timedsend: ::c_long = 5000 + 232; +pub const SYS_mq_timedreceive: ::c_long = 5000 + 233; +pub const SYS_mq_notify: ::c_long = 5000 + 234; +pub const SYS_mq_getsetattr: ::c_long = 5000 + 235; +pub const SYS_vserver: ::c_long = 5000 + 236; +pub const SYS_waitid: ::c_long = 5000 + 237; +/* pub const SYS_sys_setaltroot: ::c_long = 5000 + 238; */ +pub const SYS_add_key: ::c_long = 5000 + 239; +pub const SYS_request_key: ::c_long = 5000 + 240; +pub const SYS_keyctl: ::c_long = 5000 + 241; +pub const SYS_set_thread_area: ::c_long = 5000 + 242; +pub const SYS_inotify_init: ::c_long = 5000 + 243; +pub const SYS_inotify_add_watch: ::c_long = 5000 + 244; +pub const SYS_inotify_rm_watch: ::c_long = 5000 + 245; +pub const SYS_migrate_pages: ::c_long = 5000 + 246; +pub const SYS_openat: ::c_long = 5000 + 247; +pub const SYS_mkdirat: ::c_long = 5000 + 248; +pub const SYS_mknodat: ::c_long = 5000 + 249; +pub const SYS_fchownat: ::c_long = 5000 + 250; +pub const SYS_futimesat: ::c_long = 5000 + 251; +pub const SYS_newfstatat: ::c_long = 5000 + 252; +pub const SYS_unlinkat: ::c_long = 5000 + 253; +pub const SYS_renameat: ::c_long = 5000 + 254; +pub const SYS_linkat: ::c_long = 5000 + 255; +pub const SYS_symlinkat: ::c_long = 5000 + 256; +pub const SYS_readlinkat: ::c_long = 5000 + 257; +pub const SYS_fchmodat: ::c_long = 5000 + 258; +pub const SYS_faccessat: ::c_long = 5000 + 259; +pub const SYS_pselect6: ::c_long = 5000 + 260; +pub const SYS_ppoll: ::c_long = 5000 + 261; +pub const SYS_unshare: ::c_long = 5000 + 262; +pub const SYS_splice: ::c_long = 5000 + 263; +pub const SYS_sync_file_range: ::c_long = 5000 + 264; +pub const SYS_tee: ::c_long = 5000 + 265; +pub const SYS_vmsplice: ::c_long = 5000 + 266; +pub const SYS_move_pages: ::c_long = 5000 + 267; +pub const SYS_set_robust_list: ::c_long = 5000 + 268; +pub const SYS_get_robust_list: ::c_long = 5000 + 269; +pub const SYS_kexec_load: ::c_long = 5000 + 270; +pub const SYS_getcpu: ::c_long = 5000 + 271; +pub const SYS_epoll_pwait: ::c_long = 5000 + 272; +pub const SYS_ioprio_set: ::c_long = 5000 + 273; +pub const SYS_ioprio_get: ::c_long = 5000 + 274; +pub const SYS_utimensat: ::c_long = 5000 + 275; +pub const SYS_signalfd: ::c_long = 5000 + 276; +pub const SYS_timerfd: ::c_long = 5000 + 277; +pub const SYS_eventfd: ::c_long = 5000 + 278; +pub const SYS_fallocate: ::c_long = 5000 + 279; +pub const SYS_timerfd_create: ::c_long = 5000 + 280; +pub const SYS_timerfd_gettime: ::c_long = 5000 + 281; +pub const SYS_timerfd_settime: ::c_long = 5000 + 282; +pub const SYS_signalfd4: ::c_long = 5000 + 283; +pub const SYS_eventfd2: ::c_long = 5000 + 284; +pub const SYS_epoll_create1: ::c_long = 5000 + 285; +pub const SYS_dup3: ::c_long = 5000 + 286; +pub const SYS_pipe2: ::c_long = 5000 + 287; +pub const SYS_inotify_init1: ::c_long = 5000 + 288; +pub const SYS_preadv: ::c_long = 5000 + 289; +pub const SYS_pwritev: ::c_long = 5000 + 290; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 5000 + 291; +pub const SYS_perf_event_open: ::c_long = 5000 + 292; +pub const SYS_accept4: ::c_long = 5000 + 293; +pub const SYS_recvmmsg: ::c_long = 5000 + 294; +pub const SYS_fanotify_init: ::c_long = 5000 + 295; +pub const SYS_fanotify_mark: ::c_long = 5000 + 296; +pub const SYS_prlimit64: ::c_long = 5000 + 297; +pub const SYS_name_to_handle_at: ::c_long = 5000 + 298; +pub const SYS_open_by_handle_at: ::c_long = 5000 + 299; +pub const SYS_clock_adjtime: ::c_long = 5000 + 300; +pub const SYS_syncfs: ::c_long = 5000 + 301; +pub const SYS_sendmmsg: ::c_long = 5000 + 302; +pub const SYS_setns: ::c_long = 5000 + 303; +pub const SYS_process_vm_readv: ::c_long = 5000 + 304; +pub const SYS_process_vm_writev: ::c_long = 5000 + 305; +pub const SYS_kcmp: ::c_long = 5000 + 306; +pub const SYS_finit_module: ::c_long = 5000 + 307; +pub const SYS_getdents64: ::c_long = 5000 + 308; +pub const SYS_sched_setattr: ::c_long = 5000 + 309; +pub const SYS_sched_getattr: ::c_long = 5000 + 310; +pub const SYS_renameat2: ::c_long = 5000 + 311; +pub const SYS_seccomp: ::c_long = 5000 + 312; +pub const SYS_getrandom: ::c_long = 5000 + 313; +pub const SYS_memfd_create: ::c_long = 5000 + 314; +pub const SYS_bpf: ::c_long = 5000 + 315; +pub const SYS_execveat: ::c_long = 5000 + 316; +pub const SYS_userfaultfd: ::c_long = 5000 + 317; +pub const SYS_membarrier: ::c_long = 5000 + 318; +pub const SYS_mlock2: ::c_long = 5000 + 319; +pub const SYS_copy_file_range: ::c_long = 5000 + 320; +pub const SYS_preadv2: ::c_long = 5000 + 321; +pub const SYS_pwritev2: ::c_long = 5000 + 322; +pub const SYS_pkey_mprotect: ::c_long = 5000 + 323; +pub const SYS_pkey_alloc: ::c_long = 5000 + 324; +pub const SYS_pkey_free: ::c_long = 5000 + 325; +pub const SYS_statx: ::c_long = 5000 + 326; +pub const SYS_pidfd_send_signal: ::c_long = 5000 + 424; +pub const SYS_io_uring_setup: ::c_long = 5000 + 425; +pub const SYS_io_uring_enter: ::c_long = 5000 + 426; +pub const SYS_io_uring_register: ::c_long = 5000 + 427; +pub const SYS_open_tree: ::c_long = 5000 + 428; +pub const SYS_move_mount: ::c_long = 5000 + 429; +pub const SYS_fsopen: ::c_long = 5000 + 430; +pub const SYS_fsconfig: ::c_long = 5000 + 431; +pub const SYS_fsmount: ::c_long = 5000 + 432; +pub const SYS_fspick: ::c_long = 5000 + 433; +pub const SYS_pidfd_open: ::c_long = 5000 + 434; +pub const SYS_clone3: ::c_long = 5000 + 435; +pub const SYS_close_range: ::c_long = 5000 + 436; +pub const SYS_openat2: ::c_long = 5000 + 437; +pub const SYS_pidfd_getfd: ::c_long = 5000 + 438; +pub const SYS_faccessat2: ::c_long = 5000 + 439; +pub const SYS_process_madvise: ::c_long = 5000 + 440; +pub const SYS_epoll_pwait2: ::c_long = 5000 + 441; +pub const SYS_mount_setattr: ::c_long = 5000 + 442; +pub const SYS_quotactl_fd: ::c_long = 5000 + 443; +pub const SYS_landlock_create_ruleset: ::c_long = 5000 + 444; +pub const SYS_landlock_add_rule: ::c_long = 5000 + 445; +pub const SYS_landlock_restrict_self: ::c_long = 5000 + 446; +pub const SYS_memfd_secret: ::c_long = 5000 + 447; +pub const SYS_process_mrelease: ::c_long = 5000 + 448; +pub const SYS_futex_waitv: ::c_long = 5000 + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 5000 + 450; + +pub const O_DIRECT: ::c_int = 0x8000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_NONBLOCK: ::c_int = 128; +pub const O_SYNC: ::c_int = 0x4010; +pub const O_RSYNC: ::c_int = 0x4010; +pub const O_DSYNC: ::c_int = 0x10; +pub const O_ASYNC: ::c_int = 0x1000; +pub const O_LARGEFILE: ::c_int = 0x2000; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const ERFKILL: ::c_int = 167; + +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_NORESERVE: ::c_int = 0x400; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; +pub const MAP_HUGETLB: ::c_int = 0x080000; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 22; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x00000100; +pub const TOSTOP: ::tcflag_t = 0x00008000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const EXTPROC: ::tcflag_t = 0o200000; + +pub const F_GETLK: ::c_int = 14; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETOWN: ::c_int = 24; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EHWPOISON: ::c_int = 168; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs new file mode 100644 index 0000000..f437355 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs @@ -0,0 +1,167 @@ +pub type c_long = i64; +pub type c_ulong = u64; +pub type regoff_t = ::c_long; + +s! { + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct pthread_attr_t { + __size: [u64; 7] + } + + pub struct sigset_t { + __val: [::c_ulong; 16], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::c_ulong, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __pad1: ::c_ulong, + __pad2: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + #[cfg(target_endian = "big")] + __pad1: ::c_int, + pub msg_iovlen: ::c_int, + #[cfg(target_endian = "little")] + __pad1: ::c_int, + pub msg_control: *mut ::c_void, + #[cfg(target_endian = "big")] + __pad2: ::c_int, + pub msg_controllen: ::socklen_t, + #[cfg(target_endian = "little")] + __pad2: ::c_int, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + #[cfg(target_endian = "big")] + pub __pad1: ::c_int, + pub cmsg_len: ::socklen_t, + #[cfg(target_endian = "little")] + pub __pad1: ::c_int, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct sem_t { + __val: [::c_int; 8], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + _align: [usize; 0], + } +} + +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +pub const SOCK_NONBLOCK: ::c_int = 2048; + +pub const SOCK_SEQPACKET: ::c_int = 5; + +extern "C" { + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "mips64")] { + mod mips64; + pub use self::mips64::*; + } else if #[cfg(any(target_arch = "powerpc64"))] { + mod powerpc64; + pub use self::powerpc64::*; + } else if #[cfg(any(target_arch = "s390x"))] { + mod s390x; + pub use self::s390x::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(any(target_arch = "riscv64"))] { + mod riscv64; + pub use self::riscv64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs new file mode 100644 index 0000000..c9bd941 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/powerpc64.rs @@ -0,0 +1,697 @@ +pub type c_char = u8; +pub type wchar_t = i32; +pub type __u64 = ::c_ulong; +pub type __s64 = ::c_long; +pub type nlink_t = u64; +pub type blksize_t = ::c_long; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } +} + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_32BIT: ::c_int = 0x0040; +pub const O_APPEND: ::c_int = 1024; +pub const O_DIRECT: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_LARGEFILE: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const PTRACE_SYSEMU: ::c_int = 0x1d; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_int = 0x1e; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const SIGSTKSZ: ::size_t = 10240; +pub const MINSIGSTKSZ: ::size_t = 4096; + +// Syscall table +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_waitpid: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_time: ::c_long = 13; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_break: ::c_long = 17; +pub const SYS_oldstat: ::c_long = 18; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_stime: ::c_long = 25; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_oldfstat: ::c_long = 28; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_stty: ::c_long = 31; +pub const SYS_gtty: ::c_long = 32; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_ftime: ::c_long = 35; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_prof: ::c_long = 44; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_signal: ::c_long = 48; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_lock: ::c_long = 53; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_mpx: ::c_long = 56; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_ulimit: ::c_long = 58; +pub const SYS_oldolduname: ::c_long = 59; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sgetmask: ::c_long = 68; +pub const SYS_ssetmask: ::c_long = 69; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrlimit: ::c_long = 76; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_select: ::c_long = 82; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_oldlstat: ::c_long = 84; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_profil: ::c_long = 98; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_ioperm: ::c_long = 101; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_olduname: ::c_long = 109; +pub const SYS_iopl: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_vm86: ::c_long = 113; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_modify_ldt: ::c_long = 123; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_query_module: ::c_long = 166; +pub const SYS_poll: ::c_long = 167; +pub const SYS_nfsservctl: ::c_long = 168; +pub const SYS_setresgid: ::c_long = 169; +pub const SYS_getresgid: ::c_long = 170; +pub const SYS_prctl: ::c_long = 171; +pub const SYS_rt_sigreturn: ::c_long = 172; +pub const SYS_rt_sigaction: ::c_long = 173; +pub const SYS_rt_sigprocmask: ::c_long = 174; +pub const SYS_rt_sigpending: ::c_long = 175; +pub const SYS_rt_sigtimedwait: ::c_long = 176; +pub const SYS_rt_sigqueueinfo: ::c_long = 177; +pub const SYS_rt_sigsuspend: ::c_long = 178; +pub const SYS_pread64: ::c_long = 179; +pub const SYS_pwrite64: ::c_long = 180; +pub const SYS_chown: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 182; +pub const SYS_capget: ::c_long = 183; +pub const SYS_capset: ::c_long = 184; +pub const SYS_sigaltstack: ::c_long = 185; +pub const SYS_sendfile: ::c_long = 186; +pub const SYS_getpmsg: ::c_long = 187; /* some people actually want streams */ +pub const SYS_putpmsg: ::c_long = 188; /* some people actually want streams */ +pub const SYS_vfork: ::c_long = 189; +pub const SYS_ugetrlimit: ::c_long = 190; /* SuS compliant getrlimit */ +pub const SYS_readahead: ::c_long = 191; +pub const SYS_pciconfig_read: ::c_long = 198; +pub const SYS_pciconfig_write: ::c_long = 199; +pub const SYS_pciconfig_iobase: ::c_long = 200; +pub const SYS_multiplexer: ::c_long = 201; +pub const SYS_getdents64: ::c_long = 202; +pub const SYS_pivot_root: ::c_long = 203; +pub const SYS_madvise: ::c_long = 205; +pub const SYS_mincore: ::c_long = 206; +pub const SYS_gettid: ::c_long = 207; +pub const SYS_tkill: ::c_long = 208; +pub const SYS_setxattr: ::c_long = 209; +pub const SYS_lsetxattr: ::c_long = 210; +pub const SYS_fsetxattr: ::c_long = 211; +pub const SYS_getxattr: ::c_long = 212; +pub const SYS_lgetxattr: ::c_long = 213; +pub const SYS_fgetxattr: ::c_long = 214; +pub const SYS_listxattr: ::c_long = 215; +pub const SYS_llistxattr: ::c_long = 216; +pub const SYS_flistxattr: ::c_long = 217; +pub const SYS_removexattr: ::c_long = 218; +pub const SYS_lremovexattr: ::c_long = 219; +pub const SYS_fremovexattr: ::c_long = 220; +pub const SYS_futex: ::c_long = 221; +pub const SYS_sched_setaffinity: ::c_long = 222; +pub const SYS_sched_getaffinity: ::c_long = 223; +pub const SYS_tuxcall: ::c_long = 225; +pub const SYS_io_setup: ::c_long = 227; +pub const SYS_io_destroy: ::c_long = 228; +pub const SYS_io_getevents: ::c_long = 229; +pub const SYS_io_submit: ::c_long = 230; +pub const SYS_io_cancel: ::c_long = 231; +pub const SYS_set_tid_address: ::c_long = 232; +pub const SYS_exit_group: ::c_long = 234; +pub const SYS_lookup_dcookie: ::c_long = 235; +pub const SYS_epoll_create: ::c_long = 236; +pub const SYS_epoll_ctl: ::c_long = 237; +pub const SYS_epoll_wait: ::c_long = 238; +pub const SYS_remap_file_pages: ::c_long = 239; +pub const SYS_timer_create: ::c_long = 240; +pub const SYS_timer_settime: ::c_long = 241; +pub const SYS_timer_gettime: ::c_long = 242; +pub const SYS_timer_getoverrun: ::c_long = 243; +pub const SYS_timer_delete: ::c_long = 244; +pub const SYS_clock_settime: ::c_long = 245; +pub const SYS_clock_gettime: ::c_long = 246; +pub const SYS_clock_getres: ::c_long = 247; +pub const SYS_clock_nanosleep: ::c_long = 248; +pub const SYS_swapcontext: ::c_long = 249; +pub const SYS_tgkill: ::c_long = 250; +pub const SYS_utimes: ::c_long = 251; +pub const SYS_statfs64: ::c_long = 252; +pub const SYS_fstatfs64: ::c_long = 253; +pub const SYS_rtas: ::c_long = 255; +pub const SYS_sys_debug_setcontext: ::c_long = 256; +pub const SYS_migrate_pages: ::c_long = 258; +pub const SYS_mbind: ::c_long = 259; +pub const SYS_get_mempolicy: ::c_long = 260; +pub const SYS_set_mempolicy: ::c_long = 261; +pub const SYS_mq_open: ::c_long = 262; +pub const SYS_mq_unlink: ::c_long = 263; +pub const SYS_mq_timedsend: ::c_long = 264; +pub const SYS_mq_timedreceive: ::c_long = 265; +pub const SYS_mq_notify: ::c_long = 266; +pub const SYS_mq_getsetattr: ::c_long = 267; +pub const SYS_kexec_load: ::c_long = 268; +pub const SYS_add_key: ::c_long = 269; +pub const SYS_request_key: ::c_long = 270; +pub const SYS_keyctl: ::c_long = 271; +pub const SYS_waitid: ::c_long = 272; +pub const SYS_ioprio_set: ::c_long = 273; +pub const SYS_ioprio_get: ::c_long = 274; +pub const SYS_inotify_init: ::c_long = 275; +pub const SYS_inotify_add_watch: ::c_long = 276; +pub const SYS_inotify_rm_watch: ::c_long = 277; +pub const SYS_spu_run: ::c_long = 278; +pub const SYS_spu_create: ::c_long = 279; +pub const SYS_pselect6: ::c_long = 280; +pub const SYS_ppoll: ::c_long = 281; +pub const SYS_unshare: ::c_long = 282; +pub const SYS_splice: ::c_long = 283; +pub const SYS_tee: ::c_long = 284; +pub const SYS_vmsplice: ::c_long = 285; +pub const SYS_openat: ::c_long = 286; +pub const SYS_mkdirat: ::c_long = 287; +pub const SYS_mknodat: ::c_long = 288; +pub const SYS_fchownat: ::c_long = 289; +pub const SYS_futimesat: ::c_long = 290; +pub const SYS_newfstatat: ::c_long = 291; +pub const SYS_unlinkat: ::c_long = 292; +pub const SYS_renameat: ::c_long = 293; +pub const SYS_linkat: ::c_long = 294; +pub const SYS_symlinkat: ::c_long = 295; +pub const SYS_readlinkat: ::c_long = 296; +pub const SYS_fchmodat: ::c_long = 297; +pub const SYS_faccessat: ::c_long = 298; +pub const SYS_get_robust_list: ::c_long = 299; +pub const SYS_set_robust_list: ::c_long = 300; +pub const SYS_move_pages: ::c_long = 301; +pub const SYS_getcpu: ::c_long = 302; +pub const SYS_epoll_pwait: ::c_long = 303; +pub const SYS_utimensat: ::c_long = 304; +pub const SYS_signalfd: ::c_long = 305; +pub const SYS_timerfd_create: ::c_long = 306; +pub const SYS_eventfd: ::c_long = 307; +pub const SYS_sync_file_range2: ::c_long = 308; +pub const SYS_fallocate: ::c_long = 309; +pub const SYS_subpage_prot: ::c_long = 310; +pub const SYS_timerfd_settime: ::c_long = 311; +pub const SYS_timerfd_gettime: ::c_long = 312; +pub const SYS_signalfd4: ::c_long = 313; +pub const SYS_eventfd2: ::c_long = 314; +pub const SYS_epoll_create1: ::c_long = 315; +pub const SYS_dup3: ::c_long = 316; +pub const SYS_pipe2: ::c_long = 317; +pub const SYS_inotify_init1: ::c_long = 318; +pub const SYS_perf_event_open: ::c_long = 319; +pub const SYS_preadv: ::c_long = 320; +pub const SYS_pwritev: ::c_long = 321; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 322; +pub const SYS_fanotify_init: ::c_long = 323; +pub const SYS_fanotify_mark: ::c_long = 324; +pub const SYS_prlimit64: ::c_long = 325; +pub const SYS_socket: ::c_long = 326; +pub const SYS_bind: ::c_long = 327; +pub const SYS_connect: ::c_long = 328; +pub const SYS_listen: ::c_long = 329; +pub const SYS_accept: ::c_long = 330; +pub const SYS_getsockname: ::c_long = 331; +pub const SYS_getpeername: ::c_long = 332; +pub const SYS_socketpair: ::c_long = 333; +pub const SYS_send: ::c_long = 334; +pub const SYS_sendto: ::c_long = 335; +pub const SYS_recv: ::c_long = 336; +pub const SYS_recvfrom: ::c_long = 337; +pub const SYS_shutdown: ::c_long = 338; +pub const SYS_setsockopt: ::c_long = 339; +pub const SYS_getsockopt: ::c_long = 340; +pub const SYS_sendmsg: ::c_long = 341; +pub const SYS_recvmsg: ::c_long = 342; +pub const SYS_recvmmsg: ::c_long = 343; +pub const SYS_accept4: ::c_long = 344; +pub const SYS_name_to_handle_at: ::c_long = 345; +pub const SYS_open_by_handle_at: ::c_long = 346; +pub const SYS_clock_adjtime: ::c_long = 347; +pub const SYS_syncfs: ::c_long = 348; +pub const SYS_sendmmsg: ::c_long = 349; +pub const SYS_setns: ::c_long = 350; +pub const SYS_process_vm_readv: ::c_long = 351; +pub const SYS_process_vm_writev: ::c_long = 352; +pub const SYS_finit_module: ::c_long = 353; +pub const SYS_kcmp: ::c_long = 354; +pub const SYS_sched_setattr: ::c_long = 355; +pub const SYS_sched_getattr: ::c_long = 356; +pub const SYS_renameat2: ::c_long = 357; +pub const SYS_seccomp: ::c_long = 358; +pub const SYS_getrandom: ::c_long = 359; +pub const SYS_memfd_create: ::c_long = 360; +pub const SYS_bpf: ::c_long = 361; +pub const SYS_execveat: ::c_long = 362; +pub const SYS_switch_endian: ::c_long = 363; +pub const SYS_userfaultfd: ::c_long = 364; +pub const SYS_membarrier: ::c_long = 365; +pub const SYS_mlock2: ::c_long = 378; +pub const SYS_copy_file_range: ::c_long = 379; +pub const SYS_preadv2: ::c_long = 380; +pub const SYS_pwritev2: ::c_long = 381; +pub const SYS_kexec_file_load: ::c_long = 382; +pub const SYS_statx: ::c_long = 383; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +pub const EDEADLK: ::c_int = 58; +pub const EDEADLOCK: ::c_int = EDEADLK; + +pub const EXTPROC: ::tcflag_t = 0x10000000; +pub const VEOL: usize = 6; +pub const VEOL2: usize = 8; +pub const VMIN: usize = 5; +pub const IEXTEN: ::tcflag_t = 0x00000400; +pub const TOSTOP: ::tcflag_t = 0x00400000; +pub const FLUSHO: ::tcflag_t = 0x00800000; + +pub const MCL_CURRENT: ::c_int = 0x2000; +pub const MCL_FUTURE: ::c_int = 0x4000; +pub const CBAUD: ::tcflag_t = 0xff; +pub const TAB1: ::c_int = 0x400; +pub const TAB2: ::c_int = 0x800; +pub const TAB3: ::c_int = 0xc00; +pub const CR1: ::c_int = 0x1000; +pub const CR2: ::c_int = 0x2000; +pub const CR3: ::c_int = 0x3000; +pub const FF1: ::c_int = 0x4000; +pub const BS1: ::c_int = 0x8000; +pub const VT1: ::c_int = 0x10000; +pub const VWERASE: usize = 10; +pub const VREPRINT: usize = 11; +pub const VSUSP: usize = 12; +pub const VSTART: usize = 13; +pub const VSTOP: usize = 14; +pub const VDISCARD: usize = 16; +pub const VTIME: usize = 7; +pub const IXON: ::tcflag_t = 0x00000200; +pub const IXOFF: ::tcflag_t = 0x00000400; +pub const ONLCR: ::tcflag_t = 0x2; +pub const CSIZE: ::tcflag_t = 0x00000300; + +pub const CS6: ::tcflag_t = 0x00000100; +pub const CS7: ::tcflag_t = 0x00000200; +pub const CS8: ::tcflag_t = 0x00000300; +pub const CSTOPB: ::tcflag_t = 0x00000400; +pub const CREAD: ::tcflag_t = 0x00000800; +pub const PARENB: ::tcflag_t = 0x00001000; +pub const PARODD: ::tcflag_t = 0x00002000; +pub const HUPCL: ::tcflag_t = 0x00004000; +pub const CLOCAL: ::tcflag_t = 0x00008000; +pub const ECHOKE: ::tcflag_t = 0x00000001; +pub const ECHOE: ::tcflag_t = 0x00000002; +pub const ECHOK: ::tcflag_t = 0x00000004; +pub const ECHONL: ::tcflag_t = 0x00000010; +pub const ECHOPRT: ::tcflag_t = 0x00000020; +pub const ECHOCTL: ::tcflag_t = 0x00000040; +pub const ISIG: ::tcflag_t = 0x00000080; +pub const ICANON: ::tcflag_t = 0x00000100; +pub const PENDIN: ::tcflag_t = 0x20000000; +pub const NOFLSH: ::tcflag_t = 0x80000000; + +pub const CIBAUD: ::tcflag_t = 0o77600000; +pub const CBAUDEX: ::tcflag_t = 0o0000020; +pub const VSWTC: usize = 9; +pub const OLCUC: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o0001400; +pub const CRDLY: ::tcflag_t = 0o0030000; +pub const TABDLY: ::tcflag_t = 0o0006000; +pub const BSDLY: ::tcflag_t = 0o0100000; +pub const FFDLY: ::tcflag_t = 0o0040000; +pub const VTDLY: ::tcflag_t = 0o0200000; +pub const XTABS: ::tcflag_t = 0o00006000; + +pub const B57600: ::speed_t = 0o00020; +pub const B115200: ::speed_t = 0o00021; +pub const B230400: ::speed_t = 0o00022; +pub const B460800: ::speed_t = 0o00023; +pub const B500000: ::speed_t = 0o00024; +pub const B576000: ::speed_t = 0o00025; +pub const B921600: ::speed_t = 0o00026; +pub const B1000000: ::speed_t = 0o00027; +pub const B1152000: ::speed_t = 0o00030; +pub const B1500000: ::speed_t = 0o00031; +pub const B2000000: ::speed_t = 0o00032; +pub const B2500000: ::speed_t = 0o00033; +pub const B3000000: ::speed_t = 0o00034; +pub const B3500000: ::speed_t = 0o00035; +pub const B4000000: ::speed_t = 0o00036; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/align.rs new file mode 100644 index 0000000..48d152a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/align.rs @@ -0,0 +1,44 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct ucontext_t { + pub __uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_sigmask: ::sigset_t, + pub uc_mcontext: mcontext_t, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct mcontext_t { + pub __gregs: [::c_ulong; 32], + pub __fpregs: __riscv_mc_fp_state, + } + + #[allow(missing_debug_implementations)] + pub union __riscv_mc_fp_state { + pub __f: __riscv_mc_f_ext_state, + pub __d: __riscv_mc_d_ext_state, + pub __q: __riscv_mc_q_ext_state, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_f_ext_state { + pub __f: [::c_uint; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + pub struct __riscv_mc_d_ext_state { + pub __f: [::c_ulonglong; 32], + pub __fcsr: ::c_uint, + } + + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct __riscv_mc_q_ext_state { + pub __f: [::c_ulonglong; 64], + pub __fcsr: ::c_uint, + pub __glibc_reserved: [::c_uint; 3], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs new file mode 100644 index 0000000..9e9dbf6 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs @@ -0,0 +1,726 @@ +//! RISC-V-specific definitions for 64-bit linux-like values + +pub type c_char = u8; +pub type wchar_t = ::c_int; + +pub type nlink_t = ::c_uint; +pub type blksize_t = ::c_int; +pub type fsblkcnt64_t = ::c_ulong; +pub type fsfilcnt64_t = ::c_ulong; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct pthread_attr_t { + __size: [::c_ulong; 7], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2usize], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub __pad1: ::dev_t, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub __pad2: ::c_int, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_int; 2], + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_frsize: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 4], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_favail: ::fsfilcnt64_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + #[doc(hidden)] + #[deprecated( + since="0.2.54", + note="Please leave a comment on \ + https://github.com/rust-lang/libc/pull/1316 if you're using \ + this field" + )] + pub _pad: [::c_int; 29], + _align: [u64; 0], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused5: ::c_ulong, + __unused6: ::c_ulong, + } +} + +pub const SYS_read: ::c_long = 63; +pub const SYS_write: ::c_long = 64; +pub const SYS_close: ::c_long = 57; +pub const SYS_fstat: ::c_long = 80; +pub const SYS_lseek: ::c_long = 62; +pub const SYS_mmap: ::c_long = 222; +pub const SYS_mprotect: ::c_long = 226; +pub const SYS_munmap: ::c_long = 215; +pub const SYS_brk: ::c_long = 214; +pub const SYS_rt_sigaction: ::c_long = 134; +pub const SYS_rt_sigprocmask: ::c_long = 135; +pub const SYS_rt_sigreturn: ::c_long = 139; +pub const SYS_ioctl: ::c_long = 29; +pub const SYS_pread64: ::c_long = 67; +pub const SYS_pwrite64: ::c_long = 68; +pub const SYS_readv: ::c_long = 65; +pub const SYS_writev: ::c_long = 66; +pub const SYS_sched_yield: ::c_long = 124; +pub const SYS_mremap: ::c_long = 216; +pub const SYS_msync: ::c_long = 227; +pub const SYS_mincore: ::c_long = 232; +pub const SYS_madvise: ::c_long = 233; +pub const SYS_shmget: ::c_long = 194; +pub const SYS_shmat: ::c_long = 196; +pub const SYS_shmctl: ::c_long = 195; +pub const SYS_dup: ::c_long = 23; +pub const SYS_nanosleep: ::c_long = 101; +pub const SYS_getitimer: ::c_long = 102; +pub const SYS_setitimer: ::c_long = 103; +pub const SYS_getpid: ::c_long = 172; +pub const SYS_sendfile: ::c_long = 71; +pub const SYS_socket: ::c_long = 198; +pub const SYS_connect: ::c_long = 203; +pub const SYS_accept: ::c_long = 202; +pub const SYS_sendto: ::c_long = 206; +pub const SYS_recvfrom: ::c_long = 207; +pub const SYS_sendmsg: ::c_long = 211; +pub const SYS_recvmsg: ::c_long = 212; +pub const SYS_shutdown: ::c_long = 210; +pub const SYS_bind: ::c_long = 200; +pub const SYS_listen: ::c_long = 201; +pub const SYS_getsockname: ::c_long = 204; +pub const SYS_getpeername: ::c_long = 205; +pub const SYS_socketpair: ::c_long = 199; +pub const SYS_setsockopt: ::c_long = 208; +pub const SYS_getsockopt: ::c_long = 209; +pub const SYS_clone: ::c_long = 220; +pub const SYS_execve: ::c_long = 221; +pub const SYS_exit: ::c_long = 93; +pub const SYS_wait4: ::c_long = 260; +pub const SYS_kill: ::c_long = 129; +pub const SYS_uname: ::c_long = 160; +pub const SYS_semget: ::c_long = 190; +pub const SYS_semop: ::c_long = 193; +pub const SYS_semctl: ::c_long = 191; +pub const SYS_shmdt: ::c_long = 197; +pub const SYS_msgget: ::c_long = 186; +pub const SYS_msgsnd: ::c_long = 189; +pub const SYS_msgrcv: ::c_long = 188; +pub const SYS_msgctl: ::c_long = 187; +pub const SYS_fcntl: ::c_long = 25; +pub const SYS_flock: ::c_long = 32; +pub const SYS_fsync: ::c_long = 82; +pub const SYS_fdatasync: ::c_long = 83; +pub const SYS_truncate: ::c_long = 45; +pub const SYS_ftruncate: ::c_long = 46; +pub const SYS_getcwd: ::c_long = 17; +pub const SYS_chdir: ::c_long = 49; +pub const SYS_fchdir: ::c_long = 50; +pub const SYS_fchmod: ::c_long = 52; +pub const SYS_fchown: ::c_long = 55; +pub const SYS_umask: ::c_long = 166; +pub const SYS_gettimeofday: ::c_long = 169; +pub const SYS_getrlimit: ::c_long = 163; +pub const SYS_getrusage: ::c_long = 165; +pub const SYS_sysinfo: ::c_long = 179; +pub const SYS_times: ::c_long = 153; +pub const SYS_ptrace: ::c_long = 117; +pub const SYS_getuid: ::c_long = 174; +pub const SYS_syslog: ::c_long = 116; +pub const SYS_getgid: ::c_long = 176; +pub const SYS_setuid: ::c_long = 146; +pub const SYS_setgid: ::c_long = 144; +pub const SYS_geteuid: ::c_long = 175; +pub const SYS_getegid: ::c_long = 177; +pub const SYS_setpgid: ::c_long = 154; +pub const SYS_getppid: ::c_long = 173; +pub const SYS_setsid: ::c_long = 157; +pub const SYS_setreuid: ::c_long = 145; +pub const SYS_setregid: ::c_long = 143; +pub const SYS_getgroups: ::c_long = 158; +pub const SYS_setgroups: ::c_long = 159; +pub const SYS_setresuid: ::c_long = 147; +pub const SYS_getresuid: ::c_long = 148; +pub const SYS_setresgid: ::c_long = 149; +pub const SYS_getresgid: ::c_long = 150; +pub const SYS_getpgid: ::c_long = 155; +pub const SYS_setfsuid: ::c_long = 151; +pub const SYS_setfsgid: ::c_long = 152; +pub const SYS_getsid: ::c_long = 156; +pub const SYS_capget: ::c_long = 90; +pub const SYS_capset: ::c_long = 91; +pub const SYS_rt_sigpending: ::c_long = 136; +pub const SYS_rt_sigtimedwait: ::c_long = 137; +pub const SYS_rt_sigqueueinfo: ::c_long = 138; +pub const SYS_rt_sigsuspend: ::c_long = 133; +pub const SYS_sigaltstack: ::c_long = 132; +pub const SYS_personality: ::c_long = 92; +pub const SYS_statfs: ::c_long = 43; +pub const SYS_fstatfs: ::c_long = 44; +pub const SYS_getpriority: ::c_long = 141; +pub const SYS_setpriority: ::c_long = 140; +pub const SYS_sched_setparam: ::c_long = 118; +pub const SYS_sched_getparam: ::c_long = 121; +pub const SYS_sched_setscheduler: ::c_long = 119; +pub const SYS_sched_getscheduler: ::c_long = 120; +pub const SYS_sched_get_priority_max: ::c_long = 125; +pub const SYS_sched_get_priority_min: ::c_long = 126; +pub const SYS_sched_rr_get_interval: ::c_long = 127; +pub const SYS_mlock: ::c_long = 228; +pub const SYS_munlock: ::c_long = 229; +pub const SYS_mlockall: ::c_long = 230; +pub const SYS_munlockall: ::c_long = 231; +pub const SYS_vhangup: ::c_long = 58; +pub const SYS_pivot_root: ::c_long = 41; +pub const SYS_prctl: ::c_long = 167; +pub const SYS_adjtimex: ::c_long = 171; +pub const SYS_setrlimit: ::c_long = 164; +pub const SYS_chroot: ::c_long = 51; +pub const SYS_sync: ::c_long = 81; +pub const SYS_acct: ::c_long = 89; +pub const SYS_settimeofday: ::c_long = 170; +pub const SYS_mount: ::c_long = 40; +pub const SYS_umount2: ::c_long = 39; +pub const SYS_swapon: ::c_long = 224; +pub const SYS_swapoff: ::c_long = 225; +pub const SYS_reboot: ::c_long = 142; +pub const SYS_sethostname: ::c_long = 161; +pub const SYS_setdomainname: ::c_long = 162; +pub const SYS_init_module: ::c_long = 105; +pub const SYS_delete_module: ::c_long = 106; +pub const SYS_quotactl: ::c_long = 60; +pub const SYS_nfsservctl: ::c_long = 42; +pub const SYS_gettid: ::c_long = 178; +pub const SYS_readahead: ::c_long = 213; +pub const SYS_setxattr: ::c_long = 5; +pub const SYS_lsetxattr: ::c_long = 6; +pub const SYS_fsetxattr: ::c_long = 7; +pub const SYS_getxattr: ::c_long = 8; +pub const SYS_lgetxattr: ::c_long = 9; +pub const SYS_fgetxattr: ::c_long = 10; +pub const SYS_listxattr: ::c_long = 11; +pub const SYS_llistxattr: ::c_long = 12; +pub const SYS_flistxattr: ::c_long = 13; +pub const SYS_removexattr: ::c_long = 14; +pub const SYS_lremovexattr: ::c_long = 15; +pub const SYS_fremovexattr: ::c_long = 16; +pub const SYS_tkill: ::c_long = 130; +pub const SYS_futex: ::c_long = 98; +pub const SYS_sched_setaffinity: ::c_long = 122; +pub const SYS_sched_getaffinity: ::c_long = 123; +pub const SYS_io_setup: ::c_long = 0; +pub const SYS_io_destroy: ::c_long = 1; +pub const SYS_io_getevents: ::c_long = 4; +pub const SYS_io_submit: ::c_long = 2; +pub const SYS_io_cancel: ::c_long = 3; +pub const SYS_lookup_dcookie: ::c_long = 18; +pub const SYS_remap_file_pages: ::c_long = 234; +pub const SYS_getdents64: ::c_long = 61; +pub const SYS_set_tid_address: ::c_long = 96; +pub const SYS_restart_syscall: ::c_long = 128; +pub const SYS_semtimedop: ::c_long = 192; +pub const SYS_fadvise64: ::c_long = 223; +pub const SYS_timer_create: ::c_long = 107; +pub const SYS_timer_settime: ::c_long = 110; +pub const SYS_timer_gettime: ::c_long = 108; +pub const SYS_timer_getoverrun: ::c_long = 109; +pub const SYS_timer_delete: ::c_long = 111; +pub const SYS_clock_settime: ::c_long = 112; +pub const SYS_clock_gettime: ::c_long = 113; +pub const SYS_clock_getres: ::c_long = 114; +pub const SYS_clock_nanosleep: ::c_long = 115; +pub const SYS_exit_group: ::c_long = 94; +pub const SYS_epoll_ctl: ::c_long = 21; +pub const SYS_tgkill: ::c_long = 131; +pub const SYS_mbind: ::c_long = 235; +pub const SYS_set_mempolicy: ::c_long = 237; +pub const SYS_get_mempolicy: ::c_long = 236; +pub const SYS_mq_open: ::c_long = 180; +pub const SYS_mq_unlink: ::c_long = 181; +pub const SYS_mq_timedsend: ::c_long = 182; +pub const SYS_mq_timedreceive: ::c_long = 183; +pub const SYS_mq_notify: ::c_long = 184; +pub const SYS_mq_getsetattr: ::c_long = 185; +pub const SYS_kexec_load: ::c_long = 104; +pub const SYS_waitid: ::c_long = 95; +pub const SYS_add_key: ::c_long = 217; +pub const SYS_request_key: ::c_long = 218; +pub const SYS_keyctl: ::c_long = 219; +pub const SYS_ioprio_set: ::c_long = 30; +pub const SYS_ioprio_get: ::c_long = 31; +pub const SYS_inotify_add_watch: ::c_long = 27; +pub const SYS_inotify_rm_watch: ::c_long = 28; +pub const SYS_migrate_pages: ::c_long = 238; +pub const SYS_openat: ::c_long = 56; +pub const SYS_mkdirat: ::c_long = 34; +pub const SYS_mknodat: ::c_long = 33; +pub const SYS_fchownat: ::c_long = 54; +pub const SYS_newfstatat: ::c_long = 79; +pub const SYS_unlinkat: ::c_long = 35; +pub const SYS_linkat: ::c_long = 37; +pub const SYS_symlinkat: ::c_long = 36; +pub const SYS_readlinkat: ::c_long = 78; +pub const SYS_fchmodat: ::c_long = 53; +pub const SYS_faccessat: ::c_long = 48; +pub const SYS_pselect6: ::c_long = 72; +pub const SYS_ppoll: ::c_long = 73; +pub const SYS_unshare: ::c_long = 97; +pub const SYS_set_robust_list: ::c_long = 99; +pub const SYS_get_robust_list: ::c_long = 100; +pub const SYS_splice: ::c_long = 76; +pub const SYS_tee: ::c_long = 77; +pub const SYS_sync_file_range: ::c_long = 84; +pub const SYS_vmsplice: ::c_long = 75; +pub const SYS_move_pages: ::c_long = 239; +pub const SYS_utimensat: ::c_long = 88; +pub const SYS_epoll_pwait: ::c_long = 22; +pub const SYS_timerfd_create: ::c_long = 85; +pub const SYS_fallocate: ::c_long = 47; +pub const SYS_timerfd_settime: ::c_long = 86; +pub const SYS_timerfd_gettime: ::c_long = 87; +pub const SYS_accept4: ::c_long = 242; +pub const SYS_signalfd4: ::c_long = 74; +pub const SYS_eventfd2: ::c_long = 19; +pub const SYS_epoll_create1: ::c_long = 20; +pub const SYS_dup3: ::c_long = 24; +pub const SYS_pipe2: ::c_long = 59; +pub const SYS_inotify_init1: ::c_long = 26; +pub const SYS_preadv: ::c_long = 69; +pub const SYS_pwritev: ::c_long = 70; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; +pub const SYS_perf_event_open: ::c_long = 241; +pub const SYS_recvmmsg: ::c_long = 243; +pub const SYS_fanotify_init: ::c_long = 262; +pub const SYS_fanotify_mark: ::c_long = 263; +pub const SYS_prlimit64: ::c_long = 261; +pub const SYS_name_to_handle_at: ::c_long = 264; +pub const SYS_open_by_handle_at: ::c_long = 265; +pub const SYS_clock_adjtime: ::c_long = 266; +pub const SYS_syncfs: ::c_long = 267; +pub const SYS_sendmmsg: ::c_long = 269; +pub const SYS_setns: ::c_long = 268; +pub const SYS_getcpu: ::c_long = 168; +pub const SYS_process_vm_readv: ::c_long = 270; +pub const SYS_process_vm_writev: ::c_long = 271; +pub const SYS_kcmp: ::c_long = 272; +pub const SYS_finit_module: ::c_long = 273; +pub const SYS_sched_setattr: ::c_long = 274; +pub const SYS_sched_getattr: ::c_long = 275; +pub const SYS_renameat2: ::c_long = 276; +pub const SYS_seccomp: ::c_long = 277; +pub const SYS_getrandom: ::c_long = 278; +pub const SYS_memfd_create: ::c_long = 279; +pub const SYS_bpf: ::c_long = 280; +pub const SYS_execveat: ::c_long = 281; +pub const SYS_userfaultfd: ::c_long = 282; +pub const SYS_membarrier: ::c_long = 283; +pub const SYS_mlock2: ::c_long = 284; +pub const SYS_copy_file_range: ::c_long = 285; +pub const SYS_preadv2: ::c_long = 286; +pub const SYS_pwritev2: ::c_long = 287; +pub const SYS_pkey_mprotect: ::c_long = 288; +pub const SYS_pkey_alloc: ::c_long = 289; +pub const SYS_pkey_free: ::c_long = 290; +pub const SYS_statx: ::c_long = 291; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; + +pub const O_APPEND: ::c_int = 1024; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_LARGEFILE: ::c_int = 0; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EDEADLK: ::c_int = 35; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const NGREG: usize = 32; +pub const REG_PC: usize = 0; +pub const REG_RA: usize = 1; +pub const REG_SP: usize = 2; +pub const REG_TP: usize = 4; +pub const REG_S0: usize = 8; +pub const REG_S1: usize = 9; +pub const REG_A0: usize = 10; +pub const REG_S2: usize = 18; +pub const REG_NARGS: usize = 8; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs new file mode 100644 index 0000000..f338dcc --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs @@ -0,0 +1,726 @@ +pub type blksize_t = i64; +pub type c_char = u8; +pub type nlink_t = u64; +pub type wchar_t = i32; +pub type greg_t = u64; +pub type __u64 = u64; +pub type __s64 = i64; + +s! { + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __pad1: ::c_long, + __pad2: ::c_long, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + __unused: [::c_long; 3], + } + + pub struct statfs { + pub f_type: ::c_uint, + pub f_bsize: ::c_uint, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_uint, + pub f_frsize: ::c_uint, + pub f_flags: ::c_uint, + pub f_spare: [::c_uint; 4], + } + + pub struct statfs64 { + pub f_type: ::c_uint, + pub f_bsize: ::c_uint, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_uint, + pub f_frsize: ::c_uint, + pub f_flags: ::c_uint, + pub f_spare: [::c_uint; 4], + } +} + +s_no_extra_traits! { + // FIXME: This is actually a union. + pub struct fpreg_t { + pub d: ::c_double, + // f: ::c_float, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for fpreg_t { + fn eq(&self, other: &fpreg_t) -> bool { + self.d == other.d + } + } + + impl Eq for fpreg_t {} + + impl ::fmt::Debug for fpreg_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpreg_t") + .field("d", &self.d) + .finish() + } + } + + impl ::hash::Hash for fpreg_t { + fn hash(&self, state: &mut H) { + let d: u64 = unsafe { ::mem::transmute(self.d) }; + d.hash(state); + } + } + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; + +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNREFUSED: ::c_int = 111; +pub const ECONNRESET: ::c_int = 104; +pub const EDEADLK: ::c_int = 35; +pub const ENOSYS: ::c_int = 38; +pub const ENOTCONN: ::c_int = 107; +pub const ETIMEDOUT: ::c_int = 110; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_LARGEFILE: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 2048; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 4; +pub const SIGBUS: ::c_int = 7; +pub const SIGSTKSZ: ::size_t = 0x2000; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const SIG_SETMASK: ::c_int = 2; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const O_NOCTTY: ::c_int = 256; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_FSYNC: ::c_int = 0x101000; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const PTRACE_SYSEMU: ::c_int = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_int = 32; + +pub const EDEADLOCK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EBADMSG: ::c_int = 74; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const EHWPOISON: ::c_int = 133; +pub const ERFKILL: ::c_int = 132; + +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGCHLD: ::c_int = 17; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const O_ASYNC: ::c_int = 0x2000; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETOWN: ::c_int = 8; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VTIME: usize = 5; +pub const VSWTC: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const ONLCR: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const FF1: ::tcflag_t = 0x00008000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const CBAUD: ::speed_t = 0o010017; +pub const CSIZE: ::tcflag_t = 0o000060; +pub const CS6: ::tcflag_t = 0o000020; +pub const CS7: ::tcflag_t = 0o000040; +pub const CS8: ::tcflag_t = 0o000060; +pub const CSTOPB: ::tcflag_t = 0o000100; +pub const CREAD: ::tcflag_t = 0o000200; +pub const PARENB: ::tcflag_t = 0o000400; +pub const PARODD: ::tcflag_t = 0o001000; +pub const HUPCL: ::tcflag_t = 0o002000; +pub const CLOCAL: ::tcflag_t = 0o004000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; +pub const CIBAUD: ::tcflag_t = 0o02003600000; + +pub const ISIG: ::tcflag_t = 0o000001; +pub const ICANON: ::tcflag_t = 0o000002; +pub const XCASE: ::tcflag_t = 0o000004; +pub const ECHOE: ::tcflag_t = 0o000020; +pub const ECHOK: ::tcflag_t = 0o000040; +pub const ECHONL: ::tcflag_t = 0o000100; +pub const NOFLSH: ::tcflag_t = 0o000200; +pub const ECHOCTL: ::tcflag_t = 0o001000; +pub const ECHOPRT: ::tcflag_t = 0o002000; +pub const ECHOKE: ::tcflag_t = 0o004000; +pub const PENDIN: ::tcflag_t = 0o040000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const IXON: ::tcflag_t = 0o002000; +pub const IXOFF: ::tcflag_t = 0o010000; + +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_restart_syscall: ::c_long = 7; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_signal: ::c_long = 48; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_lookup_dcookie: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_getdents: ::c_long = 141; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_readahead: ::c_long = 222; +pub const SYS_setxattr: ::c_long = 224; +pub const SYS_lsetxattr: ::c_long = 225; +pub const SYS_fsetxattr: ::c_long = 226; +pub const SYS_getxattr: ::c_long = 227; +pub const SYS_lgetxattr: ::c_long = 228; +pub const SYS_fgetxattr: ::c_long = 229; +pub const SYS_listxattr: ::c_long = 230; +pub const SYS_llistxattr: ::c_long = 231; +pub const SYS_flistxattr: ::c_long = 232; +pub const SYS_removexattr: ::c_long = 233; +pub const SYS_lremovexattr: ::c_long = 234; +pub const SYS_fremovexattr: ::c_long = 235; +pub const SYS_gettid: ::c_long = 236; +pub const SYS_tkill: ::c_long = 237; +pub const SYS_futex: ::c_long = 238; +pub const SYS_sched_setaffinity: ::c_long = 239; +pub const SYS_sched_getaffinity: ::c_long = 240; +pub const SYS_tgkill: ::c_long = 241; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_epoll_create: ::c_long = 249; +pub const SYS_epoll_ctl: ::c_long = 250; +pub const SYS_epoll_wait: ::c_long = 251; +pub const SYS_set_tid_address: ::c_long = 252; +pub const SYS_fadvise64: ::c_long = 253; +pub const SYS_timer_create: ::c_long = 254; +pub const SYS_timer_settime: ::c_long = 255; +pub const SYS_timer_gettime: ::c_long = 256; +pub const SYS_timer_getoverrun: ::c_long = 257; +pub const SYS_timer_delete: ::c_long = 258; +pub const SYS_clock_settime: ::c_long = 259; +pub const SYS_clock_gettime: ::c_long = 260; +pub const SYS_clock_getres: ::c_long = 261; +pub const SYS_clock_nanosleep: ::c_long = 262; +pub const SYS_statfs64: ::c_long = 265; +pub const SYS_fstatfs64: ::c_long = 266; +pub const SYS_remap_file_pages: ::c_long = 267; +pub const SYS_mbind: ::c_long = 268; +pub const SYS_get_mempolicy: ::c_long = 269; +pub const SYS_set_mempolicy: ::c_long = 270; +pub const SYS_mq_open: ::c_long = 271; +pub const SYS_mq_unlink: ::c_long = 272; +pub const SYS_mq_timedsend: ::c_long = 273; +pub const SYS_mq_timedreceive: ::c_long = 274; +pub const SYS_mq_notify: ::c_long = 275; +pub const SYS_mq_getsetattr: ::c_long = 276; +pub const SYS_kexec_load: ::c_long = 277; +pub const SYS_add_key: ::c_long = 278; +pub const SYS_request_key: ::c_long = 279; +pub const SYS_keyctl: ::c_long = 280; +pub const SYS_waitid: ::c_long = 281; +pub const SYS_ioprio_set: ::c_long = 282; +pub const SYS_ioprio_get: ::c_long = 283; +pub const SYS_inotify_init: ::c_long = 284; +pub const SYS_inotify_add_watch: ::c_long = 285; +pub const SYS_inotify_rm_watch: ::c_long = 286; +pub const SYS_migrate_pages: ::c_long = 287; +pub const SYS_openat: ::c_long = 288; +pub const SYS_mkdirat: ::c_long = 289; +pub const SYS_mknodat: ::c_long = 290; +pub const SYS_fchownat: ::c_long = 291; +pub const SYS_futimesat: ::c_long = 292; +pub const SYS_unlinkat: ::c_long = 294; +pub const SYS_renameat: ::c_long = 295; +pub const SYS_linkat: ::c_long = 296; +pub const SYS_symlinkat: ::c_long = 297; +pub const SYS_readlinkat: ::c_long = 298; +pub const SYS_fchmodat: ::c_long = 299; +pub const SYS_faccessat: ::c_long = 300; +pub const SYS_pselect6: ::c_long = 301; +pub const SYS_ppoll: ::c_long = 302; +pub const SYS_unshare: ::c_long = 303; +pub const SYS_set_robust_list: ::c_long = 304; +pub const SYS_get_robust_list: ::c_long = 305; +pub const SYS_splice: ::c_long = 306; +pub const SYS_sync_file_range: ::c_long = 307; +pub const SYS_tee: ::c_long = 308; +pub const SYS_vmsplice: ::c_long = 309; +pub const SYS_move_pages: ::c_long = 310; +pub const SYS_getcpu: ::c_long = 311; +pub const SYS_epoll_pwait: ::c_long = 312; +pub const SYS_utimes: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_utimensat: ::c_long = 315; +pub const SYS_signalfd: ::c_long = 316; +pub const SYS_timerfd: ::c_long = 317; +pub const SYS_eventfd: ::c_long = 318; +pub const SYS_timerfd_create: ::c_long = 319; +pub const SYS_timerfd_settime: ::c_long = 320; +pub const SYS_timerfd_gettime: ::c_long = 321; +pub const SYS_signalfd4: ::c_long = 322; +pub const SYS_eventfd2: ::c_long = 323; +pub const SYS_inotify_init1: ::c_long = 324; +pub const SYS_pipe2: ::c_long = 325; +pub const SYS_dup3: ::c_long = 326; +pub const SYS_epoll_create1: ::c_long = 327; +pub const SYS_preadv: ::c_long = 328; +pub const SYS_pwritev: ::c_long = 329; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 330; +pub const SYS_perf_event_open: ::c_long = 331; +pub const SYS_fanotify_init: ::c_long = 332; +pub const SYS_fanotify_mark: ::c_long = 333; +pub const SYS_prlimit64: ::c_long = 334; +pub const SYS_name_to_handle_at: ::c_long = 335; +pub const SYS_open_by_handle_at: ::c_long = 336; +pub const SYS_clock_adjtime: ::c_long = 337; +pub const SYS_syncfs: ::c_long = 338; +pub const SYS_setns: ::c_long = 339; +pub const SYS_process_vm_readv: ::c_long = 340; +pub const SYS_process_vm_writev: ::c_long = 341; +pub const SYS_s390_runtime_instr: ::c_long = 342; +pub const SYS_kcmp: ::c_long = 343; +pub const SYS_finit_module: ::c_long = 344; +pub const SYS_sched_setattr: ::c_long = 345; +pub const SYS_sched_getattr: ::c_long = 346; +pub const SYS_renameat2: ::c_long = 347; +pub const SYS_seccomp: ::c_long = 348; +pub const SYS_getrandom: ::c_long = 349; +pub const SYS_memfd_create: ::c_long = 350; +pub const SYS_bpf: ::c_long = 351; +pub const SYS_s390_pci_mmio_write: ::c_long = 352; +pub const SYS_s390_pci_mmio_read: ::c_long = 353; +pub const SYS_execveat: ::c_long = 354; +pub const SYS_userfaultfd: ::c_long = 355; +pub const SYS_membarrier: ::c_long = 356; +pub const SYS_recvmmsg: ::c_long = 357; +pub const SYS_sendmmsg: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_mlock2: ::c_long = 374; +pub const SYS_copy_file_range: ::c_long = 375; +pub const SYS_preadv2: ::c_long = 376; +pub const SYS_pwritev2: ::c_long = 377; +pub const SYS_lchown: ::c_long = 198; +pub const SYS_setuid: ::c_long = 213; +pub const SYS_getuid: ::c_long = 199; +pub const SYS_setgid: ::c_long = 214; +pub const SYS_getgid: ::c_long = 200; +pub const SYS_geteuid: ::c_long = 201; +pub const SYS_setreuid: ::c_long = 203; +pub const SYS_setregid: ::c_long = 204; +pub const SYS_getrlimit: ::c_long = 191; +pub const SYS_getgroups: ::c_long = 205; +pub const SYS_fchown: ::c_long = 207; +pub const SYS_setresuid: ::c_long = 208; +pub const SYS_setresgid: ::c_long = 210; +pub const SYS_getresgid: ::c_long = 211; +pub const SYS_select: ::c_long = 142; +pub const SYS_getegid: ::c_long = 202; +pub const SYS_setgroups: ::c_long = 206; +pub const SYS_getresuid: ::c_long = 209; +pub const SYS_chown: ::c_long = 212; +pub const SYS_setfsuid: ::c_long = 215; +pub const SYS_setfsgid: ::c_long = 216; +pub const SYS_newfstatat: ::c_long = 293; +pub const SYS_statx: ::c_long = 379; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/align.rs new file mode 100644 index 0000000..94391a0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/align.rs @@ -0,0 +1,25 @@ +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } + +} + +s! { + #[repr(align(8))] + pub struct clone_args { + pub flags: ::c_ulonglong, + pub pidfd: ::c_ulonglong, + pub child_tid: ::c_ulonglong, + pub parent_tid: ::c_ulonglong, + pub exit_signal: ::c_ulonglong, + pub stack: ::c_ulonglong, + pub stack_size: ::c_ulonglong, + pub tls: ::c_ulonglong, + pub set_tid: ::c_ulonglong, + pub set_tid_size: ::c_ulonglong, + pub cgroup: ::c_ulonglong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs new file mode 100644 index 0000000..9decf91 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs @@ -0,0 +1,917 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type nlink_t = u64; +pub type blksize_t = ::c_long; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; +pub type greg_t = i64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + __pad0: ::c_int, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __reserved: [::c_long; 3], + } + + pub struct user_regs_struct { + pub r15: ::c_ulong, + pub r14: ::c_ulong, + pub r13: ::c_ulong, + pub r12: ::c_ulong, + pub rbp: ::c_ulong, + pub rbx: ::c_ulong, + pub r11: ::c_ulong, + pub r10: ::c_ulong, + pub r9: ::c_ulong, + pub r8: ::c_ulong, + pub rax: ::c_ulong, + pub rcx: ::c_ulong, + pub rdx: ::c_ulong, + pub rsi: ::c_ulong, + pub rdi: ::c_ulong, + pub orig_rax: ::c_ulong, + pub rip: ::c_ulong, + pub cs: ::c_ulong, + pub eflags: ::c_ulong, + pub rsp: ::c_ulong, + pub ss: ::c_ulong, + pub fs_base: ::c_ulong, + pub gs_base: ::c_ulong, + pub ds: ::c_ulong, + pub es: ::c_ulong, + pub fs: ::c_ulong, + pub gs: ::c_ulong, + } + + pub struct user { + pub regs: user_regs_struct, + pub u_fpvalid: ::c_int, + pub i387: user_fpregs_struct, + pub u_tsize: ::c_ulong, + pub u_dsize: ::c_ulong, + pub u_ssize: ::c_ulong, + pub start_code: ::c_ulong, + pub start_stack: ::c_ulong, + pub signal: ::c_long, + __reserved: ::c_int, + #[cfg(target_pointer_width = "32")] + __pad1: u32, + pub u_ar0: *mut user_regs_struct, + #[cfg(target_pointer_width = "32")] + __pad2: u32, + pub u_fpstate: *mut user_fpregs_struct, + pub magic: ::c_ulong, + pub u_comm: [::c_char; 32], + pub u_debugreg: [::c_ulong; 8], + } + + // GitHub repo: ifduyue/musl/ + // commit: b4b1e10364c8737a632be61582e05a8d3acf5690 + // file: arch/x86_64/bits/signal.h#L80-L84 + pub struct mcontext_t { + pub gregs: [greg_t; 23], + __private: [u64; 9], + } + + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __unused1: ::c_long, + __unused2: ::c_long + } +} + +s_no_extra_traits! { + pub struct user_fpregs_struct { + pub cwd: ::c_ushort, + pub swd: ::c_ushort, + pub ftw: ::c_ushort, + pub fop: ::c_ushort, + pub rip: ::c_ulong, + pub rdp: ::c_ulong, + pub mxcsr: ::c_uint, + pub mxcr_mask: ::c_uint, + pub st_space: [::c_uint; 32], + pub xmm_space: [::c_uint; 64], + padding: [::c_uint; 24], + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_sigmask: ::sigset_t, + __private: [u8; 512], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for user_fpregs_struct { + fn eq(&self, other: &user_fpregs_struct) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.ftw == other.ftw + && self.fop == other.fop + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mxcr_mask == other.mxcr_mask + && self.st_space == other.st_space + && self + .xmm_space + .iter() + .zip(other.xmm_space.iter()) + .all(|(a,b)| a == b) + // Ignore padding field + } + } + + impl Eq for user_fpregs_struct {} + + impl ::fmt::Debug for user_fpregs_struct { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("user_fpregs_struct") + .field("cwd", &self.cwd) + .field("ftw", &self.ftw) + .field("fop", &self.fop) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mxcr_mask", &self.mxcr_mask) + .field("st_space", &self.st_space) + // FIXME: .field("xmm_space", &self.xmm_space) + // Ignore padding field + .finish() + } + } + + impl ::hash::Hash for user_fpregs_struct { + fn hash(&self, state: &mut H) { + self.cwd.hash(state); + self.ftw.hash(state); + self.fop.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mxcr_mask.hash(state); + self.st_space.hash(state); + self.xmm_space.hash(state); + // Ignore padding field + } + } + + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_sigmask == other.uc_sigmask + && self + .__private + .iter() + .zip(other.__private.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for ucontext_t {} + + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_sigmask", &self.uc_sigmask) + // Ignore __private field + .finish() + } + } + + impl ::hash::Hash for ucontext_t { + fn hash(&self, state: &mut H) { + self.uc_flags.hash(state); + self.uc_link.hash(state); + self.uc_stack.hash(state); + self.uc_mcontext.hash(state); + self.uc_sigmask.hash(state); + self.__private.hash(state); + } + } + } +} + +// Syscall table + +pub const SYS_read: ::c_long = 0; +pub const SYS_write: ::c_long = 1; +pub const SYS_open: ::c_long = 2; +pub const SYS_close: ::c_long = 3; +pub const SYS_stat: ::c_long = 4; +pub const SYS_fstat: ::c_long = 5; +pub const SYS_lstat: ::c_long = 6; +pub const SYS_poll: ::c_long = 7; +pub const SYS_lseek: ::c_long = 8; +pub const SYS_mmap: ::c_long = 9; +pub const SYS_mprotect: ::c_long = 10; +pub const SYS_munmap: ::c_long = 11; +pub const SYS_brk: ::c_long = 12; +pub const SYS_rt_sigaction: ::c_long = 13; +pub const SYS_rt_sigprocmask: ::c_long = 14; +pub const SYS_rt_sigreturn: ::c_long = 15; +pub const SYS_ioctl: ::c_long = 16; +pub const SYS_pread64: ::c_long = 17; +pub const SYS_pwrite64: ::c_long = 18; +pub const SYS_readv: ::c_long = 19; +pub const SYS_writev: ::c_long = 20; +pub const SYS_access: ::c_long = 21; +pub const SYS_pipe: ::c_long = 22; +pub const SYS_select: ::c_long = 23; +pub const SYS_sched_yield: ::c_long = 24; +pub const SYS_mremap: ::c_long = 25; +pub const SYS_msync: ::c_long = 26; +pub const SYS_mincore: ::c_long = 27; +pub const SYS_madvise: ::c_long = 28; +pub const SYS_shmget: ::c_long = 29; +pub const SYS_shmat: ::c_long = 30; +pub const SYS_shmctl: ::c_long = 31; +pub const SYS_dup: ::c_long = 32; +pub const SYS_dup2: ::c_long = 33; +pub const SYS_pause: ::c_long = 34; +pub const SYS_nanosleep: ::c_long = 35; +pub const SYS_getitimer: ::c_long = 36; +pub const SYS_alarm: ::c_long = 37; +pub const SYS_setitimer: ::c_long = 38; +pub const SYS_getpid: ::c_long = 39; +pub const SYS_sendfile: ::c_long = 40; +pub const SYS_socket: ::c_long = 41; +pub const SYS_connect: ::c_long = 42; +pub const SYS_accept: ::c_long = 43; +pub const SYS_sendto: ::c_long = 44; +pub const SYS_recvfrom: ::c_long = 45; +pub const SYS_sendmsg: ::c_long = 46; +pub const SYS_recvmsg: ::c_long = 47; +pub const SYS_shutdown: ::c_long = 48; +pub const SYS_bind: ::c_long = 49; +pub const SYS_listen: ::c_long = 50; +pub const SYS_getsockname: ::c_long = 51; +pub const SYS_getpeername: ::c_long = 52; +pub const SYS_socketpair: ::c_long = 53; +pub const SYS_setsockopt: ::c_long = 54; +pub const SYS_getsockopt: ::c_long = 55; +pub const SYS_clone: ::c_long = 56; +pub const SYS_fork: ::c_long = 57; +pub const SYS_vfork: ::c_long = 58; +pub const SYS_execve: ::c_long = 59; +pub const SYS_exit: ::c_long = 60; +pub const SYS_wait4: ::c_long = 61; +pub const SYS_kill: ::c_long = 62; +pub const SYS_uname: ::c_long = 63; +pub const SYS_semget: ::c_long = 64; +pub const SYS_semop: ::c_long = 65; +pub const SYS_semctl: ::c_long = 66; +pub const SYS_shmdt: ::c_long = 67; +pub const SYS_msgget: ::c_long = 68; +pub const SYS_msgsnd: ::c_long = 69; +pub const SYS_msgrcv: ::c_long = 70; +pub const SYS_msgctl: ::c_long = 71; +pub const SYS_fcntl: ::c_long = 72; +pub const SYS_flock: ::c_long = 73; +pub const SYS_fsync: ::c_long = 74; +pub const SYS_fdatasync: ::c_long = 75; +pub const SYS_truncate: ::c_long = 76; +pub const SYS_ftruncate: ::c_long = 77; +pub const SYS_getdents: ::c_long = 78; +pub const SYS_getcwd: ::c_long = 79; +pub const SYS_chdir: ::c_long = 80; +pub const SYS_fchdir: ::c_long = 81; +pub const SYS_rename: ::c_long = 82; +pub const SYS_mkdir: ::c_long = 83; +pub const SYS_rmdir: ::c_long = 84; +pub const SYS_creat: ::c_long = 85; +pub const SYS_link: ::c_long = 86; +pub const SYS_unlink: ::c_long = 87; +pub const SYS_symlink: ::c_long = 88; +pub const SYS_readlink: ::c_long = 89; +pub const SYS_chmod: ::c_long = 90; +pub const SYS_fchmod: ::c_long = 91; +pub const SYS_chown: ::c_long = 92; +pub const SYS_fchown: ::c_long = 93; +pub const SYS_lchown: ::c_long = 94; +pub const SYS_umask: ::c_long = 95; +pub const SYS_gettimeofday: ::c_long = 96; +pub const SYS_getrlimit: ::c_long = 97; +pub const SYS_getrusage: ::c_long = 98; +pub const SYS_sysinfo: ::c_long = 99; +pub const SYS_times: ::c_long = 100; +pub const SYS_ptrace: ::c_long = 101; +pub const SYS_getuid: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_getgid: ::c_long = 104; +pub const SYS_setuid: ::c_long = 105; +pub const SYS_setgid: ::c_long = 106; +pub const SYS_geteuid: ::c_long = 107; +pub const SYS_getegid: ::c_long = 108; +pub const SYS_setpgid: ::c_long = 109; +pub const SYS_getppid: ::c_long = 110; +pub const SYS_getpgrp: ::c_long = 111; +pub const SYS_setsid: ::c_long = 112; +pub const SYS_setreuid: ::c_long = 113; +pub const SYS_setregid: ::c_long = 114; +pub const SYS_getgroups: ::c_long = 115; +pub const SYS_setgroups: ::c_long = 116; +pub const SYS_setresuid: ::c_long = 117; +pub const SYS_getresuid: ::c_long = 118; +pub const SYS_setresgid: ::c_long = 119; +pub const SYS_getresgid: ::c_long = 120; +pub const SYS_getpgid: ::c_long = 121; +pub const SYS_setfsuid: ::c_long = 122; +pub const SYS_setfsgid: ::c_long = 123; +pub const SYS_getsid: ::c_long = 124; +pub const SYS_capget: ::c_long = 125; +pub const SYS_capset: ::c_long = 126; +pub const SYS_rt_sigpending: ::c_long = 127; +pub const SYS_rt_sigtimedwait: ::c_long = 128; +pub const SYS_rt_sigqueueinfo: ::c_long = 129; +pub const SYS_rt_sigsuspend: ::c_long = 130; +pub const SYS_sigaltstack: ::c_long = 131; +pub const SYS_utime: ::c_long = 132; +pub const SYS_mknod: ::c_long = 133; +pub const SYS_uselib: ::c_long = 134; +pub const SYS_personality: ::c_long = 135; +pub const SYS_ustat: ::c_long = 136; +pub const SYS_statfs: ::c_long = 137; +pub const SYS_fstatfs: ::c_long = 138; +pub const SYS_sysfs: ::c_long = 139; +pub const SYS_getpriority: ::c_long = 140; +pub const SYS_setpriority: ::c_long = 141; +pub const SYS_sched_setparam: ::c_long = 142; +pub const SYS_sched_getparam: ::c_long = 143; +pub const SYS_sched_setscheduler: ::c_long = 144; +pub const SYS_sched_getscheduler: ::c_long = 145; +pub const SYS_sched_get_priority_max: ::c_long = 146; +pub const SYS_sched_get_priority_min: ::c_long = 147; +pub const SYS_sched_rr_get_interval: ::c_long = 148; +pub const SYS_mlock: ::c_long = 149; +pub const SYS_munlock: ::c_long = 150; +pub const SYS_mlockall: ::c_long = 151; +pub const SYS_munlockall: ::c_long = 152; +pub const SYS_vhangup: ::c_long = 153; +pub const SYS_modify_ldt: ::c_long = 154; +pub const SYS_pivot_root: ::c_long = 155; +pub const SYS__sysctl: ::c_long = 156; +pub const SYS_prctl: ::c_long = 157; +pub const SYS_arch_prctl: ::c_long = 158; +pub const SYS_adjtimex: ::c_long = 159; +pub const SYS_setrlimit: ::c_long = 160; +pub const SYS_chroot: ::c_long = 161; +pub const SYS_sync: ::c_long = 162; +pub const SYS_acct: ::c_long = 163; +pub const SYS_settimeofday: ::c_long = 164; +pub const SYS_mount: ::c_long = 165; +pub const SYS_umount2: ::c_long = 166; +pub const SYS_swapon: ::c_long = 167; +pub const SYS_swapoff: ::c_long = 168; +pub const SYS_reboot: ::c_long = 169; +pub const SYS_sethostname: ::c_long = 170; +pub const SYS_setdomainname: ::c_long = 171; +pub const SYS_iopl: ::c_long = 172; +pub const SYS_ioperm: ::c_long = 173; +pub const SYS_create_module: ::c_long = 174; +pub const SYS_init_module: ::c_long = 175; +pub const SYS_delete_module: ::c_long = 176; +pub const SYS_get_kernel_syms: ::c_long = 177; +pub const SYS_query_module: ::c_long = 178; +pub const SYS_quotactl: ::c_long = 179; +pub const SYS_nfsservctl: ::c_long = 180; +pub const SYS_getpmsg: ::c_long = 181; +pub const SYS_putpmsg: ::c_long = 182; +pub const SYS_afs_syscall: ::c_long = 183; +pub const SYS_tuxcall: ::c_long = 184; +pub const SYS_security: ::c_long = 185; +pub const SYS_gettid: ::c_long = 186; +pub const SYS_readahead: ::c_long = 187; +pub const SYS_setxattr: ::c_long = 188; +pub const SYS_lsetxattr: ::c_long = 189; +pub const SYS_fsetxattr: ::c_long = 190; +pub const SYS_getxattr: ::c_long = 191; +pub const SYS_lgetxattr: ::c_long = 192; +pub const SYS_fgetxattr: ::c_long = 193; +pub const SYS_listxattr: ::c_long = 194; +pub const SYS_llistxattr: ::c_long = 195; +pub const SYS_flistxattr: ::c_long = 196; +pub const SYS_removexattr: ::c_long = 197; +pub const SYS_lremovexattr: ::c_long = 198; +pub const SYS_fremovexattr: ::c_long = 199; +pub const SYS_tkill: ::c_long = 200; +pub const SYS_time: ::c_long = 201; +pub const SYS_futex: ::c_long = 202; +pub const SYS_sched_setaffinity: ::c_long = 203; +pub const SYS_sched_getaffinity: ::c_long = 204; +pub const SYS_set_thread_area: ::c_long = 205; +pub const SYS_io_setup: ::c_long = 206; +pub const SYS_io_destroy: ::c_long = 207; +pub const SYS_io_getevents: ::c_long = 208; +pub const SYS_io_submit: ::c_long = 209; +pub const SYS_io_cancel: ::c_long = 210; +pub const SYS_get_thread_area: ::c_long = 211; +pub const SYS_lookup_dcookie: ::c_long = 212; +pub const SYS_epoll_create: ::c_long = 213; +pub const SYS_epoll_ctl_old: ::c_long = 214; +pub const SYS_epoll_wait_old: ::c_long = 215; +pub const SYS_remap_file_pages: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_set_tid_address: ::c_long = 218; +pub const SYS_restart_syscall: ::c_long = 219; +pub const SYS_semtimedop: ::c_long = 220; +pub const SYS_fadvise64: ::c_long = 221; +pub const SYS_timer_create: ::c_long = 222; +pub const SYS_timer_settime: ::c_long = 223; +pub const SYS_timer_gettime: ::c_long = 224; +pub const SYS_timer_getoverrun: ::c_long = 225; +pub const SYS_timer_delete: ::c_long = 226; +pub const SYS_clock_settime: ::c_long = 227; +pub const SYS_clock_gettime: ::c_long = 228; +pub const SYS_clock_getres: ::c_long = 229; +pub const SYS_clock_nanosleep: ::c_long = 230; +pub const SYS_exit_group: ::c_long = 231; +pub const SYS_epoll_wait: ::c_long = 232; +pub const SYS_epoll_ctl: ::c_long = 233; +pub const SYS_tgkill: ::c_long = 234; +pub const SYS_utimes: ::c_long = 235; +pub const SYS_vserver: ::c_long = 236; +pub const SYS_mbind: ::c_long = 237; +pub const SYS_set_mempolicy: ::c_long = 238; +pub const SYS_get_mempolicy: ::c_long = 239; +pub const SYS_mq_open: ::c_long = 240; +pub const SYS_mq_unlink: ::c_long = 241; +pub const SYS_mq_timedsend: ::c_long = 242; +pub const SYS_mq_timedreceive: ::c_long = 243; +pub const SYS_mq_notify: ::c_long = 244; +pub const SYS_mq_getsetattr: ::c_long = 245; +pub const SYS_kexec_load: ::c_long = 246; +pub const SYS_waitid: ::c_long = 247; +pub const SYS_add_key: ::c_long = 248; +pub const SYS_request_key: ::c_long = 249; +pub const SYS_keyctl: ::c_long = 250; +pub const SYS_ioprio_set: ::c_long = 251; +pub const SYS_ioprio_get: ::c_long = 252; +pub const SYS_inotify_init: ::c_long = 253; +pub const SYS_inotify_add_watch: ::c_long = 254; +pub const SYS_inotify_rm_watch: ::c_long = 255; +pub const SYS_migrate_pages: ::c_long = 256; +pub const SYS_openat: ::c_long = 257; +pub const SYS_mkdirat: ::c_long = 258; +pub const SYS_mknodat: ::c_long = 259; +pub const SYS_fchownat: ::c_long = 260; +pub const SYS_futimesat: ::c_long = 261; +pub const SYS_newfstatat: ::c_long = 262; +pub const SYS_unlinkat: ::c_long = 263; +pub const SYS_renameat: ::c_long = 264; +pub const SYS_linkat: ::c_long = 265; +pub const SYS_symlinkat: ::c_long = 266; +pub const SYS_readlinkat: ::c_long = 267; +pub const SYS_fchmodat: ::c_long = 268; +pub const SYS_faccessat: ::c_long = 269; +pub const SYS_pselect6: ::c_long = 270; +pub const SYS_ppoll: ::c_long = 271; +pub const SYS_unshare: ::c_long = 272; +pub const SYS_set_robust_list: ::c_long = 273; +pub const SYS_get_robust_list: ::c_long = 274; +pub const SYS_splice: ::c_long = 275; +pub const SYS_tee: ::c_long = 276; +pub const SYS_sync_file_range: ::c_long = 277; +pub const SYS_vmsplice: ::c_long = 278; +pub const SYS_move_pages: ::c_long = 279; +pub const SYS_utimensat: ::c_long = 280; +pub const SYS_epoll_pwait: ::c_long = 281; +pub const SYS_signalfd: ::c_long = 282; +pub const SYS_timerfd_create: ::c_long = 283; +pub const SYS_eventfd: ::c_long = 284; +pub const SYS_fallocate: ::c_long = 285; +pub const SYS_timerfd_settime: ::c_long = 286; +pub const SYS_timerfd_gettime: ::c_long = 287; +pub const SYS_accept4: ::c_long = 288; +pub const SYS_signalfd4: ::c_long = 289; +pub const SYS_eventfd2: ::c_long = 290; +pub const SYS_epoll_create1: ::c_long = 291; +pub const SYS_dup3: ::c_long = 292; +pub const SYS_pipe2: ::c_long = 293; +pub const SYS_inotify_init1: ::c_long = 294; +pub const SYS_preadv: ::c_long = 295; +pub const SYS_pwritev: ::c_long = 296; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 297; +pub const SYS_perf_event_open: ::c_long = 298; +pub const SYS_recvmmsg: ::c_long = 299; +pub const SYS_fanotify_init: ::c_long = 300; +pub const SYS_fanotify_mark: ::c_long = 301; +pub const SYS_prlimit64: ::c_long = 302; +pub const SYS_name_to_handle_at: ::c_long = 303; +pub const SYS_open_by_handle_at: ::c_long = 304; +pub const SYS_clock_adjtime: ::c_long = 305; +pub const SYS_syncfs: ::c_long = 306; +pub const SYS_sendmmsg: ::c_long = 307; +pub const SYS_setns: ::c_long = 308; +pub const SYS_getcpu: ::c_long = 309; +pub const SYS_process_vm_readv: ::c_long = 310; +pub const SYS_process_vm_writev: ::c_long = 311; +pub const SYS_kcmp: ::c_long = 312; +pub const SYS_finit_module: ::c_long = 313; +pub const SYS_sched_setattr: ::c_long = 314; +pub const SYS_sched_getattr: ::c_long = 315; +pub const SYS_renameat2: ::c_long = 316; +pub const SYS_seccomp: ::c_long = 317; +pub const SYS_getrandom: ::c_long = 318; +pub const SYS_memfd_create: ::c_long = 319; +pub const SYS_kexec_file_load: ::c_long = 320; +pub const SYS_bpf: ::c_long = 321; +pub const SYS_execveat: ::c_long = 322; +pub const SYS_userfaultfd: ::c_long = 323; +pub const SYS_membarrier: ::c_long = 324; +pub const SYS_mlock2: ::c_long = 325; +pub const SYS_copy_file_range: ::c_long = 326; +pub const SYS_preadv2: ::c_long = 327; +pub const SYS_pwritev2: ::c_long = 328; +pub const SYS_pkey_mprotect: ::c_long = 329; +pub const SYS_pkey_alloc: ::c_long = 330; +pub const SYS_pkey_free: ::c_long = 331; +pub const SYS_statx: ::c_long = 332; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +// offsets in user_regs_structs, from sys/reg.h +pub const R15: ::c_int = 0; +pub const R14: ::c_int = 1; +pub const R13: ::c_int = 2; +pub const R12: ::c_int = 3; +pub const RBP: ::c_int = 4; +pub const RBX: ::c_int = 5; +pub const R11: ::c_int = 6; +pub const R10: ::c_int = 7; +pub const R9: ::c_int = 8; +pub const R8: ::c_int = 9; +pub const RAX: ::c_int = 10; +pub const RCX: ::c_int = 11; +pub const RDX: ::c_int = 12; +pub const RSI: ::c_int = 13; +pub const RDI: ::c_int = 14; +pub const ORIG_RAX: ::c_int = 15; +pub const RIP: ::c_int = 16; +pub const CS: ::c_int = 17; +pub const EFLAGS: ::c_int = 18; +pub const RSP: ::c_int = 19; +pub const SS: ::c_int = 20; +pub const FS_BASE: ::c_int = 21; +pub const GS_BASE: ::c_int = 22; +pub const DS: ::c_int = 23; +pub const ES: ::c_int = 24; +pub const FS: ::c_int = 25; +pub const GS: ::c_int = 26; + +// offsets in mcontext_t.gregs from bits/signal.h +// GitHub repo: ifduyue/musl/ +// commit: b4b1e10364c8737a632be61582e05a8d3acf5690 +// file: arch/x86_64/bits/signal.h#L9-L56 +pub const REG_R8: ::c_int = 0; +pub const REG_R9: ::c_int = 1; +pub const REG_R10: ::c_int = 2; +pub const REG_R11: ::c_int = 3; +pub const REG_R12: ::c_int = 4; +pub const REG_R13: ::c_int = 5; +pub const REG_R14: ::c_int = 6; +pub const REG_R15: ::c_int = 7; +pub const REG_RDI: ::c_int = 8; +pub const REG_RSI: ::c_int = 9; +pub const REG_RBP: ::c_int = 10; +pub const REG_RBX: ::c_int = 11; +pub const REG_RDX: ::c_int = 12; +pub const REG_RAX: ::c_int = 13; +pub const REG_RCX: ::c_int = 14; +pub const REG_RSP: ::c_int = 15; +pub const REG_RIP: ::c_int = 16; +pub const REG_EFL: ::c_int = 17; +pub const REG_CSGSFS: ::c_int = 18; +pub const REG_ERR: ::c_int = 19; +pub const REG_TRAPNO: ::c_int = 20; +pub const REG_OLDMASK: ::c_int = 21; +pub const REG_CR2: ::c_int = 22; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_32BIT: ::c_int = 0x0040; +pub const O_APPEND: ::c_int = 1024; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_LARGEFILE: ::c_int = 0; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_SYNC: ::c_int = 1052672; +pub const O_RSYNC: ::c_int = 1052672; +pub const O_DSYNC: ::c_int = 4096; +pub const O_ASYNC: ::c_int = 0x2000; + +pub const PTRACE_SYSEMU: ::c_int = 31; +pub const PTRACE_SYSEMU_SINGLESTEP: ::c_int = 32; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const MINSIGSTKSZ: ::size_t = 2048; + +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EMULTIHOP: ::c_int = 72; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 0x00000004; +pub const SA_NOCLDWAIT: ::c_int = 0x00000002; + +pub const SIGCHLD: ::c_int = 17; +pub const SIGBUS: ::c_int = 7; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGUSR1: ::c_int = 10; +pub const SIGUSR2: ::c_int = 12; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGURG: ::c_int = 23; +pub const SIGIO: ::c_int = 29; +pub const SIGSYS: ::c_int = 31; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGPOLL: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const F_GETLK: ::c_int = 5; +pub const F_GETOWN: ::c_int = 9; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_SETOWN: ::c_int = 8; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const VEOF: usize = 4; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_DENYWRITE: ::c_int = 0x0800; +pub const MAP_EXECUTABLE: ::c_int = 0x01000; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_POPULATE: ::c_int = 0x08000; +pub const MAP_NONBLOCK: ::c_int = 0x010000; +pub const MAP_STACK: ::c_int = 0x020000; +pub const MAP_HUGETLB: ::c_int = 0x040000; +pub const MAP_SYNC: ::c_int = 0x080000; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const TAB1: ::c_int = 0x00000800; +pub const TAB2: ::c_int = 0x00001000; +pub const TAB3: ::c_int = 0x00001800; +pub const CR1: ::c_int = 0x00000200; +pub const CR2: ::c_int = 0x00000400; +pub const CR3: ::c_int = 0x00000600; +pub const FF1: ::c_int = 0x00008000; +pub const BS1: ::c_int = 0x00002000; +pub const VT1: ::c_int = 0x00004000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const CIBAUD: ::tcflag_t = 0o02003600000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const VSWTC: usize = 7; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const XTABS: ::tcflag_t = 0o014000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +pub const EDEADLK: ::c_int = 35; +pub const EDEADLOCK: ::c_int = EDEADLK; + +pub const EXTPROC: ::tcflag_t = 0x00010000; +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/lfs64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/lfs64.rs new file mode 100644 index 0000000..27c1d25 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/lfs64.rs @@ -0,0 +1,241 @@ +#[inline] +pub unsafe extern "C" fn creat64(path: *const ::c_char, mode: ::mode_t) -> ::c_int { + ::creat(path, mode) +} + +#[inline] +pub unsafe extern "C" fn fallocate64( + fd: ::c_int, + mode: ::c_int, + offset: ::off64_t, + len: ::off64_t, +) -> ::c_int { + ::fallocate(fd, mode, offset, len) +} + +#[inline] +pub unsafe extern "C" fn fgetpos64(stream: *mut ::FILE, pos: *mut ::fpos64_t) -> ::c_int { + ::fgetpos(stream, pos as *mut _) +} + +#[inline] +pub unsafe extern "C" fn fopen64(pathname: *const ::c_char, mode: *const ::c_char) -> *mut ::FILE { + ::fopen(pathname, mode) +} + +#[inline] +pub unsafe extern "C" fn freopen64( + pathname: *const ::c_char, + mode: *const ::c_char, + stream: *mut ::FILE, +) -> *mut ::FILE { + ::freopen(pathname, mode, stream) +} + +#[inline] +pub unsafe extern "C" fn fseeko64( + stream: *mut ::FILE, + offset: ::off64_t, + whence: ::c_int, +) -> ::c_int { + ::fseeko(stream, offset, whence) +} + +#[inline] +pub unsafe extern "C" fn fsetpos64(stream: *mut ::FILE, pos: *const ::fpos64_t) -> ::c_int { + ::fsetpos(stream, pos as *mut _) +} + +#[inline] +pub unsafe extern "C" fn fstat64(fildes: ::c_int, buf: *mut ::stat64) -> ::c_int { + ::fstat(fildes, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn fstatat64( + fd: ::c_int, + path: *const ::c_char, + buf: *mut ::stat64, + flag: ::c_int, +) -> ::c_int { + ::fstatat(fd, path, buf as *mut _, flag) +} + +#[inline] +pub unsafe extern "C" fn fstatfs64(fd: ::c_int, buf: *mut ::statfs64) -> ::c_int { + ::fstatfs(fd, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn fstatvfs64(fd: ::c_int, buf: *mut ::statvfs64) -> ::c_int { + ::fstatvfs(fd, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn ftello64(stream: *mut ::FILE) -> ::off64_t { + ::ftello(stream) +} + +#[inline] +pub unsafe extern "C" fn ftruncate64(fd: ::c_int, length: ::off64_t) -> ::c_int { + ::ftruncate(fd, length) +} + +#[inline] +pub unsafe extern "C" fn getrlimit64(resource: ::c_int, rlim: *mut ::rlimit64) -> ::c_int { + ::getrlimit(resource, rlim as *mut _) +} + +#[inline] +pub unsafe extern "C" fn lseek64(fd: ::c_int, offset: ::off64_t, whence: ::c_int) -> ::off64_t { + ::lseek(fd, offset, whence) +} + +#[inline] +pub unsafe extern "C" fn lstat64(path: *const ::c_char, buf: *mut ::stat64) -> ::c_int { + ::lstat(path, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn mmap64( + addr: *mut ::c_void, + length: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: ::off64_t, +) -> *mut ::c_void { + ::mmap(addr, length, prot, flags, fd, offset) +} + +// These functions are variadic in the C ABI since the `mode` argument is "optional". Variadic +// `extern "C"` functions are unstable in Rust so we cannot write a shim function for these +// entrypoints. See https://github.com/rust-lang/rust/issues/44930. +// +// These aliases are mostly fine though, neither function takes a LFS64-namespaced type as an +// argument, nor do their names clash with any declared types. +pub use open as open64; +pub use openat as openat64; + +#[inline] +pub unsafe extern "C" fn posix_fadvise64( + fd: ::c_int, + offset: ::off64_t, + len: ::off64_t, + advice: ::c_int, +) -> ::c_int { + ::posix_fadvise(fd, offset, len, advice) +} + +#[inline] +pub unsafe extern "C" fn posix_fallocate64( + fd: ::c_int, + offset: ::off64_t, + len: ::off64_t, +) -> ::c_int { + ::posix_fallocate(fd, offset, len) +} + +#[inline] +pub unsafe extern "C" fn pread64( + fd: ::c_int, + buf: *mut ::c_void, + count: ::size_t, + offset: ::off64_t, +) -> ::ssize_t { + ::pread(fd, buf, count, offset) +} + +#[inline] +pub unsafe extern "C" fn preadv64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, +) -> ::ssize_t { + ::preadv(fd, iov, iovcnt, offset) +} + +#[inline] +pub unsafe extern "C" fn prlimit64( + pid: ::pid_t, + resource: ::c_int, + new_limit: *const ::rlimit64, + old_limit: *mut ::rlimit64, +) -> ::c_int { + ::prlimit(pid, resource, new_limit as *mut _, old_limit as *mut _) +} + +#[inline] +pub unsafe extern "C" fn pwrite64( + fd: ::c_int, + buf: *const ::c_void, + count: ::size_t, + offset: ::off64_t, +) -> ::ssize_t { + ::pwrite(fd, buf, count, offset) +} + +#[inline] +pub unsafe extern "C" fn pwritev64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, +) -> ::ssize_t { + ::pwritev(fd, iov, iovcnt, offset) +} + +#[inline] +pub unsafe extern "C" fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64 { + ::readdir(dirp) as *mut _ +} + +#[inline] +pub unsafe extern "C" fn readdir64_r( + dirp: *mut ::DIR, + entry: *mut ::dirent64, + result: *mut *mut ::dirent64, +) -> ::c_int { + ::readdir_r(dirp, entry as *mut _, result as *mut _) +} + +#[inline] +pub unsafe extern "C" fn sendfile64( + out_fd: ::c_int, + in_fd: ::c_int, + offset: *mut ::off64_t, + count: ::size_t, +) -> ::ssize_t { + ::sendfile(out_fd, in_fd, offset, count) +} + +#[inline] +pub unsafe extern "C" fn setrlimit64(resource: ::c_int, rlim: *const ::rlimit64) -> ::c_int { + ::setrlimit(resource, rlim as *mut _) +} + +#[inline] +pub unsafe extern "C" fn stat64(pathname: *const ::c_char, statbuf: *mut ::stat64) -> ::c_int { + ::stat(pathname, statbuf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn statfs64(pathname: *const ::c_char, buf: *mut ::statfs64) -> ::c_int { + ::statfs(pathname, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn statvfs64(path: *const ::c_char, buf: *mut ::statvfs64) -> ::c_int { + ::statvfs(path, buf as *mut _) +} + +#[inline] +pub unsafe extern "C" fn tmpfile64() -> *mut ::FILE { + ::tmpfile() +} + +#[inline] +pub unsafe extern "C" fn truncate64(path: *const ::c_char, length: ::off64_t) -> ::c_int { + ::truncate(path, length) +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/mod.rs new file mode 100644 index 0000000..4c60533 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/musl/mod.rs @@ -0,0 +1,806 @@ +pub type pthread_t = *mut ::c_void; +pub type clock_t = c_long; +#[cfg_attr( + not(feature = "rustc-dep-of-std"), + deprecated( + since = "0.2.80", + note = "This type is changed to 64-bit in musl 1.2.0, \ + we'll follow that change in the future release. \ + See #1848 for more info." + ) +)] +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = i64; + +pub type shmatt_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulonglong; +pub type fsfilcnt_t = ::c_ulonglong; +pub type rlim_t = ::c_ulonglong; + +cfg_if! { + if #[cfg(doc)] { + // Used in `linux::arch` to define ioctl constants. + pub(crate) type Ioctl = ::c_int; + } else { + #[doc(hidden)] + pub type Ioctl = ::c_int; + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_sigfault { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_si_value { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _si_timerid: ::c_int, + _si_overrun: ::c_int, + si_value: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_si_value)).si_value + } +} + +cfg_if! { + if #[cfg(libc_union)] { + // Internal, for casts to access union fields + #[repr(C)] + struct sifields_sigchld { + si_pid: ::pid_t, + si_uid: ::uid_t, + si_status: ::c_int, + si_utime: ::c_long, + si_stime: ::c_long, + } + impl ::Copy for sifields_sigchld {} + impl ::Clone for sifields_sigchld { + fn clone(&self) -> sifields_sigchld { + *self + } + } + + // Internal, for casts to access union fields + #[repr(C)] + union sifields { + _align_pointer: *mut ::c_void, + sigchld: sifields_sigchld, + } + + // Internal, for casts to access union fields. Note that some variants + // of sifields start with a pointer, which makes the alignment of + // sifields vary on 32-bit and 64-bit architectures. + #[repr(C)] + struct siginfo_f { + _siginfo_base: [::c_int; 3], + sifields: sifields, + } + + impl siginfo_t { + unsafe fn sifields(&self) -> &sifields { + &(*(self as *const siginfo_t as *const siginfo_f)).sifields + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.sifields().sigchld.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.sifields().sigchld.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.sifields().sigchld.si_status + } + + pub unsafe fn si_utime(&self) -> ::c_long { + self.sifields().sigchld.si_utime + } + + pub unsafe fn si_stime(&self) -> ::c_long { + self.sifields().sigchld.si_stime + } + } + } +} + +s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_lio_opcode: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + __td: *mut ::c_void, + __lock: [::c_int; 2], + __err: ::c_int, + __ret: ::ssize_t, + pub aio_offset: off_t, + __next: *mut ::c_void, + __prev: *mut ::c_void, + #[cfg(target_pointer_width = "32")] + __dummy4: [::c_char; 24], + #[cfg(target_pointer_width = "64")] + __dummy4: [::c_char; 16], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_mask: ::sigset_t, + pub sa_flags: ::c_int, + pub sa_restorer: ::Option, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + #[cfg(target_pointer_width = "32")] + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub __c_ispeed: ::speed_t, + pub __c_ospeed: ::speed_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + + pub struct regex_t { + __re_nsub: ::size_t, + __opaque: *mut ::c_void, + __padding: [*mut ::c_void; 4usize], + __nsub2: ::size_t, + __padding2: ::c_char, + } + + pub struct rtentry { + pub rt_pad1: ::c_ulong, + pub rt_dst: ::sockaddr, + pub rt_gateway: ::sockaddr, + pub rt_genmask: ::sockaddr, + pub rt_flags: ::c_ushort, + pub rt_pad2: ::c_short, + pub rt_pad3: ::c_ulong, + pub rt_tos: ::c_uchar, + pub rt_class: ::c_uchar, + #[cfg(target_pointer_width = "64")] + pub rt_pad4: [::c_short; 3usize], + #[cfg(not(target_pointer_width = "64"))] + pub rt_pad4: [::c_short; 1usize], + pub rt_metric: ::c_short, + pub rt_dev: *mut ::c_char, + pub rt_mtu: ::c_ulong, + pub rt_window: ::c_ulong, + pub rt_irtt: ::c_ushort, + } + + pub struct __exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct Elf64_Chdr { + pub ch_type: ::Elf64_Word, + pub ch_reserved: ::Elf64_Word, + pub ch_size: ::Elf64_Xword, + pub ch_addralign: ::Elf64_Xword, + } + + pub struct Elf32_Chdr { + pub ch_type: ::Elf32_Word, + pub ch_size: ::Elf32_Word, + pub ch_addralign: ::Elf32_Word, + } + + pub struct timex { + pub modes: ::c_uint, + pub offset: ::c_long, + pub freq: ::c_long, + pub maxerror: ::c_long, + pub esterror: ::c_long, + pub status: ::c_int, + pub constant: ::c_long, + pub precision: ::c_long, + pub tolerance: ::c_long, + pub time: ::timeval, + pub tick: ::c_long, + pub ppsfreq: ::c_long, + pub jitter: ::c_long, + pub shift: ::c_int, + pub stabil: ::c_long, + pub jitcnt: ::c_long, + pub calcnt: ::c_long, + pub errcnt: ::c_long, + pub stbcnt: ::c_long, + pub tai: ::c_int, + pub __padding: [::c_int; 11], + } + + pub struct ntptimeval { + pub time: ::timeval, + pub maxerror: ::c_long, + pub esterror: ::c_long, + } +} + +s_no_extra_traits! { + pub struct sysinfo { + pub uptime: ::c_ulong, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub __reserved: [::c_char; 256], + } + + // FIXME: musl added paddings and adjusted + // layout in 1.2.0 but our CI is still 1.1.24. + // So, I'm leaving some fields as cfg for now. + // ref. https://github.com/bminor/musl/commit/ + // 1e7f0fcd7ff2096904fd93a2ee6d12a2392be392 + // + // OpenHarmony uses the musl 1.2 layout. + pub struct utmpx { + pub ut_type: ::c_short, + __ut_pad1: ::c_short, + pub ut_pid: ::pid_t, + pub ut_line: [::c_char; 32], + pub ut_id: [::c_char; 4], + pub ut_user: [::c_char; 32], + pub ut_host: [::c_char; 256], + pub ut_exit: __exit_status, + + #[cfg(target_env = "musl")] + pub ut_session: ::c_long, + + #[cfg(target_env = "ohos")] + #[cfg(target_endian = "little")] + pub ut_session: ::c_int, + #[cfg(target_env = "ohos")] + #[cfg(target_endian = "little")] + __ut_pad2: ::c_int, + + #[cfg(target_env = "ohos")] + #[cfg(not(target_endian = "little"))] + __ut_pad2: ::c_int, + #[cfg(target_env = "ohos")] + #[cfg(not(target_endian = "little"))] + pub ut_session: ::c_int, + + pub ut_tv: ::timeval, + pub ut_addr_v6: [::c_uint; 4], + __unused: [::c_char; 20], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for sysinfo { + fn eq(&self, other: &sysinfo) -> bool { + self.uptime == other.uptime + && self.loads == other.loads + && self.totalram == other.totalram + && self.freeram == other.freeram + && self.sharedram == other.sharedram + && self.bufferram == other.bufferram + && self.totalswap == other.totalswap + && self.freeswap == other.freeswap + && self.procs == other.procs + && self.pad == other.pad + && self.totalhigh == other.totalhigh + && self.freehigh == other.freehigh + && self.mem_unit == other.mem_unit + && self + .__reserved + .iter() + .zip(other.__reserved.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for sysinfo {} + + impl ::fmt::Debug for sysinfo { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sysinfo") + .field("uptime", &self.uptime) + .field("loads", &self.loads) + .field("totalram", &self.totalram) + .field("freeram", &self.freeram) + .field("sharedram", &self.sharedram) + .field("bufferram", &self.bufferram) + .field("totalswap", &self.totalswap) + .field("freeswap", &self.freeswap) + .field("procs", &self.procs) + .field("pad", &self.pad) + .field("totalhigh", &self.totalhigh) + .field("freehigh", &self.freehigh) + .field("mem_unit", &self.mem_unit) + // FIXME: .field("__reserved", &self.__reserved) + .finish() + } + } + + impl ::hash::Hash for sysinfo { + fn hash(&self, state: &mut H) { + self.uptime.hash(state); + self.loads.hash(state); + self.totalram.hash(state); + self.freeram.hash(state); + self.sharedram.hash(state); + self.bufferram.hash(state); + self.totalswap.hash(state); + self.freeswap.hash(state); + self.procs.hash(state); + self.pad.hash(state); + self.totalhigh.hash(state); + self.freehigh.hash(state); + self.mem_unit.hash(state); + self.__reserved.hash(state); + } + } + + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + //&& self.__ut_pad1 == other.__ut_pad1 + && self.ut_pid == other.ut_pid + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_user == other.ut_user + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + //&& self.__ut_pad2 == other.__ut_pad2 + && self.ut_tv == other.ut_tv + && self.ut_addr_v6 == other.ut_addr_v6 + && self.__unused == other.__unused + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_type", &self.ut_type) + //.field("__ut_pad1", &self.__ut_pad1) + .field("ut_pid", &self.ut_pid) + .field("ut_line", &self.ut_line) + .field("ut_id", &self.ut_id) + .field("ut_user", &self.ut_user) + //FIXME: .field("ut_host", &self.ut_host) + .field("ut_exit", &self.ut_exit) + .field("ut_session", &self.ut_session) + //.field("__ut_pad2", &self.__ut_pad2) + .field("ut_tv", &self.ut_tv) + .field("ut_addr_v6", &self.ut_addr_v6) + .field("__unused", &self.__unused) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_type.hash(state); + //self.__ut_pad1.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_user.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + //self.__ut_pad2.hash(state); + self.ut_tv.hash(state); + self.ut_addr_v6.hash(state); + self.__unused.hash(state); + } + } + } +} + +// include/sys/mman.h +/* + * Huge page size encoding when MAP_HUGETLB is specified, and a huge page + * size other than the default is desired. See hugetlb_encode.h. + * All known huge page size encodings are provided here. It is the + * responsibility of the application to know which sizes are supported on + * the running system. See mmap(2) man page for details. + */ +pub const MAP_HUGE_SHIFT: ::c_int = 26; +pub const MAP_HUGE_MASK: ::c_int = 0x3f; + +pub const MAP_HUGE_64KB: ::c_int = 16 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_512KB: ::c_int = 19 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_1MB: ::c_int = 20 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_2MB: ::c_int = 21 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_8MB: ::c_int = 23 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_16MB: ::c_int = 24 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_32MB: ::c_int = 25 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_256MB: ::c_int = 28 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_512MB: ::c_int = 29 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_1GB: ::c_int = 30 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_2GB: ::c_int = 31 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_16GB: ::c_int = 34 << MAP_HUGE_SHIFT; + +pub const MS_RMT_MASK: ::c_ulong = 0x02800051; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_CLOEXEC: ::c_int = 0x80000; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const F_RDLCK: ::c_int = 0; +pub const F_WRLCK: ::c_int = 1; +pub const F_UNLCK: ::c_int = 2; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const BUFSIZ: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 10000; +pub const FOPEN_MAX: ::c_uint = 1000; +pub const FILENAME_MAX: ::c_uint = 4096; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_EXEC: ::c_int = 0o10000000; +pub const O_SEARCH: ::c_int = 0o10000000; +pub const O_ACCMODE: ::c_int = 0o10000003; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const NI_MAXHOST: ::socklen_t = 255; +pub const PTHREAD_STACK_MIN: ::size_t = 2048; + +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; + +pub const SOCK_DCCP: ::c_int = 6; +pub const SOCK_PACKET: ::c_int = 10; + +pub const SOMAXCONN: ::c_int = 128; + +#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] +pub const SIGUNUSED: ::c_int = ::SIGSYS; + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +pub const CPU_SETSIZE: ::c_int = 128; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_GETFPXREGS: ::c_int = 18; +pub const PTRACE_SETFPXREGS: ::c_int = 19; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; +pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; + +pub const FAN_MARK_INODE: ::c_uint = 0x0000_0000; +pub const FAN_MARK_MOUNT: ::c_uint = 0x0000_0010; +// NOTE: FAN_MARK_FILESYSTEM requires Linux Kernel >= 4.20.0 +pub const FAN_MARK_FILESYSTEM: ::c_uint = 0x0000_0100; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const AF_XDP: ::c_int = 44; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; +pub const PF_XDP: ::c_int = AF_XDP; + +pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK; + +pub const PIDFD_NONBLOCK: ::c_uint = O_NONBLOCK as ::c_uint; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_NOLOAD: ::c_int = 0x4; + +pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const EXTA: ::speed_t = B19200; +pub const EXTB: ::speed_t = B38400; + +pub const REG_OK: ::c_int = 0; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const ADJ_OFFSET: ::c_uint = 0x0001; +pub const ADJ_FREQUENCY: ::c_uint = 0x0002; +pub const ADJ_MAXERROR: ::c_uint = 0x0004; +pub const ADJ_ESTERROR: ::c_uint = 0x0008; +pub const ADJ_STATUS: ::c_uint = 0x0010; +pub const ADJ_TIMECONST: ::c_uint = 0x0020; +pub const ADJ_TAI: ::c_uint = 0x0080; +pub const ADJ_SETOFFSET: ::c_uint = 0x0100; +pub const ADJ_MICRO: ::c_uint = 0x1000; +pub const ADJ_NANO: ::c_uint = 0x2000; +pub const ADJ_TICK: ::c_uint = 0x4000; +pub const ADJ_OFFSET_SINGLESHOT: ::c_uint = 0x8001; +pub const ADJ_OFFSET_SS_READ: ::c_uint = 0xa001; +pub const MOD_OFFSET: ::c_uint = ADJ_OFFSET; +pub const MOD_FREQUENCY: ::c_uint = ADJ_FREQUENCY; +pub const MOD_MAXERROR: ::c_uint = ADJ_MAXERROR; +pub const MOD_ESTERROR: ::c_uint = ADJ_ESTERROR; +pub const MOD_STATUS: ::c_uint = ADJ_STATUS; +pub const MOD_TIMECONST: ::c_uint = ADJ_TIMECONST; +pub const MOD_CLKB: ::c_uint = ADJ_TICK; +pub const MOD_CLKA: ::c_uint = ADJ_OFFSET_SINGLESHOT; +pub const MOD_TAI: ::c_uint = ADJ_TAI; +pub const MOD_MICRO: ::c_uint = ADJ_MICRO; +pub const MOD_NANO: ::c_uint = ADJ_NANO; +pub const STA_PLL: ::c_int = 0x0001; +pub const STA_PPSFREQ: ::c_int = 0x0002; +pub const STA_PPSTIME: ::c_int = 0x0004; +pub const STA_FLL: ::c_int = 0x0008; +pub const STA_INS: ::c_int = 0x0010; +pub const STA_DEL: ::c_int = 0x0020; +pub const STA_UNSYNC: ::c_int = 0x0040; +pub const STA_FREQHOLD: ::c_int = 0x0080; +pub const STA_PPSSIGNAL: ::c_int = 0x0100; +pub const STA_PPSJITTER: ::c_int = 0x0200; +pub const STA_PPSWANDER: ::c_int = 0x0400; +pub const STA_PPSERROR: ::c_int = 0x0800; +pub const STA_CLOCKERR: ::c_int = 0x1000; +pub const STA_NANO: ::c_int = 0x2000; +pub const STA_MODE: ::c_int = 0x4000; +pub const STA_CLK: ::c_int = 0x8000; +pub const STA_RONLY: ::c_int = STA_PPSSIGNAL + | STA_PPSJITTER + | STA_PPSWANDER + | STA_PPSERROR + | STA_CLOCKERR + | STA_NANO + | STA_MODE + | STA_CLK; + +pub const TIME_OK: ::c_int = 0; +pub const TIME_INS: ::c_int = 1; +pub const TIME_DEL: ::c_int = 2; +pub const TIME_OOP: ::c_int = 3; +pub const TIME_WAIT: ::c_int = 4; +pub const TIME_ERROR: ::c_int = 5; +pub const TIME_BAD: ::c_int = TIME_ERROR; +pub const MAXTC: ::c_long = 6; + +cfg_if! { + if #[cfg(target_arch = "s390x")] { + pub const POSIX_FADV_DONTNEED: ::c_int = 6; + pub const POSIX_FADV_NOREUSE: ::c_int = 7; + } else { + pub const POSIX_FADV_DONTNEED: ::c_int = 4; + pub const POSIX_FADV_NOREUSE: ::c_int = 5; + } +} + +extern "C" { + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn prlimit( + pid: ::pid_t, + resource: ::c_int, + new_limit: *const ::rlimit, + old_limit: *mut ::rlimit, + ) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn ptrace(request: ::c_int, ...) -> ::c_long; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + // Musl targets need the `mask` argument of `fanotify_mark` be specified + // `::c_ulonglong` instead of `u64` or there will be a type mismatch between + // `long long unsigned int` and the expected `uint64_t`. + pub fn fanotify_mark( + fd: ::c_int, + flags: ::c_uint, + mask: ::c_ulonglong, + dirfd: ::c_int, + path: *const ::c_char, + ) -> ::c_int; + pub fn getauxval(type_: ::c_ulong) -> ::c_ulong; + + // Added in `musl` 1.1.20 + pub fn explicit_bzero(s: *mut ::c_void, len: ::size_t); + // Added in `musl` 1.2.2 + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn adjtimex(buf: *mut ::timex) -> ::c_int; + pub fn clock_adjtime(clk_id: ::clockid_t, buf: *mut ::timex) -> ::c_int; + + pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; + + pub fn memfd_create(name: *const ::c_char, flags: ::c_uint) -> ::c_int; + pub fn mlock2(addr: *const ::c_void, len: ::size_t, flags: ::c_uint) -> ::c_int; + pub fn malloc_usable_size(ptr: *mut ::c_void) -> ::size_t; + + pub fn euidaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; + pub fn eaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; + + pub fn asctime_r(tm: *const ::tm, buf: *mut ::c_char) -> *mut ::c_char; + + pub fn strftime( + s: *mut ::c_char, + max: ::size_t, + format: *const ::c_char, + tm: *const ::tm, + ) -> ::size_t; + pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char; + + pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; + pub fn basename(path: *mut ::c_char) -> *mut ::c_char; +} + +// Alias to 64 to mimic glibc's LFS64 support +mod lfs64; +pub use self::lfs64::*; + +cfg_if! { + if #[cfg(any(target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "mips64", + target_arch = "powerpc64", + target_arch = "s390x", + target_arch = "riscv64"))] { + mod b64; + pub use self::b64::*; + } else if #[cfg(any(target_arch = "x86", + target_arch = "mips", + target_arch = "powerpc", + target_arch = "hexagon", + target_arch = "riscv32", + target_arch = "arm"))] { + mod b32; + pub use self::b32::*; + } else { } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/no_align.rs new file mode 100644 index 0000000..6f5f2f7 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/no_align.rs @@ -0,0 +1,130 @@ +macro_rules! expand_align { + () => { + s! { + pub struct pthread_mutexattr_t { + #[cfg(any(target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "riscv64", + target_arch = "riscv32", + target_arch = "loongarch64", + all(target_arch = "aarch64", + any(target_env = "musl", target_env = "ohos"))))] + __align: [::c_int; 0], + #[cfg(not(any(target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64", + target_arch = "riscv64", + target_arch = "riscv32", + target_arch = "loongarch64", + all(target_arch = "aarch64", + any(target_env = "musl", target_env = "ohos")))))] + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_rwlockattr_t { + #[cfg(any(target_env = "musl", target_env = "ohos"))] + __align: [::c_int; 0], + #[cfg(not(any(target_env = "musl", target_env = "ohos")))] + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCKATTR_T], + } + + pub struct pthread_condattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + + pub struct pthread_barrierattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_BARRIERATTR_T], + } + + pub struct fanotify_event_metadata { + __align: [::c_long; 0], + pub event_len: __u32, + pub vers: __u8, + pub reserved: __u8, + pub metadata_len: __u16, + pub mask: __u64, + pub fd: ::c_int, + pub pid: ::c_int, + } + } + + s_no_extra_traits! { + pub struct pthread_cond_t { + #[cfg(any(target_env = "musl", target_env = "ohos"))] + __align: [*const ::c_void; 0], + #[cfg(not(any(target_env = "musl", target_env = "ohos")))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + pub struct pthread_mutex_t { + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32")))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32"))))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32")))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32"))))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_barrier_t { + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32")))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "m68k", + target_arch = "powerpc", + target_arch = "sparc", + all(target_arch = "x86_64", + target_pointer_width = "32"))))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_BARRIER_T], + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/non_exhaustive.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/non_exhaustive.rs new file mode 100644 index 0000000..e2e2cb8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/non_exhaustive.rs @@ -0,0 +1,9 @@ +s! { + // linux/openat2.h + #[non_exhaustive] + pub struct open_how { + pub flags: ::__u64, + pub mode: ::__u64, + pub resolve: ::__u64, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs new file mode 100644 index 0000000..e6610bb --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs @@ -0,0 +1,28 @@ +macro_rules! expand_align { + () => { + s! { + #[cfg_attr(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64"), + repr(align(4)))] + #[cfg_attr(not(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64")), + repr(align(8)))] + pub struct pthread_mutexattr_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs new file mode 100644 index 0000000..4a0e074 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs @@ -0,0 +1,13 @@ +s! { + // FIXME this is actually a union + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs new file mode 100644 index 0000000..cff82f0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs @@ -0,0 +1,925 @@ +pub type c_char = u8; +pub type wchar_t = ::c_uint; +pub type c_long = i32; +pub type c_ulong = u32; +pub type time_t = ::c_long; + +pub type clock_t = ::c_long; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type off_t = ::c_long; +pub type pthread_t = ::c_ulong; +pub type suseconds_t = ::c_long; + +pub type nlink_t = ::c_uint; +pub type blksize_t = ::c_long; +pub type blkcnt_t = ::c_long; + +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; + +s! { + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct pthread_attr_t { + __size: [::c_long; 9], + } + + pub struct stat { + pub st_dev: ::c_ulonglong, + __pad1: ::c_ushort, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + __pad2: ::c_ushort, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + __unused4: ::c_ulong, + __unused5: ::c_ulong, + } + + pub struct stat64 + { + pub st_dev: ::c_ulonglong, + pub __pad1: ::c_uint, + pub __st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulonglong, + pub __pad2: ::c_uint, + pub st_size: ::off64_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino64_t, + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } + + pub struct statfs { + pub f_type: ::c_int, + pub f_bsize: ::c_int, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_int, + pub f_frsize: ::c_int, + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + pub struct statfs64 { + pub f_type: ::c_int, + pub f_bsize: ::c_int, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_int, + pub f_frsize: ::c_int, + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct sigset_t { + __val: [::c_ulong; 2], + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_flags: ::c_ulong, + pub sa_restorer: ::Option, + pub sa_mask: sigset_t, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + pub _pad: [::c_int; 29], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + __unused1: ::c_ulong, + pub msg_rtime: ::time_t, + __unused2: ::c_ulong, + pub msg_ctime: ::time_t, + __unused3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong, + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + __unused1: ::c_ulong, + pub shm_dtime: ::time_t, + __unused2: ::c_ulong, + pub shm_ctime: ::time_t, + __unused3: ::c_ulong, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong, + } +} + +pub const O_CLOEXEC: ::c_int = 0o2000000; +pub const __SIZEOF_PTHREAD_ATTR_T: usize = 36; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_COND_COMPAT_T: usize = 12; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const NCCS: usize = 32; + +// I wasn't able to find those constants +// in uclibc build environment for armv7 +pub const MAP_HUGETLB: ::c_int = 0x040000; // from linux/other/mod.rs + +// autogenerated constants with hand tuned types +pub const B0: ::speed_t = 0; +pub const B1000000: ::speed_t = 0x1008; +pub const B110: ::speed_t = 0x3; +pub const B115200: ::speed_t = 0x1002; +pub const B1152000: ::speed_t = 0x1009; +pub const B1200: ::speed_t = 0x9; +pub const B134: ::speed_t = 0x4; +pub const B150: ::speed_t = 0x5; +pub const B1500000: ::speed_t = 0x100a; +pub const B1800: ::speed_t = 0xa; +pub const B19200: ::speed_t = 0xe; +pub const B200: ::speed_t = 0x6; +pub const B2000000: ::speed_t = 0x100b; +pub const B230400: ::speed_t = 0x1003; +pub const B2400: ::speed_t = 0xb; +pub const B2500000: ::speed_t = 0x100c; +pub const B300: ::speed_t = 0x7; +pub const B3000000: ::speed_t = 0x100d; +pub const B3500000: ::speed_t = 0x100e; +pub const B38400: ::speed_t = 0xf; +pub const B4000000: ::speed_t = 0x100f; +pub const B460800: ::speed_t = 0x1004; +pub const B4800: ::speed_t = 0xc; +pub const B50: ::speed_t = 0x1; +pub const B500000: ::speed_t = 0x1005; +pub const B57600: ::speed_t = 0x1001; +pub const B576000: ::speed_t = 0x1006; +pub const B600: ::speed_t = 0x8; +pub const B75: ::speed_t = 0x2; +pub const B921600: ::speed_t = 0x1007; +pub const B9600: ::speed_t = 0xd; +pub const BS1: ::c_int = 0x2000; +pub const BSDLY: ::c_int = 0x2000; +pub const CBAUD: ::tcflag_t = 0x100f; +pub const CBAUDEX: ::tcflag_t = 0x1000; +pub const CIBAUD: ::tcflag_t = 0x100f0000; +pub const CLOCAL: ::tcflag_t = 0x800; +pub const CPU_SETSIZE: ::c_int = 0x400; +pub const CR1: ::c_int = 0x200; +pub const CR2: ::c_int = 0x400; +pub const CR3: ::c_int = 0x600; +pub const CRDLY: ::c_int = 0x600; +pub const CREAD: ::tcflag_t = 0x80; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSIZE: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x40; +pub const EADDRINUSE: ::c_int = 0x62; +pub const EADDRNOTAVAIL: ::c_int = 0x63; +pub const EADV: ::c_int = 0x44; +pub const EAFNOSUPPORT: ::c_int = 0x61; +pub const EALREADY: ::c_int = 0x72; +pub const EBADE: ::c_int = 0x34; +pub const EBADFD: ::c_int = 0x4d; +pub const EBADMSG: ::c_int = 0x4a; +pub const EBADR: ::c_int = 0x35; +pub const EBADRQC: ::c_int = 0x38; +pub const EBADSLT: ::c_int = 0x39; +pub const EBFONT: ::c_int = 0x3b; +pub const ECANCELED: ::c_int = 0x7d; +pub const ECHOCTL: ::tcflag_t = 0x200; +pub const ECHOE: ::tcflag_t = 0x10; +pub const ECHOK: ::tcflag_t = 0x20; +pub const ECHOKE: ::tcflag_t = 0x800; +pub const ECHONL: ::tcflag_t = 0x40; +pub const ECHOPRT: ::tcflag_t = 0x400; +pub const ECHRNG: ::c_int = 0x2c; +pub const ECOMM: ::c_int = 0x46; +pub const ECONNABORTED: ::c_int = 0x67; +pub const ECONNREFUSED: ::c_int = 0x6f; +pub const ECONNRESET: ::c_int = 0x68; +pub const EDEADLK: ::c_int = 0x23; +pub const EDESTADDRREQ: ::c_int = 0x59; +pub const EDOTDOT: ::c_int = 0x49; +pub const EDQUOT: ::c_int = 0x7a; +pub const EFD_CLOEXEC: ::c_int = 0x80000; +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const EHOSTDOWN: ::c_int = 0x70; +pub const EHOSTUNREACH: ::c_int = 0x71; +pub const EHWPOISON: ::c_int = 0x85; +pub const EIDRM: ::c_int = 0x2b; +pub const EILSEQ: ::c_int = 0x54; +pub const EINPROGRESS: ::c_int = 0x73; +pub const EISCONN: ::c_int = 0x6a; +pub const EISNAM: ::c_int = 0x78; +pub const EKEYEXPIRED: ::c_int = 0x7f; +pub const EKEYREJECTED: ::c_int = 0x81; +pub const EKEYREVOKED: ::c_int = 0x80; +pub const EL2HLT: ::c_int = 0x33; +pub const EL2NSYNC: ::c_int = 0x2d; +pub const EL3HLT: ::c_int = 0x2e; +pub const EL3RST: ::c_int = 0x2f; +pub const ELIBACC: ::c_int = 0x4f; +pub const ELIBBAD: ::c_int = 0x50; +pub const ELIBEXEC: ::c_int = 0x53; +pub const ELIBMAX: ::c_int = 0x52; +pub const ELIBSCN: ::c_int = 0x51; +pub const ELNRNG: ::c_int = 0x30; +pub const ELOOP: ::c_int = 0x28; +pub const EMEDIUMTYPE: ::c_int = 0x7c; +pub const EMSGSIZE: ::c_int = 0x5a; +pub const EMULTIHOP: ::c_int = 0x48; +pub const ENAMETOOLONG: ::c_int = 0x24; +pub const ENAVAIL: ::c_int = 0x77; +pub const ENETDOWN: ::c_int = 0x64; +pub const ENETRESET: ::c_int = 0x66; +pub const ENETUNREACH: ::c_int = 0x65; +pub const ENOANO: ::c_int = 0x37; +pub const ENOBUFS: ::c_int = 0x69; +pub const ENOCSI: ::c_int = 0x32; +pub const ENODATA: ::c_int = 0x3d; +pub const ENOKEY: ::c_int = 0x7e; +pub const ENOLCK: ::c_int = 0x25; +pub const ENOLINK: ::c_int = 0x43; +pub const ENOMEDIUM: ::c_int = 0x7b; +pub const ENOMSG: ::c_int = 0x2a; +pub const ENONET: ::c_int = 0x40; +pub const ENOPKG: ::c_int = 0x41; +pub const ENOPROTOOPT: ::c_int = 0x5c; +pub const ENOSR: ::c_int = 0x3f; +pub const ENOSTR: ::c_int = 0x3c; +pub const ENOSYS: ::c_int = 0x26; +pub const ENOTCONN: ::c_int = 0x6b; +pub const ENOTEMPTY: ::c_int = 0x27; +pub const ENOTNAM: ::c_int = 0x76; +pub const ENOTRECOVERABLE: ::c_int = 0x83; +pub const ENOTSOCK: ::c_int = 0x58; +pub const ENOTUNIQ: ::c_int = 0x4c; +pub const EOPNOTSUPP: ::c_int = 0x5f; +pub const EOVERFLOW: ::c_int = 0x4b; +pub const EOWNERDEAD: ::c_int = 0x82; +pub const EPFNOSUPPORT: ::c_int = 0x60; +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; +pub const EPROTO: ::c_int = 0x47; +pub const EPROTONOSUPPORT: ::c_int = 0x5d; +pub const EPROTOTYPE: ::c_int = 0x5b; +pub const EREMCHG: ::c_int = 0x4e; +pub const EREMOTE: ::c_int = 0x42; +pub const EREMOTEIO: ::c_int = 0x79; +pub const ERESTART: ::c_int = 0x55; +pub const ERFKILL: ::c_int = 0x84; +pub const ESHUTDOWN: ::c_int = 0x6c; +pub const ESOCKTNOSUPPORT: ::c_int = 0x5e; +pub const ESRMNT: ::c_int = 0x45; +pub const ESTALE: ::c_int = 0x74; +pub const ESTRPIPE: ::c_int = 0x56; +pub const ETIME: ::c_int = 0x3e; +pub const ETIMEDOUT: ::c_int = 0x6e; +pub const ETOOMANYREFS: ::c_int = 0x6d; +pub const EUCLEAN: ::c_int = 0x75; +pub const EUNATCH: ::c_int = 0x31; +pub const EUSERS: ::c_int = 0x57; +pub const EXFULL: ::c_int = 0x36; +pub const FF1: ::c_int = 0x8000; +pub const FFDLY: ::c_int = 0x8000; +pub const FLUSHO: ::tcflag_t = 0x1000; +pub const F_GETLK: ::c_int = 0x5; +pub const F_SETLK: ::c_int = 0x6; +pub const F_SETLKW: ::c_int = 0x7; +pub const HUPCL: ::tcflag_t = 0x400; +pub const ICANON: ::tcflag_t = 0x2; +pub const IEXTEN: ::tcflag_t = 0x8000; +pub const ISIG: ::tcflag_t = 0x1; +pub const IXOFF: ::tcflag_t = 0x1000; +pub const IXON: ::tcflag_t = 0x400; +pub const MAP_ANON: ::c_int = 0x20; +pub const MAP_ANONYMOUS: ::c_int = 0x20; +pub const MAP_DENYWRITE: ::c_int = 0x800; +pub const MAP_EXECUTABLE: ::c_int = 0x1000; +pub const MAP_GROWSDOWN: ::c_int = 0x100; +pub const MAP_LOCKED: ::c_int = 0x2000; +pub const MAP_NONBLOCK: ::c_int = 0x10000; +pub const MAP_NORESERVE: ::c_int = 0x4000; +pub const MAP_POPULATE: ::c_int = 0x8000; +pub const MAP_STACK: ::c_int = 0x20000; +pub const NLDLY: ::tcflag_t = 0x100; +pub const NOFLSH: ::tcflag_t = 0x80; +pub const OLCUC: ::tcflag_t = 0x2; +pub const ONLCR: ::tcflag_t = 0x4; +pub const O_ACCMODE: ::c_int = 0x3; +pub const O_APPEND: ::c_int = 0x400; +pub const O_ASYNC: ::c_int = 0o20000; +pub const O_CREAT: ::c_int = 0x40; +pub const O_DIRECT: ::c_int = 0x10000; +pub const O_DIRECTORY: ::c_int = 0x4000; +pub const O_DSYNC: ::c_int = O_SYNC; +pub const O_EXCL: ::c_int = 0x80; +pub const O_FSYNC: ::c_int = O_SYNC; +pub const O_LARGEFILE: ::c_int = 0o400000; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const O_NOATIME: ::c_int = 0o1000000; +pub const O_NOCTTY: ::c_int = 0x100; +pub const O_NOFOLLOW: ::c_int = 0x8000; +pub const O_NONBLOCK: ::c_int = 0x800; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_RSYNC: ::c_int = O_SYNC; +pub const O_SYNC: ::c_int = 0o10000; +pub const O_TRUNC: ::c_int = 0x200; +pub const PARENB: ::tcflag_t = 0x100; +pub const PARODD: ::tcflag_t = 0x200; +pub const PENDIN: ::tcflag_t = 0x4000; +pub const POLLWRBAND: ::c_short = 0x200; +pub const POLLWRNORM: ::c_short = 0x100; +pub const PTHREAD_STACK_MIN: ::size_t = 16384; +pub const RTLD_GLOBAL: ::c_int = 0x00100; +pub const PIDFD_NONBLOCK: ::c_int = 0x800; + +// These are typed unsigned to match sigaction +pub const SA_NOCLDSTOP: ::c_ulong = 0x1; +pub const SA_NOCLDWAIT: ::c_ulong = 0x2; +pub const SA_SIGINFO: ::c_ulong = 0x4; +pub const SA_NODEFER: ::c_ulong = 0x40000000; +pub const SA_ONSTACK: ::c_ulong = 0x8000000; +pub const SA_RESETHAND: ::c_ulong = 0x80000000; +pub const SA_RESTART: ::c_ulong = 0x10000000; + +pub const SFD_CLOEXEC: ::c_int = 0x80000; +pub const SFD_NONBLOCK: ::c_int = 0x800; +pub const SIGBUS: ::c_int = 0x7; +pub const SIGCHLD: ::c_int = 0x11; +pub const SIGCONT: ::c_int = 0x12; +pub const SIGIO: ::c_int = 0x1d; +pub const SIGPROF: ::c_int = 0x1b; +pub const SIGPWR: ::c_int = 0x1e; +pub const SIGSTKFLT: ::c_int = 0x10; +pub const SIGSTKSZ: ::size_t = 8192; +pub const SIGSTOP: ::c_int = 0x13; +pub const SIGSYS: ::c_int = 0x1f; +pub const SIGTSTP: ::c_int = 0x14; +pub const SIGTTIN: ::c_int = 0x15; +pub const SIGTTOU: ::c_int = 0x16; +pub const SIGURG: ::c_int = 0x17; +pub const SIGUSR1: ::c_int = 0xa; +pub const SIGUSR2: ::c_int = 0xc; +pub const SIGVTALRM: ::c_int = 0x1a; +pub const SIGWINCH: ::c_int = 0x1c; +pub const SIGXCPU: ::c_int = 0x18; +pub const SIGXFSZ: ::c_int = 0x19; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_SETMASK: ::c_int = 0x2; +pub const SIG_UNBLOCK: ::c_int = 0x1; +pub const SOCK_DGRAM: ::c_int = 0x2; +pub const SOCK_NONBLOCK: ::c_int = 0o0004000; +pub const SOCK_SEQPACKET: ::c_int = 0x5; +pub const SOCK_STREAM: ::c_int = 0x1; + +pub const TAB1: ::c_int = 0x800; +pub const TAB2: ::c_int = 0x1000; +pub const TAB3: ::c_int = 0x1800; +pub const TABDLY: ::c_int = 0x1800; +pub const TCSADRAIN: ::c_int = 0x1; +pub const TCSAFLUSH: ::c_int = 0x2; +pub const TCSANOW: ::c_int = 0; +pub const TOSTOP: ::tcflag_t = 0x100; +pub const VDISCARD: usize = 0xd; +pub const VEOF: usize = 0x4; +pub const VEOL: usize = 0xb; +pub const VEOL2: usize = 0x10; +pub const VMIN: usize = 0x6; +pub const VREPRINT: usize = 0xc; +pub const VSTART: usize = 0x8; +pub const VSTOP: usize = 0x9; +pub const VSUSP: usize = 0xa; +pub const VSWTC: usize = 0x7; +pub const VT1: ::c_int = 0x4000; +pub const VTDLY: ::c_int = 0x4000; +pub const VTIME: usize = 0x5; +pub const VWERASE: usize = 0xe; +pub const XTABS: ::tcflag_t = 0x1800; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; + +// Syscall table is copied from src/unix/notbsd/linux/musl/b32/arm.rs +pub const SYS_restart_syscall: ::c_long = 0; +pub const SYS_exit: ::c_long = 1; +pub const SYS_fork: ::c_long = 2; +pub const SYS_read: ::c_long = 3; +pub const SYS_write: ::c_long = 4; +pub const SYS_open: ::c_long = 5; +pub const SYS_close: ::c_long = 6; +pub const SYS_creat: ::c_long = 8; +pub const SYS_link: ::c_long = 9; +pub const SYS_unlink: ::c_long = 10; +pub const SYS_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lchown: ::c_long = 16; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_setuid: ::c_long = 23; +pub const SYS_getuid: ::c_long = 24; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_pause: ::c_long = 29; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::c_long = 40; +pub const SYS_dup: ::c_long = 41; +pub const SYS_pipe: ::c_long = 42; +pub const SYS_times: ::c_long = 43; +pub const SYS_brk: ::c_long = 45; +pub const SYS_setgid: ::c_long = 46; +pub const SYS_getgid: ::c_long = 47; +pub const SYS_geteuid: ::c_long = 49; +pub const SYS_getegid: ::c_long = 50; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_setreuid: ::c_long = 70; +pub const SYS_setregid: ::c_long = 71; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_getgroups: ::c_long = 80; +pub const SYS_setgroups: ::c_long = 81; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_fchown: ::c_long = 95; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_setfsuid: ::c_long = 138; +pub const SYS_setfsgid: ::c_long = 139; +pub const SYS__llseek: ::c_long = 140; +pub const SYS_getdents: ::c_long = 141; +pub const SYS__newselect: ::c_long = 142; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_setresuid: ::c_long = 164; +pub const SYS_getresuid: ::c_long = 165; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_setresgid: ::c_long = 170; +pub const SYS_getresgid: ::c_long = 171; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_chown: ::c_long = 182; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_ugetrlimit: ::c_long = 191; +pub const SYS_mmap2: ::c_long = 192; +pub const SYS_truncate64: ::c_long = 193; +pub const SYS_ftruncate64: ::c_long = 194; +pub const SYS_stat64: ::c_long = 195; +pub const SYS_lstat64: ::c_long = 196; +pub const SYS_fstat64: ::c_long = 197; +pub const SYS_lchown32: ::c_long = 198; +pub const SYS_getuid32: ::c_long = 199; +pub const SYS_getgid32: ::c_long = 200; +pub const SYS_geteuid32: ::c_long = 201; +pub const SYS_getegid32: ::c_long = 202; +pub const SYS_setreuid32: ::c_long = 203; +pub const SYS_setregid32: ::c_long = 204; +pub const SYS_getgroups32: ::c_long = 205; +pub const SYS_setgroups32: ::c_long = 206; +pub const SYS_fchown32: ::c_long = 207; +pub const SYS_setresuid32: ::c_long = 208; +pub const SYS_getresuid32: ::c_long = 209; +pub const SYS_setresgid32: ::c_long = 210; +pub const SYS_getresgid32: ::c_long = 211; +pub const SYS_chown32: ::c_long = 212; +pub const SYS_setuid32: ::c_long = 213; +pub const SYS_setgid32: ::c_long = 214; +pub const SYS_setfsuid32: ::c_long = 215; +pub const SYS_setfsgid32: ::c_long = 216; +pub const SYS_getdents64: ::c_long = 217; +pub const SYS_pivot_root: ::c_long = 218; +pub const SYS_mincore: ::c_long = 219; +pub const SYS_madvise: ::c_long = 220; +pub const SYS_fcntl64: ::c_long = 221; +pub const SYS_gettid: ::c_long = 224; +pub const SYS_readahead: ::c_long = 225; +pub const SYS_setxattr: ::c_long = 226; +pub const SYS_lsetxattr: ::c_long = 227; +pub const SYS_fsetxattr: ::c_long = 228; +pub const SYS_getxattr: ::c_long = 229; +pub const SYS_lgetxattr: ::c_long = 230; +pub const SYS_fgetxattr: ::c_long = 231; +pub const SYS_listxattr: ::c_long = 232; +pub const SYS_llistxattr: ::c_long = 233; +pub const SYS_flistxattr: ::c_long = 234; +pub const SYS_removexattr: ::c_long = 235; +pub const SYS_lremovexattr: ::c_long = 236; +pub const SYS_fremovexattr: ::c_long = 237; +pub const SYS_tkill: ::c_long = 238; +pub const SYS_sendfile64: ::c_long = 239; +pub const SYS_futex: ::c_long = 240; +pub const SYS_sched_setaffinity: ::c_long = 241; +pub const SYS_sched_getaffinity: ::c_long = 242; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_lookup_dcookie: ::c_long = 249; +pub const SYS_epoll_create: ::c_long = 250; +pub const SYS_epoll_ctl: ::c_long = 251; +pub const SYS_epoll_wait: ::c_long = 252; +pub const SYS_remap_file_pages: ::c_long = 253; +pub const SYS_set_tid_address: ::c_long = 256; +pub const SYS_timer_create: ::c_long = 257; +pub const SYS_timer_settime: ::c_long = 258; +pub const SYS_timer_gettime: ::c_long = 259; +pub const SYS_timer_getoverrun: ::c_long = 260; +pub const SYS_timer_delete: ::c_long = 261; +pub const SYS_clock_settime: ::c_long = 262; +pub const SYS_clock_gettime: ::c_long = 263; +pub const SYS_clock_getres: ::c_long = 264; +pub const SYS_clock_nanosleep: ::c_long = 265; +pub const SYS_statfs64: ::c_long = 266; +pub const SYS_fstatfs64: ::c_long = 267; +pub const SYS_tgkill: ::c_long = 268; +pub const SYS_utimes: ::c_long = 269; +pub const SYS_pciconfig_iobase: ::c_long = 271; +pub const SYS_pciconfig_read: ::c_long = 272; +pub const SYS_pciconfig_write: ::c_long = 273; +pub const SYS_mq_open: ::c_long = 274; +pub const SYS_mq_unlink: ::c_long = 275; +pub const SYS_mq_timedsend: ::c_long = 276; +pub const SYS_mq_timedreceive: ::c_long = 277; +pub const SYS_mq_notify: ::c_long = 278; +pub const SYS_mq_getsetattr: ::c_long = 279; +pub const SYS_waitid: ::c_long = 280; +pub const SYS_socket: ::c_long = 281; +pub const SYS_bind: ::c_long = 282; +pub const SYS_connect: ::c_long = 283; +pub const SYS_listen: ::c_long = 284; +pub const SYS_accept: ::c_long = 285; +pub const SYS_getsockname: ::c_long = 286; +pub const SYS_getpeername: ::c_long = 287; +pub const SYS_socketpair: ::c_long = 288; +pub const SYS_send: ::c_long = 289; +pub const SYS_sendto: ::c_long = 290; +pub const SYS_recv: ::c_long = 291; +pub const SYS_recvfrom: ::c_long = 292; +pub const SYS_shutdown: ::c_long = 293; +pub const SYS_setsockopt: ::c_long = 294; +pub const SYS_getsockopt: ::c_long = 295; +pub const SYS_sendmsg: ::c_long = 296; +pub const SYS_recvmsg: ::c_long = 297; +pub const SYS_semop: ::c_long = 298; +pub const SYS_semget: ::c_long = 299; +pub const SYS_semctl: ::c_long = 300; +pub const SYS_msgsnd: ::c_long = 301; +pub const SYS_msgrcv: ::c_long = 302; +pub const SYS_msgget: ::c_long = 303; +pub const SYS_msgctl: ::c_long = 304; +pub const SYS_shmat: ::c_long = 305; +pub const SYS_shmdt: ::c_long = 306; +pub const SYS_shmget: ::c_long = 307; +pub const SYS_shmctl: ::c_long = 308; +pub const SYS_add_key: ::c_long = 309; +pub const SYS_request_key: ::c_long = 310; +pub const SYS_keyctl: ::c_long = 311; +pub const SYS_semtimedop: ::c_long = 312; +pub const SYS_vserver: ::c_long = 313; +pub const SYS_ioprio_set: ::c_long = 314; +pub const SYS_ioprio_get: ::c_long = 315; +pub const SYS_inotify_init: ::c_long = 316; +pub const SYS_inotify_add_watch: ::c_long = 317; +pub const SYS_inotify_rm_watch: ::c_long = 318; +pub const SYS_mbind: ::c_long = 319; +pub const SYS_get_mempolicy: ::c_long = 320; +pub const SYS_set_mempolicy: ::c_long = 321; +pub const SYS_openat: ::c_long = 322; +pub const SYS_mkdirat: ::c_long = 323; +pub const SYS_mknodat: ::c_long = 324; +pub const SYS_fchownat: ::c_long = 325; +pub const SYS_futimesat: ::c_long = 326; +pub const SYS_fstatat64: ::c_long = 327; +pub const SYS_unlinkat: ::c_long = 328; +pub const SYS_renameat: ::c_long = 329; +pub const SYS_linkat: ::c_long = 330; +pub const SYS_symlinkat: ::c_long = 331; +pub const SYS_readlinkat: ::c_long = 332; +pub const SYS_fchmodat: ::c_long = 333; +pub const SYS_faccessat: ::c_long = 334; +pub const SYS_pselect6: ::c_long = 335; +pub const SYS_ppoll: ::c_long = 336; +pub const SYS_unshare: ::c_long = 337; +pub const SYS_set_robust_list: ::c_long = 338; +pub const SYS_get_robust_list: ::c_long = 339; +pub const SYS_splice: ::c_long = 340; +pub const SYS_tee: ::c_long = 342; +pub const SYS_vmsplice: ::c_long = 343; +pub const SYS_move_pages: ::c_long = 344; +pub const SYS_getcpu: ::c_long = 345; +pub const SYS_epoll_pwait: ::c_long = 346; +pub const SYS_kexec_load: ::c_long = 347; +pub const SYS_utimensat: ::c_long = 348; +pub const SYS_signalfd: ::c_long = 349; +pub const SYS_timerfd_create: ::c_long = 350; +pub const SYS_eventfd: ::c_long = 351; +pub const SYS_fallocate: ::c_long = 352; +pub const SYS_timerfd_settime: ::c_long = 353; +pub const SYS_timerfd_gettime: ::c_long = 354; +pub const SYS_signalfd4: ::c_long = 355; +pub const SYS_eventfd2: ::c_long = 356; +pub const SYS_epoll_create1: ::c_long = 357; +pub const SYS_dup3: ::c_long = 358; +pub const SYS_pipe2: ::c_long = 359; +pub const SYS_inotify_init1: ::c_long = 360; +pub const SYS_preadv: ::c_long = 361; +pub const SYS_pwritev: ::c_long = 362; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 363; +pub const SYS_perf_event_open: ::c_long = 364; +pub const SYS_recvmmsg: ::c_long = 365; +pub const SYS_accept4: ::c_long = 366; +pub const SYS_fanotify_init: ::c_long = 367; +pub const SYS_fanotify_mark: ::c_long = 368; +pub const SYS_prlimit64: ::c_long = 369; +pub const SYS_name_to_handle_at: ::c_long = 370; +pub const SYS_open_by_handle_at: ::c_long = 371; +pub const SYS_clock_adjtime: ::c_long = 372; +pub const SYS_syncfs: ::c_long = 373; +pub const SYS_sendmmsg: ::c_long = 374; +pub const SYS_setns: ::c_long = 375; +pub const SYS_process_vm_readv: ::c_long = 376; +pub const SYS_process_vm_writev: ::c_long = 377; +pub const SYS_kcmp: ::c_long = 378; +pub const SYS_finit_module: ::c_long = 379; +pub const SYS_sched_setattr: ::c_long = 380; +pub const SYS_sched_getattr: ::c_long = 381; +pub const SYS_renameat2: ::c_long = 382; +pub const SYS_seccomp: ::c_long = 383; +pub const SYS_getrandom: ::c_long = 384; +pub const SYS_memfd_create: ::c_long = 385; +pub const SYS_bpf: ::c_long = 386; +pub const SYS_execveat: ::c_long = 387; +pub const SYS_userfaultfd: ::c_long = 388; +pub const SYS_membarrier: ::c_long = 389; +pub const SYS_mlock2: ::c_long = 390; +pub const SYS_copy_file_range: ::c_long = 391; +pub const SYS_preadv2: ::c_long = 392; +pub const SYS_pwritev2: ::c_long = 393; +pub const SYS_pkey_mprotect: ::c_long = 394; +pub const SYS_pkey_alloc: ::c_long = 395; +pub const SYS_pkey_free: ::c_long = 396; +// FIXME: should be a `c_long` too, but a bug slipped in. +pub const SYS_statx: ::c_int = 397; +pub const SYS_pidfd_send_signal: ::c_long = 424; +pub const SYS_io_uring_setup: ::c_long = 425; +pub const SYS_io_uring_enter: ::c_long = 426; +pub const SYS_io_uring_register: ::c_long = 427; +pub const SYS_open_tree: ::c_long = 428; +pub const SYS_move_mount: ::c_long = 429; +pub const SYS_fsopen: ::c_long = 430; +pub const SYS_fsconfig: ::c_long = 431; +pub const SYS_fsmount: ::c_long = 432; +pub const SYS_fspick: ::c_long = 433; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; +pub const SYS_close_range: ::c_long = 436; +pub const SYS_openat2: ::c_long = 437; +pub const SYS_pidfd_getfd: ::c_long = 438; +pub const SYS_faccessat2: ::c_long = 439; +pub const SYS_process_madvise: ::c_long = 440; +pub const SYS_epoll_pwait2: ::c_long = 441; +pub const SYS_mount_setattr: ::c_long = 442; +pub const SYS_quotactl_fd: ::c_long = 443; +pub const SYS_landlock_create_ruleset: ::c_long = 444; +pub const SYS_landlock_add_rule: ::c_long = 445; +pub const SYS_landlock_restrict_self: ::c_long = 446; +pub const SYS_memfd_secret: ::c_long = 447; +pub const SYS_process_mrelease: ::c_long = 448; +pub const SYS_futex_waitv: ::c_long = 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 450; + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } else { + mod no_align; + pub use self::no_align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs new file mode 100644 index 0000000..e32bf67 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs @@ -0,0 +1,10 @@ +s! { + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs new file mode 100644 index 0000000..4a0e074 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs @@ -0,0 +1,13 @@ +s! { + // FIXME this is actually a union + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs new file mode 100644 index 0000000..a5aca85 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs @@ -0,0 +1,692 @@ +pub type c_char = i8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type clock_t = i32; +pub type time_t = i32; +pub type suseconds_t = i32; +pub type wchar_t = i32; +pub type off_t = i32; +pub type ino_t = u32; +pub type blkcnt_t = i32; +pub type blksize_t = i32; +pub type nlink_t = u32; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type __u64 = ::c_ulonglong; +pub type __s64 = ::c_longlong; +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; + +s! { + pub struct stat { + pub st_dev: ::dev_t, + st_pad1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_pad2: [::c_long; 1], + pub st_size: ::off_t, + st_pad3: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + st_pad5: [::c_long; 14], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + st_pad1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 14], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_favail: ::fsfilcnt64_t, + pub f_fsid: ::c_ulong, + pub __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + + pub struct pthread_attr_t { + __size: [u32; 9] + } + + pub struct sigaction { + pub sa_flags: ::c_uint, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + _restorer: *mut ::c_void, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sigset_t { + __val: [::c_ulong; 4], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + pub _pad: [::c_int; 29], + } + + pub struct glob64_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + #[cfg(target_endian = "big")] + __glibc_reserved1: ::c_ulong, + pub msg_stime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved1: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved2: ::c_ulong, + pub msg_rtime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved2: ::c_ulong, + #[cfg(target_endian = "big")] + __glibc_reserved3: ::c_ulong, + pub msg_ctime: ::time_t, + #[cfg(target_endian = "little")] + __glibc_reserved3: ::c_ulong, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_files: ::fsblkcnt64_t, + pub f_ffree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 5], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_sysid: ::c_long, + pub l_pid: ::pid_t, + pad: [::c_long; 4], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } +} + +pub const __SIZEOF_PTHREAD_ATTR_T: usize = 36; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; + +pub const SYS_syscall: ::c_long = 4000 + 0; +pub const SYS_exit: ::c_long = 4000 + 1; +pub const SYS_fork: ::c_long = 4000 + 2; +pub const SYS_read: ::c_long = 4000 + 3; +pub const SYS_write: ::c_long = 4000 + 4; +pub const SYS_open: ::c_long = 4000 + 5; +pub const SYS_close: ::c_long = 4000 + 6; +pub const SYS_waitpid: ::c_long = 4000 + 7; +pub const SYS_creat: ::c_long = 4000 + 8; +pub const SYS_link: ::c_long = 4000 + 9; +pub const SYS_unlink: ::c_long = 4000 + 10; +pub const SYS_execve: ::c_long = 4000 + 11; +pub const SYS_chdir: ::c_long = 4000 + 12; +pub const SYS_time: ::c_long = 4000 + 13; +pub const SYS_mknod: ::c_long = 4000 + 14; +pub const SYS_chmod: ::c_long = 4000 + 15; +pub const SYS_lchown: ::c_long = 4000 + 16; +pub const SYS_break: ::c_long = 4000 + 17; +pub const SYS_lseek: ::c_long = 4000 + 19; +pub const SYS_getpid: ::c_long = 4000 + 20; +pub const SYS_mount: ::c_long = 4000 + 21; +pub const SYS_umount: ::c_long = 4000 + 22; +pub const SYS_setuid: ::c_long = 4000 + 23; +pub const SYS_getuid: ::c_long = 4000 + 24; +pub const SYS_stime: ::c_long = 4000 + 25; +pub const SYS_ptrace: ::c_long = 4000 + 26; +pub const SYS_alarm: ::c_long = 4000 + 27; +pub const SYS_pause: ::c_long = 4000 + 29; +pub const SYS_utime: ::c_long = 4000 + 30; +pub const SYS_stty: ::c_long = 4000 + 31; +pub const SYS_gtty: ::c_long = 4000 + 32; +pub const SYS_access: ::c_long = 4000 + 33; +pub const SYS_nice: ::c_long = 4000 + 34; +pub const SYS_ftime: ::c_long = 4000 + 35; +pub const SYS_sync: ::c_long = 4000 + 36; +pub const SYS_kill: ::c_long = 4000 + 37; +pub const SYS_rename: ::c_long = 4000 + 38; +pub const SYS_mkdir: ::c_long = 4000 + 39; +pub const SYS_rmdir: ::c_long = 4000 + 40; +pub const SYS_dup: ::c_long = 4000 + 41; +pub const SYS_pipe: ::c_long = 4000 + 42; +pub const SYS_times: ::c_long = 4000 + 43; +pub const SYS_prof: ::c_long = 4000 + 44; +pub const SYS_brk: ::c_long = 4000 + 45; +pub const SYS_setgid: ::c_long = 4000 + 46; +pub const SYS_getgid: ::c_long = 4000 + 47; +pub const SYS_signal: ::c_long = 4000 + 48; +pub const SYS_geteuid: ::c_long = 4000 + 49; +pub const SYS_getegid: ::c_long = 4000 + 50; +pub const SYS_acct: ::c_long = 4000 + 51; +pub const SYS_umount2: ::c_long = 4000 + 52; +pub const SYS_lock: ::c_long = 4000 + 53; +pub const SYS_ioctl: ::c_long = 4000 + 54; +pub const SYS_fcntl: ::c_long = 4000 + 55; +pub const SYS_mpx: ::c_long = 4000 + 56; +pub const SYS_setpgid: ::c_long = 4000 + 57; +pub const SYS_ulimit: ::c_long = 4000 + 58; +pub const SYS_umask: ::c_long = 4000 + 60; +pub const SYS_chroot: ::c_long = 4000 + 61; +pub const SYS_ustat: ::c_long = 4000 + 62; +pub const SYS_dup2: ::c_long = 4000 + 63; +pub const SYS_getppid: ::c_long = 4000 + 64; +pub const SYS_getpgrp: ::c_long = 4000 + 65; +pub const SYS_setsid: ::c_long = 4000 + 66; +pub const SYS_sigaction: ::c_long = 4000 + 67; +pub const SYS_sgetmask: ::c_long = 4000 + 68; +pub const SYS_ssetmask: ::c_long = 4000 + 69; +pub const SYS_setreuid: ::c_long = 4000 + 70; +pub const SYS_setregid: ::c_long = 4000 + 71; +pub const SYS_sigsuspend: ::c_long = 4000 + 72; +pub const SYS_sigpending: ::c_long = 4000 + 73; +pub const SYS_sethostname: ::c_long = 4000 + 74; +pub const SYS_setrlimit: ::c_long = 4000 + 75; +pub const SYS_getrlimit: ::c_long = 4000 + 76; +pub const SYS_getrusage: ::c_long = 4000 + 77; +pub const SYS_gettimeofday: ::c_long = 4000 + 78; +pub const SYS_settimeofday: ::c_long = 4000 + 79; +pub const SYS_getgroups: ::c_long = 4000 + 80; +pub const SYS_setgroups: ::c_long = 4000 + 81; +pub const SYS_symlink: ::c_long = 4000 + 83; +pub const SYS_readlink: ::c_long = 4000 + 85; +pub const SYS_uselib: ::c_long = 4000 + 86; +pub const SYS_swapon: ::c_long = 4000 + 87; +pub const SYS_reboot: ::c_long = 4000 + 88; +pub const SYS_readdir: ::c_long = 4000 + 89; +pub const SYS_mmap: ::c_long = 4000 + 90; +pub const SYS_munmap: ::c_long = 4000 + 91; +pub const SYS_truncate: ::c_long = 4000 + 92; +pub const SYS_ftruncate: ::c_long = 4000 + 93; +pub const SYS_fchmod: ::c_long = 4000 + 94; +pub const SYS_fchown: ::c_long = 4000 + 95; +pub const SYS_getpriority: ::c_long = 4000 + 96; +pub const SYS_setpriority: ::c_long = 4000 + 97; +pub const SYS_profil: ::c_long = 4000 + 98; +pub const SYS_statfs: ::c_long = 4000 + 99; +pub const SYS_fstatfs: ::c_long = 4000 + 100; +pub const SYS_ioperm: ::c_long = 4000 + 101; +pub const SYS_socketcall: ::c_long = 4000 + 102; +pub const SYS_syslog: ::c_long = 4000 + 103; +pub const SYS_setitimer: ::c_long = 4000 + 104; +pub const SYS_getitimer: ::c_long = 4000 + 105; +pub const SYS_stat: ::c_long = 4000 + 106; +pub const SYS_lstat: ::c_long = 4000 + 107; +pub const SYS_fstat: ::c_long = 4000 + 108; +pub const SYS_iopl: ::c_long = 4000 + 110; +pub const SYS_vhangup: ::c_long = 4000 + 111; +pub const SYS_idle: ::c_long = 4000 + 112; +pub const SYS_vm86: ::c_long = 4000 + 113; +pub const SYS_wait4: ::c_long = 4000 + 114; +pub const SYS_swapoff: ::c_long = 4000 + 115; +pub const SYS_sysinfo: ::c_long = 4000 + 116; +pub const SYS_ipc: ::c_long = 4000 + 117; +pub const SYS_fsync: ::c_long = 4000 + 118; +pub const SYS_sigreturn: ::c_long = 4000 + 119; +pub const SYS_clone: ::c_long = 4000 + 120; +pub const SYS_setdomainname: ::c_long = 4000 + 121; +pub const SYS_uname: ::c_long = 4000 + 122; +pub const SYS_modify_ldt: ::c_long = 4000 + 123; +pub const SYS_adjtimex: ::c_long = 4000 + 124; +pub const SYS_mprotect: ::c_long = 4000 + 125; +pub const SYS_sigprocmask: ::c_long = 4000 + 126; +pub const SYS_create_module: ::c_long = 4000 + 127; +pub const SYS_init_module: ::c_long = 4000 + 128; +pub const SYS_delete_module: ::c_long = 4000 + 129; +pub const SYS_get_kernel_syms: ::c_long = 4000 + 130; +pub const SYS_quotactl: ::c_long = 4000 + 131; +pub const SYS_getpgid: ::c_long = 4000 + 132; +pub const SYS_fchdir: ::c_long = 4000 + 133; +pub const SYS_bdflush: ::c_long = 4000 + 134; +pub const SYS_sysfs: ::c_long = 4000 + 135; +pub const SYS_personality: ::c_long = 4000 + 136; +pub const SYS_afs_syscall: ::c_long = 4000 + 137; +pub const SYS_setfsuid: ::c_long = 4000 + 138; +pub const SYS_setfsgid: ::c_long = 4000 + 139; +pub const SYS__llseek: ::c_long = 4000 + 140; +pub const SYS_getdents: ::c_long = 4000 + 141; +pub const SYS__newselect: ::c_long = 4000 + 142; +pub const SYS_flock: ::c_long = 4000 + 143; +pub const SYS_msync: ::c_long = 4000 + 144; +pub const SYS_readv: ::c_long = 4000 + 145; +pub const SYS_writev: ::c_long = 4000 + 146; +pub const SYS_cacheflush: ::c_long = 4000 + 147; +pub const SYS_cachectl: ::c_long = 4000 + 148; +pub const SYS_sysmips: ::c_long = 4000 + 149; +pub const SYS_getsid: ::c_long = 4000 + 151; +pub const SYS_fdatasync: ::c_long = 4000 + 152; +pub const SYS__sysctl: ::c_long = 4000 + 153; +pub const SYS_mlock: ::c_long = 4000 + 154; +pub const SYS_munlock: ::c_long = 4000 + 155; +pub const SYS_mlockall: ::c_long = 4000 + 156; +pub const SYS_munlockall: ::c_long = 4000 + 157; +pub const SYS_sched_setparam: ::c_long = 4000 + 158; +pub const SYS_sched_getparam: ::c_long = 4000 + 159; +pub const SYS_sched_setscheduler: ::c_long = 4000 + 160; +pub const SYS_sched_getscheduler: ::c_long = 4000 + 161; +pub const SYS_sched_yield: ::c_long = 4000 + 162; +pub const SYS_sched_get_priority_max: ::c_long = 4000 + 163; +pub const SYS_sched_get_priority_min: ::c_long = 4000 + 164; +pub const SYS_sched_rr_get_interval: ::c_long = 4000 + 165; +pub const SYS_nanosleep: ::c_long = 4000 + 166; +pub const SYS_mremap: ::c_long = 4000 + 167; +pub const SYS_accept: ::c_long = 4000 + 168; +pub const SYS_bind: ::c_long = 4000 + 169; +pub const SYS_connect: ::c_long = 4000 + 170; +pub const SYS_getpeername: ::c_long = 4000 + 171; +pub const SYS_getsockname: ::c_long = 4000 + 172; +pub const SYS_getsockopt: ::c_long = 4000 + 173; +pub const SYS_listen: ::c_long = 4000 + 174; +pub const SYS_recv: ::c_long = 4000 + 175; +pub const SYS_recvfrom: ::c_long = 4000 + 176; +pub const SYS_recvmsg: ::c_long = 4000 + 177; +pub const SYS_send: ::c_long = 4000 + 178; +pub const SYS_sendmsg: ::c_long = 4000 + 179; +pub const SYS_sendto: ::c_long = 4000 + 180; +pub const SYS_setsockopt: ::c_long = 4000 + 181; +pub const SYS_shutdown: ::c_long = 4000 + 182; +pub const SYS_socket: ::c_long = 4000 + 183; +pub const SYS_socketpair: ::c_long = 4000 + 184; +pub const SYS_setresuid: ::c_long = 4000 + 185; +pub const SYS_getresuid: ::c_long = 4000 + 186; +pub const SYS_query_module: ::c_long = 4000 + 187; +pub const SYS_poll: ::c_long = 4000 + 188; +pub const SYS_nfsservctl: ::c_long = 4000 + 189; +pub const SYS_setresgid: ::c_long = 4000 + 190; +pub const SYS_getresgid: ::c_long = 4000 + 191; +pub const SYS_prctl: ::c_long = 4000 + 192; +pub const SYS_rt_sigreturn: ::c_long = 4000 + 193; +pub const SYS_rt_sigaction: ::c_long = 4000 + 194; +pub const SYS_rt_sigprocmask: ::c_long = 4000 + 195; +pub const SYS_rt_sigpending: ::c_long = 4000 + 196; +pub const SYS_rt_sigtimedwait: ::c_long = 4000 + 197; +pub const SYS_rt_sigqueueinfo: ::c_long = 4000 + 198; +pub const SYS_rt_sigsuspend: ::c_long = 4000 + 199; +pub const SYS_pread64: ::c_long = 4000 + 200; +pub const SYS_pwrite64: ::c_long = 4000 + 201; +pub const SYS_chown: ::c_long = 4000 + 202; +pub const SYS_getcwd: ::c_long = 4000 + 203; +pub const SYS_capget: ::c_long = 4000 + 204; +pub const SYS_capset: ::c_long = 4000 + 205; +pub const SYS_sigaltstack: ::c_long = 4000 + 206; +pub const SYS_sendfile: ::c_long = 4000 + 207; +pub const SYS_getpmsg: ::c_long = 4000 + 208; +pub const SYS_putpmsg: ::c_long = 4000 + 209; +pub const SYS_mmap2: ::c_long = 4000 + 210; +pub const SYS_truncate64: ::c_long = 4000 + 211; +pub const SYS_ftruncate64: ::c_long = 4000 + 212; +pub const SYS_stat64: ::c_long = 4000 + 213; +pub const SYS_lstat64: ::c_long = 4000 + 214; +pub const SYS_fstat64: ::c_long = 4000 + 215; +pub const SYS_pivot_root: ::c_long = 4000 + 216; +pub const SYS_mincore: ::c_long = 4000 + 217; +pub const SYS_madvise: ::c_long = 4000 + 218; +pub const SYS_getdents64: ::c_long = 4000 + 219; +pub const SYS_fcntl64: ::c_long = 4000 + 220; +pub const SYS_gettid: ::c_long = 4000 + 222; +pub const SYS_readahead: ::c_long = 4000 + 223; +pub const SYS_setxattr: ::c_long = 4000 + 224; +pub const SYS_lsetxattr: ::c_long = 4000 + 225; +pub const SYS_fsetxattr: ::c_long = 4000 + 226; +pub const SYS_getxattr: ::c_long = 4000 + 227; +pub const SYS_lgetxattr: ::c_long = 4000 + 228; +pub const SYS_fgetxattr: ::c_long = 4000 + 229; +pub const SYS_listxattr: ::c_long = 4000 + 230; +pub const SYS_llistxattr: ::c_long = 4000 + 231; +pub const SYS_flistxattr: ::c_long = 4000 + 232; +pub const SYS_removexattr: ::c_long = 4000 + 233; +pub const SYS_lremovexattr: ::c_long = 4000 + 234; +pub const SYS_fremovexattr: ::c_long = 4000 + 235; +pub const SYS_tkill: ::c_long = 4000 + 236; +pub const SYS_sendfile64: ::c_long = 4000 + 237; +pub const SYS_futex: ::c_long = 4000 + 238; +pub const SYS_sched_setaffinity: ::c_long = 4000 + 239; +pub const SYS_sched_getaffinity: ::c_long = 4000 + 240; +pub const SYS_io_setup: ::c_long = 4000 + 241; +pub const SYS_io_destroy: ::c_long = 4000 + 242; +pub const SYS_io_getevents: ::c_long = 4000 + 243; +pub const SYS_io_submit: ::c_long = 4000 + 244; +pub const SYS_io_cancel: ::c_long = 4000 + 245; +pub const SYS_exit_group: ::c_long = 4000 + 246; +pub const SYS_lookup_dcookie: ::c_long = 4000 + 247; +pub const SYS_epoll_create: ::c_long = 4000 + 248; +pub const SYS_epoll_ctl: ::c_long = 4000 + 249; +pub const SYS_epoll_wait: ::c_long = 4000 + 250; +pub const SYS_remap_file_pages: ::c_long = 4000 + 251; +pub const SYS_set_tid_address: ::c_long = 4000 + 252; +pub const SYS_restart_syscall: ::c_long = 4000 + 253; +pub const SYS_fadvise64: ::c_long = 4000 + 254; +pub const SYS_statfs64: ::c_long = 4000 + 255; +pub const SYS_fstatfs64: ::c_long = 4000 + 256; +pub const SYS_timer_create: ::c_long = 4000 + 257; +pub const SYS_timer_settime: ::c_long = 4000 + 258; +pub const SYS_timer_gettime: ::c_long = 4000 + 259; +pub const SYS_timer_getoverrun: ::c_long = 4000 + 260; +pub const SYS_timer_delete: ::c_long = 4000 + 261; +pub const SYS_clock_settime: ::c_long = 4000 + 262; +pub const SYS_clock_gettime: ::c_long = 4000 + 263; +pub const SYS_clock_getres: ::c_long = 4000 + 264; +pub const SYS_clock_nanosleep: ::c_long = 4000 + 265; +pub const SYS_tgkill: ::c_long = 4000 + 266; +pub const SYS_utimes: ::c_long = 4000 + 267; +pub const SYS_mbind: ::c_long = 4000 + 268; +pub const SYS_get_mempolicy: ::c_long = 4000 + 269; +pub const SYS_set_mempolicy: ::c_long = 4000 + 270; +pub const SYS_mq_open: ::c_long = 4000 + 271; +pub const SYS_mq_unlink: ::c_long = 4000 + 272; +pub const SYS_mq_timedsend: ::c_long = 4000 + 273; +pub const SYS_mq_timedreceive: ::c_long = 4000 + 274; +pub const SYS_mq_notify: ::c_long = 4000 + 275; +pub const SYS_mq_getsetattr: ::c_long = 4000 + 276; +pub const SYS_vserver: ::c_long = 4000 + 277; +pub const SYS_waitid: ::c_long = 4000 + 278; +/* pub const SYS_sys_setaltroot: ::c_long = 4000 + 279; */ +pub const SYS_add_key: ::c_long = 4000 + 280; +pub const SYS_request_key: ::c_long = 4000 + 281; +pub const SYS_keyctl: ::c_long = 4000 + 282; +pub const SYS_set_thread_area: ::c_long = 4000 + 283; +pub const SYS_inotify_init: ::c_long = 4000 + 284; +pub const SYS_inotify_add_watch: ::c_long = 4000 + 285; +pub const SYS_inotify_rm_watch: ::c_long = 4000 + 286; +pub const SYS_migrate_pages: ::c_long = 4000 + 287; +pub const SYS_openat: ::c_long = 4000 + 288; +pub const SYS_mkdirat: ::c_long = 4000 + 289; +pub const SYS_mknodat: ::c_long = 4000 + 290; +pub const SYS_fchownat: ::c_long = 4000 + 291; +pub const SYS_futimesat: ::c_long = 4000 + 292; +pub const SYS_fstatat64: ::c_long = 4000 + 293; +pub const SYS_unlinkat: ::c_long = 4000 + 294; +pub const SYS_renameat: ::c_long = 4000 + 295; +pub const SYS_linkat: ::c_long = 4000 + 296; +pub const SYS_symlinkat: ::c_long = 4000 + 297; +pub const SYS_readlinkat: ::c_long = 4000 + 298; +pub const SYS_fchmodat: ::c_long = 4000 + 299; +pub const SYS_faccessat: ::c_long = 4000 + 300; +pub const SYS_pselect6: ::c_long = 4000 + 301; +pub const SYS_ppoll: ::c_long = 4000 + 302; +pub const SYS_unshare: ::c_long = 4000 + 303; +pub const SYS_splice: ::c_long = 4000 + 304; +pub const SYS_sync_file_range: ::c_long = 4000 + 305; +pub const SYS_tee: ::c_long = 4000 + 306; +pub const SYS_vmsplice: ::c_long = 4000 + 307; +pub const SYS_move_pages: ::c_long = 4000 + 308; +pub const SYS_set_robust_list: ::c_long = 4000 + 309; +pub const SYS_get_robust_list: ::c_long = 4000 + 310; +pub const SYS_kexec_load: ::c_long = 4000 + 311; +pub const SYS_getcpu: ::c_long = 4000 + 312; +pub const SYS_epoll_pwait: ::c_long = 4000 + 313; +pub const SYS_ioprio_set: ::c_long = 4000 + 314; +pub const SYS_ioprio_get: ::c_long = 4000 + 315; +pub const SYS_utimensat: ::c_long = 4000 + 316; +pub const SYS_signalfd: ::c_long = 4000 + 317; +pub const SYS_timerfd: ::c_long = 4000 + 318; +pub const SYS_eventfd: ::c_long = 4000 + 319; +pub const SYS_fallocate: ::c_long = 4000 + 320; +pub const SYS_timerfd_create: ::c_long = 4000 + 321; +pub const SYS_timerfd_gettime: ::c_long = 4000 + 322; +pub const SYS_timerfd_settime: ::c_long = 4000 + 323; +pub const SYS_signalfd4: ::c_long = 4000 + 324; +pub const SYS_eventfd2: ::c_long = 4000 + 325; +pub const SYS_epoll_create1: ::c_long = 4000 + 326; +pub const SYS_dup3: ::c_long = 4000 + 327; +pub const SYS_pipe2: ::c_long = 4000 + 328; +pub const SYS_inotify_init1: ::c_long = 4000 + 329; +pub const SYS_preadv: ::c_long = 4000 + 330; +pub const SYS_pwritev: ::c_long = 4000 + 331; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 4000 + 332; +pub const SYS_perf_event_open: ::c_long = 4000 + 333; +pub const SYS_accept4: ::c_long = 4000 + 334; +pub const SYS_recvmmsg: ::c_long = 4000 + 335; +pub const SYS_fanotify_init: ::c_long = 4000 + 336; +pub const SYS_fanotify_mark: ::c_long = 4000 + 337; +pub const SYS_prlimit64: ::c_long = 4000 + 338; +pub const SYS_name_to_handle_at: ::c_long = 4000 + 339; +pub const SYS_open_by_handle_at: ::c_long = 4000 + 340; +pub const SYS_clock_adjtime: ::c_long = 4000 + 341; +pub const SYS_syncfs: ::c_long = 4000 + 342; +pub const SYS_sendmmsg: ::c_long = 4000 + 343; +pub const SYS_setns: ::c_long = 4000 + 344; +pub const SYS_process_vm_readv: ::c_long = 4000 + 345; +pub const SYS_process_vm_writev: ::c_long = 4000 + 346; +pub const SYS_kcmp: ::c_long = 4000 + 347; +pub const SYS_finit_module: ::c_long = 4000 + 348; +pub const SYS_sched_setattr: ::c_long = 4000 + 349; +pub const SYS_sched_getattr: ::c_long = 4000 + 350; +pub const SYS_renameat2: ::c_long = 4000 + 351; +pub const SYS_seccomp: ::c_long = 4000 + 352; +pub const SYS_getrandom: ::c_long = 4000 + 353; +pub const SYS_memfd_create: ::c_long = 4000 + 354; +pub const SYS_bpf: ::c_long = 4000 + 355; +pub const SYS_execveat: ::c_long = 4000 + 356; +pub const SYS_userfaultfd: ::c_long = 4000 + 357; +pub const SYS_membarrier: ::c_long = 4000 + 358; +pub const SYS_mlock2: ::c_long = 4000 + 359; +pub const SYS_copy_file_range: ::c_long = 4000 + 360; +pub const SYS_preadv2: ::c_long = 4000 + 361; +pub const SYS_pwritev2: ::c_long = 4000 + 362; +pub const SYS_pkey_mprotect: ::c_long = 4000 + 363; +pub const SYS_pkey_alloc: ::c_long = 4000 + 364; +pub const SYS_pkey_free: ::c_long = 4000 + 365; +pub const SYS_statx: ::c_long = 4000 + 366; +pub const SYS_pidfd_send_signal: ::c_long = 4000 + 424; +pub const SYS_io_uring_setup: ::c_long = 4000 + 425; +pub const SYS_io_uring_enter: ::c_long = 4000 + 426; +pub const SYS_io_uring_register: ::c_long = 4000 + 427; +pub const SYS_open_tree: ::c_long = 4000 + 428; +pub const SYS_move_mount: ::c_long = 4000 + 429; +pub const SYS_fsopen: ::c_long = 4000 + 430; +pub const SYS_fsconfig: ::c_long = 4000 + 431; +pub const SYS_fsmount: ::c_long = 4000 + 432; +pub const SYS_fspick: ::c_long = 4000 + 433; +pub const SYS_pidfd_open: ::c_long = 4000 + 434; +pub const SYS_clone3: ::c_long = 4000 + 435; +pub const SYS_close_range: ::c_long = 4000 + 436; +pub const SYS_openat2: ::c_long = 4000 + 437; +pub const SYS_pidfd_getfd: ::c_long = 4000 + 438; +pub const SYS_faccessat2: ::c_long = 4000 + 439; +pub const SYS_process_madvise: ::c_long = 4000 + 440; +pub const SYS_epoll_pwait2: ::c_long = 4000 + 441; +pub const SYS_mount_setattr: ::c_long = 4000 + 442; +pub const SYS_quotactl_fd: ::c_long = 4000 + 443; +pub const SYS_landlock_create_ruleset: ::c_long = 4000 + 444; +pub const SYS_landlock_add_rule: ::c_long = 4000 + 445; +pub const SYS_landlock_restrict_self: ::c_long = 4000 + 446; +pub const SYS_memfd_secret: ::c_long = 4000 + 447; +pub const SYS_process_mrelease: ::c_long = 4000 + 448; +pub const SYS_futex_waitv: ::c_long = 4000 + 449; +pub const SYS_set_mempolicy_home_node: ::c_long = 4000 + 450; + +#[link(name = "util")] +extern "C" { + pub fn sysctl( + name: *mut ::c_int, + namelen: ::c_int, + oldp: *mut ::c_void, + oldlenp: *mut ::size_t, + newp: *mut ::c_void, + newlen: ::size_t, + ) -> ::c_int; + pub fn glob64( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut glob64_t, + ) -> ::c_int; + pub fn globfree64(pglob: *mut glob64_t); + pub fn pthread_attr_getaffinity_np( + attr: *const ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *mut ::cpu_set_t, + ) -> ::c_int; + pub fn pthread_attr_setaffinity_np( + attr: *mut ::pthread_attr_t, + cpusetsize: ::size_t, + cpuset: *const ::cpu_set_t, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } else { + mod no_align; + pub use self::no_align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs new file mode 100644 index 0000000..e32bf67 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs @@ -0,0 +1,10 @@ +s! { + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs new file mode 100644 index 0000000..21e2190 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs @@ -0,0 +1,10 @@ +s! { + // FIXME this is actually a union + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", + repr(align(8)))] + pub struct sem_t { + __size: [::c_char; 32], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs new file mode 100644 index 0000000..8ca100f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs @@ -0,0 +1,207 @@ +pub type blkcnt_t = i64; +pub type blksize_t = i64; +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = u64; +pub type nlink_t = u64; +pub type off_t = i64; +pub type suseconds_t = i64; +pub type time_t = i64; +pub type wchar_t = i32; + +s! { + pub struct stat { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_ulong; 1], + pub st_size: ::off_t, + st_pad3: ::c_long, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad4: ::c_long, + pub st_blocks: ::blkcnt_t, + st_pad5: [::c_long; 7], + } + + pub struct stat64 { + pub st_dev: ::c_ulong, + st_pad1: [::c_long; 2], + pub st_ino: ::ino64_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, + st_pad2: [::c_long; 2], + pub st_size: ::off64_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + st_pad3: ::c_long, + pub st_blocks: ::blkcnt64_t, + st_pad5: [::c_long; 7], + } + + pub struct pthread_attr_t { + __size: [::c_ulong; 7] + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + _restorer: *mut ::c_void, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct sigset_t { + __size: [::c_ulong; 16], + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + _pad: ::c_int, + _pad2: [::c_long; 14], + } + + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_uint, + pub __seq: ::c_ushort, + __pad1: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused4: ::c_ulong, + __unused5: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __glibc_reserved4: ::c_ulong, + __glibc_reserved5: ::c_ulong, + } + + pub struct statfs { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_files: ::fsblkcnt_t, + pub f_ffree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_fsid: ::fsid_t, + + pub f_namelen: ::c_long, + f_spare: [::c_long; 6], + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } +} + +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + +pub const SYS_gettid: ::c_long = 5178; // Valid for n64 + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } else { + mod no_align; + pub use self::no_align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs new file mode 100644 index 0000000..8909114 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs @@ -0,0 +1,7 @@ +s! { + // FIXME this is actually a union + pub struct sem_t { + __size: [::c_char; 32], + __align: [::c_long; 0], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs new file mode 100644 index 0000000..56bfcc5 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs @@ -0,0 +1,310 @@ +pub type pthread_t = ::c_ulong; + +pub const SFD_CLOEXEC: ::c_int = 0x080000; + +pub const NCCS: usize = 32; + +pub const O_TRUNC: ::c_int = 512; + +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EDOTDOT: ::c_int = 73; + +pub const SA_NODEFER: ::c_int = 0x40000000; +pub const SA_RESETHAND: ::c_int = 0x80000000; +pub const SA_RESTART: ::c_int = 0x10000000; +pub const SA_NOCLDSTOP: ::c_int = 0x00000001; + +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; + +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const TMP_MAX: ::c_uint = 238328; +pub const _SC_2_C_VERSION: ::c_int = 96; +pub const O_ACCMODE: ::c_int = 3; +pub const O_DIRECT: ::c_int = 0x8000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_NOATIME: ::c_int = 0x40000; +pub const O_PATH: ::c_int = 0o010000000; + +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_NONBLOCK: ::c_int = 128; +pub const O_SYNC: ::c_int = 0x10; +pub const O_RSYNC: ::c_int = 0x10; +pub const O_DSYNC: ::c_int = 0x10; +pub const O_FSYNC: ::c_int = 0x10; +pub const O_ASYNC: ::c_int = 0x1000; +pub const O_LARGEFILE: ::c_int = 0x2000; +pub const O_NDELAY: ::c_int = 0x80; + +pub const SOCK_NONBLOCK: ::c_int = 128; +pub const PIDFD_NONBLOCK: ::c_int = 128; + +pub const EDEADLK: ::c_int = 45; +pub const ENAMETOOLONG: ::c_int = 78; +pub const ENOLCK: ::c_int = 46; +pub const ENOSYS: ::c_int = 89; +pub const ENOTEMPTY: ::c_int = 93; +pub const ELOOP: ::c_int = 90; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const FFDLY: ::c_int = 0o0100000; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EMULTIHOP: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EBADMSG: ::c_int = 77; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; +pub const EUCLEAN: ::c_int = 135; +pub const ENOTNAM: ::c_int = 137; +pub const ENAVAIL: ::c_int = 138; +pub const EISNAM: ::c_int = 139; +pub const EREMOTEIO: ::c_int = 140; +pub const EDQUOT: ::c_int = 1133; +pub const ENOMEDIUM: ::c_int = 159; +pub const EMEDIUMTYPE: ::c_int = 160; +pub const ECANCELED: ::c_int = 158; +pub const ENOKEY: ::c_int = 161; +pub const EKEYEXPIRED: ::c_int = 162; +pub const EKEYREVOKED: ::c_int = 163; +pub const EKEYREJECTED: ::c_int = 164; +pub const EOWNERDEAD: ::c_int = 165; +pub const ENOTRECOVERABLE: ::c_int = 166; +pub const ERFKILL: ::c_int = 167; + +pub const MAP_NORESERVE: ::c_int = 0x400; +pub const MAP_ANON: ::c_int = 0x800; +pub const MAP_ANONYMOUS: ::c_int = 0x800; +pub const MAP_GROWSDOWN: ::c_int = 0x1000; +pub const MAP_DENYWRITE: ::c_int = 0x2000; +pub const MAP_EXECUTABLE: ::c_int = 0x4000; +pub const MAP_LOCKED: ::c_int = 0x8000; +pub const MAP_POPULATE: ::c_int = 0x10000; +pub const MAP_NONBLOCK: ::c_int = 0x20000; +pub const MAP_STACK: ::c_int = 0x40000; + +pub const NLDLY: ::tcflag_t = 0o0000400; + +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_SEQPACKET: ::c_int = 5; + +pub const SA_ONSTACK: ::c_uint = 0x08000000; +pub const SA_SIGINFO: ::c_uint = 0x00000008; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = 22; +pub const SIGSYS: ::c_int = 12; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 3; +pub const SIG_BLOCK: ::c_int = 0x1; +pub const SIG_UNBLOCK: ::c_int = 0x2; + +pub const POLLWRNORM: ::c_short = 0x004; +pub const POLLWRBAND: ::c_short = 0x100; + +pub const PTHREAD_STACK_MIN: ::size_t = 16384; + +pub const VEOF: usize = 16; +pub const VEOL: usize = 17; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const IEXTEN: ::tcflag_t = 0x00000100; +pub const TOSTOP: ::tcflag_t = 0x00008000; +pub const FLUSHO: ::tcflag_t = 0x00002000; +pub const TCSANOW: ::c_int = 0x540e; +pub const TCSADRAIN: ::c_int = 0x540f; +pub const TCSAFLUSH: ::c_int = 0x5410; + +pub const CPU_SETSIZE: ::c_int = 0x400; + +pub const EFD_NONBLOCK: ::c_int = 0x80; + +pub const F_GETLK: ::c_int = 14; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; + +pub const SFD_NONBLOCK: ::c_int = 0x80; + +pub const RTLD_GLOBAL: ::c_int = 0x4; + +pub const SIGSTKSZ: ::size_t = 8192; +pub const CBAUD: ::tcflag_t = 0o0010017; +pub const CBAUDEX: ::tcflag_t = 0o0010000; +pub const CIBAUD: ::tcflag_t = 0o002003600000; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const TABDLY: ::tcflag_t = 0o0014000; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const FF1: ::tcflag_t = 0x00008000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const BSDLY: ::tcflag_t = 0o0020000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const VWERASE: usize = 14; +pub const XTABS: ::tcflag_t = 0o0014000; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSWTC: usize = 7; +pub const VTDLY: ::c_int = 0o0040000; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 5; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const OLCUC: ::tcflag_t = 0o0000002; +pub const ONLCR: ::tcflag_t = 0x4; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x00000010; +pub const CS7: ::tcflag_t = 0x00000020; +pub const CS8: ::tcflag_t = 0x00000030; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CRDLY: ::c_int = 0o0003000; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOPRT: ::tcflag_t = 0x00000400; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const PENDIN: ::tcflag_t = 0x00004000; +pub const NOFLSH: ::tcflag_t = 0x00000080; + +pub const MAP_HUGETLB: ::c_int = 0x80000; + +pub const B0: ::speed_t = 0o000000; +pub const B50: ::speed_t = 0o000001; +pub const B75: ::speed_t = 0o000002; +pub const B110: ::speed_t = 0o000003; +pub const B134: ::speed_t = 0o000004; +pub const B150: ::speed_t = 0o000005; +pub const B200: ::speed_t = 0o000006; +pub const B300: ::speed_t = 0o000007; +pub const B600: ::speed_t = 0o000010; +pub const B1200: ::speed_t = 0o000011; +pub const B1800: ::speed_t = 0o000012; +pub const B2400: ::speed_t = 0o000013; +pub const B4800: ::speed_t = 0o000014; +pub const B9600: ::speed_t = 0o000015; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; + +cfg_if! { + if #[cfg(target_arch = "mips")] { + mod mips32; + pub use self::mips32::*; + } else if #[cfg(target_arch = "mips64")] { + mod mips64; + pub use self::mips64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs new file mode 100644 index 0000000..4a01e0c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs @@ -0,0 +1,392 @@ +pub type shmatt_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type regoff_t = ::c_int; +pub type rlim_t = ::c_ulong; +pub type __rlimit_resource_t = ::c_ulong; +pub type __priority_which_t = ::c_uint; + +cfg_if! { + if #[cfg(doc)] { + // Used in `linux::arch` to define ioctl constants. + pub(crate) type Ioctl = ::c_ulong; + } else { + #[doc(hidden)] + pub type Ioctl = ::c_ulong; + } +} + +s! { + pub struct statvfs { // Different than GNU! + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + #[cfg(target_pointer_width = "32")] + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct regex_t { + __buffer: *mut ::c_void, + __allocated: ::size_t, + __used: ::size_t, + __syntax: ::c_ulong, + __fastmap: *mut ::c_char, + __translate: *mut ::c_char, + __re_nsub: ::size_t, + __bitfield: u8, + } + + pub struct rtentry { + pub rt_pad1: ::c_ulong, + pub rt_dst: ::sockaddr, + pub rt_gateway: ::sockaddr, + pub rt_genmask: ::sockaddr, + pub rt_flags: ::c_ushort, + pub rt_pad2: ::c_short, + pub rt_pad3: ::c_ulong, + pub rt_tos: ::c_uchar, + pub rt_class: ::c_uchar, + #[cfg(target_pointer_width = "64")] + pub rt_pad4: [::c_short; 3usize], + #[cfg(not(target_pointer_width = "64"))] + pub rt_pad4: ::c_short, + pub rt_metric: ::c_short, + pub rt_dev: *mut ::c_char, + pub rt_mtu: ::c_ulong, + pub rt_window: ::c_ulong, + pub rt_irtt: ::c_ushort, + } + + pub struct __exit_status { + pub e_termination: ::c_short, + pub e_exit: ::c_short, + } + + pub struct ptrace_peeksiginfo_args { + pub off: ::__u64, + pub flags: ::__u32, + pub nr: ::__s32, + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_sigfault { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_si_value { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + _si_timerid: ::c_int, + _si_overrun: ::c_int, + si_value: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_si_value)).si_value + } +} + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const AF_VSOCK: ::c_int = 40; + +// Most `*_SUPER_MAGIC` constants are defined at the `linux_like` level; the +// following are only available on newer Linux versions than the versions +// currently used in CI in some configurations, so we define them here. +pub const BINDERFS_SUPER_MAGIC: ::c_long = 0x6c6f6f70; +pub const XFS_SUPER_MAGIC: ::c_long = 0x58465342; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_GETFPXREGS: ::c_int = 18; +pub const PTRACE_SETFPXREGS: ::c_int = 19; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +// These are different than GNU! +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 3; +pub const LC_COLLATE: ::c_int = 4; +pub const LC_MONETARY: ::c_int = 2; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +// end different section + +// MS_ flags for mount(2) +pub const MS_RMT_MASK: ::c_ulong = ::MS_RDONLY | ::MS_SYNCHRONOUS | ::MS_MANDLOCK | ::MS_I_VERSION; + +pub const ENOTSUP: ::c_int = EOPNOTSUPP; + +pub const IPV6_JOIN_GROUP: ::c_int = 20; +pub const IPV6_LEAVE_GROUP: ::c_int = 21; + +// These are different from GNU +pub const ABDAY_1: ::nl_item = 0x300; +pub const ABDAY_2: ::nl_item = 0x301; +pub const ABDAY_3: ::nl_item = 0x302; +pub const ABDAY_4: ::nl_item = 0x303; +pub const ABDAY_5: ::nl_item = 0x304; +pub const ABDAY_6: ::nl_item = 0x305; +pub const ABDAY_7: ::nl_item = 0x306; +pub const DAY_1: ::nl_item = 0x307; +pub const DAY_2: ::nl_item = 0x308; +pub const DAY_3: ::nl_item = 0x309; +pub const DAY_4: ::nl_item = 0x30A; +pub const DAY_5: ::nl_item = 0x30B; +pub const DAY_6: ::nl_item = 0x30C; +pub const DAY_7: ::nl_item = 0x30D; +pub const ABMON_1: ::nl_item = 0x30E; +pub const ABMON_2: ::nl_item = 0x30F; +pub const ABMON_3: ::nl_item = 0x310; +pub const ABMON_4: ::nl_item = 0x311; +pub const ABMON_5: ::nl_item = 0x312; +pub const ABMON_6: ::nl_item = 0x313; +pub const ABMON_7: ::nl_item = 0x314; +pub const ABMON_8: ::nl_item = 0x315; +pub const ABMON_9: ::nl_item = 0x316; +pub const ABMON_10: ::nl_item = 0x317; +pub const ABMON_11: ::nl_item = 0x318; +pub const ABMON_12: ::nl_item = 0x319; +pub const MON_1: ::nl_item = 0x31A; +pub const MON_2: ::nl_item = 0x31B; +pub const MON_3: ::nl_item = 0x31C; +pub const MON_4: ::nl_item = 0x31D; +pub const MON_5: ::nl_item = 0x31E; +pub const MON_6: ::nl_item = 0x31F; +pub const MON_7: ::nl_item = 0x320; +pub const MON_8: ::nl_item = 0x321; +pub const MON_9: ::nl_item = 0x322; +pub const MON_10: ::nl_item = 0x323; +pub const MON_11: ::nl_item = 0x324; +pub const MON_12: ::nl_item = 0x325; +pub const AM_STR: ::nl_item = 0x326; +pub const PM_STR: ::nl_item = 0x327; +pub const D_T_FMT: ::nl_item = 0x328; +pub const D_FMT: ::nl_item = 0x329; +pub const T_FMT: ::nl_item = 0x32A; +pub const T_FMT_AMPM: ::nl_item = 0x32B; +pub const ERA: ::nl_item = 0x32C; +pub const ERA_D_FMT: ::nl_item = 0x32E; +pub const ALT_DIGITS: ::nl_item = 0x32F; +pub const ERA_D_T_FMT: ::nl_item = 0x330; +pub const ERA_T_FMT: ::nl_item = 0x331; +pub const CODESET: ::nl_item = 10; +pub const CRNCYSTR: ::nl_item = 0x215; +pub const RADIXCHAR: ::nl_item = 0x100; +pub const THOUSEP: ::nl_item = 0x101; +pub const NOEXPR: ::nl_item = 0x501; +pub const YESSTR: ::nl_item = 0x502; +pub const NOSTR: ::nl_item = 0x503; + +// Different than Gnu. +pub const FILENAME_MAX: ::c_uint = 4095; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const SOMAXCONN: ::c_int = 128; + +pub const ST_RELATIME: ::c_ulong = 4096; + +pub const AF_NFC: ::c_int = PF_NFC; +pub const BUFSIZ: ::c_int = 4096; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EXTA: ::c_uint = B19200; +pub const EXTB: ::c_uint = B38400; +pub const EXTPROC: ::tcflag_t = 0200000; +pub const FAN_MARK_FILESYSTEM: ::c_int = 0x00000100; +pub const FAN_MARK_INODE: ::c_int = 0x00000000; +pub const FAN_MARK_MOUNT: ::c_int = 0x10; +pub const FOPEN_MAX: ::c_int = 16; +pub const F_GETOWN: ::c_int = 9; +pub const F_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; +pub const F_RDLCK: ::c_int = 0; +pub const F_SETOWN: ::c_int = 8; +pub const F_UNLCK: ::c_int = 2; +pub const F_WRLCK: ::c_int = 1; +pub const IPV6_MULTICAST_ALL: ::c_int = 29; +pub const IPV6_ROUTER_ALERT_ISOLATE: ::c_int = 30; +pub const MAP_HUGE_SHIFT: ::c_int = 26; +pub const MAP_HUGE_MASK: ::c_int = 0x3f; +pub const MAP_HUGE_64KB: ::c_int = 16 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_512KB: ::c_int = 19 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_1MB: ::c_int = 20 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_2MB: ::c_int = 21 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_8MB: ::c_int = 23 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_16MB: ::c_int = 24 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_32MB: ::c_int = 25 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_256MB: ::c_int = 28 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_512MB: ::c_int = 29 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_1GB: ::c_int = 30 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_2GB: ::c_int = 31 << MAP_HUGE_SHIFT; +pub const MAP_HUGE_16GB: ::c_int = 34 << MAP_HUGE_SHIFT; +pub const MINSIGSTKSZ: ::c_int = 2048; +pub const MSG_COPY: ::c_int = 040000; +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; +pub const PACKET_MR_UNICAST: ::c_int = 3; +pub const PF_NFC: ::c_int = 39; +pub const PF_VSOCK: ::c_int = 40; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const PTRACE_EVENT_STOP: ::c_int = 128; +pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; +pub const RTLD_NOLOAD: ::c_int = 0x00004; +pub const RUSAGE_THREAD: ::c_int = 1; +pub const SHM_EXEC: ::c_int = 0100000; +pub const SIGPOLL: ::c_int = SIGIO; +pub const SOCK_DCCP: ::c_int = 6; +pub const SOCK_PACKET: ::c_int = 10; +pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; +pub const UDP_GRO: ::c_int = 104; +pub const UDP_SEGMENT: ::c_int = 103; +pub const YESEXPR: ::c_int = ((5) << 8) | (0); + +extern "C" { + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + + pub fn pthread_rwlockattr_getkind_np( + attr: *const ::pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setkind_np( + attr: *mut ::pthread_rwlockattr_t, + val: ::c_int, + ) -> ::c_int; + + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + + pub fn pwritev( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + pub fn preadv( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + + pub fn sethostid(hostid: ::c_long) -> ::c_int; + pub fn fanotify_mark( + fd: ::c_int, + flags: ::c_uint, + mask: u64, + dirfd: ::c_int, + path: *const ::c_char, + ) -> ::c_int; + pub fn getrlimit64(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit64) -> ::c_int; + pub fn setrlimit64(resource: ::__rlimit_resource_t, rlim: *const ::rlimit64) -> ::c_int; + pub fn getrlimit(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::__rlimit_resource_t, rlim: *const ::rlimit) -> ::c_int; + pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::__priority_which_t, who: ::id_t, prio: ::c_int) -> ::c_int; +} + +cfg_if! { + if #[cfg(any(target_arch = "mips", target_arch = "mips64"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else { + pub use unsupported_target; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs new file mode 100644 index 0000000..a73dbde --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs @@ -0,0 +1,53 @@ +macro_rules! expand_align { + () => { + s! { + pub struct pthread_mutex_t { + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(any(libc_align, + target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(not(any( + target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc")))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_mutexattr_t { + #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64"))] + __align: [::c_int; 0], + #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64")))] + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_cond_t { + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + pub struct pthread_condattr_t { + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs new file mode 100644 index 0000000..c7cbafa --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs @@ -0,0 +1,53 @@ +/// L4Re specifics +/// This module contains definitions required by various L4Re libc backends. +/// Some of them are formally not part of the libc, but are a dependency of the +/// libc and hence we should provide them here. + +pub type l4_umword_t = ::c_ulong; // Unsigned machine word. +pub type pthread_t = *mut ::c_void; + +s! { + /// CPU sets. + pub struct l4_sched_cpu_set_t { + // from the L4Re docs + /// Combination of granularity and offset. + /// + /// The granularity defines how many CPUs each bit in map describes. + /// The offset is the numer of the first CPU described by the first + /// bit in the bitmap. + /// offset must be a multiple of 2^graularity. + /// + /// | MSB | LSB | + /// | ---------------- | ------------------- | + /// | 8bit granularity | 24bit offset .. | + gran_offset: l4_umword_t , + /// Bitmap of CPUs. + map: l4_umword_t , + } +} + +#[cfg(target_os = "l4re")] +#[allow(missing_debug_implementations)] +pub struct pthread_attr_t { + pub __detachstate: ::c_int, + pub __schedpolicy: ::c_int, + pub __schedparam: super::__sched_param, + pub __inheritsched: ::c_int, + pub __scope: ::c_int, + pub __guardsize: ::size_t, + pub __stackaddr_set: ::c_int, + pub __stackaddr: *mut ::c_void, // better don't use it + pub __stacksize: ::size_t, + // L4Re specifics + pub affinity: l4_sched_cpu_set_t, + pub create_flags: ::c_uint, +} + +// L4Re requires a min stack size of 64k; that isn't defined in uClibc, but +// somewhere in the core libraries. uClibc wants 16k, but that's not enough. +pub const PTHREAD_STACK_MIN: usize = 65536; + +// Misc other constants required for building. +pub const SIGIO: ::c_int = 29; +pub const B19200: ::speed_t = 0o000016; +pub const B38400: ::speed_t = 0o000017; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs new file mode 100644 index 0000000..390119e --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs @@ -0,0 +1,345 @@ +//! Definitions for uclibc on 64bit systems +pub type blkcnt_t = i64; +pub type blksize_t = i64; +pub type clock_t = i64; +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type fsword_t = ::c_long; +pub type ino_t = ::c_ulong; +pub type nlink_t = ::c_uint; +pub type off_t = ::c_long; +// [uClibc docs] Note stat64 has the same shape as stat for x86-64. +pub type stat64 = stat; +pub type suseconds_t = ::c_long; +pub type time_t = ::c_int; +pub type wchar_t = ::c_int; + +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; +pub type __u64 = ::c_ulong; +pub type __s64 = ::c_long; + +s! { + pub struct ipc_perm { + pub __key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::c_ushort, // read / write + __pad1: ::c_ushort, + pub __seq: ::c_ushort, + __pad2: ::c_ushort, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + #[cfg(not(target_os = "l4re"))] + pub struct pthread_attr_t { + __detachstate: ::c_int, + __schedpolicy: ::c_int, + __schedparam: __sched_param, + __inheritsched: ::c_int, + __scope: ::c_int, + __guardsize: ::size_t, + __stackaddr_set: ::c_int, + __stackaddr: *mut ::c_void, // better don't use it + __stacksize: ::size_t, + } + + pub struct __sched_param { + __sched_priority: ::c_int, + } + + pub struct siginfo_t { + si_signo: ::c_int, // signal number + si_errno: ::c_int, // if not zero: error value of signal, see errno.h + si_code: ::c_int, // signal code + pub _pad: [::c_int; 28], // unported union + _align: [usize; 0], + } + + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, // segment size in bytes + pub shm_atime: ::time_t, // time of last shmat() + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_cpid: ::pid_t, + pub shm_lpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + __unused1: ::c_ulong, + __unused2: ::c_ulong + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_stime: ::time_t, + pub msg_rtime: ::time_t, + pub msg_ctime: ::time_t, + __msg_cbytes: ::c_ulong, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + __ignored1: ::c_ulong, + __ignored2: ::c_ulong, + } + + pub struct sockaddr { + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + // ------------------------------------------------------------ + // definitions below are *unverified* and might **break** the software +// pub struct in_addr { +// pub s_addr: in_addr_t, +// } +// +// pub struct in6_addr { +// pub s6_addr: [u8; 16], +// #[cfg(not(libc_align))] +// __align: [u32; 0], +// } + + pub struct stat { + pub st_dev: ::c_ulong, + pub st_ino: ::ino_t, + // According to uclibc/libc/sysdeps/linux/x86_64/bits/stat.h, order of + // nlink and mode are swapped on 64 bit systems. + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::c_ulong, // dev_t + pub st_size: off_t, // file size + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_ulong, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_ulong, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_ulong, + st_pad4: [::c_long; 3] + } + + pub struct sigaction { + pub sa_handler: ::sighandler_t, + pub sa_flags: ::c_ulong, + pub sa_restorer: ::Option, + pub sa_mask: ::sigset_t, + } + + pub struct stack_t { // FIXME + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: ::size_t + } + + pub struct statfs { // FIXME + pub f_type: fsword_t, + pub f_bsize: fsword_t, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: fsword_t, + pub f_frsize: fsword_t, + f_spare: [fsword_t; 5], + } + + pub struct statfs64 { + pub f_type: ::c_int, + pub f_bsize: ::c_int, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_files: ::fsfilcnt64_t, + pub f_ffree: ::fsfilcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_int, + pub f_frsize: ::c_int, + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u64, + pub f_bfree: u64, + pub f_bavail: u64, + pub f_files: u64, + pub f_ffree: u64, + pub f_favail: u64, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct msghdr { // FIXME + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::size_t, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::size_t, + pub msg_flags: ::c_int, + } + + pub struct termios { // FIXME + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct sigset_t { // FIXME + __val: [::c_ulong; 16], + } + + pub struct sysinfo { // FIXME + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 0], + } + + pub struct glob_t { // FIXME + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct cpu_set_t { // FIXME + #[cfg(target_pointer_width = "32")] + bits: [u32; 32], + #[cfg(target_pointer_width = "64")] + bits: [u64; 16], + } + + pub struct fsid_t { // FIXME + __val: [::c_int; 2], + } + + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } +} + +s_no_extra_traits! { + #[allow(missing_debug_implementations)] + pub struct dirent { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: u16, + pub d_type: u8, + pub d_name: [::c_char; 256], + } +} + +// constants +pub const ENAMETOOLONG: ::c_int = 36; // File name too long +pub const ENOTEMPTY: ::c_int = 39; // Directory not empty +pub const ELOOP: ::c_int = 40; // Too many symbolic links encountered +pub const EADDRINUSE: ::c_int = 98; // Address already in use +pub const EADDRNOTAVAIL: ::c_int = 99; // Cannot assign requested address +pub const ENETDOWN: ::c_int = 100; // Network is down +pub const ENETUNREACH: ::c_int = 101; // Network is unreachable +pub const ECONNABORTED: ::c_int = 103; // Software caused connection abort +pub const ECONNREFUSED: ::c_int = 111; // Connection refused +pub const ECONNRESET: ::c_int = 104; // Connection reset by peer +pub const EDEADLK: ::c_int = 35; // Resource deadlock would occur +pub const ENOSYS: ::c_int = 38; // Function not implemented +pub const ENOTCONN: ::c_int = 107; // Transport endpoint is not connected +pub const ETIMEDOUT: ::c_int = 110; // connection timed out +pub const ESTALE: ::c_int = 116; // Stale file handle +pub const EHOSTUNREACH: ::c_int = 113; // No route to host +pub const EDQUOT: ::c_int = 122; // Quota exceeded +pub const EOPNOTSUPP: ::c_int = 0x5f; +pub const ENODATA: ::c_int = 0x3d; +pub const O_APPEND: ::c_int = 02000; +pub const O_ACCMODE: ::c_int = 0003; +pub const O_CLOEXEC: ::c_int = 0x80000; +pub const O_CREAT: ::c_int = 0100; +pub const O_DIRECTORY: ::c_int = 0200000; +pub const O_EXCL: ::c_int = 0200; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_NONBLOCK: ::c_int = 04000; +pub const O_TRUNC: ::c_int = 01000; +pub const NCCS: usize = 32; +pub const SIG_SETMASK: ::c_int = 2; // Set the set of blocked signals +pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; +pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const SOCK_DGRAM: ::c_int = 2; // connectionless, unreliable datagrams +pub const SOCK_STREAM: ::c_int = 1; // …/common/bits/socket_type.h +pub const __SIZEOF_PTHREAD_COND_T: usize = 48; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const PIDFD_NONBLOCK: ::c_int = 04000; + +cfg_if! { + if #[cfg(target_os = "l4re")] { + mod l4re; + pub use self::l4re::*; + } else { + mod other; + pub use other::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs new file mode 100644 index 0000000..481577c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs @@ -0,0 +1,5 @@ +// Thestyle checker discourages the use of #[cfg], so this has to go into a +// separate module +pub type pthread_t = ::c_ulong; + +pub const PTHREAD_STACK_MIN: usize = 16384; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/mod.rs new file mode 100644 index 0000000..3117c18 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/linux_like/mod.rs @@ -0,0 +1,1903 @@ +pub type sa_family_t = u16; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type clockid_t = ::c_int; +pub type timer_t = *mut ::c_void; +pub type key_t = ::c_int; +pub type id_t = ::c_uint; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ip_mreqn { + pub imr_multiaddr: in_addr, + pub imr_address: in_addr, + pub imr_ifindex: ::c_int, + } + + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + pub imr_sourceaddr: in_addr, + } + + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + // The order of the `ai_addr` field in this struct is crucial + // for converting between the Rust and C types. + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + + #[cfg(any(target_os = "linux", + target_os = "emscripten"))] + pub ai_addr: *mut ::sockaddr, + + pub ai_canonname: *mut c_char, + + #[cfg(target_os = "android")] + pub ai_addr: *mut ::sockaddr, + + pub ai_next: *mut addrinfo, + } + + pub struct sockaddr_ll { + pub sll_family: ::c_ushort, + pub sll_protocol: ::c_ushort, + pub sll_ifindex: ::c_int, + pub sll_hatype: ::c_ushort, + pub sll_pkttype: ::c_uchar, + pub sll_halen: ::c_uchar, + pub sll_addr: [::c_uchar; 8] + } + + pub struct fd_set { + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + #[cfg(any(target_env = "musl", target_os = "emscripten", target_env = "ohos"))] + pub sched_ss_low_priority: ::c_int, + #[cfg(any(target_env = "musl", target_os = "emscripten", target_env = "ohos"))] + pub sched_ss_repl_period: ::timespec, + #[cfg(any(target_env = "musl", target_os = "emscripten", target_env = "ohos"))] + pub sched_ss_init_budget: ::timespec, + #[cfg(any(target_env = "musl", target_os = "emscripten", target_env = "ohos"))] + pub sched_ss_max_repl: ::c_int, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct in_pktinfo { + pub ipi_ifindex: ::c_int, + pub ipi_spec_dst: ::in_addr, + pub ipi_addr: ::in_addr, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union + pub ifa_data: *mut ::c_void + } + + pub struct in6_rtmsg { + rtmsg_dst: ::in6_addr, + rtmsg_src: ::in6_addr, + rtmsg_gateway: ::in6_addr, + rtmsg_type: u32, + rtmsg_dst_len: u16, + rtmsg_src_len: u16, + rtmsg_metric: u32, + rtmsg_info: ::c_ulong, + rtmsg_flags: u32, + rtmsg_ifindex: ::c_int, + } + + pub struct arpreq { + pub arp_pa: ::sockaddr, + pub arp_ha: ::sockaddr, + pub arp_flags: ::c_int, + pub arp_netmask: ::sockaddr, + pub arp_dev: [::c_char; 16], + } + + pub struct arpreq_old { + pub arp_pa: ::sockaddr, + pub arp_ha: ::sockaddr, + pub arp_flags: ::c_int, + pub arp_netmask: ::sockaddr, + } + + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::c_uint, + } +} + +s_no_extra_traits! { + #[cfg_attr( + any( + all( + target_arch = "x86", + not(target_env = "musl"), + not(target_os = "android")), + target_arch = "x86_64"), + repr(packed))] + pub struct epoll_event { + pub events: u32, + pub u64: u64, + } + + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 108] + } + + pub struct sockaddr_storage { + pub ss_family: sa_family_t, + #[cfg(target_pointer_width = "32")] + __ss_pad2: [u8; 128 - 2 - 4], + #[cfg(target_pointer_width = "64")] + __ss_pad2: [u8; 128 - 2 - 8], + __ss_align: ::size_t, + } + + pub struct utsname { + pub sysname: [::c_char; 65], + pub nodename: [::c_char; 65], + pub release: [::c_char; 65], + pub version: [::c_char; 65], + pub machine: [::c_char; 65], + pub domainname: [::c_char; 65] + } + + pub struct sigevent { + pub sigev_value: ::sigval, + pub sigev_signo: ::c_int, + pub sigev_notify: ::c_int, + // Actually a union. We only expose sigev_notify_thread_id because it's + // the most useful member + pub sigev_notify_thread_id: ::c_int, + #[cfg(target_pointer_width = "64")] + __unused1: [::c_int; 11], + #[cfg(target_pointer_width = "32")] + __unused1: [::c_int; 12] + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for epoll_event { + fn eq(&self, other: &epoll_event) -> bool { + self.events == other.events + && self.u64 == other.u64 + } + } + impl Eq for epoll_event {} + impl ::fmt::Debug for epoll_event { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let events = self.events; + let u64 = self.u64; + f.debug_struct("epoll_event") + .field("events", &events) + .field("u64", &u64) + .finish() + } + } + impl ::hash::Hash for epoll_event { + fn hash(&self, state: &mut H) { + let events = self.events; + let u64 = self.u64; + events.hash(state); + u64.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_family == other.ss_family + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for sockaddr_storage {} + + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_family", &self.ss_family) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_family.hash(state); + self.__ss_pad2.hash(state); + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a, b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a, b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a, b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a, b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a, b)| a == b) + && self + .domainname + .iter() + .zip(other.domainname.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for utsname {} + + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + // FIXME: .field("domainname", &self.domainname) + .finish() + } + } + + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + self.domainname.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_value == other.sigev_value + && self.sigev_signo == other.sigev_signo + && self.sigev_notify == other.sigev_notify + && self.sigev_notify_thread_id + == other.sigev_notify_thread_id + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_value", &self.sigev_value) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_notify", &self.sigev_notify) + .field("sigev_notify_thread_id", + &self.sigev_notify_thread_id) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_value.hash(state); + self.sigev_signo.hash(state); + self.sigev_notify.hash(state); + self.sigev_notify_thread_id.hash(state); + } + } + } +} + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 2147483647; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +// Linux-specific fcntls +pub const F_SETLEASE: ::c_int = 1024; +pub const F_GETLEASE: ::c_int = 1025; +pub const F_NOTIFY: ::c_int = 1026; +pub const F_CANCELLK: ::c_int = 1029; +pub const F_DUPFD_CLOEXEC: ::c_int = 1030; +pub const F_SETPIPE_SZ: ::c_int = 1031; +pub const F_GETPIPE_SZ: ::c_int = 1032; +pub const F_ADD_SEALS: ::c_int = 1033; +pub const F_GET_SEALS: ::c_int = 1034; + +pub const F_SEAL_SEAL: ::c_int = 0x0001; +pub const F_SEAL_SHRINK: ::c_int = 0x0002; +pub const F_SEAL_GROW: ::c_int = 0x0004; +pub const F_SEAL_WRITE: ::c_int = 0x0008; + +// FIXME(#235): Include file sealing fcntls once we have a way to verify them. + +pub const SIGTRAP: ::c_int = 5; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; + +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_MONOTONIC: ::clockid_t = 1; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 3; +pub const CLOCK_MONOTONIC_RAW: ::clockid_t = 4; +pub const CLOCK_REALTIME_COARSE: ::clockid_t = 5; +pub const CLOCK_MONOTONIC_COARSE: ::clockid_t = 6; +pub const CLOCK_BOOTTIME: ::clockid_t = 7; +pub const CLOCK_REALTIME_ALARM: ::clockid_t = 8; +pub const CLOCK_BOOTTIME_ALARM: ::clockid_t = 9; +pub const CLOCK_TAI: ::clockid_t = 11; +pub const TIMER_ABSTIME: ::c_int = 1; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; + +pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC; + +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IRWXU: ::mode_t = 448; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IRWXG: ::mode_t = 56; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IRWXO: ::mode_t = 7; +pub const S_IXOTH: ::mode_t = 1; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IROTH: ::mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const XATTR_CREATE: ::c_int = 0x1; +pub const XATTR_REPLACE: ::c_int = 0x2; + +cfg_if! { + if #[cfg(target_os = "android")] { + pub const RLIM64_INFINITY: ::c_ulonglong = !0; + } else { + pub const RLIM64_INFINITY: ::rlim64_t = !0; + } +} + +cfg_if! { + if #[cfg(target_env = "ohos")] { + pub const LC_CTYPE: ::c_int = 0; + pub const LC_NUMERIC: ::c_int = 1; + pub const LC_TIME: ::c_int = 2; + pub const LC_COLLATE: ::c_int = 3; + pub const LC_MONETARY: ::c_int = 4; + pub const LC_MESSAGES: ::c_int = 5; + pub const LC_PAPER: ::c_int = 6; + pub const LC_NAME: ::c_int = 7; + pub const LC_ADDRESS: ::c_int = 8; + pub const LC_TELEPHONE: ::c_int = 9; + pub const LC_MEASUREMENT: ::c_int = 10; + pub const LC_IDENTIFICATION: ::c_int = 11; + pub const LC_ALL: ::c_int = 12; + } else if #[cfg(not(target_env = "uclibc"))] { + pub const LC_CTYPE: ::c_int = 0; + pub const LC_NUMERIC: ::c_int = 1; + pub const LC_TIME: ::c_int = 2; + pub const LC_COLLATE: ::c_int = 3; + pub const LC_MONETARY: ::c_int = 4; + pub const LC_MESSAGES: ::c_int = 5; + pub const LC_ALL: ::c_int = 6; + } +} + +pub const LC_CTYPE_MASK: ::c_int = 1 << LC_CTYPE; +pub const LC_NUMERIC_MASK: ::c_int = 1 << LC_NUMERIC; +pub const LC_TIME_MASK: ::c_int = 1 << LC_TIME; +pub const LC_COLLATE_MASK: ::c_int = 1 << LC_COLLATE; +pub const LC_MONETARY_MASK: ::c_int = 1 << LC_MONETARY; +pub const LC_MESSAGES_MASK: ::c_int = 1 << LC_MESSAGES; +// LC_ALL_MASK defined per platform + +pub const MAP_FILE: ::c_int = 0x0000; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +// MS_ flags for msync(2) +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0004; + +// MS_ flags for mount(2) +pub const MS_RDONLY: ::c_ulong = 0x01; +pub const MS_NOSUID: ::c_ulong = 0x02; +pub const MS_NODEV: ::c_ulong = 0x04; +pub const MS_NOEXEC: ::c_ulong = 0x08; +pub const MS_SYNCHRONOUS: ::c_ulong = 0x10; +pub const MS_REMOUNT: ::c_ulong = 0x20; +pub const MS_MANDLOCK: ::c_ulong = 0x40; +pub const MS_DIRSYNC: ::c_ulong = 0x80; +pub const MS_NOATIME: ::c_ulong = 0x0400; +pub const MS_NODIRATIME: ::c_ulong = 0x0800; +pub const MS_BIND: ::c_ulong = 0x1000; +pub const MS_MOVE: ::c_ulong = 0x2000; +pub const MS_REC: ::c_ulong = 0x4000; +pub const MS_SILENT: ::c_ulong = 0x8000; +pub const MS_POSIXACL: ::c_ulong = 0x010000; +pub const MS_UNBINDABLE: ::c_ulong = 0x020000; +pub const MS_PRIVATE: ::c_ulong = 0x040000; +pub const MS_SLAVE: ::c_ulong = 0x080000; +pub const MS_SHARED: ::c_ulong = 0x100000; +pub const MS_RELATIME: ::c_ulong = 0x200000; +pub const MS_KERNMOUNT: ::c_ulong = 0x400000; +pub const MS_I_VERSION: ::c_ulong = 0x800000; +pub const MS_STRICTATIME: ::c_ulong = 0x1000000; +pub const MS_LAZYTIME: ::c_ulong = 0x2000000; +pub const MS_ACTIVE: ::c_ulong = 0x40000000; +pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000; +pub const MS_MGC_MSK: ::c_ulong = 0xffff0000; + +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const SCM_CREDENTIALS: ::c_int = 0x02; + +pub const PROT_GROWSDOWN: ::c_int = 0x1000000; +pub const PROT_GROWSUP: ::c_int = 0x2000000; + +pub const MAP_TYPE: ::c_int = 0x000f; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 8; +pub const MADV_REMOVE: ::c_int = 9; +pub const MADV_DONTFORK: ::c_int = 10; +pub const MADV_DOFORK: ::c_int = 11; +pub const MADV_MERGEABLE: ::c_int = 12; +pub const MADV_UNMERGEABLE: ::c_int = 13; +pub const MADV_HUGEPAGE: ::c_int = 14; +pub const MADV_NOHUGEPAGE: ::c_int = 15; +pub const MADV_DONTDUMP: ::c_int = 16; +pub const MADV_DODUMP: ::c_int = 17; +pub const MADV_WIPEONFORK: ::c_int = 18; +pub const MADV_KEEPONFORK: ::c_int = 19; +pub const MADV_COLD: ::c_int = 20; +pub const MADV_PAGEOUT: ::c_int = 21; +pub const MADV_HWPOISON: ::c_int = 100; +cfg_if! { + if #[cfg(not(target_os = "emscripten"))] { + pub const MADV_POPULATE_READ: ::c_int = 22; + pub const MADV_POPULATE_WRITE: ::c_int = 23; + pub const MADV_DONTNEED_LOCKED: ::c_int = 24; + } +} + +pub const IFF_UP: ::c_int = 0x1; +pub const IFF_BROADCAST: ::c_int = 0x2; +pub const IFF_DEBUG: ::c_int = 0x4; +pub const IFF_LOOPBACK: ::c_int = 0x8; +pub const IFF_POINTOPOINT: ::c_int = 0x10; +pub const IFF_NOTRAILERS: ::c_int = 0x20; +pub const IFF_RUNNING: ::c_int = 0x40; +pub const IFF_NOARP: ::c_int = 0x80; +pub const IFF_PROMISC: ::c_int = 0x100; +pub const IFF_ALLMULTI: ::c_int = 0x200; +pub const IFF_MASTER: ::c_int = 0x400; +pub const IFF_SLAVE: ::c_int = 0x800; +pub const IFF_MULTICAST: ::c_int = 0x1000; +pub const IFF_PORTSEL: ::c_int = 0x2000; +pub const IFF_AUTOMEDIA: ::c_int = 0x4000; +pub const IFF_DYNAMIC: ::c_int = 0x8000; + +pub const SOL_IP: ::c_int = 0; +pub const SOL_TCP: ::c_int = 6; +pub const SOL_UDP: ::c_int = 17; +pub const SOL_IPV6: ::c_int = 41; +pub const SOL_ICMPV6: ::c_int = 58; +pub const SOL_RAW: ::c_int = 255; +pub const SOL_DECNET: ::c_int = 261; +pub const SOL_X25: ::c_int = 262; +pub const SOL_PACKET: ::c_int = 263; +pub const SOL_ATM: ::c_int = 264; +pub const SOL_AAL: ::c_int = 265; +pub const SOL_IRDA: ::c_int = 266; +pub const SOL_NETBEUI: ::c_int = 267; +pub const SOL_LLC: ::c_int = 268; +pub const SOL_DCCP: ::c_int = 269; +pub const SOL_NETLINK: ::c_int = 270; +pub const SOL_TIPC: ::c_int = 271; +pub const SOL_BLUETOOTH: ::c_int = 274; +pub const SOL_ALG: ::c_int = 279; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = 1; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_AX25: ::c_int = 3; +pub const AF_IPX: ::c_int = 4; +pub const AF_APPLETALK: ::c_int = 5; +pub const AF_NETROM: ::c_int = 6; +pub const AF_BRIDGE: ::c_int = 7; +pub const AF_ATMPVC: ::c_int = 8; +pub const AF_X25: ::c_int = 9; +pub const AF_INET6: ::c_int = 10; +pub const AF_ROSE: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_NETBEUI: ::c_int = 13; +pub const AF_SECURITY: ::c_int = 14; +pub const AF_KEY: ::c_int = 15; +pub const AF_NETLINK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = AF_NETLINK; +pub const AF_PACKET: ::c_int = 17; +pub const AF_ASH: ::c_int = 18; +pub const AF_ECONET: ::c_int = 19; +pub const AF_ATMSVC: ::c_int = 20; +pub const AF_RDS: ::c_int = 21; +pub const AF_SNA: ::c_int = 22; +pub const AF_IRDA: ::c_int = 23; +pub const AF_PPPOX: ::c_int = 24; +pub const AF_WANPIPE: ::c_int = 25; +pub const AF_LLC: ::c_int = 26; +pub const AF_CAN: ::c_int = 29; +pub const AF_TIPC: ::c_int = 30; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_IUCV: ::c_int = 32; +pub const AF_RXRPC: ::c_int = 33; +pub const AF_ISDN: ::c_int = 34; +pub const AF_PHONET: ::c_int = 35; +pub const AF_IEEE802154: ::c_int = 36; +pub const AF_CAIF: ::c_int = 37; +pub const AF_ALG: ::c_int = 38; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_AX25: ::c_int = AF_AX25; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_NETROM: ::c_int = AF_NETROM; +pub const PF_BRIDGE: ::c_int = AF_BRIDGE; +pub const PF_ATMPVC: ::c_int = AF_ATMPVC; +pub const PF_X25: ::c_int = AF_X25; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_ROSE: ::c_int = AF_ROSE; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_NETBEUI: ::c_int = AF_NETBEUI; +pub const PF_SECURITY: ::c_int = AF_SECURITY; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_NETLINK: ::c_int = AF_NETLINK; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_PACKET: ::c_int = AF_PACKET; +pub const PF_ASH: ::c_int = AF_ASH; +pub const PF_ECONET: ::c_int = AF_ECONET; +pub const PF_ATMSVC: ::c_int = AF_ATMSVC; +pub const PF_RDS: ::c_int = AF_RDS; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_IRDA: ::c_int = AF_IRDA; +pub const PF_PPPOX: ::c_int = AF_PPPOX; +pub const PF_WANPIPE: ::c_int = AF_WANPIPE; +pub const PF_LLC: ::c_int = AF_LLC; +pub const PF_CAN: ::c_int = AF_CAN; +pub const PF_TIPC: ::c_int = AF_TIPC; +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_IUCV: ::c_int = AF_IUCV; +pub const PF_RXRPC: ::c_int = AF_RXRPC; +pub const PF_ISDN: ::c_int = AF_ISDN; +pub const PF_PHONET: ::c_int = AF_PHONET; +pub const PF_IEEE802154: ::c_int = AF_IEEE802154; +pub const PF_CAIF: ::c_int = AF_CAIF; +pub const PF_ALG: ::c_int = AF_ALG; + +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTROUTE: ::c_int = 4; +pub const MSG_CTRUNC: ::c_int = 8; +pub const MSG_TRUNC: ::c_int = 0x20; +pub const MSG_DONTWAIT: ::c_int = 0x40; +pub const MSG_EOR: ::c_int = 0x80; +pub const MSG_WAITALL: ::c_int = 0x100; +pub const MSG_FIN: ::c_int = 0x200; +pub const MSG_SYN: ::c_int = 0x400; +pub const MSG_CONFIRM: ::c_int = 0x800; +pub const MSG_RST: ::c_int = 0x1000; +pub const MSG_ERRQUEUE: ::c_int = 0x2000; +pub const MSG_NOSIGNAL: ::c_int = 0x4000; +pub const MSG_MORE: ::c_int = 0x8000; +pub const MSG_WAITFORONE: ::c_int = 0x10000; +pub const MSG_FASTOPEN: ::c_int = 0x20000000; +pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; + +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; + +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const IP_TOS: ::c_int = 1; +pub const IP_TTL: ::c_int = 2; +pub const IP_HDRINCL: ::c_int = 3; +pub const IP_OPTIONS: ::c_int = 4; +pub const IP_ROUTER_ALERT: ::c_int = 5; +pub const IP_RECVOPTS: ::c_int = 6; +pub const IP_RETOPTS: ::c_int = 7; +pub const IP_PKTINFO: ::c_int = 8; +pub const IP_PKTOPTIONS: ::c_int = 9; +pub const IP_MTU_DISCOVER: ::c_int = 10; +pub const IP_RECVERR: ::c_int = 11; +pub const IP_RECVTTL: ::c_int = 12; +pub const IP_RECVTOS: ::c_int = 13; +pub const IP_MTU: ::c_int = 14; +pub const IP_FREEBIND: ::c_int = 15; +pub const IP_IPSEC_POLICY: ::c_int = 16; +pub const IP_XFRM_POLICY: ::c_int = 17; +pub const IP_PASSSEC: ::c_int = 18; +pub const IP_TRANSPARENT: ::c_int = 19; +pub const IP_ORIGDSTADDR: ::c_int = 20; +pub const IP_RECVORIGDSTADDR: ::c_int = IP_ORIGDSTADDR; +pub const IP_MINTTL: ::c_int = 21; +pub const IP_NODEFRAG: ::c_int = 22; +pub const IP_CHECKSUM: ::c_int = 23; +pub const IP_BIND_ADDRESS_NO_PORT: ::c_int = 24; +pub const IP_MULTICAST_IF: ::c_int = 32; +pub const IP_MULTICAST_TTL: ::c_int = 33; +pub const IP_MULTICAST_LOOP: ::c_int = 34; +pub const IP_ADD_MEMBERSHIP: ::c_int = 35; +pub const IP_DROP_MEMBERSHIP: ::c_int = 36; +pub const IP_UNBLOCK_SOURCE: ::c_int = 37; +pub const IP_BLOCK_SOURCE: ::c_int = 38; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 39; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 40; +pub const IP_MSFILTER: ::c_int = 41; +pub const IP_MULTICAST_ALL: ::c_int = 49; +pub const IP_UNICAST_IF: ::c_int = 50; + +pub const IP_DEFAULT_MULTICAST_TTL: ::c_int = 1; +pub const IP_DEFAULT_MULTICAST_LOOP: ::c_int = 1; + +pub const IP_PMTUDISC_DONT: ::c_int = 0; +pub const IP_PMTUDISC_WANT: ::c_int = 1; +pub const IP_PMTUDISC_DO: ::c_int = 2; +pub const IP_PMTUDISC_PROBE: ::c_int = 3; +pub const IP_PMTUDISC_INTERFACE: ::c_int = 4; +pub const IP_PMTUDISC_OMIT: ::c_int = 5; + +// IPPROTO_IP defined in src/unix/mod.rs +/// Hop-by-hop option header +pub const IPPROTO_HOPOPTS: ::c_int = 0; +// IPPROTO_ICMP defined in src/unix/mod.rs +/// group mgmt protocol +pub const IPPROTO_IGMP: ::c_int = 2; +/// for compatibility +pub const IPPROTO_IPIP: ::c_int = 4; +// IPPROTO_TCP defined in src/unix/mod.rs +/// exterior gateway protocol +pub const IPPROTO_EGP: ::c_int = 8; +/// pup +pub const IPPROTO_PUP: ::c_int = 12; +// IPPROTO_UDP defined in src/unix/mod.rs +/// xns idp +pub const IPPROTO_IDP: ::c_int = 22; +/// tp-4 w/ class negotiation +pub const IPPROTO_TP: ::c_int = 29; +/// DCCP +pub const IPPROTO_DCCP: ::c_int = 33; +// IPPROTO_IPV6 defined in src/unix/mod.rs +/// IP6 routing header +pub const IPPROTO_ROUTING: ::c_int = 43; +/// IP6 fragmentation header +pub const IPPROTO_FRAGMENT: ::c_int = 44; +/// resource reservation +pub const IPPROTO_RSVP: ::c_int = 46; +/// General Routing Encap. +pub const IPPROTO_GRE: ::c_int = 47; +/// IP6 Encap Sec. Payload +pub const IPPROTO_ESP: ::c_int = 50; +/// IP6 Auth Header +pub const IPPROTO_AH: ::c_int = 51; +// IPPROTO_ICMPV6 defined in src/unix/mod.rs +/// IP6 no next header +pub const IPPROTO_NONE: ::c_int = 59; +/// IP6 destination option +pub const IPPROTO_DSTOPTS: ::c_int = 60; +pub const IPPROTO_MTP: ::c_int = 92; +/// encapsulation header +pub const IPPROTO_ENCAP: ::c_int = 98; +/// Protocol indep. multicast +pub const IPPROTO_PIM: ::c_int = 103; +/// IP Payload Comp. Protocol +pub const IPPROTO_COMP: ::c_int = 108; +/// SCTP +pub const IPPROTO_SCTP: ::c_int = 132; +pub const IPPROTO_MH: ::c_int = 135; +pub const IPPROTO_UDPLITE: ::c_int = 136; +/// raw IP packet +pub const IPPROTO_RAW: ::c_int = 255; +pub const IPPROTO_BEETPH: ::c_int = 94; +pub const IPPROTO_MPLS: ::c_int = 137; +/// Multipath TCP +pub const IPPROTO_MPTCP: ::c_int = 262; +/// Ethernet-within-IPv6 encapsulation. +pub const IPPROTO_ETHERNET: ::c_int = 143; + +pub const MCAST_EXCLUDE: ::c_int = 0; +pub const MCAST_INCLUDE: ::c_int = 1; +pub const MCAST_JOIN_GROUP: ::c_int = 42; +pub const MCAST_BLOCK_SOURCE: ::c_int = 43; +pub const MCAST_UNBLOCK_SOURCE: ::c_int = 44; +pub const MCAST_LEAVE_GROUP: ::c_int = 45; +pub const MCAST_JOIN_SOURCE_GROUP: ::c_int = 46; +pub const MCAST_LEAVE_SOURCE_GROUP: ::c_int = 47; +pub const MCAST_MSFILTER: ::c_int = 48; + +pub const IPV6_ADDRFORM: ::c_int = 1; +pub const IPV6_2292PKTINFO: ::c_int = 2; +pub const IPV6_2292HOPOPTS: ::c_int = 3; +pub const IPV6_2292DSTOPTS: ::c_int = 4; +pub const IPV6_2292RTHDR: ::c_int = 5; +pub const IPV6_2292PKTOPTIONS: ::c_int = 6; +pub const IPV6_CHECKSUM: ::c_int = 7; +pub const IPV6_2292HOPLIMIT: ::c_int = 8; +pub const IPV6_NEXTHOP: ::c_int = 9; +pub const IPV6_AUTHHDR: ::c_int = 10; +pub const IPV6_UNICAST_HOPS: ::c_int = 16; +pub const IPV6_MULTICAST_IF: ::c_int = 17; +pub const IPV6_MULTICAST_HOPS: ::c_int = 18; +pub const IPV6_MULTICAST_LOOP: ::c_int = 19; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; +pub const IPV6_ROUTER_ALERT: ::c_int = 22; +pub const IPV6_MTU_DISCOVER: ::c_int = 23; +pub const IPV6_MTU: ::c_int = 24; +pub const IPV6_RECVERR: ::c_int = 25; +pub const IPV6_V6ONLY: ::c_int = 26; +pub const IPV6_JOIN_ANYCAST: ::c_int = 27; +pub const IPV6_LEAVE_ANYCAST: ::c_int = 28; +pub const IPV6_IPSEC_POLICY: ::c_int = 34; +pub const IPV6_XFRM_POLICY: ::c_int = 35; +pub const IPV6_HDRINCL: ::c_int = 36; +pub const IPV6_RECVPKTINFO: ::c_int = 49; +pub const IPV6_PKTINFO: ::c_int = 50; +pub const IPV6_RECVHOPLIMIT: ::c_int = 51; +pub const IPV6_HOPLIMIT: ::c_int = 52; +pub const IPV6_RECVHOPOPTS: ::c_int = 53; +pub const IPV6_HOPOPTS: ::c_int = 54; +pub const IPV6_RTHDRDSTOPTS: ::c_int = 55; +pub const IPV6_RECVRTHDR: ::c_int = 56; +pub const IPV6_RTHDR: ::c_int = 57; +pub const IPV6_RECVDSTOPTS: ::c_int = 58; +pub const IPV6_DSTOPTS: ::c_int = 59; +pub const IPV6_RECVPATHMTU: ::c_int = 60; +pub const IPV6_PATHMTU: ::c_int = 61; +pub const IPV6_DONTFRAG: ::c_int = 62; +pub const IPV6_RECVTCLASS: ::c_int = 66; +pub const IPV6_TCLASS: ::c_int = 67; +pub const IPV6_AUTOFLOWLABEL: ::c_int = 70; +pub const IPV6_ADDR_PREFERENCES: ::c_int = 72; +pub const IPV6_MINHOPCOUNT: ::c_int = 73; +pub const IPV6_ORIGDSTADDR: ::c_int = 74; +pub const IPV6_RECVORIGDSTADDR: ::c_int = IPV6_ORIGDSTADDR; +pub const IPV6_TRANSPARENT: ::c_int = 75; +pub const IPV6_UNICAST_IF: ::c_int = 76; +pub const IPV6_PREFER_SRC_TMP: ::c_int = 0x0001; +pub const IPV6_PREFER_SRC_PUBLIC: ::c_int = 0x0002; +pub const IPV6_PREFER_SRC_PUBTMP_DEFAULT: ::c_int = 0x0100; +pub const IPV6_PREFER_SRC_COA: ::c_int = 0x0004; +pub const IPV6_PREFER_SRC_HOME: ::c_int = 0x0400; +pub const IPV6_PREFER_SRC_CGA: ::c_int = 0x0008; +pub const IPV6_PREFER_SRC_NONCGA: ::c_int = 0x0800; + +pub const IPV6_PMTUDISC_DONT: ::c_int = 0; +pub const IPV6_PMTUDISC_WANT: ::c_int = 1; +pub const IPV6_PMTUDISC_DO: ::c_int = 2; +pub const IPV6_PMTUDISC_PROBE: ::c_int = 3; +pub const IPV6_PMTUDISC_INTERFACE: ::c_int = 4; +pub const IPV6_PMTUDISC_OMIT: ::c_int = 5; + +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_MAXSEG: ::c_int = 2; +pub const TCP_CORK: ::c_int = 3; +pub const TCP_KEEPIDLE: ::c_int = 4; +pub const TCP_KEEPINTVL: ::c_int = 5; +pub const TCP_KEEPCNT: ::c_int = 6; +pub const TCP_SYNCNT: ::c_int = 7; +pub const TCP_LINGER2: ::c_int = 8; +pub const TCP_DEFER_ACCEPT: ::c_int = 9; +pub const TCP_WINDOW_CLAMP: ::c_int = 10; +pub const TCP_INFO: ::c_int = 11; +pub const TCP_QUICKACK: ::c_int = 12; +pub const TCP_CONGESTION: ::c_int = 13; +pub const TCP_MD5SIG: ::c_int = 14; +cfg_if! { + if #[cfg(all(target_os = "linux", any( + target_env = "gnu", + target_env = "musl", + target_env = "ohos" + )))] { + // WARN: deprecated + pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; + } +} +pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; +pub const TCP_THIN_DUPACK: ::c_int = 17; +pub const TCP_USER_TIMEOUT: ::c_int = 18; +pub const TCP_REPAIR: ::c_int = 19; +pub const TCP_REPAIR_QUEUE: ::c_int = 20; +pub const TCP_QUEUE_SEQ: ::c_int = 21; +pub const TCP_REPAIR_OPTIONS: ::c_int = 22; +pub const TCP_FASTOPEN: ::c_int = 23; +pub const TCP_TIMESTAMP: ::c_int = 24; +pub const TCP_NOTSENT_LOWAT: ::c_int = 25; +pub const TCP_CC_INFO: ::c_int = 26; +pub const TCP_SAVE_SYN: ::c_int = 27; +pub const TCP_SAVED_SYN: ::c_int = 28; +cfg_if! { + if #[cfg(not(target_os = "emscripten"))] { + // NOTE: emscripten doesn't support these options yet. + + pub const TCP_REPAIR_WINDOW: ::c_int = 29; + pub const TCP_FASTOPEN_CONNECT: ::c_int = 30; + pub const TCP_ULP: ::c_int = 31; + pub const TCP_MD5SIG_EXT: ::c_int = 32; + pub const TCP_FASTOPEN_KEY: ::c_int = 33; + pub const TCP_FASTOPEN_NO_COOKIE: ::c_int = 34; + pub const TCP_ZEROCOPY_RECEIVE: ::c_int = 35; + pub const TCP_INQ: ::c_int = 36; + pub const TCP_CM_INQ: ::c_int = TCP_INQ; + // NOTE: Some CI images doesn't have this option yet. + // pub const TCP_TX_DELAY: ::c_int = 37; + pub const TCP_MD5SIG_MAXKEYLEN: usize = 80; + } +} + +pub const SO_DEBUG: ::c_int = 1; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const PATH_MAX: ::c_int = 4096; + +pub const UIO_MAXIOV: ::c_int = 1024; + +pub const FD_SETSIZE: usize = 1024; + +pub const EPOLLIN: ::c_int = 0x1; +pub const EPOLLPRI: ::c_int = 0x2; +pub const EPOLLOUT: ::c_int = 0x4; +pub const EPOLLERR: ::c_int = 0x8; +pub const EPOLLHUP: ::c_int = 0x10; +pub const EPOLLRDNORM: ::c_int = 0x40; +pub const EPOLLRDBAND: ::c_int = 0x80; +pub const EPOLLWRNORM: ::c_int = 0x100; +pub const EPOLLWRBAND: ::c_int = 0x200; +pub const EPOLLMSG: ::c_int = 0x400; +pub const EPOLLRDHUP: ::c_int = 0x2000; +pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; +pub const EPOLLWAKEUP: ::c_int = 0x20000000; +pub const EPOLLONESHOT: ::c_int = 0x40000000; +pub const EPOLLET: ::c_int = 0x80000000; + +pub const EPOLL_CTL_ADD: ::c_int = 1; +pub const EPOLL_CTL_MOD: ::c_int = 3; +pub const EPOLL_CTL_DEL: ::c_int = 2; + +pub const MNT_FORCE: ::c_int = 0x1; +pub const MNT_DETACH: ::c_int = 0x2; +pub const MNT_EXPIRE: ::c_int = 0x4; +pub const UMOUNT_NOFOLLOW: ::c_int = 0x8; + +pub const Q_GETFMT: ::c_int = 0x800004; +pub const Q_GETINFO: ::c_int = 0x800005; +pub const Q_SETINFO: ::c_int = 0x800006; +pub const QIF_BLIMITS: u32 = 1; +pub const QIF_SPACE: u32 = 2; +pub const QIF_ILIMITS: u32 = 4; +pub const QIF_INODES: u32 = 8; +pub const QIF_BTIME: u32 = 16; +pub const QIF_ITIME: u32 = 32; +pub const QIF_LIMITS: u32 = 5; +pub const QIF_USAGE: u32 = 10; +pub const QIF_TIMES: u32 = 48; +pub const QIF_ALL: u32 = 63; + +pub const Q_SYNC: ::c_int = 0x800001; +pub const Q_QUOTAON: ::c_int = 0x800002; +pub const Q_QUOTAOFF: ::c_int = 0x800003; +pub const Q_GETQUOTA: ::c_int = 0x800007; +pub const Q_SETQUOTA: ::c_int = 0x800008; + +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const NL0: ::tcflag_t = 0x00000000; +pub const NL1: ::tcflag_t = 0x00000100; +pub const TAB0: ::tcflag_t = 0x00000000; +pub const CR0: ::tcflag_t = 0x00000000; +pub const FF0: ::tcflag_t = 0x00000000; +pub const BS0: ::tcflag_t = 0x00000000; +pub const VT0: ::tcflag_t = 0x00000000; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VLNEXT: usize = 15; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const OPOST: ::tcflag_t = 0x1; +pub const CS5: ::tcflag_t = 0x00000000; +pub const CRTSCTS: ::tcflag_t = 0x80000000; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const OCRNL: ::tcflag_t = 0o000010; +pub const ONOCR: ::tcflag_t = 0o000020; +pub const ONLRET: ::tcflag_t = 0o000040; +pub const OFILL: ::tcflag_t = 0o000100; +pub const OFDEL: ::tcflag_t = 0o000200; + +pub const CLONE_VM: ::c_int = 0x100; +pub const CLONE_FS: ::c_int = 0x200; +pub const CLONE_FILES: ::c_int = 0x400; +pub const CLONE_SIGHAND: ::c_int = 0x800; +pub const CLONE_PTRACE: ::c_int = 0x2000; +pub const CLONE_VFORK: ::c_int = 0x4000; +pub const CLONE_PARENT: ::c_int = 0x8000; +pub const CLONE_THREAD: ::c_int = 0x10000; +pub const CLONE_NEWNS: ::c_int = 0x20000; +pub const CLONE_SYSVSEM: ::c_int = 0x40000; +pub const CLONE_SETTLS: ::c_int = 0x80000; +pub const CLONE_PARENT_SETTID: ::c_int = 0x100000; +pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000; +pub const CLONE_DETACHED: ::c_int = 0x400000; +pub const CLONE_UNTRACED: ::c_int = 0x800000; +pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000; +pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; +pub const CLONE_NEWUTS: ::c_int = 0x04000000; +pub const CLONE_NEWIPC: ::c_int = 0x08000000; +pub const CLONE_NEWUSER: ::c_int = 0x10000000; +pub const CLONE_NEWPID: ::c_int = 0x20000000; +pub const CLONE_NEWNET: ::c_int = 0x40000000; +pub const CLONE_IO: ::c_int = 0x80000000; + +pub const WNOHANG: ::c_int = 0x00000001; +pub const WUNTRACED: ::c_int = 0x00000002; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WEXITED: ::c_int = 0x00000004; +pub const WCONTINUED: ::c_int = 0x00000008; +pub const WNOWAIT: ::c_int = 0x01000000; + +// Options for personality(2). +pub const ADDR_NO_RANDOMIZE: ::c_int = 0x0040000; +pub const MMAP_PAGE_ZERO: ::c_int = 0x0100000; +pub const ADDR_COMPAT_LAYOUT: ::c_int = 0x0200000; +pub const READ_IMPLIES_EXEC: ::c_int = 0x0400000; +pub const ADDR_LIMIT_32BIT: ::c_int = 0x0800000; +pub const SHORT_INODE: ::c_int = 0x1000000; +pub const WHOLE_SECONDS: ::c_int = 0x2000000; +pub const STICKY_TIMEOUTS: ::c_int = 0x4000000; +pub const ADDR_LIMIT_3GB: ::c_int = 0x8000000; + +// Options set using PTRACE_SETOPTIONS. +pub const PTRACE_O_TRACESYSGOOD: ::c_int = 0x00000001; +pub const PTRACE_O_TRACEFORK: ::c_int = 0x00000002; +pub const PTRACE_O_TRACEVFORK: ::c_int = 0x00000004; +pub const PTRACE_O_TRACECLONE: ::c_int = 0x00000008; +pub const PTRACE_O_TRACEEXEC: ::c_int = 0x00000010; +pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 0x00000020; +pub const PTRACE_O_TRACEEXIT: ::c_int = 0x00000040; +pub const PTRACE_O_TRACESECCOMP: ::c_int = 0x00000080; +pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 0x00200000; +pub const PTRACE_O_EXITKILL: ::c_int = 0x00100000; +pub const PTRACE_O_MASK: ::c_int = 0x003000ff; + +// Wait extended result codes for the above trace options. +pub const PTRACE_EVENT_FORK: ::c_int = 1; +pub const PTRACE_EVENT_VFORK: ::c_int = 2; +pub const PTRACE_EVENT_CLONE: ::c_int = 3; +pub const PTRACE_EVENT_EXEC: ::c_int = 4; +pub const PTRACE_EVENT_VFORK_DONE: ::c_int = 5; +pub const PTRACE_EVENT_EXIT: ::c_int = 6; +pub const PTRACE_EVENT_SECCOMP: ::c_int = 7; + +pub const __WNOTHREAD: ::c_int = 0x20000000; +pub const __WALL: ::c_int = 0x40000000; +pub const __WCLONE: ::c_int = 0x80000000; + +pub const SPLICE_F_MOVE: ::c_uint = 0x01; +pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02; +pub const SPLICE_F_MORE: ::c_uint = 0x04; +pub const SPLICE_F_GIFT: ::c_uint = 0x08; + +pub const RTLD_LOCAL: ::c_int = 0; +pub const RTLD_LAZY: ::c_int = 1; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 1; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100; +pub const AT_REMOVEDIR: ::c_int = 0x200; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; +pub const AT_NO_AUTOMOUNT: ::c_int = 0x800; +pub const AT_EMPTY_PATH: ::c_int = 0x1000; +pub const AT_RECURSIVE: ::c_int = 0x8000; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const PIPE_BUF: usize = 4096; + +pub const SI_LOAD_SHIFT: ::c_uint = 16; + +// si_code values for SIGBUS signal +pub const BUS_ADRALN: ::c_int = 1; +pub const BUS_ADRERR: ::c_int = 2; +pub const BUS_OBJERR: ::c_int = 3; +// Linux-specific si_code values for SIGBUS signal +pub const BUS_MCEERR_AR: ::c_int = 4; +pub const BUS_MCEERR_AO: ::c_int = 5; + +// si_code values for SIGCHLD signal +pub const CLD_EXITED: ::c_int = 1; +pub const CLD_KILLED: ::c_int = 2; +pub const CLD_DUMPED: ::c_int = 3; +pub const CLD_TRAPPED: ::c_int = 4; +pub const CLD_STOPPED: ::c_int = 5; +pub const CLD_CONTINUED: ::c_int = 6; + +pub const SIGEV_SIGNAL: ::c_int = 0; +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_THREAD: ::c_int = 2; + +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; +cfg_if! { + if #[cfg(not(target_os = "emscripten"))] { + pub const P_PIDFD: idtype_t = 3; + } +} + +pub const UTIME_OMIT: c_long = 1073741822; +pub const UTIME_NOW: c_long = 1073741823; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLRDBAND: ::c_short = 0x080; +#[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] +pub const POLLRDHUP: ::c_short = 0x2000; +#[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] +pub const POLLRDHUP: ::c_short = 0x800; + +pub const IPTOS_LOWDELAY: u8 = 0x10; +pub const IPTOS_THROUGHPUT: u8 = 0x08; +pub const IPTOS_RELIABILITY: u8 = 0x04; +pub const IPTOS_MINCOST: u8 = 0x02; + +pub const IPTOS_PREC_NETCONTROL: u8 = 0xe0; +pub const IPTOS_PREC_INTERNETCONTROL: u8 = 0xc0; +pub const IPTOS_PREC_CRITIC_ECP: u8 = 0xa0; +pub const IPTOS_PREC_FLASHOVERRIDE: u8 = 0x80; +pub const IPTOS_PREC_FLASH: u8 = 0x60; +pub const IPTOS_PREC_IMMEDIATE: u8 = 0x40; +pub const IPTOS_PREC_PRIORITY: u8 = 0x20; +pub const IPTOS_PREC_ROUTINE: u8 = 0x00; + +pub const IPTOS_ECN_MASK: u8 = 0x03; +pub const IPTOS_ECN_ECT1: u8 = 0x01; +pub const IPTOS_ECN_ECT0: u8 = 0x02; +pub const IPTOS_ECN_CE: u8 = 0x03; + +pub const IPOPT_COPY: u8 = 0x80; +pub const IPOPT_CLASS_MASK: u8 = 0x60; +pub const IPOPT_NUMBER_MASK: u8 = 0x1f; + +pub const IPOPT_CONTROL: u8 = 0x00; +pub const IPOPT_RESERVED1: u8 = 0x20; +pub const IPOPT_MEASUREMENT: u8 = 0x40; +pub const IPOPT_RESERVED2: u8 = 0x60; +pub const IPOPT_END: u8 = 0 | IPOPT_CONTROL; +pub const IPOPT_NOOP: u8 = 1 | IPOPT_CONTROL; +pub const IPOPT_SEC: u8 = 2 | IPOPT_CONTROL | IPOPT_COPY; +pub const IPOPT_LSRR: u8 = 3 | IPOPT_CONTROL | IPOPT_COPY; +pub const IPOPT_TIMESTAMP: u8 = 4 | IPOPT_MEASUREMENT; +pub const IPOPT_RR: u8 = 7 | IPOPT_CONTROL; +pub const IPOPT_SID: u8 = 8 | IPOPT_CONTROL | IPOPT_COPY; +pub const IPOPT_SSRR: u8 = 9 | IPOPT_CONTROL | IPOPT_COPY; +pub const IPOPT_RA: u8 = 20 | IPOPT_CONTROL | IPOPT_COPY; +pub const IPVERSION: u8 = 4; +pub const MAXTTL: u8 = 255; +pub const IPDEFTTL: u8 = 64; +pub const IPOPT_OPTVAL: u8 = 0; +pub const IPOPT_OLEN: u8 = 1; +pub const IPOPT_OFFSET: u8 = 2; +pub const IPOPT_MINOFF: u8 = 4; +pub const MAX_IPOPTLEN: u8 = 40; +pub const IPOPT_NOP: u8 = IPOPT_NOOP; +pub const IPOPT_EOL: u8 = IPOPT_END; +pub const IPOPT_TS: u8 = IPOPT_TIMESTAMP; +pub const IPOPT_TS_TSONLY: u8 = 0; +pub const IPOPT_TS_TSANDADDR: u8 = 1; +pub const IPOPT_TS_PRESPEC: u8 = 3; + +pub const ARPOP_RREQUEST: u16 = 3; +pub const ARPOP_RREPLY: u16 = 4; +pub const ARPOP_InREQUEST: u16 = 8; +pub const ARPOP_InREPLY: u16 = 9; +pub const ARPOP_NAK: u16 = 10; + +pub const ATF_NETMASK: ::c_int = 0x20; +pub const ATF_DONTPUB: ::c_int = 0x40; + +pub const ARPHRD_NETROM: u16 = 0; +pub const ARPHRD_ETHER: u16 = 1; +pub const ARPHRD_EETHER: u16 = 2; +pub const ARPHRD_AX25: u16 = 3; +pub const ARPHRD_PRONET: u16 = 4; +pub const ARPHRD_CHAOS: u16 = 5; +pub const ARPHRD_IEEE802: u16 = 6; +pub const ARPHRD_ARCNET: u16 = 7; +pub const ARPHRD_APPLETLK: u16 = 8; +pub const ARPHRD_DLCI: u16 = 15; +pub const ARPHRD_ATM: u16 = 19; +pub const ARPHRD_METRICOM: u16 = 23; +pub const ARPHRD_IEEE1394: u16 = 24; +pub const ARPHRD_EUI64: u16 = 27; +pub const ARPHRD_INFINIBAND: u16 = 32; + +pub const ARPHRD_SLIP: u16 = 256; +pub const ARPHRD_CSLIP: u16 = 257; +pub const ARPHRD_SLIP6: u16 = 258; +pub const ARPHRD_CSLIP6: u16 = 259; +pub const ARPHRD_RSRVD: u16 = 260; +pub const ARPHRD_ADAPT: u16 = 264; +pub const ARPHRD_ROSE: u16 = 270; +pub const ARPHRD_X25: u16 = 271; +pub const ARPHRD_HWX25: u16 = 272; +pub const ARPHRD_CAN: u16 = 280; +pub const ARPHRD_PPP: u16 = 512; +pub const ARPHRD_CISCO: u16 = 513; +pub const ARPHRD_HDLC: u16 = ARPHRD_CISCO; +pub const ARPHRD_LAPB: u16 = 516; +pub const ARPHRD_DDCMP: u16 = 517; +pub const ARPHRD_RAWHDLC: u16 = 518; + +pub const ARPHRD_TUNNEL: u16 = 768; +pub const ARPHRD_TUNNEL6: u16 = 769; +pub const ARPHRD_FRAD: u16 = 770; +pub const ARPHRD_SKIP: u16 = 771; +pub const ARPHRD_LOOPBACK: u16 = 772; +pub const ARPHRD_LOCALTLK: u16 = 773; +pub const ARPHRD_FDDI: u16 = 774; +pub const ARPHRD_BIF: u16 = 775; +pub const ARPHRD_SIT: u16 = 776; +pub const ARPHRD_IPDDP: u16 = 777; +pub const ARPHRD_IPGRE: u16 = 778; +pub const ARPHRD_PIMREG: u16 = 779; +pub const ARPHRD_HIPPI: u16 = 780; +pub const ARPHRD_ASH: u16 = 781; +pub const ARPHRD_ECONET: u16 = 782; +pub const ARPHRD_IRDA: u16 = 783; +pub const ARPHRD_FCPP: u16 = 784; +pub const ARPHRD_FCAL: u16 = 785; +pub const ARPHRD_FCPL: u16 = 786; +pub const ARPHRD_FCFABRIC: u16 = 787; +pub const ARPHRD_IEEE802_TR: u16 = 800; +pub const ARPHRD_IEEE80211: u16 = 801; +pub const ARPHRD_IEEE80211_PRISM: u16 = 802; +pub const ARPHRD_IEEE80211_RADIOTAP: u16 = 803; +pub const ARPHRD_IEEE802154: u16 = 804; + +pub const ARPHRD_VOID: u16 = 0xFFFF; +pub const ARPHRD_NONE: u16 = 0xFFFE; + +cfg_if! { + if #[cfg(target_os = "emscripten")] { + // Emscripten does not define any `*_SUPER_MAGIC` constants. + } else if #[cfg(not(target_arch = "s390x"))] { + pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; + pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; + pub const AFS_SUPER_MAGIC: ::c_long = 0x5346414f; + pub const AUTOFS_SUPER_MAGIC: ::c_long = 0x0187; + pub const BPF_FS_MAGIC: ::c_long = 0xcafe4a11; + pub const BTRFS_SUPER_MAGIC: ::c_long = 0x9123683e; + pub const CGROUP2_SUPER_MAGIC: ::c_long = 0x63677270; + pub const CGROUP_SUPER_MAGIC: ::c_long = 0x27e0eb; + pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; + pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; + pub const DEBUGFS_MAGIC: ::c_long = 0x64626720; + pub const DEVPTS_SUPER_MAGIC: ::c_long = 0x1cd1; + pub const ECRYPTFS_SUPER_MAGIC: ::c_long = 0xf15f; + pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; + pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; + pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; + pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; + pub const F2FS_SUPER_MAGIC: ::c_long = 0xf2f52010; + pub const FUSE_SUPER_MAGIC: ::c_long = 0x65735546; + pub const FUTEXFS_SUPER_MAGIC: ::c_long = 0xbad1dea; + pub const HOSTFS_SUPER_MAGIC: ::c_long = 0x00c0ffee; + pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; + pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; + pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; + pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; + pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; + pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; + pub const MINIX3_SUPER_MAGIC: ::c_long = 0x4d5a; + pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; + pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; + pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; + pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; + pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; + pub const NILFS_SUPER_MAGIC: ::c_long = 0x3434; + pub const OCFS2_SUPER_MAGIC: ::c_long = 0x7461636f; + pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; + pub const OVERLAYFS_SUPER_MAGIC: ::c_long = 0x794c7630; + pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; + pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; + pub const QNX6_SUPER_MAGIC: ::c_long = 0x68191122; + pub const RDTGROUP_SUPER_MAGIC: ::c_long = 0x7655821; + pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; + pub const SECURITYFS_MAGIC: ::c_long = 0x73636673; + pub const SELINUX_MAGIC: ::c_long = 0xf97cff8c; + pub const SMACK_MAGIC: ::c_long = 0x43415d53; + pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; + pub const SYSFS_MAGIC: ::c_long = 0x62656572; + pub const TMPFS_MAGIC: ::c_long = 0x01021994; + pub const TRACEFS_MAGIC: ::c_long = 0x74726163; + pub const UDF_SUPER_MAGIC: ::c_long = 0x15013346; + pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; + pub const XENFS_SUPER_MAGIC: ::c_long = 0xabba1974; + pub const NSFS_MAGIC: ::c_long = 0x6e736673; + } else if #[cfg(target_arch = "s390x")] { + pub const ADFS_SUPER_MAGIC: ::c_uint = 0x0000adf5; + pub const AFFS_SUPER_MAGIC: ::c_uint = 0x0000adff; + pub const AFS_SUPER_MAGIC: ::c_uint = 0x5346414f; + pub const AUTOFS_SUPER_MAGIC: ::c_uint = 0x0187; + pub const BPF_FS_MAGIC: ::c_uint = 0xcafe4a11; + pub const BTRFS_SUPER_MAGIC: ::c_uint = 0x9123683e; + pub const CGROUP2_SUPER_MAGIC: ::c_uint = 0x63677270; + pub const CGROUP_SUPER_MAGIC: ::c_uint = 0x27e0eb; + pub const CODA_SUPER_MAGIC: ::c_uint = 0x73757245; + pub const CRAMFS_MAGIC: ::c_uint = 0x28cd3d45; + pub const DEBUGFS_MAGIC: ::c_uint = 0x64626720; + pub const DEVPTS_SUPER_MAGIC: ::c_uint = 0x1cd1; + pub const ECRYPTFS_SUPER_MAGIC: ::c_uint = 0xf15f; + pub const EFS_SUPER_MAGIC: ::c_uint = 0x00414a53; + pub const EXT2_SUPER_MAGIC: ::c_uint = 0x0000ef53; + pub const EXT3_SUPER_MAGIC: ::c_uint = 0x0000ef53; + pub const EXT4_SUPER_MAGIC: ::c_uint = 0x0000ef53; + pub const F2FS_SUPER_MAGIC: ::c_uint = 0xf2f52010; + pub const FUSE_SUPER_MAGIC: ::c_uint = 0x65735546; + pub const FUTEXFS_SUPER_MAGIC: ::c_uint = 0xbad1dea; + pub const HOSTFS_SUPER_MAGIC: ::c_uint = 0x00c0ffee; + pub const HPFS_SUPER_MAGIC: ::c_uint = 0xf995e849; + pub const HUGETLBFS_MAGIC: ::c_uint = 0x958458f6; + pub const ISOFS_SUPER_MAGIC: ::c_uint = 0x00009660; + pub const JFFS2_SUPER_MAGIC: ::c_uint = 0x000072b6; + pub const MINIX2_SUPER_MAGIC2: ::c_uint = 0x00002478; + pub const MINIX2_SUPER_MAGIC: ::c_uint = 0x00002468; + pub const MINIX3_SUPER_MAGIC: ::c_uint = 0x4d5a; + pub const MINIX_SUPER_MAGIC2: ::c_uint = 0x0000138f; + pub const MINIX_SUPER_MAGIC: ::c_uint = 0x0000137f; + pub const MSDOS_SUPER_MAGIC: ::c_uint = 0x00004d44; + pub const NCP_SUPER_MAGIC: ::c_uint = 0x0000564c; + pub const NFS_SUPER_MAGIC: ::c_uint = 0x00006969; + pub const NILFS_SUPER_MAGIC: ::c_uint = 0x3434; + pub const OCFS2_SUPER_MAGIC: ::c_uint = 0x7461636f; + pub const OPENPROM_SUPER_MAGIC: ::c_uint = 0x00009fa1; + pub const OVERLAYFS_SUPER_MAGIC: ::c_uint = 0x794c7630; + pub const PROC_SUPER_MAGIC: ::c_uint = 0x00009fa0; + pub const QNX4_SUPER_MAGIC: ::c_uint = 0x0000002f; + pub const QNX6_SUPER_MAGIC: ::c_uint = 0x68191122; + pub const RDTGROUP_SUPER_MAGIC: ::c_uint = 0x7655821; + pub const REISERFS_SUPER_MAGIC: ::c_uint = 0x52654973; + pub const SECURITYFS_MAGIC: ::c_uint = 0x73636673; + pub const SELINUX_MAGIC: ::c_uint = 0xf97cff8c; + pub const SMACK_MAGIC: ::c_uint = 0x43415d53; + pub const SMB_SUPER_MAGIC: ::c_uint = 0x0000517b; + pub const SYSFS_MAGIC: ::c_uint = 0x62656572; + pub const TMPFS_MAGIC: ::c_uint = 0x01021994; + pub const TRACEFS_MAGIC: ::c_uint = 0x74726163; + pub const UDF_SUPER_MAGIC: ::c_uint = 0x15013346; + pub const USBDEVICE_SUPER_MAGIC: ::c_uint = 0x00009fa2; + pub const XENFS_SUPER_MAGIC: ::c_uint = 0xabba1974; + pub const NSFS_MAGIC: ::c_uint = 0x6e736673; + } +} + +const_fn! { + {const} fn CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) + } +} + +f! { + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut ::c_uchar { + cmsg.offset(1) as *mut ::c_uchar + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::())) + as ::c_uint + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + CMSG_ALIGN(::mem::size_of::()) as ::c_uint + length + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +safe_f! { + pub fn SIGRTMAX() -> ::c_int { + unsafe { __libc_current_sigrtmax() } + } + + pub fn SIGRTMIN() -> ::c_int { + unsafe { __libc_current_sigrtmin() } + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0x7f + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0x7f) + 1) as i8 >= 2 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0x7f) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } + + pub {const} fn W_EXITCODE(ret: ::c_int, sig: ::c_int) -> ::c_int { + (ret << 8) | sig + } + + pub {const} fn W_STOPCODE(sig: ::c_int) -> ::c_int { + (sig << 8) | 0x7f + } + + pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { + (cmd << 8) | (type_ & 0x00ff) + } + + pub {const} fn IPOPT_COPIED(o: u8) -> u8 { + o & IPOPT_COPY + } + + pub {const} fn IPOPT_CLASS(o: u8) -> u8 { + o & IPOPT_CLASS_MASK + } + + pub {const} fn IPOPT_NUMBER(o: u8) -> u8 { + o & IPOPT_NUMBER_MASK + } + + pub {const} fn IPTOS_ECN(x: u8) -> u8 { + x & ::IPTOS_ECN_MASK + } + + #[allow(ellipsis_inclusive_range_patterns)] + pub {const} fn KERNEL_VERSION(a: u32, b: u32, c: u32) -> u32 { + ((a << 16) + (b << 8)) + match c { + 0 ... 255 => c, + _ => 255, + } + } +} + +extern "C" { + #[doc(hidden)] + pub fn __libc_current_sigrtmax() -> ::c_int; + #[doc(hidden)] + pub fn __libc_current_sigrtmin() -> ::c_int; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn mincore(addr: *mut ::c_void, len: ::size_t, vec: *mut ::c_uchar) -> ::c_int; + + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + + pub fn pthread_getattr_np(native: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; + pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_mutexattr_setpshared( + attr: *mut pthread_mutexattr_t, + pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_getpshared( + attr: *const pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; + pub fn ptsname_r(fd: ::c_int, buf: *mut ::c_char, buflen: ::size_t) -> ::c_int; + pub fn clearenv() -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t, suid: *mut ::uid_t) -> ::c_int; + pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t, sgid: *mut ::gid_t) -> ::c_int; + pub fn acct(filename: *const ::c_char) -> ::c_int; + pub fn brk(addr: *mut ::c_void) -> ::c_int; + pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; + #[deprecated( + since = "0.2.66", + note = "causes memory corruption, see rust-lang/libc#1596" + )] + pub fn vfork() -> ::pid_t; + pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; + pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; + pub fn wait4( + pid: ::pid_t, + status: *mut ::c_int, + options: ::c_int, + rusage: *mut ::rusage, + ) -> ::pid_t; + pub fn login_tty(fd: ::c_int) -> ::c_int; + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + + pub fn strchrnul(s: *const ::c_char, c: ::c_int) -> *mut ::c_char; +} + +// LFS64 extensions +// +// * musl has 64-bit versions only so aliases the LFS64 symbols to the standard ones +// * ulibc doesn't have preadv64/pwritev64 +cfg_if! { + if #[cfg(not(target_env = "musl"))] { + extern "C" { + pub fn fstatfs64(fd: ::c_int, buf: *mut statfs64) -> ::c_int; + pub fn statvfs64(path: *const ::c_char, buf: *mut statvfs64) -> ::c_int; + pub fn fstatvfs64(fd: ::c_int, buf: *mut statvfs64) -> ::c_int; + pub fn statfs64(path: *const ::c_char, buf: *mut statfs64) -> ::c_int; + pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int; + pub fn fstatat64( + dirfd: ::c_int, + pathname: *const c_char, + buf: *mut stat64, + flags: ::c_int, + ) -> ::c_int; + pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int; + pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t; + pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn mmap64( + addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off64_t, + ) -> *mut ::c_void; + pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn openat64(fd: ::c_int, path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn posix_fadvise64( + fd: ::c_int, + offset: ::off64_t, + len: ::off64_t, + advise: ::c_int, + ) -> ::c_int; + pub fn pread64( + fd: ::c_int, + buf: *mut ::c_void, + count: ::size_t, + offset: off64_t + ) -> ::ssize_t; + pub fn pwrite64( + fd: ::c_int, + buf: *const ::c_void, + count: ::size_t, + offset: off64_t, + ) -> ::ssize_t; + pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; + pub fn readdir64_r( + dirp: *mut ::DIR, + entry: *mut ::dirent64, + result: *mut *mut ::dirent64, + ) -> ::c_int; + pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int; + pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(not(any(target_env = "uclibc", target_env = "musl")))] { + extern "C" { + pub fn preadv64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + pub fn pwritev64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + } + } +} + +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + extern "C" { + // uclibc has separate non-const version of this function + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, + ) -> ::pid_t; + // uclibc has separate non-const version of this function + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, + ) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(target_os = "emscripten")] { + mod emscripten; + pub use self::emscripten::*; + } else if #[cfg(target_os = "linux")] { + mod linux; + pub use self::linux::*; + } else if #[cfg(target_os = "l4re")] { + mod linux; + pub use self::linux::*; + } else if #[cfg(target_os = "android")] { + mod android; + pub use self::android::*; + } else { + // Unknown target_os + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/mod.rs new file mode 100644 index 0000000..9b5ce0f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/mod.rs @@ -0,0 +1,1630 @@ +//! Definitions found commonly among almost all Unix derivatives +//! +//! More functions and definitions can be found in the more specific modules +//! according to the platform in question. + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type pid_t = i32; +pub type in_addr_t = u32; +pub type in_port_t = u16; +pub type sighandler_t = ::size_t; +pub type cc_t = ::c_uchar; + +cfg_if! { + if #[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))] { + pub type uid_t = ::c_ushort; + pub type gid_t = ::c_ushort; + } else if #[cfg(target_os = "nto")] { + pub type uid_t = i32; + pub type gid_t = i32; + } else { + pub type uid_t = u32; + pub type gid_t = u32; + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum DIR {} +impl ::Copy for DIR {} +impl ::Clone for DIR { + fn clone(&self) -> DIR { + *self + } +} +pub type locale_t = *mut ::c_void; + +s! { + pub struct group { + pub gr_name: *mut ::c_char, + pub gr_passwd: *mut ::c_char, + pub gr_gid: ::gid_t, + pub gr_mem: *mut *mut ::c_char, + } + + pub struct utimbuf { + pub actime: time_t, + pub modtime: time_t, + } + + pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, + } + + // linux x32 compatibility + // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437 + pub struct timespec { + pub tv_sec: time_t, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tv_nsec: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tv_nsec: ::c_long, + } + + pub struct rlimit { + pub rlim_cur: rlim_t, + pub rlim_max: rlim_t, + } + + pub struct rusage { + pub ru_utime: timeval, + pub ru_stime: timeval, + pub ru_maxrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad1: u32, + pub ru_ixrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad2: u32, + pub ru_idrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad3: u32, + pub ru_isrss: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad4: u32, + pub ru_minflt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad5: u32, + pub ru_majflt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad6: u32, + pub ru_nswap: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad7: u32, + pub ru_inblock: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad8: u32, + pub ru_oublock: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad9: u32, + pub ru_msgsnd: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad10: u32, + pub ru_msgrcv: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad11: u32, + pub ru_nsignals: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad12: u32, + pub ru_nvcsw: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad13: u32, + pub ru_nivcsw: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + __pad14: u32, + + #[cfg(any(target_env = "musl", target_env = "ohos", target_os = "emscripten"))] + __reserved: [c_long; 16], + } + + pub struct ipv6_mreq { + pub ipv6mr_multiaddr: in6_addr, + #[cfg(target_os = "android")] + pub ipv6mr_interface: ::c_int, + #[cfg(not(target_os = "android"))] + pub ipv6mr_interface: ::c_uint, + } + + pub struct hostent { + pub h_name: *mut ::c_char, + pub h_aliases: *mut *mut ::c_char, + pub h_addrtype: ::c_int, + pub h_length: ::c_int, + pub h_addr_list: *mut *mut ::c_char, + } + + pub struct iovec { + pub iov_base: *mut ::c_void, + pub iov_len: ::size_t, + } + + pub struct pollfd { + pub fd: ::c_int, + pub events: ::c_short, + pub revents: ::c_short, + } + + pub struct winsize { + pub ws_row: ::c_ushort, + pub ws_col: ::c_ushort, + pub ws_xpixel: ::c_ushort, + pub ws_ypixel: ::c_ushort, + } + + pub struct linger { + pub l_onoff: ::c_int, + pub l_linger: ::c_int, + } + + pub struct sigval { + // Actually a union of an int and a void* + pub sival_ptr: *mut ::c_void + } + + // + pub struct itimerval { + pub it_interval: ::timeval, + pub it_value: ::timeval, + } + + // + pub struct tms { + pub tms_utime: ::clock_t, + pub tms_stime: ::clock_t, + pub tms_cutime: ::clock_t, + pub tms_cstime: ::clock_t, + } + + pub struct servent { + pub s_name: *mut ::c_char, + pub s_aliases: *mut *mut ::c_char, + pub s_port: ::c_int, + pub s_proto: *mut ::c_char, + } + + pub struct protoent { + pub p_name: *mut ::c_char, + pub p_aliases: *mut *mut ::c_char, + pub p_proto: ::c_int, + } +} + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +pub const SIG_DFL: sighandler_t = 0 as sighandler_t; +pub const SIG_IGN: sighandler_t = 1 as sighandler_t; +pub const SIG_ERR: sighandler_t = !0 as sighandler_t; +cfg_if! { + if #[cfg(not(target_os = "nto"))] { + pub const DT_UNKNOWN: u8 = 0; + pub const DT_FIFO: u8 = 1; + pub const DT_CHR: u8 = 2; + pub const DT_DIR: u8 = 4; + pub const DT_BLK: u8 = 6; + pub const DT_REG: u8 = 8; + pub const DT_LNK: u8 = 10; + pub const DT_SOCK: u8 = 12; + } +} +cfg_if! { + if #[cfg(not(target_os = "redox"))] { + pub const FD_CLOEXEC: ::c_int = 0x1; + } +} + +cfg_if! { + if #[cfg(not(target_os = "nto"))] + { + pub const USRQUOTA: ::c_int = 0; + pub const GRPQUOTA: ::c_int = 1; + } +} +pub const SIGIOT: ::c_int = 6; + +pub const S_ISUID: ::mode_t = 0x800; +pub const S_ISGID: ::mode_t = 0x400; +pub const S_ISVTX: ::mode_t = 0x200; + +cfg_if! { + if #[cfg(not(any(target_os = "haiku", target_os = "illumos", + target_os = "solaris")))] { + pub const IF_NAMESIZE: ::size_t = 16; + pub const IFNAMSIZ: ::size_t = IF_NAMESIZE; + } +} + +pub const LOG_EMERG: ::c_int = 0; +pub const LOG_ALERT: ::c_int = 1; +pub const LOG_CRIT: ::c_int = 2; +pub const LOG_ERR: ::c_int = 3; +pub const LOG_WARNING: ::c_int = 4; +pub const LOG_NOTICE: ::c_int = 5; +pub const LOG_INFO: ::c_int = 6; +pub const LOG_DEBUG: ::c_int = 7; + +pub const LOG_KERN: ::c_int = 0; +pub const LOG_USER: ::c_int = 1 << 3; +pub const LOG_MAIL: ::c_int = 2 << 3; +pub const LOG_DAEMON: ::c_int = 3 << 3; +pub const LOG_AUTH: ::c_int = 4 << 3; +pub const LOG_SYSLOG: ::c_int = 5 << 3; +pub const LOG_LPR: ::c_int = 6 << 3; +pub const LOG_NEWS: ::c_int = 7 << 3; +pub const LOG_UUCP: ::c_int = 8 << 3; +pub const LOG_LOCAL0: ::c_int = 16 << 3; +pub const LOG_LOCAL1: ::c_int = 17 << 3; +pub const LOG_LOCAL2: ::c_int = 18 << 3; +pub const LOG_LOCAL3: ::c_int = 19 << 3; +pub const LOG_LOCAL4: ::c_int = 20 << 3; +pub const LOG_LOCAL5: ::c_int = 21 << 3; +pub const LOG_LOCAL6: ::c_int = 22 << 3; +pub const LOG_LOCAL7: ::c_int = 23 << 3; + +cfg_if! { + if #[cfg(not(target_os = "haiku"))] { + pub const LOG_PID: ::c_int = 0x01; + pub const LOG_CONS: ::c_int = 0x02; + pub const LOG_ODELAY: ::c_int = 0x04; + pub const LOG_NDELAY: ::c_int = 0x08; + pub const LOG_NOWAIT: ::c_int = 0x10; + } +} +pub const LOG_PRIMASK: ::c_int = 7; +pub const LOG_FACMASK: ::c_int = 0x3f8; + +cfg_if! { + if #[cfg(not(target_os = "nto"))] + { + pub const PRIO_MIN: ::c_int = -20; + pub const PRIO_MAX: ::c_int = 20; + } +} +pub const IPPROTO_ICMP: ::c_int = 1; +pub const IPPROTO_ICMPV6: ::c_int = 58; +pub const IPPROTO_TCP: ::c_int = 6; +pub const IPPROTO_UDP: ::c_int = 17; +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; + +pub const INADDR_LOOPBACK: in_addr_t = 2130706433; +pub const INADDR_ANY: in_addr_t = 0; +pub const INADDR_BROADCAST: in_addr_t = 4294967295; +pub const INADDR_NONE: in_addr_t = 4294967295; + +pub const ARPOP_REQUEST: u16 = 1; +pub const ARPOP_REPLY: u16 = 2; + +pub const ATF_COM: ::c_int = 0x02; +pub const ATF_PERM: ::c_int = 0x04; +pub const ATF_PUBL: ::c_int = 0x08; +pub const ATF_USETRAILERS: ::c_int = 0x10; + +cfg_if! { + if #[cfg(any(target_os = "l4re", target_os = "espidf"))] { + // required libraries for L4Re and the ESP-IDF framework are linked externally, ATM + } else if #[cfg(feature = "std")] { + // cargo build, don't pull in anything extra as the libstd dep + // already pulls in all libs. + } else if #[cfg(all(target_os = "linux", + any(target_env = "gnu", target_env = "uclibc"), + feature = "rustc-dep-of-std"))] { + #[link(name = "util", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "rt", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "pthread", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "m", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "dl", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "c", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "gcc_eh", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "gcc", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "c", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "util", cfg(not(target_feature = "crt-static")))] + #[link(name = "rt", cfg(not(target_feature = "crt-static")))] + #[link(name = "pthread", cfg(not(target_feature = "crt-static")))] + #[link(name = "m", cfg(not(target_feature = "crt-static")))] + #[link(name = "dl", cfg(not(target_feature = "crt-static")))] + #[link(name = "c", cfg(not(target_feature = "crt-static")))] + extern {} + } else if #[cfg(any(target_env = "musl", target_env = "ohos"))] { + #[cfg_attr(feature = "rustc-dep-of-std", + link(name = "c", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static")))] + #[cfg_attr(feature = "rustc-dep-of-std", + link(name = "c", cfg(not(target_feature = "crt-static"))))] + extern {} + } else if #[cfg(target_os = "emscripten")] { + #[link(name = "c")] + extern {} + } else if #[cfg(all(target_os = "android", feature = "rustc-dep-of-std"))] { + #[link(name = "c", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "m", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static"))] + #[link(name = "m", cfg(not(target_feature = "crt-static")))] + #[link(name = "c", cfg(not(target_feature = "crt-static")))] + extern {} + } else if #[cfg(any(target_os = "macos", + target_os = "ios", + target_os = "tvos", + target_os = "watchos", + target_os = "android", + target_os = "openbsd", + target_os = "nto", + ))] { + #[link(name = "c")] + #[link(name = "m")] + extern {} + } else if #[cfg(target_os = "haiku")] { + #[link(name = "root")] + #[link(name = "network")] + extern {} + } else if #[cfg(target_env = "newlib")] { + #[link(name = "c")] + #[link(name = "m")] + extern {} + } else if #[cfg(target_os = "hermit")] { + // no_default_libraries is set to false for HermitCore, so only a link + // to "pthread" needs to be added. + #[link(name = "pthread")] + extern {} + } else if #[cfg(target_env = "illumos")] { + #[link(name = "c")] + #[link(name = "m")] + extern {} + } else if #[cfg(target_os = "redox")] { + #[cfg_attr(feature = "rustc-dep-of-std", + link(name = "c", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static")))] + #[cfg_attr(feature = "rustc-dep-of-std", + link(name = "c", cfg(not(target_feature = "crt-static"))))] + extern {} + } else if #[cfg(target_env = "aix")] { + #[link(name = "c")] + #[link(name = "m")] + #[link(name = "bsd")] + #[link(name = "pthread")] + extern {} + } else { + #[link(name = "c")] + #[link(name = "m")] + #[link(name = "rt")] + #[link(name = "pthread")] + extern {} + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +impl ::Copy for FILE {} +impl ::Clone for FILE { + fn clone(&self) -> FILE { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos_t {} +impl ::Clone for fpos_t { + fn clone(&self) -> fpos_t { + *self + } +} + +extern "C" { + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + pub fn qsort( + base: *mut c_void, + num: size_t, + size: size_t, + compar: ::Option c_int>, + ); + pub fn bsearch( + key: *const c_void, + base: *const c_void, + num: size_t, + size: size_t, + compar: ::Option c_int>, + ) -> *mut c_void; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fopen$UNIX2003" + )] + pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "freopen$UNIX2003" + )] + pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE; + + pub fn fflush(file: *mut FILE) -> c_int; + pub fn fclose(file: *mut FILE) -> c_int; + pub fn remove(filename: *const c_char) -> c_int; + pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn getchar() -> c_int; + pub fn putchar(c: c_int) -> c_int; + pub fn fgetc(stream: *mut FILE) -> c_int; + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fputs$UNIX2003" + )] + pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; + pub fn puts(s: *const c_char) -> c_int; + pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fwrite$UNIX2003" + )] + pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; + pub fn ftell(stream: *mut FILE) -> c_long; + pub fn rewind(stream: *mut FILE); + #[cfg_attr(target_os = "netbsd", link_name = "__fgetpos50")] + pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__fsetpos50")] + pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; + pub fn feof(stream: *mut FILE) -> c_int; + pub fn ferror(stream: *mut FILE) -> c_int; + pub fn clearerr(stream: *mut FILE); + pub fn perror(s: *const c_char); + pub fn atof(s: *const c_char) -> c_double; + pub fn atoi(s: *const c_char) -> c_int; + pub fn atol(s: *const c_char) -> c_long; + pub fn atoll(s: *const c_char) -> c_longlong; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "strtod$UNIX2003" + )] + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float; + pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; + pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + pub fn malloc(size: size_t) -> *mut c_void; + pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; + pub fn free(p: *mut c_void); + pub fn abort() -> !; + pub fn exit(status: c_int) -> !; + pub fn _exit(status: c_int) -> !; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "system$UNIX2003" + )] + pub fn system(s: *const c_char) -> c_int; + pub fn getenv(s: *const c_char) -> *mut c_char; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + pub fn stpcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strndup(cs: *const c_char, n: size_t) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int; + pub fn strncasecmp(s1: *const c_char, s2: *const c_char, n: size_t) -> c_int; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "strerror$UNIX2003" + )] + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strtok_r(s: *mut c_char, t: *const c_char, p: *mut *mut c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + pub fn strsignal(sig: c_int) -> *mut c_char; + pub fn wcslen(buf: *const wchar_t) -> size_t; + pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; +} + +extern "C" { + #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam50")] + pub fn getpwnam(name: *const ::c_char) -> *mut passwd; + #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid50")] + pub fn getpwuid(uid: ::uid_t) -> *mut passwd; + + pub fn fprintf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn printf(format: *const ::c_char, ...) -> ::c_int; + pub fn snprintf(s: *mut ::c_char, n: ::size_t, format: *const ::c_char, ...) -> ::c_int; + pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_fscanf" + )] + pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_scanf" + )] + pub fn scanf(format: *const ::c_char, ...) -> ::c_int; + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_sscanf" + )] + pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn getchar_unlocked() -> ::c_int; + pub fn putchar_unlocked(c: ::c_int) -> ::c_int; + + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr(target_os = "netbsd", link_name = "__socket30")] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_socket")] + #[cfg_attr(target_os = "espidf", link_name = "lwip_socket")] + pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "connect$UNIX2003" + )] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_connect")] + #[cfg_attr(target_os = "espidf", link_name = "lwip_connect")] + pub fn connect(socket: ::c_int, address: *const sockaddr, len: socklen_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "listen$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_listen")] + pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "accept$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_accept")] + pub fn accept(socket: ::c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "getpeername$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_getpeername")] + pub fn getpeername( + socket: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + ) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "getsockname$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockname")] + pub fn getsockname( + socket: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + ) -> ::c_int; + #[cfg_attr(target_os = "espidf", link_name = "lwip_setsockopt")] + pub fn setsockopt( + socket: ::c_int, + level: ::c_int, + name: ::c_int, + value: *const ::c_void, + option_len: socklen_t, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "socketpair$UNIX2003" + )] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_socketpair")] + pub fn socketpair( + domain: ::c_int, + type_: ::c_int, + protocol: ::c_int, + socket_vector: *mut ::c_int, + ) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sendto$UNIX2003" + )] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_sendto")] + #[cfg_attr(target_os = "espidf", link_name = "lwip_sendto")] + pub fn sendto( + socket: ::c_int, + buf: *const ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *const sockaddr, + addrlen: socklen_t, + ) -> ::ssize_t; + #[cfg_attr(target_os = "espidf", link_name = "lwip_shutdown")] + pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "chmod$UNIX2003" + )] + pub fn chmod(path: *const c_char, mode: mode_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fchmod$UNIX2003" + )] + pub fn fchmod(fd: ::c_int, mode: mode_t) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "fstat$INODE64" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__fstat50")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "fstat@FBSD_1.0" + )] + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + + pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "stat$INODE64" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__stat50")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "stat@FBSD_1.0" + )] + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + + pub fn pclose(stream: *mut ::FILE) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fdopen$UNIX2003" + )] + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "open$UNIX2003" + )] + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "creat$UNIX2003" + )] + pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fcntl$UNIX2003" + )] + pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "opendir$INODE64" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "opendir$INODE64$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__opendir30")] + pub fn opendir(dirname: *const c_char) -> *mut ::DIR; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "readdir$INODE64" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__readdir30")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "readdir@FBSD_1.0" + )] + pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "closedir$UNIX2003" + )] + pub fn closedir(dirp: *mut ::DIR) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "rewinddir$INODE64" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "rewinddir$INODE64$UNIX2003" + )] + pub fn rewinddir(dirp: *mut ::DIR); + + pub fn fchmodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + flags: ::c_int, + ) -> ::c_int; + pub fn fchown(fd: ::c_int, owner: ::uid_t, group: ::gid_t) -> ::c_int; + pub fn fchownat( + dirfd: ::c_int, + pathname: *const ::c_char, + owner: ::uid_t, + group: ::gid_t, + flags: ::c_int, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "fstatat$INODE64" + )] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "fstatat@FBSD_1.1" + )] + pub fn fstatat( + dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut stat, + flags: ::c_int, + ) -> ::c_int; + pub fn linkat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + flags: ::c_int, + ) -> ::c_int; + pub fn renameat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + ) -> ::c_int; + pub fn symlinkat( + target: *const ::c_char, + newdirfd: ::c_int, + linkpath: *const ::c_char, + ) -> ::c_int; + pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, flags: ::c_int) -> ::c_int; + + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + pub fn alarm(seconds: ::c_uint) -> ::c_uint; + pub fn chdir(dir: *const c_char) -> ::c_int; + pub fn fchdir(dirfd: ::c_int) -> ::c_int; + pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "lchown$UNIX2003" + )] + pub fn lchown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "close$NOCANCEL$UNIX2003" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "close$NOCANCEL" + )] + pub fn close(fd: ::c_int) -> ::c_int; + pub fn dup(fd: ::c_int) -> ::c_int; + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + pub fn execl(path: *const c_char, arg0: *const c_char, ...) -> ::c_int; + pub fn execle(path: *const ::c_char, arg0: *const ::c_char, ...) -> ::c_int; + pub fn execlp(file: *const ::c_char, arg0: *const ::c_char, ...) -> ::c_int; + pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::c_int; + pub fn execve( + prog: *const c_char, + argv: *const *const c_char, + envp: *const *const c_char, + ) -> ::c_int; + pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int; + pub fn fork() -> pid_t; + pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; + pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char; + pub fn getegid() -> gid_t; + pub fn geteuid() -> uid_t; + pub fn getgid() -> gid_t; + pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t) -> ::c_int; + #[cfg_attr(target_os = "illumos", link_name = "getloginx")] + pub fn getlogin() -> *mut c_char; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "getopt$UNIX2003" + )] + pub fn getopt(argc: ::c_int, argv: *const *mut c_char, optstr: *const c_char) -> ::c_int; + pub fn getpgid(pid: pid_t) -> pid_t; + pub fn getpgrp() -> pid_t; + pub fn getpid() -> pid_t; + pub fn getppid() -> pid_t; + pub fn getuid() -> uid_t; + pub fn isatty(fd: ::c_int) -> ::c_int; + pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int; + pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; + pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; + pub fn pipe(fds: *mut ::c_int) -> ::c_int; + pub fn posix_memalign(memptr: *mut *mut ::c_void, align: ::size_t, size: ::size_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "read$UNIX2003" + )] + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) -> ::ssize_t; + pub fn rmdir(path: *const c_char) -> ::c_int; + pub fn seteuid(uid: uid_t) -> ::c_int; + pub fn setegid(gid: gid_t) -> ::c_int; + pub fn setgid(gid: gid_t) -> ::c_int; + pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int; + pub fn setsid() -> pid_t; + pub fn setuid(uid: uid_t) -> ::c_int; + pub fn setreuid(ruid: uid_t, euid: uid_t) -> ::c_int; + pub fn setregid(rgid: gid_t, egid: gid_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sleep$UNIX2003" + )] + pub fn sleep(secs: ::c_uint) -> ::c_uint; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "nanosleep$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")] + pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> ::c_int; + pub fn tcgetpgrp(fd: ::c_int) -> pid_t; + pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int; + pub fn ttyname(fd: ::c_int) -> *mut c_char; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "ttyname_r$UNIX2003" + )] + #[cfg_attr(target_os = "illumos", link_name = "__posix_ttyname_r")] + pub fn ttyname_r(fd: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + pub fn unlink(c: *const c_char) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "wait$UNIX2003" + )] + pub fn wait(status: *mut ::c_int) -> pid_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "waitpid$UNIX2003" + )] + pub fn waitpid(pid: pid_t, status: *mut ::c_int, options: ::c_int) -> pid_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "write$UNIX2003" + )] + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pread$UNIX2003" + )] + pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pwrite$UNIX2003" + )] + pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + pub fn umask(mask: mode_t) -> mode_t; + + #[cfg_attr(target_os = "netbsd", link_name = "__utime50")] + pub fn utime(file: *const c_char, buf: *const utimbuf) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "kill$UNIX2003" + )] + pub fn kill(pid: pid_t, sig: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "killpg$UNIX2003" + )] + pub fn killpg(pgrp: pid_t, sig: ::c_int) -> ::c_int; + + pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn mlockall(flags: ::c_int) -> ::c_int; + pub fn munlockall() -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "mmap$UNIX2003" + )] + pub fn mmap( + addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off_t, + ) -> *mut ::c_void; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "munmap$UNIX2003" + )] + pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; + + pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint; + pub fn if_indextoname(ifindex: ::c_uint, ifname: *mut ::c_char) -> *mut ::c_char; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "lstat$INODE64" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "lstat@FBSD_1.0" + )] + pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "fsync$UNIX2003" + )] + pub fn fsync(fd: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "setenv$UNIX2003" + )] + pub fn setenv(name: *const c_char, val: *const c_char, overwrite: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "unsetenv$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__unsetenv13")] + pub fn unsetenv(name: *const c_char) -> ::c_int; + + pub fn symlink(path1: *const c_char, path2: *const c_char) -> ::c_int; + + pub fn truncate(path: *const c_char, length: off_t) -> ::c_int; + pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; + + pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t; + + #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")] + pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int; + + #[cfg_attr( + any( + target_os = "macos", + target_os = "ios", + target_os = "tvos", + target_os = "watchos" + ), + link_name = "realpath$DARWIN_EXTSN" + )] + pub fn realpath(pathname: *const ::c_char, resolved: *mut ::c_char) -> *mut ::c_char; + + pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__times13")] + pub fn times(buf: *mut ::tms) -> ::clock_t; + + pub fn pthread_self() -> ::pthread_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_join$UNIX2003" + )] + pub fn pthread_join(native: ::pthread_t, value: *mut *mut ::c_void) -> ::c_int; + pub fn pthread_exit(value: *mut ::c_void) -> !; + pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; + pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, stack_size: ::size_t) -> ::c_int; + pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, state: ::c_int) -> ::c_int; + pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__libc_thr_yield")] + pub fn sched_yield() -> ::c_int; + pub fn pthread_key_create( + key: *mut pthread_key_t, + dtor: ::Option, + ) -> ::c_int; + pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; + pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; + pub fn pthread_setspecific(key: pthread_key_t, value: *const ::c_void) -> ::c_int; + pub fn pthread_mutex_init( + lock: *mut pthread_mutex_t, + attr: *const pthread_mutexattr_t, + ) -> ::c_int; + pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> ::c_int; + + pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_mutexattr_destroy$UNIX2003" + )] + pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int; + pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, _type: ::c_int) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_init$UNIX2003" + )] + pub fn pthread_cond_init(cond: *mut pthread_cond_t, attr: *const pthread_condattr_t) + -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_wait$UNIX2003" + )] + pub fn pthread_cond_wait(cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_cond_timedwait$UNIX2003" + )] + pub fn pthread_cond_timedwait( + cond: *mut pthread_cond_t, + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int; + pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> ::c_int; + pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_init$UNIX2003" + )] + pub fn pthread_rwlock_init( + lock: *mut pthread_rwlock_t, + attr: *const pthread_rwlockattr_t, + ) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_destroy$UNIX2003" + )] + pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_rdlock$UNIX2003" + )] + pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_tryrdlock$UNIX2003" + )] + pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_wrlock$UNIX2003" + )] + pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_trywrlock$UNIX2003" + )] + pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pthread_rwlock_unlock$UNIX2003" + )] + pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> ::c_int; + pub fn pthread_rwlockattr_init(attr: *mut pthread_rwlockattr_t) -> ::c_int; + pub fn pthread_rwlockattr_destroy(attr: *mut pthread_rwlockattr_t) -> ::c_int; + + #[cfg_attr(target_os = "illumos", link_name = "__xnet_getsockopt")] + #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockopt")] + pub fn getsockopt( + sockfd: ::c_int, + level: ::c_int, + optname: ::c_int, + optval: *mut ::c_void, + optlen: *mut ::socklen_t, + ) -> ::c_int; + pub fn raise(signum: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")] + pub fn utimes(filename: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn dlopen(filename: *const ::c_char, flag: ::c_int) -> *mut ::c_void; + pub fn dlerror() -> *mut ::c_char; + pub fn dlsym(handle: *mut ::c_void, symbol: *const ::c_char) -> *mut ::c_void; + pub fn dlclose(handle: *mut ::c_void) -> ::c_int; + + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr(target_os = "illumos", link_name = "__xnet_getaddrinfo")] + #[cfg_attr(target_os = "espidf", link_name = "lwip_getaddrinfo")] + pub fn getaddrinfo( + node: *const c_char, + service: *const c_char, + hints: *const addrinfo, + res: *mut *mut addrinfo, + ) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr(target_os = "espidf", link_name = "lwip_freeaddrinfo")] + pub fn freeaddrinfo(res: *mut addrinfo); + pub fn hstrerror(errcode: ::c_int) -> *const ::c_char; + pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; + #[cfg_attr( + any( + all( + target_os = "linux", + not(any(target_env = "musl", target_env = "ohos")) + ), + target_os = "freebsd", + target_os = "dragonfly", + target_os = "haiku" + ), + link_name = "__res_init" + )] + #[cfg_attr( + any( + target_os = "macos", + target_os = "ios", + target_os = "tvos", + target_os = "watchos" + ), + link_name = "res_9_init" + )] + pub fn res_init() -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "mktime$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn mktime(tm: *mut tm) -> time_t; + #[cfg_attr(target_os = "netbsd", link_name = "__time50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn time(time: *mut time_t) -> time_t; + #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn gmtime(time_p: *const time_t) -> *mut tm; + #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn localtime(time_p: *const time_t) -> *mut tm; + #[cfg_attr(target_os = "netbsd", link_name = "__difftime50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn difftime(time1: time_t, time0: time_t) -> ::c_double; + #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")] + #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] + // FIXME: for `time_t` + pub fn timegm(tm: *mut ::tm) -> time_t; + + #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "mknod@FBSD_1.0" + )] + pub fn mknod(pathname: *const ::c_char, mode: ::mode_t, dev: ::dev_t) -> ::c_int; + pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn endservent(); + pub fn getservbyname(name: *const ::c_char, proto: *const ::c_char) -> *mut servent; + pub fn getservbyport(port: ::c_int, proto: *const ::c_char) -> *mut servent; + pub fn getservent() -> *mut servent; + pub fn setservent(stayopen: ::c_int); + pub fn getprotobyname(name: *const ::c_char) -> *mut protoent; + pub fn getprotobynumber(proto: ::c_int) -> *mut protoent; + pub fn chroot(name: *const ::c_char) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "usleep$UNIX2003" + )] + pub fn usleep(secs: ::c_uint) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "send$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_send")] + pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "recv$UNIX2003" + )] + #[cfg_attr(target_os = "espidf", link_name = "lwip_recv")] + pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "putenv$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__putenv50")] + pub fn putenv(string: *mut c_char) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "poll$UNIX2003" + )] + pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "select$1050" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "select$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__select50")] + pub fn select( + nfds: ::c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *mut timeval, + ) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__setlocale50")] + pub fn setlocale(category: ::c_int, locale: *const ::c_char) -> *mut ::c_char; + pub fn localeconv() -> *mut lconv; + + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "sem_wait$UNIX2003" + )] + pub fn sem_wait(sem: *mut sem_t) -> ::c_int; + pub fn sem_trywait(sem: *mut sem_t) -> ::c_int; + pub fn sem_post(sem: *mut sem_t) -> ::c_int; + pub fn statvfs(path: *const c_char, buf: *mut statvfs) -> ::c_int; + pub fn fstatvfs(fd: ::c_int, buf: *mut statvfs) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")] + pub fn sigemptyset(set: *mut sigset_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")] + pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigfillset14")] + pub fn sigfillset(set: *mut sigset_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigdelset14")] + pub fn sigdelset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigismember14")] + pub fn sigismember(set: *const sigset_t, signum: ::c_int) -> ::c_int; + + #[cfg_attr(target_os = "netbsd", link_name = "__sigprocmask14")] + pub fn sigprocmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigpending14")] + pub fn sigpending(set: *mut sigset_t) -> ::c_int; + + pub fn sysconf(name: ::c_int) -> ::c_long; + + pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; + + pub fn fseeko(stream: *mut ::FILE, offset: ::off_t, whence: ::c_int) -> ::c_int; + pub fn ftello(stream: *mut ::FILE) -> ::off_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "tcdrain$UNIX2003" + )] + pub fn tcdrain(fd: ::c_int) -> ::c_int; + pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t; + pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t; + pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int; + pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int; + pub fn tcsetattr(fd: ::c_int, optional_actions: ::c_int, termios: *const ::termios) -> ::c_int; + pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int; + pub fn tcgetsid(fd: ::c_int) -> ::pid_t; + pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int; + pub fn mkstemp(template: *mut ::c_char) -> ::c_int; + pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char; + + pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; + + pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int); + pub fn closelog(); + pub fn setlogmask(maskpri: ::c_int) -> ::c_int; + #[cfg_attr(target_os = "macos", link_name = "syslog$DARWIN_EXTSN")] + pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "nice$UNIX2003" + )] + pub fn nice(incr: ::c_int) -> ::c_int; + + pub fn grantpt(fd: ::c_int) -> ::c_int; + pub fn posix_openpt(flags: ::c_int) -> ::c_int; + pub fn ptsname(fd: ::c_int) -> *mut ::c_char; + pub fn unlockpt(fd: ::c_int) -> ::c_int; + + pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t; + + pub fn lockf(fd: ::c_int, cmd: ::c_int, len: ::off_t) -> ::c_int; + +} +cfg_if! { + if #[cfg(not(any(target_os = "emscripten", + target_os = "android", + target_os = "haiku", + target_os = "nto")))] { + extern "C" { + pub fn adjtime(delta: *const timeval, olddelta: *mut timeval) -> ::c_int; + pub fn stpncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + } + } +} + +cfg_if! { + if #[cfg(not(target_os = "aix"))] { + extern "C" { + pub fn dladdr(addr: *const ::c_void, info: *mut Dl_info) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(not(any(target_env = "uclibc", target_os = "nto")))] { + extern "C" { + pub fn open_wmemstream( + ptr: *mut *mut wchar_t, + sizeloc: *mut size_t, + ) -> *mut FILE; + } + } +} + +cfg_if! { + if #[cfg(not(target_os = "redox"))] { + extern { + pub fn getsid(pid: pid_t) -> pid_t; + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "pause$UNIX2003")] + pub fn pause() -> ::c_int; + + pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, + mode: ::mode_t) -> ::c_int; + pub fn openat(dirfd: ::c_int, pathname: *const ::c_char, + flags: ::c_int, ...) -> ::c_int; + + #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"), + link_name = "fdopendir$INODE64")] + #[cfg_attr(all(target_os = "macos", target_arch = "x86"), + link_name = "fdopendir$INODE64$UNIX2003")] + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + + #[cfg_attr(all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "readdir_r$INODE64")] + #[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")] + #[cfg_attr( + all(target_os = "freebsd", any(freebsd11, freebsd10)), + link_name = "readdir_r@FBSD_1.0" + )] + #[allow(non_autolinks)] // FIXME: `<>` breaks line length limit. + /// The 64-bit libc on Solaris and illumos only has readdir_r. If a + /// 32-bit Solaris or illumos target is ever created, it should use + /// __posix_readdir_r. See libc(3LIB) on Solaris or illumos: + /// https://illumos.org/man/3lib/libc + /// https://docs.oracle.com/cd/E36784_01/html/E36873/libc-3lib.html + /// https://www.unix.com/man-page/opensolaris/3LIB/libc/ + pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, + result: *mut *mut ::dirent) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(target_os = "nto")] { + extern { + pub fn readlinkat(dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut ::c_char, + bufsiz: ::size_t) -> ::c_int; + pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: ::size_t) -> ::c_int; + pub fn pselect( + nfds: ::c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *mut timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + pub fn sigaction( + signum: ::c_int, + act: *const sigaction, + oldact: *mut sigaction + ) -> ::c_int; + } + } else { + extern { + pub fn readlinkat(dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut ::c_char, + bufsiz: ::size_t) -> ::ssize_t; + pub fn fmemopen(buf: *mut c_void, size: size_t, mode: *const c_char) -> *mut FILE; + pub fn open_memstream(ptr: *mut *mut c_char, sizeloc: *mut size_t) -> *mut FILE; + pub fn atexit(cb: extern "C" fn()) -> c_int; + #[cfg_attr(target_os = "netbsd", link_name = "__sigaction14")] + pub fn sigaction( + signum: ::c_int, + act: *const sigaction, + oldact: *mut sigaction + ) -> ::c_int; + pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: ::size_t) -> ::ssize_t; + #[cfg_attr( + all(target_os = "macos", target_arch = "x86_64"), + link_name = "pselect$1050" + )] + #[cfg_attr( + all(target_os = "macos", target_arch = "x86"), + link_name = "pselect$UNIX2003" + )] + #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")] + pub fn pselect( + nfds: ::c_int, + readfds: *mut fd_set, + writefds: *mut fd_set, + errorfds: *mut fd_set, + timeout: *const timespec, + sigmask: *const sigset_t, + ) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(not(any(target_os = "solaris", + target_os = "illumos", + target_os = "nto", + )))] { + extern { + pub fn cfmakeraw(termios: *mut ::termios); + pub fn cfsetspeed(termios: *mut ::termios, + speed: ::speed_t) -> ::c_int; + } + } +} + +cfg_if! { + if #[cfg(target_env = "newlib")] { + mod newlib; + pub use self::newlib::*; + } else if #[cfg(any(target_os = "linux", + target_os = "l4re", + target_os = "android", + target_os = "emscripten"))] { + mod linux_like; + pub use self::linux_like::*; + } else if #[cfg(any(target_os = "macos", + target_os = "ios", + target_os = "tvos", + target_os = "watchos", + target_os = "freebsd", + target_os = "dragonfly", + target_os = "openbsd", + target_os = "netbsd"))] { + mod bsd; + pub use self::bsd::*; + } else if #[cfg(any(target_os = "solaris", + target_os = "illumos"))] { + mod solarish; + pub use self::solarish::*; + } else if #[cfg(target_os = "haiku")] { + mod haiku; + pub use self::haiku::*; + } else if #[cfg(target_os = "hermit")] { + mod hermit; + pub use self::hermit::*; + } else if #[cfg(target_os = "redox")] { + mod redox; + pub use self::redox::*; + } else if #[cfg(target_os = "nto")] { + mod nto; + pub use self::nto::*; + } else if #[cfg(target_os = "aix")] { + mod aix; + pub use self::aix::*; + } else { + // Unknown target_os + } +} + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } else { + mod no_align; + pub use self::no_align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/aarch64/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/aarch64/mod.rs new file mode 100644 index 0000000..d686b36 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/aarch64/mod.rs @@ -0,0 +1,54 @@ +pub type clock_t = ::c_long; +pub type c_char = u8; +pub type wchar_t = u32; + +pub type c_long = i64; +pub type c_ulong = u64; + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } +} + +pub const AF_INET6: ::c_int = 23; + +pub const FIONBIO: ::c_ulong = 1; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; + +pub const SOL_SOCKET: ::c_int = 65535; + +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTWAIT: ::c_int = 4; +pub const MSG_DONTROUTE: ::c_int = 0; +pub const MSG_WAITALL: ::c_int = 0; +pub const MSG_MORE: ::c_int = 0; +pub const MSG_NOSIGNAL: ::c_int = 0; + +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/align.rs new file mode 100644 index 0000000..db9beb8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/align.rs @@ -0,0 +1,61 @@ +macro_rules! expand_align { + () => { + s! { + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))), + repr(align(8)))] + pub struct pthread_mutex_t { // Unverified + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + #[cfg_attr(all(target_pointer_width = "32", + any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc")), + repr(align(4)))] + #[cfg_attr(any(target_pointer_width = "64", + not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))), + repr(align(8)))] + pub struct pthread_rwlock_t { // Unverified + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + #[cfg_attr(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64"), + repr(align(4)))] + #[cfg_attr(not(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64")), + repr(align(8)))] + pub struct pthread_mutexattr_t { // Unverified + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[repr(align(8))] + pub struct pthread_cond_t { // Unverified + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { // Unverified + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/arm/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/arm/mod.rs new file mode 100644 index 0000000..f644349 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/arm/mod.rs @@ -0,0 +1,56 @@ +pub type clock_t = ::c_long; +pub type c_char = u8; +pub type wchar_t = u32; + +pub type c_long = i32; +pub type c_ulong = u32; + +s! { + pub struct sockaddr { + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_in { + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [u8; 8], + } + + pub struct sockaddr_storage { + pub ss_family: ::sa_family_t, + pub __ss_padding: [u8; 26], + } +} + +pub const AF_INET6: ::c_int = 23; + +pub const FIONBIO: ::c_ulong = 1; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLHUP: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLOUT: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; + +pub const SOL_SOCKET: ::c_int = 65535; + +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTWAIT: ::c_int = 4; +pub const MSG_DONTROUTE: ::c_int = 0; +pub const MSG_WAITALL: ::c_int = 0; +pub const MSG_MORE: ::c_int = 0; +pub const MSG_NOSIGNAL: ::c_int = 0; + +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/espidf/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/espidf/mod.rs new file mode 100644 index 0000000..804cd66 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/espidf/mod.rs @@ -0,0 +1,110 @@ +pub type clock_t = ::c_ulong; +pub type c_char = i8; +pub type wchar_t = u32; + +pub type c_long = i32; +pub type c_ulong = u32; + +s! { + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct sockaddr_un { + pub sun_family: ::sa_family_t, + pub sun_path: [::c_char; 108], + } + + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct sockaddr_storage { + pub s2_len: u8, + pub ss_family: ::sa_family_t, + pub s2_data1: [::c_char; 2], + pub s2_data2: [u32; 3], + pub s2_data3: [u32; 3], + } +} + +pub const AF_UNIX: ::c_int = 1; +pub const AF_INET6: ::c_int = 10; + +pub const FIONBIO: ::c_ulong = 2147772030; + +pub const POLLIN: ::c_short = 1 << 0; +pub const POLLRDNORM: ::c_short = 1 << 1; +pub const POLLRDBAND: ::c_short = 1 << 2; +pub const POLLPRI: ::c_short = POLLRDBAND; +pub const POLLOUT: ::c_short = 1 << 3; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLWRBAND: ::c_short = 1 << 4; +pub const POLLERR: ::c_short = 1 << 5; +pub const POLLHUP: ::c_short = 1 << 6; + +pub const SOL_SOCKET: ::c_int = 0xfff; + +pub const MSG_OOB: ::c_int = 0x04; +pub const MSG_PEEK: ::c_int = 0x01; +pub const MSG_DONTWAIT: ::c_int = 0x08; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_WAITALL: ::c_int = 0x02; +pub const MSG_MORE: ::c_int = 0x10; +pub const MSG_NOSIGNAL: ::c_int = 0x20; +pub const MSG_TRUNC: ::c_int = 0x04; +pub const MSG_CTRUNC: ::c_int = 0x08; +pub const MSG_EOR: ::c_int = 0x08; + +pub const PTHREAD_STACK_MIN: ::size_t = 768; + +extern "C" { + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(_: *mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + + #[link_name = "lwip_sendmsg"] + pub fn sendmsg(s: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + #[link_name = "lwip_recvmsg"] + pub fn recvmsg(s: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + + pub fn eventfd(initval: ::c_uint, flags: ::c_int) -> ::c_int; +} + +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/generic.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/generic.rs new file mode 100644 index 0000000..db7797f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/generic.rs @@ -0,0 +1,27 @@ +//! Common types used by most newlib platforms + +s! { + pub struct sigset_t { + __val: [::c_ulong; 16], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_spare1: ::c_long, + pub st_mtime: ::time_t, + pub st_spare2: ::c_long, + pub st_ctime: ::time_t, + pub st_spare3: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_spare4: [::c_long; 2usize], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/horizon/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/horizon/mod.rs new file mode 100644 index 0000000..bcb93ad --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/horizon/mod.rs @@ -0,0 +1,268 @@ +//! ARMv6K Nintendo 3DS C Newlib definitions + +pub type c_char = u8; +pub type c_long = i32; +pub type c_ulong = u32; + +pub type wchar_t = ::c_uint; + +pub type u_register_t = ::c_uint; +pub type u_char = ::c_uchar; +pub type u_short = ::c_ushort; +pub type u_int = ::c_uint; +pub type u_long = c_ulong; +pub type ushort = ::c_ushort; +pub type uint = ::c_uint; +pub type ulong = c_ulong; +pub type clock_t = c_ulong; +pub type daddr_t = c_long; +pub type caddr_t = *mut c_char; +pub type sbintime_t = ::c_longlong; +pub type sigset_t = ::c_ulong; + +s! { + pub struct sockaddr { + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 26usize], + } + + pub struct sockaddr_storage { + pub ss_family: ::sa_family_t, + pub __ss_padding: [::c_char; 26usize], + } + + pub struct sockaddr_in { + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + } + + pub struct sockaddr_in6 { + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_un { + pub sun_len: ::c_uchar, + pub sun_family: ::sa_family_t, + pub sun_path: [::c_char; 104usize], + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atim: ::timespec, + pub st_mtim: ::timespec, + pub st_ctim: ::timespec, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_spare4: [::c_long; 2usize], + } +} + +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_SIGNAL: ::c_int = 2; +pub const SIGEV_THREAD: ::c_int = 3; +pub const SA_NOCLDSTOP: ::c_int = 1; +pub const MINSIGSTKSZ: ::c_int = 2048; +pub const SIGSTKSZ: ::c_int = 8192; +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; +pub const SIG_SETMASK: ::c_int = 0; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGTRAP: ::c_int = 5; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGBUS: ::c_int = 10; +pub const SIGSEGV: ::c_int = 11; +pub const SIGSYS: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGURG: ::c_int = 16; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGCONT: ::c_int = 19; +pub const SIGCHLD: ::c_int = 20; +pub const SIGCLD: ::c_int = 20; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGIO: ::c_int = 23; +pub const SIGPOLL: ::c_int = 23; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGLOST: ::c_int = 29; +pub const SIGUSR1: ::c_int = 30; +pub const SIGUSR2: ::c_int = 31; +pub const NSIG: ::c_int = 32; +pub const CLOCK_ENABLED: ::c_uint = 1; +pub const CLOCK_DISABLED: ::c_uint = 0; +pub const CLOCK_ALLOWED: ::c_uint = 1; +pub const CLOCK_DISALLOWED: ::c_uint = 0; +pub const TIMER_ABSTIME: ::c_uint = 4; +pub const SOL_SOCKET: ::c_int = 65535; +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_DONTWAIT: ::c_int = 4; +pub const MSG_DONTROUTE: ::c_int = 0; +pub const MSG_WAITALL: ::c_int = 0; +pub const MSG_MORE: ::c_int = 0; +pub const MSG_NOSIGNAL: ::c_int = 0; +pub const SOL_CONFIG: ::c_uint = 65534; + +pub const _SC_PAGESIZE: ::c_int = 8; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; + +pub const PTHREAD_STACK_MIN: ::size_t = 4096; +pub const WNOHANG: ::c_int = 1; + +pub const POLLIN: ::c_short = 0x0001; +pub const POLLPRI: ::c_short = 0x0002; +pub const POLLOUT: ::c_short = 0x0004; +pub const POLLRDNORM: ::c_short = 0x0040; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLRDBAND: ::c_short = 0x0080; +pub const POLLWRBAND: ::c_short = 0x0100; +pub const POLLERR: ::c_short = 0x0008; +pub const POLLHUP: ::c_short = 0x0010; +pub const POLLNVAL: ::c_short = 0x0020; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_BADHINTS: ::c_int = 12; +pub const EAI_PROTOCOL: ::c_int = 13; +pub const EAI_OVERFLOW: ::c_int = 14; +pub const EAI_MAX: ::c_int = 15; + +pub const AF_UNIX: ::c_int = 1; +pub const AF_INET6: ::c_int = 23; + +pub const FIONBIO: ::c_ulong = 1; + +pub const RTLD_DEFAULT: *mut ::c_void = 0 as *mut ::c_void; + +// For pthread get/setschedparam +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; + +// For getrandom() +pub const GRND_NONBLOCK: ::c_uint = 0x1; +pub const GRND_RANDOM: ::c_uint = 0x2; + +// Horizon OS works doesn't or can't hold any of this information +safe_f! { + pub {const} fn WIFSTOPPED(_status: ::c_int) -> bool { + false + } + + pub {const} fn WSTOPSIG(_status: ::c_int) -> ::c_int { + 0 + } + + pub {const} fn WIFCONTINUED(_status: ::c_int) -> bool { + true + } + + pub {const} fn WIFSIGNALED(_status: ::c_int) -> bool { + false + } + + pub {const} fn WTERMSIG(_status: ::c_int) -> ::c_int { + 0 + } + + pub {const} fn WIFEXITED(_status: ::c_int) -> bool { + true + } + + pub {const} fn WEXITSTATUS(_status: ::c_int) -> ::c_int { + 0 + } + + pub {const} fn WCOREDUMP(_status: ::c_int) -> bool { + false + } +} + +extern "C" { + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(_: *mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + + pub fn pthread_attr_getschedparam( + attr: *const ::pthread_attr_t, + param: *mut sched_param, + ) -> ::c_int; + + pub fn pthread_attr_setschedparam( + attr: *mut ::pthread_attr_t, + param: *const sched_param, + ) -> ::c_int; + + pub fn pthread_attr_getprocessorid_np( + attr: *const ::pthread_attr_t, + processor_id: *mut ::c_int, + ) -> ::c_int; + + pub fn pthread_attr_setprocessorid_np( + attr: *mut ::pthread_attr_t, + processor_id: ::c_int, + ) -> ::c_int; + + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut ::sched_param, + ) -> ::c_int; + + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn pthread_condattr_getclock( + attr: *const ::pthread_condattr_t, + clock_id: *mut ::clockid_t, + ) -> ::c_int; + + pub fn pthread_condattr_setclock( + attr: *mut ::pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + + pub fn pthread_getprocessorid_np() -> ::c_int; + + pub fn getrandom(buf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + + pub fn gethostid() -> ::c_long; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/mod.rs new file mode 100644 index 0000000..ce84f14 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/mod.rs @@ -0,0 +1,789 @@ +pub type blkcnt_t = i32; +pub type blksize_t = i32; + +cfg_if! { + if #[cfg(target_os = "vita")] { + pub type clockid_t = ::c_uint; + } else { + pub type clockid_t = ::c_ulong; + } +} + +cfg_if! { + if #[cfg(any(target_os = "espidf"))] { + pub type dev_t = ::c_short; + pub type ino_t = ::c_ushort; + pub type off_t = ::c_long; + } else if #[cfg(any(target_os = "vita"))] { + pub type dev_t = ::c_short; + pub type ino_t = ::c_ushort; + pub type off_t = ::c_int; + } else { + pub type dev_t = u32; + pub type ino_t = u32; + pub type off_t = i64; + } +} + +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u32; +pub type id_t = u32; +pub type key_t = ::c_int; +pub type loff_t = ::c_longlong; +pub type mode_t = ::c_uint; +pub type nfds_t = u32; +pub type nlink_t = ::c_ushort; +pub type pthread_t = ::c_ulong; +pub type pthread_key_t = ::c_uint; +pub type rlim_t = u32; + +cfg_if! { + if #[cfg(target_os = "horizon")] { + pub type sa_family_t = u16; + } else { + pub type sa_family_t = u8; + } +} + +pub type socklen_t = u32; +pub type speed_t = u32; +pub type suseconds_t = i32; +pub type tcflag_t = ::c_uint; +pub type useconds_t = u32; + +cfg_if! { + if #[cfg(any(target_os = "horizon", all(target_os = "espidf", espidf_time64)))] { + pub type time_t = ::c_longlong; + } else { + pub type time_t = i32; + } +} + +s! { + // The order of the `ai_addr` field in this struct is crucial + // for converting between the Rust and C types. + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + + #[cfg(target_os = "espidf")] + pub ai_addr: *mut sockaddr, + + pub ai_canonname: *mut ::c_char, + + #[cfg(not(any( + target_os = "espidf", + all(libc_cfg_target_vendor, target_arch = "powerpc", target_vendor = "nintendo"))))] + pub ai_addr: *mut sockaddr, + + pub ai_next: *mut addrinfo, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct linger { + pub l_onoff: ::c_int, + pub l_linger: ::c_int, + } + + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct hostent { + pub h_name: *mut ::c_char, + pub h_aliases: *mut *mut ::c_char, + pub h_addrtype: ::c_int, + pub h_length: ::c_int, + pub h_addr_list: *mut *mut ::c_char, + pub h_addr: *mut ::c_char, + } + + pub struct pollfd { + pub fd: ::c_int, + pub events: ::c_int, + pub revents: ::c_int, + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: fsblkcnt_t, + pub f_bfree: fsblkcnt_t, + pub f_bavail: fsblkcnt_t, + pub f_files: fsfilcnt_t, + pub f_ffree: fsfilcnt_t, + pub f_favail: fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct sigaction { + pub sa_handler: extern fn(arg1: ::c_int), + pub sa_mask: sigset_t, + pub sa_flags: ::c_int, + } + + pub struct dirent { + #[cfg(not(target_os = "vita"))] + pub d_ino: ino_t, + #[cfg(not(target_os = "vita"))] + pub d_type: ::c_uchar, + #[cfg(target_os = "vita")] + __offset: [u8; 88], + pub d_name: [::c_char; 256usize], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_flags: ::c_int, + pub ss_size: usize, + } + + pub struct fd_set { // Unverified + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct passwd { // Unverified + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct termios { // Unverified + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + } + + pub struct sem_t { // Unverified + __size: [::c_char; 16], + } + + pub struct Dl_info { // Unverified + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct utsname { // Unverified + pub sysname: [::c_char; 65], + pub nodename: [::c_char; 65], + pub release: [::c_char; 65], + pub version: [::c_char; 65], + pub machine: [::c_char; 65], + pub domainname: [::c_char; 65] + } + + pub struct cpu_set_t { // Unverified + bits: [u32; 32], + } + + pub struct pthread_attr_t { // Unverified + __size: [u8; __SIZEOF_PTHREAD_ATTR_T] + } + + pub struct pthread_rwlockattr_t { // Unverified + __size: [u8; __SIZEOF_PTHREAD_RWLOCKATTR_T] + } +} + +// unverified constants +align_const! { + pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + size: [__PTHREAD_INITIALIZER_BYTE; __SIZEOF_PTHREAD_MUTEX_T], + }; + pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + size: [__PTHREAD_INITIALIZER_BYTE; __SIZEOF_PTHREAD_COND_T], + }; + pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + size: [__PTHREAD_INITIALIZER_BYTE; __SIZEOF_PTHREAD_RWLOCK_T], + }; +} +pub const NCCS: usize = 32; + +cfg_if! { + if #[cfg(target_os = "espidf")] { + const __PTHREAD_INITIALIZER_BYTE: u8 = 0xff; + pub const __SIZEOF_PTHREAD_ATTR_T: usize = 32; + pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 4; + pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 12; + pub const __SIZEOF_PTHREAD_COND_T: usize = 4; + pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8; + pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 4; + pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 12; + pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + } else if #[cfg(target_os = "vita")] { + const __PTHREAD_INITIALIZER_BYTE: u8 = 0xff; + pub const __SIZEOF_PTHREAD_ATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 4; + pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_COND_T: usize = 4; + pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 4; + pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 4; + } else { + const __PTHREAD_INITIALIZER_BYTE: u8 = 0; + pub const __SIZEOF_PTHREAD_ATTR_T: usize = 56; + pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; + pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_COND_T: usize = 48; + pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; + pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; + pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; + pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; + } +} + +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; +pub const __PTHREAD_MUTEX_HAVE_PREV: usize = 1; +pub const __PTHREAD_RWLOCK_INT_FLAGS_SHARED: usize = 1; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; + +cfg_if! { + if #[cfg(any(target_os = "horizon", target_os = "espidf"))] { + pub const FD_SETSIZE: usize = 64; + } else if #[cfg(target_os = "vita")] { + pub const FD_SETSIZE: usize = 256; + } else { + pub const FD_SETSIZE: usize = 1024; + } +} +// intentionally not public, only used for fd_set +const ULONG_SIZE: usize = 32; + +// Other constants +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const EDEADLK: ::c_int = 45; +pub const ENOLCK: ::c_int = 46; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENOLINK: ::c_int = 67; +pub const EPROTO: ::c_int = 71; +pub const EMULTIHOP: ::c_int = 74; +pub const EBADMSG: ::c_int = 77; +pub const EFTYPE: ::c_int = 79; +pub const ENOSYS: ::c_int = 88; +pub const ENOTEMPTY: ::c_int = 90; +pub const ENAMETOOLONG: ::c_int = 91; +pub const ELOOP: ::c_int = 92; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EAFNOSUPPORT: ::c_int = 106; +pub const EPROTOTYPE: ::c_int = 107; +pub const ENOTSOCK: ::c_int = 108; +pub const ENOPROTOOPT: ::c_int = 109; +pub const ECONNREFUSED: ::c_int = 111; +pub const EADDRINUSE: ::c_int = 112; +pub const ECONNABORTED: ::c_int = 113; +pub const ENETUNREACH: ::c_int = 114; +pub const ENETDOWN: ::c_int = 115; +pub const ETIMEDOUT: ::c_int = 116; +pub const EHOSTDOWN: ::c_int = 117; +pub const EHOSTUNREACH: ::c_int = 118; +pub const EINPROGRESS: ::c_int = 119; +pub const EALREADY: ::c_int = 120; +pub const EDESTADDRREQ: ::c_int = 121; +pub const EMSGSIZE: ::c_int = 122; +pub const EPROTONOSUPPORT: ::c_int = 123; +pub const EADDRNOTAVAIL: ::c_int = 125; +pub const ENETRESET: ::c_int = 126; +pub const EISCONN: ::c_int = 127; +pub const ENOTCONN: ::c_int = 128; +pub const ETOOMANYREFS: ::c_int = 129; +pub const EDQUOT: ::c_int = 132; +pub const ESTALE: ::c_int = 133; +pub const ENOTSUP: ::c_int = 134; +pub const EILSEQ: ::c_int = 138; +pub const EOVERFLOW: ::c_int = 139; +pub const ECANCELED: ::c_int = 140; +pub const ENOTRECOVERABLE: ::c_int = 141; +pub const EOWNERDEAD: ::c_int = 142; +pub const EWOULDBLOCK: ::c_int = 11; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_RGETLK: ::c_int = 10; +pub const F_RSETLK: ::c_int = 11; +pub const F_CNVT: ::c_int = 12; +pub const F_RSETLKW: ::c_int = 13; +pub const F_DUPFD_CLOEXEC: ::c_int = 14; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 8; +pub const O_CREAT: ::c_int = 512; +pub const O_TRUNC: ::c_int = 1024; +pub const O_EXCL: ::c_int = 2048; +pub const O_SYNC: ::c_int = 8192; +pub const O_NONBLOCK: ::c_int = 16384; + +pub const O_ACCMODE: ::c_int = 3; +pub const O_CLOEXEC: ::c_int = 0x80000; + +pub const RTLD_LAZY: ::c_int = 0x1; + +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; + +pub const FIOCLEX: ::c_ulong = 0x20006601; +pub const FIONCLEX: ::c_ulong = 0x20006602; + +pub const S_BLKSIZE: ::mode_t = 1024; +pub const S_IREAD: ::mode_t = 256; +pub const S_IWRITE: ::mode_t = 128; +pub const S_IEXEC: ::mode_t = 64; +pub const S_ENFMT: ::mode_t = 1024; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IROTH: ::mode_t = 4; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IXOTH: ::mode_t = 1; + +pub const SOL_TCP: ::c_int = 6; + +pub const PF_UNSPEC: ::c_int = 0; +pub const PF_INET: ::c_int = 2; +pub const PF_INET6: ::c_int = 23; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_INET: ::c_int = 2; + +pub const CLOCK_REALTIME: ::clockid_t = 1; +pub const CLOCK_MONOTONIC: ::clockid_t = 4; +pub const CLOCK_BOOTTIME: ::clockid_t = 4; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const SO_BINTIME: ::c_int = 0x2000; +pub const SO_NO_OFFLOAD: ::c_int = 0x4000; +pub const SO_NO_DDP: ::c_int = 0x8000; +pub const SO_REUSEPORT_LB: ::c_int = 0x10000; +pub const SO_LABEL: ::c_int = 0x1009; +pub const SO_PEERLABEL: ::c_int = 0x1010; +pub const SO_LISTENQLIMIT: ::c_int = 0x1011; +pub const SO_LISTENQLEN: ::c_int = 0x1012; +pub const SO_LISTENINCQLEN: ::c_int = 0x1013; +pub const SO_SETFIB: ::c_int = 0x1014; +pub const SO_USER_COOKIE: ::c_int = 0x1015; +pub const SO_PROTOCOL: ::c_int = 0x1016; +pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL; +pub const SO_VENDOR: ::c_int = 0x80000000; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_NOSIGPIPE: ::c_int = 0x0800; +pub const SO_ACCEPTFILTER: ::c_int = 0x1000; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +cfg_if! { + if #[cfg(target_os = "horizon")] { + pub const SO_ERROR: ::c_int = 0x1009; + } else { + pub const SO_ERROR: ::c_int = 0x1007; + } +} +pub const SO_TYPE: ::c_int = 0x1008; + +pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC; + +pub const INET_ADDRSTRLEN: ::c_int = 16; + +// https://github.com/bminor/newlib/blob/HEAD/newlib/libc/sys/linux/include/net/if.h#L121 +pub const IFF_UP: ::c_int = 0x1; // interface is up +pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link +pub const IFF_NOTRAILERS: ::c_int = 0x20; // avoid use of trailers +pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated +pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol +pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets +pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress +pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions +pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit +pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit +pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit +pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; // use alternate physical connection +pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast + +pub const TCP_NODELAY: ::c_int = 8193; +pub const TCP_MAXSEG: ::c_int = 8194; +pub const TCP_NOPUSH: ::c_int = 4; +pub const TCP_NOOPT: ::c_int = 8; +pub const TCP_KEEPIDLE: ::c_int = 256; +pub const TCP_KEEPINTVL: ::c_int = 512; +pub const TCP_KEEPCNT: ::c_int = 1024; + +cfg_if! { + if #[cfg(target_os = "horizon")] { + pub const IP_TOS: ::c_int = 7; + } else { + pub const IP_TOS: ::c_int = 3; + } +} +pub const IP_TTL: ::c_int = 8; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_ADD_MEMBERSHIP: ::c_int = 11; +pub const IP_DROP_MEMBERSHIP: ::c_int = 12; + +pub const IPV6_UNICAST_HOPS: ::c_int = 4; +pub const IPV6_MULTICAST_IF: ::c_int = 9; +pub const IPV6_MULTICAST_HOPS: ::c_int = 10; +pub const IPV6_MULTICAST_LOOP: ::c_int = 11; +pub const IPV6_V6ONLY: ::c_int = 27; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 12; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 13; + +pub const HOST_NOT_FOUND: ::c_int = 1; +pub const NO_DATA: ::c_int = 2; +pub const NO_ADDRESS: ::c_int = 2; +pub const NO_RECOVERY: ::c_int = 3; +pub const TRY_AGAIN: ::c_int = 4; + +pub const AI_PASSIVE: ::c_int = 1; +pub const AI_CANONNAME: ::c_int = 2; +pub const AI_NUMERICHOST: ::c_int = 4; +pub const AI_NUMERICSERV: ::c_int = 0; +pub const AI_ADDRCONFIG: ::c_int = 0; + +pub const NI_MAXHOST: ::c_int = 1025; +pub const NI_MAXSERV: ::c_int = 32; +pub const NI_NOFQDN: ::c_int = 1; +pub const NI_NUMERICHOST: ::c_int = 2; +pub const NI_NAMEREQD: ::c_int = 4; +pub const NI_NUMERICSERV: ::c_int = 0; +pub const NI_DGRAM: ::c_int = 0; + +pub const EAI_FAMILY: ::c_int = -303; +pub const EAI_MEMORY: ::c_int = -304; +pub const EAI_NONAME: ::c_int = -305; +pub const EAI_SOCKTYPE: ::c_int = -307; + +pub const EXIT_SUCCESS: ::c_int = 0; +pub const EXIT_FAILURE: ::c_int = 1; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +extern "C" { + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + + #[cfg_attr(target_os = "linux", link_name = "__xpg_strerror_r")] + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr(target_os = "espidf", link_name = "lwip_bind")] + pub fn bind(fd: ::c_int, addr: *const sockaddr, len: socklen_t) -> ::c_int; + pub fn clock_settime(clock_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn clock_gettime(clock_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_getres(clock_id: ::clockid_t, res: *mut ::timespec) -> ::c_int; + #[cfg_attr(target_os = "espidf", link_name = "lwip_close")] + pub fn closesocket(sockfd: ::c_int) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + #[cfg_attr(target_os = "espidf", link_name = "lwip_recvfrom")] + pub fn recvfrom( + fd: ::c_int, + buf: *mut ::c_void, + n: usize, + flags: ::c_int, + addr: *mut sockaddr, + addr_len: *mut socklen_t, + ) -> isize; + #[cfg(not(all( + libc_cfg_target_vendor, + target_arch = "powerpc", + target_vendor = "nintendo" + )))] + pub fn getnameinfo( + sa: *const sockaddr, + salen: socklen_t, + host: *mut ::c_char, + hostlen: socklen_t, + serv: *mut ::c_char, + servlen: socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn uname(buf: *mut ::utsname) -> ::c_int; +} + +mod generic; + +cfg_if! { + if #[cfg(target_os = "espidf")] { + mod espidf; + pub use self::espidf::*; + } else if #[cfg(target_os = "horizon")] { + mod horizon; + pub use self::horizon::*; + } else if #[cfg(target_os = "vita")] { + mod vita; + pub use self::vita::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "powerpc")] { + mod powerpc; + pub use self::powerpc::*; + } else { + // Only tested on ARM so far. Other platforms might have different + // definitions for types and constants. + pub use target_arch_not_implemented; + } +} + +cfg_if! { + if #[cfg(libc_align)] { + #[macro_use] + mod align; + } else { + #[macro_use] + mod no_align; + } +} +expand_align!(); diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/no_align.rs new file mode 100644 index 0000000..ce3aca4 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/no_align.rs @@ -0,0 +1,51 @@ +macro_rules! expand_align { + () => { + s! { + pub struct pthread_mutex_t { // Unverified + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc")))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], + } + + pub struct pthread_rwlock_t { // Unverified + #[cfg(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc"))] + __align: [::c_long; 0], + #[cfg(not(any(target_arch = "mips", + target_arch = "arm", + target_arch = "powerpc")))] + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], + } + + pub struct pthread_mutexattr_t { // Unverified + #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64"))] + __align: [::c_int; 0], + #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", + target_arch = "mips64", target_arch = "s390x", + target_arch = "sparc64")))] + __align: [::c_long; 0], + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + pub struct pthread_cond_t { // Unverified + __align: [::c_longlong; 0], + size: [u8; ::__SIZEOF_PTHREAD_COND_T], + } + + pub struct pthread_condattr_t { // Unverified + __align: [::c_int; 0], + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/powerpc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/powerpc/mod.rs new file mode 100644 index 0000000..6bed1ce --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/powerpc/mod.rs @@ -0,0 +1,16 @@ +pub type clock_t = ::c_ulong; +pub type c_char = u8; +pub type wchar_t = ::c_int; + +pub type c_long = i32; +pub type c_ulong = u32; + +pub use crate::unix::newlib::generic::{sigset_t, stat}; + +// the newlib shipped with devkitPPC does not support the following components: +// - sockaddr +// - AF_INET6 +// - FIONBIO +// - POLL* +// - SOL_SOCKET +// - MSG_* diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/vita/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/vita/mod.rs new file mode 100644 index 0000000..6e2e4d3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/newlib/vita/mod.rs @@ -0,0 +1,201 @@ +pub type clock_t = ::c_long; + +pub type c_char = i8; +pub type wchar_t = u32; + +pub type c_long = i32; +pub type c_ulong = u32; + +pub type sigset_t = ::c_ulong; + +s! { + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_vport: ::in_port_t, + pub sin6_scope_id: u32, + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_vport: ::in_port_t, + pub sin_zero: [u8; 6], + } + + pub struct sockaddr_un { + pub sun_family: ::sa_family_t, + pub sun_path: [::c_char; 108usize], + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: ::sa_family_t, + pub __ss_pad1: [u8; 4], + pub __ss_align: i64, + pub __ss_pad2: [u8; 4], + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_mtime: ::time_t, + pub st_ctime: ::time_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_spare4: [::c_long; 2usize], + } +} + +pub const AF_UNIX: ::c_int = 1; +pub const AF_INET6: ::c_int = 24; + +pub const FIONBIO: ::c_ulong = 1; + +pub const POLLIN: ::c_short = 0x0001; +pub const POLLPRI: ::c_short = POLLIN; +pub const POLLOUT: ::c_short = 0x0004; +pub const POLLERR: ::c_short = 0x0008; +pub const POLLHUP: ::c_short = 0x0010; +pub const POLLNVAL: ::c_short = 0x0020; + +pub const RTLD_DEFAULT: *mut ::c_void = 0 as *mut ::c_void; + +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_NONBLOCK: ::c_int = 0x1100; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_TRUNC: ::c_int = 0x10; +pub const MSG_CTRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_BCAST: ::c_int = 0x100; +pub const MSG_MCAST: ::c_int = 0x200; + +pub const UTIME_OMIT: c_long = -1; +pub const AT_FDCWD: ::c_int = -2; + +pub const O_DIRECTORY: ::c_int = 0x200000; +pub const O_NOFOLLOW: ::c_int = 0x100000; + +pub const AT_EACCESS: ::c_int = 1; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 2; +pub const AT_SYMLINK_FOLLOW: ::c_int = 4; +pub const AT_REMOVEDIR: ::c_int = 8; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGTRAP: ::c_int = 5; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGBUS: ::c_int = 10; +pub const SIGSEGV: ::c_int = 11; +pub const SIGSYS: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_NODATA: ::c_int = -5; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_ADDRFAMILY: ::c_int = -9; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_SYSTEM: ::c_int = -11; +pub const EAI_OVERFLOW: ::c_int = -12; + +pub const _SC_PAGESIZE: ::c_int = 8; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; +pub const PTHREAD_STACK_MIN: ::size_t = 32 * 1024; + +extern "C" { + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(_: *mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + + pub fn pthread_attr_getschedparam( + attr: *const ::pthread_attr_t, + param: *mut sched_param, + ) -> ::c_int; + + pub fn pthread_attr_setschedparam( + attr: *mut ::pthread_attr_t, + param: *const sched_param, + ) -> ::c_int; + + pub fn pthread_attr_getprocessorid_np( + attr: *const ::pthread_attr_t, + processor_id: *mut ::c_int, + ) -> ::c_int; + + pub fn pthread_attr_setprocessorid_np( + attr: *mut ::pthread_attr_t, + processor_id: ::c_int, + ) -> ::c_int; + + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut ::sched_param, + ) -> ::c_int; + + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn pthread_condattr_getclock( + attr: *const ::pthread_condattr_t, + clock_id: *mut ::clockid_t, + ) -> ::c_int; + + pub fn pthread_condattr_setclock( + attr: *mut ::pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + + pub fn pthread_getprocessorid_np() -> ::c_int; + + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/no_align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/no_align.rs new file mode 100644 index 0000000..f6b9f4c --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/no_align.rs @@ -0,0 +1,6 @@ +s! { + pub struct in6_addr { + pub s6_addr: [u8; 16], + __align: [u32; 0], + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/aarch64.rs new file mode 100644 index 0000000..6faf815 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/aarch64.rs @@ -0,0 +1,36 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; + +s! { + pub struct aarch64_qreg_t { + pub qlo: u64, + pub qhi: u64, + } + + pub struct aarch64_fpu_registers { + pub reg: [::aarch64_qreg_t; 32], + pub fpsr: u32, + pub fpcr: u32, + } + + pub struct aarch64_cpu_registers { + pub gpr: [u64; 32], + pub elr: u64, + pub pstate: u64, + } + + #[repr(align(16))] + pub struct mcontext_t { + pub cpu: ::aarch64_cpu_registers, + pub fpu: ::aarch64_fpu_registers, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/mod.rs new file mode 100644 index 0000000..a79450f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/mod.rs @@ -0,0 +1,3506 @@ +pub type clock_t = u32; + +pub type sa_family_t = u8; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type clockid_t = ::c_int; +pub type timer_t = ::c_int; +pub type key_t = ::c_uint; +pub type id_t = ::c_int; + +pub type useconds_t = u32; +pub type dev_t = u32; +pub type socklen_t = u32; +pub type mode_t = u32; +pub type rlim64_t = u64; +pub type mqd_t = ::c_int; +pub type nfds_t = ::c_uint; +pub type idtype_t = ::c_uint; +pub type errno_t = ::c_int; +pub type rsize_t = c_ulong; + +pub type Elf32_Half = u16; +pub type Elf32_Word = u32; +pub type Elf32_Off = u32; +pub type Elf32_Addr = u32; +pub type Elf32_Lword = u64; +pub type Elf32_Sword = i32; + +pub type Elf64_Half = u16; +pub type Elf64_Word = u32; +pub type Elf64_Off = u64; +pub type Elf64_Addr = u64; +pub type Elf64_Xword = u64; +pub type Elf64_Sxword = i64; +pub type Elf64_Lword = u64; +pub type Elf64_Sword = i32; + +pub type Elf32_Section = u16; +pub type Elf64_Section = u16; + +pub type _Time32t = u32; + +pub type pthread_t = ::c_int; +pub type regoff_t = ::ssize_t; + +pub type nlink_t = u32; +pub type blksize_t = u32; +pub type suseconds_t = i32; + +pub type ino_t = u64; +pub type off_t = i64; +pub type blkcnt_t = u64; +pub type msgqnum_t = u64; +pub type msglen_t = u64; +pub type fsblkcnt_t = u64; +pub type fsfilcnt_t = u64; +pub type rlim_t = u64; +pub type posix_spawn_file_actions_t = *mut ::c_void; +pub type posix_spawnattr_t = ::uintptr_t; + +pub type pthread_mutex_t = ::sync_t; +pub type pthread_mutexattr_t = ::_sync_attr; +pub type pthread_cond_t = ::sync_t; +pub type pthread_condattr_t = ::_sync_attr; +pub type pthread_rwlockattr_t = ::_sync_attr; +pub type pthread_key_t = ::c_int; +pub type pthread_spinlock_t = sync_t; +pub type pthread_barrierattr_t = _sync_attr; +pub type sem_t = sync_t; + +pub type nl_item = ::c_int; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +s! { + pub struct dirent_extra { + pub d_datalen: u16, + pub d_type: u16, + pub d_reserved: u32, + } + + pub struct stat { + pub st_ino: ::ino_t, + pub st_size: ::off_t, + pub st_dev: ::dev_t, + pub st_rdev: ::dev_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub __old_st_mtime: ::_Time32t, + pub __old_st_atime: ::_Time32t, + pub __old_st_ctime: ::_Time32t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_blocksize: ::blksize_t, + pub st_nblocks: i32, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_mtim: ::timespec, + pub st_atim: ::timespec, + pub st_ctim: ::timespec, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + #[repr(packed)] + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [i8; 8], + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + // The order of the `ai_addr` field in this struct is crucial + // for converting between the Rust and C types. + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + pub ai_canonname: *mut c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct fd_set { + fds_bits: [::c_uint; 2 * FD_SETSIZE / ULONG_SIZE], + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + #[repr(align(8))] + pub struct sched_param { + pub sched_priority: ::c_int, + pub sched_curpriority: ::c_int, + pub reserved: [::c_int; 10], + } + + #[repr(align(8))] + pub struct __sched_param { + pub __sched_priority: ::c_int, + pub __sched_curpriority: ::c_int, + pub reserved: [::c_int; 10], + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct lconv { + pub currency_symbol: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub frac_digits: ::c_char, + pub int_frac_digits: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub n_sign_posn: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + + pub decimal_point: *mut ::c_char, + pub grouping: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + + pub _Frac_grouping: *mut ::c_char, + pub _Frac_sep: *mut ::c_char, + pub _False: *mut ::c_char, + pub _True: *mut ::c_char, + + pub _No: *mut ::c_char, + pub _Yes: *mut ::c_char, + pub _Nostr: *mut ::c_char, + pub _Yesstr: *mut ::c_char, + pub _Reserved: [*mut ::c_char; 8], + } + + pub struct in_pktinfo { + pub ipi_addr: ::in_addr, + pub ipi_ifindex: ::c_uint, + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut c_char, + pub ifa_flags: ::c_uint, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void + } + + pub struct arpreq { + pub arp_pa: ::sockaddr, + pub arp_ha: ::sockaddr, + pub arp_flags: ::c_int, + } + + #[repr(packed)] + pub struct arphdr { + pub ar_hrd: u16, + pub ar_pro: u16, + pub ar_hln: u8, + pub ar_pln: u8, + pub ar_op: u16, + } + + pub struct mmsghdr { + pub msg_hdr: ::msghdr, + pub msg_len: ::c_uint, + } + + #[repr(align(8))] + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + __data: [u8; 36], // union + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_flags: ::c_int, + pub sa_mask: ::sigset_t, + } + + pub struct _sync { + _union: ::c_uint, + __owner: ::c_uint, + } + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_matchc: ::c_int, + pub gl_pathv: *mut *mut c_char, + pub gl_offs: ::size_t, + pub gl_flags: ::c_int, + pub gl_errfunc: extern "C" fn(*const ::c_char, ::c_int) -> ::c_int, + + __unused1: *mut ::c_void, + __unused2: *mut ::c_void, + __unused3: *mut ::c_void, + __unused4: *mut ::c_void, + __unused5: *mut ::c_void, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_age: *mut ::c_char, + pub pw_comment: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + pub struct sembuf { + pub sem_num: ::c_ushort, + pub sem_op: ::c_short, + pub sem_flg: ::c_short, + } + + pub struct Elf32_Ehdr { + pub e_ident: [::c_uchar; 16], + pub e_type: Elf32_Half, + pub e_machine: Elf32_Half, + pub e_version: Elf32_Word, + pub e_entry: Elf32_Addr, + pub e_phoff: Elf32_Off, + pub e_shoff: Elf32_Off, + pub e_flags: Elf32_Word, + pub e_ehsize: Elf32_Half, + pub e_phentsize: Elf32_Half, + pub e_phnum: Elf32_Half, + pub e_shentsize: Elf32_Half, + pub e_shnum: Elf32_Half, + pub e_shstrndx: Elf32_Half, + } + + pub struct Elf64_Ehdr { + pub e_ident: [::c_uchar; 16], + pub e_type: Elf64_Half, + pub e_machine: Elf64_Half, + pub e_version: Elf64_Word, + pub e_entry: Elf64_Addr, + pub e_phoff: Elf64_Off, + pub e_shoff: Elf64_Off, + pub e_flags: Elf64_Word, + pub e_ehsize: Elf64_Half, + pub e_phentsize: Elf64_Half, + pub e_phnum: Elf64_Half, + pub e_shentsize: Elf64_Half, + pub e_shnum: Elf64_Half, + pub e_shstrndx: Elf64_Half, + } + + pub struct Elf32_Sym { + pub st_name: Elf32_Word, + pub st_value: Elf32_Addr, + pub st_size: Elf32_Word, + pub st_info: ::c_uchar, + pub st_other: ::c_uchar, + pub st_shndx: Elf32_Section, + } + + pub struct Elf64_Sym { + pub st_name: Elf64_Word, + pub st_info: ::c_uchar, + pub st_other: ::c_uchar, + pub st_shndx: Elf64_Section, + pub st_value: Elf64_Addr, + pub st_size: Elf64_Xword, + } + + pub struct Elf32_Phdr { + pub p_type: Elf32_Word, + pub p_offset: Elf32_Off, + pub p_vaddr: Elf32_Addr, + pub p_paddr: Elf32_Addr, + pub p_filesz: Elf32_Word, + pub p_memsz: Elf32_Word, + pub p_flags: Elf32_Word, + pub p_align: Elf32_Word, + } + + pub struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, + pub p_vaddr: Elf64_Addr, + pub p_paddr: Elf64_Addr, + pub p_filesz: Elf64_Xword, + pub p_memsz: Elf64_Xword, + pub p_align: Elf64_Xword, + } + + pub struct Elf32_Shdr { + pub sh_name: Elf32_Word, + pub sh_type: Elf32_Word, + pub sh_flags: Elf32_Word, + pub sh_addr: Elf32_Addr, + pub sh_offset: Elf32_Off, + pub sh_size: Elf32_Word, + pub sh_link: Elf32_Word, + pub sh_info: Elf32_Word, + pub sh_addralign: Elf32_Word, + pub sh_entsize: Elf32_Word, + } + + pub struct Elf64_Shdr { + pub sh_name: Elf64_Word, + pub sh_type: Elf64_Word, + pub sh_flags: Elf64_Xword, + pub sh_addr: Elf64_Addr, + pub sh_offset: Elf64_Off, + pub sh_size: Elf64_Xword, + pub sh_link: Elf64_Word, + pub sh_info: Elf64_Word, + pub sh_addralign: Elf64_Xword, + pub sh_entsize: Elf64_Xword, + } + + pub struct in6_pktinfo { + pub ipi6_addr: ::in6_addr, + pub ipi6_ifindex: ::c_uint, + } + + pub struct inotify_event { + pub wd: ::c_int, + pub mask: u32, + pub cookie: u32, + pub len: u32 + } + + pub struct regmatch_t { + pub rm_so: regoff_t, + pub rm_eo: regoff_t, + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS], + __reserved: [::c_uint; 3], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct mallinfo { + pub arena: ::c_int, + pub ordblks: ::c_int, + pub smblks: ::c_int, + pub hblks: ::c_int, + pub hblkhd: ::c_int, + pub usmblks: ::c_int, + pub fsmblks: ::c_int, + pub uordblks: ::c_int, + pub fordblks: ::c_int, + pub keepcost: ::c_int, + } + + pub struct flock { + pub l_type: i16, + pub l_whence: i16, + pub l_zero1: i32, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_pid: ::pid_t, + pub l_sysid: u32, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_basetype: [::c_char; 16], + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + f_filler: [::c_uint; 21], + } + + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_reqprio: ::c_int, + pub aio_offset: off_t, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_sigevent: ::sigevent, + pub aio_lio_opcode: ::c_int, + pub _aio_lio_state: *mut ::c_void, + _aio_pad: [::c_int; 3], + pub _aio_next: *mut ::aiocb, + pub _aio_flag: ::c_uint, + pub _aio_iotype: ::c_uint, + pub _aio_result: ::ssize_t, + pub _aio_error: ::c_uint, + pub _aio_suspend: *mut ::c_void, + pub _aio_plist: *mut ::c_void, + pub _aio_policy: ::c_int, + pub _aio_param: ::__sched_param, + } + + pub struct pthread_attr_t { + __data1: ::c_long, + __data2: [u8; 96] + } + + pub struct ipc_perm { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_uint, + pub key: ::key_t, + _reserved: [::c_int; 4], + } + + pub struct regex_t { + re_magic: ::c_int, + re_nsub: ::size_t, + re_endp: *const ::c_char, + re_g: *mut ::c_void, + } + + pub struct _thread_attr { + pub __flags: ::c_int, + pub __stacksize: ::size_t, + pub __stackaddr: *mut ::c_void, + pub __exitfunc: ::Option, + pub __policy: ::c_int, + pub __param: ::__sched_param, + pub __guardsize: ::c_uint, + pub __prealloc: ::c_uint, + __spare: [::c_int; 2], + } + + pub struct _sync_attr { + pub __protocol: ::c_int, + pub __flags: ::c_int, + pub __prioceiling: ::c_int, + pub __clockid: ::c_int, + pub __count: ::c_int, + __reserved: [::c_int; 3], + } + + pub struct sockcred { + pub sc_uid: ::uid_t, + pub sc_euid: ::uid_t, + pub sc_gid: ::gid_t, + pub sc_egid: ::gid_t, + pub sc_ngroups: ::c_int, + pub sc_groups: [::gid_t; 1], + } + + pub struct bpf_program { + pub bf_len: ::c_uint, + pub bf_insns: *mut ::bpf_insn, + } + + pub struct bpf_stat { + pub bs_recv: u64, + pub bs_drop: u64, + pub bs_capt: u64, + bs_padding: [u64; 13], + } + + pub struct bpf_version { + pub bv_major: ::c_ushort, + pub bv_minor: ::c_ushort, + } + + pub struct bpf_hdr { + pub bh_tstamp: ::timeval, + pub bh_caplen: u32, + pub bh_datalen: u32, + pub bh_hdrlen: u16, + } + + pub struct bpf_insn { + pub code: u16, + pub jt: ::c_uchar, + pub jf: ::c_uchar, + pub k: u32, + } + + pub struct bpf_dltlist { + pub bfl_len: ::c_uint, + pub bfl_list: *mut ::c_uint, + } + + pub struct unpcbid { + pub unp_pid: ::pid_t, + pub unp_euid: ::uid_t, + pub unp_egid: ::gid_t, + } + + pub struct dl_phdr_info { + pub dlpi_addr: ::Elf64_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const ::Elf64_Phdr, + pub dlpi_phnum: ::Elf64_Half, + } + + #[repr(align(8))] + pub struct ucontext_t { + pub uc_link: *mut ucontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_stack: stack_t, + pub uc_mcontext: mcontext_t, + } +} + +s_no_extra_traits! { + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 104] + } + + pub struct sockaddr_storage { + pub ss_len: u8, + pub ss_family: sa_family_t, + __ss_pad1: [::c_char; 6], + __ss_align: i64, + __ss_pad2: [::c_char; 112], + } + + pub struct utsname { + pub sysname: [::c_char; _SYSNAME_SIZE], + pub nodename: [::c_char; _SYSNAME_SIZE], + pub release: [::c_char; _SYSNAME_SIZE], + pub version: [::c_char; _SYSNAME_SIZE], + pub machine: [::c_char; _SYSNAME_SIZE], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub __padding1: ::c_int, + pub sigev_signo: ::c_int, // union + pub __padding2: ::c_int, + pub sigev_value: ::sigval, + __sigev_un2: usize, // union + + } + pub struct dirent { + pub d_ino: ::ino_t, + pub d_offset: ::off_t, + pub d_reclen: ::c_short, + pub d_namelen: ::c_short, + pub d_name: [::c_char; 1], // flex array + } + + pub struct sigset_t { + __val: [u32; 2], + } + + pub struct mq_attr { + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_flags: ::c_long, + pub mq_curmsgs: ::c_long, + pub mq_sendwait: ::c_long, + pub mq_recvwait: ::c_long, + } + + pub struct msg { + pub msg_next: *mut ::msg, + pub msg_type: ::c_long, + pub msg_ts: ::c_ushort, + pub msg_spot: ::c_short, + _pad: [u8; 4], + } + + pub struct msqid_ds { + pub msg_perm: ::ipc_perm, + pub msg_first: *mut ::msg, + pub msg_last: *mut ::msg, + pub msg_cbytes: ::msglen_t, + pub msg_qnum: ::msgqnum_t, + pub msg_qbytes: ::msglen_t, + pub msg_lspid: ::pid_t, + pub msg_lrpid: ::pid_t, + pub msg_stime: ::time_t, + msg_pad1: ::c_long, + pub msg_rtime: ::time_t, + msg_pad2: ::c_long, + pub msg_ctime: ::time_t, + msg_pad3: ::c_long, + msg_pad4: [::c_long; 4], + } + + pub struct sockaddr_dl { + pub sdl_len: ::c_uchar, + pub sdl_family: ::sa_family_t, + pub sdl_index: u16, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 12], + } + + pub struct sync_t { + __u: ::c_uint, // union + pub __owner: ::c_uint, + } + + #[repr(align(4))] + pub struct pthread_barrier_t { // union + __pad: [u8; 28], // union + } + + pub struct pthread_rwlock_t { + pub __active: ::c_int, + pub __blockedwriters: ::c_int, + pub __blockedreaders: ::c_int, + pub __heavy: ::c_int, + pub __lock: ::pthread_mutex_t, // union + pub __rcond: ::pthread_cond_t, // union + pub __wcond: ::pthread_cond_t, // union + pub __owner: ::c_uint, + pub __spare: ::c_uint, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + // sigevent + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.__sigev_un2 + == other.__sigev_un2 + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("__sigev_un2", + &self.__sigev_un2) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.__sigev_un2.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_len == other.sun_len + && self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_len", &self.sun_len) + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_len.hash(state); + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + // sigset_t + impl PartialEq for sigset_t { + fn eq(&self, other: &sigset_t) -> bool { + self.__val == other.__val + } + } + impl Eq for sigset_t {} + impl ::fmt::Debug for sigset_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigset_t") + .field("__val", &self.__val) + .finish() + } + } + impl ::hash::Hash for sigset_t { + fn hash(&self, state: &mut H) { + self.__val.hash(state); + } + } + + // msg + impl ::fmt::Debug for msg { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("msg") + .field("msg_next", &self.msg_next) + .field("msg_type", &self.msg_type) + .field("msg_ts", &self.msg_ts) + .field("msg_spot", &self.msg_spot) + .finish() + } + } + + // msqid_ds + impl ::fmt::Debug for msqid_ds { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("msqid_ds") + .field("msg_perm", &self.msg_perm) + .field("msg_first", &self.msg_first) + .field("msg_cbytes", &self.msg_cbytes) + .field("msg_qnum", &self.msg_qnum) + .field("msg_qbytes", &self.msg_qbytes) + .field("msg_lspid", &self.msg_lspid) + .field("msg_lrpid", &self.msg_lrpid) + .field("msg_stime", &self.msg_stime) + .field("msg_rtime", &self.msg_rtime) + .field("msg_ctime", &self.msg_ctime) + .finish() + } + } + + // sockaddr_dl + impl ::fmt::Debug for sockaddr_dl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_dl") + .field("sdl_len", &self.sdl_len) + .field("sdl_family", &self.sdl_family) + .field("sdl_index", &self.sdl_index) + .field("sdl_type", &self.sdl_type) + .field("sdl_nlen", &self.sdl_nlen) + .field("sdl_alen", &self.sdl_alen) + .field("sdl_slen", &self.sdl_slen) + .field("sdl_data", &self.sdl_data) + .finish() + } + } + impl PartialEq for sockaddr_dl { + fn eq(&self, other: &sockaddr_dl) -> bool { + self.sdl_len == other.sdl_len + && self.sdl_family == other.sdl_family + && self.sdl_index == other.sdl_index + && self.sdl_type == other.sdl_type + && self.sdl_nlen == other.sdl_nlen + && self.sdl_alen == other.sdl_alen + && self.sdl_slen == other.sdl_slen + && self + .sdl_data + .iter() + .zip(other.sdl_data.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_dl {} + impl ::hash::Hash for sockaddr_dl { + fn hash(&self, state: &mut H) { + self.sdl_len.hash(state); + self.sdl_family.hash(state); + self.sdl_index.hash(state); + self.sdl_type.hash(state); + self.sdl_nlen.hash(state); + self.sdl_alen.hash(state); + self.sdl_slen.hash(state); + self.sdl_data.hash(state); + } + } + + // sync_t + impl ::fmt::Debug for sync_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sync_t") + .field("__owner", &self.__owner) + .field("__u", &self.__u) + .finish() + } + } + + // pthread_barrier_t + impl ::fmt::Debug for pthread_barrier_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_barrier_t") + .field("__pad", &self.__pad) + .finish() + } + } + + // pthread_rwlock_t + impl ::fmt::Debug for pthread_rwlock_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("pthread_rwlock_t") + .field("__active", &self.__active) + .field("__blockedwriters", &self.__blockedwriters) + .field("__blockedreaders", &self.__blockedreaders) + .field("__heavy", &self.__heavy) + .field("__lock", &self.__lock) + .field("__rcond", &self.__rcond) + .field("__wcond", &self.__wcond) + .field("__owner", &self.__owner) + .field("__spare", &self.__spare) + .finish() + } + } + + // syspage_entry + impl ::fmt::Debug for syspage_entry { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("syspage_entry") + .field("size", &self.size) + .field("total_size", &self.total_size) + .field("type_", &self.type_) + .field("num_cpu", &self.num_cpu) + .field("system_private", &self.system_private) + .field("old_asinfo", &self.old_asinfo) + .field("hwinfo", &self.hwinfo) + .field("old_cpuinfo", &self.old_cpuinfo) + .field("old_cacheattr", &self.old_cacheattr) + .field("qtime", &self.qtime) + .field("callout", &self.callout) + .field("callin", &self.callin) + .field("typed_strings", &self.typed_strings) + .field("strings", &self.strings) + .field("old_intrinfo", &self.old_intrinfo) + .field("smp", &self.smp) + .field("pminfo", &self.pminfo) + .field("old_mdriver", &self.old_mdriver) + .field("new_asinfo", &self.new_asinfo) + .field("new_cpuinfo", &self.new_cpuinfo) + .field("new_cacheattr", &self.new_cacheattr) + .field("new_intrinfo", &self.new_intrinfo) + .field("new_mdriver", &self.new_mdriver) + .finish() + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a,b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a,b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a,b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a,b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utsname {} + + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + .finish() + } + } + + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + } + } + + impl PartialEq for mq_attr { + fn eq(&self, other: &mq_attr) -> bool { + self.mq_maxmsg == other.mq_maxmsg && + self.mq_msgsize == other.mq_msgsize && + self.mq_flags == other.mq_flags && + self.mq_curmsgs == other.mq_curmsgs && + self.mq_msgsize == other.mq_msgsize && + self.mq_sendwait == other.mq_sendwait && + self.mq_recvwait == other.mq_recvwait + } + } + + impl Eq for mq_attr {} + + impl ::fmt::Debug for mq_attr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mq_attr") + .field("mq_maxmsg", &self.mq_maxmsg) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_flags", &self.mq_flags) + .field("mq_curmsgs", &self.mq_curmsgs) + .field("mq_msgsize", &self.mq_msgsize) + .field("mq_sendwait", &self.mq_sendwait) + .field("mq_recvwait", &self.mq_recvwait) + .finish() + } + } + impl ::hash::Hash for mq_attr { + fn hash(&self, state: &mut H) { + self.mq_maxmsg.hash(state); + self.mq_msgsize.hash(state); + self.mq_flags.hash(state); + self.mq_curmsgs.hash(state); + self.mq_sendwait.hash(state); + self.mq_recvwait.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_len == other.ss_len + && self.ss_family == other.ss_family + && self.__ss_pad1 == other.__ss_pad1 + && self.__ss_align == other.__ss_align + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for sockaddr_storage {} + + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_len.hash(state); + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_align.hash(state); + self.__ss_pad2.hash(state); + } + } + + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_offset == other.d_offset + && self.d_reclen == other.d_reclen + && self.d_namelen == other.d_namelen + && self + .d_name[..self.d_namelen as _] + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_offset", &self.d_offset) + .field("d_reclen", &self.d_reclen) + .field("d_namelen", &self.d_namelen) + .field("d_name", &&self.d_name[..self.d_namelen as _]) + .finish() + } + } + + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_offset.hash(state); + self.d_reclen.hash(state); + self.d_namelen.hash(state); + self.d_name[..self.d_namelen as _].hash(state); + } + } + } +} + +pub const _SYSNAME_SIZE: usize = 256 + 1; +pub const RLIM_INFINITY: ::rlim_t = 0xfffffffffffffffd; +pub const O_LARGEFILE: ::c_int = 0o0100000; + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 2; +pub const _IOLBF: ::c_int = 1; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; + +pub const F_DUPFD_CLOEXEC: ::c_int = 5; + +pub const SIGTRAP: ::c_int = 5; + +pub const CLOCK_REALTIME: ::clockid_t = 0; +pub const CLOCK_MONOTONIC: ::clockid_t = 2; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 3; +pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 4; +pub const TIMER_ABSTIME: ::c_uint = 0x80000000; + +pub const RUSAGE_SELF: ::c_int = 0; + +pub const F_OK: ::c_int = 0; +pub const X_OK: ::c_int = 1; +pub const W_OK: ::c_int = 2; +pub const R_OK: ::c_int = 4; + +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const PROT_NONE: ::c_int = 0x00000000; +pub const PROT_READ: ::c_int = 0x00000100; +pub const PROT_WRITE: ::c_int = 0x00000200; +pub const PROT_EXEC: ::c_int = 0x00000400; + +pub const MAP_FILE: ::c_int = 0; +pub const MAP_SHARED: ::c_int = 1; +pub const MAP_PRIVATE: ::c_int = 2; +pub const MAP_FIXED: ::c_int = 0x10; + +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MS_ASYNC: ::c_int = 1; +pub const MS_INVALIDATE: ::c_int = 4; +pub const MS_SYNC: ::c_int = 2; + +pub const SCM_RIGHTS: ::c_int = 0x01; +pub const SCM_TIMESTAMP: ::c_int = 0x02; +pub const SCM_CREDS: ::c_int = 0x04; + +pub const MAP_TYPE: ::c_int = 0x3; + +pub const IFF_UP: ::c_int = 0x00000001; +pub const IFF_BROADCAST: ::c_int = 0x00000002; +pub const IFF_DEBUG: ::c_int = 0x00000004; +pub const IFF_LOOPBACK: ::c_int = 0x00000008; +pub const IFF_POINTOPOINT: ::c_int = 0x00000010; +pub const IFF_NOTRAILERS: ::c_int = 0x00000020; +pub const IFF_RUNNING: ::c_int = 0x00000040; +pub const IFF_NOARP: ::c_int = 0x00000080; +pub const IFF_PROMISC: ::c_int = 0x00000100; +pub const IFF_ALLMULTI: ::c_int = 0x00000200; +pub const IFF_MULTICAST: ::c_int = 0x00008000; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_IPX: ::c_int = 23; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_INET6: ::c_int = 24; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_SNA: ::c_int = 11; +pub const AF_BLUETOOTH: ::c_int = 31; +pub const AF_ISDN: ::c_int = 26; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = PF_LOCAL; +pub const PF_LOCAL: ::c_int = AF_LOCAL; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_INET6: ::c_int = AF_INET6; +pub const pseudo_AF_KEY: ::c_int = 29; +pub const PF_KEY: ::c_int = pseudo_AF_KEY; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_SNA: ::c_int = AF_SNA; + +pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; +pub const PF_ISDN: ::c_int = AF_ISDN; + +pub const SOMAXCONN: ::c_int = 128; + +pub const MSG_OOB: ::c_int = 0x0001; +pub const MSG_PEEK: ::c_int = 0x0002; +pub const MSG_DONTROUTE: ::c_int = 0x0004; +pub const MSG_CTRUNC: ::c_int = 0x0020; +pub const MSG_TRUNC: ::c_int = 0x0010; +pub const MSG_DONTWAIT: ::c_int = 0x0080; +pub const MSG_EOR: ::c_int = 0x0008; +pub const MSG_WAITALL: ::c_int = 0x0040; +pub const MSG_NOSIGNAL: ::c_int = 0x0800; +pub const MSG_WAITFORONE: ::c_int = 0x2000; + +pub const IP_TOS: ::c_int = 3; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_OPTIONS: ::c_int = 1; +pub const IP_RECVOPTS: ::c_int = 5; +pub const IP_RETOPTS: ::c_int = 8; +pub const IP_PKTINFO: ::c_int = 25; +pub const IP_IPSEC_POLICY_COMPAT: ::c_int = 22; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +pub const IP_DEFAULT_MULTICAST_TTL: ::c_int = 1; +pub const IP_DEFAULT_MULTICAST_LOOP: ::c_int = 1; + +pub const IPPROTO_HOPOPTS: ::c_int = 0; +pub const IPPROTO_IGMP: ::c_int = 2; +pub const IPPROTO_IPIP: ::c_int = 4; +pub const IPPROTO_EGP: ::c_int = 8; +pub const IPPROTO_PUP: ::c_int = 12; +pub const IPPROTO_IDP: ::c_int = 22; +pub const IPPROTO_TP: ::c_int = 29; +pub const IPPROTO_ROUTING: ::c_int = 43; +pub const IPPROTO_FRAGMENT: ::c_int = 44; +pub const IPPROTO_RSVP: ::c_int = 46; +pub const IPPROTO_GRE: ::c_int = 47; +pub const IPPROTO_ESP: ::c_int = 50; +pub const IPPROTO_AH: ::c_int = 51; +pub const IPPROTO_NONE: ::c_int = 59; +pub const IPPROTO_DSTOPTS: ::c_int = 60; +pub const IPPROTO_ENCAP: ::c_int = 98; +pub const IPPROTO_PIM: ::c_int = 103; +pub const IPPROTO_SCTP: ::c_int = 132; +pub const IPPROTO_RAW: ::c_int = 255; +pub const IPPROTO_MAX: ::c_int = 256; +pub const IPPROTO_CARP: ::c_int = 112; +pub const IPPROTO_DIVERT: ::c_int = 259; +pub const IPPROTO_DONE: ::c_int = 257; +pub const IPPROTO_EON: ::c_int = 80; +pub const IPPROTO_ETHERIP: ::c_int = 97; +pub const IPPROTO_GGP: ::c_int = 3; +pub const IPPROTO_IPCOMP: ::c_int = 108; +pub const IPPROTO_MOBILE: ::c_int = 55; + +pub const IPV6_RTHDR_LOOSE: ::c_int = 0; +pub const IPV6_RTHDR_STRICT: ::c_int = 1; +pub const IPV6_UNICAST_HOPS: ::c_int = 4; +pub const IPV6_MULTICAST_IF: ::c_int = 9; +pub const IPV6_MULTICAST_HOPS: ::c_int = 10; +pub const IPV6_MULTICAST_LOOP: ::c_int = 11; +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_CHECKSUM: ::c_int = 26; +pub const IPV6_V6ONLY: ::c_int = 27; +pub const IPV6_IPSEC_POLICY_COMPAT: ::c_int = 28; +pub const IPV6_RTHDRDSTOPTS: ::c_int = 35; +pub const IPV6_RECVPKTINFO: ::c_int = 36; +pub const IPV6_RECVHOPLIMIT: ::c_int = 37; +pub const IPV6_RECVRTHDR: ::c_int = 38; +pub const IPV6_RECVHOPOPTS: ::c_int = 39; +pub const IPV6_RECVDSTOPTS: ::c_int = 40; +pub const IPV6_RECVPATHMTU: ::c_int = 43; +pub const IPV6_PATHMTU: ::c_int = 44; +pub const IPV6_PKTINFO: ::c_int = 46; +pub const IPV6_HOPLIMIT: ::c_int = 47; +pub const IPV6_NEXTHOP: ::c_int = 48; +pub const IPV6_HOPOPTS: ::c_int = 49; +pub const IPV6_DSTOPTS: ::c_int = 50; +pub const IPV6_RECVTCLASS: ::c_int = 57; +pub const IPV6_TCLASS: ::c_int = 61; +pub const IPV6_DONTFRAG: ::c_int = 62; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_MAXSEG: ::c_int = 0x02; +pub const TCP_MD5SIG: ::c_int = 0x10; +pub const TCP_KEEPALIVE: ::c_int = 0x04; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 0x1; +pub const LOCK_EX: ::c_int = 0x2; +pub const LOCK_NB: ::c_int = 0x4; +pub const LOCK_UN: ::c_int = 0x8; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const PATH_MAX: ::c_int = 1024; + +pub const UIO_MAXIOV: ::c_int = 1024; + +pub const FD_SETSIZE: usize = 256; + +pub const TCIOFF: ::c_int = 0x0002; +pub const TCION: ::c_int = 0x0003; +pub const TCOOFF: ::c_int = 0x0000; +pub const TCOON: ::c_int = 0x0001; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const NL0: ::tcflag_t = 0x000; +pub const NL1: ::tcflag_t = 0x100; +pub const TAB0: ::tcflag_t = 0x0000; +pub const CR0: ::tcflag_t = 0x000; +pub const FF0: ::tcflag_t = 0x0000; +pub const BS0: ::tcflag_t = 0x0000; +pub const VT0: ::tcflag_t = 0x0000; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VLNEXT: usize = 15; +pub const IGNBRK: ::tcflag_t = 0x00000001; +pub const BRKINT: ::tcflag_t = 0x00000002; +pub const IGNPAR: ::tcflag_t = 0x00000004; +pub const PARMRK: ::tcflag_t = 0x00000008; +pub const INPCK: ::tcflag_t = 0x00000010; +pub const ISTRIP: ::tcflag_t = 0x00000020; +pub const INLCR: ::tcflag_t = 0x00000040; +pub const IGNCR: ::tcflag_t = 0x00000080; +pub const ICRNL: ::tcflag_t = 0x00000100; +pub const IXANY: ::tcflag_t = 0x00000800; +pub const IMAXBEL: ::tcflag_t = 0x00002000; +pub const OPOST: ::tcflag_t = 0x00000001; +pub const CS5: ::tcflag_t = 0x00; +pub const ECHO: ::tcflag_t = 0x00000008; +pub const OCRNL: ::tcflag_t = 0x00000008; +pub const ONOCR: ::tcflag_t = 0x00000010; +pub const ONLRET: ::tcflag_t = 0x00000020; +pub const OFILL: ::tcflag_t = 0x00000040; +pub const OFDEL: ::tcflag_t = 0x00000080; + +pub const WNOHANG: ::c_int = 0x0040; +pub const WUNTRACED: ::c_int = 0x0004; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WEXITED: ::c_int = 0x0001; +pub const WCONTINUED: ::c_int = 0x0008; +pub const WNOWAIT: ::c_int = 0x0080; +pub const WTRAPPED: ::c_int = 0x0002; + +pub const RTLD_LOCAL: ::c_int = 0x0200; +pub const RTLD_LAZY: ::c_int = 0x0001; + +pub const POSIX_FADV_NORMAL: ::c_int = 0; +pub const POSIX_FADV_RANDOM: ::c_int = 2; +pub const POSIX_FADV_SEQUENTIAL: ::c_int = 1; +pub const POSIX_FADV_WILLNEED: ::c_int = 3; + +pub const AT_FDCWD: ::c_int = -100; +pub const AT_EACCESS: ::c_int = 0x0001; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x0002; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x0004; +pub const AT_REMOVEDIR: ::c_int = 0x0008; + +pub const LOG_CRON: ::c_int = 9 << 3; +pub const LOG_AUTHPRIV: ::c_int = 10 << 3; +pub const LOG_FTP: ::c_int = 11 << 3; +pub const LOG_PERROR: ::c_int = 0x20; + +pub const PIPE_BUF: usize = 5120; + +pub const CLD_EXITED: ::c_int = 1; +pub const CLD_KILLED: ::c_int = 2; +pub const CLD_DUMPED: ::c_int = 3; +pub const CLD_TRAPPED: ::c_int = 4; +pub const CLD_STOPPED: ::c_int = 5; +pub const CLD_CONTINUED: ::c_int = 6; + +pub const UTIME_OMIT: c_long = 0x40000002; +pub const UTIME_NOW: c_long = 0x40000001; + +pub const POLLIN: ::c_short = POLLRDNORM | POLLRDBAND; +pub const POLLPRI: ::c_short = 0x0008; +pub const POLLOUT: ::c_short = 0x0002; +pub const POLLERR: ::c_short = 0x0020; +pub const POLLHUP: ::c_short = 0x0040; +pub const POLLNVAL: ::c_short = 0x1000; +pub const POLLRDNORM: ::c_short = 0x0001; +pub const POLLRDBAND: ::c_short = 0x0004; + +pub const IPTOS_LOWDELAY: u8 = 0x10; +pub const IPTOS_THROUGHPUT: u8 = 0x08; +pub const IPTOS_RELIABILITY: u8 = 0x04; +pub const IPTOS_MINCOST: u8 = 0x02; + +pub const IPTOS_PREC_NETCONTROL: u8 = 0xe0; +pub const IPTOS_PREC_INTERNETCONTROL: u8 = 0xc0; +pub const IPTOS_PREC_CRITIC_ECP: u8 = 0xa0; +pub const IPTOS_PREC_FLASHOVERRIDE: u8 = 0x80; +pub const IPTOS_PREC_FLASH: u8 = 0x60; +pub const IPTOS_PREC_IMMEDIATE: u8 = 0x40; +pub const IPTOS_PREC_PRIORITY: u8 = 0x20; +pub const IPTOS_PREC_ROUTINE: u8 = 0x00; + +pub const IPTOS_ECN_MASK: u8 = 0x03; +pub const IPTOS_ECN_ECT1: u8 = 0x01; +pub const IPTOS_ECN_ECT0: u8 = 0x02; +pub const IPTOS_ECN_CE: u8 = 0x03; + +pub const IPOPT_CONTROL: u8 = 0x00; +pub const IPOPT_RESERVED1: u8 = 0x20; +pub const IPOPT_RESERVED2: u8 = 0x60; +pub const IPOPT_LSRR: u8 = 131; +pub const IPOPT_RR: u8 = 7; +pub const IPOPT_SSRR: u8 = 137; +pub const IPDEFTTL: u8 = 64; +pub const IPOPT_OPTVAL: u8 = 0; +pub const IPOPT_OLEN: u8 = 1; +pub const IPOPT_OFFSET: u8 = 2; +pub const IPOPT_MINOFF: u8 = 4; +pub const IPOPT_NOP: u8 = 1; +pub const IPOPT_EOL: u8 = 0; +pub const IPOPT_TS: u8 = 68; +pub const IPOPT_TS_TSONLY: u8 = 0; +pub const IPOPT_TS_TSANDADDR: u8 = 1; +pub const IPOPT_TS_PRESPEC: u8 = 3; + +pub const MAX_IPOPTLEN: u8 = 40; +pub const IPVERSION: u8 = 4; +pub const MAXTTL: u8 = 255; + +pub const ARPHRD_ETHER: u16 = 1; +pub const ARPHRD_IEEE802: u16 = 6; +pub const ARPHRD_ARCNET: u16 = 7; +pub const ARPHRD_IEEE1394: u16 = 24; + +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_BINDTODEVICE: ::c_int = 0x0800; +pub const SO_TIMESTAMP: ::c_int = 0x0400; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; + +pub const TIOCM_LE: ::c_int = 0x0100; +pub const TIOCM_DTR: ::c_int = 0x0001; +pub const TIOCM_RTS: ::c_int = 0x0002; +pub const TIOCM_ST: ::c_int = 0x0200; +pub const TIOCM_SR: ::c_int = 0x0400; +pub const TIOCM_CTS: ::c_int = 0x1000; +pub const TIOCM_CAR: ::c_int = TIOCM_CD; +pub const TIOCM_CD: ::c_int = 0x8000; +pub const TIOCM_RNG: ::c_int = TIOCM_RI; +pub const TIOCM_RI: ::c_int = 0x4000; +pub const TIOCM_DSR: ::c_int = 0x2000; + +pub const SCHED_OTHER: ::c_int = 3; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; + +pub const IPC_PRIVATE: ::key_t = 0; + +pub const IPC_CREAT: ::c_int = 0o001000; +pub const IPC_EXCL: ::c_int = 0o002000; +pub const IPC_NOWAIT: ::c_int = 0o004000; + +pub const IPC_RMID: ::c_int = 0; +pub const IPC_SET: ::c_int = 1; +pub const IPC_STAT: ::c_int = 2; + +pub const MSG_NOERROR: ::c_int = 0o010000; + +pub const LOG_NFACILITIES: ::c_int = 24; + +pub const SEM_FAILED: *mut ::sem_t = 0xFFFFFFFFFFFFFFFF as *mut sem_t; + +pub const AI_PASSIVE: ::c_int = 0x00000001; +pub const AI_CANONNAME: ::c_int = 0x00000002; +pub const AI_NUMERICHOST: ::c_int = 0x00000004; + +pub const AI_NUMERICSERV: ::c_int = 0x00000008; + +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 14; + +pub const NI_NUMERICHOST: ::c_int = 0x00000002; +pub const NI_NUMERICSERV: ::c_int = 0x00000008; +pub const NI_NOFQDN: ::c_int = 0x00000001; +pub const NI_NAMEREQD: ::c_int = 0x00000004; +pub const NI_DGRAM: ::c_int = 0x00000010; + +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const AIO_ALLDONE: ::c_int = 1; +pub const LIO_READ: ::c_int = 1; +pub const LIO_WRITE: ::c_int = 2; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_WAIT: ::c_int = 1; +pub const LIO_NOWAIT: ::c_int = 0; + +pub const ITIMER_REAL: ::c_int = 0; +pub const ITIMER_VIRTUAL: ::c_int = 1; +pub const ITIMER_PROF: ::c_int = 2; + +pub const POSIX_SPAWN_RESETIDS: ::c_int = 0x00000010; +pub const POSIX_SPAWN_SETPGROUP: ::c_int = 0x00000001; +pub const POSIX_SPAWN_SETSIGDEF: ::c_int = 0x00000004; +pub const POSIX_SPAWN_SETSIGMASK: ::c_int = 0x00000002; +pub const POSIX_SPAWN_SETSCHEDPARAM: ::c_int = 0x00000400; +pub const POSIX_SPAWN_SETSCHEDULER: ::c_int = 0x00000040; + +pub const IPTOS_ECN_NOT_ECT: u8 = 0x00; + +pub const RTF_UP: ::c_ushort = 0x0001; +pub const RTF_GATEWAY: ::c_ushort = 0x0002; + +pub const RTF_HOST: ::c_ushort = 0x0004; +pub const RTF_DYNAMIC: ::c_ushort = 0x0010; +pub const RTF_MODIFIED: ::c_ushort = 0x0020; +pub const RTF_REJECT: ::c_ushort = 0x0008; +pub const RTF_STATIC: ::c_ushort = 0x0800; +pub const RTF_XRESOLVE: ::c_ushort = 0x0200; +pub const RTF_BROADCAST: u32 = 0x80000; +pub const RTM_NEWADDR: u16 = 0xc; +pub const RTM_DELADDR: u16 = 0xd; +pub const RTA_DST: ::c_ushort = 0x1; +pub const RTA_GATEWAY: ::c_ushort = 0x2; + +pub const UDP_ENCAP: ::c_int = 100; + +pub const IN_ACCESS: u32 = 0x00000001; +pub const IN_MODIFY: u32 = 0x00000002; +pub const IN_ATTRIB: u32 = 0x00000004; +pub const IN_CLOSE_WRITE: u32 = 0x00000008; +pub const IN_CLOSE_NOWRITE: u32 = 0x00000010; +pub const IN_CLOSE: u32 = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE; +pub const IN_OPEN: u32 = 0x00000020; +pub const IN_MOVED_FROM: u32 = 0x00000040; +pub const IN_MOVED_TO: u32 = 0x00000080; +pub const IN_MOVE: u32 = IN_MOVED_FROM | IN_MOVED_TO; +pub const IN_CREATE: u32 = 0x00000100; +pub const IN_DELETE: u32 = 0x00000200; +pub const IN_DELETE_SELF: u32 = 0x00000400; +pub const IN_MOVE_SELF: u32 = 0x00000800; +pub const IN_UNMOUNT: u32 = 0x00002000; +pub const IN_Q_OVERFLOW: u32 = 0x00004000; +pub const IN_IGNORED: u32 = 0x00008000; +pub const IN_ONLYDIR: u32 = 0x01000000; +pub const IN_DONT_FOLLOW: u32 = 0x02000000; + +pub const IN_ISDIR: u32 = 0x40000000; +pub const IN_ONESHOT: u32 = 0x80000000; + +pub const REG_EXTENDED: ::c_int = 0o0001; +pub const REG_ICASE: ::c_int = 0o0002; +pub const REG_NEWLINE: ::c_int = 0o0010; +pub const REG_NOSUB: ::c_int = 0o0004; + +pub const REG_NOTBOL: ::c_int = 0o00001; +pub const REG_NOTEOL: ::c_int = 0o00002; + +pub const REG_ENOSYS: ::c_int = 17; +pub const REG_NOMATCH: ::c_int = 1; +pub const REG_BADPAT: ::c_int = 2; +pub const REG_ECOLLATE: ::c_int = 3; +pub const REG_ECTYPE: ::c_int = 4; +pub const REG_EESCAPE: ::c_int = 5; +pub const REG_ESUBREG: ::c_int = 6; +pub const REG_EBRACK: ::c_int = 7; +pub const REG_EPAREN: ::c_int = 8; +pub const REG_EBRACE: ::c_int = 9; +pub const REG_BADBR: ::c_int = 10; +pub const REG_ERANGE: ::c_int = 11; +pub const REG_ESPACE: ::c_int = 12; +pub const REG_BADRPT: ::c_int = 13; + +// errno.h +pub const EOK: ::c_int = 0; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EDEADLK: ::c_int = 45; +pub const ENOLCK: ::c_int = 46; +pub const ECANCELED: ::c_int = 47; +pub const EDQUOT: ::c_int = 49; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EBFONT: ::c_int = 57; +pub const EOWNERDEAD: ::c_int = 58; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EMULTIHOP: ::c_int = 74; +pub const EBADMSG: ::c_int = 77; +pub const ENAMETOOLONG: ::c_int = 78; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ENOSYS: ::c_int = 89; +pub const ELOOP: ::c_int = 90; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const ENOTEMPTY: ::c_int = 93; +pub const EUSERS: ::c_int = 94; +pub const ENOTRECOVERABLE: ::c_int = 95; +pub const EOPNOTSUPP: ::c_int = 103; +pub const EFPOS: ::c_int = 110; +pub const ESTALE: ::c_int = 122; +pub const EINPROGRESS: ::c_int = 236; +pub const EALREADY: ::c_int = 237; +pub const ENOTSOCK: ::c_int = 238; +pub const EDESTADDRREQ: ::c_int = 239; +pub const EMSGSIZE: ::c_int = 240; +pub const EPROTOTYPE: ::c_int = 241; +pub const ENOPROTOOPT: ::c_int = 242; +pub const EPROTONOSUPPORT: ::c_int = 243; +pub const ESOCKTNOSUPPORT: ::c_int = 244; +pub const EPFNOSUPPORT: ::c_int = 246; +pub const EAFNOSUPPORT: ::c_int = 247; +pub const EADDRINUSE: ::c_int = 248; +pub const EADDRNOTAVAIL: ::c_int = 249; +pub const ENETDOWN: ::c_int = 250; +pub const ENETUNREACH: ::c_int = 251; +pub const ENETRESET: ::c_int = 252; +pub const ECONNABORTED: ::c_int = 253; +pub const ECONNRESET: ::c_int = 254; +pub const ENOBUFS: ::c_int = 255; +pub const EISCONN: ::c_int = 256; +pub const ENOTCONN: ::c_int = 257; +pub const ESHUTDOWN: ::c_int = 258; +pub const ETOOMANYREFS: ::c_int = 259; +pub const ETIMEDOUT: ::c_int = 260; +pub const ECONNREFUSED: ::c_int = 261; +pub const EHOSTDOWN: ::c_int = 264; +pub const EHOSTUNREACH: ::c_int = 265; +pub const EBADRPC: ::c_int = 272; +pub const ERPCMISMATCH: ::c_int = 273; +pub const EPROGUNAVAIL: ::c_int = 274; +pub const EPROGMISMATCH: ::c_int = 275; +pub const EPROCUNAVAIL: ::c_int = 276; +pub const ENOREMOTE: ::c_int = 300; +pub const ENONDP: ::c_int = 301; +pub const EBADFSYS: ::c_int = 302; +pub const EMORE: ::c_int = 309; +pub const ECTRLTERM: ::c_int = 310; +pub const ENOLIC: ::c_int = 311; +pub const ESRVRFAULT: ::c_int = 312; +pub const EENDIAN: ::c_int = 313; +pub const ESECTYPEINVAL: ::c_int = 314; + +pub const RUSAGE_CHILDREN: ::c_int = -1; +pub const L_tmpnam: ::c_uint = 255; + +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 9; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_SYNC_IO: ::c_int = 14; +pub const _PC_ASYNC_IO: ::c_int = 12; +pub const _PC_PRIO_IO: ::c_int = 13; +pub const _PC_SOCK_MAXBUF: ::c_int = 15; +pub const _PC_FILESIZEBITS: ::c_int = 16; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 22; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 23; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 24; +pub const _PC_REC_XFER_ALIGN: ::c_int = 25; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 21; +pub const _PC_SYMLINK_MAX: ::c_int = 17; +pub const _PC_2_SYMLINKS: ::c_int = 20; + +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_PASS_MAX: ::c_int = 9; +pub const _SC_PAGESIZE: ::c_int = 11; +pub const _SC_XOPEN_VERSION: ::c_int = 12; +pub const _SC_STREAM_MAX: ::c_int = 13; +pub const _SC_TZNAME_MAX: ::c_int = 14; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 15; +pub const _SC_AIO_MAX: ::c_int = 16; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 17; +pub const _SC_DELAYTIMER_MAX: ::c_int = 18; +pub const _SC_MQ_OPEN_MAX: ::c_int = 19; +pub const _SC_MQ_PRIO_MAX: ::c_int = 20; +pub const _SC_RTSIG_MAX: ::c_int = 21; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 22; +pub const _SC_SEM_VALUE_MAX: ::c_int = 23; +pub const _SC_SIGQUEUE_MAX: ::c_int = 24; +pub const _SC_TIMER_MAX: ::c_int = 25; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 26; +pub const _SC_FSYNC: ::c_int = 27; +pub const _SC_MAPPED_FILES: ::c_int = 28; +pub const _SC_MEMLOCK: ::c_int = 29; +pub const _SC_MEMLOCK_RANGE: ::c_int = 30; +pub const _SC_MEMORY_PROTECTION: ::c_int = 31; +pub const _SC_MESSAGE_PASSING: ::c_int = 32; +pub const _SC_PRIORITIZED_IO: ::c_int = 33; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 34; +pub const _SC_REALTIME_SIGNALS: ::c_int = 35; +pub const _SC_SEMAPHORES: ::c_int = 36; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 37; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 38; +pub const _SC_TIMERS: ::c_int = 39; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 40; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 41; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 42; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 43; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 44; +pub const _SC_THREAD_STACK_MIN: ::c_int = 45; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 46; +pub const _SC_TTY_NAME_MAX: ::c_int = 47; +pub const _SC_THREADS: ::c_int = 48; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 49; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 50; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 51; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 52; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 53; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 54; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 55; +pub const _SC_2_CHAR_TERM: ::c_int = 56; +pub const _SC_2_C_BIND: ::c_int = 57; +pub const _SC_2_C_DEV: ::c_int = 58; +pub const _SC_2_C_VERSION: ::c_int = 59; +pub const _SC_2_FORT_DEV: ::c_int = 60; +pub const _SC_2_FORT_RUN: ::c_int = 61; +pub const _SC_2_LOCALEDEF: ::c_int = 62; +pub const _SC_2_SW_DEV: ::c_int = 63; +pub const _SC_2_UPE: ::c_int = 64; +pub const _SC_2_VERSION: ::c_int = 65; +pub const _SC_ATEXIT_MAX: ::c_int = 66; +pub const _SC_AVPHYS_PAGES: ::c_int = 67; +pub const _SC_BC_BASE_MAX: ::c_int = 68; +pub const _SC_BC_DIM_MAX: ::c_int = 69; +pub const _SC_BC_SCALE_MAX: ::c_int = 70; +pub const _SC_BC_STRING_MAX: ::c_int = 71; +pub const _SC_CHARCLASS_NAME_MAX: ::c_int = 72; +pub const _SC_CHAR_BIT: ::c_int = 73; +pub const _SC_CHAR_MAX: ::c_int = 74; +pub const _SC_CHAR_MIN: ::c_int = 75; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 76; +pub const _SC_EQUIV_CLASS_MAX: ::c_int = 77; +pub const _SC_EXPR_NEST_MAX: ::c_int = 78; +pub const _SC_INT_MAX: ::c_int = 79; +pub const _SC_INT_MIN: ::c_int = 80; +pub const _SC_LINE_MAX: ::c_int = 81; +pub const _SC_LONG_BIT: ::c_int = 82; +pub const _SC_MB_LEN_MAX: ::c_int = 83; +pub const _SC_NL_ARGMAX: ::c_int = 84; +pub const _SC_NL_LANGMAX: ::c_int = 85; +pub const _SC_NL_MSGMAX: ::c_int = 86; +pub const _SC_NL_NMAX: ::c_int = 87; +pub const _SC_NL_SETMAX: ::c_int = 88; +pub const _SC_NL_TEXTMAX: ::c_int = 89; +pub const _SC_NPROCESSORS_CONF: ::c_int = 90; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 91; +pub const _SC_NZERO: ::c_int = 92; +pub const _SC_PHYS_PAGES: ::c_int = 93; +pub const _SC_PII: ::c_int = 94; +pub const _SC_PII_INTERNET: ::c_int = 95; +pub const _SC_PII_INTERNET_DGRAM: ::c_int = 96; +pub const _SC_PII_INTERNET_STREAM: ::c_int = 97; +pub const _SC_PII_OSI: ::c_int = 98; +pub const _SC_PII_OSI_CLTS: ::c_int = 99; +pub const _SC_PII_OSI_COTS: ::c_int = 100; +pub const _SC_PII_OSI_M: ::c_int = 101; +pub const _SC_PII_SOCKET: ::c_int = 102; +pub const _SC_PII_XTI: ::c_int = 103; +pub const _SC_POLL: ::c_int = 104; +pub const _SC_RE_DUP_MAX: ::c_int = 105; +pub const _SC_SCHAR_MAX: ::c_int = 106; +pub const _SC_SCHAR_MIN: ::c_int = 107; +pub const _SC_SELECT: ::c_int = 108; +pub const _SC_SHRT_MAX: ::c_int = 109; +pub const _SC_SHRT_MIN: ::c_int = 110; +pub const _SC_SSIZE_MAX: ::c_int = 111; +pub const _SC_T_IOV_MAX: ::c_int = 112; +pub const _SC_UCHAR_MAX: ::c_int = 113; +pub const _SC_UINT_MAX: ::c_int = 114; +pub const _SC_UIO_MAXIOV: ::c_int = 115; +pub const _SC_ULONG_MAX: ::c_int = 116; +pub const _SC_USHRT_MAX: ::c_int = 117; +pub const _SC_WORD_BIT: ::c_int = 118; +pub const _SC_XOPEN_CRYPT: ::c_int = 119; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 120; +pub const _SC_XOPEN_SHM: ::c_int = 121; +pub const _SC_XOPEN_UNIX: ::c_int = 122; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 123; +pub const _SC_XOPEN_XPG2: ::c_int = 124; +pub const _SC_XOPEN_XPG3: ::c_int = 125; +pub const _SC_XOPEN_XPG4: ::c_int = 126; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 127; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 128; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 129; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 130; +pub const _SC_ADVISORY_INFO: ::c_int = 131; +pub const _SC_CPUTIME: ::c_int = 132; +pub const _SC_SPAWN: ::c_int = 133; +pub const _SC_SPORADIC_SERVER: ::c_int = 134; +pub const _SC_THREAD_CPUTIME: ::c_int = 135; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 136; +pub const _SC_TIMEOUTS: ::c_int = 137; +pub const _SC_BARRIERS: ::c_int = 138; +pub const _SC_CLOCK_SELECTION: ::c_int = 139; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 140; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 141; +pub const _SC_SPIN_LOCKS: ::c_int = 142; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 143; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 144; +pub const _SC_TRACE: ::c_int = 145; +pub const _SC_TRACE_INHERIT: ::c_int = 146; +pub const _SC_TRACE_LOG: ::c_int = 147; +pub const _SC_2_PBS: ::c_int = 148; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 149; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 150; +pub const _SC_2_PBS_LOCATE: ::c_int = 151; +pub const _SC_2_PBS_MESSAGE: ::c_int = 152; +pub const _SC_2_PBS_TRACK: ::c_int = 153; +pub const _SC_HOST_NAME_MAX: ::c_int = 154; +pub const _SC_IOV_MAX: ::c_int = 155; +pub const _SC_IPV6: ::c_int = 156; +pub const _SC_RAW_SOCKETS: ::c_int = 157; +pub const _SC_REGEXP: ::c_int = 158; +pub const _SC_SHELL: ::c_int = 159; +pub const _SC_SS_REPL_MAX: ::c_int = 160; +pub const _SC_SYMLOOP_MAX: ::c_int = 161; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 162; +pub const _SC_TRACE_NAME_MAX: ::c_int = 163; +pub const _SC_TRACE_SYS_MAX: ::c_int = 164; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 165; +pub const _SC_V6_ILP32_OFF32: ::c_int = 166; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 167; +pub const _SC_V6_LP64_OFF64: ::c_int = 168; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 169; +pub const _SC_XOPEN_REALTIME: ::c_int = 170; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 171; +pub const _SC_XOPEN_LEGACY: ::c_int = 172; +pub const _SC_XOPEN_STREAMS: ::c_int = 173; +pub const _SC_V7_ILP32_OFF32: ::c_int = 176; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 177; +pub const _SC_V7_LP64_OFF64: ::c_int = 178; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 179; + +pub const GLOB_ERR: ::c_int = 0x0001; +pub const GLOB_MARK: ::c_int = 0x0002; +pub const GLOB_NOSORT: ::c_int = 0x0004; +pub const GLOB_DOOFFS: ::c_int = 0x0008; +pub const GLOB_NOCHECK: ::c_int = 0x0010; +pub const GLOB_APPEND: ::c_int = 0x0020; +pub const GLOB_NOESCAPE: ::c_int = 0x0040; + +pub const GLOB_NOSPACE: ::c_int = 1; +pub const GLOB_ABORTED: ::c_int = 2; +pub const GLOB_NOMATCH: ::c_int = 3; + +pub const S_IEXEC: mode_t = ::S_IXUSR; +pub const S_IWRITE: mode_t = ::S_IWUSR; +pub const S_IREAD: mode_t = ::S_IRUSR; + +pub const S_IFIFO: ::mode_t = 0x1000; +pub const S_IFCHR: ::mode_t = 0x2000; +pub const S_IFDIR: ::mode_t = 0x4000; +pub const S_IFBLK: ::mode_t = 0x6000; +pub const S_IFREG: ::mode_t = 0x8000; +pub const S_IFLNK: ::mode_t = 0xA000; +pub const S_IFSOCK: ::mode_t = 0xC000; +pub const S_IFMT: ::mode_t = 0xF000; + +pub const S_IXOTH: ::mode_t = 0o000001; +pub const S_IWOTH: ::mode_t = 0o000002; +pub const S_IROTH: ::mode_t = 0o000004; +pub const S_IRWXO: ::mode_t = 0o000007; +pub const S_IXGRP: ::mode_t = 0o000010; +pub const S_IWGRP: ::mode_t = 0o000020; +pub const S_IRGRP: ::mode_t = 0o000040; +pub const S_IRWXG: ::mode_t = 0o000070; +pub const S_IXUSR: ::mode_t = 0o000100; +pub const S_IWUSR: ::mode_t = 0o000200; +pub const S_IRUSR: ::mode_t = 0o000400; +pub const S_IRWXU: ::mode_t = 0o000700; + +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; + +pub const ST_RDONLY: ::c_ulong = 0x01; +pub const ST_NOSUID: ::c_ulong = 0x04; +pub const ST_NOEXEC: ::c_ulong = 0x02; +pub const ST_NOATIME: ::c_ulong = 0x20; + +pub const RTLD_NEXT: *mut ::c_void = -3i64 as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = -2i64 as *mut ::c_void; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_NOW: ::c_int = 0x0002; + +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const NEW_TIME: ::c_short = 4; +pub const OLD_TIME: ::c_short = 3; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; + +pub const ENOTSUP: ::c_int = 48; + +pub const BUFSIZ: ::c_uint = 1024; +pub const TMP_MAX: ::c_uint = 26 * 26 * 26; +pub const FOPEN_MAX: ::c_uint = 16; +pub const FILENAME_MAX: ::c_uint = 255; + +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const M_KEEP: ::c_int = 4; +pub const REG_STARTEND: ::c_int = 0o00004; +pub const VEOF: usize = 4; + +pub const RTLD_GLOBAL: ::c_int = 0x0100; +pub const RTLD_NOLOAD: ::c_int = 0x0004; + +pub const O_RDONLY: ::c_int = 0o000000; +pub const O_WRONLY: ::c_int = 0o000001; +pub const O_RDWR: ::c_int = 0o000002; + +pub const O_EXEC: ::c_int = 0o00003; +pub const O_ASYNC: ::c_int = 0o0200000; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const O_TRUNC: ::c_int = 0o001000; +pub const O_CLOEXEC: ::c_int = 0o020000; +pub const O_DIRECTORY: ::c_int = 0o4000000; +pub const O_ACCMODE: ::c_int = 0o000007; +pub const O_APPEND: ::c_int = 0o000010; +pub const O_CREAT: ::c_int = 0o000400; +pub const O_EXCL: ::c_int = 0o002000; +pub const O_NOCTTY: ::c_int = 0o004000; +pub const O_NONBLOCK: ::c_int = 0o000200; +pub const O_SYNC: ::c_int = 0o000040; +pub const O_RSYNC: ::c_int = 0o000100; +pub const O_DSYNC: ::c_int = 0o000020; +pub const O_NOFOLLOW: ::c_int = 0o010000; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_CLOEXEC: ::c_int = 0x10000000; + +pub const SA_SIGINFO: ::c_int = 0x0002; +pub const SA_NOCLDWAIT: ::c_int = 0x0020; +pub const SA_NODEFER: ::c_int = 0x0010; +pub const SA_RESETHAND: ::c_int = 0x0004; +pub const SA_NOCLDSTOP: ::c_int = 0x0001; + +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGWINCH: ::c_int = 20; +pub const SIGCHLD: ::c_int = 18; +pub const SIGBUS: ::c_int = 10; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGCONT: ::c_int = 25; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGURG: ::c_int = 21; +pub const SIGIO: ::c_int = SIGPOLL; +pub const SIGSYS: ::c_int = 12; +pub const SIGPOLL: ::c_int = 22; +pub const SIGPWR: ::c_int = 19; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; + +pub const POLLWRNORM: ::c_short = ::POLLOUT; +pub const POLLWRBAND: ::c_short = 0x0010; + +pub const F_SETLK: ::c_int = 106; +pub const F_SETLKW: ::c_int = 107; +pub const F_ALLOCSP: ::c_int = 110; +pub const F_FREESP: ::c_int = 111; +pub const F_GETLK: ::c_int = 114; + +pub const F_RDLCK: ::c_int = 1; +pub const F_WRLCK: ::c_int = 2; +pub const F_UNLCK: ::c_int = 3; + +pub const NCCS: usize = 40; + +pub const MAP_ANON: ::c_int = MAP_ANONYMOUS; +pub const MAP_ANONYMOUS: ::c_int = 0x00080000; + +pub const MCL_CURRENT: ::c_int = 0x000000001; +pub const MCL_FUTURE: ::c_int = 0x000000002; + +pub const _TIO_CBAUD: ::tcflag_t = 15; +pub const CBAUD: ::tcflag_t = _TIO_CBAUD; +pub const TAB1: ::tcflag_t = 0x0800; +pub const TAB2: ::tcflag_t = 0x1000; +pub const TAB3: ::tcflag_t = 0x1800; +pub const CR1: ::tcflag_t = 0x200; +pub const CR2: ::tcflag_t = 0x400; +pub const CR3: ::tcflag_t = 0x600; +pub const FF1: ::tcflag_t = 0x8000; +pub const BS1: ::tcflag_t = 0x2000; +pub const VT1: ::tcflag_t = 0x4000; +pub const VWERASE: usize = 14; +pub const VREPRINT: usize = 12; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VDISCARD: usize = 13; +pub const VTIME: usize = 17; +pub const IXON: ::tcflag_t = 0x00000400; +pub const IXOFF: ::tcflag_t = 0x00001000; +pub const ONLCR: ::tcflag_t = 0x00000004; +pub const CSIZE: ::tcflag_t = 0x00000030; +pub const CS6: ::tcflag_t = 0x10; +pub const CS7: ::tcflag_t = 0x20; +pub const CS8: ::tcflag_t = 0x30; +pub const CSTOPB: ::tcflag_t = 0x00000040; +pub const CREAD: ::tcflag_t = 0x00000080; +pub const PARENB: ::tcflag_t = 0x00000100; +pub const PARODD: ::tcflag_t = 0x00000200; +pub const HUPCL: ::tcflag_t = 0x00000400; +pub const CLOCAL: ::tcflag_t = 0x00000800; +pub const ECHOKE: ::tcflag_t = 0x00000800; +pub const ECHOE: ::tcflag_t = 0x00000010; +pub const ECHOK: ::tcflag_t = 0x00000020; +pub const ECHONL: ::tcflag_t = 0x00000040; +pub const ECHOCTL: ::tcflag_t = 0x00000200; +pub const ISIG: ::tcflag_t = 0x00000001; +pub const ICANON: ::tcflag_t = 0x00000002; +pub const NOFLSH: ::tcflag_t = 0x00000080; +pub const OLCUC: ::tcflag_t = 0x00000002; +pub const NLDLY: ::tcflag_t = 0x00000100; +pub const CRDLY: ::tcflag_t = 0x00000600; +pub const TABDLY: ::tcflag_t = 0x00001800; +pub const BSDLY: ::tcflag_t = 0x00002000; +pub const FFDLY: ::tcflag_t = 0x00008000; +pub const VTDLY: ::tcflag_t = 0x00004000; +pub const XTABS: ::tcflag_t = 0x1800; + +pub const B0: ::speed_t = 0; +pub const B50: ::speed_t = 1; +pub const B75: ::speed_t = 2; +pub const B110: ::speed_t = 3; +pub const B134: ::speed_t = 4; +pub const B150: ::speed_t = 5; +pub const B200: ::speed_t = 6; +pub const B300: ::speed_t = 7; +pub const B600: ::speed_t = 8; +pub const B1200: ::speed_t = 9; +pub const B1800: ::speed_t = 10; +pub const B2400: ::speed_t = 11; +pub const B4800: ::speed_t = 12; +pub const B9600: ::speed_t = 13; +pub const B19200: ::speed_t = 14; +pub const B38400: ::speed_t = 15; +pub const EXTA: ::speed_t = 14; +pub const EXTB: ::speed_t = 15; +pub const B57600: ::speed_t = 57600; +pub const B115200: ::speed_t = 115200; + +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 16; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; + +pub const TCSANOW: ::c_int = 0x0001; +pub const TCSADRAIN: ::c_int = 0x0002; +pub const TCSAFLUSH: ::c_int = 0x0004; + +pub const HW_MACHINE: ::c_int = 1; +pub const HW_MODEL: ::c_int = 2; +pub const HW_NCPU: ::c_int = 3; +pub const HW_BYTEORDER: ::c_int = 4; +pub const HW_PHYSMEM: ::c_int = 5; +pub const HW_USERMEM: ::c_int = 6; +pub const HW_PAGESIZE: ::c_int = 7; +pub const HW_DISKNAMES: ::c_int = 8; +pub const HW_IOSTATS: ::c_int = 9; +pub const HW_MACHINE_ARCH: ::c_int = 10; +pub const HW_ALIGNBYTES: ::c_int = 11; +pub const HW_CNMAGIC: ::c_int = 12; +pub const HW_PHYSMEM64: ::c_int = 13; +pub const HW_USERMEM64: ::c_int = 14; +pub const HW_IOSTATNAMES: ::c_int = 15; +pub const HW_MAXID: ::c_int = 15; + +pub const CTL_UNSPEC: ::c_int = 0; +pub const CTL_KERN: ::c_int = 1; +pub const CTL_VM: ::c_int = 2; +pub const CTL_VFS: ::c_int = 3; +pub const CTL_NET: ::c_int = 4; +pub const CTL_DEBUG: ::c_int = 5; +pub const CTL_HW: ::c_int = 6; +pub const CTL_MACHDEP: ::c_int = 7; +pub const CTL_USER: ::c_int = 8; +pub const CTL_QNX: ::c_int = 9; +pub const CTL_PROC: ::c_int = 10; +pub const CTL_VENDOR: ::c_int = 11; +pub const CTL_EMUL: ::c_int = 12; +pub const CTL_SECURITY: ::c_int = 13; +pub const CTL_MAXID: ::c_int = 14; + +pub const DAY_1: ::nl_item = 8; +pub const DAY_2: ::nl_item = 9; +pub const DAY_3: ::nl_item = 10; +pub const DAY_4: ::nl_item = 11; +pub const DAY_5: ::nl_item = 12; +pub const DAY_6: ::nl_item = 13; +pub const DAY_7: ::nl_item = 14; + +pub const MON_1: ::nl_item = 22; +pub const MON_2: ::nl_item = 23; +pub const MON_3: ::nl_item = 24; +pub const MON_4: ::nl_item = 25; +pub const MON_5: ::nl_item = 26; +pub const MON_6: ::nl_item = 27; +pub const MON_7: ::nl_item = 28; +pub const MON_8: ::nl_item = 29; +pub const MON_9: ::nl_item = 30; +pub const MON_10: ::nl_item = 31; +pub const MON_11: ::nl_item = 32; +pub const MON_12: ::nl_item = 33; + +pub const ABDAY_1: ::nl_item = 15; +pub const ABDAY_2: ::nl_item = 16; +pub const ABDAY_3: ::nl_item = 17; +pub const ABDAY_4: ::nl_item = 18; +pub const ABDAY_5: ::nl_item = 19; +pub const ABDAY_6: ::nl_item = 20; +pub const ABDAY_7: ::nl_item = 21; + +pub const ABMON_1: ::nl_item = 34; +pub const ABMON_2: ::nl_item = 35; +pub const ABMON_3: ::nl_item = 36; +pub const ABMON_4: ::nl_item = 37; +pub const ABMON_5: ::nl_item = 38; +pub const ABMON_6: ::nl_item = 39; +pub const ABMON_7: ::nl_item = 40; +pub const ABMON_8: ::nl_item = 41; +pub const ABMON_9: ::nl_item = 42; +pub const ABMON_10: ::nl_item = 43; +pub const ABMON_11: ::nl_item = 44; +pub const ABMON_12: ::nl_item = 45; + +pub const AF_ARP: ::c_int = 28; +pub const AF_CCITT: ::c_int = 10; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_CNT: ::c_int = 21; +pub const AF_COIP: ::c_int = 20; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_E164: ::c_int = 26; +pub const AF_ECMA: ::c_int = 8; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_IEEE80211: ::c_int = 32; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_ISO: ::c_int = 7; +pub const AF_LAT: ::c_int = 14; +pub const AF_LINK: ::c_int = 18; +pub const AF_NATM: ::c_int = 27; +pub const AF_NS: ::c_int = 6; +pub const AF_OSI: ::c_int = 7; +pub const AF_PUP: ::c_int = 4; +pub const ALT_DIGITS: ::nl_item = 50; +pub const AM_STR: ::nl_item = 6; +pub const B76800: ::speed_t = 76800; + +pub const BIOCFLUSH: ::c_int = 17000; +pub const BIOCGBLEN: ::c_int = 1074020966; +pub const BIOCGDLT: ::c_int = 1074020970; +pub const BIOCGDLTLIST: ::c_int = -1072676233; +pub const BIOCGETIF: ::c_int = 1083196011; +pub const BIOCGHDRCMPLT: ::c_int = 1074020980; +pub const BIOCGRTIMEOUT: ::c_int = 1074807406; +pub const BIOCGSEESENT: ::c_int = 1074020984; +pub const BIOCGSTATS: ::c_int = 1082147439; +pub const BIOCIMMEDIATE: ::c_int = -2147204496; +pub const BIOCPROMISC: ::c_int = 17001; +pub const BIOCSBLEN: ::c_int = -1073462682; +pub const BIOCSDLT: ::c_int = -2147204490; +pub const BIOCSETF: ::c_int = -2146418073; +pub const BIOCSETIF: ::c_int = -2138029460; +pub const BIOCSHDRCMPLT: ::c_int = -2147204491; +pub const BIOCSRTIMEOUT: ::c_int = -2146418067; +pub const BIOCSSEESENT: ::c_int = -2147204487; +pub const BIOCVERSION: ::c_int = 1074020977; + +pub const BPF_ALIGNMENT: usize = ::mem::size_of::<::c_long>(); +pub const CHAR_BIT: usize = 8; +pub const CODESET: ::nl_item = 1; +pub const CRNCYSTR: ::nl_item = 55; + +pub const D_FLAG_FILTER: ::c_int = 0x00000001; +pub const D_FLAG_STAT: ::c_int = 0x00000002; +pub const D_FLAG_STAT_FORM_MASK: ::c_int = 0x000000f0; +pub const D_FLAG_STAT_FORM_T32_2001: ::c_int = 0x00000010; +pub const D_FLAG_STAT_FORM_T32_2008: ::c_int = 0x00000020; +pub const D_FLAG_STAT_FORM_T64_2008: ::c_int = 0x00000030; +pub const D_FLAG_STAT_FORM_UNSET: ::c_int = 0x00000000; + +pub const D_FMT: ::nl_item = 3; +pub const D_GETFLAG: ::c_int = 1; +pub const D_SETFLAG: ::c_int = 2; +pub const D_T_FMT: ::nl_item = 2; +pub const ERA: ::nl_item = 46; +pub const ERA_D_FMT: ::nl_item = 47; +pub const ERA_D_T_FMT: ::nl_item = 48; +pub const ERA_T_FMT: ::nl_item = 49; +pub const RADIXCHAR: ::nl_item = 51; +pub const THOUSEP: ::nl_item = 52; +pub const YESEXPR: ::nl_item = 53; +pub const NOEXPR: ::nl_item = 54; +pub const F_GETOWN: ::c_int = 35; + +pub const FIONBIO: ::c_int = -2147195266; +pub const FIOASYNC: ::c_int = -2147195267; +pub const FIOCLEX: ::c_int = 26113; +pub const FIOGETOWN: ::c_int = 1074030203; +pub const FIONCLEX: ::c_int = 26114; +pub const FIONREAD: ::c_int = 1074030207; +pub const FIONSPACE: ::c_int = 1074030200; +pub const FIONWRITE: ::c_int = 1074030201; +pub const FIOSETOWN: ::c_int = -2147195268; + +pub const F_SETOWN: ::c_int = 36; +pub const IFF_ACCEPTRTADV: ::c_int = 0x40000000; +pub const IFF_IP6FORWARDING: ::c_int = 0x20000000; +pub const IFF_LINK0: ::c_int = 0x00001000; +pub const IFF_LINK1: ::c_int = 0x00002000; +pub const IFF_LINK2: ::c_int = 0x00004000; +pub const IFF_OACTIVE: ::c_int = 0x00000400; +pub const IFF_SHIM: ::c_int = 0x80000000; +pub const IFF_SIMPLEX: ::c_int = 0x00000800; +pub const IHFLOW: tcflag_t = 0x00000001; +pub const IIDLE: tcflag_t = 0x00000008; +pub const IP_RECVDSTADDR: ::c_int = 7; +pub const IP_RECVIF: ::c_int = 20; +pub const IPTOS_ECN_NOTECT: u8 = 0x00; +pub const IUCLC: tcflag_t = 0x00000200; +pub const IUTF8: tcflag_t = 0x0004000; + +pub const KERN_ARGMAX: ::c_int = 8; +pub const KERN_ARND: ::c_int = 81; +pub const KERN_BOOTTIME: ::c_int = 21; +pub const KERN_CLOCKRATE: ::c_int = 12; +pub const KERN_FILE: ::c_int = 15; +pub const KERN_HOSTID: ::c_int = 11; +pub const KERN_HOSTNAME: ::c_int = 10; +pub const KERN_IOV_MAX: ::c_int = 38; +pub const KERN_JOB_CONTROL: ::c_int = 19; +pub const KERN_LOGSIGEXIT: ::c_int = 46; +pub const KERN_MAXFILES: ::c_int = 7; +pub const KERN_MAXID: ::c_int = 83; +pub const KERN_MAXPROC: ::c_int = 6; +pub const KERN_MAXVNODES: ::c_int = 5; +pub const KERN_NGROUPS: ::c_int = 18; +pub const KERN_OSRELEASE: ::c_int = 2; +pub const KERN_OSREV: ::c_int = 3; +pub const KERN_OSTYPE: ::c_int = 1; +pub const KERN_POSIX1: ::c_int = 17; +pub const KERN_PROC: ::c_int = 14; +pub const KERN_PROC_ALL: ::c_int = 0; +pub const KERN_PROC_ARGS: ::c_int = 48; +pub const KERN_PROC_ENV: ::c_int = 3; +pub const KERN_PROC_GID: ::c_int = 7; +pub const KERN_PROC_PGRP: ::c_int = 2; +pub const KERN_PROC_PID: ::c_int = 1; +pub const KERN_PROC_RGID: ::c_int = 8; +pub const KERN_PROC_RUID: ::c_int = 6; +pub const KERN_PROC_SESSION: ::c_int = 3; +pub const KERN_PROC_TTY: ::c_int = 4; +pub const KERN_PROC_UID: ::c_int = 5; +pub const KERN_PROF: ::c_int = 16; +pub const KERN_SAVED_IDS: ::c_int = 20; +pub const KERN_SECURELVL: ::c_int = 9; +pub const KERN_VERSION: ::c_int = 4; +pub const KERN_VNODE: ::c_int = 13; + +pub const LC_ALL: ::c_int = 63; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MESSAGES: ::c_int = 32; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_NUMERIC: ::c_int = 8; +pub const LC_TIME: ::c_int = 16; + +pub const LOCAL_CONNWAIT: ::c_int = 0x0002; +pub const LOCAL_CREDS: ::c_int = 0x0001; +pub const LOCAL_PEEREID: ::c_int = 0x0003; + +pub const MAP_STACK: ::c_int = 0x00001000; +pub const MNT_NOEXEC: ::c_int = 0x02; +pub const MNT_NOSUID: ::c_int = 0x04; +pub const MNT_RDONLY: ::c_int = 0x01; + +pub const MSG_NOTIFICATION: ::c_int = 0x0400; + +pub const NET_RT_DUMP: ::c_int = 1; +pub const NET_RT_FLAGS: ::c_int = 2; +pub const NET_RT_IFLIST: ::c_int = 4; +pub const NI_NUMERICSCOPE: ::c_int = 0x00000040; +pub const OHFLOW: tcflag_t = 0x00000002; +pub const P_ALL: idtype_t = 0; +pub const PARSTK: tcflag_t = 0x00000004; +pub const PF_ARP: ::c_int = 28; +pub const PF_CCITT: ::c_int = 10; +pub const PF_CHAOS: ::c_int = 5; +pub const PF_CNT: ::c_int = 21; +pub const PF_COIP: ::c_int = 20; +pub const PF_DATAKIT: ::c_int = 9; +pub const PF_DECnet: ::c_int = 12; +pub const PF_DLI: ::c_int = 13; +pub const PF_ECMA: ::c_int = 8; +pub const PF_HYLINK: ::c_int = 15; +pub const PF_IMPLINK: ::c_int = 3; +pub const PF_ISO: ::c_int = 7; +pub const PF_LAT: ::c_int = 14; +pub const PF_LINK: ::c_int = 18; +pub const PF_NATM: ::c_int = 27; +pub const PF_OSI: ::c_int = 7; +pub const PF_PIP: ::c_int = 25; +pub const PF_PUP: ::c_int = 4; +pub const PF_RTIP: ::c_int = 22; +pub const PF_XTP: ::c_int = 19; +pub const PM_STR: ::nl_item = 7; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 2; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 1; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const _POSIX_VDISABLE: ::c_int = 0; +pub const P_PGID: idtype_t = 2; +pub const P_PID: idtype_t = 1; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_USER: ::c_int = 2; +pub const pseudo_AF_HDRCMPLT: ::c_int = 30; +pub const pseudo_AF_PIP: ::c_int = 25; +pub const pseudo_AF_RTIP: ::c_int = 22; +pub const pseudo_AF_XTP: ::c_int = 19; +pub const REG_ASSERT: ::c_int = 15; +pub const REG_ATOI: ::c_int = 255; +pub const REG_BACKR: ::c_int = 0x400; +pub const REG_BASIC: ::c_int = 0x00; +pub const REG_DUMP: ::c_int = 0x80; +pub const REG_EMPTY: ::c_int = 14; +pub const REG_INVARG: ::c_int = 16; +pub const REG_ITOA: ::c_int = 0o400; +pub const REG_LARGE: ::c_int = 0x200; +pub const REG_NOSPEC: ::c_int = 0x10; +pub const REG_OK: ::c_int = 0; +pub const REG_PEND: ::c_int = 0x20; +pub const REG_TRACE: ::c_int = 0x100; + +pub const RLIMIT_AS: ::c_int = 6; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_MEMLOCK: ::c_int = 7; +pub const RLIMIT_NOFILE: ::c_int = 5; +pub const RLIMIT_NPROC: ::c_int = 8; +pub const RLIMIT_RSS: ::c_int = 6; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_VMEM: ::c_int = 6; +pub const RLIM_NLIMITS: ::c_int = 14; + +pub const SCHED_ADJTOHEAD: ::c_int = 5; +pub const SCHED_ADJTOTAIL: ::c_int = 6; +pub const SCHED_MAXPOLICY: ::c_int = 7; +pub const SCHED_SETPRIO: ::c_int = 7; +pub const SCHED_SPORADIC: ::c_int = 4; + +pub const SHM_ANON: *mut ::c_char = -1isize as *mut ::c_char; +pub const SIGCLD: ::c_int = SIGCHLD; +pub const SIGDEADLK: ::c_int = 7; +pub const SIGEMT: ::c_int = 7; +pub const SIGEV_NONE: ::c_int = 0; +pub const SIGEV_SIGNAL: ::c_int = 129; +pub const SIGEV_THREAD: ::c_int = 135; +pub const SIOCGIFADDR: ::c_int = -1064277727; +pub const SO_FIB: ::c_int = 0x100a; +pub const SO_OVERFLOWED: ::c_int = 0x1009; +pub const SO_SETFIB: ::c_int = 0x100a; +pub const SO_TXPRIO: ::c_int = 0x100b; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_VLANPRIO: ::c_int = 0x100c; +pub const _SS_ALIGNSIZE: usize = ::mem::size_of::(); +pub const _SS_MAXSIZE: usize = 128; +pub const _SS_PAD1SIZE: usize = _SS_ALIGNSIZE - 2; +pub const _SS_PAD2SIZE: usize = _SS_MAXSIZE - 2 - _SS_PAD1SIZE - _SS_ALIGNSIZE; +pub const TC_CPOSIX: tcflag_t = CLOCAL | CREAD | CSIZE | CSTOPB | HUPCL | PARENB | PARODD; +pub const TCGETS: ::c_int = 0x404c540d; +pub const TC_IPOSIX: tcflag_t = + BRKINT | ICRNL | IGNBRK | IGNPAR | INLCR | INPCK | ISTRIP | IXOFF | IXON | PARMRK; +pub const TC_LPOSIX: tcflag_t = + ECHO | ECHOE | ECHOK | ECHONL | ICANON | IEXTEN | ISIG | NOFLSH | TOSTOP; +pub const TC_OPOSIX: tcflag_t = OPOST; +pub const T_FMT_AMPM: ::nl_item = 5; + +pub const TIOCCBRK: ::c_int = 29818; +pub const TIOCCDTR: ::c_int = 29816; +pub const TIOCDRAIN: ::c_int = 29790; +pub const TIOCEXCL: ::c_int = 29709; +pub const TIOCFLUSH: ::c_int = -2147191792; +pub const TIOCGETA: ::c_int = 1078752275; +pub const TIOCGPGRP: ::c_int = 1074033783; +pub const TIOCGWINSZ: ::c_int = 1074295912; +pub const TIOCMBIC: ::c_int = -2147191701; +pub const TIOCMBIS: ::c_int = -2147191700; +pub const TIOCMGET: ::c_int = 1074033770; +pub const TIOCMSET: ::c_int = -2147191699; +pub const TIOCNOTTY: ::c_int = 29809; +pub const TIOCNXCL: ::c_int = 29710; +pub const TIOCOUTQ: ::c_int = 1074033779; +pub const TIOCPKT: ::c_int = -2147191696; +pub const TIOCPKT_DATA: ::c_int = 0x00; +pub const TIOCPKT_DOSTOP: ::c_int = 0x20; +pub const TIOCPKT_FLUSHREAD: ::c_int = 0x01; +pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x02; +pub const TIOCPKT_IOCTL: ::c_int = 0x40; +pub const TIOCPKT_NOSTOP: ::c_int = 0x10; +pub const TIOCPKT_START: ::c_int = 0x08; +pub const TIOCPKT_STOP: ::c_int = 0x04; +pub const TIOCSBRK: ::c_int = 29819; +pub const TIOCSCTTY: ::c_int = 29793; +pub const TIOCSDTR: ::c_int = 29817; +pub const TIOCSETA: ::c_int = -2142473196; +pub const TIOCSETAF: ::c_int = -2142473194; +pub const TIOCSETAW: ::c_int = -2142473195; +pub const TIOCSPGRP: ::c_int = -2147191690; +pub const TIOCSTART: ::c_int = 29806; +pub const TIOCSTI: ::c_int = -2147388302; +pub const TIOCSTOP: ::c_int = 29807; +pub const TIOCSWINSZ: ::c_int = -2146929561; + +pub const USER_CS_PATH: ::c_int = 1; +pub const USER_BC_BASE_MAX: ::c_int = 2; +pub const USER_BC_DIM_MAX: ::c_int = 3; +pub const USER_BC_SCALE_MAX: ::c_int = 4; +pub const USER_BC_STRING_MAX: ::c_int = 5; +pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6; +pub const USER_EXPR_NEST_MAX: ::c_int = 7; +pub const USER_LINE_MAX: ::c_int = 8; +pub const USER_RE_DUP_MAX: ::c_int = 9; +pub const USER_POSIX2_VERSION: ::c_int = 10; +pub const USER_POSIX2_C_BIND: ::c_int = 11; +pub const USER_POSIX2_C_DEV: ::c_int = 12; +pub const USER_POSIX2_CHAR_TERM: ::c_int = 13; +pub const USER_POSIX2_FORT_DEV: ::c_int = 14; +pub const USER_POSIX2_FORT_RUN: ::c_int = 15; +pub const USER_POSIX2_LOCALEDEF: ::c_int = 16; +pub const USER_POSIX2_SW_DEV: ::c_int = 17; +pub const USER_POSIX2_UPE: ::c_int = 18; +pub const USER_STREAM_MAX: ::c_int = 19; +pub const USER_TZNAME_MAX: ::c_int = 20; +pub const USER_ATEXIT_MAX: ::c_int = 21; +pub const USER_MAXID: ::c_int = 22; + +pub const VDOWN: usize = 31; +pub const VINS: usize = 32; +pub const VDEL: usize = 33; +pub const VRUB: usize = 34; +pub const VCAN: usize = 35; +pub const VHOME: usize = 36; +pub const VEND: usize = 37; +pub const VSPARE3: usize = 38; +pub const VSPARE4: usize = 39; +pub const VSWTCH: usize = 7; +pub const VDSUSP: usize = 11; +pub const VFWD: usize = 18; +pub const VLOGIN: usize = 19; +pub const VPREFIX: usize = 20; +pub const VSUFFIX: usize = 24; +pub const VLEFT: usize = 28; +pub const VRIGHT: usize = 29; +pub const VUP: usize = 30; +pub const XCASE: tcflag_t = 0x00000004; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0x00; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 0x01; + +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3; +pub const PTHREAD_STACK_MIN: ::size_t = 256; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = 0; +pub const PTHREAD_MUTEX_STALLED: ::c_int = 0x00; +pub const PTHREAD_MUTEX_ROBUST: ::c_int = 0x10; +pub const PTHREAD_PROCESS_PRIVATE: ::c_int = 0x00; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 0x01; + +pub const PTHREAD_KEYS_MAX: usize = 128; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __u: 0x80000000, + __owner: 0xffffffff, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __u: CLOCK_REALTIME as u32, + __owner: 0xfffffffb, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __active: 0, + __blockedwriters: 0, + __blockedreaders: 0, + __heavy: 0, + __lock: PTHREAD_MUTEX_INITIALIZER, + __rcond: PTHREAD_COND_INITIALIZER, + __wcond: PTHREAD_COND_INITIALIZER, + __owner: -2i32 as ::c_uint, + __spare: 0, +}; + +const_fn! { + {const} fn _CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) + } + + {const} fn _ALIGN(p: usize, b: usize) -> usize { + (p + b - 1) & !(b-1) + } +} + +f! { + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + let msg = _CMSG_ALIGN((*cmsg).cmsg_len as usize); + let next = cmsg as usize + msg + _CMSG_ALIGN(::mem::size_of::<::cmsghdr>()); + if next > (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + msg) as *mut ::cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(_CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + _CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (_CMSG_ALIGN(::mem::size_of::()) + _CMSG_ALIGN(length as usize) ) + as ::c_uint + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } + + pub fn _DEXTRA_FIRST(_d: *const dirent) -> *mut ::dirent_extra { + let _f = &((*(_d)).d_name) as *const _; + let _s = _d as usize; + + _ALIGN(_s + _f as usize - _s + (*_d).d_namelen as usize + 1, 8) as *mut ::dirent_extra + } + + pub fn _DEXTRA_VALID(_x: *const ::dirent_extra, _d: *const dirent) -> bool { + let sz = _x as usize - _d as usize + ::mem::size_of::<::dirent_extra>(); + let rsz = (*_d).d_reclen as usize; + + if sz > rsz || sz + (*_x).d_datalen as usize > rsz { + false + } else { + true + } + } + + pub fn _DEXTRA_NEXT(_x: *const ::dirent_extra) -> *mut ::dirent_extra { + _ALIGN( + _x as usize + ::mem::size_of::<::dirent_extra>() + (*_x).d_datalen as usize, 8 + ) as *mut ::dirent_extra + } + + pub fn SOCKCREDSIZE(ngrps: usize) -> usize { + let ngrps = if ngrps > 0 { + ngrps - 1 + } else { + 0 + }; + ::mem::size_of::() + ::mem::size_of::<::gid_t>() * ngrps + } + + pub fn major(dev: ::dev_t) -> ::c_uint { + ((dev as ::c_uint) >> 10) & 0x3f + } + + pub fn minor(dev: ::dev_t) -> ::c_uint { + (dev as ::c_uint) & 0x3ff + } +} + +safe_f! { + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0x7f + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0x7f) + 1) as i8 >= 2 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0x7f) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } + + pub {const} fn IPTOS_ECN(x: u8) -> u8 { + x & ::IPTOS_ECN_MASK + } + + pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { + ((major << 10) | (minor)) as ::dev_t + } +} + +// Network related functions are provided by libsocket and regex +// functions are provided by libregex. +#[link(name = "socket")] +#[link(name = "regex")] + +extern "C" { + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn mknodat( + __fd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: ::dev_t, + ) -> ::c_int; + + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_mutexattr_setpshared( + attr: *mut pthread_mutexattr_t, + pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_getpshared( + attr: *const pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; + pub fn ptsname_r(fd: ::c_int, buf: *mut ::c_char, buflen: ::size_t) -> *mut ::c_char; + pub fn clearenv() -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + pub fn wait4( + pid: ::pid_t, + status: *mut ::c_int, + options: ::c_int, + rusage: *mut ::rusage, + ) -> ::pid_t; + pub fn execvpe( + file: *const ::c_char, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + pub fn login_tty(fd: ::c_int) -> ::c_int; + + pub fn uname(buf: *mut ::utsname) -> ::c_int; + + pub fn getpeereid(socket: ::c_int, euid: *mut ::uid_t, egid: *mut ::gid_t) -> ::c_int; + + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwent() -> *mut passwd; + pub fn setgrent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + pub fn setspent(); + pub fn endspent(); + + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + + pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; + pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + info: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; + pub fn pthread_setschedprio(native: ::pthread_t, priority: ::c_int) -> ::c_int; + + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + + pub fn glob( + pattern: *const c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + + pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sync(); + pub fn pthread_getschedparam( + native: ::pthread_t, + policy: *mut ::c_int, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn umount(target: *const ::c_char, flags: ::c_int) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn settimeofday(tv: *const ::timeval, tz: *const ::c_void) -> ::c_int; + pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; + pub fn mount( + special_device: *const ::c_char, + mount_directory: *const ::c_char, + flags: ::c_int, + mount_type: *const ::c_char, + mount_data: *const ::c_void, + mount_datalen: ::c_int, + ) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; + pub fn pthread_mutex_consistent(mutex: *mut pthread_mutex_t) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_spin_init(lock: *mut ::pthread_spinlock_t, pshared: ::c_int) -> ::c_int; + pub fn pthread_spin_destroy(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_lock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_trylock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_spin_unlock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_barrierattr_init(__attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_destroy(__attr: *mut ::pthread_barrierattr_t) -> ::c_int; + pub fn pthread_barrierattr_getpshared( + __attr: *const ::pthread_barrierattr_t, + __pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_barrierattr_setpshared( + __attr: *mut ::pthread_barrierattr_t, + __pshared: ::c_int, + ) -> ::c_int; + pub fn pthread_barrier_init( + __barrier: *mut ::pthread_barrier_t, + __attr: *const ::pthread_barrierattr_t, + __count: ::c_uint, + ) -> ::c_int; + pub fn pthread_barrier_destroy(__barrier: *mut ::pthread_barrier_t) -> ::c_int; + pub fn pthread_barrier_wait(__barrier: *mut ::pthread_barrier_t) -> ::c_int; + + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn pthread_attr_getguardsize( + attr: *const ::pthread_attr_t, + guardsize: *mut ::size_t, + ) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn pthread_condattr_getpshared( + attr: *const pthread_condattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_setschedparam( + native: ::pthread_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn getgrouplist( + user: *const ::c_char, + group: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_getrobust( + attr: *const pthread_mutexattr_t, + robustness: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_mutexattr_setrobust( + attr: *mut pthread_mutexattr_t, + robustness: ::c_int, + ) -> ::c_int; + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn getitimer(which: ::c_int, curr_value: *mut ::itimerval) -> ::c_int; + pub fn setitimer( + which: ::c_int, + value: *const ::itimerval, + ovalue: *mut ::itimerval, + ) -> ::c_int; + pub fn posix_spawn( + pid: *mut ::pid_t, + path: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnp( + pid: *mut ::pid_t, + file: *const ::c_char, + file_actions: *const ::posix_spawn_file_actions_t, + attrp: *const ::posix_spawnattr_t, + argv: *const *mut ::c_char, + envp: *const *mut ::c_char, + ) -> ::c_int; + pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; + pub fn posix_spawnattr_getsigdefault( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigdefault( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getsigmask( + attr: *const posix_spawnattr_t, + default: *mut ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_setsigmask( + attr: *mut posix_spawnattr_t, + default: *const ::sigset_t, + ) -> ::c_int; + pub fn posix_spawnattr_getflags( + attr: *const posix_spawnattr_t, + flags: *mut ::c_short, + ) -> ::c_int; + pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; + pub fn posix_spawnattr_getpgroup( + attr: *const posix_spawnattr_t, + flags: *mut ::pid_t, + ) -> ::c_int; + pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; + pub fn posix_spawnattr_getschedpolicy( + attr: *const posix_spawnattr_t, + flags: *mut ::c_int, + ) -> ::c_int; + pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; + pub fn posix_spawnattr_getschedparam( + attr: *const posix_spawnattr_t, + param: *mut ::sched_param, + ) -> ::c_int; + pub fn posix_spawnattr_setschedparam( + attr: *mut posix_spawnattr_t, + param: *const ::sched_param, + ) -> ::c_int; + + pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; + pub fn posix_spawn_file_actions_addopen( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + path: *const ::c_char, + oflag: ::c_int, + mode: ::mode_t, + ) -> ::c_int; + pub fn posix_spawn_file_actions_addclose( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + ) -> ::c_int; + pub fn posix_spawn_file_actions_adddup2( + actions: *mut posix_spawn_file_actions_t, + fd: ::c_int, + newfd: ::c_int, + ) -> ::c_int; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn inotify_rm_watch(fd: ::c_int, wd: ::c_int) -> ::c_int; + pub fn inotify_init() -> ::c_int; + pub fn inotify_add_watch(fd: ::c_int, path: *const ::c_char, mask: u32) -> ::c_int; + + pub fn gettid() -> ::pid_t; + + pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; + + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_uint, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn mallopt(param: ::c_int, value: i64) -> ::c_int; + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + + pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + pub fn mallinfo() -> ::mallinfo; + pub fn getpwent_r( + pwd: *mut ::passwd, + buf: *mut ::c_char, + __bufsize: ::c_int, + __result: *mut *mut ::passwd, + ) -> ::c_int; + pub fn pthread_getname_np(thread: ::pthread_t, name: *mut ::c_char, len: ::c_int) -> ::c_int; + pub fn pthread_setname_np(thread: ::pthread_t, name: *const ::c_char) -> ::c_int; + + pub fn sysctl( + _: *const ::c_int, + _: ::c_uint, + _: *mut ::c_void, + _: *mut ::size_t, + _: *const ::c_void, + _: ::size_t, + ) -> ::c_int; + + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlp: *const ::rlimit) -> ::c_int; + + pub fn lio_listio( + __mode: ::c_int, + __list: *const *mut aiocb, + __nent: ::c_int, + __sig: *mut sigevent, + ) -> ::c_int; + + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *const dl_phdr_info, + size: ::size_t, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + + pub fn memset_s(s: *mut ::c_void, smax: ::size_t, c: ::c_int, n: ::size_t) -> ::c_int; + + pub fn regcomp( + __preg: *mut ::regex_t, + __pattern: *const ::c_char, + __cflags: ::c_int, + ) -> ::c_int; + pub fn regexec( + __preg: *const ::regex_t, + __str: *const ::c_char, + __nmatch: ::size_t, + __pmatch: *mut ::regmatch_t, + __eflags: ::c_int, + ) -> ::c_int; + pub fn regerror( + __errcode: ::c_int, + __preg: *const ::regex_t, + __errbuf: *mut ::c_char, + __errbuf_size: ::size_t, + ) -> ::size_t; + pub fn regfree(__preg: *mut ::regex_t); + pub fn dirfd(__dirp: *mut ::DIR) -> ::c_int; + pub fn dircntl(dir: *mut ::DIR, cmd: ::c_int, ...) -> ::c_int; + + pub fn aio_cancel(__fd: ::c_int, __aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_error(__aiocbp: *const ::aiocb) -> ::c_int; + pub fn aio_fsync(__operation: ::c_int, __aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_read(__aiocbp: *mut ::aiocb) -> ::c_int; + pub fn aio_return(__aiocpb: *mut ::aiocb) -> ::ssize_t; + pub fn aio_suspend( + __list: *const *const ::aiocb, + __nent: ::c_int, + __timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(__aiocpb: *mut ::aiocb) -> ::c_int; + + pub fn mq_close(__mqdes: ::mqd_t) -> ::c_int; + pub fn mq_getattr(__mqdes: ::mqd_t, __mqstat: *mut ::mq_attr) -> ::c_int; + pub fn mq_notify(__mqdes: ::mqd_t, __notification: *const ::sigevent) -> ::c_int; + pub fn mq_open(__name: *const ::c_char, __oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_receive( + __mqdes: ::mqd_t, + __msg_ptr: *mut ::c_char, + __msg_len: ::size_t, + __msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_send( + __mqdes: ::mqd_t, + __msg_ptr: *const ::c_char, + __msg_len: ::size_t, + __msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_setattr( + __mqdes: ::mqd_t, + __mqstat: *const mq_attr, + __omqstat: *mut mq_attr, + ) -> ::c_int; + pub fn mq_timedreceive( + __mqdes: ::mqd_t, + __msg_ptr: *mut ::c_char, + __msg_len: ::size_t, + __msg_prio: *mut ::c_uint, + __abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_timedsend( + __mqdes: ::mqd_t, + __msg_ptr: *const ::c_char, + __msg_len: ::size_t, + __msg_prio: ::c_uint, + __abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_unlink(__name: *const ::c_char) -> ::c_int; + pub fn __get_errno_ptr() -> *mut ::c_int; + + // System page, see https://www.qnx.com/developers/docs/7.1#com.qnx.doc.neutrino.building/topic/syspage/syspage_about.html + pub static mut _syspage_ptr: *mut syspage_entry; + + // Function on the stack after a call to pthread_create(). This is used + // as a sentinel to work around an infitnite loop in the unwinding code. + pub fn __my_thread_exit(value_ptr: *mut *const ::c_void); +} + +// Models the implementation in stdlib.h. Ctest will fail if trying to use the +// default symbol from libc +pub unsafe fn atexit(cb: extern "C" fn()) -> ::c_int { + extern "C" { + static __dso_handle: *mut ::c_void; + pub fn __cxa_atexit( + cb: extern "C" fn(), + __arg: *mut ::c_void, + __dso: *mut ::c_void, + ) -> ::c_int; + } + __cxa_atexit(cb, 0 as *mut ::c_void, __dso_handle) +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_si_addr { + _pad: [u8; 32], + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_si_addr)).si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + #[repr(C)] + struct siginfo_si_value { + _pad: [u8; 32], + si_value: ::sigval, + } + (*(self as *const siginfo_t as *const siginfo_si_value)).si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + #[repr(C)] + struct siginfo_si_pid { + _pad: [u8; 16], + si_pid: ::pid_t, + } + (*(self as *const siginfo_t as *const siginfo_si_pid)).si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + #[repr(C)] + struct siginfo_si_uid { + _pad: [u8; 24], + si_uid: ::uid_t, + } + (*(self as *const siginfo_t as *const siginfo_si_uid)).si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + #[repr(C)] + struct siginfo_si_status { + _pad: [u8; 28], + si_status: ::c_int, + } + (*(self as *const siginfo_t as *const siginfo_si_status)).si_status + } +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } + else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } + else { + panic!("Unsupported arch"); + } +} + +mod neutrino; +pub use self::neutrino::*; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/neutrino.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/neutrino.rs new file mode 100644 index 0000000..1a6f7da --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/neutrino.rs @@ -0,0 +1,1288 @@ +pub type nto_job_t = ::sync_t; + +s! { + pub struct syspage_entry_info { + pub entry_off: u16, + pub entry_size: u16, + } + pub struct syspage_array_info { + entry_off: u16, + entry_size: u16, + element_size: u16, + } + + pub struct intrspin { + pub value: ::c_uint, // volatile + } + + pub struct iov_t { + pub iov_base: *mut ::c_void, // union + pub iov_len: ::size_t, + } + + pub struct _itimer { + pub nsec: u64, + pub interval_nsec: u64, + } + + pub struct _msg_info64 { + pub nd: u32, + pub srcnd: u32, + pub pid: ::pid_t, + pub tid: i32, + pub chid: i32, + pub scoid: i32, + pub coid: i32, + pub priority: i16, + pub flags: i16, + pub msglen: isize, + pub srcmsglen: isize, + pub dstmsglen: isize, + pub type_id: u32, + reserved: u32, + } + + pub struct _cred_info { + pub ruid: ::uid_t, + pub euid: ::uid_t, + pub suid: ::uid_t, + pub rgid: ::gid_t, + pub egid: ::gid_t, + pub sgid: ::gid_t, + pub ngroups: u32, + pub grouplist: [::gid_t; 8], + } + + pub struct _client_info { + pub nd: u32, + pub pid: ::pid_t, + pub sid: ::pid_t, + pub flags: u32, + pub cred: ::_cred_info, + } + + pub struct _client_able { + pub ability: u32, + pub flags: u32, + pub range_lo: u64, + pub range_hi: u64, + } + + pub struct nto_channel_config { + pub event: ::sigevent, + pub num_pulses: ::c_uint, + pub rearm_threshold: ::c_uint, + pub options: ::c_uint, + reserved: [::c_uint; 3], + } + + // TODO: The following structures are defined in a header file which doesn't + // appear as part of the default headers found in a standard installation + // of Neutrino 7.1 SDP. Commented out for now. + //pub struct _asyncmsg_put_header { + // pub err: ::c_int, + // pub iov: *mut ::iov_t, + // pub parts: ::c_int, + // pub handle: ::c_uint, + // pub cb: ::Option< + // unsafe extern "C" fn( + // err: ::c_int, + // buf: *mut ::c_void, + // handle: ::c_uint, + // ) -> ::c_int>, + // pub put_hdr_flags: ::c_uint, + //} + + //pub struct _asyncmsg_connection_attr { + // pub call_back: ::Option< + // unsafe extern "C" fn( + // err: ::c_int, + // buff: *mut ::c_void, + // handle: ::c_uint, + // ) -> ::c_int>, + // pub buffer_size: ::size_t, + // pub max_num_buffer: ::c_uint, + // pub trigger_num_msg: ::c_uint, + // pub trigger_time: ::_itimer, + // reserve: ::c_uint, + //} + + //pub struct _asyncmsg_connection_descriptor { + // pub flags: ::c_uint, + // pub sendq_size: ::c_uint, + // pub sendq_head: ::c_uint, + // pub sendq_tail: ::c_uint, + // pub sendq_free: ::c_uint, + // pub err: ::c_int, + // pub ev: ::sigevent, + // pub num_curmsg: ::c_uint, + // pub ttimer: ::timer_t, + // pub block_con: ::pthread_cond_t, + // pub mu: ::pthread_mutex_t, + // reserved: ::c_uint, + // pub attr: ::_asyncmsg_connection_attr, + // pub reserves: [::c_uint; 3], + // pub sendq: [::_asyncmsg_put_header; 1], // flexarray + //} + + pub struct __c_anonymous_struct_ev { + pub event: ::sigevent, + pub coid: ::c_int, + } + + pub struct _channel_connect_attr { // union + pub ev: ::__c_anonymous_struct_ev, + } + + pub struct _sighandler_info { + pub siginfo: ::siginfo_t, + pub handler: ::Option, + pub context: *mut ::c_void, + } + + pub struct __c_anonymous_struct_time { + pub length: ::c_uint, + pub scale: ::c_uint, + } + + pub struct _idle_hook { + pub hook_size: ::c_uint, + pub cmd: ::c_uint, + pub mode: ::c_uint, + pub latency: ::c_uint, + pub next_fire: u64, + pub curr_time: u64, + pub tod_adjust: u64, + pub resp: ::c_uint, + pub time: __c_anonymous_struct_time, + pub trigger: ::sigevent, + pub intrs: *mut ::c_uint, + pub block_stack_size: ::c_uint, + } + + pub struct _clockadjust { + pub tick_count: u32, + pub tick_nsec_inc: i32, + } + + pub struct qtime_entry { + pub cycles_per_sec: u64, + pub nsec_tod_adjust: u64, // volatile + pub nsec: u64, // volatile + pub nsec_inc: u32, + pub boot_time: u32, + pub adjust: _clockadjust, + pub timer_rate: u32, + pub timer_scale: i32, + pub timer_load: u32, + pub intr: i32, + pub epoch: u32, + pub flags: u32, + pub rr_interval_mul: u32, + pub timer_load_hi: u32, + pub nsec_stable: u64, // volatile + pub timer_load_max: u64, + pub timer_prog_time: u32, + spare: [u32; 7], + } + + pub struct _sched_info { + pub priority_min: ::c_int, + pub priority_max: ::c_int, + pub interval: u64, + pub priority_priv: ::c_int, + reserved: [::c_int; 11], + } + + pub struct _timer_info { + pub itime: ::_itimer, + pub otime: ::_itimer, + pub flags: u32, + pub tid: i32, + pub notify: i32, + pub clockid: ::clockid_t, + pub overruns: u32, + pub event: ::sigevent, // union + } + + pub struct _clockperiod { + pub nsec: u32, + pub fract: i32, + } +} + +s_no_extra_traits! { + + #[repr(align(8))] + pub struct syspage_entry { + pub size: u16, + pub total_size: u16, + pub type_: u16, + pub num_cpu: u16, + pub system_private: syspage_entry_info, + pub old_asinfo: syspage_entry_info, + pub __mangle_name_to_cause_compilation_errs_meminfo: syspage_entry_info, + pub hwinfo: syspage_entry_info, + pub old_cpuinfo: syspage_entry_info, + pub old_cacheattr: syspage_entry_info, + pub qtime: syspage_entry_info, + pub callout: syspage_entry_info, + pub callin: syspage_entry_info, + pub typed_strings: syspage_entry_info, + pub strings: syspage_entry_info, + pub old_intrinfo: syspage_entry_info, + pub smp: syspage_entry_info, + pub pminfo: syspage_entry_info, + pub old_mdriver: syspage_entry_info, + spare0: [u32; 1], + __reserved: [u8; 160], // anonymous union with architecture dependent structs + pub new_asinfo: syspage_array_info, + pub new_cpuinfo: syspage_array_info, + pub new_cacheattr: syspage_array_info, + pub new_intrinfo: syspage_array_info, + pub new_mdriver: syspage_array_info, + } +} + +pub const SYSMGR_PID: u32 = 1; +pub const SYSMGR_CHID: u32 = 1; +pub const SYSMGR_COID: u32 = _NTO_SIDE_CHANNEL; +pub const SYSMGR_HANDLE: u32 = 0; + +pub const STATE_DEAD: ::c_int = 0x00; +pub const STATE_RUNNING: ::c_int = 0x01; +pub const STATE_READY: ::c_int = 0x02; +pub const STATE_STOPPED: ::c_int = 0x03; +pub const STATE_SEND: ::c_int = 0x04; +pub const STATE_RECEIVE: ::c_int = 0x05; +pub const STATE_REPLY: ::c_int = 0x06; +pub const STATE_STACK: ::c_int = 0x07; +pub const STATE_WAITTHREAD: ::c_int = 0x08; +pub const STATE_WAITPAGE: ::c_int = 0x09; +pub const STATE_SIGSUSPEND: ::c_int = 0x0a; +pub const STATE_SIGWAITINFO: ::c_int = 0x0b; +pub const STATE_NANOSLEEP: ::c_int = 0x0c; +pub const STATE_MUTEX: ::c_int = 0x0d; +pub const STATE_CONDVAR: ::c_int = 0x0e; +pub const STATE_JOIN: ::c_int = 0x0f; +pub const STATE_INTR: ::c_int = 0x10; +pub const STATE_SEM: ::c_int = 0x11; +pub const STATE_WAITCTX: ::c_int = 0x12; +pub const STATE_NET_SEND: ::c_int = 0x13; +pub const STATE_NET_REPLY: ::c_int = 0x14; +pub const STATE_MAX: ::c_int = 0x18; + +pub const _NTO_TIMEOUT_RECEIVE: i32 = 1 << STATE_RECEIVE; +pub const _NTO_TIMEOUT_SEND: i32 = 1 << STATE_SEND; +pub const _NTO_TIMEOUT_REPLY: i32 = 1 << STATE_REPLY; +pub const _NTO_TIMEOUT_SIGSUSPEND: i32 = 1 << STATE_SIGSUSPEND; +pub const _NTO_TIMEOUT_SIGWAITINFO: i32 = 1 << STATE_SIGWAITINFO; +pub const _NTO_TIMEOUT_NANOSLEEP: i32 = 1 << STATE_NANOSLEEP; +pub const _NTO_TIMEOUT_MUTEX: i32 = 1 << STATE_MUTEX; +pub const _NTO_TIMEOUT_CONDVAR: i32 = 1 << STATE_CONDVAR; +pub const _NTO_TIMEOUT_JOIN: i32 = 1 << STATE_JOIN; +pub const _NTO_TIMEOUT_INTR: i32 = 1 << STATE_INTR; +pub const _NTO_TIMEOUT_SEM: i32 = 1 << STATE_SEM; + +pub const _NTO_MI_ENDIAN_BIG: u32 = 1; +pub const _NTO_MI_ENDIAN_DIFF: u32 = 2; +pub const _NTO_MI_UNBLOCK_REQ: u32 = 256; +pub const _NTO_MI_NET_CRED_DIRTY: u32 = 512; +pub const _NTO_MI_CONSTRAINED: u32 = 1024; +pub const _NTO_MI_CHROOT: u32 = 2048; +pub const _NTO_MI_BITS_64: u32 = 4096; +pub const _NTO_MI_BITS_DIFF: u32 = 8192; +pub const _NTO_MI_SANDBOX: u32 = 16384; + +pub const _NTO_CI_ENDIAN_BIG: u32 = 1; +pub const _NTO_CI_BKGND_PGRP: u32 = 4; +pub const _NTO_CI_ORPHAN_PGRP: u32 = 8; +pub const _NTO_CI_STOPPED: u32 = 128; +pub const _NTO_CI_UNABLE: u32 = 256; +pub const _NTO_CI_TYPE_ID: u32 = 512; +pub const _NTO_CI_CHROOT: u32 = 2048; +pub const _NTO_CI_BITS_64: u32 = 4096; +pub const _NTO_CI_SANDBOX: u32 = 16384; +pub const _NTO_CI_LOADER: u32 = 32768; +pub const _NTO_CI_FULL_GROUPS: u32 = 2147483648; + +pub const _NTO_TI_ACTIVE: u32 = 1; +pub const _NTO_TI_ABSOLUTE: u32 = 2; +pub const _NTO_TI_EXPIRED: u32 = 4; +pub const _NTO_TI_TOD_BASED: u32 = 8; +pub const _NTO_TI_TARGET_PROCESS: u32 = 16; +pub const _NTO_TI_REPORT_TOLERANCE: u32 = 32; +pub const _NTO_TI_PRECISE: u32 = 64; +pub const _NTO_TI_TOLERANT: u32 = 128; +pub const _NTO_TI_WAKEUP: u32 = 256; +pub const _NTO_TI_PROCESS_TOLERANT: u32 = 512; +pub const _NTO_TI_HIGH_RESOLUTION: u32 = 1024; + +pub const _PULSE_TYPE: u32 = 0; +pub const _PULSE_SUBTYPE: u32 = 0; +pub const _PULSE_CODE_UNBLOCK: i32 = -32; +pub const _PULSE_CODE_DISCONNECT: i32 = -33; +pub const _PULSE_CODE_THREADDEATH: i32 = -34; +pub const _PULSE_CODE_COIDDEATH: i32 = -35; +pub const _PULSE_CODE_NET_ACK: i32 = -36; +pub const _PULSE_CODE_NET_UNBLOCK: i32 = -37; +pub const _PULSE_CODE_NET_DETACH: i32 = -38; +pub const _PULSE_CODE_RESTART: i32 = -39; +pub const _PULSE_CODE_NORESTART: i32 = -40; +pub const _PULSE_CODE_UNBLOCK_RESTART: i32 = -41; +pub const _PULSE_CODE_UNBLOCK_TIMER: i32 = -42; +pub const _PULSE_CODE_MINAVAIL: u32 = 0; +pub const _PULSE_CODE_MAXAVAIL: u32 = 127; + +pub const _NTO_HARD_FLAGS_END: u32 = 1; + +pub const _NTO_PULSE_IF_UNIQUE: u32 = 4096; +pub const _NTO_PULSE_REPLACE: u32 = 8192; + +pub const _NTO_PF_NOCLDSTOP: u32 = 1; +pub const _NTO_PF_LOADING: u32 = 2; +pub const _NTO_PF_TERMING: u32 = 4; +pub const _NTO_PF_ZOMBIE: u32 = 8; +pub const _NTO_PF_NOZOMBIE: u32 = 16; +pub const _NTO_PF_FORKED: u32 = 32; +pub const _NTO_PF_ORPHAN_PGRP: u32 = 64; +pub const _NTO_PF_STOPPED: u32 = 128; +pub const _NTO_PF_DEBUG_STOPPED: u32 = 256; +pub const _NTO_PF_BKGND_PGRP: u32 = 512; +pub const _NTO_PF_NOISYNC: u32 = 1024; +pub const _NTO_PF_CONTINUED: u32 = 2048; +pub const _NTO_PF_CHECK_INTR: u32 = 4096; +pub const _NTO_PF_COREDUMP: u32 = 8192; +pub const _NTO_PF_RING0: u32 = 32768; +pub const _NTO_PF_SLEADER: u32 = 65536; +pub const _NTO_PF_WAITINFO: u32 = 131072; +pub const _NTO_PF_DESTROYALL: u32 = 524288; +pub const _NTO_PF_NOCOREDUMP: u32 = 1048576; +pub const _NTO_PF_WAITDONE: u32 = 4194304; +pub const _NTO_PF_TERM_WAITING: u32 = 8388608; +pub const _NTO_PF_ASLR: u32 = 16777216; +pub const _NTO_PF_EXECED: u32 = 33554432; +pub const _NTO_PF_APP_STOPPED: u32 = 67108864; +pub const _NTO_PF_64BIT: u32 = 134217728; +pub const _NTO_PF_NET: u32 = 268435456; +pub const _NTO_PF_NOLAZYSTACK: u32 = 536870912; +pub const _NTO_PF_NOEXEC_STACK: u32 = 1073741824; +pub const _NTO_PF_LOADER_PERMS: u32 = 2147483648; + +pub const _NTO_TF_INTR_PENDING: u32 = 65536; +pub const _NTO_TF_DETACHED: u32 = 131072; +pub const _NTO_TF_SHR_MUTEX: u32 = 262144; +pub const _NTO_TF_SHR_MUTEX_EUID: u32 = 524288; +pub const _NTO_TF_THREADS_HOLD: u32 = 1048576; +pub const _NTO_TF_UNBLOCK_REQ: u32 = 4194304; +pub const _NTO_TF_ALIGN_FAULT: u32 = 16777216; +pub const _NTO_TF_SSTEP: u32 = 33554432; +pub const _NTO_TF_ALLOCED_STACK: u32 = 67108864; +pub const _NTO_TF_NOMULTISIG: u32 = 134217728; +pub const _NTO_TF_LOW_LATENCY: u32 = 268435456; +pub const _NTO_TF_IOPRIV: u32 = 2147483648; + +pub const _NTO_TCTL_IO_PRIV: u32 = 1; +pub const _NTO_TCTL_THREADS_HOLD: u32 = 2; +pub const _NTO_TCTL_THREADS_CONT: u32 = 3; +pub const _NTO_TCTL_RUNMASK: u32 = 4; +pub const _NTO_TCTL_ALIGN_FAULT: u32 = 5; +pub const _NTO_TCTL_RUNMASK_GET_AND_SET: u32 = 6; +pub const _NTO_TCTL_PERFCOUNT: u32 = 7; +pub const _NTO_TCTL_ONE_THREAD_HOLD: u32 = 8; +pub const _NTO_TCTL_ONE_THREAD_CONT: u32 = 9; +pub const _NTO_TCTL_RUNMASK_GET_AND_SET_INHERIT: u32 = 10; +pub const _NTO_TCTL_NAME: u32 = 11; +pub const _NTO_TCTL_RCM_GET_AND_SET: u32 = 12; +pub const _NTO_TCTL_SHR_MUTEX: u32 = 13; +pub const _NTO_TCTL_IO: u32 = 14; +pub const _NTO_TCTL_NET_KIF_GET_AND_SET: u32 = 15; +pub const _NTO_TCTL_LOW_LATENCY: u32 = 16; +pub const _NTO_TCTL_ADD_EXIT_EVENT: u32 = 17; +pub const _NTO_TCTL_DEL_EXIT_EVENT: u32 = 18; +pub const _NTO_TCTL_IO_LEVEL: u32 = 19; +pub const _NTO_TCTL_RESERVED: u32 = 2147483648; +pub const _NTO_TCTL_IO_LEVEL_INHERIT: u32 = 1073741824; +pub const _NTO_IO_LEVEL_NONE: u32 = 1; +pub const _NTO_IO_LEVEL_1: u32 = 2; +pub const _NTO_IO_LEVEL_2: u32 = 3; + +pub const _NTO_THREAD_NAME_MAX: u32 = 100; + +pub const _NTO_CHF_FIXED_PRIORITY: u32 = 1; +pub const _NTO_CHF_UNBLOCK: u32 = 2; +pub const _NTO_CHF_THREAD_DEATH: u32 = 4; +pub const _NTO_CHF_DISCONNECT: u32 = 8; +pub const _NTO_CHF_NET_MSG: u32 = 16; +pub const _NTO_CHF_SENDER_LEN: u32 = 32; +pub const _NTO_CHF_COID_DISCONNECT: u32 = 64; +pub const _NTO_CHF_REPLY_LEN: u32 = 128; +pub const _NTO_CHF_PULSE_POOL: u32 = 256; +pub const _NTO_CHF_ASYNC_NONBLOCK: u32 = 512; +pub const _NTO_CHF_ASYNC: u32 = 1024; +pub const _NTO_CHF_GLOBAL: u32 = 2048; +pub const _NTO_CHF_PRIVATE: u32 = 4096; +pub const _NTO_CHF_MSG_PAUSING: u32 = 8192; +pub const _NTO_CHF_INHERIT_RUNMASK: u32 = 16384; +pub const _NTO_CHF_UNBLOCK_TIMER: u32 = 32768; + +pub const _NTO_CHO_CUSTOM_EVENT: u32 = 1; + +pub const _NTO_COF_CLOEXEC: u32 = 1; +pub const _NTO_COF_DEAD: u32 = 2; +pub const _NTO_COF_NOSHARE: u32 = 64; +pub const _NTO_COF_NETCON: u32 = 128; +pub const _NTO_COF_NONBLOCK: u32 = 256; +pub const _NTO_COF_ASYNC: u32 = 512; +pub const _NTO_COF_GLOBAL: u32 = 1024; +pub const _NTO_COF_NOEVENT: u32 = 2048; +pub const _NTO_COF_INSECURE: u32 = 4096; +pub const _NTO_COF_REG_EVENTS: u32 = 8192; +pub const _NTO_COF_UNREG_EVENTS: u32 = 16384; +pub const _NTO_COF_MASK: u32 = 65535; + +pub const _NTO_SIDE_CHANNEL: u32 = 1073741824; + +pub const _NTO_CONNECTION_SCOID: u32 = 65536; +pub const _NTO_GLOBAL_CHANNEL: u32 = 1073741824; + +pub const _NTO_TIMEOUT_MASK: u32 = (1 << STATE_MAX) - 1; +pub const _NTO_TIMEOUT_ACTIVE: u32 = 1 << STATE_MAX; +pub const _NTO_TIMEOUT_IMMEDIATE: u32 = 1 << (STATE_MAX + 1); + +pub const _NTO_IC_LATENCY: u32 = 0; + +pub const _NTO_INTR_FLAGS_END: u32 = 1; +pub const _NTO_INTR_FLAGS_NO_UNMASK: u32 = 2; +pub const _NTO_INTR_FLAGS_PROCESS: u32 = 4; +pub const _NTO_INTR_FLAGS_TRK_MSK: u32 = 8; +pub const _NTO_INTR_FLAGS_ARRAY: u32 = 16; +pub const _NTO_INTR_FLAGS_EXCLUSIVE: u32 = 32; +pub const _NTO_INTR_FLAGS_FPU: u32 = 64; + +pub const _NTO_INTR_CLASS_EXTERNAL: u32 = 0; +pub const _NTO_INTR_CLASS_SYNTHETIC: u32 = 2147418112; + +pub const _NTO_INTR_SPARE: u32 = 2147483647; + +pub const _NTO_HOOK_IDLE: u32 = 2147418113; +pub const _NTO_HOOK_OVERDRIVE: u32 = 2147418114; +pub const _NTO_HOOK_LAST: u32 = 2147418114; +pub const _NTO_HOOK_IDLE2_FLAG: u32 = 32768; + +pub const _NTO_IH_CMD_SLEEP_SETUP: u32 = 1; +pub const _NTO_IH_CMD_SLEEP_BLOCK: u32 = 2; +pub const _NTO_IH_CMD_SLEEP_WAKEUP: u32 = 4; +pub const _NTO_IH_CMD_SLEEP_ONLINE: u32 = 8; +pub const _NTO_IH_RESP_NEEDS_BLOCK: u32 = 1; +pub const _NTO_IH_RESP_NEEDS_WAKEUP: u32 = 2; +pub const _NTO_IH_RESP_NEEDS_ONLINE: u32 = 4; +pub const _NTO_IH_RESP_SYNC_TIME: u32 = 16; +pub const _NTO_IH_RESP_SYNC_TLB: u32 = 32; +pub const _NTO_IH_RESP_SUGGEST_OFFLINE: u32 = 256; +pub const _NTO_IH_RESP_SLEEP_MODE_REACHED: u32 = 512; +pub const _NTO_IH_RESP_DELIVER_INTRS: u32 = 1024; + +pub const _NTO_READIOV_SEND: u32 = 0; +pub const _NTO_READIOV_REPLY: u32 = 1; + +pub const _NTO_KEYDATA_VTID: u32 = 2147483648; + +pub const _NTO_KEYDATA_PATHSIGN: u32 = 32768; +pub const _NTO_KEYDATA_OP_MASK: u32 = 255; +pub const _NTO_KEYDATA_VERIFY: u32 = 0; +pub const _NTO_KEYDATA_CALCULATE: u32 = 1; +pub const _NTO_KEYDATA_CALCULATE_REUSE: u32 = 2; +pub const _NTO_KEYDATA_PATHSIGN_VERIFY: u32 = 32768; +pub const _NTO_KEYDATA_PATHSIGN_CALCULATE: u32 = 32769; +pub const _NTO_KEYDATA_PATHSIGN_CALCULATE_REUSE: u32 = 32770; + +pub const _NTO_SCTL_SETPRIOCEILING: u32 = 1; +pub const _NTO_SCTL_GETPRIOCEILING: u32 = 2; +pub const _NTO_SCTL_SETEVENT: u32 = 3; +pub const _NTO_SCTL_MUTEX_WAKEUP: u32 = 4; +pub const _NTO_SCTL_MUTEX_CONSISTENT: u32 = 5; +pub const _NTO_SCTL_SEM_VALUE: u32 = 6; + +pub const _NTO_CLIENTINFO_GETGROUPS: u32 = 1; +pub const _NTO_CLIENTINFO_GETTYPEID: u32 = 2; + +extern "C" { + pub fn ChannelCreate(__flags: ::c_uint) -> ::c_int; + pub fn ChannelCreate_r(__flags: ::c_uint) -> ::c_int; + pub fn ChannelCreatePulsePool( + __flags: ::c_uint, + __config: *const nto_channel_config, + ) -> ::c_int; + pub fn ChannelCreateExt( + __flags: ::c_uint, + __mode: ::mode_t, + __bufsize: usize, + __maxnumbuf: ::c_uint, + __ev: *const ::sigevent, + __cred: *mut _cred_info, + ) -> ::c_int; + pub fn ChannelDestroy(__chid: ::c_int) -> ::c_int; + pub fn ChannelDestroy_r(__chid: ::c_int) -> ::c_int; + pub fn ConnectAttach( + __nd: u32, + __pid: ::pid_t, + __chid: ::c_int, + __index: ::c_uint, + __flags: ::c_int, + ) -> ::c_int; + pub fn ConnectAttach_r( + __nd: u32, + __pid: ::pid_t, + __chid: ::c_int, + __index: ::c_uint, + __flags: ::c_int, + ) -> ::c_int; + + // TODO: The following function uses a structure defined in a header file + // which doesn't appear as part of the default headers found in a + // standard installation of Neutrino 7.1 SDP. Commented out for now. + //pub fn ConnectAttachExt( + // __nd: u32, + // __pid: ::pid_t, + // __chid: ::c_int, + // __index: ::c_uint, + // __flags: ::c_int, + // __cd: *mut _asyncmsg_connection_descriptor, + //) -> ::c_int; + pub fn ConnectDetach(__coid: ::c_int) -> ::c_int; + pub fn ConnectDetach_r(__coid: ::c_int) -> ::c_int; + pub fn ConnectServerInfo(__pid: ::pid_t, __coid: ::c_int, __info: *mut _msg_info64) -> ::c_int; + pub fn ConnectServerInfo_r( + __pid: ::pid_t, + __coid: ::c_int, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn ConnectClientInfoExtraArgs( + __scoid: ::c_int, + __info_pp: *mut _client_info, + __ngroups: ::c_int, + __abilities: *mut _client_able, + __nable: ::c_int, + __type_id: *mut ::c_uint, + ) -> ::c_int; + pub fn ConnectClientInfoExtraArgs_r( + __scoid: ::c_int, + __info_pp: *mut _client_info, + __ngroups: ::c_int, + __abilities: *mut _client_able, + __nable: ::c_int, + __type_id: *mut ::c_uint, + ) -> ::c_int; + pub fn ConnectClientInfo( + __scoid: ::c_int, + __info: *mut _client_info, + __ngroups: ::c_int, + ) -> ::c_int; + pub fn ConnectClientInfo_r( + __scoid: ::c_int, + __info: *mut _client_info, + __ngroups: ::c_int, + ) -> ::c_int; + pub fn ConnectClientInfoExt( + __scoid: ::c_int, + __info_pp: *mut *mut _client_info, + flags: ::c_int, + ) -> ::c_int; + pub fn ClientInfoExtFree(__info_pp: *mut *mut _client_info) -> ::c_int; + pub fn ConnectClientInfoAble( + __scoid: ::c_int, + __info_pp: *mut *mut _client_info, + flags: ::c_int, + abilities: *mut _client_able, + nable: ::c_int, + ) -> ::c_int; + pub fn ConnectFlags( + __pid: ::pid_t, + __coid: ::c_int, + __mask: ::c_uint, + __bits: ::c_uint, + ) -> ::c_int; + pub fn ConnectFlags_r( + __pid: ::pid_t, + __coid: ::c_int, + __mask: ::c_uint, + __bits: ::c_uint, + ) -> ::c_int; + pub fn ChannelConnectAttr( + __id: ::c_uint, + __old_attr: *mut _channel_connect_attr, + __new_attr: *mut _channel_connect_attr, + __flags: ::c_uint, + ) -> ::c_int; + pub fn MsgSend( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSend_r( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendnc( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendnc_r( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendsv( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendsv_r( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendsvnc( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendsvnc_r( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendvs( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendvs_r( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendvsnc( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendvsnc_r( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __rmsg: *mut ::c_void, + __rbytes: usize, + ) -> ::c_long; + pub fn MsgSendv( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendv_r( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendvnc( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgSendvnc_r( + __coid: ::c_int, + __siov: *const ::iovec, + __sparts: usize, + __riov: *const ::iovec, + __rparts: usize, + ) -> ::c_long; + pub fn MsgReceive( + __chid: ::c_int, + __msg: *mut ::c_void, + __bytes: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceive_r( + __chid: ::c_int, + __msg: *mut ::c_void, + __bytes: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivev( + __chid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivev_r( + __chid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivePulse( + __chid: ::c_int, + __pulse: *mut ::c_void, + __bytes: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivePulse_r( + __chid: ::c_int, + __pulse: *mut ::c_void, + __bytes: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivePulsev( + __chid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReceivePulsev_r( + __chid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __info: *mut _msg_info64, + ) -> ::c_int; + pub fn MsgReply( + __rcvid: ::c_int, + __status: ::c_long, + __msg: *const ::c_void, + __bytes: usize, + ) -> ::c_int; + pub fn MsgReply_r( + __rcvid: ::c_int, + __status: ::c_long, + __msg: *const ::c_void, + __bytes: usize, + ) -> ::c_int; + pub fn MsgReplyv( + __rcvid: ::c_int, + __status: ::c_long, + __iov: *const ::iovec, + __parts: usize, + ) -> ::c_int; + pub fn MsgReplyv_r( + __rcvid: ::c_int, + __status: ::c_long, + __iov: *const ::iovec, + __parts: usize, + ) -> ::c_int; + pub fn MsgReadiov( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + __flags: ::c_int, + ) -> isize; + pub fn MsgReadiov_r( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + __flags: ::c_int, + ) -> isize; + pub fn MsgRead( + __rcvid: ::c_int, + __msg: *mut ::c_void, + __bytes: usize, + __offset: usize, + ) -> isize; + pub fn MsgRead_r( + __rcvid: ::c_int, + __msg: *mut ::c_void, + __bytes: usize, + __offset: usize, + ) -> isize; + pub fn MsgReadv( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + ) -> isize; + pub fn MsgReadv_r( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + ) -> isize; + pub fn MsgWrite( + __rcvid: ::c_int, + __msg: *const ::c_void, + __bytes: usize, + __offset: usize, + ) -> isize; + pub fn MsgWrite_r( + __rcvid: ::c_int, + __msg: *const ::c_void, + __bytes: usize, + __offset: usize, + ) -> isize; + pub fn MsgWritev( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + ) -> isize; + pub fn MsgWritev_r( + __rcvid: ::c_int, + __iov: *const ::iovec, + __parts: usize, + __offset: usize, + ) -> isize; + pub fn MsgSendPulse( + __coid: ::c_int, + __priority: ::c_int, + __code: ::c_int, + __value: ::c_int, + ) -> ::c_int; + pub fn MsgSendPulse_r( + __coid: ::c_int, + __priority: ::c_int, + __code: ::c_int, + __value: ::c_int, + ) -> ::c_int; + pub fn MsgSendPulsePtr( + __coid: ::c_int, + __priority: ::c_int, + __code: ::c_int, + __value: *mut ::c_void, + ) -> ::c_int; + pub fn MsgSendPulsePtr_r( + __coid: ::c_int, + __priority: ::c_int, + __code: ::c_int, + __value: *mut ::c_void, + ) -> ::c_int; + pub fn MsgDeliverEvent(__rcvid: ::c_int, __event: *const ::sigevent) -> ::c_int; + pub fn MsgDeliverEvent_r(__rcvid: ::c_int, __event: *const ::sigevent) -> ::c_int; + pub fn MsgVerifyEvent(__rcvid: ::c_int, __event: *const ::sigevent) -> ::c_int; + pub fn MsgVerifyEvent_r(__rcvid: ::c_int, __event: *const ::sigevent) -> ::c_int; + pub fn MsgRegisterEvent(__event: *mut ::sigevent, __coid: ::c_int) -> ::c_int; + pub fn MsgRegisterEvent_r(__event: *mut ::sigevent, __coid: ::c_int) -> ::c_int; + pub fn MsgUnregisterEvent(__event: *const ::sigevent) -> ::c_int; + pub fn MsgUnregisterEvent_r(__event: *const ::sigevent) -> ::c_int; + pub fn MsgInfo(__rcvid: ::c_int, __info: *mut _msg_info64) -> ::c_int; + pub fn MsgInfo_r(__rcvid: ::c_int, __info: *mut _msg_info64) -> ::c_int; + pub fn MsgKeyData( + __rcvid: ::c_int, + __oper: ::c_int, + __key: u32, + __newkey: *mut u32, + __iov: *const ::iovec, + __parts: ::c_int, + ) -> ::c_int; + pub fn MsgKeyData_r( + __rcvid: ::c_int, + __oper: ::c_int, + __key: u32, + __newkey: *mut u32, + __iov: *const ::iovec, + __parts: ::c_int, + ) -> ::c_int; + pub fn MsgError(__rcvid: ::c_int, __err: ::c_int) -> ::c_int; + pub fn MsgError_r(__rcvid: ::c_int, __err: ::c_int) -> ::c_int; + pub fn MsgCurrent(__rcvid: ::c_int) -> ::c_int; + pub fn MsgCurrent_r(__rcvid: ::c_int) -> ::c_int; + pub fn MsgSendAsyncGbl( + __coid: ::c_int, + __smsg: *const ::c_void, + __sbytes: usize, + __msg_prio: ::c_uint, + ) -> ::c_int; + pub fn MsgSendAsync(__coid: ::c_int) -> ::c_int; + pub fn MsgReceiveAsyncGbl( + __chid: ::c_int, + __rmsg: *mut ::c_void, + __rbytes: usize, + __info: *mut _msg_info64, + __coid: ::c_int, + ) -> ::c_int; + pub fn MsgReceiveAsync(__chid: ::c_int, __iov: *const ::iovec, __parts: ::c_uint) -> ::c_int; + pub fn MsgPause(__rcvid: ::c_int, __cookie: ::c_uint) -> ::c_int; + pub fn MsgPause_r(__rcvid: ::c_int, __cookie: ::c_uint) -> ::c_int; + + pub fn SignalKill( + __nd: u32, + __pid: ::pid_t, + __tid: ::c_int, + __signo: ::c_int, + __code: ::c_int, + __value: ::c_int, + ) -> ::c_int; + pub fn SignalKill_r( + __nd: u32, + __pid: ::pid_t, + __tid: ::c_int, + __signo: ::c_int, + __code: ::c_int, + __value: ::c_int, + ) -> ::c_int; + pub fn SignalKillSigval( + __nd: u32, + __pid: ::pid_t, + __tid: ::c_int, + __signo: ::c_int, + __code: ::c_int, + __value: *const ::sigval, + ) -> ::c_int; + pub fn SignalKillSigval_r( + __nd: u32, + __pid: ::pid_t, + __tid: ::c_int, + __signo: ::c_int, + __code: ::c_int, + __value: *const ::sigval, + ) -> ::c_int; + pub fn SignalReturn(__info: *mut _sighandler_info) -> ::c_int; + pub fn SignalFault(__sigcode: ::c_uint, __regs: *mut ::c_void, __refaddr: usize) -> ::c_int; + pub fn SignalAction( + __pid: ::pid_t, + __sigstub: unsafe extern "C" fn(), + __signo: ::c_int, + __act: *const ::sigaction, + __oact: *mut ::sigaction, + ) -> ::c_int; + pub fn SignalAction_r( + __pid: ::pid_t, + __sigstub: unsafe extern "C" fn(), + __signo: ::c_int, + __act: *const ::sigaction, + __oact: *mut ::sigaction, + ) -> ::c_int; + pub fn SignalProcmask( + __pid: ::pid_t, + __tid: ::c_int, + __how: ::c_int, + __set: *const ::sigset_t, + __oldset: *mut ::sigset_t, + ) -> ::c_int; + pub fn SignalProcmask_r( + __pid: ::pid_t, + __tid: ::c_int, + __how: ::c_int, + __set: *const ::sigset_t, + __oldset: *mut ::sigset_t, + ) -> ::c_int; + pub fn SignalSuspend(__set: *const ::sigset_t) -> ::c_int; + pub fn SignalSuspend_r(__set: *const ::sigset_t) -> ::c_int; + pub fn SignalWaitinfo(__set: *const ::sigset_t, __info: *mut ::siginfo_t) -> ::c_int; + pub fn SignalWaitinfo_r(__set: *const ::sigset_t, __info: *mut ::siginfo_t) -> ::c_int; + pub fn SignalWaitinfoMask( + __set: *const ::sigset_t, + __info: *mut ::siginfo_t, + __mask: *const ::sigset_t, + ) -> ::c_int; + pub fn SignalWaitinfoMask_r( + __set: *const ::sigset_t, + __info: *mut ::siginfo_t, + __mask: *const ::sigset_t, + ) -> ::c_int; + pub fn ThreadCreate( + __pid: ::pid_t, + __func: unsafe extern "C" fn(__arg: *mut ::c_void) -> *mut ::c_void, + __arg: *mut ::c_void, + __attr: *const ::_thread_attr, + ) -> ::c_int; + pub fn ThreadCreate_r( + __pid: ::pid_t, + __func: unsafe extern "C" fn(__arg: *mut ::c_void) -> *mut ::c_void, + __arg: *mut ::c_void, + __attr: *const ::_thread_attr, + ) -> ::c_int; + + pub fn ThreadDestroy(__tid: ::c_int, __priority: ::c_int, __status: *mut ::c_void) -> ::c_int; + pub fn ThreadDestroy_r(__tid: ::c_int, __priority: ::c_int, __status: *mut ::c_void) + -> ::c_int; + pub fn ThreadDetach(__tid: ::c_int) -> ::c_int; + pub fn ThreadDetach_r(__tid: ::c_int) -> ::c_int; + pub fn ThreadJoin(__tid: ::c_int, __status: *mut *mut ::c_void) -> ::c_int; + pub fn ThreadJoin_r(__tid: ::c_int, __status: *mut *mut ::c_void) -> ::c_int; + pub fn ThreadCancel(__tid: ::c_int, __canstub: unsafe extern "C" fn()) -> ::c_int; + pub fn ThreadCancel_r(__tid: ::c_int, __canstub: unsafe extern "C" fn()) -> ::c_int; + pub fn ThreadCtl(__cmd: ::c_int, __data: *mut ::c_void) -> ::c_int; + pub fn ThreadCtl_r(__cmd: ::c_int, __data: *mut ::c_void) -> ::c_int; + pub fn ThreadCtlExt( + __pid: ::pid_t, + __tid: ::c_int, + __cmd: ::c_int, + __data: *mut ::c_void, + ) -> ::c_int; + pub fn ThreadCtlExt_r( + __pid: ::pid_t, + __tid: ::c_int, + __cmd: ::c_int, + __data: *mut ::c_void, + ) -> ::c_int; + + pub fn InterruptHookTrace( + __handler: ::Option *const ::sigevent>, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptHookIdle( + __handler: ::Option, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptHookIdle2( + __handler: ::Option< + unsafe extern "C" fn(arg1: ::c_uint, arg2: *mut syspage_entry, arg3: *mut _idle_hook), + >, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptHookOverdriveEvent(__event: *const ::sigevent, __flags: ::c_uint) -> ::c_int; + pub fn InterruptAttachEvent( + __intr: ::c_int, + __event: *const ::sigevent, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptAttachEvent_r( + __intr: ::c_int, + __event: *const ::sigevent, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptAttach( + __intr: ::c_int, + __handler: ::Option< + unsafe extern "C" fn(__area: *mut ::c_void, __id: ::c_int) -> *const ::sigevent, + >, + __area: *const ::c_void, + __size: ::c_int, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptAttach_r( + __intr: ::c_int, + __handler: ::Option< + unsafe extern "C" fn(__area: *mut ::c_void, __id: ::c_int) -> *const ::sigevent, + >, + __area: *const ::c_void, + __size: ::c_int, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptAttachArray( + __intr: ::c_int, + __handler: ::Option< + unsafe extern "C" fn(__area: *mut ::c_void, __id: ::c_int) -> *const *const ::sigevent, + >, + __area: *const ::c_void, + __size: ::c_int, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptAttachArray_r( + __intr: ::c_int, + __handler: ::Option< + unsafe extern "C" fn(__area: *mut ::c_void, __id: ::c_int) -> *const *const ::sigevent, + >, + __area: *const ::c_void, + __size: ::c_int, + __flags: ::c_uint, + ) -> ::c_int; + pub fn InterruptDetach(__id: ::c_int) -> ::c_int; + pub fn InterruptDetach_r(__id: ::c_int) -> ::c_int; + pub fn InterruptWait(__flags: ::c_int, __timeout: *const u64) -> ::c_int; + pub fn InterruptWait_r(__flags: ::c_int, __timeout: *const u64) -> ::c_int; + pub fn InterruptCharacteristic( + __type: ::c_int, + __id: ::c_int, + __new: *mut ::c_uint, + __old: *mut ::c_uint, + ) -> ::c_int; + pub fn InterruptCharacteristic_r( + __type: ::c_int, + __id: ::c_int, + __new: *mut ::c_uint, + __old: *mut ::c_uint, + ) -> ::c_int; + + pub fn SchedGet(__pid: ::pid_t, __tid: ::c_int, __param: *mut ::sched_param) -> ::c_int; + pub fn SchedGet_r(__pid: ::pid_t, __tid: ::c_int, __param: *mut ::sched_param) -> ::c_int; + pub fn SchedGetCpuNum() -> ::c_uint; + pub fn SchedSet( + __pid: ::pid_t, + __tid: ::c_int, + __algorithm: ::c_int, + __param: *const ::sched_param, + ) -> ::c_int; + pub fn SchedSet_r( + __pid: ::pid_t, + __tid: ::c_int, + __algorithm: ::c_int, + __param: *const ::sched_param, + ) -> ::c_int; + pub fn SchedInfo(__pid: ::pid_t, __algorithm: ::c_int, __info: *mut ::_sched_info) -> ::c_int; + pub fn SchedInfo_r(__pid: ::pid_t, __algorithm: ::c_int, __info: *mut ::_sched_info) + -> ::c_int; + pub fn SchedYield() -> ::c_int; + pub fn SchedYield_r() -> ::c_int; + pub fn SchedCtl(__cmd: ::c_int, __data: *mut ::c_void, __length: usize) -> ::c_int; + pub fn SchedCtl_r(__cmd: ::c_int, __data: *mut ::c_void, __length: usize) -> ::c_int; + pub fn SchedJobCreate(__job: *mut nto_job_t) -> ::c_int; + pub fn SchedJobCreate_r(__job: *mut nto_job_t) -> ::c_int; + pub fn SchedJobDestroy(__job: *mut nto_job_t) -> ::c_int; + pub fn SchedJobDestroy_r(__job: *mut nto_job_t) -> ::c_int; + pub fn SchedWaypoint( + __job: *mut nto_job_t, + __new: *const i64, + __max: *const i64, + __old: *mut i64, + ) -> ::c_int; + pub fn SchedWaypoint_r( + __job: *mut nto_job_t, + __new: *const i64, + __max: *const i64, + __old: *mut i64, + ) -> ::c_int; + + pub fn TimerCreate(__id: ::clockid_t, __notify: *const ::sigevent) -> ::c_int; + pub fn TimerCreate_r(__id: ::clockid_t, __notify: *const ::sigevent) -> ::c_int; + pub fn TimerDestroy(__id: ::timer_t) -> ::c_int; + pub fn TimerDestroy_r(__id: ::timer_t) -> ::c_int; + pub fn TimerSettime( + __id: ::timer_t, + __flags: ::c_int, + __itime: *const ::_itimer, + __oitime: *mut ::_itimer, + ) -> ::c_int; + pub fn TimerSettime_r( + __id: ::timer_t, + __flags: ::c_int, + __itime: *const ::_itimer, + __oitime: *mut ::_itimer, + ) -> ::c_int; + pub fn TimerInfo( + __pid: ::pid_t, + __id: ::timer_t, + __flags: ::c_int, + __info: *mut ::_timer_info, + ) -> ::c_int; + pub fn TimerInfo_r( + __pid: ::pid_t, + __id: ::timer_t, + __flags: ::c_int, + __info: *mut ::_timer_info, + ) -> ::c_int; + pub fn TimerAlarm( + __id: ::clockid_t, + __itime: *const ::_itimer, + __otime: *mut ::_itimer, + ) -> ::c_int; + pub fn TimerAlarm_r( + __id: ::clockid_t, + __itime: *const ::_itimer, + __otime: *mut ::_itimer, + ) -> ::c_int; + pub fn TimerTimeout( + __id: ::clockid_t, + __flags: ::c_int, + __notify: *const ::sigevent, + __ntime: *const u64, + __otime: *mut u64, + ) -> ::c_int; + pub fn TimerTimeout_r( + __id: ::clockid_t, + __flags: ::c_int, + __notify: *const ::sigevent, + __ntime: *const u64, + __otime: *mut u64, + ) -> ::c_int; + + pub fn SyncTypeCreate( + __type: ::c_uint, + __sync: *mut ::sync_t, + __attr: *const ::_sync_attr, + ) -> ::c_int; + pub fn SyncTypeCreate_r( + __type: ::c_uint, + __sync: *mut ::sync_t, + __attr: *const ::_sync_attr, + ) -> ::c_int; + pub fn SyncDestroy(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncDestroy_r(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncCtl(__cmd: ::c_int, __sync: *mut ::sync_t, __data: *mut ::c_void) -> ::c_int; + pub fn SyncCtl_r(__cmd: ::c_int, __sync: *mut ::sync_t, __data: *mut ::c_void) -> ::c_int; + pub fn SyncMutexEvent(__sync: *mut ::sync_t, event: *const ::sigevent) -> ::c_int; + pub fn SyncMutexEvent_r(__sync: *mut ::sync_t, event: *const ::sigevent) -> ::c_int; + pub fn SyncMutexLock(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncMutexLock_r(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncMutexUnlock(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncMutexUnlock_r(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncMutexRevive(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncMutexRevive_r(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncCondvarWait(__sync: *mut ::sync_t, __mutex: *mut ::sync_t) -> ::c_int; + pub fn SyncCondvarWait_r(__sync: *mut ::sync_t, __mutex: *mut ::sync_t) -> ::c_int; + pub fn SyncCondvarSignal(__sync: *mut ::sync_t, __all: ::c_int) -> ::c_int; + pub fn SyncCondvarSignal_r(__sync: *mut ::sync_t, __all: ::c_int) -> ::c_int; + pub fn SyncSemPost(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncSemPost_r(__sync: *mut ::sync_t) -> ::c_int; + pub fn SyncSemWait(__sync: *mut ::sync_t, __tryto: ::c_int) -> ::c_int; + pub fn SyncSemWait_r(__sync: *mut ::sync_t, __tryto: ::c_int) -> ::c_int; + + pub fn ClockTime(__id: ::clockid_t, _new: *const u64, __old: *mut u64) -> ::c_int; + pub fn ClockTime_r(__id: ::clockid_t, _new: *const u64, __old: *mut u64) -> ::c_int; + pub fn ClockAdjust( + __id: ::clockid_t, + _new: *const ::_clockadjust, + __old: *mut ::_clockadjust, + ) -> ::c_int; + pub fn ClockAdjust_r( + __id: ::clockid_t, + _new: *const ::_clockadjust, + __old: *mut ::_clockadjust, + ) -> ::c_int; + pub fn ClockPeriod( + __id: ::clockid_t, + _new: *const ::_clockperiod, + __old: *mut ::_clockperiod, + __reserved: ::c_int, + ) -> ::c_int; + pub fn ClockPeriod_r( + __id: ::clockid_t, + _new: *const ::_clockperiod, + __old: *mut ::_clockperiod, + __reserved: ::c_int, + ) -> ::c_int; + pub fn ClockId(__pid: ::pid_t, __tid: ::c_int) -> ::c_int; + pub fn ClockId_r(__pid: ::pid_t, __tid: ::c_int) -> ::c_int; + + // + //TODO: The following commented out functions are implemented in assembly. + // We can implmement them either via a C stub or rust's inline assembly. + // + //pub fn InterruptEnable(); + //pub fn InterruptDisable(); + pub fn InterruptMask(__intr: ::c_int, __id: ::c_int) -> ::c_int; + pub fn InterruptUnmask(__intr: ::c_int, __id: ::c_int) -> ::c_int; + //pub fn InterruptLock(__spin: *mut ::intrspin); + //pub fn InterruptUnlock(__spin: *mut ::intrspin); + //pub fn InterruptStatus() -> ::c_uint; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/x86_64.rs new file mode 100644 index 0000000..3a1d230 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/nto/x86_64.rs @@ -0,0 +1,132 @@ +pub type c_char = i8; +pub type wchar_t = u32; +pub type c_long = i64; +pub type c_ulong = u64; +pub type time_t = i64; + +s! { + #[repr(align(8))] + pub struct x86_64_cpu_registers { + pub rdi: u64, + pub rsi: u64, + pub rdx: u64, + pub r10: u64, + pub r8: u64, + pub r9: u64, + pub rax: u64, + pub rbx: u64, + pub rbp: u64, + pub rcx: u64, + pub r11: u64, + pub r12: u64, + pub r13: u64, + pub r14: u64, + pub r15: u64, + pub rip: u64, + pub cs: u32, + rsvd1: u32, + pub rflags: u64, + pub rsp: u64, + pub ss: u32, + rsvd2: u32, + } + + #[repr(align(8))] + pub struct mcontext_t { + pub cpu: x86_64_cpu_registers, + #[cfg(libc_union)] + pub fpu: x86_64_fpu_registers, + #[cfg(not(libc_union))] + __reserved: [u8; 1024], + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct fsave_area_64 { + pub fpu_control_word: u32, + pub fpu_status_word: u32, + pub fpu_tag_word: u32, + pub fpu_ip: u32, + pub fpu_cs: u32, + pub fpu_op: u32, + pub fpu_ds: u32, + pub st_regs: [u8; 80], + } + + pub struct fxsave_area_64 { + pub fpu_control_word: u16, + pub fpu_status_word: u16, + pub fpu_tag_word: u16, + pub fpu_operand: u16, + pub fpu_rip: u64, + pub fpu_rdp: u64, + pub mxcsr: u32, + pub mxcsr_mask: u32, + pub st_regs: [u8; 128], + pub xmm_regs: [u8; 128], + reserved2: [u8; 224], + } + + pub struct fpu_extention_savearea_64 { + pub other: [u8; 512], + pub xstate_bv: u64, + pub xstate_undef: [u64; 7], + pub xstate_info: [u8; 224], + } +} + +s_no_extra_traits! { + #[cfg(libc_union)] + pub union x86_64_fpu_registers { + pub fsave_area: fsave_area_64, + pub fxsave_area: fxsave_area_64, + pub xsave_area: fpu_extention_savearea_64, + pub data: [u8; 1024], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + #[cfg(libc_union)] + impl Eq for x86_64_fpu_registers {} + + #[cfg(libc_union)] + impl PartialEq for x86_64_fpu_registers { + fn eq(&self, other: &x86_64_fpu_registers) -> bool { + unsafe { + self.fsave_area == other.fsave_area + || self.fxsave_area == other.fxsave_area + || self.xsave_area == other.xsave_area + } + } + } + + #[cfg(libc_union)] + impl ::fmt::Debug for x86_64_fpu_registers { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("x86_64_fpu_registers") + .field("fsave_area", &self.fsave_area) + .field("fxsave_area", &self.fxsave_area) + .field("xsave_area", &self.xsave_area) + .finish() + } + } + } + + #[cfg(libc_union)] + impl ::hash::Hash for x86_64_fpu_registers { + fn hash(&self, state: &mut H) { + unsafe { + self.fsave_area.hash(state); + self.fxsave_area.hash(state); + self.xsave_area.hash(state); + } + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/redox/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/redox/mod.rs new file mode 100644 index 0000000..5003cda --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/redox/mod.rs @@ -0,0 +1,1335 @@ +pub type c_char = i8; +pub type wchar_t = i32; + +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + pub type c_long = i32; + pub type c_ulong = u32; + } +} + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + pub type c_long = i64; + pub type c_ulong = u64; + } +} + +pub type blkcnt_t = ::c_ulong; +pub type blksize_t = ::c_long; +pub type clock_t = ::c_long; +pub type clockid_t = ::c_int; +pub type dev_t = ::c_long; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type mode_t = ::c_int; +pub type nfds_t = ::c_ulong; +pub type nlink_t = ::c_ulong; +pub type off_t = ::c_longlong; +pub type pthread_t = *mut ::c_void; +pub type pthread_attr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; +// Must be usize due to libstd/sys_common/thread_local.rs, +// should technically be *mut ::c_void +pub type pthread_key_t = usize; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; +pub type pthread_rwlockattr_t = *mut ::c_void; +pub type rlim_t = ::c_ulonglong; +pub type sa_family_t = u16; +pub type sem_t = *mut ::c_void; +pub type sigset_t = ::c_ulong; +pub type socklen_t = u32; +pub type speed_t = u32; +pub type suseconds_t = ::c_int; +pub type tcflag_t = u32; +pub type time_t = ::c_longlong; +pub type id_t = ::c_uint; +pub type pid_t = usize; +pub type uid_t = u32; +pub type gid_t = u32; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +s_no_extra_traits! { + #[repr(C)] + pub struct utsname { + pub sysname: [::c_char; UTSLENGTH], + pub nodename: [::c_char; UTSLENGTH], + pub release: [::c_char; UTSLENGTH], + pub version: [::c_char; UTSLENGTH], + pub machine: [::c_char; UTSLENGTH], + pub domainname: [::c_char; UTSLENGTH], + } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + + pub struct sockaddr_un { + pub sun_family: ::sa_family_t, + pub sun_path: [::c_char; 108] + } + + pub struct sockaddr_storage { + pub ss_family: ::sa_family_t, + __ss_padding: [ + u8; + 128 - + ::core::mem::size_of::() - + ::core::mem::size_of::() + ], + __ss_align: ::c_ulong, + } +} + +s! { + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: ::size_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut ::addrinfo, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct epoll_event { + pub events: u32, + pub u64: u64, + pub _pad: u64, + } + + pub struct fd_set { + fds_bits: [::c_ulong; ::FD_SETSIZE / ULONG_SIZE], + } + + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: ::in_addr, + pub imr_interface: ::in_addr, + } + + pub struct lconv { + pub currency_symbol: *const ::c_char, + pub decimal_point: *const ::c_char, + pub frac_digits: ::c_char, + pub grouping: *const ::c_char, + pub int_curr_symbol: *const ::c_char, + pub int_frac_digits: ::c_char, + pub mon_decimal_point: *const ::c_char, + pub mon_grouping: *const ::c_char, + pub mon_thousands_sep: *const ::c_char, + pub negative_sign: *const ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub n_sign_posn: ::c_char, + pub positive_sign: *const ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub thousands_sep: *const ::c_char, + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct sigaction { + pub sa_sigaction: ::sighandler_t, + pub sa_flags: ::c_ulong, + pub sa_restorer: ::Option, + pub sa_mask: ::sigset_t, + } + + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_errno: ::c_int, + pub si_code: ::c_int, + _pad: [::c_int; 29], + _align: [usize; 0], + } + + pub struct sockaddr { + pub sa_family: ::sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: ::sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct sockaddr_in6 { + pub sin6_family: ::sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + _pad: [::c_char; 24], + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_line: ::cc_t, + pub c_cc: [::cc_t; ::NCCS], + pub c_ispeed: ::speed_t, + pub c_ospeed: ::speed_t, + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + pub tm_gmtoff: ::c_long, + pub tm_zone: *const ::c_char, + } + + pub struct ucred { + pub pid: pid_t, + pub uid: uid_t, + pub gid: gid_t, + } +} + +pub const UTSLENGTH: usize = 65; + +// intentionally not public, only used for fd_set +cfg_if! { + if #[cfg(target_pointer_width = "32")] { + const ULONG_SIZE: usize = 32; + } else if #[cfg(target_pointer_width = "64")] { + const ULONG_SIZE: usize = 64; + } else { + // Unknown target_pointer_width + } +} + +// limits.h +pub const PATH_MAX: ::c_int = 4096; + +// fcntl.h +pub const F_GETLK: ::c_int = 5; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_ULOCK: ::c_int = 0; +pub const F_LOCK: ::c_int = 1; +pub const F_TLOCK: ::c_int = 2; +pub const F_TEST: ::c_int = 3; + +// FIXME: relibc { +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +// } + +// dlfcn.h +pub const RTLD_LAZY: ::c_int = 0x0001; +pub const RTLD_NOW: ::c_int = 0x0002; +pub const RTLD_GLOBAL: ::c_int = 0x0100; +pub const RTLD_LOCAL: ::c_int = 0x0000; + +// errno.h +pub const EPERM: ::c_int = 1; /* Operation not permitted */ +pub const ENOENT: ::c_int = 2; /* No such file or directory */ +pub const ESRCH: ::c_int = 3; /* No such process */ +pub const EINTR: ::c_int = 4; /* Interrupted system call */ +pub const EIO: ::c_int = 5; /* I/O error */ +pub const ENXIO: ::c_int = 6; /* No such device or address */ +pub const E2BIG: ::c_int = 7; /* Argument list too long */ +pub const ENOEXEC: ::c_int = 8; /* Exec format error */ +pub const EBADF: ::c_int = 9; /* Bad file number */ +pub const ECHILD: ::c_int = 10; /* No child processes */ +pub const EAGAIN: ::c_int = 11; /* Try again */ +pub const ENOMEM: ::c_int = 12; /* Out of memory */ +pub const EACCES: ::c_int = 13; /* Permission denied */ +pub const EFAULT: ::c_int = 14; /* Bad address */ +pub const ENOTBLK: ::c_int = 15; /* Block device required */ +pub const EBUSY: ::c_int = 16; /* Device or resource busy */ +pub const EEXIST: ::c_int = 17; /* File exists */ +pub const EXDEV: ::c_int = 18; /* Cross-device link */ +pub const ENODEV: ::c_int = 19; /* No such device */ +pub const ENOTDIR: ::c_int = 20; /* Not a directory */ +pub const EISDIR: ::c_int = 21; /* Is a directory */ +pub const EINVAL: ::c_int = 22; /* Invalid argument */ +pub const ENFILE: ::c_int = 23; /* File table overflow */ +pub const EMFILE: ::c_int = 24; /* Too many open files */ +pub const ENOTTY: ::c_int = 25; /* Not a typewriter */ +pub const ETXTBSY: ::c_int = 26; /* Text file busy */ +pub const EFBIG: ::c_int = 27; /* File too large */ +pub const ENOSPC: ::c_int = 28; /* No space left on device */ +pub const ESPIPE: ::c_int = 29; /* Illegal seek */ +pub const EROFS: ::c_int = 30; /* Read-only file system */ +pub const EMLINK: ::c_int = 31; /* Too many links */ +pub const EPIPE: ::c_int = 32; /* Broken pipe */ +pub const EDOM: ::c_int = 33; /* Math argument out of domain of func */ +pub const ERANGE: ::c_int = 34; /* Math result not representable */ +pub const EDEADLK: ::c_int = 35; /* Resource deadlock would occur */ +pub const ENAMETOOLONG: ::c_int = 36; /* File name too long */ +pub const ENOLCK: ::c_int = 37; /* No record locks available */ +pub const ENOSYS: ::c_int = 38; /* Function not implemented */ +pub const ENOTEMPTY: ::c_int = 39; /* Directory not empty */ +pub const ELOOP: ::c_int = 40; /* Too many symbolic links encountered */ +pub const EWOULDBLOCK: ::c_int = 41; /* Operation would block */ +pub const ENOMSG: ::c_int = 42; /* No message of desired type */ +pub const EIDRM: ::c_int = 43; /* Identifier removed */ +pub const ECHRNG: ::c_int = 44; /* Channel number out of range */ +pub const EL2NSYNC: ::c_int = 45; /* Level 2 not synchronized */ +pub const EL3HLT: ::c_int = 46; /* Level 3 halted */ +pub const EL3RST: ::c_int = 47; /* Level 3 reset */ +pub const ELNRNG: ::c_int = 48; /* Link number out of range */ +pub const EUNATCH: ::c_int = 49; /* Protocol driver not attached */ +pub const ENOCSI: ::c_int = 50; /* No CSI structure available */ +pub const EL2HLT: ::c_int = 51; /* Level 2 halted */ +pub const EBADE: ::c_int = 52; /* Invalid exchange */ +pub const EBADR: ::c_int = 53; /* Invalid request descriptor */ +pub const EXFULL: ::c_int = 54; /* Exchange full */ +pub const ENOANO: ::c_int = 55; /* No anode */ +pub const EBADRQC: ::c_int = 56; /* Invalid request code */ +pub const EBADSLT: ::c_int = 57; /* Invalid slot */ +pub const EDEADLOCK: ::c_int = 58; /* Resource deadlock would occur */ +pub const EBFONT: ::c_int = 59; /* Bad font file format */ +pub const ENOSTR: ::c_int = 60; /* Device not a stream */ +pub const ENODATA: ::c_int = 61; /* No data available */ +pub const ETIME: ::c_int = 62; /* Timer expired */ +pub const ENOSR: ::c_int = 63; /* Out of streams resources */ +pub const ENONET: ::c_int = 64; /* Machine is not on the network */ +pub const ENOPKG: ::c_int = 65; /* Package not installed */ +pub const EREMOTE: ::c_int = 66; /* Object is remote */ +pub const ENOLINK: ::c_int = 67; /* Link has been severed */ +pub const EADV: ::c_int = 68; /* Advertise error */ +pub const ESRMNT: ::c_int = 69; /* Srmount error */ +pub const ECOMM: ::c_int = 70; /* Communication error on send */ +pub const EPROTO: ::c_int = 71; /* Protocol error */ +pub const EMULTIHOP: ::c_int = 72; /* Multihop attempted */ +pub const EDOTDOT: ::c_int = 73; /* RFS specific error */ +pub const EBADMSG: ::c_int = 74; /* Not a data message */ +pub const EOVERFLOW: ::c_int = 75; /* Value too large for defined data type */ +pub const ENOTUNIQ: ::c_int = 76; /* Name not unique on network */ +pub const EBADFD: ::c_int = 77; /* File descriptor in bad state */ +pub const EREMCHG: ::c_int = 78; /* Remote address changed */ +pub const ELIBACC: ::c_int = 79; /* Can not access a needed shared library */ +pub const ELIBBAD: ::c_int = 80; /* Accessing a corrupted shared library */ +pub const ELIBSCN: ::c_int = 81; /* .lib section in a.out corrupted */ +/* Attempting to link in too many shared libraries */ +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; /* Cannot exec a shared library directly */ +pub const EILSEQ: ::c_int = 84; /* Illegal byte sequence */ +/* Interrupted system call should be restarted */ +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; /* Streams pipe error */ +pub const EUSERS: ::c_int = 87; /* Too many users */ +pub const ENOTSOCK: ::c_int = 88; /* Socket operation on non-socket */ +pub const EDESTADDRREQ: ::c_int = 89; /* Destination address required */ +pub const EMSGSIZE: ::c_int = 90; /* Message too long */ +pub const EPROTOTYPE: ::c_int = 91; /* Protocol wrong type for socket */ +pub const ENOPROTOOPT: ::c_int = 92; /* Protocol not available */ +pub const EPROTONOSUPPORT: ::c_int = 93; /* Protocol not supported */ +pub const ESOCKTNOSUPPORT: ::c_int = 94; /* Socket type not supported */ +/* Operation not supported on transport endpoint */ +pub const EOPNOTSUPP: ::c_int = 95; +pub const ENOTSUP: ::c_int = EOPNOTSUPP; +pub const EPFNOSUPPORT: ::c_int = 96; /* Protocol family not supported */ +/* Address family not supported by protocol */ +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; /* Address already in use */ +pub const EADDRNOTAVAIL: ::c_int = 99; /* Cannot assign requested address */ +pub const ENETDOWN: ::c_int = 100; /* Network is down */ +pub const ENETUNREACH: ::c_int = 101; /* Network is unreachable */ +/* Network dropped connection because of reset */ +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; /* Software caused connection abort */ +pub const ECONNRESET: ::c_int = 104; /* Connection reset by peer */ +pub const ENOBUFS: ::c_int = 105; /* No buffer space available */ +pub const EISCONN: ::c_int = 106; /* Transport endpoint is already connected */ +pub const ENOTCONN: ::c_int = 107; /* Transport endpoint is not connected */ +/* Cannot send after transport endpoint shutdown */ +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; /* Too many references: cannot splice */ +pub const ETIMEDOUT: ::c_int = 110; /* Connection timed out */ +pub const ECONNREFUSED: ::c_int = 111; /* Connection refused */ +pub const EHOSTDOWN: ::c_int = 112; /* Host is down */ +pub const EHOSTUNREACH: ::c_int = 113; /* No route to host */ +pub const EALREADY: ::c_int = 114; /* Operation already in progress */ +pub const EINPROGRESS: ::c_int = 115; /* Operation now in progress */ +pub const ESTALE: ::c_int = 116; /* Stale NFS file handle */ +pub const EUCLEAN: ::c_int = 117; /* Structure needs cleaning */ +pub const ENOTNAM: ::c_int = 118; /* Not a XENIX named type file */ +pub const ENAVAIL: ::c_int = 119; /* No XENIX semaphores available */ +pub const EISNAM: ::c_int = 120; /* Is a named type file */ +pub const EREMOTEIO: ::c_int = 121; /* Remote I/O error */ +pub const EDQUOT: ::c_int = 122; /* Quota exceeded */ +pub const ENOMEDIUM: ::c_int = 123; /* No medium found */ +pub const EMEDIUMTYPE: ::c_int = 124; /* Wrong medium type */ +pub const ECANCELED: ::c_int = 125; /* Operation Canceled */ +pub const ENOKEY: ::c_int = 126; /* Required key not available */ +pub const EKEYEXPIRED: ::c_int = 127; /* Key has expired */ +pub const EKEYREVOKED: ::c_int = 128; /* Key has been revoked */ +pub const EKEYREJECTED: ::c_int = 129; /* Key was rejected by service */ +pub const EOWNERDEAD: ::c_int = 130; /* Owner died */ +pub const ENOTRECOVERABLE: ::c_int = 131; /* State not recoverable */ + +// fcntl.h +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +// FIXME: relibc { +pub const F_DUPFD_CLOEXEC: ::c_int = ::F_DUPFD; +// } +pub const FD_CLOEXEC: ::c_int = 0x0100_0000; +pub const O_RDONLY: ::c_int = 0x0001_0000; +pub const O_WRONLY: ::c_int = 0x0002_0000; +pub const O_RDWR: ::c_int = 0x0003_0000; +pub const O_ACCMODE: ::c_int = 0x0003_0000; +pub const O_NONBLOCK: ::c_int = 0x0004_0000; +pub const O_APPEND: ::c_int = 0x0008_0000; +pub const O_SHLOCK: ::c_int = 0x0010_0000; +pub const O_EXLOCK: ::c_int = 0x0020_0000; +pub const O_ASYNC: ::c_int = 0x0040_0000; +pub const O_FSYNC: ::c_int = 0x0080_0000; +pub const O_CLOEXEC: ::c_int = 0x0100_0000; +pub const O_CREAT: ::c_int = 0x0200_0000; +pub const O_TRUNC: ::c_int = 0x0400_0000; +pub const O_EXCL: ::c_int = 0x0800_0000; +pub const O_DIRECTORY: ::c_int = 0x1000_0000; +pub const O_PATH: ::c_int = 0x2000_0000; +pub const O_SYMLINK: ::c_int = 0x4000_0000; +// Negative to allow it to be used as int +// FIXME: Fix negative values missing from includes +pub const O_NOFOLLOW: ::c_int = -0x8000_0000; + +// locale.h +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MESSAGES: ::c_int = 3; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_NUMERIC: ::c_int = 5; +pub const LC_TIME: ::c_int = 6; + +// netdb.h +pub const AI_PASSIVE: ::c_int = 0x0001; +pub const AI_CANONNAME: ::c_int = 0x0002; +pub const AI_NUMERICHOST: ::c_int = 0x0004; +pub const AI_V4MAPPED: ::c_int = 0x0008; +pub const AI_ALL: ::c_int = 0x0010; +pub const AI_ADDRCONFIG: ::c_int = 0x0020; +pub const AI_NUMERICSERV: ::c_int = 0x0400; +pub const EAI_BADFLAGS: ::c_int = -1; +pub const EAI_NONAME: ::c_int = -2; +pub const EAI_AGAIN: ::c_int = -3; +pub const EAI_FAIL: ::c_int = -4; +pub const EAI_NODATA: ::c_int = -5; +pub const EAI_FAMILY: ::c_int = -6; +pub const EAI_SOCKTYPE: ::c_int = -7; +pub const EAI_SERVICE: ::c_int = -8; +pub const EAI_ADDRFAMILY: ::c_int = -9; +pub const EAI_MEMORY: ::c_int = -10; +pub const EAI_SYSTEM: ::c_int = -11; +pub const EAI_OVERFLOW: ::c_int = -12; +pub const NI_MAXHOST: ::c_int = 1025; +pub const NI_MAXSERV: ::c_int = 32; +pub const NI_NUMERICHOST: ::c_int = 0x0001; +pub const NI_NUMERICSERV: ::c_int = 0x0002; +pub const NI_NOFQDN: ::c_int = 0x0004; +pub const NI_NAMEREQD: ::c_int = 0x0008; +pub const NI_DGRAM: ::c_int = 0x0010; + +// netinet/in.h +// FIXME: relibc { +pub const IP_TTL: ::c_int = 2; +pub const IPV6_UNICAST_HOPS: ::c_int = 16; +pub const IPV6_MULTICAST_IF: ::c_int = 17; +pub const IPV6_MULTICAST_HOPS: ::c_int = 18; +pub const IPV6_MULTICAST_LOOP: ::c_int = 19; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; +pub const IPV6_V6ONLY: ::c_int = 26; +pub const IP_MULTICAST_IF: ::c_int = 32; +pub const IP_MULTICAST_TTL: ::c_int = 33; +pub const IP_MULTICAST_LOOP: ::c_int = 34; +pub const IP_ADD_MEMBERSHIP: ::c_int = 35; +pub const IP_DROP_MEMBERSHIP: ::c_int = 36; +pub const IPPROTO_RAW: ::c_int = 255; +// } + +// netinet/tcp.h +pub const TCP_NODELAY: ::c_int = 1; +// FIXME: relibc { +pub const TCP_KEEPIDLE: ::c_int = 1; +// } + +// poll.h +pub const POLLIN: ::c_short = 0x001; +pub const POLLPRI: ::c_short = 0x002; +pub const POLLOUT: ::c_short = 0x004; +pub const POLLERR: ::c_short = 0x008; +pub const POLLHUP: ::c_short = 0x010; +pub const POLLNVAL: ::c_short = 0x020; +pub const POLLRDNORM: ::c_short = 0x040; +pub const POLLRDBAND: ::c_short = 0x080; +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +// pthread.h +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_MUTEX_INITIALIZER: ::pthread_mutex_t = -1isize as *mut _; +pub const PTHREAD_COND_INITIALIZER: ::pthread_cond_t = -1isize as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: ::pthread_rwlock_t = -1isize as *mut _; +pub const PTHREAD_STACK_MIN: ::size_t = 4096; + +// signal.h +pub const SIG_BLOCK: ::c_int = 0; +pub const SIG_UNBLOCK: ::c_int = 1; +pub const SIG_SETMASK: ::c_int = 2; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGTRAP: ::c_int = 5; +pub const SIGABRT: ::c_int = 6; +pub const SIGBUS: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGUSR1: ::c_int = 10; +pub const SIGSEGV: ::c_int = 11; +pub const SIGUSR2: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGSTKFLT: ::c_int = 16; +pub const SIGCHLD: ::c_int = 17; +pub const SIGCONT: ::c_int = 18; +pub const SIGSTOP: ::c_int = 19; +pub const SIGTSTP: ::c_int = 20; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; +pub const SIGURG: ::c_int = 23; +pub const SIGXCPU: ::c_int = 24; +pub const SIGXFSZ: ::c_int = 25; +pub const SIGVTALRM: ::c_int = 26; +pub const SIGPROF: ::c_int = 27; +pub const SIGWINCH: ::c_int = 28; +pub const SIGIO: ::c_int = 29; +pub const SIGPWR: ::c_int = 30; +pub const SIGSYS: ::c_int = 31; +pub const NSIG: ::c_int = 32; + +pub const SA_NOCLDSTOP: ::c_ulong = 0x00000001; +pub const SA_NOCLDWAIT: ::c_ulong = 0x00000002; +pub const SA_SIGINFO: ::c_ulong = 0x00000004; +pub const SA_RESTORER: ::c_ulong = 0x04000000; +pub const SA_ONSTACK: ::c_ulong = 0x08000000; +pub const SA_RESTART: ::c_ulong = 0x10000000; +pub const SA_NODEFER: ::c_ulong = 0x40000000; +pub const SA_RESETHAND: ::c_ulong = 0x80000000; + +// sys/file.h +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +// sys/epoll.h +pub const EPOLL_CLOEXEC: ::c_int = 0x0100_0000; +pub const EPOLL_CTL_ADD: ::c_int = 1; +pub const EPOLL_CTL_DEL: ::c_int = 2; +pub const EPOLL_CTL_MOD: ::c_int = 3; +pub const EPOLLIN: ::c_int = 1; +pub const EPOLLPRI: ::c_int = 0; +pub const EPOLLOUT: ::c_int = 2; +pub const EPOLLRDNORM: ::c_int = 0; +pub const EPOLLNVAL: ::c_int = 0; +pub const EPOLLRDBAND: ::c_int = 0; +pub const EPOLLWRNORM: ::c_int = 0; +pub const EPOLLWRBAND: ::c_int = 0; +pub const EPOLLMSG: ::c_int = 0; +pub const EPOLLERR: ::c_int = 0; +pub const EPOLLHUP: ::c_int = 0; +pub const EPOLLRDHUP: ::c_int = 0; +pub const EPOLLEXCLUSIVE: ::c_int = 0; +pub const EPOLLWAKEUP: ::c_int = 0; +pub const EPOLLONESHOT: ::c_int = 0; +pub const EPOLLET: ::c_int = 0; + +// sys/stat.h +pub const S_IFMT: ::c_int = 0o0_170_000; +pub const S_IFDIR: ::c_int = 0o040_000; +pub const S_IFCHR: ::c_int = 0o020_000; +pub const S_IFBLK: ::c_int = 0o060_000; +pub const S_IFREG: ::c_int = 0o100_000; +pub const S_IFIFO: ::c_int = 0o010_000; +pub const S_IFLNK: ::c_int = 0o120_000; +pub const S_IFSOCK: ::c_int = 0o140_000; +pub const S_IRWXU: ::c_int = 0o0_700; +pub const S_IRUSR: ::c_int = 0o0_400; +pub const S_IWUSR: ::c_int = 0o0_200; +pub const S_IXUSR: ::c_int = 0o0_100; +pub const S_IRWXG: ::c_int = 0o0_070; +pub const S_IRGRP: ::c_int = 0o0_040; +pub const S_IWGRP: ::c_int = 0o0_020; +pub const S_IXGRP: ::c_int = 0o0_010; +pub const S_IRWXO: ::c_int = 0o0_007; +pub const S_IROTH: ::c_int = 0o0_004; +pub const S_IWOTH: ::c_int = 0o0_002; +pub const S_IXOTH: ::c_int = 0o0_001; + +// stdlib.h +pub const EXIT_SUCCESS: ::c_int = 0; +pub const EXIT_FAILURE: ::c_int = 1; + +// sys/ioctl.h +// FIXME: relibc { +pub const FIONREAD: ::c_ulong = 0x541B; +pub const FIONBIO: ::c_ulong = 0x5421; +pub const FIOCLEX: ::c_ulong = 0x5451; +// } +pub const TCGETS: ::c_ulong = 0x5401; +pub const TCSETS: ::c_ulong = 0x5402; +pub const TCFLSH: ::c_ulong = 0x540B; +pub const TIOCGPGRP: ::c_ulong = 0x540F; +pub const TIOCSPGRP: ::c_ulong = 0x5410; +pub const TIOCGWINSZ: ::c_ulong = 0x5413; +pub const TIOCSWINSZ: ::c_ulong = 0x5414; + +// sys/mman.h +pub const PROT_NONE: ::c_int = 0x0000; +pub const PROT_READ: ::c_int = 0x0004; +pub const PROT_WRITE: ::c_int = 0x0002; +pub const PROT_EXEC: ::c_int = 0x0001; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; + +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_ANON: ::c_int = 0x0020; +pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_FAILED: *mut ::c_void = !0 as _; + +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; +pub const MS_SYNC: ::c_int = 0x0004; + +// sys/select.h +pub const FD_SETSIZE: usize = 1024; + +// sys/socket.h +pub const AF_INET: ::c_int = 2; +pub const AF_INET6: ::c_int = 10; +pub const AF_UNIX: ::c_int = 1; +pub const AF_UNSPEC: ::c_int = 0; +pub const PF_INET: ::c_int = 2; +pub const PF_INET6: ::c_int = 10; +pub const PF_UNIX: ::c_int = 1; +pub const PF_UNSPEC: ::c_int = 0; +pub const MSG_CTRUNC: ::c_int = 8; +pub const MSG_DONTROUTE: ::c_int = 4; +pub const MSG_EOR: ::c_int = 128; +pub const MSG_OOB: ::c_int = 1; +pub const MSG_PEEK: ::c_int = 2; +pub const MSG_TRUNC: ::c_int = 32; +pub const MSG_DONTWAIT: ::c_int = 64; +pub const MSG_WAITALL: ::c_int = 256; +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; +pub const SO_DEBUG: ::c_int = 1; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_TYPE: ::c_int = 3; +pub const SO_ERROR: ::c_int = 4; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +pub const SO_NO_CHECK: ::c_int = 11; +pub const SO_PRIORITY: ::c_int = 12; +pub const SO_LINGER: ::c_int = 13; +pub const SO_BSDCOMPAT: ::c_int = 14; +pub const SO_REUSEPORT: ::c_int = 15; +pub const SO_PASSCRED: ::c_int = 16; +pub const SO_PEERCRED: ::c_int = 17; +pub const SO_RCVLOWAT: ::c_int = 18; +pub const SO_SNDLOWAT: ::c_int = 19; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_ACCEPTCONN: ::c_int = 30; +pub const SO_PEERSEC: ::c_int = 31; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_NONBLOCK: ::c_int = 0o4_000; +pub const SOCK_CLOEXEC: ::c_int = 0o2_000_000; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOL_SOCKET: ::c_int = 1; + +// sys/termios.h +pub const VEOF: usize = 0; +pub const VEOL: usize = 1; +pub const VEOL2: usize = 2; +pub const VERASE: usize = 3; +pub const VWERASE: usize = 4; +pub const VKILL: usize = 5; +pub const VREPRINT: usize = 6; +pub const VSWTC: usize = 7; +pub const VINTR: usize = 8; +pub const VQUIT: usize = 9; +pub const VSUSP: usize = 10; +pub const VSTART: usize = 12; +pub const VSTOP: usize = 13; +pub const VLNEXT: usize = 14; +pub const VDISCARD: usize = 15; +pub const VMIN: usize = 16; +pub const VTIME: usize = 17; +pub const NCCS: usize = 32; + +pub const IGNBRK: ::tcflag_t = 0o000_001; +pub const BRKINT: ::tcflag_t = 0o000_002; +pub const IGNPAR: ::tcflag_t = 0o000_004; +pub const PARMRK: ::tcflag_t = 0o000_010; +pub const INPCK: ::tcflag_t = 0o000_020; +pub const ISTRIP: ::tcflag_t = 0o000_040; +pub const INLCR: ::tcflag_t = 0o000_100; +pub const IGNCR: ::tcflag_t = 0o000_200; +pub const ICRNL: ::tcflag_t = 0o000_400; +pub const IXON: ::tcflag_t = 0o001_000; +pub const IXOFF: ::tcflag_t = 0o002_000; + +pub const OPOST: ::tcflag_t = 0o000_001; +pub const ONLCR: ::tcflag_t = 0o000_002; +pub const OLCUC: ::tcflag_t = 0o000_004; +pub const OCRNL: ::tcflag_t = 0o000_010; +pub const ONOCR: ::tcflag_t = 0o000_020; +pub const ONLRET: ::tcflag_t = 0o000_040; +pub const OFILL: ::tcflag_t = 0o0000_100; +pub const OFDEL: ::tcflag_t = 0o0000_200; + +pub const B0: speed_t = 0o000_000; +pub const B50: speed_t = 0o000_001; +pub const B75: speed_t = 0o000_002; +pub const B110: speed_t = 0o000_003; +pub const B134: speed_t = 0o000_004; +pub const B150: speed_t = 0o000_005; +pub const B200: speed_t = 0o000_006; +pub const B300: speed_t = 0o000_007; +pub const B600: speed_t = 0o000_010; +pub const B1200: speed_t = 0o000_011; +pub const B1800: speed_t = 0o000_012; +pub const B2400: speed_t = 0o000_013; +pub const B4800: speed_t = 0o000_014; +pub const B9600: speed_t = 0o000_015; +pub const B19200: speed_t = 0o000_016; +pub const B38400: speed_t = 0o000_017; + +pub const B57600: speed_t = 0o0_020; +pub const B115200: speed_t = 0o0_021; +pub const B230400: speed_t = 0o0_022; +pub const B460800: speed_t = 0o0_023; +pub const B500000: speed_t = 0o0_024; +pub const B576000: speed_t = 0o0_025; +pub const B921600: speed_t = 0o0_026; +pub const B1000000: speed_t = 0o0_027; +pub const B1152000: speed_t = 0o0_030; +pub const B1500000: speed_t = 0o0_031; +pub const B2000000: speed_t = 0o0_032; +pub const B2500000: speed_t = 0o0_033; +pub const B3000000: speed_t = 0o0_034; +pub const B3500000: speed_t = 0o0_035; +pub const B4000000: speed_t = 0o0_036; + +pub const CSIZE: ::tcflag_t = 0o001_400; +pub const CS5: ::tcflag_t = 0o000_000; +pub const CS6: ::tcflag_t = 0o000_400; +pub const CS7: ::tcflag_t = 0o001_000; +pub const CS8: ::tcflag_t = 0o001_400; + +pub const CSTOPB: ::tcflag_t = 0o002_000; +pub const CREAD: ::tcflag_t = 0o004_000; +pub const PARENB: ::tcflag_t = 0o010_000; +pub const PARODD: ::tcflag_t = 0o020_000; +pub const HUPCL: ::tcflag_t = 0o040_000; + +pub const CLOCAL: ::tcflag_t = 0o0100000; + +pub const ISIG: ::tcflag_t = 0x0000_0080; +pub const ICANON: ::tcflag_t = 0x0000_0100; +pub const ECHO: ::tcflag_t = 0x0000_0008; +pub const ECHOE: ::tcflag_t = 0x0000_0002; +pub const ECHOK: ::tcflag_t = 0x0000_0004; +pub const ECHONL: ::tcflag_t = 0x0000_0010; +pub const NOFLSH: ::tcflag_t = 0x8000_0000; +pub const TOSTOP: ::tcflag_t = 0x0040_0000; +pub const IEXTEN: ::tcflag_t = 0x0000_0400; + +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; + +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; + +pub const TCSANOW: ::c_int = 0; +pub const TCSADRAIN: ::c_int = 1; +pub const TCSAFLUSH: ::c_int = 2; + +// sys/wait.h +pub const WNOHANG: ::c_int = 1; +pub const WUNTRACED: ::c_int = 2; + +pub const WSTOPPED: ::c_int = 2; +pub const WEXITED: ::c_int = 4; +pub const WCONTINUED: ::c_int = 8; +pub const WNOWAIT: ::c_int = 0x0100_0000; + +pub const __WNOTHREAD: ::c_int = 0x2000_0000; +pub const __WALL: ::c_int = 0x4000_0000; +#[allow(overflowing_literals)] +pub const __WCLONE: ::c_int = 0x8000_0000; + +// time.h +pub const CLOCK_REALTIME: ::c_int = 1; +pub const CLOCK_MONOTONIC: ::c_int = 4; +pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; +pub const CLOCKS_PER_SEC: ::clock_t = 1_000_000; + +// unistd.h +// POSIX.1 { +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_STREAM_MAX: ::c_int = 5; +pub const _SC_TZNAME_MAX: ::c_int = 6; +// ... +pub const _SC_VERSION: ::c_int = 29; +pub const _SC_PAGESIZE: ::c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = 30; +// ... +pub const _SC_RE_DUP_MAX: ::c_int = 44; +// ... +pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; +pub const _SC_TTY_NAME_MAX: ::c_int = 72; +// ... +pub const _SC_SYMLOOP_MAX: ::c_int = 173; +// ... +pub const _SC_HOST_NAME_MAX: ::c_int = 180; +// } POSIX.1 + +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; + +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const _PC_LINK_MAX: ::c_int = 0; +pub const _PC_MAX_CANON: ::c_int = 1; +pub const _PC_MAX_INPUT: ::c_int = 2; +pub const _PC_NAME_MAX: ::c_int = 3; +pub const _PC_PATH_MAX: ::c_int = 4; +pub const _PC_PIPE_BUF: ::c_int = 5; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_SYNC_IO: ::c_int = 9; +pub const _PC_ASYNC_IO: ::c_int = 10; +pub const _PC_PRIO_IO: ::c_int = 11; +pub const _PC_SOCK_MAXBUF: ::c_int = 12; +pub const _PC_FILESIZEBITS: ::c_int = 13; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18; +pub const _PC_SYMLINK_MAX: ::c_int = 19; +pub const _PC_2_SYMLINKS: ::c_int = 20; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +// wait.h +f! { + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] &= !(1 << (fd % size)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + (*set).fds_bits[fd / size] |= 1 << (fd % size); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +safe_f! { + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xff) == 0x7f + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + status == 0xffff + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0x7f) + 1) as i8 >= 2 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0x7f) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } +} + +extern "C" { + // errno.h + pub fn __errno_location() -> *mut ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + // unistd.h + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + + // grp.h + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn getgrouplist( + user: *const ::c_char, + group: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + + // malloc.h + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + + // netdb.h + pub fn getnameinfo( + addr: *const ::sockaddr, + addrlen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + servlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + + // pthread.h + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn pthread_create( + tid: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + start: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + arg: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + + // pwd.h + pub fn getpwent() -> *mut passwd; + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + + // signal.h + pub fn pthread_sigmask( + how: ::c_int, + set: *const ::sigset_t, + oldset: *mut ::sigset_t, + ) -> ::c_int; + pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sigtimedwait( + set: *const sigset_t, + sig: *mut siginfo_t, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + + // stdlib.h + pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void; + + // string.h + pub fn strlcat(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t; + pub fn strlcpy(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t; + + // sys/epoll.h + pub fn epoll_create(size: ::c_int) -> ::c_int; + pub fn epoll_create1(flags: ::c_int) -> ::c_int; + pub fn epoll_wait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + ) -> ::c_int; + pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) + -> ::c_int; + + // sys/ioctl.h + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; + + // sys/mman.h + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + // sys/resource.h + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + + // sys/socket.h + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + + // sys/stat.h + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + + // sys/uio.h + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + // sys/utsname.h + pub fn uname(utsname: *mut utsname) -> ::c_int; + + // time.h + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + + // strings.h + pub fn explicit_bzero(p: *mut ::c_void, len: ::size_t); + + pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int; + + pub fn getsubopt( + optionp: *mut *mut c_char, + tokens: *const *mut c_char, + valuep: *mut *mut c_char, + ) -> ::c_int; +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for dirent {} + + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for sockaddr_un {} + + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_family == other.ss_family + && self.__ss_align == self.__ss_align + && self + .__ss_padding + .iter() + .zip(other.__ss_padding.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for sockaddr_storage {} + + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_family", &self.ss_family) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_padding", &self.__ss_padding) + .finish() + } + } + + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_family.hash(state); + self.__ss_padding.hash(state); + self.__ss_align.hash(state); + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a, b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a, b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a, b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a, b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a, b)| a == b) + && self + .domainname + .iter() + .zip(other.domainname.iter()) + .all(|(a, b)| a == b) + } + } + + impl Eq for utsname {} + + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + // FIXME: .field("domainname", &self.domainname) + .finish() + } + } + + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + self.domainname.hash(state); + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/compat.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/compat.rs new file mode 100644 index 0000000..cbf955a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/compat.rs @@ -0,0 +1,220 @@ +// Common functions that are unfortunately missing on illumos and +// Solaris, but often needed by other crates. + +use core::cmp::min; +use unix::solarish::*; + +const PTEM: &[u8] = b"ptem\0"; +const LDTERM: &[u8] = b"ldterm\0"; + +pub unsafe fn cfmakeraw(termios: *mut ::termios) { + (*termios).c_iflag &= + !(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); + (*termios).c_oflag &= !OPOST; + (*termios).c_lflag &= !(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + (*termios).c_cflag &= !(CSIZE | PARENB); + (*termios).c_cflag |= CS8; + + // By default, most software expects a pending read to block until at + // least one byte becomes available. As per termio(7I), this requires + // setting the MIN and TIME parameters appropriately. + // + // As a somewhat unfortunate artefact of history, the MIN and TIME slots + // in the control character array overlap with the EOF and EOL slots used + // for canonical mode processing. Because the EOF character needs to be + // the ASCII EOT value (aka Control-D), it has the byte value 4. When + // switching to raw mode, this is interpreted as a MIN value of 4; i.e., + // reads will block until at least four bytes have been input. + // + // Other platforms with a distinct MIN slot like Linux and FreeBSD appear + // to default to a MIN value of 1, so we'll force that value here: + (*termios).c_cc[VMIN] = 1; + (*termios).c_cc[VTIME] = 0; +} + +pub unsafe fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int { + // Neither of these functions on illumos or Solaris actually ever + // return an error + ::cfsetispeed(termios, speed); + ::cfsetospeed(termios, speed); + 0 +} + +unsafe fn bail(fdm: ::c_int, fds: ::c_int) -> ::c_int { + let e = *___errno(); + if fds >= 0 { + ::close(fds); + } + if fdm >= 0 { + ::close(fdm); + } + *___errno() = e; + return -1; +} + +pub unsafe fn openpty( + amain: *mut ::c_int, + asubord: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, +) -> ::c_int { + // Open the main pseudo-terminal device, making sure not to set it as the + // controlling terminal for this process: + let fdm = ::posix_openpt(O_RDWR | O_NOCTTY); + if fdm < 0 { + return -1; + } + + // Set permissions and ownership on the subordinate device and unlock it: + if ::grantpt(fdm) < 0 || ::unlockpt(fdm) < 0 { + return bail(fdm, -1); + } + + // Get the path name of the subordinate device: + let subordpath = ::ptsname(fdm); + if subordpath.is_null() { + return bail(fdm, -1); + } + + // Open the subordinate device without setting it as the controlling + // terminal for this process: + let fds = ::open(subordpath, O_RDWR | O_NOCTTY); + if fds < 0 { + return bail(fdm, -1); + } + + // Check if the STREAMS modules are already pushed: + let setup = ::ioctl(fds, I_FIND, LDTERM.as_ptr()); + if setup < 0 { + return bail(fdm, fds); + } else if setup == 0 { + // The line discipline is not present, so push the appropriate STREAMS + // modules for the subordinate device: + if ::ioctl(fds, I_PUSH, PTEM.as_ptr()) < 0 || ::ioctl(fds, I_PUSH, LDTERM.as_ptr()) < 0 { + return bail(fdm, fds); + } + } + + // If provided, set the terminal parameters: + if !termp.is_null() && ::tcsetattr(fds, TCSAFLUSH, termp) != 0 { + return bail(fdm, fds); + } + + // If provided, set the window size: + if !winp.is_null() && ::ioctl(fds, TIOCSWINSZ, winp) < 0 { + return bail(fdm, fds); + } + + // If the caller wants the name of the subordinate device, copy it out. + // + // Note that this is a terrible interface: there appears to be no standard + // upper bound on the copy length for this pointer. Nobody should pass + // anything but NULL here, preferring instead to use ptsname(3C) directly. + if !name.is_null() { + ::strcpy(name, subordpath); + } + + *amain = fdm; + *asubord = fds; + 0 +} + +pub unsafe fn forkpty( + amain: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, +) -> ::pid_t { + let mut fds = -1; + + if openpty(amain, &mut fds, name, termp, winp) != 0 { + return -1; + } + + let pid = ::fork(); + if pid < 0 { + return bail(*amain, fds); + } else if pid > 0 { + // In the parent process, we close the subordinate device and return the + // process ID of the new child: + ::close(fds); + return pid; + } + + // The rest of this function executes in the child process. + + // Close the main side of the pseudo-terminal pair: + ::close(*amain); + + // Use TIOCSCTTY to set the subordinate device as our controlling + // terminal. This will fail (with ENOTTY) if we are not the leader in + // our own session, so we call setsid() first. Finally, arrange for + // the pseudo-terminal to occupy the standard I/O descriptors. + if ::setsid() < 0 + || ::ioctl(fds, TIOCSCTTY, 0) < 0 + || ::dup2(fds, 0) < 0 + || ::dup2(fds, 1) < 0 + || ::dup2(fds, 2) < 0 + { + // At this stage there are no particularly good ways to handle failure. + // Exit as abruptly as possible, using _exit() to avoid messing with any + // state still shared with the parent process. + ::_exit(EXIT_FAILURE); + } + // Close the inherited descriptor, taking care to avoid closing the standard + // descriptors by mistake: + if fds > 2 { + ::close(fds); + } + + 0 +} + +pub unsafe fn getpwent_r( + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, +) -> ::c_int { + let old_errno = *::___errno(); + *::___errno() = 0; + *result = native_getpwent_r( + pwd, + buf, + min(buflen, ::c_int::max_value() as ::size_t) as ::c_int, + ); + + let ret = if (*result).is_null() { + *::___errno() + } else { + 0 + }; + *::___errno() = old_errno; + + ret +} + +pub unsafe fn getgrent_r( + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, +) -> ::c_int { + let old_errno = *::___errno(); + *::___errno() = 0; + *result = native_getgrent_r( + grp, + buf, + min(buflen, ::c_int::max_value() as ::size_t) as ::c_int, + ); + + let ret = if (*result).is_null() { + *::___errno() + } else { + 0 + }; + *::___errno() = old_errno; + + ret +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/illumos.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/illumos.rs new file mode 100644 index 0000000..404f013 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/illumos.rs @@ -0,0 +1,88 @@ +s! { + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_amp: *mut ::c_void, + pub shm_lkcnt: ::c_ushort, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_cnattch: ::c_ulong, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_pad4: [i64; 4], + } + + pub struct fil_info { + pub fi_flags: ::c_int, + pub fi_pos: ::c_int, + pub fi_name: [::c_char; ::FILNAME_MAX as usize], + } +} + +pub const AF_LOCAL: ::c_int = 1; // AF_UNIX +pub const AF_FILE: ::c_int = 1; // AF_UNIX + +pub const EFD_SEMAPHORE: ::c_int = 0x1; +pub const EFD_NONBLOCK: ::c_int = 0x800; +pub const EFD_CLOEXEC: ::c_int = 0x80000; + +pub const TCP_KEEPIDLE: ::c_int = 34; +pub const TCP_KEEPCNT: ::c_int = 35; +pub const TCP_KEEPINTVL: ::c_int = 36; +pub const TCP_CONGESTION: ::c_int = 37; + +// These constants are correct for 64-bit programs or 32-bit programs that are +// not using large-file mode. If Rust ever supports anything other than 64-bit +// compilation on illumos, this may require adjustment: +pub const F_OFD_GETLK: ::c_int = 47; +pub const F_OFD_SETLK: ::c_int = 48; +pub const F_OFD_SETLKW: ::c_int = 49; +pub const F_FLOCK: ::c_int = 53; +pub const F_FLOCKW: ::c_int = 54; + +pub const F_DUPFD_CLOEXEC: ::c_int = 37; +pub const F_DUP2FD_CLOEXEC: ::c_int = 36; + +pub const FIL_ATTACH: ::c_int = 0x1; +pub const FIL_DETACH: ::c_int = 0x2; +pub const FIL_LIST: ::c_int = 0x3; +pub const FILNAME_MAX: ::c_int = 32; +pub const FILF_PROG: ::c_int = 0x1; +pub const FILF_AUTO: ::c_int = 0x2; +pub const FILF_BYPASS: ::c_int = 0x4; +pub const SOL_FILTER: ::c_int = 0xfffc; + +pub const MADV_PURGE: ::c_int = 9; + +pub const B1000000: ::speed_t = 24; +pub const B1152000: ::speed_t = 25; +pub const B1500000: ::speed_t = 26; +pub const B2000000: ::speed_t = 27; +pub const B2500000: ::speed_t = 28; +pub const B3000000: ::speed_t = 29; +pub const B3500000: ::speed_t = 30; +pub const B4000000: ::speed_t = 31; + +// sys/systeminfo.h +pub const SI_ADDRESS_WIDTH: ::c_int = 520; + +extern "C" { + pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; + + pub fn mincore(addr: ::caddr_t, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + + pub fn pset_bind_lwp( + pset: ::psetid_t, + id: ::id_t, + pid: ::pid_t, + opset: *mut ::psetid_t, + ) -> ::c_int; + pub fn pset_getloadavg(pset: ::psetid_t, load: *mut ::c_double, num: ::c_int) -> ::c_int; + + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn getpagesizes2(pagesize: *mut ::size_t, nelem: ::c_int) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/mod.rs new file mode 100644 index 0000000..400de8a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/mod.rs @@ -0,0 +1,3302 @@ +pub type c_char = i8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type caddr_t = *mut ::c_char; + +pub type clockid_t = ::c_int; +pub type blkcnt_t = ::c_long; +pub type clock_t = ::c_long; +pub type daddr_t = ::c_long; +pub type dev_t = ::c_ulong; +pub type fsblkcnt_t = ::c_ulong; +pub type fsfilcnt_t = ::c_ulong; +pub type ino_t = ::c_ulong; +pub type key_t = ::c_int; +pub type major_t = ::c_uint; +pub type minor_t = ::c_uint; +pub type mode_t = ::c_uint; +pub type nlink_t = ::c_uint; +pub type rlim_t = ::c_ulong; +pub type speed_t = ::c_uint; +pub type tcflag_t = ::c_uint; +pub type time_t = ::c_long; +pub type timer_t = ::c_int; +pub type wchar_t = ::c_int; +pub type nfds_t = ::c_ulong; +pub type projid_t = ::c_int; +pub type zoneid_t = ::c_int; +pub type psetid_t = ::c_int; +pub type processorid_t = ::c_int; +pub type chipid_t = ::c_int; +pub type ctid_t = ::id_t; + +pub type suseconds_t = ::c_long; +pub type off_t = ::c_long; +pub type useconds_t = ::c_uint; +pub type socklen_t = ::c_uint; +pub type sa_family_t = u16; +pub type pthread_t = ::c_uint; +pub type pthread_key_t = ::c_uint; +pub type thread_t = ::c_uint; +pub type blksize_t = ::c_int; +pub type nl_item = ::c_int; +pub type mqd_t = *mut ::c_void; +pub type id_t = ::c_int; +pub type idtype_t = ::c_uint; +pub type shmatt_t = ::c_ulong; + +pub type lgrp_rsrc_t = ::c_int; +pub type lgrp_affinity_t = ::c_int; +pub type lgrp_id_t = ::id_t; +pub type lgrp_mem_size_t = ::c_longlong; +pub type lgrp_cookie_t = ::uintptr_t; +pub type lgrp_content_t = ::c_uint; +pub type lgrp_lat_between_t = ::c_uint; +pub type lgrp_mem_size_flag_t = ::c_uint; +pub type lgrp_view_t = ::c_uint; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum ucred_t {} +impl ::Copy for ucred_t {} +impl ::Clone for ucred_t { + fn clone(&self) -> ucred_t { + *self + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ip_mreq_source { + pub imr_multiaddr: in_addr, + pub imr_sourceaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct ipc_perm { + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub seq: ::c_uint, + pub key: ::key_t, + } + + pub struct sockaddr { + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8] + } + + pub struct sockaddr_in6 { + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + pub __sin6_src_id: u32 + } + + pub struct passwd { + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_age: *mut ::c_char, + pub pw_comment: *mut ::c_char, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char + } + + pub struct ifaddrs { + pub ifa_next: *mut ifaddrs, + pub ifa_name: *mut ::c_char, + pub ifa_flags: ::c_ulong, + pub ifa_addr: *mut ::sockaddr, + pub ifa_netmask: *mut ::sockaddr, + pub ifa_dstaddr: *mut ::sockaddr, + pub ifa_data: *mut ::c_void + } + + pub struct itimerspec { + pub it_interval: ::timespec, + pub it_value: ::timespec, + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int + } + + pub struct msghdr { + pub msg_name: *mut ::c_void, + pub msg_namelen: ::socklen_t, + pub msg_iov: *mut ::iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut ::c_void, + pub msg_controllen: ::socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: ::socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + pub struct pthread_attr_t { + __pthread_attrp: *mut ::c_void + } + + pub struct pthread_mutex_t { + __pthread_mutex_flag1: u16, + __pthread_mutex_flag2: u8, + __pthread_mutex_ceiling: u8, + __pthread_mutex_type: u16, + __pthread_mutex_magic: u16, + __pthread_mutex_lock: u64, + __pthread_mutex_data: u64 + } + + pub struct pthread_mutexattr_t { + __pthread_mutexattrp: *mut ::c_void + } + + pub struct pthread_cond_t { + __pthread_cond_flag: [u8; 4], + __pthread_cond_type: u16, + __pthread_cond_magic: u16, + __pthread_cond_data: u64 + } + + pub struct pthread_condattr_t { + __pthread_condattrp: *mut ::c_void, + } + + pub struct pthread_rwlock_t { + __pthread_rwlock_readers: i32, + __pthread_rwlock_type: u16, + __pthread_rwlock_magic: u16, + __pthread_rwlock_mutex: ::pthread_mutex_t, + __pthread_rwlock_readercv: ::pthread_cond_t, + __pthread_rwlock_writercv: ::pthread_cond_t + } + + pub struct pthread_rwlockattr_t { + __pthread_rwlockattrp: *mut ::c_void, + } + + pub struct dirent { + pub d_ino: ::ino_t, + pub d_off: ::off_t, + pub d_reclen: u16, + pub d_name: [::c_char; 3] + } + + pub struct glob_t { + pub gl_pathc: ::size_t, + pub gl_pathv: *mut *mut ::c_char, + pub gl_offs: ::size_t, + __unused1: *mut ::c_void, + __unused2: ::c_int, + __unused3: ::c_int, + __unused4: ::c_int, + __unused5: *mut ::c_void, + __unused6: *mut ::c_void, + __unused7: *mut ::c_void, + __unused8: *mut ::c_void, + __unused9: *mut ::c_void, + __unused10: *mut ::c_void, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + #[cfg(target_arch = "sparc64")] + __sparcv9_pad: ::c_int, + pub ai_addrlen: ::socklen_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr: *mut ::sockaddr, + pub ai_next: *mut addrinfo, + } + + pub struct sigset_t { + bits: [u32; 4], + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_sigaction: ::sighandler_t, + pub sa_mask: sigset_t, + } + + pub struct stack_t { + pub ss_sp: *mut ::c_void, + pub ss_size: ::size_t, + pub ss_flags: ::c_int, + } + + pub struct statvfs { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_favail: ::fsfilcnt_t, + pub f_fsid: ::c_ulong, + pub f_basetype: [::c_char; 16], + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub f_fstr: [::c_char; 32] + } + + pub struct sendfilevec_t { + pub sfv_fd: ::c_int, + pub sfv_flag: ::c_uint, + pub sfv_off: ::off_t, + pub sfv_len: ::size_t, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + sched_pad: [::c_int; 8] + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __unused: [::c_char; 16] + } + + pub struct termios { + pub c_iflag: ::tcflag_t, + pub c_oflag: ::tcflag_t, + pub c_cflag: ::tcflag_t, + pub c_lflag: ::tcflag_t, + pub c_cc: [::cc_t; ::NCCS] + } + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct sem_t { + pub sem_count: u32, + pub sem_type: u16, + pub sem_magic: u16, + pub sem_pad1: [u64; 3], + pub sem_pad2: [u64; 2] + } + + pub struct flock { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off_t, + pub l_len: ::off_t, + pub l_sysid: ::c_int, + pub l_pid: ::pid_t, + pub l_pad: [::c_long; 4] + } + + pub struct if_nameindex { + pub if_index: ::c_uint, + pub if_name: *mut ::c_char, + } + + pub struct mq_attr { + pub mq_flags: ::c_long, + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_curmsgs: ::c_long, + _pad: [::c_int; 12] + } + + pub struct port_event { + pub portev_events: ::c_int, + pub portev_source: ::c_ushort, + pub portev_pad: ::c_ushort, + pub portev_object: ::uintptr_t, + pub portev_user: *mut ::c_void, + } + + pub struct port_notify { + pub portnfy_port: ::c_int, + pub portnfy_user: *mut ::c_void, + } + + pub struct exit_status { + e_termination: ::c_short, + e_exit: ::c_short, + } + + pub struct utmp { + pub ut_user: [::c_char; 8], + pub ut_id: [::c_char; 4], + pub ut_line: [::c_char; 12], + pub ut_pid: ::c_short, + pub ut_type: ::c_short, + pub ut_exit: exit_status, + pub ut_time: ::time_t, + } + + pub struct timex { + pub modes: u32, + pub offset: i32, + pub freq: i32, + pub maxerror: i32, + pub esterror: i32, + pub status: i32, + pub constant: i32, + pub precision: i32, + pub tolerance: i32, + pub ppsfreq: i32, + pub jitter: i32, + pub shift: i32, + pub stabil: i32, + pub jitcnt: i32, + pub calcnt: i32, + pub errcnt: i32, + pub stbcnt: i32, + } + + pub struct ntptimeval { + pub time: ::timeval, + pub maxerror: i32, + pub esterror: i32, + } + + pub struct mmapobj_result_t { + pub mr_addr: ::caddr_t, + pub mr_msize: ::size_t, + pub mr_fsize: ::size_t, + pub mr_offset: ::size_t, + pub mr_prot: ::c_uint, + pub mr_flags: ::c_uint, + } + + pub struct lgrp_affinity_args { + pub idtype: ::idtype_t, + pub id: ::id_t, + pub lgrp: ::lgrp_id_t, + pub aff: ::lgrp_affinity_t, + } + + pub struct processor_info_t { + pub pi_state: ::c_int, + pub pi_processor_type: [::c_char; PI_TYPELEN as usize], + pub pi_fputypes: [::c_char; PI_FPUTYPE as usize], + pub pi_clock: ::c_int, + } + + pub struct option { + pub name: *const ::c_char, + pub has_arg: ::c_int, + pub flag: *mut ::c_int, + pub val: ::c_int, + } +} + +s_no_extra_traits! { + #[cfg_attr(all( + any(target_arch = "x86", target_arch = "x86_64"), + libc_packedN + ), repr(packed(4)))] + #[cfg_attr(all( + any(target_arch = "x86", target_arch = "x86_64"), + not(libc_packedN) + ), repr(packed))] + pub struct epoll_event { + pub events: u32, + pub u64: u64, + } + + pub struct utmpx { + pub ut_user: [::c_char; _UTX_USERSIZE], + pub ut_id: [::c_char; _UTX_IDSIZE], + pub ut_line: [::c_char; _UTX_LINESIZE], + pub ut_pid: ::pid_t, + pub ut_type: ::c_short, + pub ut_exit: exit_status, + pub ut_tv: ::timeval, + pub ut_session: ::c_int, + pub ut_pad: [::c_int; _UTX_PADSIZE], + pub ut_syslen: ::c_short, + pub ut_host: [::c_char; _UTX_HOSTSIZE], + } + + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [c_char; 108] + } + + pub struct utsname { + pub sysname: [::c_char; 257], + pub nodename: [::c_char; 257], + pub release: [::c_char; 257], + pub version: [::c_char; 257], + pub machine: [::c_char; 257], + } + + pub struct fd_set { + #[cfg(target_pointer_width = "64")] + fds_bits: [i64; FD_SETSIZE / 64], + #[cfg(target_pointer_width = "32")] + fds_bits: [i32; FD_SETSIZE / 32], + } + + pub struct sockaddr_storage { + pub ss_family: ::sa_family_t, + __ss_pad1: [u8; 6], + __ss_align: i64, + __ss_pad2: [u8; 240], + } + + #[cfg_attr(all(target_pointer_width = "64", libc_align), repr(align(8)))] + pub struct siginfo_t { + pub si_signo: ::c_int, + pub si_code: ::c_int, + pub si_errno: ::c_int, + #[cfg(target_pointer_width = "64")] + pub si_pad: ::c_int, + + __data_pad: [::c_int; SIGINFO_DATA_SIZE], + } + + pub struct sockaddr_dl { + pub sdl_family: ::c_ushort, + pub sdl_index: ::c_ushort, + pub sdl_type: ::c_uchar, + pub sdl_nlen: ::c_uchar, + pub sdl_alen: ::c_uchar, + pub sdl_slen: ::c_uchar, + pub sdl_data: [::c_char; 244], + } + + pub struct sigevent { + pub sigev_notify: ::c_int, + pub sigev_signo: ::c_int, + pub sigev_value: ::sigval, + pub ss_sp: *mut ::c_void, + pub sigev_notify_attributes: *const ::pthread_attr_t, + __sigev_pad2: ::c_int, + } + + #[cfg(libc_union)] + #[cfg_attr(libc_align, repr(align(16)))] + pub union pad128_t { + // pub _q in this structure would be a "long double", of 16 bytes + pub _l: [i32; 4], + } + + #[cfg(libc_union)] + #[cfg_attr(libc_align, repr(align(16)))] + pub union upad128_t { + // pub _q in this structure would be a "long double", of 16 bytes + pub _l: [u32; 4], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for utmpx { + fn eq(&self, other: &utmpx) -> bool { + self.ut_type == other.ut_type + && self.ut_pid == other.ut_pid + && self.ut_user == other.ut_user + && self.ut_line == other.ut_line + && self.ut_id == other.ut_id + && self.ut_exit == other.ut_exit + && self.ut_session == other.ut_session + && self.ut_tv == other.ut_tv + && self.ut_syslen == other.ut_syslen + && self.ut_pad == other.ut_pad + && self + .ut_host + .iter() + .zip(other.ut_host.iter()) + .all(|(a,b)| a == b) + } + } + + impl Eq for utmpx {} + + impl ::fmt::Debug for utmpx { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utmpx") + .field("ut_user", &self.ut_user) + .field("ut_id", &self.ut_id) + .field("ut_line", &self.ut_line) + .field("ut_pid", &self.ut_pid) + .field("ut_type", &self.ut_type) + .field("ut_exit", &self.ut_exit) + .field("ut_tv", &self.ut_tv) + .field("ut_session", &self.ut_session) + .field("ut_pad", &self.ut_pad) + .field("ut_syslen", &self.ut_syslen) + .field("ut_host", &&self.ut_host[..]) + .finish() + } + } + + impl ::hash::Hash for utmpx { + fn hash(&self, state: &mut H) { + self.ut_user.hash(state); + self.ut_type.hash(state); + self.ut_pid.hash(state); + self.ut_line.hash(state); + self.ut_id.hash(state); + self.ut_host.hash(state); + self.ut_exit.hash(state); + self.ut_session.hash(state); + self.ut_tv.hash(state); + self.ut_syslen.hash(state); + self.ut_pad.hash(state); + } + } + + impl PartialEq for epoll_event { + fn eq(&self, other: &epoll_event) -> bool { + self.events == other.events + && self.u64 == other.u64 + } + } + impl Eq for epoll_event {} + impl ::fmt::Debug for epoll_event { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + let events = self.events; + let u64 = self.u64; + f.debug_struct("epoll_event") + .field("events", &events) + .field("u64", &u64) + .finish() + } + } + impl ::hash::Hash for epoll_event { + fn hash(&self, state: &mut H) { + let events = self.events; + let u64 = self.u64; + events.hash(state); + u64.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for utsname { + fn eq(&self, other: &utsname) -> bool { + self.sysname + .iter() + .zip(other.sysname.iter()) + .all(|(a, b)| a == b) + && self + .nodename + .iter() + .zip(other.nodename.iter()) + .all(|(a, b)| a == b) + && self + .release + .iter() + .zip(other.release.iter()) + .all(|(a, b)| a == b) + && self + .version + .iter() + .zip(other.version.iter()) + .all(|(a, b)| a == b) + && self + .machine + .iter() + .zip(other.machine.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for utsname {} + impl ::fmt::Debug for utsname { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("utsname") + // FIXME: .field("sysname", &self.sysname) + // FIXME: .field("nodename", &self.nodename) + // FIXME: .field("release", &self.release) + // FIXME: .field("version", &self.version) + // FIXME: .field("machine", &self.machine) + .finish() + } + } + impl ::hash::Hash for utsname { + fn hash(&self, state: &mut H) { + self.sysname.hash(state); + self.nodename.hash(state); + self.release.hash(state); + self.version.hash(state); + self.machine.hash(state); + } + } + + impl PartialEq for fd_set { + fn eq(&self, other: &fd_set) -> bool { + self.fds_bits + .iter() + .zip(other.fds_bits.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for fd_set {} + impl ::fmt::Debug for fd_set { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fd_set") + // FIXME: .field("fds_bits", &self.fds_bits) + .finish() + } + } + impl ::hash::Hash for fd_set { + fn hash(&self, state: &mut H) { + self.fds_bits.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.ss_family == other.ss_family + && self.__ss_pad1 == other.__ss_pad1 + && self.__ss_align == other.__ss_align + && self + .__ss_pad2 + .iter() + .zip(other.__ss_pad2.iter()) + .all(|(a, b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &self.__ss_pad1) + .field("__ss_align", &self.__ss_align) + // FIXME: .field("__ss_pad2", &self.__ss_pad2) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.ss_family.hash(state); + self.__ss_pad1.hash(state); + self.__ss_align.hash(state); + self.__ss_pad2.hash(state); + } + } + + impl siginfo_t { + /// The siginfo_t will have differing contents based on the delivered signal. Based on + /// `si_signo`, this determines how many of the `c_int` pad fields contain valid data + /// exposed by the C unions. + /// + /// It is not yet exhausitive for the OS-defined types, and defaults to assuming the + /// entire data pad area is "valid" for otherwise unrecognized signal numbers. + fn data_field_count(&self) -> usize { + match self.si_signo { + ::SIGSEGV | ::SIGBUS | ::SIGILL | ::SIGTRAP | ::SIGFPE => { + ::mem::size_of::() / ::mem::size_of::<::c_int>() + } + ::SIGCLD => ::mem::size_of::() / ::mem::size_of::<::c_int>(), + ::SIGHUP + | ::SIGINT + | ::SIGQUIT + | ::SIGABRT + | ::SIGSYS + | ::SIGPIPE + | ::SIGALRM + | ::SIGTERM + | ::SIGUSR1 + | ::SIGUSR2 + | ::SIGPWR + | ::SIGWINCH + | ::SIGURG => ::mem::size_of::() / ::mem::size_of::<::c_int>(), + _ => SIGINFO_DATA_SIZE, + } + } + } + impl PartialEq for siginfo_t { + fn eq(&self, other: &siginfo_t) -> bool { + if self.si_signo == other.si_signo + && self.si_code == other.si_code + && self.si_errno == other.si_errno { + // FIXME: The `si_pad` field in the 64-bit version of the struct is ignored + // (for now) when doing comparisons. + + let field_count = self.data_field_count(); + self.__data_pad[..field_count] + .iter() + .zip(other.__data_pad[..field_count].iter()) + .all(|(a, b)| a == b) + } else { + false + } + } + } + impl Eq for siginfo_t {} + impl ::fmt::Debug for siginfo_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("siginfo_t") + .field("si_signo", &self.si_signo) + .field("si_code", &self.si_code) + .field("si_errno", &self.si_errno) + // FIXME: .field("__pad", &self.__pad) + .finish() + } + } + impl ::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_code.hash(state); + self.si_errno.hash(state); + + // FIXME: The `si_pad` field in the 64-bit version of the struct is ignored + // (for now) when doing hashing. + + let field_count = self.data_field_count(); + self.__data_pad[..field_count].hash(state) + } + } + + impl PartialEq for sockaddr_dl { + fn eq(&self, other: &sockaddr_dl) -> bool { + self.sdl_family == other.sdl_family + && self.sdl_index == other.sdl_index + && self.sdl_type == other.sdl_type + && self.sdl_nlen == other.sdl_nlen + && self.sdl_alen == other.sdl_alen + && self.sdl_slen == other.sdl_slen + && self + .sdl_data + .iter() + .zip(other.sdl_data.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_dl {} + impl ::fmt::Debug for sockaddr_dl { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_dl") + .field("sdl_family", &self.sdl_family) + .field("sdl_index", &self.sdl_index) + .field("sdl_type", &self.sdl_type) + .field("sdl_nlen", &self.sdl_nlen) + .field("sdl_alen", &self.sdl_alen) + .field("sdl_slen", &self.sdl_slen) + // FIXME: .field("sdl_data", &self.sdl_data) + .finish() + } + } + impl ::hash::Hash for sockaddr_dl { + fn hash(&self, state: &mut H) { + self.sdl_family.hash(state); + self.sdl_index.hash(state); + self.sdl_type.hash(state); + self.sdl_nlen.hash(state); + self.sdl_alen.hash(state); + self.sdl_slen.hash(state); + self.sdl_data.hash(state); + } + } + + impl PartialEq for sigevent { + fn eq(&self, other: &sigevent) -> bool { + self.sigev_notify == other.sigev_notify + && self.sigev_signo == other.sigev_signo + && self.sigev_value == other.sigev_value + && self.ss_sp == other.ss_sp + && self.sigev_notify_attributes + == other.sigev_notify_attributes + } + } + impl Eq for sigevent {} + impl ::fmt::Debug for sigevent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigevent") + .field("sigev_notify", &self.sigev_notify) + .field("sigev_signo", &self.sigev_signo) + .field("sigev_value", &self.sigev_value) + .field("ss_sp", &self.ss_sp) + .field("sigev_notify_attributes", + &self.sigev_notify_attributes) + .finish() + } + } + impl ::hash::Hash for sigevent { + fn hash(&self, state: &mut H) { + self.sigev_notify.hash(state); + self.sigev_signo.hash(state); + self.sigev_value.hash(state); + self.ss_sp.hash(state); + self.sigev_notify_attributes.hash(state); + } + } + + #[cfg(libc_union)] + impl PartialEq for pad128_t { + fn eq(&self, other: &pad128_t) -> bool { + unsafe { + // FIXME: self._q == other._q || + self._l == other._l + } + } + } + #[cfg(libc_union)] + impl Eq for pad128_t {} + #[cfg(libc_union)] + impl ::fmt::Debug for pad128_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("pad128_t") + // FIXME: .field("_q", &{self._q}) + .field("_l", &{self._l}) + .finish() + } + } + } + #[cfg(libc_union)] + impl ::hash::Hash for pad128_t { + fn hash(&self, state: &mut H) { + unsafe { + // FIXME: state.write_i64(self._q as i64); + self._l.hash(state); + } + } + } + #[cfg(libc_union)] + impl PartialEq for upad128_t { + fn eq(&self, other: &upad128_t) -> bool { + unsafe { + // FIXME: self._q == other._q || + self._l == other._l + } + } + } + #[cfg(libc_union)] + impl Eq for upad128_t {} + #[cfg(libc_union)] + impl ::fmt::Debug for upad128_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("upad128_t") + // FIXME: .field("_q", &{self._q}) + .field("_l", &{self._l}) + .finish() + } + } + } + #[cfg(libc_union)] + impl ::hash::Hash for upad128_t { + fn hash(&self, state: &mut H) { + unsafe { + // FIXME: state.write_i64(self._q as i64); + self._l.hash(state); + } + } + } + } +} + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + const SIGINFO_DATA_SIZE: usize = 60; + } else { + const SIGINFO_DATA_SIZE: usize = 29; + } +} + +#[repr(C)] +struct siginfo_fault { + addr: *mut ::c_void, + trapno: ::c_int, + pc: *mut ::caddr_t, +} +impl ::Copy for siginfo_fault {} +impl ::Clone for siginfo_fault { + fn clone(&self) -> Self { + *self + } +} + +#[repr(C)] +struct siginfo_cldval { + utime: ::clock_t, + status: ::c_int, + stime: ::clock_t, +} +impl ::Copy for siginfo_cldval {} +impl ::Clone for siginfo_cldval { + fn clone(&self) -> Self { + *self + } +} + +#[repr(C)] +struct siginfo_killval { + uid: ::uid_t, + value: ::sigval, + // Pad out to match the SIGCLD value size + _pad: *mut ::c_void, +} +impl ::Copy for siginfo_killval {} +impl ::Clone for siginfo_killval { + fn clone(&self) -> Self { + *self + } +} + +#[repr(C)] +struct siginfo_sigcld { + pid: ::pid_t, + val: siginfo_cldval, + ctid: ::ctid_t, + zoneid: ::zoneid_t, +} +impl ::Copy for siginfo_sigcld {} +impl ::Clone for siginfo_sigcld { + fn clone(&self) -> Self { + *self + } +} + +#[repr(C)] +struct siginfo_kill { + pid: ::pid_t, + val: siginfo_killval, + ctid: ::ctid_t, + zoneid: ::zoneid_t, +} +impl ::Copy for siginfo_kill {} +impl ::Clone for siginfo_kill { + fn clone(&self) -> Self { + *self + } +} + +impl siginfo_t { + unsafe fn sidata(&self) -> T { + *((&self.__data_pad) as *const ::c_int as *const T) + } + pub unsafe fn si_addr(&self) -> *mut ::c_void { + let sifault: siginfo_fault = self.sidata(); + sifault.addr + } + pub unsafe fn si_uid(&self) -> ::uid_t { + let kill: siginfo_kill = self.sidata(); + kill.val.uid + } + pub unsafe fn si_value(&self) -> ::sigval { + let kill: siginfo_kill = self.sidata(); + kill.val.value + } + pub unsafe fn si_pid(&self) -> ::pid_t { + let sigcld: siginfo_sigcld = self.sidata(); + sigcld.pid + } + pub unsafe fn si_status(&self) -> ::c_int { + let sigcld: siginfo_sigcld = self.sidata(); + sigcld.val.status + } + pub unsafe fn si_utime(&self) -> ::c_long { + let sigcld: siginfo_sigcld = self.sidata(); + sigcld.val.utime + } + pub unsafe fn si_stime(&self) -> ::c_long { + let sigcld: siginfo_sigcld = self.sidata(); + sigcld.val.stime + } +} + +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 2; +pub const LC_COLLATE: ::c_int = 3; +pub const LC_MONETARY: ::c_int = 4; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +pub const LC_CTYPE_MASK: ::c_int = 1 << LC_CTYPE; +pub const LC_NUMERIC_MASK: ::c_int = 1 << LC_NUMERIC; +pub const LC_TIME_MASK: ::c_int = 1 << LC_TIME; +pub const LC_COLLATE_MASK: ::c_int = 1 << LC_COLLATE; +pub const LC_MONETARY_MASK: ::c_int = 1 << LC_MONETARY; +pub const LC_MESSAGES_MASK: ::c_int = 1 << LC_MESSAGES; +pub const LC_ALL_MASK: ::c_int = LC_CTYPE_MASK + | LC_NUMERIC_MASK + | LC_TIME_MASK + | LC_COLLATE_MASK + | LC_MONETARY_MASK + | LC_MESSAGES_MASK; + +pub const DAY_1: ::nl_item = 1; +pub const DAY_2: ::nl_item = 2; +pub const DAY_3: ::nl_item = 3; +pub const DAY_4: ::nl_item = 4; +pub const DAY_5: ::nl_item = 5; +pub const DAY_6: ::nl_item = 6; +pub const DAY_7: ::nl_item = 7; + +pub const ABDAY_1: ::nl_item = 8; +pub const ABDAY_2: ::nl_item = 9; +pub const ABDAY_3: ::nl_item = 10; +pub const ABDAY_4: ::nl_item = 11; +pub const ABDAY_5: ::nl_item = 12; +pub const ABDAY_6: ::nl_item = 13; +pub const ABDAY_7: ::nl_item = 14; + +pub const MON_1: ::nl_item = 15; +pub const MON_2: ::nl_item = 16; +pub const MON_3: ::nl_item = 17; +pub const MON_4: ::nl_item = 18; +pub const MON_5: ::nl_item = 19; +pub const MON_6: ::nl_item = 20; +pub const MON_7: ::nl_item = 21; +pub const MON_8: ::nl_item = 22; +pub const MON_9: ::nl_item = 23; +pub const MON_10: ::nl_item = 24; +pub const MON_11: ::nl_item = 25; +pub const MON_12: ::nl_item = 26; + +pub const ABMON_1: ::nl_item = 27; +pub const ABMON_2: ::nl_item = 28; +pub const ABMON_3: ::nl_item = 29; +pub const ABMON_4: ::nl_item = 30; +pub const ABMON_5: ::nl_item = 31; +pub const ABMON_6: ::nl_item = 32; +pub const ABMON_7: ::nl_item = 33; +pub const ABMON_8: ::nl_item = 34; +pub const ABMON_9: ::nl_item = 35; +pub const ABMON_10: ::nl_item = 36; +pub const ABMON_11: ::nl_item = 37; +pub const ABMON_12: ::nl_item = 38; + +pub const RADIXCHAR: ::nl_item = 39; +pub const THOUSEP: ::nl_item = 40; +pub const YESSTR: ::nl_item = 41; +pub const NOSTR: ::nl_item = 42; +pub const CRNCYSTR: ::nl_item = 43; + +pub const D_T_FMT: ::nl_item = 44; +pub const D_FMT: ::nl_item = 45; +pub const T_FMT: ::nl_item = 46; +pub const AM_STR: ::nl_item = 47; +pub const PM_STR: ::nl_item = 48; + +pub const CODESET: ::nl_item = 49; +pub const T_FMT_AMPM: ::nl_item = 50; +pub const ERA: ::nl_item = 51; +pub const ERA_D_FMT: ::nl_item = 52; +pub const ERA_D_T_FMT: ::nl_item = 53; +pub const ERA_T_FMT: ::nl_item = 54; +pub const ALT_DIGITS: ::nl_item = 55; +pub const YESEXPR: ::nl_item = 56; +pub const NOEXPR: ::nl_item = 57; +pub const _DATE_FMT: ::nl_item = 58; +pub const MAXSTRMSG: ::nl_item = 58; + +pub const PATH_MAX: ::c_int = 1024; + +pub const SA_ONSTACK: ::c_int = 0x00000001; +pub const SA_RESETHAND: ::c_int = 0x00000002; +pub const SA_RESTART: ::c_int = 0x00000004; +pub const SA_SIGINFO: ::c_int = 0x00000008; +pub const SA_NODEFER: ::c_int = 0x00000010; +pub const SA_NOCLDWAIT: ::c_int = 0x00010000; +pub const SA_NOCLDSTOP: ::c_int = 0x00020000; + +pub const SS_ONSTACK: ::c_int = 1; +pub const SS_DISABLE: ::c_int = 2; + +pub const FIOCLEX: ::c_int = 0x20006601; +pub const FIONCLEX: ::c_int = 0x20006602; +pub const FIONREAD: ::c_int = 0x4004667f; +pub const FIONBIO: ::c_int = 0x8004667e; +pub const FIOASYNC: ::c_int = 0x8004667d; +pub const FIOSETOWN: ::c_int = 0x8004667c; +pub const FIOGETOWN: ::c_int = 0x4004667b; + +pub const SIGCHLD: ::c_int = 18; +pub const SIGCLD: ::c_int = ::SIGCHLD; +pub const SIGBUS: ::c_int = 10; +pub const SIGINFO: ::c_int = 41; +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; +pub const SIG_SETMASK: ::c_int = 3; + +pub const SIGEV_NONE: ::c_int = 1; +pub const SIGEV_SIGNAL: ::c_int = 2; +pub const SIGEV_THREAD: ::c_int = 3; + +pub const CLD_EXITED: ::c_int = 1; +pub const CLD_KILLED: ::c_int = 2; +pub const CLD_DUMPED: ::c_int = 3; +pub const CLD_TRAPPED: ::c_int = 4; +pub const CLD_STOPPED: ::c_int = 5; +pub const CLD_CONTINUED: ::c_int = 6; + +pub const IP_RECVDSTADDR: ::c_int = 0x7; +pub const IP_SEC_OPT: ::c_int = 0x22; + +pub const IPV6_UNICAST_HOPS: ::c_int = 0x5; +pub const IPV6_MULTICAST_IF: ::c_int = 0x6; +pub const IPV6_MULTICAST_HOPS: ::c_int = 0x7; +pub const IPV6_MULTICAST_LOOP: ::c_int = 0x8; +pub const IPV6_RECVPKTINFO: ::c_int = 0x12; +pub const IPV6_SEC_OPT: ::c_int = 0x22; +pub const IPV6_V6ONLY: ::c_int = 0x27; + +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + pub const FD_SETSIZE: usize = 65536; + } else { + pub const FD_SETSIZE: usize = 1024; + } +} + +pub const ST_RDONLY: ::c_ulong = 1; +pub const ST_NOSUID: ::c_ulong = 2; + +pub const NI_MAXHOST: ::socklen_t = 1025; +pub const NI_MAXSERV: ::socklen_t = 32; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 4; +pub const _IOLBF: ::c_int = 64; +pub const BUFSIZ: ::c_uint = 1024; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 1024; +pub const L_tmpnam: ::c_uint = 25; +pub const TMP_MAX: ::c_uint = 17576; + +pub const GRND_NONBLOCK: ::c_uint = 0x0001; +pub const GRND_RANDOM: ::c_uint = 0x0002; + +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_NDELAY: ::c_int = 0x04; +pub const O_APPEND: ::c_int = 8; +pub const O_DSYNC: ::c_int = 0x40; +pub const O_CREAT: ::c_int = 256; +pub const O_EXCL: ::c_int = 1024; +pub const O_NOCTTY: ::c_int = 2048; +pub const O_TRUNC: ::c_int = 512; +pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x1000000; +pub const O_SEARCH: ::c_int = 0x200000; +pub const O_EXEC: ::c_int = 0x400000; +pub const O_CLOEXEC: ::c_int = 0x800000; +pub const O_ACCMODE: ::c_int = 0x600003; +pub const O_XATTR: ::c_int = 0x4000; +pub const S_IFIFO: mode_t = 4096; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 61440; +pub const S_IEXEC: mode_t = 64; +pub const S_IWRITE: mode_t = 128; +pub const S_IREAD: mode_t = 256; +pub const S_IRWXU: mode_t = 448; +pub const S_IXUSR: mode_t = 64; +pub const S_IWUSR: mode_t = 128; +pub const S_IRUSR: mode_t = 256; +pub const S_IRWXG: mode_t = 56; +pub const S_IXGRP: mode_t = 8; +pub const S_IWGRP: mode_t = 16; +pub const S_IRGRP: mode_t = 32; +pub const S_IRWXO: mode_t = 7; +pub const S_IXOTH: mode_t = 1; +pub const S_IWOTH: mode_t = 2; +pub const S_IROTH: mode_t = 4; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; +pub const F_LOCK: ::c_int = 1; +pub const F_TEST: ::c_int = 3; +pub const F_TLOCK: ::c_int = 2; +pub const F_ULOCK: ::c_int = 0; +pub const F_SETLK: ::c_int = 6; +pub const F_SETLKW: ::c_int = 7; +pub const F_GETLK: ::c_int = 14; +pub const F_ALLOCSP: ::c_int = 10; +pub const F_FREESP: ::c_int = 11; +pub const F_BLOCKS: ::c_int = 18; +pub const F_BLKSIZE: ::c_int = 19; +pub const F_SHARE: ::c_int = 40; +pub const F_UNSHARE: ::c_int = 41; +pub const F_ISSTREAM: ::c_int = 13; +pub const F_PRIV: ::c_int = 15; +pub const F_NPRIV: ::c_int = 16; +pub const F_QUOTACTL: ::c_int = 17; +pub const F_GETOWN: ::c_int = 23; +pub const F_SETOWN: ::c_int = 24; +pub const F_REVOKE: ::c_int = 25; +pub const F_HASREMOTELOCKS: ::c_int = 26; +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGSYS: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGUSR1: ::c_int = 16; +pub const SIGUSR2: ::c_int = 17; +pub const SIGPWR: ::c_int = 19; +pub const SIGWINCH: ::c_int = 20; +pub const SIGURG: ::c_int = 21; +pub const SIGPOLL: ::c_int = 22; +pub const SIGIO: ::c_int = SIGPOLL; +pub const SIGSTOP: ::c_int = 23; +pub const SIGTSTP: ::c_int = 24; +pub const SIGCONT: ::c_int = 25; +pub const SIGTTIN: ::c_int = 26; +pub const SIGTTOU: ::c_int = 27; +pub const SIGVTALRM: ::c_int = 28; +pub const SIGPROF: ::c_int = 29; +pub const SIGXCPU: ::c_int = 30; +pub const SIGXFSZ: ::c_int = 31; + +pub const WNOHANG: ::c_int = 0x40; +pub const WUNTRACED: ::c_int = 0x04; + +pub const WEXITED: ::c_int = 0x01; +pub const WTRAPPED: ::c_int = 0x02; +pub const WSTOPPED: ::c_int = WUNTRACED; +pub const WCONTINUED: ::c_int = 0x08; +pub const WNOWAIT: ::c_int = 0x80; + +pub const AT_FDCWD: ::c_int = 0xffd19553; +pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x1000; +pub const AT_SYMLINK_FOLLOW: ::c_int = 0x2000; +pub const AT_REMOVEDIR: ::c_int = 0x1; +pub const _AT_TRIGGER: ::c_int = 0x2; +pub const AT_EACCESS: ::c_int = 0x4; + +pub const P_PID: idtype_t = 0; +pub const P_PPID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; +pub const P_SID: idtype_t = 3; +pub const P_CID: idtype_t = 4; +pub const P_UID: idtype_t = 5; +pub const P_GID: idtype_t = 6; +pub const P_ALL: idtype_t = 7; +pub const P_LWPID: idtype_t = 8; +pub const P_TASKID: idtype_t = 9; +pub const P_PROJID: idtype_t = 10; +pub const P_POOLID: idtype_t = 11; +pub const P_ZONEID: idtype_t = 12; +pub const P_CTID: idtype_t = 13; +pub const P_CPUID: idtype_t = 14; +pub const P_PSETID: idtype_t = 15; + +pub const PBIND_NONE: ::processorid_t = -1; +pub const PBIND_QUERY: ::processorid_t = -2; +pub const PBIND_HARD: ::processorid_t = -3; +pub const PBIND_SOFT: ::processorid_t = -4; + +pub const PS_NONE: ::c_int = -1; +pub const PS_QUERY: ::c_int = -2; +pub const PS_MYID: ::c_int = -3; +pub const PS_SOFT: ::c_int = -4; +pub const PS_HARD: ::c_int = -5; +pub const PS_QUERY_TYPE: ::c_int = -6; +pub const PS_SYSTEM: ::c_int = 1; +pub const PS_PRIVATE: ::c_int = 2; + +pub const UTIME_OMIT: c_long = -2; +pub const UTIME_NOW: c_long = -1; + +pub const PROT_NONE: ::c_int = 0; +pub const PROT_READ: ::c_int = 1; +pub const PROT_WRITE: ::c_int = 2; +pub const PROT_EXEC: ::c_int = 4; + +pub const MAP_FILE: ::c_int = 0; +pub const MAP_SHARED: ::c_int = 0x0001; +pub const MAP_PRIVATE: ::c_int = 0x0002; +pub const MAP_FIXED: ::c_int = 0x0010; +pub const MAP_NORESERVE: ::c_int = 0x40; +pub const MAP_ANON: ::c_int = 0x0100; +pub const MAP_ANONYMOUS: ::c_int = 0x0100; +pub const MAP_RENAME: ::c_int = 0x20; +pub const MAP_ALIGN: ::c_int = 0x200; +pub const MAP_TEXT: ::c_int = 0x400; +pub const MAP_INITDATA: ::c_int = 0x800; +pub const MAP_32BIT: ::c_int = 0x80; +pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const MS_SYNC: ::c_int = 0x0004; +pub const MS_ASYNC: ::c_int = 0x0001; +pub const MS_INVALIDATE: ::c_int = 0x0002; + +pub const MMOBJ_PADDING: ::c_uint = 0x10000; +pub const MMOBJ_INTERPRET: ::c_uint = 0x20000; +pub const MR_PADDING: ::c_uint = 0x1; +pub const MR_HDR_ELF: ::c_uint = 0x2; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const ENOTBLK: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const ENOMSG: ::c_int = 35; +pub const EIDRM: ::c_int = 36; +pub const ECHRNG: ::c_int = 37; +pub const EL2NSYNC: ::c_int = 38; +pub const EL3HLT: ::c_int = 39; +pub const EL3RST: ::c_int = 40; +pub const ELNRNG: ::c_int = 41; +pub const EUNATCH: ::c_int = 42; +pub const ENOCSI: ::c_int = 43; +pub const EL2HLT: ::c_int = 44; +pub const EDEADLK: ::c_int = 45; +pub const ENOLCK: ::c_int = 46; +pub const ECANCELED: ::c_int = 47; +pub const ENOTSUP: ::c_int = 48; +pub const EDQUOT: ::c_int = 49; +pub const EBADE: ::c_int = 50; +pub const EBADR: ::c_int = 51; +pub const EXFULL: ::c_int = 52; +pub const ENOANO: ::c_int = 53; +pub const EBADRQC: ::c_int = 54; +pub const EBADSLT: ::c_int = 55; +pub const EDEADLOCK: ::c_int = 56; +pub const EBFONT: ::c_int = 57; +pub const EOWNERDEAD: ::c_int = 58; +pub const ENOTRECOVERABLE: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const ELOCKUNMAPPED: ::c_int = 72; +pub const ENOTACTIVE: ::c_int = 73; +pub const EMULTIHOP: ::c_int = 74; +pub const EADI: ::c_int = 75; +pub const EBADMSG: ::c_int = 77; +pub const ENAMETOOLONG: ::c_int = 78; +pub const EOVERFLOW: ::c_int = 79; +pub const ENOTUNIQ: ::c_int = 80; +pub const EBADFD: ::c_int = 81; +pub const EREMCHG: ::c_int = 82; +pub const ELIBACC: ::c_int = 83; +pub const ELIBBAD: ::c_int = 84; +pub const ELIBSCN: ::c_int = 85; +pub const ELIBMAX: ::c_int = 86; +pub const ELIBEXEC: ::c_int = 87; +pub const EILSEQ: ::c_int = 88; +pub const ENOSYS: ::c_int = 89; +pub const ELOOP: ::c_int = 90; +pub const ERESTART: ::c_int = 91; +pub const ESTRPIPE: ::c_int = 92; +pub const ENOTEMPTY: ::c_int = 93; +pub const EUSERS: ::c_int = 94; +pub const ENOTSOCK: ::c_int = 95; +pub const EDESTADDRREQ: ::c_int = 96; +pub const EMSGSIZE: ::c_int = 97; +pub const EPROTOTYPE: ::c_int = 98; +pub const ENOPROTOOPT: ::c_int = 99; +pub const EPROTONOSUPPORT: ::c_int = 120; +pub const ESOCKTNOSUPPORT: ::c_int = 121; +pub const EOPNOTSUPP: ::c_int = 122; +pub const EPFNOSUPPORT: ::c_int = 123; +pub const EAFNOSUPPORT: ::c_int = 124; +pub const EADDRINUSE: ::c_int = 125; +pub const EADDRNOTAVAIL: ::c_int = 126; +pub const ENETDOWN: ::c_int = 127; +pub const ENETUNREACH: ::c_int = 128; +pub const ENETRESET: ::c_int = 129; +pub const ECONNABORTED: ::c_int = 130; +pub const ECONNRESET: ::c_int = 131; +pub const ENOBUFS: ::c_int = 132; +pub const EISCONN: ::c_int = 133; +pub const ENOTCONN: ::c_int = 134; +pub const ESHUTDOWN: ::c_int = 143; +pub const ETOOMANYREFS: ::c_int = 144; +pub const ETIMEDOUT: ::c_int = 145; +pub const ECONNREFUSED: ::c_int = 146; +pub const EHOSTDOWN: ::c_int = 147; +pub const EHOSTUNREACH: ::c_int = 148; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const EALREADY: ::c_int = 149; +pub const EINPROGRESS: ::c_int = 150; +pub const ESTALE: ::c_int = 151; + +pub const EAI_AGAIN: ::c_int = 2; +pub const EAI_BADFLAGS: ::c_int = 3; +pub const EAI_FAIL: ::c_int = 4; +pub const EAI_FAMILY: ::c_int = 5; +pub const EAI_MEMORY: ::c_int = 6; +pub const EAI_NODATA: ::c_int = 7; +pub const EAI_NONAME: ::c_int = 8; +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; +pub const EAI_OVERFLOW: ::c_int = 12; + +pub const NI_NOFQDN: ::c_uint = 0x0001; +pub const NI_NUMERICHOST: ::c_uint = 0x0002; +pub const NI_NAMEREQD: ::c_uint = 0x0004; +pub const NI_NUMERICSERV: ::c_uint = 0x0008; +pub const NI_DGRAM: ::c_uint = 0x0010; +pub const NI_WITHSCOPEID: ::c_uint = 0x0020; +pub const NI_NUMERICSCOPE: ::c_uint = 0x0040; + +pub const F_DUPFD: ::c_int = 0; +pub const F_DUP2FD: ::c_int = 9; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_GETXFL: ::c_int = 45; + +pub const SIGTRAP: ::c_int = 5; + +pub const GLOB_APPEND: ::c_int = 32; +pub const GLOB_DOOFFS: ::c_int = 16; +pub const GLOB_ERR: ::c_int = 1; +pub const GLOB_MARK: ::c_int = 2; +pub const GLOB_NOCHECK: ::c_int = 8; +pub const GLOB_NOSORT: ::c_int = 4; +pub const GLOB_NOESCAPE: ::c_int = 64; + +pub const GLOB_NOSPACE: ::c_int = -2; +pub const GLOB_ABORTED: ::c_int = -1; +pub const GLOB_NOMATCH: ::c_int = -3; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; +pub const POLLNORM: ::c_short = 0x0040; +pub const POLLRDNORM: ::c_short = 0x0040; +pub const POLLWRNORM: ::c_short = 0x4; /* POLLOUT */ +pub const POLLRDBAND: ::c_short = 0x0080; +pub const POLLWRBAND: ::c_short = 0x0100; + +pub const POSIX_MADV_NORMAL: ::c_int = 0; +pub const POSIX_MADV_RANDOM: ::c_int = 1; +pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; +pub const POSIX_MADV_WILLNEED: ::c_int = 3; +pub const POSIX_MADV_DONTNEED: ::c_int = 4; + +pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; +pub const PTHREAD_CREATE_DETACHED: ::c_int = 0x40; +pub const PTHREAD_PROCESS_SHARED: ::c_int = 1; +pub const PTHREAD_PROCESS_PRIVATE: ::c_ushort = 0; +pub const PTHREAD_STACK_MIN: ::size_t = 4096; + +pub const SIGSTKSZ: ::size_t = 8192; + +// https://illumos.org/man/3c/clock_gettime +// https://github.com/illumos/illumos-gate/ +// blob/HEAD/usr/src/lib/libc/amd64/sys/__clock_gettime.s +// clock_gettime(3c) doesn't seem to accept anything other than CLOCK_REALTIME +// or __CLOCK_REALTIME0 +// +// https://github.com/illumos/illumos-gate/ +// blob/HEAD/usr/src/uts/common/sys/time_impl.h +// Confusing! CLOCK_HIGHRES==CLOCK_MONOTONIC==4 +// __CLOCK_REALTIME0==0 is an obsoleted version of CLOCK_REALTIME==3 +pub const CLOCK_REALTIME: ::clockid_t = 3; +pub const CLOCK_MONOTONIC: ::clockid_t = 4; +pub const TIMER_RELTIME: ::c_int = 0; +pub const TIMER_ABSTIME: ::c_int = 1; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_NOFILE: ::c_int = 5; +pub const RLIMIT_VMEM: ::c_int = 6; +pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM; + +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] +pub const RLIM_NLIMITS: rlim_t = 7; +pub const RLIM_INFINITY: rlim_t = 0xfffffffffffffffd; + +pub const RUSAGE_SELF: ::c_int = 0; +pub const RUSAGE_CHILDREN: ::c_int = -1; + +pub const MADV_NORMAL: ::c_int = 0; +pub const MADV_RANDOM: ::c_int = 1; +pub const MADV_SEQUENTIAL: ::c_int = 2; +pub const MADV_WILLNEED: ::c_int = 3; +pub const MADV_DONTNEED: ::c_int = 4; +pub const MADV_FREE: ::c_int = 5; +pub const MADV_ACCESS_DEFAULT: ::c_int = 6; +pub const MADV_ACCESS_LWP: ::c_int = 7; +pub const MADV_ACCESS_MANY: ::c_int = 8; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_UNIX: ::c_int = 1; +pub const AF_INET: ::c_int = 2; +pub const AF_IMPLINK: ::c_int = 3; +pub const AF_PUP: ::c_int = 4; +pub const AF_CHAOS: ::c_int = 5; +pub const AF_NS: ::c_int = 6; +pub const AF_NBS: ::c_int = 7; +pub const AF_ECMA: ::c_int = 8; +pub const AF_DATAKIT: ::c_int = 9; +pub const AF_CCITT: ::c_int = 10; +pub const AF_SNA: ::c_int = 11; +pub const AF_DECnet: ::c_int = 12; +pub const AF_DLI: ::c_int = 13; +pub const AF_LAT: ::c_int = 14; +pub const AF_HYLINK: ::c_int = 15; +pub const AF_APPLETALK: ::c_int = 16; +pub const AF_NIT: ::c_int = 17; +pub const AF_802: ::c_int = 18; +pub const AF_OSI: ::c_int = 19; +pub const AF_X25: ::c_int = 20; +pub const AF_OSINET: ::c_int = 21; +pub const AF_GOSIP: ::c_int = 22; +pub const AF_IPX: ::c_int = 23; +pub const AF_ROUTE: ::c_int = 24; +pub const AF_LINK: ::c_int = 25; +pub const AF_INET6: ::c_int = 26; +pub const AF_KEY: ::c_int = 27; +pub const AF_NCA: ::c_int = 28; +pub const AF_POLICY: ::c_int = 29; +pub const AF_INET_OFFLOAD: ::c_int = 30; +pub const AF_TRILL: ::c_int = 31; +pub const AF_PACKET: ::c_int = 32; + +pub const PF_UNSPEC: ::c_int = AF_UNSPEC; +pub const PF_UNIX: ::c_int = AF_UNIX; +pub const PF_LOCAL: ::c_int = PF_UNIX; +pub const PF_FILE: ::c_int = PF_UNIX; +pub const PF_INET: ::c_int = AF_INET; +pub const PF_IMPLINK: ::c_int = AF_IMPLINK; +pub const PF_PUP: ::c_int = AF_PUP; +pub const PF_CHAOS: ::c_int = AF_CHAOS; +pub const PF_NS: ::c_int = AF_NS; +pub const PF_NBS: ::c_int = AF_NBS; +pub const PF_ECMA: ::c_int = AF_ECMA; +pub const PF_DATAKIT: ::c_int = AF_DATAKIT; +pub const PF_CCITT: ::c_int = AF_CCITT; +pub const PF_SNA: ::c_int = AF_SNA; +pub const PF_DECnet: ::c_int = AF_DECnet; +pub const PF_DLI: ::c_int = AF_DLI; +pub const PF_LAT: ::c_int = AF_LAT; +pub const PF_HYLINK: ::c_int = AF_HYLINK; +pub const PF_APPLETALK: ::c_int = AF_APPLETALK; +pub const PF_NIT: ::c_int = AF_NIT; +pub const PF_802: ::c_int = AF_802; +pub const PF_OSI: ::c_int = AF_OSI; +pub const PF_X25: ::c_int = AF_X25; +pub const PF_OSINET: ::c_int = AF_OSINET; +pub const PF_GOSIP: ::c_int = AF_GOSIP; +pub const PF_IPX: ::c_int = AF_IPX; +pub const PF_ROUTE: ::c_int = AF_ROUTE; +pub const PF_LINK: ::c_int = AF_LINK; +pub const PF_INET6: ::c_int = AF_INET6; +pub const PF_KEY: ::c_int = AF_KEY; +pub const PF_NCA: ::c_int = AF_NCA; +pub const PF_POLICY: ::c_int = AF_POLICY; +pub const PF_INET_OFFLOAD: ::c_int = AF_INET_OFFLOAD; +pub const PF_TRILL: ::c_int = AF_TRILL; +pub const PF_PACKET: ::c_int = AF_PACKET; + +pub const SOCK_DGRAM: ::c_int = 1; +pub const SOCK_STREAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 4; +pub const SOCK_RDM: ::c_int = 5; +pub const SOCK_SEQPACKET: ::c_int = 6; +pub const IP_MULTICAST_IF: ::c_int = 16; +pub const IP_MULTICAST_TTL: ::c_int = 17; +pub const IP_MULTICAST_LOOP: ::c_int = 18; +pub const IP_TTL: ::c_int = 4; +pub const IP_HDRINCL: ::c_int = 2; +pub const IP_ADD_MEMBERSHIP: ::c_int = 19; +pub const IP_DROP_MEMBERSHIP: ::c_int = 20; +pub const IPV6_JOIN_GROUP: ::c_int = 9; +pub const IPV6_LEAVE_GROUP: ::c_int = 10; +pub const IP_ADD_SOURCE_MEMBERSHIP: ::c_int = 23; +pub const IP_DROP_SOURCE_MEMBERSHIP: ::c_int = 24; +pub const IP_BLOCK_SOURCE: ::c_int = 21; +pub const IP_UNBLOCK_SOURCE: ::c_int = 22; + +// These TCP socket options are common between illumos and Solaris, while higher +// numbers have generally diverged: +pub const TCP_NODELAY: ::c_int = 0x1; +pub const TCP_MAXSEG: ::c_int = 0x2; +pub const TCP_KEEPALIVE: ::c_int = 0x8; +pub const TCP_NOTIFY_THRESHOLD: ::c_int = 0x10; +pub const TCP_ABORT_THRESHOLD: ::c_int = 0x11; +pub const TCP_CONN_NOTIFY_THRESHOLD: ::c_int = 0x12; +pub const TCP_CONN_ABORT_THRESHOLD: ::c_int = 0x13; +pub const TCP_RECVDSTADDR: ::c_int = 0x14; +pub const TCP_INIT_CWND: ::c_int = 0x15; +pub const TCP_KEEPALIVE_THRESHOLD: ::c_int = 0x16; +pub const TCP_KEEPALIVE_ABORT_THRESHOLD: ::c_int = 0x17; +pub const TCP_CORK: ::c_int = 0x18; +pub const TCP_RTO_INITIAL: ::c_int = 0x19; +pub const TCP_RTO_MIN: ::c_int = 0x1a; +pub const TCP_RTO_MAX: ::c_int = 0x1b; +pub const TCP_LINGER2: ::c_int = 0x1c; + +pub const UDP_NAT_T_ENDPOINT: ::c_int = 0x0103; + +pub const SOMAXCONN: ::c_int = 128; + +pub const SOL_SOCKET: ::c_int = 0xffff; +pub const SO_DEBUG: ::c_int = 0x01; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_TIMESTAMP: ::c_int = 0x1013; + +pub const SCM_RIGHTS: ::c_int = 0x1010; +pub const SCM_UCRED: ::c_int = 0x1012; +pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; + +pub const MSG_OOB: ::c_int = 0x1; +pub const MSG_PEEK: ::c_int = 0x2; +pub const MSG_DONTROUTE: ::c_int = 0x4; +pub const MSG_EOR: ::c_int = 0x8; +pub const MSG_CTRUNC: ::c_int = 0x10; +pub const MSG_TRUNC: ::c_int = 0x20; +pub const MSG_WAITALL: ::c_int = 0x40; +pub const MSG_DONTWAIT: ::c_int = 0x80; +pub const MSG_NOTIFICATION: ::c_int = 0x100; +pub const MSG_NOSIGNAL: ::c_int = 0x200; +pub const MSG_DUPCTRL: ::c_int = 0x800; +pub const MSG_XPG4_2: ::c_int = 0x8000; +pub const MSG_MAXIOVLEN: ::c_int = 16; + +pub const IF_NAMESIZE: ::size_t = 32; +pub const IFNAMSIZ: ::size_t = 16; + +// https://docs.oracle.com/cd/E23824_01/html/821-1475/if-7p.html +pub const IFF_UP: ::c_int = 0x0000000001; // Address is up +pub const IFF_BROADCAST: ::c_int = 0x0000000002; // Broadcast address valid +pub const IFF_DEBUG: ::c_int = 0x0000000004; // Turn on debugging +pub const IFF_LOOPBACK: ::c_int = 0x0000000008; // Loopback net +pub const IFF_POINTOPOINT: ::c_int = 0x0000000010; // Interface is p-to-p +pub const IFF_NOTRAILERS: ::c_int = 0x0000000020; // Avoid use of trailers +pub const IFF_RUNNING: ::c_int = 0x0000000040; // Resources allocated +pub const IFF_NOARP: ::c_int = 0x0000000080; // No address res. protocol +pub const IFF_PROMISC: ::c_int = 0x0000000100; // Receive all packets +pub const IFF_ALLMULTI: ::c_int = 0x0000000200; // Receive all multicast pkts +pub const IFF_INTELLIGENT: ::c_int = 0x0000000400; // Protocol code on board +pub const IFF_MULTICAST: ::c_int = 0x0000000800; // Supports multicast + +// Multicast using broadcst. add. +pub const IFF_MULTI_BCAST: ::c_int = 0x0000001000; +pub const IFF_UNNUMBERED: ::c_int = 0x0000002000; // Non-unique address +pub const IFF_DHCPRUNNING: ::c_int = 0x0000004000; // DHCP controls interface +pub const IFF_PRIVATE: ::c_int = 0x0000008000; // Do not advertise +pub const IFF_NOXMIT: ::c_int = 0x0000010000; // Do not transmit pkts + +// No address - just on-link subnet +pub const IFF_NOLOCAL: ::c_int = 0x0000020000; +pub const IFF_DEPRECATED: ::c_int = 0x0000040000; // Address is deprecated +pub const IFF_ADDRCONF: ::c_int = 0x0000080000; // Addr. from stateless addrconf +pub const IFF_ROUTER: ::c_int = 0x0000100000; // Router on interface +pub const IFF_NONUD: ::c_int = 0x0000200000; // No NUD on interface +pub const IFF_ANYCAST: ::c_int = 0x0000400000; // Anycast address +pub const IFF_NORTEXCH: ::c_int = 0x0000800000; // Don't xchange rout. info +pub const IFF_IPV4: ::c_int = 0x0001000000; // IPv4 interface +pub const IFF_IPV6: ::c_int = 0x0002000000; // IPv6 interface +pub const IFF_NOFAILOVER: ::c_int = 0x0008000000; // in.mpathd test address +pub const IFF_FAILED: ::c_int = 0x0010000000; // Interface has failed +pub const IFF_STANDBY: ::c_int = 0x0020000000; // Interface is a hot-spare +pub const IFF_INACTIVE: ::c_int = 0x0040000000; // Functioning but not used +pub const IFF_OFFLINE: ::c_int = 0x0080000000; // Interface is offline + // If CoS marking is supported +pub const IFF_COS_ENABLED: ::c_longlong = 0x0200000000; +pub const IFF_PREFERRED: ::c_longlong = 0x0400000000; // Prefer as source addr. +pub const IFF_TEMPORARY: ::c_longlong = 0x0800000000; // RFC3041 +pub const IFF_FIXEDMTU: ::c_longlong = 0x1000000000; // MTU set with SIOCSLIFMTU +pub const IFF_VIRTUAL: ::c_longlong = 0x2000000000; // Cannot send/receive pkts +pub const IFF_DUPLICATE: ::c_longlong = 0x4000000000; // Local address in use +pub const IFF_IPMP: ::c_longlong = 0x8000000000; // IPMP IP interface + +// sys/ipc.h: +pub const IPC_ALLOC: ::c_int = 0x8000; +pub const IPC_CREAT: ::c_int = 0x200; +pub const IPC_EXCL: ::c_int = 0x400; +pub const IPC_NOWAIT: ::c_int = 0x800; +pub const IPC_PRIVATE: key_t = 0; +pub const IPC_RMID: ::c_int = 10; +pub const IPC_SET: ::c_int = 11; +pub const IPC_SEAT: ::c_int = 12; + +// sys/shm.h +pub const SHM_R: ::c_int = 0o400; +pub const SHM_W: ::c_int = 0o200; +pub const SHM_RDONLY: ::c_int = 0o10000; +pub const SHM_RND: ::c_int = 0o20000; +pub const SHM_SHARE_MMU: ::c_int = 0o40000; +pub const SHM_PAGEABLE: ::c_int = 0o100000; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const LOCK_SH: ::c_int = 1; +pub const LOCK_EX: ::c_int = 2; +pub const LOCK_NB: ::c_int = 4; +pub const LOCK_UN: ::c_int = 8; + +pub const F_RDLCK: ::c_short = 1; +pub const F_WRLCK: ::c_short = 2; +pub const F_UNLCK: ::c_short = 3; + +pub const O_SYNC: ::c_int = 16; +pub const O_NONBLOCK: ::c_int = 128; + +pub const IPPROTO_RAW: ::c_int = 255; + +pub const _PC_LINK_MAX: ::c_int = 1; +pub const _PC_MAX_CANON: ::c_int = 2; +pub const _PC_MAX_INPUT: ::c_int = 3; +pub const _PC_NAME_MAX: ::c_int = 4; +pub const _PC_PATH_MAX: ::c_int = 5; +pub const _PC_PIPE_BUF: ::c_int = 6; +pub const _PC_NO_TRUNC: ::c_int = 7; +pub const _PC_VDISABLE: ::c_int = 8; +pub const _PC_CHOWN_RESTRICTED: ::c_int = 9; +pub const _PC_ASYNC_IO: ::c_int = 10; +pub const _PC_PRIO_IO: ::c_int = 11; +pub const _PC_SYNC_IO: ::c_int = 12; +pub const _PC_ALLOC_SIZE_MIN: ::c_int = 13; +pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; +pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; +pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; +pub const _PC_REC_XFER_ALIGN: ::c_int = 17; +pub const _PC_SYMLINK_MAX: ::c_int = 18; +pub const _PC_2_SYMLINKS: ::c_int = 19; +pub const _PC_ACL_ENABLED: ::c_int = 20; +pub const _PC_MIN_HOLE_SIZE: ::c_int = 21; +pub const _PC_CASE_BEHAVIOR: ::c_int = 22; +pub const _PC_SATTR_ENABLED: ::c_int = 23; +pub const _PC_SATTR_EXISTS: ::c_int = 24; +pub const _PC_ACCESS_FILTERING: ::c_int = 25; +pub const _PC_TIMESTAMP_RESOLUTION: ::c_int = 26; +pub const _PC_FILESIZEBITS: ::c_int = 67; +pub const _PC_XATTR_ENABLED: ::c_int = 100; +pub const _PC_LAST: ::c_int = 101; +pub const _PC_XATTR_EXISTS: ::c_int = 101; + +pub const _SC_ARG_MAX: ::c_int = 1; +pub const _SC_CHILD_MAX: ::c_int = 2; +pub const _SC_CLK_TCK: ::c_int = 3; +pub const _SC_NGROUPS_MAX: ::c_int = 4; +pub const _SC_OPEN_MAX: ::c_int = 5; +pub const _SC_JOB_CONTROL: ::c_int = 6; +pub const _SC_SAVED_IDS: ::c_int = 7; +pub const _SC_VERSION: ::c_int = 8; +pub const _SC_PASS_MAX: ::c_int = 9; +pub const _SC_LOGNAME_MAX: ::c_int = 10; +pub const _SC_PAGESIZE: ::c_int = 11; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_XOPEN_VERSION: ::c_int = 12; +pub const _SC_NPROCESSORS_CONF: ::c_int = 14; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 15; +pub const _SC_STREAM_MAX: ::c_int = 16; +pub const _SC_TZNAME_MAX: ::c_int = 17; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 18; +pub const _SC_AIO_MAX: ::c_int = 19; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 20; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21; +pub const _SC_DELAYTIMER_MAX: ::c_int = 22; +pub const _SC_FSYNC: ::c_int = 23; +pub const _SC_MAPPED_FILES: ::c_int = 24; +pub const _SC_MEMLOCK: ::c_int = 25; +pub const _SC_MEMLOCK_RANGE: ::c_int = 26; +pub const _SC_MEMORY_PROTECTION: ::c_int = 27; +pub const _SC_MESSAGE_PASSING: ::c_int = 28; +pub const _SC_MQ_OPEN_MAX: ::c_int = 29; +pub const _SC_MQ_PRIO_MAX: ::c_int = 30; +pub const _SC_PRIORITIZED_IO: ::c_int = 31; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 32; +pub const _SC_REALTIME_SIGNALS: ::c_int = 33; +pub const _SC_RTSIG_MAX: ::c_int = 34; +pub const _SC_SEMAPHORES: ::c_int = 35; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 36; +pub const _SC_SEM_VALUE_MAX: ::c_int = 37; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 38; +pub const _SC_SIGQUEUE_MAX: ::c_int = 39; +pub const _SC_SIGRT_MIN: ::c_int = 40; +pub const _SC_SIGRT_MAX: ::c_int = 41; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 42; +pub const _SC_TIMERS: ::c_int = 43; +pub const _SC_TIMER_MAX: ::c_int = 44; +pub const _SC_2_C_BIND: ::c_int = 45; +pub const _SC_2_C_DEV: ::c_int = 46; +pub const _SC_2_C_VERSION: ::c_int = 47; +pub const _SC_2_FORT_DEV: ::c_int = 48; +pub const _SC_2_FORT_RUN: ::c_int = 49; +pub const _SC_2_LOCALEDEF: ::c_int = 50; +pub const _SC_2_SW_DEV: ::c_int = 51; +pub const _SC_2_UPE: ::c_int = 52; +pub const _SC_2_VERSION: ::c_int = 53; +pub const _SC_BC_BASE_MAX: ::c_int = 54; +pub const _SC_BC_DIM_MAX: ::c_int = 55; +pub const _SC_BC_SCALE_MAX: ::c_int = 56; +pub const _SC_BC_STRING_MAX: ::c_int = 57; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 58; +pub const _SC_EXPR_NEST_MAX: ::c_int = 59; +pub const _SC_LINE_MAX: ::c_int = 60; +pub const _SC_RE_DUP_MAX: ::c_int = 61; +pub const _SC_XOPEN_CRYPT: ::c_int = 62; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 63; +pub const _SC_XOPEN_SHM: ::c_int = 64; +pub const _SC_2_CHAR_TERM: ::c_int = 66; +pub const _SC_XOPEN_XCU_VERSION: ::c_int = 67; +pub const _SC_ATEXIT_MAX: ::c_int = 76; +pub const _SC_IOV_MAX: ::c_int = 77; +pub const _SC_XOPEN_UNIX: ::c_int = 78; +pub const _SC_T_IOV_MAX: ::c_int = 79; +pub const _SC_PHYS_PAGES: ::c_int = 500; +pub const _SC_AVPHYS_PAGES: ::c_int = 501; +pub const _SC_COHER_BLKSZ: ::c_int = 503; +pub const _SC_SPLIT_CACHE: ::c_int = 504; +pub const _SC_ICACHE_SZ: ::c_int = 505; +pub const _SC_DCACHE_SZ: ::c_int = 506; +pub const _SC_ICACHE_LINESZ: ::c_int = 507; +pub const _SC_DCACHE_LINESZ: ::c_int = 508; +pub const _SC_ICACHE_BLKSZ: ::c_int = 509; +pub const _SC_DCACHE_BLKSZ: ::c_int = 510; +pub const _SC_DCACHE_TBLKSZ: ::c_int = 511; +pub const _SC_ICACHE_ASSOC: ::c_int = 512; +pub const _SC_DCACHE_ASSOC: ::c_int = 513; +pub const _SC_MAXPID: ::c_int = 514; +pub const _SC_STACK_PROT: ::c_int = 515; +pub const _SC_NPROCESSORS_MAX: ::c_int = 516; +pub const _SC_CPUID_MAX: ::c_int = 517; +pub const _SC_EPHID_MAX: ::c_int = 518; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 568; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 569; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 570; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 571; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 572; +pub const _SC_THREAD_STACK_MIN: ::c_int = 573; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 574; +pub const _SC_TTY_NAME_MAX: ::c_int = 575; +pub const _SC_THREADS: ::c_int = 576; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 577; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 578; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 579; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 580; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 581; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 582; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 583; +pub const _SC_XOPEN_LEGACY: ::c_int = 717; +pub const _SC_XOPEN_REALTIME: ::c_int = 718; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 719; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = 720; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 721; +pub const _SC_XBS5_LP64_OFF64: ::c_int = 722; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 723; +pub const _SC_2_PBS: ::c_int = 724; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 725; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 726; +pub const _SC_2_PBS_LOCATE: ::c_int = 728; +pub const _SC_2_PBS_MESSAGE: ::c_int = 729; +pub const _SC_2_PBS_TRACK: ::c_int = 730; +pub const _SC_ADVISORY_INFO: ::c_int = 731; +pub const _SC_BARRIERS: ::c_int = 732; +pub const _SC_CLOCK_SELECTION: ::c_int = 733; +pub const _SC_CPUTIME: ::c_int = 734; +pub const _SC_HOST_NAME_MAX: ::c_int = 735; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 736; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 737; +pub const _SC_REGEXP: ::c_int = 738; +pub const _SC_SHELL: ::c_int = 739; +pub const _SC_SPAWN: ::c_int = 740; +pub const _SC_SPIN_LOCKS: ::c_int = 741; +pub const _SC_SPORADIC_SERVER: ::c_int = 742; +pub const _SC_SS_REPL_MAX: ::c_int = 743; +pub const _SC_SYMLOOP_MAX: ::c_int = 744; +pub const _SC_THREAD_CPUTIME: ::c_int = 745; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 746; +pub const _SC_TIMEOUTS: ::c_int = 747; +pub const _SC_TRACE: ::c_int = 748; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 749; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 750; +pub const _SC_TRACE_INHERIT: ::c_int = 751; +pub const _SC_TRACE_LOG: ::c_int = 752; +pub const _SC_TRACE_NAME_MAX: ::c_int = 753; +pub const _SC_TRACE_SYS_MAX: ::c_int = 754; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 755; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 756; +pub const _SC_V6_ILP32_OFF32: ::c_int = 757; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = 758; +pub const _SC_V6_LP64_OFF64: ::c_int = 759; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 760; +pub const _SC_XOPEN_STREAMS: ::c_int = 761; +pub const _SC_IPV6: ::c_int = 762; +pub const _SC_RAW_SOCKETS: ::c_int = 763; + +pub const _MUTEX_MAGIC: u16 = 0x4d58; // MX +pub const _COND_MAGIC: u16 = 0x4356; // CV +pub const _RWL_MAGIC: u16 = 0x5257; // RW + +pub const NCCS: usize = 19; + +pub const LOG_CRON: ::c_int = 15 << 3; + +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + __pthread_mutex_flag1: 0, + __pthread_mutex_flag2: 0, + __pthread_mutex_ceiling: 0, + __pthread_mutex_type: PTHREAD_PROCESS_PRIVATE, + __pthread_mutex_magic: _MUTEX_MAGIC, + __pthread_mutex_lock: 0, + __pthread_mutex_data: 0, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + __pthread_cond_flag: [0; 4], + __pthread_cond_type: PTHREAD_PROCESS_PRIVATE, + __pthread_cond_magic: _COND_MAGIC, + __pthread_cond_data: 0, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + __pthread_rwlock_readers: 0, + __pthread_rwlock_type: PTHREAD_PROCESS_PRIVATE, + __pthread_rwlock_magic: _RWL_MAGIC, + __pthread_rwlock_mutex: PTHREAD_MUTEX_INITIALIZER, + __pthread_rwlock_readercv: PTHREAD_COND_INITIALIZER, + __pthread_rwlock_writercv: PTHREAD_COND_INITIALIZER, +}; +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 4; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; + +pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void; +pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void; +pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void; +pub const RTLD_PROBE: *mut ::c_void = -4isize as *mut ::c_void; + +pub const RTLD_LAZY: ::c_int = 0x1; +pub const RTLD_NOW: ::c_int = 0x2; +pub const RTLD_NOLOAD: ::c_int = 0x4; +pub const RTLD_GLOBAL: ::c_int = 0x100; +pub const RTLD_LOCAL: ::c_int = 0x0; +pub const RTLD_PARENT: ::c_int = 0x200; +pub const RTLD_GROUP: ::c_int = 0x400; +pub const RTLD_WORLD: ::c_int = 0x800; +pub const RTLD_NODELETE: ::c_int = 0x1000; +pub const RTLD_FIRST: ::c_int = 0x2000; +pub const RTLD_CONFGEN: ::c_int = 0x10000; + +pub const PORT_SOURCE_AIO: ::c_int = 1; +pub const PORT_SOURCE_TIMER: ::c_int = 2; +pub const PORT_SOURCE_USER: ::c_int = 3; +pub const PORT_SOURCE_FD: ::c_int = 4; +pub const PORT_SOURCE_ALERT: ::c_int = 5; +pub const PORT_SOURCE_MQ: ::c_int = 6; +pub const PORT_SOURCE_FILE: ::c_int = 7; + +pub const NONROOT_USR: ::c_short = 2; +pub const _UTX_USERSIZE: usize = 32; +pub const _UTX_LINESIZE: usize = 32; +pub const _UTX_PADSIZE: usize = 5; +pub const _UTX_IDSIZE: usize = 4; +pub const _UTX_HOSTSIZE: usize = 257; +pub const EMPTY: ::c_short = 0; +pub const RUN_LVL: ::c_short = 1; +pub const BOOT_TIME: ::c_short = 2; +pub const OLD_TIME: ::c_short = 3; +pub const NEW_TIME: ::c_short = 4; +pub const INIT_PROCESS: ::c_short = 5; +pub const LOGIN_PROCESS: ::c_short = 6; +pub const USER_PROCESS: ::c_short = 7; +pub const DEAD_PROCESS: ::c_short = 8; +pub const ACCOUNTING: ::c_short = 9; +pub const DOWN_TIME: ::c_short = 10; + +const _TIOC: ::c_int = ('T' as i32) << 8; +const tIOC: ::c_int = ('t' as i32) << 8; +pub const TCGETA: ::c_int = _TIOC | 1; +pub const TCSETA: ::c_int = _TIOC | 2; +pub const TCSETAW: ::c_int = _TIOC | 3; +pub const TCSETAF: ::c_int = _TIOC | 4; +pub const TCSBRK: ::c_int = _TIOC | 5; +pub const TCXONC: ::c_int = _TIOC | 6; +pub const TCFLSH: ::c_int = _TIOC | 7; +pub const TCDSET: ::c_int = _TIOC | 32; +pub const TCGETS: ::c_int = _TIOC | 13; +pub const TCSETS: ::c_int = _TIOC | 14; +pub const TCSANOW: ::c_int = _TIOC | 14; +pub const TCSETSW: ::c_int = _TIOC | 15; +pub const TCSADRAIN: ::c_int = _TIOC | 15; +pub const TCSETSF: ::c_int = _TIOC | 16; +pub const TCSAFLUSH: ::c_int = _TIOC | 16; +pub const TCIFLUSH: ::c_int = 0; +pub const TCOFLUSH: ::c_int = 1; +pub const TCIOFLUSH: ::c_int = 2; +pub const TCOOFF: ::c_int = 0; +pub const TCOON: ::c_int = 1; +pub const TCIOFF: ::c_int = 2; +pub const TCION: ::c_int = 3; +pub const TIOC: ::c_int = _TIOC; +pub const TIOCKBON: ::c_int = _TIOC | 8; +pub const TIOCKBOF: ::c_int = _TIOC | 9; +pub const TIOCGWINSZ: ::c_int = _TIOC | 104; +pub const TIOCSWINSZ: ::c_int = _TIOC | 103; +pub const TIOCGSOFTCAR: ::c_int = _TIOC | 105; +pub const TIOCSSOFTCAR: ::c_int = _TIOC | 106; +pub const TIOCGPPS: ::c_int = _TIOC | 125; +pub const TIOCSPPS: ::c_int = _TIOC | 126; +pub const TIOCGPPSEV: ::c_int = _TIOC | 127; +pub const TIOCGETD: ::c_int = tIOC | 0; +pub const TIOCSETD: ::c_int = tIOC | 1; +pub const TIOCHPCL: ::c_int = tIOC | 2; +pub const TIOCGETP: ::c_int = tIOC | 8; +pub const TIOCSETP: ::c_int = tIOC | 9; +pub const TIOCSETN: ::c_int = tIOC | 10; +pub const TIOCEXCL: ::c_int = tIOC | 13; +pub const TIOCNXCL: ::c_int = tIOC | 14; +pub const TIOCFLUSH: ::c_int = tIOC | 16; +pub const TIOCSETC: ::c_int = tIOC | 17; +pub const TIOCGETC: ::c_int = tIOC | 18; +pub const TIOCLBIS: ::c_int = tIOC | 127; +pub const TIOCLBIC: ::c_int = tIOC | 126; +pub const TIOCLSET: ::c_int = tIOC | 125; +pub const TIOCLGET: ::c_int = tIOC | 124; +pub const TIOCSBRK: ::c_int = tIOC | 123; +pub const TIOCCBRK: ::c_int = tIOC | 122; +pub const TIOCSDTR: ::c_int = tIOC | 121; +pub const TIOCCDTR: ::c_int = tIOC | 120; +pub const TIOCSLTC: ::c_int = tIOC | 117; +pub const TIOCGLTC: ::c_int = tIOC | 116; +pub const TIOCOUTQ: ::c_int = tIOC | 115; +pub const TIOCNOTTY: ::c_int = tIOC | 113; +pub const TIOCSCTTY: ::c_int = tIOC | 132; +pub const TIOCSTOP: ::c_int = tIOC | 111; +pub const TIOCSTART: ::c_int = tIOC | 110; +pub const TIOCSILOOP: ::c_int = tIOC | 109; +pub const TIOCCILOOP: ::c_int = tIOC | 108; +pub const TIOCGPGRP: ::c_int = tIOC | 20; +pub const TIOCSPGRP: ::c_int = tIOC | 21; +pub const TIOCGSID: ::c_int = tIOC | 22; +pub const TIOCSTI: ::c_int = tIOC | 23; +pub const TIOCMSET: ::c_int = tIOC | 26; +pub const TIOCMBIS: ::c_int = tIOC | 27; +pub const TIOCMBIC: ::c_int = tIOC | 28; +pub const TIOCMGET: ::c_int = tIOC | 29; +pub const TIOCREMOTE: ::c_int = tIOC | 30; +pub const TIOCSIGNAL: ::c_int = tIOC | 31; + +pub const TIOCM_LE: ::c_int = 0o0001; +pub const TIOCM_DTR: ::c_int = 0o0002; +pub const TIOCM_RTS: ::c_int = 0o0004; +pub const TIOCM_ST: ::c_int = 0o0010; +pub const TIOCM_SR: ::c_int = 0o0020; +pub const TIOCM_CTS: ::c_int = 0o0040; +pub const TIOCM_CAR: ::c_int = 0o0100; +pub const TIOCM_CD: ::c_int = TIOCM_CAR; +pub const TIOCM_RNG: ::c_int = 0o0200; +pub const TIOCM_RI: ::c_int = TIOCM_RNG; +pub const TIOCM_DSR: ::c_int = 0o0400; + +pub const EPOLLIN: ::c_int = 0x1; +pub const EPOLLPRI: ::c_int = 0x2; +pub const EPOLLOUT: ::c_int = 0x4; +pub const EPOLLRDNORM: ::c_int = 0x40; +pub const EPOLLRDBAND: ::c_int = 0x80; +pub const EPOLLWRNORM: ::c_int = 0x100; +pub const EPOLLWRBAND: ::c_int = 0x200; +pub const EPOLLMSG: ::c_int = 0x400; +pub const EPOLLERR: ::c_int = 0x8; +pub const EPOLLHUP: ::c_int = 0x10; +pub const EPOLLET: ::c_int = 0x80000000; +pub const EPOLLRDHUP: ::c_int = 0x2000; +pub const EPOLLONESHOT: ::c_int = 0x40000000; +pub const EPOLLWAKEUP: ::c_int = 0x20000000; +pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; +pub const EPOLL_CLOEXEC: ::c_int = 0x80000; +pub const EPOLL_CTL_ADD: ::c_int = 1; +pub const EPOLL_CTL_MOD: ::c_int = 3; +pub const EPOLL_CTL_DEL: ::c_int = 2; + +/* termios */ +pub const B0: speed_t = 0; +pub const B50: speed_t = 1; +pub const B75: speed_t = 2; +pub const B110: speed_t = 3; +pub const B134: speed_t = 4; +pub const B150: speed_t = 5; +pub const B200: speed_t = 6; +pub const B300: speed_t = 7; +pub const B600: speed_t = 8; +pub const B1200: speed_t = 9; +pub const B1800: speed_t = 10; +pub const B2400: speed_t = 11; +pub const B4800: speed_t = 12; +pub const B9600: speed_t = 13; +pub const B19200: speed_t = 14; +pub const B38400: speed_t = 15; +pub const B57600: speed_t = 16; +pub const B76800: speed_t = 17; +pub const B115200: speed_t = 18; +pub const B153600: speed_t = 19; +pub const B230400: speed_t = 20; +pub const B307200: speed_t = 21; +pub const B460800: speed_t = 22; +pub const B921600: speed_t = 23; +pub const CSTART: ::tcflag_t = 0o21; +pub const CSTOP: ::tcflag_t = 0o23; +pub const CSWTCH: ::tcflag_t = 0o32; +pub const CBAUD: ::tcflag_t = 0o17; +pub const CIBAUD: ::tcflag_t = 0o3600000; +pub const CBAUDEXT: ::tcflag_t = 0o10000000; +pub const CIBAUDEXT: ::tcflag_t = 0o20000000; +pub const CSIZE: ::tcflag_t = 0o000060; +pub const CS5: ::tcflag_t = 0; +pub const CS6: ::tcflag_t = 0o000020; +pub const CS7: ::tcflag_t = 0o000040; +pub const CS8: ::tcflag_t = 0o000060; +pub const CSTOPB: ::tcflag_t = 0o000100; +pub const ECHO: ::tcflag_t = 0o000010; +pub const ECHOE: ::tcflag_t = 0o000020; +pub const ECHOK: ::tcflag_t = 0o000040; +pub const ECHONL: ::tcflag_t = 0o000100; +pub const ECHOCTL: ::tcflag_t = 0o001000; +pub const ECHOPRT: ::tcflag_t = 0o002000; +pub const ECHOKE: ::tcflag_t = 0o004000; +pub const EXTPROC: ::tcflag_t = 0o200000; +pub const IGNBRK: ::tcflag_t = 0o000001; +pub const BRKINT: ::tcflag_t = 0o000002; +pub const IGNPAR: ::tcflag_t = 0o000004; +pub const PARMRK: ::tcflag_t = 0o000010; +pub const INPCK: ::tcflag_t = 0o000020; +pub const ISTRIP: ::tcflag_t = 0o000040; +pub const INLCR: ::tcflag_t = 0o000100; +pub const IGNCR: ::tcflag_t = 0o000200; +pub const ICRNL: ::tcflag_t = 0o000400; +pub const IUCLC: ::tcflag_t = 0o001000; +pub const IXON: ::tcflag_t = 0o002000; +pub const IXOFF: ::tcflag_t = 0o010000; +pub const IXANY: ::tcflag_t = 0o004000; +pub const IMAXBEL: ::tcflag_t = 0o020000; +pub const DOSMODE: ::tcflag_t = 0o100000; +pub const OPOST: ::tcflag_t = 0o000001; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const ONLCR: ::tcflag_t = 0o000004; +pub const OCRNL: ::tcflag_t = 0o000010; +pub const ONOCR: ::tcflag_t = 0o000020; +pub const ONLRET: ::tcflag_t = 0o000040; +pub const OFILL: ::tcflag_t = 0o0000100; +pub const OFDEL: ::tcflag_t = 0o0000200; +pub const CREAD: ::tcflag_t = 0o000200; +pub const PARENB: ::tcflag_t = 0o000400; +pub const PARODD: ::tcflag_t = 0o001000; +pub const HUPCL: ::tcflag_t = 0o002000; +pub const CLOCAL: ::tcflag_t = 0o004000; +pub const CRTSXOFF: ::tcflag_t = 0o10000000000; +pub const CRTSCTS: ::tcflag_t = 0o20000000000; +pub const ISIG: ::tcflag_t = 0o000001; +pub const ICANON: ::tcflag_t = 0o000002; +pub const IEXTEN: ::tcflag_t = 0o100000; +pub const TOSTOP: ::tcflag_t = 0o000400; +pub const FLUSHO: ::tcflag_t = 0o020000; +pub const PENDIN: ::tcflag_t = 0o040000; +pub const NOFLSH: ::tcflag_t = 0o000200; +pub const VINTR: usize = 0; +pub const VQUIT: usize = 1; +pub const VERASE: usize = 2; +pub const VKILL: usize = 3; +pub const VEOF: usize = 4; +pub const VEOL: usize = 5; +pub const VEOL2: usize = 6; +pub const VMIN: usize = 4; +pub const VTIME: usize = 5; +pub const VSWTCH: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VDSUSP: usize = 11; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const VLNEXT: usize = 15; +pub const VSTATUS: usize = 16; +pub const VERASE2: usize = 17; + +// +const STR: ::c_int = (b'S' as ::c_int) << 8; +pub const I_NREAD: ::c_int = STR | 0o1; +pub const I_PUSH: ::c_int = STR | 0o2; +pub const I_POP: ::c_int = STR | 0o3; +pub const I_LOOK: ::c_int = STR | 0o4; +pub const I_FLUSH: ::c_int = STR | 0o5; +pub const I_SRDOPT: ::c_int = STR | 0o6; +pub const I_GRDOPT: ::c_int = STR | 0o7; +pub const I_STR: ::c_int = STR | 0o10; +pub const I_SETSIG: ::c_int = STR | 0o11; +pub const I_GETSIG: ::c_int = STR | 0o12; +pub const I_FIND: ::c_int = STR | 0o13; +pub const I_LINK: ::c_int = STR | 0o14; +pub const I_UNLINK: ::c_int = STR | 0o15; +pub const I_PEEK: ::c_int = STR | 0o17; +pub const I_FDINSERT: ::c_int = STR | 0o20; +pub const I_SENDFD: ::c_int = STR | 0o21; +pub const I_RECVFD: ::c_int = STR | 0o16; +pub const I_SWROPT: ::c_int = STR | 0o23; +pub const I_GWROPT: ::c_int = STR | 0o24; +pub const I_LIST: ::c_int = STR | 0o25; +pub const I_PLINK: ::c_int = STR | 0o26; +pub const I_PUNLINK: ::c_int = STR | 0o27; +pub const I_ANCHOR: ::c_int = STR | 0o30; +pub const I_FLUSHBAND: ::c_int = STR | 0o34; +pub const I_CKBAND: ::c_int = STR | 0o35; +pub const I_GETBAND: ::c_int = STR | 0o36; +pub const I_ATMARK: ::c_int = STR | 0o37; +pub const I_SETCLTIME: ::c_int = STR | 0o40; +pub const I_GETCLTIME: ::c_int = STR | 0o41; +pub const I_CANPUT: ::c_int = STR | 0o42; +pub const I_SERROPT: ::c_int = STR | 0o43; +pub const I_GERROPT: ::c_int = STR | 0o44; +pub const I_ESETSIG: ::c_int = STR | 0o45; +pub const I_EGETSIG: ::c_int = STR | 0o46; +pub const __I_PUSH_NOCTTY: ::c_int = STR | 0o47; + +// 3SOCKET flags +pub const SOCK_CLOEXEC: ::c_int = 0x080000; +pub const SOCK_NONBLOCK: ::c_int = 0x100000; +pub const SOCK_NDELAY: ::c_int = 0x200000; + +// +pub const SCALE_KG: ::c_int = 1 << 6; +pub const SCALE_KF: ::c_int = 1 << 16; +pub const SCALE_KH: ::c_int = 1 << 2; +pub const MAXTC: ::c_int = 1 << 6; +pub const SCALE_PHASE: ::c_int = 1 << 22; +pub const SCALE_USEC: ::c_int = 1 << 16; +pub const SCALE_UPDATE: ::c_int = SCALE_KG * MAXTC; +pub const FINEUSEC: ::c_int = 1 << 22; +pub const MAXPHASE: ::c_int = 512000; +pub const MAXFREQ: ::c_int = 512 * SCALE_USEC; +pub const MAXTIME: ::c_int = 200 << PPS_AVG; +pub const MINSEC: ::c_int = 16; +pub const MAXSEC: ::c_int = 1200; +pub const PPS_AVG: ::c_int = 2; +pub const PPS_SHIFT: ::c_int = 2; +pub const PPS_SHIFTMAX: ::c_int = 8; +pub const PPS_VALID: ::c_int = 120; +pub const MAXGLITCH: ::c_int = 30; +pub const MOD_OFFSET: u32 = 0x0001; +pub const MOD_FREQUENCY: u32 = 0x0002; +pub const MOD_MAXERROR: u32 = 0x0004; +pub const MOD_ESTERROR: u32 = 0x0008; +pub const MOD_STATUS: u32 = 0x0010; +pub const MOD_TIMECONST: u32 = 0x0020; +pub const MOD_CLKB: u32 = 0x4000; +pub const MOD_CLKA: u32 = 0x8000; +pub const STA_PLL: u32 = 0x0001; +pub const STA_PPSFREQ: i32 = 0x0002; +pub const STA_PPSTIME: i32 = 0x0004; +pub const STA_FLL: i32 = 0x0008; +pub const STA_INS: i32 = 0x0010; +pub const STA_DEL: i32 = 0x0020; +pub const STA_UNSYNC: i32 = 0x0040; +pub const STA_FREQHOLD: i32 = 0x0080; +pub const STA_PPSSIGNAL: i32 = 0x0100; +pub const STA_PPSJITTER: i32 = 0x0200; +pub const STA_PPSWANDER: i32 = 0x0400; +pub const STA_PPSERROR: i32 = 0x0800; +pub const STA_CLOCKERR: i32 = 0x1000; +pub const STA_RONLY: i32 = + STA_PPSSIGNAL | STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR | STA_CLOCKERR; +pub const TIME_OK: i32 = 0; +pub const TIME_INS: i32 = 1; +pub const TIME_DEL: i32 = 2; +pub const TIME_OOP: i32 = 3; +pub const TIME_WAIT: i32 = 4; +pub const TIME_ERROR: i32 = 5; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const SCHED_OTHER: ::c_int = 0; +pub const SCHED_FIFO: ::c_int = 1; +pub const SCHED_RR: ::c_int = 2; +pub const SCHED_SYS: ::c_int = 3; +pub const SCHED_IA: ::c_int = 4; +pub const SCHED_FSS: ::c_int = 5; +pub const SCHED_FX: ::c_int = 6; + +// sys/priv.h +pub const PRIV_DEBUG: ::c_uint = 0x0001; +pub const PRIV_AWARE: ::c_uint = 0x0002; +pub const PRIV_AWARE_INHERIT: ::c_uint = 0x0004; +pub const __PROC_PROTECT: ::c_uint = 0x0008; +pub const NET_MAC_AWARE: ::c_uint = 0x0010; +pub const NET_MAC_AWARE_INHERIT: ::c_uint = 0x0020; +pub const PRIV_AWARE_RESET: ::c_uint = 0x0040; +pub const PRIV_XPOLICY: ::c_uint = 0x0080; +pub const PRIV_PFEXEC: ::c_uint = 0x0100; +pub const PRIV_USER: ::c_uint = PRIV_DEBUG + | NET_MAC_AWARE + | NET_MAC_AWARE_INHERIT + | PRIV_XPOLICY + | PRIV_AWARE_RESET + | PRIV_PFEXEC; + +// sys/systeminfo.h +pub const SI_SYSNAME: ::c_int = 1; +pub const SI_HOSTNAME: ::c_int = 2; +pub const SI_RELEASE: ::c_int = 3; +pub const SI_VERSION: ::c_int = 4; +pub const SI_MACHINE: ::c_int = 5; +pub const SI_ARCHITECTURE: ::c_int = 6; +pub const SI_HW_SERIAL: ::c_int = 7; +pub const SI_HW_PROVIDER: ::c_int = 8; +pub const SI_SET_HOSTNAME: ::c_int = 258; +pub const SI_SET_SRPC_DOMAIN: ::c_int = 265; +pub const SI_PLATFORM: ::c_int = 513; +pub const SI_ISALIST: ::c_int = 514; +pub const SI_DHCP_CACHE: ::c_int = 515; +pub const SI_ARCHITECTURE_32: ::c_int = 516; +pub const SI_ARCHITECTURE_64: ::c_int = 517; +pub const SI_ARCHITECTURE_K: ::c_int = 518; +pub const SI_ARCHITECTURE_NATIVE: ::c_int = 519; + +// sys/lgrp_user.h +pub const LGRP_COOKIE_NONE: ::lgrp_cookie_t = 0; +pub const LGRP_AFF_NONE: ::lgrp_affinity_t = 0x0; +pub const LGRP_AFF_WEAK: ::lgrp_affinity_t = 0x10; +pub const LGRP_AFF_STRONG: ::lgrp_affinity_t = 0x100; +pub const LGRP_RSRC_COUNT: ::lgrp_rsrc_t = 2; +pub const LGRP_RSRC_CPU: ::lgrp_rsrc_t = 0; +pub const LGRP_RSRC_MEM: ::lgrp_rsrc_t = 1; +pub const LGRP_CONTENT_ALL: ::lgrp_content_t = 0; +pub const LGRP_CONTENT_HIERARCHY: ::lgrp_content_t = LGRP_CONTENT_ALL; +pub const LGRP_CONTENT_DIRECT: ::lgrp_content_t = 1; +pub const LGRP_LAT_CPU_TO_MEM: ::lgrp_lat_between_t = 0; +pub const LGRP_MEM_SZ_FREE: ::lgrp_mem_size_flag_t = 0; +pub const LGRP_MEM_SZ_INSTALLED: ::lgrp_mem_size_flag_t = 1; +pub const LGRP_VIEW_CALLER: ::lgrp_view_t = 0; +pub const LGRP_VIEW_OS: ::lgrp_view_t = 1; + +// sys/processor.h + +pub const P_OFFLINE: ::c_int = 0x001; +pub const P_ONLINE: ::c_int = 0x002; +pub const P_STATUS: ::c_int = 0x003; +pub const P_FAULTED: ::c_int = 0x004; +pub const P_POWEROFF: ::c_int = 0x005; +pub const P_NOINTR: ::c_int = 0x006; +pub const P_SPARE: ::c_int = 0x007; +pub const P_DISABLED: ::c_int = 0x008; +pub const P_FORCED: ::c_int = 0x10000000; +pub const PI_TYPELEN: ::c_int = 16; +pub const PI_FPUTYPE: ::c_int = 32; + +// sys/auxv.h +pub const AT_SUN_HWCAP: ::c_uint = 2009; +pub const AT_SUN_HWCAP2: ::c_uint = 2023; +pub const AT_SUN_FPTYPE: ::c_uint = 2027; + +// As per sys/socket.h, header alignment must be 8 bytes on SPARC +// and 4 bytes everywhere else: +#[cfg(target_arch = "sparc64")] +const _CMSG_HDR_ALIGNMENT: usize = 8; +#[cfg(not(target_arch = "sparc64"))] +const _CMSG_HDR_ALIGNMENT: usize = 4; + +const _CMSG_DATA_ALIGNMENT: usize = ::mem::size_of::<::c_int>(); + +const NEWDEV: ::c_int = 1; + +const_fn! { + {const} fn _CMSG_HDR_ALIGN(p: usize) -> usize { + (p + _CMSG_HDR_ALIGNMENT - 1) & !(_CMSG_HDR_ALIGNMENT - 1) + } + + {const} fn _CMSG_DATA_ALIGN(p: usize) -> usize { + (p + _CMSG_DATA_ALIGNMENT - 1) & !(_CMSG_DATA_ALIGNMENT - 1) + } +} + +f! { + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + _CMSG_DATA_ALIGN(cmsg.offset(1) as usize) as *mut ::c_uchar + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + _CMSG_DATA_ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length + } + + pub fn CMSG_FIRSTHDR(mhdr: *const ::msghdr) -> *mut ::cmsghdr { + if ((*mhdr).msg_controllen as usize) < ::mem::size_of::<::cmsghdr>() { + 0 as *mut ::cmsghdr + } else { + (*mhdr).msg_control as *mut ::cmsghdr + } + } + + pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr) + -> *mut ::cmsghdr + { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize + + ::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize) + as *mut ::cmsghdr + } + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + _CMSG_HDR_ALIGN(::mem::size_of::<::cmsghdr>() as usize + + length as usize) as ::c_uint + } + + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] &= !(1 << (fd % bits)); + return + } + + pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0 + } + + pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { + let bits = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; + let fd = fd as usize; + (*set).fds_bits[fd / bits] |= 1 << (fd % bits); + return + } + + pub fn FD_ZERO(set: *mut fd_set) -> () { + for slot in (*set).fds_bits.iter_mut() { + *slot = 0; + } + } +} + +safe_f! { + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xFF) == 0 + } + + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xFF + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7F + } + + pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { + (status & 0xffff) == 0xffff + } + + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status & 0xff00) >> 8 + } + + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + ((status & 0xff) > 0) && (status & 0xff00 == 0) + } + + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + ((status & 0xff) == 0x7f) && ((status & 0xff00) != 0) + } + + pub {const} fn WCOREDUMP(status: ::c_int) -> bool { + (status & 0x80) != 0 + } + + pub {const} fn MR_GET_TYPE(flags: ::c_uint) -> ::c_uint { + flags & 0x0000ffff + } +} + +extern "C" { + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn acct(filename: *const ::c_char) -> ::c_int; + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + pub fn getrandom(bbuf: *mut ::c_void, buflen: ::size_t, flags: ::c_uint) -> ::ssize_t; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn settimeofday(tp: *const ::timeval, tz: *const ::c_void) -> ::c_int; + pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; + pub fn freeifaddrs(ifa: *mut ::ifaddrs); + + pub fn stack_getbounds(sp: *mut ::stack_t) -> ::c_int; + pub fn getgrouplist( + name: *const ::c_char, + basegid: ::gid_t, + groups: *mut ::gid_t, + ngroups: *mut ::c_int, + ) -> ::c_int; + pub fn initgroups(name: *const ::c_char, basegid: ::gid_t) -> ::c_int; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn ioctl(fildes: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; + pub fn ___errno() -> *mut ::c_int; + pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + pub fn clock_nanosleep( + clk_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + pub fn clock_settime(clk_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn setpwent(); + pub fn endpwent(); + pub fn getpwent() -> *mut passwd; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn getprogname() -> *const ::c_char; + pub fn setprogname(name: *const ::c_char); + pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; + pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int; + pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int; + + pub fn mknodat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::mode_t, + dev: dev_t, + ) -> ::c_int; + pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int; + pub fn if_nameindex() -> *mut if_nameindex; + pub fn if_freenameindex(ptr: *mut if_nameindex); + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + pub fn pthread_attr_getstack( + attr: *const ::pthread_attr_t, + stackaddr: *mut *mut ::c_void, + stacksize: *mut ::size_t, + ) -> ::c_int; + pub fn pthread_condattr_getclock( + attr: *const pthread_condattr_t, + clock_id: *mut clockid_t, + ) -> ::c_int; + pub fn pthread_condattr_setclock( + attr: *mut pthread_condattr_t, + clock_id: ::clockid_t, + ) -> ::c_int; + pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; + pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; + pub fn pthread_mutex_timedlock( + lock: *mut pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + pub fn pthread_getname_np(tid: ::pthread_t, name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn pthread_setname_np(tid: ::pthread_t, name: *const ::c_char) -> ::c_int; + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + + #[cfg_attr(target_os = "illumos", link_name = "_glob_ext")] + pub fn glob( + pattern: *const ::c_char, + flags: ::c_int, + errfunc: ::Option ::c_int>, + pglob: *mut ::glob_t, + ) -> ::c_int; + + #[cfg_attr(target_os = "illumos", link_name = "_globfree_ext")] + pub fn globfree(pglob: *mut ::glob_t); + + pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void, shmflg: ::c_int) -> *mut ::c_void; + + pub fn shmctl(shmid: ::c_int, cmd: ::c_int, buf: *mut ::shmid_ds) -> ::c_int; + + pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int; + + pub fn shmget(key: key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int; + + pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t) -> ::c_int; + pub fn shm_unlink(name: *const ::c_char) -> ::c_int; + + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; + + pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int; + + pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; + + pub fn recvfrom( + socket: ::c_int, + buf: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *mut ::sockaddr, + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; + pub fn futimesat(fd: ::c_int, path: *const ::c_char, times: *const ::timeval) -> ::c_int; + pub fn futimens(dirfd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + + #[cfg_attr(target_os = "illumos", link_name = "__xnet_bind")] + pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + #[cfg_attr(target_os = "illumos", link_name = "__xnet_sendmsg")] + pub fn sendmsg(fd: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + #[cfg_attr(target_os = "illumos", link_name = "__xnet_recvmsg")] + pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + pub fn accept4( + fd: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + flags: ::c_int, + ) -> ::c_int; + + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; + pub fn port_create() -> ::c_int; + pub fn port_associate( + port: ::c_int, + source: ::c_int, + object: ::uintptr_t, + events: ::c_int, + user: *mut ::c_void, + ) -> ::c_int; + pub fn port_dissociate(port: ::c_int, source: ::c_int, object: ::uintptr_t) -> ::c_int; + pub fn port_get(port: ::c_int, pe: *mut port_event, timeout: *mut ::timespec) -> ::c_int; + pub fn port_getn( + port: ::c_int, + pe_list: *mut port_event, + max: ::c_uint, + nget: *mut ::c_uint, + timeout: *mut ::timespec, + ) -> ::c_int; + pub fn port_send(port: ::c_int, events: ::c_int, user: *mut ::c_void) -> ::c_int; + pub fn port_sendn( + port_list: *mut ::c_int, + error_list: *mut ::c_int, + nent: ::c_uint, + events: ::c_int, + user: *mut ::c_void, + ) -> ::c_int; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "__posix_getgrgid_r" + )] + pub fn getgrgid_r( + gid: ::gid_t, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + pub fn sem_close(sem: *mut sem_t) -> ::c_int; + pub fn getdtablesize() -> ::c_int; + + // The epoll functions are actually only present on illumos. However, + // there are things using epoll on illumos (built using the + // x86_64-pc-solaris target) which would break until the illumos target is + // present in rustc. + pub fn epoll_pwait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + sigmask: *const ::sigset_t, + ) -> ::c_int; + + pub fn epoll_create(size: ::c_int) -> ::c_int; + pub fn epoll_create1(flags: ::c_int) -> ::c_int; + pub fn epoll_wait( + epfd: ::c_int, + events: *mut ::epoll_event, + maxevents: ::c_int, + timeout: ::c_int, + ) -> ::c_int; + pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) + -> ::c_int; + + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "__posix_getgrnam_r" + )] + pub fn getgrnam_r( + name: *const ::c_char, + grp: *mut ::group, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut ::group, + ) -> ::c_int; + pub fn thr_self() -> ::thread_t; + pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; + pub fn getgrnam(name: *const ::c_char) -> *mut ::group; + pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; + pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; + pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; + pub fn sched_getparam(pid: ::pid_t, param: *mut sched_param) -> ::c_int; + pub fn sched_setparam(pid: ::pid_t, param: *const sched_param) -> ::c_int; + pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; + pub fn sched_setscheduler( + pid: ::pid_t, + policy: ::c_int, + param: *const ::sched_param, + ) -> ::c_int; + pub fn sem_unlink(name: *const ::c_char) -> ::c_int; + pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "__posix_getpwnam_r" + )] + pub fn getpwnam_r( + name: *const ::c_char, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "__posix_getpwuid_r" + )] + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "getpwent_r" + )] + fn native_getpwent_r(pwd: *mut passwd, buf: *mut ::c_char, buflen: ::c_int) -> *mut passwd; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "getgrent_r" + )] + fn native_getgrent_r(grp: *mut ::group, buf: *mut ::c_char, buflen: ::c_int) -> *mut ::group; + #[cfg_attr( + any(target_os = "solaris", target_os = "illumos"), + link_name = "__posix_sigwait" + )] + pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + pub fn getgrgid(gid: ::gid_t) -> *mut ::group; + pub fn setgrent(); + pub fn endgrent(); + pub fn getgrent() -> *mut ::group; + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + + pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; + pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; + + pub fn makeutx(ux: *const utmpx) -> *mut utmpx; + pub fn modutx(ux: *const utmpx) -> *mut utmpx; + pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int; + pub fn utmpxname(file: *const ::c_char) -> ::c_int; + pub fn getutxent() -> *mut utmpx; + pub fn getutxid(ut: *const utmpx) -> *mut utmpx; + pub fn getutxline(ut: *const utmpx) -> *mut utmpx; + pub fn pututxline(ut: *const utmpx) -> *mut utmpx; + pub fn setutxent(); + pub fn endutxent(); + + pub fn endutent(); + pub fn getutent() -> *mut utmp; + pub fn getutid(u: *const utmp) -> *mut utmp; + pub fn getutline(u: *const utmp) -> *mut utmp; + pub fn pututline(u: *const utmp) -> *mut utmp; + pub fn setutent(); + pub fn utmpname(file: *const ::c_char) -> ::c_int; + + pub fn getutmp(ux: *const utmpx, u: *mut utmp); + pub fn getutmpx(u: *const utmp, ux: *mut utmpx); + pub fn updwtmp(file: *const ::c_char, u: *mut utmp); + + pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; + pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + + pub fn timer_create(clock_id: clockid_t, evp: *mut sigevent, timerid: *mut timer_t) -> ::c_int; + pub fn timer_delete(timerid: timer_t) -> ::c_int; + pub fn timer_getoverrun(timerid: timer_t) -> ::c_int; + pub fn timer_gettime(timerid: timer_t, value: *mut itimerspec) -> ::c_int; + pub fn timer_settime( + timerid: timer_t, + flags: ::c_int, + value: *const itimerspec, + ovalue: *mut itimerspec, + ) -> ::c_int; + + pub fn ucred_get(pid: ::pid_t) -> *mut ucred_t; + pub fn getpeerucred(fd: ::c_int, ucred: *mut *mut ucred_t) -> ::c_int; + + pub fn ucred_free(ucred: *mut ucred_t); + + pub fn ucred_geteuid(ucred: *const ucred_t) -> ::uid_t; + pub fn ucred_getruid(ucred: *const ucred_t) -> ::uid_t; + pub fn ucred_getsuid(ucred: *const ucred_t) -> ::uid_t; + pub fn ucred_getegid(ucred: *const ucred_t) -> ::gid_t; + pub fn ucred_getrgid(ucred: *const ucred_t) -> ::gid_t; + pub fn ucred_getsgid(ucred: *const ucred_t) -> ::gid_t; + pub fn ucred_getgroups(ucred: *const ucred_t, groups: *mut *const ::gid_t) -> ::c_int; + pub fn ucred_getpid(ucred: *const ucred_t) -> ::pid_t; + pub fn ucred_getprojid(ucred: *const ucred_t) -> projid_t; + pub fn ucred_getzoneid(ucred: *const ucred_t) -> zoneid_t; + pub fn ucred_getpflags(ucred: *const ucred_t, flags: ::c_uint) -> ::c_uint; + + pub fn ucred_size() -> ::size_t; + + pub fn pset_create(newpset: *mut ::psetid_t) -> ::c_int; + pub fn pset_destroy(pset: ::psetid_t) -> ::c_int; + pub fn pset_assign(pset: ::psetid_t, cpu: ::processorid_t, opset: *mut psetid_t) -> ::c_int; + pub fn pset_info( + pset: ::psetid_t, + tpe: *mut ::c_int, + numcpus: *mut ::c_uint, + cpulist: *mut processorid_t, + ) -> ::c_int; + pub fn pset_bind( + pset: ::psetid_t, + idtype: ::idtype_t, + id: ::id_t, + opset: *mut psetid_t, + ) -> ::c_int; + pub fn pset_list(pset: *mut psetid_t, numpsets: *mut ::c_uint) -> ::c_int; + pub fn pset_setattr(pset: psetid_t, attr: ::c_uint) -> ::c_int; + pub fn pset_getattr(pset: psetid_t, attr: *mut ::c_uint) -> ::c_int; + pub fn processor_bind( + idtype: ::idtype_t, + id: ::id_t, + new_binding: ::processorid_t, + old_binding: *mut processorid_t, + ) -> ::c_int; + pub fn p_online(processorid: ::processorid_t, flag: ::c_int) -> ::c_int; + pub fn processor_info(processorid: ::processorid_t, infop: *mut processor_info_t) -> ::c_int; + + pub fn getexecname() -> *const ::c_char; + + pub fn gethostid() -> ::c_long; + + pub fn getpflags(flags: ::c_uint) -> ::c_uint; + pub fn setpflags(flags: ::c_uint, value: ::c_uint) -> ::c_int; + + pub fn sysinfo(command: ::c_int, buf: *mut ::c_char, count: ::c_long) -> ::c_int; + + pub fn faccessat(fd: ::c_int, path: *const ::c_char, amode: ::c_int, flag: ::c_int) -> ::c_int; + + // #include + #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( + info: *mut dl_phdr_info, + size: usize, + data: *mut ::c_void, + ) -> ::c_int, + >, + data: *mut ::c_void, + ) -> ::c_int; + pub fn getpagesize() -> ::c_int; + pub fn getpagesizes(pagesize: *mut ::size_t, nelem: ::c_int) -> ::c_int; + pub fn mmapobj( + fd: ::c_int, + flags: ::c_uint, + storage: *mut mmapobj_result_t, + elements: *mut ::c_uint, + arg: *mut ::c_void, + ) -> ::c_int; + pub fn meminfo( + inaddr: *const u64, + addr_count: ::c_int, + info_req: *const ::c_uint, + info_count: ::c_int, + outdata: *mut u64, + validity: *mut ::c_uint, + ) -> ::c_int; + + pub fn strcasecmp_l(s1: *const ::c_char, s2: *const ::c_char, loc: ::locale_t) -> ::c_int; + pub fn strncasecmp_l( + s1: *const ::c_char, + s2: *const ::c_char, + n: ::size_t, + loc: ::locale_t, + ) -> ::c_int; + pub fn strsep(string: *mut *mut ::c_char, delim: *const ::c_char) -> *mut ::c_char; + + pub fn getisax(array: *mut u32, n: ::c_uint) -> ::c_uint; + + pub fn backtrace(buffer: *mut *mut ::c_void, size: ::c_int) -> ::c_int; + pub fn backtrace_symbols(buffer: *const *mut ::c_void, size: ::c_int) -> *mut *mut ::c_char; + pub fn backtrace_symbols_fd(buffer: *const *mut ::c_void, size: ::c_int, fd: ::c_int); + + pub fn getopt_long( + argc: ::c_int, + argv: *const *mut c_char, + optstring: *const c_char, + longopts: *const option, + longindex: *mut ::c_int, + ) -> ::c_int; + + pub fn sync(); + + fn __major(version: ::c_int, devnum: ::dev_t) -> ::major_t; + fn __minor(version: ::c_int, devnum: ::dev_t) -> ::minor_t; + fn __makedev(version: ::c_int, majdev: ::major_t, mindev: ::minor_t) -> ::dev_t; +} + +#[link(name = "sendfile")] +extern "C" { + pub fn sendfile(out_fd: ::c_int, in_fd: ::c_int, off: *mut ::off_t, len: ::size_t) + -> ::ssize_t; + pub fn sendfilev( + fildes: ::c_int, + vec: *const sendfilevec_t, + sfvcnt: ::c_int, + xferred: *mut ::size_t, + ) -> ::ssize_t; +} + +#[link(name = "lgrp")] +extern "C" { + pub fn lgrp_init(view: lgrp_view_t) -> lgrp_cookie_t; + pub fn lgrp_fini(cookie: lgrp_cookie_t) -> ::c_int; + pub fn lgrp_affinity_get( + idtype: ::idtype_t, + id: ::id_t, + lgrp: ::lgrp_id_t, + ) -> ::lgrp_affinity_t; + pub fn lgrp_affinity_set( + idtype: ::idtype_t, + id: ::id_t, + lgrp: ::lgrp_id_t, + aff: lgrp_affinity_t, + ) -> ::lgrp_affinity_t; + pub fn lgrp_cpus( + cookie: ::lgrp_cookie_t, + lgrp: ::lgrp_id_t, + cpuids: *mut ::processorid_t, + count: ::c_uint, + content: ::lgrp_content_t, + ) -> ::c_int; + pub fn lgrp_mem_size( + cookie: ::lgrp_cookie_t, + lgrp: ::lgrp_id_t, + tpe: ::lgrp_mem_size_flag_t, + content: ::lgrp_content_t, + ) -> ::lgrp_mem_size_t; + pub fn lgrp_nlgrps(cookie: ::lgrp_cookie_t) -> ::c_int; + pub fn lgrp_view(cookie: ::lgrp_cookie_t) -> ::lgrp_view_t; + pub fn lgrp_home(idtype: ::idtype_t, id: ::id_t) -> ::lgrp_id_t; + pub fn lgrp_version(version: ::c_int) -> ::c_int; + pub fn lgrp_resources( + cookie: ::lgrp_cookie_t, + lgrp: ::lgrp_id_t, + lgrps: *mut ::lgrp_id_t, + count: ::c_uint, + tpe: ::lgrp_rsrc_t, + ) -> ::c_int; + pub fn lgrp_root(cookie: ::lgrp_cookie_t) -> ::lgrp_id_t; +} + +pub unsafe fn major(device: ::dev_t) -> ::major_t { + __major(NEWDEV, device) +} + +pub unsafe fn minor(device: ::dev_t) -> ::minor_t { + __minor(NEWDEV, device) +} + +pub unsafe fn makedev(maj: ::major_t, min: ::minor_t) -> ::dev_t { + __makedev(NEWDEV, maj, min) +} + +mod compat; +pub use self::compat::*; + +cfg_if! { + if #[cfg(target_os = "illumos")] { + mod illumos; + pub use self::illumos::*; + } else if #[cfg(target_os = "solaris")] { + mod solaris; + pub use self::solaris::*; + } else { + // Unknown target_os + } +} + +cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + mod x86_common; + pub use self::x86_64::*; + pub use self::x86_common::*; + } else if #[cfg(target_arch = "x86")] { + mod x86; + mod x86_common; + pub use self::x86::*; + pub use self::x86_common::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/solaris.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/solaris.rs new file mode 100644 index 0000000..80bad28 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/solaris.rs @@ -0,0 +1,101 @@ +pub type door_attr_t = ::c_uint; +pub type door_id_t = ::c_ulonglong; + +s! { + pub struct shmid_ds { + pub shm_perm: ::ipc_perm, + pub shm_segsz: ::size_t, + pub shm_flags: ::uintptr_t, + pub shm_lkcnt: ::c_ushort, + pub shm_lpid: ::pid_t, + pub shm_cpid: ::pid_t, + pub shm_nattch: ::shmatt_t, + pub shm_cnattch: ::c_ulong, + pub shm_atime: ::time_t, + pub shm_dtime: ::time_t, + pub shm_ctime: ::time_t, + pub shm_amp: *mut ::c_void, + pub shm_gransize: u64, + pub shm_allocated: u64, + pub shm_pad4: [i64; 1], + } + + pub struct door_desc_t__d_data__d_desc { + pub d_descriptor: ::c_int, + pub d_id: ::door_id_t + } +} + +s_no_extra_traits! { + #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))] + pub union door_desc_t__d_data { + pub d_desc: door_desc_t__d_data__d_desc, + d_resv: [::c_int; 5], /* Check out /usr/include/sys/door.h */ + } + + #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))] + pub struct door_desc_t { + pub d_attributes: door_attr_t, + pub d_data: door_desc_t__d_data, + } + + #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))] + pub struct door_arg_t { + pub data_ptr: *const ::c_char, + pub data_size: ::size_t, + pub desc_ptr: *const door_desc_t, + pub dec_num: ::c_uint, + pub rbuf: *const ::c_char, + pub rsize: ::size_t, + } +} + +pub const PORT_SOURCE_POSTWAIT: ::c_int = 8; +pub const PORT_SOURCE_SIGNAL: ::c_int = 9; + +pub const AF_LOCAL: ::c_int = 0; +pub const AF_FILE: ::c_int = 0; + +pub const TCP_KEEPIDLE: ::c_int = 0x1d; +pub const TCP_KEEPINTVL: ::c_int = 0x1e; +pub const TCP_KEEPCNT: ::c_int = 0x1f; + +pub const F_DUPFD_CLOEXEC: ::c_int = 47; +pub const F_DUPFD_CLOFORK: ::c_int = 49; +pub const F_DUP2FD_CLOEXEC: ::c_int = 48; +pub const F_DUP2FD_CLOFORK: ::c_int = 50; + +extern "C" { + pub fn fexecve( + fd: ::c_int, + argv: *const *const ::c_char, + envp: *const *const ::c_char, + ) -> ::c_int; + + pub fn mincore(addr: *const ::c_void, len: ::size_t, vec: *mut ::c_char) -> ::c_int; + + pub fn door_call(d: ::c_int, params: *const door_arg_t) -> ::c_int; + pub fn door_return( + data_ptr: *const ::c_char, + data_size: ::size_t, + desc_ptr: *const door_desc_t, + num_desc: ::c_uint, + ); + pub fn door_create( + server_procedure: extern "C" fn( + cookie: *const ::c_void, + argp: *const ::c_char, + arg_size: ::size_t, + dp: *const door_desc_t, + n_desc: ::c_uint, + ), + cookie: *const ::c_void, + attributes: door_attr_t, + ) -> ::c_int; + + pub fn fattach(fildes: ::c_int, path: *const ::c_char) -> ::c_int; + + pub fn pthread_getattr_np(thread: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; + + pub fn euidaccess(path: *const ::c_char, amode: ::c_int) -> ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86.rs new file mode 100644 index 0000000..23f52ad --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86.rs @@ -0,0 +1,29 @@ +pub type Elf32_Addr = ::c_ulong; +pub type Elf32_Half = ::c_ushort; +pub type Elf32_Off = ::c_ulong; +pub type Elf32_Sword = ::c_long; +pub type Elf32_Word = ::c_ulong; +pub type Elf32_Lword = ::c_ulonglong; +pub type Elf32_Phdr = __c_anonymous_Elf32_Phdr; + +s! { + pub struct __c_anonymous_Elf32_Phdr { + pub p_type: ::Elf32_Word, + pub p_offset: ::Elf32_Off, + pub p_vaddr: ::Elf32_Addr, + pub p_paddr: ::Elf32_Addr, + pub p_filesz: ::Elf32_Word, + pub p_memsz: ::Elf32_Word, + pub p_flags: ::Elf32_Word, + pub p_align: ::Elf32_Word, + } + + pub struct dl_phdr_info { + pub dlpi_addr: ::Elf32_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const ::Elf32_Phdr, + pub dlpi_phnum: ::Elf32_Half, + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_64.rs new file mode 100644 index 0000000..bca552f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_64.rs @@ -0,0 +1,190 @@ +pub type greg_t = ::c_long; + +pub type Elf64_Addr = ::c_ulong; +pub type Elf64_Half = ::c_ushort; +pub type Elf64_Off = ::c_ulong; +pub type Elf64_Sword = ::c_int; +pub type Elf64_Sxword = ::c_long; +pub type Elf64_Word = ::c_uint; +pub type Elf64_Xword = ::c_ulong; +pub type Elf64_Lword = ::c_ulong; +pub type Elf64_Phdr = __c_anonymous_Elf64_Phdr; + +s! { + pub struct __c_anonymous_fpchip_state { + pub cw: u16, + pub sw: u16, + pub fctw: u8, + pub __fx_rsvd: u8, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcsr_mask: u32, + pub st: [::upad128_t; 8], + pub xmm: [::upad128_t; 16], + pub __fx_ign: [::upad128_t; 6], + pub status: u32, + pub xstatus: u32, + } + + pub struct __c_anonymous_Elf64_Phdr { + pub p_type: ::Elf64_Word, + pub p_flags: ::Elf64_Word, + pub p_offset: ::Elf64_Off, + pub p_vaddr: ::Elf64_Addr, + pub p_paddr: ::Elf64_Addr, + pub p_filesz: ::Elf64_Xword, + pub p_memsz: ::Elf64_Xword, + pub p_align: ::Elf64_Xword, + } + + pub struct dl_phdr_info { + pub dlpi_addr: ::Elf64_Addr, + pub dlpi_name: *const ::c_char, + pub dlpi_phdr: *const ::Elf64_Phdr, + pub dlpi_phnum: ::Elf64_Half, + pub dlpi_adds: ::c_ulonglong, + pub dlpi_subs: ::c_ulonglong, + } +} + +s_no_extra_traits! { + #[cfg(libc_union)] + pub union __c_anonymous_fp_reg_set { + pub fpchip_state: __c_anonymous_fpchip_state, + pub f_fpregs: [[u32; 13]; 10], + } + + pub struct fpregset_t { + pub fp_reg_set: __c_anonymous_fp_reg_set, + } + + pub struct mcontext_t { + pub gregs: [::greg_t; 28], + pub fpregs: fpregset_t, + } + + pub struct ucontext_t { + pub uc_flags: ::c_ulong, + pub uc_link: *mut ucontext_t, + pub uc_sigmask: ::sigset_t, + pub uc_stack: ::stack_t, + pub uc_mcontext: mcontext_t, + pub uc_filler: [::c_long; 5], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + #[cfg(libc_union)] + impl PartialEq for __c_anonymous_fp_reg_set { + fn eq(&self, other: &__c_anonymous_fp_reg_set) -> bool { + unsafe { + self.fpchip_state == other.fpchip_state || + self. + f_fpregs. + iter(). + zip(other.f_fpregs.iter()). + all(|(a, b)| a == b) + } + } + } + #[cfg(libc_union)] + impl Eq for __c_anonymous_fp_reg_set {} + #[cfg(libc_union)] + impl ::fmt::Debug for __c_anonymous_fp_reg_set { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + f.debug_struct("__c_anonymous_fp_reg_set") + .field("fpchip_state", &{self.fpchip_state}) + .field("f_fpregs", &{self.f_fpregs}) + .finish() + } + } + } + impl PartialEq for fpregset_t { + fn eq(&self, other: &fpregset_t) -> bool { + self.fp_reg_set == other.fp_reg_set + } + } + impl Eq for fpregset_t {} + impl ::fmt::Debug for fpregset_t { + fn fmt(&self, f:&mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpregset_t") + .field("fp_reg_set", &self.fp_reg_set) + .finish() + } + } + impl PartialEq for mcontext_t { + fn eq(&self, other: &mcontext_t) -> bool { + self.gregs == other.gregs && + self.fpregs == other.fpregs + } + } + impl Eq for mcontext_t {} + impl ::fmt::Debug for mcontext_t { + fn fmt(&self, f:&mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("mcontext_t") + .field("gregs", &self.gregs) + .field("fpregs", &self.fpregs) + .finish() + } + } + impl PartialEq for ucontext_t { + fn eq(&self, other: &ucontext_t) -> bool { + self.uc_flags == other.uc_flags + && self.uc_link == other.uc_link + && self.uc_sigmask == other.uc_sigmask + && self.uc_stack == other.uc_stack + && self.uc_mcontext == other.uc_mcontext + && self.uc_filler == other.uc_filler + } + } + impl Eq for ucontext_t {} + impl ::fmt::Debug for ucontext_t { + fn fmt(&self, f:&mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("ucontext_t") + .field("uc_flags", &self.uc_flags) + .field("uc_link", &self.uc_link) + .field("uc_sigmask", &self.uc_sigmask) + .field("uc_stack", &self.uc_stack) + .field("uc_mcontext", &self.uc_mcontext) + .field("uc_filler", &self.uc_filler) + .finish() + } + } + + } +} + +// sys/regset.h + +pub const REG_GSBASE: ::c_int = 27; +pub const REG_FSBASE: ::c_int = 26; +pub const REG_DS: ::c_int = 25; +pub const REG_ES: ::c_int = 24; +pub const REG_GS: ::c_int = 23; +pub const REG_FS: ::c_int = 22; +pub const REG_SS: ::c_int = 21; +pub const REG_RSP: ::c_int = 20; +pub const REG_RFL: ::c_int = 19; +pub const REG_CS: ::c_int = 18; +pub const REG_RIP: ::c_int = 17; +pub const REG_ERR: ::c_int = 16; +pub const REG_TRAPNO: ::c_int = 15; +pub const REG_RAX: ::c_int = 14; +pub const REG_RCX: ::c_int = 13; +pub const REG_RDX: ::c_int = 12; +pub const REG_RBX: ::c_int = 11; +pub const REG_RBP: ::c_int = 10; +pub const REG_RSI: ::c_int = 9; +pub const REG_RDI: ::c_int = 8; +pub const REG_R8: ::c_int = 7; +pub const REG_R9: ::c_int = 6; +pub const REG_R10: ::c_int = 5; +pub const REG_R11: ::c_int = 4; +pub const REG_R12: ::c_int = 3; +pub const REG_R13: ::c_int = 2; +pub const REG_R14: ::c_int = 1; +pub const REG_R15: ::c_int = 0; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_common.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_common.rs new file mode 100644 index 0000000..515f234 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/unix/solarish/x86_common.rs @@ -0,0 +1,65 @@ +// AT_SUN_HWCAP +pub const AV_386_FPU: u32 = 0x00001; +pub const AV_386_TSC: u32 = 0x00002; +pub const AV_386_CX8: u32 = 0x00004; +pub const AV_386_SEP: u32 = 0x00008; +pub const AV_386_AMD_SYSC: u32 = 0x00010; +pub const AV_386_CMOV: u32 = 0x00020; +pub const AV_386_MMX: u32 = 0x00040; +pub const AV_386_AMD_MMX: u32 = 0x00080; +pub const AV_386_AMD_3DNow: u32 = 0x00100; +pub const AV_386_AMD_3DNowx: u32 = 0x00200; +pub const AV_386_FXSR: u32 = 0x00400; +pub const AV_386_SSE: u32 = 0x00800; +pub const AV_386_SSE2: u32 = 0x01000; +pub const AV_386_CX16: u32 = 0x10000; +pub const AV_386_AHF: u32 = 0x20000; +pub const AV_386_TSCP: u32 = 0x40000; +pub const AV_386_AMD_SSE4A: u32 = 0x80000; +pub const AV_386_POPCNT: u32 = 0x100000; +pub const AV_386_AMD_LZCNT: u32 = 0x200000; +pub const AV_386_SSSE3: u32 = 0x400000; +pub const AV_386_SSE4_1: u32 = 0x800000; +pub const AV_386_SSE4_2: u32 = 0x1000000; +pub const AV_386_MOVBE: u32 = 0x2000000; +pub const AV_386_AES: u32 = 0x4000000; +pub const AV_386_PCLMULQDQ: u32 = 0x8000000; +pub const AV_386_XSAVE: u32 = 0x10000000; +pub const AV_386_AVX: u32 = 0x20000000; +pub const AV_386_VMX: u32 = 0x40000000; +pub const AV_386_AMD_SVM: u32 = 0x80000000; +// AT_SUN_HWCAP2 +pub const AV_386_2_F16C: u32 = 0x00000001; +pub const AV_386_2_RDRAND: u32 = 0x00000002; +pub const AV_386_2_BMI1: u32 = 0x00000004; +pub const AV_386_2_BMI2: u32 = 0x00000008; +pub const AV_386_2_FMA: u32 = 0x00000010; +pub const AV_386_2_AVX2: u32 = 0x00000020; +pub const AV_386_2_ADX: u32 = 0x00000040; +pub const AV_386_2_RDSEED: u32 = 0x00000080; +pub const AV_386_2_AVX512F: u32 = 0x00000100; +pub const AV_386_2_AVX512DQ: u32 = 0x00000200; +pub const AV_386_2_AVX512IFMA: u32 = 0x00000400; +pub const AV_386_2_AVX512PF: u32 = 0x00000800; +pub const AV_386_2_AVX512ER: u32 = 0x00001000; +pub const AV_386_2_AVX512CD: u32 = 0x00002000; +pub const AV_386_2_AVX512BW: u32 = 0x00004000; +pub const AV_386_2_AVX512VL: u32 = 0x00008000; +pub const AV_386_2_AVX512VBMI: u32 = 0x00010000; +pub const AV_386_2_AVX512VPOPCDQ: u32 = 0x00020000; +pub const AV_386_2_AVX512_4NNIW: u32 = 0x00040000; +pub const AV_386_2_AVX512_4FMAPS: u32 = 0x00080000; +pub const AV_386_2_SHA: u32 = 0x00100000; +pub const AV_386_2_FSGSBASE: u32 = 0x00200000; +pub const AV_386_2_CLFLUSHOPT: u32 = 0x00400000; +pub const AV_386_2_CLWB: u32 = 0x00800000; +pub const AV_386_2_MONITORX: u32 = 0x01000000; +pub const AV_386_2_CLZERO: u32 = 0x02000000; +pub const AV_386_2_AVX512_VNNI: u32 = 0x04000000; +pub const AV_386_2_VPCLMULQDQ: u32 = 0x08000000; +pub const AV_386_2_VAES: u32 = 0x10000000; +// AT_SUN_FPTYPE +pub const AT_386_FPINFO_NONE: u32 = 0; +pub const AT_386_FPINFO_FXSAVE: u32 = 1; +pub const AT_386_FPINFO_XSAVE: u32 = 2; +pub const AT_386_FPINFO_XSAVE_AMD: u32 = 3; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/aarch64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/aarch64.rs new file mode 100644 index 0000000..4032488 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/aarch64.rs @@ -0,0 +1,4 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/arm.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/arm.rs new file mode 100644 index 0000000..5524006 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/arm.rs @@ -0,0 +1,4 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/mod.rs new file mode 100644 index 0000000..c337a82 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/mod.rs @@ -0,0 +1,1930 @@ +//! Interface to VxWorks C library + +use core::mem::size_of; +use core::ptr::null_mut; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum DIR {} +impl ::Copy for DIR {} +impl ::Clone for DIR { + fn clone(&self) -> DIR { + *self + } +} + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type uintptr_t = usize; +pub type intptr_t = isize; +pub type ptrdiff_t = isize; +pub type size_t = ::uintptr_t; +pub type ssize_t = ::intptr_t; + +pub type pid_t = ::c_int; +pub type in_addr_t = u32; +pub type sighandler_t = ::size_t; +pub type cpuset_t = u32; + +pub type blkcnt_t = ::c_long; +pub type blksize_t = ::c_long; +pub type ino_t = ::c_ulong; + +pub type rlim_t = ::c_ulong; +pub type suseconds_t = ::c_long; +pub type time_t = ::c_long; + +pub type errno_t = ::c_int; + +pub type useconds_t = ::c_ulong; + +pub type socklen_t = ::c_uint; + +pub type pthread_t = ::c_ulong; + +pub type clockid_t = ::c_int; + +//defined for the structs +pub type dev_t = ::c_ulong; +pub type mode_t = ::c_int; +pub type nlink_t = ::c_ulong; +pub type uid_t = ::c_ushort; +pub type gid_t = ::c_ushort; +pub type sigset_t = ::c_ulonglong; +pub type key_t = ::c_long; + +pub type nfds_t = ::c_uint; +pub type stat64 = ::stat; + +pub type pthread_key_t = ::c_ulong; + +// From b_off_t.h +pub type off_t = ::c_longlong; +pub type off64_t = off_t; + +// From b_BOOL.h +pub type BOOL = ::c_int; + +// From vxWind.h .. +pub type _Vx_OBJ_HANDLE = ::c_int; +pub type _Vx_TASK_ID = ::_Vx_OBJ_HANDLE; +pub type _Vx_MSG_Q_ID = ::_Vx_OBJ_HANDLE; +pub type _Vx_SEM_ID_KERNEL = ::_Vx_OBJ_HANDLE; +pub type _Vx_RTP_ID = ::_Vx_OBJ_HANDLE; +pub type _Vx_SD_ID = ::_Vx_OBJ_HANDLE; +pub type _Vx_CONDVAR_ID = ::_Vx_OBJ_HANDLE; +pub type _Vx_SEM_ID = *mut ::_Vx_semaphore; +pub type OBJ_HANDLE = ::_Vx_OBJ_HANDLE; +pub type TASK_ID = ::OBJ_HANDLE; +pub type MSG_Q_ID = ::OBJ_HANDLE; +pub type SEM_ID_KERNEL = ::OBJ_HANDLE; +pub type RTP_ID = ::OBJ_HANDLE; +pub type SD_ID = ::OBJ_HANDLE; +pub type CONDVAR_ID = ::OBJ_HANDLE; + +// From vxTypes.h +pub type _Vx_usr_arg_t = isize; +pub type _Vx_exit_code_t = isize; +pub type _Vx_ticks_t = ::c_uint; +pub type _Vx_ticks64_t = ::c_ulonglong; + +pub type sa_family_t = ::c_uchar; + +// mqueue.h +pub type mqd_t = ::c_int; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum _Vx_semaphore {} +impl ::Copy for _Vx_semaphore {} +impl ::Clone for _Vx_semaphore { + fn clone(&self) -> _Vx_semaphore { + *self + } +} + +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + self.si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.si_status + } +} + +s! { + // b_pthread_condattr_t.h + pub struct pthread_condattr_t { + pub condAttrStatus: ::c_int, + pub condAttrPshared: ::c_int, + pub condAttrClockId: ::clockid_t, + } + + // b_pthread_cond_t.h + pub struct pthread_cond_t{ + pub condSemId: ::_Vx_SEM_ID, + pub condValid: ::c_int, + pub condInitted: ::c_int, + pub condRefCount: ::c_int, + pub condMutex: *mut ::pthread_mutex_t, + pub condAttr: ::pthread_condattr_t, + pub condSemName: [::c_char; _PTHREAD_SHARED_SEM_NAME_MAX] + } + + // b_pthread_rwlockattr_t.h + pub struct pthread_rwlockattr_t { + pub rwlockAttrStatus: ::c_int, + pub rwlockAttrPshared: ::c_int, + pub rwlockAttrMaxReaders: ::c_uint, + pub rwlockAttrConformOpt: ::c_uint, + } + + // b_pthread_rwlock_t.h + pub struct pthread_rwlock_t { + pub rwlockSemId: :: _Vx_SEM_ID, + pub rwlockReadersRefCount: ::c_uint, + pub rwlockValid: ::c_int, + pub rwlockInitted: ::c_int, + pub rwlockAttr: ::pthread_rwlockattr_t, + pub rwlockSemName: [::c_char; _PTHREAD_SHARED_SEM_NAME_MAX] + } + + // b_struct_timeval.h + pub struct timeval { + pub tv_sec: ::time_t, + pub tv_usec: ::suseconds_t, + } + + // socket.h + pub struct linger { + pub l_onoff: ::c_int, + pub l_linger: ::c_int, + } + + pub struct sockaddr { + pub sa_len : ::c_uchar, + pub sa_family : sa_family_t, + pub sa_data : [::c_char; 14], + } + + pub struct iovec { + pub iov_base: *mut ::c_void, + pub iov_len: ::size_t, + } + + pub struct msghdr { + pub msg_name: *mut c_void, + pub msg_namelen: socklen_t, + pub msg_iov: *mut iovec, + pub msg_iovlen: ::c_int, + pub msg_control: *mut c_void, + pub msg_controllen: socklen_t, + pub msg_flags: ::c_int, + } + + pub struct cmsghdr { + pub cmsg_len: socklen_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } + + // poll.h + pub struct pollfd { + pub fd : ::c_int, + pub events : ::c_short, + pub revents : ::c_short, + } + + // resource.h + pub struct rlimit { + pub rlim_cur : ::rlim_t, + pub rlim_max : ::rlim_t, + } + + // stat.h + pub struct stat { + pub st_dev : ::dev_t, + pub st_ino : ::ino_t, + pub st_mode : ::mode_t, + pub st_nlink : ::nlink_t, + pub st_uid : ::uid_t, + pub st_gid : ::gid_t, + pub st_rdev : ::dev_t, + pub st_size : ::off_t, + pub st_atime : ::time_t, + pub st_mtime : ::time_t, + pub st_ctime : ::time_t, + pub st_blksize : ::blksize_t, + pub st_blocks : ::blkcnt_t, + pub st_attrib : ::c_uchar, + pub st_reserved1 : ::c_int, + pub st_reserved2 : ::c_int, + pub st_reserved3 : ::c_int, + pub st_reserved4 : ::c_int, + } + + //b_struct__Timespec.h + pub struct _Timespec { + pub tv_sec : ::time_t, + pub tv_nsec : ::c_long, + } + + // b_struct__Sched_param.h + pub struct _Sched_param { + pub sched_priority: ::c_int, /* scheduling priority */ + pub sched_ss_low_priority: ::c_int, /* low scheduling priority */ + pub sched_ss_repl_period: ::_Timespec, /* replenishment period */ + pub sched_ss_init_budget: ::_Timespec, /* initial budget */ + pub sched_ss_max_repl: ::c_int, /* max pending replenishment */ + + } + + // b_pthread_attr_t.h + pub struct pthread_attr_t { + pub threadAttrStatus : ::c_int, + pub threadAttrStacksize : ::size_t, + pub threadAttrStackaddr : *mut ::c_void, + pub threadAttrGuardsize : ::size_t, + pub threadAttrDetachstate : ::c_int, + pub threadAttrContentionscope : ::c_int, + pub threadAttrInheritsched : ::c_int, + pub threadAttrSchedpolicy : ::c_int, + pub threadAttrName : *mut ::c_char, + pub threadAttrOptions : ::c_int, + pub threadAttrSchedparam : ::_Sched_param, + } + + // signal.h + + pub struct sigaction { + pub sa_u : ::sa_u_t, + pub sa_mask : ::sigset_t, + pub sa_flags : ::c_int, + } + + // b_stack_t.h + pub struct stack_t { + pub ss_sp : *mut ::c_void, + pub ss_size : ::size_t, + pub ss_flags : ::c_int, + } + + // signal.h + pub struct siginfo_t { + pub si_signo : ::c_int, + pub si_code : ::c_int, + pub si_value : ::sigval, + pub si_errno : ::c_int, + pub si_status: ::c_int, + pub si_addr: *mut ::c_void, + pub si_uid: ::uid_t, + pub si_pid: ::pid_t, + } + + // pthread.h (krnl) + // b_pthread_mutexattr_t.h (usr) + pub struct pthread_mutexattr_t { + mutexAttrStatus : ::c_int, + mutexAttrPshared : ::c_int, + mutexAttrProtocol : ::c_int, + mutexAttrPrioceiling : ::c_int, + mutexAttrType : ::c_int, + } + + // pthread.h (krnl) + // b_pthread_mutex_t.h (usr) + pub struct pthread_mutex_t { + pub mutexSemId: ::_Vx_SEM_ID, /*_Vx_SEM_ID ..*/ + pub mutexValid: ::c_int, + pub mutexInitted: ::c_int, + pub mutexCondRefCount: ::c_int, + pub mutexSavPriority: ::c_int, + pub mutexAttr: ::pthread_mutexattr_t, + pub mutexSemName: [::c_char; _PTHREAD_SHARED_SEM_NAME_MAX], + } + + // b_struct_timespec.h + pub struct timespec { + pub tv_sec: ::time_t, + pub tv_nsec: ::c_long, + } + + // time.h + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + } + + // in.h + pub struct in_addr { + pub s_addr: in_addr_t, + } + + // in.h + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + // in6.h + #[repr(align(4))] + pub struct in6_addr { + pub s6_addr: [u8; 16], + } + + // in6.h + pub struct ipv6_mreq { + pub ipv6mr_multiaddr: in6_addr, + pub ipv6mr_interface: ::c_uint, + } + + // netdb.h + pub struct addrinfo { + pub ai_flags : ::c_int, + pub ai_family : ::c_int, + pub ai_socktype : ::c_int, + pub ai_protocol : ::c_int, + pub ai_addrlen : ::size_t, + pub ai_canonname: *mut ::c_char, + pub ai_addr : *mut ::sockaddr, + pub ai_next : *mut ::addrinfo, + } + + // in.h + pub struct sockaddr_in { + pub sin_len : u8, + pub sin_family: u8, + pub sin_port : u16, + pub sin_addr : ::in_addr, + pub sin_zero : [::c_char; 8], + } + + // in6.h + pub struct sockaddr_in6 { + pub sin6_len : u8, + pub sin6_family : u8, + pub sin6_port : u16, + pub sin6_flowinfo: u32, + pub sin6_addr : ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct Dl_info { + pub dli_fname: *const ::c_char, + pub dli_fbase: *mut ::c_void, + pub dli_sname: *const ::c_char, + pub dli_saddr: *mut ::c_void, + } + + pub struct mq_attr { + pub mq_maxmsg: ::c_long, + pub mq_msgsize: ::c_long, + pub mq_flags: ::c_long, + pub mq_curmsgs: ::c_long, + } +} + +s_no_extra_traits! { + // dirent.h + pub struct dirent { + pub d_ino : ::ino_t, + pub d_name : [::c_char; _PARM_NAME_MAX as usize + 1], + } + + pub struct sockaddr_un { + pub sun_len: u8, + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 104] + } + + // rtpLibCommon.h + pub struct RTP_DESC { + pub status : ::c_int, + pub options : u32, + pub entrAddr : *mut ::c_void, + pub initTaskId: ::TASK_ID, + pub parentId : ::RTP_ID, + pub pathName : [::c_char; VX_RTP_NAME_LENGTH as usize + 1], + pub taskCnt : ::c_int, + pub textStart : *mut ::c_void, + pub textEnd : *mut ::c_void, + } + // socket.h + pub struct sockaddr_storage { + pub ss_len : ::c_uchar, + pub ss_family : ::sa_family_t, + pub __ss_pad1 : [::c_char; _SS_PAD1SIZE], + pub __ss_align : i32, + pub __ss_pad2 : [::c_char; _SS_PAD2SIZE], + } + + pub union sa_u_t { + pub sa_handler : ::Option !>, + pub sa_sigaction: ::Option !>, + } + + pub union sigval { + pub sival_int : ::c_int, + pub sival_ptr : *mut ::c_void, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_name", &&self.d_name[..]) + .finish() + } + } + + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_len", &self.sun_len) + .field("sun_family", &self.sun_family) + .field("sun_path", &&self.sun_path[..]) + .finish() + } + } + + impl ::fmt::Debug for RTP_DESC { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("RTP_DESC") + .field("status", &self.status) + .field("options", &self.options) + .field("entrAddr", &self.entrAddr) + .field("initTaskId", &self.initTaskId) + .field("parentId", &self.parentId) + .field("pathName", &&self.pathName[..]) + .field("taskCnt", &self.taskCnt) + .field("textStart", &self.textStart) + .field("textEnd", &self.textEnd) + .finish() + } + } + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("ss_len", &self.ss_len) + .field("ss_family", &self.ss_family) + .field("__ss_pad1", &&self.__ss_pad1[..]) + .field("__ss_align", &self.__ss_align) + .field("__ss_pad2", &&self.__ss_pad2[..]) + .finish() + } + } + + impl PartialEq for sa_u_t { + fn eq(&self, other: &sa_u_t) -> bool { + unsafe { + let h1 = match self.sa_handler { + Some(handler) => handler as usize, + None => 0 as usize, + }; + let h2 = match other.sa_handler { + Some(handler) => handler as usize, + None => 0 as usize, + }; + h1 == h2 + } + } + } + impl Eq for sa_u_t {} + impl ::fmt::Debug for sa_u_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + unsafe { + let h = match self.sa_handler { + Some(handler) => handler as usize, + None => 0 as usize, + }; + + f.debug_struct("sa_u_t") + .field("sa_handler", &h) + .finish() + } + } + } + impl ::hash::Hash for sa_u_t { + fn hash(&self, state: &mut H) { + unsafe { + let h = match self.sa_handler { + Some(handler) => handler as usize, + None => 0 as usize, + }; + h.hash(state) + } + } + } + + impl PartialEq for sigval { + fn eq(&self, other: &sigval) -> bool { + unsafe { self.sival_ptr as usize == other.sival_ptr as usize } + } + } + impl Eq for sigval {} + impl ::fmt::Debug for sigval { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sigval") + .field("sival_ptr", unsafe { &(self.sival_ptr as usize) }) + .finish() + } + } + impl ::hash::Hash for sigval { + fn hash(&self, state: &mut H) { + unsafe { (self.sival_ptr as usize).hash(state) }; + } + } + } +} + +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const EXIT_SUCCESS: ::c_int = 0; +pub const EXIT_FAILURE: ::c_int = 1; + +pub const EAI_SERVICE: ::c_int = 9; +pub const EAI_SOCKTYPE: ::c_int = 10; +pub const EAI_SYSTEM: ::c_int = 11; + +// This is not defined in vxWorks, but we have to define it here +// to make the building pass for getrandom and libstd, FIXME +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; + +//Clock Lib Stuff +pub const CLOCK_REALTIME: ::c_int = 0x0; +pub const CLOCK_MONOTONIC: ::c_int = 0x1; +pub const CLOCK_PROCESS_CPUTIME_ID: ::c_int = 0x2; +pub const CLOCK_THREAD_CPUTIME_ID: ::c_int = 0x3; +pub const TIMER_ABSTIME: ::c_int = 0x1; +pub const TIMER_RELTIME: ::c_int = 0x0; + +// PTHREAD STUFF +pub const PTHREAD_INITIALIZED_OBJ: ::c_int = 0xF70990EF; +pub const PTHREAD_DESTROYED_OBJ: ::c_int = -1; +pub const PTHREAD_VALID_OBJ: ::c_int = 0xEC542A37; +pub const PTHREAD_INVALID_OBJ: ::c_int = -1; +pub const PTHREAD_UNUSED_YET_OBJ: ::c_int = -1; + +pub const PTHREAD_PRIO_NONE: ::c_int = 0; +pub const PTHREAD_PRIO_INHERIT: ::c_int = 1; +pub const PTHREAD_PRIO_PROTECT: ::c_int = 2; + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2; +pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; +pub const PTHREAD_STACK_MIN: usize = 4096; +pub const _PTHREAD_SHARED_SEM_NAME_MAX: usize = 30; + +// ERRNO STUFF +pub const OK: ::c_int = 0; +pub const EPERM: ::c_int = 1; /* Not owner */ +pub const ENOENT: ::c_int = 2; /* No such file or directory */ +pub const ESRCH: ::c_int = 3; /* No such process */ +pub const EINTR: ::c_int = 4; /* Interrupted system call */ +pub const EIO: ::c_int = 5; /* I/O error */ +pub const ENXIO: ::c_int = 6; /* No such device or address */ +pub const E2BIG: ::c_int = 7; /* Arg list too long */ +pub const ENOEXEC: ::c_int = 8; /* Exec format error */ +pub const EBADF: ::c_int = 9; /* Bad file number */ +pub const ECHILD: ::c_int = 10; /* No children */ +pub const EAGAIN: ::c_int = 11; /* No more processes */ +pub const ENOMEM: ::c_int = 12; /* Not enough core */ +pub const EACCES: ::c_int = 13; /* Permission denied */ +pub const EFAULT: ::c_int = 14; +pub const ENOTEMPTY: ::c_int = 15; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENAMETOOLONG: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDEADLK: ::c_int = 33; +pub const ERANGE: ::c_int = 38; +pub const EDESTADDRREQ: ::c_int = 40; +pub const EPROTOTYPE: ::c_int = 41; +pub const ENOPROTOOPT: ::c_int = 42; +pub const EPROTONOSUPPORT: ::c_int = 43; +pub const ESOCKTNOSUPPORT: ::c_int = 44; +pub const EOPNOTSUPP: ::c_int = 45; +pub const EPFNOSUPPORT: ::c_int = 46; +pub const EAFNOSUPPORT: ::c_int = 47; +pub const EADDRINUSE: ::c_int = 48; +pub const EADDRNOTAVAIL: ::c_int = 49; +pub const ENOTSOCK: ::c_int = 50; +pub const ENETUNREACH: ::c_int = 51; +pub const ENETRESET: ::c_int = 52; +pub const ECONNABORTED: ::c_int = 53; +pub const ECONNRESET: ::c_int = 54; +pub const ENOBUFS: ::c_int = 55; +pub const EISCONN: ::c_int = 56; +pub const ENOTCONN: ::c_int = 57; +pub const ESHUTDOWN: ::c_int = 58; +pub const ETOOMANYREFS: ::c_int = 59; +pub const ETIMEDOUT: ::c_int = 60; +pub const ECONNREFUSED: ::c_int = 61; +pub const ENETDOWN: ::c_int = 62; +pub const ETXTBSY: ::c_int = 63; +pub const ELOOP: ::c_int = 64; +pub const EHOSTUNREACH: ::c_int = 65; +pub const EINPROGRESS: ::c_int = 68; +pub const EALREADY: ::c_int = 69; +pub const EWOULDBLOCK: ::c_int = 70; +pub const ENOSYS: ::c_int = 71; +pub const EDQUOT: ::c_int = 83; +pub const ESTALE: ::c_int = 88; + +// NFS errnos: Refer to pkgs_v2/storage/fs/nfs/h/nfs/nfsCommon.h +const M_nfsStat: ::c_int = 48 << 16; +enum nfsstat { + NFSERR_REMOTE = 71, + NFSERR_WFLUSH = 99, + NFSERR_BADHANDLE = 10001, + NFSERR_NOT_SYNC = 10002, + NFSERR_BAD_COOKIE = 10003, + NFSERR_TOOSMALL = 10005, + NFSERR_BADTYPE = 10007, + NFSERR_JUKEBOX = 10008, +} + +pub const S_nfsLib_NFS_OK: ::c_int = OK; +pub const S_nfsLib_NFSERR_PERM: ::c_int = EPERM; +pub const S_nfsLib_NFSERR_NOENT: ::c_int = ENOENT; +pub const S_nfsLib_NFSERR_IO: ::c_int = EIO; +pub const S_nfsLib_NFSERR_NXIO: ::c_int = ENXIO; +pub const S_nfsLib_NFSERR_ACCESS: ::c_int = EACCES; +pub const S_nfsLib_NFSERR_EXIST: ::c_int = EEXIST; +pub const S_nfsLib_NFSERR_ENODEV: ::c_int = ENODEV; +pub const S_nfsLib_NFSERR_NOTDIR: ::c_int = ENOTDIR; +pub const S_nfsLib_NFSERR_ISDIR: ::c_int = EISDIR; +pub const S_nfsLib_NFSERR_INVAL: ::c_int = EINVAL; +pub const S_nfsLib_NFSERR_FBIG: ::c_int = EFBIG; +pub const S_nfsLib_NFSERR_NOSPC: ::c_int = ENOSPC; +pub const S_nfsLib_NFSERR_ROFS: ::c_int = EROFS; +pub const S_nfsLib_NFSERR_NAMETOOLONG: ::c_int = ENAMETOOLONG; +pub const S_nfsLib_NFSERR_NOTEMPTY: ::c_int = ENOTEMPTY; +pub const S_nfsLib_NFSERR_DQUOT: ::c_int = EDQUOT; +pub const S_nfsLib_NFSERR_STALE: ::c_int = ESTALE; +pub const S_nfsLib_NFSERR_WFLUSH: ::c_int = M_nfsStat | nfsstat::NFSERR_WFLUSH as ::c_int; +pub const S_nfsLib_NFSERR_REMOTE: ::c_int = M_nfsStat | nfsstat::NFSERR_REMOTE as ::c_int; +pub const S_nfsLib_NFSERR_BADHANDLE: ::c_int = M_nfsStat | nfsstat::NFSERR_BADHANDLE as ::c_int; +pub const S_nfsLib_NFSERR_NOT_SYNC: ::c_int = M_nfsStat | nfsstat::NFSERR_NOT_SYNC as ::c_int; +pub const S_nfsLib_NFSERR_BAD_COOKIE: ::c_int = M_nfsStat | nfsstat::NFSERR_BAD_COOKIE as ::c_int; +pub const S_nfsLib_NFSERR_NOTSUPP: ::c_int = EOPNOTSUPP; +pub const S_nfsLib_NFSERR_TOOSMALL: ::c_int = M_nfsStat | nfsstat::NFSERR_TOOSMALL as ::c_int; +pub const S_nfsLib_NFSERR_SERVERFAULT: ::c_int = EIO; +pub const S_nfsLib_NFSERR_BADTYPE: ::c_int = M_nfsStat | nfsstat::NFSERR_BADTYPE as ::c_int; +pub const S_nfsLib_NFSERR_JUKEBOX: ::c_int = M_nfsStat | nfsstat::NFSERR_JUKEBOX as ::c_int; + +// in.h +pub const IPPROTO_IP: ::c_int = 0; +pub const IPPROTO_IPV6: ::c_int = 41; + +pub const IP_TTL: ::c_int = 4; +pub const IP_MULTICAST_IF: ::c_int = 9; +pub const IP_MULTICAST_TTL: ::c_int = 10; +pub const IP_MULTICAST_LOOP: ::c_int = 11; +pub const IP_ADD_MEMBERSHIP: ::c_int = 12; +pub const IP_DROP_MEMBERSHIP: ::c_int = 13; + +// in6.h +pub const IPV6_V6ONLY: ::c_int = 1; +pub const IPV6_UNICAST_HOPS: ::c_int = 4; +pub const IPV6_MULTICAST_IF: ::c_int = 9; +pub const IPV6_MULTICAST_HOPS: ::c_int = 10; +pub const IPV6_MULTICAST_LOOP: ::c_int = 11; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 12; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 13; + +// STAT Stuff +pub const S_IFMT: ::c_int = 0xf000; +pub const S_IFIFO: ::c_int = 0x1000; +pub const S_IFCHR: ::c_int = 0x2000; +pub const S_IFDIR: ::c_int = 0x4000; +pub const S_IFBLK: ::c_int = 0x6000; +pub const S_IFREG: ::c_int = 0x8000; +pub const S_IFLNK: ::c_int = 0xa000; +pub const S_IFSHM: ::c_int = 0xb000; +pub const S_IFSOCK: ::c_int = 0xc000; +pub const S_ISUID: ::c_int = 0x0800; +pub const S_ISGID: ::c_int = 0x0400; +pub const S_ISTXT: ::c_int = 0x0200; +pub const S_IRUSR: ::c_int = 0x0100; +pub const S_IWUSR: ::c_int = 0x0080; +pub const S_IXUSR: ::c_int = 0x0040; +pub const S_IRWXU: ::c_int = 0x01c0; +pub const S_IRGRP: ::c_int = 0x0020; +pub const S_IWGRP: ::c_int = 0x0010; +pub const S_IXGRP: ::c_int = 0x0008; +pub const S_IRWXG: ::c_int = 0x0038; +pub const S_IROTH: ::c_int = 0x0004; +pub const S_IWOTH: ::c_int = 0x0002; +pub const S_IXOTH: ::c_int = 0x0001; +pub const S_IRWXO: ::c_int = 0x0007; + +// socket.h +pub const SOL_SOCKET: ::c_int = 0xffff; + +pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_RCVLOWAT: ::c_int = 0x0012; +pub const SO_SNDLOWAT: ::c_int = 0x0013; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_ACCEPTCONN: ::c_int = 0x001e; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_REUSEPORT: ::c_int = 0x0200; + +pub const SO_VLAN: ::c_int = 0x8000; + +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_BINDTODEVICE: ::c_int = 0x1010; +pub const SO_OOBINLINE: ::c_int = 0x1011; +pub const SO_CONNTIMEO: ::c_int = 0x100a; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; +pub const SOCK_RDM: ::c_int = 4; +pub const SOCK_SEQPACKET: ::c_int = 5; +pub const SOCK_PACKET: ::c_int = 10; + +pub const _SS_MAXSIZE: usize = 128; +pub const _SS_ALIGNSIZE: usize = size_of::(); +pub const _SS_PAD1SIZE: usize = _SS_ALIGNSIZE - size_of::<::c_uchar>() - size_of::<::sa_family_t>(); +pub const _SS_PAD2SIZE: usize = _SS_MAXSIZE + - size_of::<::c_uchar>() + - size_of::<::sa_family_t>() + - _SS_PAD1SIZE + - _SS_ALIGNSIZE; + +pub const MSG_OOB: ::c_int = 0x0001; +pub const MSG_PEEK: ::c_int = 0x0002; +pub const MSG_DONTROUTE: ::c_int = 0x0004; +pub const MSG_EOR: ::c_int = 0x0008; +pub const MSG_TRUNC: ::c_int = 0x0010; +pub const MSG_CTRUNC: ::c_int = 0x0020; +pub const MSG_WAITALL: ::c_int = 0x0040; +pub const MSG_DONTWAIT: ::c_int = 0x0080; +pub const MSG_EOF: ::c_int = 0x0100; +pub const MSG_EXP: ::c_int = 0x0200; +pub const MSG_MBUF: ::c_int = 0x0400; +pub const MSG_NOTIFICATION: ::c_int = 0x0800; +pub const MSG_COMPAT: ::c_int = 0x8000; + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_LOCAL: ::c_int = 1; +pub const AF_UNIX: ::c_int = AF_LOCAL; +pub const AF_INET: ::c_int = 2; +pub const AF_NETLINK: ::c_int = 16; +pub const AF_ROUTE: ::c_int = 17; +pub const AF_LINK: ::c_int = 18; +pub const AF_PACKET: ::c_int = 19; +pub const pseudo_AF_KEY: ::c_int = 27; +pub const AF_KEY: ::c_int = pseudo_AF_KEY; +pub const AF_INET6: ::c_int = 28; +pub const AF_SOCKDEV: ::c_int = 31; +pub const AF_TIPC: ::c_int = 33; +pub const AF_MIPC: ::c_int = 34; +pub const AF_MIPC_SAFE: ::c_int = 35; +pub const AF_MAX: ::c_int = 37; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const IPPROTO_TCP: ::c_int = 6; +pub const TCP_NODELAY: ::c_int = 1; +pub const TCP_MAXSEG: ::c_int = 2; +pub const TCP_NOPUSH: ::c_int = 3; +pub const TCP_KEEPIDLE: ::c_int = 4; +pub const TCP_KEEPINTVL: ::c_int = 5; +pub const TCP_KEEPCNT: ::c_int = 6; + +// ioLib.h +pub const FIONREAD: ::c_int = 0x40040001; +pub const FIOFLUSH: ::c_int = 2; +pub const FIOOPTIONS: ::c_int = 3; +pub const FIOBAUDRATE: ::c_int = 4; +pub const FIODISKFORMAT: ::c_int = 5; +pub const FIODISKINIT: ::c_int = 6; +pub const FIOSEEK: ::c_int = 7; +pub const FIOWHERE: ::c_int = 8; +pub const FIODIRENTRY: ::c_int = 9; +pub const FIORENAME: ::c_int = 10; +pub const FIOREADYCHANGE: ::c_int = 11; +pub const FIODISKCHANGE: ::c_int = 13; +pub const FIOCANCEL: ::c_int = 14; +pub const FIOSQUEEZE: ::c_int = 15; +pub const FIOGETNAME: ::c_int = 18; +pub const FIONBIO: ::c_int = 0x90040010; + +// limits.h +pub const PATH_MAX: ::c_int = _PARM_PATH_MAX; +pub const _POSIX_PATH_MAX: ::c_int = 256; + +// Some poll stuff +pub const POLLIN: ::c_short = 0x0001; +pub const POLLPRI: ::c_short = 0x0002; +pub const POLLOUT: ::c_short = 0x0004; +pub const POLLRDNORM: ::c_short = 0x0040; +pub const POLLWRNORM: ::c_short = POLLOUT; +pub const POLLRDBAND: ::c_short = 0x0080; +pub const POLLWRBAND: ::c_short = 0x0100; +pub const POLLERR: ::c_short = 0x0008; +pub const POLLHUP: ::c_short = 0x0010; +pub const POLLNVAL: ::c_short = 0x0020; + +// fnctlcom.h +pub const FD_CLOEXEC: ::c_int = 1; +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_DUPFD_CLOEXEC: ::c_int = 14; + +// signal.h +pub const SIG_DFL: sighandler_t = 0 as sighandler_t; +pub const SIG_IGN: sighandler_t = 1 as sighandler_t; +pub const SIG_ERR: sighandler_t = -1 as isize as sighandler_t; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGTRAP: ::c_int = 5; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGBUS: ::c_int = 10; +pub const SIGSEGV: ::c_int = 11; +pub const SIGFMT: ::c_int = 12; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; +pub const SIGCNCL: ::c_int = 16; +pub const SIGSTOP: ::c_int = 17; +pub const SIGTSTP: ::c_int = 18; +pub const SIGCONT: ::c_int = 19; +pub const SIGCHLD: ::c_int = 20; +pub const SIGTTIN: ::c_int = 21; +pub const SIGTTOU: ::c_int = 22; + +pub const SIG_BLOCK: ::c_int = 1; +pub const SIG_UNBLOCK: ::c_int = 2; +pub const SIG_SETMASK: ::c_int = 3; + +pub const SI_SYNC: ::c_int = 0; +pub const SI_USER: ::c_int = -1; +pub const SI_QUEUE: ::c_int = -2; +pub const SI_TIMER: ::c_int = -3; +pub const SI_ASYNCIO: ::c_int = -4; +pub const SI_MESGQ: ::c_int = -5; +pub const SI_CHILD: ::c_int = -6; +pub const SI_KILL: ::c_int = SI_USER; + +// vxParams.h definitions +pub const _PARM_NAME_MAX: ::c_int = 255; +pub const _PARM_PATH_MAX: ::c_int = 1024; + +// WAIT STUFF +pub const WNOHANG: ::c_int = 0x01; +pub const WUNTRACED: ::c_int = 0x02; + +const PTHREAD_MUTEXATTR_INITIALIZER: pthread_mutexattr_t = pthread_mutexattr_t { + mutexAttrStatus: PTHREAD_INITIALIZED_OBJ, + mutexAttrProtocol: PTHREAD_PRIO_NONE, + mutexAttrPrioceiling: 0, + mutexAttrType: PTHREAD_MUTEX_DEFAULT, + mutexAttrPshared: 1, +}; +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + mutexSemId: null_mut(), + mutexValid: PTHREAD_VALID_OBJ, + mutexInitted: PTHREAD_UNUSED_YET_OBJ, + mutexCondRefCount: 0, + mutexSavPriority: -1, + mutexAttr: PTHREAD_MUTEXATTR_INITIALIZER, + mutexSemName: [0; _PTHREAD_SHARED_SEM_NAME_MAX], +}; + +const PTHREAD_CONDATTR_INITIALIZER: pthread_condattr_t = pthread_condattr_t { + condAttrStatus: 0xf70990ef, + condAttrPshared: 1, + condAttrClockId: CLOCK_REALTIME, +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + condSemId: null_mut(), + condValid: PTHREAD_VALID_OBJ, + condInitted: PTHREAD_UNUSED_YET_OBJ, + condRefCount: 0, + condMutex: null_mut(), + condAttr: PTHREAD_CONDATTR_INITIALIZER, + condSemName: [0; _PTHREAD_SHARED_SEM_NAME_MAX], +}; + +const PTHREAD_RWLOCKATTR_INITIALIZER: pthread_rwlockattr_t = pthread_rwlockattr_t { + rwlockAttrStatus: PTHREAD_INITIALIZED_OBJ, + rwlockAttrPshared: 1, + rwlockAttrMaxReaders: 0, + rwlockAttrConformOpt: 1, +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + rwlockSemId: null_mut(), + rwlockReadersRefCount: 0, + rwlockValid: PTHREAD_VALID_OBJ, + rwlockInitted: PTHREAD_UNUSED_YET_OBJ, + rwlockAttr: PTHREAD_RWLOCKATTR_INITIALIZER, + rwlockSemName: [0; _PTHREAD_SHARED_SEM_NAME_MAX], +}; + +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; + +// rtpLibCommon.h +pub const VX_RTP_NAME_LENGTH: ::c_int = 255; +pub const RTP_ID_ERROR: ::RTP_ID = -1; + +// h/public/unistd.h +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 21; // Via unistd.h +pub const _SC_PAGESIZE: ::c_int = 39; +pub const O_ACCMODE: ::c_int = 3; +pub const O_CLOEXEC: ::c_int = 0x100000; // fcntlcom +pub const O_EXCL: ::c_int = 0x0800; +pub const O_CREAT: ::c_int = 0x0200; +pub const O_TRUNC: ::c_int = 0x0400; +pub const O_APPEND: ::c_int = 0x0008; +pub const O_RDWR: ::c_int = 0x0002; +pub const O_WRONLY: ::c_int = 0x0001; +pub const O_RDONLY: ::c_int = 0; +pub const O_NONBLOCK: ::c_int = 0x4000; + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +impl ::Copy for FILE {} +impl ::Clone for FILE { + fn clone(&self) -> FILE { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos_t {} +impl ::Clone for fpos_t { + fn clone(&self) -> fpos_t { + *self + } +} + +f! { + pub {const} fn CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + let next = cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize) + + CMSG_ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next <= max { + (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } else { + 0 as *mut ::cmsghdr + } + } + + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize > 0 { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::())) + as ::c_uint + } + + pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + CMSG_ALIGN(::mem::size_of::()) as ::c_uint + length + } +} + +extern "C" { + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; + pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE; + pub fn fflush(file: *mut FILE) -> c_int; + pub fn fclose(file: *mut FILE) -> c_int; + pub fn remove(filename: *const c_char) -> c_int; + pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn getchar() -> c_int; + pub fn putchar(c: c_int) -> c_int; + pub fn fgetc(stream: *mut FILE) -> c_int; + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; + pub fn puts(s: *const c_char) -> c_int; + pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; + pub fn ftell(stream: *mut FILE) -> c_long; + pub fn rewind(stream: *mut FILE); + pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; + pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; + pub fn feof(stream: *mut FILE) -> c_int; + pub fn ferror(stream: *mut FILE) -> c_int; + pub fn perror(s: *const c_char); + pub fn atof(s: *const c_char) -> c_double; + pub fn atoi(s: *const c_char) -> c_int; + pub fn atol(s: *const c_char) -> c_long; + pub fn atoll(s: *const c_char) -> c_longlong; + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float; + pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; + pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + pub fn malloc(size: size_t) -> *mut c_void; + pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; + pub fn free(p: *mut c_void); + pub fn abort() -> !; + pub fn exit(status: c_int) -> !; + pub fn atexit(cb: extern "C" fn()) -> c_int; + pub fn system(s: *const c_char) -> c_int; + pub fn getenv(s: *const c_char) -> *mut c_char; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int; + pub fn strncasecmp(s1: *const c_char, s2: *const c_char, n: size_t) -> c_int; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + pub fn wcslen(buf: *const wchar_t) -> size_t; + pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; +} + +extern "C" { + pub fn fprintf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn printf(format: *const ::c_char, ...) -> ::c_int; + pub fn snprintf(s: *mut ::c_char, n: ::size_t, format: *const ::c_char, ...) -> ::c_int; + pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn scanf(format: *const ::c_char, ...) -> ::c_int; + pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn getchar_unlocked() -> ::c_int; + pub fn putchar_unlocked(c: ::c_int) -> ::c_int; + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn rewinddir(dirp: *mut ::DIR); + pub fn fchown(fd: ::c_int, owner: ::uid_t, group: ::gid_t) -> ::c_int; + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + pub fn alarm(seconds: ::c_uint) -> ::c_uint; + pub fn fchdir(dirfd: ::c_int) -> ::c_int; + pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int; + pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; + pub fn getegid() -> gid_t; + pub fn geteuid() -> uid_t; + pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t) -> ::c_int; + pub fn getlogin() -> *mut c_char; + pub fn getopt(argc: ::c_int, argv: *const *mut c_char, optstr: *const c_char) -> ::c_int; + pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; + pub fn pause() -> ::c_int; + pub fn seteuid(uid: uid_t) -> ::c_int; + pub fn setegid(gid: gid_t) -> ::c_int; + pub fn sleep(secs: ::c_uint) -> ::c_uint; + pub fn ttyname(fd: ::c_int) -> *mut c_char; + pub fn wait(status: *mut ::c_int) -> pid_t; + pub fn umask(mask: mode_t) -> mode_t; + pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int; + pub fn mlockall(flags: ::c_int) -> ::c_int; + pub fn munlockall() -> ::c_int; + + pub fn mmap( + addr: *mut ::c_void, + len: ::size_t, + prot: ::c_int, + flags: ::c_int, + fd: ::c_int, + offset: off_t, + ) -> *mut ::c_void; + pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int; + pub fn truncate(path: *const c_char, length: off_t) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn pthread_exit(value: *mut ::c_void) -> !; + pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, state: ::c_int) -> ::c_int; + + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int; + + pub fn sigaction(signum: ::c_int, act: *const sigaction, oldact: *mut sigaction) -> ::c_int; + + pub fn utimes(filename: *const ::c_char, times: *const ::timeval) -> ::c_int; + + #[link_name = "_rtld_dlopen"] + pub fn dlopen(filename: *const ::c_char, flag: ::c_int) -> *mut ::c_void; + + #[link_name = "_rtld_dlerror"] + pub fn dlerror() -> *mut ::c_char; + + #[link_name = "_rtld_dlsym"] + pub fn dlsym(handle: *mut ::c_void, symbol: *const ::c_char) -> *mut ::c_void; + + #[link_name = "_rtld_dlclose"] + pub fn dlclose(handle: *mut ::c_void) -> ::c_int; + + #[link_name = "_rtld_dladdr"] + pub fn dladdr(addr: *mut ::c_void, info: *mut Dl_info) -> ::c_int; + + // time.h + pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; + pub fn mktime(tm: *mut tm) -> time_t; + pub fn time(time: *mut time_t) -> time_t; + pub fn gmtime(time_p: *const time_t) -> *mut tm; + pub fn localtime(time_p: *const time_t) -> *mut tm; + pub fn timegm(tm: *mut tm) -> time_t; + pub fn difftime(time1: time_t, time0: time_t) -> ::c_double; + pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int; + pub fn usleep(secs: ::useconds_t) -> ::c_int; + pub fn putenv(string: *mut c_char) -> ::c_int; + pub fn setlocale(category: ::c_int, locale: *const ::c_char) -> *mut ::c_char; + + pub fn sigprocmask(how: ::c_int, set: *const sigset_t, oldset: *mut sigset_t) -> ::c_int; + pub fn sigpending(set: *mut sigset_t) -> ::c_int; + + pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int; + + pub fn fseeko(stream: *mut ::FILE, offset: ::off_t, whence: ::c_int) -> ::c_int; + pub fn ftello(stream: *mut ::FILE) -> ::off_t; + pub fn mkstemp(template: *mut ::c_char) -> ::c_int; + + pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char; + + pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int); + pub fn closelog(); + pub fn setlogmask(maskpri: ::c_int) -> ::c_int; + pub fn syslog(priority: ::c_int, message: *const ::c_char, ...); + pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t; + +} + +extern "C" { + // stdlib.h + pub fn memalign(block_size: ::size_t, size_arg: ::size_t) -> *mut ::c_void; + + // ioLib.h + pub fn getcwd(buf: *mut ::c_char, size: ::size_t) -> *mut ::c_char; + + // ioLib.h + pub fn chdir(attr: *const ::c_char) -> ::c_int; + + // pthread.h + pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_mutexattr_settype(pAttr: *mut ::pthread_mutexattr_t, pType: ::c_int) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_init( + mutex: *mut pthread_mutex_t, + attr: *const pthread_mutexattr_t, + ) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_destroy(mutex: *mut pthread_mutex_t) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_lock(mutex: *mut pthread_mutex_t) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_trylock(mutex: *mut pthread_mutex_t) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_timedlock(attr: *mut pthread_mutex_t, spec: *const timespec) -> ::c_int; + + // pthread.h + pub fn pthread_mutex_unlock(mutex: *mut pthread_mutex_t) -> ::c_int; + + // pthread.h + pub fn pthread_attr_setname(pAttr: *mut ::pthread_attr_t, name: *mut ::c_char) -> ::c_int; + + // pthread.h + pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, stacksize: ::size_t) -> ::c_int; + + // pthread.h + pub fn pthread_attr_getstacksize(attr: *const ::pthread_attr_t, size: *mut ::size_t) + -> ::c_int; + + // pthread.h + pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; + + // pthread.h + pub fn pthread_create( + pThread: *mut ::pthread_t, + pAttr: *const ::pthread_attr_t, + start_routine: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; + + // pthread.h + pub fn pthread_attr_destroy(thread: *mut ::pthread_attr_t) -> ::c_int; + + // pthread.h + pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; + + // int pthread_atfork (void (*)(void), void (*)(void), void (*)(void)); + pub fn pthread_atfork( + prepare: ::Option, + parent: ::Option, + child: ::Option, + ) -> ::c_int; + // stat.h + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + + // stat.h + pub fn lstat(path: *const ::c_char, buf: *mut stat) -> ::c_int; + + // unistd.h + pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; + + // dirent.h + pub fn readdir_r(pDir: *mut ::DIR, entry: *mut ::dirent, result: *mut *mut ::dirent) + -> ::c_int; + + // dirent.h + pub fn readdir(pDir: *mut ::DIR) -> *mut ::dirent; + + // fcntl.h or + // ioLib.h + pub fn open(path: *const ::c_char, oflag: ::c_int, ...) -> ::c_int; + + // poll.h + pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; + + // pthread.h + pub fn pthread_condattr_init(attr: *mut ::pthread_condattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_condattr_destroy(attr: *mut ::pthread_condattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_condattr_getclock( + pAttr: *const ::pthread_condattr_t, + pClockId: *mut ::clockid_t, + ) -> ::c_int; + + // pthread.h + pub fn pthread_condattr_setclock( + pAttr: *mut ::pthread_condattr_t, + clockId: ::clockid_t, + ) -> ::c_int; + + // pthread.h + pub fn pthread_cond_init( + cond: *mut ::pthread_cond_t, + attr: *const ::pthread_condattr_t, + ) -> ::c_int; + + // pthread.h + pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int; + + // pthread.h + pub fn pthread_cond_signal(cond: *mut ::pthread_cond_t) -> ::c_int; + + // pthread.h + pub fn pthread_cond_broadcast(cond: *mut ::pthread_cond_t) -> ::c_int; + + // pthread.h + pub fn pthread_cond_wait(cond: *mut ::pthread_cond_t, mutex: *mut ::pthread_mutex_t) + -> ::c_int; + + // pthread.h + pub fn pthread_rwlockattr_init(attr: *mut ::pthread_rwlockattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlockattr_destroy(attr: *mut ::pthread_rwlockattr_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlockattr_setmaxreaders( + attr: *mut ::pthread_rwlockattr_t, + attr2: ::c_uint, + ) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_init( + attr: *mut ::pthread_rwlock_t, + host: *const ::pthread_rwlockattr_t, + ) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_destroy(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_rdlock(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_tryrdlock(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_timedrdlock( + attr: *mut ::pthread_rwlock_t, + host: *const ::timespec, + ) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_wrlock(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_trywrlock(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_timedwrlock( + attr: *mut ::pthread_rwlock_t, + host: *const ::timespec, + ) -> ::c_int; + + // pthread.h + pub fn pthread_rwlock_unlock(attr: *mut ::pthread_rwlock_t) -> ::c_int; + + // pthread.h + pub fn pthread_key_create( + key: *mut ::pthread_key_t, + dtor: ::Option, + ) -> ::c_int; + + // pthread.h + pub fn pthread_key_delete(key: ::pthread_key_t) -> ::c_int; + + // pthread.h + pub fn pthread_setspecific(key: ::pthread_key_t, value: *const ::c_void) -> ::c_int; + + // pthread.h + pub fn pthread_getspecific(key: ::pthread_key_t) -> *mut ::c_void; + + // pthread.h + pub fn pthread_cond_timedwait( + cond: *mut ::pthread_cond_t, + mutex: *mut ::pthread_mutex_t, + abstime: *const ::timespec, + ) -> ::c_int; + + // pthread.h + pub fn pthread_attr_getname(attr: *mut ::pthread_attr_t, name: *mut *mut ::c_char) -> ::c_int; + + // pthread.h + pub fn pthread_join(thread: ::pthread_t, status: *mut *mut ::c_void) -> ::c_int; + + // pthread.h + pub fn pthread_self() -> ::pthread_t; + + // clockLib.h + pub fn clock_gettime(clock_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + + // clockLib.h + pub fn clock_settime(clock_id: ::clockid_t, tp: *const ::timespec) -> ::c_int; + + // clockLib.h + pub fn clock_getres(clock_id: ::clockid_t, res: *mut ::timespec) -> ::c_int; + + // clockLib.h + pub fn clock_nanosleep( + clock_id: ::clockid_t, + flags: ::c_int, + rqtp: *const ::timespec, + rmtp: *mut ::timespec, + ) -> ::c_int; + + // timerLib.h + pub fn nanosleep(rqtp: *const ::timespec, rmtp: *mut ::timespec) -> ::c_int; + + // socket.h + pub fn accept(s: ::c_int, addr: *mut ::sockaddr, addrlen: *mut ::socklen_t) -> ::c_int; + + // socket.h + pub fn bind(fd: ::c_int, addr: *const sockaddr, len: socklen_t) -> ::c_int; + + // socket.h + pub fn connect(s: ::c_int, name: *const ::sockaddr, namelen: ::socklen_t) -> ::c_int; + + // socket.h + pub fn getpeername(s: ::c_int, name: *mut ::sockaddr, namelen: *mut ::socklen_t) -> ::c_int; + + // socket.h + pub fn getsockname( + socket: ::c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, + ) -> ::c_int; + + // socket.h + pub fn getsockopt( + sockfd: ::c_int, + level: ::c_int, + optname: ::c_int, + optval: *mut ::c_void, + optlen: *mut ::socklen_t, + ) -> ::c_int; + + // socket.h + pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int; + + // socket.h + pub fn recv(s: ::c_int, buf: *mut ::c_void, bufLen: ::size_t, flags: ::c_int) -> ::ssize_t; + + // socket.h + pub fn recvfrom( + s: ::c_int, + buf: *mut ::c_void, + bufLen: ::size_t, + flags: ::c_int, + from: *mut ::sockaddr, + pFromLen: *mut ::socklen_t, + ) -> ::ssize_t; + + pub fn recvmsg(socket: ::c_int, mp: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; + + // socket.h + pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + + pub fn sendmsg(socket: ::c_int, mp: *const ::msghdr, flags: ::c_int) -> ::ssize_t; + + // socket.h + pub fn sendto( + socket: ::c_int, + buf: *const ::c_void, + len: ::size_t, + flags: ::c_int, + addr: *const sockaddr, + addrlen: socklen_t, + ) -> ::ssize_t; + + // socket.h + pub fn setsockopt( + socket: ::c_int, + level: ::c_int, + name: ::c_int, + value: *const ::c_void, + option_len: socklen_t, + ) -> ::c_int; + + // socket.h + pub fn shutdown(s: ::c_int, how: ::c_int) -> ::c_int; + + // socket.h + pub fn socket(domain: ::c_int, _type: ::c_int, protocol: ::c_int) -> ::c_int; + + // icotl.h + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + // fcntl.h + pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; + + // ntp_rfc2553.h for kernel + // netdb.h for user + pub fn gai_strerror(errcode: ::c_int) -> *mut ::c_char; + + // ioLib.h or + // unistd.h + pub fn close(fd: ::c_int) -> ::c_int; + + // ioLib.h or + // unistd.h + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) -> ::ssize_t; + + // ioLib.h or + // unistd.h + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t) -> ::ssize_t; + + // ioLib.h or + // unistd.h + pub fn isatty(fd: ::c_int) -> ::c_int; + + // ioLib.h or + // unistd.h + pub fn dup(src: ::c_int) -> ::c_int; + + // ioLib.h or + // unistd.h + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + + // ioLib.h or + // unistd.h + pub fn pipe(fds: *mut ::c_int) -> ::c_int; + + // ioLib.h or + // unistd.h + pub fn unlink(pathname: *const ::c_char) -> ::c_int; + + // unistd.h and + // ioLib.h + pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; + + // netdb.h + pub fn getaddrinfo( + node: *const ::c_char, + service: *const ::c_char, + hints: *const addrinfo, + res: *mut *mut addrinfo, + ) -> ::c_int; + + // netdb.h + pub fn freeaddrinfo(res: *mut addrinfo); + + // signal.h + pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t; + + // unistd.h + pub fn getpid() -> pid_t; + + // unistd.h + pub fn getppid() -> pid_t; + + // wait.h + pub fn waitpid(pid: pid_t, status: *mut ::c_int, optons: ::c_int) -> pid_t; + + // unistd.h + pub fn sysconf(attr: ::c_int) -> ::c_long; + + // stdlib.h + pub fn setenv( + // setenv.c + envVarName: *const ::c_char, + envVarValue: *const ::c_char, + overwrite: ::c_int, + ) -> ::c_int; + + // stdlib.h + pub fn unsetenv( + // setenv.c + envVarName: *const ::c_char, + ) -> ::c_int; + + // stdlib.h + pub fn realpath(fileName: *const ::c_char, resolvedName: *mut ::c_char) -> *mut ::c_char; + + // unistd.h + pub fn link(src: *const ::c_char, dst: *const ::c_char) -> ::c_int; + + // unistd.h + pub fn readlink(path: *const ::c_char, buf: *mut ::c_char, bufsize: ::size_t) -> ::ssize_t; + + // unistd.h + pub fn symlink(path1: *const ::c_char, path2: *const ::c_char) -> ::c_int; + + // dirent.h + pub fn opendir(name: *const ::c_char) -> *mut ::DIR; + + // unistd.h + pub fn rmdir(path: *const ::c_char) -> ::c_int; + + // stat.h + pub fn mkdir(dirName: *const ::c_char, mode: ::mode_t) -> ::c_int; + + // stat.h + pub fn chmod(path: *const ::c_char, mode: ::mode_t) -> ::c_int; + + // stat.h + pub fn fchmod(attr1: ::c_int, attr2: ::mode_t) -> ::c_int; + + // unistd.h + pub fn fsync(fd: ::c_int) -> ::c_int; + + // dirent.h + pub fn closedir(ptr: *mut ::DIR) -> ::c_int; + + // sched.h + pub fn sched_yield() -> ::c_int; + + // errnoLib.h + pub fn errnoSet(err: ::c_int) -> ::c_int; + + // errnoLib.h + pub fn errnoGet() -> ::c_int; + + // unistd.h + pub fn _exit(status: ::c_int) -> !; + + // unistd.h + pub fn setgid(gid: ::gid_t) -> ::c_int; + + // unistd.h + pub fn getgid() -> ::gid_t; + + // unistd.h + pub fn setuid(uid: ::uid_t) -> ::c_int; + + // unistd.h + pub fn getuid() -> ::uid_t; + + // signal.h + pub fn sigemptyset(__set: *mut sigset_t) -> ::c_int; + + // pthread.h for kernel + // signal.h for user + pub fn pthread_sigmask( + __how: ::c_int, + __set: *const sigset_t, + __oset: *mut sigset_t, + ) -> ::c_int; + + // signal.h for user + pub fn kill(__pid: pid_t, __signo: ::c_int) -> ::c_int; + + // signal.h for user + pub fn sigqueue(__pid: pid_t, __signo: ::c_int, __value: ::sigval) -> ::c_int; + + // signal.h for user + pub fn _sigqueue( + rtpId: ::RTP_ID, + signo: ::c_int, + pValue: *const ::sigval, + sigCode: ::c_int, + ) -> ::c_int; + + // signal.h + pub fn taskKill(taskId: ::TASK_ID, signo: ::c_int) -> ::c_int; + + // signal.h + pub fn raise(__signo: ::c_int) -> ::c_int; + + // taskLibCommon.h + pub fn taskIdSelf() -> ::TASK_ID; + pub fn taskDelay(ticks: ::_Vx_ticks_t) -> ::c_int; + + // rtpLibCommon.h + pub fn rtpInfoGet(rtpId: ::RTP_ID, rtpStruct: *mut ::RTP_DESC) -> ::c_int; + pub fn rtpSpawn( + pubrtpFileName: *const ::c_char, + argv: *mut *const ::c_char, + envp: *mut *const ::c_char, + priority: ::c_int, + uStackSize: ::size_t, + options: ::c_int, + taskOptions: ::c_int, + ) -> RTP_ID; + + // ioLib.h + pub fn _realpath(fileName: *const ::c_char, resolvedName: *mut ::c_char) -> *mut ::c_char; + + // pathLib.h + pub fn _pathIsAbsolute(filepath: *const ::c_char, pNameTail: *mut *const ::c_char) -> BOOL; + + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + + // randomNumGen.h + pub fn randBytes(buf: *mut c_uchar, length: c_int) -> c_int; + pub fn randABytes(buf: *mut c_uchar, length: c_int) -> c_int; + pub fn randUBytes(buf: *mut c_uchar, length: c_int) -> c_int; + pub fn randSecure() -> c_int; + + // mqueue.h + pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; + pub fn mq_close(mqd: ::mqd_t) -> ::c_int; + pub fn mq_unlink(name: *const ::c_char) -> ::c_int; + pub fn mq_receive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + ) -> ::ssize_t; + pub fn mq_timedreceive( + mqd: ::mqd_t, + msg_ptr: *mut ::c_char, + msg_len: ::size_t, + msg_prio: *mut ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::ssize_t; + pub fn mq_send( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + ) -> ::c_int; + pub fn mq_timedsend( + mqd: ::mqd_t, + msg_ptr: *const ::c_char, + msg_len: ::size_t, + msg_prio: ::c_uint, + abs_timeout: *const ::timespec, + ) -> ::c_int; + pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; + pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; +} + +//Dummy functions, these don't really exist in VxWorks. + +// wait.h macros +safe_f! { + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xFF00) == 0 + } + pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { + (status & 0xFF00) != 0 + } + pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { + (status & 0xFF0000) != 0 + } + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + status & 0xFF + } + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + (status >> 8) & 0xFF + } + pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { + (status >> 16) & 0xFF + } +} + +pub fn pread(_fd: ::c_int, _buf: *mut ::c_void, _count: ::size_t, _offset: off64_t) -> ::ssize_t { + -1 +} + +pub fn pwrite( + _fd: ::c_int, + _buf: *const ::c_void, + _count: ::size_t, + _offset: off64_t, +) -> ::ssize_t { + -1 +} +pub fn posix_memalign(memptr: *mut *mut ::c_void, align: ::size_t, size: ::size_t) -> ::c_int { + // check to see if align is a power of 2 and if align is a multiple + // of sizeof(void *) + if (align & align - 1 != 0) || (align as usize % size_of::<::size_t>() != 0) { + return ::EINVAL; + } + + unsafe { + // posix_memalign should not set errno + let e = ::errnoGet(); + + let temp = memalign(align, size); + ::errnoSet(e as ::c_int); + + if temp.is_null() { + ::ENOMEM + } else { + *memptr = temp; + 0 + } + } +} + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "arm"))] { + mod arm; + pub use self::arm::*; + } else if #[cfg(any(target_arch = "x86"))] { + mod x86; + pub use self::x86::*; + } else if #[cfg(any(target_arch = "x86_64"))] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(any(target_arch = "powerpc"))] { + mod powerpc; + pub use self::powerpc::*; + } else if #[cfg(any(target_arch = "powerpc64"))] { + mod powerpc64; + pub use self::powerpc64::*; + } else { + // Unknown target_arch + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc.rs new file mode 100644 index 0000000..5524006 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc.rs @@ -0,0 +1,4 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc64.rs new file mode 100644 index 0000000..4032488 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/powerpc64.rs @@ -0,0 +1,4 @@ +pub type c_char = u8; +pub type wchar_t = u32; +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86.rs new file mode 100644 index 0000000..e617bb8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86.rs @@ -0,0 +1,4 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type c_long = i32; +pub type c_ulong = u32; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86_64.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86_64.rs new file mode 100644 index 0000000..5e95ea2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/vxworks/x86_64.rs @@ -0,0 +1,4 @@ +pub type c_char = i8; +pub type wchar_t = i32; +pub type c_long = i64; +pub type c_ulong = u64; diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/wasi.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/wasi.rs new file mode 100644 index 0000000..1a855e0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/wasi.rs @@ -0,0 +1,830 @@ +use super::{Send, Sync}; + +pub use ffi::c_void; + +pub type c_char = i8; +pub type c_uchar = u8; +pub type c_schar = i8; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_long = i32; +pub type c_ulong = u32; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; +pub type size_t = usize; +pub type ssize_t = isize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type off_t = i64; +pub type pid_t = i32; +pub type clock_t = c_longlong; +pub type time_t = c_longlong; +pub type c_double = f64; +pub type c_float = f32; +pub type ino_t = u64; +pub type sigset_t = c_uchar; +pub type suseconds_t = c_longlong; +pub type mode_t = u32; +pub type dev_t = u64; +pub type uid_t = u32; +pub type gid_t = u32; +pub type nlink_t = u64; +pub type blksize_t = c_long; +pub type blkcnt_t = i64; +pub type nfds_t = c_ulong; +pub type wchar_t = i32; +pub type nl_item = c_int; +pub type __wasi_rights_t = u64; + +s_no_extra_traits! { + #[repr(align(16))] + #[allow(missing_debug_implementations)] + pub struct max_align_t { + priv_: [f64; 4] + } +} + +#[allow(missing_copy_implementations)] +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +#[allow(missing_copy_implementations)] +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum DIR {} +#[allow(missing_copy_implementations)] +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum __locale_struct {} + +pub type locale_t = *mut __locale_struct; + +s_paren! { + // in wasi-libc clockid_t is const struct __clockid* (where __clockid is an opaque struct), + // but that's an implementation detail that we don't want to have to deal with + #[repr(transparent)] + pub struct clockid_t(*const u8); +} + +unsafe impl Send for clockid_t {} +unsafe impl Sync for clockid_t {} + +s! { + #[repr(align(8))] + pub struct fpos_t { + data: [u8; 16], + } + + pub struct tm { + pub tm_sec: c_int, + pub tm_min: c_int, + pub tm_hour: c_int, + pub tm_mday: c_int, + pub tm_mon: c_int, + pub tm_year: c_int, + pub tm_wday: c_int, + pub tm_yday: c_int, + pub tm_isdst: c_int, + pub __tm_gmtoff: c_int, + pub __tm_zone: *const c_char, + pub __tm_nsec: c_int, + } + + pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: c_long, + } + + pub struct tms { + pub tms_utime: clock_t, + pub tms_stime: clock_t, + pub tms_cutime: clock_t, + pub tms_cstime: clock_t, + } + + pub struct itimerspec { + pub it_interval: timespec, + pub it_value: timespec, + } + + pub struct iovec { + pub iov_base: *mut c_void, + pub iov_len: size_t, + } + + pub struct lconv { + pub decimal_point: *mut c_char, + pub thousands_sep: *mut c_char, + pub grouping: *mut c_char, + pub int_curr_symbol: *mut c_char, + pub currency_symbol: *mut c_char, + pub mon_decimal_point: *mut c_char, + pub mon_thousands_sep: *mut c_char, + pub mon_grouping: *mut c_char, + pub positive_sign: *mut c_char, + pub negative_sign: *mut c_char, + pub int_frac_digits: c_char, + pub frac_digits: c_char, + pub p_cs_precedes: c_char, + pub p_sep_by_space: c_char, + pub n_cs_precedes: c_char, + pub n_sep_by_space: c_char, + pub p_sign_posn: c_char, + pub n_sign_posn: c_char, + pub int_p_cs_precedes: c_char, + pub int_p_sep_by_space: c_char, + pub int_n_cs_precedes: c_char, + pub int_n_sep_by_space: c_char, + pub int_p_sign_posn: c_char, + pub int_n_sign_posn: c_char, + } + + pub struct pollfd { + pub fd: c_int, + pub events: c_short, + pub revents: c_short, + } + + pub struct rusage { + pub ru_utime: timeval, + pub ru_stime: timeval, + } + + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_nlink: nlink_t, + pub st_mode: mode_t, + pub st_uid: uid_t, + pub st_gid: gid_t, + __pad0: c_uint, + pub st_rdev: dev_t, + pub st_size: off_t, + pub st_blksize: blksize_t, + pub st_blocks: blkcnt_t, + pub st_atim: timespec, + pub st_mtim: timespec, + pub st_ctim: timespec, + __reserved: [c_longlong; 3], + } +} + +// Declare dirent outside of s! so that it doesn't implement Copy, Eq, Hash, +// etc., since it contains a flexible array member with a dynamic size. +#[repr(C)] +#[allow(missing_copy_implementations)] +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub struct dirent { + pub d_ino: ino_t, + pub d_type: c_uchar, + /// d_name is declared in WASI libc as a flexible array member, which + /// can't be directly expressed in Rust. As an imperfect workaround, + /// declare it as a zero-length array instead. + pub d_name: [c_char; 0], +} + +pub const EXIT_SUCCESS: c_int = 0; +pub const EXIT_FAILURE: c_int = 1; +pub const STDIN_FILENO: c_int = 0; +pub const STDOUT_FILENO: c_int = 1; +pub const STDERR_FILENO: c_int = 2; +pub const SEEK_SET: c_int = 0; +pub const SEEK_CUR: c_int = 1; +pub const SEEK_END: c_int = 2; +pub const _IOFBF: c_int = 0; +pub const _IONBF: c_int = 2; +pub const _IOLBF: c_int = 1; +pub const F_GETFD: c_int = 1; +pub const F_SETFD: c_int = 2; +pub const F_GETFL: c_int = 3; +pub const F_SETFL: c_int = 4; +pub const FD_CLOEXEC: c_int = 1; +pub const FD_SETSIZE: size_t = 1024; +pub const O_APPEND: c_int = 0x0001; +pub const O_DSYNC: c_int = 0x0002; +pub const O_NONBLOCK: c_int = 0x0004; +pub const O_RSYNC: c_int = 0x0008; +pub const O_SYNC: c_int = 0x0010; +pub const O_CREAT: c_int = 0x0001 << 12; +pub const O_DIRECTORY: c_int = 0x0002 << 12; +pub const O_EXCL: c_int = 0x0004 << 12; +pub const O_TRUNC: c_int = 0x0008 << 12; +pub const O_NOFOLLOW: c_int = 0x01000000; +pub const O_EXEC: c_int = 0x02000000; +pub const O_RDONLY: c_int = 0x04000000; +pub const O_SEARCH: c_int = 0x08000000; +pub const O_WRONLY: c_int = 0x10000000; +pub const O_CLOEXEC: c_int = 0x0; +pub const O_RDWR: c_int = O_WRONLY | O_RDONLY; +pub const O_ACCMODE: c_int = O_EXEC | O_RDWR | O_SEARCH; +pub const O_NOCTTY: c_int = 0x0; +pub const POSIX_FADV_DONTNEED: c_int = 4; +pub const POSIX_FADV_NOREUSE: c_int = 5; +pub const POSIX_FADV_NORMAL: c_int = 0; +pub const POSIX_FADV_RANDOM: c_int = 2; +pub const POSIX_FADV_SEQUENTIAL: c_int = 1; +pub const POSIX_FADV_WILLNEED: c_int = 3; +pub const AT_FDCWD: ::c_int = -2; +pub const AT_EACCESS: c_int = 0x0; +pub const AT_SYMLINK_NOFOLLOW: c_int = 0x1; +pub const AT_SYMLINK_FOLLOW: c_int = 0x2; +pub const AT_REMOVEDIR: c_int = 0x4; +pub const UTIME_OMIT: c_long = 0xfffffffe; +pub const UTIME_NOW: c_long = 0xffffffff; +pub const S_IFIFO: mode_t = 49152; +pub const S_IFCHR: mode_t = 8192; +pub const S_IFBLK: mode_t = 24576; +pub const S_IFDIR: mode_t = 16384; +pub const S_IFREG: mode_t = 32768; +pub const S_IFLNK: mode_t = 40960; +pub const S_IFSOCK: mode_t = 49152; +pub const S_IFMT: mode_t = 57344; +pub const S_IRWXO: mode_t = 0x7; +pub const S_IXOTH: mode_t = 0x1; +pub const S_IWOTH: mode_t = 0x2; +pub const S_IROTH: mode_t = 0x4; +pub const S_IRWXG: mode_t = 0x38; +pub const S_IXGRP: mode_t = 0x8; +pub const S_IWGRP: mode_t = 0x10; +pub const S_IRGRP: mode_t = 0x20; +pub const S_IRWXU: mode_t = 0x1c0; +pub const S_IXUSR: mode_t = 0x40; +pub const S_IWUSR: mode_t = 0x80; +pub const S_IRUSR: mode_t = 0x100; +pub const S_ISVTX: mode_t = 0x200; +pub const S_ISGID: mode_t = 0x400; +pub const S_ISUID: mode_t = 0x800; +pub const DT_UNKNOWN: u8 = 0; +pub const DT_BLK: u8 = 1; +pub const DT_CHR: u8 = 2; +pub const DT_DIR: u8 = 3; +pub const DT_REG: u8 = 4; +pub const DT_LNK: u8 = 7; +pub const FIONREAD: c_int = 1; +pub const FIONBIO: c_int = 2; +pub const F_OK: ::c_int = 0; +pub const R_OK: ::c_int = 4; +pub const W_OK: ::c_int = 2; +pub const X_OK: ::c_int = 1; +pub const POLLIN: ::c_short = 0x1; +pub const POLLOUT: ::c_short = 0x2; +pub const POLLERR: ::c_short = 0x1000; +pub const POLLHUP: ::c_short = 0x2000; +pub const POLLNVAL: ::c_short = 0x4000; +pub const POLLRDNORM: ::c_short = 0x1; +pub const POLLWRNORM: ::c_short = 0x2; + +pub const E2BIG: c_int = 1; +pub const EACCES: c_int = 2; +pub const EADDRINUSE: c_int = 3; +pub const EADDRNOTAVAIL: c_int = 4; +pub const EAFNOSUPPORT: c_int = 5; +pub const EAGAIN: c_int = 6; +pub const EALREADY: c_int = 7; +pub const EBADF: c_int = 8; +pub const EBADMSG: c_int = 9; +pub const EBUSY: c_int = 10; +pub const ECANCELED: c_int = 11; +pub const ECHILD: c_int = 12; +pub const ECONNABORTED: c_int = 13; +pub const ECONNREFUSED: c_int = 14; +pub const ECONNRESET: c_int = 15; +pub const EDEADLK: c_int = 16; +pub const EDESTADDRREQ: c_int = 17; +pub const EDOM: c_int = 18; +pub const EDQUOT: c_int = 19; +pub const EEXIST: c_int = 20; +pub const EFAULT: c_int = 21; +pub const EFBIG: c_int = 22; +pub const EHOSTUNREACH: c_int = 23; +pub const EIDRM: c_int = 24; +pub const EILSEQ: c_int = 25; +pub const EINPROGRESS: c_int = 26; +pub const EINTR: c_int = 27; +pub const EINVAL: c_int = 28; +pub const EIO: c_int = 29; +pub const EISCONN: c_int = 30; +pub const EISDIR: c_int = 31; +pub const ELOOP: c_int = 32; +pub const EMFILE: c_int = 33; +pub const EMLINK: c_int = 34; +pub const EMSGSIZE: c_int = 35; +pub const EMULTIHOP: c_int = 36; +pub const ENAMETOOLONG: c_int = 37; +pub const ENETDOWN: c_int = 38; +pub const ENETRESET: c_int = 39; +pub const ENETUNREACH: c_int = 40; +pub const ENFILE: c_int = 41; +pub const ENOBUFS: c_int = 42; +pub const ENODEV: c_int = 43; +pub const ENOENT: c_int = 44; +pub const ENOEXEC: c_int = 45; +pub const ENOLCK: c_int = 46; +pub const ENOLINK: c_int = 47; +pub const ENOMEM: c_int = 48; +pub const ENOMSG: c_int = 49; +pub const ENOPROTOOPT: c_int = 50; +pub const ENOSPC: c_int = 51; +pub const ENOSYS: c_int = 52; +pub const ENOTCONN: c_int = 53; +pub const ENOTDIR: c_int = 54; +pub const ENOTEMPTY: c_int = 55; +pub const ENOTRECOVERABLE: c_int = 56; +pub const ENOTSOCK: c_int = 57; +pub const ENOTSUP: c_int = 58; +pub const ENOTTY: c_int = 59; +pub const ENXIO: c_int = 60; +pub const EOVERFLOW: c_int = 61; +pub const EOWNERDEAD: c_int = 62; +pub const EPERM: c_int = 63; +pub const EPIPE: c_int = 64; +pub const EPROTO: c_int = 65; +pub const EPROTONOSUPPORT: c_int = 66; +pub const EPROTOTYPE: c_int = 67; +pub const ERANGE: c_int = 68; +pub const EROFS: c_int = 69; +pub const ESPIPE: c_int = 70; +pub const ESRCH: c_int = 71; +pub const ESTALE: c_int = 72; +pub const ETIMEDOUT: c_int = 73; +pub const ETXTBSY: c_int = 74; +pub const EXDEV: c_int = 75; +pub const ENOTCAPABLE: c_int = 76; +pub const EOPNOTSUPP: c_int = ENOTSUP; +pub const EWOULDBLOCK: c_int = EAGAIN; + +pub const _SC_PAGESIZE: c_int = 30; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_IOV_MAX: c_int = 60; +pub const _SC_SYMLOOP_MAX: c_int = 173; + +pub static CLOCK_MONOTONIC: clockid_t = unsafe { clockid_t(ptr_addr_of!(_CLOCK_MONOTONIC)) }; +pub static CLOCK_PROCESS_CPUTIME_ID: clockid_t = + unsafe { clockid_t(ptr_addr_of!(_CLOCK_PROCESS_CPUTIME_ID)) }; +pub static CLOCK_REALTIME: clockid_t = unsafe { clockid_t(ptr_addr_of!(_CLOCK_REALTIME)) }; +pub static CLOCK_THREAD_CPUTIME_ID: clockid_t = + unsafe { clockid_t(ptr_addr_of!(_CLOCK_THREAD_CPUTIME_ID)) }; + +pub const ABDAY_1: ::nl_item = 0x20000; +pub const ABDAY_2: ::nl_item = 0x20001; +pub const ABDAY_3: ::nl_item = 0x20002; +pub const ABDAY_4: ::nl_item = 0x20003; +pub const ABDAY_5: ::nl_item = 0x20004; +pub const ABDAY_6: ::nl_item = 0x20005; +pub const ABDAY_7: ::nl_item = 0x20006; + +pub const DAY_1: ::nl_item = 0x20007; +pub const DAY_2: ::nl_item = 0x20008; +pub const DAY_3: ::nl_item = 0x20009; +pub const DAY_4: ::nl_item = 0x2000A; +pub const DAY_5: ::nl_item = 0x2000B; +pub const DAY_6: ::nl_item = 0x2000C; +pub const DAY_7: ::nl_item = 0x2000D; + +pub const ABMON_1: ::nl_item = 0x2000E; +pub const ABMON_2: ::nl_item = 0x2000F; +pub const ABMON_3: ::nl_item = 0x20010; +pub const ABMON_4: ::nl_item = 0x20011; +pub const ABMON_5: ::nl_item = 0x20012; +pub const ABMON_6: ::nl_item = 0x20013; +pub const ABMON_7: ::nl_item = 0x20014; +pub const ABMON_8: ::nl_item = 0x20015; +pub const ABMON_9: ::nl_item = 0x20016; +pub const ABMON_10: ::nl_item = 0x20017; +pub const ABMON_11: ::nl_item = 0x20018; +pub const ABMON_12: ::nl_item = 0x20019; + +pub const MON_1: ::nl_item = 0x2001A; +pub const MON_2: ::nl_item = 0x2001B; +pub const MON_3: ::nl_item = 0x2001C; +pub const MON_4: ::nl_item = 0x2001D; +pub const MON_5: ::nl_item = 0x2001E; +pub const MON_6: ::nl_item = 0x2001F; +pub const MON_7: ::nl_item = 0x20020; +pub const MON_8: ::nl_item = 0x20021; +pub const MON_9: ::nl_item = 0x20022; +pub const MON_10: ::nl_item = 0x20023; +pub const MON_11: ::nl_item = 0x20024; +pub const MON_12: ::nl_item = 0x20025; + +pub const AM_STR: ::nl_item = 0x20026; +pub const PM_STR: ::nl_item = 0x20027; + +pub const D_T_FMT: ::nl_item = 0x20028; +pub const D_FMT: ::nl_item = 0x20029; +pub const T_FMT: ::nl_item = 0x2002A; +pub const T_FMT_AMPM: ::nl_item = 0x2002B; + +pub const ERA: ::nl_item = 0x2002C; +pub const ERA_D_FMT: ::nl_item = 0x2002E; +pub const ALT_DIGITS: ::nl_item = 0x2002F; +pub const ERA_D_T_FMT: ::nl_item = 0x20030; +pub const ERA_T_FMT: ::nl_item = 0x20031; + +pub const CODESET: ::nl_item = 14; +pub const CRNCYSTR: ::nl_item = 0x4000F; +pub const RADIXCHAR: ::nl_item = 0x10000; +pub const THOUSEP: ::nl_item = 0x10001; +pub const YESEXPR: ::nl_item = 0x50000; +pub const NOEXPR: ::nl_item = 0x50001; +pub const YESSTR: ::nl_item = 0x50002; +pub const NOSTR: ::nl_item = 0x50003; + +#[cfg_attr( + feature = "rustc-dep-of-std", + link( + name = "c", + kind = "static", + modifiers = "-bundle", + cfg(target_feature = "crt-static") + ) +)] +#[cfg_attr( + feature = "rustc-dep-of-std", + link(name = "c", cfg(not(target_feature = "crt-static"))) +)] +extern "C" { + pub fn _Exit(code: c_int) -> !; + pub fn _exit(code: c_int) -> !; + pub fn abort() -> !; + pub fn aligned_alloc(a: size_t, b: size_t) -> *mut c_void; + pub fn calloc(amt: size_t, amt2: size_t) -> *mut c_void; + pub fn exit(code: c_int) -> !; + pub fn free(ptr: *mut c_void); + pub fn getenv(s: *const c_char) -> *mut c_char; + pub fn malloc(amt: size_t) -> *mut c_void; + pub fn malloc_usable_size(ptr: *mut c_void) -> size_t; + pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; + pub fn rand() -> c_int; + pub fn read(fd: c_int, ptr: *mut c_void, size: size_t) -> ssize_t; + pub fn realloc(ptr: *mut c_void, amt: size_t) -> *mut c_void; + pub fn setenv(k: *const c_char, v: *const c_char, a: c_int) -> c_int; + pub fn unsetenv(k: *const c_char) -> c_int; + pub fn clearenv() -> ::c_int; + pub fn write(fd: c_int, ptr: *const c_void, size: size_t) -> ssize_t; + pub static mut environ: *mut *mut c_char; + pub fn fopen(a: *const c_char, b: *const c_char) -> *mut FILE; + pub fn freopen(a: *const c_char, b: *const c_char, f: *mut FILE) -> *mut FILE; + pub fn fclose(f: *mut FILE) -> c_int; + pub fn remove(a: *const c_char) -> c_int; + pub fn rename(a: *const c_char, b: *const c_char) -> c_int; + pub fn feof(f: *mut FILE) -> c_int; + pub fn ferror(f: *mut FILE) -> c_int; + pub fn fflush(f: *mut FILE) -> c_int; + pub fn clearerr(f: *mut FILE); + pub fn fseek(f: *mut FILE, b: c_long, c: c_int) -> c_int; + pub fn ftell(f: *mut FILE) -> c_long; + pub fn rewind(f: *mut FILE); + pub fn fgetpos(f: *mut FILE, pos: *mut fpos_t) -> c_int; + pub fn fsetpos(f: *mut FILE, pos: *const fpos_t) -> c_int; + pub fn fread(buf: *mut c_void, a: size_t, b: size_t, f: *mut FILE) -> size_t; + pub fn fwrite(buf: *const c_void, a: size_t, b: size_t, f: *mut FILE) -> size_t; + pub fn fgetc(f: *mut FILE) -> c_int; + pub fn getc(f: *mut FILE) -> c_int; + pub fn getchar() -> c_int; + pub fn ungetc(a: c_int, f: *mut FILE) -> c_int; + pub fn fputc(a: c_int, f: *mut FILE) -> c_int; + pub fn putc(a: c_int, f: *mut FILE) -> c_int; + pub fn putchar(a: c_int) -> c_int; + pub fn fputs(a: *const c_char, f: *mut FILE) -> c_int; + pub fn puts(a: *const c_char) -> c_int; + pub fn perror(a: *const c_char); + pub fn srand(a: c_uint); + pub fn atexit(a: extern "C" fn()) -> c_int; + pub fn at_quick_exit(a: extern "C" fn()) -> c_int; + pub fn quick_exit(a: c_int) -> !; + pub fn posix_memalign(a: *mut *mut c_void, b: size_t, c: size_t) -> c_int; + pub fn rand_r(a: *mut c_uint) -> c_int; + pub fn random() -> c_long; + pub fn srandom(a: c_uint); + pub fn putenv(a: *mut c_char) -> c_int; + pub fn clock() -> clock_t; + pub fn time(a: *mut time_t) -> time_t; + pub fn difftime(a: time_t, b: time_t) -> c_double; + pub fn mktime(a: *mut tm) -> time_t; + pub fn strftime(a: *mut c_char, b: size_t, c: *const c_char, d: *const tm) -> size_t; + pub fn gmtime(a: *const time_t) -> *mut tm; + pub fn gmtime_r(a: *const time_t, b: *mut tm) -> *mut tm; + pub fn localtime(a: *const time_t) -> *mut tm; + pub fn localtime_r(a: *const time_t, b: *mut tm) -> *mut tm; + pub fn asctime_r(a: *const tm, b: *mut c_char) -> *mut c_char; + pub fn ctime_r(a: *const time_t, b: *mut c_char) -> *mut c_char; + + static _CLOCK_MONOTONIC: u8; + static _CLOCK_PROCESS_CPUTIME_ID: u8; + static _CLOCK_REALTIME: u8; + static _CLOCK_THREAD_CPUTIME_ID: u8; + pub fn nanosleep(a: *const timespec, b: *mut timespec) -> c_int; + pub fn clock_getres(a: clockid_t, b: *mut timespec) -> c_int; + pub fn clock_gettime(a: clockid_t, b: *mut timespec) -> c_int; + pub fn clock_nanosleep(a: clockid_t, a2: c_int, b: *const timespec, c: *mut timespec) -> c_int; + + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn atof(s: *const c_char) -> c_double; + pub fn atoi(s: *const c_char) -> c_int; + pub fn atol(s: *const c_char) -> c_long; + pub fn atoll(s: *const c_char) -> c_longlong; + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float; + pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; + pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strndup(cs: *const c_char, n: size_t) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int; + pub fn strncasecmp(s1: *const c_char, s2: *const c_char, n: size_t) -> c_int; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; + + pub fn fprintf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn printf(format: *const ::c_char, ...) -> ::c_int; + pub fn snprintf(s: *mut ::c_char, n: ::size_t, format: *const ::c_char, ...) -> ::c_int; + pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int; + pub fn scanf(format: *const ::c_char, ...) -> ::c_int; + pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; + pub fn getchar_unlocked() -> ::c_int; + pub fn putchar_unlocked(c: ::c_int) -> ::c_int; + + pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int; + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int; + pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int; + pub fn opendir(dirname: *const c_char) -> *mut ::DIR; + pub fn fdopendir(fd: ::c_int) -> *mut ::DIR; + pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; + pub fn closedir(dirp: *mut ::DIR) -> ::c_int; + pub fn rewinddir(dirp: *mut ::DIR); + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); + pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + + pub fn openat(dirfd: ::c_int, pathname: *const ::c_char, flags: ::c_int, ...) -> ::c_int; + pub fn fstatat( + dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut stat, + flags: ::c_int, + ) -> ::c_int; + pub fn linkat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + flags: ::c_int, + ) -> ::c_int; + pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; + pub fn readlinkat( + dirfd: ::c_int, + pathname: *const ::c_char, + buf: *mut ::c_char, + bufsiz: ::size_t, + ) -> ::ssize_t; + pub fn renameat( + olddirfd: ::c_int, + oldpath: *const ::c_char, + newdirfd: ::c_int, + newpath: *const ::c_char, + ) -> ::c_int; + pub fn symlinkat( + target: *const ::c_char, + newdirfd: ::c_int, + linkpath: *const ::c_char, + ) -> ::c_int; + pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char, flags: ::c_int) -> ::c_int; + + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + pub fn close(fd: ::c_int) -> ::c_int; + pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long; + pub fn getopt(argc: ::c_int, argv: *const *mut c_char, optstr: *const c_char) -> ::c_int; + pub fn isatty(fd: ::c_int) -> ::c_int; + pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int; + pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t; + pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long; + pub fn rmdir(path: *const c_char) -> ::c_int; + pub fn sleep(secs: ::c_uint) -> ::c_uint; + pub fn unlink(c: *const c_char) -> ::c_int; + pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t, offset: off_t) -> ::ssize_t; + + pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int; + + pub fn fsync(fd: ::c_int) -> ::c_int; + pub fn fdatasync(fd: ::c_int) -> ::c_int; + + pub fn symlink(path1: *const c_char, path2: *const c_char) -> ::c_int; + + pub fn truncate(path: *const c_char, length: off_t) -> ::c_int; + pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int; + + pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn times(buf: *mut ::tms) -> ::clock_t; + + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn usleep(secs: ::c_uint) -> ::c_int; + pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::ssize_t; + pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int; + pub fn setlocale(category: ::c_int, locale: *const ::c_char) -> *mut ::c_char; + pub fn localeconv() -> *mut lconv; + + pub fn readlink(path: *const c_char, buf: *mut c_char, bufsz: ::size_t) -> ::ssize_t; + + pub fn timegm(tm: *mut ::tm) -> time_t; + + pub fn sysconf(name: ::c_int) -> ::c_long; + + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + pub fn fseeko(stream: *mut ::FILE, offset: ::off_t, whence: ::c_int) -> ::c_int; + pub fn ftello(stream: *mut ::FILE) -> ::off_t; + pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; + + pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t; + + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, + mode: ::c_int, + flags: ::c_int, + ) -> ::c_int; + pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; + pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) + -> ::ssize_t; + pub fn preadv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; + pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; + pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; + pub fn utimensat( + dirfd: ::c_int, + path: *const ::c_char, + times: *const ::timespec, + flag: ::c_int, + ) -> ::c_int; + pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; + pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; + pub fn abs(i: c_int) -> c_int; + pub fn labs(i: c_long) -> c_long; + pub fn duplocale(base: ::locale_t) -> ::locale_t; + pub fn freelocale(loc: ::locale_t); + pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; + pub fn uselocale(loc: ::locale_t) -> ::locale_t; + pub fn sched_yield() -> ::c_int; + pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char; + pub fn chdir(dir: *const c_char) -> ::c_int; + + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; + pub fn nl_langinfo_l(item: ::nl_item, loc: ::locale_t) -> *mut ::c_char; + + pub fn __wasilibc_register_preopened_fd(fd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_fd_renumber(fd: c_int, newfd: c_int) -> c_int; + pub fn __wasilibc_unlinkat(fd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_rmdirat(fd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_find_relpath( + path: *const c_char, + abs_prefix: *mut *const c_char, + relative_path: *mut *mut c_char, + relative_path_len: usize, + ) -> c_int; + pub fn __wasilibc_tell(fd: c_int) -> ::off_t; + pub fn __wasilibc_nocwd___wasilibc_unlinkat(dirfd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_nocwd___wasilibc_rmdirat(dirfd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_nocwd_linkat( + olddirfd: c_int, + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_symlinkat( + target: *const c_char, + dirfd: c_int, + path: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_readlinkat( + dirfd: c_int, + path: *const c_char, + buf: *mut c_char, + bufsize: usize, + ) -> isize; + pub fn __wasilibc_nocwd_faccessat( + dirfd: c_int, + path: *const c_char, + mode: c_int, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_renameat( + olddirfd: c_int, + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_openat_nomode(dirfd: c_int, path: *const c_char, flags: c_int) + -> c_int; + pub fn __wasilibc_nocwd_fstatat( + dirfd: c_int, + path: *const c_char, + buf: *mut stat, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_mkdirat_nomode(dirfd: c_int, path: *const c_char) -> c_int; + pub fn __wasilibc_nocwd_utimensat( + dirfd: c_int, + path: *const c_char, + times: *const ::timespec, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_opendirat(dirfd: c_int, path: *const c_char) -> *mut ::DIR; + pub fn __wasilibc_access(pathname: *const c_char, mode: c_int, flags: c_int) -> c_int; + pub fn __wasilibc_stat(pathname: *const c_char, buf: *mut stat, flags: c_int) -> c_int; + pub fn __wasilibc_utimens( + pathname: *const c_char, + times: *const ::timespec, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_link(oldpath: *const c_char, newpath: *const c_char, flags: c_int) -> c_int; + pub fn __wasilibc_link_oldat( + olddirfd: c_int, + oldpath: *const c_char, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_link_newat( + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_rename_oldat( + olddirfd: c_int, + oldpath: *const c_char, + newpath: *const c_char, + ) -> c_int; + pub fn __wasilibc_rename_newat( + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + ) -> c_int; + + pub fn arc4random() -> u32; + pub fn arc4random_buf(a: *mut c_void, b: size_t); + pub fn arc4random_uniform(a: u32) -> u32; + + pub fn __errno_location() -> *mut ::c_int; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/align.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/align.rs new file mode 100644 index 0000000..3af99e3 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/align.rs @@ -0,0 +1,19 @@ +cfg_if! { + if #[cfg(target_pointer_width = "64")] { + s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [f64; 4] + } + } + } else if #[cfg(target_pointer_width = "32")] { + s_no_extra_traits! { + #[allow(missing_debug_implementations)] + #[repr(align(16))] + pub struct max_align_t { + priv_: [i64; 6] + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/mod.rs new file mode 100644 index 0000000..3e7d38b --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/gnu/mod.rs @@ -0,0 +1,23 @@ +pub const L_tmpnam: ::c_uint = 14; +pub const TMP_MAX: ::c_uint = 0x7fff; + +// stdio file descriptor numbers +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +extern "C" { + pub fn strcasecmp(s1: *const ::c_char, s2: *const ::c_char) -> ::c_int; + pub fn strncasecmp(s1: *const ::c_char, s2: *const ::c_char, n: ::size_t) -> ::c_int; + + // NOTE: For MSVC target, `wmemchr` is only a inline function in `` + // header file. We cannot find a way to link to that symbol from Rust. + pub fn wmemchr(cx: *const ::wchar_t, c: ::wchar_t, n: ::size_t) -> *mut ::wchar_t; +} + +cfg_if! { + if #[cfg(libc_align)] { + mod align; + pub use self::align::*; + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/windows/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/mod.rs new file mode 100644 index 0000000..26bff7f --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/mod.rs @@ -0,0 +1,600 @@ +//! Windows CRT definitions + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; +pub type sighandler_t = usize; + +pub type c_char = i8; +pub type c_long = i32; +pub type c_ulong = u32; +pub type wchar_t = u16; + +pub type clock_t = i32; + +pub type errno_t = ::c_int; + +cfg_if! { + if #[cfg(all(target_arch = "x86", target_env = "gnu"))] { + pub type time_t = i32; + } else { + pub type time_t = i64; + } +} + +pub type off_t = i32; +pub type dev_t = u32; +pub type ino_t = u16; +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum timezone {} +impl ::Copy for timezone {} +impl ::Clone for timezone { + fn clone(&self) -> timezone { + *self + } +} +pub type time64_t = i64; + +pub type SOCKET = ::uintptr_t; + +s! { + // note this is the struct called stat64 in Windows. Not stat, nor stati64. + pub struct stat { + pub st_dev: dev_t, + pub st_ino: ino_t, + pub st_mode: u16, + pub st_nlink: ::c_short, + pub st_uid: ::c_short, + pub st_gid: ::c_short, + pub st_rdev: dev_t, + pub st_size: i64, + pub st_atime: time64_t, + pub st_mtime: time64_t, + pub st_ctime: time64_t, + } + + // note that this is called utimbuf64 in Windows + pub struct utimbuf { + pub actime: time64_t, + pub modtime: time64_t, + } + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + } + + pub struct timeval { + pub tv_sec: c_long, + pub tv_usec: c_long, + } + + pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: c_long, + } + + pub struct sockaddr { + pub sa_family: c_ushort, + pub sa_data: [c_char; 14], + } +} + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; +pub const RAND_MAX: ::c_int = 32767; +pub const EOF: ::c_int = -1; +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; +pub const _IOFBF: ::c_int = 0; +pub const _IONBF: ::c_int = 4; +pub const _IOLBF: ::c_int = 64; +pub const BUFSIZ: ::c_uint = 512; +pub const FOPEN_MAX: ::c_uint = 20; +pub const FILENAME_MAX: ::c_uint = 260; + +// fcntl.h +pub const O_RDONLY: ::c_int = 0x0000; +pub const O_WRONLY: ::c_int = 0x0001; +pub const O_RDWR: ::c_int = 0x0002; +pub const O_APPEND: ::c_int = 0x0008; +pub const O_CREAT: ::c_int = 0x0100; +pub const O_TRUNC: ::c_int = 0x0200; +pub const O_EXCL: ::c_int = 0x0400; +pub const O_TEXT: ::c_int = 0x4000; +pub const O_BINARY: ::c_int = 0x8000; +pub const _O_WTEXT: ::c_int = 0x10000; +pub const _O_U16TEXT: ::c_int = 0x20000; +pub const _O_U8TEXT: ::c_int = 0x40000; +pub const O_RAW: ::c_int = O_BINARY; +pub const O_NOINHERIT: ::c_int = 0x0080; +pub const O_TEMPORARY: ::c_int = 0x0040; +pub const _O_SHORT_LIVED: ::c_int = 0x1000; +pub const _O_OBTAIN_DIR: ::c_int = 0x2000; +pub const O_SEQUENTIAL: ::c_int = 0x0020; +pub const O_RANDOM: ::c_int = 0x0010; + +pub const S_IFCHR: ::c_int = 8192; +pub const S_IFDIR: ::c_int = 16384; +pub const S_IFREG: ::c_int = 32768; +pub const S_IFMT: ::c_int = 61440; +pub const S_IEXEC: ::c_int = 64; +pub const S_IWRITE: ::c_int = 128; +pub const S_IREAD: ::c_int = 256; + +pub const LC_ALL: ::c_int = 0; +pub const LC_COLLATE: ::c_int = 1; +pub const LC_CTYPE: ::c_int = 2; +pub const LC_MONETARY: ::c_int = 3; +pub const LC_NUMERIC: ::c_int = 4; +pub const LC_TIME: ::c_int = 5; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EDEADLK: ::c_int = 36; +pub const EDEADLOCK: ::c_int = 36; +pub const ENAMETOOLONG: ::c_int = 38; +pub const ENOLCK: ::c_int = 39; +pub const ENOSYS: ::c_int = 40; +pub const ENOTEMPTY: ::c_int = 41; +pub const EILSEQ: ::c_int = 42; +pub const STRUNCATE: ::c_int = 80; + +// POSIX Supplement (from errno.h) +pub const EADDRINUSE: ::c_int = 100; +pub const EADDRNOTAVAIL: ::c_int = 101; +pub const EAFNOSUPPORT: ::c_int = 102; +pub const EALREADY: ::c_int = 103; +pub const EBADMSG: ::c_int = 104; +pub const ECANCELED: ::c_int = 105; +pub const ECONNABORTED: ::c_int = 106; +pub const ECONNREFUSED: ::c_int = 107; +pub const ECONNRESET: ::c_int = 108; +pub const EDESTADDRREQ: ::c_int = 109; +pub const EHOSTUNREACH: ::c_int = 110; +pub const EIDRM: ::c_int = 111; +pub const EINPROGRESS: ::c_int = 112; +pub const EISCONN: ::c_int = 113; +pub const ELOOP: ::c_int = 114; +pub const EMSGSIZE: ::c_int = 115; +pub const ENETDOWN: ::c_int = 116; +pub const ENETRESET: ::c_int = 117; +pub const ENETUNREACH: ::c_int = 118; +pub const ENOBUFS: ::c_int = 119; +pub const ENODATA: ::c_int = 120; +pub const ENOLINK: ::c_int = 121; +pub const ENOMSG: ::c_int = 122; +pub const ENOPROTOOPT: ::c_int = 123; +pub const ENOSR: ::c_int = 124; +pub const ENOSTR: ::c_int = 125; +pub const ENOTCONN: ::c_int = 126; +pub const ENOTRECOVERABLE: ::c_int = 127; +pub const ENOTSOCK: ::c_int = 128; +pub const ENOTSUP: ::c_int = 129; +pub const EOPNOTSUPP: ::c_int = 130; +pub const EOVERFLOW: ::c_int = 132; +pub const EOWNERDEAD: ::c_int = 133; +pub const EPROTO: ::c_int = 134; +pub const EPROTONOSUPPORT: ::c_int = 135; +pub const EPROTOTYPE: ::c_int = 136; +pub const ETIME: ::c_int = 137; +pub const ETIMEDOUT: ::c_int = 138; +pub const ETXTBSY: ::c_int = 139; +pub const EWOULDBLOCK: ::c_int = 140; + +// signal codes +pub const SIGINT: ::c_int = 2; +pub const SIGILL: ::c_int = 4; +pub const SIGFPE: ::c_int = 8; +pub const SIGSEGV: ::c_int = 11; +pub const SIGTERM: ::c_int = 15; +pub const SIGABRT: ::c_int = 22; +pub const NSIG: ::c_int = 23; + +pub const SIG_ERR: ::c_int = -1; +pub const SIG_DFL: ::sighandler_t = 0; +pub const SIG_IGN: ::sighandler_t = 1; +pub const SIG_GET: ::sighandler_t = 2; +pub const SIG_SGE: ::sighandler_t = 3; +pub const SIG_ACK: ::sighandler_t = 4; + +// inline comment below appeases style checker +#[cfg(all(target_env = "msvc", feature = "rustc-dep-of-std"))] // " if " +#[link(name = "msvcrt", cfg(not(target_feature = "crt-static")))] +#[link(name = "libcmt", cfg(target_feature = "crt-static"))] +extern "C" {} + +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum FILE {} +impl ::Copy for FILE {} +impl ::Clone for FILE { + fn clone(&self) -> FILE { + *self + } +} +#[cfg_attr(feature = "extra_traits", derive(Debug))] +pub enum fpos_t {} // FIXME: fill this out with a struct +impl ::Copy for fpos_t {} +impl ::Clone for fpos_t { + fn clone(&self) -> fpos_t { + *self + } +} + +// Special handling for all print and scan type functions because of https://github.com/rust-lang/libc/issues/2860 +cfg_if! { + if #[cfg(not(feature = "rustc-dep-of-std"))] { + #[cfg_attr( + all(windows, target_env = "msvc"), + link(name = "legacy_stdio_definitions") + )] + extern "C" { + pub fn printf(format: *const c_char, ...) -> ::c_int; + pub fn fprintf(stream: *mut FILE, format: *const c_char, ...) -> ::c_int; + } + } +} + +extern "C" { + pub fn isalnum(c: c_int) -> c_int; + pub fn isalpha(c: c_int) -> c_int; + pub fn iscntrl(c: c_int) -> c_int; + pub fn isdigit(c: c_int) -> c_int; + pub fn isgraph(c: c_int) -> c_int; + pub fn islower(c: c_int) -> c_int; + pub fn isprint(c: c_int) -> c_int; + pub fn ispunct(c: c_int) -> c_int; + pub fn isspace(c: c_int) -> c_int; + pub fn isupper(c: c_int) -> c_int; + pub fn isxdigit(c: c_int) -> c_int; + pub fn isblank(c: c_int) -> c_int; + pub fn tolower(c: c_int) -> c_int; + pub fn toupper(c: c_int) -> c_int; + pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; + pub fn freopen(filename: *const c_char, mode: *const c_char, file: *mut FILE) -> *mut FILE; + pub fn fflush(file: *mut FILE) -> c_int; + pub fn fclose(file: *mut FILE) -> c_int; + pub fn remove(filename: *const c_char) -> c_int; + pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; + pub fn tmpfile() -> *mut FILE; + pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int; + pub fn setbuf(stream: *mut FILE, buf: *mut c_char); + pub fn getchar() -> c_int; + pub fn putchar(c: c_int) -> c_int; + pub fn fgetc(stream: *mut FILE) -> c_int; + pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char; + pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; + pub fn puts(s: *const c_char) -> c_int; + pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; + pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t; + pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; + pub fn ftell(stream: *mut FILE) -> c_long; + pub fn rewind(stream: *mut FILE); + pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; + pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; + pub fn feof(stream: *mut FILE) -> c_int; + pub fn ferror(stream: *mut FILE) -> c_int; + pub fn perror(s: *const c_char); + pub fn atof(s: *const c_char) -> c_double; + pub fn atoi(s: *const c_char) -> c_int; + pub fn atol(s: *const c_char) -> c_long; + pub fn atoll(s: *const c_char) -> c_longlong; + pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; + pub fn strtof(s: *const c_char, endp: *mut *mut c_char) -> c_float; + pub fn strtol(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_long; + pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; + pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; + pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + pub fn malloc(size: size_t) -> *mut c_void; + pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; + pub fn free(p: *mut c_void); + pub fn abort() -> !; + pub fn exit(status: c_int) -> !; + pub fn _exit(status: c_int) -> !; + pub fn atexit(cb: extern "C" fn()) -> c_int; + pub fn system(s: *const c_char) -> c_int; + pub fn getenv(s: *const c_char) -> *mut c_char; + + pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; + pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; + pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; + pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char; + pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; + pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; + pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; + pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; + pub fn strdup(cs: *const c_char) -> *mut c_char; + pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; + pub fn strlen(cs: *const c_char) -> size_t; + pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; + pub fn strerror(n: c_int) -> *mut c_char; + pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; + pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; + pub fn wcslen(buf: *const wchar_t) -> size_t; + pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t; + + pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; + pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; + pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; + pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; + + pub fn abs(i: c_int) -> c_int; + pub fn labs(i: c_long) -> c_long; + pub fn rand() -> c_int; + pub fn srand(seed: c_uint); + + pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t; + pub fn raise(signum: c_int) -> c_int; + + #[link_name = "_gmtime64_s"] + pub fn gmtime_s(destTime: *mut tm, srcTime: *const time_t) -> ::c_int; + #[link_name = "_localtime64_s"] + pub fn localtime_s(tmDest: *mut tm, sourceTime: *const time_t) -> ::errno_t; + #[link_name = "_time64"] + pub fn time(destTime: *mut time_t) -> time_t; + #[link_name = "_chmod"] + pub fn chmod(path: *const c_char, mode: ::c_int) -> ::c_int; + #[link_name = "_wchmod"] + pub fn wchmod(path: *const wchar_t, mode: ::c_int) -> ::c_int; + #[link_name = "_mkdir"] + pub fn mkdir(path: *const c_char) -> ::c_int; + #[link_name = "_wrmdir"] + pub fn wrmdir(path: *const wchar_t) -> ::c_int; + #[link_name = "_fstat64"] + pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int; + #[link_name = "_stat64"] + pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int; + #[link_name = "_wstat64"] + pub fn wstat(path: *const wchar_t, buf: *mut stat) -> ::c_int; + #[link_name = "_wutime64"] + pub fn wutime(file: *const wchar_t, buf: *mut utimbuf) -> ::c_int; + #[link_name = "_popen"] + pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; + #[link_name = "_pclose"] + pub fn pclose(stream: *mut ::FILE) -> ::c_int; + #[link_name = "_fdopen"] + pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE; + #[link_name = "_fileno"] + pub fn fileno(stream: *mut ::FILE) -> ::c_int; + #[link_name = "_open"] + pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; + #[link_name = "_wopen"] + pub fn wopen(path: *const wchar_t, oflag: ::c_int, ...) -> ::c_int; + #[link_name = "_creat"] + pub fn creat(path: *const c_char, mode: ::c_int) -> ::c_int; + #[link_name = "_access"] + pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int; + #[link_name = "_chdir"] + pub fn chdir(dir: *const c_char) -> ::c_int; + #[link_name = "_close"] + pub fn close(fd: ::c_int) -> ::c_int; + #[link_name = "_dup"] + pub fn dup(fd: ::c_int) -> ::c_int; + #[link_name = "_dup2"] + pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int; + #[link_name = "_execl"] + pub fn execl(path: *const c_char, arg0: *const c_char, ...) -> intptr_t; + #[link_name = "_wexecl"] + pub fn wexecl(path: *const wchar_t, arg0: *const wchar_t, ...) -> intptr_t; + #[link_name = "_execle"] + pub fn execle(path: *const c_char, arg0: *const c_char, ...) -> intptr_t; + #[link_name = "_wexecle"] + pub fn wexecle(path: *const wchar_t, arg0: *const wchar_t, ...) -> intptr_t; + #[link_name = "_execlp"] + pub fn execlp(path: *const c_char, arg0: *const c_char, ...) -> intptr_t; + #[link_name = "_wexeclp"] + pub fn wexeclp(path: *const wchar_t, arg0: *const wchar_t, ...) -> intptr_t; + #[link_name = "_execlpe"] + pub fn execlpe(path: *const c_char, arg0: *const c_char, ...) -> intptr_t; + #[link_name = "_wexeclpe"] + pub fn wexeclpe(path: *const wchar_t, arg0: *const wchar_t, ...) -> intptr_t; + #[link_name = "_execv"] + pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::intptr_t; + #[link_name = "_execve"] + pub fn execve( + prog: *const c_char, + argv: *const *const c_char, + envp: *const *const c_char, + ) -> ::c_int; + #[link_name = "_execvp"] + pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int; + #[link_name = "_execvpe"] + pub fn execvpe( + c: *const c_char, + argv: *const *const c_char, + envp: *const *const c_char, + ) -> ::c_int; + #[link_name = "_wexecv"] + pub fn wexecv(prog: *const wchar_t, argv: *const *const wchar_t) -> ::intptr_t; + #[link_name = "_wexecve"] + pub fn wexecve( + prog: *const wchar_t, + argv: *const *const wchar_t, + envp: *const *const wchar_t, + ) -> ::intptr_t; + #[link_name = "_wexecvp"] + pub fn wexecvp(c: *const wchar_t, argv: *const *const wchar_t) -> ::intptr_t; + #[link_name = "_wexecvpe"] + pub fn wexecvpe( + c: *const wchar_t, + argv: *const *const wchar_t, + envp: *const *const wchar_t, + ) -> ::intptr_t; + #[link_name = "_getcwd"] + pub fn getcwd(buf: *mut c_char, size: ::c_int) -> *mut c_char; + #[link_name = "_getpid"] + pub fn getpid() -> ::c_int; + #[link_name = "_isatty"] + pub fn isatty(fd: ::c_int) -> ::c_int; + #[link_name = "_lseek"] + pub fn lseek(fd: ::c_int, offset: c_long, origin: ::c_int) -> c_long; + #[link_name = "_lseeki64"] + pub fn lseek64(fd: ::c_int, offset: c_longlong, origin: ::c_int) -> c_longlong; + #[link_name = "_pipe"] + pub fn pipe(fds: *mut ::c_int, psize: ::c_uint, textmode: ::c_int) -> ::c_int; + #[link_name = "_read"] + pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::c_uint) -> ::c_int; + #[link_name = "_rmdir"] + pub fn rmdir(path: *const c_char) -> ::c_int; + #[link_name = "_unlink"] + pub fn unlink(c: *const c_char) -> ::c_int; + #[link_name = "_write"] + pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::c_uint) -> ::c_int; + #[link_name = "_commit"] + pub fn commit(fd: ::c_int) -> ::c_int; + #[link_name = "_get_osfhandle"] + pub fn get_osfhandle(fd: ::c_int) -> ::intptr_t; + #[link_name = "_open_osfhandle"] + pub fn open_osfhandle(osfhandle: ::intptr_t, flags: ::c_int) -> ::c_int; + pub fn setlocale(category: ::c_int, locale: *const c_char) -> *mut c_char; + #[link_name = "_wsetlocale"] + pub fn wsetlocale(category: ::c_int, locale: *const wchar_t) -> *mut wchar_t; + #[link_name = "_aligned_malloc"] + pub fn aligned_malloc(size: size_t, alignment: size_t) -> *mut c_void; + #[link_name = "_aligned_free"] + pub fn aligned_free(ptr: *mut ::c_void); + #[link_name = "_putenv"] + pub fn putenv(envstring: *const ::c_char) -> ::c_int; + #[link_name = "_wputenv"] + pub fn wputenv(envstring: *const ::wchar_t) -> ::c_int; + #[link_name = "_putenv_s"] + pub fn putenv_s(envstring: *const ::c_char, value_string: *const ::c_char) -> ::errno_t; + #[link_name = "_wputenv_s"] + pub fn wputenv_s(envstring: *const ::wchar_t, value_string: *const ::wchar_t) -> ::errno_t; +} + +extern "system" { + pub fn listen(s: SOCKET, backlog: ::c_int) -> ::c_int; + pub fn accept(s: SOCKET, addr: *mut ::sockaddr, addrlen: *mut ::c_int) -> SOCKET; + pub fn bind(s: SOCKET, name: *const ::sockaddr, namelen: ::c_int) -> ::c_int; + pub fn connect(s: SOCKET, name: *const ::sockaddr, namelen: ::c_int) -> ::c_int; + pub fn getpeername(s: SOCKET, name: *mut ::sockaddr, nameln: *mut ::c_int) -> ::c_int; + pub fn getsockname(s: SOCKET, name: *mut ::sockaddr, nameln: *mut ::c_int) -> ::c_int; + pub fn getsockopt( + s: SOCKET, + level: ::c_int, + optname: ::c_int, + optval: *mut ::c_char, + optlen: *mut ::c_int, + ) -> ::c_int; + pub fn recvfrom( + s: SOCKET, + buf: *mut ::c_char, + len: ::c_int, + flags: ::c_int, + from: *mut ::sockaddr, + fromlen: *mut ::c_int, + ) -> ::c_int; + pub fn sendto( + s: SOCKET, + buf: *const ::c_char, + len: ::c_int, + flags: ::c_int, + to: *const ::sockaddr, + tolen: ::c_int, + ) -> ::c_int; + pub fn setsockopt( + s: SOCKET, + level: ::c_int, + optname: ::c_int, + optval: *const ::c_char, + optlen: ::c_int, + ) -> ::c_int; + pub fn socket(af: ::c_int, socket_type: ::c_int, protocol: ::c_int) -> SOCKET; +} + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} + +cfg_if! { + if #[cfg(all(target_env = "gnu"))] { + mod gnu; + pub use self::gnu::*; + } else if #[cfg(all(target_env = "msvc"))] { + mod msvc; + pub use self::msvc::*; + } else { + // Unknown target_env + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/windows/msvc/mod.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/msvc/mod.rs new file mode 100644 index 0000000..f5a1d95 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/windows/msvc/mod.rs @@ -0,0 +1,20 @@ +pub const L_tmpnam: ::c_uint = 260; +pub const TMP_MAX: ::c_uint = 0x7fff_ffff; + +// POSIX Supplement (from errno.h) +// This particular error code is only currently available in msvc toolchain +pub const EOTHER: ::c_int = 131; + +extern "C" { + #[link_name = "_stricmp"] + pub fn stricmp(s1: *const ::c_char, s2: *const ::c_char) -> ::c_int; + #[link_name = "_strnicmp"] + pub fn strnicmp(s1: *const ::c_char, s2: *const ::c_char, n: ::size_t) -> ::c_int; + #[link_name = "_memccpy"] + pub fn memccpy( + dest: *mut ::c_void, + src: *const ::c_void, + c: ::c_int, + count: ::size_t, + ) -> *mut ::c_void; +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/src/xous.rs b/utsudo-0.0.2/lib/util/vendor/libc/src/xous.rs new file mode 100644 index 0000000..e6c0c25 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/src/xous.rs @@ -0,0 +1,49 @@ +//! Xous C type definitions + +pub type c_schar = i8; +pub type c_uchar = u8; +pub type c_short = i16; +pub type c_ushort = u16; +pub type c_int = i32; +pub type c_uint = u32; +pub type c_float = f32; +pub type c_double = f64; +pub type c_longlong = i64; +pub type c_ulonglong = u64; +pub type intmax_t = i64; +pub type uintmax_t = u64; + +pub type size_t = usize; +pub type ptrdiff_t = isize; +pub type intptr_t = isize; +pub type uintptr_t = usize; +pub type ssize_t = isize; + +pub type off_t = i64; +pub type c_char = u8; +pub type c_long = i64; +pub type c_ulong = u64; +pub type wchar_t = u32; + +pub const INT_MIN: c_int = -2147483648; +pub const INT_MAX: c_int = 2147483647; + +cfg_if! { + if #[cfg(libc_core_cvoid)] { + pub use ::ffi::c_void; + } else { + // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help + // enable more optimization opportunities around it recognizing things + // like malloc/free. + #[repr(u8)] + #[allow(missing_copy_implementations)] + #[allow(missing_debug_implementations)] + pub enum c_void { + // Two dummy variants so the #[repr] attribute can be used. + #[doc(hidden)] + __variant1, + #[doc(hidden)] + __variant2, + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/libc/tests/const_fn.rs b/utsudo-0.0.2/lib/util/vendor/libc/tests/const_fn.rs new file mode 100644 index 0000000..0e7e186 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/libc/tests/const_fn.rs @@ -0,0 +1,5 @@ +#![cfg(libc_const_extern_fn)] // If this does not hold, the file is empty + +#[cfg(target_os = "linux")] +const _FOO: libc::c_uint = unsafe { libc::CMSG_SPACE(1) }; +//^ if CMSG_SPACE is not const, this will fail to compile diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/.cargo-checksum.json b/utsudo-0.0.2/lib/util/vendor/stdext/.cargo-checksum.json new file mode 100644 index 0000000..c7a25fe --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"25083d6f00a303ea6b34e65ca809ecd2cd7a5e5dfea94456a38d70b6d6833f74","CONTRIBUTING.md":"97e85621fe7efff96aa56aa192da23c89d711278d1fe8ff6c9c9d8cc1c8ec40a","Cargo.toml":"41242d887268b6fc6c76f28b9327a343f8770f1d44a2c95234c80248374619f3","LICENSE":"f5d516121794c24b7facaa236364eab0b639694e2d69f78ec2de5deccadcf9d3","README.md":"027c4918296fd85df8f9e4a5bab47e3444ee136a4018eaefa0c40bf16bb1a913","src/duration.rs":"9b66cdca0320bc0d9d27589f76badbb3295e8f10aa9637e68983a11894c0bce9","src/lib.rs":"1949754206e205b9d98b9515daa403c837448dcba8fa6164cee44ebd07316e5a","src/macros.rs":"fbe37d37d74abfd417b768f2b34383651b2bd47ad7f9096badb37aa17ea6181e","src/num/float_convert.rs":"0d9ff64a84836707861622c876dceae277c279c5633d372929d6db0f329f02aa","src/num/integer.rs":"366e80cffeb0de5e1524ce74e9452e76fba0d0c30688d215028edc4f6fb23c66","src/num/mod.rs":"b4c8297ab8556a8c9b30e79b1866fcc7194120415d042b1457908d894266e2f8","src/option.rs":"689a7f2975f1606809d5e266504b95c32891cc6e54eb822b38d80b25360fa99a","src/result.rs":"1ec5f7344794094faf80e5f8e8fe2a4c402e3f6848aae66131f0a3c78d800bd3","src/str.rs":"1141ff3c39df22a6a507453e4e3e4adc574fb74e636c422775e085b18ead048a","src/sync/mod.rs":"cb5591f32593f3f105dbbc1c4b4ca3093712650f30950f2f97aaeebb841489ec","src/sync/mutex.rs":"51de035e1723ecd27e3c9933d56275f144fe7d3837287780ceb481551f04153c","src/sync/rw_lock.rs":"be5f0b1816fb56fb1e28eceda08e4fa585f400a962896394e06ad61f746bbdce","src/vec.rs":"89e54411b6857e30d04ac278535477070641f53769210e66a5bc946051480259"},"package":"6f3b6b32ae82412fb897ef134867d53a294f57ba5b758f06d71e865352c3e207"} \ No newline at end of file diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/CHANGELOG.md b/utsudo-0.0.2/lib/util/vendor/stdext/CHANGELOG.md new file mode 100644 index 0000000..74ccc08 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/CHANGELOG.md @@ -0,0 +1,27 @@ +# `stdext` changelog + +## [[Unreleased]] + +## 0.3.0 (18.06.2021) + +- BREAKING: MSRV got bumped to 1.53. + +- `try_match` and `unwrap_match` macros to get a certain variant from an enum [#11]. +- `return_ok` and `return_some` macros for early return of successful calculation [#11]. +- `Integer` trait that unifies all the built-in integer types under a single interface [#12]. +- `FloatConvert` trait that adds an interface for converting floating point numbers into integers [#12]. + +[#11]: https://github.com/popzxc/stdext-rs/pull/11 +[#12]: https://github.com/popzxc/stdext-rs/pull/12 + +## 0.2.1 (09.07.2020) + +- `VecExt::remove_item` method was added [#9]. + +[#9]: https://github.com/popzxc/stdext-rs/pull/9 + +## 0.2.0 (02.07.2020) + +- `compile_warning` and `function_name` macros were added [#4]. + +[#4]: https://github.com/popzxc/stdext-rs/pull/4 diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/CONTRIBUTING.md b/utsudo-0.0.2/lib/util/vendor/stdext/CONTRIBUTING.md new file mode 100644 index 0000000..5d571e2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing guide + +Thanks for considering contributing to the `stdext`! Here's a banana for you: 🍌 + +If you are missing some functionality in the Rust standard library, but don't want +to bother yourself with all the associated routines (writing RFC, defending it, implementing, +waiting for it to be stabilized...), feel free to create a pull request to this repo. + +## Adding new functionality + +The ideal pull request will satisfy the following criteria: + +- Does not contain any hate (any form of discrimination, politics, offence, etc). +- Has an explanation why this functionality is useful for a generic audience. +- Covers the introduced code with tests and documentation. +- Does not rely on external dependencies (for any kind of complex functionality consider creating your + own library, this crate is for minor improvements only). + +All the rules (except for the first one) are discussible if you can provide a heavy reasoning for it. + +## Requesting the functionality + +If you don't want to implement the feature, but still feel that is missing in `std`, feel free to open +a feature request issue. I'll try to implement it myself once I have the time. + +## Other contributions + +Refactoring, improving documentation, adding tests and other kinds of improvements are really appreciated +as well. diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/Cargo.toml b/utsudo-0.0.2/lib/util/vendor/stdext/Cargo.toml new file mode 100644 index 0000000..939fcae --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/Cargo.toml @@ -0,0 +1,26 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "stdext" +version = "0.3.1" +authors = ["Igor Aleksanov "] +description = "Extensions for the Rust standard library structures." +documentation = "https://docs.rs/stdext" +readme = "README.md" +keywords = ["std", "extensions", "helpers", "utils"] +categories = ["rust-patterns"] +license = "MIT" +repository = "https://github.com/popzxc/stdext-rs" + +[dependencies] diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/LICENSE b/utsudo-0.0.2/lib/util/vendor/stdext/LICENSE new file mode 100644 index 0000000..15fab14 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2020 Igor Aleksanov + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/README.md b/utsudo-0.0.2/lib/util/vendor/stdext/README.md new file mode 100644 index 0000000..8616b85 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/README.md @@ -0,0 +1,129 @@ +# `std` extensions + +**Status:** +[![CI](https://github.com/popzxc/stdext-rs/workflows/CI/badge.svg)](https://github.com/popzxc/stdext-rs/actions) + +**Project info:** +[![Docs.rs](https://docs.rs/stdext/badge.svg)](https://docs.rs/stdext) +[![Latest Version](https://img.shields.io/crates/v/stdext.svg)](https://crates.io/crates/stdext) +[![License](https://img.shields.io/github/license/popzxc/stdext-rs.svg)](https://github.com/popzxc/stdext-rs) +![Rust 1.53+ required](https://img.shields.io/badge/rust-1.53+-blue.svg?label=Rust) + +Additional features for the Rust standard library. + +## Description + +This crate contains enhancements to the Rust standard library structures, useful for +broad audience, but not yet implemented (or stabilized) in `std`. + +Crate is designed to be lightweight (no external dependencies!) and provide essential +functionality which possible can get to the `std` some day. + +The minimal supported Rust version for release 0.3 is 1.53. However, if you need to use +this crate with an older version of the compiler, check out release 0.2; there is a good +chance that it will suit your needs. + +## Highlights + +- `Integer` super-trait that is implemented for all the built-in integers + and reflects the common part of their interfaces. + + ```rust + use stdext::prelude::*; + + fn accepts_any_integer(a: I, b: I) { + println!("{}", (a + b).count_ones()); + } + ``` + +- Safe conversions from floating numbers to integers. + + ```rust + use stdext::prelude::FloatConvert; + + let valid: Option = 10.5f32.checked_floor(); + let too_big: Option = 256f32.checked_floor(); + let nan: Option = f32::NAN.checked_floor(); + + assert_eq!(valid, Some(10u8)); + assert_eq!(too_big, None); + assert_eq!(nan, None); + ``` + +- Convenient builder methods for **`Duration`**: + + ```rust + use std::time::Duration; + use stdext::prelude::*; + + let duration = Duration::from_minutes(1).add_secs(5).add_micros(100); + assert_eq!(duration, Duration::new(65, 100_000)); + ``` + +- Panicking version for **`RwLock::read`**, **`RwLock::write`** and **`Mutex::lock`** (for + fellows who don't really handle the lock poisoning): + + ```rust + use std::sync::{Arc, RwLock}; + use stdext::prelude::*; + + let lock = Arc::new(RwLock::new(1)); + { + let mut n = lock.force_write(); // Instead of `.write().unwrap()`. + *n = 2; + } + let n = lock.force_read(); + assert_eq!(*n, 2); + ``` + +- **`Result::combine`** and **`Option::combine`** to zip pairs of objects: + + ```rust + use stdext::prelude::*; + + let x = Some(1); + let y = Some("hi"); + let z = None::; + + assert_eq!(x.combine(y), Some((1, "hi"))); + assert_eq!(x.combine(z), None); + + let x = Ok(1); + let y = Ok("hi"); + let z: Result = Err("error"); + let z2: Result = Err("other_error"); + + assert_eq!(x.combine(y), Ok((1, "hi"))); + assert_eq!(x.combine(z), Err("error")); + assert_eq!(z.combine(z2), Err("error")); + ``` + +- New handy macros (mostly for development purposes): + + ```rust + use stdext::{compile_warning, function_name}; + + fn sample_function() { + println!("This function is called {}", function_name!()); + + compile_warning!("This function must do something else..."); + } + ``` + +...and other features. For a full list, check out the [crate documentation](https://docs.rs/stdext/). + +## Motivation + +Standard library is great, and it becomes even better through time. However, a time gap between proposing +a new feature and getting it stabilized is way too big. + +This crate, however, can be updated quickly and the feature will be usable on the stable Rust soon after +implementation. + +## Contributing + +If you want to contribute to this project, please read the [contributing guide](CONTRIBUTING.md). + +## LICENSE + +`stdext` library is licensed under the MIT License. See [LICENSE](LICENSE) for details. diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/duration.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/duration.rs new file mode 100644 index 0000000..5d3782d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/duration.rs @@ -0,0 +1,326 @@ +//! Extension traits for `std::time::Duration`. + +use std::time::Duration; + +const SECS_IN_MIN: u64 = 60; +const SECS_IN_HOUR: u64 = 3600; +const SECS_IN_DAY: u64 = 3600 * 24; + +/// Extension trait with useful methods for [`std::time::Duration`]. +/// +/// [`std::time::Duration`]: https://doc.rust-lang.org/std/time/struct.Duration.html +pub trait DurationExt { + /// Creates a new `Duration` from the specified number of minutes. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::from_minutes(1); + /// + /// assert_eq!(duration, Duration::from_secs(60)); + /// ``` + /// + /// # Panics + /// + /// Panics if the total amount of seconds exceeds the `u64` type range. + fn from_minutes(minutes: u64) -> Duration; + + /// Creates a new `Duration` from the specified number of hours. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::from_hours(1); + /// + /// assert_eq!(duration, Duration::from_secs(3600)); + /// ``` + /// + /// # Panics + /// + /// Panics if the total amount of seconds exceeds the `u64` type range. + fn from_hours(hours: u64) -> Duration; + + /// Creates a new `Duration` from the specified number of hours. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::from_days(1); + /// + /// assert_eq!(duration, Duration::from_secs(3600 * 24)); + /// ``` + /// + /// # Panics + /// + /// Panics if the total amount of seconds exceeds the `u64` type range. + fn from_days(days: u64) -> Duration; + + /// Adds the specified amount of nanoseconds to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_nanos(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_nanos(1)); + /// ``` + fn add_nanos(self, nanos: u64) -> Duration; + + /// Adds the specified amount of microseconds to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_micros(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_micros(1)); + /// ``` + fn add_micros(self, micros: u64) -> Duration; + + /// Adds the specified amount of milliseconds to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_millis(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_millis(1)); + /// ``` + fn add_millis(self, millis: u64) -> Duration; + + /// Adds the specified amount of seconds to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_secs(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_secs(1)); + /// ``` + fn add_secs(self, seconds: u64) -> Duration; + + /// Adds the specified amount of minutes to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_minutes(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_minutes(1)); + /// ``` + fn add_minutes(self, minutes: u64) -> Duration; + + /// Adds the specified amount of hours to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_hours(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_hours(1)); + /// ``` + fn add_hours(self, hours: u64) -> Duration; + + /// Adds the specified amount of days to the `Duration` object. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::default().add_days(1); + /// + /// assert_eq!(duration, Duration::default() + Duration::from_days(1)); + /// ``` + fn add_days(self, days: u64) -> Duration; + + /// Returns the number of _whole_ minutes contained by this `Duration`. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::new(61, 730023852); + /// assert_eq!(duration.as_minutes(), 1); + /// ``` + fn as_minutes(&self) -> u64; + + /// Returns the number of _whole_ hours contained by this `Duration`. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::new(3601, 730023852); + /// assert_eq!(duration.as_hours(), 1); + /// ``` + fn as_hours(&self) -> u64; + + /// Returns the number of _whole_ hours contained by this `Duration`. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// use stdext::prelude::*; + /// + /// let duration = Duration::new(61, 730023852).add_days(1); + /// assert_eq!(duration.as_days(), 1); + /// ``` + fn as_days(&self) -> u64; +} + +impl DurationExt for Duration { + fn from_minutes(minutes: u64) -> Self { + let seconds = minutes * SECS_IN_MIN; + Self::from_secs(seconds) + } + + fn from_hours(hours: u64) -> Self { + let seconds: u64 = hours * SECS_IN_HOUR; + Self::from_secs(seconds) + } + + fn from_days(days: u64) -> Self { + let seconds = days * SECS_IN_DAY; + Self::from_secs(seconds) + } + + fn add_nanos(self, nanos: u64) -> Self { + self + Self::from_nanos(nanos) + } + + fn add_micros(self, micros: u64) -> Self { + self + Self::from_micros(micros) + } + + fn add_millis(self, millis: u64) -> Self { + self + Self::from_millis(millis) + } + + fn add_secs(self, seconds: u64) -> Self { + self + Self::from_secs(seconds) + } + + fn add_minutes(self, minutes: u64) -> Self { + self + Self::from_minutes(minutes) + } + + fn add_hours(self, hours: u64) -> Self { + self + Self::from_hours(hours) + } + + fn add_days(self, days: u64) -> Self { + self + Self::from_days(days) + } + + fn as_minutes(&self) -> u64 { + self.as_secs() / SECS_IN_MIN + } + + fn as_hours(&self) -> u64 { + self.as_secs() / SECS_IN_HOUR + } + + fn as_days(&self) -> u64 { + self.as_secs() / SECS_IN_DAY + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn from_methods() { + // Check `from_minutes` + let test_vector = vec![0, 1, u64::max_value() / SECS_IN_MIN]; + for minutes in test_vector { + let seconds = minutes * SECS_IN_MIN; + assert_eq!( + Duration::from_minutes(minutes), + Duration::from_secs(seconds) + ); + } + + // Check `from_hours` + let test_vector = vec![0, 1, u64::max_value() / SECS_IN_HOUR]; + for hours in test_vector { + let seconds = hours * SECS_IN_HOUR; + assert_eq!(Duration::from_hours(hours), Duration::from_secs(seconds)); + } + + // Check `from_days` + let test_vector = vec![0, 1, u64::max_value() / SECS_IN_DAY]; + for days in test_vector { + let seconds = days * SECS_IN_DAY; + assert_eq!(Duration::from_days(days), Duration::from_secs(seconds)); + } + } + + #[test] + fn add_methods() { + let duration = Duration::default() + .add_nanos(1) + .add_micros(1) + .add_millis(1) + .add_secs(1) + .add_minutes(1) + .add_hours(1) + .add_days(1); + + let expected_duration = Duration::new( + SECS_IN_DAY + SECS_IN_HOUR + SECS_IN_MIN + 1, + 1_000_000 + 1_000 + 1, + ); + + assert_eq!(duration, expected_duration); + } + + #[test] + fn as_methods() { + let test_vector = vec![0, SECS_IN_MIN, SECS_IN_HOUR, SECS_IN_DAY]; + + for seconds in test_vector { + for seconds in &[seconds, seconds + 1, seconds * 2, seconds * 2 + 1] { + let duration = Duration::from_secs(*seconds); + + assert_eq!(duration.as_minutes(), duration.as_secs() / SECS_IN_MIN); + assert_eq!(duration.as_hours(), duration.as_secs() / SECS_IN_HOUR); + assert_eq!(duration.as_days(), duration.as_secs() / SECS_IN_DAY); + } + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/lib.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/lib.rs new file mode 100644 index 0000000..12f8619 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/lib.rs @@ -0,0 +1,150 @@ +//! Additional features for the Rust standard library. +//! +//! ## Description +//! +//! This crate contains enhancements to the Rust standard library types, useful for +//! broad audience, but not yet implemented (or stabilized) in `std`. +//! +//! Crate is designed to be lightweight (no external dependencies!) and provide essential +//! functionality which possible can get to the `std` some day. +//! +//! ## Extension traits +//! +//! All the new functionality the stanard library is added using extension traits. +//! +//! Below you can find the table of all the extension traits introduced by this crate: +//! +//! | `std` structure | extension traits +//! | --- | --- +//! | [`Vec`] | [`VecExt`] and [`VecExtClone`] +//! | [`&str`] | [`StrExt`] +//! | [`Option`] | [`OptionExt`] +//! | [`Result`] | [`ResultExt`] +//! | [`Duration`] | [`DurationExt`] +//! | [`RwLock`] | [`RwLockExt`] +//! | [`Mutex`] | [`MutexExt`] +//! | [`f32`] and [`f64`] | [`FloatConvert`] +//! +//! [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html +//! [`&str`]: https://doc.rust-lang.org/std/primitive.str.html +//! [`Option`]: https://doc.rust-lang.org/std/option/enum.Option.html +//! [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html +//! [`Duration`]: https://doc.rust-lang.org/std/time/struct.Duration.html +//! [`RwLock`]: https://doc.rust-lang.org/std/sync/struct.RwLock.html +//! [`Mutex`]: https://doc.rust-lang.org/std/sync/struct.Mutex.html +//! +//! [`VecExt`]: vec/trait.VecExt.html +//! [`VecExtClone`]: vec/trait.VecExtClone.html +//! [`StrExt`]: str/trait.StrExt.html +//! [`OptionExt`]: option/trait.OptionExt.html +//! [`ResultExt`]: result/trait.ResultExt.html +//! [`DurationExt`]: duration/trait.DurationExt.html +//! [`RwLockExt`]: sync/rw_lock/trait.RwLockExt.html +//! [`MutexExt`]: sync/mutex/trait.MutexExt.html +//! [`FloatConvert`]: num/float_convert/trait.FloatConvert.html +//! +//! ## Integer super-trait +//! +//! While all built-in integer types have mostly the same interface, it's not backed by any trait, +//! which makes it impossible to write a function that will accept any built-in integer. +//! +//! [`Integer`] trait solves that problem by reflecting the common interface of all the built-in integers. +//! +//! [`Integer`]: num/integer/trait.Integer.html +//! +//! ## Macros +//! +//! Another group of extensions in `stdext` is new macros: +//! +//! - [`compile_warning`] for spawning a user-defined compilation warnings. +//! - [`function_name`] for getting an enclosing function name. +//! +//! [`compile_warning`]: ./macro.compile_warning.html +//! [`function_name`]: ./macro.function_name.html +//! +//! ## Highlights +//! +//! - Convenient builder methods for **`Duration`**: +//! +//! ```rust +//! use std::time::Duration; +//! use stdext::prelude::*; +//! +//! let duration = Duration::from_minutes(1).add_secs(5).add_micros(100); +//! assert_eq!(duration, Duration::new(65, 100_000)); +//! ``` +//! +//! - Panicking version for **`RwLock::read`**, **`RwLock::write`** and **`Mutex::lock`** (for +//! fellows who don't really handle the lock poisoning): +//! +//! ```rust +//! use std::sync::{Arc, RwLock}; +//! use stdext::prelude::*; +//! +//! let lock = Arc::new(RwLock::new(1)); +//! { +//! let mut n = lock.force_write(); // Instead of `.write().unwrap()`. +//! *n = 2; +//! } +//! let n = lock.force_read(); +//! assert_eq!(*n, 2); +//! ``` +//! +//! - **`Result::combine`** and **`Option::combine`** to zip pairs of objects: +//! +//! ```rust +//! use stdext::prelude::*; +//! +//! let x = Some(1); +//! let y = Some("hi"); +//! let z = None::; +//! +//! assert_eq!(x.combine(y), Some((1, "hi"))); +//! assert_eq!(x.combine(z), None); +//! +//! let x = Ok(1); +//! let y = Ok("hi"); +//! let z: Result = Err("error"); +//! let z2: Result = Err("other_error"); +//! +//! assert_eq!(x.combine(y), Ok((1, "hi"))); +//! assert_eq!(x.combine(z), Err("error")); +//! assert_eq!(z.combine(z2), Err("error")); +//! ``` +//! +//! - New handy macros (mostly for development purposes): +//! +//! ```rust +//! use stdext::{compile_warning, function_name}; +//! +//! fn sample_function() { +//! println!("This function is called {}", function_name!()); +//! +//! compile_warning!("This function must do something else..."); +//! } +//! ``` + +#![warn(missing_docs, unreachable_pub)] + +pub mod duration; +#[macro_use] +pub mod macros; +pub mod num; +pub mod option; +pub mod result; +pub mod str; +pub mod sync; +pub mod vec; + +/// A "prelude" module which re-exports all the extension traits for the simple library usage. +pub mod prelude { + pub use crate::{ + duration::*, + num::{float_convert::*, integer::*}, + option::*, + result::*, + str::*, + sync::{mutex::*, rw_lock::*}, + vec::*, + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/macros.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/macros.rs new file mode 100644 index 0000000..1202a0a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/macros.rs @@ -0,0 +1,233 @@ +//! Various helper macros. + +/// `compile_warning` macro is a brother of [`std::compile_error`], +/// which emits a compile-time warning with a provided message. +/// +/// This implemented through an existing `dead_code` warning, thus the +/// output for the following example: +/// +/// ```rust +/// # use stdext::compile_warning; +/// compile_warning!("Sample user-defined warning!"); +/// ``` +/// +/// may look as follows: +/// +/// ```text +/// warning: constant item is never used: `WARNING` +/// --> src/lib.rs:7:9 +/// | +/// 7 | const WARNING: &str = $expr; +/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/// ... +/// 11 | compile_warning!("Sample user-defined warning!"); +/// | ------------------------------------------------- in this macro invocation +/// ``` +/// +/// Once [`proc_macro_diagnostics`] feature is stabilized, this macro will be replaced +/// with a proper proc-macro-based implementation. +/// +/// This macro is intended to be used in the development process, as an alternative to the +/// [`unimplemented`] macro which doesn't cause code to panic. +/// +/// [`std::compile_error`]: https://doc.rust-lang.org/std/macro.compile_error.html +/// [`proc_macro_diagnostics`]: https://github.com/rust-lang/rust/issues/54140 +/// [`unimplemented`]: https://doc.rust-lang.org/std/macro.unimplemented.html +#[macro_export] +macro_rules! compile_warning { + ($expr:expr) => { + #[warn(dead_code)] + const WARNING: &str = $expr; + }; +} + +/// This macro returns the name of the enclosing function. +/// As the internal implementation is based on the [`std::any::type_name`], this macro derives +/// all the limitations of this function. +/// +/// ## Examples +/// +/// ```rust +/// mod bar { +/// pub fn sample_function() { +/// use stdext::function_name; +/// assert!(function_name!().ends_with("bar::sample_function")); +/// } +/// } +/// +/// bar::sample_function(); +/// ``` +/// +/// [`std::any::type_name`]: https://doc.rust-lang.org/std/any/fn.type_name.html +#[macro_export] +macro_rules! function_name { + () => {{ + // Okay, this is ugly, I get it. However, this is the best we can get on a stable rust. + fn f() {} + fn type_name_of(_: T) -> &'static str { + std::any::type_name::() + } + let name = type_name_of(f); + // `3` is the length of the `::f`. + &name[..name.len() - 3] + }}; +} + +/// Attempts to get variant from the enum variable. +/// +/// ## Examples +/// +/// ```rust +/// # use stdext::try_match; +/// +/// #[derive(Debug, PartialEq)] +/// enum Foo { +/// Left(u16), +/// Right(&'static str), +/// } +/// +/// assert_eq!(try_match!(Foo::Left(18), Foo::Left), Ok(18)); +/// assert_eq!( +/// try_match!(Foo::Right("nope"), Foo::Left), +/// Err(Foo::Right("nope")) +/// ); +/// ``` +#[macro_export] +macro_rules! try_match { + ($var:expr, $variant:path) => { + if let $variant(x) = $var { + Ok(x) + } else { + Err($var) + } + }; +} + +/// Similar to [`try_match`] but additionally unwraps the result. +/// +/// ## Panics +/// +/// Panics if expression didn't match the provided path. +/// +/// ## Examples +/// +/// ```rust +/// # use stdext::unwrap_match; +/// +/// #[derive(Debug, PartialEq)] +/// enum Foo { +/// Left(u16), +/// Right(&'static str), +/// } +/// +/// assert_eq!(unwrap_match!(Foo::Left(18), Foo::Left), 18); +/// ``` +/// +/// The following example will panic: +/// +/// ```should_panic +/// # use stdext::unwrap_match; +/// # #[derive(Debug, PartialEq)] +/// # enum Foo { +/// # Left(u16), +/// # Right(&'static str), +/// # } +/// assert_eq!(unwrap_match!(Foo::Right("nope"), Foo::Left), 18); +/// ``` +#[macro_export] +macro_rules! unwrap_match { + ($var:expr, $variant:path) => { + $crate::try_match!($var, $variant).unwrap() + }; +} + +/// Checks whether supplied [`Result`] variable is `Ok` +/// and if so, returns it. +/// +/// If variant is an `Err`, macro evaluates to the contents of the `Err` +/// variant. +/// +/// This macro supports two forms: +/// - `return_ok!(Ok(42));` - will return `Ok(42)`. +/// - `return_ok!(inner Ok(42));` - will return just `42`. +/// +/// ## Examples +/// +/// ```rust +/// # use stdext::return_ok; +/// +/// fn choose_one(left: Result, right: Result) -> Result { +/// return_ok!(left); +/// return_ok!(right); +/// Err(()) +/// } +/// +/// fn choose_one_inner(left: Result, right: Result) -> u8 { +/// return_ok!(inner left); +/// return_ok!(inner right); +/// panic!("Both variables are bad") +/// } +/// +/// assert_eq!(choose_one(Err(()), Ok(10)), Ok(10)); +/// assert_eq!(choose_one_inner(Ok(1), Err(())), 1); +/// ``` +#[macro_export] +macro_rules! return_ok { + ($var:expr) => { + match $var { + Ok(val) => return Ok(val), + Err(err) => err, + } + }; + (inner $var:expr) => { + match $var { + Ok(val) => return val, + Err(err) => err, + } + }; +} + +/// Checks whether supplied [`Option`] variable is `Some` +/// and if so, returns it. +/// +/// If variant is an `None`, nothing happens. +/// +/// This macro supports two forms: +/// - `return_some!(Some(42));` - will return `Some(42)`. +/// - `return_some!(inner Some(42));` - will return just `42`. +/// +/// ## Examples +/// +/// ```rust +/// # use stdext::return_some; +/// +/// fn choose_one(left: Option, right: Option) -> Option { +/// return_some!(left); +/// return_some!(right); +/// None +/// } +/// +/// fn choose_one_inner(left: Option, right: Option) -> u8 { +/// return_some!(inner left); +/// return_some!(inner right); +/// panic!("Both variables are bad") +/// } +/// +/// assert_eq!(choose_one(None, Some(10)), Some(10)); +/// assert_eq!(choose_one_inner(Some(1), None), 1); +/// ``` +#[macro_export] +macro_rules! return_some { + ($var:expr) => { + match $var { + Some(val) => return Some(val), + None => {} + } + }; + (inner $var:expr) => { + match $var { + Some(val) => return val, + None => {} + } + }; +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/num/float_convert.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/float_convert.rs new file mode 100644 index 0000000..ed96431 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/float_convert.rs @@ -0,0 +1,158 @@ +//! Extensions for the built-in floating point types. + +/// Set of methods to safely convert floating number into an integer. +/// +/// Currently, the main way to do so is to use [`as`][as_convert] conversion. +/// However, such an approach may not be suitable if saturating conversion is +/// not desired. +/// +/// However, saturating conversion is also provided as an expicit alternative +/// to `as` conversion (e.g. to avoid warnings when [`clippy::as_conversions`][clippy_as] +/// lint is enabled). +/// +/// [as_convert]: https://doc.rust-lang.org/nomicon/casts.html +/// [clippy_as]: https://rust-lang.github.io/rust-clippy/master/index.html#as_conversions +/// +/// ## Implementors +/// +/// This trait is implemented for both [`f32`] and [`f64`]. +pub trait FloatConvert: Sized { + /// Floors the floating number and attempts to convert it into an integer. + /// See [`f32::floor`] for description of flooring logic. + /// + /// Returns `None` if the value will not fit into the integer range or value + /// is not a number. + /// + /// ## Examples + /// + /// ```rust + /// # use stdext::prelude::FloatConvert; + /// + /// let valid: Option = 10.5f32.checked_floor(); + /// let too_big: Option = 256f32.checked_floor(); + /// let nan: Option = f32::NAN.checked_floor(); + /// + /// assert_eq!(valid, Some(10u8)); + /// assert_eq!(too_big, None); + /// assert_eq!(nan, None); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_floor(self) -> Option; + + /// Ceils the floating number and attempts to convert it into an integer. + /// See [`f32::ceil`] for description of ceiling logic. + /// + /// Returns `None` if the value will not fit into the integer range or value + /// is not a number. + /// + /// ## Examples + /// + /// ```rust + /// # use stdext::prelude::FloatConvert; + /// + /// let valid: Option = 10.5f32.checked_ceil(); + /// let too_big: Option = 256f32.checked_ceil(); + /// let nan: Option = f32::NAN.checked_ceil(); + /// + /// assert_eq!(valid, Some(11u8)); + /// assert_eq!(too_big, None); + /// assert_eq!(nan, None); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_ceil(self) -> Option; + + /// Rounds the floating number and attempts to convert it into an integer. + /// See [`f32::round`] for description of rounding logic. + /// + /// Returns `None` if the value will not fit into the integer range or value + /// is not a number. + /// + /// ## Examples + /// + /// ```rust + /// # use stdext::prelude::FloatConvert; + /// + /// let valid: Option = 10.51f32.checked_round(); // Will be rounded up. + /// let too_big: Option = 256f32.checked_round(); + /// let nan: Option = f32::NAN.checked_round(); + /// + /// assert_eq!(valid, Some(11u8)); + /// assert_eq!(too_big, None); + /// assert_eq!(nan, None); + /// ``` + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_round(self) -> Option; + + /// Behaves the same as `number.floor() as `. + /// See [`f32::floor`] for description of flooring logic. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturated_floor(self) -> Int; + + /// Behaves the same as `number.ceil() as `. + /// See [`f32::ceil`] for description of flooring logic. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturated_ceil(self) -> Int; + + /// Behaves the same as `number.round() as `. + /// See [`f32::round`] for description of flooring logic. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturated_round(self) -> Int; +} + +macro_rules! checked_impl { + ($val:ident.$fn:ident(), $int:ty) => {{ + if $val.is_nan() || $val.is_infinite() { + return None; + } + let converted = $val.$fn(); + if <$int>::MIN as Self <= converted && converted <= <$int>::MAX as Self { + Some(converted as $int) + } else { + None + } + }}; +} + +macro_rules! saturated_impl { + ($val:ident.$fn:ident(), $int:ty) => {{ + $val.$fn() as $int + }}; +} + +macro_rules! impl_float_convert { + ($float:ty, $($int:ty),+) => { + $(impl FloatConvert<$int> for $float { + fn checked_floor(self) -> Option<$int> { + checked_impl!(self.floor(), $int) + } + + fn checked_ceil(self) -> Option<$int> { + checked_impl!(self.ceil(), $int) + } + + fn checked_round(self) -> Option<$int> { + checked_impl!(self.round(), $int) + } + + fn saturated_floor(self) -> $int { + saturated_impl!(self.floor(), $int) + } + + fn saturated_ceil(self) -> $int { + saturated_impl!(self.ceil(), $int) + } + + fn saturated_round(self) -> $int { + saturated_impl!(self.round(), $int) + } + })+ + }; +} + +impl_float_convert!(f32, u8, u16, u32, u64, u128); +impl_float_convert!(f32, i8, i16, i32, i64, i128); +impl_float_convert!(f32, usize, isize); + +impl_float_convert!(f64, u8, u16, u32, u64, u128); +impl_float_convert!(f64, i8, i16, i32, i64, i128); +impl_float_convert!(f64, usize, isize); diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/num/integer.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/integer.rs new file mode 100644 index 0000000..8798c65 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/integer.rs @@ -0,0 +1,469 @@ +// This interface copies `std` one, thus we must discard clippy complains. +#![allow(clippy::wrong_self_convention)] + +//! Extensions for built-in integer traits. + +use std::num::ParseIntError; +use std::ops::{ + Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign, + Mul, MulAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, +}; + +/// Built-in integers interface exposed as a trait. +/// +/// This trait is implemented for all the built-in integer types and copies their interface completely, +/// so it's possible to write generic code that accepts any integer number. +/// +/// Interface includes all the trait implementations as well, such as [`Copy`], [`Add`] or [`BitXorAssign`]. +/// +/// ## Caveats +/// +/// - `__bytes` are not implemented, as the return type (array of generic const length that +/// depends on the trait itself) cannot in be expressed in stable rust. +/// +/// - `is_power_of_two` / `next_power_of_two` / `checked_next_power_of_two` methods are not implemented, +/// as they exist for the unsigned numbers only. +pub trait Integer: + Sized + + Add + + AddAssign + + Sub + + SubAssign + + Shr + + ShrAssign + + Shl + + ShlAssign + + BitAnd + + BitAndAssign + + BitOr + + BitOrAssign + + BitXor + + BitXorAssign + + Div + + DivAssign + + Mul + + MulAssign + + Copy +{ + /// The smallest value that can be represented by this integer type. + const MIN: Self; + /// The largest value that can be represented by this integer type. + const MAX: Self; + /// The size of this integer type in bits. + const BITS: u32; + + /// See [`u128::from_str_radix`]. + fn from_str_radix(src: &str, radix: u32) -> Result; + + /// See [`u128::count_ones`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn count_ones(self) -> u32; + + /// See [`u128::count_zeros`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn count_zeros(self) -> u32; + + /// See [`u128::leading_zeros`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn leading_zeros(self) -> u32; + + /// See [`u128::trailing_zeros`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn trailing_zeros(self) -> u32; + + /// See [`u128::leading_ones`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn leading_ones(self) -> u32; + + /// See [`u128::trailing_ones`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn trailing_ones(self) -> u32; + + /// See [`u128::rotate_left`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn rotate_left(self, n: u32) -> Self; + + /// See [`u128::rotate_right`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn rotate_right(self, n: u32) -> Self; + + /// See [`u128::swap_bytes`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn swap_bytes(self) -> Self; + + /// See [`u128::reverse_bits`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn reverse_bits(self) -> Self; + + /// See [`u128::from_be`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn from_be(x: Self) -> Self; + + /// See [`u128::from_le`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn from_le(x: Self) -> Self; + + /// See [`u128::to_be`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn to_be(self) -> Self; + + /// See [`u128::to_le`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn to_le(self) -> Self; + + /// See [`u128::checked_add`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_add(self, rhs: Self) -> Option; + + /// See [`u128::checked_sub`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_sub(self, rhs: Self) -> Option; + + /// See [`u128::checked_mul`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_mul(self, rhs: Self) -> Option; + + /// See [`u128::checked_div`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_div(self, rhs: Self) -> Option; + + /// See [`u128::checked_div_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_div_euclid(self, rhs: Self) -> Option; + + /// See [`u128::checked_rem`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_rem(self, rhs: Self) -> Option; + + /// See [`u128::checked_rem_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_rem_euclid(self, rhs: Self) -> Option; + + /// See [`u128::checked_neg`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_neg(self) -> Option; + + /// See [`u128::checked_shl`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_shl(self, rhs: u32) -> Option; + + /// See [`u128::checked_shr`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_shr(self, rhs: u32) -> Option; + + /// See [`u128::checked_pow`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn checked_pow(self, exp: u32) -> Option; + + /// See [`u128::saturating_add`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturating_add(self, rhs: Self) -> Self; + + /// See [`u128::saturating_sub`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturating_sub(self, rhs: Self) -> Self; + + /// See [`u128::saturating_mul`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturating_mul(self, rhs: Self) -> Self; + + /// See [`u128::saturating_pow`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn saturating_pow(self, exp: u32) -> Self; + + /// See [`u128::wrapping_add`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_add(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_sub`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_sub(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_mul`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_mul(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_div`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_div(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_div_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_div_euclid(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_rem`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_rem(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_rem_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_rem_euclid(self, rhs: Self) -> Self; + + /// See [`u128::wrapping_neg`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_neg(self) -> Self; + + /// See [`u128::wrapping_shl`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_shl(self, rhs: u32) -> Self; + + /// See [`u128::wrapping_shr`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_shr(self, rhs: u32) -> Self; + + /// See [`u128::wrapping_pow`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn wrapping_pow(self, exp: u32) -> Self; + + /// See [`u128::overflowing_add`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_add(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_sub`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_sub(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_mul`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_mul(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_div`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_div(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_div_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_rem`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_rem(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_rem_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool); + + /// See [`u128::overflowing_neg`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_neg(self) -> (Self, bool); + + /// See [`u128::overflowing_shr`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_shr(self, rhs: u32) -> (Self, bool); + + /// See [`u128::overflowing_pow`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn overflowing_pow(self, exp: u32) -> (Self, bool); + + /// See [`u128::pow`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn pow(self, exp: u32) -> Self; + + /// See [`u128::div_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn div_euclid(self, rhs: Self) -> Self; + + /// See [`u128::rem_euclid`]. + #[must_use = "this returns the result of the operation, without modifying the original"] + fn rem_euclid(self, rhs: Self) -> Self; +} + +macro_rules! impl_integer { + ($($int:ty),+) => { + $( + impl Integer for $int { + const MIN: Self = Self::MIN; + const MAX: Self = Self::MAX; + const BITS: u32 = Self::BITS; + fn from_str_radix(src: &str, radix: u32) -> Result { + <$int>::from_str_radix(src, radix) + } + fn count_ones(self) -> u32 { + <$int>::count_ones(self) + } + fn count_zeros(self) -> u32 { + <$int>::count_zeros(self) + } + fn leading_zeros(self) -> u32 { + <$int>::leading_zeros(self) + } + fn trailing_zeros(self) -> u32 { + <$int>::trailing_zeros(self) + } + fn leading_ones(self) -> u32 { + <$int>::leading_ones(self) + } + fn trailing_ones(self) -> u32 { + <$int>::trailing_ones(self) + } + fn rotate_left(self, n: u32) -> Self { + <$int>::rotate_left(self, n) + } + fn rotate_right(self, n: u32) -> Self { + <$int>::rotate_right(self, n) + } + fn swap_bytes(self) -> Self { + <$int>::swap_bytes(self) + } + fn reverse_bits(self) -> Self { + <$int>::reverse_bits(self) + } + fn from_be(x: Self) -> Self { + <$int>::from_be(x) + } + fn from_le(x: Self) -> Self { + <$int>::from_le(x) + } + fn to_be(self) -> Self { + <$int>::to_be(self) + } + fn to_le(self) -> Self { + <$int>::to_le(self) + } + fn checked_add(self, rhs: Self) -> Option { + <$int>::checked_add(self, rhs) + } + fn checked_sub(self, rhs: Self) -> Option { + <$int>::checked_sub(self, rhs) + } + fn checked_mul(self, rhs: Self) -> Option { + <$int>::checked_mul(self, rhs) + } + fn checked_div(self, rhs: Self) -> Option { + <$int>::checked_div(self, rhs) + } + fn checked_div_euclid(self, rhs: Self) -> Option { + <$int>::checked_div_euclid(self, rhs) + } + fn checked_rem(self, rhs: Self) -> Option { + <$int>::checked_rem(self, rhs) + } + fn checked_rem_euclid(self, rhs: Self) -> Option { + <$int>::checked_rem_euclid(self, rhs) + } + fn checked_neg(self) -> Option { + <$int>::checked_neg(self) + } + fn checked_shl(self, rhs: u32) -> Option { + <$int>::checked_shl(self, rhs) + } + fn checked_shr(self, rhs: u32) -> Option { + <$int>::checked_shr(self, rhs) + } + fn checked_pow(self, exp: u32) -> Option { + <$int>::checked_pow(self, exp) + } + fn saturating_add(self, rhs: Self) -> Self { + <$int>::saturating_add(self, rhs) + } + fn saturating_sub(self, rhs: Self) -> Self { + <$int>::saturating_sub(self, rhs) + } + fn saturating_mul(self, rhs: Self) -> Self { + <$int>::saturating_mul(self, rhs) + } + fn saturating_pow(self, exp: u32) -> Self { + <$int>::saturating_pow(self, exp) + } + fn wrapping_add(self, rhs: Self) -> Self { + <$int>::wrapping_add(self, rhs) + } + fn wrapping_sub(self, rhs: Self) -> Self { + <$int>::wrapping_sub(self, rhs) + } + fn wrapping_mul(self, rhs: Self) -> Self { + <$int>::wrapping_mul(self, rhs) + } + fn wrapping_div(self, rhs: Self) -> Self { + <$int>::wrapping_div(self, rhs) + } + fn wrapping_div_euclid(self, rhs: Self) -> Self { + <$int>::wrapping_div_euclid(self, rhs) + } + fn wrapping_rem(self, rhs: Self) -> Self { + <$int>::wrapping_rem(self, rhs) + } + fn wrapping_rem_euclid(self, rhs: Self) -> Self { + <$int>::wrapping_rem_euclid(self, rhs) + } + fn wrapping_neg(self) -> Self { + <$int>::wrapping_neg(self) + } + fn wrapping_shl(self, rhs: u32) -> Self { + <$int>::wrapping_shl(self, rhs) + } + fn wrapping_shr(self, rhs: u32) -> Self { + <$int>::wrapping_shr(self, rhs) + } + fn wrapping_pow(self, exp: u32) -> Self { + <$int>::wrapping_pow(self, exp) + } + fn overflowing_add(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_add(self, rhs) + } + fn overflowing_sub(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_sub(self, rhs) + } + fn overflowing_mul(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_mul(self, rhs) + } + fn overflowing_div(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_div(self, rhs) + } + fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_div_euclid(self, rhs) + } + fn overflowing_rem(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_rem(self, rhs) + } + fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) { + <$int>::overflowing_rem_euclid(self, rhs) + } + fn overflowing_neg(self) -> (Self, bool) { + <$int>::overflowing_neg(self) + } + fn overflowing_shr(self, rhs: u32) -> (Self, bool) { + <$int>::overflowing_shr(self, rhs) + } + fn overflowing_pow(self, exp: u32) -> (Self, bool) { + <$int>::overflowing_pow(self, exp) + } + fn pow(self, exp: u32) -> Self { + <$int>::pow(self, exp) + } + fn div_euclid(self, rhs: Self) -> Self { + <$int>::div_euclid(self, rhs) + } + fn rem_euclid(self, rhs: Self) -> Self { + <$int>::rem_euclid(self, rhs) + } + } + )+ + }; +} + +impl_integer!(u8, u16, u32, u64, u128); +impl_integer!(i8, i16, i32, i64, i128); +impl_integer!(usize, isize); + +#[cfg(test)] +mod tests { + #[test] + fn basic() { + assert_eq!(::BITS, u8::BITS); + assert_eq!( + ::trailing_ones(10u32), + 10u32.trailing_ones() + ); + } + + fn accepts_any_integer(a: I, b: I) -> u32 { + (a + b).count_ones() + } + + #[test] + fn composite() { + assert_eq!(accepts_any_integer(0u8, 0u8), 0); + assert_eq!(accepts_any_integer(1i128, 0i128), 1); + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/num/mod.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/mod.rs new file mode 100644 index 0000000..bcf46f8 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/num/mod.rs @@ -0,0 +1,4 @@ +//! Extensions for the built-in numeric types. + +pub mod float_convert; +pub mod integer; diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/option.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/option.rs new file mode 100644 index 0000000..88b8c4a --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/option.rs @@ -0,0 +1,124 @@ +//! Extension traits for `std::Option`. + +/// Extension trait with useful methods for [`std::option::Option`]. +/// +/// [`std::time::Option`]: https://doc.rust-lang.org/std/option/enum.Option.html +pub trait OptionExt { + /// Combines `self` and another `Option`. + /// + /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`. + /// Otherwise, `None` is returned. + /// + /// **Note:** `std::Option` already provides a [`zip`] method which serves exact same purpose, + /// but currently it's unstable. Once it's stabilized, this method will be marked as deprecated + /// with a prompt to use the stanard method instead. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let x = Some(1); + /// let y = Some("hi"); + /// let z = None::; + /// + /// assert_eq!(x.combine(y), Some((1, "hi"))); + /// assert_eq!(x.combine(z), None); + /// ``` + /// + /// [`zip`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.zip + fn combine(self, other: Option) -> Option<(T, U)>; + + /// Combines `self` and another `Option` with function `f`. + /// + /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`. + /// Otherwise, `None` is returned. + /// + /// **Note:** `std::Option` already provides a [`zip_with`] method which serves exact same purpose, + /// but currently it's unstable. Once it's stabilized, this method will be marked as deprecated + /// with a prompt to use the stanard method instead. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// #[derive(Debug, PartialEq)] + /// struct Point { + /// x: f64, + /// y: f64, + /// } + /// + /// impl Point { + /// fn new(x: f64, y: f64) -> Self { + /// Self { x, y } + /// } + /// } + /// + /// let x = Some(17.5); + /// let y = Some(42.7); + /// + /// assert_eq!(x.combine_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 })); + /// assert_eq!(x.combine_with(None, Point::new), None); + /// ``` + /// + /// [`zip_with`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.zip_with + fn combine_with(self, other: Option, f: F) -> Option + where + F: FnOnce(T, U) -> R; +} + +impl OptionExt for Option { + fn combine(self, other: Option) -> Option<(T, U)> { + match (self, other) { + (Some(left), Some(right)) => Some((left, right)), + _ => None, + } + } + + fn combine_with(self, other: Option, f: F) -> Option + where + F: FnOnce(T, U) -> R, + { + self.combine(other).map(|(l, r)| f(l, r)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn combine() { + // Test vector of (left, right, expected) values. + let test_vector = vec![ + (Some(1), Some(2), Some((1, 2))), + (Some(1), None, None), + (None, Some(2), None), + (None, None, None), + ]; + + for (left, right, expected) in test_vector { + assert_eq!(left.combine(right), expected); + } + } + + #[test] + fn combine_with() { + fn f(l: i32, r: i32) -> i32 { + l + r + } + + // Test vector of (left, right, expected) values. + let test_vector = vec![ + (Some(1), Some(2), Some(3)), + (Some(1), None, None), + (None, Some(2), None), + (None, None, None), + ]; + + for (left, right, expected) in test_vector { + assert_eq!(left.combine_with(right, f), expected); + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/result.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/result.rs new file mode 100644 index 0000000..bf56acb --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/result.rs @@ -0,0 +1,112 @@ +//! Extension traits for `std::Result`. + +/// Extension trait with useful methods for [`std::result::Result`]. +/// +/// [`std::result::Result`]: https://doc.rust-lang.org/std/result/enum.Result.html +pub trait ResultExt { + /// Combines `self` and another `Result`. + /// + /// If `self` is `Ok(s)` and `other` is `Ok(o)`, this method returns `Ok((s, o))`. + /// Otherwise, if the `self` is `Ok(s)` and `other` is `Err(e)`, this method returns `Err(e)`. + /// Otherwise, `self` is `Err(e)` and this method returns `Err(e)` (`other` is not taken into + /// account, as in short circuit calculations). + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let x = Ok(1); + /// let y = Ok("hi"); + /// let z: Result = Err("error"); + /// let z2: Result = Err("other_error"); + /// + /// assert_eq!(x.combine(y), Ok((1, "hi"))); + /// assert_eq!(x.combine(z), Err("error")); + /// assert_eq!(z.combine(z2), Err("error")); + /// ``` + fn combine(self, other: Result) -> Result<(T, U), E>; + + /// Combines `self` and another `Result` with function `f`. + /// + /// If `self` is `Ok(s)` and `other` is `Ok(o)`, this method returns `Ok(f(s, o))`. + /// Otherwise, if the `self` is `Ok(s)` and `other` is `Err(e)`, this method returns `Err(e)`. + /// Otherwise, `self` is `Err(e)` and this method returns `Err(e)` (`other` is not taken into + /// account, as in short circuit calculations). + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let x = Ok(1); + /// let y = Ok(2); + /// let z: Result = Err("error"); + /// let z2: Result = Err("other_error"); + /// + /// assert_eq!(x.combine_with(y, |l, r| l + r), Ok(3)); + /// assert_eq!(x.combine_with(z, |l, r| l + r), Err("error")); + /// assert_eq!(z.combine_with(z2, |l, r| l + r), Err("error")); + /// ``` + /// + /// [`zip_with`]: https://doc.rust-lang.org/std/Result/enum.Result.html#method.zip_with + fn combine_with(self, other: Result, f: F) -> Result + where + F: FnOnce(T, U) -> R; +} + +impl ResultExt for Result { + fn combine(self, other: Result) -> Result<(T, U), E> { + match (self, other) { + (Ok(left), Ok(right)) => Ok((left, right)), + (Ok(_), Err(err)) => Err(err), + (Err(err), _) => Err(err), + } + } + + fn combine_with(self, other: Result, f: F) -> Result + where + F: FnOnce(T, U) -> R, + { + self.combine(other).map(|(l, r)| f(l, r)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn combine() { + // Test vector of (left, right, expected) values. + let test_vector = vec![ + (Ok(1), Ok(2), Ok((1, 2))), + (Ok(1), Err("right"), Err("right")), + (Err("left"), Ok(2), Err("left")), + (Err("left"), Err("right"), Err("left")), + ]; + + for (left, right, expected) in test_vector { + assert_eq!(left.combine(right), expected); + } + } + + #[test] + fn combine_with() { + fn f(l: i32, r: i32) -> i32 { + l + r + } + + // Test vector of (left, right, expected) values. + let test_vector = vec![ + (Ok(1), Ok(2), Ok(3)), + (Ok(1), Err("right"), Err("right")), + (Err("left"), Ok(2), Err("left")), + (Err("left"), Err("right"), Err("left")), + ]; + + for (left, right, expected) in test_vector { + assert_eq!(left.combine_with(right, f), expected); + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/str.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/str.rs new file mode 100644 index 0000000..b7b62f2 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/str.rs @@ -0,0 +1,76 @@ +//! Extension traits for `str` primitive type. + +/// Alternative for `std::str::pattern::Pattern` that does not require +/// nightly Rust (as `Pattern` is unstable yet). +#[doc(hidden)] +pub enum AltPattern<'a> { + Str(&'a str), + Char(char), +} + +impl<'a> From<&'a str> for AltPattern<'a> { + fn from(data: &'a str) -> Self { + Self::Str(data) + } +} + +impl<'a> From for AltPattern<'a> { + fn from(data: char) -> Self { + Self::Char(data) + } +} + +/// Extension trait with useful methods for primitive type [`str`]. +/// +/// [`str`]: https://doc.rust-lang.org/std/primitive.str.html +pub trait StrExt { + /// Version of [`str::splitn`] which expects the **exact** + /// amount of entries obtained after splitting. This method + /// returns `Vec`, as [`SplitN`] iterator depends on the unstable + /// type [`Pattern`] and cannot be returned on the stable Rust. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let data = "Hello world"; + /// let splitted = data.splitn_exact(2, " ").unwrap(); + /// assert_eq!(&splitted, &["Hello", "world"]); + /// + /// let splitted = data.splitn_exact(5, '-'); + /// assert!(splitted.is_none()); + /// ``` + /// + /// [`str::splitn`]: https://doc.rust-lang.org/std/primitive.str.html#method.splitn + /// [`SplitN`]: https://doc.rust-lang.org/std/str/struct.SplitN.html + /// [`Pattern`]: https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html + fn splitn_exact<'a, P: Into>>( + &'a self, + n: usize, + pat: P, + ) -> Option>; +} + +impl StrExt for &str { + fn splitn_exact<'a, P: Into>>( + &'a self, + n: usize, + pat: P, + ) -> Option> { + let pat = pat.into(); + // Overcome for `&str` splitting API: it accepts generic arguments as separators, + // but the `Pattern` trait is unstable, thus it's impossible to just forward arguments + // inside on stable Rust. + let splitted: Vec<_> = match pat { + AltPattern::Str(sep) => self.splitn(n, sep).collect(), + AltPattern::Char(sep) => self.splitn(n, sep).collect(), + }; + + if splitted.len() == n { + Some(splitted) + } else { + None + } + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mod.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mod.rs new file mode 100644 index 0000000..1050b60 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mod.rs @@ -0,0 +1,4 @@ +//! Extension traits for the standard synchronization primitives. + +pub mod mutex; +pub mod rw_lock; diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mutex.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mutex.rs new file mode 100644 index 0000000..091d152 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/mutex.rs @@ -0,0 +1,33 @@ +//! Extension traits for `std::sync::Mutex`. + +use std::sync::{Mutex, MutexGuard}; + +/// Extension trait with useful methods for [`std::sync::Mutex`]. +/// +/// [`std::sync::Mutex`]: https://doc.rust-lang.org/std/sync/struct.Mutex.html +pub trait MutexExt { + /// Shorthand for `mutex.lock().unwrap()` with a better panic message. + /// + /// This method is intended to be used in situations where poisoned locks are + /// considered an exceptional situation and should always result in panic. + /// + /// # Examples + /// + /// ``` + /// use std::sync::Mutex; + /// use stdext::prelude::*; + /// + /// let lock = Mutex::new(1); + /// + /// let n = lock.force_lock(); + /// assert_eq!(*n, 1); + /// ``` + fn force_lock(&self) -> MutexGuard; +} + +impl MutexExt for Mutex { + fn force_lock(&self) -> MutexGuard { + self.lock() + .expect("Unable to obtain lock: Mutex is poisoned") + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/rw_lock.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/rw_lock.rs new file mode 100644 index 0000000..c05419d --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/sync/rw_lock.rs @@ -0,0 +1,60 @@ +//! Extension traits for `std::sync::RwLock`. + +use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; + +/// Extension trait with useful methods for [`std::sync::RwLock`]. +/// +/// [`std::sync::RwLock`]: https://doc.rust-lang.org/std/sync/struct.RwLock.html +pub trait RwLockExt { + /// Shorthand for `lock.read().unwrap()` with a better panic message. + /// + /// This method is intended to be used in situations where poisoned locks are + /// considered an exceptional situation and should always result in panic. + /// + /// # Examples + /// + /// ``` + /// use std::sync::{Arc, RwLock}; + /// use stdext::prelude::*; + /// + /// let lock = Arc::new(RwLock::new(1)); + /// + /// let n = lock.force_read(); + /// assert_eq!(*n, 1); + /// ``` + fn force_read(&self) -> RwLockReadGuard; + + /// Shorthand for `lock.write().unwrap()` with a better panic message. + /// + /// This method is intended to be used in situations where poisoned locks are + /// considered an exceptional situation and should always result in panic. + /// + /// # Examples + /// + /// ``` + /// use std::sync::{Arc, RwLock}; + /// use stdext::prelude::*; + /// + /// let lock = Arc::new(RwLock::new(1)); + /// + /// { + /// let mut n = lock.force_write(); + /// *n = 2; + /// } + /// + /// let n = lock.force_read(); + /// assert_eq!(*n, 2); + /// ``` + fn force_write(&self) -> RwLockWriteGuard; +} + +impl RwLockExt for RwLock { + fn force_read(&self) -> RwLockReadGuard { + self.read() + .expect("Unable to obtain read lock: RwLock is poisoned") + } + fn force_write(&self) -> RwLockWriteGuard { + self.write() + .expect("Unable to obtain write lock: RwLock is poisoned") + } +} diff --git a/utsudo-0.0.2/lib/util/vendor/stdext/src/vec.rs b/utsudo-0.0.2/lib/util/vendor/stdext/src/vec.rs new file mode 100644 index 0000000..d06afd0 --- /dev/null +++ b/utsudo-0.0.2/lib/util/vendor/stdext/src/vec.rs @@ -0,0 +1,128 @@ +//! Extension traits for `std::Vec`. + +/// Extension trait with useful methods for [`std::vec::Vec`]. +/// +/// [`std::vec::Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html +pub trait VecExt { + /// Resizes the `Vec` in-place if the provided `new_len` is **greater** than + /// the current `Vec` length. + /// + /// In simple words, this method only make vector bigger, but not smaller. + /// Calling this method with a length smaller or equal to the current length will + /// do nothing. + /// + /// This method uses a closure to create new values on every push. If + /// you'd rather [`Clone`] a given value, use [`resize_up`]. If you want + /// to use the [`Default`] trait to generate values, you can pass + /// [`Default::default()`] as the second argument. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let mut vec = vec![1, 2, 3]; + /// vec.resize_up_with(5, Default::default); + /// assert_eq!(vec, [1, 2, 3, 0, 0]); + /// + /// let mut vec = vec![]; + /// let mut p = 1; + /// vec.resize_up_with(4, || { p *= 2; p }); + /// assert_eq!(vec, [2, 4, 8, 16]); + /// + /// let mut vec = vec![1, 2, 3]; + /// vec.resize_up_with(1, Default::default); + /// assert_eq!(vec, [1, 2, 3]); // Resizing to smaller size does nothing. + /// ``` + /// + /// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html + /// [`Default`]: https://doc.rust-lang.org/std/default/trait.Default.html + /// [`Default::default()`]: https://doc.rust-lang.org/std/default/trait.Default.html#tymethod.default + /// [`resize_up`]: ./trait.VecExtClone.html#tymethod.resize_up + fn resize_up_with(&mut self, new_len: usize, f: F) + where + F: FnMut() -> T; + + /// Removes the first instance of `item` from the vector if the item exists. + /// + /// Based on the unstable vec_remove_item feature, which has been deprecated and will be removed. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// let mut vec = vec![1, 2, 3, 1]; + /// + /// vec.remove_item(&1); + /// + /// assert_eq!(vec, vec![2, 3, 1]); + /// ``` + fn remove_item(&mut self, item: &V) -> Option + where + T: PartialEq; +} + +/// Extension trait with useful methods for [`std::vec::Vec`]. +/// +/// This trait contains functions that require `T` to implement `Clone` trait. +/// +/// [`std::vec::Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html +pub trait VecExtClone { + /// Resizes the `Vec` in-place if the provided `new_len` is **greater** than + /// the current `Vec` length. + /// + /// In simple words, this method only make vector bigger, but not smaller. + /// Calling this method with a length smaller or equal to the current length will + /// do nothing. + /// + /// This method requires `T` to implement [`Clone`], + /// in order to be able to clone the passed value. + /// If you need more flexibility (or want to rely on [`Default`] instead of + /// [`Clone`]), use [`resize_up_with`]. + /// + /// # Examples + /// + /// ``` + /// use stdext::prelude::*; + /// + /// let mut vec = vec!["hello"]; + /// vec.resize_up(3, "world"); + /// assert_eq!(vec, ["hello", "world", "world"]); + /// + /// let mut vec = vec![1, 2, 3, 4]; + /// vec.resize_up(2, 0); + /// assert_eq!(vec, [1, 2, 3, 4]); // Resizing to smaller size does nothing. + /// ``` + /// + /// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html + /// [`Default`]: https://doc.rust-lang.org/std/default/trait.Default.html + /// [`resize_up_with`]: ./trait.VecExt.html#tymethod.resize_up_with + fn resize_up(&mut self, new_len: usize, value: T); +} + +impl VecExt for Vec { + fn resize_up_with(&mut self, new_len: usize, f: F) + where + F: FnMut() -> T, + { + if self.len() < new_len { + self.resize_with(new_len, f); + } + } + + fn remove_item(&mut self, item: &V) -> Option + where + T: PartialEq, + { + let pos = self.iter().position(|x| *x == *item)?; + Some(self.remove(pos)) + } +} + +impl VecExtClone for Vec { + fn resize_up(&mut self, new_len: usize, value: T) { + if self.len() < new_len { + self.resize(new_len, value); + } + } +} diff --git a/utsudo-0.0.2/lib/zlib/Makefile.in b/utsudo-0.0.2/lib/zlib/Makefile.in new file mode 100644 index 0000000..0d35ae5 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/Makefile.in @@ -0,0 +1,216 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +cross_compiling = @CROSS_COMPILING@ + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ + +# File extension, mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/zlib.exp +shlib_map = zlib.map +shlib_opt = zlib.opt + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# C preprocessor flags +CPPFLAGS = -I. -I$(srcdir) + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = +LT_LDFLAGS = @ZLIB_LDFLAGS@ @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# Libtool style shared library version +SHLIB_VERSION = 0:0:0 + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +LTOBJS = adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo \ + gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo \ + trees.lo uncompr.lo zutil.lo + +all: libsudo_z.la + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) lib/zlib/Makefile.in + cd $(top_builddir) && ./config.status --file lib/zlib/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file lib/zlib/Makefile + +.SUFFIXES: .c .h .lo + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +libsudo_z.la: $(LTOBJS) @LT_LDDEP@ + case "$(LT_LDFLAGS)" in \ + *-no-install*) \ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(LDFLAGS) $(LT_LDFLAGS) $(LTOBJS);; \ + *) \ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) $(LTOBJS) -version-info $(SHLIB_VERSION) -rpath $(libexecdir)/sudo;; \ + esac + +pre-install: + +install: + case "$(LT_LDFLAGS)" in \ + *-no-install*) ;; \ + *) if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --quiet --mode=install $(INSTALL) $(INSTALL_OWNER) libsudo_z.la $(DESTDIR)$(libexecdir)/sudo; \ + fi;; \ + esac + +install-dirs: + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: + +uninstall: + $(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(libexecdir)/sudo/libsudo_z.la + -test -z "$(INSTALL_BACKUP)" || \ + rf -f $(DESTDIR)$(libexecdir)/sudo/libsudo_z.*~ + +splint: + +cppcheck: + +pvs-log-files: + +pvs-studio: + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a stamp-* \ + core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs zconf.h + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +adler32.lo: $(srcdir)/adler32.c $(srcdir)/zlib.h $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/adler32.c +compress.lo: $(srcdir)/compress.c $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/compress.c +crc32.lo: $(srcdir)/crc32.c $(srcdir)/crc32.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/crc32.c +deflate.lo: $(srcdir)/deflate.c $(srcdir)/deflate.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/deflate.c +gzclose.lo: $(srcdir)/gzclose.c $(srcdir)/gzguts.h $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gzclose.c +gzlib.lo: $(srcdir)/gzlib.c $(srcdir)/gzguts.h $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gzlib.c +gzread.lo: $(srcdir)/gzread.c $(srcdir)/gzguts.h $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gzread.c +gzwrite.lo: $(srcdir)/gzwrite.c $(srcdir)/gzguts.h $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gzwrite.c +infback.lo: $(srcdir)/infback.c $(srcdir)/inffast.h $(srcdir)/inffixed.h \ + $(srcdir)/inflate.h $(srcdir)/inftrees.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/infback.c +inffast.lo: $(srcdir)/inffast.c $(srcdir)/inffast.h $(srcdir)/inflate.h \ + $(srcdir)/inftrees.h $(srcdir)/zlib.h $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/inffast.c +inflate.lo: $(srcdir)/inflate.c $(srcdir)/inffast.h $(srcdir)/inffixed.h \ + $(srcdir)/inflate.h $(srcdir)/inftrees.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/inflate.c +inftrees.lo: $(srcdir)/inftrees.c $(srcdir)/inftrees.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/inftrees.c +trees.lo: $(srcdir)/trees.c $(srcdir)/deflate.h $(srcdir)/trees.h \ + $(srcdir)/zlib.h $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/trees.c +uncompr.lo: $(srcdir)/uncompr.c $(srcdir)/zlib.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/uncompr.c +zutil.lo: $(srcdir)/zutil.c $(srcdir)/gzguts.h $(srcdir)/zlib.h \ + $(srcdir)/zutil.h ./zconf.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/zutil.c diff --git a/utsudo-0.0.2/lib/zlib/adler32.c b/utsudo-0.0.2/lib/zlib/adler32.c new file mode 100644 index 0000000..d0be438 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/adler32.c @@ -0,0 +1,186 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521U /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32_z(adler, buf, len) + uLong adler; + const Bytef *buf; + z_size_t len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/utsudo-0.0.2/lib/zlib/compress.c b/utsudo-0.0.2/lib/zlib/compress.c new file mode 100644 index 0000000..e2db404 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/compress.c @@ -0,0 +1,86 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong left; + + left = *destLen; + *destLen = 0; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; + sourceLen -= stream.avail_in; + } + err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); + } while (err == Z_OK); + + *destLen = stream.total_out; + deflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/utsudo-0.0.2/lib/zlib/crc32.c b/utsudo-0.0.2/lib/zlib/crc32.c new file mode 100644 index 0000000..9580440 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/crc32.c @@ -0,0 +1,442 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, z_size_t)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, z_size_t)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + +#ifdef BYFOUR + +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *buf4++; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/utsudo-0.0.2/lib/zlib/crc32.h b/utsudo-0.0.2/lib/zlib/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/utsudo-0.0.2/lib/zlib/deflate.c b/utsudo-0.0.2/lib/zlib/deflate.c new file mode 100644 index 0000000..1e39dcb --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/deflate.c @@ -0,0 +1,2165 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef ZLIB_DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = (uInt)windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = (uInt)memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (deflateStateCheck(strm) || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + s->high_water) { + /* Flush the last buffer: */ + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; + } + if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; + s->nice_match = nice_length; + s->max_chain_length = (uInt)max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (deflateStateCheck(strm)) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; +#ifdef GZIP + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; +#endif + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + old_flush = s->last_flush; + s->last_flush = flush; + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + + status = strm->state->status; + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (deflateStateCheck(source) || dest == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = (int)s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* ZLIB_DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#ifndef MIN +#define MIN(a, b) ((a) > (b) ? (b) : (a)) +#endif + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len != left + s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + +#ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) + left = len; + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* If the last block was written to next_out, then done. */ + if (last) + return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ + } + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (uInt)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/utsudo-0.0.2/lib/zlib/deflate.h b/utsudo-0.0.2/lib/zlib/deflate.h new file mode 100644 index 0000000..23ecdd3 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/utsudo-0.0.2/lib/zlib/gzclose.c b/utsudo-0.0.2/lib/zlib/gzclose.c new file mode 100644 index 0000000..caeb99a --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/utsudo-0.0.2/lib/zlib/gzguts.h b/utsudo-0.0.2/lib/zlib/gzguts.h new file mode 100644 index 0000000..85de933 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" +#include +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/utsudo-0.0.2/lib/zlib/gzlib.c b/utsudo-0.0.2/lib/zlib/gzlib.c new file mode 100644 index 0000000..4105e6a --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/gzlib.c @@ -0,0 +1,637 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + z_size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef WIDECHAR + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (z_size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef WIDECHAR + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef WIDECHAR + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ + state->mode = GZ_WRITE; /* simplify later checks */ + } + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef WIDECHAR +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/utsudo-0.0.2/lib/zlib/gzread.c b/utsudo-0.0.2/lib/zlib/gzread.c new file mode 100644 index 0000000..956b91e --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/gzread.c @@ -0,0 +1,654 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; + + *have = 0; + do { + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); + if (ret <= 0) + break; + *have += (unsigned)ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) + gz_statep state; + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return 0; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + + /* first just try copying data from the output buffer */ + if (state->x.have) { + if (state->x.have < n) + n = state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || n < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return 0; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return 0; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/utsudo-0.0.2/lib/zlib/gzwrite.c b/utsudo-0.0.2/lib/zlib/gzwrite.c new file mode 100644 index 0000000..c7b5651 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/gzwrite.c @@ -0,0 +1,665 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + strm->next_in = NULL; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; + } + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = state->out; + } + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) + gz_statep state; + voidpc buf; + z_size_t len; +{ + z_size_t put = len; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + state->strm.avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); + } + + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = (unsigned char)c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* write string */ + len = strlen(str); + ret = gz_write(state, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int len; + unsigned left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->err; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; +# else + len = vsprintf(next, format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); +# else + len = vsnprintf(next, state->size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + unsigned len, left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return Z_STREAM_ERROR; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->error; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->error; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (next[len] == 0) + break; +# else + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); +# else + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* compress remaining data with requested flush */ + (void)gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/utsudo-0.0.2/lib/zlib/infback.c b/utsudo-0.0.2/lib/zlib/infback.c new file mode 100644 index 0000000..59679ec --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = (uInt)windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/utsudo-0.0.2/lib/zlib/inffast.c b/utsudo-0.0.2/lib/zlib/inffast.c new file mode 100644 index 0000000..0dbd1db --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + *out++ = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/utsudo-0.0.2/lib/zlib/inffast.h b/utsudo-0.0.2/lib/zlib/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/utsudo-0.0.2/lib/zlib/inffixed.h b/utsudo-0.0.2/lib/zlib/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/utsudo-0.0.2/lib/zlib/inflate.c b/utsudo-0.0.2/lib/zlib/inflate.c new file mode 100644 index 0000000..ac333e8 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inflate.c @@ -0,0 +1,1561 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/utsudo-0.0.2/lib/zlib/inflate.h b/utsudo-0.0.2/lib/zlib/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/utsudo-0.0.2/lib/zlib/inftrees.c b/utsudo-0.0.2/lib/zlib/inftrees.c new file mode 100644 index 0000000..2ea08fc --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/utsudo-0.0.2/lib/zlib/inftrees.h b/utsudo-0.0.2/lib/zlib/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/utsudo-0.0.2/lib/zlib/trees.c b/utsudo-0.0.2/lib/zlib/trees.c new file mode 100644 index 0000000..50cf4b4 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/trees.c @@ -0,0 +1,1203 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2017 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef ZLIB_DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local const static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local const static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local const static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef ZLIB_DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* !ZLIB_DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef ZLIB_DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !ZLIB_DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = (int)value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* ZLIB_DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef ZLIB_DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); + } + if (overflow == 0) return; + + Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; +#endif +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef ZLIB_DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and write out the encoded block. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef ZLIB_DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} diff --git a/utsudo-0.0.2/lib/zlib/trees.h b/utsudo-0.0.2/lib/zlib/trees.h new file mode 100644 index 0000000..d35639d --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/utsudo-0.0.2/lib/zlib/uncompr.c b/utsudo-0.0.2/lib/zlib/uncompr.c new file mode 100644 index 0000000..f03a1a8 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/uncompr.c @@ -0,0 +1,93 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. +*/ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return uncompress2(dest, destLen, source, &sourceLen); +} diff --git a/utsudo-0.0.2/lib/zlib/zconf.h.in b/utsudo-0.0.2/lib/zlib/zconf.h.in new file mode 100644 index 0000000..5e6c4a2 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/zconf.h.in @@ -0,0 +1,556 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* The following four defines are enabled by sudo's configure script. */ +#undef HAVE_DSO_VISIBILITY +#undef HAVE_MEMCPY +#undef HAVE_UNISTD_H +#undef HAVE_VSNPRINTF +#undef _FILE_OFFSET_BITS +#undef _LARGE_FILES +#undef const + +/* We build sudo and its libs with -fvisibility=hidden where supported. */ +#ifdef HAVE_DSO_VISIBILITY +# if defined(__GNUC__) +# define ZEXTERN extern __attribute__((__visibility__("default"))) +# elif defined(__SUNPRO_C) +# define ZEXTERN extern __global +# elif defined(ZLIB_INTERNAL) +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +#endif + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/utsudo-0.0.2/lib/zlib/zlib.exp b/utsudo-0.0.2/lib/zlib/zlib.exp new file mode 100644 index 0000000..76ac35e --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/zlib.exp @@ -0,0 +1,85 @@ +adler32 +adler32_combine +adler32_combine64 +adler32_z +compress +compress2 +compressBound +crc32 +crc32_combine +crc32_combine64 +crc32_z +deflate +deflateBound +deflateCopy +deflateEnd +deflateGetDictionary +deflateInit2_ +deflateInit_ +deflateParams +deflatePending +deflatePrime +deflateReset +deflateResetKeep +deflateSetDictionary +deflateSetHeader +deflateTune +get_crc_table +gzbuffer +gzclearerr +gzclose +gzclose_r +gzclose_w +gzdirect +gzdopen +gzeof +gzerror +gzflush +gzfread +gzfwrite +gzgetc +gzgetc_ +gzgets +gzoffset +gzoffset64 +gzopen +gzopen64 +gzprintf +gzputc +gzputs +gzread +gzrewind +gzseek +gzseek64 +gzsetparams +gztell +gztell64 +gzungetc +gzvprintf +gzwrite +inflate +inflateBack +inflateBackEnd +inflateBackInit_ +inflateCodesUsed +inflateCopy +inflateEnd +inflateGetDictionary +inflateGetHeader +inflateInit2_ +inflateInit_ +inflateMark +inflatePrime +inflateReset +inflateReset2 +inflateResetKeep +inflateSetDictionary +inflateSync +inflateSyncPoint +inflateUndermine +inflateValidate +uncompress +uncompress2 +zError +zlibCompileFlags +zlibVersion diff --git a/utsudo-0.0.2/lib/zlib/zlib.h b/utsudo-0.0.2/lib/zlib/zlib.h new file mode 100644 index 0000000..f09cdaf --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/zlib.h @@ -0,0 +1,1912 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/utsudo-0.0.2/lib/zlib/zutil.c b/utsudo-0.0.2/lib/zlib/zutil.c new file mode 100644 index 0000000..a76c6b0 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/zutil.c @@ -0,0 +1,325 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/utsudo-0.0.2/lib/zlib/zutil.h b/utsudo-0.0.2/lib/zlib/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/utsudo-0.0.2/lib/zlib/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/utsudo-0.0.2/log2cl.pl b/utsudo-0.0.2/log2cl.pl new file mode 100755 index 0000000..fe0c790 --- /dev/null +++ b/utsudo-0.0.2/log2cl.pl @@ -0,0 +1,104 @@ +#!/usr/bin/env perl +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2017 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Simple script to massage "git log" output into a GNU style ChangeLog. +# The goal is to emulate "hg log --style=changelog" via perl format. + +use warnings; + +my $format="%ad %aN <%aE>%n%h%n%B%n"; +my @cmd = ("git", "log", "--log-size", "--name-only", "--date=short", "--format=$format", @ARGV); +open(LOG, '-|', @cmd) || die "$0: unable to run git log: $!"; + +my $hash; +my $body; +my @files; +my $key_date = ""; +my $log_size = 0; +my @lines; + +while () { + chomp; + if (/^log size (\d+)$/) { + $log_size = $1; + + # Print previous entry if there is one + print_entry($hash, $body, @files) if defined($hash); + + # Init new entry + undef $hash; + undef $body; + undef @files; + undef @lines; + + # Read entry and split on newlines + read(LOG, my $buf, $log_size) || + die "$0: unable to read $log_size bytes: $!\n"; + @lines = split(/\r?\n/, $buf); + + # Check for continued entry (duplicate Date + Author) + $_ = shift(@lines); + if ($_ ne $key_date) { + # New entry + print "$_\n\n"; + $key_date = $_; + } + + # Hash comes first + $hash = shift(@lines); + + # Commit message body (multi-line) + foreach (@lines) { + last if $_ eq "--HG--"; + if (defined($body)) { + $_ = "\r" if $_ eq ""; + $body .= " $_"; + } else { + $body = $_; + } + } + } else { + # Not a log entry, must be the file list + push(@files, $_) unless $_ eq ""; + } +} + +# Print the last entry +print_entry($hash, $body, @files) if defined($hash); + +exit(0); + +sub print_entry +{ + my $hash = '[' . shift . ']'; + my $body = shift; + my $files = "* " . join(", ", @_) . ":"; + + local $= = 9999; # to silence warning (hack) + + format = + ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ + $files + ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ + $body + @* + $hash + +. + write; +} diff --git a/utsudo-0.0.2/ltmain.sh b/utsudo-0.0.2/ltmain.sh new file mode 100644 index 0000000..20bec0d --- /dev/null +++ b/utsudo-0.0.2/ltmain.sh @@ -0,0 +1,11167 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + fix_hardcoded_libdir_flag= + fix_hardcoded_libdir_flag_ld= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + elif test -n "$fix_hardcoded_libdir_flag_spec"; then + add_dir="-L${absdir}" + add="-l$name" + if test "${linkmode}" = prog && test "X${absdir}" != "X${libdir}"; then + linkdir=$absdir + eval "fix_hardcoded_libdir_flag=\"\${fix_hardcoded_libdir_flag} ${fix_hardcoded_libdir_flag_spec}\"" + # fix_hardcoded_libdir_flag_ld not needed, programs are linked with $CC + $lt_unset linkdir + fi + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" && + test -n "${fix_hardcoded_libdir_flag_spec}"; then + linkdir="$inst_prefix_dir$libdir" + add_dir="-L$linkdir" + eval "fix_hardcoded_libdir_flag=\"\${fix_hardcoded_libdir_flag} ${fix_hardcoded_libdir_flag_spec}\"" + eval "fix_hardcoded_libdir_flag_ld=\"\${fix_hardcoded_libdir_flag_ld} ${fix_hardcoded_libdir_flag_spec_ld}\"" + $lt_unset linkdir + fi + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/utsudo-0.0.2/m4/ax_append_flag.m4 b/utsudo-0.0.2/m4/ax_append_flag.m4 new file mode 100644 index 0000000..08f2e07 --- /dev/null +++ b/utsudo-0.0.2/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/utsudo-0.0.2/m4/ax_check_compile_flag.m4 b/utsudo-0.0.2/m4/ax_check_compile_flag.m4 new file mode 100644 index 0000000..c3a8d69 --- /dev/null +++ b/utsudo-0.0.2/m4/ax_check_compile_flag.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/utsudo-0.0.2/m4/ax_check_link_flag.m4 b/utsudo-0.0.2/m4/ax_check_link_flag.m4 new file mode 100644 index 0000000..e2d0d36 --- /dev/null +++ b/utsudo-0.0.2/m4/ax_check_link_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/utsudo-0.0.2/m4/ax_func_getaddrinfo.m4 b/utsudo-0.0.2/m4/ax_func_getaddrinfo.m4 new file mode 100644 index 0000000..de3301b --- /dev/null +++ b/utsudo-0.0.2/m4/ax_func_getaddrinfo.m4 @@ -0,0 +1,70 @@ +# +# SYNOPSIS +# +# AX_FUNC_GETADDRINFO +# +# DESCRIPTION +# +# Checks for the getaddrinfo function in the standard C library, +# as well as the socket and inet libraries, if they are present. +# If extra libraries are required, they are added to LIBS. +# If no getaddrinfo function is found, it is added to LIBOBJS. +# Note: Tru64 UNIX contains two versions of getaddrinfo and we must +# include netdb.h to get the proper definition. +# +# LICENSE +# +# Placed in the public domain by Todd C. Miller on November 20, 2013. +# + +AC_DEFUN([AX_FUNC_GETADDRINFO], +[AC_MSG_CHECKING(for getaddrinfo) +AC_CACHE_VAL(ax_cv_func_getaddrinfo, +[AC_LINK_IFELSE([AC_LANG_SOURCE([[#include +#include +#include +int main() { return getaddrinfo(0, 0, 0, 0); }]])], [ax_cv_func_getaddrinfo=yes], [ax_cv_func_getaddrinfo=no])]) +AC_MSG_RESULT([$ax_cv_func_getaddrinfo]) +if test X"$ax_cv_func_getaddrinfo" = X"yes"; then + AC_DEFINE(HAVE_GETADDRINFO, 1, [Define to 1 if you have the `getaddrinfo' function.]) +else + # Not found in libc, check libsocket and libinet + _found=no + for _libs in "-lsocket" "-linet" "-lsocket -lnsl"; do + _cv="ax_cv_lib_getaddrinfo`echo \"$_libs\"|sed -e 's/-l/_/g' -e 's/ *//g'`" + AC_MSG_CHECKING([for getaddrinfo in $_libs]) + AC_CACHE_VAL([$_cv], [ + _nlibs= + for _l in $_libs; do + case "$LIBS" in + *"$_l"*) ;; + *) _nlibs="$_nlibs $_l";; + esac + done + _libs="${_nlibs# }" + if test -z "$_libs"; then + # No new libs to check + eval $_cv=no + else + AX_FUNC_GETADDRINFO_OLIBS="$LIBS" + LIBS="$LIBS $_libs" + AC_LINK_IFELSE([AC_LANG_SOURCE([[#include + #include + #include + int main() { return getaddrinfo(0, 0, 0, 0); }]])], [eval $_cv=yes], [eval $_cv=no]) + LIBS="$AX_FUNC_GETADDRINFO_OLIBS" + fi + ]) + if eval test \$$_cv = "yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_GETADDRINFO) + test -n "$_libs" && LIBS="$LIBS $_libs" + break + fi + AC_MSG_RESULT([no]) + done + if eval test \$$_cv != "yes"; then + AC_LIBOBJ(getaddrinfo) + fi +fi +]) diff --git a/utsudo-0.0.2/m4/ax_func_snprintf.m4 b/utsudo-0.0.2/m4/ax_func_snprintf.m4 new file mode 100644 index 0000000..f0dccf0 --- /dev/null +++ b/utsudo-0.0.2/m4/ax_func_snprintf.m4 @@ -0,0 +1,82 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_func_snprintf.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_FUNC_SNPRINTF +# +# DESCRIPTION +# +# Checks for a fully C99 compliant snprintf, in particular checks whether +# it does bounds checking and returns the correct string length; does the +# same check for vsnprintf. If no working snprintf or vsnprintf is found, +# request a replacement and warn the user about it. Note: the mentioned +# replacement is freely available and may be used in any project +# regardless of it's license. +# +# LICENSE +# +# Copyright (c) 2008 Ruediger Kuhlmann +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 5 + +AC_DEFUN([AX_FUNC_SNPRINTF], +[AC_CHECK_FUNCS(snprintf vsnprintf) +AC_MSG_CHECKING(for working snprintf) +AC_CACHE_VAL(ac_cv_have_working_snprintf, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = snprintf (bufs, 2, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = snprintf (bufd, 2, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +}]])],[ac_cv_have_working_snprintf=yes],[ac_cv_have_working_snprintf=no],[ac_cv_have_working_snprintf=cross])]) +AC_MSG_RESULT([$ac_cv_have_working_snprintf]) +AC_MSG_CHECKING(for working vsnprintf) +AC_CACHE_VAL(ac_cv_have_working_vsnprintf, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +#include + +int my_vsnprintf (char *buf, const char *tmpl, ...) +{ + int i; + va_list args; + va_start (args, tmpl); + i = vsnprintf (buf, 2, tmpl, args); + va_end (args); + return i; +} + +int main(void) +{ + char bufs[5] = { 'x', 'x', 'x', '\0', '\0' }; + char bufd[5] = { 'x', 'x', 'x', '\0', '\0' }; + int i; + i = my_vsnprintf (bufs, "%s", "111"); + if (strcmp (bufs, "1")) exit (1); + if (i != 3) exit (1); + i = my_vsnprintf (bufd, "%d", 111); + if (strcmp (bufd, "1")) exit (1); + if (i != 3) exit (1); + exit(0); +}]])],[ac_cv_have_working_vsnprintf=yes],[ac_cv_have_working_vsnprintf=no],[ac_cv_have_working_vsnprintf=cross])]) +AC_MSG_RESULT([$ac_cv_have_working_vsnprintf]) +if test x$ac_cv_have_working_snprintf$ac_cv_have_working_vsnprintf != "xyesyes"; then + AC_LIBOBJ(snprintf) + AC_MSG_WARN([Replacing missing/broken (v)snprintf() with sudo's version.]) + AC_DEFINE(PREFER_PORTABLE_SNPRINTF, 1, [Enable replacement (v)snprintf if system (v)snprintf is broken.]) +fi]) diff --git a/utsudo-0.0.2/m4/libtool.m4 b/utsudo-0.0.2/m4/libtool.m4 new file mode 100644 index 0000000..f9aabab --- /dev/null +++ b/utsudo-0.0.2/m4/libtool.m4 @@ -0,0 +1,8444 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test -z "$_LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)= + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + _LT_TAGVAR(module_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + _LT_TAGVAR(module_cmds, $1)='$LD -b -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir $fix_hardcoded_libdir_flag' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + # gcc-3.0.1 (collect2) breaks on -Wl,+cdp. + # HP-cc ignores -Wl,+cdp, and we test the linker for +cdp support. + AC_CACHE_CHECK([if +cdp linker flag works], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,+cdp -Wl,/usr/lib/libc.1:/nonexistent -Wl,+cdp -Wl,/lib/libc.1:/nonexistent" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=yes], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no]) + LDFLAGS="$save_LDFLAGS" + ]) + if test "$_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)" = yes; then + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)='${wl}+cdp ${wl}${linkdir}/${dlname}:${libdir}/${dlname}' + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)='+cdp ${linkdir}/${dlname}:${libdir}/${dlname}' + fi + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(module_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(module_cmds, $1)='$CC -shared $pic_flag $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + _LT_TAGVAR(module_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(module_cmds, $1)='$CC -b -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(module_cmds, $1)='$CC -b $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [ + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + _LT_TAGVAR(module_cmds, $1)='$CC -b -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + ], [ + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + _LT_TAGVAR(module_cmds, $1)='$LD -b -o $lib $libobjs $deplibs $linker_flags $fix_hardcoded_libdir_flag_ld' + ])], + [ + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + _LT_TAGVAR(module_cmds, $1)='$CC -b -o $lib $libobjs $deplibs $compiler_flags $fix_hardcoded_libdir_flag' + ]) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir $fix_hardcoded_libdir_flag' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + # gcc-3.0.1 (collect2) breaks on -Wl,+cdp. + # HP-cc ignores -Wl,+cdp, and we test the linker for +cdp support. + AC_CACHE_CHECK([if +cdp linker flag works], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,+cdp -Wl,/usr/lib/libc.1:/nonexistent -Wl,+cdp -Wl,/lib/libc.1:/nonexistent" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=yes], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no]) + LDFLAGS="$save_LDFLAGS" + ]) + if test "$_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)" = yes; then + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)='${wl}+cdp ${wl}${linkdir}/${dlname}:${libdir}/${dlname}' + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)='+cdp ${linkdir}/${dlname}:${libdir}/${dlname}' + fi + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [fix_hardcoded_libdir_flag_spec], [1], + [Flag to modify a path being hardcoded into the resulting binary]) +_LT_TAGDECL([], [fix_hardcoded_libdir_flag_spec_ld], [1], + [If ld is used when linking, flag to modify a path being hardcoded into the resulting binary]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)= +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir $fix_hardcoded_libdir_flag' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + # gcc-3.0.1 (collect2) breaks on -Wl,+cdp. + # HP-aCC ignores -Wl,+cdp, and we test the linker for +cdp support. + AC_CACHE_CHECK([if +cdp linker flag works], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,+cdp -Wl,/usr/lib/libc.1:/nonexistent -Wl,+cdp -Wl,/lib/libc.1:/nonexistent" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=yes], + [_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)=no]) + LDFLAGS="$save_LDFLAGS" + ]) + if test "$_LT_TAGVAR(lt_cv_ldflag_cdp_works, $1)" = yes; then + _LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)='${wl}+cdp ${wl}${linkdir}/${dlname}:${libdir}/${dlname}' + fi + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $fix_hardcoded_libdir_flag' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $fix_hardcoded_libdir_flag' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)= +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec, $1)= +_LT_TAGVAR(fix_hardcoded_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/utsudo-0.0.2/m4/ltoptions.m4 b/utsudo-0.0.2/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/utsudo-0.0.2/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/utsudo-0.0.2/m4/ltsugar.m4 b/utsudo-0.0.2/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/utsudo-0.0.2/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/utsudo-0.0.2/m4/ltversion.m4 b/utsudo-0.0.2/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/utsudo-0.0.2/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/utsudo-0.0.2/m4/lt~obsolete.m4 b/utsudo-0.0.2/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/utsudo-0.0.2/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/utsudo-0.0.2/m4/utsudo.m4 b/utsudo-0.0.2/m4/utsudo.m4 new file mode 100644 index 0000000..a34da66 --- /dev/null +++ b/utsudo-0.0.2/m4/utsudo.m4 @@ -0,0 +1,510 @@ +dnl Local m4 macros for autoconf (used by sudo) +dnl +dnl SPDX-License-Identifier: ISC +dnl +dnl Copyright (c) 1994-1996, 1998-2005, 2007-2015 +dnl Todd C. Miller +dnl +dnl Permission to use, copy, modify, and distribute this software for any +dnl purpose with or without fee is hereby granted, provided that the above +dnl copyright notice and this permission notice appear in all copies. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +dnl WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +dnl MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +dnl ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +dnl WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +dnl ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +dnl OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +dnl +dnl XXX - should cache values in all cases!!! +dnl +dnl checks for programs + +dnl +dnl check for sendmail in well-known locations +dnl +AC_ARG_VAR([SENDMAILPROG], [The fully-qualified path to the sendmail program to use.]) +AC_DEFUN([SUDO_PROG_SENDMAIL], [ + AC_PATH_PROG([SENDMAILPROG], [sendmail], [], [/usr/sbin$PATH_SEPARATOR/usr/lib$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/usr/ucblib$PATH_SEPARATOR/usr/local/lib$PATH_SEPARATOR/usr/local/bin]) + test -n "${ac_cv_path_SENDMAILPROG}" && SUDO_DEFINE_UNQUOTED(_PATH_SUDO_SENDMAIL, "${ac_cv_path_SENDMAILPROG}") +])dnl + +dnl +dnl check for vi in well-known locations +dnl +AC_ARG_VAR([VIPROG], [The fully-qualified path to the vi program to use.]) +AC_DEFUN([SUDO_PROG_VI], [ + AC_PATH_PROG([VIPROG], [vi], [], [/usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/ucb$PATH_SEPARATOR/usr/bsd$PATH_SEPARATOR/usr/local/bin]) + test -n "${ac_cv_path_VIPROG}" && SUDO_DEFINE_UNQUOTED(_PATH_VI, "${ac_cv_path_VIPROG}") +])dnl + +dnl +dnl check for mv in well-known locations +dnl +AC_ARG_VAR([MVPROG], [The fully-qualified path to the mv program to use.]) +AC_DEFUN([SUDO_PROG_MV], [ + AC_PATH_PROG([MVPROG], [mv], [], [/usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/ucb$PATH_SEPARATOR/usr/local/bin]) + test -n "${ac_cv_path_MVPROG}" && SUDO_DEFINE_UNQUOTED(_PATH_MV, "${ac_cv_path_MVPROG}") +])dnl + +dnl +dnl check for bourne shell in well-known locations +dnl +AC_ARG_VAR([BSHELLPROG], [The fully-qualified path to the Bourne shell to use.]) +AC_DEFUN([SUDO_PROG_BSHELL], [ + AC_PATH_PROG([BSHELLPROG], [sh], [/usr/bin$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/sbin$PATH_SEPARATOR/sbin]) + test -n "${ac_cv_path_BSHELLPROG}" && SUDO_DEFINE_UNQUOTED(_PATH_BSHELL, "${ac_cv_path_BSHELLPROG}") +])dnl + +dnl +dnl check for utmp file +dnl +AC_DEFUN([SUDO_PATH_UTMP], [AC_MSG_CHECKING([for utmp file path]) +found=no +for p in "/var/run/utmp" "/var/adm/utmp" "/etc/utmp"; do + if test -r "$p"; then + found=yes + AC_MSG_RESULT([$p]) + SUDO_DEFINE_UNQUOTED(_PATH_UTMP, "$p") + break + fi +done +if test X"$found" != X"yes"; then + AC_MSG_RESULT([not found]) +fi +])dnl + +dnl +dnl Where the log file goes, use /var/log if it exists, else /{var,usr}/adm +dnl +AC_DEFUN([SUDO_LOGFILE], [AC_MSG_CHECKING(for log file location) +if test -n "$with_logpath"; then + AC_MSG_RESULT($with_logpath) + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_LOGFILE, "$with_logpath") +elif test -d "/var/log"; then + AC_MSG_RESULT(/var/log/sudo.log) + SUDO_DEFINE(_PATH_SUDO_LOGFILE, "/var/log/sudo.log") +elif test -d "/var/adm"; then + AC_MSG_RESULT(/var/adm/sudo.log) + SUDO_DEFINE(_PATH_SUDO_LOGFILE, "/var/adm/sudo.log") +elif test -d "/usr/adm"; then + AC_MSG_RESULT(/usr/adm/sudo.log) + SUDO_DEFINE(_PATH_SUDO_LOGFILE, "/usr/adm/sudo.log") +else + AC_MSG_RESULT(unknown, you will have to set _PATH_SUDO_LOGFILE by hand) +fi +])dnl + +dnl +dnl Detect time zone file directory, if any. +dnl +AC_DEFUN([SUDO_TZDIR], [AC_MSG_CHECKING(time zone data directory) +tzdir="$with_tzdir" +if test -z "$tzdir"; then + tzdir=no + for d in /usr/share /usr/share/lib /usr/lib /etc; do + if test -d "$d/zoneinfo"; then + tzdir="$d/zoneinfo" + break + fi + done +fi +AC_MSG_RESULT([$tzdir]) +if test "${tzdir}" != "no"; then + SUDO_DEFINE_UNQUOTED(_PATH_ZONEINFO, "$tzdir") +fi +])dnl + +dnl +dnl Parent directory for time stamp dir. +dnl +AC_DEFUN([SUDO_RUNDIR], [AC_MSG_CHECKING(for sudo run dir location) +rundir="$with_rundir" +if test -z "$rundir"; then + for d in /run /var/run /var/db /var/lib /var/adm /usr/adm; do + if test -d "$d"; then + rundir="$d/sudo" + break + fi + done +fi +AC_MSG_RESULT([$rundir]) +SUDO_DEFINE_UNQUOTED(_PATH_SUDO_TIMEDIR, "$rundir/ts") +])dnl + +dnl +dnl Parent directory for the lecture status dir. +dnl +AC_DEFUN([SUDO_VARDIR], [AC_MSG_CHECKING(for sudo var dir location) +vardir="$with_vardir" +if test -z "$vardir"; then + for d in /var/db /var/lib /var/adm /usr/adm; do + if test -d "$d"; then + vardir="$d/sudo" + break + fi + done +fi +AC_MSG_RESULT([$vardir]) +SUDO_DEFINE_UNQUOTED(_PATH_SUDO_LECTURE_DIR, "$vardir/lectured") +])dnl + +dnl +dnl Where the I/O log files go, use /var/log/sudo-io if +dnl /var/log exists, else /{var,usr}/adm/sudo-io +dnl +AC_DEFUN([SUDO_IO_LOGDIR], [ + AC_MSG_CHECKING(for I/O log dir location) + if test "${with_iologdir-yes}" != "yes"; then + iolog_dir="$with_iologdir" + elif test -d "/var/log"; then + iolog_dir="/var/log/sudo-io" + elif test -d "/var/adm"; then + iolog_dir="/var/adm/sudo-io" + else + iolog_dir="/usr/adm/sudo-io" + fi + if test "${with_iologdir}" != "no"; then + SUDO_DEFINE_UNQUOTED(_PATH_SUDO_IO_LOGDIR, "$iolog_dir") + fi + AC_MSG_RESULT($iolog_dir) +])dnl + +dnl +dnl check for working fnmatch(3) +dnl +AC_DEFUN([SUDO_FUNC_FNMATCH], +[AC_MSG_CHECKING([for working fnmatch with FNM_CASEFOLD]) +AC_CACHE_VAL(sudo_cv_func_fnmatch, +[rm -f conftestdata; > conftestdata +AC_RUN_IFELSE([AC_LANG_SOURCE([[#include +main() { exit(fnmatch("/*/bin/echo *", "/usr/bin/echo just a test", FNM_CASEFOLD)); }]])], [sudo_cv_func_fnmatch=yes], [sudo_cv_func_fnmatch=no], + [sudo_cv_func_fnmatch=no]) +rm -f core core.* *.core]) +AC_MSG_RESULT($sudo_cv_func_fnmatch) +AS_IF([test $sudo_cv_func_fnmatch = yes], [$1], [$2])]) + +dnl +dnl Attempt to check for working PIE support. +dnl This is a bit of a hack but on Solaris 10 with GNU ld and GNU as +dnl we can end up with strange values from malloc(). +dnl A better check would be to verify that ASLR works with PIE. +dnl +AC_DEFUN([SUDO_WORKING_PIE], +[AC_MSG_CHECKING([for working PIE support]) +AC_CACHE_VAL(sudo_cv_working_pie, +[rm -f conftestdata; > conftestdata +AC_RUN_IFELSE([AC_LANG_SOURCE([AC_INCLUDES_DEFAULT +main() { char *p = malloc(1024); if (p == NULL) return 1; memset(p, 0, 1024); return 0; }])], [sudo_cv_working_pie=yes], [sudo_cv_working_pie=no], + [sudo_cv_working_pie=no]) +rm -f core core.* *.core]) +AC_MSG_RESULT($sudo_cv_working_pie) +AS_IF([test $sudo_cv_working_pie = yes], [$1], [$2])]) + +dnl +dnl check for isblank(3) +dnl +AC_DEFUN([SUDO_FUNC_ISBLANK], + [AC_CACHE_CHECK([for isblank], [sudo_cv_func_isblank], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[return (isblank('a'));]])], + [sudo_cv_func_isblank=yes], [sudo_cv_func_isblank=no])]) +] [ + if test "$sudo_cv_func_isblank" = "yes"; then + AC_DEFINE(HAVE_ISBLANK, 1, [Define if you have isblank(3).]) + else + AC_LIBOBJ(isblank) + SUDO_APPEND_COMPAT_EXP(isblank) + fi +]) + +AC_DEFUN([SUDO_CHECK_LIB], [ + _sudo_check_lib_extras=`echo "$5"|sed -e 's/[ ]*//g' -e 's/-l/_/g'` + AC_MSG_CHECKING([for $2 in -l$1${5+ }$5]) + AC_CACHE_VAL([sudo_cv_lib_$1''_$2$_sudo_check_lib_extras], [ + SUDO_CHECK_LIB_OLIBS="$LIBS" + LIBS="$LIBS -l$1${5+ }$5" + AC_LINK_IFELSE( + [AC_LANG_CALL([], [$2])], + [eval sudo_cv_lib_$1''_$2$_sudo_check_lib_extras=yes], + [eval sudo_cv_lib_$1''_$2$_sudo_check_lib_extras=no] + ) + LIBS="$SUDO_CHECK_LIB_OLIBS" + ]) + if eval test \$sudo_cv_lib_$1''_$2$_sudo_check_lib_extras = "yes"; then + AC_MSG_RESULT([yes]) + $3 + else + AC_MSG_RESULT([no]) + $4 + fi +]) + +dnl +dnl check unsetenv() return value +dnl +AC_DEFUN([SUDO_FUNC_UNSETENV_VOID], + [AC_CACHE_CHECK([whether unsetenv returns void], [sudo_cv_func_unsetenv_void], + [AC_RUN_IFELSE([AC_LANG_PROGRAM( + [AC_INCLUDES_DEFAULT + int unsetenv(); + ], [ + [return unsetenv("FOO") != 0;] + ]) + ], + [sudo_cv_func_unsetenv_void=no], + [sudo_cv_func_unsetenv_void=yes], + [sudo_cv_func_unsetenv_void=no])]) + if test $sudo_cv_func_unsetenv_void = yes; then + AC_DEFINE(UNSETENV_VOID, 1, + [Define to 1 if the `unsetenv' function returns void instead of `int'.]) + fi + ]) + +dnl +dnl check putenv() argument for const +dnl +AC_DEFUN([SUDO_FUNC_PUTENV_CONST], +[AC_CACHE_CHECK([whether putenv takes a const argument], +sudo_cv_func_putenv_const, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT +int putenv(const char *string) {return 0;}], [])], + [sudo_cv_func_putenv_const=yes], + [sudo_cv_func_putenv_const=no]) + ]) + if test $sudo_cv_func_putenv_const = yes; then + AC_DEFINE(PUTENV_CONST, const, [Define to const if the `putenv' takes a const argument.]) + else + AC_DEFINE(PUTENV_CONST, []) + fi +]) + +dnl +dnl check whether au_close() takes 3 or 4 arguments +dnl +AC_DEFUN([SUDO_FUNC_AU_CLOSE_SOLARIS11], +[AC_CACHE_CHECK([whether au_close() takes 4 arguments], +sudo_cv_func_au_close_solaris11, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT +#include +#include +#include + +int au_close(int d, int keep, au_event_t event, au_emod_t emod) {return 0;}], [])], + [sudo_cv_func_au_close_solaris11=yes], + [sudo_cv_func_au_close_solaris11=no]) + ]) + if test $sudo_cv_func_au_close_solaris11 = yes; then + AC_DEFINE(HAVE_AU_CLOSE_SOLARIS11, 1, [Define to 1 if the `au_close' functions takes 4 arguments like Solaris 11.]) + fi +]) + +dnl +dnl Check if the data argument for the sha2 functions is void * or u_char * +dnl +AC_DEFUN([SUDO_FUNC_SHA2_VOID_PTR], +[AC_CACHE_CHECK([whether the data argument of SHA224Update() is void *], +sudo_cv_func_sha2_void_ptr, +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT +#include +void SHA224Update(SHA2_CTX *context, const void *data, size_t len) {return;}], [])], + [sudo_cv_func_sha2_void_ptr=yes], + [sudo_cv_func_sha2_void_ptr=no]) + ]) + if test $sudo_cv_func_sha2_void_ptr = yes; then + AC_DEFINE(SHA2_VOID_PTR, 1, + [Define to 1 if the sha2 functions use `const void *' instead of `const unsigned char'.]) + fi +]) + +dnl +dnl check for sa_len field in struct sockaddr +dnl +AC_DEFUN([SUDO_SOCK_SA_LEN], [ + AC_CHECK_MEMBER([struct sockaddr.sa_len], + [AC_DEFINE(HAVE_STRUCT_SOCKADDR_SA_LEN, 1, [Define if your struct sockaddr has an sa_len field.])], + [], [ +# include +# include ] + )] +) + +dnl +dnl check for sin_len field in struct sockaddr_in +dnl +AC_DEFUN([SUDO_SOCK_SIN_LEN], [ + AC_CHECK_MEMBER([struct sockaddr_in.sin_len], + [AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN, 1, [Define if your struct sockaddr_in has a sin_len field.])], + [], [ +# include +# include ] + )] +) + +dnl +dnl check for max length of uid_t in string representation. +dnl we can't really trust UID_MAX or MAXUID since they may exist +dnl only for backwards compatibility. +dnl +AC_DEFUN([SUDO_UID_T_LEN], +[AC_REQUIRE([AC_TYPE_UID_T]) +AC_MSG_CHECKING(max length of uid_t) +AC_CACHE_VAL(sudo_cv_uid_t_len, +[rm -f conftestdata +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#include +main() { + FILE *f; + char b[1024]; + uid_t u = (uid_t) -1; + + if ((f = fopen("conftestdata", "w")) == NULL) + exit(1); + + (void) sprintf(b, "%lu", (unsigned long) u); + (void) fprintf(f, "%d\n", strlen(b)); + (void) fclose(f); + exit(0); +}]])], [sudo_cv_uid_t_len=`cat conftestdata`], [sudo_cv_uid_t_len=10], [sudo_cv_uid_t_len=10]) +]) +rm -f conftestdata +AC_MSG_RESULT($sudo_cv_uid_t_len) +AC_DEFINE_UNQUOTED(MAX_UID_T_LEN, $sudo_cv_uid_t_len, [Define to the max length of a uid_t in string context (excluding the NUL).]) +]) + +dnl +dnl There are three different utmp variants we need to check for. +dnl SUDO_CHECK_UTMP_MEMBERS(utmp_type) +dnl +AC_DEFUN([SUDO_CHECK_UTMP_MEMBERS], [ + dnl + dnl Check for utmp/utmpx/utmps struct members. + dnl + AC_CHECK_MEMBER([struct $1.ut_id], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_ID, 1, [Define to 1 if `ut_id' is a member of `struct utmp'.]) + ], [], [ +# include +# include <$1.h> + ]) + AC_CHECK_MEMBER([struct $1.ut_pid], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_PID, 1, [Define to 1 if `ut_pid' is a member of `struct utmp'.]) + ], [], [ +# include +# include <$1.h> + ]) + AC_CHECK_MEMBER([struct $1.ut_tv], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_TV, 1, [Define to 1 if `ut_tv' is a member of `struct utmp'.]) + ], [], [ +# include +# include <$1.h> + ]) + AC_CHECK_MEMBER([struct $1.ut_type], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_TYPE, 1, [Define to 1 if `ut_type' is a member of `struct utmp'.]) + ], [], [ +# include +# include <$1.h> + ]) + dnl + dnl Older struct utmp has ut_name instead of ut_user + dnl + if test "$1" = "utmp"; then + AC_CHECK_MEMBERS([struct utmp.ut_user], [], [], [ +# include +# include <$1.h> + ]) + fi + dnl + dnl Check for ut_exit.__e_termination first, then ut_exit.e_termination + dnl We need to have already defined _GNU_SOURCE on glibc which only has + dnl __e_termination visible when _GNU_SOURCE is *not* defined. + dnl + AC_CHECK_MEMBER([struct $1.ut_exit.__e_termination], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_EXIT, 1, [Define to 1 if `ut_exit' is a member of `struct utmp'.]) + AC_DEFINE(HAVE_STRUCT_UTMP_UT_EXIT___E_TERMINATION, 1, [Define to 1 if `ut_exit.__e_termination' is a member of `struct utmp'.]) + ], [ + AC_CHECK_MEMBER([struct $1.ut_exit.e_termination], [ + AC_DEFINE(HAVE_STRUCT_UTMP_UT_EXIT, 1, [Define to 1 if `ut_exit' is a member of `struct utmp'.]) + AC_DEFINE(HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION, 1, [Define to 1 if `ut_exit.e_termination' is a member of `struct utmp'.]) + ], [], [ +# include +# include <$1.h> + ]) + ], [ +# include +# include <$1.h> + ]) +]) + +dnl +dnl Append a libpath to an LDFLAGS style variable if not already present. +dnl Also appends to the _R version unless rpath is disabled. +dnl +AC_DEFUN([SUDO_APPEND_LIBPATH], [ + AX_APPEND_FLAG([-L$2], [$1]) + if test X"$enable_rpath" = X"yes"; then + AX_APPEND_FLAG([-R$2], [$1_R]) + fi +]) + +dnl +dnl Append one or more symbols to COMPAT_EXP +dnl +AC_DEFUN([SUDO_APPEND_COMPAT_EXP], [ + for _sym in $1; do + COMPAT_EXP="${COMPAT_EXP}${_sym} +" + done +]) + +dnl +dnl Determine the mail spool location +dnl NOTE: must be run *after* check for paths.h +dnl +AC_DEFUN([SUDO_MAILDIR], [ +maildir=no +if test X"$ac_cv_header_paths_h" = X"yes"; then +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT +#include ], +[char *p = _PATH_MAILDIR;])], [maildir=yes], []) +fi +if test $maildir = no; then + # Solaris has maillock.h which defines MAILDIR + AC_CHECK_HEADERS(maillock.h, [ + SUDO_DEFINE(_PATH_MAILDIR, MAILDIR) + maildir=yes + ]) + if test $maildir = no; then + for d in /var/mail /var/spool/mail /usr/spool/mail; do + if test -d "$d"; then + maildir=yes + SUDO_DEFINE_UNQUOTED(_PATH_MAILDIR, "$d") + break + fi + done + if test $maildir = no; then + # unable to find mail dir, hope for the best + SUDO_DEFINE_UNQUOTED(_PATH_MAILDIR, "/var/mail") + fi + fi +fi +]) + +dnl +dnl private versions of AC_DEFINE and AC_DEFINE_UNQUOTED that don't support +dnl tracing that we use to define paths for pathnames.h so autoheader doesn't +dnl put them in config.h.in. An awful hack. +dnl +m4_define([SUDO_DEFINE], +[cat >>confdefs.h <<\EOF +[@%:@define] $1 m4_if($#, 2, [$2], $#, 3, [$2], 1) +EOF +]) + +m4_define([SUDO_DEFINE_UNQUOTED], +[cat >>confdefs.h < +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +use File::Temp qw/ :mktemp /; +use Fcntl; +use warnings; + +die "usage: $0 [--builddir=dir] [--srcdir=dir] Makefile.in ...\n" unless $#ARGV >= 0; + +my @incpaths; +my %dir_vars; +my %implicit; +my %generated; +my $top_builddir = "."; +my $top_srcdir; + +# Check for srcdir and/or builddir, if present +while ($ARGV[0] =~ /^--(src|build)dir=(.*)/) { + if ($1 eq 'src') { + $top_srcdir = $2; + } else { + $top_builddir = $2; + } + shift @ARGV; +} +chdir($top_srcdir) if defined($top_srcdir); + +# Read in MANIFEST or fail if not present +my %manifest; +die "unable to open MANIFEST: $!\n" unless open(MANIFEST, ") { + chomp; + next unless /([^\/]+\.[cly])$/; + $manifest{$1} = $_; +} + +foreach (@ARGV) { + mkdep($_); +} + +sub fmt_depend { + my ($obj, $src) = @_; + my $ret; + + my $deps = sprintf("%s: %s %s", $obj, $src, + join(' ', find_depends($src))); + if (length($deps) > 80) { + my $off = 0; + my $indent = length($obj) + 2; + while (length($deps) - $off > 80 - $indent) { + my $pos; + if ($off != 0) { + $ret .= ' ' x $indent; + $pos = rindex($deps, ' ', $off + 80 - $indent - 2); + } else { + $pos = rindex($deps, ' ', $off + 78); + } + $ret .= substr($deps, $off, $pos - $off) . " \\\n"; + $off = $pos + 1; + } + $ret .= ' ' x $indent; + $ret .= substr($deps, $off) . "\n"; + } else { + $ret = "$deps\n"; + } + + $ret; +} + +sub mkdep { + my $file = $_[0]; + $file =~ s:^\./+::; # strip off leading ./ + $file =~ m:^(.*)/[^/]+$:; + my $srcdir = $1; # parent dir of Makefile + + my $makefile; + if (open(MF, "<$file")) { + local $/; # enable "slurp" mode + $makefile = ; + } else { + warn "$0: $file: $!\n"; + return undef; + } + close(MF); + + # New makefile, minus the autogenerated dependencies + my $separator = "# Autogenerated dependencies, do not modify"; + my $new_makefile = $makefile; + $new_makefile =~ s/${separator}.*$//s; + $new_makefile .= "$separator\n"; + + # Old makefile, join lines with continuation characters + $makefile =~ s/\\\n//mg; + + # Expand some configure bits + $makefile =~ s:\@DEV\@::g; + $makefile =~ s:\@COMMON_OBJS\@:aix.lo event_poll.lo event_select.lo:; + $makefile =~ s:\@SUDO_OBJS\@:openbsd.o preload.o selinux.o sesh.o solaris.o:; + $makefile =~ s:\@SUDOERS_OBJS\@:bsm_audit.lo linux_audit.lo ldap.lo ldap_util.lo ldap_conf.lo solaris_audit.lo sssd.lo:; + # XXX - fill in AUTH_OBJS from contents of the auth dir instead + $makefile =~ s:\@AUTH_OBJS\@:afs.lo aix_auth.lo bsdauth.lo dce.lo fwtk.lo getspwuid.lo kerb5.lo pam.lo passwd.lo rfc1938.lo secureware.lo securid5.lo sia.lo:; + $makefile =~ s:\@DIGEST\@:digest.lo digest_openssl.lo digest_gcrypt.lo:; + $makefile =~ s:\@LTLIBOBJS\@:arc4random.lo arc4random_uniform.lo closefrom.lo fnmatch.lo getaddrinfo.lo getcwd.lo getentropy.lo getgrouplist.lo getdelim.lo getopt_long.lo getusershell.lo glob.lo inet_ntop_lo inet_pton.lo isblank.lo memrchr.lo memset_s.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo pw_dup.lo reallocarray.lo sha2.lo sig2str.lo siglist.lo signame.lo snprintf.lo str2sig.lo strlcat.lo strlcpy.lo strndup.lo strnlen.lo strsignal.lo utimens.lo vsyslog.lo pipe2.lo:; + + # Parse OBJS lines + my %objs; + while ($makefile =~ /^[A-Z0-9_]*OBJS\s*=\s*(.*)/mg) { + foreach (split/\s+/, $1) { + next if /^\$[\(\{].*[\)\}]$/; # skip included vars for now + $objs{$_} = 1; + } + } + + # Find include paths + @incpaths = (); + while ($makefile =~ /-I(\S+)/mg) { + push(@incpaths, $1) unless $1 eq "."; + } + + # Check for generated files + if ($makefile =~ /GENERATED\s*=\s*(.+)$/m) { + foreach (split(/\s+/, $1)) { + $generated{$_} = 1; + } + } + + # Values of srcdir, top_srcdir, top_builddir, incdir + %dir_vars = (); + $file =~ m:^(.*)/+[^/]+:; + $dir_vars{'srcdir'} = $1 || '.'; + $dir_vars{'devdir'} = $dir_vars{'srcdir'}; + $dir_vars{'authdir'} = $dir_vars{'srcdir'} . "/auth"; + $dir_vars{'builddir'} = $top_builddir . "/" . $dir_vars{'srcdir'}; + $dir_vars{'top_srcdir'} = '.'; + #$dir_vars{'top_builddir'} = '.'; + $dir_vars{'incdir'} = 'include'; + + # Find implicit rules for generated .o and .lo files + %implicit = (); + while ($makefile =~ /^\.[ci]\.(l?o|i|plog):\s*\n\t+(.*)$/mg) { + $implicit{$1} = $2; + } + + # Find existing .o and .lo dependencies + my %old_deps; + while ($makefile =~ /^(\w+\.l?o):\s*(\S+\.c)/mg) { + $old_deps{$1} = $2; + } + + # Sort files so we do .lo files first + foreach my $obj (sort keys %objs) { + next unless $obj =~ /(\S+)\.(l?o)$/; + if ($2 eq "o" && exists($objs{"$1.lo"})) { + # We have both .lo and .o files, only the .lo should be used + warn "$file: $obj should be $1.lo\n"; + } else { + # Use old depenencies when mapping objects to their source. + # If no old depenency, use the MANIFEST file to find the source. + my $src = $1 . '.c'; + my $ext = $2; + if (exists $old_deps{$obj}) { + $src = $old_deps{$obj}; + } elsif (exists $manifest{$src}) { + $src = $manifest{$src}; + foreach (sort { length($b) <=> length($a) } keys %dir_vars) { + next if $_ eq "devdir"; + last if $src =~ s:^\Q$dir_vars{$_}/\E:\$\($_\)/:; + } + } else { + warn "$file: unable to find source for $obj ($src) in MANIFEST\n"; + if (-f "$srcdir/$src") { + $src = '$(srcdir)/' . $src; + } + } + my $imp = $implicit{$ext}; + $imp =~ s/\$$newfile")) { + warn("cannot open $newfile: $!\n"); + } else { + print MF $new_makefile || warn("cannot write $newfile: $!\n"); + close(MF) || warn("cannot close $newfile: $!\n");; + rename($newfile, $file); + } +} + +exit(0); + +sub find_depends { + my $src = $_[0]; + my ($deps, $code, %headers); + + if ($src !~ /\//) { + # generated file, local to build dir + $src = "$dir_vars{'builddir'}/$src"; + } + + # resolve $(srcdir) etc. + foreach (keys %dir_vars) { + $src =~ s/\$[\(\{]$_[\)\}]/$dir_vars{$_}/g; + } + + # find open source file and find headers used by it + if (!open(FILE, "<$src")) { + warn "unable to open $src\n"; + return ""; + } + local $/; # enable "slurp" mode + $code = ; + close(FILE); + + # find all headers + while ($code =~ /^#\s*include\s+["<](\S+)[">]/mg) { + my ($hdr, $hdr_path) = find_header($1); + if (defined($hdr)) { + $headers{$hdr} = 1; + # Look for other includes in the .h file + foreach (find_depends($hdr_path)) { + $headers{$_} = 1; + } + } + } + + sort keys %headers; +} + +# find the path to a header file +# returns path or undef if not found +sub find_header { + my $hdr = $_[0]; + + # Look for .h.in files in top_builddir and build dir + return ("\$(top_builddir\)/$hdr", "./${hdr}.in") if -r "./${hdr}.in"; + return ("./$hdr", "$dir_vars{'srcdir'}/${hdr}.in") if -r "$dir_vars{'srcdir'}/${hdr}.in"; + + if (exists $generated{$hdr}) { + my $hdr_path = $dir_vars{'devdir'} . '/' . $hdr; + return ('$(devdir)/' . $hdr, $hdr_path) if -r $hdr_path; + } + foreach my $inc (@incpaths) { + my $hdr_path = "$inc/$hdr"; + # resolve variables in include path + foreach (keys %dir_vars) { + next if $_ eq "devdir"; + $hdr_path =~ s/\$[\(\{]$_[\)\}]/$dir_vars{$_}/g; + } + return ("$inc/$hdr", $hdr_path) if -r $hdr_path; + } + + undef; +} diff --git a/utsudo-0.0.2/mkinstalldirs b/utsudo-0.0.2/mkinstalldirs new file mode 100755 index 0000000..0330343 --- /dev/null +++ b/utsudo-0.0.2/mkinstalldirs @@ -0,0 +1,84 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +umask 022 +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/utsudo-0.0.2/mkpkg b/utsudo-0.0.2/mkpkg new file mode 100755 index 0000000..954435a --- /dev/null +++ b/utsudo-0.0.2/mkpkg @@ -0,0 +1,418 @@ +#!/bin/sh +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2010-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Build a binary package using polypkg +# Usage: mkpkg [--debug] [--flavor flavor] [--platform platform] [--osversion ver] +# + +# Make sure IFS is set to space, tab, newline in that order. +space=' ' +tab=' ' +nl=' +' +IFS=" $nl" + +# Parse arguments +usage="usage: mkpkg [--debug] [--flavor flavor] [--platform platform] [--osversion ver]" +debug=0 +flavor=vanilla +crossbuild=false +while test $# -gt 0; do + case "$1" in + --debug) + set -x + debug=1 + PPFLAGS="--debug${PPFLAGS+$space}${PPFLAGS}" + ;; + --flavor=?*) + flavor=`echo "$1" | sed -n 's/^--flavor=\(.*\)/\1/p'` + PPVARS="${PPVARS}${PPVARS+$space}flavor=$flavor" + ;; + --flavor) + if [ $# -lt 2 ]; then + echo "$usage" 1>&2 + exit 1 + fi + flavor="$2" + PPVARS="${PPVARS}${PPVARS+$space}flavor=$flavor" + shift + ;; + --platform=?*) + arg=`echo "$1" | sed -n 's/^--platform=\(.*\)/\1/p'` + PPFLAGS="${PPFLAGS}${PPFLAGS+$space}--platform $arg" + ;; + --platform) + if [ $# -lt 2 ]; then + echo "$usage" 1>&2 + exit 1 + fi + PPFLAGS="${PPFLAGS}${PPFLAGS+$space}--platform $2" + shift + ;; + --osversion=?*) + arg=`echo "$1" | sed -n 's/^--osversion=\(.*\)/\1/p'` + osversion="$arg" + ;; + --osversion) + if [ $# -lt 2 ]; then + echo "$usage" 1>&2 + exit 1 + fi + osversion="$2" + shift + ;; + --build|--host) + crossbuild=true + configure_opts="${configure_opts}${configure_opts+$tab}$1" + ;; + *) + # Pass unknown options to configure + configure_opts="${configure_opts}${configure_opts+$tab}$1" + ;; + esac + shift +done + +top_srcdir=`dirname $0` + +: ${osversion="`$top_srcdir/pp --probe`"} +test -n "$osversion" || exit 1 +osrelease=`echo "$osversion" | sed -e 's/^[^0-9]*//' -e 's/-.*$//'` +: ${MAKE=make} + +# If using GNU make, set number of jobs +if ${MAKE} --version 2>&1 | grep GNU >/dev/null; then + NJOBS=0 + case "`uname`" in + Darwin) + # macOS + NJOBS=`sysctl -n hw.ncpu` + ;; + Linux) + if [ -r /proc/cpuinfo ]; then + for c in `sed -n 's/^cpu cores[ ]*: *//p' /proc/cpuinfo`; do + NJOBS=`expr $NJOBS + $c` + done + fi + ;; + SunOS) + # Solaris + if [ -x /usr/sbin/psrinfo ]; then + NJOBS=`/usr/sbin/psrinfo | wc -l` + fi + ;; + HP-UX) + NJOBS=`sar -Mu 1 1 | awk 'END {print NR-5}'` + ;; + AIX) + NJOBS=`bindprocessor -q | awk '{print NF-4}'` + ;; + esac + if [ $NJOBS -gt 1 ]; then + make_opts="-j$NJOBS" + fi +fi + +# Choose compiler options by osversion if not cross-compiling. +if [ "$crossbuild" = "false" ]; then + case "$osversion" in + macos*) + # Use clang on macOS if present + if [ -z "$CC" -a -x /usr/bin/clang ]; then + CC=/usr/bin/clang; export CC + fi + ;; + sol[0-9]*) + # Use the Sun Studio C compiler on Solaris if possible + if [ -z "$CC" -a -x /usr/bin/cc ]; then + CC=/usr/bin/cc; export CC + if [ -z "$CFLAGS" ]; then + CFLAGS=-O; export CFLAGS + fi + fi + ;; + esac +fi + +# Give configure a hint that we are building a package. +# Some libc functions are only available on certain OS revisions. +configure_opts="${configure_opts}${configure_opts+$tab}--enable-package-build" + +# Choose configure options by osversion. +# We use the same configure options as vendor packages when possible. +case "$osversion" in + centos*|rhel*|f[0-9]*) + case "$osversion" in + centos*|rhel*) + osmajor=`sed -n -e 's/^.*release \([0-9]*\)[^0-9].*$/\1/p' /etc/redhat-release` + if [ $osmajor -ge 4 ]; then + # RHEL 4 and up support SELinux + with_selinux=true + if [ $osmajor -ge 5 ]; then + # RHEL 5 and up has audit support and uses a + # separate PAM config file for "sudo -i". + with_linux_audit=true + with_pam_login=true + if [ $osmajor -ge 6 ]; then + # RHEL 6 and above builds sudo with SSSD support + with_sssd=true + # RHEL 6 and above use /etc/sudo-ldap.conf + with_sudo_ldap_conf=true + fi + fi + fi + ;; + f[0-9]*) + # XXX - investigate which features were in which fedora version + with_selinux=true + with_linux_audit=true + with_pam_login=true + with_sssd=true + ;; + esac + + if [ X"$with_selinux" = X"true" ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-selinux" + fi + if [ X"$with_linux_audit" = X"true" ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-linux-audit" + PPVARS="${PPVARS}${PPVARS+$space}linux_audit=1.4.0" + fi + if [ X"$with_pam_login" = X"true" ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-pam-login" + fi + if [ X"$with_sssd" = X"true" ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-sssd" + if test "`getconf LONG_BIT`" = "64"; then + # SSSD backend needs to know where to find the sssd lib + configure_opts="${configure_opts}${configure_opts+$tab}--with-sssd-lib=/usr/lib64" + fi + fi + if [ X"$with_sudo_ldap_conf" = X"true" ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-ldap-conf-file=/etc/sudo-ldap.conf" + fi + # Note, must indent with tabs, not spaces due to IFS trickery + configure_opts="--prefix=/usr + --with-logging=syslog + --with-logfac=authpriv + --with-pam + --enable-zlib=system + --with-editor=/bin/vi + --with-env-editor + --with-ignore-dot + --with-tty-tickets + --with-ldap + --with-passprompt=[sudo] password for %p: + --with-sendmail=/usr/sbin/sendmail + $configure_opts" + ;; + sles*) + if [ $osrelease -ge 10 ]; then + # SLES 11 and higher has SELinux + if [ $osrelease -ge 11 ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-selinux" + fi + fi + # SuSE doesn't have /usr/libexec + libexec=lib + case "$osversion" in + *64*) gcc -v 2>&1 | grep "with-cpu=[^ ]*32" >/dev/null || libexec=lib64 + ;; + esac + # Note, must indent with tabs, not spaces due to IFS trickery + # XXX - SuSE uses secure path but only for env_reset + configure_opts="--prefix=/usr + --libexecdir=/usr/$libexec + --with-logging=syslog + --with-logfac=auth + --with-all-insults + --with-ignore-dot + --with-tty-tickets + --enable-shell-sets-home + --with-sudoers-mode=0440 + --with-pam + --enable-zlib=system + --with-ldap + --with-env-editor + --with-passprompt=%p\'s password: + --with-sendmail=/usr/sbin/sendmail + $configure_opts" + + make_opts="${make_opts}${make_opts+ }"'docdir=$(datarootdir)/doc/packages/$(PACKAGE_TARNAME)' + ;; + deb*|ubu*) + # Man pages should be compressed in .deb files + export MANCOMPRESS='gzip -9' + export MANCOMPRESSEXT='.gz' + # If Ubuntu, add --enable-admin-flag + case "$osversion" in + ubu*) + configure_opts="${configure_opts}${configure_opts+$tab}--enable-admin-flag${tab}--without-lecture" + ;; + esac + # Newer Debian uses arch-specific lib dirs + MULTIARCH=`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null` + # Note, must indent with tabs, not spaces due to IFS trickery + if test "$flavor" = "ldap"; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-ldap + --with-ldap-conf-file=/etc/sudo-ldap.conf" + else + configure_opts="${configure_opts}${configure_opts+$tab}--with-sssd" + if test -n "$MULTIARCH"; then + # SSSD backend needs to know where to find the sssd lib + configure_opts="${configure_opts}${configure_opts+$tab}--with-sssd-lib=/usr/lib/$MULTIARCH" + fi + fi + configure_opts="--prefix=/usr + --with-all-insults + --with-pam + --enable-zlib=system + --with-fqdn + --with-logging=syslog + --with-logfac=authpriv + --with-env-editor + --with-editor=/usr/bin/editor + --with-timeout=15 + --with-password-timeout=0 + --with-passprompt=[sudo] password for %p: + --disable-root-mailer + --with-sendmail=/usr/sbin/sendmail + --mandir=/usr/share/man + --libexecdir=/usr/lib + --with-selinux + --with-linux-audit + $configure_opts" + # Use correct libaudit dependency + for f in /lib/${MULTIARCH}${MULTIARCH:+/}libaudit.so.[0-9]* /lib/libaudit.so.[0-9]*; do + if test -f "$f"; then + linux_audit=`dpkg-query -S "$f" 2>/dev/null | sed -n 's/:.*//p'` + test -n "$linux_audit" && break; + fi + done + if [ -z "$linux_audit" ]; then + echo "unable to determine package for libaudit" 1>&2 + exit 1 + fi + PPVARS="${PPVARS}${PPVARS+$space}linux_audit=$linux_audit" + ;; + macos*) + case "$osversion" in + macos10[0-6]-i386|macos10[0-6]-x86_64) + # Build intel universal binaries for 10.6 and below + ARCH_FLAGS="-arch i386 -arch x86_64" + ;; + esac + if test "${osversion}" != "`$top_srcdir/pp --probe`"; then + sdkvers=`echo "${osversion}" | sed 's/^macos\([0-9][0-9]\)\([0-9]*\)-.*$/\1.\2/'` + # SDKs may be under Xcode.app or CommandLineTools (for non-Xcode) + if [ -d "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs" ]; then + SDK_DIR="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs" + elif [ -d "/Library/Developer/CommandLineTools/SDKs" ]; then + SDK_DIR="/Library/Developer/CommandLineTools/SDKs" + else + echo "unable to find macOS SDKs directory" 1>&2 + exit 1 + fi + SDK_DIR="${SDK_DIR}/MacOSX${sdkvers}.sdk" + if test -d "${SDK_DIR}"; then + SDK_FLAGS="-isysroot ${SDK_DIR} -mmacosx-version-min=${sdkvers}" + else + echo "unable to find SDKs directory for macOS $sdkvers" 1>&2 + exit 1 + fi + fi + export CFLAGS="-O2 -g $ARCH_FLAGS $SDK_FLAGS" + export LDFLAGS="$ARCH_FLAGS $SDK_FLAGS" + # Note, must indent with tabs, not spaces due to IFS trickery + configure_opts="--with-pam + --with-bsm-audit + --without-tty-tickets + --enable-zlib=system + --with-ldap + --with-insults=disabled + --with-logging=syslog + --with-logfac=authpriv + --with-editor=/usr/bin/vim + --with-env-editor + $configure_opts" + ;; + aix*) + # Use -gxcoff with gcc instead of -g for dbx-style debugging symbols. + if test -z "$CC" && gcc -v >/dev/null 2>&1; then + CFLAGS="-O2 -gxcoff"; export CFLAGS + fi + # Note, must indent with tabs, not spaces due to IFS trickery + # Note: we include our own zlib instead of relying on the + # AIX freeware version being installed. + configure_opts=" + --prefix=/opt/freeware + --mandir=/opt/freeware/man + --with-insults=disabled + --with-logging=syslog + --with-logfac=auth + --with-editor=/usr/bin/vi + --with-env-editor + --enable-zlib=builtin + --disable-nls + --with-sendmail=/usr/sbin/sendmail + $configure_opts" + PPVARS="${PPVARS}${PPVARS+$space}aix_freeware=true" + ;; + *) + # For Solaris, add project support and use let configure choose zlib. + # For all others, use the builtin zlib and disable NLS support. + case "$osversion" in + sol*) + configure_opts="${configure_opts}${configure_opts+$tab}--with-project" + + if [ $osrelease -ge 11 ]; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-bsm-audit" + fi + ;; + *) + configure_opts="${configure_opts}${configure_opts+$tab}--enable-zlib=builtin${tab}--disable-nls" + ;; + esac + if test "$flavor" = "ldap"; then + configure_opts="${configure_opts}${configure_opts+$tab}--with-ldap" + fi + # Note, must indent with tabs, not spaces due to IFS trickery + configure_opts=" + --with-insults=disabled + --with-logging=syslog + --with-logfac=auth + --with-editor=/usr/bin/vim:/usr/bin/vi:/bin/vi + --with-env-editor + $configure_opts" + ;; +esac + +# The postinstall script will create tmpfiles.d/sudo.conf for us +configure_opts="${configure_opts}${configure_opts+$tab}--disable-tmpfiles.d" + +# Remove spaces from IFS when setting $@ so that passprompt may include them +OIFS="$IFS" +IFS=" $nl" +set -- $configure_opts $extra_opts +IFS="$OIFS" +if [ -r Makefile ]; then + ${MAKE} $make_opts distclean +fi +$top_srcdir/configure "$@" || exit 1 +${MAKE} $make_opts && ${MAKE} $make_opts PPFLAGS="$PPFLAGS" PPVARS="$PPVARS" package +test $debug -eq 0 && rm -rf destdir diff --git a/utsudo-0.0.2/pathnames.h.in b/utsudo-0.0.2/pathnames.h.in new file mode 100644 index 0000000..7a8a9d2 --- /dev/null +++ b/utsudo-0.0.2/pathnames.h.in @@ -0,0 +1,210 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999, 2001, 2004, 2005, 2007-2014 + * Todd C. Miller . + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * Pathnames to programs and files used by sudo. + */ + +#ifdef HAVE_PATHS_H +# include +#endif /* HAVE_PATHS_H */ + +#ifdef HAVE_MAILLOCK_H +# include +#endif /* HAVE_MAILLOCK_H */ + +#ifndef _PATH_DEV +# define _PATH_DEV "/dev/" +#endif /* _PATH_DEV */ + +#ifndef _PATH_TTY +# define _PATH_TTY _PATH_DEV "tty" +#endif /* _PATH_TTY */ + +#ifndef _PATH_DEVNULL +# define _PATH_DEVNULL _PATH_DEV "null" +#endif /* _PATH_DEVNULL */ + +#ifndef _PATH_DEFPATH +# define _PATH_DEFPATH "/usr/bin:/bin" +#endif /* _PATH_DEFPATH */ + +#ifndef _PATH_STDPATH +# define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin" +#endif /* _PATH_STDPATH */ + +#ifndef _PATH_ENVIRONMENT +# define _PATH_ENVIRONMENT "/etc/environment" +#endif /* _PATH_ENVIRONMENT */ + +/* + * NOTE: _PATH_SUDO_CONF is usually overridden by the Makefile. + */ +#ifndef _PATH_SUDO_CONF +# define _PATH_SUDO_CONF "/etc/sudo.conf" +#endif /* _PATH_SUDO_CONF */ + +/* + * NOTE: _PATH_SUDOERS is usually overridden by the Makefile. + */ +#ifndef _PATH_SUDOERS +# define _PATH_SUDOERS "/etc/sudoers" +#endif /* _PATH_SUDOERS */ + +/* + * NOTE: _PATH_CVTSUDOERS_CONF is usually overridden by the Makefile. + */ +#ifndef _PATH_CVTSUDOERS_CONF +# define _PATH_CVTSUDOERS_CONF "/etc/cvtsudoers.conf" +#endif /* _PATH_CVTSUDOERS_CONF */ + +/* + * The following paths are controlled via the configure script. + */ + +/* + * Where to store the time stamp files. Defaults to /var/run/sudo/ts, + * /var/db/sudo/ts, /var/lib/sudo/ts, /var/adm/sudo/ts or /usr/adm/sudo/ts + * depending on what exists on the system. + */ +#ifndef _PATH_SUDO_TIMEDIR +# undef _PATH_SUDO_TIMEDIR +#endif /* _PATH_SUDO_TIMEDIR */ + +/* + * Where to store the lecture status files. Defaults to /var/db/sudo/lectured, + * /var/lib/sudo/lectured, /var/adm/sudo/lectured or /usr/adm/sudo/lectured + * depending on what exists on the system. + */ +#ifndef _PATH_SUDO_LECTURE_DIR +# undef _PATH_SUDO_LECTURE_DIR +#endif /* _PATH_SUDO_LECTURE_DIR */ + +/* + * Where to put the I/O log files. Defaults to /var/log/sudo-io, + * /var/adm/sudo-io or /usr/adm/sudo-io depending on what exists. + */ +#ifndef _PATH_SUDO_IO_LOGDIR +# undef _PATH_SUDO_IO_LOGDIR +#endif /* _PATH_SUDO_IO_LOGDIR */ + +/* + * Where to put the sudo log file when logging to a file. Defaults to + * /var/log/sudo.log if /var/log exists, else /var/adm/sudo.log. + */ +#ifndef _PATH_SUDO_LOGFILE +# undef _PATH_SUDO_LOGFILE +#endif /* _PATH_SUDO_LOGFILE */ + +#ifndef _PATH_SUDO_SENDMAIL +# undef _PATH_SUDO_SENDMAIL +#endif /* _PATH_SUDO_SENDMAIL */ + +#ifndef _PATH_SUDO_NOEXEC +# undef _PATH_SUDO_NOEXEC +#endif /* _PATH_SUDO_NOEXEC */ + +#ifndef _PATH_SUDO_ASKPASS +# undef _PATH_SUDO_ASKPASS +#endif /* _PATH_SUDO_ASKPASS */ + +#ifndef _PATH_SUDO_PLUGIN_DIR +# undef _PATH_SUDO_PLUGIN_DIR +#endif /* _PATH_SUDO_PLUGIN_DIR */ + +#ifndef _PATH_SUDO_DEVSEARCH +# undef _PATH_SUDO_DEVSEARCH +#endif /* _PATH_SUDO_DEVSEARCH */ + +#ifndef _PATH_VI +# undef _PATH_VI +#endif /* _PATH_VI */ + +#ifndef _PATH_MV +# undef _PATH_MV +#endif /* _PATH_MV */ + +#ifndef _PATH_BSHELL +# undef _PATH_BSHELL +#endif /* _PATH_BSHELL */ + +#ifndef _PATH_TMP +# define _PATH_TMP "/tmp/" +#endif /* _PATH_TMP */ + +#ifndef _PATH_VARTMP +# define _PATH_VARTMP "/var/tmp/" +#endif /* _PATH_VARTMP */ + +#ifndef _PATH_USRTMP +# define _PATH_USRTMP "/usr/tmp/" +#endif /* _PATH_USRTMP */ + +#ifndef _PATH_MAILDIR +# undef _PATH_MAILDIR +#endif /* _PATH_MAILDIR */ + +#ifndef _PATH_UTMP +# undef _PATH_UTMP +#endif /* _PATH_UTMP */ + +#ifndef _PATH_SUDO_SESH +# undef _PATH_SUDO_SESH +#endif /* _PATH_SUDO_SESH */ + +#ifndef _PATH_LDAP_CONF +# undef _PATH_LDAP_CONF +#endif /* _PATH_LDAP_CONF */ + +#ifndef _PATH_LDAP_SECRET +# undef _PATH_LDAP_SECRET +#endif /* _PATH_LDAP_SECRET */ + +#ifndef _PATH_SSSD_CONF +# undef _PATH_SSSD_CONF +#endif /* _PATH_SSSD_CONF */ + +#ifndef _PATH_SSSD_LIB +# undef _PATH_SSSD_LIB +#endif /* _PATH_SSSD_LIB */ + +#ifndef _PATH_NSSWITCH_CONF +# undef _PATH_NSSWITCH_CONF +#endif /* _PATH_NSSWITCH_CONF */ + +#ifndef _PATH_NETSVC_CONF +# undef _PATH_NETSVC_CONF +#endif /* _PATH_NETSVC_CONF */ + +#ifndef _PATH_ZONEINFO +# undef _PATH_ZONEINFO +#endif /* _PATH_ZONEINFO */ + +/* On AIX, _PATH_BSHELL in paths.h is /usr/bin/bsh but we want /usr/bin/sh */ +#ifndef _PATH_SUDO_BSHELL +# if defined(_AIX) && defined(HAVE_PATHS_H) +# define _PATH_SUDO_BSHELL "/usr/bin/sh" +# else +# define _PATH_SUDO_BSHELL _PATH_BSHELL +# endif +#endif /* _PATH_SUDO_BSHELL */ diff --git a/utsudo-0.0.2/plugins/group_file/Makefile.in b/utsudo-0.0.2/plugins/group_file/Makefile.in new file mode 100644 index 0000000..939c9a0 --- /dev/null +++ b/utsudo-0.0.2/plugins/group_file/Makefile.in @@ -0,0 +1,219 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2010-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libutsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(top_srcdir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/group_file.exp +shlib_map = group_file.map +shlib_opt = group_file.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = group_file.lo getgrent.lo + +IOBJS = $(OBJS:.lo=.i) + +POBJS = $(IOBJS:.i=.plog) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: group_file.la + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/group_file/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/group_file/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/group_file/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +group_file.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs group_file.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) group_file.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/group_file.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/group_file.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \ + stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +getgrent.lo: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getgrent.c +getgrent.i: $(srcdir)/getgrent.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getgrent.plog: getgrent.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getgrent.c --i-file $< --output-file $@ +group_file.lo: $(srcdir)/group_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/group_file.c +group_file.i: $(srcdir)/group_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +group_file.plog: group_file.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/group_file.c --i-file $< --output-file $@ diff --git a/utsudo-0.0.2/plugins/group_file/getgrent.c b/utsudo-0.0.2/plugins/group_file/getgrent.c new file mode 100644 index 0000000..59bf3ad --- /dev/null +++ b/utsudo-0.0.2/plugins/group_file/getgrent.c @@ -0,0 +1,185 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2005,2008,2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Trivial replacements for the libc getgr{uid,nam}() routines. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_util.h" + +#undef GRMEM_MAX +#define GRMEM_MAX 200 + +static FILE *grf; +static const char *grfile = "/etc/group"; +static int gr_stayopen; + +void mysetgrfile(const char *); +void mysetgrent(void); +void myendgrent(void); +struct group *mygetgrent(void); +struct group *mygetgrnam(const char *); +struct group *mygetgrgid(gid_t); + +void +mysetgrfile(const char *file) +{ + grfile = file; + if (grf != NULL) + myendgrent(); +} + +void +mysetgrent(void) +{ + if (grf == NULL) { + grf = fopen(grfile, "r"); + if (grf != NULL) + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + gr_stayopen = 1; +} + +void +myendgrent(void) +{ + if (grf != NULL) { + fclose(grf); + grf = NULL; + } + gr_stayopen = 0; +} + +struct group * +mygetgrent(void) +{ + static struct group gr; + static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + int n; + +next_entry: + if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL) + return NULL; + + memset(&gr, 0, sizeof(gr)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + gr.gr_gid = (gid_t)id; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + if (*colon != '\0') { + char *last; + + gr.gr_mem = gr_mem; + cp = strtok_r(colon, ",", &last); + for (n = 0; cp != NULL && n < GRMEM_MAX; n++) { + gr.gr_mem[n] = cp; + cp = strtok_r(NULL, ",", &last); + } + gr.gr_mem[n++] = NULL; + } else + gr.gr_mem = NULL; + return &gr; +} + +struct group * +mygetgrnam(const char *name) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + while ((gr = mygetgrent()) != NULL) { + if (strcmp(gr->gr_name, name) == 0) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +struct group * +mygetgrgid(gid_t gid) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + while ((gr = mygetgrent()) != NULL) { + if (gr->gr_gid == gid) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} diff --git a/utsudo-0.0.2/plugins/group_file/group_file.c b/utsudo-0.0.2/plugins/group_file/group_file.c new file mode 100644 index 0000000..20957b2 --- /dev/null +++ b/utsudo-0.0.2/plugins/group_file/group_file.c @@ -0,0 +1,134 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_plugin.h" +#include "sudo_compat.h" + +/* + * Sample sudoers group plugin that uses an extra group file with the + * same format as /etc/group. + */ + +static sudo_printf_t sudo_log; + +extern void mysetgrfile(const char *); +extern void mysetgrent(void); +extern void myendgrent(void); +extern struct group *mygetgrnam(const char *); + +static int +sample_init(int version, sudo_printf_t sudo_printf, char *const argv[]) +{ + struct stat sb; + + sudo_log = sudo_printf; + + if (SUDO_API_VERSION_GET_MAJOR(version) != GROUP_API_VERSION_MAJOR) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: incompatible major version %d, expected %d\n", + SUDO_API_VERSION_GET_MAJOR(version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* Sanity check the specified group file. */ + if (argv == NULL || argv[0] == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: path to group file not specified\n"); + return -1; + } + if (stat(argv[0], &sb) != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, + "group_file: %s: %s\n", argv[0], strerror(errno)); + return -1; + } + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, + "%s must be only be writable by owner\n", argv[0]); + return -1; + } + + mysetgrfile(argv[0]); + mysetgrent(); + + return true; +} + +static void +sample_cleanup(void) +{ + myendgrent(); +} + +/* + * Returns true if "user" is a member of "group", else false. + */ +static int +sample_query(const char *user, const char *group, const struct passwd *pwd) +{ + struct group *grp; + char **member; + + grp = mygetgrnam(group); + if (grp != NULL && grp->gr_mem != NULL) { + for (member = grp->gr_mem; *member != NULL; member++) { + if (strcasecmp(user, *member) == 0) + return true; + } + } + + return false; +} + +__dso_public struct sudoers_group_plugin group_plugin = { + GROUP_API_VERSION, + sample_init, + sample_cleanup, + sample_query +}; diff --git a/utsudo-0.0.2/plugins/group_file/group_file.exp b/utsudo-0.0.2/plugins/group_file/group_file.exp new file mode 100644 index 0000000..a859d6c --- /dev/null +++ b/utsudo-0.0.2/plugins/group_file/group_file.exp @@ -0,0 +1 @@ +group_plugin diff --git a/utsudo-0.0.2/plugins/group_file/plugin_test.c b/utsudo-0.0.2/plugins/group_file/plugin_test.c new file mode 100644 index 0000000..24cea43 --- /dev/null +++ b/utsudo-0.0.2/plugins/group_file/plugin_test.c @@ -0,0 +1,221 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_plugin.h" + +__dso_public int main(int argc, char *argv[]); + +/* + * Simple driver to test sudoer group plugins. + * usage: plugin_test [-p "plugin.so plugin_args ..."] user:group ... + */ + +static void *group_handle; +static struct sudoers_group_plugin *group_plugin; + +static int +plugin_printf(int msg_type, const char *fmt, ...) +{ + va_list ap; + FILE *fp; + + switch (msg_type) { + case SUDO_CONV_INFO_MSG: + fp = stdout; + break; + case SUDO_CONV_ERROR_MSG: + fp = stderr; + break; + default: + errno = EINVAL; + return -1; + } + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + va_end(ap); + + return 0; +} + +/* + * Load the specified plugin and run its init function. + * Returns -1 if unable to open the plugin, else it returns + * the value from the plugin's init function. + */ +static int +group_plugin_load(char *plugin_info) +{ + char *args, path[PATH_MAX], savedch; + char **argv = NULL; + int rc; + + /* + * Fill in .so path and split out args (if any). + */ + if ((args = strpbrk(plugin_info, " \t")) != NULL) { + savedch = *args; + *args = '\0'; + } + if (strlcpy(path, plugin_info, sizeof(path)) >= sizeof(path)) { + fprintf(stderr, "path too long: %s\n", plugin_info); + return -1; + } + if (args != NULL) + *args++ = savedch; + + /* Open plugin and map in symbol. */ + group_handle = dlopen(path, RTLD_LAZY); + if (!group_handle) { + fprintf(stderr, "unable to dlopen %s: %s\n", path, dlerror()); + return -1; + } + group_plugin = dlsym(group_handle, "group_plugin"); + if (group_plugin == NULL) { + fprintf(stderr, "unable to find symbol \"group_plugin\" in %s\n", path); + return -1; + } + + if (SUDO_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) { + fprintf(stderr, + "%s: incompatible group plugin major version %d, expected %d\n", + path, SUDO_API_VERSION_GET_MAJOR(group_plugin->version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* + * Split args into a vector if specified. + */ + if (args != NULL) { + int ac = 0, wasblank = 1; + char *cp; + + for (cp = args; *cp != '\0'; cp++) { + if (isblank((unsigned char)*cp)) { + wasblank = 1; + } else if (wasblank) { + wasblank = 0; + ac++; + } + } + if (ac != 0) { + char *last; + + argv = malloc(ac * sizeof(char *)); + if (argv == NULL) { + perror(NULL); + return -1; + } + ac = 0; + for ((cp = strtok_r(args, " \t", &last)); cp != NULL; (cp = strtok_r(NULL, " \t", &last))) + argv[ac++] = cp; + } + } + + rc = (group_plugin->init)(GROUP_API_VERSION, plugin_printf, argv); + + free(argv); + + return rc; +} + +static void +group_plugin_unload(void) +{ + (group_plugin->cleanup)(); + dlclose(group_handle); + group_handle = NULL; +} + +static int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + return (group_plugin->query)(user, group, pwd); +} + +static void +usage(void) +{ + fprintf(stderr, + "usage: plugin_test [-p \"plugin.so plugin_args ...\"] user:group ...\n"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int ch, i, found; + char *plugin = "group_file.so"; + char *user, *group; + struct passwd *pwd; + + while ((ch = getopt(argc, argv, "p:")) != -1) { + switch (ch) { + case 'p': + plugin = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc < 1) + usage(); + + if (group_plugin_load(plugin) != 1) { + fprintf(stderr, "unable to load plugin: %s\n", plugin); + exit(1); + } + + for (i = 0; argv[i] != NULL; i++) { + user = argv[i]; + group = strchr(argv[i], ':'); + if (group == NULL) + continue; + *group++ = '\0'; + pwd = getpwnam(user); + found = group_plugin_query(user, group, pwd); + printf("user %s %s in group %s\n", user, found ? "is" : "NOT ", group); + } + group_plugin_unload(); + + exit(0); +} + diff --git a/utsudo-0.0.2/plugins/sample/Makefile.in b/utsudo-0.0.2/plugins/sample/Makefile.in new file mode 100644 index 0000000..d5e6264 --- /dev/null +++ b/utsudo-0.0.2/plugins/sample/Makefile.in @@ -0,0 +1,206 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LIBS = $(top_builddir)/lib/util/libutsudo_util.la + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(top_srcdir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/sample_plugin.exp +shlib_map = sample_plugin.map +shlib_opt = sample_plugin.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = sample_plugin.lo + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: sample_plugin.la + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/sample/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sample/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +sample_plugin.la: $(OBJS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs sample_plugin.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sample_plugin.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/sample_plugin.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/sample_plugin.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \ + stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +sample_plugin.lo: $(srcdir)/sample_plugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sample_plugin.c +sample_plugin.i: $(srcdir)/sample_plugin.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sample_plugin.plog: sample_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sample_plugin.c --i-file $< --output-file $@ diff --git a/utsudo-0.0.2/plugins/sample/README b/utsudo-0.0.2/plugins/sample/README new file mode 100644 index 0000000..45c2b78 --- /dev/null +++ b/utsudo-0.0.2/plugins/sample/README @@ -0,0 +1,23 @@ +This is a sample sudo policy plugin. See the sudo_plugin manual for +information on writing your own plugin. + +The sample policy plugin is not built or installed by default. To +build and install the plugin, change to the plugins/sample directory +and run "make". It can be installed by running "make install" as +the superuser from the same directory. + +To actually use the sample plugin, you'll need to modify the +/etc/sudo.conf file. Caution: you should not make changes to +/etc/sudo.conf without also having a root shell open repair things +in case of an error. To enable the plugin, first comment out any +existing policy Plugin line in /etc/sudo.conf, for example: + + Plugin sudoers_policy sudoers.so + +Then add a line for the sample plugin: + + Plugin sample_policy sample_plugin.so + +You may need to create /etc/sudo.conf if it does not already exist. + +Note that you may only have a single policy plugin defined. diff --git a/utsudo-0.0.2/plugins/sample/sample_plugin.c b/utsudo-0.0.2/plugins/sample/sample_plugin.c new file mode 100644 index 0000000..97bc49d --- /dev/null +++ b/utsudo-0.0.2/plugins/sample/sample_plugin.c @@ -0,0 +1,502 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include "sudo_compat.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +/* + * Sample plugin module that allows any user who knows the password + * ("test") to run any command as root. Since there is no credential + * caching the validate and invalidate functions are NULL. + */ + +#ifdef __TANDEM +# define ROOT_UID 65535 +#else +# define ROOT_UID 0 +#endif + +static struct plugin_state { + char **envp; + char * const *settings; + char * const *user_info; +} plugin_state; +static sudo_conv_t sudo_conv; +static sudo_printf_t sudo_log; +static FILE *input, *output; +static uid_t runas_uid = ROOT_UID; +static gid_t runas_gid = -1; +static int use_sudoedit = false; + +/* + * Plugin policy open function. + */ +static int +policy_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const user_env[], char * const args[]) +{ + char * const *ui; + struct passwd *pw; + const char *runas_user = NULL; + struct group *gr; + const char *runas_group = NULL; + + if (!sudo_conv) + sudo_conv = conversation; + if (!sudo_log) + sudo_log = sudo_printf; + + if (SUDO_API_VERSION_GET_MAJOR(version) != SUDO_API_VERSION_MAJOR) { + sudo_log(SUDO_CONV_ERROR_MSG, + "the sample plugin requires API version %d.x\n", + SUDO_API_VERSION_MAJOR); + return -1; + } + + /* Only allow commands to be run as root. */ + for (ui = settings; *ui != NULL; ui++) { + if (strncmp(*ui, "runas_user=", sizeof("runas_user=") - 1) == 0) { + runas_user = *ui + sizeof("runas_user=") - 1; + } + if (strncmp(*ui, "runas_group=", sizeof("runas_group=") - 1) == 0) { + runas_group = *ui + sizeof("runas_group=") - 1; + } + if (strncmp(*ui, "progname=", sizeof("progname=") - 1) == 0) { + initprogname(*ui + sizeof("progname=") - 1); + } + /* Check to see if sudo was called as sudoedit or with -e flag. */ + if (strncmp(*ui, "sudoedit=", sizeof("sudoedit=") - 1) == 0) { + if (strcasecmp(*ui + sizeof("sudoedit=") - 1, "true") == 0) + use_sudoedit = true; + } + /* This plugin doesn't support running sudo with no arguments. */ + if (strncmp(*ui, "implied_shell=", sizeof("implied_shell=") - 1) == 0) { + if (strcasecmp(*ui + sizeof("implied_shell=") - 1, "true") == 0) + return -2; /* usage error */ + } + } + if (runas_user != NULL) { + if ((pw = getpwnam(runas_user)) == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unknown user %s\n", runas_user); + return 0; + } + runas_uid = pw->pw_uid; + } + if (runas_group != NULL) { + if ((gr = getgrnam(runas_group)) == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unknown group %s\n", runas_group); + return 0; + } + runas_gid = gr->gr_gid; + } + + /* Plugin state. */ + plugin_state.envp = (char **)user_env; + plugin_state.settings = settings; + plugin_state.user_info = user_info; + + return 1; +} + +static char * +find_in_path(char *command, char **envp) +{ + struct stat sb; + char *path, *path0, **ep, *cp; + char pathbuf[PATH_MAX], *qualified = NULL; + + if (strchr(command, '/') != NULL) + return command; + + path = _PATH_DEFPATH; + for (ep = plugin_state.envp; *ep != NULL; ep++) { + if (strncmp(*ep, "PATH=", 5) == 0) { + path = *ep + 5; + break; + } + } + path = path0 = strdup(path); + do { + if ((cp = strchr(path, ':'))) + *cp = '\0'; + snprintf(pathbuf, sizeof(pathbuf), "%s/%s", *path ? path : ".", + command); + if (stat(pathbuf, &sb) == 0) { + if (S_ISREG(sb.st_mode) && (sb.st_mode & 0000111)) { + qualified = pathbuf; + break; + } + } + path = cp + 1; + } while (cp != NULL); + free(path0); + return qualified ? strdup(qualified) : NULL; +} + +static int +check_passwd(void) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + + /* Prompt user for password via conversation function. */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = SUDO_CONV_PROMPT_ECHO_OFF; + msg.msg = "Password: "; + memset(&repl, 0, sizeof(repl)); + sudo_conv(1, &msg, &repl, NULL); + if (repl.reply == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "missing password\n"); + return false; + } + if (strcmp(repl.reply, "test") != 0) { + sudo_log(SUDO_CONV_ERROR_MSG, "incorrect password\n"); + return false; + } + return true; +} + +static char ** +build_command_info(const char *command) +{ + static char **command_info; + int i = 0; + + /* Setup command info. */ + command_info = calloc(32, sizeof(char *)); + if (command_info == NULL) + return NULL; + if ((command_info[i++] = sudo_new_key_val("command", command)) == NULL || + asprintf(&command_info[i++], "runas_euid=%ld", (long)runas_uid) == -1 || + asprintf(&command_info[i++], "runas_uid=%ld", (long)runas_uid) == -1) { + return NULL; + } + if (runas_gid != (gid_t)-1) { + if (asprintf(&command_info[i++], "runas_gid=%ld", (long)runas_gid) == -1 || + asprintf(&command_info[i++], "runas_egid=%ld", (long)runas_gid) == -1) { + return NULL; + } + } + if (use_sudoedit) { + command_info[i] = strdup("sudoedit=true"); + if (command_info[i++] == NULL) + return NULL; + } +#ifdef USE_TIMEOUT + command_info[i++] = "timeout=30"; +#endif + return command_info; +} + +static char * +find_editor(int nfiles, char * const files[], char **argv_out[]) +{ + char *cp, *last, **ep, **nargv, *editor, *editor_path; + int ac, i, nargc, wasblank; + + /* Lookup EDITOR in user's environment. */ + editor = _PATH_VI; + for (ep = plugin_state.envp; *ep != NULL; ep++) { + if (strncmp(*ep, "EDITOR=", 7) == 0) { + editor = *ep + 7; + break; + } + } + editor = strdup(editor); + if (editor == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to allocate memory\n"); + return NULL; + } + + /* + * Split editor into an argument vector; editor is reused (do not free). + * The EDITOR environment variables may contain command + * line args so look for those and alloc space for them too. + */ + nargc = 1; + for (wasblank = 0, cp = editor; *cp != '\0'; cp++) { + if (isblank((unsigned char) *cp)) + wasblank = 1; + else if (wasblank) { + wasblank = 0; + nargc++; + } + } + /* If we can't find the editor in the user's PATH, give up. */ + cp = strtok_r(editor, " \t", &last); + if (cp == NULL || + (editor_path = find_in_path(editor, plugin_state.envp)) == NULL) { + free(editor); + return NULL; + } + if (editor_path != editor) + free(editor); + nargv = malloc((nargc + 1 + nfiles + 1) * sizeof(char *)); + if (nargv == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to allocate memory\n"); + free(editor_path); + return NULL; + } + for (ac = 0; cp != NULL && ac < nargc; ac++) { + nargv[ac] = cp; + cp = strtok_r(NULL, " \t", &last); + } + nargv[ac++] = "--"; + for (i = 0; i < nfiles; ) + nargv[ac++] = files[i++]; + nargv[ac] = NULL; + + *argv_out = nargv; + return editor_path; +} + +/* + * Plugin policy check function. + * Simple example that prompts for a password, hard-coded to "test". + */ +static int +policy_check(int argc, char * const argv[], + char *env_add[], char **command_info_out[], + char **argv_out[], char **user_env_out[]) +{ + char *command; + + if (!argc || argv[0] == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "no command specified\n"); + return false; + } + + if (!check_passwd()) + return false; + + command = find_in_path(argv[0], plugin_state.envp); + if (command == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "%s: command not found\n", argv[0]); + return false; + } + + /* If "sudo vi" is run, auto-convert to sudoedit. */ + if (strcmp(command, _PATH_VI) == 0) + use_sudoedit = true; + + if (use_sudoedit) { + /* Rebuild argv using editor */ + free(command); + command = find_editor(argc - 1, argv + 1, argv_out); + if (command == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "unable to find valid editor\n"); + return -1; + } + use_sudoedit = true; + } else { + /* No changes needd to argv */ + *argv_out = (char **)argv; + } + + /* No changes to envp */ + *user_env_out = plugin_state.envp; + + /* Setup command info. */ + *command_info_out = build_command_info(command); + free(command); + if (*command_info_out == NULL) { + sudo_log(SUDO_CONV_ERROR_MSG, "out of memory\n"); + return -1; + } + + return true; +} + +static int +policy_list(int argc, char * const argv[], int verbose, const char *list_user) +{ + /* + * List user's capabilities. + */ + sudo_log(SUDO_CONV_INFO_MSG, "Validated users may run any command\n"); + return true; +} + +static int +policy_version(int verbose) +{ + sudo_log(SUDO_CONV_INFO_MSG, "Sample policy plugin version %s\n", PACKAGE_VERSION); + return true; +} + +static void +policy_close(int exit_status, int error) +{ + /* + * The policy might log the command exit status here. + * In this example, we just print a message. + */ + if (error) { + sudo_log(SUDO_CONV_ERROR_MSG, "Command error: %s\n", strerror(error)); + } else { + if (WIFEXITED(exit_status)) { + sudo_log(SUDO_CONV_INFO_MSG, "Command exited with status %d\n", + WEXITSTATUS(exit_status)); + } else if (WIFSIGNALED(exit_status)) { + sudo_log(SUDO_CONV_INFO_MSG, "Command killed by signal %d\n", + WTERMSIG(exit_status)); + } + } +} + +static int +io_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], char * const args[]) +{ + int fd; + char path[PATH_MAX]; + + if (!sudo_conv) + sudo_conv = conversation; + if (!sudo_log) + sudo_log = sudo_printf; + + /* Open input and output files. */ + snprintf(path, sizeof(path), "/var/tmp/sample-%u.output", + (unsigned int)getpid()); + fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) + return false; + output = fdopen(fd, "w"); + + snprintf(path, sizeof(path), "/var/tmp/sample-%u.input", + (unsigned int)getpid()); + fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd == -1) + return false; + input = fdopen(fd, "w"); + + return true; +} + +static void +io_close(int exit_status, int error) +{ + fclose(input); + fclose(output); +} + +static int +io_version(int verbose) +{ + sudo_log(SUDO_CONV_INFO_MSG, "Sample I/O plugin version %s\n", + PACKAGE_VERSION); + return true; +} + +static int +io_log_input(const char *buf, unsigned int len) +{ + ignore_result(fwrite(buf, len, 1, input)); + return true; +} + +static int +io_log_output(const char *buf, unsigned int len) +{ + const char *cp, *ep; + bool ret = true; + + ignore_result(fwrite(buf, len, 1, output)); + /* + * If we find the string "honk!" in the buffer, reject it. + * In practice we'd want to be able to detect the word + * broken across two buffers. + */ + for (cp = buf, ep = buf + len; cp < ep; cp++) { + if (cp + 5 < ep && memcmp(cp, "honk!", 5) == 0) { + ret = false; + break; + } + } + return ret; +} + +__dso_public struct policy_plugin sample_policy = { + SUDO_POLICY_PLUGIN, + SUDO_API_VERSION, + policy_open, + policy_close, + policy_version, + policy_check, + policy_list, + NULL, /* validate */ + NULL, /* invalidate */ + NULL, /* init_session */ + NULL, /* register_hooks */ + NULL /* deregister_hooks */ +}; + +/* + * Note: This plugin does not differentiate between tty and pipe I/O. + * It all gets logged to the same file. + */ +__dso_public struct io_plugin sample_io = { + SUDO_IO_PLUGIN, + SUDO_API_VERSION, + io_open, + io_close, + io_version, + io_log_input, /* tty input */ + io_log_output, /* tty output */ + io_log_input, /* command stdin if not tty */ + io_log_output, /* command stdout if not tty */ + io_log_output /* command stderr if not tty */ +}; diff --git a/utsudo-0.0.2/plugins/sample/sample_plugin.exp b/utsudo-0.0.2/plugins/sample/sample_plugin.exp new file mode 100644 index 0000000..9f85094 --- /dev/null +++ b/utsudo-0.0.2/plugins/sample/sample_plugin.exp @@ -0,0 +1,2 @@ +sample_policy +sample_io diff --git a/utsudo-0.0.2/plugins/sudoers/Makefile.in b/utsudo-0.0.2/plugins/sudoers/Makefile.in new file mode 100644 index 0000000..52c54d1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/Makefile.in @@ -0,0 +1,2623 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 1996, 1998-2005, 2007-2018 +# Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Sponsored in part by the Defense Advanced Research Projects +# Agency (DARPA) and Air Force Research Laboratory, Air Force +# Materiel Command, USAF, under agreement number F39502-99-1-0512. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +authdir = $(srcdir)/auth +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +incdir = $(top_srcdir)/include +docdir = @docdir@ +libdir = @libdir@ +rundir = @rundir@ +vardir = @vardir@ +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +FLEX = @FLEX@ +YACC = @YACC@ +SED = @SED@ +AWK = @AWK@ +PERL = perl + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libutsudo_util.la $(top_builddir)/lib/util/debug_fatal_lbuf.o +LIBS = $(LT_LIBS) +NET_LIBS = @NET_LIBS@ +SUDOERS_LIBS = @SUDOERS_LIBS@ @AFS_LIBS@ @GETGROUPS_LIB@ $(LIBS) $(NET_LIBS) @ZLIB@ +REPLAY_LIBS = @REPLAY_LIBS@ @ZLIB@ +VISUDO_LIBS = $(NET_LIBS) +CVTSUDOERS_LIBS = $(NET_LIBS) +TESTSUDOERS_LIBS = $(NET_LIBS) + +# C preprocessor defines +CPPDEFS = -DLIBDIR=\"$(libdir)\" -DLOCALEDIR=\"$(localedir)\" \ + -D_PATH_SUDOERS=\"$(sudoersdir)/sudoers\" \ + -D_PATH_CVTSUDOERS_CONF=\"$(sysconfdir)/cvtsudoers.conf\" \ + -DSUDOERS_UID=$(sudoers_uid) -DSUDOERS_GID=$(sudoers_gid) \ + -DSUDOERS_MODE=$(sudoers_mode) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) \ + -I$(top_srcdir) $(CPPDEFS) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @SUDOERS_LDFLAGS@ @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/sudoers.exp +shlib_map = sudoers.map +shlib_opt = sudoers.opt + +# Directory in which to install the sudoers plugin +plugindir = @plugindir@ + +# Directory in which to install the sudoers file +sudoersdir = $(sysconfdir) + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# User, group, and mode the sudoers file should be "owned" by (configure) +sudoers_uid = @SUDOERS_UID@ +sudoers_gid = @SUDOERS_GID@ +sudoers_mode = @SUDOERS_MODE@ + +# Set to non-empty for development mode +DEVEL = @DEVEL@ + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +PROGS = sudoers.la visudo sudoreplay cvtsudoers testsudoers + +TEST_PROGS = check_addr check_base64 check_digest check_env_pattern check_fill \ + check_gentime check_hexchar check_iolog_path check_iolog_plugin \ + check_iolog_util check_wrap check_starttime @SUDOERS_TEST_PROGS@ + +AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@ + +LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo digestname.lo \ + filedigest.lo gentime.lo gmtoff.lo gram.lo hexchar.lo \ + match.lo match_addr.lo match_command.lo match_digest.lo \ + pwutil.lo pwutil_impl.lo rcstr.lo redblack.lo \ + sudoers_debug.lo timeout.lo timestr.lo toke.lo \ + toke_util.lo + +LIBPARSESUDOERS_IOBJS = $(LIBPARSESUDOERS_OBJS:.lo=.i) passwd.i + +SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo editor.lo env.lo \ + env_pattern.lo file.lo find_path.lo fmtsudoers.lo gc.lo \ + goodpath.lo group_plugin.lo interfaces.lo iolog.lo \ + iolog_path.lo locale.lo logging.lo logwrap.lo mkdir_parents.lo \ + parse.lo policy.lo prompt.lo set_perms.lo starttime.lo \ + sudo_nss.lo sudoers.lo timestamp.lo @SUDOERS_OBJS@ + +SUDOERS_IOBJS = $(SUDOERS_OBJS:.lo=.i) + +VISUDO_OBJS = editor.lo find_path.lo goodpath.lo locale.lo stubs.o \ + sudo_printf.o visudo.o + +VISUDO_IOBJS = sudo_printf.i visudo.i + +CVTSUDOERS_OBJS = cvtsudoers.o cvtsudoers_json.o cvtsudoers_ldif.o \ + cvtsudoers_pwutil.o fmtsudoers.lo locale.lo parse_ldif.o \ + strlist.o stubs.o sudo_printf.o ldap_util.lo + +CVTSUDOERS_IOBJS = cvtsudoers.i cvtsudoers_json.i cvtsudoers_ldif.i \ + cvtsudoers_pwutil.i strlist.i + +REPLAY_OBJS = getdate.o sudoreplay.o iolog_util.o + +REPLAY_IOBJS = $(REPLAY_OBJS:.o=.i) + +TEST_OBJS = fmtsudoers.lo group_plugin.lo interfaces.lo ldap_util.lo \ + locale.lo net_ifs.o parse_ldif.o strlist.o sudo_printf.o \ + testsudoers.o tsgetgrpw.o + +IOBJS = $(LIBPARSESUDOERS_IOBJS) $(SUDOERS_IOBJS) $(VISUDO_IOBJS) \ + $(CVTSUDOERS_IOBJS) $(REPLAY_IOBJS) + +POBJS = $(IOBJS:.i=.plog) + +TSDUMP_OBJS = tsdump.o sudoers_debug.lo locale.lo + +CHECK_ADDR_OBJS = check_addr.o interfaces.lo match_addr.lo sudoers_debug.lo \ + sudo_printf.o + +CHECK_BASE64_OBJS = check_base64.o base64.lo sudoers_debug.lo + +CHECK_DIGEST_OBJS = check_digest.o filedigest.lo digestname.lo sudoers_debug.lo + +CHECK_ENV_MATCH_OBJS = check_env_pattern.o env_pattern.lo sudoers_debug.lo + +CHECK_FILL_OBJS = check_fill.o hexchar.lo toke_util.lo sudoers_debug.lo + +CHECK_GENTIME_OBJS = check_gentime.o gentime.lo gmtoff.lo sudoers_debug.lo + +CHECK_HEXCHAR_OBJS = check_hexchar.o hexchar.lo sudoers_debug.lo + +CHECK_IOLOG_PATH_OBJS = check_iolog_path.o iolog_path.lo locale.lo \ + pwutil.lo pwutil_impl.lo redblack.lo sudoers_debug.lo + +CHECK_IOLOG_PLUGIN_OBJS = check_iolog_plugin.o iolog.lo iolog_path.lo \ + iolog_util.o locale.lo mkdir_parents.lo pwutil.lo \ + pwutil_impl.lo redblack.lo sudoers_debug.lo + +CHECK_IOLOG_UTIL_OBJS = check_iolog_util.o iolog_util.o locale.lo \ + sudoers_debug.lo + +CHECK_SYMBOLS_OBJS = check_symbols.o + +CHECK_STARTTIME_OBJS = check_starttime.o starttime.lo sudoers_debug.lo + +CHECK_WRAP_OBJS = check_wrap.o logwrap.lo sudoers_debug.lo + +VERSION = @PACKAGE_VERSION@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ + +all: $(PROGS) + +.SUFFIXES: .c .h .i .l .lo .o .plog .y + +.c.o: + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +# Prevent default rules from building .c files from .l and .y files +.l.c: + @true + +.y.c: + @true + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/sudoers/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sudoers/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/sudoers/Makefile + +libparsesudoers.la: $(LIBPARSESUDOERS_OBJS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(LIBPARSESUDOERS_OBJS) -no-install + +sudoers.la: $(SUDOERS_OBJS) $(LT_LIBS) libparsesudoers.la @LT_LDDEP@ + case "$(LT_LDFLAGS)" in \ + *-no-install*) \ + $(LIBTOOL) $(LTFLAGS) @LT_STATIC@ --mode=link $(CC) $(LDFLAGS) $(LT_LDFLAGS) -o $@ $(SUDOERS_OBJS) libparsesudoers.la $(SUDOERS_LIBS) -module;; \ + *) \ + $(LIBTOOL) $(LTFLAGS) @LT_STATIC@ --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(SUDOERS_OBJS) libparsesudoers.la $(SUDOERS_LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so;; \ + esac + +visudo: libparsesudoers.la $(VISUDO_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(VISUDO_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(VISUDO_LIBS) + +cvtsudoers: libparsesudoers.la $(CVTSUDOERS_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CVTSUDOERS_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(CVTSUDOERS_LIBS) + +sudoreplay: timestr.lo $(REPLAY_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(REPLAY_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) timestr.lo $(LIBS) $(REPLAY_LIBS) + +testsudoers: libparsesudoers.la $(TEST_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(TEST_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) libparsesudoers.la $(LIBS) $(TESTSUDOERS_LIBS) + +tsdump: $(TSDUMP_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(TSDUMP_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_addr: $(CHECK_ADDR_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_ADDR_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) $(NET_LIBS) + +check_base64: $(CHECK_BASE64_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_BASE64_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_digest: $(CHECK_DIGEST_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_DIGEST_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_env_pattern: $(CHECK_ENV_MATCH_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_ENV_MATCH_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_fill: $(CHECK_FILL_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_FILL_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_gentime: $(CHECK_GENTIME_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_GENTIME_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_hexchar: $(CHECK_HEXCHAR_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_HEXCHAR_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_iolog_plugin: $(CHECK_IOLOG_PLUGIN_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PLUGIN_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @ZLIB@ + +check_iolog_util: $(CHECK_IOLOG_UTIL_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_UTIL_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @ZLIB@ + +check_starttime: $(CHECK_STARTTIME_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_STARTTIME_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +# We need to link check_symbols with -lpthread on HP-UX since LDAP uses threads +check_symbols: $(CHECK_SYMBOLS_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_SYMBOLS_OBJS) $(CHECK_SYMBOLS_LDFLAGS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @SUDO_LIBS@ + +check_wrap: $(CHECK_WRAP_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_WRAP_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +GENERATED = gram.h gram.c toke.c def_data.c def_data.h getdate.c + +prologue: + echo "/*" > $@ + echo " * This is an open source non-commercial project. Dear PVS-Studio, please check it." >> $@ + echo " * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com" >> $@ + echo " */" >> $@ + echo "" >> $@ + echo "#include " >> $@ + +$(devdir)/gram.c $(devdir)/gram.h: $(srcdir)/gram.y prologue + @if [ -n "$(DEVEL)" ]; then \ + if test "$(srcdir)" = "."; then \ + gram_y="gram.y"; \ + else \ + gram_y="$(srcdir)/gram.y"; \ + fi; \ + cmd='$(YACC) -d -p sudoers '"$$gram_y"'; cp prologue $(devdir)/gram.c; $(SED) "s/^\\(#line .*\\) \"y\\.tab\\.c\"/\1 \"gram.c\"/" y.tab.c >> $(devdir)/gram.c; rm -f y.tab.c; mv -f y.tab.h $(devdir)/gram.h'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/toke.c: $(srcdir)/toke.l prologue + @if [ -n "$(DEVEL)" ]; then \ + if test "$(srcdir)" = "."; then \ + toke_l="toke.l"; \ + else \ + toke_l="$(srcdir)/toke.l"; \ + fi; \ + cmd='$(FLEX) '"$$toke_l"'; cp prologue $(devdir)/toke.c; $(SED) "s/^\\(#line .*\\) \"lex\\.sudoers\\.c\"/\1 \"toke.c\"/" lex.sudoers.c >> $(devdir)/toke.c; rm -f lex.sudoers.c'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/getdate.c: $(srcdir)/getdate.y prologue + @if [ -n "$(DEVEL)" ]; then \ + echo "expect 10 shift/reduce conflicts"; \ + if test "$(srcdir)" = "."; then \ + getdate_y="getdate.y"; \ + else \ + getdate_y="$(srcdir)/getdate.y"; \ + fi; \ + cmd='$(YACC) '"$$getdate_y"'; cp prologue $(devdir)/getdate.c; $(SED) "s/^\\(#line .*\\) \"y\\.tab\\.c\"/\1 \"getdate.c\"/" y.tab.c >> $(devdir)/getdate.c; rm -f y.tab.c'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +$(devdir)/def_data.c $(devdir)/def_data.h: $(srcdir)/def_data.in + @if [ -n "$(DEVEL)" ]; then \ + cmd='$(PERL) $(srcdir)/mkdefaults -o $(devdir)/def_data $(srcdir)/def_data.in'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +sudoers: $(srcdir)/sudoers.in + cd $(top_builddir) && $(SHELL) config.status --file=plugins/sudoers/$@ + +pre-install: + @if test X"$(cross_compiling)" != X"yes" -a X"$(DESTDIR)" = X""; then \ + echo "Checking existing sudoers file for syntax errors."; \ + ./visudo -c -f $(sudoersdir)/sudoers; \ + fi + +install: install-plugin install-binaries install-sudoers install-doc + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(plugindir) \ + $(DESTDIR)$(sbindir) $(DESTDIR)$(bindir) \ + $(DESTDIR)$(sudoersdir) $(DESTDIR)$(docdir) \ + `echo $(DESTDIR)$(rundir)|$(SED) 's,/[^/]*$$,,'` \ + `echo $(DESTDIR)$(vardir)|$(SED) 's,/[^/]*$$,,'` + $(INSTALL) -d $(INSTALL_OWNER) -m 0711 $(DESTDIR)$(rundir) + $(INSTALL) -d $(INSTALL_OWNER) -m 0711 $(DESTDIR)$(vardir) + $(INSTALL) -d $(INSTALL_OWNER) -m 0700 $(DESTDIR)$(vardir)/lectured + +install-binaries: cvtsudoers sudoreplay visudo install-dirs + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 cvtsudoers $(DESTDIR)$(bindir)/cvtsudoers + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 sudoreplay $(DESTDIR)$(bindir)/sudoreplay + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 visudo $(DESTDIR)$(sbindir)/visudo + +install-includes: + +install-doc: + +install-plugin: sudoers.la install-dirs + case "$(LT_LDFLAGS)" in \ + *-no-install*) ;; \ + *) if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sudoers.la $(DESTDIR)$(plugindir); \ + fi;; \ + esac + +install-sudoers: install-dirs + $(INSTALL) -d $(INSTALL_OWNER) -m 0750 $(DESTDIR)$(sudoersdir)/sudoers.d + $(INSTALL) $(INSTALL_OWNER) -m $(sudoers_mode) sudoers $(DESTDIR)$(sudoersdir)/sudoers.dist + test -r $(DESTDIR)$(sudoersdir)/sudoers || \ + cp -p $(DESTDIR)$(sudoersdir)/sudoers.dist $(DESTDIR)$(sudoersdir)/sudoers + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/sudoers.la + -rm -f $(DESTDIR)$(bindir)/cvtsudoers \ + $(DESTDIR)$(bindir)/sudoreplay + $(DESTDIR)$(sbindir)/visudo + -test -z "$(INSTALL_BACKUP)" || \ + $(DESTDIR)$(bindir)/cvtsudoers$(INSTALL_BACKUP) \ + $(DESTDIR)$(bindir)/sudoreplay$(INSTALL_BACKUP) \ + $(DESTDIR)$(sbindir)/visudo$(INSTALL_BACKUP) \ + $(DESTDIR)$(plugindir)/sudoers.so$(INSTALL_BACKUP) + -cmp $(DESTDIR)$(sudoersdir)/sudoers $(DESTDIR)$(sudoersdir)/sudoers.dist >/dev/null && \ + rm -f $(DESTDIR)$(sudoersdir)/sudoers + -rm -f $(DESTDIR)$(sudoersdir)/sudoers.dist + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) -I$(top_srcdir) $(srcdir)/*.c $(srcdir)/auth/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(devdir) -I$(srcdir) -I$(top_srcdir) $(srcdir)/*.c $(srcdir)/auth/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: $(TEST_PROGS) visudo testsudoers cvtsudoers + @if test X"$(cross_compiling)" != X"yes"; then \ + LC_ALL=C; export LC_ALL; \ + unset LANG || LANG=; \ + MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \ + MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \ + rval=0; \ + mkdir -p regress/parser; \ + ./check_addr $(srcdir)/regress/parser/check_addr.in || rval=`expr $$rval + $$?`; \ + ./check_base64 || rval=`expr $$rval + $$?`; \ + if test -f check_digest; then \ + ./check_digest > regress/parser/check_digest.out; \ + diff regress/parser/check_digest.out $(srcdir)/regress/parser/check_digest.out.ok || rval=`expr $$rval + $$?`; \ + fi; \ + ./check_env_pattern $(srcdir)/regress/env_match/data || rval=`expr $$rval + $$?`; \ + ./check_fill || rval=`expr $$rval + $$?`; \ + ./check_gentime || rval=`expr $$rval + $$?`; \ + ./check_hexchar || rval=`expr $$rval + $$?`; \ + ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \ + ./check_iolog_plugin $(srcdir)/regress/iolog_plugin/iolog || rval=`expr $$rval + $$?`; \ + ./check_iolog_util || rval=`expr $$rval + $$?`; \ + ./check_starttime || rval=`expr $$rval + $$?`; \ + if test -f check_symbols; then \ + ./check_symbols .libs/sudoers.so $(shlib_exp) || rval=`expr $$rval + $$?`; \ + fi; \ + mkdir -p regress/logging; \ + ./check_wrap $(srcdir)/regress/logging/check_wrap.in > regress/logging/check_wrap.out; \ + diff regress/logging/check_wrap.out $(srcdir)/regress/logging/check_wrap.out.ok || rval=`expr $$rval + $$?`; \ + passed=0; failed=0; total=0; \ + mkdir -p regress/sudoers; \ + dir=sudoers; \ + for t in $(srcdir)/regress/$$dir/*.in; do \ + base=`basename $$t .in`; \ + out="regress/sudoers/$${base}.out"; \ + toke="regress/sudoers/$${base}.toke"; \ + json="regress/sudoers/$${base}.json"; \ + ldif="regress/sudoers/$${base}.ldif"; \ + sudo="regress/sudoers/$${base}.sudo"; \ + ldif2sudo="regress/sudoers/$${base}.ldif2sudo"; \ + if test -s $$json.ok; then \ + ASAN_OPTIONS=; \ + else \ + ASAN_OPTIONS=detect_leaks=0; \ + fi; \ + ASAN_OPTIONS=$$ASAN_OPTIONS \ + ./testsudoers -dt <$$t >$$out 2>$$toke || true; \ + if cmp $$out $(srcdir)/$$out.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (parse): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (parse): FAIL"; \ + diff $$out $(srcdir)/$$out.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + if cmp $$toke $(srcdir)/$$toke.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (toke): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (toke): FAIL"; \ + diff $$toke $(srcdir)/$$toke.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + ./cvtsudoers -c "" -f json $$t >$$json 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if cmp $$json $(srcdir)/$$json.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (json): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (json): FAIL"; \ + diff $$json $(srcdir)/$$json.ok || true; \ + fi; \ + SUDOERS_BASE="ou=SUDOers,dc=sudo,dc=ws" \ + ./cvtsudoers -c "" -f ldif < $$t >$$ldif 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if cmp $$ldif $(srcdir)/$$ldif.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (ldif): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (ldif) FAIL"; \ + diff $$ldif $(srcdir)/$$ldif.ok || true; \ + fi; \ + ./cvtsudoers -c "" -f sudoers $$t >$$sudo 2>/dev/null || true; \ + total=`expr $$total + 1`; \ + if ./visudo -qcf $$sudo; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (reparse): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (reparse) FAIL"; \ + ./visudo -cf $$sudo || true; \ + fi; \ + if test -s $(srcdir)/$$ldif.ok; then \ + ./cvtsudoers -c "" -i ldif -f sudoers $(srcdir)/$$ldif.ok >$$ldif2sudo || true; \ + total=`expr $$total + 1`; \ + if cmp $$ldif2sudo $(srcdir)/$$ldif2sudo.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (ldif2sudo): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: (ldif2sudo) FAIL"; \ + diff $$ldif $(srcdir)/$$ldif.ok || true; \ + fi; \ + fi; \ + done; \ + echo "$$dir: $$passed/$$total tests passed; $$failed/$$total tests failed"; \ + if test $$failed -ne 0; then \ + rval=`expr $$rval + $$failed`; \ + fi; \ + for dir in testsudoers visudo cvtsudoers; do \ + mkdir -p regress/$$dir; \ + passed=0; failed=0; total=0; \ + for t in $(srcdir)/regress/$$dir/*.sh; do \ + base=`basename $$t .sh`; \ + out="regress/$$dir/$${base}.out"; \ + err="regress/$$dir/$${base}.err"; \ + status=0; \ + TESTDIR=$(srcdir)/regress/$$dir \ + $(SHELL) $$t >$$out 2>$$err || status=$$?; \ + if cmp $$out $(srcdir)/$$out.ok >/dev/null; then \ + if test $$status -ne 0; then \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (exit $$status): FAIL"; \ + else \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base: OK"; \ + fi; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base: FAIL"; \ + diff $$out $(srcdir)/$$out.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + if test -s $(srcdir)/$$err.ok; then \ + if cmp $$err $(srcdir)/$$err.ok >/dev/null; then \ + passed=`expr $$passed + 1`; \ + echo "$$dir/$$base (stderr): OK"; \ + else \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (stderr): FAIL"; \ + diff $$err $(srcdir)/$$err.ok || true; \ + fi; \ + total=`expr $$total + 1`; \ + elif test -s $$err; then \ + failed=`expr $$failed + 1`; \ + echo "$$dir/$$base (stderr): FAIL"; \ + cat $$err 1>&2; \ + fi; \ + done; \ + echo "$$dir: $$passed/$$total tests passed; $$failed/$$total tests failed"; \ + if test $$failed -ne 0; then \ + rval=`expr $$rval + $$failed`; \ + fi; \ + done; \ + exit $$rval; \ + fi + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f $(PROGS) $(TEST_PROGS) \ + *.lo *.o *.la *.a *.i *.plog stamp-* core *.core core.* \ + prologue regress/*/*.out regress/*/*.toke regress/*/*.err \ + regress/*/*.json regress/*/*.ldif regress/*/*.sudo + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile sudoers sudoers.lo .libs $(shlib_map) $(shlib_opt) + @if [ -n "$(DEVEL)" -a "$(devdir)" != "$(srcdir)" ]; then \ + cmd='rm -rf $(GENERATED)'; \ + echo "$$cmd"; eval $$cmd; \ + fi + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +afs.lo: $(authdir)/afs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/afs.c +afs.i: $(authdir)/afs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +afs.plog: afs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/afs.c --i-file $< --output-file $@ +aix_auth.lo: $(authdir)/aix_auth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/aix_auth.c +aix_auth.i: $(authdir)/aix_auth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +aix_auth.plog: aix_auth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/aix_auth.c --i-file $< --output-file $@ +alias.lo: $(srcdir)/alias.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/alias.c +alias.i: $(srcdir)/alias.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/redblack.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +alias.plog: alias.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/alias.c --i-file $< --output-file $@ +audit.lo: $(srcdir)/audit.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/bsm_audit.h $(srcdir)/defaults.h $(srcdir)/linux_audit.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/solaris_audit.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/audit.c +audit.i: $(srcdir)/audit.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/bsm_audit.h $(srcdir)/defaults.h $(srcdir)/linux_audit.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/solaris_audit.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +audit.plog: audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/audit.c --i-file $< --output-file $@ +base64.lo: $(srcdir)/base64.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/base64.c +base64.i: $(srcdir)/base64.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +base64.plog: base64.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/base64.c --i-file $< --output-file $@ +boottime.lo: $(srcdir)/boottime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/boottime.c +boottime.i: $(srcdir)/boottime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +boottime.plog: boottime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/boottime.c --i-file $< --output-file $@ +bsdauth.lo: $(authdir)/bsdauth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/bsdauth.c +bsdauth.i: $(authdir)/bsdauth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +bsdauth.plog: bsdauth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/bsdauth.c --i-file $< --output-file $@ +bsm_audit.lo: $(srcdir)/bsm_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/bsm_audit.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/bsm_audit.c +bsm_audit.i: $(srcdir)/bsm_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/bsm_audit.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +bsm_audit.plog: bsm_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/bsm_audit.c --i-file $< --output-file $@ +check.lo: $(srcdir)/check.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/check.c +check.i: $(srcdir)/check.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check.plog: check.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/check.c --i-file $< --output-file $@ +check_addr.o: $(srcdir)/regress/parser/check_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_addr.c +check_addr.i: $(srcdir)/regress/parser/check_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_addr.plog: check_addr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_addr.c --i-file $< --output-file $@ +check_base64.o: $(srcdir)/regress/parser/check_base64.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_base64.c +check_base64.i: $(srcdir)/regress/parser/check_base64.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_base64.plog: check_base64.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_base64.c --i-file $< --output-file $@ +check_digest.o: $(srcdir)/regress/parser/check_digest.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_digest.c +check_digest.i: $(srcdir)/regress/parser/check_digest.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_digest.plog: check_digest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_digest.c --i-file $< --output-file $@ +check_env_pattern.o: $(srcdir)/regress/env_match/check_env_pattern.c \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/env_match/check_env_pattern.c +check_env_pattern.i: $(srcdir)/regress/env_match/check_env_pattern.c \ + $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_env_pattern.plog: check_env_pattern.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/env_match/check_env_pattern.c --i-file $< --output-file $@ +check_fill.o: $(srcdir)/regress/parser/check_fill.c $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(srcdir)/toke.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_fill.c +check_fill.i: $(srcdir)/regress/parser/check_fill.c $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h $(srcdir)/toke.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_fill.plog: check_fill.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_fill.c --i-file $< --output-file $@ +check_gentime.o: $(srcdir)/regress/parser/check_gentime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_gentime.c +check_gentime.i: $(srcdir)/regress/parser/check_gentime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/parse.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_gentime.plog: check_gentime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_gentime.c --i-file $< --output-file $@ +check_hexchar.o: $(srcdir)/regress/parser/check_hexchar.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/parser/check_hexchar.c +check_hexchar.i: $(srcdir)/regress/parser/check_hexchar.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_hexchar.plog: check_hexchar.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/parser/check_hexchar.c --i-file $< --output-file $@ +check_iolog_path.o: $(srcdir)/regress/iolog_path/check_iolog_path.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_path/check_iolog_path.c +check_iolog_path.i: $(srcdir)/regress/iolog_path/check_iolog_path.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_iolog_path.plog: check_iolog_path.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_path/check_iolog_path.c --i-file $< --output-file $@ +check_iolog_plugin.o: $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/iolog.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c +check_iolog_plugin.i: $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c \ + $(devdir)/def_data.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/iolog.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_iolog_plugin.plog: check_iolog_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_plugin/check_iolog_plugin.c --i-file $< --output-file $@ +check_iolog_util.o: $(srcdir)/regress/iolog_util/check_iolog_util.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/iolog.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_util/check_iolog_util.c +check_iolog_util.i: $(srcdir)/regress/iolog_util/check_iolog_util.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/iolog.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_iolog_util.plog: check_iolog_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_util/check_iolog_util.c --i-file $< --output-file $@ +check_starttime.o: $(srcdir)/regress/starttime/check_starttime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/starttime/check_starttime.c +check_starttime.i: $(srcdir)/regress/starttime/check_starttime.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_starttime.plog: check_starttime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/starttime/check_starttime.c --i-file $< --output-file $@ +check_symbols.o: $(srcdir)/regress/check_symbols/check_symbols.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/check_symbols/check_symbols.c +check_symbols.i: $(srcdir)/regress/check_symbols/check_symbols.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_symbols.plog: check_symbols.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/check_symbols/check_symbols.c --i-file $< --output-file $@ +check_wrap.o: $(srcdir)/regress/logging/check_wrap.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/logging/check_wrap.c +check_wrap.i: $(srcdir)/regress/logging/check_wrap.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_wrap.plog: check_wrap.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/logging/check_wrap.c --i-file $< --output-file $@ +cvtsudoers.o: $(srcdir)/cvtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers.c +cvtsudoers.i: $(srcdir)/cvtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers.plog: cvtsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers.c --i-file $< --output-file $@ +cvtsudoers_json.o: $(srcdir)/cvtsudoers_json.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_json.c +cvtsudoers_json.i: $(srcdir)/cvtsudoers_json.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/cvtsudoers.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_json.plog: cvtsudoers_json.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_json.c --i-file $< --output-file $@ +cvtsudoers_ldif.o: $(srcdir)/cvtsudoers_ldif.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_ldif.c +cvtsudoers_ldif.i: $(srcdir)/cvtsudoers_ldif.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_ldif.plog: cvtsudoers_ldif.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_ldif.c --i-file $< --output-file $@ +cvtsudoers_pwutil.o: $(srcdir)/cvtsudoers_pwutil.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/cvtsudoers_pwutil.c +cvtsudoers_pwutil.i: $(srcdir)/cvtsudoers_pwutil.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/cvtsudoers.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +cvtsudoers_pwutil.plog: cvtsudoers_pwutil.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/cvtsudoers_pwutil.c --i-file $< --output-file $@ +dce.lo: $(authdir)/dce.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/dce.c +dce.i: $(authdir)/dce.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +dce.plog: dce.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/dce.c --i-file $< --output-file $@ +defaults.lo: $(srcdir)/defaults.c $(devdir)/def_data.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/defaults.c +defaults.i: $(srcdir)/defaults.c $(devdir)/def_data.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +defaults.plog: defaults.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/defaults.c --i-file $< --output-file $@ +digestname.lo: $(srcdir)/digestname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_queue.h \ + $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/digestname.c +digestname.i: $(srcdir)/digestname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_queue.h \ + $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +digestname.plog: digestname.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/digestname.c --i-file $< --output-file $@ +editor.lo: $(srcdir)/editor.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/editor.c +editor.i: $(srcdir)/editor.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +editor.plog: editor.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/editor.c --i-file $< --output-file $@ +env.lo: $(srcdir)/env.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/env.c +env.i: $(srcdir)/env.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +env.plog: env.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/env.c --i-file $< --output-file $@ +env_pattern.lo: $(srcdir)/env_pattern.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/env_pattern.c +env_pattern.i: $(srcdir)/env_pattern.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +env_pattern.plog: env_pattern.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/env_pattern.c --i-file $< --output-file $@ +file.lo: $(srcdir)/file.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/file.c +file.i: $(srcdir)/file.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +file.plog: file.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/file.c --i-file $< --output-file $@ +filedigest.lo: $(srcdir)/filedigest.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/filedigest.c +filedigest.i: $(srcdir)/filedigest.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +filedigest.plog: filedigest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/filedigest.c --i-file $< --output-file $@ +find_path.lo: $(srcdir)/find_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/find_path.c +find_path.i: $(srcdir)/find_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +find_path.plog: find_path.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/find_path.c --i-file $< --output-file $@ +fmtsudoers.lo: $(srcdir)/fmtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/fmtsudoers.c +fmtsudoers.i: $(srcdir)/fmtsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +fmtsudoers.plog: fmtsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/fmtsudoers.c --i-file $< --output-file $@ +fwtk.lo: $(authdir)/fwtk.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/fwtk.c +fwtk.i: $(authdir)/fwtk.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +fwtk.plog: fwtk.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/fwtk.c --i-file $< --output-file $@ +gc.lo: $(srcdir)/gc.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gc.c +gc.i: $(srcdir)/gc.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gc.plog: gc.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gc.c --i-file $< --output-file $@ +gentime.lo: $(srcdir)/gentime.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gentime.c +gentime.i: $(srcdir)/gentime.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gentime.plog: gentime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gentime.c --i-file $< --output-file $@ +getdate.o: $(devdir)/getdate.c $(incdir)/sudo_compat.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/getdate.c +getdate.i: $(devdir)/getdate.c $(incdir)/sudo_compat.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getdate.plog: getdate.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/getdate.c --i-file $< --output-file $@ +getspwuid.lo: $(srcdir)/getspwuid.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/getspwuid.c +getspwuid.i: $(srcdir)/getspwuid.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +getspwuid.plog: getspwuid.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/getspwuid.c --i-file $< --output-file $@ +gmtoff.lo: $(srcdir)/gmtoff.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/gmtoff.c +gmtoff.i: $(srcdir)/gmtoff.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gmtoff.plog: gmtoff.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/gmtoff.c --i-file $< --output-file $@ +goodpath.lo: $(srcdir)/goodpath.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/goodpath.c +goodpath.i: $(srcdir)/goodpath.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +goodpath.plog: goodpath.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/goodpath.c --i-file $< --output-file $@ +gram.lo: $(devdir)/gram.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/gram.c +gram.i: $(devdir)/gram.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +gram.plog: gram.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/gram.c --i-file $< --output-file $@ +group_plugin.lo: $(srcdir)/group_plugin.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/group_plugin.c +group_plugin.i: $(srcdir)/group_plugin.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +group_plugin.plog: group_plugin.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/group_plugin.c --i-file $< --output-file $@ +hexchar.lo: $(srcdir)/hexchar.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/hexchar.c +hexchar.i: $(srcdir)/hexchar.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +hexchar.plog: hexchar.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/hexchar.c --i-file $< --output-file $@ +interfaces.lo: $(srcdir)/interfaces.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/interfaces.c +interfaces.i: $(srcdir)/interfaces.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +interfaces.plog: interfaces.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/interfaces.c --i-file $< --output-file $@ +iolog.lo: $(srcdir)/iolog.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/iolog.h $(srcdir)/iolog_files.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog.c +iolog.i: $(srcdir)/iolog.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/iolog.h $(srcdir)/iolog_files.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog.plog: iolog.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog.c --i-file $< --output-file $@ +iolog_path.lo: $(srcdir)/iolog_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_path.c +iolog_path.i: $(srcdir)/iolog_path.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog_path.plog: iolog_path.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_path.c --i-file $< --output-file $@ +iolog_util.o: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/iolog.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_util.c +iolog_util.i: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/iolog.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog_util.plog: iolog_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_util.c --i-file $< --output-file $@ +kerb5.lo: $(authdir)/kerb5.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/kerb5.c +kerb5.i: $(authdir)/kerb5.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +kerb5.plog: kerb5.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/kerb5.c --i-file $< --output-file $@ +ldap.lo: $(srcdir)/ldap.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap.c +ldap.i: $(srcdir)/ldap.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap.plog: ldap.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap.c --i-file $< --output-file $@ +ldap_conf.lo: $(srcdir)/ldap_conf.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap_conf.c +ldap_conf.i: $(srcdir)/ldap_conf.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_ldap_conf.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap_conf.plog: ldap_conf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap_conf.c --i-file $< --output-file $@ +ldap_util.lo: $(srcdir)/ldap_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ldap_util.c +ldap_util.i: $(srcdir)/ldap_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_digest.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ldap_util.plog: ldap_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ldap_util.c --i-file $< --output-file $@ +linux_audit.lo: $(srcdir)/linux_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/linux_audit.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/linux_audit.c +linux_audit.i: $(srcdir)/linux_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/linux_audit.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +linux_audit.plog: linux_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/linux_audit.c --i-file $< --output-file $@ +locale.lo: $(srcdir)/locale.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/locale.c +locale.i: $(srcdir)/locale.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +locale.plog: locale.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/locale.c --i-file $< --output-file $@ +logging.lo: $(srcdir)/logging.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/logging.c +logging.i: $(srcdir)/logging.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +logging.plog: logging.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/logging.c --i-file $< --output-file $@ +logwrap.lo: $(srcdir)/logwrap.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/logwrap.c +logwrap.i: $(srcdir)/logwrap.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +logwrap.plog: logwrap.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/logwrap.c --i-file $< --output-file $@ +match.lo: $(srcdir)/match.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/fnmatch.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match.c +match.i: $(srcdir)/match.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/fnmatch.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match.plog: match.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match.c --i-file $< --output-file $@ +match_addr.lo: $(srcdir)/match_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_addr.c +match_addr.i: $(srcdir)/match_addr.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_addr.plog: match_addr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_addr.c --i-file $< --output-file $@ +match_command.lo: $(srcdir)/match_command.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/fnmatch.h \ + $(incdir)/compat/glob.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_command.c +match_command.i: $(srcdir)/match_command.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/fnmatch.h \ + $(incdir)/compat/glob.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_command.plog: match_command.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_command.c --i-file $< --output-file $@ +match_digest.lo: $(srcdir)/match_digest.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/match_digest.c +match_digest.i: $(srcdir)/match_digest.c $(devdir)/def_data.h \ + $(devdir)/gram.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +match_digest.plog: match_digest.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/match_digest.c --i-file $< --output-file $@ +mkdir_parents.lo: $(srcdir)/mkdir_parents.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/mkdir_parents.c +mkdir_parents.i: $(srcdir)/mkdir_parents.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +mkdir_parents.plog: mkdir_parents.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/mkdir_parents.c --i-file $< --output-file $@ +net_ifs.o: $(top_srcdir)/src/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(top_srcdir)/src/net_ifs.c +net_ifs.i: $(top_srcdir)/src/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +net_ifs.plog: net_ifs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(top_srcdir)/src/net_ifs.c --i-file $< --output-file $@ +pam.lo: $(authdir)/pam.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/pam.c +pam.i: $(authdir)/pam.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pam.plog: pam.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/pam.c --i-file $< --output-file $@ +parse.lo: $(srcdir)/parse.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/parse.c +parse.i: $(srcdir)/parse.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +parse.plog: parse.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/parse.c --i-file $< --output-file $@ +parse_ldif.o: $(srcdir)/parse_ldif.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/parse_ldif.c +parse_ldif.i: $(srcdir)/parse_ldif.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/strlist.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +parse_ldif.plog: parse_ldif.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/parse_ldif.c --i-file $< --output-file $@ +passwd.lo: $(authdir)/passwd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/passwd.c +passwd.i: $(authdir)/passwd.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +passwd.plog: passwd.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/passwd.c --i-file $< --output-file $@ +policy.lo: $(srcdir)/policy.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/policy.c +policy.i: $(srcdir)/policy.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/interfaces.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +policy.plog: policy.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/policy.c --i-file $< --output-file $@ +prompt.lo: $(srcdir)/prompt.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/prompt.c +prompt.i: $(srcdir)/prompt.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +prompt.plog: prompt.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/prompt.c --i-file $< --output-file $@ +pwutil.lo: $(srcdir)/pwutil.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/redblack.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pwutil.c +pwutil.i: $(srcdir)/pwutil.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/pwutil.h \ + $(srcdir)/redblack.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pwutil.plog: pwutil.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil.c --i-file $< --output-file $@ +pwutil_impl.lo: $(srcdir)/pwutil_impl.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pwutil_impl.c +pwutil_impl.i: $(srcdir)/pwutil_impl.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/pwutil.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +pwutil_impl.plog: pwutil_impl.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil_impl.c --i-file $< --output-file $@ +rcstr.lo: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/rcstr.c +rcstr.i: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +rcstr.plog: rcstr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/rcstr.c --i-file $< --output-file $@ +redblack.lo: $(srcdir)/redblack.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/redblack.c +redblack.i: $(srcdir)/redblack.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +redblack.plog: redblack.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/redblack.c --i-file $< --output-file $@ +rfc1938.lo: $(authdir)/rfc1938.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/rfc1938.c +rfc1938.i: $(authdir)/rfc1938.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +rfc1938.plog: rfc1938.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/rfc1938.c --i-file $< --output-file $@ +secureware.lo: $(authdir)/secureware.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/secureware.c +secureware.i: $(authdir)/secureware.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +secureware.plog: secureware.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/secureware.c --i-file $< --output-file $@ +securid5.lo: $(authdir)/securid5.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/securid5.c +securid5.i: $(authdir)/securid5.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +securid5.plog: securid5.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/securid5.c --i-file $< --output-file $@ +set_perms.lo: $(srcdir)/set_perms.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/set_perms.c +set_perms.i: $(srcdir)/set_perms.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +set_perms.plog: set_perms.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/set_perms.c --i-file $< --output-file $@ +sia.lo: $(authdir)/sia.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/sia.c +sia.i: $(authdir)/sia.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sia.plog: sia.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/sia.c --i-file $< --output-file $@ +solaris_audit.lo: $(srcdir)/solaris_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/solaris_audit.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/solaris_audit.c +solaris_audit.i: $(srcdir)/solaris_audit.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/solaris_audit.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +solaris_audit.plog: solaris_audit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/solaris_audit.c --i-file $< --output-file $@ +sssd.lo: $(srcdir)/sssd.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sssd.c +sssd.i: $(srcdir)/sssd.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_ldap.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sssd.plog: sssd.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sssd.c --i-file $< --output-file $@ +starttime.lo: $(srcdir)/starttime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/starttime.c +starttime.i: $(srcdir)/starttime.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +starttime.plog: starttime.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/starttime.c --i-file $< --output-file $@ +strlist.o: $(srcdir)/strlist.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/strlist.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/strlist.c +strlist.i: $(srcdir)/strlist.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/strlist.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +strlist.plog: strlist.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/strlist.c --i-file $< --output-file $@ +stubs.o: $(srcdir)/stubs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/stubs.c +stubs.i: $(srcdir)/stubs.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +stubs.plog: stubs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/stubs.c --i-file $< --output-file $@ +sudo_auth.lo: $(authdir)/sudo_auth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_rand.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/ins_2001.h $(srcdir)/ins_classic.h \ + $(srcdir)/ins_csops.h $(srcdir)/ins_goons.h \ + $(srcdir)/ins_python.h $(srcdir)/insults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(authdir)/sudo_auth.c +sudo_auth.i: $(authdir)/sudo_auth.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_rand.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/ins_2001.h $(srcdir)/ins_classic.h \ + $(srcdir)/ins_csops.h $(srcdir)/ins_goons.h \ + $(srcdir)/ins_python.h $(srcdir)/insults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_auth.plog: sudo_auth.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(authdir)/sudo_auth.c --i-file $< --output-file $@ +sudo_nss.lo: $(srcdir)/sudo_nss.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_nss.c +sudo_nss.i: $(srcdir)/sudo_nss.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_nss.plog: sudo_nss.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_nss.c --i-file $< --output-file $@ +sudo_printf.o: $(srcdir)/sudo_printf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_printf.c +sudo_printf.i: $(srcdir)/sudo_printf.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_printf.plog: sudo_printf.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_printf.c --i-file $< --output-file $@ +sudoers.lo: $(srcdir)/sudoers.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/auth/sudo_auth.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoers.c +sudoers.i: $(srcdir)/sudoers.c $(devdir)/def_data.h \ + $(incdir)/compat/getaddrinfo.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/auth/sudo_auth.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoers.plog: sudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoers.c --i-file $< --output-file $@ +sudoers_debug.lo: $(srcdir)/sudoers_debug.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoers_debug.c +sudoers_debug.i: $(srcdir)/sudoers_debug.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoers_debug.plog: sudoers_debug.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoers_debug.c --i-file $< --output-file $@ +sudoreplay.o: $(srcdir)/sudoreplay.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/iolog.h \ + $(srcdir)/iolog_files.h $(srcdir)/logging.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudoreplay.c +sudoreplay.i: $(srcdir)/sudoreplay.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_event.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/iolog.h \ + $(srcdir)/iolog_files.h $(srcdir)/logging.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudoreplay.plog: sudoreplay.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudoreplay.c --i-file $< --output-file $@ +testsudoers.o: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/testsudoers.c +testsudoers.i: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +testsudoers.plog: testsudoers.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/testsudoers.c --i-file $< --output-file $@ +timeout.lo: $(srcdir)/timeout.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timeout.c +timeout.i: $(srcdir)/timeout.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timeout.plog: timeout.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timeout.c --i-file $< --output-file $@ +timestamp.lo: $(srcdir)/timestamp.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timestamp.c +timestamp.i: $(srcdir)/timestamp.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/check.h $(srcdir)/defaults.h \ + $(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timestamp.plog: timestamp.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timestamp.c --i-file $< --output-file $@ +timestr.lo: $(srcdir)/timestr.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timestr.c +timestr.i: $(srcdir)/timestr.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_queue.h $(srcdir)/parse.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +timestr.plog: timestr.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/timestr.c --i-file $< --output-file $@ +toke.lo: $(devdir)/toke.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(devdir)/toke.c +toke.i: $(devdir)/toke.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_digest.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h $(incdir)/sudo_lbuf.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/logging.h $(srcdir)/parse.h \ + $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/toke.h $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +toke.plog: toke.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(devdir)/toke.c --i-file $< --output-file $@ +toke_util.lo: $(srcdir)/toke_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/toke_util.c +toke_util.i: $(srcdir)/toke_util.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/toke.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +toke_util.plog: toke_util.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/toke_util.c --i-file $< --output-file $@ +tsdump.o: $(srcdir)/tsdump.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tsdump.c +tsdump.i: $(srcdir)/tsdump.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/check.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tsdump.plog: tsdump.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tsdump.c --i-file $< --output-file $@ +tsgetgrpw.o: $(srcdir)/tsgetgrpw.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tsgetgrpw.c +tsgetgrpw.i: $(srcdir)/tsgetgrpw.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tsgetgrpw.plog: tsgetgrpw.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tsgetgrpw.c --i-file $< --output-file $@ +visudo.o: $(srcdir)/visudo.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/visudo.c +visudo.i: $(srcdir)/visudo.c $(devdir)/def_data.h $(devdir)/gram.h \ + $(incdir)/compat/getopt.h $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/defaults.h $(srcdir)/interfaces.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/redblack.h $(srcdir)/sudo_nss.h \ + $(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \ + $(srcdir)/sudoers_version.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +visudo.plog: visudo.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/visudo.c --i-file $< --output-file $@ diff --git a/utsudo-0.0.2/plugins/sudoers/alias.c b/utsudo-0.0.2/plugins/sudoers/alias.c new file mode 100644 index 0000000..adbf946 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/alias.c @@ -0,0 +1,383 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include + +#include "sudoers.h" +#include "redblack.h" +#include + +/* + * Comparison function for the red-black tree. + * Aliases are sorted by name with the type used as a tie-breaker. + */ +static int +alias_compare(const void *v1, const void *v2) +{ + const struct alias *a1 = (const struct alias *)v1; + const struct alias *a2 = (const struct alias *)v2; + int res; + debug_decl(alias_compare, SUDOERS_DEBUG_ALIAS) + + if (a1 == NULL) + res = -1; + else if (a2 == NULL) + res = 1; + else if ((res = strcmp(a1->name, a2->name)) == 0) + res = a1->type - a2->type; + debug_return_int(res); +} + +/* + * Search the tree for an alias with the specified name and type. + * Returns a pointer to the alias structure or NULL if not found. + * Caller is responsible for calling alias_put() on the returned + * alias to mark it as unused. + */ +struct alias * +alias_get(struct sudoers_parse_tree *parse_tree, const char *name, int type) +{ + struct alias key; + struct rbnode *node; + struct alias *a = NULL; + debug_decl(alias_get, SUDOERS_DEBUG_ALIAS) + + if (parse_tree->aliases == NULL) + debug_return_ptr(NULL); + + key.name = (char *)name; + key.type = type; + if ((node = rbfind(parse_tree->aliases, &key)) != NULL) { + /* + * Check whether this alias is already in use. + * If so, we've detected a loop. If not, set the flag, + * which the caller should clear with a call to alias_put(). + */ + a = node->data; + if (a->used) { + errno = ELOOP; + debug_return_ptr(NULL); + } + a->used = true; + } else { + errno = ENOENT; + } + debug_return_ptr(a); +} + +/* + * Clear the "used" flag in an alias once the caller is done with it. + */ +void +alias_put(struct alias *a) +{ + debug_decl(alias_put, SUDOERS_DEBUG_ALIAS) + a->used = false; + debug_return; +} + +/* + * Add an alias to the aliases redblack tree. + * Note that "file" must be a reference-counted string. + * Returns NULL on success and an error string on failure. + */ +const char * +alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type, + char *file, int lineno, struct member *members) +{ + static char errbuf[512]; + struct alias *a; + debug_decl(alias_add, SUDOERS_DEBUG_ALIAS) + + if (parse_tree->aliases == NULL) { + if ((parse_tree->aliases = alloc_aliases()) == NULL) { + strlcpy(errbuf, N_("unable to allocate memory"), sizeof(errbuf)); + debug_return_str(errbuf); + } + } + + a = calloc(1, sizeof(*a)); + if (a == NULL) { + strlcpy(errbuf, N_("unable to allocate memory"), sizeof(errbuf)); + debug_return_str(errbuf); + } + a->name = name; + a->type = type; + /* a->used = false; */ + a->file = rcstr_addref(file); + a->lineno = lineno; + HLTQ_TO_TAILQ(&a->members, members, entries); + switch (rbinsert(parse_tree->aliases, a, NULL)) { + case 1: + (void)snprintf(errbuf, sizeof(errbuf), + N_("Alias \"%s\" already defined"), name); + alias_free(a); + debug_return_str(errbuf); + case -1: + (void)strlcpy(errbuf, N_("unable to allocate memory"), sizeof(errbuf)); + alias_free(a); + debug_return_str(errbuf); + } + debug_return_str(NULL); +} + +/* + * Closure to adapt 2-arg rbapply() to 3-arg alias_apply(). + */ +struct alias_apply_closure { + struct sudoers_parse_tree *parse_tree; + int (*func)(struct sudoers_parse_tree *, struct alias *, void *); + void *cookie; +}; + +/* Adapt rbapply() to alias_apply() calling convention. */ +static int +alias_apply_func(void *v1, void *v2) +{ + struct alias *a = v1; + struct alias_apply_closure *closure = v2; + + return closure->func(closure->parse_tree, a, closure->cookie); +} + +/* + * Apply a function to each alias entry and pass in a cookie. + */ +void +alias_apply(struct sudoers_parse_tree *parse_tree, + int (*func)(struct sudoers_parse_tree *, struct alias *, void *), + void *cookie) +{ + struct alias_apply_closure closure; + debug_decl(alias_apply, SUDOERS_DEBUG_ALIAS) + + if (parse_tree->aliases != NULL) { + closure.parse_tree = parse_tree; + closure.func = func; + closure.cookie = cookie; + rbapply(parse_tree->aliases, alias_apply_func, &closure, inorder); + } + + debug_return; +} + +/* + * Returns true if there are no aliases in the parse_tree, else false. + */ +bool +no_aliases(struct sudoers_parse_tree *parse_tree) +{ + debug_decl(no_aliases, SUDOERS_DEBUG_ALIAS) + debug_return_bool(parse_tree->aliases == NULL || + rbisempty(parse_tree->aliases)); +} + +/* + * Free memory used by an alias struct and its members. + */ +void +alias_free(void *v) +{ + struct alias *a = (struct alias *)v; + debug_decl(alias_free, SUDOERS_DEBUG_ALIAS) + + if (a != NULL) { + free(a->name); + rcstr_delref(a->file); + free_members(&a->members); + free(a); + } + + debug_return; +} + +/* + * Find the named alias, remove it from the tree and return it. + */ +struct alias * +alias_remove(struct sudoers_parse_tree *parse_tree, char *name, int type) +{ + struct rbnode *node; + struct alias key; + debug_decl(alias_remove, SUDOERS_DEBUG_ALIAS) + + if (parse_tree->aliases != NULL) { + key.name = name; + key.type = type; + if ((node = rbfind(parse_tree->aliases, &key)) != NULL) + debug_return_ptr(rbdelete(parse_tree->aliases, node)); + } + errno = ENOENT; + debug_return_ptr(NULL); +} + +struct rbtree * +alloc_aliases(void) +{ + debug_decl(alloc_aliases, SUDOERS_DEBUG_ALIAS) + + debug_return_ptr(rbcreate(alias_compare)); +} + +void +free_aliases(struct rbtree *aliases) +{ + debug_decl(free_aliases, SUDOERS_DEBUG_ALIAS) + + if (aliases != NULL) + rbdestroy(aliases, alias_free); +} + +const char * +alias_type_to_string(int alias_type) +{ + return alias_type == HOSTALIAS ? "Host_Alias" : + alias_type == CMNDALIAS ? "Cmnd_Alias" : + alias_type == USERALIAS ? "User_Alias" : + alias_type == RUNASALIAS ? "Runas_Alias" : + "Invalid_Alias"; +} + +/* + * Remove the alias of the specified type as well as any other aliases + * referenced by that alias. Stores removed aliases in a freelist. + */ +static bool +alias_remove_recursive(struct sudoers_parse_tree *parse_tree, char *name, + int type, struct rbtree *freelist) +{ + struct member *m; + struct alias *a; + bool ret = true; + debug_decl(alias_remove_recursive, SUDOERS_DEBUG_ALIAS) + + if ((a = alias_remove(parse_tree, name, type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type == ALIAS) { + if (!alias_remove_recursive(parse_tree, m->name, type, freelist)) + ret = false; + } + } + if (rbinsert(freelist, a, NULL) != 0) + ret = false; + } + debug_return_bool(ret); +} + +static int +alias_find_used_members(struct sudoers_parse_tree *parse_tree, + struct member_list *members, int atype, struct rbtree *used_aliases) +{ + struct member *m; + int errors = 0; + debug_decl(alias_find_used_members, SUDOERS_DEBUG_ALIAS) + + if (members != NULL) { + TAILQ_FOREACH(m, members, entries) { + if (m->type != ALIAS) + continue; + if (!alias_remove_recursive(parse_tree, m->name, atype, used_aliases)) + errors++; + } + } + + debug_return_int(errors); +} + +/* + * Move all aliases referenced by userspecs to used_aliases. + */ +bool +alias_find_used(struct sudoers_parse_tree *parse_tree, struct rbtree *used_aliases) +{ + struct privilege *priv; + struct userspec *us; + struct cmndspec *cs; + struct defaults *d; + struct member *m; + int errors = 0; + debug_decl(alias_find_used, SUDOERS_DEBUG_ALIAS) + + /* Move referenced aliases to used_aliases. */ + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + errors += alias_find_used_members(parse_tree, &us->users, + USERALIAS, used_aliases); + TAILQ_FOREACH(priv, &us->privileges, entries) { + errors += alias_find_used_members(parse_tree, &priv->hostlist, + HOSTALIAS, used_aliases); + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + errors += alias_find_used_members(parse_tree, cs->runasuserlist, + RUNASALIAS, used_aliases); + errors += alias_find_used_members(parse_tree, cs->runasgrouplist, + RUNASALIAS, used_aliases); + if ((m = cs->cmnd)->type == ALIAS) { + if (!alias_remove_recursive(parse_tree, m->name, CMNDALIAS, + used_aliases)) + errors++; + } + } + } + } + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + switch (d->type) { + case DEFAULTS_HOST: + errors += alias_find_used_members(parse_tree, d->binding, + HOSTALIAS, used_aliases); + break; + case DEFAULTS_USER: + errors += alias_find_used_members(parse_tree, d->binding, + USERALIAS, used_aliases); + break; + case DEFAULTS_RUNAS: + errors += alias_find_used_members(parse_tree, d->binding, + RUNASALIAS, used_aliases); + break; + case DEFAULTS_CMND: + errors += alias_find_used_members(parse_tree, d->binding, + CMNDALIAS, used_aliases); + break; + default: + break; + } + } + + debug_return_int(errors ? false : true); +} diff --git a/utsudo-0.0.2/plugins/sudoers/audit.c b/utsudo-0.0.2/plugins/sudoers/audit.c new file mode 100644 index 0000000..08d32e3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/audit.c @@ -0,0 +1,110 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include + +#include "sudoers.h" + +#ifdef HAVE_BSM_AUDIT +# include "bsm_audit.h" +#endif +#ifdef HAVE_LINUX_AUDIT +# include "linux_audit.h" +#endif +#ifdef HAVE_SOLARIS_AUDIT +# include "solaris_audit.h" +#endif + +int +audit_success(int argc, char *argv[]) +{ + int rc = 0; + debug_decl(audit_success, SUDOERS_DEBUG_AUDIT) + + if (!def_log_allowed) + debug_return_int(0); + + if (argv != NULL) { +#ifdef HAVE_BSM_AUDIT + if (bsm_audit_success(argv) == -1) + rc = -1; +#endif +#ifdef HAVE_LINUX_AUDIT + if (linux_audit_command(argv, 1) == -1) + rc = -1; +#endif +#ifdef HAVE_SOLARIS_AUDIT + if (solaris_audit_success(argc, argv) == -1) + rc = -1; +#endif + } + + debug_return_int(rc); +} + +int +audit_failure(int argc, char *argv[], char const *const fmt, ...) +{ + int rc = 0; + debug_decl(audit_success, SUDOERS_DEBUG_AUDIT) + + if (!def_log_denied) + debug_return_int(0); + +#if defined(HAVE_BSM_AUDIT) || defined(HAVE_LINUX_AUDIT) + if (argv != NULL) { + va_list ap; + int oldlocale; + + /* Audit error messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + +#ifdef HAVE_BSM_AUDIT + va_start(ap, fmt); + if (bsm_audit_failure(argv, _(fmt), ap) == -1) + rc = -1; + va_end(ap); +#endif +#ifdef HAVE_LINUX_AUDIT + va_start(ap, fmt); + if (linux_audit_command(argv, 0) == -1) + rc = -1; + va_end(ap); +#endif +#ifdef HAVE_SOLARIS_AUDIT + va_start(ap, fmt); + if (solaris_audit_failure(argc, argv, _(fmt), ap) == -1) + rc = -1; + va_end(ap); +#endif + + sudoers_setlocale(oldlocale, NULL); + } +#endif /* HAVE_BSM_AUDIT || HAVE_LINUX_AUDIT */ + + debug_return_int(rc); +} diff --git a/utsudo-0.0.2/plugins/sudoers/auth/API b/utsudo-0.0.2/plugins/sudoers/auth/API new file mode 100644 index 0000000..901cc88 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/API @@ -0,0 +1,135 @@ +NOTE: the Sudo auth API is subject to change + +Purpose: to provide a simple API for authentication methods that + encapsulates things nicely without turning into a maze + of #ifdef's + +The sudo_auth struct looks like this: + +typedef struct sudo_auth { + int flags; /* various flags, see below */ + int status; /* status from verify routine */ + char *name; /* name of the method in string form */ + void *data; /* method-specific data pointer */ + + int (*init)(struct passwd *pw, sudo_auth *auth); + int (*setup)(struct passwd *pw, char **prompt, sudo_auth *auth); + int (*verify)(struct passwd *pw, char *p, sudo_auth *auth, struct sudo_conv_callback *callback); + int (*approval)(struct passwd *pw, sudo_auth *auth); + int (*cleanup)(struct passwd *pw, sudo_auth *auth); + int (*begin_session)(struct passwd *pw, char **user_env[], struct sudo_auth *auth); + int (*end_session)(struct passwd *pw, struct sudo_auth *auth); +} sudo_auth; + +The variables in the struct are as follows: + flags Bitwise binary flags, see below. + + status Contains the return value from the last run of + the "verify" function. Starts out as AUTH_FAILURE. + + name The name of the authentication method as a C string. + + data A pointer to method-specific data. This is passed to + all the functions of an auth method and is usually + initialized in the "init" or "setup" routines. + +Possible values of sudo_auth.flags: + FLAG_DISABLED Set if an "init" or "setup" function fails. + + FLAG_STANDALONE If set, this indicates that the method must + be the only auth method configured, and that + it will prompt for the password itself. + + FLAG_ONEANDONLY If set, this indicates that the method is the + only one in use. Can be used by auth functions + to determine whether to return a fatal or nonfatal + error. + +The member functions can return the following values: + AUTH_SUCCESS Function succeeded. For a ``verify'' function + this means the user correctly authenticated. + + AUTH_FAILURE Function failed. If this is an ``init'' or + ``setup'' routine, the auth method will be + marked as !configured. + + AUTH_FATAL A fatal error occurred. The routine should have + written an error message to stderr and optionally + sent mail to the administrator. + When verify_user() gets AUTH_FATAL from an auth + function it does an exit(1). + +The functions in the struct are as follows: + + int init(struct passwd *pw, sudo_auth *auth) + Function to do any one-time initialization for the auth + method. All of the "init" functions are run before anything + else. + + int setup(struct passwd *pw, char **prompt, sudo_auth *auth) + Function to do method-specific setup. All the "setup" + routines are run before any of the "verify" routines. A + pointer to the prompt string may be used to add method-specific + info to the prompt. + + int verify(struct passwd *pw, char *p, sudo_auth *auth, struct sudo_conv_callback *callback) + Function to do user verification for this auth method. For + standalone auth methods ``p'' is the prompt string. For + normal auth methods, ``p'' is the password the user entered. + The callback should be passed to auth_getpass() to allow sudoers + to unlock the ticket file when sudo is suspended. + Note that standalone auth methods are responsible for + rerading the password themselves. + + int approval(struct passwd *pw, struct sudo_auth *auth) + Function to perform account management and approval *after* + the user has authenticated successfully. This function may + check for expired accounts, perform time of day restrictions, etc. + For PAM, this calls pam_acct_mgmt(). For BSD auth, it calls + auth_approval(). + + int cleanup(struct passwd *pw, sudo_auth *auth) + Function to do per-auth method cleanup. This is only run + at the end of the authentication process, after the user + has completely failed or succeeded to authenticate. + The ``auth->status'' variable contains the result of the + last authentication attempt which may be interesting. + + int begin_session(struct passwd *pw, char **user_env[], struct sudo_auth *auth) + Function to begin a user session. This is used for session handling + in PAM and SIA. + + int end_session(struct passwd *pw, struct sudo_auth *auth) + Function to end a user session. This is used for session handling + in PAM and SIA. + +A note about standalone methods. Some authentication methods can't +coexist with any others. This may be because they encapsulate other +methods (pam, sia) or because they have a special way of interacting +with the user (securid). + +Adding a new authentication method: + +Each method should live in its own file. Add prototypes for the functions +in sudo_auth.h. + +Add the method to the ``auth_switch'' in sudo_auth.c. Note that +standalone methods must go first. If ``fooauth'' is a normal auth +method, its entry would look like: + +#ifdef HAVE_FOOAUTH +AUTH_ENTRY("foo", 0, foo_init, foo_setup, foo_verify, + foo_cleanup, foo_begin_session, foo_end_session) +#endif + +If this is a standalone method, it would be: + +#ifdef HAVE_FOOAUTH +AUTH_ENTRY("foo", FLAG_STANDALONE, foo_init, foo_setup, foo_verify, + foo_cleanup, foo_begin_session, foo_end_session) +#endif + +If the method needs to run as the user, not root, add FLAG_USER to +the second argument in the AUTH_ENTRY line. If you don't have an +init/setup/cleanup/begin/end routine, just use a NULL for that +field. diff --git a/utsudo-0.0.2/plugins/sudoers/auth/afs.c b/utsudo-0.0.2/plugins/sudoers/auth/afs.c new file mode 100644 index 0000000..52f17a1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/afs.c @@ -0,0 +1,85 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999, 2001-2005, 2007, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_AFS + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_afs_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + struct ktc_encryptionKey afs_key; + struct ktc_token afs_token; + debug_decl(sudo_afs_verify, SUDOERS_DEBUG_AUTH) + + /* Try to just check the password */ + ka_StringToKey(pass, NULL, &afs_key); + if (ka_GetAdminToken(pw->pw_name, /* name */ + NULL, /* instance */ + NULL, /* realm */ + &afs_key, /* key (contains password) */ + 0, /* lifetime */ + &afs_token, /* token */ + 0) == 0) /* new */ + debug_return_int(AUTH_SUCCESS); + + /* Fall back on old method XXX - needed? */ + setpag(); + if (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION+KA_USERAUTH_DOSETPAG, + pw->pw_name, /* name */ + NULL, /* instance */ + NULL, /* realm */ + pass, /* password */ + 0, /* lifetime */ + NULL, /* expiration ptr (unused) */ + 0, /* spare */ + NULL) == 0) /* reason */ + debug_return_int(AUTH_SUCCESS); + + debug_return_int(AUTH_FAILURE); +} + +#endif HAVE_AFS diff --git a/utsudo-0.0.2/plugins/sudoers/auth/aix_auth.c b/utsudo-0.0.2/plugins/sudoers/auth/aix_auth.c new file mode 100644 index 0000000..bb62612 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/aix_auth.c @@ -0,0 +1,314 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_AIXAUTH + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +/* + * For a description of the AIX authentication API, see + * http://publib16.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/basetrf1/authenticate.htm + */ + +#ifdef HAVE_PAM +# define AIX_AUTH_UNKNOWN 0 +# define AIX_AUTH_STD 1 +# define AIX_AUTH_PAM 2 + +static int +sudo_aix_authtype(void) +{ + size_t linesize = 0; + ssize_t len; + char *cp, *line = NULL; + bool in_stanza = false; + int authtype = AIX_AUTH_UNKNOWN; + FILE *fp; + debug_decl(sudo_aix_authtype, SUDOERS_DEBUG_AUTH) + + if ((fp = fopen("/etc/security/login.cfg", "r")) == NULL) + debug_return_int(AIX_AUTH_UNKNOWN); + + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + /* First remove comments. */ + if ((cp = strchr(line, '#')) != NULL) { + *cp = '\0'; + len = (ssize_t)(cp - line); + } + + /* Next remove trailing newlines and whitespace. */ + while (len > 0 && isspace((unsigned char)line[len - 1])) + line[--len] = '\0'; + + /* Skip blank lines. */ + if (len == 0) + continue; + + /* Match start of the usw stanza. */ + if (!in_stanza) { + if (strncmp(line, "usw:", 4) == 0) + in_stanza = true; + continue; + } + + /* Check for end of the usw stanza. */ + if (!isblank((unsigned char)line[0])) { + in_stanza = false; + break; + } + + /* Skip leading blanks. */ + cp = line; + do { + cp++; + } while (isblank((unsigned char)*cp)); + + /* Match "auth_type = (PAM_AUTH|STD_AUTH)". */ + if (strncmp(cp, "auth_type", 9) != 0) + continue; + cp += 9; + while (isblank((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + while (isblank((unsigned char)*cp)) + cp++; + if (strcmp(cp, "PAM_AUTH") == 0) { + authtype = AIX_AUTH_PAM; + break; + } + if (strcmp(cp, "STD_AUTH") == 0) { + authtype = AIX_AUTH_STD; + break; + } + } + free(line); + fclose(fp); + + debug_return_int(authtype); +} +#endif /* HAVE_PAM */ + +int +sudo_aix_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_aix_init, SUDOERS_DEBUG_AUTH) + +#ifdef HAVE_PAM + /* Check auth_type in /etc/security/login.cfg. */ + if (sudo_aix_authtype() == AIX_AUTH_PAM) { + if (sudo_pam_init_quiet(pw, auth) == AUTH_SUCCESS) { + /* Fail AIX authentication so we can use PAM instead. */ + debug_return_int(AUTH_FAILURE); + } + } +#endif + debug_return_int(AUTH_SUCCESS); +} + +/* Ignore AIX password incorrect message */ +static bool +sudo_aix_valid_message(const char *message) +{ + const char *cp; + const char badpass_msgid[] = "3004-300"; + debug_decl(sudo_aix_valid_message, SUDOERS_DEBUG_AUTH) + + if (message == NULL || message[0] == '\0') + debug_return_bool(false); + + /* Match "3004-300: You entered an invalid login name or password" */ + for (cp = message; *cp != '\0'; cp++) { + if (isdigit((unsigned char)*cp)) { + if (strncmp(cp, badpass_msgid, strlen(badpass_msgid)) == 0) + debug_return_bool(false); + break; + } + } + debug_return_bool(true); +} + +/* + * Change the user's password. If root changes the user's password + * the ADMCHG flag is set on the account (and the user must change + * it again) so we run passwd(1) as the user. This does mean that + * the user will need to re-enter their original password again, + * unlike with su(1). We may consider using pwdadm(1) as root to + * change the password and then clear the flag in the future. + */ +static bool +sudo_aix_change_password(const char *user) +{ + struct sigaction sa, savechld; + pid_t child, pid; + bool ret = false; + sigset_t mask; + int status; + debug_decl(sudo_aix_change_password, SUDOERS_DEBUG_AUTH) + + /* Set SIGCHLD handler to default since we call waitpid() below. */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGCHLD, &sa, &savechld); + + switch (child = sudo_debug_fork()) { + case -1: + /* error */ + sudo_warn(U_("unable to fork")); + break; + case 0: + /* child, run passwd(1) */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, NULL); + set_perms(PERM_USER); + execl("/usr/bin/passwd", "passwd", user, (char *)NULL); + sudo_warn("passwd"); + _exit(127); + /* NOTREACHED */ + default: + /* parent */ + break; + } + + /* Wait for passwd(1) to complete. */ + do { + pid = waitpid(child, &status, 0); + } while (pid == -1 && errno == EINTR); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "child (%d) exit value %d", (int)child, status); + if (pid != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0) + ret = true; + + /* Restore saved SIGCHLD handler. */ + (void) sigaction(SIGCHLD, &savechld, NULL); + + debug_return_bool(ret); +} + +int +sudo_aix_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass, *message = NULL; + int result = 1, reenter = 0; + int ret = AUTH_SUCCESS; + debug_decl(sudo_aix_verify, SUDOERS_DEBUG_AUTH) + + do { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + break; + free(message); + message = NULL; + result = authenticate(pw->pw_name, pass, &reenter, &message); + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + free(pass); + prompt = message; + } while (reenter); + + if (result != 0) { + /* Display error message, if any. */ + if (sudo_aix_valid_message(message)) + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s", message); + ret = pass ? AUTH_FAILURE : AUTH_INTR; + } + free(message); + message = NULL; + + /* Check if password expired and allow user to change it if possible. */ + if (ret == AUTH_SUCCESS) { + result = passwdexpired(pw->pw_name, &message); + if (message != NULL && message[0] != '\0') { + int msg_type = SUDO_CONV_PREFER_TTY; + msg_type |= result ? SUDO_CONV_ERROR_MSG : SUDO_CONV_INFO_MSG, + sudo_printf(msg_type, "%s", message); + free(message); + message = NULL; + } + switch (result) { + case 0: + /* password not expired. */ + break; + case 1: + /* password expired, user must change it */ + if (!sudo_aix_change_password(pw->pw_name)) { + sudo_warnx(U_("unable to change password for %s"), pw->pw_name); + ret = AUTH_FATAL; + } + break; + case 2: + /* password expired, only admin can change it */ + ret = AUTH_FATAL; + break; + default: + /* error (-1) */ + sudo_warn("passwdexpired"); + ret = AUTH_FATAL; + break; + } + } + + debug_return_int(ret); +} + +int +sudo_aix_cleanup(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_aix_cleanup, SUDOERS_DEBUG_AUTH) + + /* Unset AUTHSTATE as it may not be correct for the runas user. */ + if (sudo_unsetenv("AUTHSTATE") == -1) + debug_return_int(AUTH_FAILURE); + + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_AIXAUTH */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/bsdauth.c b/utsudo-0.0.2/plugins/sudoers/auth/bsdauth.c new file mode 100644 index 0000000..f976623 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/bsdauth.c @@ -0,0 +1,207 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2000-2005, 2007-2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_BSD_AUTH_H + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +# ifndef LOGIN_DEFROOTCLASS +# define LOGIN_DEFROOTCLASS "daemon" +# endif + +struct bsdauth_state { + auth_session_t *as; + login_cap_t *lc; +}; + +int +bsdauth_init(struct passwd *pw, sudo_auth *auth) +{ + static struct bsdauth_state state; + debug_decl(bsdauth_init, SUDOERS_DEBUG_AUTH) + + /* Get login class based on auth user, which may not be invoking user. */ + if (pw->pw_class && *pw->pw_class) + state.lc = login_getclass(pw->pw_class); + else + state.lc = login_getclass(pw->pw_uid ? LOGIN_DEFCLASS : LOGIN_DEFROOTCLASS); + if (state.lc == NULL) { + log_warning(0, + N_("unable to get login class for user %s"), pw->pw_name); + debug_return_int(AUTH_FATAL); + } + + if ((state.as = auth_open()) == NULL) { + log_warning(0, N_("unable to begin bsd authentication")); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + /* XXX - maybe sanity check the auth style earlier? */ + login_style = login_getstyle(state.lc, login_style, "auth-sudo"); + if (login_style == NULL) { + log_warningx(0, N_("invalid authentication type")); + auth_close(state.as); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + if (auth_setitem(state.as, AUTHV_STYLE, login_style) < 0 || + auth_setitem(state.as, AUTHV_NAME, pw->pw_name) < 0 || + auth_setitem(state.as, AUTHV_CLASS, login_class) < 0) { + log_warningx(0, N_("unable to initialize BSD authentication")); + auth_close(state.as); + login_close(state.lc); + debug_return_int(AUTH_FATAL); + } + + auth->data = (void *) &state; + debug_return_int(AUTH_SUCCESS); +} + +int +bsdauth_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass; + char *s; + size_t len; + int authok = 0; + struct sigaction sa, osa; + auth_session_t *as = ((struct bsdauth_state *) auth->data)->as; + debug_decl(bsdauth_verify, SUDOERS_DEBUG_AUTH) + + /* save old signal handler */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGCHLD, &sa, &osa); + + /* + * If there is a challenge then print that instead of the normal + * prompt. If the user just hits return we prompt again with echo + * turned on, which is useful for challenge/response things like + * S/Key. + */ + if ((s = auth_challenge(as)) == NULL) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else { + pass = auth_getpass(s, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass && *pass == '\0') { + if ((prompt = strrchr(s, '\n'))) + prompt++; + else + prompt = s; + + /* + * Append '[echo on]' to the last line of the challenge and + * reprompt with echo turned on. + */ + len = strlen(prompt) - 1; + while (isspace(prompt[len]) || prompt[len] == ':') + prompt[len--] = '\0'; + if (asprintf(&s, "%s [echo on]: ", prompt) == -1) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + free(pass); + pass = auth_getpass(s, SUDO_CONV_PROMPT_ECHO_ON, callback); + free(s); + } + } + + if (pass) { + authok = auth_userresponse(as, pass, 1); + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + free(pass); + } + + /* restore old signal handler */ + (void) sigaction(SIGCHLD, &osa, NULL); + + if (authok) + debug_return_int(AUTH_SUCCESS); + + if (!pass) + debug_return_int(AUTH_INTR); + + if ((s = auth_getvalue(as, "errormsg")) != NULL) + log_warningx(0, "%s", s); + debug_return_int(AUTH_FAILURE); +} + +int +bsdauth_approval(struct passwd *pw, sudo_auth *auth, bool exempt) +{ + struct bsdauth_state *state = auth->data; + debug_decl(bsdauth_approval, SUDOERS_DEBUG_AUTH) + + if (auth_approval(state->as, state->lc, pw->pw_name, "auth-sudo") == 0) { + if (auth_getstate(state->as) & AUTH_EXPIRED) + log_warningx(0, "%s", N_("your account has expired")); + else + log_warningx(0, "%s", N_("approval failed")); + debug_return_int(AUTH_FAILURE); + } + debug_return_int(AUTH_SUCCESS); +} + +int +bsdauth_cleanup(struct passwd *pw, sudo_auth *auth) +{ + struct bsdauth_state *state = auth->data; + debug_decl(bsdauth_cleanup, SUDOERS_DEBUG_AUTH) + + if (state != NULL) { + auth_close(state->as); + login_close(state->lc); + } + + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_BSD_AUTH_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/dce.c b/utsudo-0.0.2/plugins/sudoers/auth/dce.c new file mode 100644 index 0000000..27bd059 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/dce.c @@ -0,0 +1,199 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ +/* + * The code below basically comes from the examples supplied on + * the OSF DCE 1.0.3 manpages for the sec_login routines, with + * enough additional polishing to make the routine work with the + * rest of sudo. + * + * This code is known to work on HP 700 and 800 series systems + * running HP-UX 9.X and 10.X, with either HP's version 1.2.1 of DCE. + * (aka, OSF DCE 1.0.3) or with HP's version 1.4 of DCE (aka, OSF + * DCE 1.1). + */ + +#include + +#ifdef HAVE_DCE + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include + +#include +#include +#include /* required to call dce_error_inq_text routine */ + +#include "sudoers.h" +#include "sudo_auth.h" + +static int check_dce_status(error_status_t, char *); + +int +sudo_dce_verify(struct passwd *pw, char *plain_pw, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + struct passwd temp_pw; + sec_passwd_rec_t password_rec; + sec_login_handle_t login_context; + boolean32 reset_passwd; + sec_login_auth_src_t auth_src; + error_status_t status; + debug_decl(sudo_dce_verify, SUDOERS_DEBUG_AUTH) + + /* + * Create the local context of the DCE principal necessary + * to perform authenticated network operations. The network + * identity set up by this operation cannot be used until it + * is validated via sec_login_validate_identity(). + */ + if (sec_login_setup_identity((unsigned_char_p_t) pw->pw_name, + sec_login_no_flags, &login_context, &status)) { + + if (check_dce_status(status, "sec_login_setup_identity(1):")) + debug_return_int(AUTH_FAILURE); + + password_rec.key.key_type = sec_passwd_plain; + password_rec.key.tagged_union.plain = (idl_char *) plain_pw; + password_rec.pepper = NULL; + password_rec.version_number = sec_passwd_c_version_none; + + /* Validate the login context with the password */ + if (sec_login_validate_identity(login_context, &password_rec, + &reset_passwd, &auth_src, &status)) { + + if (check_dce_status(status, "sec_login_validate_identity(1):")) + debug_return_int(AUTH_FAILURE); + + /* + * Certify that the DCE Security Server used to set + * up and validate a login context is legitimate. Makes + * sure that we didn't get spoofed by another DCE server. + */ + if (!sec_login_certify_identity(login_context, &status)) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Whoa! Bogus authentication server!\n"); + (void) check_dce_status(status,"sec_login_certify_identity(1):"); + debug_return_int(AUTH_FAILURE); + } + if (check_dce_status(status, "sec_login_certify_identity(2):")) + debug_return_int(AUTH_FAILURE); + + /* + * Sets the network credentials to those specified + * by the now validated login context. + */ + sec_login_set_context(login_context, &status); + if (check_dce_status(status, "sec_login_set_context:")) + debug_return_int(AUTH_FAILURE); + + /* + * Oops, your credentials were no good. Possibly + * caused by clock times out of adjustment between + * DCE client and DCE security server... + */ + if (auth_src != sec_login_auth_src_network) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "You have no network credentials.\n"); + debug_return_int(AUTH_FAILURE); + } + /* Check if the password has aged and is thus no good */ + if (reset_passwd) { + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Your DCE password needs resetting.\n"); + debug_return_int(AUTH_FAILURE); + } + + /* + * We should be a valid user by this point. Pull the + * user's password structure from the DCE security + * server just to make sure. If we get it with no + * problems, then we really are legitimate... + */ + sec_login_get_pwent(login_context, (sec_login_passwd_t) &temp_pw, + &status); + if (check_dce_status(status, "sec_login_get_pwent:")) + debug_return_int(AUTH_FAILURE); + + /* + * If we get to here, then the pwent above properly fetched + * the password structure from the DCE registry, so the user + * must be valid. We don't really care what the user's + * registry password is, just that the user could be + * validated. In fact, if we tried to compare the local + * password to the DCE entry at this point, the operation + * would fail if the hidden password feature is turned on, + * because the password field would contain an asterisk. + * Also go ahead and destroy the user's DCE login context + * before we leave here (and don't bother checking the + * status), in order to clean up credentials files in + * /opt/dcelocal/var/security/creds. By doing this, we are + * assuming that the user will not need DCE authentication + * later in the program, only local authentication. If this + * is not true, then the login_context will have to be + * returned to the calling program, and the context purged + * somewhere later in the program. + */ + sec_login_purge_context(&login_context, &status); + debug_return_int(AUTH_SUCCESS); + } else { + if(check_dce_status(status, "sec_login_validate_identity(2):")) + debug_return_int(AUTH_FAILURE); + sec_login_purge_context(&login_context, &status); + if(check_dce_status(status, "sec_login_purge_context:")) + debug_return_int(AUTH_FAILURE); + } + } + (void) check_dce_status(status, "sec_login_setup_identity(2):"); + debug_return_int(AUTH_FAILURE); +} + +/* Returns 0 for DCE "ok" status, 1 otherwise */ +static int +check_dce_status(error_status_t input_status, char *comment) +{ + int error_stat; + unsigned char error_string[dce_c_error_string_len]; + debug_decl(check_dce_status, SUDOERS_DEBUG_AUTH) + + if (input_status == rpc_s_ok) + debug_return_int(0); + dce_error_inq_text(input_status, error_string, &error_stat); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s %s\n", comment, error_string); + debug_return_int(1); +} + +#endif /* HAVE_DCE */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/fwtk.c b/utsudo-0.0.2/plugins/sudoers/auth/fwtk.c new file mode 100644 index 0000000..c1784b3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/fwtk.c @@ -0,0 +1,156 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_FWTK + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include + +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_fwtk_init(struct passwd *pw, sudo_auth *auth) +{ + static Cfg *confp; /* Configuration entry struct */ + char resp[128]; /* Response from the server */ + debug_decl(sudo_fwtk_init, SUDOERS_DEBUG_AUTH) + + if ((confp = cfg_read("sudo")) == (Cfg *)-1) { + sudo_warnx(U_("unable to read fwtk config")); + debug_return_int(AUTH_FATAL); + } + + if (auth_open(confp)) { + sudo_warnx(U_("unable to connect to authentication server")); + debug_return_int(AUTH_FATAL); + } + + /* Get welcome message from auth server */ + if (auth_recv(resp, sizeof(resp))) { + sudo_warnx(U_("lost connection to authentication server")); + debug_return_int(AUTH_FATAL); + } + if (strncmp(resp, "Authsrv ready", 13) != 0) { + sudo_warnx(U_("authentication server error:\n%s"), resp); + debug_return_int(AUTH_FATAL); + } + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_fwtk_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pass; /* Password from the user */ + char buf[SUDO_CONV_REPL_MAX + 12]; /* General prupose buffer */ + char resp[128]; /* Response from the server */ + int error; + debug_decl(sudo_fwtk_verify, SUDOERS_DEBUG_AUTH) + + /* Send username to authentication server. */ + (void) snprintf(buf, sizeof(buf), "authorize %s 'sudo'", pw->pw_name); +restart: + if (auth_send(buf) || auth_recv(resp, sizeof(resp))) { + sudo_warnx(U_("lost connection to authentication server")); + debug_return_int(AUTH_FATAL); + } + + /* Get the password/response from the user. */ + if (strncmp(resp, "challenge ", 10) == 0) { + (void) snprintf(buf, sizeof(buf), "%s\nResponse: ", &resp[10]); + pass = auth_getpass(buf, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass && *pass == '\0') { + free(pass); + pass = auth_getpass("Response [echo on]: ", + SUDO_CONV_PROMPT_ECHO_ON, callback); + } + } else if (strncmp(resp, "chalnecho ", 10) == 0) { + pass = auth_getpass(&resp[10], SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else if (strncmp(resp, "password", 8) == 0) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + } else if (strncmp(resp, "display ", 8) == 0) { + sudo_printf(SUDO_CONV_INFO_MSG|SUDO_CONV_PREFER_TTY, "%s\n", &resp[8]); + strlcpy(buf, "response dummy", sizeof(buf)); + goto restart; + } else { + sudo_warnx("%s", resp); + debug_return_int(AUTH_FATAL); + } + if (!pass) { /* ^C or error */ + debug_return_int(AUTH_INTR); + } + + /* Send the user's response to the server */ + (void) snprintf(buf, sizeof(buf), "response '%s'", pass); + if (auth_send(buf) || auth_recv(resp, sizeof(resp))) { + sudo_warnx(U_("lost connection to authentication server")); + error = AUTH_FATAL; + goto done; + } + + if (strncmp(resp, "ok", 2) == 0) { + error = AUTH_SUCCESS; + goto done; + } + + /* Main loop prints "Permission Denied" or insult. */ + if (strcmp(resp, "Permission Denied.") != 0) + sudo_warnx("%s", resp); + error = AUTH_FAILURE; +done: + memset_s(buf, sizeof(buf), 0, sizeof(buf)); + memset_s(pass, SUDO_PASS_MAX, 0, strlen(pass)); + free(pass); + debug_return_int(error); +} + +int +sudo_fwtk_cleanup(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_fwtk_cleanup, SUDOERS_DEBUG_AUTH) + + auth_close(); + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_FWTK */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/kerb5.c b/utsudo-0.0.2/plugins/sudoers/auth/kerb5.c new file mode 100644 index 0000000..b298d5a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/kerb5.c @@ -0,0 +1,337 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_KERB5 + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRING_H */ +#include +#include +#include +#ifdef HAVE_HEIMDAL +#include +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +#ifdef HAVE_HEIMDAL +# define extract_name(c, p) krb5_principal_get_comp_string(c, p, 1) +# define krb5_free_data_contents(c, d) krb5_data_free(d) +#else +# define extract_name(c, p) (krb5_princ_component(c, p, 1)->data) +#endif + +#ifndef HAVE_KRB5_VERIFY_USER +static int verify_krb_v5_tgt(krb5_context, krb5_creds *, char *); +#endif +static struct _sudo_krb5_data { + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; +} sudo_krb5_data = { NULL, NULL, NULL }; +typedef struct _sudo_krb5_data *sudo_krb5_datap; + +#ifdef SUDO_KRB5_INSTANCE +static const char *sudo_krb5_instance = SUDO_KRB5_INSTANCE; +#else +static const char *sudo_krb5_instance = NULL; +#endif + +#ifndef HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC +static krb5_error_code +krb5_get_init_creds_opt_alloc(krb5_context context, + krb5_get_init_creds_opt **opts) +{ + *opts = malloc(sizeof(krb5_get_init_creds_opt)); + if (*opts == NULL) + return KRB5_CC_NOMEM; + krb5_get_init_creds_opt_init(*opts); + return 0; +} + +static void +krb5_get_init_creds_opt_free(krb5_get_init_creds_opt *opts) +{ + free(opts); +} +#endif + +int +sudo_krb5_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + static char *krb5_prompt; + debug_decl(sudo_krb5_init, SUDOERS_DEBUG_AUTH) + + if (krb5_prompt == NULL) { + krb5_context sudo_context; + krb5_principal princ; + char *pname; + krb5_error_code error; + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + + /* + * Really, we need to tell the caller not to prompt for password. The + * API does not currently provide this unless the auth is standalone. + */ + if ((error = krb5_unparse_name(sudo_context, princ, &pname))) { + log_warningx(0, + N_("%s: unable to convert principal to string ('%s'): %s"), + auth->name, pw->pw_name, error_message(error)); + debug_return_int(AUTH_FAILURE); + } + + /* Only rewrite prompt if user didn't specify their own. */ + /*if (!strcmp(prompt, PASSPROMPT)) { */ + if (asprintf(&krb5_prompt, "Password for %s: ", pname) == -1) { + log_warningx(0, N_("unable to allocate memory")); + free(pname); + debug_return_int(AUTH_FATAL); + } + /*}*/ + free(pname); + } + *promptp = krb5_prompt; + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_krb5_init(struct passwd *pw, sudo_auth *auth) +{ + krb5_context sudo_context; + krb5_error_code error; + char cache_name[64], *pname = pw->pw_name; + debug_decl(sudo_krb5_init, SUDOERS_DEBUG_AUTH) + + auth->data = (void *) &sudo_krb5_data; /* Stash all our data here */ + + if (sudo_krb5_instance != NULL) { + int len = asprintf(&pname, "%s%s%s", pw->pw_name, + sudo_krb5_instance[0] != '/' ? "/" : "", sudo_krb5_instance); + if (len == -1) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + } + +#ifdef HAVE_KRB5_INIT_SECURE_CONTEXT + error = krb5_init_secure_context(&(sudo_krb5_data.sudo_context)); +#else + error = krb5_init_context(&(sudo_krb5_data.sudo_context)); +#endif + if (error) + goto done; + sudo_context = sudo_krb5_data.sudo_context; + + error = krb5_parse_name(sudo_context, pname, &(sudo_krb5_data.princ)); + if (error) { + log_warningx(0, N_("%s: unable to parse '%s': %s"), auth->name, pname, + error_message(error)); + goto done; + } + + (void) snprintf(cache_name, sizeof(cache_name), "MEMORY:sudocc_%ld", + (long) getpid()); + if ((error = krb5_cc_resolve(sudo_context, cache_name, + &(sudo_krb5_data.ccache)))) { + log_warningx(0, N_("%s: unable to resolve credential cache: %s"), + auth->name, error_message(error)); + goto done; + } + +done: + if (sudo_krb5_instance != NULL) + free(pname); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} + +#ifdef HAVE_KRB5_VERIFY_USER +int +sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; + krb5_error_code error; + debug_decl(sudo_krb5_verify, SUDOERS_DEBUG_AUTH) + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + error = krb5_verify_user(sudo_context, princ, ccache, pass, 1, NULL); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} +#else +int +sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_creds credbuf, *creds = NULL; + krb5_ccache ccache; + krb5_error_code error; + krb5_get_init_creds_opt *opts = NULL; + debug_decl(sudo_krb5_verify, SUDOERS_DEBUG_AUTH) + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + /* Set default flags based on the local config file. */ + error = krb5_get_init_creds_opt_alloc(sudo_context, &opts); + if (error) { + log_warningx(0, N_("%s: unable to allocate options: %s"), auth->name, + error_message(error)); + goto done; + } +#ifdef HAVE_HEIMDAL + krb5_get_init_creds_opt_set_default_flags(sudo_context, NULL, + krb5_principal_get_realm(sudo_context, princ), opts); +#endif + + /* Note that we always obtain a new TGT to verify the user */ + if ((error = krb5_get_init_creds_password(sudo_context, &credbuf, princ, + pass, krb5_prompter_posix, + NULL, 0, NULL, opts))) { + /* Don't print error if just a bad password */ + if (error != KRB5KRB_AP_ERR_BAD_INTEGRITY) { + log_warningx(0, N_("%s: unable to get credentials: %s"), + auth->name, error_message(error)); + } + goto done; + } + creds = &credbuf; + + /* Verify the TGT to prevent spoof attacks. */ + if ((error = verify_krb_v5_tgt(sudo_context, creds, auth->name))) + goto done; + + /* Store credential in cache. */ + if ((error = krb5_cc_initialize(sudo_context, ccache, princ))) { + log_warningx(0, N_("%s: unable to initialize credential cache: %s"), + auth->name, error_message(error)); + } else if ((error = krb5_cc_store_cred(sudo_context, ccache, creds))) { + log_warningx(0, N_("%s: unable to store credential in cache: %s"), + auth->name, error_message(error)); + } + +done: + if (opts) { +#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_FREE_TWO_ARGS + krb5_get_init_creds_opt_free(sudo_context, opts); +#else + krb5_get_init_creds_opt_free(opts); +#endif + } + if (creds) + krb5_free_cred_contents(sudo_context, creds); + debug_return_int(error ? AUTH_FAILURE : AUTH_SUCCESS); +} +#endif + +int +sudo_krb5_cleanup(struct passwd *pw, sudo_auth *auth) +{ + krb5_context sudo_context; + krb5_principal princ; + krb5_ccache ccache; + debug_decl(sudo_krb5_cleanup, SUDOERS_DEBUG_AUTH) + + sudo_context = ((sudo_krb5_datap) auth->data)->sudo_context; + princ = ((sudo_krb5_datap) auth->data)->princ; + ccache = ((sudo_krb5_datap) auth->data)->ccache; + + if (sudo_context) { + if (ccache) + krb5_cc_destroy(sudo_context, ccache); + if (princ) + krb5_free_principal(sudo_context, princ); + krb5_free_context(sudo_context); + } + + debug_return_int(AUTH_SUCCESS); +} + +#ifndef HAVE_KRB5_VERIFY_USER +/* + * Verify the Kerberos ticket-granting ticket just retrieved for the + * user. If the Kerberos server doesn't respond, assume the user is + * trying to fake us out (since we DID just get a TGT from what is + * supposedly our KDC). + * + * Returns 0 for successful authentication, non-zero for failure. + */ +static int +verify_krb_v5_tgt(krb5_context sudo_context, krb5_creds *cred, char *auth_name) +{ + krb5_error_code error; + krb5_principal server; + krb5_verify_init_creds_opt vopt; + debug_decl(verify_krb_v5_tgt, SUDOERS_DEBUG_AUTH) + + /* + * Get the server principal for the local host. + * (Use defaults of "host" and canonicalized local name.) + */ + if ((error = krb5_sname_to_principal(sudo_context, NULL, NULL, + KRB5_NT_SRV_HST, &server))) { + log_warningx(0, N_("%s: unable to get host principal: %s"), auth_name, + error_message(error)); + debug_return_int(-1); + } + + /* Initialize verify opts and set secure mode */ + krb5_verify_init_creds_opt_init(&vopt); + krb5_verify_init_creds_opt_set_ap_req_nofail(&vopt, 1); + + /* verify the Kerberos ticket-granting ticket we just retrieved */ + error = krb5_verify_init_creds(sudo_context, cred, server, NULL, + NULL, &vopt); + krb5_free_principal(sudo_context, server); + if (error) { + log_warningx(0, N_("%s: Cannot verify TGT! Possible attack!: %s"), + auth_name, error_message(error)); + } + debug_return_int(error); +} +#endif + +#endif /* HAVE_KERB5 */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/pam.c b/utsudo-0.0.2/plugins/sudoers/auth/pam.c new file mode 100644 index 0000000..803ecdf --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/pam.c @@ -0,0 +1,767 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_PAM + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#ifdef HAVE_PAM_PAM_APPL_H +# include +#else +# include +#endif + +#ifdef __hpux__ +# include +#endif + +#ifdef HAVE_LIBINTL_H +# if defined(__LINUX_PAM__) +# define PAM_TEXT_DOMAIN "Linux-PAM" +# elif defined(__sun__) +# define PAM_TEXT_DOMAIN "SUNW_OST_SYSOSPAM" +# endif +#endif + +/* We don't want to translate the strings in the calls to dgt(). */ +#ifdef PAM_TEXT_DOMAIN +# define dgt(d, t) dgettext(d, t) +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +/* Only OpenPAM and Linux PAM use const qualifiers. */ +#ifdef PAM_SUN_CODEBASE +# define PAM_CONST +#else +# define PAM_CONST const +#endif + +/* Ambiguity in spec: is it an array of pointers or a pointer to an array? */ +#ifdef PAM_SUN_CODEBASE +# define PAM_MSG_GET(msg, n) (*(msg) + (n)) +#else +# define PAM_MSG_GET(msg, n) ((msg)[(n)]) +#endif + +#ifndef PAM_DATA_SILENT +#define PAM_DATA_SILENT 0 +#endif + +struct conv_filter { + char *msg; + size_t msglen; +}; + +static int converse(int, PAM_CONST struct pam_message **, + struct pam_response **, void *); +static struct sudo_conv_callback *conv_callback; +static struct pam_conv pam_conv = { converse, &conv_callback }; +static char *def_prompt = PASSPROMPT; +static bool getpass_error; +static pam_handle_t *pamh; +static struct conv_filter *conv_filter; + +static void +conv_filter_init(void) +{ + debug_decl(conv_filter_init, SUDOERS_DEBUG_AUTH) + +#ifdef __hpux__ + /* + * HP-UX displays last login information as part of either account + * management (in trusted mode) or session management (regular mode). + * Filter those out in the conversation function unless running a shell. + */ + if (!ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) { + int i, nfilt = 0, maxfilters = 0; + struct conv_filter *newfilt; + nl_catd catd; + char *msg; + + /* + * Messages from PAM account management when trusted mode is enabled: + * 1 Last successful login for %s: %s + * 2 Last successful login for %s: %s on %s + * 3 Last unsuccessful login for %s: %s + * 4 Last unsuccessful login for %s: %s on %s + */ + if ((catd = catopen("pam_comsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 4; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 1; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + /* + * Messages from PAM session management when trusted mode is disabled: + * 3 Last successful login: %s %s %s %s + * 4 Last authentication failure: %s %s %s %s + */ + if ((catd = catopen("pam_hpsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 2; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 3; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + if (conv_filter != NULL) { + conv_filter[nfilt].msg = NULL; + conv_filter[nfilt].msglen = 0; + } + } +#endif /* __hpux__ */ + debug_return; +} + +/* + * Like pam_strerror() but never returns NULL and uses strerror(errno) + * for PAM_SYSTEM_ERR. + */ +static const char * +sudo_pam_strerror(pam_handle_t *handle, int errnum) +{ + const char *errstr; + static char errbuf[32]; + + if (errnum == PAM_SYSTEM_ERR) + return strerror(errno); + if ((errstr = pam_strerror(handle, errnum)) == NULL) + (void)snprintf(errbuf, sizeof(errbuf), "PAM error %d", errnum); + return errstr; +} + +static int +sudo_pam_init2(struct passwd *pw, sudo_auth *auth, bool quiet) +{ + static int pam_status = PAM_SUCCESS; + const char *tty = user_ttypath; + const char *errstr, *pam_service; + int rc; + debug_decl(sudo_pam_init, SUDOERS_DEBUG_AUTH) + + /* Stash pointer to last pam status. */ + auth->data = &pam_status; + +#ifdef _AIX + if (pamh != NULL) { + /* Already initialized (may happen with AIX). */ + debug_return_int(AUTH_SUCCESS); + } +#endif /* _AIX */ + + /* Initial PAM. */ + pam_service = ISSET(sudo_mode, MODE_LOGIN_SHELL) ? + def_pam_login_service : def_pam_service; + pam_status = pam_start(pam_service, pw->pw_name, &pam_conv, &pamh); + if (pam_status != PAM_SUCCESS) { + errstr = sudo_pam_strerror(NULL, pam_status); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_start(%s, %s, %p, %p): %s", pam_service, pw->pw_name, + &pam_conv, &pamh, errstr); + if (!quiet) + log_warningx(0, N_("unable to initialize PAM: %s"), errstr); + debug_return_int(AUTH_FATAL); + } + + /* Initialize conversation function message filter. */ + conv_filter_init(); + + /* + * Set PAM_RUSER to the invoking user (the "from" user). + * We set PAM_RHOST to avoid a bug in Solaris 7 and below. + */ + rc = pam_set_item(pamh, PAM_RUSER, user_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RUSER, %s): %s", user_name, errstr); + } +#ifdef __sun__ + rc = pam_set_item(pamh, PAM_RHOST, user_host); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RHOST, %s): %s", user_host, errstr); + } +#endif + +#if defined(__LINUX_PAM__) || defined(__sun__) + /* + * Some PAM modules assume PAM_TTY is set and will misbehave (or crash) + * if it is not. Known offenders include pam_lastlog and pam_time. + */ + if (tty == NULL) + tty = ""; +#endif + if (tty != NULL) { + rc = pam_set_item(pamh, PAM_TTY, tty); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_TTY, %s): %s", tty, errstr); + } + } + + /* + * If PAM session and setcred support is disabled we don't + * need to keep a sudo process around to close the session. + */ + if (!def_pam_session && !def_pam_setcred) + auth->end_session = NULL; + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_pam_init(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, false); +} + +#ifdef _AIX +int +sudo_pam_init_quiet(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, true); +} +#endif /* _AIX */ + +int +sudo_pam_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + const char *envccname; + const char *s; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_verify, SUDOERS_DEBUG_AUTH) + + def_prompt = prompt; /* for converse */ + getpass_error = false; /* set by converse if user presses ^C */ + conv_callback = callback; /* passed to conversation function */ + + /* Set KRB5CCNAME from the user environment if not set to propagate this + * information to PAM modules that may use it to authentication. */ + envccname = sudo_getenv("KRB5CCNAME"); + if (envccname == NULL && user_ccname != NULL) { + if (sudo_setenv("KRB5CCNAME", user_ccname, true) != 0) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to set KRB5CCNAME"); + debug_return_int(AUTH_FAILURE); + } + } + + /* PAM_SILENT prevents the authentication service from generating output. */ + *pam_status = pam_authenticate(pamh, PAM_SILENT); + + /* Restore KRB5CCNAME to its original value. */ + if (envccname == NULL && sudo_unsetenv("KRB5CCNAME") != 0) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to restore KRB5CCNAME"); + debug_return_int(AUTH_FAILURE); + } + + if (getpass_error) { + /* error or ^C from tgetpass() */ + debug_return_int(AUTH_INTR); + } + switch (*pam_status) { + case PAM_SUCCESS: + debug_return_int(AUTH_SUCCESS); + case PAM_AUTH_ERR: + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "pam_authenticate: %d", *pam_status); + debug_return_int(AUTH_FAILURE); + default: + s = sudo_pam_strerror(pamh, *pam_status); + log_warningx(0, N_("PAM authentication error: %s"), s); + debug_return_int(AUTH_FATAL); + } +} + +int +sudo_pam_approval(struct passwd *pw, sudo_auth *auth, bool exempt) +{ + const char *s; + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_approval, SUDOERS_DEBUG_AUTH) + + if (def_pam_acct_mgmt) { + rc = pam_acct_mgmt(pamh, PAM_SILENT); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_AUTH_ERR: + log_warningx(0, N_("account validation failure, " + "is your account locked?")); + status = AUTH_FATAL; + break; + case PAM_NEW_AUTHTOK_REQD: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* New password required, try to change it. */ + log_warningx(0, N_("Account or password is " + "expired, reset your password and try again")); + rc = pam_chauthtok(pamh, PAM_CHANGE_EXPIRED_AUTHTOK); + if (rc == PAM_SUCCESS) + break; + s = pam_strerror(pamh, rc); + log_warningx(0, N_("unable to change expired password: %s"), s); + status = AUTH_FAILURE; + break; + case PAM_AUTHTOK_EXPIRED: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* Password expired, cannot be updated by user. */ + log_warningx(0, + N_("Password expired, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_ACCT_EXPIRED: + log_warningx(0, + N_("Account expired or PAM config lacks an \"account\" " + "section for sudo, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FAILURE; + break; + default: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FATAL; + break; + } + *pam_status = rc; + } + debug_return_int(status); +} + +int +sudo_pam_cleanup(struct passwd *pw, sudo_auth *auth) +{ + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_cleanup, SUDOERS_DEBUG_AUTH) + + /* If successful, we can't close the session until sudo_pam_end_session() */ + if (*pam_status != PAM_SUCCESS || auth->end_session == NULL) { + *pam_status = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + pamh = NULL; + } + debug_return_int(*pam_status == PAM_SUCCESS ? AUTH_SUCCESS : AUTH_FAILURE); +} + +int +sudo_pam_begin_session(struct passwd *pw, char **user_envp[], sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + const char *errstr; + debug_decl(sudo_pam_begin_session, SUDOERS_DEBUG_AUTH) + + /* + * If there is no valid user we cannot open a PAM session. + * This is not an error as sudo can run commands with arbitrary + * uids, it just means we are done from a session management standpoint. + */ + if (pw == NULL) { + if (pamh != NULL) { + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + } + goto done; + } + + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + + /* + * Reinitialize credentials when changing the user. + * We don't worry about a failure from pam_setcred() since with + * stacked PAM auth modules a failure from one module may override + * PAM_SUCCESS from another. For example, given a non-local user, + * pam_unix will fail but pam_ldap or pam_sss may succeed, but if + * pam_unix is first in the stack, pam_setcred() will fail. + */ + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_REINITIALIZE_CRED); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + } + } + + if (def_pam_session) { + /* + * We use PAM_SILENT to prevent pam_lastlog from printing last login + * information except when explicitly running a shell. + */ + const bool silent = !ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL); + rc = pam_open_session(pamh, silent ? PAM_SILENT : 0); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_SESSION_ERR: + /* Treat PAM_SESSION_ERR as a non-fatal error. */ + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_open_session: %s", errstr); + /* Avoid closing session that was not opened. */ + def_pam_session = false; + break; + default: + /* Unexpected session failure, treat as fatal error. */ + *pam_status = rc; + errstr = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("%s: %s"), "pam_open_session", errstr); + rc = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + status = AUTH_FATAL; + goto done; + } + } + +#ifdef HAVE_PAM_GETENVLIST + /* + * Update environment based on what is stored in pamh. + * If no authentication is done we will only have environment + * variables if pam_env is called via session. + */ + if (user_envp != NULL) { + char **pam_envp = pam_getenvlist(pamh); + if (pam_envp != NULL) { + /* Merge pam env with user env. */ + if (!env_init(*user_envp) || !env_merge(pam_envp)) + status = AUTH_FATAL; + *user_envp = env_get(); + (void)env_init(NULL); + free(pam_envp); + /* XXX - we leak any duplicates that were in pam_envp */ + } + } +#endif /* HAVE_PAM_GETENVLIST */ + +done: + debug_return_int(status); +} + +int +sudo_pam_end_session(struct passwd *pw, sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + const char *errstr; + debug_decl(sudo_pam_end_session, SUDOERS_DEBUG_AUTH) + + if (pamh != NULL) { + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + * XXX - still needed now that session init is in parent? + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + if (def_pam_session) { + rc = pam_close_session(pamh, PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_close_session: %s", errstr); + } + } + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + } + } + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + status = AUTH_FATAL; + } + pamh = NULL; + } + + debug_return_int(status); +} + +#define PROMPT_IS_PASSWORD(_p) \ + (strncmp((_p), "Password:", 9) == 0 && \ + ((_p)[9] == '\0' || ((_p)[9] == ' ' && (_p)[10] == '\0'))) + +#ifdef PAM_TEXT_DOMAIN +# define PAM_PROMPT_IS_PASSWORD(_p) \ + (strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password:")) == 0 || \ + strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password: ")) == 0 || \ + PROMPT_IS_PASSWORD(_p)) +#else +# define PAM_PROMPT_IS_PASSWORD(_p) PROMPT_IS_PASSWORD(_p) +#endif /* PAM_TEXT_DOMAIN */ + +/* + * We use the PAM prompt in preference to sudo's as long + * as passprompt_override is not set and: + * a) the (translated) sudo prompt matches /^Password: ?/ + * or: + * b) the PAM prompt itself *doesn't* match /^Password: ?/ + * or /^username's Password: ?/ + * + * The intent is to use the PAM prompt for things like + * challenge-response, otherwise use sudo's prompt. + * There may also be cases where a localized translation + * of "Password: " exists for PAM but not for sudo. + */ +static bool +use_pam_prompt(const char *pam_prompt) +{ + size_t user_len; + debug_decl(use_pam_prompt, SUDOERS_DEBUG_AUTH) + + /* Always use sudo prompt if passprompt_override is set. */ + if (def_passprompt_override) + debug_return_bool(false); + + /* If sudo prompt matches "^Password: ?$", use PAM prompt. */ + if (PROMPT_IS_PASSWORD(def_prompt)) + debug_return_bool(true); + + /* If PAM prompt matches "^Password: ?$", use sudo prompt. */ + if (PAM_PROMPT_IS_PASSWORD(pam_prompt)) + debug_return_bool(false); + + /* + * Some PAM modules use "^username's Password: ?$" instead of + * "^Password: ?" so check for that too. + */ + user_len = strlen(user_name); + if (strncmp(pam_prompt, user_name, user_len) == 0) { + const char *cp = pam_prompt + user_len; + if (strncmp(cp, "'s Password:", 12) == 0 && + (cp[12] == '\0' || (cp[12] == ' ' && cp[13] == '\0'))) + debug_return_bool(false); + } + + /* Otherwise, use the PAM prompt. */ + debug_return_bool(true); +} + +static bool +is_filtered(const char *msg) +{ + bool filtered = false; + + if (conv_filter != NULL) { + struct conv_filter *filt = conv_filter; + while (filt->msg != NULL) { + if (strncmp(msg, filt->msg, filt->msglen) == 0) { + filtered = true; + break; + } + filt++; + } + } + return filtered; +} + +/* + * ``Conversation function'' for PAM <-> human interaction. + */ +static int +converse(int num_msg, PAM_CONST struct pam_message **msg, + struct pam_response **reply_out, void *vcallback) +{ + struct sudo_conv_callback *callback = NULL; + struct pam_response *reply; + const char *prompt; + char *pass; + int n, type; + int ret = PAM_SUCCESS; + debug_decl(converse, SUDOERS_DEBUG_AUTH) + + if (num_msg <= 0 || num_msg > PAM_MAX_NUM_MSG) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid number of PAM messages: %d", num_msg); + debug_return_int(PAM_CONV_ERR); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "number of PAM messages: %d", num_msg); + + if ((reply = calloc(num_msg, sizeof(struct pam_response))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(PAM_BUF_ERR); + } + *reply_out = reply; + + if (vcallback != NULL) + callback = *((struct sudo_conv_callback **)vcallback); + + for (n = 0; n < num_msg; n++) { + PAM_CONST struct pam_message *pm = PAM_MSG_GET(msg, n); + + type = SUDO_CONV_PROMPT_ECHO_OFF; + switch (pm->msg_style) { + case PAM_PROMPT_ECHO_ON: + type = SUDO_CONV_PROMPT_ECHO_ON; + /* FALLTHROUGH */ + case PAM_PROMPT_ECHO_OFF: + /* Error out if the last password read was interrupted. */ + if (getpass_error) + goto done; + + /* Choose either the sudo prompt or the PAM one. */ + prompt = use_pam_prompt(pm->msg) ? pm->msg : def_prompt; + + /* Read the password unless interrupted. */ + pass = auth_getpass(prompt, type, callback); + if (pass == NULL) { + /* Error (or ^C) reading password, don't try again. */ + getpass_error = true; + ret = PAM_CONV_ERR; + goto done; + } + if (strlen(pass) >= PAM_MAX_RESP_SIZE) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "password longer than %d", PAM_MAX_RESP_SIZE); + ret = PAM_CONV_ERR; + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + goto done; + } + reply[n].resp = pass; /* auth_getpass() malloc's a copy */ + break; + case PAM_TEXT_INFO: + if (pm->msg != NULL && !is_filtered(pm->msg)) + sudo_printf(SUDO_CONV_INFO_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + case PAM_ERROR_MSG: + if (pm->msg != NULL) + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unsupported message style: %d", pm->msg_style); + ret = PAM_CONV_ERR; + goto done; + } + } + +done: + if (ret != PAM_SUCCESS) { + /* Zero and free allocated memory and return an error. */ + for (n = 0; n < num_msg; n++) { + struct pam_response *pr = &reply[n]; + + if (pr->resp != NULL) { + memset_s(pr->resp, SUDO_CONV_REPL_MAX, 0, strlen(pr->resp)); + free(pr->resp); + pr->resp = NULL; + } + } + free(reply); + *reply_out = NULL; + } + debug_return_int(ret); +} + +#endif /* HAVE_PAM */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/pam.c.krb5ccname b/utsudo-0.0.2/plugins/sudoers/auth/pam.c.krb5ccname new file mode 100644 index 0000000..e5afad9 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/pam.c.krb5ccname @@ -0,0 +1,747 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_PAM + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#ifdef HAVE_PAM_PAM_APPL_H +# include +#else +# include +#endif + +#ifdef __hpux__ +# include +#endif + +#ifdef HAVE_LIBINTL_H +# if defined(__LINUX_PAM__) +# define PAM_TEXT_DOMAIN "Linux-PAM" +# elif defined(__sun__) +# define PAM_TEXT_DOMAIN "SUNW_OST_SYSOSPAM" +# endif +#endif + +/* We don't want to translate the strings in the calls to dgt(). */ +#ifdef PAM_TEXT_DOMAIN +# define dgt(d, t) dgettext(d, t) +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +/* Only OpenPAM and Linux PAM use const qualifiers. */ +#ifdef PAM_SUN_CODEBASE +# define PAM_CONST +#else +# define PAM_CONST const +#endif + +/* Ambiguity in spec: is it an array of pointers or a pointer to an array? */ +#ifdef PAM_SUN_CODEBASE +# define PAM_MSG_GET(msg, n) (*(msg) + (n)) +#else +# define PAM_MSG_GET(msg, n) ((msg)[(n)]) +#endif + +#ifndef PAM_DATA_SILENT +#define PAM_DATA_SILENT 0 +#endif + +struct conv_filter { + char *msg; + size_t msglen; +}; + +static int converse(int, PAM_CONST struct pam_message **, + struct pam_response **, void *); +static struct sudo_conv_callback *conv_callback; +static struct pam_conv pam_conv = { converse, &conv_callback }; +static char *def_prompt = PASSPROMPT; +static bool getpass_error; +static pam_handle_t *pamh; +static struct conv_filter *conv_filter; + +static void +conv_filter_init(void) +{ + debug_decl(conv_filter_init, SUDOERS_DEBUG_AUTH) + +#ifdef __hpux__ + /* + * HP-UX displays last login information as part of either account + * management (in trusted mode) or session management (regular mode). + * Filter those out in the conversation function unless running a shell. + */ + if (!ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) { + int i, nfilt = 0, maxfilters = 0; + struct conv_filter *newfilt; + nl_catd catd; + char *msg; + + /* + * Messages from PAM account management when trusted mode is enabled: + * 1 Last successful login for %s: %s + * 2 Last successful login for %s: %s on %s + * 3 Last unsuccessful login for %s: %s + * 4 Last unsuccessful login for %s: %s on %s + */ + if ((catd = catopen("pam_comsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 4; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 1; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + /* + * Messages from PAM session management when trusted mode is disabled: + * 3 Last successful login: %s %s %s %s + * 4 Last authentication failure: %s %s %s %s + */ + if ((catd = catopen("pam_hpsec", NL_CAT_LOCALE)) != -1) { + maxfilters += 2; + newfilt = reallocarray(conv_filter, maxfilters + 1, + sizeof(*conv_filter)); + if (newfilt != NULL) { + conv_filter = newfilt; + for (i = 3; i < 5; i++) { + if ((msg = catgets(catd, 1, i, NULL)) == NULL) + break; + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "adding \"%s\" to conversation filter", msg); + if ((conv_filter[nfilt].msg = strdup(msg)) == NULL) + break; + conv_filter[nfilt].msglen = strcspn(msg, "%"); + nfilt++; + } + } + } + if (conv_filter != NULL) { + conv_filter[nfilt].msg = NULL; + conv_filter[nfilt].msglen = 0; + } + } +#endif /* __hpux__ */ + debug_return; +} + +/* + * Like pam_strerror() but never returns NULL and uses strerror(errno) + * for PAM_SYSTEM_ERR. + */ +static const char * +sudo_pam_strerror(pam_handle_t *handle, int errnum) +{ + const char *errstr; + static char errbuf[32]; + + if (errnum == PAM_SYSTEM_ERR) + return strerror(errno); + if ((errstr = pam_strerror(handle, errnum)) == NULL) + (void)snprintf(errbuf, sizeof(errbuf), "PAM error %d", errnum); + return errstr; +} + +static int +sudo_pam_init2(struct passwd *pw, sudo_auth *auth, bool quiet) +{ + static int pam_status = PAM_SUCCESS; + const char *tty = user_ttypath; + const char *errstr, *pam_service; + int rc; + debug_decl(sudo_pam_init, SUDOERS_DEBUG_AUTH) + + /* Stash pointer to last pam status. */ + auth->data = &pam_status; + +#ifdef _AIX + if (pamh != NULL) { + /* Already initialized (may happen with AIX). */ + debug_return_int(AUTH_SUCCESS); + } +#endif /* _AIX */ + + /* Initial PAM. */ + pam_service = ISSET(sudo_mode, MODE_LOGIN_SHELL) ? + def_pam_login_service : def_pam_service; + pam_status = pam_start(pam_service, pw->pw_name, &pam_conv, &pamh); + if (pam_status != PAM_SUCCESS) { + errstr = sudo_pam_strerror(NULL, pam_status); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_start(%s, %s, %p, %p): %s", pam_service, pw->pw_name, + &pam_conv, &pamh, errstr); + if (!quiet) + log_warningx(0, N_("unable to initialize PAM: %s"), errstr); + debug_return_int(AUTH_FATAL); + } + + /* Initialize conversation function message filter. */ + conv_filter_init(); + + /* + * Set PAM_RUSER to the invoking user (the "from" user). + * We set PAM_RHOST to avoid a bug in Solaris 7 and below. + */ + rc = pam_set_item(pamh, PAM_RUSER, user_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RUSER, %s): %s", user_name, errstr); + } +#ifdef __sun__ + rc = pam_set_item(pamh, PAM_RHOST, user_host); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_RHOST, %s): %s", user_host, errstr); + } +#endif + +#if defined(__LINUX_PAM__) || defined(__sun__) + /* + * Some PAM modules assume PAM_TTY is set and will misbehave (or crash) + * if it is not. Known offenders include pam_lastlog and pam_time. + */ + if (tty == NULL) + tty = ""; +#endif + if (tty != NULL) { + rc = pam_set_item(pamh, PAM_TTY, tty); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_TTY, %s): %s", tty, errstr); + } + } + + /* + * If PAM session and setcred support is disabled we don't + * need to keep a sudo process around to close the session. + */ + if (!def_pam_session && !def_pam_setcred) + auth->end_session = NULL; + + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_pam_init(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, false); +} + +#ifdef _AIX +int +sudo_pam_init_quiet(struct passwd *pw, sudo_auth *auth) +{ + return sudo_pam_init2(pw, auth, true); +} +#endif /* _AIX */ + +int +sudo_pam_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + const char *s; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_verify, SUDOERS_DEBUG_AUTH) + + def_prompt = prompt; /* for converse */ + getpass_error = false; /* set by converse if user presses ^C */ + conv_callback = callback; /* passed to conversation function */ + + /* PAM_SILENT prevents the authentication service from generating output. */ + *pam_status = pam_authenticate(pamh, PAM_SILENT); + if (getpass_error) { + /* error or ^C from tgetpass() */ + debug_return_int(AUTH_INTR); + } + switch (*pam_status) { + case PAM_SUCCESS: + debug_return_int(AUTH_SUCCESS); + case PAM_AUTH_ERR: + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "pam_authenticate: %d", *pam_status); + debug_return_int(AUTH_FAILURE); + default: + s = sudo_pam_strerror(pamh, *pam_status); + log_warningx(0, N_("PAM authentication error: %s"), s); + debug_return_int(AUTH_FATAL); + } +} + +int +sudo_pam_approval(struct passwd *pw, sudo_auth *auth, bool exempt) +{ + const char *s; + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_approval, SUDOERS_DEBUG_AUTH) + + if (def_pam_acct_mgmt) { + rc = pam_acct_mgmt(pamh, PAM_SILENT); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_AUTH_ERR: + log_warningx(0, N_("account validation failure, " + "is your account locked?")); + status = AUTH_FATAL; + break; + case PAM_NEW_AUTHTOK_REQD: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* New password required, try to change it. */ + log_warningx(0, N_("Account or password is " + "expired, reset your password and try again")); + rc = pam_chauthtok(pamh, PAM_CHANGE_EXPIRED_AUTHTOK); + if (rc == PAM_SUCCESS) + break; + s = pam_strerror(pamh, rc); + log_warningx(0, N_("unable to change expired password: %s"), s); + status = AUTH_FAILURE; + break; + case PAM_AUTHTOK_EXPIRED: + /* Ignore if user is exempt from password restrictions. */ + if (exempt) { + rc = *pam_status; + break; + } + /* Password expired, cannot be updated by user. */ + log_warningx(0, + N_("Password expired, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_ACCT_EXPIRED: + log_warningx(0, + N_("Account expired or PAM config lacks an \"account\" " + "section for sudo, contact your system administrator")); + status = AUTH_FATAL; + break; + case PAM_AUTHINFO_UNAVAIL: + case PAM_MAXTRIES: + case PAM_PERM_DENIED: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FAILURE; + break; + default: + s = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("PAM account management error: %s"), s); + status = AUTH_FATAL; + break; + } + *pam_status = rc; + } + debug_return_int(status); +} + +int +sudo_pam_cleanup(struct passwd *pw, sudo_auth *auth) +{ + int *pam_status = (int *) auth->data; + debug_decl(sudo_pam_cleanup, SUDOERS_DEBUG_AUTH) + + /* If successful, we can't close the session until sudo_pam_end_session() */ + if (*pam_status != PAM_SUCCESS || auth->end_session == NULL) { + *pam_status = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + pamh = NULL; + } + debug_return_int(*pam_status == PAM_SUCCESS ? AUTH_SUCCESS : AUTH_FAILURE); +} + +int +sudo_pam_begin_session(struct passwd *pw, char **user_envp[], sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + int *pam_status = (int *) auth->data; + const char *errstr; + debug_decl(sudo_pam_begin_session, SUDOERS_DEBUG_AUTH) + + /* + * If there is no valid user we cannot open a PAM session. + * This is not an error as sudo can run commands with arbitrary + * uids, it just means we are done from a session management standpoint. + */ + if (pw == NULL) { + if (pamh != NULL) { + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + } + goto done; + } + + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + + /* + * Reinitialize credentials when changing the user. + * We don't worry about a failure from pam_setcred() since with + * stacked PAM auth modules a failure from one module may override + * PAM_SUCCESS from another. For example, given a non-local user, + * pam_unix will fail but pam_ldap or pam_sss may succeed, but if + * pam_unix is first in the stack, pam_setcred() will fail. + */ + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_REINITIALIZE_CRED); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + } + } + + if (def_pam_session) { + /* + * We use PAM_SILENT to prevent pam_lastlog from printing last login + * information except when explicitly running a shell. + */ + const bool silent = !ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL); + rc = pam_open_session(pamh, silent ? PAM_SILENT : 0); + switch (rc) { + case PAM_SUCCESS: + break; + case PAM_SESSION_ERR: + /* Treat PAM_SESSION_ERR as a non-fatal error. */ + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_open_session: %s", errstr); + /* Avoid closing session that was not opened. */ + def_pam_session = false; + break; + default: + /* Unexpected session failure, treat as fatal error. */ + *pam_status = rc; + errstr = sudo_pam_strerror(pamh, rc); + log_warningx(0, N_("%s: %s"), "pam_open_session", errstr); + rc = pam_end(pamh, *pam_status | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + } + pamh = NULL; + status = AUTH_FATAL; + goto done; + } + } + +#ifdef HAVE_PAM_GETENVLIST + /* + * Update environment based on what is stored in pamh. + * If no authentication is done we will only have environment + * variables if pam_env is called via session. + */ + if (user_envp != NULL) { + char **pam_envp = pam_getenvlist(pamh); + if (pam_envp != NULL) { + /* Merge pam env with user env. */ + if (!env_init(*user_envp) || !env_merge(pam_envp)) + status = AUTH_FATAL; + *user_envp = env_get(); + (void)env_init(NULL); + free(pam_envp); + /* XXX - we leak any duplicates that were in pam_envp */ + } + } +#endif /* HAVE_PAM_GETENVLIST */ + +done: + debug_return_int(status); +} + +int +sudo_pam_end_session(struct passwd *pw, sudo_auth *auth) +{ + int rc, status = AUTH_SUCCESS; + const char *errstr; + debug_decl(sudo_pam_end_session, SUDOERS_DEBUG_AUTH) + + if (pamh != NULL) { + /* + * Update PAM_USER to reference the user we are running the command + * as, as opposed to the user we authenticated as. + * XXX - still needed now that session init is in parent? + */ + rc = pam_set_item(pamh, PAM_USER, pw->pw_name); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_set_item(pamh, PAM_USER, %s): %s", pw->pw_name, errstr); + } + if (def_pam_session) { + rc = pam_close_session(pamh, PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_close_session: %s", errstr); + } + } + if (def_pam_setcred) { + rc = pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_setcred: %s", errstr); + } + } + rc = pam_end(pamh, PAM_SUCCESS | PAM_DATA_SILENT); + if (rc != PAM_SUCCESS) { + errstr = sudo_pam_strerror(pamh, rc); + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "pam_end: %s", errstr); + status = AUTH_FATAL; + } + pamh = NULL; + } + + debug_return_int(status); +} + +#define PROMPT_IS_PASSWORD(_p) \ + (strncmp((_p), "Password:", 9) == 0 && \ + ((_p)[9] == '\0' || ((_p)[9] == ' ' && (_p)[10] == '\0'))) + +#ifdef PAM_TEXT_DOMAIN +# define PAM_PROMPT_IS_PASSWORD(_p) \ + (strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password:")) == 0 || \ + strcmp((_p), dgt(PAM_TEXT_DOMAIN, "Password: ")) == 0 || \ + PROMPT_IS_PASSWORD(_p)) +#else +# define PAM_PROMPT_IS_PASSWORD(_p) PROMPT_IS_PASSWORD(_p) +#endif /* PAM_TEXT_DOMAIN */ + +/* + * We use the PAM prompt in preference to sudo's as long + * as passprompt_override is not set and: + * a) the (translated) sudo prompt matches /^Password: ?/ + * or: + * b) the PAM prompt itself *doesn't* match /^Password: ?/ + * or /^username's Password: ?/ + * + * The intent is to use the PAM prompt for things like + * challenge-response, otherwise use sudo's prompt. + * There may also be cases where a localized translation + * of "Password: " exists for PAM but not for sudo. + */ +static bool +use_pam_prompt(const char *pam_prompt) +{ + size_t user_len; + debug_decl(use_pam_prompt, SUDOERS_DEBUG_AUTH) + + /* Always use sudo prompt if passprompt_override is set. */ + if (def_passprompt_override) + debug_return_bool(false); + + /* If sudo prompt matches "^Password: ?$", use PAM prompt. */ + if (PROMPT_IS_PASSWORD(def_prompt)) + debug_return_bool(true); + + /* If PAM prompt matches "^Password: ?$", use sudo prompt. */ + if (PAM_PROMPT_IS_PASSWORD(pam_prompt)) + debug_return_bool(false); + + /* + * Some PAM modules use "^username's Password: ?$" instead of + * "^Password: ?" so check for that too. + */ + user_len = strlen(user_name); + if (strncmp(pam_prompt, user_name, user_len) == 0) { + const char *cp = pam_prompt + user_len; + if (strncmp(cp, "'s Password:", 12) == 0 && + (cp[12] == '\0' || (cp[12] == ' ' && cp[13] == '\0'))) + debug_return_bool(false); + } + + /* Otherwise, use the PAM prompt. */ + debug_return_bool(true); +} + +static bool +is_filtered(const char *msg) +{ + bool filtered = false; + + if (conv_filter != NULL) { + struct conv_filter *filt = conv_filter; + while (filt->msg != NULL) { + if (strncmp(msg, filt->msg, filt->msglen) == 0) { + filtered = true; + break; + } + filt++; + } + } + return filtered; +} + +/* + * ``Conversation function'' for PAM <-> human interaction. + */ +static int +converse(int num_msg, PAM_CONST struct pam_message **msg, + struct pam_response **reply_out, void *vcallback) +{ + struct sudo_conv_callback *callback = NULL; + struct pam_response *reply; + const char *prompt; + char *pass; + int n, type; + int ret = PAM_SUCCESS; + debug_decl(converse, SUDOERS_DEBUG_AUTH) + + if (num_msg <= 0 || num_msg > PAM_MAX_NUM_MSG) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid number of PAM messages: %d", num_msg); + debug_return_int(PAM_CONV_ERR); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "number of PAM messages: %d", num_msg); + + if ((reply = calloc(num_msg, sizeof(struct pam_response))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(PAM_BUF_ERR); + } + *reply_out = reply; + + if (vcallback != NULL) + callback = *((struct sudo_conv_callback **)vcallback); + + for (n = 0; n < num_msg; n++) { + PAM_CONST struct pam_message *pm = PAM_MSG_GET(msg, n); + + type = SUDO_CONV_PROMPT_ECHO_OFF; + switch (pm->msg_style) { + case PAM_PROMPT_ECHO_ON: + type = SUDO_CONV_PROMPT_ECHO_ON; + /* FALLTHROUGH */ + case PAM_PROMPT_ECHO_OFF: + /* Error out if the last password read was interrupted. */ + if (getpass_error) + goto done; + + /* Choose either the sudo prompt or the PAM one. */ + prompt = use_pam_prompt(pm->msg) ? pm->msg : def_prompt; + + /* Read the password unless interrupted. */ + pass = auth_getpass(prompt, type, callback); + if (pass == NULL) { + /* Error (or ^C) reading password, don't try again. */ + getpass_error = true; + ret = PAM_CONV_ERR; + goto done; + } + if (strlen(pass) >= PAM_MAX_RESP_SIZE) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "password longer than %d", PAM_MAX_RESP_SIZE); + ret = PAM_CONV_ERR; + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + goto done; + } + reply[n].resp = pass; /* auth_getpass() malloc's a copy */ + break; + case PAM_TEXT_INFO: + if (pm->msg != NULL && !is_filtered(pm->msg)) + sudo_printf(SUDO_CONV_INFO_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + case PAM_ERROR_MSG: + if (pm->msg != NULL) + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "%s\n", pm->msg); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unsupported message style: %d", pm->msg_style); + ret = PAM_CONV_ERR; + goto done; + } + } + +done: + if (ret != PAM_SUCCESS) { + /* Zero and free allocated memory and return an error. */ + for (n = 0; n < num_msg; n++) { + struct pam_response *pr = &reply[n]; + + if (pr->resp != NULL) { + memset_s(pr->resp, SUDO_CONV_REPL_MAX, 0, strlen(pr->resp)); + free(pr->resp); + pr->resp = NULL; + } + } + free(reply); + *reply_out = NULL; + } + debug_return_int(ret); +} + +#endif /* HAVE_PAM */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/passwd.c b/utsudo-0.0.2/plugins/sudoers/auth/passwd.c new file mode 100644 index 0000000..03c7a16 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/passwd.c @@ -0,0 +1,115 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +#define DESLEN 13 +#define HAS_AGEINFO(p, l) (l == 18 && p[DESLEN] == ',') + +int +sudo_passwd_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_passwd_init, SUDOERS_DEBUG_AUTH) + +#ifdef HAVE_SKEYACCESS + if (skeyaccess(pw, user_tty, NULL, NULL) == 0) + debug_return_int(AUTH_FAILURE); +#endif + sudo_setspent(); + auth->data = sudo_getepw(pw); + sudo_endspent(); + debug_return_int(auth->data ? AUTH_SUCCESS : AUTH_FATAL); +} + +int +sudo_passwd_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char sav, *epass; + char *pw_epasswd = auth->data; + size_t pw_len; + int matched = 0; + debug_decl(sudo_passwd_verify, SUDOERS_DEBUG_AUTH) + + /* An empty plain-text password must match an empty encrypted password. */ + if (pass[0] == '\0') + debug_return_int(pw_epasswd[0] ? AUTH_FAILURE : AUTH_SUCCESS); + + /* + * Truncate to 8 chars if standard DES since not all crypt()'s do this. + * If this turns out not to be safe we will have to use OS #ifdef's (sigh). + */ + sav = pass[8]; + pw_len = strlen(pw_epasswd); + if (pw_len == DESLEN || HAS_AGEINFO(pw_epasswd, pw_len)) + pass[8] = '\0'; + + /* + * Normal UN*X password check. + * HP-UX may add aging info (separated by a ',') at the end so + * only compare the first DESLEN characters in that case. + */ + epass = (char *) crypt(pass, pw_epasswd); + pass[8] = sav; + if (epass != NULL) { + if (HAS_AGEINFO(pw_epasswd, pw_len) && strlen(epass) == DESLEN) + matched = !strncmp(pw_epasswd, epass, DESLEN); + else + matched = !strcmp(pw_epasswd, epass); + } + + debug_return_int(matched ? AUTH_SUCCESS : AUTH_FAILURE); +} + +int +sudo_passwd_cleanup(pw, auth) + struct passwd *pw; + sudo_auth *auth; +{ + char *pw_epasswd = auth->data; + debug_decl(sudo_passwd_cleanup, SUDOERS_DEBUG_AUTH) + + if (pw_epasswd != NULL) { + memset_s(pw_epasswd, SUDO_CONV_REPL_MAX, 0, strlen(pw_epasswd)); + free(pw_epasswd); + } + debug_return_int(AUTH_SUCCESS); +} diff --git a/utsudo-0.0.2/plugins/sudoers/auth/rfc1938.c b/utsudo-0.0.2/plugins/sudoers/auth/rfc1938.c new file mode 100644 index 0000000..e866691 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/rfc1938.c @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#if defined(HAVE_SKEY) || defined(HAVE_OPIE) + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#if defined(HAVE_SKEY) +# include +# define RFC1938 skey +# ifdef HAVE_RFC1938_SKEYCHALLENGE +# define rfc1938challenge(a,b,c,d) skeychallenge((a),(b),(c),(d)) +# else +# define rfc1938challenge(a,b,c,d) skeychallenge((a),(b),(c)) +# endif +# define rfc1938verify(a,b) skeyverify((a),(b)) +#elif defined(HAVE_OPIE) +# include +# define RFC1938 opie +# define rfc1938challenge(a,b,c,d) opiechallenge((a),(b),(c)) +# define rfc1938verify(a,b) opieverify((a),(b)) +#endif + +#include "sudoers.h" +#include "sudo_auth.h" + +int +sudo_rfc1938_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + char challenge[256]; + size_t challenge_len; + static char *orig_prompt = NULL, *new_prompt = NULL; + static size_t op_len, np_size; + static struct RFC1938 rfc1938; + debug_decl(sudo_rfc1938_setup, SUDOERS_DEBUG_AUTH) + + /* Stash a pointer to the rfc1938 struct if we have not initialized */ + if (!auth->data) + auth->data = &rfc1938; + + /* Save the original prompt */ + if (orig_prompt == NULL) { + orig_prompt = *promptp; + op_len = strlen(orig_prompt); + + /* Ignore trailing colon (we will add our own) */ + if (orig_prompt[op_len - 1] == ':') + op_len--; + else if (op_len >= 2 && orig_prompt[op_len - 1] == ' ' + && orig_prompt[op_len - 2] == ':') + op_len -= 2; + } + +#ifdef HAVE_SKEY + /* Close old stream */ + if (rfc1938.keyfile) + (void) fclose(rfc1938.keyfile); +#endif + + /* + * Look up the user and get the rfc1938 challenge. + * If the user is not in the OTP db, only post a fatal error if + * we are running alone (since they may just use a normal passwd). + */ + if (rfc1938challenge(&rfc1938, pw->pw_name, challenge, sizeof(challenge))) { + if (IS_ONEANDONLY(auth)) { + sudo_warnx(U_("you do not exist in the %s database"), auth->name); + debug_return_int(AUTH_FATAL); + } else { + debug_return_int(AUTH_FAILURE); + } + } + + /* Get space for new prompt with embedded challenge */ + challenge_len = strlen(challenge); + if (np_size < op_len + challenge_len + 7) { + char *p = realloc(new_prompt, op_len + challenge_len + 7); + if (p == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + np_size = op_len + challenge_len + 7; + new_prompt = p; + } + + if (def_long_otp_prompt) + (void) snprintf(new_prompt, np_size, "%s\n%s", challenge, orig_prompt); + else + (void) snprintf(new_prompt, np_size, "%.*s [ %s ]:", (int)op_len, + orig_prompt, challenge); + + *promptp = new_prompt; + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_rfc1938_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + debug_decl(sudo_rfc1938_verify, SUDOERS_DEBUG_AUTH) + + if (rfc1938verify((struct RFC1938 *) auth->data, pass) == 0) + debug_return_int(AUTH_SUCCESS); + else + debug_return_int(AUTH_FAILURE); +} + +#endif /* HAVE_SKEY || HAVE_OPIE */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/secureware.c b/utsudo-0.0.2/plugins/sudoers/auth/secureware.c new file mode 100644 index 0000000..854ddb8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/secureware.c @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1998-2005, 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_GETPRPWNAM + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#ifdef __hpux +# undef MAXINT +# include +#else +# include +#endif /* __hpux */ +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +#ifdef __alpha +extern int crypt_type; +#endif + +int +sudo_secureware_init(struct passwd *pw, sudo_auth *auth) +{ + debug_decl(sudo_secureware_init, SUDOERS_DEBUG_AUTH) + +#ifdef __alpha + if (crypt_type == INT_MAX) + debug_return_int(AUTH_FAILURE); /* no shadow */ +#endif + + sudo_setspent(); + auth->data = sudo_getepw(pw); + sudo_endspent(); + debug_return_int(auth->data ? AUTH_SUCCESS : AUTH_FATAL); +} + +int +sudo_secureware_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + char *pw_epasswd = auth->data; + char *epass = NULL; + debug_decl(sudo_secureware_verify, SUDOERS_DEBUG_AUTH) + + /* An empty plain-text password must match an empty encrypted password. */ + if (pass[0] == '\0') + debug_return_int(pw_epasswd[0] ? AUTH_FAILURE : AUTH_SUCCESS); + +#if defined(__alpha) +# ifdef HAVE_DISPCRYPT + epass = dispcrypt(pass, pw_epasswd, crypt_type); +# else + if (crypt_type == AUTH_CRYPT_BIGCRYPT) + epass = bigcrypt(pass, pw_epasswd); + else if (crypt_type == AUTH_CRYPT_CRYPT16) + epass = crypt(pass, pw_epasswd); +# endif /* HAVE_DISPCRYPT */ +#elif defined(HAVE_BIGCRYPT) + epass = bigcrypt(pass, pw_epasswd); +#endif /* __alpha */ + + if (epass != NULL && strcmp(pw_epasswd, epass) == 0) + debug_return_int(AUTH_SUCCESS); + debug_return_int(AUTH_FAILURE); +} + +int +sudo_secureware_cleanup(pw, auth) + struct passwd *pw; + sudo_auth *auth; +{ + char *pw_epasswd = auth->data; + debug_decl(sudo_secureware_cleanup, SUDOERS_DEBUG_AUTH) + + if (pw_epasswd != NULL) { + memset_s(pw_epasswd, SUDO_CONV_REPL_MAX, 0, strlen(pw_epasswd)); + free(pw_epasswd); + } + debug_return_int(AUTH_SUCCESS); +} + +#endif /* HAVE_GETPRPWNAM */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/securid5.c b/utsudo-0.0.2/plugins/sudoers/auth/securid5.c new file mode 100644 index 0000000..9f1ab3b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/securid5.c @@ -0,0 +1,234 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007, 2010-2012, 2014-2016 + * Todd C. Miller + * Copyright (c) 2002 Michael Stroucken + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SECURID + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +/* Needed for SecurID v5.0 Authentication on UNIX */ +#define UNIX 1 +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +/* + * securid_init - Initialises communications with ACE server + * Arguments in: + * pw - UNUSED + * auth - sudo authentication structure + * + * Results out: + * auth - auth->data contains pointer to new SecurID handle + * return code - Fatal if initialization unsuccessful, otherwise + * success. + */ +int +sudo_securid_init(struct passwd *pw, sudo_auth *auth) +{ + static SDI_HANDLE sd_dat; /* SecurID handle */ + debug_decl(sudo_securid_init, SUDOERS_DEBUG_AUTH) + + auth->data = (void *) &sd_dat; /* For method-specific data */ + + /* Start communications */ + if (AceInitialize() != SD_FALSE) + debug_return_int(AUTH_SUCCESS); + + sudo_warnx(U_("failed to initialise the ACE API library")); + debug_return_int(AUTH_FATAL); +} + +/* + * securid_setup - Initialises a SecurID transaction and locks out other + * ACE servers + * + * Arguments in: + * pw - struct passwd for username + * promptp - UNUSED + * auth - sudo authentication structure for SecurID handle + * + * Results out: + * return code - Success if transaction started correctly, fatal + * otherwise + */ +int +sudo_securid_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + SDI_HANDLE *sd = (SDI_HANDLE *) auth->data; + int retval; + debug_decl(sudo_securid_setup, SUDOERS_DEBUG_AUTH) + + /* Re-initialize SecurID every time. */ + if (SD_Init(sd) != ACM_OK) { + sudo_warnx(U_("unable to contact the SecurID server")); + debug_return_int(AUTH_FATAL); + } + + /* Lock new PIN code */ + retval = SD_Lock(*sd, pw->pw_name); + + switch (retval) { + case ACM_OK: + sudo_warnx(U_("User ID locked for SecurID Authentication")); + debug_return_int(AUTH_SUCCESS); + + case ACE_UNDEFINED_USERNAME: + sudo_warnx(U_("invalid username length for SecurID")); + debug_return_int(AUTH_FATAL); + + case ACE_ERR_INVALID_HANDLE: + sudo_warnx(U_("invalid Authentication Handle for SecurID")); + debug_return_int(AUTH_FATAL); + + case ACM_ACCESS_DENIED: + sudo_warnx(U_("SecurID communication failed")); + debug_return_int(AUTH_FATAL); + + default: + sudo_warnx(U_("unknown SecurID error")); + debug_return_int(AUTH_FATAL); + } +} + +/* + * securid_verify - Authenticates user and handles ACE responses + * + * Arguments in: + * pw - struct passwd for username + * pass - UNUSED + * auth - sudo authentication structure for SecurID handle + * + * Results out: + * return code - Success on successful authentication, failure on + * incorrect authentication, fatal on errors + */ +int +sudo_securid_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback) +{ + SDI_HANDLE *sd = (SDI_HANDLE *) auth->data; + int ret; + debug_decl(sudo_securid_verify, SUDOERS_DEBUG_AUTH) + + pass = auth_getpass("Enter your PASSCODE: ", SUDO_CONV_PROMPT_ECHO_OFF, + callback); + + /* Have ACE verify password */ + switch (SD_Check(*sd, pass, pw->pw_name)) { + case ACM_OK: + ret = AUTH_SUCESS; + break; + + case ACE_UNDEFINED_PASSCODE: + sudo_warnx(U_("invalid passcode length for SecurID")); + ret = AUTH_FATAL; + break; + + case ACE_UNDEFINED_USERNAME: + sudo_warnx(U_("invalid username length for SecurID")); + ret = AUTH_FATAL; + break; + + case ACE_ERR_INVALID_HANDLE: + sudo_warnx(U_("invalid Authentication Handle for SecurID")); + ret = AUTH_FATAL; + break; + + case ACM_ACCESS_DENIED: + ret = AUTH_FAILURE; + break; + + case ACM_NEXT_CODE_REQUIRED: + /* Sometimes (when current token close to expire?) + ACE challenges for the next token displayed + (entered without the PIN) */ + if (pass != NULL) { + memset_s(pass, SUDO_PASS_MAX, 0, strlen(pass)); + free(pass); + } + pass = auth_getpass("\ +!!! ATTENTION !!!\n\ +Wait for the token code to change, \n\ +then enter the new token code.\n", \ + SUDO_CONV_PROMPT_ECHO_OFF, callback); + + if (SD_Next(*sd, pass) == ACM_OK) { + ret = AUTH_SUCCESS; + break; + } + + ret = AUTH_FAILURE; + break; + + case ACM_NEW_PIN_REQUIRED: + /* + * This user's SecurID has not been activated yet, + * or the pin has been reset + */ + /* XXX - Is setting up a new PIN within sudo's scope? */ + SD_Pin(*sd, ""); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Your SecurID access has not yet been set up.\n"); + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, + "Please set up a PIN before you try to authenticate.\n"); + ret = AUTH_FATAL; + break; + + default: + sudo_warnx(U_("unknown SecurID error")); + ret = AUTH_FATAL; + break; + } + + /* Free resources */ + SD_Close(*sd); + + if (pass != NULL) { + memset_s(pass, SUDO_PASS_MAX, 0, strlen(pass)); + free(pass); + } + + /* Return stored state to calling process */ + debug_return_int(ret); +} + +#endif /* HAVE_SECURID */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/sia.c b/utsudo-0.0.2/plugins/sudoers/auth/sia.c new file mode 100644 index 0000000..8f54c49 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/sia.c @@ -0,0 +1,158 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SIA_SES_INIT + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" + +static char **sudo_argv; +static int sudo_argc; + +int +sudo_sia_setup(struct passwd *pw, char **promptp, sudo_auth *auth) +{ + SIAENTITY *siah; + int i; + debug_decl(sudo_sia_setup, SUDOERS_DEBUG_AUTH) + + /* Rebuild argv for sia_ses_init() */ + sudo_argc = NewArgc + 1; + sudo_argv = reallocarray(NULL, sudo_argc + 1, sizeof(char *)); + if (sudo_argv == NULL) { + log_warningx(0, N_("unable to allocate memory")); + debug_return_int(AUTH_FATAL); + } + sudo_argv[0] = "sudo"; + for (i = 0; i < NewArgc; i++) + sudo_argv[i + 1] = NewArgv[i]; + sudo_argv[sudo_argc] = NULL; + + /* We don't let SIA prompt the user for input. */ + if (sia_ses_init(&siah, sudo_argc, sudo_argv, NULL, pw->pw_name, user_ttypath, 0, NULL) != SIASUCCESS) { + log_warning(0, N_("unable to initialize SIA session")); + debug_return_int(AUTH_FATAL); + } + + auth->data = siah; + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_sia_verify(struct passwd *pw, char *prompt, sudo_auth *auth, + struct sudo_conv_callback *callback) +{ + SIAENTITY *siah = auth->data; + char *pass; + int rc; + debug_decl(sudo_sia_verify, SUDOERS_DEBUG_AUTH) + + /* Get password, return AUTH_INTR if we got ^C */ + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + debug_return_int(AUTH_INTR); + + /* Check password and zero out plaintext copy. */ + rc = sia_ses_authent(NULL, pass, siah); + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + free(pass); + + if (rc == SIASUCCESS) + debug_return_int(AUTH_SUCCESS); + if (ISSET(rc, SIASTOP)) + debug_return_int(AUTH_FATAL); + debug_return_int(AUTH_FAILURE); +} + +int +sudo_sia_cleanup(struct passwd *pw, sudo_auth *auth) +{ + SIAENTITY *siah = auth->data; + debug_decl(sudo_sia_cleanup, SUDOERS_DEBUG_AUTH) + + (void) sia_ses_release(&siah); + auth->data = NULL; + free(sudo_argv); + debug_return_int(AUTH_SUCCESS); +} + +int +sudo_sia_begin_session(struct passwd *pw, char **user_envp[], sudo_auth *auth) +{ + SIAENTITY *siah; + int status = AUTH_FATAL; + debug_decl(sudo_sia_begin_session, SUDOERS_DEBUG_AUTH) + + /* Re-init sia for the target user's session. */ + if (sia_ses_init(&siah, NewArgc, NewArgv, NULL, pw->pw_name, user_ttypath, 0, NULL) != SIASUCCESS) { + log_warning(0, N_("unable to initialize SIA session")); + goto done; + } + + if (sia_make_entity_pwd(pw, siah) != SIASUCCESS) { + sudo_warn("sia_make_entity_pwd"); + goto done; + } + + status = AUTH_FAILURE; /* no more fatal errors. */ + + siah->authtype = SIA_A_NONE; + if (sia_ses_estab(sia_collect_trm, siah) != SIASUCCESS) { + sudo_warn("sia_ses_estab"); + goto done; + } + + if (sia_ses_launch(sia_collect_trm, siah) != SIASUCCESS) { + sudo_warn("sia_ses_launch"); + goto done; + } + + status = AUTH_SUCCESS; + +done: + (void) sia_ses_release(&siah); + debug_return_int(status); +} + +#endif /* HAVE_SIA_SES_INIT */ diff --git a/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.c b/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.c new file mode 100644 index 0000000..bae41a2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.c @@ -0,0 +1,485 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_auth.h" +#include "insults.h" + +static sudo_auth auth_switch[] = { +/* Standalone entries first */ +#ifdef HAVE_AIXAUTH + AUTH_ENTRY("aixauth", FLAG_STANDALONE, sudo_aix_init, NULL, sudo_aix_verify, NULL, sudo_aix_cleanup, NULL, NULL) +#endif +#ifdef HAVE_PAM + AUTH_ENTRY("pam", FLAG_STANDALONE, sudo_pam_init, NULL, sudo_pam_verify, sudo_pam_approval, sudo_pam_cleanup, sudo_pam_begin_session, sudo_pam_end_session) +#endif +#ifdef HAVE_SECURID + AUTH_ENTRY("SecurId", FLAG_STANDALONE, sudo_securid_init, sudo_securid_setup, sudo_securid_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_SIA_SES_INIT + AUTH_ENTRY("sia", FLAG_STANDALONE, NULL, sudo_sia_setup, sudo_sia_verify, NULL, sudo_sia_cleanup, sudo_sia_begin_session, NULL) +#endif +#ifdef HAVE_FWTK + AUTH_ENTRY("fwtk", FLAG_STANDALONE, sudo_fwtk_init, NULL, sudo_fwtk_verify, NULL, sudo_fwtk_cleanup, NULL, NULL) +#endif +#ifdef HAVE_BSD_AUTH_H + AUTH_ENTRY("bsdauth", FLAG_STANDALONE, bsdauth_init, NULL, bsdauth_verify, bsdauth_approval, bsdauth_cleanup, NULL, NULL) +#endif + +/* Non-standalone entries */ +#ifndef WITHOUT_PASSWD + AUTH_ENTRY("passwd", 0, sudo_passwd_init, NULL, sudo_passwd_verify, NULL, sudo_passwd_cleanup, NULL, NULL) +#endif +#if defined(HAVE_GETPRPWNAM) && !defined(WITHOUT_PASSWD) + AUTH_ENTRY("secureware", 0, sudo_secureware_init, NULL, sudo_secureware_verify, NULL, sudo_secureware_cleanup, NULL, NULL) +#endif +#ifdef HAVE_AFS + AUTH_ENTRY("afs", 0, NULL, NULL, sudo_afs_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_DCE + AUTH_ENTRY("dce", 0, NULL, NULL, sudo_dce_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_KERB5 + AUTH_ENTRY("kerb5", 0, sudo_krb5_init, sudo_krb5_setup, sudo_krb5_verify, NULL, sudo_krb5_cleanup, NULL, NULL) +#endif +#ifdef HAVE_SKEY + AUTH_ENTRY("S/Key", 0, NULL, sudo_rfc1938_setup, sudo_rfc1938_verify, NULL, NULL, NULL, NULL) +#endif +#ifdef HAVE_OPIE + AUTH_ENTRY("OPIE", 0, NULL, sudo_rfc1938_setup, sudo_rfc1938_verify, NULL, NULL, NULL, NULL) +#endif + AUTH_ENTRY(NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) +}; + +static bool standalone; + +/* + * Initialize sudoers authentication method(s). + * Returns 0 on success and -1 on error. + */ +int +sudo_auth_init(struct passwd *pw) +{ + sudo_auth *auth; + int status = AUTH_SUCCESS; + debug_decl(sudo_auth_init, SUDOERS_DEBUG_AUTH) + + if (auth_switch[0].name == NULL) + debug_return_int(0); + + /* Initialize auth methods and unconfigure the method if necessary. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->init && !IS_DISABLED(auth)) { + /* Disable if it failed to init unless there was a fatal error. */ + status = (auth->init)(pw, auth); + if (status == AUTH_FAILURE) + SET(auth->flags, FLAG_DISABLED); + else if (status == AUTH_FATAL) + break; /* assume error msg already printed */ + } + } + + /* + * Make sure we haven't mixed standalone and shared auth methods. + * If there are multiple standalone methods, only use the first one. + */ + if ((standalone = IS_STANDALONE(&auth_switch[0]))) { + bool found = false; + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + if (!IS_STANDALONE(auth)) { + audit_failure(NewArgc, NewArgv, + N_("invalid authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("Invalid authentication methods compiled into sudo! " + "You may not mix standalone and non-standalone authentication.")); + debug_return_int(-1); + } + if (!found) { + /* Found first standalone method. */ + found = true; + continue; + } + /* Disable other standalone methods. */ + SET(auth->flags, FLAG_DISABLED); + } + } + + /* Set FLAG_ONEANDONLY if there is only one auth method. */ + for (auth = auth_switch; auth->name; auth++) { + /* Find first enabled auth method. */ + if (!IS_DISABLED(auth)) { + sudo_auth *first = auth; + /* Check for others. */ + for (; auth->name; auth++) { + if (!IS_DISABLED(auth)) + break; + } + if (auth->name == NULL) + SET(first->flags, FLAG_ONEANDONLY); + break; + } + } + + debug_return_int(status == AUTH_FATAL ? -1 : 0); +} + +/* + * Cleanup all authentication approval methods. + * Returns true on success, false on failure and -1 on error. + */ +int +sudo_auth_approval(struct passwd *pw, int validated, bool exempt) +{ + sudo_auth *auth; + debug_decl(sudo_auth_approval, SUDOERS_DEBUG_AUTH) + + /* Call approval routines. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->approval && !IS_DISABLED(auth)) { + int status = (auth->approval)(pw, auth, exempt); + if (status != AUTH_SUCCESS) { + /* Assume error msg already printed. */ + log_auth_failure(validated, 0); + debug_return_int(status == AUTH_FAILURE ? false : -1); + } + } + } + debug_return_int(true); +} + +/* + * Cleanup all authentication methods. + * Returns 0 on success and -1 on error. + */ +int +sudo_auth_cleanup(struct passwd *pw) +{ + sudo_auth *auth; + debug_decl(sudo_auth_cleanup, SUDOERS_DEBUG_AUTH) + + /* Call cleanup routines. */ + for (auth = auth_switch; auth->name; auth++) { + if (auth->cleanup && !IS_DISABLED(auth)) { + int status = (auth->cleanup)(pw, auth); + if (status == AUTH_FATAL) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(0); +} + +static void +pass_warn(void) +{ + const char *warning = def_badpass_message; + debug_decl(pass_warn, SUDOERS_DEBUG_AUTH) + +#ifdef INSULT + if (def_insults) + warning = INSULT; +#endif + sudo_printf(SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY, "%s\n", warning); + + debug_return; +} + +static bool +user_interrupted(void) +{ + sigset_t mask; + + return (sigpending(&mask) == 0 && + (sigismember(&mask, SIGINT) || sigismember(&mask, SIGQUIT))); +} + +/* + * Verify the specified user. + * Returns true if verified, false if not or -1 on error. + */ +int +verify_user(struct passwd *pw, char *prompt, int validated, + struct sudo_conv_callback *callback) +{ + unsigned int ntries; + int ret, status, success = AUTH_FAILURE; + sudo_auth *auth; + sigset_t mask, omask; + struct sigaction sa, saved_sigtstp; + debug_decl(verify_user, SUDOERS_DEBUG_AUTH) + + /* Make sure we have at least one auth method. */ + if (auth_switch[0].name == NULL) { + audit_failure(NewArgc, NewArgv, N_("no authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("There are no authentication methods compiled into sudo! " + "If you want to turn off authentication, use the " + "--disable-authentication configure option.")); + debug_return_int(-1); + } + + /* Enable suspend during password entry. */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGTSTP, &sa, &saved_sigtstp); + + /* + * We treat authentication as a critical section and block + * keyboard-generated signals such as SIGINT and SIGQUIT + * which might otherwise interrupt a sleep(3). + * They are temporarily unblocked by auth_getpass(). + */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_BLOCK, &mask, &omask); + + for (ntries = 0; ntries < def_passwd_tries; ntries++) { + int num_methods = 0; + char *pass = NULL; + + /* If user attempted to interrupt password verify, quit now. */ + if (user_interrupted()) + goto done; + + if (ntries != 0) + pass_warn(); + + /* Do any per-method setup and unconfigure the method if needed */ + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + num_methods++; + if (auth->setup != NULL) { + status = (auth->setup)(pw, &prompt, auth); + if (status == AUTH_FAILURE) + SET(auth->flags, FLAG_DISABLED); + else if (status == AUTH_FATAL || user_interrupted()) + goto done; /* assume error msg already printed */ + } + } + if (num_methods == 0) { + audit_failure(NewArgc, NewArgv, N_("no authentication methods")); + log_warningx(SLOG_SEND_MAIL, + N_("Unable to initialize authentication methods.")); + debug_return_int(-1); + } + + /* Get the password unless the auth function will do it for us */ + if (!standalone) { + pass = auth_getpass(prompt, SUDO_CONV_PROMPT_ECHO_OFF, callback); + if (pass == NULL) + break; + } + + /* Call authentication functions. */ + for (auth = auth_switch; auth->name; auth++) { + if (IS_DISABLED(auth)) + continue; + + success = auth->status = + (auth->verify)(pw, standalone ? prompt : pass, auth, callback); + if (success != AUTH_FAILURE) + break; + } + if (pass != NULL) { + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + free(pass); + } + + if (success != AUTH_FAILURE) + goto done; + } + +done: + /* Restore signal handlers and signal mask. */ + (void) sigaction(SIGTSTP, &saved_sigtstp, NULL); + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + + switch (success) { + case AUTH_SUCCESS: + ret = true; + break; + case AUTH_INTR: + case AUTH_FAILURE: + if (ntries != 0) + validated |= FLAG_BAD_PASSWORD; + log_auth_failure(validated, ntries); + ret = false; + break; + case AUTH_FATAL: + default: + log_auth_failure(validated, 0); + ret = -1; + break; + } + + debug_return_int(ret); +} + +/* + * Call authentication method begin session hooks. + * Returns 1 on success and -1 on error. + */ +int +sudo_auth_begin_session(struct passwd *pw, char **user_env[]) +{ + sudo_auth *auth; + debug_decl(sudo_auth_begin_session, SUDOERS_DEBUG_AUTH) + + for (auth = auth_switch; auth->name; auth++) { + if (auth->begin_session && !IS_DISABLED(auth)) { + int status = (auth->begin_session)(pw, user_env, auth); + if (status != AUTH_SUCCESS) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(1); +} + +bool +sudo_auth_needs_end_session(void) +{ + sudo_auth *auth; + bool needed = false; + debug_decl(sudo_auth_needs_end_session, SUDOERS_DEBUG_AUTH) + + for (auth = auth_switch; auth->name; auth++) { + if (auth->end_session && !IS_DISABLED(auth)) { + needed = true; + break; + } + } + debug_return_bool(needed); +} + +/* + * Call authentication method end session hooks. + * Returns 1 on success and -1 on error. + */ +int +sudo_auth_end_session(struct passwd *pw) +{ + sudo_auth *auth; + int status; + debug_decl(sudo_auth_end_session, SUDOERS_DEBUG_AUTH) + + for (auth = auth_switch; auth->name; auth++) { + if (auth->end_session && !IS_DISABLED(auth)) { + status = (auth->end_session)(pw, auth); + if (status == AUTH_FATAL) { + /* Assume error msg already printed. */ + debug_return_int(-1); + } + } + } + debug_return_int(1); +} + +/* + * Prompts the user for a password using the conversation function. + * Returns the plaintext password or NULL. + * The user is responsible for freeing the returned value. + */ +char * +auth_getpass(const char *prompt, int type, struct sudo_conv_callback *callback) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + sigset_t mask, omask; + debug_decl(auth_getpass, SUDOERS_DEBUG_AUTH) + + /* Mask user input if pwfeedback set and echo is off. */ + if (type == SUDO_CONV_PROMPT_ECHO_OFF && def_pwfeedback) + type = SUDO_CONV_PROMPT_MASK; + + /* If visiblepw set, do not error out if there is no tty. */ + if (def_visiblepw) + type |= SUDO_CONV_PROMPT_ECHO_OK; + + /* Unblock SIGINT and SIGQUIT during password entry. */ + /* XXX - do in tgetpass() itself instead? */ + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, &omask); + + /* Call conversation function. */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = type; + msg.timeout = def_passwd_timeout.tv_sec; + msg.msg = prompt; + memset(&repl, 0, sizeof(repl)); + sudo_conv(1, &msg, &repl, callback); + /* XXX - check for ENOTTY? */ + + /* Restore previous signal mask. */ + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_str_masked(repl.reply); +} + +void +dump_auth_methods(void) +{ + sudo_auth *auth; + debug_decl(dump_auth_methods, SUDOERS_DEBUG_AUTH) + + sudo_printf(SUDO_CONV_INFO_MSG, _("Authentication methods:")); + for (auth = auth_switch; auth->name; auth++) + sudo_printf(SUDO_CONV_INFO_MSG, " '%s'", auth->name); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.h b/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.h new file mode 100644 index 0000000..e14d077 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/auth/sudo_auth.h @@ -0,0 +1,104 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2016, 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_AUTH_H +#define SUDO_AUTH_H + +/* Auth function return values. */ +#define AUTH_SUCCESS 0 +#define AUTH_FAILURE 1 +#define AUTH_INTR 2 +#define AUTH_FATAL 3 + +typedef struct sudo_auth { + int flags; /* various flags, see below */ + int status; /* status from verify routine */ + char *name; /* name of the method as a string */ + void *data; /* method-specific data pointer */ + int (*init)(struct passwd *pw, struct sudo_auth *auth); + int (*setup)(struct passwd *pw, char **prompt, struct sudo_auth *auth); + int (*verify)(struct passwd *pw, char *p, struct sudo_auth *auth, struct sudo_conv_callback *callback); + int (*approval)(struct passwd *pw, struct sudo_auth *auth, bool exempt); + int (*cleanup)(struct passwd *pw, struct sudo_auth *auth); + int (*begin_session)(struct passwd *pw, char **user_env[], struct sudo_auth *auth); + int (*end_session)(struct passwd *pw, struct sudo_auth *auth); +} sudo_auth; + +/* Values for sudo_auth.flags. */ +#define FLAG_DISABLED 0x02 /* method disabled */ +#define FLAG_STANDALONE 0x04 /* standalone auth method */ +#define FLAG_ONEANDONLY 0x08 /* one and only auth method */ + +/* Shortcuts for using the flags above. */ +#define IS_DISABLED(x) ((x)->flags & FLAG_DISABLED) +#define IS_STANDALONE(x) ((x)->flags & FLAG_STANDALONE) +#define IS_ONEANDONLY(x) ((x)->flags & FLAG_ONEANDONLY) + +/* Like tgetpass() but uses conversation function */ +char *auth_getpass(const char *prompt, int type, struct sudo_conv_callback *callback); + +/* Pointer to conversation function to use with auth_getpass(). */ +extern sudo_conv_t sudo_conv; + +/* Prototypes for standalone methods */ +int bsdauth_init(struct passwd *pw, sudo_auth *auth); +int bsdauth_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int bsdauth_approval(struct passwd *pw, sudo_auth *auth, bool exempt); +int bsdauth_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_aix_init(struct passwd *pw, sudo_auth *auth); +int sudo_aix_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_aix_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_fwtk_init(struct passwd *pw, sudo_auth *auth); +int sudo_fwtk_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_fwtk_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_pam_init(struct passwd *pw, sudo_auth *auth); +int sudo_pam_init_quiet(struct passwd *pw, sudo_auth *auth); +int sudo_pam_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_pam_approval(struct passwd *pw, sudo_auth *auth, bool exempt); +int sudo_pam_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_pam_begin_session(struct passwd *pw, char **user_env[], sudo_auth *auth); +int sudo_pam_end_session(struct passwd *pw, sudo_auth *auth); +int sudo_securid_init(struct passwd *pw, sudo_auth *auth); +int sudo_securid_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_securid_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_sia_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_sia_verify(struct passwd *pw, char *prompt, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_sia_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_sia_begin_session(struct passwd *pw, char **user_env[], sudo_auth *auth); + +/* Prototypes for normal methods */ +int sudo_afs_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_dce_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_krb5_init(struct passwd *pw, sudo_auth *auth); +int sudo_krb5_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_krb5_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_krb5_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_passwd_init(struct passwd *pw, sudo_auth *auth); +int sudo_passwd_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_passwd_cleanup(struct passwd *pw, sudo_auth *auth); +int sudo_rfc1938_setup(struct passwd *pw, char **prompt, sudo_auth *auth); +int sudo_rfc1938_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_secureware_init(struct passwd *pw, sudo_auth *auth); +int sudo_secureware_verify(struct passwd *pw, char *pass, sudo_auth *auth, struct sudo_conv_callback *callback); +int sudo_secureware_cleanup(struct passwd *pw, sudo_auth *auth); + +/* Fields: name, flags, init, setup, verify, approval, cleanup, begin_sess, end_sess */ +#define AUTH_ENTRY(n, f, i, s, v, a, c, b, e) \ + { (f), AUTH_FAILURE, (n), NULL, (i), (s), (v), (a), (c) , (b), (e) }, + +#endif /* SUDO_AUTH_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/base64.c b/utsudo-0.0.2/plugins/sudoers/base64.c new file mode 100644 index 0000000..3d86ae6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/base64.c @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include "sudoers.h" + +/* + * Derived from code with the following declaration: + * PUBLIC DOMAIN - Jon Mayo - November 13, 2003 + */ + +static const unsigned char base64dec_tab[256]= { + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, + 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, + 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +}; + +/* + * Decode a NUL-terminated string in base64 format and store the + * result in dst. + */ +size_t +base64_decode(const char *in, unsigned char *out, size_t out_size) +{ + unsigned char *out_end = out + out_size; + const unsigned char *out0 = out; + unsigned int rem, v; + debug_decl(base64_decode, SUDOERS_DEBUG_MATCH) + + for (v = 0, rem = 0; *in != '\0' && *in != '='; in++) { + unsigned char ch = base64dec_tab[(unsigned char)*in]; + if (ch == 255) + debug_return_size_t((size_t)-1); + v = (v << 6) | ch; + rem += 6; + if (rem >= 8) { + rem -= 8; + if (out >= out_end) + debug_return_size_t((size_t)-1); + *out++ = (v >> rem) & 0xff; + } + } + if (rem >= 8) { + if (out >= out_end) + debug_return_size_t((size_t)-1); + *out++ = (v >> rem) & 0xff; + } + debug_return_size_t((size_t)(out - out0)); +} + +static const unsigned char base64enc_tab[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +size_t +base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len) +{ + size_t ii, io; + unsigned int rem, v; + debug_decl(base64_encode, SUDOERS_DEBUG_MATCH) + + for (io = 0, ii = 0, v = 0, rem = 0; ii < in_len; ii++) { + unsigned char ch = in[ii]; + v = (v << 8) | ch; + rem += 8; + while (rem >= 6) { + rem -= 6; + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = base64enc_tab[(v >> rem) & 63]; + } + } + if (rem != 0) { + v <<= (6 - rem); + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = base64enc_tab[v&63]; + } + while (io & 3) { + if (io >= out_len) + debug_return_size_t((size_t)-1); /* truncation is failure */ + out[io++] = '='; + } + if (io >= out_len) + debug_return_size_t((size_t)-1); /* no room for NUL terminator */ + out[io] = '\0'; + debug_return_size_t(io); +} diff --git a/utsudo-0.0.2/plugins/sudoers/boottime.c b/utsudo-0.0.2/plugins/sudoers/boottime.c new file mode 100644 index 0000000..a8b0ce6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/boottime.c @@ -0,0 +1,177 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015, 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#ifndef __linux__ +# if defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME) +# include +# elif defined(HAVE_GETUTXID) +# include +# elif defined(HAVE_GETUTID) +# include +# endif +#endif /* !__linux__ */ + +#include "sudoers.h" + +/* + * Fill in a struct timespec with the time the system booted. + * Returns 1 on success and 0 on failure. + */ + +#if defined(__linux__) +bool +get_boottime(struct timespec *ts) +{ + char *line = NULL; + size_t linesize = 0; + bool found = false; + long long llval; + ssize_t len; + FILE *fp; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL) + + /* read btime from /proc/stat */ + fp = fopen("/proc/stat", "r"); + if (fp != NULL) { + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + if (strncmp(line, "btime ", 6) == 0) { + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + llval = sudo_strtonum(line + 6, 1, LLONG_MAX, NULL); + if (llval > 0) { + ts->tv_sec = (time_t)llval; + ts->tv_nsec = 0; + found = true; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found btime in /proc/stat: %lld", llval); + break; + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid btime in /proc/stat: %s", line); + } + } + } + fclose(fp); + free(line); + } + + debug_return_bool(found); +} + +#elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME) + +bool +get_boottime(struct timespec *ts) +{ + size_t size; + int mib[2]; + struct timeval tv; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL) + + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + size = sizeof(tv); + if (sysctl(mib, 2, &tv, &size, NULL, 0) != -1) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "KERN_BOOTTIME: %lld, %ld", (long long)tv.tv_sec, (long)tv.tv_usec); + TIMEVAL_TO_TIMESPEC(&tv, ts); + debug_return_bool(true); + } + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "KERN_BOOTTIME: %s", strerror(errno)); + debug_return_bool(false); +} + +#elif defined(HAVE_GETUTXID) + +bool +get_boottime(struct timespec *ts) +{ + struct utmpx *ut, key; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL) + + memset(&key, 0, sizeof(key)); + key.ut_type = BOOT_TIME; + setutxent(); + if ((ut = getutxid(&key)) != NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "BOOT_TIME: %lld, %ld", (long long)ut->ut_tv.tv_sec, + (long)ut->ut_tv.tv_usec); + TIMEVAL_TO_TIMESPEC(&ut->ut_tv, ts); + } + endutxent(); + debug_return_bool(ut != NULL); +} + +#elif defined(HAVE_GETUTID) + +bool +get_boottime(struct timespec *ts) +{ + struct utmp *ut, key; + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL) + + memset(&key, 0, sizeof(key)); + key.ut_type = BOOT_TIME; + setutent(); + if ((ut = getutid(&key)) != NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "BOOT_TIME: %lld", (long long)ut->ut_time); + ts->tv_sec = ut->ut_time; + ts->tv_nsec = 0; + } + endutent(); + debug_return_bool(ut != NULL); +} + +#else + +bool +get_boottime(struct timespec *ts) +{ + debug_decl(get_boottime, SUDOERS_DEBUG_UTIL) + debug_return_bool(false); +} +#endif diff --git a/utsudo-0.0.2/plugins/sudoers/bsm_audit.c b/utsudo-0.0.2/plugins/sudoers/bsm_audit.c new file mode 100644 index 0000000..bbb8525 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/bsm_audit.c @@ -0,0 +1,287 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015 Todd C. Miller + * Copyright (c) 2009 Christian S.J. Peron + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_BSM_AUDIT + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "bsm_audit.h" + +/* + * Solaris auditon() returns EINVAL if BSM audit not configured. + * OpenBSM returns ENOSYS for unimplemented options. + */ +#ifdef __sun +# define AUDIT_NOT_CONFIGURED EINVAL +#else +# define AUDIT_NOT_CONFIGURED ENOSYS +#endif + +#ifdef __FreeBSD__ +# define BSM_AUDIT_COMPAT +#endif + +static au_event_t sudo_audit_event = AUE_sudo; + +static int +audit_sudo_selected(int sorf) +{ + auditinfo_addr_t ainfo_addr; + struct au_mask *mask; + int rc; + debug_decl(audit_sudo_selected, SUDOERS_DEBUG_AUDIT) + + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) < 0) { +#ifdef BSM_AUDIT_COMPAT + if (errno == ENOSYS) { + auditinfo_t ainfo; + + /* Fall back to older BSM API. */ + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + mask = &ainfo.ai_mask; + } else +#endif /* BSM_AUDIT_COMPAT */ + { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + } else { + mask = &ainfo_addr.ai_mask; + } + rc = au_preselect(sudo_audit_event, mask, sorf, AU_PRS_REREAD); + if (rc == -1) { +#if defined(__APPLE__) && defined(AUE_DARWIN_sudo) + /* + * Mac OS X 10.10 au_preselect() only accepts AUE_DARWIN_sudo. + */ + sudo_audit_event = AUE_DARWIN_sudo; + rc = au_preselect(sudo_audit_event, mask, sorf, AU_PRS_REREAD); + if (rc == -1) +#endif + + sudo_warn("au_preselect"); + } + debug_return_int(rc); +} + +/* + * Returns 0 on success or -1 on error. + */ +int +bsm_audit_success(char *exec_args[]) +{ + auditinfo_addr_t ainfo_addr; + token_t *tok; + au_id_t auid; + long au_cond; + int aufd, selected; + pid_t pid; + debug_decl(bsm_audit_success, SUDOERS_DEBUG_AUDIT) + + /* + * If we are not auditing, don't cut an audit record; just return. + */ + if (auditon(A_GETCOND, (caddr_t)&au_cond, sizeof(long)) < 0) { + if (errno == AUDIT_NOT_CONFIGURED) + debug_return_int(0); + sudo_warn(U_("Could not determine audit condition")); + debug_return_int(-1); + } + if (au_cond == AUC_NOAUDIT) + debug_return_int(0); + /* + * Check to see if the preselection masks are interested in seeing + * this event. + */ + selected = audit_sudo_selected(AU_PRS_SUCCESS); + if (selected != 1) + debug_return_int(!selected ? 0 : -1); + if (getauid(&auid) < 0) { + sudo_warn("getauid"); + debug_return_int(-1); + } + if ((aufd = au_open()) == -1) { + sudo_warn("au_open"); + debug_return_int(-1); + } + pid = getpid(); + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) == 0) { + tok = au_to_subject_ex(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo_addr.ai_termid); +#ifdef BSM_AUDIT_COMPAT + } else if (errno == ENOSYS) { + auditinfo_t ainfo; + + /* + * NB: We should probably watch out for ERANGE here. + */ + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + tok = au_to_subject(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo.ai_termid); +#endif /* BSM_AUDIT_COMPAT */ + } else { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + if (tok == NULL) { + sudo_warn("au_to_subject"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_exec_args(exec_args); + if (tok == NULL) { + sudo_warn("au_to_exec_args"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_return32(0, 0); + if (tok == NULL) { + sudo_warn("au_to_return32"); + debug_return_int(-1); + } + au_write(aufd, tok); +#ifdef HAVE_AU_CLOSE_SOLARIS11 + if (au_close(aufd, 1, sudo_audit_event, 0) == -1) +#else + if (au_close(aufd, 1, sudo_audit_event) == -1) +#endif + { + sudo_warn(U_("unable to commit audit record")); + debug_return_int(-1); + } + debug_return_int(0); +} + +/* + * Returns 0 on success or -1 on error. + */ +int +bsm_audit_failure(char *exec_args[], char const *const fmt, va_list ap) +{ + auditinfo_addr_t ainfo_addr; + char text[256]; + token_t *tok; + long au_cond; + au_id_t auid; + pid_t pid; + int aufd; + debug_decl(bsm_audit_success, SUDOERS_DEBUG_AUDIT) + + /* + * If we are not auditing, don't cut an audit record; just return. + */ + if (auditon(A_GETCOND, (caddr_t)&au_cond, sizeof(long)) < 0) { + if (errno == AUDIT_NOT_CONFIGURED) + debug_return_int(0); + sudo_warn(U_("Could not determine audit condition")); + debug_return_int(-1); + } + if (au_cond == AUC_NOAUDIT) + debug_return_int(0); + if (!audit_sudo_selected(AU_PRS_FAILURE)) + debug_return_int(0); + if (getauid(&auid) < 0) { + sudo_warn("getauid"); + debug_return_int(-1); + } + if ((aufd = au_open()) == -1) { + sudo_warn("au_open"); + debug_return_int(-1); + } + pid = getpid(); + if (getaudit_addr(&ainfo_addr, sizeof(ainfo_addr)) == 0) { + tok = au_to_subject_ex(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo_addr.ai_termid); +#ifdef BSM_AUDIT_COMPAT + } else if (errno == ENOSYS) { + auditinfo_t ainfo; + + if (getaudit(&ainfo) < 0) { + sudo_warn("getaudit"); + debug_return_int(-1); + } + tok = au_to_subject(auid, geteuid(), getegid(), getuid(), + getuid(), pid, pid, &ainfo.ai_termid); +#endif /* BSM_AUDIT_COMPAT */ + } else { + sudo_warn("getaudit_addr"); + debug_return_int(-1); + } + if (tok == NULL) { + sudo_warn("au_to_subject"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_exec_args(exec_args); + if (tok == NULL) { + sudo_warn("au_to_exec_args"); + debug_return_int(-1); + } + au_write(aufd, tok); + (void) vsnprintf(text, sizeof(text), fmt, ap); + tok = au_to_text(text); + if (tok == NULL) { + sudo_warn("au_to_text"); + debug_return_int(-1); + } + au_write(aufd, tok); + tok = au_to_return32(EPERM, 1); + if (tok == NULL) { + sudo_warn("au_to_return32"); + debug_return_int(-1); + } + au_write(aufd, tok); +#ifdef HAVE_AU_CLOSE_SOLARIS11 + if (au_close(aufd, 1, sudo_audit_event, PAD_FAILURE) == -1) +#else + if (au_close(aufd, 1, sudo_audit_event) == -1) +#endif + { + sudo_warn(U_("unable to commit audit record")); + debug_return_int(-1); + } + debug_return_int(0); +} + +#endif /* HAVE_BSM_AUDIT */ diff --git a/utsudo-0.0.2/plugins/sudoers/bsm_audit.h b/utsudo-0.0.2/plugins/sudoers/bsm_audit.h new file mode 100644 index 0000000..cc85cee --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/bsm_audit.h @@ -0,0 +1,26 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2010, 2013-2014 Todd C. Miller + * Copyright (c) 2009 Christian S.J. Peron + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_BSM_AUDIT_H +#define SUDOERS_BSM_AUDIT_H + +int bsm_audit_success(char *argv[]); +int bsm_audit_failure(char *argv[], char const * const, va_list); + +#endif /* SUDOERS_BSM_AUDIT_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/check.c b/utsudo-0.0.2/plugins/sudoers/check.c new file mode 100644 index 0000000..3a18e0c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/check.c @@ -0,0 +1,355 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +static bool display_lecture(int); +static struct passwd *get_authpw(int); + +struct getpass_closure { + int tstat; + void *cookie; + struct passwd *auth_pw; +}; + +/* + * Called when getpass is suspended so we can drop the lock. + */ +static int +getpass_suspend(int signo, void *vclosure) +{ + struct getpass_closure *closure = vclosure; + + timestamp_close(closure->cookie); + closure->cookie = NULL; + return 0; +} + +/* + * Called when getpass is resumed so we can reacquire the lock. + */ +static int +getpass_resume(int signo, void *vclosure) +{ + struct getpass_closure *closure = vclosure; + + closure->cookie = timestamp_open(user_name, user_sid); + if (closure->cookie == NULL) + return -1; + if (!timestamp_lock(closure->cookie, closure->auth_pw)) + return -1; + return 0; +} + +/* + * Returns true if the user successfully authenticates, false if not + * or -1 on fatal error. + */ +static int +check_user_interactive(int validated, int mode, struct getpass_closure *closure) +{ + struct sudo_conv_callback cb, *callback = NULL; + int ret = -1; + char *prompt; + bool lectured; + debug_decl(check_user_interactive, SUDOERS_DEBUG_AUTH) + + /* Open, lock and read time stamp file if we are using it. */ + if (!ISSET(mode, MODE_IGNORE_TICKET)) { + /* Open time stamp file and check its status. */ + closure->cookie = timestamp_open(user_name, user_sid); + if (timestamp_lock(closure->cookie, closure->auth_pw)) + closure->tstat = timestamp_status(closure->cookie, closure->auth_pw); + + /* Construct callback for getpass function. */ + memset(&cb, 0, sizeof(cb)); + cb.version = SUDO_CONV_CALLBACK_VERSION; + cb.closure = closure; + cb.on_suspend = getpass_suspend; + cb.on_resume = getpass_resume; + callback = &cb; + } + + switch (closure->tstat) { + case TS_FATAL: + /* Fatal error (usually setuid failure), unsafe to proceed. */ + goto done; + + case TS_CURRENT: + /* Time stamp file is valid and current. */ + if (!ISSET(validated, FLAG_CHECK_USER)) { + ret = true; + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: check user flag overrides time stamp", __func__); + /* FALLTHROUGH */ + + default: + /* Bail out if we are non-interactive and a password is required */ + if (ISSET(mode, MODE_NONINTERACTIVE)) { + validated |= FLAG_NON_INTERACTIVE; + log_auth_failure(validated, 0); + goto done; + } + + /* XXX - should not lecture if askpass helper is being used. */ + lectured = display_lecture(closure->tstat); + + /* Expand any escapes in the prompt. */ + prompt = expand_prompt(user_prompt ? user_prompt : def_passprompt, + closure->auth_pw->pw_name); + if (prompt == NULL) + goto done; + + ret = verify_user(closure->auth_pw, prompt, validated, callback); + if (ret == true && lectured) + (void)set_lectured(); /* lecture error not fatal */ + free(prompt); + break; + } + +done: + debug_return_int(ret); +} + +/* + * Returns true if the user successfully authenticates, false if not + * or -1 on error. + */ +int +check_user(int validated, int mode) +{ + struct getpass_closure closure = { TS_ERROR }; + int ret = -1; + bool exempt = false; + debug_decl(check_user, SUDOERS_DEBUG_AUTH) + + /* + * Init authentication system regardless of whether we need a password. + * Required for proper PAM session support. + */ + if ((closure.auth_pw = get_authpw(mode)) == NULL) + goto done; + if (sudo_auth_init(closure.auth_pw) == -1) + goto done; + + /* + * Don't prompt for the root passwd or if the user is exempt. + * If the user is not changing uid/gid, no need for a password. + */ + if (!def_authenticate || user_is_exempt()) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s", __func__, + !def_authenticate ? "authentication disabled" : + "user exempt from authentication"); + exempt = true; + ret = true; + goto done; + } + if (user_uid == 0 || (user_uid == runas_pw->pw_uid && + (!runas_gr || user_in_group(sudo_user.pw, runas_gr->gr_name)))) { +#ifdef HAVE_SELINUX + if (user_role == NULL && user_type == NULL) +#endif +#ifdef HAVE_PRIV_SET + if (runas_privs == NULL && runas_limitprivs == NULL) +#endif + { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: user running command as self", __func__); + ret = true; + goto done; + } + } + + ret = check_user_interactive(validated, mode, &closure); + +done: + if (ret == true) { + /* The approval function may disallow a user post-authentication. */ + ret = sudo_auth_approval(closure.auth_pw, validated, exempt); + + /* + * Only update time stamp if user validated and was approved. + * Failure to update the time stamp is not a fatal error. + */ + if (ret == true && closure.tstat != TS_ERROR) { + if (ISSET(validated, VALIDATE_SUCCESS)) + (void)timestamp_update(closure.cookie, closure.auth_pw); + } + } + timestamp_close(closure.cookie); + sudo_auth_cleanup(closure.auth_pw); + if (closure.auth_pw != NULL) + sudo_pw_delref(closure.auth_pw); + + debug_return_int(ret); +} + +/* + * Display sudo lecture (standard or custom). + * Returns true if the user was lectured, else false. + */ +static bool +display_lecture(int status) +{ + FILE *fp; + char buf[BUFSIZ]; + ssize_t nread; + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + debug_decl(lecture, SUDOERS_DEBUG_AUTH) + + if (def_lecture == never || + (def_lecture == once && already_lectured(status))) + debug_return_bool(false); + + memset(&msg, 0, sizeof(msg)); + memset(&repl, 0, sizeof(repl)); + + if (def_lecture_file && (fp = fopen(def_lecture_file, "r")) != NULL) { + while ((nread = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) != 0) { + buf[nread] = '\0'; + msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY; + msg.msg = buf; + sudo_conv(1, &msg, &repl, NULL); + } + fclose(fp); + } else { + msg.msg_type = SUDO_CONV_ERROR_MSG|SUDO_CONV_PREFER_TTY; + msg.msg = _("\n" + "We trust you have received the usual lecture from the local System\n" + "Administrator. It usually boils down to these three things:\n\n" + " #1) Respect the privacy of others.\n" + " #2) Think before you type.\n" + " #3) With great power comes great responsibility.\n\n"); + sudo_conv(1, &msg, &repl, NULL); + } + debug_return_bool(true); +} + +/* + * Checks if the user is exempt from supplying a password. + */ +bool +user_is_exempt(void) +{ + bool ret = false; + debug_decl(user_is_exempt, SUDOERS_DEBUG_AUTH) + + if (def_exempt_group) + ret = user_in_group(sudo_user.pw, def_exempt_group); + debug_return_bool(ret); +} + +/* + * Get passwd entry for the user we are going to authenticate as. + * By default, this is the user invoking sudo. In the most common + * case, this matches sudo_user.pw or runas_pw. + */ +static struct passwd * +get_authpw(int mode) +{ + struct passwd *pw = NULL; + debug_decl(get_authpw, SUDOERS_DEBUG_AUTH) + + if (ISSET(mode, (MODE_CHECK|MODE_LIST))) { + /* In list mode we always prompt for the user's password. */ + sudo_pw_addref(sudo_user.pw); + pw = sudo_user.pw; + } else { + if (def_rootpw) { + if ((pw = sudo_getpwuid(ROOT_UID)) == NULL) { + log_warningx(SLOG_SEND_MAIL, N_("unknown uid: %u"), ROOT_UID); + } + } else if (def_runaspw) { + if ((pw = sudo_getpwnam(def_runas_default)) == NULL) { + log_warningx(SLOG_SEND_MAIL, + N_("unknown user: %s"), def_runas_default); + } + } else if (def_targetpw) { + if (runas_pw->pw_name == NULL) { + /* This should never be NULL as we fake up the passwd struct */ + log_warningx(SLOG_RAW_MSG, N_("unknown uid: %u"), + (unsigned int) runas_pw->pw_uid); + } else { + sudo_pw_addref(runas_pw); + pw = runas_pw; + } + } else { + sudo_pw_addref(sudo_user.pw); + pw = sudo_user.pw; + } + } + + debug_return_ptr(pw); +} + +/* + * Returns true if the specified shell is allowed by /etc/shells, else false. + */ +bool +check_user_shell(const struct passwd *pw) +{ + const char *shell; + debug_decl(check_user_shell, SUDOERS_DEBUG_AUTH) + + if (!def_runas_check_shell) + debug_return_bool(true); + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: checking /etc/shells for %s", __func__, pw->pw_shell); + + setusershell(); + while ((shell = getusershell()) != NULL) { + if (strcmp(shell, pw->pw_shell) == 0) + debug_return_bool(true); + } + endusershell(); + + debug_return_bool(false); +} diff --git a/utsudo-0.0.2/plugins/sudoers/check.h b/utsudo-0.0.2/plugins/sudoers/check.h new file mode 100644 index 0000000..39c61fc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/check.h @@ -0,0 +1,89 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2014 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_CHECK_H +#define SUDOERS_CHECK_H + +/* Status codes for timestamp_status() */ +#define TS_CURRENT 0 +#define TS_OLD 1 +#define TS_MISSING 2 +#define TS_ERROR 3 +#define TS_FATAL 4 + +/* + * Time stamps are now stored in a single file which contains multiple + * records. Each record starts with a 16-bit version number and a 16-bit + * record size. Multiple record types can coexist in the same file. + */ +#define TS_VERSION 2 + +/* Time stamp entry types */ +#define TS_GLOBAL 0x01 /* not restricted by tty or ppid */ +#define TS_TTY 0x02 /* restricted by tty */ +#define TS_PPID 0x03 /* restricted by ppid */ +#define TS_LOCKEXCL 0x04 /* special lock record */ + +/* Time stamp flags */ +#define TS_DISABLED 0x01 /* entry disabled */ +#define TS_ANYUID 0x02 /* ignore uid, only valid in the key */ + +struct timestamp_entry_v1 { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ + uid_t auth_uid; /* uid to authenticate as */ + pid_t sid; /* session ID associated with tty/ppid */ + struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ + union { + dev_t ttydev; /* tty device number */ + pid_t ppid; /* parent pid */ + } u; +}; + +struct timestamp_entry { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ + uid_t auth_uid; /* uid to authenticate as */ + pid_t sid; /* session ID associated with tty/ppid */ + struct timespec start_time; /* session/ppid start time */ + struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */ + union { + dev_t ttydev; /* tty device number */ + pid_t ppid; /* parent pid */ + } u; +}; + +void *timestamp_open(const char *user, pid_t sid); +void timestamp_close(void *vcookie); +bool timestamp_lock(void *vcookie, struct passwd *pw); +bool timestamp_update(void *vcookie, struct passwd *pw); +int timestamp_status(void *vcookie, struct passwd *pw); +int get_starttime(pid_t pid, struct timespec *starttime); +bool already_lectured(int status); +int set_lectured(void); + +#endif /* SUDOERS_CHECK_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/cvtsudoers.c b/utsudo-0.0.2/plugins/sudoers/cvtsudoers.c new file mode 100644 index 0000000..5b24bb2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/cvtsudoers.c @@ -0,0 +1,1344 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Convert from the sudoers file format to LDIF or JSON format. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudoers_version.h" +#include "sudo_lbuf.h" +#include "redblack.h" +#include "cvtsudoers.h" +#include + +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +/* + * Globals + */ +struct cvtsudoers_filter *filters; +struct sudo_user sudo_user; +struct passwd *list_pw; +static const char short_opts[] = "b:c:d:ef:hi:I:m:Mo:O:pP:s:V"; +static struct option long_opts[] = { + { "base", required_argument, NULL, 'b' }, + { "config", required_argument, NULL, 'c' }, + { "defaults", required_argument, NULL, 'd' }, + { "expand-aliases", no_argument, NULL, 'e' }, + { "output-format", required_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "input-format", required_argument, NULL, 'i' }, + { "increment", required_argument, NULL, 'I' }, + { "match", required_argument, NULL, 'm' }, + { "match-local", no_argument, NULL, 'M' }, + { "prune-matches", no_argument, NULL, 'p' }, + { "padding", required_argument, NULL, 'P' }, + { "order-start", required_argument, NULL, 'O' }, + { "output", required_argument, NULL, 'o' }, + { "suppress", required_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +__dso_public int main(int argc, char *argv[]); +static void help(void) __attribute__((__noreturn__)); +static void usage(int); +static bool convert_sudoers_sudoers(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); +static bool parse_sudoers(const char *input_file, struct cvtsudoers_config *conf); +static bool parse_ldif(struct sudoers_parse_tree *parse_tree, const char *input_file, struct cvtsudoers_config *conf); +static bool cvtsudoers_parse_filter(char *expression); +static struct cvtsudoers_config *cvtsudoers_conf_read(const char *conf_file); +static void cvtsudoers_conf_free(struct cvtsudoers_config *conf); +static int cvtsudoers_parse_defaults(char *expression); +static int cvtsudoers_parse_suppression(char *expression); +static void filter_userspecs(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); +static void filter_defaults(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); +static void alias_remove_unused(struct sudoers_parse_tree *parse_tree); +static void alias_prune(struct sudoers_parse_tree *parse_tree, struct cvtsudoers_config *conf); + +int +main(int argc, char *argv[]) +{ + int ch, exitcode = EXIT_FAILURE; + enum sudoers_formats output_format = format_ldif; + enum sudoers_formats input_format = format_sudoers; + struct cvtsudoers_config *conf = NULL; + bool match_local = false; + const char *input_file = "-"; + const char *output_file = "-"; + const char *conf_file = _PATH_CVTSUDOERS_CONF; + const char *errstr; + debug_decl(main, SUDOERS_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "cvtsudoers"); + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); + textdomain("sudoers"); + + /* Read debug and plugin sections of sudo.conf. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG|SUDO_CONF_PLUGINS) == -1) + goto done; + + /* Initialize the debug subsystem. */ + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + goto done; + + /* Check for --config option first (no getopt warnings). */ + opterr = 0; + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'c': + conf_file = optarg; + break; + } + } + + /* Read conf file. */ + conf = cvtsudoers_conf_read(conf_file); + + /* + * Reset getopt and handle the rest of the arguments. + */ + opterr = 1; + optind = 1; +#ifdef HAVE_OPTRESET + optreset = 1; +#endif + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'b': + free(conf->sudoers_base); + conf->sudoers_base = strdup(optarg); + if (conf->sudoers_base == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'c': + /* handled above */ + break; + case 'd': + conf->defstr = optarg; + break; + case 'e': + conf->expand_aliases = true; + break; + case 'f': + free(conf->output_format); + conf->output_format = strdup(optarg); + if (conf->output_format == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'h': + help(); + break; + case 'i': + free(conf->input_format); + conf->input_format = strdup(optarg); + if (conf->input_format == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + break; + case 'I': + conf->order_increment = sudo_strtonum(optarg, 1, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("order increment: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 'm': + conf->filter = optarg; + break; + case 'M': + match_local = true; + break; + case 'o': + output_file = optarg; + break; + case 'O': + conf->sudo_order = sudo_strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("starting order: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 'p': + conf->prune_matches = true; + break; + case 'P': + conf->order_padding = sudo_strtonum(optarg, 1, UINT_MAX, &errstr); + if (errstr != NULL ) { + sudo_warnx(U_("order padding: %s: %s"), optarg, U_(errstr)); + usage(1); + } + break; + case 's': + conf->supstr = optarg; + break; + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), + PACKAGE_VERSION); + (void) printf(_("%s grammar version %d\n"), getprogname(), + SUDOERS_GRAMMAR_VERSION); + exitcode = EXIT_SUCCESS; + goto done; + default: + usage(1); + } + } + argc -= optind; + argv += optind; + + if (conf->input_format != NULL) { + if (strcasecmp(conf->input_format, "ldif") == 0) { + input_format = format_ldif; + } else if (strcasecmp(conf->input_format, "sudoers") == 0) { + input_format = format_sudoers; + } else { + sudo_warnx(U_("unsupported input format %s"), conf->input_format); + usage(1); + } + } + if (conf->output_format != NULL) { + if (strcasecmp(conf->output_format, "json") == 0) { + output_format = format_json; + conf->store_options = true; + } else if (strcasecmp(conf->output_format, "ldif") == 0) { + output_format = format_ldif; + conf->store_options = true; + } else if (strcasecmp(conf->output_format, "sudoers") == 0) { + output_format = format_sudoers; + conf->store_options = false; + } else { + sudo_warnx(U_("unsupported output format %s"), conf->output_format); + usage(1); + } + } + if (conf->filter != NULL) { + /* We always expand aliases when filtering (may change in future). */ + if (!cvtsudoers_parse_filter(conf->filter)) + usage(1); + } + if (conf->defstr != NULL) { + conf->defaults = cvtsudoers_parse_defaults(conf->defstr); + if (conf->defaults == -1) + usage(1); + } + if (conf->supstr != NULL) { + conf->suppress = cvtsudoers_parse_suppression(conf->supstr); + if (conf->suppress == -1) + usage(1); + } + + /* Apply padding to sudo_order if present. */ + if (conf->sudo_order != 0 && conf->order_padding != 0) { + unsigned int multiplier = 1; + + do { + multiplier *= 10; + } while (--conf->order_padding != 0); + conf->sudo_order *= multiplier; + conf->order_max = conf->sudo_order + (multiplier - 1); + conf->order_padding = multiplier; + } + + /* If no base DN specified, check SUDOERS_BASE. */ + if (conf->sudoers_base == NULL) { + conf->sudoers_base = getenv("SUDOERS_BASE"); + if (conf->sudoers_base != NULL && *conf->sudoers_base != '\0') { + if ((conf->sudoers_base = strdup(conf->sudoers_base)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + } + + /* Input file (defaults to stdin). */ + if (argc > 0) { + if (argc > 1) + usage(1); + input_file = argv[0]; + } + + if (strcmp(input_file, "-") != 0) { + if (strcmp(input_file, output_file) == 0) { + sudo_fatalx(U_("%s: input and output files must be different"), + input_file); + } + } + + /* Set pwutil backend to use the filter data. */ + if (conf->filter != NULL && !match_local) { + sudo_pwutil_set_backend(cvtsudoers_make_pwitem, cvtsudoers_make_gritem, + cvtsudoers_make_gidlist_item, cvtsudoers_make_grlist_item); + } + + /* We may need the hostname to resolve %h escapes in include files. */ + get_hostname(); + + /* Setup defaults data structures. */ + if (!init_defaults()) + sudo_fatalx(U_("unable to initialize sudoers default values")); + + switch (input_format) { + case format_ldif: + if (!parse_ldif(&parsed_policy, input_file, conf)) + goto done; + break; + case format_sudoers: + if (!parse_sudoers(input_file, conf)) + goto done; + break; + default: + sudo_fatalx("error: unhandled input %d", input_format); + } + + /* + * cvtsudoers group filtering doesn't work if def_match_group_by_gid + * is set to true by default (at compile-time). It cannot be set to false + * because cvtsudoers doesn't apply the parsed Defaults. + * + * Related: sudo-1.8.23-legacy-group-processing.patch + */ + def_match_group_by_gid = def_legacy_group_processing = false; + + /* Apply filters. */ + filter_userspecs(&parsed_policy, conf); + filter_defaults(&parsed_policy, conf); + if (filters != NULL) { + alias_remove_unused(&parsed_policy); + if (conf->prune_matches && conf->expand_aliases) + alias_prune(&parsed_policy, conf); + } + + switch (output_format) { + case format_json: + exitcode = !convert_sudoers_json(&parsed_policy, output_file, conf); + break; + case format_ldif: + exitcode = !convert_sudoers_ldif(&parsed_policy, output_file, conf); + break; + case format_sudoers: + exitcode = !convert_sudoers_sudoers(&parsed_policy, output_file, conf); + break; + default: + sudo_fatalx("error: unhandled output format %d", output_format); + } + +done: + cvtsudoers_conf_free(conf); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + return exitcode; +} + +/* + * cvtsudoers configuration data. + */ +static struct cvtsudoers_config cvtsudoers_config = INITIAL_CONFIG; +static struct cvtsudoers_conf_table cvtsudoers_conf_vars[] = { + { "order_start", CONF_UINT, &cvtsudoers_config.sudo_order }, + { "order_increment", CONF_UINT, &cvtsudoers_config.order_increment }, + { "order_padding", CONF_UINT, &cvtsudoers_config.order_padding }, + { "sudoers_base", CONF_STR, &cvtsudoers_config.sudoers_base }, + { "input_format", CONF_STR, &cvtsudoers_config.input_format }, + { "output_format", CONF_STR, &cvtsudoers_config.output_format }, + { "match", CONF_STR, &cvtsudoers_config.filter }, + { "defaults", CONF_STR, &cvtsudoers_config.defstr }, + { "suppress", CONF_STR, &cvtsudoers_config.supstr }, + { "expand_aliases", CONF_BOOL, &cvtsudoers_config.expand_aliases }, + { "prune_matches", CONF_BOOL, &cvtsudoers_config.prune_matches } +}; + +/* + * Look up keyword in config table. + * Returns true if found, else false. + */ +static bool +cvtsudoers_parse_keyword(const char *conf_file, const char *keyword, + const char *value, struct cvtsudoers_conf_table *table) +{ + struct cvtsudoers_conf_table *cur; + const char *errstr; + debug_decl(sudo_ldap_parse_keyword, SUDOERS_DEBUG_UTIL) + + /* Look up keyword in config tables */ + for (cur = table; cur->conf_str != NULL; cur++) { + if (strcasecmp(keyword, cur->conf_str) == 0) { + switch (cur->type) { + case CONF_BOOL: + *(bool *)(cur->valp) = sudo_strtobool(value) == true; + break; + case CONF_UINT: + { + unsigned int uval = + sudo_strtonum(value, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s: %s: %s"), + conf_file, keyword, value, U_(errstr)); + continue; + } + *(unsigned int *)(cur->valp) = uval; + } + break; + case CONF_STR: + { + char *cp = strdup(value); + if (cp == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + free(*(char **)(cur->valp)); + *(char **)(cur->valp) = cp; + break; + } + } + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +static struct cvtsudoers_config * +cvtsudoers_conf_read(const char *conf_file) +{ + char *line = NULL; + size_t linesize = 0; + FILE *fp; + debug_decl(cvtsudoers_conf_read, SUDOERS_DEBUG_UTIL) + + if ((fp = fopen(conf_file, "r")) == NULL) + debug_return_ptr(&cvtsudoers_config); + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + char *cp, *keyword, *value; + + if (*line == '\0') + continue; /* skip empty line */ + + /* Parse keyword = value */ + keyword = line; + if ((cp = strchr(line, '=')) == NULL) + continue; + value = cp-- + 1; + + /* Trim whitespace after keyword. */ + while (cp != line && isblank((unsigned char)cp[-1])) + cp--; + *cp = '\0'; + + /* Trim whitespace before value. */ + while (isblank((unsigned char)*value)) + value++; + + /* Look up keyword in config tables */ + if (!cvtsudoers_parse_keyword(conf_file, keyword, value, cvtsudoers_conf_vars)) + sudo_warnx(U_("%s: unknown key word: %s"), conf_file, keyword); + } + free(line); + fclose(fp); + + debug_return_ptr(&cvtsudoers_config); +} + +static void +cvtsudoers_conf_free(struct cvtsudoers_config *conf) +{ + debug_decl(cvtsudoers_conf_free, SUDOERS_DEBUG_UTIL) + + if (conf != NULL) { + free(conf->sudoers_base); + free(conf->input_format); + free(conf->output_format); + conf->sudoers_base = NULL; + conf->input_format = NULL; + conf->output_format = NULL; + } + + debug_return; +} + +static int +cvtsudoers_parse_defaults(char *expression) +{ + char *last, *cp = expression; + int flags = 0; + debug_decl(cvtsudoers_parse_defaults, SUDOERS_DEBUG_UTIL) + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + if (strcasecmp(cp, "all") == 0) { + SET(flags, CVT_DEFAULTS_ALL); + } else if (strcasecmp(cp, "global") == 0) { + SET(flags, CVT_DEFAULTS_GLOBAL); + } else if (strcasecmp(cp, "user") == 0) { + SET(flags, CVT_DEFAULTS_USER); + } else if (strcasecmp(cp, "runas") == 0) { + SET(flags, CVT_DEFAULTS_RUNAS); + } else if (strcasecmp(cp, "host") == 0) { + SET(flags, CVT_DEFAULTS_HOST); + } else if (strcasecmp(cp, "command") == 0) { + SET(flags, CVT_DEFAULTS_CMND); + } else { + sudo_warnx(U_("invalid defaults type: %s"), cp); + debug_return_int(-1); + } + } + + debug_return_int(flags); +} + +static int +cvtsudoers_parse_suppression(char *expression) +{ + char *last, *cp = expression; + int flags = 0; + debug_decl(cvtsudoers_parse_suppression, SUDOERS_DEBUG_UTIL) + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + if (strcasecmp(cp, "defaults") == 0) { + SET(flags, SUPPRESS_DEFAULTS); + } else if (strcasecmp(cp, "aliases") == 0) { + SET(flags, SUPPRESS_ALIASES); + } else if (strcasecmp(cp, "privileges") == 0 || strcasecmp(cp, "privs") == 0) { + SET(flags, SUPPRESS_PRIVS); + } else { + sudo_warnx(U_("invalid suppression type: %s"), cp); + debug_return_int(-1); + } + } + + debug_return_int(flags); +} + +static bool +cvtsudoers_parse_filter(char *expression) +{ + char *last, *cp = expression; + debug_decl(cvtsudoers_parse_filter, SUDOERS_DEBUG_UTIL) + + if (filters == NULL) { + if ((filters = malloc(sizeof(*filters))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + STAILQ_INIT(&filters->users); + STAILQ_INIT(&filters->groups); + STAILQ_INIT(&filters->hosts); + } + + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + /* + * Filter expression: + * user=foo,group=bar,host=baz + */ + char *keyword; + struct sudoers_string *s; + + if ((s = malloc(sizeof(*s))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + /* Parse keyword = value */ + keyword = cp; + if ((cp = strchr(cp, '=')) == NULL) { + sudo_warnx(U_("invalid filter: %s"), keyword);; + free(s); + debug_return_bool(false); + } + *cp++ = '\0'; + s->str = cp; + + if (strcmp(keyword, "user") == 0 ){ + STAILQ_INSERT_TAIL(&filters->users, s, entries); + } else if (strcmp(keyword, "group") == 0 ){ + STAILQ_INSERT_TAIL(&filters->groups, s, entries); + } else if (strcmp(keyword, "host") == 0 ){ + STAILQ_INSERT_TAIL(&filters->hosts, s, entries); + } else { + sudo_warnx(U_("invalid filter: %s"), keyword);; + free(s); + debug_return_bool(false); + } + } + + debug_return_bool(true); +} + +static bool +parse_ldif(struct sudoers_parse_tree *parse_tree, const char *input_file, + struct cvtsudoers_config *conf) +{ + FILE *fp = stdin; + debug_decl(parse_ldif, SUDOERS_DEBUG_UTIL) + + /* Open LDIF file and parse it. */ + if (strcmp(input_file, "-") != 0) { + if ((fp = fopen(input_file, "r")) == NULL) + sudo_fatal(U_("unable to open %s"), input_file); + } + + debug_return_bool(sudoers_parse_ldif(parse_tree, fp, conf->sudoers_base, + conf->store_options)); +} + +static bool +parse_sudoers(const char *input_file, struct cvtsudoers_config *conf) +{ + debug_decl(parse_sudoers, SUDOERS_DEBUG_UTIL) + + /* Open sudoers file and parse it. */ + if (strcmp(input_file, "-") == 0) { + sudoersin = stdin; + input_file = "stdin"; + } else if ((sudoersin = fopen(input_file, "r")) == NULL) + sudo_fatal(U_("unable to open %s"), input_file); + init_parser(input_file, false); + if (sudoersparse() && !parse_error) { + sudo_warnx(U_("failed to parse %s file, unknown error"), input_file); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(input_file)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + if (parse_error) { + if (errorlineno != -1) + sudo_warnx(U_("parse error in %s near line %d\n"), + errorfile, errorlineno); + else if (errorfile != NULL) + sudo_warnx(U_("parse error in %s\n"), errorfile); + debug_return_bool(false); + } + debug_return_bool(true); +} + +FILE * +open_sudoers(const char *sudoers, bool doedit, bool *keepopen) +{ + return fopen(sudoers, "r"); +} + +static bool +userlist_matches_filter(struct sudoers_parse_tree *parse_tree, + struct member_list *users, struct cvtsudoers_config *conf) +{ + struct sudoers_string *s; + struct member *m, *next; + bool ret = false; + debug_decl(userlist_matches_filter, SUDOERS_DEBUG_UTIL) + + if (filters == NULL || + (STAILQ_EMPTY(&filters->users) && STAILQ_EMPTY(&filters->groups))) + debug_return_bool(true); + + TAILQ_FOREACH_REVERSE_SAFE(m, users, member_list, entries, next) { + bool matched = false; + + if (STAILQ_EMPTY(&filters->users)) { + struct passwd pw; + + /* + * Only groups in filter, make a dummy user so userlist_matches() + * can do its thing. + */ + memset(&pw, 0, sizeof(pw)); + pw.pw_name = "_nobody"; + pw.pw_uid = (uid_t)-1; + pw.pw_gid = (gid_t)-1; + + if (user_matches(parse_tree, &pw, m) == true) + matched = true; + } else { + STAILQ_FOREACH(s, &filters->users, entries) { + struct passwd *pw = NULL; + + /* An upper case filter entry may be a User_Alias */ + /* XXX - doesn't handle nested aliases */ + if (m->type == ALIAS && !conf->expand_aliases) { + if (strcmp(m->name, s->str) == 0) { + matched = true; + break; + } + } + + if (s->str[0] == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) + pw = sudo_getpwuid(uid); + } + if (pw == NULL) + pw = sudo_getpwnam(s->str); + if (pw == NULL) + continue; + + if (user_matches(parse_tree, pw, m) == true) + matched = true; + sudo_pw_delref(pw); + + /* Only need one user in the filter to match. */ + if (matched) + break; + } + } + + if (matched) { + ret = true; + } else if (conf->prune_matches) { + TAILQ_REMOVE(users, m, entries); + free_member(m); + } + } + + debug_return_bool(ret); +} + +static bool +hostlist_matches_filter(struct sudoers_parse_tree *parse_tree, + struct member_list *hostlist, struct cvtsudoers_config *conf) +{ + struct sudoers_string *s; + struct member *m, *next; + char *lhost, *shost; + bool ret = false; + char **shosts; + int n = 0; + debug_decl(hostlist_matches_filter, SUDOERS_DEBUG_UTIL) + + if (filters == NULL || STAILQ_EMPTY(&filters->hosts)) + debug_return_bool(true); + + /* Create an array of short host names. */ + STAILQ_FOREACH(s, &filters->hosts, entries) { + n++; + } + shosts = reallocarray(NULL, n, sizeof(char *)); + if (shosts == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + if ((shost = strchr(lhost, '.')) != NULL) { + shost = strndup(lhost, (size_t)(shost - lhost)); + if (shost == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else { + shost = lhost; + } + shosts[n++] = shost; + } + + TAILQ_FOREACH_REVERSE_SAFE(m, hostlist, member_list, entries, next) { + bool matched = false; + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + shost = shosts[n++]; + + /* An upper case filter entry may be a Host_Alias */ + /* XXX - doesn't handle nested aliases */ + if (m->type == ALIAS && !conf->expand_aliases) { + if (strcmp(m->name, s->str) == 0) { + matched = true; + break; + } + } + + /* Only need one host in the filter to match. */ + /* XXX - can't use netgroup_tuple with NULL pw */ + if (host_matches(parse_tree, NULL, lhost, shost, m) == true) { + matched = true; + break; + } + } + + if (matched) { + ret = true; + } else if (conf->prune_matches) { + TAILQ_REMOVE(hostlist, m, entries); + free_member(m); + } + } + + /* Free shosts array and its contents. */ + n = 0; + STAILQ_FOREACH(s, &filters->hosts, entries) { + lhost = s->str; + shost = shosts[n++]; + if (shost != lhost) + free(shost); + } + free(shosts); + + debug_return_bool(ret == true); +} + +/* + * Display Defaults entries + */ +static bool +print_defaults_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_lbuf *lbuf, bool expand_aliases) +{ + struct defaults *def, *next; + debug_decl(print_defaults_sudoers, SUDOERS_DEBUG_UTIL) + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) { + sudoers_format_default_line(lbuf, parse_tree, def, &next, + expand_aliases); + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static int +print_alias_sudoers(struct sudoers_parse_tree *parse_tree, struct alias *a, + void *v) +{ + struct sudo_lbuf *lbuf = v; + struct member *m; + debug_decl(print_alias_sudoers, SUDOERS_DEBUG_UTIL) + + sudo_lbuf_append(lbuf, "%s %s = ", alias_type_to_string(a->type), + a->name); + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, NULL, UNSPEC); + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_int(sudo_lbuf_error(lbuf) ? -1 : 0); +} + +/* + * Display aliases + */ +static bool +print_aliases_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_lbuf *lbuf) +{ + debug_decl(print_aliases_sudoers, SUDOERS_DEBUG_UTIL) + + alias_apply(parse_tree, print_alias_sudoers, lbuf); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static FILE *output_fp; /* global for convert_sudoers_output */ + +static int +convert_sudoers_output(const char *buf) +{ + return fputs(buf, output_fp); +} + +/* + * Apply filters to userspecs, removing non-matching entries. + */ +static void +filter_userspecs(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct userspec *us, *next_us; + struct privilege *priv, *next_priv; + debug_decl(filter_userspecs, SUDOERS_DEBUG_UTIL) + + if (filters == NULL) + debug_return; + + /* + * Does not currently prune out non-matching entries in the user or + * host lists. It acts more like a grep than a true filter. + * In the future, we may want to add a prune option. + */ + TAILQ_FOREACH_SAFE(us, &parse_tree->userspecs, entries, next_us) { + if (!userlist_matches_filter(parse_tree, &us->users, conf)) { + TAILQ_REMOVE(&parse_tree->userspecs, us, entries); + free_userspec(us); + continue; + } + TAILQ_FOREACH_SAFE(priv, &us->privileges, entries, next_priv) { + if (!hostlist_matches_filter(parse_tree, &priv->hostlist, conf)) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + } + if (TAILQ_EMPTY(&us->privileges)) { + TAILQ_REMOVE(&parse_tree->userspecs, us, entries); + free_userspec(us); + continue; + } + } + debug_return; +} + +/* + * Check whether the alias described by "alias_name" is the same + * as "name" or includes an alias called "name". + * Returns true if matched, else false. + */ +static bool +alias_matches(struct sudoers_parse_tree *parse_tree, const char *name, + const char *alias_name, int alias_type) +{ + struct alias *a; + struct member *m; + bool ret = false; + debug_decl(alias_matches, SUDOERS_DEBUG_ALIAS) + + if (strcmp(name, alias_name) == 0) + debug_return_bool(true); + + a = alias_get(parse_tree, alias_name, alias_type); + if (a != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type != ALIAS) + continue; + if (alias_matches(parse_tree, name, m->name, alias_type)) { + ret = true; + break; + } + } + alias_put(a); + } + + debug_return_bool(ret); +} + +/* + * Check whether userspecs uses the aliases in the specified member lists. + * If used, they are removed (and freed) from the list. + * This does *not* check Defaults for used aliases, only userspecs. + */ +static void +alias_used_by_userspecs(struct sudoers_parse_tree *parse_tree, + struct member_list *user_aliases, struct member_list *runas_aliases, + struct member_list *host_aliases, struct member_list *cmnd_aliases) +{ + struct privilege *priv, *priv_next; + struct userspec *us, *us_next; + struct cmndspec *cs, *cs_next; + struct member *m, *m_next; + struct member *am, *am_next; + debug_decl(alias_used_by_userspecs, SUDOERS_DEBUG_ALIAS) + + /* Iterate over the policy, checking for aliases. */ + TAILQ_FOREACH_SAFE(us, &parse_tree->userspecs, entries, us_next) { + TAILQ_FOREACH_SAFE(m, &us->users, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from user_aliases and free. */ + TAILQ_FOREACH_SAFE(am, user_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, USERALIAS)) { + TAILQ_REMOVE(user_aliases, am, entries); + free_member(am); + } + } + } + } + TAILQ_FOREACH_SAFE(priv, &us->privileges, entries, priv_next) { + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m->type == ALIAS) { + /* If alias is used, remove from host_aliases and free. */ + TAILQ_FOREACH_SAFE(am, host_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, HOSTALIAS)) { + TAILQ_REMOVE(host_aliases, am, entries); + free_member(am); + } + } + } + } + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, cs_next) { + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH_SAFE(m, cs->runasuserlist, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from runas_aliases and free. */ + TAILQ_FOREACH_SAFE(am, runas_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, RUNASALIAS)) { + TAILQ_REMOVE(runas_aliases, am, entries); + free_member(am); + } + } + } + } + } + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH_SAFE(m, cs->runasgrouplist, entries, m_next) { + if (m->type == ALIAS) { + /* If alias is used, remove from runas_aliases and free. */ + TAILQ_FOREACH_SAFE(am, runas_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, RUNASALIAS)) { + TAILQ_REMOVE(runas_aliases, am, entries); + free_member(am); + } + } + } + } + } + if ((m = cs->cmnd)->type == ALIAS) { + /* If alias is used, remove from cmnd_aliases and free. */ + TAILQ_FOREACH_SAFE(am, cmnd_aliases, entries, am_next) { + if (alias_matches(parse_tree, am->name, m->name, CMNDALIAS)) { + TAILQ_REMOVE(cmnd_aliases, am, entries); + free_member(am); + } + } + } + } + } + } + + debug_return; +} + +/* + * Apply filters to host/user-based Defaults, removing non-matching entries. + */ +static void +filter_defaults(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct member_list user_aliases = TAILQ_HEAD_INITIALIZER(user_aliases); + struct member_list runas_aliases = TAILQ_HEAD_INITIALIZER(runas_aliases); + struct member_list host_aliases = TAILQ_HEAD_INITIALIZER(host_aliases); + struct member_list cmnd_aliases = TAILQ_HEAD_INITIALIZER(cmnd_aliases); + struct member_list *prev_binding = NULL; + struct defaults *def, *def_next; + struct member *m, *m_next; + struct alias *a; + int alias_type; + debug_decl(filter_defaults, SUDOERS_DEBUG_DEFAULTS) + + if (filters == NULL && conf->defaults == CVT_DEFAULTS_ALL) + debug_return; + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, def_next) { + bool keep = true; + + switch (def->type) { + case DEFAULTS: + if (!ISSET(conf->defaults, CVT_DEFAULTS_GLOBAL)) + keep = false; + alias_type = UNSPEC; + break; + case DEFAULTS_USER: + if (!ISSET(conf->defaults, CVT_DEFAULTS_USER) || + !userlist_matches_filter(parse_tree, def->binding, conf)) + keep = false; + alias_type = USERALIAS; + break; + case DEFAULTS_RUNAS: + if (!ISSET(conf->defaults, CVT_DEFAULTS_RUNAS)) + keep = false; + alias_type = RUNASALIAS; + break; + case DEFAULTS_HOST: + if (!ISSET(conf->defaults, CVT_DEFAULTS_HOST) || + !hostlist_matches_filter(parse_tree, def->binding, conf)) + keep = false; + alias_type = HOSTALIAS; + break; + case DEFAULTS_CMND: + if (!ISSET(conf->defaults, CVT_DEFAULTS_CMND)) + keep = false; + alias_type = CMNDALIAS; + break; + default: + sudo_fatalx_nodebug("unexpected defaults type %d", def->type); + break; + } + + if (!keep) { + /* Look for aliases used by the binding. */ + /* XXX - move to function */ + if (alias_type != UNSPEC && def->binding != prev_binding) { + TAILQ_FOREACH_SAFE(m, def->binding, entries, m_next) { + if (m->type == ALIAS) { + TAILQ_REMOVE(def->binding, m, entries); + switch (alias_type) { + case USERALIAS: + TAILQ_INSERT_TAIL(&user_aliases, m, entries); + break; + case RUNASALIAS: + TAILQ_INSERT_TAIL(&runas_aliases, m, entries); + break; + case HOSTALIAS: + TAILQ_INSERT_TAIL(&host_aliases, m, entries); + break; + case CMNDALIAS: + TAILQ_INSERT_TAIL(&cmnd_aliases, m, entries); + break; + default: + sudo_fatalx_nodebug("unexpected alias type %d", + alias_type); + break; + } + } + } + } + TAILQ_REMOVE(&parse_tree->defaults, def, entries); + free_default(def, &prev_binding); + if (prev_binding != NULL) { + /* Remove and free Defaults that share the same binding. */ + while (def_next != NULL && def_next->binding == prev_binding) { + def = def_next; + def_next = TAILQ_NEXT(def, entries); + TAILQ_REMOVE(&parse_tree->defaults, def, entries); + free_default(def, &prev_binding); + } + } + } else { + prev_binding = def->binding; + } + } + + /* Remove now-unreferenced aliases. */ + alias_used_by_userspecs(parse_tree, &user_aliases, &runas_aliases, + &host_aliases, &cmnd_aliases); + TAILQ_FOREACH_SAFE(m, &user_aliases, entries, m_next) { + a = alias_remove(parse_tree, m->name, USERALIAS); + alias_free(a); + free_member(m); + } + TAILQ_FOREACH_SAFE(m, &runas_aliases, entries, m_next) { + a = alias_remove(parse_tree, m->name, RUNASALIAS); + alias_free(a); + free_member(m); + } + TAILQ_FOREACH_SAFE(m, &host_aliases, entries, m_next) { + a = alias_remove(parse_tree, m->name, HOSTALIAS); + alias_free(a); + free_member(m); + } + TAILQ_FOREACH_SAFE(m, &cmnd_aliases, entries, m_next) { + a = alias_remove(parse_tree, m->name, CMNDALIAS); + alias_free(a); + free_member(m); + } + + debug_return; +} + +/* + * Remove unreferenced aliases. + */ +static void +alias_remove_unused(struct sudoers_parse_tree *parse_tree) +{ + struct rbtree *used_aliases; + debug_decl(alias_remove_unused, SUDOERS_DEBUG_ALIAS) + + used_aliases = alloc_aliases(); + if (used_aliases == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Move all referenced aliases to used_aliases. */ + if (!alias_find_used(parse_tree, used_aliases)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Only unreferenced aliases are left, swap and free the unused ones. */ + free_aliases(parse_tree->aliases); + parse_tree->aliases = used_aliases; + + debug_return; +} + +/* + * Prune out non-matching entries from user and host aliases. + */ +static int +alias_prune_helper(struct sudoers_parse_tree *parse_tree, struct alias *a, + void *v) +{ + struct cvtsudoers_config *conf = v; + + /* XXX - misue of these functions */ + switch (a->type) { + case USERALIAS: + userlist_matches_filter(parse_tree, &a->members, conf); + break; + case HOSTALIAS: + hostlist_matches_filter(parse_tree, &a->members, conf); + break; + default: + break; + } + + return 0; +} + +/* + * Prune out non-matching entries from within aliases. + */ +static void +alias_prune(struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + debug_decl(alias_prune, SUDOERS_DEBUG_ALIAS) + + alias_apply(parse_tree, alias_prune_helper, conf); + + debug_return; +} + +/* + * Convert back to sudoers. + */ +static bool +convert_sudoers_sudoers(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + bool ret = true; + struct sudo_lbuf lbuf; + debug_decl(convert_sudoers_sudoers, SUDOERS_DEBUG_UTIL) + + if (strcmp(output_file, "-") == 0) { + output_fp = stdout; + } else { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* Wrap lines at 80 columns with a 4 character indent. */ + sudo_lbuf_init(&lbuf, convert_sudoers_output, 4, "\\", 80); + + /* Print Defaults */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) { + if (!print_defaults_sudoers(parse_tree, &lbuf, conf->expand_aliases)) + goto done; + if (lbuf.len > 0) { + sudo_lbuf_print(&lbuf); + sudo_lbuf_append(&lbuf, "\n"); + } + } + + /* Print Aliases */ + if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) { + if (!print_aliases_sudoers(parse_tree, &lbuf)) + goto done; + if (lbuf.len > 1) { + sudo_lbuf_print(&lbuf); + sudo_lbuf_append(&lbuf, "\n"); + } + } + + /* Print User_Specs, separated by blank lines. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) { + if (!sudoers_format_userspecs(&lbuf, parse_tree, "\n", + conf->expand_aliases, true)) { + goto done; + } + if (lbuf.len > 1) { + sudo_lbuf_print(&lbuf); + } + } + +done: + if (sudo_lbuf_error(&lbuf)) { + if (errno == ENOMEM) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + sudo_lbuf_destroy(&lbuf); + + (void)fflush(output_fp); + if (ferror(output_fp)) { + sudo_warn(U_("unable to write to %s"), output_file); + ret = false; + } + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} + +static void +usage(int fatal) +{ + (void) fprintf(fatal ? stderr : stdout, "usage: %s [-ehMpV] [-b dn] " + "[-c conf_file ] [-d deftypes] [-f output_format] [-i input_format] " + "[-I increment] [-m filter] [-o output_file] [-O start_point] " + "[-P padding] [-s sections] [input_file]\n", getprogname()); + if (fatal) + exit(1); +} + +static void +help(void) +{ + (void) printf(_("%s - convert between sudoers file formats\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -b, --base=dn the base DN for sudo LDAP queries\n" + " -c, --config=conf_file the path to the configuration file\n" + " -d, --defaults=deftypes only convert Defaults of the specified types\n" + " -e, --expand-aliases expand aliases when converting\n" + " -f, --output-format=format set output format: JSON, LDIF or sudoers\n" + " -i, --input-format=format set input format: LDIF or sudoers\n" + " -I, --increment=num amount to increase each sudoOrder by\n" + " -h, --help display help message and exit\n" + " -m, --match=filter only convert entries that match the filter\n" + " -M, --match-local match filter uses passwd and group databases\n" + " -o, --output=output_file write converted sudoers to output_file\n" + " -O, --order-start=num starting point for first sudoOrder\n" + " -p, --prune-matches prune non-matching users, groups and hosts\n" + " -P, --padding=num base padding for sudoOrder increment\n" + " -s, --suppress=sections suppress output of certain sections\n" + " -V, --version display version information and exit")); + exit(0); +} diff --git a/utsudo-0.0.2/plugins/sudoers/cvtsudoers.h b/utsudo-0.0.2/plugins/sudoers/cvtsudoers.h new file mode 100644 index 0000000..721b81e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/cvtsudoers.h @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_CVTSUDOERS_H +#define SUDOERS_CVTSUDOERS_H + +#include "strlist.h" + +/* Supported input/output formats. */ +enum sudoers_formats { + format_json, + format_ldif, + format_sudoers +}; + +/* Flags for cvtsudoers_config.defaults */ +#define CVT_DEFAULTS_GLOBAL 0x01 +#define CVT_DEFAULTS_USER 0x02 +#define CVT_DEFAULTS_RUNAS 0x04 +#define CVT_DEFAULTS_HOST 0x08 +#define CVT_DEFAULTS_CMND 0x10 +#define CVT_DEFAULTS_ALL 0xff + +/* Flags for cvtsudoers_config.suppress */ +#define SUPPRESS_DEFAULTS 0x01 +#define SUPPRESS_ALIASES 0x02 +#define SUPPRESS_PRIVS 0x04 + +/* cvtsudoers.conf settings */ +struct cvtsudoers_config { + unsigned int sudo_order; + unsigned int order_increment; + unsigned int order_padding; + unsigned int order_max; + short defaults; + short suppress; + bool expand_aliases; + bool store_options; + bool prune_matches; + char *sudoers_base; + char *input_format; + char *output_format; + char *filter; + char *defstr; + char *supstr; +}; + +/* Initial config settings for above. */ +#define INITIAL_CONFIG { 1, 1, 0, 0, CVT_DEFAULTS_ALL, 0, false, true, false } + +#define CONF_BOOL 0 +#define CONF_UINT 1 +#define CONF_STR 2 + +struct cvtsudoers_conf_table { + const char *conf_str; /* config file string */ + int type; /* CONF_BOOL, CONF_UINT, CONF_STR */ + void *valp; /* pointer into cvtsudoers_config */ +}; + +struct cvtsudoers_filter { + struct sudoers_str_list users; + struct sudoers_str_list groups; + struct sudoers_str_list hosts; +}; + +/* cvtsudoers.c */ +extern struct cvtsudoers_filter *filters; + +/* cvtsudoers_json.c */ +bool convert_sudoers_json(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); + +/* cvtsudoers_ldif.c */ +bool convert_sudoers_ldif(struct sudoers_parse_tree *parse_tree, const char *output_file, struct cvtsudoers_config *conf); + +/* cvtsudoers_pwutil.c */ +struct cache_item *cvtsudoers_make_pwitem(uid_t uid, const char *name); +struct cache_item *cvtsudoers_make_gritem(gid_t gid, const char *name); +struct cache_item *cvtsudoers_make_gidlist_item(const struct passwd *pw, char * const *unused1, unsigned int type); +struct cache_item *cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1); + +/* stubs.c */ +void get_hostname(void); + +#endif /* SUDOERS_CVTSUDOERS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/cvtsudoers_json.c b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_json.c new file mode 100644 index 0000000..cf1186d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_json.c @@ -0,0 +1,1163 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" +#include "cvtsudoers.h" +#include + +/* + * JSON values may be of the following types. + */ +enum json_value_type { + JSON_STRING, + JSON_ID, + JSON_NUMBER, + JSON_OBJECT, + JSON_ARRAY, + JSON_BOOL, + JSON_NULL +}; + +/* + * JSON value suitable for printing. + * Note: this does not support object or array values. + */ +struct json_value { + enum json_value_type type; + union { + char *string; + int number; + id_t id; + bool boolean; + } u; +}; + +/* + * Closure used to store state when iterating over all aliases. + */ +struct json_alias_closure { + FILE *fp; + const char *title; + unsigned int count; + int alias_type; + int indent; + bool need_comma; +}; + +/* + * Type values used to disambiguate the generic WORD and ALIAS types. + */ +enum word_type { + TYPE_COMMAND, + TYPE_HOSTNAME, + TYPE_RUNASGROUP, + TYPE_RUNASUSER, + TYPE_USERNAME +}; + +/* + * Print "indent" number of blank characters. + */ +static void +print_indent(FILE *fp, int indent) +{ + while (indent--) + putc(' ', fp); +} + +/* + * Print a JSON string, escaping special characters. + * Does not support unicode escapes. + */ +static void +print_string_json_unquoted(FILE *fp, const char *str) +{ + char ch; + + while ((ch = *str++) != '\0') { + switch (ch) { + case '"': + case '\\': + putc('\\', fp); + break; + case '\b': + ch = 'b'; + putc('\\', fp); + break; + case '\f': + ch = 'f'; + putc('\\', fp); + break; + case '\n': + ch = 'n'; + putc('\\', fp); + break; + case '\r': + ch = 'r'; + putc('\\', fp); + break; + case '\t': + ch = 't'; + putc('\\', fp); + break; + } + putc(ch, fp); + } +} + +/* + * Print a quoted JSON string, escaping special characters. + * Does not support unicode escapes. + */ +static void +print_string_json(FILE *fp, const char *str) +{ + putc('\"', fp); + print_string_json_unquoted(fp, str); + putc('\"', fp); +} + +/* + * Print a JSON name: value pair with proper quoting and escaping. + */ +static void +print_pair_json(FILE *fp, const char *pre, const char *name, + const struct json_value *value, const char *post, int indent) +{ + debug_decl(print_pair_json, SUDOERS_DEBUG_UTIL) + + print_indent(fp, indent); + + /* prefix */ + if (pre != NULL) + fputs(pre, fp); + + /* name */ + print_string_json(fp, name); + putc(':', fp); + putc(' ', fp); + + /* value */ + switch (value->type) { + case JSON_STRING: + print_string_json(fp, value->u.string); + break; + case JSON_ID: + fprintf(fp, "%u", (unsigned int)value->u.id); + break; + case JSON_NUMBER: + fprintf(fp, "%d", value->u.number); + break; + case JSON_NULL: + fputs("null", fp); + break; + case JSON_BOOL: + fputs(value->u.boolean ? "true" : "false", fp); + break; + case JSON_OBJECT: + sudo_fatalx("internal error: can't print JSON_OBJECT"); + break; + case JSON_ARRAY: + sudo_fatalx("internal error: can't print JSON_ARRAY"); + break; + } + + /* postfix */ + if (post != NULL) + fputs(post, fp); + + debug_return; +} + +/* + * Print a JSON string with optional prefix and postfix to fp. + * Strings are not quoted but are escaped as per the JSON spec. + */ +static void +printstr_json(FILE *fp, const char *pre, const char *str, const char *post, + int indent) +{ + debug_decl(printstr_json, SUDOERS_DEBUG_UTIL) + + print_indent(fp, indent); + if (pre != NULL) + fputs(pre, fp); + if (str != NULL) { + print_string_json_unquoted(fp, str); + } + if (post != NULL) + fputs(post, fp); + debug_return; +} + +/* + * Print sudo command member in JSON format, with specified indentation. + * If last_one is false, a comma will be printed before the newline + * that closes the object. + */ +static void +print_command_json(FILE *fp, const char *name, int type, bool negated, int indent, bool last_one) +{ + struct sudo_command *c = (struct sudo_command *)name; + struct json_value value; + const char *digest_name; + debug_decl(print_command_json, SUDOERS_DEBUG_UTIL) + + printstr_json(fp, "{", NULL, NULL, indent); + if (negated || c->digest != NULL) { + putc('\n', fp); + indent += 4; + } else { + putc(' ', fp); + indent = 0; + } + + /* Print command with optional command line args. */ + if (c->args != NULL) { + printstr_json(fp, "\"", "command", "\": ", indent); + printstr_json(fp, "\"", c->cmnd, " ", 0); + printstr_json(fp, NULL, c->args, "\"", 0); + } else { + value.type = JSON_STRING; + value.u.string = c->cmnd; + print_pair_json(fp, NULL, "command", &value, NULL, indent); + } + + /* Optional digest. */ + if (c->digest != NULL) { + fputs(",\n", fp); + digest_name = digest_type_to_name(c->digest->digest_type); + value.type = JSON_STRING; + value.u.string = c->digest->digest_str; + print_pair_json(fp, NULL, digest_name, &value, NULL, indent); + } + + /* Command may be negated. */ + if (negated) { + fputs(",\n", fp); + value.type = JSON_BOOL; + value.u.boolean = true; + print_pair_json(fp, NULL, "negated", &value, NULL, indent); + } + + if (indent != 0) { + indent -= 4; + putc('\n', fp); + print_indent(fp, indent); + } else { + putc(' ', fp); + } + putc('}', fp); + if (!last_one) + putc(',', fp); + putc('\n', fp); + + debug_return; +} + +/* + * Map an alias type to enum word_type. + */ +static enum word_type +alias_to_word_type(int alias_type) +{ + switch (alias_type) { + case CMNDALIAS: + return TYPE_COMMAND; + case HOSTALIAS: + return TYPE_HOSTNAME; + case RUNASALIAS: + return TYPE_RUNASUSER; + case USERALIAS: + return TYPE_USERNAME; + default: + sudo_fatalx_nodebug("unexpected alias type %d", alias_type); + } +} + +/* + * Map a Defaults type to enum word_type. + */ +static enum word_type +defaults_to_word_type(int defaults_type) +{ + switch (defaults_type) { + case DEFAULTS_CMND: + return TYPE_COMMAND; + case DEFAULTS_HOST: + return TYPE_HOSTNAME; + case DEFAULTS_RUNAS: + return TYPE_RUNASUSER; + case DEFAULTS_USER: + return TYPE_USERNAME; + default: + sudo_fatalx_nodebug("unexpected defaults type %d", defaults_type); + } +} + +/* + * Print struct member in JSON format, with specified indentation. + * If last_one is false, a comma will be printed before the newline + * that closes the object. + */ +static void +print_member_json_int(FILE *fp, struct sudoers_parse_tree *parse_tree, + char *name, int type, bool negated, enum word_type word_type, + bool last_one, int indent, bool expand_aliases) +{ + struct json_value value; + const char *typestr = NULL; + const char *errstr; + int alias_type = UNSPEC; + id_t id; + debug_decl(print_member_json_int, SUDOERS_DEBUG_UTIL) + + /* Most of the time we print a string. */ + value.type = JSON_STRING; + if (name != NULL) { + value.u.string = name; + } else { + switch (type) { + case ALL: + value.u.string = "ALL"; + break; + case MYSELF: + value.u.string = ""; + break; + default: + sudo_fatalx("missing member name for type %d", type); + } + } + + switch (type) { + case USERGROUP: + value.u.string++; /* skip leading '%' */ + if (*value.u.string == ':') { + value.u.string++; + typestr = "nonunixgroup"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: non-Unix group-ID %s: \"%s\"", + errstr, value.u.string + 1); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "nonunixgid"; + } + } + } else { + typestr = "usergroup"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: group-ID %s: \"%s\"", + errstr, value.u.string + 1); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "usergid"; + } + } + } + break; + case NETGROUP: + typestr = "netgroup"; + value.u.string++; /* skip leading '+' */ + break; + case NTWKADDR: + typestr = "networkaddr"; + break; + case COMMAND: + print_command_json(fp, name, type, negated, indent, last_one); + debug_return; + case ALL: + case MYSELF: + case WORD: + switch (word_type) { + case TYPE_COMMAND: + typestr = "command"; + break; + case TYPE_HOSTNAME: + typestr = "hostname"; + break; + case TYPE_RUNASGROUP: + typestr = "usergroup"; + break; + case TYPE_RUNASUSER: + case TYPE_USERNAME: + typestr = "username"; + if (*value.u.string == '#') { + id = sudo_strtoid(value.u.string + 1, &errstr); + if (errstr != NULL) { + sudo_warnx("internal error: user-ID %s: \"%s\"", + errstr, name); + } else { + value.type = JSON_ID; + value.u.id = id; + typestr = "userid"; + } + } + break; + default: + sudo_fatalx("unexpected word type %d", word_type); + } + break; + case ALIAS: + switch (word_type) { + case TYPE_COMMAND: + if (expand_aliases) { + alias_type = CMNDALIAS; + } else { + typestr = "cmndalias"; + } + break; + case TYPE_HOSTNAME: + if (expand_aliases) { + alias_type = HOSTALIAS; + } else { + typestr = "hostalias"; + } + break; + case TYPE_RUNASGROUP: + case TYPE_RUNASUSER: + if (expand_aliases) { + alias_type = RUNASALIAS; + } else { + typestr = "runasalias"; + } + break; + case TYPE_USERNAME: + if (expand_aliases) { + alias_type = USERALIAS; + } else { + typestr = "useralias"; + } + break; + default: + sudo_fatalx("unexpected word type %d", word_type); + } + break; + default: + sudo_fatalx("unexpected member type %d", type); + } + + if (expand_aliases && type == ALIAS) { + struct alias *a; + struct member *m; + + /* Print each member of the alias. */ + if ((a = alias_get(parse_tree, value.u.string, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + print_member_json_int(fp, parse_tree, m->name, m->type, + negated ? !m->negated : m->negated, + alias_to_word_type(alias_type), + last_one && TAILQ_NEXT(m, entries) == NULL, indent, true); + } + alias_put(a); + } + } else { + if (negated) { + print_indent(fp, indent); + fputs("{\n", fp); + indent += 4; + print_pair_json(fp, NULL, typestr, &value, ",\n", indent); + value.type = JSON_BOOL; + value.u.boolean = true; + print_pair_json(fp, NULL, "negated", &value, "\n", indent); + indent -= 4; + print_indent(fp, indent); + putc('}', fp); + } else { + print_pair_json(fp, "{ ", typestr, &value, " }", indent); + } + + if (!last_one) + putc(',', fp); + putc('\n', fp); + } + + debug_return; +} + +static void +print_member_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct member *m, enum word_type word_type, bool last_one, + int indent, bool expand_aliases) +{ + print_member_json_int(fp, parse_tree, m->name, m->type, m->negated, + word_type, last_one, indent, expand_aliases); +} + +/* + * Callback for alias_apply() to print an alias entry if it matches + * the type specified in the closure. + */ +static int +print_alias_json(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + struct json_alias_closure *closure = v; + struct member *m; + debug_decl(print_alias_json, SUDOERS_DEBUG_UTIL) + + if (a->type != closure->alias_type) + debug_return_int(0); + + /* Open the aliases object or close the last entry, then open new one. */ + if (closure->count++ == 0) { + fprintf(closure->fp, "%s\n%*s\"%s\": {\n", + closure->need_comma ? "," : "", closure->indent, "", + closure->title); + closure->indent += 4; + } else { + fprintf(closure->fp, "%*s],\n", closure->indent, ""); + } + printstr_json(closure->fp, "\"", a->name, "\": [\n", closure->indent); + + closure->indent += 4; + TAILQ_FOREACH(m, &a->members, entries) { + print_member_json(closure->fp, parse_tree, m, + alias_to_word_type(closure->alias_type), + TAILQ_NEXT(m, entries) == NULL, closure->indent, false); + } + closure->indent -= 4; + debug_return_int(0); +} + +/* + * Print the binding for a Defaults entry of the specified type. + */ +static void +print_binding_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct member_list *binding, int type, int indent, bool expand_aliases) +{ + struct member *m; + debug_decl(print_binding_json, SUDOERS_DEBUG_UTIL) + + if (TAILQ_EMPTY(binding)) + debug_return; + + fprintf(fp, "%*s\"Binding\": [\n", indent, ""); + indent += 4; + + /* Print each member object in binding. */ + TAILQ_FOREACH(m, binding, entries) { + print_member_json(fp, parse_tree, m, defaults_to_word_type(type), + TAILQ_NEXT(m, entries) == NULL, indent, expand_aliases); + } + + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + + debug_return; +} + +/* + * Print a Defaults list JSON format. + */ +static void +print_defaults_list_json(FILE *fp, struct defaults *def, int indent) +{ + char savech, *start, *end = def->val; + struct json_value value; + debug_decl(print_defaults_list_json, SUDOERS_DEBUG_UTIL) + + fprintf(fp, "%*s{\n", indent, ""); + indent += 4; + value.type = JSON_STRING; + switch (def->op) { + case '+': + value.u.string = "list_add"; + break; + case '-': + value.u.string = "list_remove"; + break; + case true: + value.u.string = "list_assign"; + break; + default: + sudo_warnx("internal error: unexpected list op %d", def->op); + value.u.string = "unsupported"; + break; + } + print_pair_json(fp, NULL, "operation", &value, ",\n", indent); + printstr_json(fp, "\"", def->var, "\": [\n", indent); + indent += 4; + print_indent(fp, indent); + /* Split value into multiple space-separated words. */ + do { + /* Remove leading blanks, must have a non-empty string. */ + for (start = end; isblank((unsigned char)*start); start++) + continue; + if (*start == '\0') + break; + + /* Find the end and print it. */ + for (end = start; *end && !isblank((unsigned char)*end); end++) + continue; + savech = *end; + *end = '\0'; + print_string_json(fp, start); + if (savech != '\0') + putc(',', fp); + *end = savech; + } while (*end++ != '\0'); + putc('\n', fp); + indent -= 4; + fprintf(fp, "%*s]\n", indent, ""); + indent -= 4; + fprintf(fp, "%*s}", indent, ""); + + debug_return; +} + +static int +get_defaults_type(struct defaults *def) +{ + struct sudo_defs_types *cur; + + /* Look up def in table to find its type. */ + for (cur = sudo_defs_table; cur->name; cur++) { + if (strcmp(def->var, cur->name) == 0) + return cur->type; + } + return -1; +} + +/* + * Export all Defaults in JSON format. + */ +static bool +print_defaults_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + int indent, bool expand_aliases, bool need_comma) +{ + struct json_value value; + struct defaults *def, *next; + int type; + debug_decl(print_defaults_json, SUDOERS_DEBUG_UTIL) + + if (TAILQ_EMPTY(&parse_tree->defaults)) + debug_return_bool(need_comma); + + fprintf(fp, "%s\n%*s\"Defaults\": [\n", need_comma ? "," : "", indent, ""); + indent += 4; + + TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) { + type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + continue; + } + + /* Found it, print object container and binding (if any). */ + fprintf(fp, "%*s{\n", indent, ""); + indent += 4; + print_binding_json(fp, parse_tree, def->binding, def->type, + indent, expand_aliases); + + /* Validation checks. */ + /* XXX - validate values in addition to names? */ + + /* Print options, merging ones with the same binding. */ + fprintf(fp, "%*s\"Options\": [\n", indent, ""); + indent += 4; + for (;;) { + next = TAILQ_NEXT(def, entries); + /* XXX - need to update cur too */ + if ((type & T_MASK) == T_FLAG || def->val == NULL) { + value.type = JSON_BOOL; + value.u.boolean = def->op; + print_pair_json(fp, "{ ", def->var, &value, " }", indent); + } else if ((type & T_MASK) == T_LIST) { + print_defaults_list_json(fp, def, indent); + } else { + value.type = JSON_STRING; + value.u.string = def->val; + print_pair_json(fp, "{ ", def->var, &value, " }", indent); + } + if (next == NULL || def->binding != next->binding) + break; + def = next; + type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + break; + } + fputs(",\n", fp); + } + putc('\n', fp); + indent -= 4; + print_indent(fp, indent); + fputs("]\n", fp); + indent -= 4; + print_indent(fp, indent); + fprintf(fp, "}%s\n", next != NULL ? "," : ""); + } + + /* Close Defaults array; comma (if any) & newline will be printer later. */ + indent -= 4; + print_indent(fp, indent); + fputs("]", fp); + + debug_return_bool(true); +} + +/* + * Export all aliases of the specified type in JSON format. + * Iterates through the entire aliases tree. + */ +static bool +print_aliases_by_type_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + int alias_type, const char *title, int indent, bool need_comma) +{ + struct json_alias_closure closure; + debug_decl(print_aliases_by_type_json, SUDOERS_DEBUG_UTIL) + + closure.fp = fp; + closure.indent = indent; + closure.count = 0; + closure.alias_type = alias_type; + closure.title = title; + closure.need_comma = need_comma; + alias_apply(parse_tree, print_alias_json, &closure); + if (closure.count != 0) { + print_indent(fp, closure.indent); + fputs("]\n", fp); + closure.indent -= 4; + print_indent(fp, closure.indent); + putc('}', fp); + need_comma = true; + } + + debug_return_bool(need_comma); +} + +/* + * Export all aliases in JSON format. + */ +static bool +print_aliases_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + int indent, bool need_comma) +{ + debug_decl(print_aliases_json, SUDOERS_DEBUG_UTIL) + + need_comma = print_aliases_by_type_json(fp, parse_tree, USERALIAS, + "User_Aliases", indent, need_comma); + need_comma = print_aliases_by_type_json(fp, parse_tree, RUNASALIAS, + "Runas_Aliases", indent, need_comma); + need_comma = print_aliases_by_type_json(fp, parse_tree, HOSTALIAS, + "Host_Aliases", indent, need_comma); + need_comma = print_aliases_by_type_json(fp, parse_tree, CMNDALIAS, + "Command_Aliases", indent, need_comma); + + debug_return_bool(need_comma); +} + +/* + * Print a Cmnd_Spec in JSON format at the specified indent level. + * A pointer to the next Cmnd_Spec is passed in to make it possible to + * merge adjacent entries that are identical in all but the command. + */ +static void +print_cmndspec_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct cmndspec *cs, struct cmndspec **nextp, + struct defaults_list *options, bool expand_aliases, int indent) +{ + struct cmndspec *next = *nextp; + struct json_value value; + struct defaults *def; + struct member *m; + struct tm *tp; + bool last_one; + char timebuf[sizeof("20120727121554Z")]; + debug_decl(print_cmndspec_json, SUDOERS_DEBUG_UTIL) + + /* Open Cmnd_Spec object. */ + fprintf(fp, "%*s{\n", indent, ""); + indent += 4; + + /* Print runasuserlist */ + if (cs->runasuserlist != NULL) { + fprintf(fp, "%*s\"runasusers\": [\n", indent, ""); + indent += 4; + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + print_member_json(fp, parse_tree, m, TYPE_RUNASUSER, + TAILQ_NEXT(m, entries) == NULL, indent, expand_aliases); + } + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + } + + /* Print runasgrouplist */ + if (cs->runasgrouplist != NULL) { + fprintf(fp, "%*s\"runasgroups\": [\n", indent, ""); + indent += 4; + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + print_member_json(fp, parse_tree, m, TYPE_RUNASGROUP, + TAILQ_NEXT(m, entries) == NULL, indent, expand_aliases); + } + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + } + + /* Print options and tags */ + if (cs->timeout > 0 || cs->notbefore != UNSPEC || cs->notafter != UNSPEC || + TAGS_SET(cs->tags) || !TAILQ_EMPTY(options)) { + struct cmndtag tag = cs->tags; + const char *prefix = "\n"; + + fprintf(fp, "%*s\"Options\": [", indent, ""); + indent += 4; + if (cs->timeout > 0) { + value.type = JSON_NUMBER; + value.u.number = cs->timeout; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "command_timeout", &value, " }", indent); + prefix = ",\n"; + } + if (cs->notbefore != UNSPEC) { + if ((tp = gmtime(&cs->notbefore)) == NULL) { + sudo_warn(U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx(U_("unable to format timestamp")); + } else { + value.type = JSON_STRING; + value.u.string = timebuf; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "notbefore", &value, " }", indent); + prefix = ",\n"; + } + } + } + if (cs->notafter != UNSPEC) { + if ((tp = gmtime(&cs->notafter)) == NULL) { + sudo_warn(U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx(U_("unable to format timestamp")); + } else { + value.type = JSON_STRING; + value.u.string = timebuf; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "notafter", &value, " }", indent); + prefix = ",\n"; + } + } + } + if (tag.nopasswd != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = !tag.nopasswd; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "authenticate", &value, " }", indent); + prefix = ",\n"; + } + if (tag.noexec != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.noexec; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "noexec", &value, " }", indent); + prefix = ",\n"; + } + if (tag.send_mail != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.send_mail; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "send_mail", &value, " }", indent); + prefix = ",\n"; + } + if (tag.setenv != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.setenv; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "setenv", &value, " }", indent); + prefix = ",\n"; + } + if (tag.follow != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.follow; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "sudoedit_follow", &value, " }", indent); + prefix = ",\n"; + } + if (tag.log_input != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.log_input; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "log_input", &value, " }", indent); + prefix = ",\n"; + } + if (tag.log_output != UNSPEC) { + value.type = JSON_BOOL; + value.u.boolean = tag.log_output; + fputs(prefix, fp); + print_pair_json(fp, "{ ", "log_output", &value, " }", indent); + prefix = ",\n"; + } + TAILQ_FOREACH(def, options, entries) { + int type = get_defaults_type(def); + if (type == -1) { + sudo_warnx(U_("unknown defaults entry \"%s\""), def->var); + /* XXX - just pass it through as a string anyway? */ + continue; + } + fputs(prefix, fp); + if ((type & T_MASK) == T_FLAG || def->val == NULL) { + value.type = JSON_BOOL; + value.u.boolean = def->op; + print_pair_json(fp, "{ ", def->var, &value, " }", indent); + } else if ((type & T_MASK) == T_LIST) { + print_defaults_list_json(fp, def, indent); + } else { + value.type = JSON_STRING; + value.u.string = def->val; + print_pair_json(fp, "{ ", def->var, &value, " }", indent); + } + prefix = ",\n"; + } + putc('\n', fp); + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + } + +#ifdef HAVE_SELINUX + /* Print SELinux role/type */ + if (cs->role != NULL && cs->type != NULL) { + fprintf(fp, "%*s\"SELinux_Spec\": [\n", indent, ""); + indent += 4; + value.type = JSON_STRING; + value.u.string = cs->role; + print_pair_json(fp, NULL, "role", &value, ",\n", indent); + value.u.string = cs->type; + print_pair_json(fp, NULL, "type", &value, "\n", indent); + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + } +#endif /* HAVE_SELINUX */ + +#ifdef HAVE_PRIV_SET + /* Print Solaris privs/limitprivs */ + if (cs->privs != NULL || cs->limitprivs != NULL) { + fprintf(fp, "%*s\"Solaris_Priv_Spec\": [\n", indent, ""); + indent += 4; + value.type = JSON_STRING; + if (cs->privs != NULL) { + value.u.string = cs->privs; + print_pair_json(fp, NULL, "privs", &value, + cs->limitprivs != NULL ? ",\n" : "\n", indent); + } + if (cs->limitprivs != NULL) { + value.u.string = cs->limitprivs; + print_pair_json(fp, NULL, "limitprivs", &value, "\n", indent); + } + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + } +#endif /* HAVE_PRIV_SET */ + + /* + * Merge adjacent commands with matching tags, runas, SELinux + * role/type and Solaris priv settings. + */ + fprintf(fp, "%*s\"Commands\": [\n", indent, ""); + indent += 4; + for (;;) { + /* Does the next entry differ only in the command itself? */ + /* XXX - move into a function that returns bool */ + last_one = next == NULL || + RUNAS_CHANGED(cs, next) || TAGS_CHANGED(cs->tags, next->tags) +#ifdef HAVE_PRIV_SET + || cs->privs != next->privs || cs->limitprivs != next->limitprivs +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + || cs->role != next->role || cs->type != next->type +#endif /* HAVE_SELINUX */ + ; + + print_member_json(fp, parse_tree, cs->cmnd, TYPE_COMMAND, + last_one, indent, expand_aliases); + if (last_one) + break; + cs = next; + next = TAILQ_NEXT(cs, entries); + } + indent -= 4; + fprintf(fp, "%*s]\n", indent, ""); + + /* Close Cmnd_Spec object. */ + indent -= 4; + fprintf(fp, "%*s}%s\n", indent, "", TAILQ_NEXT(cs, entries) != NULL ? "," : ""); + + *nextp = next; + + debug_return; +} + +/* + * Print a User_Spec in JSON format at the specified indent level. + */ +static void +print_userspec_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct userspec *us, int indent, bool expand_aliases) +{ + struct privilege *priv; + struct member *m; + struct cmndspec *cs, *next; + debug_decl(print_userspec_json, SUDOERS_DEBUG_UTIL) + + /* + * Each userspec struct may contain multiple privileges for + * a user. We export each privilege as a separate User_Spec + * object for simplicity's sake. + */ + TAILQ_FOREACH(priv, &us->privileges, entries) { + /* Open User_Spec object. */ + fprintf(fp, "%*s{\n", indent, ""); + indent += 4; + + /* Print users list. */ + fprintf(fp, "%*s\"User_List\": [\n", indent, ""); + indent += 4; + TAILQ_FOREACH(m, &us->users, entries) { + print_member_json(fp, parse_tree, m, TYPE_USERNAME, + TAILQ_NEXT(m, entries) == NULL, indent, expand_aliases); + } + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + + /* Print hosts list. */ + fprintf(fp, "%*s\"Host_List\": [\n", indent, ""); + indent += 4; + TAILQ_FOREACH(m, &priv->hostlist, entries) { + print_member_json(fp, parse_tree, m, TYPE_HOSTNAME, + TAILQ_NEXT(m, entries) == NULL, indent, expand_aliases); + } + indent -= 4; + fprintf(fp, "%*s],\n", indent, ""); + + /* Print commands. */ + fprintf(fp, "%*s\"Cmnd_Specs\": [\n", indent, ""); + indent += 4; + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) { + print_cmndspec_json(fp, parse_tree, cs, &next, &priv->defaults, + expand_aliases, indent); + } + indent -= 4; + fprintf(fp, "%*s]\n", indent, ""); + + /* Close User_Spec object. */ + indent -= 4; + fprintf(fp, "%*s}%s\n", indent, "", TAILQ_NEXT(priv, entries) != NULL || + TAILQ_NEXT(us, entries) != NULL ? "," : ""); + } + + debug_return; +} + +static bool +print_userspecs_json(FILE *fp, struct sudoers_parse_tree *parse_tree, + int indent, bool expand_aliases, bool need_comma) +{ + struct userspec *us; + debug_decl(print_userspecs_json, SUDOERS_DEBUG_UTIL) + + if (TAILQ_EMPTY(&parse_tree->userspecs)) + debug_return_bool(need_comma); + + fprintf(fp, "%s\n%*s\"User_Specs\": [\n", need_comma ? "," : "", indent, ""); + indent += 4; + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + print_userspec_json(fp, parse_tree, us, indent, expand_aliases); + } + indent -= 4; + fprintf(fp, "%*s]", indent, ""); + + debug_return_bool(true); +} + +/* + * Export the parsed sudoers file in JSON format. + */ +bool +convert_sudoers_json(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + bool ret = true, need_comma = false; + const int indent = 4; + FILE *output_fp = stdout; + debug_decl(convert_sudoers_json, SUDOERS_DEBUG_UTIL) + + if (strcmp(output_file, "-") != 0) { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* Open JSON output. */ + putc('{', output_fp); + + /* Dump Defaults in JSON format. */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) { + need_comma = print_defaults_json(output_fp, parse_tree, indent, + conf->expand_aliases, need_comma); + } + + /* Dump Aliases in JSON format. */ + if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) { + need_comma = print_aliases_json(output_fp, parse_tree, indent, + need_comma); + } + + /* Dump User_Specs in JSON format. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) { + print_userspecs_json(output_fp, parse_tree, indent, + conf->expand_aliases, need_comma); + } + + /* Close JSON output. */ + fputs("\n}\n", output_fp); + (void)fflush(output_fp); + if (ferror(output_fp)) + ret = false; + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} diff --git a/utsudo-0.0.2/plugins/sudoers/cvtsudoers_ldif.c b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_ldif.c new file mode 100644 index 0000000..efdce0e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_ldif.c @@ -0,0 +1,667 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" +#include "sudo_ldap.h" +#include "redblack.h" +#include "cvtsudoers.h" +#include "sudo_lbuf.h" +#include + +struct seen_user { + const char *name; + unsigned long count; +}; + +static struct rbtree *seen_users; + +static int +seen_user_compare(const void *aa, const void *bb) +{ + const struct seen_user *a = aa; + const struct seen_user *b = bb; + + return strcasecmp(a->name, b->name); +} + +static void +seen_user_free(void *v) +{ + struct seen_user *su = v; + + free((void *)su->name); + free(su); +} + +static bool +safe_string(const char *str) +{ + unsigned int ch = *str++; + debug_decl(safe_string, SUDOERS_DEBUG_UTIL) + + /* Initial char must be <= 127 and not LF, CR, SPACE, ':', '<' */ + switch (ch) { + case '\0': + debug_return_bool(true); + case '\n': + case '\r': + case ' ': + case ':': + case '<': + debug_return_bool(false); + default: + if (ch > 127) + debug_return_bool(false); + } + + /* Any value <= 127 decimal except NUL, LF, and CR is safe */ + while ((ch = *str++) != '\0') { + if (ch > 127 || ch == '\n' || ch == '\r') + debug_return_bool(false); + } + + debug_return_bool(true); +} + +static bool +print_attribute_ldif(FILE *fp, const char *name, const char *value) +{ + const unsigned char *uvalue = (unsigned char *)value; + char *encoded = NULL; + size_t esize; + debug_decl(print_attribute_ldif, SUDOERS_DEBUG_UTIL) + + if (!safe_string(value)) { + const size_t vlen = strlen(value); + esize = ((vlen + 2) / 3 * 4) + 1; + if ((encoded = malloc(esize)) == NULL) + debug_return_bool(false); + if (base64_encode(uvalue, vlen, encoded, esize) == (size_t)-1) { + free(encoded); + debug_return_bool(false); + } + fprintf(fp, "%s:: %s\n", name, encoded); + free(encoded); + } else if (*value != '\0') { + fprintf(fp, "%s: %s\n", name, value); + } else { + fprintf(fp, "%s:\n", name); + } + + debug_return_bool(true); +} + +/* + * Print sudoOptions from a defaults_list. + */ +static bool +print_options_ldif(FILE *fp, struct defaults_list *options) +{ + struct defaults *opt; + char *attr_val; + int len; + debug_decl(print_options_ldif, SUDOERS_DEBUG_UTIL) + + TAILQ_FOREACH(opt, options, entries) { + if (opt->type != DEFAULTS) + continue; /* don't support bound defaults */ + + if (opt->val != NULL) { + /* There is no need to double quote values here. */ + len = asprintf(&attr_val, "%s%s%s", opt->var, + opt->op == '+' ? "+=" : opt->op == '-' ? "-=" : "=", opt->val); + } else { + /* Boolean flag. */ + len = asprintf(&attr_val, "%s%s", + opt->op == false ? "!" : "", opt->var); + } + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + + debug_return_bool(!ferror(fp)); +} + +/* + * Print global Defaults in a single sudoRole object. + */ +static bool +print_global_defaults_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + const char *base) +{ + unsigned int count = 0; + struct sudo_lbuf lbuf; + struct defaults *opt; + char *dn; + debug_decl(print_global_defaults_ldif, SUDOERS_DEBUG_UTIL) + + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 80); + + TAILQ_FOREACH(opt, &parse_tree->defaults, entries) { + /* Skip bound Defaults (unsupported). */ + if (opt->type == DEFAULTS) { + count++; + } else { + lbuf.len = 0; + sudo_lbuf_append(&lbuf, "# "); + sudoers_format_default_line(&lbuf, parse_tree, opt, false, true); + fprintf(fp, "# Unable to translate %s:%d\n%s\n", + opt->file, opt->lineno, lbuf.buf); + } + } + sudo_lbuf_destroy(&lbuf); + + if (count == 0) + debug_return_bool(true); + + if (asprintf(&dn, "cn=defaults,%s", base) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "dn", dn); + free(dn); + print_attribute_ldif(fp, "objectClass", "top"); + print_attribute_ldif(fp, "objectClass", "sudoRole"); + print_attribute_ldif(fp, "cn", "defaults"); + print_attribute_ldif(fp, "description", "Default sudoOption's go here"); + + print_options_ldif(fp, &parse_tree->defaults); + putc('\n', fp); + + debug_return_bool(!ferror(fp)); +} + +/* + * Print struct member in LDIF format as the specified attribute. + * See print_member_int() in parse.c. + */ +static void +print_member_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, char *name, + int type, bool negated, int alias_type, const char *attr_name) +{ + struct alias *a; + struct member *m; + struct sudo_command *c; + char *attr_val; + int len; + debug_decl(print_member_ldif, SUDOERS_DEBUG_UTIL) + + switch (type) { + case ALL: + print_attribute_ldif(fp, attr_name, negated ? "!ALL" : "ALL"); + break; + case MYSELF: + /* Only valid for sudoRunasUser */ + print_attribute_ldif(fp, attr_name, ""); + break; + case COMMAND: + c = (struct sudo_command *)name; + len = asprintf(&attr_val, "%s%s%s%s%s%s%s%s", + c->digest ? digest_type_to_name(c->digest->digest_type) : "", + c->digest ? ":" : "", c->digest ? c->digest->digest_str : "", + c->digest ? " " : "", negated ? "!" : "", c->cmnd, + c->args ? " " : "", c->args ? c->args : ""); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, attr_name, attr_val); + free(attr_val); + break; + case ALIAS: + if ((a = alias_get(parse_tree, name, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, + negated ? !m->negated : m->negated, alias_type, attr_name); + } + alias_put(a); + break; + } + /* FALLTHROUGH */ + default: + len = asprintf(&attr_val, "%s%s", negated ? "!" : "", name); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, attr_name, attr_val); + free(attr_val); + break; + } + + debug_return; +} + +/* + * Print a Cmnd_Spec in LDIF format. + * A pointer to the next Cmnd_Spec is passed in to make it possible to + * merge adjacent entries that are identical in all but the command. + */ +static void +print_cmndspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct cmndspec *cs, struct cmndspec **nextp, struct defaults_list *options) +{ + struct cmndspec *next = *nextp; + struct member *m; + struct tm *tp; + bool last_one; + char timebuf[sizeof("20120727121554Z")]; + debug_decl(print_cmndspec_ldif, SUDOERS_DEBUG_UTIL) + + /* Print runasuserlist as sudoRunAsUser attributes */ + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + RUNASALIAS, "sudoRunAsUser"); + } + } + + /* Print runasgrouplist as sudoRunAsGroup attributes */ + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + RUNASALIAS, "sudoRunAsGroup"); + } + } + + /* Print sudoNotBefore and sudoNotAfter attributes */ + if (cs->notbefore != UNSPEC) { + if ((tp = gmtime(&cs->notbefore)) == NULL) { + sudo_warn(U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx(U_("unable to format timestamp")); + } else { + print_attribute_ldif(fp, "sudoNotBefore", timebuf); + } + } + } + if (cs->notafter != UNSPEC) { + if ((tp = gmtime(&cs->notafter)) == NULL) { + sudo_warn(U_("unable to get GMT time")); + } else { + if (strftime(timebuf, sizeof(timebuf), "%Y%m%d%H%M%SZ", tp) == 0) { + sudo_warnx(U_("unable to format timestamp")); + } else { + print_attribute_ldif(fp, "sudoNotAfter", timebuf); + } + } + } + + /* Print timeout as a sudoOption. */ + if (cs->timeout > 0) { + char *attr_val; + if (asprintf(&attr_val, "command_timeout=%d", cs->timeout) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + + /* Print tags as sudoOption attributes */ + if (TAGS_SET(cs->tags)) { + struct cmndtag tag = cs->tags; + + if (tag.nopasswd != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.nopasswd ? "!authenticate" : "authenticate"); + } + if (tag.noexec != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.noexec ? "noexec" : "!noexec"); + } + if (tag.send_mail != UNSPEC) { + if (tag.send_mail) { + print_attribute_ldif(fp, "sudoOption", "mail_all_cmnds"); + } else { + print_attribute_ldif(fp, "sudoOption", "!mail_all_cmnds"); + print_attribute_ldif(fp, "sudoOption", "!mail_always"); + print_attribute_ldif(fp, "sudoOption", "!mail_no_perms"); + } + } + if (tag.setenv != UNSPEC && tag.setenv != IMPLIED) { + print_attribute_ldif(fp, "sudoOption", + tag.setenv ? "setenv" : "!setenv"); + } + if (tag.follow != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.follow ? "sudoedit_follow" : "!sudoedit_follow"); + } + if (tag.log_input != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.log_input ? "log_input" : "!log_input"); + } + if (tag.log_output != UNSPEC) { + print_attribute_ldif(fp, "sudoOption", + tag.log_output ? "log_output" : "!log_output"); + } + } + print_options_ldif(fp, options); + +#ifdef HAVE_SELINUX + /* Print SELinux role/type */ + if (cs->role != NULL && cs->type != NULL) { + char *attr_val; + int len; + + len = asprintf(&attr_val, "role=%s", cs->role); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + + len = asprintf(&attr_val, "type=%s", cs->type); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } +#endif /* HAVE_SELINUX */ + +#ifdef HAVE_PRIV_SET + /* Print Solaris privs/limitprivs */ + if (cs->privs != NULL || cs->limitprivs != NULL) { + char *attr_val; + int len; + + if (cs->privs != NULL) { + len = asprintf(&attr_val, "privs=%s", cs->privs); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + if (cs->limitprivs != NULL) { + len = asprintf(&attr_val, "limitprivs=%s", cs->limitprivs); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + print_attribute_ldif(fp, "sudoOption", attr_val); + free(attr_val); + } + } +#endif /* HAVE_PRIV_SET */ + + /* + * Merge adjacent commands with matching tags, runas, SELinux + * role/type and Solaris priv settings. + */ + for (;;) { + /* Does the next entry differ only in the command itself? */ + /* XXX - move into a function that returns bool */ + /* XXX - TAG_SET does not account for implied SETENV */ + last_one = next == NULL || + RUNAS_CHANGED(cs, next) || TAGS_CHANGED(cs->tags, next->tags) +#ifdef HAVE_PRIV_SET + || cs->privs != next->privs || cs->limitprivs != next->limitprivs +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + || cs->role != next->role || cs->type != next->type +#endif /* HAVE_SELINUX */ + ; + + print_member_ldif(fp, parse_tree, cs->cmnd->name, cs->cmnd->type, + cs->cmnd->negated, CMNDALIAS, "sudoCommand"); + if (last_one) + break; + cs = next; + next = TAILQ_NEXT(cs, entries); + } + + *nextp = next; + + debug_return; +} + +/* + * Convert user name to cn, avoiding duplicates and quoting as needed. + * See http://www.faqs.org/rfcs/rfc2253.html + */ +static char * +user_to_cn(const char *user) +{ + struct seen_user key, *su = NULL; + struct rbnode *node; + const char *src; + char *cn, *dst; + size_t size; + debug_decl(user_to_cn, SUDOERS_DEBUG_UTIL) + + /* Allocate as much as we could possibly need. */ + size = (2 * strlen(user)) + 64 + 1; + if ((cn = malloc(size)) == NULL) + goto bad; + + /* + * Increment the number of times we have seen this user. + */ + key.name = user; + node = rbfind(seen_users, &key); + if (node != NULL) { + su = node->data; + } else { + if ((su = malloc(sizeof(*su))) == NULL) + goto bad; + su->count = 0; + if ((su->name = strdup(user)) == NULL) + goto bad; + if (rbinsert(seen_users, su, NULL) != 0) + goto bad; + } + + /* Build cn, quoting special chars as needed (we allocated 2 x len). */ + for (src = user, dst = cn; *src != '\0'; src++) { + switch (*src) { + case ',': + case '+': + case '"': + case '\\': + case '<': + case '>': + case '#': + case ';': + *dst++ = '\\'; /* always escape */ + break; + case ' ': + if (src == user || src[1] == '\0') + *dst++ = '\\'; /* only escape at beginning or end of string */ + break; + default: + break; + } + *dst++ = *src; + } + *dst = '\0'; + + /* Append count if there are duplicate users (cn must be unique). */ + if (su->count != 0) { + size -= (size_t)(dst - cn); + if ((size_t)snprintf(dst, size, "_%lu", su->count) >= size) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto bad; + } + } + su->count++; + + debug_return_str(cn); +bad: + if (su != NULL && su->count == 0) + seen_user_free(su); + free(cn); + debug_return_str(NULL); +} + +/* + * Print a single User_Spec. + */ +static bool +print_userspec_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct userspec *us, struct cvtsudoers_config *conf) +{ + struct privilege *priv; + struct member *m; + struct cmndspec *cs, *next; + debug_decl(print_userspec_ldif, SUDOERS_DEBUG_UTIL) + + /* + * Each userspec struct may contain multiple privileges for + * the user. We export each privilege as a separate sudoRole + * object for simplicity's sake. + */ + TAILQ_FOREACH(priv, &us->privileges, entries) { + TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) { + const char *base = conf->sudoers_base; + char *cn, *dn; + + /* + * Increment the number of times we have seen this user. + * If more than one user is listed, just use the first one. + */ + m = TAILQ_FIRST(&us->users); + cn = user_to_cn(m->type == ALL ? "ALL" : m->name); + if (cn == NULL || asprintf(&dn, "cn=%s,%s", cn, base) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + print_attribute_ldif(fp, "dn", dn); + print_attribute_ldif(fp, "objectClass", "top"); + print_attribute_ldif(fp, "objectClass", "sudoRole"); + print_attribute_ldif(fp, "cn", cn); + free(cn); + free(dn); + + TAILQ_FOREACH(m, &us->users, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + USERALIAS, "sudoUser"); + } + + TAILQ_FOREACH(m, &priv->hostlist, entries) { + print_member_ldif(fp, parse_tree, m->name, m->type, m->negated, + HOSTALIAS, "sudoHost"); + } + + print_cmndspec_ldif(fp, parse_tree, cs, &next, &priv->defaults); + + if (conf->sudo_order != 0) { + char numbuf[(((sizeof(conf->sudo_order) * 8) + 2) / 3) + 2]; + if (conf->order_max != 0 && conf->sudo_order > conf->order_max) { + sudo_fatalx(U_("too many sudoers entries, maximum %u"), + conf->order_padding); + } + (void)snprintf(numbuf, sizeof(numbuf), "%u", conf->sudo_order); + print_attribute_ldif(fp, "sudoOrder", numbuf); + putc('\n', fp); + conf->sudo_order += conf->order_increment; + } + } + } + + debug_return_bool(!ferror(fp)); +} + +/* + * Print User_Specs. + */ +static bool +print_userspecs_ldif(FILE *fp, struct sudoers_parse_tree *parse_tree, + struct cvtsudoers_config *conf) +{ + struct userspec *us; + debug_decl(print_userspecs_ldif, SUDOERS_DEBUG_UTIL) + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (!print_userspec_ldif(fp, parse_tree, us, conf)) + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Export the parsed sudoers file in LDIF format. + */ +bool +convert_sudoers_ldif(struct sudoers_parse_tree *parse_tree, + const char *output_file, struct cvtsudoers_config *conf) +{ + bool ret = true; + FILE *output_fp = stdout; + debug_decl(convert_sudoers_ldif, SUDOERS_DEBUG_UTIL) + + if (conf->sudoers_base == NULL) { + sudo_fatalx(U_("the SUDOERS_BASE environment variable is not set and the -b option was not specified.")); + } + + if (output_file != NULL && strcmp(output_file, "-") != 0) { + if ((output_fp = fopen(output_file, "w")) == NULL) + sudo_fatal(U_("unable to open %s"), output_file); + } + + /* Create a dictionary of already-seen users. */ + seen_users = rbcreate(seen_user_compare); + + /* Dump global Defaults in LDIF format. */ + if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) + print_global_defaults_ldif(output_fp, parse_tree, conf->sudoers_base); + + /* Dump User_Specs in LDIF format, expanding Aliases. */ + if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) + print_userspecs_ldif(output_fp, parse_tree, conf); + + /* Clean up. */ + rbdestroy(seen_users, seen_user_free); + + (void)fflush(output_fp); + if (ferror(output_fp)) + ret = false; + if (output_fp != stdout) + fclose(output_fp); + + debug_return_bool(ret); +} diff --git a/utsudo-0.0.2/plugins/sudoers/cvtsudoers_pwutil.c b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_pwutil.c new file mode 100644 index 0000000..459ee6e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/cvtsudoers_pwutil.c @@ -0,0 +1,484 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "cvtsudoers.h" +#include "pwutil.h" + +#ifndef LOGIN_NAME_MAX +# ifdef _POSIX_LOGIN_NAME_MAX +# define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX +# else +# define LOGIN_NAME_MAX 9 +# endif +#endif /* LOGIN_NAME_MAX */ + +#define FIELD_SIZE(src, name, size) \ +do { \ + if ((src)->name) { \ + size = strlen((src)->name) + 1; \ + total += size; \ + } \ +} while (0) + +#define FIELD_COPY(src, dst, name, size) \ +do { \ + if ((src)->name) { \ + memcpy(cp, (src)->name, size); \ + (dst)->name = cp; \ + cp += size; \ + } \ +} while (0) + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * uid is the key. Fills in datum from the users filter. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +cvtsudoers_make_pwitem(uid_t uid, const char *name) +{ + char *cp, uidstr[MAX_UID_T_LEN + 2]; + size_t nsize, psize, csize, gsize, dsize, ssize, total; + struct cache_item_pw *pwitem; + struct passwd pw, *newpw; + struct sudoers_string *s = NULL; + debug_decl(cvtsudoers_make_pwitem, SUDOERS_DEBUG_NSS) + + /* Look up name or uid in filter list. */ + if (name != NULL) { + STAILQ_FOREACH(s, &filters->users, entries) { + if (strcasecmp(name, s->str) == 0) { + uid = (uid_t)-1; + break; + } + } + } else { + STAILQ_FOREACH(s, &filters->users, entries) { + const char *errstr; + uid_t filter_uid; + + if (s->str[0] != '#') + continue; + + filter_uid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + if (uid != filter_uid) + continue; + (void)snprintf(uidstr, sizeof(uidstr), "#%u", + (unsigned int)uid); + break; + } + } + } + if (s == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Fake up a passwd struct. */ + memset(&pw, 0, sizeof(pw)); + pw.pw_name = name ? s->str : uidstr; + pw.pw_passwd = "*"; + pw.pw_uid = uid; + pw.pw_gid = (gid_t)-1; + pw.pw_shell = _PATH_BSHELL; + pw.pw_dir = "/"; + + /* Allocate in one big chunk for easy freeing. */ + nsize = psize = csize = gsize = dsize = ssize = 0; + total = sizeof(*pwitem); + FIELD_SIZE(&pw, pw_name, nsize); + FIELD_SIZE(&pw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_SIZE(&pw, pw_class, csize); +#endif + FIELD_SIZE(&pw, pw_gecos, gsize); + FIELD_SIZE(&pw, pw_dir, dsize); + FIELD_SIZE(&pw, pw_shell, ssize); + if (name != NULL) + total += strlen(name) + 1; + + /* Allocate space for struct item, struct passwd and the strings. */ + if ((pwitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + newpw = &pwitem->pw; + + /* + * Copy in passwd contents and make strings relative to space + * at the end of the struct. + */ + memcpy(newpw, &pw, sizeof(pw)); + cp = (char *)(pwitem + 1); + FIELD_COPY(&pw, newpw, pw_name, nsize); + FIELD_COPY(&pw, newpw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_COPY(&pw, newpw, pw_class, csize); +#endif + FIELD_COPY(&pw, newpw, pw_gecos, gsize); + FIELD_COPY(&pw, newpw, pw_dir, dsize); + FIELD_COPY(&pw, newpw, pw_shell, ssize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + pwitem->cache.k.name = cp; + } else { + pwitem->cache.k.uid = pw.pw_uid; + } + pwitem->cache.d.pw = newpw; + pwitem->cache.refcnt = 1; + + debug_return_ptr(&pwitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * gid is the key. Fills in datum from the groups filter. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +cvtsudoers_make_gritem(gid_t gid, const char *name) +{ + char *cp, gidstr[MAX_UID_T_LEN + 2]; + size_t nsize, psize, nmem, total, len; + struct cache_item_gr *gritem; + struct group gr, *newgr; + struct sudoers_string *s = NULL; + debug_decl(cvtsudoers_make_gritem, SUDOERS_DEBUG_NSS) + + /* Look up name or gid in filter list. */ + if (name != NULL) { + STAILQ_FOREACH(s, &filters->groups, entries) { + if (strcasecmp(name, s->str) == 0) { + gid = (gid_t)-1; + break; + } + } + } else { + STAILQ_FOREACH(s, &filters->groups, entries) { + const char *errstr; + gid_t filter_gid; + + if (s->str[0] != '#') + continue; + + filter_gid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + if (gid != filter_gid) + continue; + (void)snprintf(gidstr, sizeof(gidstr), "#%u", + (unsigned int)gid); + break; + } + } + } + if (s == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Fake up a group struct with all filter users as members. */ + memset(&gr, 0, sizeof(gr)); + gr.gr_name = name ? s->str : gidstr; + gr.gr_gid = gid; + + /* Allocate in one big chunk for easy freeing. */ + nsize = psize = nmem = 0; + total = sizeof(*gritem); + FIELD_SIZE(&gr, gr_name, nsize); + FIELD_SIZE(&gr, gr_passwd, psize); + if (!STAILQ_EMPTY(&filters->users)) { + STAILQ_FOREACH(s, &filters->users, entries) { + total += strlen(s->str) + 1; + nmem++; + } + total += sizeof(char *) * nmem; + } + if (name != NULL) + total += strlen(name) + 1; + + if ((gritem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group contents and make strings relative to space + * at the end of the buffer. Note that gr_mem must come + * immediately after struct group to guarantee proper alignment. + */ + newgr = &gritem->gr; + memcpy(newgr, &gr, sizeof(gr)); + cp = (char *)(gritem + 1); + if (nmem != 0) { + newgr->gr_mem = (char **)cp; + cp += sizeof(char *) * nmem; + nmem = 0; + STAILQ_FOREACH(s, &filters->users, entries) { + len = strlen(s->str) + 1; + memcpy(cp, s->str, len); + newgr->gr_mem[nmem++] = cp; + cp += len; + } + newgr->gr_mem[nmem] = NULL; + } + FIELD_COPY(&gr, newgr, gr_passwd, psize); + FIELD_COPY(&gr, newgr, gr_name, nsize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + gritem->cache.k.name = cp; + } else { + gritem->cache.k.gid = gr.gr_gid; + } + gritem->cache.d.gr = newgr; + gritem->cache.refcnt = 1; + + debug_return_ptr(&gritem->cache); +} + +static struct cache_item_gidlist *gidlist_item; + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in datum from the groups filter. + */ +struct cache_item * +cvtsudoers_make_gidlist_item(const struct passwd *pw, char * const *unused1, + unsigned int type) +{ + char *cp; + size_t nsize, total; + struct cache_item_gidlist *glitem; + struct sudoers_string *s; + struct gid_list *gidlist; + GETGROUPS_T *gids = NULL; + int i, ngids = 0; + debug_decl(cvtsudoers_make_gidlist_item, SUDOERS_DEBUG_NSS) + + /* + * There's only a single gid list. + */ + if (gidlist_item != NULL) { + gidlist_item->cache.refcnt++; + debug_return_ptr(&gidlist_item->cache); + } + + /* Count number of possible gids in the filter. */ + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') + ngids++; + } + + /* Allocate gids[] array and fill it with parsed gids. */ + if (ngids != 0) { + gids = reallocarray(NULL, ngids, sizeof(GETGROUPS_T)); + if (gids == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + ngids = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + /* Valid gid. */ + gids[ngids++] = gid; + } + } + } + } + if (ngids == 0) { + free(gids); + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*glitem) + nsize; + total += sizeof(gid_t *) * ngids; + + if ((glitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(gids); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + gidlist = &glitem->gidlist; + cp = (char *)(glitem + 1); + gidlist->gids = (gid_t *)cp; + cp += sizeof(gid_t) * ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + glitem->cache.k.name = cp; + glitem->cache.d.gidlist = gidlist; + glitem->cache.refcnt = 1; + glitem->cache.type = type; + + /* + * Store group IDs. + */ + for (i = 0; i < ngids; i++) + gidlist->gids[i] = gids[i]; + gidlist->ngids = ngids; + free(gids); + + debug_return_ptr(&glitem->cache); +} + +static struct cache_item_gidlist *grlist_item; + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in group names from the groups filter. + */ +struct cache_item * +cvtsudoers_make_grlist_item(const struct passwd *pw, char * const *unused1) +{ + char *cp; + size_t nsize, ngroups, total, len; + struct cache_item_grlist *grlitem; + struct sudoers_string *s; + struct group_list *grlist; + int groupname_len; + debug_decl(cvtsudoers_make_grlist_item, SUDOERS_DEBUG_NSS) + + /* + * There's only a single group list. + */ + if (grlist_item != NULL) { + grlist_item->cache.refcnt++; + debug_return_ptr(&grlist_item->cache); + } + + /* Count number of groups in the filter. */ + ngroups = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + ngroups++; + } + +#ifdef _SC_LOGIN_NAME_MAX + groupname_len = MAX((int)sysconf(_SC_LOGIN_NAME_MAX), 32); +#else + groupname_len = MAX(LOGIN_NAME_MAX, 32); +#endif + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*grlitem) + nsize; + total += groupname_len * ngroups; + +again: + if ((grlitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + grlist = &grlitem->grlist; + cp = (char *)(grlitem + 1); + grlist->groups = (char **)cp; + cp += sizeof(char *) * ngroups; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + grlitem->cache.k.name = cp; + grlitem->cache.d.grlist = grlist; + grlitem->cache.refcnt = 1; + cp += nsize; + + /* + * Copy groups from filter. + */ + ngroups = 0; + STAILQ_FOREACH(s, &filters->groups, entries) { + if (s->str[0] == '#') { + const char *errstr; + sudo_strtoid(s->str + 1, &errstr); + if (errstr == NULL) { + /* Group ID not name, ignore it. */ + continue; + } + } + len = strlen(s->str) + 1; + if (cp - (char *)grlitem + len > total) { + total += len + groupname_len; + free(grlitem); + goto again; + } + memcpy(cp, s->str, len); + grlist->groups[ngroups++] = cp; + cp += len; + } + grlist->ngroups = ngroups; + + debug_return_ptr(&grlitem->cache); +} diff --git a/utsudo-0.0.2/plugins/sudoers/def_data.c b/utsudo-0.0.2/plugins/sudoers/def_data.c new file mode 100644 index 0000000..98999de --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/def_data.c @@ -0,0 +1,527 @@ +static struct def_values def_data_lecture[] = { + { "never", never }, + { "once", once }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_listpw[] = { + { "never", never }, + { "any", any }, + { "all", all }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_verifypw[] = { + { "never", never }, + { "all", all }, + { "any", any }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_fdexec[] = { + { "never", never }, + { "digest_only", digest_only }, + { "always", always }, + { NULL, 0 }, +}; + +static struct def_values def_data_timestamp_type[] = { + { "global", global }, + { "ppid", ppid }, + { "tty", tty }, + { "kernel", kernel }, + { NULL, 0 }, +}; + +struct sudo_defs_types sudo_defs_table[] = { + { + "syslog", T_LOGFAC|T_BOOL, + N_("Syslog facility if syslog is being used for logging: %s"), + NULL, + }, { + "syslog_goodpri", T_LOGPRI|T_BOOL, + N_("Syslog priority to use when user authenticates successfully: %s"), + NULL, + }, { + "syslog_badpri", T_LOGPRI|T_BOOL, + N_("Syslog priority to use when user authenticates unsuccessfully: %s"), + NULL, + }, { + "long_otp_prompt", T_FLAG, + N_("Put OTP prompt on its own line"), + NULL, + }, { + "ignore_dot", T_FLAG, + N_("Ignore '.' in $PATH"), + NULL, + }, { + "mail_always", T_FLAG, + N_("Always send mail when sudo is run"), + NULL, + }, { + "mail_badpass", T_FLAG, + N_("Send mail if user authentication fails"), + NULL, + }, { + "mail_no_user", T_FLAG, + N_("Send mail if the user is not in sudoers"), + NULL, + }, { + "mail_no_host", T_FLAG, + N_("Send mail if the user is not in sudoers for this host"), + NULL, + }, { + "mail_no_perms", T_FLAG, + N_("Send mail if the user is not allowed to run a command"), + NULL, + }, { + "mail_all_cmnds", T_FLAG, + N_("Send mail if the user tries to run a command"), + NULL, + }, { + "tty_tickets", T_FLAG, + N_("Use a separate timestamp for each user/tty combo"), + NULL, + }, { + "lecture", T_TUPLE|T_BOOL, + N_("Lecture user the first time they run sudo"), + def_data_lecture, + }, { + "lecture_file", T_STR|T_PATH|T_BOOL, + N_("File containing the sudo lecture: %s"), + NULL, + }, { + "authenticate", T_FLAG, + N_("Require users to authenticate by default"), + NULL, + }, { + "root_sudo", T_FLAG, + N_("Root may run sudo"), + NULL, + }, { + "log_host", T_FLAG, + N_("Log the hostname in the (non-syslog) log file"), + NULL, + }, { + "log_year", T_FLAG, + N_("Log the year in the (non-syslog) log file"), + NULL, + }, { + "shell_noargs", T_FLAG, + N_("If sudo is invoked with no arguments, start a shell"), + NULL, + }, { + "set_home", T_FLAG, + N_("Set $HOME to the target user when starting a shell with -s"), + NULL, + }, { + "always_set_home", T_FLAG, + N_("Always set $HOME to the target user's home directory"), + NULL, + }, { + "path_info", T_FLAG, + N_("Allow some information gathering to give useful error messages"), + NULL, + }, { + "fqdn", T_FLAG, + N_("Require fully-qualified hostnames in the sudoers file"), + NULL, + }, { + "insults", T_FLAG, + N_("Insult the user when they enter an incorrect password"), + NULL, + }, { + "requiretty", T_FLAG, + N_("Only allow the user to run sudo if they have a tty"), + NULL, + }, { + "env_editor", T_FLAG, + N_("Visudo will honor the EDITOR environment variable"), + NULL, + }, { + "rootpw", T_FLAG, + N_("Prompt for root's password, not the users's"), + NULL, + }, { + "runaspw", T_FLAG, + N_("Prompt for the runas_default user's password, not the users's"), + NULL, + }, { + "targetpw", T_FLAG, + N_("Prompt for the target user's password, not the users's"), + NULL, + }, { + "use_loginclass", T_FLAG, + N_("Apply defaults in the target user's login class if there is one"), + NULL, + }, { + "set_logname", T_FLAG, + N_("Set the LOGNAME and USER environment variables"), + NULL, + }, { + "stay_setuid", T_FLAG, + N_("Only set the effective uid to the target user, not the real uid"), + NULL, + }, { + "preserve_groups", T_FLAG, + N_("Don't initialize the group vector to that of the target user"), + NULL, + }, { + "loglinelen", T_UINT|T_BOOL, + N_("Length at which to wrap log file lines (0 for no wrap): %u"), + NULL, + }, { + "timestamp_timeout", T_TIMESPEC|T_BOOL, + N_("Authentication timestamp timeout: %.1f minutes"), + NULL, + }, { + "passwd_timeout", T_TIMESPEC|T_BOOL, + N_("Password prompt timeout: %.1f minutes"), + NULL, + }, { + "passwd_tries", T_UINT, + N_("Number of tries to enter a password: %u"), + NULL, + }, { + "umask", T_MODE|T_BOOL, + N_("Umask to use or 0777 to use user's: 0%o"), + NULL, + }, { + "logfile", T_STR|T_BOOL|T_PATH, + N_("Path to log file: %s"), + NULL, + }, { + "mailerpath", T_STR|T_BOOL|T_PATH, + N_("Path to mail program: %s"), + NULL, + }, { + "mailerflags", T_STR|T_BOOL, + N_("Flags for mail program: %s"), + NULL, + }, { + "mailto", T_STR|T_BOOL, + N_("Address to send mail to: %s"), + NULL, + }, { + "mailfrom", T_STR|T_BOOL, + N_("Address to send mail from: %s"), + NULL, + }, { + "mailsub", T_STR, + N_("Subject line for mail messages: %s"), + NULL, + }, { + "badpass_message", T_STR, + N_("Incorrect password message: %s"), + NULL, + }, { + "lecture_status_dir", T_STR|T_PATH, + N_("Path to lecture status dir: %s"), + NULL, + }, { + "timestampdir", T_STR|T_PATH, + N_("Path to authentication timestamp dir: %s"), + NULL, + }, { + "timestampowner", T_STR, + N_("Owner of the authentication timestamp dir: %s"), + NULL, + }, { + "exempt_group", T_STR|T_BOOL, + N_("Users in this group are exempt from password and PATH requirements: %s"), + NULL, + }, { + "passprompt", T_STR, + N_("Default password prompt: %s"), + NULL, + }, { + "passprompt_override", T_FLAG, + N_("If set, passprompt will override system prompt in all cases."), + NULL, + }, { + "runas_default", T_STR, + N_("Default user to run commands as: %s"), + NULL, + }, { + "secure_path", T_STR|T_BOOL, + N_("Value to override user's $PATH with: %s"), + NULL, + }, { + "editor", T_STR|T_PATH, + N_("Path to the editor for use by visudo: %s"), + NULL, + }, { + "listpw", T_TUPLE|T_BOOL, + N_("When to require a password for 'list' pseudocommand: %s"), + def_data_listpw, + }, { + "verifypw", T_TUPLE|T_BOOL, + N_("When to require a password for 'verify' pseudocommand: %s"), + def_data_verifypw, + }, { + "noexec", T_FLAG, + N_("Preload the dummy exec functions contained in the sudo_noexec library"), + NULL, + }, { + "ignore_local_sudoers", T_FLAG, + N_("If LDAP directory is up, do we ignore local sudoers file"), + NULL, + }, { + "closefrom", T_INT, + N_("File descriptors >= %d will be closed before executing a command"), + NULL, + }, { + "closefrom_override", T_FLAG, + N_("If set, users may override the value of `closefrom' with the -C option"), + NULL, + }, { + "setenv", T_FLAG, + N_("Allow users to set arbitrary environment variables"), + NULL, + }, { + "env_reset", T_FLAG, + N_("Reset the environment to a default set of variables"), + NULL, + }, { + "env_check", T_LIST|T_BOOL, + N_("Environment variables to check for sanity:"), + NULL, + }, { + "env_delete", T_LIST|T_BOOL, + N_("Environment variables to remove:"), + NULL, + }, { + "env_keep", T_LIST|T_BOOL, + N_("Environment variables to preserve:"), + NULL, + }, { + "role", T_STR, + N_("SELinux role to use in the new security context: %s"), + NULL, + }, { + "type", T_STR, + N_("SELinux type to use in the new security context: %s"), + NULL, + }, { + "env_file", T_STR|T_PATH|T_BOOL, + N_("Path to the sudo-specific environment file: %s"), + NULL, + }, { + "restricted_env_file", T_STR|T_PATH|T_BOOL, + N_("Path to the restricted sudo-specific environment file: %s"), + NULL, + }, { + "sudoers_locale", T_STR, + N_("Locale to use while parsing sudoers: %s"), + NULL, + }, { + "visiblepw", T_FLAG, + N_("Allow sudo to prompt for a password even if it would be visible"), + NULL, + }, { + "pwfeedback", T_FLAG, + N_("Provide visual feedback at the password prompt when there is user input"), + NULL, + }, { + "fast_glob", T_FLAG, + N_("Use faster globbing that is less accurate but does not access the filesystem"), + NULL, + }, { + "umask_override", T_FLAG, + N_("The umask specified in sudoers will override the user's, even if it is more permissive"), + NULL, + }, { + "log_input", T_FLAG, + N_("Log user's input for the command being run"), + NULL, + }, { + "log_output", T_FLAG, + N_("Log the output of the command being run"), + NULL, + }, { + "compress_io", T_FLAG, + N_("Compress I/O logs using zlib"), + NULL, + }, { + "use_pty", T_FLAG, + N_("Always run commands in a pseudo-tty"), + NULL, + }, { + "group_plugin", T_STR, + N_("Plugin for non-Unix group support: %s"), + NULL, + }, { + "iolog_dir", T_STR|T_PATH, + N_("Directory in which to store input/output logs: %s"), + NULL, + }, { + "iolog_file", T_STR, + N_("File in which to store the input/output log: %s"), + NULL, + }, { + "set_utmp", T_FLAG, + N_("Add an entry to the utmp/utmpx file when allocating a pty"), + NULL, + }, { + "utmp_runas", T_FLAG, + N_("Set the user in utmp to the runas user, not the invoking user"), + NULL, + }, { + "privs", T_STR, + N_("Set of permitted privileges: %s"), + NULL, + }, { + "limitprivs", T_STR, + N_("Set of limit privileges: %s"), + NULL, + }, { + "exec_background", T_FLAG, + N_("Run commands on a pty in the background"), + NULL, + }, { + "pam_service", T_STR, + N_("PAM service name to use: %s"), + NULL, + }, { + "pam_login_service", T_STR, + N_("PAM service name to use for login shells: %s"), + NULL, + }, { + "pam_setcred", T_FLAG, + N_("Attempt to establish PAM credentials for the target user"), + NULL, + }, { + "pam_session", T_FLAG, + N_("Create a new PAM session for the command to run in"), + NULL, + }, { + "pam_acct_mgmt", T_FLAG, + N_("Perform PAM account validation management"), + NULL, + }, { + "maxseq", T_UINT, + N_("Maximum I/O log sequence number: %u"), + NULL, + }, { + "use_netgroups", T_FLAG, + N_("Enable sudoers netgroup support"), + NULL, + }, { + "sudoedit_checkdir", T_FLAG, + N_("Check parent directories for writability when editing files with sudoedit"), + NULL, + }, { + "sudoedit_follow", T_FLAG, + N_("Follow symbolic links when editing files with sudoedit"), + NULL, + }, { + "always_query_group_plugin", T_FLAG, + N_("Query the group plugin for unknown system groups"), + NULL, + }, { + "netgroup_tuple", T_FLAG, + N_("Match netgroups based on the entire tuple: user, host and domain"), + NULL, + }, { + "ignore_audit_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the audit log"), + NULL, + }, { + "ignore_iolog_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the I/O log"), + NULL, + }, { + "ignore_logfile_errors", T_FLAG, + N_("Allow commands to be run even if sudo cannot write to the log file"), + NULL, + }, { + "match_group_by_gid", T_FLAG, + N_("Resolve groups in sudoers and match on the group ID, not the name"), + NULL, + }, { + "syslog_maxlen", T_UINT, + N_("Log entries larger than this value will be split into multiple syslog messages: %u"), + NULL, + }, { + "iolog_user", T_STR|T_BOOL, + N_("User that will own the I/O log files: %s"), + NULL, + }, { + "iolog_group", T_STR|T_BOOL, + N_("Group that will own the I/O log files: %s"), + NULL, + }, { + "iolog_mode", T_MODE, + N_("File mode to use for the I/O log files: 0%o"), + NULL, + }, { + "fdexec", T_TUPLE|T_BOOL, + N_("Execute commands by file descriptor instead of by path: %s"), + def_data_fdexec, + }, { + "ignore_unknown_defaults", T_FLAG, + N_("Ignore unknown Defaults entries in sudoers instead of producing a warning"), + NULL, + }, { + "command_timeout", T_TIMEOUT|T_BOOL, + N_("Time in seconds after which the command will be terminated: %u"), + NULL, + }, { + "user_command_timeouts", T_FLAG, + N_("Allow the user to specify a timeout on the command line"), + NULL, + }, { + "iolog_flush", T_FLAG, + N_("Flush I/O log data to disk immediately instead of buffering it"), + NULL, + }, { + "syslog_pid", T_FLAG, + N_("Include the process ID when logging via syslog"), + NULL, + }, { + "timestamp_type", T_TUPLE, + N_("Type of authentication timestamp record: %s"), + def_data_timestamp_type, + }, { + "authfail_message", T_STR, + N_("Authentication failure message: %s"), + NULL, + }, { + "case_insensitive_user", T_FLAG, + N_("Ignore case when matching user names"), + NULL, + }, { + "case_insensitive_group", T_FLAG, + N_("Ignore case when matching group names"), + NULL, + }, { + "log_allowed", T_FLAG, + N_("Log when a command is allowed by sudoers"), + NULL, + }, { + "log_denied", T_FLAG, + N_("Log when a command is denied by sudoers"), + NULL, + }, { + "legacy_group_processing", T_FLAG, + N_("Don't pre-resolve all group names"), + NULL, + }, { + "cmnd_no_wait", T_FLAG, + N_("Don't fork and wait for the command to finish, just exec it"), + NULL, + }, { + "runas_allow_unknown_id", T_FLAG, + N_("Allow the use of unknown runas user and/or group ID"), + NULL, + }, { + "runas_check_shell", T_FLAG, + N_("Only permit running commands as a user with a valid shell"), + NULL, + }, { + NULL, 0, NULL + } +}; diff --git a/utsudo-0.0.2/plugins/sudoers/def_data.h b/utsudo-0.0.2/plugins/sudoers/def_data.h new file mode 100644 index 0000000..23443d6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/def_data.h @@ -0,0 +1,255 @@ +#define I_SYSLOG 0 +#define def_syslog (sudo_defs_table[I_SYSLOG].sd_un.ival) +#define I_SYSLOG_GOODPRI 1 +#define def_syslog_goodpri (sudo_defs_table[I_SYSLOG_GOODPRI].sd_un.ival) +#define I_SYSLOG_BADPRI 2 +#define def_syslog_badpri (sudo_defs_table[I_SYSLOG_BADPRI].sd_un.ival) +#define I_LONG_OTP_PROMPT 3 +#define def_long_otp_prompt (sudo_defs_table[I_LONG_OTP_PROMPT].sd_un.flag) +#define I_IGNORE_DOT 4 +#define def_ignore_dot (sudo_defs_table[I_IGNORE_DOT].sd_un.flag) +#define I_MAIL_ALWAYS 5 +#define def_mail_always (sudo_defs_table[I_MAIL_ALWAYS].sd_un.flag) +#define I_MAIL_BADPASS 6 +#define def_mail_badpass (sudo_defs_table[I_MAIL_BADPASS].sd_un.flag) +#define I_MAIL_NO_USER 7 +#define def_mail_no_user (sudo_defs_table[I_MAIL_NO_USER].sd_un.flag) +#define I_MAIL_NO_HOST 8 +#define def_mail_no_host (sudo_defs_table[I_MAIL_NO_HOST].sd_un.flag) +#define I_MAIL_NO_PERMS 9 +#define def_mail_no_perms (sudo_defs_table[I_MAIL_NO_PERMS].sd_un.flag) +#define I_MAIL_ALL_CMNDS 10 +#define def_mail_all_cmnds (sudo_defs_table[I_MAIL_ALL_CMNDS].sd_un.flag) +#define I_TTY_TICKETS 11 +#define def_tty_tickets (sudo_defs_table[I_TTY_TICKETS].sd_un.flag) +#define I_LECTURE 12 +#define def_lecture (sudo_defs_table[I_LECTURE].sd_un.tuple) +#define I_LECTURE_FILE 13 +#define def_lecture_file (sudo_defs_table[I_LECTURE_FILE].sd_un.str) +#define I_AUTHENTICATE 14 +#define def_authenticate (sudo_defs_table[I_AUTHENTICATE].sd_un.flag) +#define I_ROOT_SUDO 15 +#define def_root_sudo (sudo_defs_table[I_ROOT_SUDO].sd_un.flag) +#define I_LOG_HOST 16 +#define def_log_host (sudo_defs_table[I_LOG_HOST].sd_un.flag) +#define I_LOG_YEAR 17 +#define def_log_year (sudo_defs_table[I_LOG_YEAR].sd_un.flag) +#define I_SHELL_NOARGS 18 +#define def_shell_noargs (sudo_defs_table[I_SHELL_NOARGS].sd_un.flag) +#define I_SET_HOME 19 +#define def_set_home (sudo_defs_table[I_SET_HOME].sd_un.flag) +#define I_ALWAYS_SET_HOME 20 +#define def_always_set_home (sudo_defs_table[I_ALWAYS_SET_HOME].sd_un.flag) +#define I_PATH_INFO 21 +#define def_path_info (sudo_defs_table[I_PATH_INFO].sd_un.flag) +#define I_FQDN 22 +#define def_fqdn (sudo_defs_table[I_FQDN].sd_un.flag) +#define I_INSULTS 23 +#define def_insults (sudo_defs_table[I_INSULTS].sd_un.flag) +#define I_REQUIRETTY 24 +#define def_requiretty (sudo_defs_table[I_REQUIRETTY].sd_un.flag) +#define I_ENV_EDITOR 25 +#define def_env_editor (sudo_defs_table[I_ENV_EDITOR].sd_un.flag) +#define I_ROOTPW 26 +#define def_rootpw (sudo_defs_table[I_ROOTPW].sd_un.flag) +#define I_RUNASPW 27 +#define def_runaspw (sudo_defs_table[I_RUNASPW].sd_un.flag) +#define I_TARGETPW 28 +#define def_targetpw (sudo_defs_table[I_TARGETPW].sd_un.flag) +#define I_USE_LOGINCLASS 29 +#define def_use_loginclass (sudo_defs_table[I_USE_LOGINCLASS].sd_un.flag) +#define I_SET_LOGNAME 30 +#define def_set_logname (sudo_defs_table[I_SET_LOGNAME].sd_un.flag) +#define I_STAY_SETUID 31 +#define def_stay_setuid (sudo_defs_table[I_STAY_SETUID].sd_un.flag) +#define I_PRESERVE_GROUPS 32 +#define def_preserve_groups (sudo_defs_table[I_PRESERVE_GROUPS].sd_un.flag) +#define I_LOGLINELEN 33 +#define def_loglinelen (sudo_defs_table[I_LOGLINELEN].sd_un.uival) +#define I_TIMESTAMP_TIMEOUT 34 +#define def_timestamp_timeout (sudo_defs_table[I_TIMESTAMP_TIMEOUT].sd_un.tspec) +#define I_PASSWD_TIMEOUT 35 +#define def_passwd_timeout (sudo_defs_table[I_PASSWD_TIMEOUT].sd_un.tspec) +#define I_PASSWD_TRIES 36 +#define def_passwd_tries (sudo_defs_table[I_PASSWD_TRIES].sd_un.uival) +#define I_UMASK 37 +#define def_umask (sudo_defs_table[I_UMASK].sd_un.mode) +#define I_LOGFILE 38 +#define def_logfile (sudo_defs_table[I_LOGFILE].sd_un.str) +#define I_MAILERPATH 39 +#define def_mailerpath (sudo_defs_table[I_MAILERPATH].sd_un.str) +#define I_MAILERFLAGS 40 +#define def_mailerflags (sudo_defs_table[I_MAILERFLAGS].sd_un.str) +#define I_MAILTO 41 +#define def_mailto (sudo_defs_table[I_MAILTO].sd_un.str) +#define I_MAILFROM 42 +#define def_mailfrom (sudo_defs_table[I_MAILFROM].sd_un.str) +#define I_MAILSUB 43 +#define def_mailsub (sudo_defs_table[I_MAILSUB].sd_un.str) +#define I_BADPASS_MESSAGE 44 +#define def_badpass_message (sudo_defs_table[I_BADPASS_MESSAGE].sd_un.str) +#define I_LECTURE_STATUS_DIR 45 +#define def_lecture_status_dir (sudo_defs_table[I_LECTURE_STATUS_DIR].sd_un.str) +#define I_TIMESTAMPDIR 46 +#define def_timestampdir (sudo_defs_table[I_TIMESTAMPDIR].sd_un.str) +#define I_TIMESTAMPOWNER 47 +#define def_timestampowner (sudo_defs_table[I_TIMESTAMPOWNER].sd_un.str) +#define I_EXEMPT_GROUP 48 +#define def_exempt_group (sudo_defs_table[I_EXEMPT_GROUP].sd_un.str) +#define I_PASSPROMPT 49 +#define def_passprompt (sudo_defs_table[I_PASSPROMPT].sd_un.str) +#define I_PASSPROMPT_OVERRIDE 50 +#define def_passprompt_override (sudo_defs_table[I_PASSPROMPT_OVERRIDE].sd_un.flag) +#define I_RUNAS_DEFAULT 51 +#define def_runas_default (sudo_defs_table[I_RUNAS_DEFAULT].sd_un.str) +#define I_SECURE_PATH 52 +#define def_secure_path (sudo_defs_table[I_SECURE_PATH].sd_un.str) +#define I_EDITOR 53 +#define def_editor (sudo_defs_table[I_EDITOR].sd_un.str) +#define I_LISTPW 54 +#define def_listpw (sudo_defs_table[I_LISTPW].sd_un.tuple) +#define I_VERIFYPW 55 +#define def_verifypw (sudo_defs_table[I_VERIFYPW].sd_un.tuple) +#define I_NOEXEC 56 +#define def_noexec (sudo_defs_table[I_NOEXEC].sd_un.flag) +#define I_IGNORE_LOCAL_SUDOERS 57 +#define def_ignore_local_sudoers (sudo_defs_table[I_IGNORE_LOCAL_SUDOERS].sd_un.flag) +#define I_CLOSEFROM 58 +#define def_closefrom (sudo_defs_table[I_CLOSEFROM].sd_un.ival) +#define I_CLOSEFROM_OVERRIDE 59 +#define def_closefrom_override (sudo_defs_table[I_CLOSEFROM_OVERRIDE].sd_un.flag) +#define I_SETENV 60 +#define def_setenv (sudo_defs_table[I_SETENV].sd_un.flag) +#define I_ENV_RESET 61 +#define def_env_reset (sudo_defs_table[I_ENV_RESET].sd_un.flag) +#define I_ENV_CHECK 62 +#define def_env_check (sudo_defs_table[I_ENV_CHECK].sd_un.list) +#define I_ENV_DELETE 63 +#define def_env_delete (sudo_defs_table[I_ENV_DELETE].sd_un.list) +#define I_ENV_KEEP 64 +#define def_env_keep (sudo_defs_table[I_ENV_KEEP].sd_un.list) +#define I_ROLE 65 +#define def_role (sudo_defs_table[I_ROLE].sd_un.str) +#define I_TYPE 66 +#define def_type (sudo_defs_table[I_TYPE].sd_un.str) +#define I_ENV_FILE 67 +#define def_env_file (sudo_defs_table[I_ENV_FILE].sd_un.str) +#define I_RESTRICTED_ENV_FILE 68 +#define def_restricted_env_file (sudo_defs_table[I_RESTRICTED_ENV_FILE].sd_un.str) +#define I_SUDOERS_LOCALE 69 +#define def_sudoers_locale (sudo_defs_table[I_SUDOERS_LOCALE].sd_un.str) +#define I_VISIBLEPW 70 +#define def_visiblepw (sudo_defs_table[I_VISIBLEPW].sd_un.flag) +#define I_PWFEEDBACK 71 +#define def_pwfeedback (sudo_defs_table[I_PWFEEDBACK].sd_un.flag) +#define I_FAST_GLOB 72 +#define def_fast_glob (sudo_defs_table[I_FAST_GLOB].sd_un.flag) +#define I_UMASK_OVERRIDE 73 +#define def_umask_override (sudo_defs_table[I_UMASK_OVERRIDE].sd_un.flag) +#define I_LOG_INPUT 74 +#define def_log_input (sudo_defs_table[I_LOG_INPUT].sd_un.flag) +#define I_LOG_OUTPUT 75 +#define def_log_output (sudo_defs_table[I_LOG_OUTPUT].sd_un.flag) +#define I_COMPRESS_IO 76 +#define def_compress_io (sudo_defs_table[I_COMPRESS_IO].sd_un.flag) +#define I_USE_PTY 77 +#define def_use_pty (sudo_defs_table[I_USE_PTY].sd_un.flag) +#define I_GROUP_PLUGIN 78 +#define def_group_plugin (sudo_defs_table[I_GROUP_PLUGIN].sd_un.str) +#define I_IOLOG_DIR 79 +#define def_iolog_dir (sudo_defs_table[I_IOLOG_DIR].sd_un.str) +#define I_IOLOG_FILE 80 +#define def_iolog_file (sudo_defs_table[I_IOLOG_FILE].sd_un.str) +#define I_SET_UTMP 81 +#define def_set_utmp (sudo_defs_table[I_SET_UTMP].sd_un.flag) +#define I_UTMP_RUNAS 82 +#define def_utmp_runas (sudo_defs_table[I_UTMP_RUNAS].sd_un.flag) +#define I_PRIVS 83 +#define def_privs (sudo_defs_table[I_PRIVS].sd_un.str) +#define I_LIMITPRIVS 84 +#define def_limitprivs (sudo_defs_table[I_LIMITPRIVS].sd_un.str) +#define I_EXEC_BACKGROUND 85 +#define def_exec_background (sudo_defs_table[I_EXEC_BACKGROUND].sd_un.flag) +#define I_PAM_SERVICE 86 +#define def_pam_service (sudo_defs_table[I_PAM_SERVICE].sd_un.str) +#define I_PAM_LOGIN_SERVICE 87 +#define def_pam_login_service (sudo_defs_table[I_PAM_LOGIN_SERVICE].sd_un.str) +#define I_PAM_SETCRED 88 +#define def_pam_setcred (sudo_defs_table[I_PAM_SETCRED].sd_un.flag) +#define I_PAM_SESSION 89 +#define def_pam_session (sudo_defs_table[I_PAM_SESSION].sd_un.flag) +#define I_PAM_ACCT_MGMT 90 +#define def_pam_acct_mgmt (sudo_defs_table[I_PAM_ACCT_MGMT].sd_un.flag) +#define I_MAXSEQ 91 +#define def_maxseq (sudo_defs_table[I_MAXSEQ].sd_un.uival) +#define I_USE_NETGROUPS 92 +#define def_use_netgroups (sudo_defs_table[I_USE_NETGROUPS].sd_un.flag) +#define I_SUDOEDIT_CHECKDIR 93 +#define def_sudoedit_checkdir (sudo_defs_table[I_SUDOEDIT_CHECKDIR].sd_un.flag) +#define I_SUDOEDIT_FOLLOW 94 +#define def_sudoedit_follow (sudo_defs_table[I_SUDOEDIT_FOLLOW].sd_un.flag) +#define I_ALWAYS_QUERY_GROUP_PLUGIN 95 +#define def_always_query_group_plugin (sudo_defs_table[I_ALWAYS_QUERY_GROUP_PLUGIN].sd_un.flag) +#define I_NETGROUP_TUPLE 96 +#define def_netgroup_tuple (sudo_defs_table[I_NETGROUP_TUPLE].sd_un.flag) +#define I_IGNORE_AUDIT_ERRORS 97 +#define def_ignore_audit_errors (sudo_defs_table[I_IGNORE_AUDIT_ERRORS].sd_un.flag) +#define I_IGNORE_IOLOG_ERRORS 98 +#define def_ignore_iolog_errors (sudo_defs_table[I_IGNORE_IOLOG_ERRORS].sd_un.flag) +#define I_IGNORE_LOGFILE_ERRORS 99 +#define def_ignore_logfile_errors (sudo_defs_table[I_IGNORE_LOGFILE_ERRORS].sd_un.flag) +#define I_MATCH_GROUP_BY_GID 100 +#define def_match_group_by_gid (sudo_defs_table[I_MATCH_GROUP_BY_GID].sd_un.flag) +#define I_SYSLOG_MAXLEN 101 +#define def_syslog_maxlen (sudo_defs_table[I_SYSLOG_MAXLEN].sd_un.uival) +#define I_IOLOG_USER 102 +#define def_iolog_user (sudo_defs_table[I_IOLOG_USER].sd_un.str) +#define I_IOLOG_GROUP 103 +#define def_iolog_group (sudo_defs_table[I_IOLOG_GROUP].sd_un.str) +#define I_IOLOG_MODE 104 +#define def_iolog_mode (sudo_defs_table[I_IOLOG_MODE].sd_un.mode) +#define I_FDEXEC 105 +#define def_fdexec (sudo_defs_table[I_FDEXEC].sd_un.tuple) +#define I_IGNORE_UNKNOWN_DEFAULTS 106 +#define def_ignore_unknown_defaults (sudo_defs_table[I_IGNORE_UNKNOWN_DEFAULTS].sd_un.flag) +#define I_COMMAND_TIMEOUT 107 +#define def_command_timeout (sudo_defs_table[I_COMMAND_TIMEOUT].sd_un.ival) +#define I_USER_COMMAND_TIMEOUTS 108 +#define def_user_command_timeouts (sudo_defs_table[I_USER_COMMAND_TIMEOUTS].sd_un.flag) +#define I_IOLOG_FLUSH 109 +#define def_iolog_flush (sudo_defs_table[I_IOLOG_FLUSH].sd_un.flag) +#define I_SYSLOG_PID 110 +#define def_syslog_pid (sudo_defs_table[I_SYSLOG_PID].sd_un.flag) +#define I_TIMESTAMP_TYPE 111 +#define def_timestamp_type (sudo_defs_table[I_TIMESTAMP_TYPE].sd_un.tuple) +#define I_AUTHFAIL_MESSAGE 112 +#define def_authfail_message (sudo_defs_table[I_AUTHFAIL_MESSAGE].sd_un.str) +#define I_CASE_INSENSITIVE_USER 113 +#define def_case_insensitive_user (sudo_defs_table[I_CASE_INSENSITIVE_USER].sd_un.flag) +#define I_CASE_INSENSITIVE_GROUP 114 +#define def_case_insensitive_group (sudo_defs_table[I_CASE_INSENSITIVE_GROUP].sd_un.flag) +#define I_LOG_ALLOWED 115 +#define def_log_allowed (sudo_defs_table[I_LOG_ALLOWED].sd_un.flag) +#define I_LOG_DENIED 116 +#define def_log_denied (sudo_defs_table[I_LOG_DENIED].sd_un.flag) +#define I_LEGACY_GROUP_PROCESSING 117 +#define def_legacy_group_processing (sudo_defs_table[I_LEGACY_GROUP_PROCESSING].sd_un.flag) +#define I_CMND_NO_WAIT 118 +#define def_cmnd_no_wait (sudo_defs_table[I_CMND_NO_WAIT].sd_un.flag) +#define I_RUNAS_ALLOW_UNKNOWN_ID 119 +#define def_runas_allow_unknown_id (sudo_defs_table[I_RUNAS_ALLOW_UNKNOWN_ID].sd_un.flag) +#define I_RUNAS_CHECK_SHELL 120 +#define def_runas_check_shell (sudo_defs_table[I_RUNAS_CHECK_SHELL].sd_un.flag) + +enum def_tuple { + never, + once, + always, + any, + all, + digest_only, + global, + ppid, + tty, + kernel +}; diff --git a/utsudo-0.0.2/plugins/sudoers/def_data.in b/utsudo-0.0.2/plugins/sudoers/def_data.in new file mode 100644 index 0000000..6d97f53 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/def_data.in @@ -0,0 +1,381 @@ +# +# Format: +# +# var_name +# TYPE +# description (or NULL) +# array of struct def_values if TYPE == T_TUPLE +# +# NOTE: for tuples that can be used in a boolean context the first +# value corresponds to boolean FALSE and the second to TRUE. +# + +syslog + T_LOGFAC|T_BOOL + "Syslog facility if syslog is being used for logging: %s" +syslog_goodpri + T_LOGPRI|T_BOOL + "Syslog priority to use when user authenticates successfully: %s" +syslog_badpri + T_LOGPRI|T_BOOL + "Syslog priority to use when user authenticates unsuccessfully: %s" +long_otp_prompt + T_FLAG + "Put OTP prompt on its own line" +ignore_dot + T_FLAG + "Ignore '.' in $PATH" +mail_always + T_FLAG + "Always send mail when sudo is run" +mail_badpass + T_FLAG + "Send mail if user authentication fails" +mail_no_user + T_FLAG + "Send mail if the user is not in sudoers" +mail_no_host + T_FLAG + "Send mail if the user is not in sudoers for this host" +mail_no_perms + T_FLAG + "Send mail if the user is not allowed to run a command" +mail_all_cmnds + T_FLAG + "Send mail if the user tries to run a command" +tty_tickets + T_FLAG + "Use a separate timestamp for each user/tty combo" +lecture + T_TUPLE|T_BOOL + "Lecture user the first time they run sudo" + never once always +lecture_file + T_STR|T_PATH|T_BOOL + "File containing the sudo lecture: %s" +authenticate + T_FLAG + "Require users to authenticate by default" +root_sudo + T_FLAG + "Root may run sudo" +log_host + T_FLAG + "Log the hostname in the (non-syslog) log file" +log_year + T_FLAG + "Log the year in the (non-syslog) log file" +shell_noargs + T_FLAG + "If sudo is invoked with no arguments, start a shell" +set_home + T_FLAG + "Set $HOME to the target user when starting a shell with -s" +always_set_home + T_FLAG + "Always set $HOME to the target user's home directory" +path_info + T_FLAG + "Allow some information gathering to give useful error messages" +fqdn + T_FLAG + "Require fully-qualified hostnames in the sudoers file" +insults + T_FLAG + "Insult the user when they enter an incorrect password" +requiretty + T_FLAG + "Only allow the user to run sudo if they have a tty" +env_editor + T_FLAG + "Visudo will honor the EDITOR environment variable" +rootpw + T_FLAG + "Prompt for root's password, not the users's" +runaspw + T_FLAG + "Prompt for the runas_default user's password, not the users's" +targetpw + T_FLAG + "Prompt for the target user's password, not the users's" +use_loginclass + T_FLAG + "Apply defaults in the target user's login class if there is one" +set_logname + T_FLAG + "Set the LOGNAME and USER environment variables" +stay_setuid + T_FLAG + "Only set the effective uid to the target user, not the real uid" +preserve_groups + T_FLAG + "Don't initialize the group vector to that of the target user" +loglinelen + T_UINT|T_BOOL + "Length at which to wrap log file lines (0 for no wrap): %u" +timestamp_timeout + T_TIMESPEC|T_BOOL + "Authentication timestamp timeout: %.1f minutes" +passwd_timeout + T_TIMESPEC|T_BOOL + "Password prompt timeout: %.1f minutes" +passwd_tries + T_UINT + "Number of tries to enter a password: %u" +umask + T_MODE|T_BOOL + "Umask to use or 0777 to use user's: 0%o" +logfile + T_STR|T_BOOL|T_PATH + "Path to log file: %s" +mailerpath + T_STR|T_BOOL|T_PATH + "Path to mail program: %s" +mailerflags + T_STR|T_BOOL + "Flags for mail program: %s" +mailto + T_STR|T_BOOL + "Address to send mail to: %s" +mailfrom + T_STR|T_BOOL + "Address to send mail from: %s" +mailsub + T_STR + "Subject line for mail messages: %s" +badpass_message + T_STR + "Incorrect password message: %s" +lecture_status_dir + T_STR|T_PATH + "Path to lecture status dir: %s" +timestampdir + T_STR|T_PATH + "Path to authentication timestamp dir: %s" +timestampowner + T_STR + "Owner of the authentication timestamp dir: %s" +exempt_group + T_STR|T_BOOL + "Users in this group are exempt from password and PATH requirements: %s" +passprompt + T_STR + "Default password prompt: %s" +passprompt_override + T_FLAG + "If set, passprompt will override system prompt in all cases." +runas_default + T_STR + "Default user to run commands as: %s" +secure_path + T_STR|T_BOOL + "Value to override user's $PATH with: %s" +editor + T_STR|T_PATH + "Path to the editor for use by visudo: %s" +listpw + T_TUPLE|T_BOOL + "When to require a password for 'list' pseudocommand: %s" + never any all always +verifypw + T_TUPLE|T_BOOL + "When to require a password for 'verify' pseudocommand: %s" + never all any always +noexec + T_FLAG + "Preload the dummy exec functions contained in the sudo_noexec library" +ignore_local_sudoers + T_FLAG + "If LDAP directory is up, do we ignore local sudoers file" +closefrom + T_INT + "File descriptors >= %d will be closed before executing a command" +closefrom_override + T_FLAG + "If set, users may override the value of `closefrom' with the -C option" +setenv + T_FLAG + "Allow users to set arbitrary environment variables" +env_reset + T_FLAG + "Reset the environment to a default set of variables" +env_check + T_LIST|T_BOOL + "Environment variables to check for sanity:" +env_delete + T_LIST|T_BOOL + "Environment variables to remove:" +env_keep + T_LIST|T_BOOL + "Environment variables to preserve:" +role + T_STR + "SELinux role to use in the new security context: %s" +type + T_STR + "SELinux type to use in the new security context: %s" +env_file + T_STR|T_PATH|T_BOOL + "Path to the sudo-specific environment file: %s" +restricted_env_file + T_STR|T_PATH|T_BOOL + "Path to the restricted sudo-specific environment file: %s" +sudoers_locale + T_STR + "Locale to use while parsing sudoers: %s" +visiblepw + T_FLAG + "Allow sudo to prompt for a password even if it would be visible" +pwfeedback + T_FLAG + "Provide visual feedback at the password prompt when there is user input" +fast_glob + T_FLAG + "Use faster globbing that is less accurate but does not access the filesystem" +umask_override + T_FLAG + "The umask specified in sudoers will override the user's, even if it is more permissive" +log_input + T_FLAG + "Log user's input for the command being run" +log_output + T_FLAG + "Log the output of the command being run" +compress_io + T_FLAG + "Compress I/O logs using zlib" +use_pty + T_FLAG + "Always run commands in a pseudo-tty" +group_plugin + T_STR + "Plugin for non-Unix group support: %s" +iolog_dir + T_STR|T_PATH + "Directory in which to store input/output logs: %s" +iolog_file + T_STR + "File in which to store the input/output log: %s" +set_utmp + T_FLAG + "Add an entry to the utmp/utmpx file when allocating a pty" +utmp_runas + T_FLAG + "Set the user in utmp to the runas user, not the invoking user" +privs + T_STR + "Set of permitted privileges: %s" +limitprivs + T_STR + "Set of limit privileges: %s" +exec_background + T_FLAG + "Run commands on a pty in the background" +pam_service + T_STR + "PAM service name to use: %s" +pam_login_service + T_STR + "PAM service name to use for login shells: %s" +pam_setcred + T_FLAG + "Attempt to establish PAM credentials for the target user" +pam_session + T_FLAG + "Create a new PAM session for the command to run in" +pam_acct_mgmt + T_FLAG + "Perform PAM account validation management" +maxseq + T_UINT + "Maximum I/O log sequence number: %u" +use_netgroups + T_FLAG + "Enable sudoers netgroup support" +sudoedit_checkdir + T_FLAG + "Check parent directories for writability when editing files with sudoedit" +sudoedit_follow + T_FLAG + "Follow symbolic links when editing files with sudoedit" +always_query_group_plugin + T_FLAG + "Query the group plugin for unknown system groups" +netgroup_tuple + T_FLAG + "Match netgroups based on the entire tuple: user, host and domain" +ignore_audit_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the audit log" +ignore_iolog_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the I/O log" +ignore_logfile_errors + T_FLAG + "Allow commands to be run even if sudo cannot write to the log file" +match_group_by_gid + T_FLAG + "Resolve groups in sudoers and match on the group ID, not the name" +syslog_maxlen + T_UINT + "Log entries larger than this value will be split into multiple syslog messages: %u" +iolog_user + T_STR|T_BOOL + "User that will own the I/O log files: %s" +iolog_group + T_STR|T_BOOL + "Group that will own the I/O log files: %s" +iolog_mode + T_MODE + "File mode to use for the I/O log files: 0%o" +fdexec + T_TUPLE|T_BOOL + "Execute commands by file descriptor instead of by path: %s" + never digest_only always +ignore_unknown_defaults + T_FLAG + "Ignore unknown Defaults entries in sudoers instead of producing a warning" +command_timeout + T_TIMEOUT|T_BOOL + "Time in seconds after which the command will be terminated: %u" +user_command_timeouts + T_FLAG + "Allow the user to specify a timeout on the command line" +iolog_flush + T_FLAG + "Flush I/O log data to disk immediately instead of buffering it" +syslog_pid + T_FLAG + "Include the process ID when logging via syslog" +timestamp_type + T_TUPLE + "Type of authentication timestamp record: %s" + global ppid tty kernel +authfail_message + T_STR + "Authentication failure message: %s" +case_insensitive_user + T_FLAG + "Ignore case when matching user names" +case_insensitive_group + T_FLAG + "Ignore case when matching group names" +log_allowed + T_FLAG + "Log when a command is allowed by sudoers" +log_denied + T_FLAG + "Log when a command is denied by sudoers" +legacy_group_processing + T_FLAG + "Don't pre-resolve all group names" +cmnd_no_wait + T_FLAG + "Don't fork and wait for the command to finish, just exec it" +runas_allow_unknown_id + T_FLAG + "Allow the use of unknown runas user and/or group ID" +runas_check_shell + T_FLAG + "Only permit running commands as a user with a valid shell" + diff --git a/utsudo-0.0.2/plugins/sudoers/defaults.c b/utsudo-0.0.2/plugins/sudoers/defaults.c new file mode 100644 index 0000000..fd75a97 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/defaults.c @@ -0,0 +1,1141 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" +#include + +/* + * For converting between syslog numbers and strings. + */ +struct strmap { + char *name; + int num; +}; + +static struct strmap facilities[] = { +#ifdef LOG_AUTHPRIV + { "authpriv", LOG_AUTHPRIV }, +#endif + { "auth", LOG_AUTH }, + { "daemon", LOG_DAEMON }, + { "user", LOG_USER }, + { "local0", LOG_LOCAL0 }, + { "local1", LOG_LOCAL1 }, + { "local2", LOG_LOCAL2 }, + { "local3", LOG_LOCAL3 }, + { "local4", LOG_LOCAL4 }, + { "local5", LOG_LOCAL5 }, + { "local6", LOG_LOCAL6 }, + { "local7", LOG_LOCAL7 }, + { NULL, -1 } +}; + +static struct strmap priorities[] = { + { "alert", LOG_ALERT }, + { "crit", LOG_CRIT }, + { "debug", LOG_DEBUG }, + { "emerg", LOG_EMERG }, + { "err", LOG_ERR }, + { "info", LOG_INFO }, + { "notice", LOG_NOTICE }, + { "warning", LOG_WARNING }, + { "none", -1 }, + { NULL, -1 } +}; + +static struct early_default early_defaults[] = { + { I_IGNORE_UNKNOWN_DEFAULTS }, +#ifdef FQDN + { I_FQDN, true }, +#else + { I_FQDN }, +#endif + { I_MATCH_GROUP_BY_GID }, + { I_LEGACY_GROUP_PROCESSING }, + { I_GROUP_PLUGIN }, + { I_RUNAS_DEFAULT }, + { I_SUDOERS_LOCALE }, + { -1 } +}; + +/* + * Local prototypes. + */ +static bool store_int(const char *str, union sudo_defs_val *sd_un); +static bool store_list(const char *str, union sudo_defs_val *sd_un, int op); +static bool store_mode(const char *str, union sudo_defs_val *sd_un); +static int store_str(const char *str, union sudo_defs_val *sd_un); +static bool store_syslogfac(const char *str, union sudo_defs_val *sd_un); +static bool store_syslogpri(const char *str, union sudo_defs_val *sd_un); +static bool store_timeout(const char *str, union sudo_defs_val *sd_un); +static bool store_tuple(const char *str, union sudo_defs_val *sd_un, struct def_values *tuple_vals); +static bool store_uint(const char *str, union sudo_defs_val *sd_un); +static bool store_timespec(const char *str, union sudo_defs_val *sd_un); +static bool list_op(const char *str, size_t, union sudo_defs_val *sd_un, enum list_ops op); +static const char *logfac2str(int); +static const char *logpri2str(int); + +/* + * Table describing compile-time and run-time options. + */ +#include + +/* + * Print version and configure info. + */ +void +dump_defaults(void) +{ + struct sudo_defs_types *cur; + struct list_member *item; + struct def_values *def; + char *desc; + debug_decl(dump_defaults, SUDOERS_DEBUG_DEFAULTS) + + for (cur = sudo_defs_table; cur->name; cur++) { + if (cur->desc) { + desc = _(cur->desc); + switch (cur->type & T_MASK) { + case T_FLAG: + if (cur->sd_un.flag) + sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", desc); + break; + case T_STR: + if (cur->sd_un.str) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.str); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_LOGFAC: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + logfac2str(cur->sd_un.ival)); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_LOGPRI: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + logpri2str(cur->sd_un.ival)); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_INT: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.ival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_UINT: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.uival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_TIMESPEC: { + /* display timespec in minutes as a double */ + double d = cur->sd_un.tspec.tv_sec + + (cur->sd_un.tspec.tv_nsec / 1000000000.0); + sudo_printf(SUDO_CONV_INFO_MSG, desc, d / 60.0); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + } + case T_MODE: + sudo_printf(SUDO_CONV_INFO_MSG, desc, cur->sd_un.mode); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + case T_LIST: + if (!SLIST_EMPTY(&cur->sd_un.list)) { + sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", desc); + SLIST_FOREACH(item, &cur->sd_un.list, entries) { + sudo_printf(SUDO_CONV_INFO_MSG, + "\t%s\n", item->value); + } + } + break; + case T_TIMEOUT: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + cur->sd_un.ival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; + case T_TUPLE: + for (def = cur->values; def->sval; def++) { + if (cur->sd_un.tuple == def->nval) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, def->sval); + break; + } + } + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + break; + } + } + } + debug_return; +} + +/* + * Find the index of the specified Defaults name in sudo_defs_table[] + * On success, returns the matching index or -1 on failure. + */ +static int +find_default(const char *name, const char *file, int lineno, bool quiet) +{ + int i; + debug_decl(find_default, SUDOERS_DEBUG_DEFAULTS) + + for (i = 0; sudo_defs_table[i].name != NULL; i++) { + if (strcmp(name, sudo_defs_table[i].name) == 0) + debug_return_int(i); + } + if (!quiet && !def_ignore_unknown_defaults) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d unknown defaults entry \"%s\""), + file, lineno, name); + } else { + sudo_warnx(U_("%s: unknown defaults entry \"%s\""), + file, name); + } + } + debug_return_int(-1); +} + +/* + * Parse a defaults entry, storing the parsed entry in sd_un. + * Returns true on success or false on failure. + */ +static bool +parse_default_entry(struct sudo_defs_types *def, const char *val, int op, + union sudo_defs_val *sd_un, const char *file, int lineno, bool quiet) +{ + int rc; + debug_decl(parse_default_entry, SUDOERS_DEBUG_DEFAULTS) + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s:%d %s=%s op=%d", + __func__, file, lineno, def->name, val ? val : "", op); + + /* + * If no value specified, the boolean flag must be set for non-flags. + * Only flags and tuples support boolean "true". + */ + if (val == NULL) { + switch (def->type & T_MASK) { + case T_FLAG: + break; + case T_TUPLE: + if (ISSET(def->type, T_BOOL)) + break; + /* FALLTHROUGH */ + case T_LOGFAC: + if (op == true) { + /* Use default syslog facility if none specified. */ + val = LOGFAC; + } + break; + default: + if (!ISSET(def->type, T_BOOL) || op != false) { + if (!quiet) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d no value specified for \"%s\""), + file, lineno, def->name); + } else { + sudo_warnx(U_("%s: no value specified for \"%s\""), + file, def->name); + } + } + debug_return_bool(false); + } + } + } + + switch (def->type & T_MASK) { + case T_LOGFAC: + rc = store_syslogfac(val, sd_un); + break; + case T_LOGPRI: + rc = store_syslogpri(val, sd_un); + break; + case T_STR: + if (ISSET(def->type, T_PATH) && val != NULL && *val != '/') { + if (!quiet) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d values for \"%s\" must start with a '/'"), + file, lineno, def->name); + } else { + sudo_warnx(U_("%s: values for \"%s\" must start with a '/'"), + file, def->name); + } + } + rc = -1; + break; + } + rc = store_str(val, sd_un); + break; + case T_INT: + rc = store_int(val, sd_un); + break; + case T_UINT: + rc = store_uint(val, sd_un); + break; + case T_MODE: + rc = store_mode(val, sd_un); + break; + case T_FLAG: + if (val != NULL) { + if (!quiet) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d option \"%s\" does not take a value"), + file, lineno, def->name); + } else { + sudo_warnx(U_("%s: option \"%s\" does not take a value"), + file, def->name); + } + } + rc = -1; + break; + } + sd_un->flag = op; + rc = true; + break; + case T_LIST: + rc = store_list(val, sd_un, op); + break; + case T_TIMEOUT: + rc = store_timeout(val, sd_un); + break; + case T_TUPLE: + rc = store_tuple(val, sd_un, def->values); + break; + case T_TIMESPEC: + rc = store_timespec(val, sd_un); + break; + default: + if (!quiet) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d invalid Defaults type 0x%x for option \"%s\""), + file, lineno, def->type, def->name); + } else { + sudo_warnx(U_("%s: invalid Defaults type 0x%x for option \"%s\""), + file, def->type, def->name); + } + } + rc = -1; + break; + } + if (rc == false) { + if (!quiet) { + if (lineno > 0) { + sudo_warnx(U_("%s:%d value \"%s\" is invalid for option \"%s\""), + file, lineno, val, def->name); + } else { + sudo_warnx(U_("%s: value \"%s\" is invalid for option \"%s\""), + file, val, def->name); + } + } + } + + debug_return_bool(rc == true); +} + +struct early_default * +is_early_default(const char *name) +{ + struct early_default *early; + debug_decl(is_early_default, SUDOERS_DEBUG_DEFAULTS) + + for (early = early_defaults; early->idx != -1; early++) { + if (strcmp(name, sudo_defs_table[early->idx].name) == 0) + debug_return_ptr(early); + } + debug_return_ptr(NULL); +} + +static bool +run_callback(struct sudo_defs_types *def) +{ + debug_decl(run_callback, SUDOERS_DEBUG_DEFAULTS) + + if (def->callback == NULL) + debug_return_bool(true); + debug_return_bool(def->callback(&def->sd_un)); +} + +/* + * Sets/clears an entry in the defaults structure. + * Runs the callback if present on success. + */ +bool +set_default(const char *var, const char *val, int op, const char *file, + int lineno, bool quiet) +{ + int idx; + debug_decl(set_default, SUDOERS_DEBUG_DEFAULTS) + + idx = find_default(var, file, lineno, quiet); + if (idx != -1) { + /* Set parsed value in sudo_defs_table and run callback (if any). */ + struct sudo_defs_types *def = &sudo_defs_table[idx]; + if (parse_default_entry(def, val, op, &def->sd_un, file, lineno, quiet)) + debug_return_bool(run_callback(def)); + } + debug_return_bool(false); +} + +/* + * Like set_default() but stores the matching default value + * and does not run callbacks. + */ +bool +set_early_default(const char *var, const char *val, int op, const char *file, + int lineno, bool quiet, struct early_default *early) +{ + int idx; + debug_decl(set_early_default, SUDOERS_DEBUG_DEFAULTS) + + idx = find_default(var, file, lineno, quiet); + if (idx != -1) { + /* Set parsed value in sudo_defs_table but defer callback (if any). */ + struct sudo_defs_types *def = &sudo_defs_table[idx]; + if (parse_default_entry(def, val, op, &def->sd_un, file, lineno, quiet)) { + early->run_callback = true; + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Run callbacks for early defaults. + */ +bool +run_early_defaults(void) +{ + struct early_default *early; + bool ret = true; + debug_decl(run_early_defaults, SUDOERS_DEBUG_DEFAULTS) + + for (early = early_defaults; early->idx != -1; early++) { + if (early->run_callback) { + if (!run_callback(&sudo_defs_table[early->idx])) + ret = false; + early->run_callback = false; + } + } + debug_return_bool(ret); +} + +static void +free_defs_val(int type, union sudo_defs_val *sd_un) +{ + switch (type & T_MASK) { + case T_STR: + free(sd_un->str); + break; + case T_LIST: + (void)list_op(NULL, 0, sd_un, freeall); + break; + } + memset(sd_un, 0, sizeof(*sd_un)); +} + +/* + * Set default options to compiled-in values. + * Any of these may be overridden at runtime by a "Defaults" file. + */ +bool +init_defaults(void) +{ + static int firsttime = 1; + struct sudo_defs_types *def; + debug_decl(init_defaults, SUDOERS_DEBUG_DEFAULTS) + + /* Clear any old settings. */ + if (!firsttime) { + for (def = sudo_defs_table; def->name != NULL; def++) + free_defs_val(def->type, &def->sd_un); + } + + /* First initialize the flags. */ + def_legacy_group_processing = true; + def_match_group_by_gid = true; +#ifdef LONG_OTP_PROMPT + def_long_otp_prompt = true; +#endif +#ifdef IGNORE_DOT_PATH + def_ignore_dot = true; +#endif +#ifdef ALWAYS_SEND_MAIL + def_mail_always = true; +#endif +#ifdef SEND_MAIL_WHEN_NO_USER + def_mail_no_user = true; +#endif +#ifdef SEND_MAIL_WHEN_NO_HOST + def_mail_no_host = true; +#endif +#ifdef SEND_MAIL_WHEN_NOT_OK + def_mail_no_perms = true; +#endif +#ifndef NO_LECTURE + def_lecture = once; +#endif +#ifndef NO_AUTHENTICATION + def_authenticate = true; +#endif +#ifndef NO_ROOT_SUDO + def_root_sudo = true; +#endif +#ifdef HOST_IN_LOG + def_log_host = true; +#endif +#ifdef SHELL_IF_NO_ARGS + def_shell_noargs = true; +#endif +#ifdef SHELL_SETS_HOME + def_set_home = true; +#endif +#ifndef DONT_LEAK_PATH_INFO + def_path_info = true; +#endif +#ifdef USE_INSULTS + def_insults = true; +#endif +#ifdef FQDN + def_fqdn = true; +#endif +#ifdef ENV_EDITOR + def_env_editor = true; +#endif +#ifdef UMASK_OVERRIDE + def_umask_override = true; +#endif + def_timestamp_type = TIMESTAMP_TYPE; + if ((def_iolog_file = strdup("%{seq}")) == NULL) + goto oom; + if ((def_iolog_dir = strdup(_PATH_SUDO_IO_LOGDIR)) == NULL) + goto oom; + if ((def_sudoers_locale = strdup("C")) == NULL) + goto oom; + def_env_reset = ENV_RESET; + def_set_logname = true; + def_closefrom = STDERR_FILENO + 1; + if ((def_pam_service = strdup("sudo")) == NULL) + goto oom; +#ifdef HAVE_PAM_LOGIN + if ((def_pam_login_service = strdup("sudo-i")) == NULL) + goto oom; +#else + if ((def_pam_login_service = strdup("sudo")) == NULL) + goto oom; +#endif +#ifdef NO_PAM_SESSION + def_pam_session = false; +#else + def_pam_session = true; +#endif +#ifdef HAVE_INNETGR + def_use_netgroups = true; +#endif + def_netgroup_tuple = false; + def_sudoedit_checkdir = true; + def_iolog_mode = S_IRUSR|S_IWUSR; + def_fdexec = digest_only; + def_log_allowed = true; + def_log_denied = true; + def_runas_allow_unknown_id = false; + + /* Syslog options need special care since they both strings and ints */ +#if (LOGGING & SLOG_SYSLOG) + (void) store_syslogfac(LOGFAC, &sudo_defs_table[I_SYSLOG].sd_un); + (void) store_syslogpri(PRI_SUCCESS, &sudo_defs_table[I_SYSLOG_GOODPRI].sd_un); + (void) store_syslogpri(PRI_FAILURE, &sudo_defs_table[I_SYSLOG_BADPRI].sd_un); +#endif + + /* Password flags also have a string and integer component. */ + (void) store_tuple("any", &sudo_defs_table[I_LISTPW].sd_un, sudo_defs_table[I_LISTPW].values); + (void) store_tuple("all", &sudo_defs_table[I_VERIFYPW].sd_un, sudo_defs_table[I_VERIFYPW].values); + + /* Then initialize the int-like things. */ +#ifdef SUDO_UMASK + def_umask = SUDO_UMASK; +#else + def_umask = ACCESSPERMS; +#endif + def_loglinelen = MAXLOGFILELEN; + def_timestamp_timeout.tv_sec = TIMEOUT * 60; + def_passwd_timeout.tv_sec = PASSWORD_TIMEOUT * 60; + def_passwd_tries = TRIES_FOR_PASSWORD; +#ifdef HAVE_ZLIB_H + def_compress_io = true; +#endif + def_ignore_audit_errors = true; + def_ignore_iolog_errors = false; + def_ignore_logfile_errors = true; + + /* Now do the strings */ + if ((def_mailto = strdup(MAILTO)) == NULL) + goto oom; + if ((def_mailsub = strdup(N_(MAILSUBJECT))) == NULL) + goto oom; + if ((def_badpass_message = strdup(_(INCORRECT_PASSWORD))) == NULL) + goto oom; + if ((def_lecture_status_dir = strdup(_PATH_SUDO_LECTURE_DIR)) == NULL) + goto oom; + if ((def_timestampdir = strdup(_PATH_SUDO_TIMEDIR)) == NULL) + goto oom; + if ((def_passprompt = strdup(_(PASSPROMPT))) == NULL) + goto oom; + if ((def_runas_default = strdup(RUNAS_DEFAULT)) == NULL) + goto oom; +#ifdef _PATH_SUDO_SENDMAIL + if ((def_mailerpath = strdup(_PATH_SUDO_SENDMAIL)) == NULL) + goto oom; +#endif + if ((def_mailerflags = strdup("-t")) == NULL) + goto oom; +#if (LOGGING & SLOG_FILE) + if ((def_logfile = strdup(_PATH_SUDO_LOGFILE)) == NULL) + goto oom; +#endif +#ifdef EXEMPTGROUP + if ((def_exempt_group = strdup(EXEMPTGROUP)) == NULL) + goto oom; +#endif +#ifdef SECURE_PATH + if ((def_secure_path = strdup(SECURE_PATH)) == NULL) + goto oom; +#endif + if ((def_editor = strdup(EDITOR)) == NULL) + goto oom; + def_set_utmp = true; + def_pam_acct_mgmt = true; + def_pam_setcred = true; + def_syslog_maxlen = MAXSYSLOGLEN; + def_case_insensitive_user = true; + def_case_insensitive_group = true; + + /* Reset the locale. */ + if (!firsttime) { + if (!sudoers_initlocale(NULL, def_sudoers_locale)) + goto oom; + } + + /* Finally do the lists (currently just environment tables). */ + if (!init_envtables()) + goto oom; + + firsttime = 0; + + debug_return_bool(true); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); +} + +/* + * Check whether a defaults entry matches the specified type. + * Returns true if it matches, else false. + */ +static bool +default_type_matches(struct defaults *d, int what) +{ + debug_decl(default_type_matches, SUDOERS_DEBUG_DEFAULTS) + + switch (d->type) { + case DEFAULTS: + if (ISSET(what, SETDEF_GENERIC)) + debug_return_bool(true); + break; + case DEFAULTS_USER: + if (ISSET(what, SETDEF_USER)) + debug_return_bool(true); + break; + case DEFAULTS_RUNAS: + if (ISSET(what, SETDEF_RUNAS)) + debug_return_bool(true); + break; + case DEFAULTS_HOST: + if (ISSET(what, SETDEF_HOST)) + debug_return_bool(true); + break; + case DEFAULTS_CMND: + if (ISSET(what, SETDEF_CMND)) + debug_return_bool(true); + break; + } + debug_return_bool(false); +} + +/* + * Check whether a defaults entry's binding matches. + * Returns true if it matches, else false. + */ +static bool +default_binding_matches(struct sudoers_parse_tree *parse_tree, + struct defaults *d, int what) +{ + debug_decl(default_binding_matches, SUDOERS_DEBUG_DEFAULTS) + + switch (d->type) { + case DEFAULTS: + debug_return_bool(true); + break; + case DEFAULTS_USER: + if (userlist_matches(parse_tree, sudo_user.pw, d->binding) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_RUNAS: + if (runaslist_matches(parse_tree, d->binding, NULL, NULL, NULL) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_HOST: + if (hostlist_matches(parse_tree, sudo_user.pw, d->binding) == ALLOW) + debug_return_bool(true); + break; + case DEFAULTS_CMND: + if (cmndlist_matches(parse_tree, d->binding) == ALLOW) + debug_return_bool(true); + break; + } + debug_return_bool(false); +} + +/* + * Update the global defaults based on the given defaults list. + * Pass in an OR'd list of which default types to update. + */ +bool +update_defaults(struct sudoers_parse_tree *parse_tree, + struct defaults_list *defs, int what, bool quiet) +{ + struct defaults *d; + bool ret = true; + debug_decl(update_defaults, SUDOERS_DEBUG_DEFAULTS) + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "what: 0x%02x", what); + + /* If no defaults list specified, use the global one in the parse tree. */ + if (defs == NULL) + defs = &parse_tree->defaults; + + /* + * First apply Defaults values marked as early. + */ + TAILQ_FOREACH(d, defs, entries) { + struct early_default *early = is_early_default(d->var); + if (early == NULL) + continue; + + /* Defaults type and binding must match. */ + if (!default_type_matches(d, what) || + !default_binding_matches(parse_tree, d, what)) + continue; + + /* Copy the value to sudo_defs_table and mark as early. */ + if (!set_early_default(d->var, d->val, d->op, d->file, d->lineno, + quiet, early)) + ret = false; + } + /* Run callbacks for early defaults (if any) */ + if (!run_early_defaults()) + ret = false; + + /* + * Then set the rest of the defaults. + */ + TAILQ_FOREACH(d, defs, entries) { + /* Skip Defaults marked as early, we already did them. */ + if (is_early_default(d->var)) + continue; + + /* Defaults type and binding must match. */ + if (!default_type_matches(d, what) || + !default_binding_matches(parse_tree, d, what)) + continue; + + /* Copy the value to sudo_defs_table and run callback (if any) */ + if (!set_default(d->var, d->val, d->op, d->file, d->lineno, quiet)) + ret = false; + } + debug_return_bool(ret); +} + +/* + * Check all defaults entries without actually setting them. + */ +bool +check_defaults(struct sudoers_parse_tree *parse_tree, bool quiet) +{ + struct defaults *d; + bool ret = true; + int idx; + debug_decl(check_defaults, SUDOERS_DEBUG_DEFAULTS) + + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + idx = find_default(d->var, d->file, d->lineno, quiet); + if (idx != -1) { + struct sudo_defs_types *def = &sudo_defs_table[idx]; + union sudo_defs_val sd_un; + memset(&sd_un, 0, sizeof(sd_un)); + if (parse_default_entry(def, d->val, d->op, &sd_un, d->file, + d->lineno, quiet)) { + free_defs_val(def->type, &sd_un); + continue; + } + } + /* There was an error in the entry, flag it. */ + d->error = true; + ret = false; + } + debug_return_bool(ret); +} + +static bool +store_int(const char *str, union sudo_defs_val *sd_un) +{ + const char *errstr; + int i; + debug_decl(store_int, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->ival = 0; + } else { + i = sudo_strtonum(str, INT_MIN, INT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: %s", str, errstr); + debug_return_bool(false); + } + sd_un->ival = i; + } + debug_return_bool(true); +} + +static bool +store_uint(const char *str, union sudo_defs_val *sd_un) +{ + const char *errstr; + unsigned int u; + debug_decl(store_uint, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->uival = 0; + } else { + u = sudo_strtonum(str, 0, UINT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: %s", str, errstr); + debug_return_bool(false); + } + sd_un->uival = u; + } + debug_return_bool(true); +} + +static bool +store_timespec(const char *str, union sudo_defs_val *sd_un) +{ + struct timespec ts; + char sign = '+'; + int i; + debug_decl(store_timespec, SUDOERS_DEBUG_DEFAULTS) + + sudo_timespecclear(&ts); + if (str != NULL) { + /* Convert from minutes to timespec. */ + if (*str == '+' || *str == '-') + sign = *str++; + while (*str != '\0' && *str != '.') { + if (!isdigit((unsigned char)*str)) + debug_return_bool(false); /* invalid number */ + if (ts.tv_sec > TIME_T_MAX / 10) + debug_return_bool(false); /* overflow */ + ts.tv_sec *= 10; + ts.tv_sec += *str++ - '0'; + } + if (*str++ == '.') { + /* Convert optional fractional component to nanosecs. */ + for (i = 100000000; i > 0; i /= 10) { + if (*str == '\0') + break; + if (!isdigit((unsigned char)*str)) + debug_return_bool(false); /* invalid number */ + ts.tv_nsec += i * (*str++ - '0'); + } + } + /* Convert from minutes to seconds. */ + if (ts.tv_sec > TIME_T_MAX / 60) + debug_return_bool(false); /* overflow */ + ts.tv_sec *= 60; + ts.tv_nsec *= 60; + while (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000; + } + } + if (sign == '-') { + sd_un->tspec.tv_sec = -ts.tv_sec; + sd_un->tspec.tv_nsec = -ts.tv_nsec; + } else { + sd_un->tspec.tv_sec = ts.tv_sec; + sd_un->tspec.tv_nsec = ts.tv_nsec; + } + debug_return_bool(true); +} + +static bool +store_tuple(const char *str, union sudo_defs_val *sd_un, + struct def_values *tuple_vals) +{ + struct def_values *v; + debug_decl(store_tuple, SUDOERS_DEBUG_DEFAULTS) + + /* + * Look up tuple value by name to find enum def_tuple value. + * For negation to work the first element of enum def_tuple + * must be equivalent to boolean false. + */ + if (str == NULL) { + sd_un->ival = 0; + } else { + for (v = tuple_vals; v->sval != NULL; v++) { + if (strcmp(v->sval, str) == 0) { + sd_un->tuple = v->nval; + break; + } + } + if (v->sval == NULL) + debug_return_bool(false); + } + debug_return_bool(true); +} + +static int +store_str(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_str, SUDOERS_DEBUG_DEFAULTS) + + free(sd_un->str); + if (str == NULL) { + sd_un->str = NULL; + } else { + if ((sd_un->str = strdup(str)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + debug_return_int(true); +} + +static bool +store_list(const char *str, union sudo_defs_val *sd_un, int op) +{ + debug_decl(store_list, SUDOERS_DEBUG_DEFAULTS) + + /* Remove all old members. */ + if (op == false || op == true) + (void)list_op(NULL, 0, sd_un, freeall); + + /* Split str into multiple space-separated words and act on each one. */ + if (str != NULL) { + const char *cp, *ep; + const char *end = str + strlen(str); + const enum list_ops lop = op == '-' ? delete : add; + + for (cp = sudo_strsplit(str, end, " \t", &ep); cp != NULL; + cp = sudo_strsplit(NULL, end, " \t", &ep)) { + if (!list_op(cp, ep - cp, sd_un, lop)) + debug_return_bool(false); + } + } + debug_return_bool(true); +} + +static bool +store_syslogfac(const char *str, union sudo_defs_val *sd_un) +{ + struct strmap *fac; + debug_decl(store_syslogfac, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->ival = false; + debug_return_bool(true); + } + for (fac = facilities; fac->name != NULL; fac++) { + if (strcmp(str, fac->name) == 0) { + sd_un->ival = fac->num; + debug_return_bool(true); + } + } + debug_return_bool(false); /* not found */ +} + +static const char * +logfac2str(int n) +{ + struct strmap *fac; + debug_decl(logfac2str, SUDOERS_DEBUG_DEFAULTS) + + for (fac = facilities; fac->name && fac->num != n; fac++) + continue; + debug_return_const_str(fac->name); +} + +static bool +store_syslogpri(const char *str, union sudo_defs_val *sd_un) +{ + struct strmap *pri; + debug_decl(store_syslogpri, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->ival = -1; + debug_return_bool(true); + } + for (pri = priorities; pri->name != NULL; pri++) { + if (strcmp(str, pri->name) == 0) { + sd_un->ival = pri->num; + debug_return_bool(true); + } + } + debug_return_bool(false); /* not found */ +} + +static const char * +logpri2str(int n) +{ + struct strmap *pri; + debug_decl(logpri2str, SUDOERS_DEBUG_DEFAULTS) + + for (pri = priorities; pri->name != NULL; pri++) { + if (pri->num == n) + debug_return_const_str(pri->name); + } + debug_return_const_str("unknown"); +} + +static bool +store_mode(const char *str, union sudo_defs_val *sd_un) +{ + mode_t mode; + const char *errstr; + debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->mode = ACCESSPERMS; + } else { + mode = sudo_strtomode(str, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s is %s", str, errstr); + debug_return_bool(false); + } + sd_un->mode = mode; + } + debug_return_bool(true); +} + +static bool +store_timeout(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->ival = 0; + } else { + int seconds = parse_timeout(str); + if (seconds == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "%s", str); + debug_return_bool(false); + } + sd_un->ival = seconds; + } + debug_return_bool(true); +} + +static bool +list_op(const char *str, size_t len, union sudo_defs_val *sd_un, + enum list_ops op) +{ + struct list_member *cur, *prev = NULL; + debug_decl(list_op, SUDOERS_DEBUG_DEFAULTS) + + if (op == freeall) { + while ((cur = SLIST_FIRST(&sd_un->list)) != NULL) { + SLIST_REMOVE_HEAD(&sd_un->list, entries); + free(cur->value); + free(cur); + } + debug_return_bool(true); + } + + SLIST_FOREACH(cur, &sd_un->list, entries) { + if ((strncmp(cur->value, str, len) == 0 && cur->value[len] == '\0')) { + + if (op == add) + debug_return_bool(true); /* already exists */ + + /* Delete node */ + if (prev == NULL) + SLIST_REMOVE_HEAD(&sd_un->list, entries); + else + SLIST_REMOVE_AFTER(prev, entries); + free(cur->value); + free(cur); + break; + } + prev = cur; + } + + /* Add new node to the head of the list. */ + if (op == add) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strndup(str, len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&sd_un->list, cur, entries); + } + debug_return_bool(true); +} diff --git a/utsudo-0.0.2/plugins/sudoers/defaults.h b/utsudo-0.0.2/plugins/sudoers/defaults.h new file mode 100644 index 0000000..404aeb8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/defaults.h @@ -0,0 +1,141 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2008-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_DEFAULTS_H +#define SUDOERS_DEFAULTS_H + +#include +#include +#include "sudo_queue.h" + +struct list_member { + SLIST_ENTRY(list_member) entries; + char *value; +}; + +SLIST_HEAD(list_members, list_member); + +enum list_ops { + add, + delete, + freeall +}; + +/* Mapping of tuple string value to enum def_tuple. */ +struct def_values { + char *sval; /* string value */ + enum def_tuple nval;/* numeric value */ +}; + +union sudo_defs_val { + int flag; + int ival; + unsigned int uival; + enum def_tuple tuple; + char *str; + mode_t mode; + struct timespec tspec; + struct list_members list; +}; + +/* + * Structure describing compile-time and run-time options. + */ +struct sudo_defs_types { + char *name; + int type; + char *desc; + struct def_values *values; + bool (*callback)(const union sudo_defs_val *); + union sudo_defs_val sd_un; +}; + +/* + * Defaults values to apply before others. + */ +struct early_default { + short idx; + short run_callback; +}; + +/* + * Four types of defaults: strings, integers, and flags. + * Also, T_INT, T_TIMESPEC or T_STR may be ANDed with T_BOOL to indicate that + * a value is not required. Flags are boolean by nature... + */ +#undef T_INT +#define T_INT 0x001 +#undef T_UINT +#define T_UINT 0x002 +#undef T_STR +#define T_STR 0x003 +#undef T_FLAG +#define T_FLAG 0x004 +#undef T_MODE +#define T_MODE 0x005 +#undef T_LIST +#define T_LIST 0x006 +#undef T_LOGFAC +#define T_LOGFAC 0x007 +#undef T_LOGPRI +#define T_LOGPRI 0x008 +#undef T_TUPLE +#define T_TUPLE 0x009 +#undef T_TIMESPEC +#define T_TIMESPEC 0x010 +#undef T_TIMEOUT +#define T_TIMEOUT 0x020 +#undef T_MASK +#define T_MASK 0x0FF +#undef T_BOOL +#define T_BOOL 0x100 +#undef T_PATH +#define T_PATH 0x200 + +/* + * Argument to update_defaults() + */ +#define SETDEF_GENERIC 0x01 +#define SETDEF_HOST 0x02 +#define SETDEF_USER 0x04 +#define SETDEF_RUNAS 0x08 +#define SETDEF_CMND 0x10 +#define SETDEF_ALL (SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS|SETDEF_CMND) + +/* + * Prototypes + */ +struct defaults_list; +struct sudoers_parse_tree; +void dump_default(void); +bool init_defaults(void); +struct early_default *is_early_default(const char *name); +bool run_early_defaults(void); +bool set_early_default(const char *var, const char *val, int op, const char *file, int lineno, bool quiet, struct early_default *early); +bool set_default(const char *var, const char *val, int op, const char *file, int lineno, bool quiet); +bool update_defaults(struct sudoers_parse_tree *parse_tree, struct defaults_list *defs, int what, bool quiet); +bool check_defaults(struct sudoers_parse_tree *parse_tree, bool quiet); + +extern struct sudo_defs_types sudo_defs_table[]; + +#endif /* SUDOERS_DEFAULTS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/digestname.c b/utsudo-0.0.2/plugins/sudoers/digestname.c new file mode 100644 index 0000000..88eb143 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/digestname.c @@ -0,0 +1,58 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include "sudo_compat.h" +#include "sudo_digest.h" +#include "sudoers_debug.h" +#include "parse.h" + +const char * +digest_type_to_name(int digest_type) +{ + const char *digest_name; + debug_decl(digest_type_to_name, SUDOERS_DEBUG_UTIL) + + switch (digest_type) { + case SUDO_DIGEST_SHA224: + digest_name = "sha224"; + break; + case SUDO_DIGEST_SHA256: + digest_name = "sha256"; + break; + case SUDO_DIGEST_SHA384: + digest_name = "sha384"; + break; + case SUDO_DIGEST_SHA512: + digest_name = "sha512"; + break; + default: + digest_name = "unknown digest"; + break; + } + debug_return_const_str(digest_name); +} diff --git a/utsudo-0.0.2/plugins/sudoers/editor.c b/utsudo-0.0.2/plugins/sudoers/editor.c new file mode 100644 index 0000000..31d8b6e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/editor.c @@ -0,0 +1,181 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" + +/* + * Search for the specified editor in the user's PATH, checking + * the result against whitelist if non-NULL. An argument vector + * suitable for execve() is allocated and stored in argv_out. + * If nfiles is non-zero, files[] is added to the end of argv_out. + * + * Returns the path to be executed on success, else NULL. + * The caller is responsible for freeing the returned editor path + * as well as the argument vector. + */ +static char * +resolve_editor(const char *ed, size_t edlen, int nfiles, char **files, + int *argc_out, char ***argv_out, char * const *whitelist) +{ + char **nargv, *editor, *editor_path = NULL; + const char *cp, *ep, *tmp; + const char *edend = ed + edlen; + struct stat user_editor_sb; + int nargc; + debug_decl(resolve_editor, SUDOERS_DEBUG_UTIL) + + /* + * Split editor into an argument vector, including files to edit. + * The EDITOR and VISUAL environment variables may contain command + * line args so look for those and alloc space for them too. + */ + cp = sudo_strsplit(ed, edend, " \t", &ep); + if (cp == NULL) + debug_return_str(NULL); + editor = strndup(cp, (size_t)(ep - cp)); + if (editor == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_str(NULL); + } + + /* If we can't find the editor in the user's PATH, give up. */ + if (find_path(editor, &editor_path, &user_editor_sb, getenv("PATH"), 0, whitelist) != FOUND) { + free(editor); + errno = ENOENT; + debug_return_str(NULL); + } + + /* Count rest of arguments and allocate editor argv. */ + for (nargc = 1, tmp = ep; sudo_strsplit(NULL, edend, " \t", &tmp) != NULL; ) + nargc++; + if (nfiles != 0) + nargc += nfiles + 1; + nargv = reallocarray(NULL, nargc + 1, sizeof(char *)); + if (nargv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(editor); + free(editor_path); + debug_return_str(NULL); + } + + /* Fill in editor argv (assumes files[] is NULL-terminated). */ + nargv[0] = editor; + for (nargc = 1; (cp = sudo_strsplit(NULL, edend, " \t", &ep)) != NULL; nargc++) { + nargv[nargc] = strndup(cp, (size_t)(ep - cp)); + if (nargv[nargc] == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(editor_path); + while (nargc--) + free(nargv[nargc]); + free(nargv); + debug_return_str(NULL); + } + } + if (nfiles != 0) { + nargv[nargc++] = "--"; + while (nfiles--) + nargv[nargc++] = *files++; + } + nargv[nargc] = NULL; + + *argc_out = nargc; + *argv_out = nargv; + debug_return_str(editor_path); +} + +/* + * Determine which editor to use based on the SUDO_EDITOR, VISUAL and + * EDITOR environment variables as well as the editor path in sudoers. + * If env_error is true, an editor environment variable that cannot be + * resolved is an error. + * + * Returns the path to be executed on success, else NULL. + * The caller is responsible for freeing the returned editor path + * as well as the argument vector. + */ +char * +find_editor(int nfiles, char **files, int *argc_out, char ***argv_out, + char * const *whitelist, const char **env_editor, bool env_error) +{ + char *ev[3], *editor_path = NULL; + unsigned int i; + debug_decl(find_editor, SUDOERS_DEBUG_UTIL) + + /* + * If any of SUDO_EDITOR, VISUAL or EDITOR are set, choose the first one. + */ + *env_editor = NULL; + ev[0] = "SUDO_EDITOR"; + ev[1] = "VISUAL"; + ev[2] = "EDITOR"; + for (i = 0; i < nitems(ev); i++) { + char *editor = getenv(ev[i]); + + if (editor != NULL && *editor != '\0') { + *env_editor = editor; + editor_path = resolve_editor(editor, strlen(editor), + nfiles, files, argc_out, argv_out, whitelist); + if (editor_path != NULL) + break; + if (errno != ENOENT) + debug_return_str(NULL); + } + } + if (editor_path == NULL) { + const char *def_editor_end = def_editor + strlen(def_editor); + const char *cp, *ep; + + if (env_error && *env_editor != NULL) { + /* User-specified editor could not be found. */ + debug_return_str(NULL); + } + + /* def_editor could be a path, split it up, avoiding strtok() */ + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + editor_path = resolve_editor(cp, (size_t)(ep - cp), nfiles, + files, argc_out, argv_out, whitelist); + if (editor_path != NULL) + break; + if (errno != ENOENT) + debug_return_str(NULL); + } + } + + debug_return_str(editor_path); +} diff --git a/utsudo-0.0.2/plugins/sudoers/env.c b/utsudo-0.0.2/plugins/sudoers/env.c new file mode 100644 index 0000000..2da55e1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/env.c @@ -0,0 +1,1498 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2000-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_LOGIN_CAP_H +# include +# ifndef LOGIN_SETENV +# define LOGIN_SETENV 0 +# endif +#endif /* HAVE_LOGIN_CAP_H */ +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Flags used in rebuild_env() + */ +#undef DID_TERM +#define DID_TERM 0x00000001 +#undef DID_PATH +#define DID_PATH 0x00000002 +#undef DID_HOME +#define DID_HOME 0x00000004 +#undef DID_SHELL +#define DID_SHELL 0x00000008 +#undef DID_LOGNAME +#define DID_LOGNAME 0x00000010 +#undef DID_USER +#define DID_USER 0x00000020 +#undef DID_LOGIN +#define DID_LOGIN 0x00000040 +#undef DID_MAIL +#define DID_MAIL 0x00000080 +#undef DID_MAX +#define DID_MAX 0x0000ffff + +#undef KEPT_TERM +#define KEPT_TERM 0x00010000 +#undef KEPT_PATH +#define KEPT_PATH 0x00020000 +#undef KEPT_HOME +#define KEPT_HOME 0x00040000 +#undef KEPT_SHELL +#define KEPT_SHELL 0x00080000 +#undef KEPT_LOGNAME +#define KEPT_LOGNAME 0x00100000 +#undef KEPT_USER +#define KEPT_USER 0x00200000 +#undef KEPT_LOGIN +#define KEPT_LOGIN 0x00400000 +#undef KEPT_MAIL +#define KEPT_MAIL 0x00800000 +#undef KEPT_MAX +#define KEPT_MAX 0xffff0000 + +/* + * AIX sets the LOGIN environment variable too. + */ +#ifdef _AIX +# define KEPT_USER_VARIABLES (KEPT_LOGIN|KEPT_LOGNAME|KEPT_USER) +#else +# define KEPT_USER_VARIABLES (KEPT_LOGNAME|KEPT_USER) +#endif + +/* + * Functions to open, close and parse an environment file, either + * a system file such as /etc/environment or one specified in sudoers. + */ +struct sudoers_env_file { + void * (*open)(const char *); + void (*close)(void *); + char * (*next)(void *, int *); +}; + +/* + * State for a local environment file. + */ +struct env_file_local { + FILE *fp; + char *line; + size_t linesize; +}; + +struct environment { + char **envp; /* pointer to the new environment */ + char **old_envp; /* pointer the old environment we allocated */ + size_t env_size; /* size of new_environ in char **'s */ + size_t env_len; /* number of slots used, not counting NULL */ +}; + +/* + * Copy of the sudo-managed environment. + */ +static struct environment env; + +/* + * Default table of "bad" variables to remove from the environment. + * XXX - how to omit TERMCAP if it starts with '/'? + */ +static const char *initial_badenv_table[] = { + "IFS", + "CDPATH", + "LOCALDOMAIN", + "RES_OPTIONS", + "HOSTALIASES", + "NLSPATH", + "PATH_LOCALE", + "LD_*", + "_RLD*", +#ifdef __hpux + "SHLIB_PATH", +#endif /* __hpux */ +#ifdef _AIX + "LDR_*", + "LIBPATH", + "AUTHSTATE", +#endif +#ifdef __APPLE__ + "DYLD_*", +#endif +#ifdef HAVE_KERB5 + "KRB5_CONFIG*", + "KRB5_KTNAME", +#endif /* HAVE_KERB5 */ +#ifdef HAVE_SECURID + "VAR_ACE", + "USR_ACE", + "DLC_ACE", +#endif /* HAVE_SECURID */ + "TERMINFO", /* terminfo, exclusive path to terminfo files */ + "TERMINFO_DIRS", /* terminfo, path(s) to terminfo files */ + "TERMPATH", /* termcap, path(s) to termcap files */ + "TERMCAP", /* XXX - only if it starts with '/' */ + "ENV", /* ksh, file to source before script runs */ + "BASH_ENV", /* bash, file to source before script runs */ + "PS4", /* bash, prefix for lines in xtrace mode */ + "GLOBIGNORE", /* bash, globbing patterns to ignore */ + "BASHOPTS", /* bash, initial "shopt -s" options */ + "SHELLOPTS", /* bash, initial "set -o" options */ + "JAVA_TOOL_OPTIONS", /* java, extra command line options */ + "PERLIO_DEBUG ", /* perl, debugging output file */ + "PERLLIB", /* perl, search path for modules/includes */ + "PERL5LIB", /* perl 5, search path for modules/includes */ + "PERL5OPT", /* perl 5, extra command line options */ + "PERL5DB", /* perl 5, command used to load debugger */ + "FPATH", /* ksh, search path for functions */ + "NULLCMD", /* zsh, command for null file redirection */ + "READNULLCMD", /* zsh, command for null file redirection */ + "ZDOTDIR", /* zsh, search path for dot files */ + "TMPPREFIX", /* zsh, prefix for temporary files */ + "PYTHONHOME", /* python, module search path */ + "PYTHONPATH", /* python, search path */ + "PYTHONINSPECT", /* python, allow inspection */ + "PYTHONUSERBASE", /* python, per user site-packages directory */ + "RUBYLIB", /* ruby, library load path */ + "RUBYOPT", /* ruby, extra command line options */ + "*=()*", /* bash functions */ + NULL +}; + +/* + * Default table of variables to check for '%' and '/' characters. + */ +static const char *initial_checkenv_table[] = { + "COLORTERM", + "LANG", + "LANGUAGE", + "LC_*", + "LINGUAS", + "TERM", + "TZ", + NULL +}; + +/* + * Default table of variables to preserve in the environment. + */ +static const char *initial_keepenv_table[] = { + "COLORS", + "DISPLAY", + "HOSTNAME", + "KRB5CCNAME", + "LS_COLORS", + "PATH", + "PS1", + "PS2", + "XAUTHORITY", + "XAUTHORIZATION", + NULL +}; + +/* + * Initialize env based on envp. + */ +bool +env_init(char * const envp[]) +{ + char * const *ep; + size_t len; + debug_decl(env_init, SUDOERS_DEBUG_ENV) + + if (envp == NULL) { + /* Free the old envp we allocated, if any. */ + free(env.old_envp); + + /* Reset to initial state but keep a pointer to what we allocated. */ + env.old_envp = env.envp; + env.envp = NULL; + env.env_size = 0; + env.env_len = 0; + } else { + /* Make private copy of envp. */ + for (ep = envp; *ep != NULL; ep++) + continue; + len = (size_t)(ep - envp); + + env.env_len = len; + env.env_size = len + 1 + 128; + env.envp = reallocarray(NULL, env.env_size, sizeof(char *)); + if (env.envp == NULL) { + env.env_size = 0; + env.env_len = 0; + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } +#ifdef ENV_DEBUG + memset(env.envp, 0, env.env_size * sizeof(char *)); +#endif + memcpy(env.envp, envp, len * sizeof(char *)); + env.envp[len] = NULL; + + /* Free the old envp we allocated, if any. */ + free(env.old_envp); + env.old_envp = NULL; + } + + debug_return_bool(true); +} + +/* + * Getter for private copy of the environment. + */ +char ** +env_get(void) +{ + return env.envp; +} + +/* + * Swap the old and new copies of the environment. + */ +bool +env_swap_old(void) +{ + char **old_envp; + + if (env.old_envp == NULL) + return false; + old_envp = env.old_envp; + env.old_envp = env.envp; + env.envp = old_envp; + return true; +} + +/* + * Similar to putenv(3) but operates on sudo's private copy of the + * environment (not environ) and it always overwrites. The dupcheck param + * determines whether we need to verify that the variable is not already set. + * Will only overwrite an existing variable if overwrite is set. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_putenv_nodebug(char *str, bool dupcheck, bool overwrite) +{ + char **ep; + size_t len; + bool found = false; + + /* Make sure there is room for the new entry plus a NULL. */ + if (env.env_size > 2 && env.env_len > env.env_size - 2) { + char **nenvp; + size_t nsize; + + if (env.env_size > SIZE_MAX - 128) { + sudo_warnx_nodebug(U_("internal error, %s overflow"), + "sudo_putenv_nodebug"); + errno = EOVERFLOW; + return -1; + } + nsize = env.env_size + 128; + if (nsize > SIZE_MAX / sizeof(char *)) { + sudo_warnx_nodebug(U_("internal error, %s overflow"), + "sudo_putenv_nodebug"); + errno = EOVERFLOW; + return -1; + } + nenvp = reallocarray(env.envp, nsize, sizeof(char *)); + if (nenvp == NULL) + return -1; + env.envp = nenvp; + env.env_size = nsize; +#ifdef ENV_DEBUG + memset(env.envp + env.env_len, 0, + (env.env_size - env.env_len) * sizeof(char *)); +#endif + } + +#ifdef ENV_DEBUG + if (env.envp[env.env_len] != NULL) { + errno = EINVAL; + return -1; + } +#endif + + if (dupcheck) { + len = (strchr(str, '=') - str) + 1; + for (ep = env.envp; *ep != NULL; ep++) { + if (strncmp(str, *ep, len) == 0) { + if (overwrite) + *ep = str; + found = true; + break; + } + } + /* Prune out extra instances of the variable we just overwrote. */ + if (found && overwrite) { + while (*++ep != NULL) { + if (strncmp(str, *ep, len) == 0) { + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + ep--; + } + } + env.env_len = ep - env.envp; + } + } + + if (!found) { + ep = env.envp + env.env_len; + env.env_len++; + *ep++ = str; + *ep = NULL; + } + return 0; +} + +/* + * Similar to putenv(3) but operates on sudo's private copy of the + * environment (not environ) and it always overwrites. The dupcheck param + * determines whether we need to verify that the variable is not already set. + * Will only overwrite an existing variable if overwrite is set. + */ +static int +sudo_putenv(char *str, bool dupcheck, bool overwrite) +{ + int ret; + debug_decl(sudo_putenv, SUDOERS_DEBUG_ENV) + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_putenv: %s", str); + + ret = sudo_putenv_nodebug(str, dupcheck, overwrite); + if (ret == -1) { +#ifdef ENV_DEBUG + if (env.envp[env.env_len] != NULL) + sudo_warnx(U_("sudo_putenv: corrupted envp, length mismatch")); +#endif + } + debug_return_int(ret); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + * The dupcheck param determines whether we need to verify that the variable + * is not already set. + */ +static int +sudo_setenv2(const char *var, const char *val, bool dupcheck, bool overwrite) +{ + char *estring; + size_t esize; + int ret = -1; + debug_decl(sudo_setenv2, SUDOERS_DEBUG_ENV) + + esize = strlen(var) + 1 + strlen(val) + 1; + if ((estring = malloc(esize)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_int(-1); + } + + /* Build environment string and insert it. */ + if (strlcpy(estring, var, esize) >= esize || + strlcat(estring, "=", esize) >= esize || + strlcat(estring, val, esize) >= esize) { + + sudo_warnx(U_("internal error, %s overflow"), __func__); + errno = EOVERFLOW; + } else { + ret = sudo_putenv(estring, dupcheck, overwrite); + } + if (ret == -1) + free(estring); + else + sudoers_gc_add(GC_PTR, estring); + debug_return_int(ret); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + */ +int +sudo_setenv(const char *var, const char *val, int overwrite) +{ + return sudo_setenv2(var, val, true, (bool)overwrite); +} + +/* + * Similar to setenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_setenv_nodebug(const char *var, const char *val, int overwrite) +{ + char *ep, *estring = NULL; + const char *cp; + size_t esize; + int ret = -1; + + if (var == NULL || *var == '\0') { + errno = EINVAL; + goto done; + } + + /* + * POSIX says a var name with '=' is an error but BSD + * just ignores the '=' and anything after it. + */ + for (cp = var; *cp && *cp != '='; cp++) + continue; + esize = (size_t)(cp - var) + 2; + if (val) { + esize += strlen(val); /* glibc treats a NULL val as "" */ + } + + /* Allocate and fill in estring. */ + if ((estring = ep = malloc(esize)) == NULL) + goto done; + for (cp = var; *cp && *cp != '='; cp++) + *ep++ = *cp; + *ep++ = '='; + if (val) { + for (cp = val; *cp; cp++) + *ep++ = *cp; + } + *ep = '\0'; + + ret = sudo_putenv_nodebug(estring, true, overwrite); +done: + if (ret == -1) + free(estring); + else + sudoers_gc_add(GC_PTR, estring); + return ret; +} + +/* + * Similar to unsetenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static int +sudo_unsetenv_nodebug(const char *var) +{ + char **ep = env.envp; + size_t len; + + if (ep == NULL || var == NULL || *var == '\0' || strchr(var, '=') != NULL) { + errno = EINVAL; + return -1; + } + + len = strlen(var); + while (*ep != NULL) { + if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') { + /* Found it; shift remainder + NULL over by one. */ + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + env.env_len--; + /* Keep going, could be multiple instances of the var. */ + } else { + ep++; + } + } + return 0; +} + +/* + * Similar to unsetenv(3) but operates on a private copy of the environment. + */ +int +sudo_unsetenv(const char *name) +{ + int ret; + debug_decl(sudo_unsetenv, SUDOERS_DEBUG_ENV) + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_unsetenv: %s", name); + + ret = sudo_unsetenv_nodebug(name); + + debug_return_int(ret); +} + +/* + * Similar to getenv(3) but operates on a private copy of the environment. + * Does not include warnings or debugging to avoid recursive calls. + */ +static char * +sudo_getenv_nodebug(const char *name) +{ + char **ep, *val = NULL; + size_t namelen = 0; + + if (env.env_len != 0) { + /* For BSD compatibility, treat '=' in name like end of string. */ + while (name[namelen] != '\0' && name[namelen] != '=') + namelen++; + for (ep = env.envp; *ep != NULL; ep++) { + if (strncmp(*ep, name, namelen) == 0 && (*ep)[namelen] == '=') { + val = *ep + namelen + 1; + break; + } + } + } + return val; +} + +/* + * Similar to getenv(3) but operates on a private copy of the environment. + */ +char * +sudo_getenv(const char *name) +{ + char *val; + debug_decl(sudo_getenv, SUDOERS_DEBUG_ENV) + + sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_getenv: %s", name); + + val = sudo_getenv_nodebug(name); + + debug_return_str(val); +} + +/* + * Check for var against patterns in the specified environment list. + * Returns true if the variable was found, else false. + */ +static bool +matches_env_list(const char *var, struct list_members *list, bool *full_match) +{ + struct list_member *cur; + bool is_logname = false; + debug_decl(matches_env_list, SUDOERS_DEBUG_ENV) + + switch (*var) { + case 'L': + if (strncmp(var, "LOGNAME=", 8) == 0) + is_logname = true; +#ifdef _AIX + else if (strncmp(var, "LOGIN=", 6) == 0) + is_logname = true; +#endif + break; + case 'U': + if (strncmp(var, "USER=", 5) == 0) + is_logname = true; + break; + } + + if (is_logname) { + /* + * We treat LOGIN, LOGNAME and USER specially. + * If one is preserved/deleted we want to preserve/delete them all. + */ + SLIST_FOREACH(cur, list, entries) { + if (matches_env_pattern(cur->value, "LOGNAME", full_match) || +#ifdef _AIX + matches_env_pattern(cur->value, "LOGIN", full_match) || +#endif + matches_env_pattern(cur->value, "USER", full_match)) + debug_return_bool(true); + } + } else { + SLIST_FOREACH(cur, list, entries) { + if (matches_env_pattern(cur->value, var, full_match)) + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Check the env_delete blacklist. + * Returns true if the variable was found, else false. + */ +static bool +matches_env_delete(const char *var) +{ + bool full_match; /* unused */ + debug_decl(matches_env_delete, SUDOERS_DEBUG_ENV) + + /* Skip anything listed in env_delete. */ + debug_return_bool(matches_env_list(var, &def_env_delete, &full_match)); +} + +/* + * Sanity-check the TZ environment variable. + * On many systems it is possible to set this to a pathname. + */ +static bool +tz_is_sane(const char *tzval) +{ + const char *cp; + char lastch; + debug_decl(tz_is_sane, SUDOERS_DEBUG_ENV) + + /* tzcode treats a value beginning with a ':' as a path. */ + if (tzval[0] == ':') + tzval++; + + /* Reject fully-qualified TZ that doesn't being with the zoneinfo dir. */ + if (tzval[0] == '/') { +#ifdef _PATH_ZONEINFO + if (strncmp(tzval, _PATH_ZONEINFO, sizeof(_PATH_ZONEINFO) - 1) != 0 || + tzval[sizeof(_PATH_ZONEINFO) - 1] != '/') + debug_return_bool(false); +#else + /* Assume the worst. */ + debug_return_bool(false); +#endif + } + + /* + * Make sure TZ only contains printable non-space characters + * and does not contain a '..' path element. + */ + lastch = '/'; + for (cp = tzval; *cp != '\0'; cp++) { + if (isspace((unsigned char)*cp) || !isprint((unsigned char)*cp)) + debug_return_bool(false); + if (lastch == '/' && cp[0] == '.' && cp[1] == '.' && + (cp[2] == '/' || cp[2] == '\0')) + debug_return_bool(false); + lastch = *cp; + } + + /* Reject extra long TZ values (even if not a path). */ + if ((size_t)(cp - tzval) >= PATH_MAX) + debug_return_bool(false); + + debug_return_bool(true); +} + +/* + * Apply the env_check list. + * Returns true if the variable is allowed, false if denied + * or -1 if no match. + */ +static int +matches_env_check(const char *var, bool *full_match) +{ + int keepit = -1; + debug_decl(matches_env_check, SUDOERS_DEBUG_ENV) + + /* Skip anything listed in env_check that includes '/' or '%'. */ + if (matches_env_list(var, &def_env_check, full_match)) { + if (strncmp(var, "TZ=", 3) == 0) { + /* Special case for TZ */ + keepit = tz_is_sane(var + 3); + } else { + const char *val = strchr(var, '='); + if (val != NULL) + keepit = !strpbrk(++val, "/%"); + } + } + debug_return_int(keepit); +} + +/* + * Check the env_keep list. + * Returns true if the variable is allowed else false. + */ +static bool +matches_env_keep(const char *var, bool *full_match) +{ + bool keepit = false; + debug_decl(matches_env_keep, SUDOERS_DEBUG_ENV) + + /* Preserve SHELL variable for "sudo -s". */ + if (ISSET(sudo_mode, MODE_SHELL) && strncmp(var, "SHELL=", 6) == 0) { + keepit = true; + } else if (matches_env_list(var, &def_env_keep, full_match)) { + keepit = true; + } + debug_return_bool(keepit); +} + +/* + * Look up var in the env_delete and env_check. + * Returns true if we should delete the variable, else false. + */ +static bool +env_should_delete(const char *var) +{ + int delete_it; + bool full_match = false; + debug_decl(env_should_delete, SUDOERS_DEBUG_ENV); + + delete_it = matches_env_delete(var); + if (!delete_it) + delete_it = matches_env_check(var, &full_match) == false; + + sudo_debug_printf(SUDO_DEBUG_INFO, "delete %s: %s", + var, delete_it ? "YES" : "NO"); + debug_return_bool(delete_it); +} + +/* + * Lookup var in the env_check and env_keep lists. + * Returns true if the variable is allowed else false. + */ +static bool +env_should_keep(const char *var) +{ + int keepit; + bool full_match = false; + const char *cp; + debug_decl(env_should_keep, SUDOERS_DEBUG_ENV) + + keepit = matches_env_check(var, &full_match); + if (keepit == -1) + keepit = matches_env_keep(var, &full_match); + + /* Skip bash functions unless we matched on the value as well as name. */ + if (keepit && !full_match) { + if ((cp = strchr(var, '=')) != NULL) { + if (strncmp(cp, "=() ", 4) == 0) + keepit = false; + } + } + sudo_debug_printf(SUDO_DEBUG_INFO, "keep %s: %s", + var, keepit == true ? "YES" : "NO"); + debug_return_bool(keepit == true); +} + +#ifdef HAVE_PAM +/* + * Merge another environment with our private copy. + * Only overwrite an existing variable if it is not + * being preserved from the user's environment. + * Returns true on success or false on failure. + */ +bool +env_merge(char * const envp[]) +{ + char * const *ep; + bool ret = true; + debug_decl(env_merge, SUDOERS_DEBUG_ENV) + + for (ep = envp; *ep != NULL; ep++) { + /* XXX - avoid checking value here, should only check name */ + bool overwrite = def_env_reset ? !env_should_keep(*ep) : env_should_delete(*ep); + if (sudo_putenv(*ep, true, overwrite) == -1) { + /* XXX cannot undo on failure */ + ret = false; + break; + } + } + debug_return_bool(ret); +} +#endif /* HAVE_PAM */ + +static void +env_update_didvar(const char *ep, unsigned int *didvar) +{ + switch (*ep) { + case 'H': + if (strncmp(ep, "HOME=", 5) == 0) + SET(*didvar, DID_HOME); + break; + case 'L': +#ifdef _AIX + if (strncmp(ep, "LOGIN=", 8) == 0) + SET(*didvar, DID_LOGIN); +#endif + if (strncmp(ep, "LOGNAME=", 8) == 0) + SET(*didvar, DID_LOGNAME); + break; + case 'M': + if (strncmp(ep, "MAIL=", 5) == 0) + SET(*didvar, DID_MAIL); + break; + case 'P': + if (strncmp(ep, "PATH=", 5) == 0) + SET(*didvar, DID_PATH); + break; + case 'S': + if (strncmp(ep, "SHELL=", 6) == 0) + SET(*didvar, DID_SHELL); + break; + case 'T': + if (strncmp(ep, "TERM=", 5) == 0) + SET(*didvar, DID_TERM); + break; + case 'U': + if (strncmp(ep, "USER=", 5) == 0) + SET(*didvar, DID_USER); + break; + } +} + +#define CHECK_PUTENV(a, b, c) do { \ + if (sudo_putenv((a), (b), (c)) == -1) \ + goto bad; \ +} while (0) + +#define CHECK_SETENV2(a, b, c, d) do { \ + if (sudo_setenv2((a), (b), (c), (d)) == -1) \ + goto bad; \ +} while (0) + +/* + * Build a new environment and ether clear potentially dangerous + * variables from the old one or start with a clean slate. + * Also adds sudo-specific variables (SUDO_*). + * Returns true on success or false on failure. + */ +bool +rebuild_env(void) +{ + char **ep, *cp, *ps1; + char idbuf[MAX_UID_T_LEN + 1]; + unsigned int didvar; + bool reset_home = false; + debug_decl(rebuild_env, SUDOERS_DEBUG_ENV) + + /* + * Either clean out the environment or reset to a safe default. + */ + ps1 = NULL; + didvar = 0; + env.env_len = 0; + env.env_size = 128; + free(env.old_envp); + env.old_envp = env.envp; + env.envp = reallocarray(NULL, env.env_size, sizeof(char *)); + if (env.envp == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + env.env_size = 0; + goto bad; + } +#ifdef ENV_DEBUG + memset(env.envp, 0, env.env_size * sizeof(char *)); +#else + env.envp[0] = NULL; +#endif + + /* Reset HOME based on target user if configured to. */ + if (ISSET(sudo_mode, MODE_RUN)) { + if (def_always_set_home || + ISSET(sudo_mode, MODE_RESET_HOME | MODE_LOGIN_SHELL) || + (ISSET(sudo_mode, MODE_SHELL) && def_set_home)) + reset_home = true; + } + + if (def_env_reset || ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + /* + * If starting with a fresh environment, initialize it based on + * /etc/environment or login.conf. For "sudo -i" we want those + * variables to override the invoking user's environment, so we + * defer reading them until later. + */ + if (!ISSET(sudo_mode, MODE_LOGIN_SHELL)) { +#ifdef HAVE_LOGIN_CAP_H + /* Insert login class environment variables. */ + if (login_class) { + login_cap_t *lc = login_getclass(login_class); + if (lc != NULL) { + setusercontext(lc, runas_pw, runas_pw->pw_uid, + LOGIN_SETPATH|LOGIN_SETENV); + login_close(lc); + } + } +#endif /* HAVE_LOGIN_CAP_H */ +#if defined(_AIX) || (defined(__linux__) && !defined(HAVE_PAM)) + /* Insert system-wide environment variables. */ + read_env_file(_PATH_ENVIRONMENT, true, false); +#endif + for (ep = env.envp; *ep; ep++) + env_update_didvar(*ep, &didvar); + } + + /* Pull in vars we want to keep from the old environment. */ + for (ep = env.old_envp; *ep; ep++) { + bool keepit; + + /* + * Look up the variable in the env_check and env_keep lists. + */ + keepit = env_should_keep(*ep); + + /* + * Do SUDO_PS1 -> PS1 conversion. + * This must happen *after* env_should_keep() is called. + */ + if (strncmp(*ep, "SUDO_PS1=", 9) == 0) + ps1 = *ep + 5; + + if (keepit) { + /* Preserve variable. */ + CHECK_PUTENV(*ep, true, false); + env_update_didvar(*ep, &didvar); + } + } + didvar |= didvar << 16; /* convert DID_* to KEPT_* */ + + /* + * Add in defaults. In -i mode these come from the runas user, + * otherwise they may be from the user's environment (depends + * on sudoers options). + */ + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + CHECK_SETENV2("SHELL", runas_pw->pw_shell, + ISSET(didvar, DID_SHELL), true); +#ifdef _AIX + CHECK_SETENV2("LOGIN", runas_pw->pw_name, + ISSET(didvar, DID_LOGIN), true); +#endif + CHECK_SETENV2("LOGNAME", runas_pw->pw_name, + ISSET(didvar, DID_LOGNAME), true); + CHECK_SETENV2("USER", runas_pw->pw_name, + ISSET(didvar, DID_USER), true); + } else { + /* We will set LOGNAME later in the def_set_logname case. */ + if (!def_set_logname) { +#ifdef _AIX + if (!ISSET(didvar, DID_LOGIN)) + CHECK_SETENV2("LOGIN", user_name, false, true); +#endif + if (!ISSET(didvar, DID_LOGNAME)) + CHECK_SETENV2("LOGNAME", user_name, false, true); + if (!ISSET(didvar, DID_USER)) + CHECK_SETENV2("USER", user_name, false, true); + } + } + + /* If we didn't keep HOME, reset it based on target user. */ + if (!ISSET(didvar, KEPT_HOME)) + reset_home = true; + + /* + * Set MAIL to target user in -i mode or if MAIL is not preserved + * from user's environment. + */ + if (ISSET(sudo_mode, MODE_LOGIN_SHELL) || !ISSET(didvar, KEPT_MAIL)) { + if (_PATH_MAILDIR[sizeof(_PATH_MAILDIR) - 2] == '/') { + if (asprintf(&cp, "MAIL=%s%s", _PATH_MAILDIR, runas_pw->pw_name) == -1) + goto bad; + } else { + if (asprintf(&cp, "MAIL=%s/%s", _PATH_MAILDIR, runas_pw->pw_name) == -1) + goto bad; + } + if (sudo_putenv(cp, ISSET(didvar, DID_MAIL), true) == -1) { + free(cp); + goto bad; + } + sudoers_gc_add(GC_PTR, cp); + } + } else { + /* + * Copy environ entries as long as they don't match env_delete or + * env_check. + */ + for (ep = env.old_envp; *ep; ep++) { + /* Add variable unless it matches a black list. */ + if (!env_should_delete(*ep)) { + if (strncmp(*ep, "SUDO_PS1=", 9) == 0) + ps1 = *ep + 5; + else if (strncmp(*ep, "SHELL=", 6) == 0) + SET(didvar, DID_SHELL); + else if (strncmp(*ep, "PATH=", 5) == 0) + SET(didvar, DID_PATH); + else if (strncmp(*ep, "TERM=", 5) == 0) + SET(didvar, DID_TERM); + CHECK_PUTENV(*ep, true, false); + } + } + } + /* Replace the PATH envariable with a secure one? */ + if (def_secure_path && !user_is_exempt()) { + CHECK_SETENV2("PATH", def_secure_path, true, true); + SET(didvar, DID_PATH); + } + + /* + * Set LOGIN, LOGNAME, and USER to target if "set_logname" is not + * disabled. We skip this if we are running a login shell (because + * they have already been set). + */ + if (def_set_logname && !ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + if ((didvar & KEPT_USER_VARIABLES) == 0) { + /* Nothing preserved, set them all. */ +#ifdef _AIX + CHECK_SETENV2("LOGIN", runas_pw->pw_name, true, true); +#endif + CHECK_SETENV2("LOGNAME", runas_pw->pw_name, true, true); + CHECK_SETENV2("USER", runas_pw->pw_name, true, true); + } else if ((didvar & KEPT_USER_VARIABLES) != KEPT_USER_VARIABLES) { + /* + * Preserved some of LOGIN, LOGNAME, USER but not all. + * Make the unset ones match so we don't end up with some + * set to the invoking user and others set to the runas user. + */ + if (ISSET(didvar, KEPT_LOGNAME)) + cp = sudo_getenv("LOGNAME"); +#ifdef _AIX + else if (ISSET(didvar, KEPT_LOGIN)) + cp = sudo_getenv("LOGIN"); +#endif + else if (ISSET(didvar, KEPT_USER)) + cp = sudo_getenv("USER"); + else + cp = NULL; + if (cp != NULL) { +#ifdef _AIX + if (!ISSET(didvar, KEPT_LOGIN)) + CHECK_SETENV2("LOGIN", cp, true, true); +#endif + if (!ISSET(didvar, KEPT_LOGNAME)) + CHECK_SETENV2("LOGNAME", cp, true, true); + if (!ISSET(didvar, KEPT_USER)) + CHECK_SETENV2("USER", cp, true, true); + } + } + } + + /* Set $HOME to target user if not preserving user's value. */ + if (reset_home) + CHECK_SETENV2("HOME", runas_pw->pw_dir, true, true); + + /* Provide default values for $SHELL, $TERM and $PATH if not set. */ + if (!ISSET(didvar, DID_SHELL)) + CHECK_SETENV2("SHELL", runas_pw->pw_shell, false, false); + if (!ISSET(didvar, DID_TERM)) + CHECK_PUTENV("TERM=unknown", false, false); + if (!ISSET(didvar, DID_PATH)) + CHECK_SETENV2("PATH", _PATH_STDPATH, false, true); + + /* Set PS1 if SUDO_PS1 is set. */ + if (ps1 != NULL) + CHECK_PUTENV(ps1, true, true); + + /* Add the SUDO_COMMAND envariable (cmnd + args). */ + if (user_args) { + if (asprintf(&cp, "SUDO_COMMAND=%s %s", user_cmnd, user_args) == -1) + goto bad; + if (sudo_putenv(cp, true, true) == -1) { + free(cp); + goto bad; + } + sudoers_gc_add(GC_PTR, cp); + } else { + CHECK_SETENV2("SUDO_COMMAND", user_cmnd, true, true); + } + + /* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */ + CHECK_SETENV2("SUDO_USER", user_name, true, true); + (void)snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid); + CHECK_SETENV2("SUDO_UID", idbuf, true, true); + (void)snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid); + CHECK_SETENV2("SUDO_GID", idbuf, true, true); + + debug_return_bool(true); + +bad: + sudo_warn(U_("unable to rebuild the environment")); + debug_return_bool(false); +} + +/* + * Insert all environment variables in envp into the private copy + * of the environment. + * Returns true on success or false on failure. + */ +bool +insert_env_vars(char * const envp[]) +{ + char * const *ep; + bool ret = true; + debug_decl(insert_env_vars, SUDOERS_DEBUG_ENV) + + /* Add user-specified environment variables. */ + if (envp != NULL) { + for (ep = envp; *ep != NULL; ep++) { + /* XXX - no undo on failure */ + if (sudo_putenv(*ep, true, true) == -1) { + ret = false; + break; + } + } + } + debug_return_bool(ret); +} + +/* + * Validate the list of environment variables passed in on the command + * line against env_delete, env_check, and env_keep. + * Calls log_warning() if any specified variables are not allowed. + * Returns true if allowed, else false. + */ +bool +validate_env_vars(char * const env_vars[]) +{ + char * const *ep; + char *eq, errbuf[4096]; + bool okvar, ret = true; + debug_decl(validate_env_vars, SUDOERS_DEBUG_ENV) + + if (env_vars == NULL) + debug_return_bool(true); /* nothing to do */ + + /* Add user-specified environment variables. */ + errbuf[0] = '\0'; + for (ep = env_vars; *ep != NULL; ep++) { + if (def_secure_path && !user_is_exempt() && + strncmp(*ep, "PATH=", 5) == 0) { + okvar = false; + } else if (def_env_reset) { + okvar = env_should_keep(*ep); + } else { + okvar = !env_should_delete(*ep); + } + if (okvar == false) { + /* Not allowed, add to error string, allocating as needed. */ + if ((eq = strchr(*ep, '=')) != NULL) + *eq = '\0'; + if (errbuf[0] != '\0') + (void)strlcat(errbuf, ", ", sizeof(errbuf)); + if (strlcat(errbuf, *ep, sizeof(errbuf)) >= sizeof(errbuf)) { + errbuf[sizeof(errbuf) - 4] = '\0'; + (void)strlcat(errbuf, "...", sizeof(errbuf)); + } + if (eq != NULL) + *eq = '='; + } + } + if (errbuf[0] != '\0') { + /* XXX - audit? */ + log_warningx(0, + N_("sorry, you are not allowed to set the following environment variables: %s"), errbuf); + ret = false; + } + debug_return_bool(ret); +} + +static void * +env_file_open_local(const char *path) +{ + struct env_file_local *efl; + debug_decl(env_file_open_local, SUDOERS_DEBUG_ENV) + + efl = calloc(1, sizeof(*efl)); + if (efl != NULL) { + if ((efl->fp = fopen(path, "r")) == NULL) { + free(efl); + efl = NULL; + } + } + debug_return_ptr(efl); +} + +static void +env_file_close_local(void *cookie) +{ + struct env_file_local *efl = cookie; + debug_decl(env_file_close_local, SUDOERS_DEBUG_ENV) + + if (efl != NULL) { + if (efl->fp != NULL) + fclose(efl->fp); + free(efl->line); + free(efl); + } + debug_return; +} + +/* + * Parse /etc/environment lines ala AIX and Linux. + * Lines may be in either of three formats: + * NAME=VALUE + * NAME="VALUE" + * NAME='VALUE' + * with an optional "export" prefix so the shell can source the file. + * Invalid lines, blank lines, or lines consisting solely of a comment + * character are skipped. + */ +static char * +env_file_next_local(void *cookie, int *errnum) +{ + struct env_file_local *efl = cookie; + char *var, *val, *ret = NULL; + size_t var_len, val_len; + debug_decl(env_file_next_local, SUDOERS_DEBUG_ENV) + + *errnum = 0; + for (;;) { + if (sudo_parseln(&efl->line, &efl->linesize, NULL, efl->fp, PARSELN_CONT_IGN) == -1) { + if (!feof(efl->fp)) + *errnum = errno; + break; + } + + /* Skip blank or comment lines */ + if (*(var = efl->line) == '\0') + continue; + + /* Skip optional "export " */ + if (strncmp(var, "export", 6) == 0 && isspace((unsigned char) var[6])) { + var += 7; + while (isspace((unsigned char) *var)) { + var++; + } + } + + /* Must be of the form name=["']value['"] */ + for (val = var; *val != '\0' && *val != '='; val++) + continue; + if (var == val || *val != '=') + continue; + var_len = (size_t)(val - var); + val_len = strlen(++val); + + /* Strip leading and trailing single/double quotes */ + if ((val[0] == '\'' || val[0] == '\"') && val[0] == val[val_len - 1]) { + val[val_len - 1] = '\0'; + val++; + val_len -= 2; + } + + if ((ret = malloc(var_len + 1 + val_len + 1)) == NULL) { + *errnum = errno; + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + } else { + memcpy(ret, var, var_len + 1); /* includes '=' */ + memcpy(ret + var_len + 1, val, val_len + 1); /* includes NUL */ + sudoers_gc_add(GC_PTR, ret); + } + break; + } + debug_return_str(ret); +} + +static struct sudoers_env_file env_file_sudoers = { + env_file_open_local, + env_file_close_local, + env_file_next_local +}; + +static struct sudoers_env_file env_file_system = { + env_file_open_local, + env_file_close_local, + env_file_next_local +}; + +void +register_env_file(void * (*ef_open)(const char *), void (*ef_close)(void *), + char * (*ef_next)(void *, int *), bool system) +{ + struct sudoers_env_file *ef = system ? &env_file_system : &env_file_sudoers; + + ef->open = ef_open; + ef->close = ef_close; + ef->next = ef_next; +} + +bool +read_env_file(const char *path, bool overwrite, bool restricted) +{ + struct sudoers_env_file *ef; + bool ret = true; + char *envstr; + void *cookie; + int errnum; + debug_decl(read_env_file, SUDOERS_DEBUG_ENV) + + /* + * The environment file may be handled differently depending on + * whether it is specified in sudoers or the system. + */ + if (path == def_env_file || path == def_restricted_env_file) + ef = &env_file_sudoers; + else + ef = &env_file_system; + + cookie = ef->open(path); + if (cookie == NULL) + debug_return_bool(false); + + for (;;) { + /* Keep reading until EOF or error. */ + if ((envstr = ef->next(cookie, &errnum)) == NULL) { + if (errnum != 0) + ret = false; + break; + } + + /* + * If the env file is restricted, apply env_check and env_keep + * when env_reset is set or env_delete when it is not. + */ + if (restricted) { + if (def_env_reset ? !env_should_keep(envstr) : env_should_delete(envstr)) { + free(envstr); + continue; + } + } + if (sudo_putenv(envstr, true, overwrite) == -1) { + /* XXX - no undo on failure */ + ret = false; + break; + } + } + ef->close(cookie); + + debug_return_bool(ret); +} + +bool +init_envtables(void) +{ + struct list_member *cur; + const char **p; + debug_decl(init_envtables, SUDOERS_DEBUG_ENV) + + /* Fill in the "env_delete" list. */ + for (p = initial_badenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_delete, cur, entries); + } + + /* Fill in the "env_check" list. */ + for (p = initial_checkenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_check, cur, entries); + } + + /* Fill in the "env_keep" list. */ + for (p = initial_keepenv_table; *p; p++) { + cur = calloc(1, sizeof(struct list_member)); + if (cur == NULL || (cur->value = strdup(*p)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(cur); + debug_return_bool(false); + } + SLIST_INSERT_HEAD(&def_env_keep, cur, entries); + } + debug_return_bool(true); +} + +int +sudoers_hook_getenv(const char *name, char **value, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + + /* Hack to make GNU gettext() find the sudoers locale when needed. */ + if (*name == 'L' && sudoers_getlocale() == SUDOERS_LOCALE_SUDOERS) { + if (strcmp(name, "LANGUAGE") == 0 || strcmp(name, "LANG") == 0) { + *value = NULL; + goto done; + } + if (strcmp(name, "LC_ALL") == 0 || strcmp(name, "LC_MESSAGES") == 0) { + *value = def_sudoers_locale; + goto done; + } + } + + *value = sudo_getenv_nodebug(name); +done: + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_putenv(char *string, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_putenv_nodebug(string, true, true); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_setenv(const char *name, const char *value, int overwrite, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_setenv_nodebug(name, value, overwrite); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} + +int +sudoers_hook_unsetenv(const char *name, void *closure) +{ + static bool in_progress = false; /* avoid recursion */ + + if (in_progress || env.envp == NULL) + return SUDO_HOOK_RET_NEXT; + + in_progress = true; + sudo_unsetenv_nodebug(name); + in_progress = false; + return SUDO_HOOK_RET_STOP; +} diff --git a/utsudo-0.0.2/plugins/sudoers/env_pattern.c b/utsudo-0.0.2/plugins/sudoers/env_pattern.c new file mode 100644 index 0000000..22b17a5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/env_pattern.c @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include "sudoers.h" + +/* extern for regress tests */ +bool +matches_env_pattern(const char *pattern, const char *var, bool *full_match) +{ + size_t len, sep_pos; + bool iswild = false, match = false; + bool saw_sep = false; + const char *cp; + debug_decl(matches_env_pattern, SUDOERS_DEBUG_ENV) + + /* Locate position of the '=' separator in var=value. */ + sep_pos = strcspn(var, "="); + + /* Locate '*' wildcard and compute len. */ + for (cp = pattern; *cp != '\0'; cp++) { + if (*cp == '*') { + iswild = true; + break; + } + } + len = (size_t)(cp - pattern); + + if (iswild) { + /* Match up to the '*' wildcard. */ + if (strncmp(pattern, var, len) == 0) { + while (*cp != '\0') { + if (*cp == '*') { + /* Collapse sequential '*'s */ + do { + cp++; + } while (*cp == '*'); + /* A '*' at the end of a pattern matches anything. */ + if (*cp == '\0') { + match = true; + break; + } + /* Keep track of whether we matched an equal sign. */ + if (*cp == '=') + saw_sep = true; + /* Look for first match of text after the '*' */ + while ((saw_sep || len != sep_pos) && + var[len] != '\0' && var[len] != *cp) + len++; + } + if (var[len] != *cp) + break; + cp++; + len++; + } + if (*cp == '\0' && (len == sep_pos || var[len] == '\0')) + match = true; + } + } else { + if (strncmp(pattern, var, len) == 0 && + (len == sep_pos || var[len] == '\0')) { + match = true; + } + } + if (match) + *full_match = len > sep_pos + 1; + debug_return_bool(match); +} diff --git a/utsudo-0.0.2/plugins/sudoers/file.c b/utsudo-0.0.2/plugins/sudoers/file.c new file mode 100644 index 0000000..5028ce0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/file.c @@ -0,0 +1,158 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "parse.h" +#include "sudo_lbuf.h" +#include + +struct sudo_file_handle { + FILE *fp; + struct sudoers_parse_tree parse_tree; +}; + +static int +sudo_file_close(struct sudo_nss *nss) +{ + debug_decl(sudo_file_close, SUDOERS_DEBUG_NSS) + struct sudo_file_handle *handle = nss->handle; + + if (handle != NULL) { + fclose(handle->fp); + sudoersin = NULL; + + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + + debug_return_int(0); +} + +static int +sudo_file_open(struct sudo_nss *nss) +{ + debug_decl(sudo_file_open, SUDOERS_DEBUG_NSS) + struct sudo_file_handle *handle; + + if (def_ignore_local_sudoers) + debug_return_int(-1); + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_file_close(nss); + } + + handle = malloc(sizeof(*handle)); + if (handle != NULL) { + handle->fp = open_sudoers(sudoers_file, false, NULL); + if (handle->fp != NULL) { + init_parse_tree(&handle->parse_tree, NULL, NULL); + } else { + free(handle); + handle = NULL; + } + } + nss->handle = handle; + debug_return_int(nss->handle ? 0 : -1); +} + +/* + * Parse and return the specified sudoers file. + */ +static struct sudoers_parse_tree * +sudo_file_parse(struct sudo_nss *nss) +{ + debug_decl(sudo_file_close, SUDOERS_DEBUG_NSS) + struct sudo_file_handle *handle = nss->handle; + + if (handle == NULL || handle->fp == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: called with NULL %s", + __func__, handle ? "file pointer" : "handle"); + debug_return_ptr(NULL); + } + + sudoersin = handle->fp; + if (sudoersparse() != 0 || parse_error) { + if (errorlineno != -1) { + log_warningx(SLOG_SEND_MAIL, N_("parse error in %s near line %d"), + errorfile, errorlineno); + } else { + log_warningx(SLOG_SEND_MAIL, N_("parse error in %s"), errorfile); + } + debug_return_ptr(NULL); + } + + /* Move parsed sudoers policy to nss handle. */ + reparent_parse_tree(&handle->parse_tree); + + debug_return_ptr(&handle->parse_tree); +} + +/* + * No need for explicit sudoers queries, the parse function handled it. + */ +static int +sudo_file_query(struct sudo_nss *nss, struct passwd *pw) +{ + debug_decl(sudo_file_query, SUDOERS_DEBUG_NSS) + debug_return_int(0); +} + +/* + * No need to get defaults for sudoers file, the parse function handled it. + */ +static int +sudo_file_getdefs(struct sudo_nss *nss) +{ + debug_decl(sudo_file_getdefs, SUDOERS_DEBUG_NSS) + debug_return_int(0); +} + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_file = { + { NULL, NULL }, + sudo_file_open, + sudo_file_close, + sudo_file_parse, + sudo_file_query, + sudo_file_getdefs +}; diff --git a/utsudo-0.0.2/plugins/sudoers/filedigest.c b/utsudo-0.0.2/plugins/sudoers/filedigest.c new file mode 100644 index 0000000..c98023f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/filedigest.c @@ -0,0 +1,104 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include + +#include "sudoers.h" +#include "sudo_digest.h" + +unsigned char * +sudo_filedigest(int fd, const char *file, int digest_type, size_t *digest_len) +{ + unsigned char *file_digest = NULL; + unsigned char buf[32 * 1024]; + struct sudo_digest *dig = NULL; + FILE *fp = NULL; + size_t nread; + int fd2; + debug_decl(sudo_filedigest, SUDOERS_DEBUG_UTIL) + + *digest_len = sudo_digest_getlen(digest_type); + if (*digest_len == (size_t)-1) { + sudo_warnx(U_("unsupported digest type %d for %s"), digest_type, file); + goto bad; + } + + if ((dig = sudo_digest_alloc(digest_type)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + + if ((fd2 = dup(fd)) == -1) { + sudo_debug_printf(SUDO_DEBUG_INFO, "unable to dup %s: %s", + file, strerror(errno)); + goto bad; + } + if ((fp = fdopen(fd2, "r")) == NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "unable to fdopen %s: %s", + file, strerror(errno)); + close(fd2); + goto bad; + } + if ((file_digest = malloc(*digest_len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + + while ((nread = fread(buf, 1, sizeof(buf), fp)) != 0) { + sudo_digest_update(dig, buf, nread); + } + if (ferror(fp)) { + sudo_warnx(U_("%s: read error"), file); + goto bad; + } + sudo_digest_final(dig, file_digest); + sudo_digest_free(dig); + fclose(fp); + + debug_return_ptr(file_digest); +bad: + sudo_digest_free(dig); + free(file_digest); + if (fp != NULL) + fclose(fp); + debug_return_ptr(NULL); +} diff --git a/utsudo-0.0.2/plugins/sudoers/find_path.c b/utsudo-0.0.2/plugins/sudoers/find_path.c new file mode 100644 index 0000000..0656339 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/find_path.c @@ -0,0 +1,175 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2015, 2017-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" + +/* + * Check the given command against the specified whitelist (NULL-terminated). + * On success, rewrites cmnd based on the whitelist and returns true. + * On failure, returns false. + */ +static bool +cmnd_allowed(char *cmnd, size_t cmnd_size, struct stat *cmnd_sbp, + char * const *whitelist) +{ + const char *cmnd_base; + char * const *wl; + debug_decl(cmnd_allowed, SUDOERS_DEBUG_UTIL) + + if (!sudo_goodpath(cmnd, cmnd_sbp)) + debug_return_bool(false); + + if (whitelist == NULL) + debug_return_bool(true); /* nothing to check */ + + /* We compare the base names to avoid excessive stat()ing. */ + if ((cmnd_base = strrchr(cmnd, '/')) == NULL) + debug_return_bool(false); /* can't happen */ + cmnd_base++; + + for (wl = whitelist; *wl != NULL; wl++) { + struct stat sb; + const char *base; + + if ((base = strrchr(*wl, '/')) == NULL) + continue; /* XXX - warn? */ + base++; + + if (strcmp(cmnd_base, base) != 0) + continue; + + if (sudo_goodpath(*wl, &sb) && + sb.st_dev == cmnd_sbp->st_dev && sb.st_ino == cmnd_sbp->st_ino) { + /* Overwrite cmnd with safe version from whitelist. */ + if (strlcpy(cmnd, *wl, cmnd_size) < cmnd_size) + return true; + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * This function finds the full pathname for a command and + * stores it in a statically allocated array, filling in a pointer + * to the array. Returns FOUND if the command was found, NOT_FOUND + * if it was not found, or NOT_FOUND_DOT if it would have been found + * but it is in '.' and IGNORE_DOT is set. + * The caller is responsible for freeing the output file. + */ +int +find_path(const char *infile, char **outfile, struct stat *sbp, + const char *path, int ignore_dot, char * const *whitelist) +{ + char command[PATH_MAX]; + const char *cp, *ep, *pathend; + bool found = false; + bool checkdot = false; + int len; + debug_decl(find_path, SUDOERS_DEBUG_UTIL) + + /* + * If we were given a fully qualified or relative path + * there is no need to look at $PATH. + */ + if (strchr(infile, '/') != NULL) { + if (strlcpy(command, infile, sizeof(command)) >= sizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), sbp, whitelist); + goto done; + } + + if (path == NULL) + debug_return_int(NOT_FOUND); + + pathend = path + strlen(path); + for (cp = sudo_strsplit(path, pathend, ":", &ep); cp != NULL; + cp = sudo_strsplit(NULL, pathend, ":", &ep)) { + + /* + * Search current dir last if it is in PATH. + * This will miss sneaky things like using './' or './/' (XXX) + */ + if (cp == ep || (*cp == '.' && cp + 1 == ep)) { + checkdot = 1; + continue; + } + + /* + * Resolve the path and exit the loop if found. + */ + len = snprintf(command, sizeof(command), "%.*s/%s", + (int)(ep - cp), cp, infile); + if (len < 0 || len >= ssizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), sbp, whitelist); + if (found) + break; + } + + /* + * Check current dir if dot was in the PATH + */ + if (!found && checkdot) { + len = snprintf(command, sizeof(command), "./%s", infile); + if (len < 0 || len >= ssizeof(command)) { + errno = ENAMETOOLONG; + debug_return_int(NOT_FOUND_ERROR); + } + found = cmnd_allowed(command, sizeof(command), sbp, whitelist); + if (found && ignore_dot) + debug_return_int(NOT_FOUND_DOT); + } + +done: + if (found) { + if ((*outfile = strdup(command)) == NULL) + debug_return_int(NOT_FOUND_ERROR); + debug_return_int(FOUND); + } + debug_return_int(NOT_FOUND); +} diff --git a/utsudo-0.0.2/plugins/sudoers/fmtsudoers.c b/utsudo-0.0.2/plugins/sudoers/fmtsudoers.c new file mode 100644 index 0000000..c93281f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/fmtsudoers.c @@ -0,0 +1,475 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include + +/* + * Write the contents of a struct member to the lbuf. + * If alias_type is not UNSPEC, expand aliases using that type with + * the specified separator (which must not be NULL in the UNSPEC case). + */ +static bool +sudoers_format_member_int(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, char *name, int type, bool negated, + const char *separator, int alias_type) +{ + struct alias *a; + struct member *m; + struct sudo_command *c; + debug_decl(sudoers_format_member_int, SUDOERS_DEBUG_UTIL) + + switch (type) { + case ALL: + sudo_lbuf_append(lbuf, "%sALL", negated ? "!" : ""); + break; + case MYSELF: + sudo_lbuf_append(lbuf, "%s%s", negated ? "!" : "", + user_name ? user_name : ""); + break; + case COMMAND: + c = (struct sudo_command *) name; + if (c->digest != NULL) { + sudo_lbuf_append(lbuf, "%s:%s ", + digest_type_to_name(c->digest->digest_type), + c->digest->digest_str); + } + if (negated) + sudo_lbuf_append(lbuf, "!"); + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED" \t", "%s", c->cmnd); + if (c->args) { + sudo_lbuf_append(lbuf, " "); + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", c->args); + } + break; + case USERGROUP: + /* Special case for %#gid, %:non-unix-group, %:#non-unix-gid */ + if (strpbrk(name, " \t") == NULL) { + if (*++name == ':') { + name++; + sudo_lbuf_append(lbuf, "%s", "%:"); + } else { + sudo_lbuf_append(lbuf, "%s", "%"); + } + } + goto print_word; + case ALIAS: + if (alias_type != UNSPEC) { + if ((a = alias_get(parse_tree, name, alias_type)) != NULL) { + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, "%s", separator); + sudoers_format_member_int(lbuf, parse_tree, m->name, + m->type, negated ? !m->negated : m->negated, + separator, alias_type); + } + alias_put(a); + break; + } + } + /* FALLTHROUGH */ + default: + print_word: + /* Do not quote UID/GID, all others get quoted. */ + if (name[0] == '#' && + name[strspn(name + 1, "0123456789") + 1] == '\0') { + sudo_lbuf_append(lbuf, "%s%s", negated ? "!" : "", name); + } else { + if (strpbrk(name, " \t") != NULL) { + sudo_lbuf_append(lbuf, "%s\"", negated ? "!" : ""); + sudo_lbuf_append_quoted(lbuf, "\"", "%s", name); + sudo_lbuf_append(lbuf, "\""); + } else { + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s%s", + negated ? "!" : "", name); + } + } + break; + } + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +bool +sudoers_format_member(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct member *m, + const char *separator, int alias_type) +{ + return sudoers_format_member_int(lbuf, parse_tree, m->name, m->type, + m->negated, separator, alias_type); +} + +/* + * Store a defaults entry as a command tag. + */ +bool +sudoers_defaults_to_tags(const char *var, const char *val, int op, + struct cmndtag *tags) +{ + bool ret = true; + debug_decl(sudoers_defaults_to_tags, SUDOERS_DEBUG_UTIL) + + if (op == true || op == false) { + if (strcmp(var, "authenticate") == 0) { + tags->nopasswd = op == false; + } else if (strcmp(var, "sudoedit_follow") == 0) { + tags->follow = op == true; + } else if (strcmp(var, "log_input") == 0) { + tags->log_input = op == true; + } else if (strcmp(var, "log_output") == 0) { + tags->log_output = op == true; + } else if (strcmp(var, "noexec") == 0) { + tags->noexec = op == true; + } else if (strcmp(var, "setenv") == 0) { + tags->setenv = op == true; + } else if (strcmp(var, "mail_all_cmnds") == 0 || + strcmp(var, "mail_always") == 0 || + strcmp(var, "mail_no_perms") == 0) { + tags->send_mail = op == true; + } else { + ret = false; + } + } else { + ret = false; + } + debug_return_bool(ret); +} + +/* + * Convert a defaults list to command tags. + */ +bool +sudoers_defaults_list_to_tags(struct defaults_list *defs, struct cmndtag *tags) +{ + bool ret = true; + struct defaults *d; + debug_decl(sudoers_defaults_list_to_tags, SUDOERS_DEBUG_UTIL) + + TAGS_INIT(*tags); + if (defs != NULL) { + TAILQ_FOREACH(d, defs, entries) { + if (!sudoers_defaults_to_tags(d->var, d->val, d->op, tags)) { + if (d->val != NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN, + "unable to convert defaults to tag: %s%s%s", d->var, + d->op == '+' ? "+=" : d->op == '-' ? "-=" : "=", d->val); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "unable to convert defaults to tag: %s%s%s", + d->op == false ? "!" : "", d->var, ""); + } + ret = false; + } + } + } + debug_return_bool(ret); +} + +#define FIELD_CHANGED(ocs, ncs, fld) \ + ((ocs) == NULL || (ncs)->fld != (ocs)->fld) + +#define TAG_CHANGED(ocs, ncs, t, tt) \ + (TAG_SET((t).tt) && FIELD_CHANGED(ocs, ncs, tags.tt)) + +/* + * Write a cmndspec to lbuf in sudoers format. + */ +bool +sudoers_format_cmndspec(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct cmndspec *cs, + struct cmndspec *prev_cs, struct cmndtag tags, bool expand_aliases) +{ + debug_decl(sudoers_format_cmndspec, SUDOERS_DEBUG_UTIL) + + /* Merge privilege-level tags with cmndspec tags. */ + TAGS_MERGE(tags, cs->tags); + +#ifdef HAVE_PRIV_SET + if (cs->privs != NULL && FIELD_CHANGED(prev_cs, cs, privs)) + sudo_lbuf_append(lbuf, "PRIVS=\"%s\" ", cs->privs); + if (cs->limitprivs != NULL && FIELD_CHANGED(prev_cs, cs, limitprivs)) + sudo_lbuf_append(lbuf, "LIMITPRIVS=\"%s\" ", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role != NULL && FIELD_CHANGED(prev_cs, cs, role)) + sudo_lbuf_append(lbuf, "ROLE=%s ", cs->role); + if (cs->type != NULL && FIELD_CHANGED(prev_cs, cs, type)) + sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type); +#endif /* HAVE_SELINUX */ + if (cs->timeout > 0 && FIELD_CHANGED(prev_cs, cs, timeout)) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + (void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, "TIMEOUT=%s ", numbuf); + } + if (cs->notbefore != UNSPEC && FIELD_CHANGED(prev_cs, cs, notbefore)) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notbefore); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, "NOTBEFORE=%s ", buf); + } + if (cs->notafter != UNSPEC && FIELD_CHANGED(prev_cs, cs, notafter)) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notafter); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, "NOTAFTER=%s ", buf); + } + if (TAG_CHANGED(prev_cs, cs, tags, setenv)) + sudo_lbuf_append(lbuf, tags.setenv ? "SETENV: " : "NOSETENV: "); + if (TAG_CHANGED(prev_cs, cs, tags, noexec)) + sudo_lbuf_append(lbuf, tags.noexec ? "NOEXEC: " : "EXEC: "); + if (TAG_CHANGED(prev_cs, cs, tags, nopasswd)) + sudo_lbuf_append(lbuf, tags.nopasswd ? "NOPASSWD: " : "PASSWD: "); + if (TAG_CHANGED(prev_cs, cs, tags, log_input)) + sudo_lbuf_append(lbuf, tags.log_input ? "LOG_INPUT: " : "NOLOG_INPUT: "); + if (TAG_CHANGED(prev_cs, cs, tags, log_output)) + sudo_lbuf_append(lbuf, tags.log_output ? "LOG_OUTPUT: " : "NOLOG_OUTPUT: "); + if (TAG_CHANGED(prev_cs, cs, tags, send_mail)) + sudo_lbuf_append(lbuf, tags.send_mail ? "MAIL: " : "NOMAIL: "); + if (TAG_CHANGED(prev_cs, cs, tags, follow)) + sudo_lbuf_append(lbuf, tags.follow ? "FOLLOW: " : "NOFOLLOW: "); + sudoers_format_member(lbuf, parse_tree, cs->cmnd, ", ", + expand_aliases ? CMNDALIAS : UNSPEC); + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a privilege to lbuf in sudoers format. + */ +bool +sudoers_format_privilege(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct privilege *priv, + bool expand_aliases) +{ + struct cmndspec *cs, *prev_cs; + struct cmndtag tags; + struct member *m; + debug_decl(sudoers_format_privilege, SUDOERS_DEBUG_UTIL) + + /* Convert per-privilege defaults to tags. */ + sudoers_defaults_list_to_tags(&priv->defaults, &tags); + + /* Print hosts list. */ + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m != TAILQ_FIRST(&priv->hostlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? HOSTALIAS : UNSPEC); + } + + /* Print commands. */ + sudo_lbuf_append(lbuf, " = "); + prev_cs = NULL; + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (prev_cs == NULL || RUNAS_CHANGED(cs, prev_cs)) { + if (cs != TAILQ_FIRST(&priv->cmndlist)) + sudo_lbuf_append(lbuf, ", "); + if (cs->runasuserlist != NULL || cs->runasgrouplist != NULL) + sudo_lbuf_append(lbuf, "("); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? RUNASALIAS : UNSPEC); + } + } + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, " : "); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? RUNASALIAS : UNSPEC); + } + } + if (cs->runasuserlist != NULL || cs->runasgrouplist != NULL) + sudo_lbuf_append(lbuf, ") "); + } else if (cs != TAILQ_FIRST(&priv->cmndlist)) { + sudo_lbuf_append(lbuf, ", "); + } + sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags, + expand_aliases); + prev_cs = cs; + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a userspec to lbuf in sudoers format. + */ +bool +sudoers_format_userspec(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, + struct userspec *us, bool expand_aliases) +{ + struct privilege *priv; + struct sudoers_comment *comment; + struct member *m; + debug_decl(sudoers_format_userspec, SUDOERS_DEBUG_UTIL) + + /* Print comments (if any). */ + STAILQ_FOREACH(comment, &us->comments, entries) { + sudo_lbuf_append(lbuf, "# %s\n", comment->str); + } + + /* Print users list. */ + TAILQ_FOREACH(m, &us->users, entries) { + if (m != TAILQ_FIRST(&us->users)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + expand_aliases ? USERALIAS : UNSPEC); + } + + TAILQ_FOREACH(priv, &us->privileges, entries) { + if (priv != TAILQ_FIRST(&us->privileges)) + sudo_lbuf_append(lbuf, " : "); + else + sudo_lbuf_append(lbuf, " "); + if (!sudoers_format_privilege(lbuf, parse_tree, priv, expand_aliases)) + break; + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Write a userspec_list to lbuf in sudoers format. + */ +bool +sudoers_format_userspecs(struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, const char *separator, + bool expand_aliases, bool flush) +{ + struct userspec *us; + debug_decl(sudoers_format_userspecs, SUDOERS_DEBUG_UTIL) + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (separator != NULL && us != TAILQ_FIRST(&parse_tree->userspecs)) + sudo_lbuf_append(lbuf, "%s", separator); + if (!sudoers_format_userspec(lbuf, parse_tree, us, expand_aliases)) + break; + sudo_lbuf_print(lbuf); + } + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Format and append a defaults entry to the specified lbuf. + */ +bool +sudoers_format_default(struct sudo_lbuf *lbuf, struct defaults *d) +{ + debug_decl(sudoers_format_default, SUDOERS_DEBUG_UTIL) + + if (d->val != NULL) { + sudo_lbuf_append(lbuf, "%s%s", d->var, + d->op == '+' ? "+=" : d->op == '-' ? "-=" : "="); + if (strpbrk(d->val, " \t") != NULL) { + sudo_lbuf_append(lbuf, "\""); + sudo_lbuf_append_quoted(lbuf, "\"", "%s", d->val); + sudo_lbuf_append(lbuf, "\""); + } else + sudo_lbuf_append_quoted(lbuf, SUDOERS_QUOTED, "%s", d->val); + } else { + sudo_lbuf_append(lbuf, "%s%s", d->op == false ? "!" : "", d->var); + } + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +/* + * Format and append a defaults line to the specified lbuf. + * If next, is specified, it must point to the next defaults + * entry in the list; this is used to print multiple defaults + * entries with the same binding on a single line. + */ +bool +sudoers_format_default_line( struct sudo_lbuf *lbuf, + struct sudoers_parse_tree *parse_tree, struct defaults *d, + struct defaults **next, bool expand_aliases) +{ + struct member *m; + int alias_type; + debug_decl(sudoers_format_default_line, SUDOERS_DEBUG_UTIL) + + /* Print Defaults type and binding (if present) */ + switch (d->type) { + case DEFAULTS_HOST: + sudo_lbuf_append(lbuf, "Defaults@"); + alias_type = expand_aliases ? HOSTALIAS : UNSPEC; + break; + case DEFAULTS_USER: + sudo_lbuf_append(lbuf, "Defaults:"); + alias_type = expand_aliases ? USERALIAS : UNSPEC; + break; + case DEFAULTS_RUNAS: + sudo_lbuf_append(lbuf, "Defaults>"); + alias_type = expand_aliases ? RUNASALIAS : UNSPEC; + break; + case DEFAULTS_CMND: + sudo_lbuf_append(lbuf, "Defaults!"); + alias_type = expand_aliases ? CMNDALIAS : UNSPEC; + break; + default: + sudo_lbuf_append(lbuf, "Defaults"); + alias_type = UNSPEC; + break; + } + TAILQ_FOREACH(m, d->binding, entries) { + if (m != TAILQ_FIRST(d->binding)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", alias_type); + } + + sudo_lbuf_append(lbuf, " "); + sudoers_format_default(lbuf, d); + + if (next != NULL) { + /* Merge Defaults with the same binding, there may be multiple. */ + struct defaults *n; + while ((n = TAILQ_NEXT(d, entries)) && d->binding == n->binding) { + sudo_lbuf_append(lbuf, ", "); + sudoers_format_default(lbuf, n); + d = n; + } + *next = n; + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} diff --git a/utsudo-0.0.2/plugins/sudoers/gc.c b/utsudo-0.0.2/plugins/sudoers/gc.c new file mode 100644 index 0000000..7290683 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gc.c @@ -0,0 +1,153 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include + +#include "sudoers.h" + +struct sudoers_gc_entry { + SLIST_ENTRY(sudoers_gc_entry) entries; + enum sudoers_gc_types type; + union { + char **vec; + void *ptr; + } u; +}; +SLIST_HEAD(sudoers_gc_list, sudoers_gc_entry); +#ifdef NO_LEAKS +static struct sudoers_gc_list sudoers_gc_list = + SLIST_HEAD_INITIALIZER(sudoers_gc_list); +#endif + +bool +sudoers_gc_add(enum sudoers_gc_types type, void *v) +{ +#ifdef NO_LEAKS + struct sudoers_gc_entry *gc; + debug_decl(sudoers_gc_add, SUDOERS_DEBUG_UTIL) + + if (v == NULL) + debug_return_bool(false); + + gc = calloc(1, sizeof(*gc)); + if (gc == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + switch (type) { + case GC_PTR: + gc->u.ptr = v; + break; + case GC_VECTOR: + gc->u.vec = v; + break; + default: + free(gc); + sudo_warnx("unexpected garbage type %d", type); + debug_return_bool(false); + } + gc->type = type; + SLIST_INSERT_HEAD(&sudoers_gc_list, gc, entries); + debug_return_bool(true); +#else + return true; +#endif /* NO_LEAKS */ +} + +bool +sudoers_gc_remove(enum sudoers_gc_types type, void *v) +{ +#ifdef NO_LEAKS + struct sudoers_gc_entry *gc, *prev = NULL; + debug_decl(sudoers_gc_remove, SUDOERS_DEBUG_UTIL) + + SLIST_FOREACH(gc, &sudoers_gc_list, entries) { + switch (gc->type) { + case GC_PTR: + if (gc->u.ptr == v) + goto found; + break; + case GC_VECTOR: + if (gc->u.vec == v) + goto found; + break; + default: + sudo_warnx("unexpected garbage type %d in %p", gc->type, gc); + } + prev = gc; + } + return false; +found: + if (prev == NULL) + SLIST_REMOVE_HEAD(&sudoers_gc_list, entries); + else + SLIST_REMOVE_AFTER(prev, entries); + return true; +#else + return false; +#endif /* NO_LEAKS */ +} + +#ifdef NO_LEAKS +static void +sudoers_gc_run(void) +{ + struct sudoers_gc_entry *gc; + char **cur; + debug_decl(sudoers_gc_run, SUDOERS_DEBUG_UTIL) + + /* Collect garbage. */ + while ((gc = SLIST_FIRST(&sudoers_gc_list))) { + SLIST_REMOVE_HEAD(&sudoers_gc_list, entries); + switch (gc->type) { + case GC_PTR: + free(gc->u.ptr); + free(gc); + break; + case GC_VECTOR: + for (cur = gc->u.vec; *cur != NULL; cur++) + free(*cur); + free(gc->u.vec); + free(gc); + break; + default: + sudo_warnx("unexpected garbage type %d", gc->type); + } + } + + debug_return; +} +#endif /* NO_LEAKS */ + +void +sudoers_gc_init(void) +{ +#ifdef NO_LEAKS + atexit(sudoers_gc_run); +#endif +} diff --git a/utsudo-0.0.2/plugins/sudoers/gentime.c b/utsudo-0.0.2/plugins/sudoers/gentime.c new file mode 100644 index 0000000..ccc7173 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gentime.c @@ -0,0 +1,163 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Parse a timestamp in Generalized Time format as per RFC4517. + * E.g. yyyymmddHHMMSS.FZ or yyyymmddHHMMSS.F[+-]TZOFF + * where minutes, seconds and fraction are optional. + * Returns the time in Unix time format or -1 on error. + */ +time_t +parse_gentime(const char *timestr) +{ + char tcopy[sizeof("yyyymmddHHMMSS.F")]; + const char *cp; + time_t result; + struct tm tm; + size_t len; + int items, tzoff = 0; + bool islocal = false; + debug_decl(parse_gentime, SUDOERS_DEBUG_PARSER) + + /* Make a copy of the time without time zone for easy parsing. */ + len = strspn(timestr, "0123456789.,"); + if (len >= sizeof(tcopy)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse general time string %s", timestr); + debug_return_time_t(-1); + } + memcpy(tcopy, timestr, len); + tcopy[len] = '\0'; + + /* Parse general time, ignoring the timezone for now. */ + memset(&tm, 0, sizeof(tm)); + items = sscanf(tcopy, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, + &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + if (items == EOF || items < 4) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "only parsed %d items in general time string %s", items, timestr); + debug_return_time_t(-1); + } + cp = timestr + ((items + 1) * 2); + + /* Parse optional fractional hours/minute/second if present. */ + if ((cp[0] == '.' || cp[0] == ',') && isdigit((unsigned char)cp[1])) { + int frac = cp[1] - '0'; + switch (items) { + case 4: + /* convert fractional hour -> minutes */ + tm.tm_min += 60 / 10 * frac; + break; + case 5: + /* convert fractional minute -> seconds */ + tm.tm_sec += 60 / 10 * frac; + break; + case 6: + /* ignore fractional second */ + break; + } + cp += 2; /* skip over radix and fraction */ + } + + switch (*cp) { + case '-': + case '+': { + int hour = 0, min = 0; + + /* No DST */ + tm.tm_isdst = 0; + /* parse time zone offset */ + items = sscanf(cp + 1, "%2d%2d", &hour, &min); + if (items == EOF || items < 1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse time zone offset in %s, items %d", + timestr, items); + debug_return_time_t(-1); + } + if (*cp == '-') + tzoff = -((hour * 60) + min) * 60; + else + tzoff = ((hour * 60) + min) * 60; + cp += 1 + (items * 2); + break; + } + case 'Z': + /* GMT/UTC, no DST */ + tm.tm_isdst = 0; + cp++; + break; + case '\0': + /* no zone specified, use local time */ + tm.tm_isdst = -1; + islocal = true; + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse general time string %s", timestr); + debug_return_time_t(-1); + } + if (*cp != '\0') { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "trailing garbage in general time string %s", timestr); + debug_return_time_t(-1); + } + + /* Adjust from Generalized Time to struct tm */ + tm.tm_year -= 1900; + tm.tm_mon--; + + result = mktime(&tm); + if (result != -1) { + if (!islocal) { + /* Not local time, convert to GMT */ + result += get_gmtoff(&result); + /* Adjust time based on supplied GMT offset. */ + result -= tzoff; + } + } + + debug_return_time_t(result); +} diff --git a/utsudo-0.0.2/plugins/sudoers/getdate.c b/utsudo-0.0.2/plugins/sudoers/getdate.c new file mode 100644 index 0000000..a625d04 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/getdate.c @@ -0,0 +1,1582 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +#include +#include +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYLEX yylex() +#define YYEMPTY -1 +#define yyclearin (yychar=(YYEMPTY)) +#define yyerrok (yyerrflag=0) +#define YYRECOVERING() (yyerrflag!=0) +#define YYPREFIX "yy" +#line 2 "getdate.y" +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ +/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */ +/* SUPPRESS 288 on yyerrlab *//* Label unused */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include + +#include "sudo_compat.h" + + +#define EPOCH 1970 +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) + + +/* +** An entry in the lexical lookup table. +*/ +typedef struct _TABLE { + char *name; + int type; + time_t value; +} TABLE; + + +/* +** Daylight-savings mode: on, off, or not yet known. +*/ +typedef enum _DSTMODE { + DSTon, DSToff, DSTmaybe +} DSTMODE; + +/* +** Meridian: am, pm, or 24-hour style. +*/ +typedef enum _MERIDIAN { + MERam, MERpm, MER24 +} MERIDIAN; + + +/* +** Global variables. We could get rid of most of these by using a good +** union as the yacc stack. (This routine was originally written before +** yacc had the %union construct.) Maybe someday; right now we only use +** the %union very rarely. +*/ +static char *yyInput; +static DSTMODE yyDSTmode; +static time_t yyDayOrdinal; +static time_t yyDayNumber; +static int yyHaveDate; +static int yyHaveDay; +static int yyHaveRel; +static int yyHaveTime; +static int yyHaveZone; +static time_t yyTimezone; +static time_t yyDay; +static time_t yyHour; +static time_t yyMinutes; +static time_t yyMonth; +static time_t yySeconds; +static time_t yyYear; +static MERIDIAN yyMeridian; +static time_t yyRelMonth; +static time_t yyRelSeconds; + +static int yyerror(const char *s); +static int yylex(void); + int yyparse(void); + +#line 100 "getdate.y" +#ifndef YYSTYPE_DEFINED +#define YYSTYPE_DEFINED +typedef union { + time_t Number; + enum _MERIDIAN Meridian; +} YYSTYPE; +#endif /* YYSTYPE_DEFINED */ +#line 118 "getdate.c" +#define tAGO 257 +#define tDAY 258 +#define tDAYZONE 259 +#define tID 260 +#define tMERIDIAN 261 +#define tMINUTE_UNIT 262 +#define tMONTH 263 +#define tMONTH_UNIT 264 +#define tSEC_UNIT 265 +#define tSNUMBER 266 +#define tUNUMBER 267 +#define tZONE 268 +#define tDST 269 +#define YYERRCODE 256 +#if defined(__cplusplus) || defined(__STDC__) +const short yylhs[] = +#else +short yylhs[] = +#endif + { -1, + 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 4, 4, 4, 6, 6, 6, 5, + 5, 5, 5, 5, 5, 5, 5, 7, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, 1, + 1, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short yylen[] = +#else +short yylen[] = +#endif + { 2, + 0, 2, 1, 1, 1, 1, 1, 1, 2, 4, + 4, 6, 6, 1, 1, 2, 1, 2, 2, 3, + 5, 3, 3, 2, 4, 2, 3, 2, 1, 2, + 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, + 1, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short yydefred[] = +#else +short yydefred[] = +#endif + { 1, + 0, 0, 15, 32, 0, 38, 35, 0, 0, 0, + 2, 3, 4, 5, 6, 7, 8, 0, 18, 0, + 31, 36, 33, 19, 9, 30, 0, 37, 34, 0, + 0, 0, 16, 28, 0, 23, 27, 22, 0, 0, + 25, 41, 11, 0, 10, 0, 0, 21, 13, 12, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short yydgoto[] = +#else +short yydgoto[] = +#endif + { 1, + 45, 11, 12, 13, 14, 15, 16, 17, 18, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short yysindex[] = +#else +short yysindex[] = +#endif + { 0, + -249, -38, 0, 0, -260, 0, 0, -240, -47, -248, + 0, 0, 0, 0, 0, 0, 0, -237, 0, -18, + 0, 0, 0, 0, 0, 0, -262, 0, 0, -239, + -238, -236, 0, 0, -235, 0, 0, 0, -56, -19, + 0, 0, 0, -234, 0, -232, -258, 0, 0, 0,}; +#if defined(__cplusplus) || defined(__STDC__) +const short yyrindex[] = +#else +short yyrindex[] = +#endif + { 0, + 0, 1, 0, 0, 0, 0, 0, 0, 69, 12, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 34, + 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 45, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,}; +#if defined(__cplusplus) || defined(__STDC__) +const short yygindex[] = +#else +short yygindex[] = +#endif + { 0, + -17, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define YYTABLESIZE 337 +#if defined(__cplusplus) || defined(__STDC__) +const short yytable[] = +#else +short yytable[] = +#endif + { 32, + 17, 44, 42, 36, 37, 19, 20, 49, 2, 3, + 31, 14, 4, 5, 6, 7, 8, 9, 10, 34, + 33, 21, 29, 22, 23, 35, 38, 46, 39, 50, + 40, 41, 47, 24, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 42, 0, 0, 0, 0, 43, + 24, 0, 0, 25, 26, 27, 28, 29, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, + 0, 0, 17, 17, 17, 17, 17, 17, 17, 14, + 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, + 29, 29, 0, 0, 29, 29, 29, 29, 29, 29, + 29, 24, 24, 0, 0, 24, 24, 24, 24, 24, + 24, 24, 20, 20, 0, 0, 20, 20, 20, 20, + 20, 20, 20, 40, 40, 0, 0, 40, 40, 40, + 40, 0, 40, 40, 26, 26, 0, 39, 26, 26, + 26, 26, 0, 0, 26, 39, 39, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short yycheck[] = +#else +short yycheck[] = +#endif + { 47, + 0, 58, 261, 266, 267, 44, 267, 266, 258, 259, + 58, 0, 262, 263, 264, 265, 266, 267, 268, 257, + 269, 262, 0, 264, 265, 44, 266, 47, 267, 47, + 267, 267, 267, 0, 267, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 261, -1, -1, -1, -1, 266, + 258, -1, -1, 261, 262, 263, 264, 265, 266, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 258, 259, + -1, -1, 262, 263, 264, 265, 266, 267, 268, 258, + 259, -1, -1, 262, 263, 264, 265, 266, 267, 268, + 258, 259, -1, -1, 262, 263, 264, 265, 266, 267, + 268, 258, 259, -1, -1, 262, 263, 264, 265, 266, + 267, 268, 258, 259, -1, -1, 262, 263, 264, 265, + 266, 267, 268, 258, 259, -1, -1, 262, 263, 264, + 265, -1, 267, 268, 258, 259, -1, 259, 262, 263, + 264, 265, -1, -1, 268, 267, 268, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 269 +#if YYDEBUG +#if defined(__cplusplus) || defined(__STDC__) +const char * const yyname[] = +#else +char *yyname[] = +#endif + { +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,"','",0,0,"'/'",0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"tAGO","tDAY", +"tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT", +"tSNUMBER","tUNUMBER","tZONE","tDST", +}; +#if defined(__cplusplus) || defined(__STDC__) +const char * const yyrule[] = +#else +char *yyrule[] = +#endif + {"$accept : spec", +"spec :", +"spec : spec item", +"item : time", +"item : zone", +"item : date", +"item : day", +"item : rel", +"item : number", +"time : tUNUMBER tMERIDIAN", +"time : tUNUMBER ':' tUNUMBER o_merid", +"time : tUNUMBER ':' tUNUMBER tSNUMBER", +"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid", +"time : tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER", +"zone : tZONE", +"zone : tDAYZONE", +"zone : tZONE tDST", +"day : tDAY", +"day : tDAY ','", +"day : tUNUMBER tDAY", +"date : tUNUMBER '/' tUNUMBER", +"date : tUNUMBER '/' tUNUMBER '/' tUNUMBER", +"date : tUNUMBER tSNUMBER tSNUMBER", +"date : tUNUMBER tMONTH tSNUMBER", +"date : tMONTH tUNUMBER", +"date : tMONTH tUNUMBER ',' tUNUMBER", +"date : tUNUMBER tMONTH", +"date : tUNUMBER tMONTH tUNUMBER", +"rel : relunit tAGO", +"rel : relunit", +"relunit : tUNUMBER tMINUTE_UNIT", +"relunit : tSNUMBER tMINUTE_UNIT", +"relunit : tMINUTE_UNIT", +"relunit : tSNUMBER tSEC_UNIT", +"relunit : tUNUMBER tSEC_UNIT", +"relunit : tSEC_UNIT", +"relunit : tSNUMBER tMONTH_UNIT", +"relunit : tUNUMBER tMONTH_UNIT", +"relunit : tMONTH_UNIT", +"number : tUNUMBER", +"o_merid :", +"o_merid : tMERIDIAN", +}; +#endif +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 10000 +#define YYMAXDEPTH 10000 +#endif +#endif +#define YYINITSTACKSIZE 200 +/* LINTUSED */ +int yydebug; +int yynerrs; +int yyerrflag; +int yychar; +short *yyssp; +YYSTYPE *yyvsp; +YYSTYPE yyval; +YYSTYPE yylval; +short *yyss; +short *yysslim; +YYSTYPE *yyvs; +unsigned int yystacksize; +int yyparse(void); +#line 319 "getdate.y" + +/* Month and day table. */ +static TABLE const MonthDayTable[] = { + { "january", tMONTH, 1 }, + { "february", tMONTH, 2 }, + { "march", tMONTH, 3 }, + { "april", tMONTH, 4 }, + { "may", tMONTH, 5 }, + { "june", tMONTH, 6 }, + { "july", tMONTH, 7 }, + { "august", tMONTH, 8 }, + { "september", tMONTH, 9 }, + { "sept", tMONTH, 9 }, + { "october", tMONTH, 10 }, + { "november", tMONTH, 11 }, + { "december", tMONTH, 12 }, + { "sunday", tDAY, 0 }, + { "monday", tDAY, 1 }, + { "tuesday", tDAY, 2 }, + { "tues", tDAY, 2 }, + { "wednesday", tDAY, 3 }, + { "wednes", tDAY, 3 }, + { "thursday", tDAY, 4 }, + { "thur", tDAY, 4 }, + { "thurs", tDAY, 4 }, + { "friday", tDAY, 5 }, + { "saturday", tDAY, 6 }, + { NULL } +}; + +/* Time units table. */ +static TABLE const UnitsTable[] = { + { "year", tMONTH_UNIT, 12 }, + { "month", tMONTH_UNIT, 1 }, + { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 }, + { "week", tMINUTE_UNIT, 7 * 24 * 60 }, + { "day", tMINUTE_UNIT, 1 * 24 * 60 }, + { "hour", tMINUTE_UNIT, 60 }, + { "minute", tMINUTE_UNIT, 1 }, + { "min", tMINUTE_UNIT, 1 }, + { "second", tSEC_UNIT, 1 }, + { "sec", tSEC_UNIT, 1 }, + { NULL } +}; + +/* Assorted relative-time words. */ +static TABLE const OtherTable[] = { + { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 }, + { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 }, + { "today", tMINUTE_UNIT, 0 }, + { "now", tMINUTE_UNIT, 0 }, + { "last", tUNUMBER, -1 }, + { "this", tUNUMBER, 0 }, + { "next", tUNUMBER, 2 }, + { "first", tUNUMBER, 1 }, +/* { "second", tUNUMBER, 2 }, */ + { "third", tUNUMBER, 3 }, + { "fourth", tUNUMBER, 4 }, + { "fifth", tUNUMBER, 5 }, + { "sixth", tUNUMBER, 6 }, + { "seventh", tUNUMBER, 7 }, + { "eighth", tUNUMBER, 8 }, + { "ninth", tUNUMBER, 9 }, + { "tenth", tUNUMBER, 10 }, + { "eleventh", tUNUMBER, 11 }, + { "twelfth", tUNUMBER, 12 }, + { "ago", tAGO, 1 }, + { NULL } +}; + +/* The timezone table. */ +/* Some of these are commented out because a time_t can't store a float. */ +static TABLE const TimezoneTable[] = { + { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */ + { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */ + { "utc", tZONE, HOUR( 0) }, + { "wet", tZONE, HOUR( 0) }, /* Western European */ + { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */ + { "wat", tZONE, HOUR( 1) }, /* West Africa */ + { "at", tZONE, HOUR( 2) }, /* Azores */ +#if 0 + /* For completeness. BST is also British Summer, and GST is + * also Guam Standard. */ + { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */ + { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */ +#endif +#if 0 + { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */ + { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */ + { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */ +#endif + { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */ + { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */ + { "est", tZONE, HOUR( 5) }, /* Eastern Standard */ + { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */ + { "cst", tZONE, HOUR( 6) }, /* Central Standard */ + { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */ + { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */ + { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */ + { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */ + { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */ + { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */ + { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */ + { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */ + { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */ + { "cat", tZONE, HOUR(10) }, /* Central Alaska */ + { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */ + { "nt", tZONE, HOUR(11) }, /* Nome */ + { "idlw", tZONE, HOUR(12) }, /* International Date Line West */ + { "cet", tZONE, -HOUR(1) }, /* Central European */ + { "met", tZONE, -HOUR(1) }, /* Middle European */ + { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */ + { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */ + { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */ + { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */ + { "fwt", tZONE, -HOUR(1) }, /* French Winter */ + { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */ + { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */ + { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */ +#if 0 + { "it", tZONE, -HOUR(3.5) },/* Iran */ +#endif + { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */ + { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */ +#if 0 + { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */ +#endif + { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */ +#if 0 + /* For completeness. NST is also Newfoundland Stanard, and SST is + * also Swedish Summer. */ + { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */ + { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */ +#endif /* 0 */ + { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */ + { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */ +#if 0 + { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */ +#endif + { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */ + { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */ +#if 0 + { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */ + { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */ +#endif + { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */ + { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */ + { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */ + { "nzt", tZONE, -HOUR(12) }, /* New Zealand */ + { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */ + { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */ + { "idle", tZONE, -HOUR(12) }, /* International Date Line East */ + { NULL } +}; + +/* Military timezone table. */ +static TABLE const MilitaryTable[] = { + { "a", tZONE, HOUR( 1) }, + { "b", tZONE, HOUR( 2) }, + { "c", tZONE, HOUR( 3) }, + { "d", tZONE, HOUR( 4) }, + { "e", tZONE, HOUR( 5) }, + { "f", tZONE, HOUR( 6) }, + { "g", tZONE, HOUR( 7) }, + { "h", tZONE, HOUR( 8) }, + { "i", tZONE, HOUR( 9) }, + { "k", tZONE, HOUR( 10) }, + { "l", tZONE, HOUR( 11) }, + { "m", tZONE, HOUR( 12) }, + { "n", tZONE, HOUR(- 1) }, + { "o", tZONE, HOUR(- 2) }, + { "p", tZONE, HOUR(- 3) }, + { "q", tZONE, HOUR(- 4) }, + { "r", tZONE, HOUR(- 5) }, + { "s", tZONE, HOUR(- 6) }, + { "t", tZONE, HOUR(- 7) }, + { "u", tZONE, HOUR(- 8) }, + { "v", tZONE, HOUR(- 9) }, + { "w", tZONE, HOUR(-10) }, + { "x", tZONE, HOUR(-11) }, + { "y", tZONE, HOUR(-12) }, + { "z", tZONE, HOUR( 0) }, + { NULL } +}; + + + + +/* ARGSUSED */ +static int +yyerror(const char *s) +{ + return 0; +} + + +static time_t +ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian) +{ + if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59) + return -1; + switch (Meridian) { + case MER24: + if (Hours < 0 || Hours > 23) + return -1; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERam: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERpm: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return ((Hours + 12) * 60L + Minutes) * 60L + Seconds; + default: + abort (); + } + /* NOTREACHED */ +} + + +/* Year is either + * A negative number, which means to use its absolute value (why?) + * A number from 0 to 99, which means a year from 1900 to 1999, or + * The actual year (>=100). */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes, + time_t Seconds, MERIDIAN Meridian, DSTMODE DSTmode) +{ + static int DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + struct tm *tm; + time_t tod; + time_t Julian; + int i; + + if (Year < 0) + Year = -Year; + if (Year < 69) + Year += 2000; + else if (Year < 100) { + Year += 1900; + if (Year < EPOCH) + Year += 100; + } + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* 32-bit time_t cannot represent years past 2038 */ + if (Year < EPOCH || (sizeof(time_t) == sizeof(int) && Year > 2038) + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month]) + return -1; + + for (Julian = Day - 1, i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= SECSPERDAY; + Julian += yyTimezone * 60L; + if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0) + return -1; + Julian += tod; + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && (tm = localtime(&Julian)) && tm->tm_isdst)) + Julian -= 60 * 60; + return Julian; +} + + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + struct tm *start_tm; + struct tm *future_tm; + time_t StartDay; + time_t FutureDay; + + start_tm = localtime(&Start); + future_tm = localtime(&Future); + if (!start_tm || !future_tm) + return -1; + + StartDay = (start_tm->tm_hour + 1) % 24; + FutureDay = (future_tm->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * 60L * 60L; +} + + +static time_t +RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t now; + + now = Start; + if (!(tm = localtime(&now))) + return -1; + now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + return DSTcorrect(Start, now); +} + + +static time_t +RelativeMonth(time_t Start, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; + + if (RelMonth == 0) + return 0; + if (!(tm = localtime(&Start))) + return -1; + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + MER24, DSTmaybe)); +} + + +static int +LookupWord(char *buff) +{ + char *p; + char *q; + const TABLE *tp; + int i; + int abbrev; + + /* Make it lowercase. */ + for (p = buff; *p; p++) + if (isupper((unsigned char)*p)) + *p = tolower((unsigned char)*p); + + if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) { + yylval.Meridian = MERam; + return tMERIDIAN; + } + if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) { + yylval.Meridian = MERpm; + return tMERIDIAN; + } + + /* See if we have an abbreviation for a month. */ + if (strlen(buff) == 3) + abbrev = 1; + else if (strlen(buff) == 4 && buff[3] == '.') { + abbrev = 1; + buff[3] = '\0'; + } + else + abbrev = 0; + + for (tp = MonthDayTable; tp->name; tp++) { + if (abbrev) { + if (strncmp(buff, tp->name, 3) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + else if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + if (strcmp(buff, "dst") == 0) + return tDST; + + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Strip off any plural and try the units table again. */ + i = strlen(buff) - 1; + if (buff[i] == 's') { + buff[i] = '\0'; + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + buff[i] = 's'; /* Put back for "this" in OtherTable. */ + } + + for (tp = OtherTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Military timezones. */ + if (buff[1] == '\0' && isalpha((unsigned char)*buff)) { + for (tp = MilitaryTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + /* Drop out any periods and try the timezone table again. */ + for (i = 0, p = q = buff; *q; q++) + if (*q != '.') + *p++ = *q; + else + i++; + *p = '\0'; + if (i) + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + return tID; +} + + +static int +yylex(void) +{ + char c; + char *p; + char buff[20]; + int Count; + int sign; + + for ( ; ; ) { + while (isspace((unsigned char)*yyInput)) + yyInput++; + + if (isdigit((unsigned char)(c = *yyInput)) || c == '-' || c == '+') { + if (c == '-' || c == '+') { + sign = c == '-' ? -1 : 1; + if (!isdigit((unsigned char)*++yyInput)) + /* skip the '-' sign */ + continue; + } + else + sign = 0; + for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); ) + yylval.Number = 10 * yylval.Number + c - '0'; + yyInput--; + if (sign < 0) + yylval.Number = -yylval.Number; + return sign ? tSNUMBER : tUNUMBER; + } + if (isalpha((unsigned char)c)) { + for (p = buff; isalpha((unsigned char)(c = *yyInput++)) || c == '.'; ) + if (p < &buff[sizeof buff - 1]) + *p++ = c; + *p = '\0'; + yyInput--; + return LookupWord(buff); + } + if (c != '(') + return *yyInput++; + Count = 0; + do { + c = *yyInput++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm(struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (60*(60*(24*days + (a->tm_hour - b->tm_hour)) + + (a->tm_min - b->tm_min)) + + (a->tm_sec - b->tm_sec)); +} + +time_t +get_date(char *p) +{ + struct tm *tm, *gmt, gmtbuf; + time_t Start; + time_t tod; + time_t now; + time_t timezone; + + yyInput = p; + (void)time (&now); + + gmt = gmtime (&now); + if (gmt != NULL) + { + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmtbuf = *gmt; + gmt = &gmtbuf; + } + + if (! (tm = localtime (&now))) + return -1; + + if (gmt != NULL) + timezone = difftm (gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + timezone = 0; + + if(tm->tm_isdst) + timezone += 60; + + yyYear = tm->tm_year + 1900; + yyMonth = tm->tm_mon + 1; + yyDay = tm->tm_mday; + yyTimezone = timezone; + yyDSTmode = DSTmaybe; + yyHour = 0; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = MER24; + yyRelSeconds = 0; + yyRelMonth = 0; + yyHaveDate = 0; + yyHaveDay = 0; + yyHaveRel = 0; + yyHaveTime = 0; + yyHaveZone = 0; + + if (yyparse() + || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1) + return -1; + + if (yyHaveDate || yyHaveTime || yyHaveDay) { + Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds, + yyMeridian, yyDSTmode); + if (Start < 0) + return -1; + } + else { + Start = now; + if (!yyHaveRel) + Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec; + } + + Start += yyRelSeconds; + Start += RelativeMonth(Start, yyRelMonth); + + if (yyHaveDay && !yyHaveDate) { + tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber); + Start += tod; + } + + /* Have to do *something* with a legitimate -1 so it's distinguishable + * from the error return value. (Alternately could set errno on error.) */ + return Start == -1 ? 0 : Start; +} + + +#ifdef TEST + +/* ARGSUSED */ +int +main(int argc, char *argv[]) +{ + char buff[128]; + time_t d; + + (void)printf("Enter date, or blank line to exit.\n\t> "); + (void)fflush(stdout); + while (fgets(buff, sizeof(buff), stdin) && buff[0]) { + d = get_date(buff); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("%s", ctime(&d)); + (void)printf("\t> "); + (void)fflush(stdout); + } + exit(0); + /* NOTREACHED */ +} +#endif /* TEST */ +#line 957 "getdate.c" +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +#if defined(__cplusplus) || defined(__STDC__) +static int yygrowstack(void) +#else +static int yygrowstack() +#endif +{ + unsigned int newsize; + long sslen; + short *newss; + YYSTYPE *newvs; + + if ((newsize = yystacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; +#ifdef SIZE_MAX +#define YY_SIZE_MAX SIZE_MAX +#else +#ifdef __STDC__ +#define YY_SIZE_MAX 0xffffffffU +#else +#define YY_SIZE_MAX (unsigned int)0xffffffff +#endif +#endif + if (YY_SIZE_MAX / newsize < sizeof *newss) + goto bail; + sslen = yyssp - yyss; + newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : + (short *)malloc(newsize * sizeof *newss); /* overflow check above */ + if (newss == NULL) + goto bail; + yyss = newss; + yyssp = newss + sslen; + newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : + (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */ + if (newvs == NULL) + goto bail; + yyvs = newvs; + yyvsp = newvs + sslen; + yystacksize = newsize; + yysslim = yyss + newsize - 1; + return 0; +bail: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return -1; +} + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab +int +#if defined(__cplusplus) || defined(__STDC__) +yyparse(void) +#else +yyparse() +#endif +{ + int yym, yyn, yystate; +#if YYDEBUG +#if defined(__cplusplus) || defined(__STDC__) + const char *yys; +#else /* !(defined(__cplusplus) || defined(__STDC__)) */ + char *yys; +#endif /* !(defined(__cplusplus) || defined(__STDC__)) */ + + if ((yys = getenv("YYDEBUG"))) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif /* YYDEBUG */ + + yynerrs = 0; + yyerrflag = 0; + yychar = (-1); + + if (yyss == NULL && yygrowstack()) goto yyoverflow; + yyssp = yyss; + yyvsp = yyvs; + *yyssp = yystate = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + yychar = (-1); + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; +#if defined(__GNUC__) + goto yynewerror; +#endif +yynewerror: + yyerror("syntax error"); +#if defined(__GNUC__) + goto yyerrlab; +#endif +yyerrlab: + ++yynerrs; +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yyssp); +#endif + if (yyssp <= yyss) goto yyabort; + --yyssp; + --yyvsp; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = (-1); + goto yyloop; + } +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yyvsp[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 3: +#line 118 "getdate.y" +{ + yyHaveTime++; + } +break; +case 4: +#line 121 "getdate.y" +{ + yyHaveZone++; + } +break; +case 5: +#line 124 "getdate.y" +{ + yyHaveDate++; + } +break; +case 6: +#line 127 "getdate.y" +{ + yyHaveDay++; + } +break; +case 7: +#line 130 "getdate.y" +{ + yyHaveRel++; + } +break; +case 9: +#line 136 "getdate.y" +{ + yyHour = yyvsp[-1].Number; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 10: +#line 142 "getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 11: +#line 148 "getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + } +break; +case 12: +#line 155 "getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = yyvsp[0].Meridian; + } +break; +case 13: +#line 161 "getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + } +break; +case 14: +#line 171 "getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSToff; + } +break; +case 15: +#line 175 "getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSTon; + } +break; +case 16: +#line 180 "getdate.y" +{ + yyTimezone = yyvsp[-1].Number; + yyDSTmode = DSTon; + } +break; +case 17: +#line 186 "getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[0].Number; + } +break; +case 18: +#line 190 "getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[-1].Number; + } +break; +case 19: +#line 194 "getdate.y" +{ + yyDayOrdinal = yyvsp[-1].Number; + yyDayNumber = yyvsp[0].Number; + } +break; +case 20: +#line 200 "getdate.y" +{ + yyMonth = yyvsp[-2].Number; + yyDay = yyvsp[0].Number; + } +break; +case 21: +#line 204 "getdate.y" +{ + if (yyvsp[-4].Number >= 100) { + yyYear = yyvsp[-4].Number; + yyMonth = yyvsp[-2].Number; + yyDay = yyvsp[0].Number; + } else { + yyMonth = yyvsp[-4].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } + } +break; +case 22: +#line 215 "getdate.y" +{ + /* ISO 8601 format. yyyy-mm-dd. */ + yyYear = yyvsp[-2].Number; + yyMonth = -yyvsp[-1].Number; + yyDay = -yyvsp[0].Number; + } +break; +case 23: +#line 221 "getdate.y" +{ + /* e.g. 17-JUN-1992. */ + yyDay = yyvsp[-2].Number; + yyMonth = yyvsp[-1].Number; + yyYear = -yyvsp[0].Number; + } +break; +case 24: +#line 227 "getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[0].Number; + } +break; +case 25: +#line 231 "getdate.y" +{ + yyMonth = yyvsp[-3].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } +break; +case 26: +#line 236 "getdate.y" +{ + yyMonth = yyvsp[0].Number; + yyDay = yyvsp[-1].Number; + } +break; +case 27: +#line 240 "getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + } +break; +case 28: +#line 247 "getdate.y" +{ + yyRelSeconds = -yyRelSeconds; + yyRelMonth = -yyRelMonth; + } +break; +case 30: +#line 254 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + } +break; +case 31: +#line 257 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + } +break; +case 32: +#line 260 "getdate.y" +{ + yyRelSeconds += yyvsp[0].Number * 60L; + } +break; +case 33: +#line 263 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + } +break; +case 34: +#line 266 "getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + } +break; +case 35: +#line 269 "getdate.y" +{ + yyRelSeconds++; + } +break; +case 36: +#line 272 "getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + } +break; +case 37: +#line 275 "getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + } +break; +case 38: +#line 278 "getdate.y" +{ + yyRelMonth += yyvsp[0].Number; + } +break; +case 39: +#line 283 "getdate.y" +{ + if (yyHaveTime && yyHaveDate && !yyHaveRel) + yyYear = yyvsp[0].Number; + else { + if(yyvsp[0].Number>10000) { + yyHaveDate++; + yyDay= (yyvsp[0].Number)%100; + yyMonth= (yyvsp[0].Number/100)%100; + yyYear = yyvsp[0].Number/10000; + } + else { + yyHaveTime++; + if (yyvsp[0].Number < 100) { + yyHour = yyvsp[0].Number; + yyMinutes = 0; + } + else { + yyHour = yyvsp[0].Number / 100; + yyMinutes = yyvsp[0].Number % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } + } + } +break; +case 40: +#line 310 "getdate.y" +{ + yyval.Meridian = MER24; + } +break; +case 41: +#line 313 "getdate.y" +{ + yyval.Meridian = yyvsp[0].Meridian; + } +break; +#line 1455 "getdate.c" + } + yyssp -= yym; + yystate = *yyssp; + yyvsp -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yyssp = YYFINAL; + *++yyvsp = yyval; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yyssp, yystate); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate; + *++yyvsp = yyval; + goto yyloop; +yyoverflow: + yyerror("yacc stack overflow"); +yyabort: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (1); +yyaccept: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (0); +} diff --git a/utsudo-0.0.2/plugins/sudoers/getdate.y b/utsudo-0.0.2/plugins/sudoers/getdate.y new file mode 100644 index 0000000..e23ef8d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/getdate.y @@ -0,0 +1,939 @@ +%{ +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ +/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */ +/* SUPPRESS 288 on yyerrlab *//* Label unused */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include + +#include "sudo_compat.h" + + +#define EPOCH 1970 +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) + + +/* +** An entry in the lexical lookup table. +*/ +typedef struct _TABLE { + char *name; + int type; + time_t value; +} TABLE; + + +/* +** Daylight-savings mode: on, off, or not yet known. +*/ +typedef enum _DSTMODE { + DSTon, DSToff, DSTmaybe +} DSTMODE; + +/* +** Meridian: am, pm, or 24-hour style. +*/ +typedef enum _MERIDIAN { + MERam, MERpm, MER24 +} MERIDIAN; + + +/* +** Global variables. We could get rid of most of these by using a good +** union as the yacc stack. (This routine was originally written before +** yacc had the %union construct.) Maybe someday; right now we only use +** the %union very rarely. +*/ +static char *yyInput; +static DSTMODE yyDSTmode; +static time_t yyDayOrdinal; +static time_t yyDayNumber; +static int yyHaveDate; +static int yyHaveDay; +static int yyHaveRel; +static int yyHaveTime; +static int yyHaveZone; +static time_t yyTimezone; +static time_t yyDay; +static time_t yyHour; +static time_t yyMinutes; +static time_t yyMonth; +static time_t yySeconds; +static time_t yyYear; +static MERIDIAN yyMeridian; +static time_t yyRelMonth; +static time_t yyRelSeconds; + +static int yyerror(const char *s); +static int yylex(void); + int yyparse(void); + +%} + +%union { + time_t Number; + enum _MERIDIAN Meridian; +} + +%token tAGO tDAY tDAYZONE tID tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT +%token tSEC_UNIT tSNUMBER tUNUMBER tZONE tDST + +%type tDAY tDAYZONE tMINUTE_UNIT tMONTH tMONTH_UNIT +%type tSEC_UNIT tSNUMBER tUNUMBER tZONE +%type tMERIDIAN o_merid + +%% + +spec : /* NULL */ + | spec item + ; + +item : time { + yyHaveTime++; + } + | zone { + yyHaveZone++; + } + | date { + yyHaveDate++; + } + | day { + yyHaveDay++; + } + | rel { + yyHaveRel++; + } + | number + ; + +time : tUNUMBER tMERIDIAN { + yyHour = $1; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = $2; + } + | tUNUMBER ':' tUNUMBER o_merid { + yyHour = $1; + yyMinutes = $3; + yySeconds = 0; + yyMeridian = $4; + } + | tUNUMBER ':' tUNUMBER tSNUMBER { + yyHour = $1; + yyMinutes = $3; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - ($4 % 100 + ($4 / 100) * 60); + } + | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid { + yyHour = $1; + yyMinutes = $3; + yySeconds = $5; + yyMeridian = $6; + } + | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER { + yyHour = $1; + yyMinutes = $3; + yySeconds = $5; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - ($6 % 100 + ($6 / 100) * 60); + } + ; + +zone : tZONE { + yyTimezone = $1; + yyDSTmode = DSToff; + } + | tDAYZONE { + yyTimezone = $1; + yyDSTmode = DSTon; + } + | + tZONE tDST { + yyTimezone = $1; + yyDSTmode = DSTon; + } + ; + +day : tDAY { + yyDayOrdinal = 1; + yyDayNumber = $1; + } + | tDAY ',' { + yyDayOrdinal = 1; + yyDayNumber = $1; + } + | tUNUMBER tDAY { + yyDayOrdinal = $1; + yyDayNumber = $2; + } + ; + +date : tUNUMBER '/' tUNUMBER { + yyMonth = $1; + yyDay = $3; + } + | tUNUMBER '/' tUNUMBER '/' tUNUMBER { + if ($1 >= 100) { + yyYear = $1; + yyMonth = $3; + yyDay = $5; + } else { + yyMonth = $1; + yyDay = $3; + yyYear = $5; + } + } + | tUNUMBER tSNUMBER tSNUMBER { + /* ISO 8601 format. yyyy-mm-dd. */ + yyYear = $1; + yyMonth = -$2; + yyDay = -$3; + } + | tUNUMBER tMONTH tSNUMBER { + /* e.g. 17-JUN-1992. */ + yyDay = $1; + yyMonth = $2; + yyYear = -$3; + } + | tMONTH tUNUMBER { + yyMonth = $1; + yyDay = $2; + } + | tMONTH tUNUMBER ',' tUNUMBER { + yyMonth = $1; + yyDay = $2; + yyYear = $4; + } + | tUNUMBER tMONTH { + yyMonth = $2; + yyDay = $1; + } + | tUNUMBER tMONTH tUNUMBER { + yyMonth = $2; + yyDay = $1; + yyYear = $3; + } + ; + +rel : relunit tAGO { + yyRelSeconds = -yyRelSeconds; + yyRelMonth = -yyRelMonth; + } + | relunit + ; + +relunit : tUNUMBER tMINUTE_UNIT { + yyRelSeconds += $1 * $2 * 60L; + } + | tSNUMBER tMINUTE_UNIT { + yyRelSeconds += $1 * $2 * 60L; + } + | tMINUTE_UNIT { + yyRelSeconds += $1 * 60L; + } + | tSNUMBER tSEC_UNIT { + yyRelSeconds += $1; + } + | tUNUMBER tSEC_UNIT { + yyRelSeconds += $1; + } + | tSEC_UNIT { + yyRelSeconds++; + } + | tSNUMBER tMONTH_UNIT { + yyRelMonth += $1 * $2; + } + | tUNUMBER tMONTH_UNIT { + yyRelMonth += $1 * $2; + } + | tMONTH_UNIT { + yyRelMonth += $1; + } + ; + +number : tUNUMBER { + if (yyHaveTime && yyHaveDate && !yyHaveRel) + yyYear = $1; + else { + if($1>10000) { + yyHaveDate++; + yyDay= ($1)%100; + yyMonth= ($1/100)%100; + yyYear = $1/10000; + } + else { + yyHaveTime++; + if ($1 < 100) { + yyHour = $1; + yyMinutes = 0; + } + else { + yyHour = $1 / 100; + yyMinutes = $1 % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } + } + } + ; + +o_merid : /* NULL */ { + $$ = MER24; + } + | tMERIDIAN { + $$ = $1; + } + ; + +%% + +/* Month and day table. */ +static TABLE const MonthDayTable[] = { + { "january", tMONTH, 1 }, + { "february", tMONTH, 2 }, + { "march", tMONTH, 3 }, + { "april", tMONTH, 4 }, + { "may", tMONTH, 5 }, + { "june", tMONTH, 6 }, + { "july", tMONTH, 7 }, + { "august", tMONTH, 8 }, + { "september", tMONTH, 9 }, + { "sept", tMONTH, 9 }, + { "october", tMONTH, 10 }, + { "november", tMONTH, 11 }, + { "december", tMONTH, 12 }, + { "sunday", tDAY, 0 }, + { "monday", tDAY, 1 }, + { "tuesday", tDAY, 2 }, + { "tues", tDAY, 2 }, + { "wednesday", tDAY, 3 }, + { "wednes", tDAY, 3 }, + { "thursday", tDAY, 4 }, + { "thur", tDAY, 4 }, + { "thurs", tDAY, 4 }, + { "friday", tDAY, 5 }, + { "saturday", tDAY, 6 }, + { NULL } +}; + +/* Time units table. */ +static TABLE const UnitsTable[] = { + { "year", tMONTH_UNIT, 12 }, + { "month", tMONTH_UNIT, 1 }, + { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 }, + { "week", tMINUTE_UNIT, 7 * 24 * 60 }, + { "day", tMINUTE_UNIT, 1 * 24 * 60 }, + { "hour", tMINUTE_UNIT, 60 }, + { "minute", tMINUTE_UNIT, 1 }, + { "min", tMINUTE_UNIT, 1 }, + { "second", tSEC_UNIT, 1 }, + { "sec", tSEC_UNIT, 1 }, + { NULL } +}; + +/* Assorted relative-time words. */ +static TABLE const OtherTable[] = { + { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 }, + { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 }, + { "today", tMINUTE_UNIT, 0 }, + { "now", tMINUTE_UNIT, 0 }, + { "last", tUNUMBER, -1 }, + { "this", tUNUMBER, 0 }, + { "next", tUNUMBER, 2 }, + { "first", tUNUMBER, 1 }, +/* { "second", tUNUMBER, 2 }, */ + { "third", tUNUMBER, 3 }, + { "fourth", tUNUMBER, 4 }, + { "fifth", tUNUMBER, 5 }, + { "sixth", tUNUMBER, 6 }, + { "seventh", tUNUMBER, 7 }, + { "eighth", tUNUMBER, 8 }, + { "ninth", tUNUMBER, 9 }, + { "tenth", tUNUMBER, 10 }, + { "eleventh", tUNUMBER, 11 }, + { "twelfth", tUNUMBER, 12 }, + { "ago", tAGO, 1 }, + { NULL } +}; + +/* The timezone table. */ +/* Some of these are commented out because a time_t can't store a float. */ +static TABLE const TimezoneTable[] = { + { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */ + { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */ + { "utc", tZONE, HOUR( 0) }, + { "wet", tZONE, HOUR( 0) }, /* Western European */ + { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */ + { "wat", tZONE, HOUR( 1) }, /* West Africa */ + { "at", tZONE, HOUR( 2) }, /* Azores */ +#if 0 + /* For completeness. BST is also British Summer, and GST is + * also Guam Standard. */ + { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */ + { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */ +#endif +#if 0 + { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */ + { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */ + { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */ +#endif + { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */ + { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */ + { "est", tZONE, HOUR( 5) }, /* Eastern Standard */ + { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */ + { "cst", tZONE, HOUR( 6) }, /* Central Standard */ + { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */ + { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */ + { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */ + { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */ + { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */ + { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */ + { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */ + { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */ + { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */ + { "cat", tZONE, HOUR(10) }, /* Central Alaska */ + { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */ + { "nt", tZONE, HOUR(11) }, /* Nome */ + { "idlw", tZONE, HOUR(12) }, /* International Date Line West */ + { "cet", tZONE, -HOUR(1) }, /* Central European */ + { "met", tZONE, -HOUR(1) }, /* Middle European */ + { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */ + { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */ + { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */ + { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */ + { "fwt", tZONE, -HOUR(1) }, /* French Winter */ + { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */ + { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */ + { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */ +#if 0 + { "it", tZONE, -HOUR(3.5) },/* Iran */ +#endif + { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */ + { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */ +#if 0 + { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */ +#endif + { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */ +#if 0 + /* For completeness. NST is also Newfoundland Stanard, and SST is + * also Swedish Summer. */ + { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */ + { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */ +#endif /* 0 */ + { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */ + { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */ +#if 0 + { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */ +#endif + { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */ + { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */ +#if 0 + { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */ + { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */ +#endif + { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */ + { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */ + { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */ + { "nzt", tZONE, -HOUR(12) }, /* New Zealand */ + { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */ + { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */ + { "idle", tZONE, -HOUR(12) }, /* International Date Line East */ + { NULL } +}; + +/* Military timezone table. */ +static TABLE const MilitaryTable[] = { + { "a", tZONE, HOUR( 1) }, + { "b", tZONE, HOUR( 2) }, + { "c", tZONE, HOUR( 3) }, + { "d", tZONE, HOUR( 4) }, + { "e", tZONE, HOUR( 5) }, + { "f", tZONE, HOUR( 6) }, + { "g", tZONE, HOUR( 7) }, + { "h", tZONE, HOUR( 8) }, + { "i", tZONE, HOUR( 9) }, + { "k", tZONE, HOUR( 10) }, + { "l", tZONE, HOUR( 11) }, + { "m", tZONE, HOUR( 12) }, + { "n", tZONE, HOUR(- 1) }, + { "o", tZONE, HOUR(- 2) }, + { "p", tZONE, HOUR(- 3) }, + { "q", tZONE, HOUR(- 4) }, + { "r", tZONE, HOUR(- 5) }, + { "s", tZONE, HOUR(- 6) }, + { "t", tZONE, HOUR(- 7) }, + { "u", tZONE, HOUR(- 8) }, + { "v", tZONE, HOUR(- 9) }, + { "w", tZONE, HOUR(-10) }, + { "x", tZONE, HOUR(-11) }, + { "y", tZONE, HOUR(-12) }, + { "z", tZONE, HOUR( 0) }, + { NULL } +}; + + + + +/* ARGSUSED */ +static int +yyerror(const char *s) +{ + return 0; +} + + +static time_t +ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian) +{ + if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59) + return -1; + switch (Meridian) { + case MER24: + if (Hours < 0 || Hours > 23) + return -1; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERam: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return (Hours * 60L + Minutes) * 60L + Seconds; + case MERpm: + if (Hours < 1 || Hours > 12) + return -1; + if (Hours == 12) + Hours = 0; + return ((Hours + 12) * 60L + Minutes) * 60L + Seconds; + default: + abort (); + } + /* NOTREACHED */ +} + + +/* Year is either + * A negative number, which means to use its absolute value (why?) + * A number from 0 to 99, which means a year from 1900 to 1999, or + * The actual year (>=100). */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, time_t Hours, time_t Minutes, + time_t Seconds, MERIDIAN Meridian, DSTMODE DSTmode) +{ + static int DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + struct tm *tm; + time_t tod; + time_t Julian; + int i; + + if (Year < 0) + Year = -Year; + if (Year < 69) + Year += 2000; + else if (Year < 100) { + Year += 1900; + if (Year < EPOCH) + Year += 100; + } + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* 32-bit time_t cannot represent years past 2038 */ + if (Year < EPOCH || (sizeof(time_t) == sizeof(int) && Year > 2038) + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month]) + return -1; + + for (Julian = Day - 1, i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= SECSPERDAY; + Julian += yyTimezone * 60L; + if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0) + return -1; + Julian += tod; + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && (tm = localtime(&Julian)) && tm->tm_isdst)) + Julian -= 60 * 60; + return Julian; +} + + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + struct tm *start_tm; + struct tm *future_tm; + time_t StartDay; + time_t FutureDay; + + start_tm = localtime(&Start); + future_tm = localtime(&Future); + if (!start_tm || !future_tm) + return -1; + + StartDay = (start_tm->tm_hour + 1) % 24; + FutureDay = (future_tm->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * 60L * 60L; +} + + +static time_t +RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t now; + + now = Start; + if (!(tm = localtime(&now))) + return -1; + now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + return DSTcorrect(Start, now); +} + + +static time_t +RelativeMonth(time_t Start, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; + + if (RelMonth == 0) + return 0; + if (!(tm = localtime(&Start))) + return -1; + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + MER24, DSTmaybe)); +} + + +static int +LookupWord(char *buff) +{ + char *p; + char *q; + const TABLE *tp; + int i; + int abbrev; + + /* Make it lowercase. */ + for (p = buff; *p; p++) + if (isupper((unsigned char)*p)) + *p = tolower((unsigned char)*p); + + if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) { + yylval.Meridian = MERam; + return tMERIDIAN; + } + if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) { + yylval.Meridian = MERpm; + return tMERIDIAN; + } + + /* See if we have an abbreviation for a month. */ + if (strlen(buff) == 3) + abbrev = 1; + else if (strlen(buff) == 4 && buff[3] == '.') { + abbrev = 1; + buff[3] = '\0'; + } + else + abbrev = 0; + + for (tp = MonthDayTable; tp->name; tp++) { + if (abbrev) { + if (strncmp(buff, tp->name, 3) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + else if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + if (strcmp(buff, "dst") == 0) + return tDST; + + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Strip off any plural and try the units table again. */ + i = strlen(buff) - 1; + if (buff[i] == 's') { + buff[i] = '\0'; + for (tp = UnitsTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + buff[i] = 's'; /* Put back for "this" in OtherTable. */ + } + + for (tp = OtherTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + /* Military timezones. */ + if (buff[1] == '\0' && isalpha((unsigned char)*buff)) { + for (tp = MilitaryTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + } + + /* Drop out any periods and try the timezone table again. */ + for (i = 0, p = q = buff; *q; q++) + if (*q != '.') + *p++ = *q; + else + i++; + *p = '\0'; + if (i) + for (tp = TimezoneTable; tp->name; tp++) + if (strcmp(buff, tp->name) == 0) { + yylval.Number = tp->value; + return tp->type; + } + + return tID; +} + + +static int +yylex(void) +{ + char c; + char *p; + char buff[20]; + int Count; + int sign; + + for ( ; ; ) { + while (isspace((unsigned char)*yyInput)) + yyInput++; + + if (isdigit((unsigned char)(c = *yyInput)) || c == '-' || c == '+') { + if (c == '-' || c == '+') { + sign = c == '-' ? -1 : 1; + if (!isdigit((unsigned char)*++yyInput)) + /* skip the '-' sign */ + continue; + } + else + sign = 0; + for (yylval.Number = 0; isdigit((unsigned char)(c = *yyInput++)); ) + yylval.Number = 10 * yylval.Number + c - '0'; + yyInput--; + if (sign < 0) + yylval.Number = -yylval.Number; + return sign ? tSNUMBER : tUNUMBER; + } + if (isalpha((unsigned char)c)) { + for (p = buff; isalpha((unsigned char)(c = *yyInput++)) || c == '.'; ) + if (p < &buff[sizeof buff - 1]) + *p++ = c; + *p = '\0'; + yyInput--; + return LookupWord(buff); + } + if (c != '(') + return *yyInput++; + Count = 0; + do { + c = *yyInput++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm(struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (60*(60*(24*days + (a->tm_hour - b->tm_hour)) + + (a->tm_min - b->tm_min)) + + (a->tm_sec - b->tm_sec)); +} + +time_t +get_date(char *p) +{ + struct tm *tm, *gmt, gmtbuf; + time_t Start; + time_t tod; + time_t now; + time_t timezone; + + yyInput = p; + (void)time (&now); + + gmt = gmtime (&now); + if (gmt != NULL) + { + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmtbuf = *gmt; + gmt = &gmtbuf; + } + + if (! (tm = localtime (&now))) + return -1; + + if (gmt != NULL) + timezone = difftm (gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + timezone = 0; + + if(tm->tm_isdst) + timezone += 60; + + yyYear = tm->tm_year + 1900; + yyMonth = tm->tm_mon + 1; + yyDay = tm->tm_mday; + yyTimezone = timezone; + yyDSTmode = DSTmaybe; + yyHour = 0; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = MER24; + yyRelSeconds = 0; + yyRelMonth = 0; + yyHaveDate = 0; + yyHaveDay = 0; + yyHaveRel = 0; + yyHaveTime = 0; + yyHaveZone = 0; + + if (yyparse() + || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1) + return -1; + + if (yyHaveDate || yyHaveTime || yyHaveDay) { + Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds, + yyMeridian, yyDSTmode); + if (Start < 0) + return -1; + } + else { + Start = now; + if (!yyHaveRel) + Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec; + } + + Start += yyRelSeconds; + Start += RelativeMonth(Start, yyRelMonth); + + if (yyHaveDay && !yyHaveDate) { + tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber); + Start += tod; + } + + /* Have to do *something* with a legitimate -1 so it's distinguishable + * from the error return value. (Alternately could set errno on error.) */ + return Start == -1 ? 0 : Start; +} + + +#ifdef TEST + +/* ARGSUSED */ +int +main(int argc, char *argv[]) +{ + char buff[128]; + time_t d; + + (void)printf("Enter date, or blank line to exit.\n\t> "); + (void)fflush(stdout); + while (fgets(buff, sizeof(buff), stdin) && buff[0]) { + d = get_date(buff); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("%s", ctime(&d)); + (void)printf("\t> "); + (void)fflush(stdout); + } + exit(0); + /* NOTREACHED */ +} +#endif /* TEST */ diff --git a/utsudo-0.0.2/plugins/sudoers/getspwuid.c b/utsudo-0.0.2/plugins/sudoers/getspwuid.c new file mode 100644 index 0000000..a6bdb4b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/getspwuid.c @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#ifdef HAVE_GETSPNAM +# include +#endif /* HAVE_GETSPNAM */ +#ifdef HAVE_GETPRPWNAM +# ifdef __hpux +# undef MAXINT +# include +# else +# include +# endif /* __hpux */ +# include +#endif /* HAVE_GETPRPWNAM */ + +#include "sudoers.h" + +/* + * Exported for auth/secureware.c + */ +#if defined(HAVE_GETPRPWNAM) && defined(__alpha) +int crypt_type = INT_MAX; +#endif /* HAVE_GETPRPWNAM && __alpha */ + +/* + * Return a copy of the encrypted password for the user described by pw. + * If shadow passwords are in use, look in the shadow file. + */ +char * +sudo_getepw(const struct passwd *pw) +{ + char *epw = NULL; + debug_decl(sudo_getepw, SUDOERS_DEBUG_AUTH) + + /* If there is a function to check for shadow enabled, use it... */ +#ifdef HAVE_ISCOMSEC + if (!iscomsec()) + goto done; +#endif /* HAVE_ISCOMSEC */ + +#ifdef HAVE_GETPWNAM_SHADOW + { + struct passwd *spw; + + if ((spw = getpwnam_shadow(pw->pw_name)) != NULL) + epw = spw->pw_passwd; + } +#endif /* HAVE_GETPWNAM_SHADOW */ +#ifdef HAVE_GETPRPWNAM + { + struct pr_passwd *spw; + + if ((spw = getprpwnam(pw->pw_name)) && spw->ufld.fd_encrypt) { +# ifdef __alpha + crypt_type = spw->ufld.fd_oldcrypt; +# endif /* __alpha */ + epw = spw->ufld.fd_encrypt; + } + } +#endif /* HAVE_GETPRPWNAM */ +#ifdef HAVE_GETSPNAM + { + struct spwd *spw; + + if ((spw = getspnam(pw->pw_name)) && spw->sp_pwdp) + epw = spw->sp_pwdp; + } +#endif /* HAVE_GETSPNAM */ + +#if defined(HAVE_ISCOMSEC) +done: +#endif + /* If no shadow password, fall back on regular password. */ + debug_return_str(strdup(epw ? epw : pw->pw_passwd)); +} + +void +sudo_setspent(void) +{ + debug_decl(sudo_setspent, SUDOERS_DEBUG_AUTH) + +#ifdef HAVE_GETPRPWNAM + setprpwent(); +#endif +#ifdef HAVE_GETSPNAM + setspent(); +#endif + debug_return; +} + +void +sudo_endspent(void) +{ + debug_decl(sudo_endspent, SUDOERS_DEBUG_AUTH) + +#ifdef HAVE_GETPRPWNAM + endprpwent(); +#endif +#ifdef HAVE_GETSPNAM + endspent(); +#endif + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/gmtoff.c b/utsudo-0.0.2/plugins/sudoers/gmtoff.c new file mode 100644 index 0000000..4521819 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gmtoff.c @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Returns the offset from GMT in seconds (algorithm taken from sendmail). + * Warning: clobbers the static storage used by localtime() and gmtime(). + */ +#ifdef HAVE_STRUCT_TM_TM_GMTOFF +long +get_gmtoff(time_t *clock) +{ + struct tm *local; + + local = localtime(clock); + return local->tm_gmtoff; +} +#else +long +get_gmtoff(time_t *clock) +{ + struct tm *gm, gmt, *local; + long offset; + + if ((gm = gmtime(clock)) == NULL) + return 0; + gmt = *gm; + if ((local = localtime(clock)) == NULL) + return 0; + + offset = (local->tm_sec - gmt.tm_sec) + + ((local->tm_min - gmt.tm_min) * 60) + + ((local->tm_hour - gmt.tm_hour) * 3600); + + /* Timezone may cause year rollover to happen on a different day. */ + if (local->tm_year < gmt.tm_year) + offset -= 24 * 3600; + else if (local->tm_year > gmt.tm_year) + offset -= 24 * 3600; + else if (local->tm_yday < gmt.tm_yday) + offset -= 24 * 3600; + else if (local->tm_yday > gmt.tm_yday) + offset += 24 * 3600; + + return offset; +} +#endif /* HAVE_TM_GMTOFF */ diff --git a/utsudo-0.0.2/plugins/sudoers/goodpath.c b/utsudo-0.0.2/plugins/sudoers/goodpath.c new file mode 100644 index 0000000..5f183d1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/goodpath.c @@ -0,0 +1,70 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2010-2012, 2014-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" + +/* + * Verify that path is a normal file and executable by root. + */ +bool +sudo_goodpath(const char *path, struct stat *sbp) +{ + bool ret = false; + debug_decl(sudo_goodpath, SUDOERS_DEBUG_UTIL) + + if (path != NULL) { + struct stat sb; + + if (sbp == NULL) + sbp = &sb; + + if (stat(path, sbp) == 0) { + /* Make sure path describes an executable regular file. */ + if (S_ISREG(sbp->st_mode) && ISSET(sbp->st_mode, S_IXUSR|S_IXGRP|S_IXOTH)) + ret = true; + else + errno = EACCES; + } + } + + debug_return_bool(ret); +} diff --git a/utsudo-0.0.2/plugins/sudoers/gram.c b/utsudo-0.0.2/plugins/sudoers/gram.c new file mode 100644 index 0000000..103f112 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gram.c @@ -0,0 +1,2309 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include +#include +#include +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYLEX yylex() +#define YYEMPTY -1 +#define yyclearin (yychar=(YYEMPTY)) +#define yyerrok (yyerrflag=0) +#define YYRECOVERING() (yyerrflag!=0) +#define yyparse sudoersparse +#define yylex sudoerslex +#define yyerror sudoerserror +#define yychar sudoerschar +#define yyval sudoersval +#define yylval sudoerslval +#define yydebug sudoersdebug +#define yynerrs sudoersnerrs +#define yyerrflag sudoerserrflag +#define yyss sudoersss +#define yysslim sudoerssslim +#define yyssp sudoersssp +#define yyvs sudoersvs +#define yyvsp sudoersvsp +#define yystacksize sudoersstacksize +#define yylhs sudoerslhs +#define yylen sudoerslen +#define yydefred sudoersdefred +#define yydgoto sudoersdgoto +#define yysindex sudoerssindex +#define yyrindex sudoersrindex +#define yygindex sudoersgindex +#define yytable sudoerstable +#define yycheck sudoerscheck +#define yyname sudoersname +#define yyrule sudoersrule +#define YYPREFIX "sudoers" +#line 2 "gram.y" +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) +# include +#endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include + +#include "sudoers.h" +#include "sudo_digest.h" +#include "toke.h" + +/* If we last saw a newline the entry is on the preceding line. */ +#define this_lineno (last_token == COMMENT ? sudolineno - 1 : sudolineno) + +/* + * Globals + */ +bool sudoers_warnings = true; +bool parse_error = false; +int errorlineno = -1; +char *errorfile = NULL; + +struct sudoers_parse_tree parsed_policy = { + TAILQ_HEAD_INITIALIZER(parsed_policy.userspecs), + TAILQ_HEAD_INITIALIZER(parsed_policy.defaults), + NULL, /* aliases */ + NULL, /* lhost */ + NULL /* shost */ +}; + +/* + * Local protoypes + */ +static void init_options(struct command_options *opts); +static bool add_defaults(int, struct member *, struct defaults *); +static bool add_userspec(struct member *, struct privilege *); +static struct defaults *new_default(char *, char *, short); +static struct member *new_member(char *, int); +static struct command_digest *new_digest(int, char *); +#line 82 "gram.y" +#ifndef YYSTYPE_DEFINED +#define YYSTYPE_DEFINED +typedef union { + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; +} YYSTYPE; +#endif /* YYSTYPE_DEFINED */ +#line 135 "gram.c" +#define COMMAND 257 +#define ALIAS 258 +#define DEFVAR 259 +#define NTWKADDR 260 +#define NETGROUP 261 +#define USERGROUP 262 +#define WORD 263 +#define DIGEST 264 +#define DEFAULTS 265 +#define DEFAULTS_HOST 266 +#define DEFAULTS_USER 267 +#define DEFAULTS_RUNAS 268 +#define DEFAULTS_CMND 269 +#define NOPASSWD 270 +#define PASSWD 271 +#define NOEXEC 272 +#define EXEC 273 +#define SETENV 274 +#define NOSETENV 275 +#define LOG_INPUT 276 +#define NOLOG_INPUT 277 +#define LOG_OUTPUT 278 +#define NOLOG_OUTPUT 279 +#define MAIL 280 +#define NOMAIL 281 +#define FOLLOWLNK 282 +#define NOFOLLOWLNK 283 +#define ALL 284 +#define COMMENT 285 +#define HOSTALIAS 286 +#define CMNDALIAS 287 +#define USERALIAS 288 +#define RUNASALIAS 289 +#define ERROR 290 +#define TYPE 291 +#define ROLE 292 +#define PRIVS 293 +#define LIMITPRIVS 294 +#define CMND_TIMEOUT 295 +#define NOTBEFORE 296 +#define NOTAFTER 297 +#define MYSELF 298 +#define SHA224_TOK 299 +#define SHA256_TOK 300 +#define SHA384_TOK 301 +#define SHA512_TOK 302 +#define YYERRCODE 256 +#if defined(__cplusplus) || defined(__STDC__) +const short sudoerslhs[] = +#else +short sudoerslhs[] = +#endif + { -1, + 0, 0, 32, 32, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 4, 4, 3, 3, + 3, 3, 3, 21, 21, 20, 11, 11, 9, 9, + 9, 9, 9, 2, 2, 1, 31, 31, 31, 31, + 7, 7, 6, 6, 28, 29, 30, 24, 25, 26, + 27, 18, 18, 19, 19, 19, 19, 19, 23, 23, + 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 5, 5, 5, 35, 35, 38, 10, 10, 36, + 36, 39, 8, 8, 37, 37, 40, 34, 34, 41, + 14, 14, 12, 12, 13, 13, 13, 13, 13, 17, + 17, 15, 15, 16, 16, 16, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoerslen[] = +#else +short sudoerslen[] = +#endif + { 2, + 0, 1, 1, 2, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 1, 3, 1, 2, + 3, 3, 3, 1, 3, 3, 1, 2, 1, 1, + 1, 1, 1, 1, 3, 4, 3, 3, 3, 3, + 1, 2, 1, 2, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 0, 1, 3, 2, 1, 0, 2, + 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, + 3, 3, 1, 3, 1, 3, 3, 1, 3, 3, + 1, 3, 1, 2, 1, 1, 1, 1, 1, 1, + 3, 1, 2, 1, 1, 1, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoersdefred[] = +#else +short sudoersdefred[] = +#endif + { 0, + 0, 105, 107, 108, 109, 0, 0, 0, 0, 0, + 106, 5, 0, 0, 0, 0, 0, 0, 101, 103, + 0, 0, 3, 6, 0, 0, 17, 0, 29, 32, + 31, 33, 30, 0, 27, 0, 88, 0, 0, 84, + 83, 82, 0, 0, 0, 0, 0, 43, 41, 93, + 0, 0, 0, 0, 85, 0, 0, 90, 0, 0, + 98, 0, 0, 95, 104, 0, 0, 24, 0, 4, + 0, 0, 0, 20, 0, 28, 0, 0, 0, 0, + 44, 0, 0, 0, 0, 0, 0, 42, 0, 0, + 0, 0, 0, 0, 0, 0, 102, 0, 0, 21, + 22, 23, 18, 89, 37, 38, 39, 40, 94, 0, + 86, 0, 91, 0, 99, 0, 96, 0, 34, 0, + 59, 25, 0, 0, 0, 0, 0, 114, 116, 115, + 0, 110, 112, 0, 0, 53, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 63, 64, 65, 66, 62, + 60, 61, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 80, 81, 78, 79, 36, 111, 49, 48, + 50, 51, 45, 46, 47, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoersdgoto[] = +#else +short sudoersdgoto[] = +#endif + { 18, + 119, 120, 27, 28, 48, 49, 50, 51, 35, 67, + 37, 19, 20, 21, 132, 133, 134, 121, 125, 68, + 69, 145, 127, 146, 147, 148, 149, 150, 151, 152, + 52, 22, 23, 60, 54, 57, 63, 55, 58, 64, + 61, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoerssindex[] = +#else +short sudoerssindex[] = +#endif + { 512, + -272, 0, 0, 0, 0, -23, 227, -19, -19, -5, + 0, 0, -239, -236, -234, -232, -231, 0, 0, 0, + -33, 512, 0, 0, -3, -220, 0, 3, 0, 0, + 0, 0, 0, -225, 0, -28, 0, -24, -24, 0, + 0, 0, -240, -15, -8, 2, 4, 0, 0, 0, + -21, -12, -9, 6, 0, 7, 12, 0, 10, 14, + 0, 13, 25, 0, 0, -19, -36, 0, 26, 0, + -208, -202, -198, 0, -23, 0, 227, 3, 3, 3, + 0, -179, -178, -174, -173, -5, 3, 0, 227, -239, + -5, -236, -19, -234, -19, -232, 0, 52, 227, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 51, 0, 54, 0, 54, 0, -29, 0, 55, + 0, 0, 289, -7, 59, 52, -216, 0, 0, 0, + -217, 0, 0, 57, 289, 0, 0, 32, 41, 42, + 43, 44, 45, 47, 450, 0, 0, 0, 0, 0, + 0, 0, 0, 289, 57, -154, -153, -150, -149, -148, + -147, -146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoersrindex[] = +#else +short sudoersrindex[] = +#endif + { 118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 1, 0, 0, 145, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 159, 0, 0, 193, 0, 0, 207, + 0, 0, 241, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 0, 0, 309, 323, 357, + 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 49, 0, 63, 0, 97, 0, 79, 0, 111, + 0, 0, 81, 82, 0, 404, 483, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoersgindex[] = +#else +short sudoersgindex[] = +#endif + { 0, + 5, 0, 53, 18, 86, 74, -79, 36, 98, -1, + 56, 68, 120, -6, -18, 8, 11, 0, 0, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 0, 0, 0, 58, 48, 46, + 60, +}; +#define YYTABLESIZE 801 +#if defined(__cplusplus) || defined(__STDC__) +const short sudoerstable[] = +#else +short sudoerstable[] = +#endif + { 34, + 19, 38, 39, 17, 26, 36, 109, 77, 26, 26, + 66, 26, 24, 17, 87, 77, 40, 41, 53, 66, + 43, 56, 86, 59, 98, 62, 2, 43, 123, 3, + 4, 5, 29, 19, 30, 31, 66, 32, 74, 72, + 128, 73, 82, 42, 19, 129, 75, 87, 92, 83, + 135, 89, 11, 78, 100, 79, 80, 71, 33, 84, + 101, 85, 100, 90, 102, 177, 130, 91, 87, 92, + 93, 94, 87, 95, 138, 139, 140, 141, 142, 143, + 144, 92, 96, 99, 105, 106, 114, 110, 116, 107, + 108, 118, 156, 77, 86, 100, 97, 66, 126, 136, + 154, 157, 158, 159, 160, 161, 92, 162, 179, 180, + 26, 124, 181, 182, 183, 184, 185, 1, 2, 54, + 100, 58, 55, 57, 56, 88, 112, 103, 81, 97, + 137, 76, 104, 97, 70, 178, 65, 122, 153, 113, + 0, 117, 0, 26, 12, 155, 0, 111, 0, 0, + 0, 0, 0, 115, 97, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 10, 30, 31, 2, 32, + 25, 3, 4, 5, 25, 25, 0, 25, 2, 8, + 11, 3, 4, 5, 40, 41, 0, 0, 0, 0, + 33, 40, 41, 0, 11, 0, 19, 0, 19, 34, + 0, 19, 19, 19, 11, 19, 19, 19, 19, 19, + 87, 42, 87, 11, 7, 87, 87, 87, 42, 87, + 87, 87, 87, 87, 19, 19, 19, 19, 19, 19, + 0, 0, 0, 44, 45, 46, 47, 0, 87, 87, + 87, 87, 87, 87, 92, 0, 92, 7, 15, 92, + 92, 92, 0, 92, 92, 92, 92, 92, 100, 0, + 100, 131, 13, 100, 100, 100, 0, 100, 100, 100, + 100, 100, 92, 92, 92, 92, 92, 92, 0, 0, + 0, 15, 0, 0, 0, 0, 100, 100, 100, 100, + 100, 100, 97, 0, 97, 13, 14, 97, 97, 97, + 0, 97, 97, 97, 97, 97, 26, 0, 26, 0, + 16, 26, 26, 26, 0, 26, 26, 26, 26, 26, + 97, 97, 97, 97, 97, 97, 0, 0, 0, 14, + 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 12, 0, 12, 16, 0, 12, 12, 12, 0, 12, + 12, 12, 12, 12, 9, 0, 9, 0, 0, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 12, 12, + 12, 12, 12, 12, 0, 0, 52, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 10, 0, + 10, 0, 0, 10, 10, 10, 0, 10, 10, 10, + 10, 10, 8, 0, 8, 0, 0, 8, 8, 8, + 0, 8, 8, 8, 8, 8, 10, 10, 10, 10, + 10, 10, 43, 0, 29, 0, 30, 31, 0, 32, + 8, 8, 8, 8, 8, 8, 11, 0, 11, 0, + 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 33, 0, 0, 0, 0, 67, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 7, 0, 7, 0, 0, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 17, 0, 128, 0, 0, 0, + 0, 129, 0, 0, 0, 0, 0, 0, 7, 7, + 7, 7, 7, 7, 15, 0, 15, 0, 0, 15, + 15, 15, 130, 15, 15, 15, 15, 15, 13, 0, + 13, 0, 0, 13, 13, 13, 0, 13, 13, 13, + 13, 13, 15, 15, 15, 15, 15, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, + 13, 13, 14, 0, 14, 0, 0, 14, 14, 14, + 0, 14, 14, 14, 14, 14, 16, 0, 16, 0, + 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, + 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, + 52, 52, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, + 0, 0, 0, 0, 52, 52, 52, 52, 52, 52, + 52, 0, 52, 52, 52, 52, 40, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 42, 0, 0, 0, 0, 0, 67, + 67, 0, 0, 0, 0, 0, 0, 0, 44, 45, + 46, 47, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 1, 0, 2, + 0, 0, 3, 4, 5, 0, 6, 7, 8, 9, + 10, 67, 67, 67, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, + 16, +}; +#if defined(__cplusplus) || defined(__STDC__) +const short sudoerscheck[] = +#else +short sudoerscheck[] = +#endif + { 33, + 0, 8, 9, 33, 33, 7, 86, 44, 33, 33, + 44, 33, 285, 33, 0, 44, 257, 258, 258, 44, + 33, 258, 44, 258, 61, 258, 258, 33, 58, 261, + 262, 263, 258, 33, 260, 261, 44, 263, 259, 43, + 258, 45, 58, 284, 44, 263, 44, 33, 0, 58, + 58, 61, 284, 36, 263, 38, 39, 61, 284, 58, + 263, 58, 0, 58, 263, 145, 284, 61, 51, 58, + 61, 58, 58, 61, 291, 292, 293, 294, 295, 296, + 297, 33, 58, 58, 264, 264, 93, 89, 95, 264, + 264, 40, 61, 44, 44, 33, 0, 44, 44, 41, + 44, 61, 61, 61, 61, 61, 58, 61, 263, 263, + 0, 118, 263, 263, 263, 263, 263, 0, 0, 41, + 58, 41, 41, 41, 41, 52, 91, 75, 43, 33, + 126, 34, 77, 66, 22, 154, 17, 99, 131, 92, + -1, 96, -1, 33, 0, 135, -1, 90, -1, -1, + -1, -1, -1, 94, 58, -1, -1, -1, 0, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, + -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 33, 0, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 258, 33, 260, 261, 258, 263, + 259, 261, 262, 263, 259, 259, -1, 259, 258, 33, + 0, 261, 262, 263, 257, 258, -1, -1, -1, -1, + 284, 257, 258, -1, 284, -1, 256, -1, 258, 33, + -1, 261, 262, 263, 284, 265, 266, 267, 268, 269, + 256, 284, 258, 33, 0, 261, 262, 263, 284, 265, + 266, 267, 268, 269, 284, 285, 286, 287, 288, 289, + -1, -1, -1, 299, 300, 301, 302, -1, 284, 285, + 286, 287, 288, 289, 256, -1, 258, 33, 0, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 256, -1, + 258, 33, 0, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 284, 285, 286, 287, 288, 289, -1, -1, + -1, 33, -1, -1, -1, -1, 284, 285, 286, 287, + 288, 289, 256, -1, 258, 33, 0, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 256, -1, 258, -1, + 0, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, 285, 286, 287, 288, 289, -1, -1, -1, 33, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 256, -1, 258, 33, -1, 261, 262, 263, -1, 265, + 266, 267, 268, 269, 256, -1, 258, -1, -1, 261, + 262, 263, -1, 265, 266, 267, 268, 269, 284, 285, + 286, 287, 288, 289, -1, -1, 33, -1, -1, -1, + -1, -1, 284, 285, 286, 287, 288, 289, 256, -1, + 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 256, -1, 258, -1, -1, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 284, 285, 286, 287, + 288, 289, 33, -1, 258, -1, 260, 261, -1, 263, + 284, 285, 286, 287, 288, 289, 256, -1, 258, -1, + -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, -1, -1, -1, -1, 33, -1, -1, -1, -1, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, + 266, 267, 268, 269, 33, -1, 258, -1, -1, -1, + -1, 263, -1, -1, -1, -1, -1, -1, 284, 285, + 286, 287, 288, 289, 256, -1, 258, -1, -1, 261, + 262, 263, 284, 265, 266, 267, 268, 269, 256, -1, + 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, + 268, 269, 284, 285, 286, 287, 288, 289, -1, -1, + -1, -1, -1, -1, -1, -1, 284, 285, 286, 287, + 288, 289, 256, -1, 258, -1, -1, 261, 262, 263, + -1, 265, 266, 267, 268, 269, 256, -1, 258, -1, + -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, + 284, 285, 286, 287, 288, 289, -1, -1, -1, -1, + -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, + 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, -1, -1, + -1, -1, -1, -1, 291, 292, 293, 294, 295, 296, + 297, -1, 299, 300, 301, 302, 257, 258, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, 299, 300, + 301, 302, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 256, -1, 258, + -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, + 269, 299, 300, 301, 302, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 284, 285, 286, 287, 288, + 289, +}; +#define YYFINAL 18 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 302 +#if YYDEBUG +#if defined(__cplusplus) || defined(__STDC__) +const char * const sudoersname[] = +#else +char *sudoersname[] = +#endif + { +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +"'!'",0,0,0,0,0,0,"'('","')'",0,"'+'","','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,"':'", +0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +"COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DIGEST", +"DEFAULTS","DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND", +"NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT", +"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOWLNK", +"NOFOLLOWLNK","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS", +"ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS","CMND_TIMEOUT","NOTBEFORE", +"NOTAFTER","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK","SHA512_TOK", +}; +#if defined(__cplusplus) || defined(__STDC__) +const char * const sudoersrule[] = +#else +char *sudoersrule[] = +#endif + {"$accept : file", +"file :", +"file : line", +"line : entry", +"line : line entry", +"entry : COMMENT", +"entry : error COMMENT", +"entry : userlist privileges", +"entry : USERALIAS useraliases", +"entry : HOSTALIAS hostaliases", +"entry : CMNDALIAS cmndaliases", +"entry : RUNASALIAS runasaliases", +"entry : DEFAULTS defaults_list", +"entry : DEFAULTS_USER userlist defaults_list", +"entry : DEFAULTS_RUNAS userlist defaults_list", +"entry : DEFAULTS_HOST hostlist defaults_list", +"entry : DEFAULTS_CMND cmndlist defaults_list", +"defaults_list : defaults_entry", +"defaults_list : defaults_list ',' defaults_entry", +"defaults_entry : DEFVAR", +"defaults_entry : '!' DEFVAR", +"defaults_entry : DEFVAR '=' WORD", +"defaults_entry : DEFVAR '+' WORD", +"defaults_entry : DEFVAR '-' WORD", +"privileges : privilege", +"privileges : privileges ':' privilege", +"privilege : hostlist '=' cmndspeclist", +"ophost : host", +"ophost : '!' host", +"host : ALIAS", +"host : ALL", +"host : NETGROUP", +"host : NTWKADDR", +"host : WORD", +"cmndspeclist : cmndspec", +"cmndspeclist : cmndspeclist ',' cmndspec", +"cmndspec : runasspec options cmndtag digcmnd", +"digest : SHA224_TOK ':' DIGEST", +"digest : SHA256_TOK ':' DIGEST", +"digest : SHA384_TOK ':' DIGEST", +"digest : SHA512_TOK ':' DIGEST", +"digcmnd : opcmnd", +"digcmnd : digest opcmnd", +"opcmnd : cmnd", +"opcmnd : '!' cmnd", +"timeoutspec : CMND_TIMEOUT '=' WORD", +"notbeforespec : NOTBEFORE '=' WORD", +"notafterspec : NOTAFTER '=' WORD", +"rolespec : ROLE '=' WORD", +"typespec : TYPE '=' WORD", +"privsspec : PRIVS '=' WORD", +"limitprivsspec : LIMITPRIVS '=' WORD", +"runasspec :", +"runasspec : '(' runaslist ')'", +"runaslist :", +"runaslist : userlist", +"runaslist : userlist ':' grouplist", +"runaslist : ':' grouplist", +"runaslist : ':'", +"options :", +"options : options notbeforespec", +"options : options notafterspec", +"options : options timeoutspec", +"options : options rolespec", +"options : options typespec", +"options : options privsspec", +"options : options limitprivsspec", +"cmndtag :", +"cmndtag : cmndtag NOPASSWD", +"cmndtag : cmndtag PASSWD", +"cmndtag : cmndtag NOEXEC", +"cmndtag : cmndtag EXEC", +"cmndtag : cmndtag SETENV", +"cmndtag : cmndtag NOSETENV", +"cmndtag : cmndtag LOG_INPUT", +"cmndtag : cmndtag NOLOG_INPUT", +"cmndtag : cmndtag LOG_OUTPUT", +"cmndtag : cmndtag NOLOG_OUTPUT", +"cmndtag : cmndtag FOLLOWLNK", +"cmndtag : cmndtag NOFOLLOWLNK", +"cmndtag : cmndtag MAIL", +"cmndtag : cmndtag NOMAIL", +"cmnd : ALL", +"cmnd : ALIAS", +"cmnd : COMMAND", +"hostaliases : hostalias", +"hostaliases : hostaliases ':' hostalias", +"hostalias : ALIAS '=' hostlist", +"hostlist : ophost", +"hostlist : hostlist ',' ophost", +"cmndaliases : cmndalias", +"cmndaliases : cmndaliases ':' cmndalias", +"cmndalias : ALIAS '=' cmndlist", +"cmndlist : digcmnd", +"cmndlist : cmndlist ',' digcmnd", +"runasaliases : runasalias", +"runasaliases : runasaliases ':' runasalias", +"runasalias : ALIAS '=' userlist", +"useraliases : useralias", +"useraliases : useraliases ':' useralias", +"useralias : ALIAS '=' userlist", +"userlist : opuser", +"userlist : userlist ',' opuser", +"opuser : user", +"opuser : '!' user", +"user : ALIAS", +"user : ALL", +"user : NETGROUP", +"user : USERGROUP", +"user : WORD", +"grouplist : opgroup", +"grouplist : grouplist ',' opgroup", +"opgroup : group", +"opgroup : '!' group", +"group : ALIAS", +"group : ALL", +"group : WORD", +}; +#endif +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 10000 +#define YYMAXDEPTH 10000 +#endif +#endif +#define YYINITSTACKSIZE 200 +/* LINTUSED */ +int yydebug; +int yynerrs; +int yyerrflag; +int yychar; +short *yyssp; +YYSTYPE *yyvsp; +YYSTYPE yyval; +YYSTYPE yylval; +short *yyss; +short *yysslim; +YYSTYPE *yyvs; +unsigned int yystacksize; +int yyparse(void); +#line 910 "gram.y" +void +sudoerserror(const char *s) +{ + debug_decl(sudoerserror, SUDOERS_DEBUG_PARSER) + + /* Save the line the first error occurred on. */ + if (errorlineno == -1) { + errorlineno = this_lineno; + rcstr_delref(errorfile); + errorfile = rcstr_addref(sudoers); + } + if (sudoers_warnings && s != NULL) { + LEXTRACE("<*> "); +#ifndef TRACELEXER + if (trace_print == NULL || trace_print == sudoers_trace_print) { + const char fmt[] = ">>> %s: %s near line %d <<<\n"; + int oldlocale; + + /* Warnings are displayed in the user's locale. */ + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + sudo_printf(SUDO_CONV_ERROR_MSG, _(fmt), sudoers, _(s), this_lineno); + sudoers_setlocale(oldlocale, NULL); + } +#endif + } + parse_error = true; + debug_return; +} + +static struct defaults * +new_default(char *var, char *val, short op) +{ + struct defaults *d; + debug_decl(new_default, SUDOERS_DEBUG_PARSER) + + if ((d = calloc(1, sizeof(struct defaults))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + d->var = var; + d->val = val; + /* d->type = 0; */ + d->op = op; + /* d->binding = NULL */ + d->lineno = this_lineno; + d->file = rcstr_addref(sudoers); + HLTQ_INIT(d, entries); + + debug_return_ptr(d); +} + +static struct member * +new_member(char *name, int type) +{ + struct member *m; + debug_decl(new_member, SUDOERS_DEBUG_PARSER) + + if ((m = calloc(1, sizeof(struct member))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + m->name = name; + m->type = type; + HLTQ_INIT(m, entries); + + debug_return_ptr(m); +} + +static struct command_digest * +new_digest(int digest_type, char *digest_str) +{ + struct command_digest *digest; + debug_decl(new_digest, SUDOERS_DEBUG_PARSER) + + if ((digest = malloc(sizeof(*digest))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + digest->digest_type = digest_type; + digest->digest_str = digest_str; + if (digest->digest_str == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(digest); + digest = NULL; + } + + debug_return_ptr(digest); +} + +/* + * Add a list of defaults structures to the defaults list. + * The binding, if non-NULL, specifies a list of hosts, users, or + * runas users the entries apply to (specified by the type). + */ +static bool +add_defaults(int type, struct member *bmem, struct defaults *defs) +{ + struct defaults *d, *next; + struct member_list *binding; + bool ret = true; + debug_decl(add_defaults, SUDOERS_DEBUG_PARSER) + + if (defs != NULL) { + /* + * We use a single binding for each entry in defs. + */ + if ((binding = malloc(sizeof(*binding))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudoerserror(N_("unable to allocate memory")); + debug_return_bool(false); + } + if (bmem != NULL) + HLTQ_TO_TAILQ(binding, bmem, entries); + else + TAILQ_INIT(binding); + + /* + * Set type and binding (who it applies to) for new entries. + * Then add to the global defaults list. + */ + HLTQ_FOREACH_SAFE(d, defs, entries, next) { + d->type = type; + d->binding = binding; + TAILQ_INSERT_TAIL(&parsed_policy.defaults, d, entries); + } + } + + debug_return_bool(ret); +} + +/* + * Allocate a new struct userspec, populate it, and insert it at the + * end of the userspecs list. + */ +static bool +add_userspec(struct member *members, struct privilege *privs) +{ + struct userspec *u; + debug_decl(add_userspec, SUDOERS_DEBUG_PARSER) + + if ((u = calloc(1, sizeof(*u))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_bool(false); + } + u->lineno = this_lineno; + u->file = rcstr_addref(sudoers); + HLTQ_TO_TAILQ(&u->users, members, entries); + HLTQ_TO_TAILQ(&u->privileges, privs, entries); + STAILQ_INIT(&u->comments); + TAILQ_INSERT_TAIL(&parsed_policy.userspecs, u, entries); + + debug_return_bool(true); +} + +/* + * Free a member struct and its contents. + */ +void +free_member(struct member *m) +{ + debug_decl(free_member, SUDOERS_DEBUG_PARSER) + + if (m->type == COMMAND) { + struct sudo_command *c = (struct sudo_command *)m->name; + free(c->cmnd); + free(c->args); + if (c->digest != NULL) { + free(c->digest->digest_str); + free(c->digest); + } + } + free(m->name); + free(m); + + debug_return; +} + +/* + * Free a tailq of members but not the struct member_list container itself. + */ +void +free_members(struct member_list *members) +{ + struct member *m; + debug_decl(free_members, SUDOERS_DEBUG_PARSER) + + while ((m = TAILQ_FIRST(members)) != NULL) { + TAILQ_REMOVE(members, m, entries); + free_member(m); + } + + debug_return; +} + +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER) + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + +void +free_default(struct defaults *def, struct member_list **binding) +{ + debug_decl(free_default, SUDOERS_DEBUG_PARSER) + + if (def->binding != *binding) { + *binding = def->binding; + if (def->binding != NULL) { + free_members(def->binding); + free(def->binding); + } + } + rcstr_delref(def->file); + free(def->var); + free(def->val); + free(def); + + debug_return; +} + +void +free_privilege(struct privilege *priv) +{ + struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; + struct member_list *prev_binding = NULL; + struct cmndspec *cs; + struct defaults *def; +#ifdef HAVE_SELINUX + char *role = NULL, *type = NULL; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ + debug_decl(free_privilege, SUDOERS_DEBUG_PARSER) + + free(priv->ldap_role); + free_members(&priv->hostlist); + while ((cs = TAILQ_FIRST(&priv->cmndlist)) != NULL) { + TAILQ_REMOVE(&priv->cmndlist, cs, entries); +#ifdef HAVE_SELINUX + /* Only free the first instance of a role/type. */ + if (cs->role != role) { + role = cs->role; + free(cs->role); + } + if (cs->type != type) { + type = cs->type; + free(cs->type); + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + free(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + free(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ + /* Only free the first instance of runas user/group lists. */ + if (cs->runasuserlist && cs->runasuserlist != runasuserlist) { + runasuserlist = cs->runasuserlist; + free_members(runasuserlist); + free(runasuserlist); + } + if (cs->runasgrouplist && cs->runasgrouplist != runasgrouplist) { + runasgrouplist = cs->runasgrouplist; + free_members(runasgrouplist); + free(runasgrouplist); + } + free_member(cs->cmnd); + free(cs); + } + while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { + TAILQ_REMOVE(&priv->defaults, def, entries); + free_default(def, &prev_binding); + } + free(priv); + + debug_return; +} + +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER) + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + +void +free_userspec(struct userspec *us) +{ + struct privilege *priv; + struct sudoers_comment *comment; + debug_decl(free_userspec, SUDOERS_DEBUG_PARSER) + + free_members(&us->users); + while ((priv = TAILQ_FIRST(&us->privileges)) != NULL) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + while ((comment = STAILQ_FIRST(&us->comments)) != NULL) { + STAILQ_REMOVE_HEAD(&us->comments, entries); + free(comment->str); + free(comment); + } + rcstr_delref(us->file); + free(us); + + debug_return; +} + +/* + * Initialized a sudoers parse tree. + */ +void +init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, + const char *shost) +{ + TAILQ_INIT(&parse_tree->userspecs); + TAILQ_INIT(&parse_tree->defaults); + parse_tree->aliases = NULL; + parse_tree->shost = shost; + parse_tree->lhost = lhost; +} + +/* + * Move the contents of parsed_policy to new_tree. + */ +void +reparent_parse_tree(struct sudoers_parse_tree *new_tree) +{ + TAILQ_CONCAT(&new_tree->userspecs, &parsed_policy.userspecs, entries); + TAILQ_CONCAT(&new_tree->defaults, &parsed_policy.defaults, entries); + new_tree->aliases = parsed_policy.aliases; + parsed_policy.aliases = NULL; +} + +/* + * Free the contents of a sudoers parse tree and initialize it. + */ +void +free_parse_tree(struct sudoers_parse_tree *parse_tree) +{ + free_userspecs(&parse_tree->userspecs); + free_defaults(&parse_tree->defaults); + free_aliases(parse_tree->aliases); + parse_tree->aliases = NULL; +} + +/* + * Free up space used by data structures from a previous parser run and sets + * the current sudoers file to path. + */ +bool +init_parser(const char *path, bool quiet) +{ + bool ret = true; + debug_decl(init_parser, SUDOERS_DEBUG_PARSER) + + free_parse_tree(&parsed_policy); + init_lexer(); + + rcstr_delref(sudoers); + if (path != NULL) { + if ((sudoers = rcstr_dup(path)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + } else { + sudoers = NULL; + } + + parse_error = false; + errorlineno = -1; + rcstr_delref(errorfile); + errorfile = NULL; + sudoers_warnings = !quiet; + + debug_return_bool(ret); +} + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + opts->notbefore = UNSPEC; + opts->notafter = UNSPEC; + opts->timeout = UNSPEC; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} +#line 1051 "gram.c" +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +#if defined(__cplusplus) || defined(__STDC__) +static int yygrowstack(void) +#else +static int yygrowstack() +#endif +{ + unsigned int newsize; + long sslen; + short *newss; + YYSTYPE *newvs; + + if ((newsize = yystacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return -1; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; +#ifdef SIZE_MAX +#define YY_SIZE_MAX SIZE_MAX +#else +#ifdef __STDC__ +#define YY_SIZE_MAX 0xffffffffU +#else +#define YY_SIZE_MAX (unsigned int)0xffffffff +#endif +#endif + if (YY_SIZE_MAX / newsize < sizeof *newss) + goto bail; + sslen = yyssp - yyss; + newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : + (short *)malloc(newsize * sizeof *newss); /* overflow check above */ + if (newss == NULL) + goto bail; + yyss = newss; + yyssp = newss + sslen; + newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : + (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */ + if (newvs == NULL) + goto bail; + yyvs = newvs; + yyvsp = newvs + sslen; + yystacksize = newsize; + yysslim = yyss + newsize - 1; + return 0; +bail: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return -1; +} + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab +int +#if defined(__cplusplus) || defined(__STDC__) +yyparse(void) +#else +yyparse() +#endif +{ + int yym, yyn, yystate; +#if YYDEBUG +#if defined(__cplusplus) || defined(__STDC__) + const char *yys; +#else /* !(defined(__cplusplus) || defined(__STDC__)) */ + char *yys; +#endif /* !(defined(__cplusplus) || defined(__STDC__)) */ + + if ((yys = getenv("YYDEBUG"))) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif /* YYDEBUG */ + + yynerrs = 0; + yyerrflag = 0; + yychar = (-1); + + if (yyss == NULL && yygrowstack()) goto yyoverflow; + yyssp = yyss; + yyvsp = yyvs; + *yyssp = yystate = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + yychar = (-1); + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; +#if defined(__GNUC__) + goto yynewerror; +#endif +yynewerror: + yyerror("syntax error"); +#if defined(__GNUC__) + goto yyerrlab; +#endif +yyerrlab: + ++yynerrs; +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate = yytable[yyn]; + *++yyvsp = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yyssp); +#endif + if (yyssp <= yyss) goto yyabort; + --yyssp; + --yyvsp; + } + } + } + else + { + if (yychar == 0) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = (-1); + goto yyloop; + } +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yyvsp[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 1: +#line 180 "gram.y" +{ ; } +break; +case 5: +#line 188 "gram.y" +{ + ; + } +break; +case 6: +#line 191 "gram.y" +{ + yyerrok; + } +break; +case 7: +#line 194 "gram.y" +{ + if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 8: +#line 200 "gram.y" +{ + ; + } +break; +case 9: +#line 203 "gram.y" +{ + ; + } +break; +case 10: +#line 206 "gram.y" +{ + ; + } +break; +case 11: +#line 209 "gram.y" +{ + ; + } +break; +case 12: +#line 212 "gram.y" +{ + if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults)) + YYERROR; + } +break; +case 13: +#line 216 "gram.y" +{ + if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults)) + YYERROR; + } +break; +case 14: +#line 220 "gram.y" +{ + if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults)) + YYERROR; + } +break; +case 15: +#line 224 "gram.y" +{ + if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults)) + YYERROR; + } +break; +case 16: +#line 228 "gram.y" +{ + if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults)) + YYERROR; + } +break; +case 18: +#line 235 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries); + yyval.defaults = yyvsp[-2].defaults; + } +break; +case 19: +#line 241 "gram.y" +{ + yyval.defaults = new_default(yyvsp[0].string, NULL, true); + if (yyval.defaults == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 20: +#line 248 "gram.y" +{ + yyval.defaults = new_default(yyvsp[0].string, NULL, false); + if (yyval.defaults == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 21: +#line 255 "gram.y" +{ + yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true); + if (yyval.defaults == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 22: +#line 262 "gram.y" +{ + yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+'); + if (yyval.defaults == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 23: +#line 269 "gram.y" +{ + yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-'); + if (yyval.defaults == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 25: +#line 279 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries); + yyval.privilege = yyvsp[-2].privilege; + } +break; +case 26: +#line 285 "gram.y" +{ + struct privilege *p = calloc(1, sizeof(*p)); + if (p == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + TAILQ_INIT(&p->defaults); + HLTQ_TO_TAILQ(&p->hostlist, yyvsp[-2].member, entries); + HLTQ_TO_TAILQ(&p->cmndlist, yyvsp[0].cmndspec, entries); + HLTQ_INIT(p, entries); + yyval.privilege = p; + } +break; +case 27: +#line 299 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = false; + } +break; +case 28: +#line 303 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = true; + } +break; +case 29: +#line 309 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, ALIAS); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 30: +#line 316 "gram.y" +{ + yyval.member = new_member(NULL, ALL); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 31: +#line 323 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, NETGROUP); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 32: +#line 330 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, NTWKADDR); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 33: +#line 337 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, WORD); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 35: +#line 347 "gram.y" +{ + struct cmndspec *prev; + prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries); + HLTQ_CONCAT(yyvsp[-2].cmndspec, yyvsp[0].cmndspec, entries); +#ifdef HAVE_SELINUX + /* propagate role and type */ + if (yyvsp[0].cmndspec->role == NULL && yyvsp[0].cmndspec->type == NULL) { + yyvsp[0].cmndspec->role = prev->role; + yyvsp[0].cmndspec->type = prev->type; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if (yyvsp[0].cmndspec->privs == NULL && yyvsp[0].cmndspec->limitprivs == NULL) { + yyvsp[0].cmndspec->privs = prev->privs; + yyvsp[0].cmndspec->limitprivs = prev->limitprivs; + } +#endif /* HAVE_PRIV_SET */ + /* propagate command time restrictions */ + if (yyvsp[0].cmndspec->notbefore == UNSPEC) + yyvsp[0].cmndspec->notbefore = prev->notbefore; + if (yyvsp[0].cmndspec->notafter == UNSPEC) + yyvsp[0].cmndspec->notafter = prev->notafter; + /* propagate command timeout */ + if (yyvsp[0].cmndspec->timeout == UNSPEC) + yyvsp[0].cmndspec->timeout = prev->timeout; + /* propagate tags and runas list */ + if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC) + yyvsp[0].cmndspec->tags.nopasswd = prev->tags.nopasswd; + if (yyvsp[0].cmndspec->tags.noexec == UNSPEC) + yyvsp[0].cmndspec->tags.noexec = prev->tags.noexec; + if (yyvsp[0].cmndspec->tags.setenv == UNSPEC && + prev->tags.setenv != IMPLIED) + yyvsp[0].cmndspec->tags.setenv = prev->tags.setenv; + if (yyvsp[0].cmndspec->tags.log_input == UNSPEC) + yyvsp[0].cmndspec->tags.log_input = prev->tags.log_input; + if (yyvsp[0].cmndspec->tags.log_output == UNSPEC) + yyvsp[0].cmndspec->tags.log_output = prev->tags.log_output; + if (yyvsp[0].cmndspec->tags.send_mail == UNSPEC) + yyvsp[0].cmndspec->tags.send_mail = prev->tags.send_mail; + if (yyvsp[0].cmndspec->tags.follow == UNSPEC) + yyvsp[0].cmndspec->tags.follow = prev->tags.follow; + if ((yyvsp[0].cmndspec->runasuserlist == NULL && + yyvsp[0].cmndspec->runasgrouplist == NULL) && + (prev->runasuserlist != NULL || + prev->runasgrouplist != NULL)) { + yyvsp[0].cmndspec->runasuserlist = prev->runasuserlist; + yyvsp[0].cmndspec->runasgrouplist = prev->runasgrouplist; + } + yyval.cmndspec = yyvsp[-2].cmndspec; + } +break; +case 36: +#line 400 "gram.y" +{ + struct cmndspec *cs = calloc(1, sizeof(*cs)); + if (cs == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + if (yyvsp[-3].runas != NULL) { + if (yyvsp[-3].runas->runasusers != NULL) { + cs->runasuserlist = + malloc(sizeof(*cs->runasuserlist)); + if (cs->runasuserlist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasuserlist, + yyvsp[-3].runas->runasusers, entries); + } + if (yyvsp[-3].runas->runasgroups != NULL) { + cs->runasgrouplist = + malloc(sizeof(*cs->runasgrouplist)); + if (cs->runasgrouplist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasgrouplist, + yyvsp[-3].runas->runasgroups, entries); + } + free(yyvsp[-3].runas); + } +#ifdef HAVE_SELINUX + cs->role = yyvsp[-2].options.role; + cs->type = yyvsp[-2].options.type; +#endif +#ifdef HAVE_PRIV_SET + cs->privs = yyvsp[-2].options.privs; + cs->limitprivs = yyvsp[-2].options.limitprivs; +#endif + cs->notbefore = yyvsp[-2].options.notbefore; + cs->notafter = yyvsp[-2].options.notafter; + cs->timeout = yyvsp[-2].options.timeout; + cs->tags = yyvsp[-1].tag; + cs->cmnd = yyvsp[0].member; + HLTQ_INIT(cs, entries); + /* sudo "ALL" implies the SETENV tag */ + if (cs->cmnd->type == ALL && !cs->cmnd->negated && + cs->tags.setenv == UNSPEC) + cs->tags.setenv = IMPLIED; + yyval.cmndspec = cs; + } +break; +case 37: +#line 453 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string); + if (yyval.digest == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 38: +#line 460 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string); + if (yyval.digest == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 39: +#line 467 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string); + if (yyval.digest == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 40: +#line 474 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string); + if (yyval.digest == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 41: +#line 483 "gram.y" +{ + yyval.member = yyvsp[0].member; + } +break; +case 42: +#line 486 "gram.y" +{ + if (yyvsp[0].member->type != COMMAND) { + sudoerserror(N_("a digest requires a path name")); + YYERROR; + } + /* XXX - yuck */ + ((struct sudo_command *) yyvsp[0].member->name)->digest = yyvsp[-1].digest; + yyval.member = yyvsp[0].member; + } +break; +case 43: +#line 497 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = false; + } +break; +case 44: +#line 501 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = true; + } +break; +case 45: +#line 507 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 46: +#line 512 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 47: +#line 516 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 48: +#line 521 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 49: +#line 526 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 50: +#line 531 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 51: +#line 535 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 52: +#line 540 "gram.y" +{ + yyval.runas = NULL; + } +break; +case 53: +#line 543 "gram.y" +{ + yyval.runas = yyvsp[-1].runas; + } +break; +case 54: +#line 548 "gram.y" +{ + yyval.runas = calloc(1, sizeof(struct runascontainer)); + if (yyval.runas != NULL) { + yyval.runas->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if (yyval.runas->runasusers == NULL) { + free(yyval.runas); + yyval.runas = NULL; + } + } + if (yyval.runas == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 55: +#line 563 "gram.y" +{ + yyval.runas = calloc(1, sizeof(struct runascontainer)); + if (yyval.runas == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + yyval.runas->runasusers = yyvsp[0].member; + /* $$->runasgroups = NULL; */ + } +break; +case 56: +#line 572 "gram.y" +{ + yyval.runas = calloc(1, sizeof(struct runascontainer)); + if (yyval.runas == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + yyval.runas->runasusers = yyvsp[-2].member; + yyval.runas->runasgroups = yyvsp[0].member; + } +break; +case 57: +#line 581 "gram.y" +{ + yyval.runas = calloc(1, sizeof(struct runascontainer)); + if (yyval.runas == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + /* $$->runasusers = NULL; */ + yyval.runas->runasgroups = yyvsp[0].member; + } +break; +case 58: +#line 590 "gram.y" +{ + yyval.runas = calloc(1, sizeof(struct runascontainer)); + if (yyval.runas != NULL) { + yyval.runas->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if (yyval.runas->runasusers == NULL) { + free(yyval.runas); + yyval.runas = NULL; + } + } + if (yyval.runas == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 59: +#line 607 "gram.y" +{ + init_options(&yyval.options); + } +break; +case 60: +#line 610 "gram.y" +{ + yyval.options.notbefore = parse_gentime(yyvsp[0].string); + free(yyvsp[0].string); + if (yyval.options.notbefore == -1) { + sudoerserror(N_("invalid notbefore value")); + YYERROR; + } + } +break; +case 61: +#line 618 "gram.y" +{ + yyval.options.notafter = parse_gentime(yyvsp[0].string); + free(yyvsp[0].string); + if (yyval.options.notafter == -1) { + sudoerserror(N_("invalid notafter value")); + YYERROR; + } + } +break; +case 62: +#line 626 "gram.y" +{ + yyval.options.timeout = parse_timeout(yyvsp[0].string); + free(yyvsp[0].string); + if (yyval.options.timeout == -1) { + if (errno == ERANGE) + sudoerserror(N_("timeout value too large")); + else + sudoerserror(N_("invalid timeout value")); + YYERROR; + } + } +break; +case 63: +#line 637 "gram.y" +{ +#ifdef HAVE_SELINUX + free(yyval.options.role); + yyval.options.role = yyvsp[0].string; +#endif + } +break; +case 64: +#line 643 "gram.y" +{ +#ifdef HAVE_SELINUX + free(yyval.options.type); + yyval.options.type = yyvsp[0].string; +#endif + } +break; +case 65: +#line 649 "gram.y" +{ +#ifdef HAVE_PRIV_SET + free(yyval.options.privs); + yyval.options.privs = yyvsp[0].string; +#endif + } +break; +case 66: +#line 655 "gram.y" +{ +#ifdef HAVE_PRIV_SET + free(yyval.options.limitprivs); + yyval.options.limitprivs = yyvsp[0].string; +#endif + } +break; +case 67: +#line 663 "gram.y" +{ + TAGS_INIT(yyval.tag); + } +break; +case 68: +#line 666 "gram.y" +{ + yyval.tag.nopasswd = true; + } +break; +case 69: +#line 669 "gram.y" +{ + yyval.tag.nopasswd = false; + } +break; +case 70: +#line 672 "gram.y" +{ + yyval.tag.noexec = true; + } +break; +case 71: +#line 675 "gram.y" +{ + yyval.tag.noexec = false; + } +break; +case 72: +#line 678 "gram.y" +{ + yyval.tag.setenv = true; + } +break; +case 73: +#line 681 "gram.y" +{ + yyval.tag.setenv = false; + } +break; +case 74: +#line 684 "gram.y" +{ + yyval.tag.log_input = true; + } +break; +case 75: +#line 687 "gram.y" +{ + yyval.tag.log_input = false; + } +break; +case 76: +#line 690 "gram.y" +{ + yyval.tag.log_output = true; + } +break; +case 77: +#line 693 "gram.y" +{ + yyval.tag.log_output = false; + } +break; +case 78: +#line 696 "gram.y" +{ + yyval.tag.follow = true; + } +break; +case 79: +#line 699 "gram.y" +{ + yyval.tag.follow = false; + } +break; +case 80: +#line 702 "gram.y" +{ + yyval.tag.send_mail = true; + } +break; +case 81: +#line 705 "gram.y" +{ + yyval.tag.send_mail = false; + } +break; +case 82: +#line 710 "gram.y" +{ + yyval.member = new_member(NULL, ALL); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 83: +#line 717 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, ALIAS); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 84: +#line 724 "gram.y" +{ + struct sudo_command *c = calloc(1, sizeof(*c)); + if (c == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + c->cmnd = yyvsp[0].command.cmnd; + c->args = yyvsp[0].command.args; + yyval.member = new_member((char *)c, COMMAND); + if (yyval.member == NULL) { + free(c); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 87: +#line 745 "gram.y" +{ + const char *s; + s = alias_add(&parsed_policy, yyvsp[-2].string, HOSTALIAS, + sudoers, this_lineno, yyvsp[0].member); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } +break; +case 89: +#line 757 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); + yyval.member = yyvsp[-2].member; + } +break; +case 92: +#line 767 "gram.y" +{ + const char *s; + s = alias_add(&parsed_policy, yyvsp[-2].string, CMNDALIAS, + sudoers, this_lineno, yyvsp[0].member); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } +break; +case 94: +#line 779 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); + yyval.member = yyvsp[-2].member; + } +break; +case 97: +#line 789 "gram.y" +{ + const char *s; + s = alias_add(&parsed_policy, yyvsp[-2].string, RUNASALIAS, + sudoers, this_lineno, yyvsp[0].member); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } +break; +case 100: +#line 804 "gram.y" +{ + const char *s; + s = alias_add(&parsed_policy, yyvsp[-2].string, USERALIAS, + sudoers, this_lineno, yyvsp[0].member); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } +break; +case 102: +#line 816 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); + yyval.member = yyvsp[-2].member; + } +break; +case 103: +#line 822 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = false; + } +break; +case 104: +#line 826 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = true; + } +break; +case 105: +#line 832 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, ALIAS); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 106: +#line 839 "gram.y" +{ + yyval.member = new_member(NULL, ALL); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 107: +#line 846 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, NETGROUP); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 108: +#line 853 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, USERGROUP); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 109: +#line 860 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, WORD); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 111: +#line 870 "gram.y" +{ + HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); + yyval.member = yyvsp[-2].member; + } +break; +case 112: +#line 876 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = false; + } +break; +case 113: +#line 880 "gram.y" +{ + yyval.member = yyvsp[0].member; + yyval.member->negated = true; + } +break; +case 114: +#line 886 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, ALIAS); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 115: +#line 893 "gram.y" +{ + yyval.member = new_member(NULL, ALL); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +case 116: +#line 900 "gram.y" +{ + yyval.member = new_member(yyvsp[0].string, WORD); + if (yyval.member == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } +break; +#line 2182 "gram.c" + } + yyssp -= yym; + yystate = *yyssp; + yyvsp -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yyssp = YYFINAL; + *++yyvsp = yyval; + if (yychar < 0) + { + if ((yychar = yylex()) < 0) yychar = 0; +#if YYDEBUG + if (yydebug) + { + yys = 0; + if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; + if (!yys) yys = "illegal-symbol"; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == 0) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yyssp, yystate); +#endif + if (yyssp >= yysslim && yygrowstack()) + { + goto yyoverflow; + } + *++yyssp = yystate; + *++yyvsp = yyval; + goto yyloop; +yyoverflow: + yyerror("yacc stack overflow"); +yyabort: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (1); +yyaccept: + if (yyss) + free(yyss); + if (yyvs) + free(yyvs); + yyss = yyssp = NULL; + yyvs = yyvsp = NULL; + yystacksize = 0; + return (0); +} diff --git a/utsudo-0.0.2/plugins/sudoers/gram.h b/utsudo-0.0.2/plugins/sudoers/gram.h new file mode 100644 index 0000000..dc8f347 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gram.h @@ -0,0 +1,63 @@ +#define COMMAND 257 +#define ALIAS 258 +#define DEFVAR 259 +#define NTWKADDR 260 +#define NETGROUP 261 +#define USERGROUP 262 +#define WORD 263 +#define DIGEST 264 +#define DEFAULTS 265 +#define DEFAULTS_HOST 266 +#define DEFAULTS_USER 267 +#define DEFAULTS_RUNAS 268 +#define DEFAULTS_CMND 269 +#define NOPASSWD 270 +#define PASSWD 271 +#define NOEXEC 272 +#define EXEC 273 +#define SETENV 274 +#define NOSETENV 275 +#define LOG_INPUT 276 +#define NOLOG_INPUT 277 +#define LOG_OUTPUT 278 +#define NOLOG_OUTPUT 279 +#define MAIL 280 +#define NOMAIL 281 +#define FOLLOWLNK 282 +#define NOFOLLOWLNK 283 +#define ALL 284 +#define COMMENT 285 +#define HOSTALIAS 286 +#define CMNDALIAS 287 +#define USERALIAS 288 +#define RUNASALIAS 289 +#define ERROR 290 +#define TYPE 291 +#define ROLE 292 +#define PRIVS 293 +#define LIMITPRIVS 294 +#define CMND_TIMEOUT 295 +#define NOTBEFORE 296 +#define NOTAFTER 297 +#define MYSELF 298 +#define SHA224_TOK 299 +#define SHA256_TOK 300 +#define SHA384_TOK 301 +#define SHA512_TOK 302 +#ifndef YYSTYPE_DEFINED +#define YYSTYPE_DEFINED +typedef union { + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; +} YYSTYPE; +#endif /* YYSTYPE_DEFINED */ +extern YYSTYPE sudoerslval; diff --git a/utsudo-0.0.2/plugins/sudoers/gram.y b/utsudo-0.0.2/plugins/sudoers/gram.y new file mode 100644 index 0000000..76a2f9f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/gram.y @@ -0,0 +1,1336 @@ +%{ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) +# include +#endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include + +#include "sudoers.h" +#include "sudo_digest.h" +#include "toke.h" + +/* If we last saw a newline the entry is on the preceding line. */ +#define this_lineno (last_token == COMMENT ? sudolineno - 1 : sudolineno) + +/* + * Globals + */ +bool sudoers_warnings = true; +bool parse_error = false; +int errorlineno = -1; +char *errorfile = NULL; + +struct sudoers_parse_tree parsed_policy = { + TAILQ_HEAD_INITIALIZER(parsed_policy.userspecs), + TAILQ_HEAD_INITIALIZER(parsed_policy.defaults), + NULL, /* aliases */ + NULL, /* lhost */ + NULL /* shost */ +}; + +/* + * Local protoypes + */ +static void init_options(struct command_options *opts); +static bool add_defaults(int, struct member *, struct defaults *); +static bool add_userspec(struct member *, struct privilege *); +static struct defaults *new_default(char *, char *, short); +static struct member *new_member(char *, int); +static struct command_digest *new_digest(int, char *); +%} + +%union { + struct cmndspec *cmndspec; + struct defaults *defaults; + struct member *member; + struct runascontainer *runas; + struct privilege *privilege; + struct command_digest *digest; + struct sudo_command command; + struct command_options options; + struct cmndtag tag; + char *string; + int tok; +} + +%start file /* special start symbol */ +%token COMMAND /* absolute pathname w/ optional args */ +%token ALIAS /* an UPPERCASE alias name */ +%token DEFVAR /* a Defaults variable name */ +%token NTWKADDR /* ipv4 or ipv6 address */ +%token NETGROUP /* a netgroup (+NAME) */ +%token USERGROUP /* a usergroup (%NAME) */ +%token WORD /* a word */ +%token DIGEST /* a SHA-2 digest */ +%token DEFAULTS /* Defaults entry */ +%token DEFAULTS_HOST /* Host-specific defaults entry */ +%token DEFAULTS_USER /* User-specific defaults entry */ +%token DEFAULTS_RUNAS /* Runas-specific defaults entry */ +%token DEFAULTS_CMND /* Command-specific defaults entry */ +%token NOPASSWD /* no passwd req for command */ +%token PASSWD /* passwd req for command (default) */ +%token NOEXEC /* preload dummy execve() for cmnd */ +%token EXEC /* don't preload dummy execve() */ +%token SETENV /* user may set environment for cmnd */ +%token NOSETENV /* user may not set environment */ +%token LOG_INPUT /* log user's cmnd input */ +%token NOLOG_INPUT /* don't log user's cmnd input */ +%token LOG_OUTPUT /* log cmnd output */ +%token NOLOG_OUTPUT /* don't log cmnd output */ +%token MAIL /* mail log message */ +%token NOMAIL /* don't mail log message */ +%token FOLLOWLNK /* follow symbolic links */ +%token NOFOLLOWLNK /* don't follow symbolic links */ +%token ALL /* ALL keyword */ +%token COMMENT /* comment and/or carriage return */ +%token HOSTALIAS /* Host_Alias keyword */ +%token CMNDALIAS /* Cmnd_Alias keyword */ +%token USERALIAS /* User_Alias keyword */ +%token RUNASALIAS /* Runas_Alias keyword */ +%token ':' '=' ',' '!' '+' '-' /* union member tokens */ +%token '(' ')' /* runas tokens */ +%token ERROR +%token TYPE /* SELinux type */ +%token ROLE /* SELinux role */ +%token PRIVS /* Solaris privileges */ +%token LIMITPRIVS /* Solaris limit privileges */ +%token CMND_TIMEOUT /* command timeout */ +%token NOTBEFORE /* time restriction */ +%token NOTAFTER /* time restriction */ +%token MYSELF /* run as myself, not another user */ +%token SHA224_TOK /* sha224 token */ +%token SHA256_TOK /* sha256 token */ +%token SHA384_TOK /* sha384 token */ +%token SHA512_TOK /* sha512 token */ + +%type cmndspec +%type cmndspeclist +%type defaults_entry +%type defaults_list +%type cmnd +%type opcmnd +%type digcmnd +%type cmndlist +%type host +%type hostlist +%type ophost +%type opuser +%type user +%type userlist +%type opgroup +%type group +%type grouplist +%type runasspec +%type runaslist +%type privilege +%type privileges +%type cmndtag +%type options +%type rolespec +%type typespec +%type privsspec +%type limitprivsspec +%type timeoutspec +%type notbeforespec +%type notafterspec +%type digest + +%% + +file : { ; } + | line + ; + +line : entry + | line entry + ; + +entry : COMMENT { + ; + } + | error COMMENT { + yyerrok; + } + | userlist privileges { + if (!add_userspec($1, $2)) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | USERALIAS useraliases { + ; + } + | HOSTALIAS hostaliases { + ; + } + | CMNDALIAS cmndaliases { + ; + } + | RUNASALIAS runasaliases { + ; + } + | DEFAULTS defaults_list { + if (!add_defaults(DEFAULTS, NULL, $2)) + YYERROR; + } + | DEFAULTS_USER userlist defaults_list { + if (!add_defaults(DEFAULTS_USER, $2, $3)) + YYERROR; + } + | DEFAULTS_RUNAS userlist defaults_list { + if (!add_defaults(DEFAULTS_RUNAS, $2, $3)) + YYERROR; + } + | DEFAULTS_HOST hostlist defaults_list { + if (!add_defaults(DEFAULTS_HOST, $2, $3)) + YYERROR; + } + | DEFAULTS_CMND cmndlist defaults_list { + if (!add_defaults(DEFAULTS_CMND, $2, $3)) + YYERROR; + } + ; + +defaults_list : defaults_entry + | defaults_list ',' defaults_entry { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +defaults_entry : DEFVAR { + $$ = new_default($1, NULL, true); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | '!' DEFVAR { + $$ = new_default($2, NULL, false); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '=' WORD { + $$ = new_default($1, $3, true); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '+' WORD { + $$ = new_default($1, $3, '+'); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | DEFVAR '-' WORD { + $$ = new_default($1, $3, '-'); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +privileges : privilege + | privileges ':' privilege { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +privilege : hostlist '=' cmndspeclist { + struct privilege *p = calloc(1, sizeof(*p)); + if (p == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + TAILQ_INIT(&p->defaults); + HLTQ_TO_TAILQ(&p->hostlist, $1, entries); + HLTQ_TO_TAILQ(&p->cmndlist, $3, entries); + HLTQ_INIT(p, entries); + $$ = p; + } + ; + +ophost : host { + $$ = $1; + $$->negated = false; + } + | '!' host { + $$ = $2; + $$->negated = true; + } + ; + +host : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NETGROUP { + $$ = new_member($1, NETGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NTWKADDR { + $$ = new_member($1, NTWKADDR); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +cmndspeclist : cmndspec + | cmndspeclist ',' cmndspec { + struct cmndspec *prev; + prev = HLTQ_LAST($1, cmndspec, entries); + HLTQ_CONCAT($1, $3, entries); +#ifdef HAVE_SELINUX + /* propagate role and type */ + if ($3->role == NULL && $3->type == NULL) { + $3->role = prev->role; + $3->type = prev->type; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if ($3->privs == NULL && $3->limitprivs == NULL) { + $3->privs = prev->privs; + $3->limitprivs = prev->limitprivs; + } +#endif /* HAVE_PRIV_SET */ + /* propagate command time restrictions */ + if ($3->notbefore == UNSPEC) + $3->notbefore = prev->notbefore; + if ($3->notafter == UNSPEC) + $3->notafter = prev->notafter; + /* propagate command timeout */ + if ($3->timeout == UNSPEC) + $3->timeout = prev->timeout; + /* propagate tags and runas list */ + if ($3->tags.nopasswd == UNSPEC) + $3->tags.nopasswd = prev->tags.nopasswd; + if ($3->tags.noexec == UNSPEC) + $3->tags.noexec = prev->tags.noexec; + if ($3->tags.setenv == UNSPEC && + prev->tags.setenv != IMPLIED) + $3->tags.setenv = prev->tags.setenv; + if ($3->tags.log_input == UNSPEC) + $3->tags.log_input = prev->tags.log_input; + if ($3->tags.log_output == UNSPEC) + $3->tags.log_output = prev->tags.log_output; + if ($3->tags.send_mail == UNSPEC) + $3->tags.send_mail = prev->tags.send_mail; + if ($3->tags.follow == UNSPEC) + $3->tags.follow = prev->tags.follow; + if (($3->runasuserlist == NULL && + $3->runasgrouplist == NULL) && + (prev->runasuserlist != NULL || + prev->runasgrouplist != NULL)) { + $3->runasuserlist = prev->runasuserlist; + $3->runasgrouplist = prev->runasgrouplist; + } + $$ = $1; + } + ; + +cmndspec : runasspec options cmndtag digcmnd { + struct cmndspec *cs = calloc(1, sizeof(*cs)); + if (cs == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + if ($1 != NULL) { + if ($1->runasusers != NULL) { + cs->runasuserlist = + malloc(sizeof(*cs->runasuserlist)); + if (cs->runasuserlist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasuserlist, + $1->runasusers, entries); + } + if ($1->runasgroups != NULL) { + cs->runasgrouplist = + malloc(sizeof(*cs->runasgrouplist)); + if (cs->runasgrouplist == NULL) { + free(cs); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + HLTQ_TO_TAILQ(cs->runasgrouplist, + $1->runasgroups, entries); + } + free($1); + } +#ifdef HAVE_SELINUX + cs->role = $2.role; + cs->type = $2.type; +#endif +#ifdef HAVE_PRIV_SET + cs->privs = $2.privs; + cs->limitprivs = $2.limitprivs; +#endif + cs->notbefore = $2.notbefore; + cs->notafter = $2.notafter; + cs->timeout = $2.timeout; + cs->tags = $3; + cs->cmnd = $4; + HLTQ_INIT(cs, entries); + /* sudo "ALL" implies the SETENV tag */ + if (cs->cmnd->type == ALL && !cs->cmnd->negated && + cs->tags.setenv == UNSPEC) + cs->tags.setenv = IMPLIED; + $$ = cs; + } + ; + +digest : SHA224_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA224, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA256_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA256, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA384_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA384, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | SHA512_TOK ':' DIGEST { + $$ = new_digest(SUDO_DIGEST_SHA512, $3); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +digcmnd : opcmnd { + $$ = $1; + } + | digest opcmnd { + if ($2->type != COMMAND) { + sudoerserror(N_("a digest requires a path name")); + YYERROR; + } + /* XXX - yuck */ + ((struct sudo_command *) $2->name)->digest = $1; + $$ = $2; + } + ; + +opcmnd : cmnd { + $$ = $1; + $$->negated = false; + } + | '!' cmnd { + $$ = $2; + $$->negated = true; + } + ; + +timeoutspec : CMND_TIMEOUT '=' WORD { + $$ = $3; + } + ; + +notbeforespec : NOTBEFORE '=' WORD { + $$ = $3; + } + +notafterspec : NOTAFTER '=' WORD { + $$ = $3; + } + ; + +rolespec : ROLE '=' WORD { + $$ = $3; + } + ; + +typespec : TYPE '=' WORD { + $$ = $3; + } + ; + +privsspec : PRIVS '=' WORD { + $$ = $3; + } + ; +limitprivsspec : LIMITPRIVS '=' WORD { + $$ = $3; + } + ; + +runasspec : /* empty */ { + $$ = NULL; + } + | '(' runaslist ')' { + $$ = $2; + } + ; + +runaslist : /* empty */ { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ != NULL) { + $$->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ($$->runasusers == NULL) { + free($$); + $$ = NULL; + } + } + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | userlist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $$->runasusers = $1; + /* $$->runasgroups = NULL; */ + } + | userlist ':' grouplist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + $$->runasusers = $1; + $$->runasgroups = $3; + } + | ':' grouplist { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + /* $$->runasusers = NULL; */ + $$->runasgroups = $2; + } + | ':' { + $$ = calloc(1, sizeof(struct runascontainer)); + if ($$ != NULL) { + $$->runasusers = new_member(NULL, MYSELF); + /* $$->runasgroups = NULL; */ + if ($$->runasusers == NULL) { + free($$); + $$ = NULL; + } + } + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +options : /* empty */ { + init_options(&$$); + } + | options notbeforespec { + $$.notbefore = parse_gentime($2); + free($2); + if ($$.notbefore == -1) { + sudoerserror(N_("invalid notbefore value")); + YYERROR; + } + } + | options notafterspec { + $$.notafter = parse_gentime($2); + free($2); + if ($$.notafter == -1) { + sudoerserror(N_("invalid notafter value")); + YYERROR; + } + } + | options timeoutspec { + $$.timeout = parse_timeout($2); + free($2); + if ($$.timeout == -1) { + if (errno == ERANGE) + sudoerserror(N_("timeout value too large")); + else + sudoerserror(N_("invalid timeout value")); + YYERROR; + } + } + | options rolespec { +#ifdef HAVE_SELINUX + free($$.role); + $$.role = $2; +#endif + } + | options typespec { +#ifdef HAVE_SELINUX + free($$.type); + $$.type = $2; +#endif + } + | options privsspec { +#ifdef HAVE_PRIV_SET + free($$.privs); + $$.privs = $2; +#endif + } + | options limitprivsspec { +#ifdef HAVE_PRIV_SET + free($$.limitprivs); + $$.limitprivs = $2; +#endif + } + ; + +cmndtag : /* empty */ { + TAGS_INIT($$); + } + | cmndtag NOPASSWD { + $$.nopasswd = true; + } + | cmndtag PASSWD { + $$.nopasswd = false; + } + | cmndtag NOEXEC { + $$.noexec = true; + } + | cmndtag EXEC { + $$.noexec = false; + } + | cmndtag SETENV { + $$.setenv = true; + } + | cmndtag NOSETENV { + $$.setenv = false; + } + | cmndtag LOG_INPUT { + $$.log_input = true; + } + | cmndtag NOLOG_INPUT { + $$.log_input = false; + } + | cmndtag LOG_OUTPUT { + $$.log_output = true; + } + | cmndtag NOLOG_OUTPUT { + $$.log_output = false; + } + | cmndtag FOLLOWLNK { + $$.follow = true; + } + | cmndtag NOFOLLOWLNK { + $$.follow = false; + } + | cmndtag MAIL { + $$.send_mail = true; + } + | cmndtag NOMAIL { + $$.send_mail = false; + } + ; + +cmnd : ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | COMMAND { + struct sudo_command *c = calloc(1, sizeof(*c)); + if (c == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + c->cmnd = $1.cmnd; + c->args = $1.args; + $$ = new_member((char *)c, COMMAND); + if ($$ == NULL) { + free(c); + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +hostaliases : hostalias + | hostaliases ':' hostalias + ; + +hostalias : ALIAS '=' hostlist { + const char *s; + s = alias_add(&parsed_policy, $1, HOSTALIAS, + sudoers, this_lineno, $3); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } + ; + +hostlist : ophost + | hostlist ',' ophost { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +cmndaliases : cmndalias + | cmndaliases ':' cmndalias + ; + +cmndalias : ALIAS '=' cmndlist { + const char *s; + s = alias_add(&parsed_policy, $1, CMNDALIAS, + sudoers, this_lineno, $3); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } + ; + +cmndlist : digcmnd + | cmndlist ',' digcmnd { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +runasaliases : runasalias + | runasaliases ':' runasalias + ; + +runasalias : ALIAS '=' userlist { + const char *s; + s = alias_add(&parsed_policy, $1, RUNASALIAS, + sudoers, this_lineno, $3); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } + ; + +useraliases : useralias + | useraliases ':' useralias + ; + +useralias : ALIAS '=' userlist { + const char *s; + s = alias_add(&parsed_policy, $1, USERALIAS, + sudoers, this_lineno, $3); + if (s != NULL) { + sudoerserror(s); + YYERROR; + } + } + ; + +userlist : opuser + | userlist ',' opuser { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +opuser : user { + $$ = $1; + $$->negated = false; + } + | '!' user { + $$ = $2; + $$->negated = true; + } + ; + +user : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | NETGROUP { + $$ = new_member($1, NETGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | USERGROUP { + $$ = new_member($1, USERGROUP); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +grouplist : opgroup + | grouplist ',' opgroup { + HLTQ_CONCAT($1, $3, entries); + $$ = $1; + } + ; + +opgroup : group { + $$ = $1; + $$->negated = false; + } + | '!' group { + $$ = $2; + $$->negated = true; + } + ; + +group : ALIAS { + $$ = new_member($1, ALIAS); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | ALL { + $$ = new_member(NULL, ALL); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + | WORD { + $$ = new_member($1, WORD); + if ($$ == NULL) { + sudoerserror(N_("unable to allocate memory")); + YYERROR; + } + } + ; + +%% +void +sudoerserror(const char *s) +{ + debug_decl(sudoerserror, SUDOERS_DEBUG_PARSER) + + /* Save the line the first error occurred on. */ + if (errorlineno == -1) { + errorlineno = this_lineno; + rcstr_delref(errorfile); + errorfile = rcstr_addref(sudoers); + } + if (sudoers_warnings && s != NULL) { + LEXTRACE("<*> "); +#ifndef TRACELEXER + if (trace_print == NULL || trace_print == sudoers_trace_print) { + const char fmt[] = ">>> %s: %s near line %d <<<\n"; + int oldlocale; + + /* Warnings are displayed in the user's locale. */ + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + sudo_printf(SUDO_CONV_ERROR_MSG, _(fmt), sudoers, _(s), this_lineno); + sudoers_setlocale(oldlocale, NULL); + } +#endif + } + parse_error = true; + debug_return; +} + +static struct defaults * +new_default(char *var, char *val, short op) +{ + struct defaults *d; + debug_decl(new_default, SUDOERS_DEBUG_PARSER) + + if ((d = calloc(1, sizeof(struct defaults))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + d->var = var; + d->val = val; + /* d->type = 0; */ + d->op = op; + /* d->binding = NULL */ + d->lineno = this_lineno; + d->file = rcstr_addref(sudoers); + HLTQ_INIT(d, entries); + + debug_return_ptr(d); +} + +static struct member * +new_member(char *name, int type) +{ + struct member *m; + debug_decl(new_member, SUDOERS_DEBUG_PARSER) + + if ((m = calloc(1, sizeof(struct member))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + m->name = name; + m->type = type; + HLTQ_INIT(m, entries); + + debug_return_ptr(m); +} + +static struct command_digest * +new_digest(int digest_type, char *digest_str) +{ + struct command_digest *digest; + debug_decl(new_digest, SUDOERS_DEBUG_PARSER) + + if ((digest = malloc(sizeof(*digest))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + digest->digest_type = digest_type; + digest->digest_str = digest_str; + if (digest->digest_str == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(digest); + digest = NULL; + } + + debug_return_ptr(digest); +} + +/* + * Add a list of defaults structures to the defaults list. + * The binding, if non-NULL, specifies a list of hosts, users, or + * runas users the entries apply to (specified by the type). + */ +static bool +add_defaults(int type, struct member *bmem, struct defaults *defs) +{ + struct defaults *d, *next; + struct member_list *binding; + bool ret = true; + debug_decl(add_defaults, SUDOERS_DEBUG_PARSER) + + if (defs != NULL) { + /* + * We use a single binding for each entry in defs. + */ + if ((binding = malloc(sizeof(*binding))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudoerserror(N_("unable to allocate memory")); + debug_return_bool(false); + } + if (bmem != NULL) + HLTQ_TO_TAILQ(binding, bmem, entries); + else + TAILQ_INIT(binding); + + /* + * Set type and binding (who it applies to) for new entries. + * Then add to the global defaults list. + */ + HLTQ_FOREACH_SAFE(d, defs, entries, next) { + d->type = type; + d->binding = binding; + TAILQ_INSERT_TAIL(&parsed_policy.defaults, d, entries); + } + } + + debug_return_bool(ret); +} + +/* + * Allocate a new struct userspec, populate it, and insert it at the + * end of the userspecs list. + */ +static bool +add_userspec(struct member *members, struct privilege *privs) +{ + struct userspec *u; + debug_decl(add_userspec, SUDOERS_DEBUG_PARSER) + + if ((u = calloc(1, sizeof(*u))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_bool(false); + } + u->lineno = this_lineno; + u->file = rcstr_addref(sudoers); + HLTQ_TO_TAILQ(&u->users, members, entries); + HLTQ_TO_TAILQ(&u->privileges, privs, entries); + STAILQ_INIT(&u->comments); + TAILQ_INSERT_TAIL(&parsed_policy.userspecs, u, entries); + + debug_return_bool(true); +} + +/* + * Free a member struct and its contents. + */ +void +free_member(struct member *m) +{ + debug_decl(free_member, SUDOERS_DEBUG_PARSER) + + if (m->type == COMMAND) { + struct sudo_command *c = (struct sudo_command *)m->name; + free(c->cmnd); + free(c->args); + if (c->digest != NULL) { + free(c->digest->digest_str); + free(c->digest); + } + } + free(m->name); + free(m); + + debug_return; +} + +/* + * Free a tailq of members but not the struct member_list container itself. + */ +void +free_members(struct member_list *members) +{ + struct member *m; + debug_decl(free_members, SUDOERS_DEBUG_PARSER) + + while ((m = TAILQ_FIRST(members)) != NULL) { + TAILQ_REMOVE(members, m, entries); + free_member(m); + } + + debug_return; +} + +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER) + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + +void +free_default(struct defaults *def, struct member_list **binding) +{ + debug_decl(free_default, SUDOERS_DEBUG_PARSER) + + if (def->binding != *binding) { + *binding = def->binding; + if (def->binding != NULL) { + free_members(def->binding); + free(def->binding); + } + } + rcstr_delref(def->file); + free(def->var); + free(def->val); + free(def); + + debug_return; +} + +void +free_privilege(struct privilege *priv) +{ + struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; + struct member_list *prev_binding = NULL; + struct cmndspec *cs; + struct defaults *def; +#ifdef HAVE_SELINUX + char *role = NULL, *type = NULL; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ + debug_decl(free_privilege, SUDOERS_DEBUG_PARSER) + + free(priv->ldap_role); + free_members(&priv->hostlist); + while ((cs = TAILQ_FIRST(&priv->cmndlist)) != NULL) { + TAILQ_REMOVE(&priv->cmndlist, cs, entries); +#ifdef HAVE_SELINUX + /* Only free the first instance of a role/type. */ + if (cs->role != role) { + role = cs->role; + free(cs->role); + } + if (cs->type != type) { + type = cs->type; + free(cs->type); + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + free(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + free(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ + /* Only free the first instance of runas user/group lists. */ + if (cs->runasuserlist && cs->runasuserlist != runasuserlist) { + runasuserlist = cs->runasuserlist; + free_members(runasuserlist); + free(runasuserlist); + } + if (cs->runasgrouplist && cs->runasgrouplist != runasgrouplist) { + runasgrouplist = cs->runasgrouplist; + free_members(runasgrouplist); + free(runasgrouplist); + } + free_member(cs->cmnd); + free(cs); + } + while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { + TAILQ_REMOVE(&priv->defaults, def, entries); + free_default(def, &prev_binding); + } + free(priv); + + debug_return; +} + +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER) + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + +void +free_userspec(struct userspec *us) +{ + struct privilege *priv; + struct sudoers_comment *comment; + debug_decl(free_userspec, SUDOERS_DEBUG_PARSER) + + free_members(&us->users); + while ((priv = TAILQ_FIRST(&us->privileges)) != NULL) { + TAILQ_REMOVE(&us->privileges, priv, entries); + free_privilege(priv); + } + while ((comment = STAILQ_FIRST(&us->comments)) != NULL) { + STAILQ_REMOVE_HEAD(&us->comments, entries); + free(comment->str); + free(comment); + } + rcstr_delref(us->file); + free(us); + + debug_return; +} + +/* + * Initialized a sudoers parse tree. + */ +void +init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *lhost, + const char *shost) +{ + TAILQ_INIT(&parse_tree->userspecs); + TAILQ_INIT(&parse_tree->defaults); + parse_tree->aliases = NULL; + parse_tree->shost = shost; + parse_tree->lhost = lhost; +} + +/* + * Move the contents of parsed_policy to new_tree. + */ +void +reparent_parse_tree(struct sudoers_parse_tree *new_tree) +{ + TAILQ_CONCAT(&new_tree->userspecs, &parsed_policy.userspecs, entries); + TAILQ_CONCAT(&new_tree->defaults, &parsed_policy.defaults, entries); + new_tree->aliases = parsed_policy.aliases; + parsed_policy.aliases = NULL; +} + +/* + * Free the contents of a sudoers parse tree and initialize it. + */ +void +free_parse_tree(struct sudoers_parse_tree *parse_tree) +{ + free_userspecs(&parse_tree->userspecs); + free_defaults(&parse_tree->defaults); + free_aliases(parse_tree->aliases); + parse_tree->aliases = NULL; +} + +/* + * Free up space used by data structures from a previous parser run and sets + * the current sudoers file to path. + */ +bool +init_parser(const char *path, bool quiet) +{ + bool ret = true; + debug_decl(init_parser, SUDOERS_DEBUG_PARSER) + + free_parse_tree(&parsed_policy); + init_lexer(); + + rcstr_delref(sudoers); + if (path != NULL) { + if ((sudoers = rcstr_dup(path)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + } + } else { + sudoers = NULL; + } + + parse_error = false; + errorlineno = -1; + rcstr_delref(errorfile); + errorfile = NULL; + sudoers_warnings = !quiet; + + debug_return_bool(ret); +} + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + opts->notbefore = UNSPEC; + opts->notafter = UNSPEC; + opts->timeout = UNSPEC; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} diff --git a/utsudo-0.0.2/plugins/sudoers/group_plugin.c b/utsudo-0.0.2/plugins/sudoers/group_plugin.c new file mode 100644 index 0000000..7364881 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/group_plugin.c @@ -0,0 +1,234 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_dso.h" + +#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD) + +static void *group_handle; +static struct sudoers_group_plugin *group_plugin; +const char *path_plugin_dir = _PATH_SUDO_PLUGIN_DIR; + +/* + * Load the specified plugin and run its init function. + * Returns -1 if unable to open the plugin, else it returns + * the value from the plugin's init function. + */ +int +group_plugin_load(char *plugin_info) +{ + struct stat sb; + char *args, path[PATH_MAX]; + char **argv = NULL; + int len, rc = -1; + debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL) + + /* + * Fill in .so path and split out args (if any). + */ + if ((args = strpbrk(plugin_info, " \t")) != NULL) { + len = snprintf(path, sizeof(path), "%s%.*s", + (*plugin_info != '/') ? path_plugin_dir : "", + (int)(args - plugin_info), plugin_info); + args++; + } else { + len = snprintf(path, sizeof(path), "%s%s", + (*plugin_info != '/') ? path_plugin_dir : "", plugin_info); + } + if (len < 0 || len >= ssizeof(path)) { + errno = ENAMETOOLONG; + sudo_warn("%s%s", + (*plugin_info != '/') ? path_plugin_dir : "", plugin_info); + goto done; + } + + /* Sanity check plugin path. */ + if (stat(path, &sb) != 0) { + sudo_warn("%s", path); + goto done; + } + if (sb.st_uid != ROOT_UID) { + sudo_warnx(U_("%s must be owned by uid %d"), path, ROOT_UID); + goto done; + } + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + sudo_warnx(U_("%s must only be writable by owner"), path); + goto done; + } + + /* Open plugin and map in symbol. */ + group_handle = sudo_dso_load(path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + if (!group_handle) { + const char *errstr = sudo_dso_strerror(); + sudo_warnx(U_("unable to load %s: %s"), path, + errstr ? errstr : "unknown error"); + goto done; + } + group_plugin = sudo_dso_findsym(group_handle, "group_plugin"); + if (group_plugin == NULL) { + sudo_warnx(U_("unable to find symbol \"group_plugin\" in %s"), path); + goto done; + } + + if (SUDO_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) { + sudo_warnx(U_("%s: incompatible group plugin major version %d, expected %d"), + path, SUDO_API_VERSION_GET_MAJOR(group_plugin->version), + GROUP_API_VERSION_MAJOR); + goto done; + } + + /* + * Split args into a vector if specified. + */ + if (args != NULL) { + int ac = 0; + bool wasblank = true; + char *cp, *last; + + for (cp = args; *cp != '\0'; cp++) { + if (isblank((unsigned char)*cp)) { + wasblank = true; + } else if (wasblank) { + wasblank = false; + ac++; + } + } + if (ac != 0) { + argv = reallocarray(NULL, ac, sizeof(char *)); + if (argv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + ac = 0; + for ((cp = strtok_r(args, " \t", &last)); cp != NULL; (cp = strtok_r(NULL, " \t", &last))) + argv[ac++] = cp; + } + } + + rc = (group_plugin->init)(GROUP_API_VERSION, sudo_printf, argv); + +done: + free(argv); + + if (rc != true) { + if (group_handle != NULL) { + sudo_dso_unload(group_handle); + group_handle = NULL; + group_plugin = NULL; + } + } + + debug_return_int(rc); +} + +void +group_plugin_unload(void) +{ + debug_decl(group_plugin_unload, SUDOERS_DEBUG_UTIL) + + if (group_plugin != NULL) { + (group_plugin->cleanup)(); + group_plugin = NULL; + } + if (group_handle != NULL) { + sudo_dso_unload(group_handle); + group_handle = NULL; + } + debug_return; +} + +int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + debug_decl(group_plugin_query, SUDOERS_DEBUG_UTIL) + + if (group_plugin == NULL) + debug_return_int(false); + debug_return_int((group_plugin->query)(user, group, pwd)); +} + +#else /* !HAVE_DLOPEN && !HAVE_SHL_LOAD */ + +/* + * No loadable shared object support. + */ + +int +group_plugin_load(char *plugin_info) +{ + debug_decl(group_plugin_load, SUDOERS_DEBUG_UTIL) + debug_return_int(false); +} + +void +group_plugin_unload(void) +{ + debug_decl(group_plugin_unload, SUDOERS_DEBUG_UTIL) + debug_return; +} + +int +group_plugin_query(const char *user, const char *group, + const struct passwd *pwd) +{ + debug_decl(group_plugin_query, SUDOERS_DEBUG_UTIL) + debug_return_int(false); +} + +#endif /* HAVE_DLOPEN || HAVE_SHL_LOAD */ + +/* + * Group plugin sudoers callback. + */ +bool +cb_group_plugin(const union sudo_defs_val *sd_un) +{ + bool rc = true; + debug_decl(cb_group_plugin, SUDOERS_DEBUG_PLUGIN) + + /* Unload any existing group plugin before loading a new one. */ + group_plugin_unload(); + if (sd_un->str != NULL) + rc = group_plugin_load(sd_un->str); + debug_return_bool(rc); +} diff --git a/utsudo-0.0.2/plugins/sudoers/hexchar.c b/utsudo-0.0.2/plugins/sudoers/hexchar.c new file mode 100644 index 0000000..07e892b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/hexchar.c @@ -0,0 +1,104 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include "sudoers.h" + +/* + * Converts a two-byte hex string to decimal. + * Returns the decimal value or -1 for invalid input. + */ +int +hexchar(const char *s) +{ + unsigned char result[2]; + int i; + debug_decl(hexchar, SUDOERS_DEBUG_UTIL) + + for (i = 0; i < 2; i++) { + switch (s[i]) { + case '0': + result[i] = 0; + break; + case '1': + result[i] = 1; + break; + case '2': + result[i] = 2; + break; + case '3': + result[i] = 3; + break; + case '4': + result[i] = 4; + break; + case '5': + result[i] = 5; + break; + case '6': + result[i] = 6; + break; + case '7': + result[i] = 7; + break; + case '8': + result[i] = 8; + break; + case '9': + result[i] = 9; + break; + case 'A': + case 'a': + result[i] = 10; + break; + case 'B': + case 'b': + result[i] = 11; + break; + case 'C': + case 'c': + result[i] = 12; + break; + case 'D': + case 'd': + result[i] = 13; + break; + case 'E': + case 'e': + result[i] = 14; + break; + case 'F': + case 'f': + result[i] = 15; + break; + default: + /* Invalid input. */ + debug_return_int(-1); + } + } + debug_return_int((result[0] << 4) | result[1]); +} diff --git a/utsudo-0.0.2/plugins/sudoers/ins_2001.h b/utsudo-0.0.2/plugins/sudoers/ins_2001.h new file mode 100644 index 0000000..d2ce989 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ins_2001.h @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_2001_H +#define SUDOERS_INS_2001_H + + /* + * HAL insults (paraphrased) from 2001. + */ + + "Just what do you think you're doing Dave?", + "It can only be attributed to human error.", + "That's something I cannot allow to happen.", + "My mind is going. I can feel it.", + "Sorry about this, I know it's a bit silly.", + "Take a stress pill and think things over.", + "This mission is too important for me to allow you to jeopardize it.", + "I feel much better now.", + +#endif /* SUDOERS_INS_2001_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/ins_classic.h b/utsudo-0.0.2/plugins/sudoers/ins_classic.h new file mode 100644 index 0000000..08d54d7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ins_classic.h @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_CLASSIC_H +#define SUDOERS_INS_CLASSIC_H + + /* + * Insults from the original sudo(8). + */ + + "Wrong! You cheating scum!", +#ifndef OFFENSIVE_INSULTS + "And you call yourself a Rocket Scientist!", +#else + "No soap, honkie-lips.", +#endif + "Where did you learn to type?", + "Are you on drugs?", + "My pet ferret can type better than you!", + "You type like i drive.", + "Do you think like you type?", + "Your mind just hasn't been the same since the electro-shock, has it?", + +#endif /* SUDOERS_INS_CLASSIC_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/ins_csops.h b/utsudo-0.0.2/plugins/sudoers/ins_csops.h new file mode 100644 index 0000000..fe66cfa --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ins_csops.h @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999, 2004 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_CSOPS_H +#define SUDOERS_INS_CSOPS_H + + /* + * CSOps insults (may be site dependent). + */ + + "Maybe if you used more than just two fingers...", + "BOB says: You seem to have forgotten your passwd, enter another!", + "stty: unknown mode: doofus", + "I can't hear you -- I'm using the scrambler.", + "The more you drive -- the dumber you get.", +#ifdef PC_INSULTS + "Listen, broccoli brains, I don't have time to listen to this trash.", +#else + "Listen, burrito brains, I don't have time to listen to this trash.", +#endif + "I've seen penguins that can type better than that.", + "Have you considered trying to match wits with a rutabaga?", + "You speak an infinite deal of nothing", + +#endif /* SUDOERS_INS_CSOPS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/ins_goons.h b/utsudo-0.0.2/plugins/sudoers/ins_goons.h new file mode 100644 index 0000000..34df45b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ins_goons.h @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998, 1999 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_GOONS_H +#define SUDOERS_INS_GOONS_H + + /* + * Insults from the "Goon Show." + */ + + "You silly, twisted boy you.", + "He has fallen in the water!", + "We'll all be murdered in our beds!", + "You can't come in. Our tiger has got flu", + "I don't wish to know that.", + "What, what, what, what, what, what, what, what, what, what?", + "You can't get the wood, you know.", + "You'll starve!", + "... and it used to be so popular...", + "Pauses for audience applause, not a sausage", + "Hold it up to the light --- not a brain in sight!", + "Have a gorilla...", + "There must be cure for it!", + "There's a lot of it about, you know.", + "You do that again and see what happens...", + "Ying Tong Iddle I Po", + "Harm can come to a young lad like that!", + "And with that remarks folks, the case of the Crown vs yourself was proven.", + "Speak English you fool --- there are no subtitles in this scene.", + "You gotta go owwwww!", + "I have been called worse.", + "It's only your word against mine.", + "I think ... err ... I think ... I think I'll go home", + +#endif /* SUDOERS_INS_GOONS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/ins_python.h b/utsudo-0.0.2/plugins/sudoers/ins_python.h new file mode 100644 index 0000000..16088f3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ins_python.h @@ -0,0 +1,39 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INS_PYTHON_H +#define SUDOERS_INS_PYTHON_H + + /* + * Insults from "Monty Python's Flying Circus" and family. + */ + + "That is no basis for supreme executive power!", + "You empty-headed animal food trough wiper!", + "I fart in your general direction!", + "Your mother was a hamster and your father smelt of elderberries!", + "You must cut down the mightiest tree in the forest... with... a herring!", + "I wave my private parts at your aunties!", + "He's not the Messiah, he's a very naughty boy!", + "I wish to make a complaint.", + "When you're walking home tonight, and some homicidal maniac comes after you with a bunch of loganberries, don't come crying to me!", + "This man, he doesn't know when he's beaten! He doesn't know when he's winning, either. He has no... sort of... sensory apparatus...", + "There's nothing wrong with you that an expensive operation can't prolong.", + "I'm very sorry, but I'm not allowed to argue unless you've paid.", + +#endif /* SUDOERS_INS_PYTHON_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/insults.h b/utsudo-0.0.2/plugins/sudoers/insults.h new file mode 100644 index 0000000..d7d8074 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/insults.h @@ -0,0 +1,69 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-1999, 2004 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_INSULTS_H +#define SUDOERS_INSULTS_H + +#if defined(HAL_INSULTS) || defined(GOONS_INSULTS) || defined(CLASSIC_INSULTS) || defined(CSOPS_INSULTS) || defined(PYTHON_INSULTS) + +#include "sudo_rand.h" + +/* + * Use one or more set of insults as determined by configure + */ + +char *insults[] = { + +# ifdef HAL_INSULTS +# include "ins_2001.h" +# endif + +# ifdef GOONS_INSULTS +# include "ins_goons.h" +# endif + +# ifdef CLASSIC_INSULTS +# include "ins_classic.h" +# endif + +# ifdef CSOPS_INSULTS +# include "ins_csops.h" +# endif + +# ifdef PYTHON_INSULTS +# include "ins_python.h" +# endif + + NULL + +}; + +/* + * How may I insult you? Let me count the ways... + */ +#define NOFINSULTS (nitems(insults) - 1) + +/* + * return a pseudo-random insult. + */ +#define INSULT (insults[arc4random_uniform(NOFINSULTS)]) + +#endif /* HAL_INSULTS || GOONS_INSULTS || CLASSIC_INSULTS || CSOPS_INSULTS || PYTHON_INSULTS */ + +#endif /* SUDOERS_INSULTS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/interfaces.c b/utsudo-0.0.2/plugins/sudoers/interfaces.c new file mode 100644 index 0000000..4be665e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/interfaces.c @@ -0,0 +1,144 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#ifdef NEED_RESOLV_H +# include +# include +#endif /* NEED_RESOLV_H */ +#include +#include + +#include "sudoers.h" +#include "interfaces.h" + +#ifndef INADDR_NONE +# define INADDR_NONE ((unsigned int)-1) +#endif + +static struct interface_list interfaces = SLIST_HEAD_INITIALIZER(interfaces); + +/* + * Parse a space-delimited list of IP address/netmask pairs and + * store in a list of interface structures. Returns true on + * success and false on parse error or memory allocation error. + */ +bool +set_interfaces(const char *ai) +{ + char *addrinfo, *addr, *mask, *last; + struct interface *ifp; + bool ret = false; + debug_decl(set_interfaces, SUDOERS_DEBUG_NETIF) + + if ((addrinfo = strdup(ai)) == NULL) + debug_return_bool(false); + for (addr = strtok_r(addrinfo, " \t", &last); addr != NULL; addr = strtok_r(NULL, " \t", &last)) { + /* Separate addr and mask. */ + if ((mask = strchr(addr, '/')) == NULL) + continue; + *mask++ = '\0'; + + /* Parse addr and store in list. */ + if ((ifp = calloc(1, sizeof(*ifp))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if (strchr(addr, ':')) { + /* IPv6 */ +#ifdef HAVE_STRUCT_IN6_ADDR + ifp->family = AF_INET6; + if (inet_pton(AF_INET6, addr, &ifp->addr.ip6) != 1) { + sudo_warnx(U_("unable to parse IP address \"%s\""), addr); + free(ifp); + goto done; + } + if (inet_pton(AF_INET6, mask, &ifp->netmask.ip6) != 1) { + sudo_warnx(U_("unable to parse netmask \"%s\""), mask); + free(ifp); + goto done; + } +#else + free(ifp); + continue; +#endif + } else { + /* IPv4 */ + ifp->family = AF_INET; + if (inet_pton(AF_INET, addr, &ifp->addr.ip4) != 1) { + sudo_warnx(U_("unable to parse IP address \"%s\""), addr); + free(ifp); + goto done; + } + if (inet_pton(AF_INET, mask, &ifp->netmask.ip4) != 1) { + sudo_warnx(U_("unable to parse netmask \"%s\""), mask); + free(ifp); + goto done; + } + } + SLIST_INSERT_HEAD(&interfaces, ifp, entries); + } + ret = true; + +done: + free(addrinfo); + debug_return_bool(ret); +} + +struct interface_list * +get_interfaces(void) +{ + return &interfaces; +} + +void +dump_interfaces(const char *ai) +{ + const char *cp, *ep; + const char *ai_end = ai + strlen(ai); + debug_decl(set_interfaces, SUDOERS_DEBUG_NETIF) + + sudo_printf(SUDO_CONV_INFO_MSG, + _("Local IP address and netmask pairs:\n")); + cp = sudo_strsplit(ai, ai_end, " \t", &ep); + while (cp != NULL) { + sudo_printf(SUDO_CONV_INFO_MSG, "\t%.*s\n", (int)(ep - cp), cp); + cp = sudo_strsplit(NULL, ai_end, " \t", &ep); + } + + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/interfaces.h b/utsudo-0.0.2/plugins/sudoers/interfaces.h new file mode 100644 index 0000000..49cca72 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/interfaces.h @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007, 2010-2013 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_INTERFACES_H +#define SUDOERS_INTERFACES_H + +/* + * Union to hold either strucr in_addr or in6_add + */ +union sudo_in_addr_un { + struct in_addr ip4; +#ifdef HAVE_STRUCT_IN6_ADDR + struct in6_addr ip6; +#endif +}; + +/* + * IP address and netmask pairs for checking against local interfaces. + */ +struct interface { + SLIST_ENTRY(interface) entries; + unsigned int family; /* AF_INET or AF_INET6 */ + union sudo_in_addr_un addr; + union sudo_in_addr_un netmask; +}; + +SLIST_HEAD(interface_list, interface); + +/* + * Prototypes for external functions. + */ +int get_net_ifs(char **addrinfo); +void dump_interfaces(const char *); +bool set_interfaces(const char *); +struct interface_list *get_interfaces(void); + +#endif /* SUDOERS_INTERFACES_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/iolog.c b/utsudo-0.0.2/plugins/sudoers/iolog.c new file mode 100644 index 0000000..cae2538 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/iolog.c @@ -0,0 +1,1297 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "iolog.h" +#include "iolog_files.h" + +/* XXX - separate sudoers.h and iolog.h? */ +#undef runas_pw +#undef runas_gr + +struct iolog_details { + const char *cwd; + const char *tty; + const char *user; + const char *command; + const char *iolog_path; + struct passwd *runas_pw; + struct group *runas_gr; + int lines; + int cols; + bool ignore_iolog_errors; +}; + +static struct iolog_details iolog_details; +static bool iolog_compress = false; +static bool warned = false; +static struct timespec last_time; +static unsigned int sessid_max = SESSID_MAX; +static mode_t iolog_filemode = S_IRUSR|S_IWUSR; +static mode_t iolog_dirmode = S_IRWXU; +static bool iolog_gid_set; + +/* shared with set_perms.c */ +uid_t iolog_uid = ROOT_UID; +gid_t iolog_gid = ROOT_GID; + +/* sudoers_io is declared at the end of this file. */ +extern __dso_public struct io_plugin sudoers_io; + +/* + * Create directory and any parent directories as needed. + */ +static bool +io_mkdirs(char *path) +{ + struct stat sb; + bool ok, uid_changed = false; + debug_decl(io_mkdirs, SUDOERS_DEBUG_UTIL) + + ok = stat(path, &sb) == 0; + if (!ok && errno == EACCES) { + /* Try again as the I/O log owner (for NFS). */ + if (set_perms(PERM_IOLOG)) { + ok = stat(path, &sb) == 0; + if (!restore_perms()) + ok = false; + } + } + if (ok) { + if (S_ISDIR(sb.st_mode)) { + if (sb.st_uid != iolog_uid || sb.st_gid != iolog_gid) { + if (chown(path, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, path); + } + } + if ((sb.st_mode & ALLPERMS) != iolog_dirmode) { + if (chmod(path, iolog_dirmode) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chmod 0%o %s", __func__, + (int)iolog_dirmode, path); + } + } + } else { + sudo_warnx(U_("%s exists but is not a directory (0%o)"), + path, (unsigned int) sb.st_mode); + ok = false; + } + goto done; + } + + ok = sudo_mkdir_parents(path, iolog_uid, iolog_gid, iolog_dirmode, true); + if (!ok && errno == EACCES) { + /* Try again as the I/O log owner (for NFS). */ + uid_changed = set_perms(PERM_IOLOG); + ok = sudo_mkdir_parents(path, -1, -1, iolog_dirmode, false); + } + if (ok) { + /* Create final path component. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "mkdir %s, mode 0%o", path, (unsigned int) iolog_dirmode); + ok = mkdir(path, iolog_dirmode) == 0 || errno == EEXIST; + if (!ok) { + if (errno == EACCES && !uid_changed) { + /* Try again as the I/O log owner (for NFS). */ + uid_changed = set_perms(PERM_IOLOG); + ok = mkdir(path, iolog_dirmode) == 0 || errno == EEXIST; + } + if (!ok) + sudo_warn(U_("unable to mkdir %s"), path); + } else { + if (chown(path, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, path); + } + } + } + if (uid_changed) { + if (!restore_perms()) + ok = false; + } +done: + debug_return_bool(ok); +} + +/* + * Create temporary directory and any parent directories as needed. + */ +static bool +io_mkdtemp(char *path) +{ + bool ok, uid_changed = false; + debug_decl(io_mkdtemp, SUDOERS_DEBUG_UTIL) + + ok = sudo_mkdir_parents(path, iolog_uid, iolog_gid, iolog_dirmode, true); + if (!ok && errno == EACCES) { + /* Try again as the I/O log owner (for NFS). */ + uid_changed = set_perms(PERM_IOLOG); + ok = sudo_mkdir_parents(path, -1, -1, iolog_dirmode, false); + } + if (ok) { + /* Create final path component. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "mkdtemp %s", path); + /* We cannot retry mkdtemp() so always use PERM_IOLOG */ + if (!uid_changed) + uid_changed = set_perms(PERM_IOLOG); + if (mkdtemp(path) == NULL) { + sudo_warn(U_("unable to mkdir %s"), path); + ok = false; + } else { + if (chmod(path, iolog_dirmode) != 0) { + sudo_warn(U_("unable to change mode of %s to 0%o"), + path, (unsigned int)iolog_dirmode); + } + } + } + + if (uid_changed) { + if (!restore_perms()) + ok = false; + } + debug_return_bool(ok); +} + +/* + * Set max session ID (aka sequence number) + */ +static bool +io_set_max_sessid(const char *maxval) +{ + const char *errstr; + unsigned int value; + debug_decl(io_set_max_sessid, SUDOERS_DEBUG_UTIL) + + value = sudo_strtonum(maxval, 0, SESSID_MAX, &errstr); + if (errstr != NULL) { + if (errno != ERANGE) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "bad maxseq: %s: %s", maxval, errstr); + debug_return_bool(false); + } + /* Out of range, clamp to SESSID_MAX as documented. */ + value = SESSID_MAX; + } + sessid_max = value; + debug_return_bool(true); +} + +/* + * Sudoers callback for maxseq Defaults setting. + */ +bool +cb_maxseq(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_maxseq, SUDOERS_DEBUG_UTIL) + + /* Clamp value to SESSID_MAX as documented. */ + sessid_max = sd_un->uival < SESSID_MAX ? sd_un->uival : SESSID_MAX; + debug_return_bool(true); +} + +/* + * Look up I/O log user-ID from user name. Sets iolog_uid. + * Also sets iolog_gid if iolog_group not specified. + */ +static bool +iolog_set_user(const char *name) +{ + struct passwd *pw; + debug_decl(iolog_set_user, SUDOERS_DEBUG_UTIL) + + if (name != NULL) { + pw = sudo_getpwnam(name); + if (pw != NULL) { + iolog_uid = pw->pw_uid; + if (!iolog_gid_set) + iolog_gid = pw->pw_gid; + sudo_pw_delref(pw); + } else { + log_warningx(SLOG_SEND_MAIL, + N_("unknown user: %s"), name); + } + } else { + /* Reset to default. */ + iolog_uid = ROOT_UID; + if (!iolog_gid_set) + iolog_gid = ROOT_GID; + } + + debug_return_bool(true); +} + +/* + * Sudoers callback for iolog_user Defaults setting. + */ +bool +cb_iolog_user(const union sudo_defs_val *sd_un) +{ + return iolog_set_user(sd_un->str); +} + +/* + * Look up I/O log group-ID from group name. + * Sets iolog_gid. + */ +static bool +iolog_set_group(const char *name) +{ + struct group *gr; + debug_decl(iolog_set_group, SUDOERS_DEBUG_UTIL) + + if (name != NULL) { + gr = sudo_getgrnam(name); + if (gr != NULL) { + iolog_gid = gr->gr_gid; + iolog_gid_set = true; + sudo_gr_delref(gr); + } else { + log_warningx(SLOG_SEND_MAIL, + N_("unknown group: %s"), name); + } + } else { + /* Reset to default. */ + iolog_gid = ROOT_GID; + iolog_gid_set = false; + } + + debug_return_bool(true); +} + +/* + * Look up I/O log group-ID from group name. + */ +bool +cb_iolog_group(const union sudo_defs_val *sd_un) +{ + return iolog_set_group(sd_un->str); +} + +/* + * Set iolog_filemode and iolog_dirmode. + */ +static bool +iolog_set_mode(mode_t mode) +{ + debug_decl(iolog_set_mode, SUDOERS_DEBUG_UTIL) + + /* I/O log files must be readable and writable by owner. */ + iolog_filemode = S_IRUSR|S_IWUSR; + + /* Add in group and other read/write if specified. */ + iolog_filemode |= mode & (S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); + + /* For directory mode, add execute bits as needed. */ + iolog_dirmode = iolog_filemode | S_IXUSR; + if (iolog_dirmode & (S_IRGRP|S_IWGRP)) + iolog_dirmode |= S_IXGRP; + if (iolog_dirmode & (S_IROTH|S_IWOTH)) + iolog_dirmode |= S_IXOTH; + + debug_return_bool(true); +} + +/* + * Sudoers callback for iolog_mode Defaults setting. + */ +bool +cb_iolog_mode(const union sudo_defs_val *sd_un) +{ + return iolog_set_mode(sd_un->mode); +} + +/* + * Wrapper for open(2) that retries with PERM_IOLOG if open(2) + * returns EACCES. + */ +static int +io_open(const char *path, int flags, mode_t perm) +{ + int fd; + debug_decl(io_open, SUDOERS_DEBUG_UTIL) + + fd = open(path, flags, perm); + if (fd == -1 && errno == EACCES) { + /* Try again as the I/O log owner (for NFS). */ + if (set_perms(PERM_IOLOG)) { + fd = open(path, flags, perm); + if (!restore_perms()) { + /* restore_perms() warns on error. */ + if (fd != -1) { + close(fd); + fd = -1; + } + } + } + } + debug_return_int(fd); +} + +/* + * Read the on-disk sequence number, set sessid to the next + * number, and update the on-disk copy. + * Uses file locking to avoid sequence number collisions. + */ +bool +io_nextid(char *iolog_dir, char *iolog_dir_fallback, char sessid[7]) +{ + struct stat sb; + char buf[32], *ep; + int i, len, fd = -1; + unsigned long id = 0; + mode_t omask; + ssize_t nread; + bool ret = false; + char pathbuf[PATH_MAX]; + static const char b36char[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + debug_decl(io_nextid, SUDOERS_DEBUG_UTIL) + + /* umask must not be more restrictive than the file modes. */ + omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode)); + + /* + * Create I/O log directory if it doesn't already exist. + */ + if (!io_mkdirs(iolog_dir)) + goto done; + + /* + * Open sequence file + */ + len = snprintf(pathbuf, sizeof(pathbuf), "%s/seq", iolog_dir); + if (len < 0 || len >= ssizeof(pathbuf)) { + errno = ENAMETOOLONG; + log_warning(SLOG_SEND_MAIL, "%s/seq", pathbuf); + goto done; + } + fd = io_open(pathbuf, O_RDWR|O_CREAT, iolog_filemode); + if (fd == -1) { + log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), pathbuf); + goto done; + } + sudo_lock_file(fd, SUDO_LOCK); + if (fchown(fd, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to fchown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, pathbuf); + } + + /* + * If there is no seq file in iolog_dir and a fallback dir was + * specified, look for seq in the fallback dir. This is to work + * around a bug in sudo 1.8.5 and older where iolog_dir was not + * expanded before the sequence number was updated. + */ + if (iolog_dir_fallback != NULL && fstat(fd, &sb) == 0 && sb.st_size == 0) { + char fallback[PATH_MAX]; + + len = snprintf(fallback, sizeof(fallback), "%s/seq", + iolog_dir_fallback); + if (len > 0 && len < ssizeof(fallback)) { + int fd2 = io_open(fallback, O_RDWR|O_CREAT, iolog_filemode); + if (fd2 != -1) { + if (fchown(fd2, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to fchown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, fallback); + } + nread = read(fd2, buf, sizeof(buf) - 1); + if (nread > 0) { + if (buf[nread - 1] == '\n') + nread--; + buf[nread] = '\0'; + id = strtoul(buf, &ep, 36); + if (ep == buf || *ep != '\0' || id >= sessid_max) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: bad sequence number: %s", fallback, buf); + id = 0; + } + } + close(fd2); + } + } + } + + /* Read current seq number (base 36). */ + if (id == 0) { + nread = read(fd, buf, sizeof(buf) - 1); + if (nread != 0) { + if (nread == -1) { + log_warning(SLOG_SEND_MAIL, N_("unable to read %s"), pathbuf); + goto done; + } + if (buf[nread - 1] == '\n') + nread--; + buf[nread] = '\0'; + id = strtoul(buf, &ep, 36); + if (ep == buf || *ep != '\0' || id >= sessid_max) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: bad sequence number: %s", pathbuf, buf); + id = 0; + } + } + } + id++; + + /* + * Convert id to a string and stash in sessid. + * Note that that least significant digits go at the end of the string. + */ + for (i = 5; i >= 0; i--) { + buf[i] = b36char[id % 36]; + id /= 36; + } + buf[6] = '\n'; + + /* Stash id for logging purposes. */ + memcpy(sessid, buf, 6); + sessid[6] = '\0'; + + /* Rewind and overwrite old seq file, including the NUL byte. */ +#ifdef HAVE_PWRITE + if (pwrite(fd, buf, 7, 0) != 7) { +#else + if (lseek(fd, 0, SEEK_SET) == -1 || write(fd, buf, 7) != 7) { +#endif + log_warning(SLOG_SEND_MAIL, N_("unable to write to %s"), pathbuf); + warned = true; + goto done; + } + ret = true; + +done: + umask(omask); + if (fd != -1) + close(fd); + debug_return_bool(ret); +} + +/* + * Copy iolog_path to pathbuf and create the directory and any intermediate + * directories. If iolog_path ends in 'XXXXXX', use mkdtemp(). + * Returns SIZE_MAX on error. + */ +static size_t +mkdir_iopath(const char *iolog_path, char *pathbuf, size_t pathsize) +{ + size_t len; + bool ok; + debug_decl(mkdir_iopath, SUDOERS_DEBUG_UTIL) + + len = strlcpy(pathbuf, iolog_path, pathsize); + if (len >= pathsize) { + errno = ENAMETOOLONG; + log_warning(SLOG_SEND_MAIL, "%s", iolog_path); + debug_return_size_t((size_t)-1); + } + + /* + * Create path and intermediate subdirs as needed. + * If path ends in at least 6 Xs (ala POSIX mktemp), use mkdtemp(). + * Sets iolog_gid (if it is not already set) as a side effect. + */ + if (len >= 6 && strcmp(&pathbuf[len - 6], "XXXXXX") == 0) + ok = io_mkdtemp(pathbuf); + else + ok = io_mkdirs(pathbuf); + + debug_return_size_t(ok ? len : (size_t)-1); +} + +/* + * Append suffix to pathbuf after len chars and open the resulting file. + * Note that the size of pathbuf is assumed to be PATH_MAX. + * Uses zlib if docompress is true. + * Stores the open file handle which has the close-on-exec flag set. + */ +static bool +open_io_fd(char *pathbuf, size_t len, struct io_log_file *iol, bool docompress) +{ + debug_decl(open_io_fd, SUDOERS_DEBUG_UTIL) + + pathbuf[len] = '\0'; + strlcat(pathbuf, iol->suffix, PATH_MAX); + if (iol->enabled) { + int fd = io_open(pathbuf, O_CREAT|O_TRUNC|O_WRONLY, iolog_filemode); + if (fd != -1) { + if (fchown(fd, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to fchown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, pathbuf); + } + (void)fcntl(fd, F_SETFD, FD_CLOEXEC); +#ifdef HAVE_ZLIB_H + if (docompress) + iol->fd.g = gzdopen(fd, "w"); + else +#endif + iol->fd.f = fdopen(fd, "w"); + if (iol->fd.v == NULL) { + close(fd); + fd = -1; + } + } + if (fd == -1) { + log_warning(SLOG_SEND_MAIL, N_("unable to create %s"), pathbuf); + debug_return_bool(false); + } + } else { + /* Remove old log file if we recycled sequence numbers. */ + unlink(pathbuf); + } + debug_return_bool(true); +} + +/* + * Pull out I/O log related data from user_info and command_info arrays. + * Returns true if I/O logging is enabled, else false. + */ +static bool +iolog_deserialize_info(struct iolog_details *details, char * const user_info[], + char * const command_info[]) +{ + const char *runas_uid_str = "0", *runas_euid_str = NULL; + const char *runas_gid_str = "0", *runas_egid_str = NULL; + const char *errstr; + char idbuf[MAX_UID_T_LEN + 2]; + char * const *cur; + id_t id; + uid_t runas_uid = 0; + gid_t runas_gid = 0; + debug_decl(iolog_deserialize_info, SUDOERS_DEBUG_UTIL) + + details->lines = 24; + details->cols = 80; + + for (cur = user_info; *cur != NULL; cur++) { + switch (**cur) { + case 'c': + if (strncmp(*cur, "cols=", sizeof("cols=") - 1) == 0) { + int n = sudo_strtonum(*cur + sizeof("cols=") - 1, 1, INT_MAX, + NULL); + if (n > 0) + details->cols = n; + continue; + } + if (strncmp(*cur, "cwd=", sizeof("cwd=") - 1) == 0) { + details->cwd = *cur + sizeof("cwd=") - 1; + continue; + } + break; + case 'l': + if (strncmp(*cur, "lines=", sizeof("lines=") - 1) == 0) { + int n = sudo_strtonum(*cur + sizeof("lines=") - 1, 1, INT_MAX, + NULL); + if (n > 0) + details->lines = n; + continue; + } + break; + case 't': + if (strncmp(*cur, "tty=", sizeof("tty=") - 1) == 0) { + details->tty = *cur + sizeof("tty=") - 1; + continue; + } + break; + case 'u': + if (strncmp(*cur, "user=", sizeof("user=") - 1) == 0) { + details->user = *cur + sizeof("user=") - 1; + continue; + } + break; + } + } + + for (cur = command_info; *cur != NULL; cur++) { + switch (**cur) { + case 'c': + if (strncmp(*cur, "command=", sizeof("command=") - 1) == 0) { + details->command = *cur + sizeof("command=") - 1; + continue; + } + break; + case 'i': + if (strncmp(*cur, "ignore_iolog_errors=", sizeof("ignore_iolog_errors=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("ignore_iolog_errors=") - 1) == true) + details->ignore_iolog_errors = true; + continue; + } + if (strncmp(*cur, "iolog_path=", sizeof("iolog_path=") - 1) == 0) { + details->iolog_path = *cur + sizeof("iolog_path=") - 1; + continue; + } + if (strncmp(*cur, "iolog_stdin=", sizeof("iolog_stdin=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stdin=") - 1) == true) + io_log_files[IOFD_STDIN].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_stdout=", sizeof("iolog_stdout=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stdout=") - 1) == true) + io_log_files[IOFD_STDOUT].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_stderr=", sizeof("iolog_stderr=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_stderr=") - 1) == true) + io_log_files[IOFD_STDERR].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_ttyin=", sizeof("iolog_ttyin=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_ttyin=") - 1) == true) + io_log_files[IOFD_TTYIN].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_ttyout=", sizeof("iolog_ttyout=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_ttyout=") - 1) == true) + io_log_files[IOFD_TTYOUT].enabled = true; + continue; + } + if (strncmp(*cur, "iolog_compress=", sizeof("iolog_compress=") - 1) == 0) { + if (sudo_strtobool(*cur + sizeof("iolog_compress=") - 1) == true) + iolog_compress = true; /* must be global */ + continue; + } + if (strncmp(*cur, "iolog_mode=", sizeof("iolog_mode=") - 1) == 0) { + mode_t mode = sudo_strtomode(*cur + sizeof("iolog_mode=") - 1, &errstr); + if (errstr == NULL) + iolog_set_mode(mode); + continue; + } + if (strncmp(*cur, "iolog_group=", sizeof("iolog_group=") - 1) == 0) { + iolog_set_group(*cur + sizeof("iolog_group=") - 1); + continue; + } + if (strncmp(*cur, "iolog_user=", sizeof("iolog_user=") - 1) == 0) { + iolog_set_user(*cur + sizeof("iolog_user=") - 1); + continue; + } + break; + case 'm': + if (strncmp(*cur, "maxseq=", sizeof("maxseq=") - 1) == 0) { + io_set_max_sessid(*cur + sizeof("maxseq=") - 1); + continue; + } + break; + case 'r': + if (strncmp(*cur, "runas_gid=", sizeof("runas_gid=") - 1) == 0) { + runas_gid_str = *cur + sizeof("runas_gid=") - 1; + continue; + } + if (strncmp(*cur, "runas_egid=", sizeof("runas_egid=") - 1) == 0) { + runas_egid_str = *cur + sizeof("runas_egid=") - 1; + continue; + } + if (strncmp(*cur, "runas_uid=", sizeof("runas_uid=") - 1) == 0) { + runas_uid_str = *cur + sizeof("runas_uid=") - 1; + continue; + } + if (strncmp(*cur, "runas_euid=", sizeof("runas_euid=") - 1) == 0) { + runas_euid_str = *cur + sizeof("runas_euid=") - 1; + continue; + } + break; + } + } + + /* + * Lookup runas user and group, preferring effective over real uid/gid. + */ + if (runas_euid_str != NULL) + runas_uid_str = runas_euid_str; + if (runas_uid_str != NULL) { + id = sudo_strtoid(runas_uid_str, &errstr); + if (errstr != NULL) + sudo_warnx("runas uid %s: %s", runas_uid_str, U_(errstr)); + else + runas_uid = (uid_t)id; + } + if (runas_egid_str != NULL) + runas_gid_str = runas_egid_str; + if (runas_gid_str != NULL) { + id = sudo_strtoid(runas_gid_str, &errstr); + if (errstr != NULL) + sudo_warnx("runas gid %s: %s", runas_gid_str, U_(errstr)); + else + runas_gid = (gid_t)id; + } + + details->runas_pw = sudo_getpwuid(runas_uid); + if (details->runas_pw == NULL) { + idbuf[0] = '#'; + strlcpy(&idbuf[1], runas_uid_str, sizeof(idbuf) - 1); + details->runas_pw = sudo_fakepwnam(idbuf, runas_gid); + } + + if (runas_gid != details->runas_pw->pw_gid) { + details->runas_gr = sudo_getgrgid(runas_gid); + if (details->runas_gr == NULL) { + idbuf[0] = '#'; + strlcpy(&idbuf[1], runas_gid_str, sizeof(idbuf) - 1); + details->runas_gr = sudo_fakegrnam(idbuf); + } + } + debug_return_bool( + io_log_files[IOFD_STDIN].enabled || io_log_files[IOFD_STDOUT].enabled || + io_log_files[IOFD_STDERR].enabled || io_log_files[IOFD_TTYIN].enabled || + io_log_files[IOFD_TTYOUT].enabled); +} + +/* + * Write the "/log" file that contains the user and command info. + * This file is not compressed. + */ +static bool +write_info_log(char *pathbuf, size_t len, struct iolog_details *details, + char * const argv[]) +{ + time_t now; + char * const *av; + FILE *fp; + int fd; + bool ret = true; + debug_decl(write_info_log, SUDOERS_DEBUG_UTIL) + + pathbuf[len] = '\0'; + strlcat(pathbuf, "/log", PATH_MAX); + fd = io_open(pathbuf, O_CREAT|O_TRUNC|O_WRONLY, iolog_filemode); + if (fd == -1 || (fp = fdopen(fd, "w")) == NULL) { + log_warning(SLOG_SEND_MAIL, N_("unable to create %s"), pathbuf); + debug_return_bool(false); + } + if (fchown(fd, iolog_uid, iolog_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to fchown %d:%d %s", __func__, + (int)iolog_uid, (int)iolog_gid, pathbuf); + } + + fprintf(fp, "%lld:%s:%s:%s:%s:%d:%d\n%s\n%s", (long long)time(&now), + details->user ? details->user : "unknown", details->runas_pw->pw_name, + details->runas_gr ? details->runas_gr->gr_name : "", + details->tty ? details->tty : "unknown", details->lines, details->cols, + details->cwd ? details->cwd : "unknown", + details->command ? details->command : "unknown"); + for (av = argv + 1; *av != NULL; av++) { + fputc(' ', fp); + fputs(*av, fp); + } + fputc('\n', fp); + fflush(fp); + if (ferror(fp)) { + log_warning(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), strerror(errno)); + warned = true; + ret = false; + } + fclose(fp); + debug_return_bool(ret); +} + +#ifdef HAVE_ZLIB_H +static const char * +gzstrerror(gzFile file) +{ + int errnum; + + return gzerror(file, &errnum); +} +#endif /* HAVE_ZLIB_H */ + +/* + * Write to an I/O log, compressing if iolog_compress is enabled. + * If def_iolog_flush is true, flush the buffer immediately. + */ +static const char * +iolog_write(union io_fd ifd, const void *buf, unsigned int len) +{ + const char *errstr = NULL; + debug_decl(iolog_write, SUDOERS_DEBUG_PLUGIN) + +#ifdef HAVE_ZLIB_H + if (iolog_compress) { + if (gzwrite(ifd.g, (const voidp)buf, len) != (int)len) { + errstr = gzstrerror(ifd.g); + goto done; + } + if (def_iolog_flush) { + if (gzflush(ifd.g, Z_SYNC_FLUSH) != Z_OK) { + errstr = gzstrerror(ifd.g); + goto done; + } + } + } else +#endif + { + if (fwrite(buf, 1, len, ifd.f) != len) { + errstr = strerror(errno); + goto done; + } + if (def_iolog_flush) { + if (fflush(ifd.f) != 0) { + errstr = strerror(errno); + goto done; + } + } + } + +done: + debug_return_const_str(errstr); +} + +static int +sudoers_io_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[], char * const args[]) +{ + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + char pathbuf[PATH_MAX], sessid[7]; + char *tofree = NULL; + char * const *cur; + const char *cp, *plugin_path = NULL; + size_t len; + mode_t omask; + int i, ret = -1; + debug_decl(sudoers_io_open, SUDOERS_DEBUG_PLUGIN) + + sudo_conv = conversation; + sudo_printf = plugin_printf; + + /* If we have no command (because -V was specified) just return. */ + if (argc == 0) + debug_return_int(true); + + bindtextdomain("sudoers", LOCALEDIR); + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (!sudoers_debug_parse_flags(&debug_files, cp)) + debug_return_int(-1); + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + + /* umask must not be more restrictive than the file modes. */ + omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode)); + + if (!sudoers_debug_register(plugin_path, &debug_files)) { + ret = -1; + goto done; + } + + /* + * Pull iolog settings out of command_info. + */ + if (!iolog_deserialize_info(&iolog_details, user_info, command_info)) { + ret = false; + goto done; + } + + /* If no I/O log path defined we need to figure it out ourselves. */ + if (iolog_details.iolog_path == NULL) { + /* Get next session ID and convert it into a path. */ + tofree = malloc(sizeof(_PATH_SUDO_IO_LOGDIR) + sizeof(sessid) + 2); + if (tofree == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + memcpy(tofree, _PATH_SUDO_IO_LOGDIR, sizeof(_PATH_SUDO_IO_LOGDIR)); + if (!io_nextid(tofree, NULL, sessid)) { + ret = false; + goto done; + } + (void)snprintf(tofree + sizeof(_PATH_SUDO_IO_LOGDIR), + sizeof(sessid) + 2, "%c%c/%c%c/%c%c", sessid[0], sessid[1], + sessid[2], sessid[3], sessid[4], sessid[5]); + iolog_details.iolog_path = tofree; + } + + /* + * Make local copy of I/O log path and create it, along with any + * intermediate subdirs. Calls mkdtemp() if iolog_path ends in XXXXXX. + */ + len = mkdir_iopath(iolog_details.iolog_path, pathbuf, sizeof(pathbuf)); + if (len >= sizeof(pathbuf)) + goto done; + + /* Write log file with user and command details. */ + if (!write_info_log(pathbuf, len, &iolog_details, argv)) + goto done; + + /* Create the timing and I/O log files. */ + for (i = 0; i < IOFD_MAX; i++) { + if (!open_io_fd(pathbuf, len, &io_log_files[i], iolog_compress)) + goto done; + } + + /* + * Clear I/O log function pointers for disabled log functions. + */ + if (!io_log_files[IOFD_STDIN].enabled) + sudoers_io.log_stdin = NULL; + if (!io_log_files[IOFD_STDOUT].enabled) + sudoers_io.log_stdout = NULL; + if (!io_log_files[IOFD_STDERR].enabled) + sudoers_io.log_stderr = NULL; + if (!io_log_files[IOFD_TTYIN].enabled) + sudoers_io.log_ttyin = NULL; + if (!io_log_files[IOFD_TTYOUT].enabled) + sudoers_io.log_ttyout = NULL; + + if (sudo_gettime_awake(&last_time) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + goto done; + } + + ret = true; + +done: + umask(omask); + free(tofree); + if (iolog_details.runas_pw) + sudo_pw_delref(iolog_details.runas_pw); + if (iolog_details.runas_gr) + sudo_gr_delref(iolog_details.runas_gr); + sudo_freepwcache(); + sudo_freegrcache(); + + /* Ignore errors if they occur if the policy says so. */ + if (ret == -1 && iolog_details.ignore_iolog_errors) + ret = 0; + + debug_return_int(ret); +} + +static void +sudoers_io_close(int exit_status, int error) +{ + const char *errstr = NULL; + int i; + debug_decl(sudoers_io_close, SUDOERS_DEBUG_PLUGIN) + + for (i = 0; i < IOFD_MAX; i++) { + if (io_log_files[i].fd.v == NULL) + continue; +#ifdef HAVE_ZLIB_H + if (iolog_compress) { + int errnum; + + if (gzclose(io_log_files[i].fd.g) != Z_OK) + errstr = gzerror(io_log_files[i].fd.g, &errnum); + } else +#endif + if (fclose(io_log_files[i].fd.f) != 0) + errstr = strerror(errno); + } + + if (errstr != NULL && !warned) { + /* Only warn about I/O log file errors once. */ + log_warning(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), errstr); + warned = true; + } + + sudoers_debug_deregister(); + + return; +} + +static int +sudoers_io_version(int verbose) +{ + debug_decl(sudoers_io_version, SUDOERS_DEBUG_PLUGIN) + + sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers I/O plugin version %s\n", + PACKAGE_VERSION); + + debug_return_int(true); +} + +/* + * Generic I/O logging function. Called by the I/O logging entry points. + * Returns 1 on success and -1 on error. + */ +static int +sudoers_io_log(union io_fd ifd, const char *buf, unsigned int len, int event) +{ + struct timespec now, delay; + char tbuf[1024]; + const char *errstr = NULL; + int ret = -1; + debug_decl(sudoers_io_log, SUDOERS_DEBUG_PLUGIN) + + if (ifd.v == NULL) { + sudo_warnx(U_("%s: internal error, I/O log file for event %d not open"), + __func__, event); + debug_return_int(-1); + } + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + errstr = strerror(errno); + goto bad; + } + + /* Write I/O log file entry. */ + errstr = iolog_write(ifd, buf, len); + if (errstr != NULL) + goto done; + + /* Write timing file entry. */ + sudo_timespecsub(&now, &last_time, &delay); + len = (unsigned int)snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %u\n", + event, (long long)delay.tv_sec, delay.tv_nsec, len); + if (len >= sizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + errstr = strerror(EOVERFLOW); + goto done; + } + errstr = iolog_write(io_log_files[IOFD_TIMING].fd, tbuf, len); + if (errstr != NULL) + goto done; + + /* Success. */ + ret = 1; + +done: + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (errstr != NULL && !warned) { + /* Only warn about I/O log file errors once. */ + log_warning(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), errstr); + warned = true; + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_iolog_errors) + ret = 1; + } + + debug_return_int(ret); +} + +static int +sudoers_io_log_stdin(const char *buf, unsigned int len) +{ + const union io_fd ifd = io_log_files[IOFD_STDIN].fd; + + return sudoers_io_log(ifd, buf, len, IO_EVENT_STDIN); +} + +static int +sudoers_io_log_stdout(const char *buf, unsigned int len) +{ + const union io_fd ifd = io_log_files[IOFD_STDOUT].fd; + + return sudoers_io_log(ifd, buf, len, IO_EVENT_STDOUT); +} + +static int +sudoers_io_log_stderr(const char *buf, unsigned int len) +{ + const union io_fd ifd = io_log_files[IOFD_STDERR].fd; + + return sudoers_io_log(ifd, buf, len, IO_EVENT_STDERR); +} + +static int +sudoers_io_log_ttyin(const char *buf, unsigned int len) +{ + const union io_fd ifd = io_log_files[IOFD_TTYIN].fd; + + return sudoers_io_log(ifd, buf, len, IO_EVENT_TTYIN); +} + +static int +sudoers_io_log_ttyout(const char *buf, unsigned int len) +{ + const union io_fd ifd = io_log_files[IOFD_TTYOUT].fd; + + return sudoers_io_log(ifd, buf, len, IO_EVENT_TTYOUT); +} + +static int +sudoers_io_change_winsize(unsigned int lines, unsigned int cols) +{ + struct timespec now, delay; + unsigned int len; + char tbuf[1024]; + const char *errstr = NULL; + int ret = -1; + debug_decl(sudoers_io_change_winsize, SUDOERS_DEBUG_PLUGIN) + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + errstr = strerror(errno); + goto bad; + } + + /* Write window change event to the timing file. */ + sudo_timespecsub(&now, &last_time, &delay); + len = (unsigned int)snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %u %u\n", + IO_EVENT_WINSIZE, (long long)delay.tv_sec, delay.tv_nsec, lines, cols); + if (len >= sizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + errstr = strerror(EOVERFLOW); + goto done; + } + errstr = iolog_write(io_log_files[IOFD_TIMING].fd, tbuf, len); + if (errstr != NULL) + goto done; + + /* Success. */ + ret = 1; + +done: + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (errstr != NULL && !warned) { + /* Only warn about I/O log file errors once. */ + log_warning(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), errstr); + warned = true; + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_iolog_errors) + ret = 1; + } + + debug_return_int(ret); +} + +static int +sudoers_io_suspend(int signo) +{ + struct timespec now, delay; + unsigned int len; + char signame[SIG2STR_MAX]; + char tbuf[1024]; + const char *errstr = NULL; + int ret = -1; + debug_decl(sudoers_io_suspend, SUDOERS_DEBUG_PLUGIN) + + if (signo <= 0 || sig2str(signo, signame) == -1) { + sudo_warnx(U_("%s: internal error, invalid signal %d"), + __func__, signo); + debug_return_int(-1); + } + + if (sudo_gettime_awake(&now) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to get time of day", __func__); + errstr = strerror(errno); + goto bad; + } + + /* Write suspend event to the timing file. */ + sudo_timespecsub(&now, &last_time, &delay); + len = (unsigned int)snprintf(tbuf, sizeof(tbuf), "%d %lld.%09ld %s\n", + IO_EVENT_SUSPEND, (long long)delay.tv_sec, delay.tv_nsec, signame); + if (len >= sizeof(tbuf)) { + /* Not actually possible due to the size of tbuf[]. */ + errstr = strerror(EOVERFLOW); + goto done; + } + errstr = iolog_write(io_log_files[IOFD_TIMING].fd, tbuf, len); + if (errstr != NULL) + goto done; + + /* Success. */ + ret = 1; + +done: + last_time.tv_sec = now.tv_sec; + last_time.tv_nsec = now.tv_nsec; + +bad: + if (ret == -1) { + if (errstr != NULL && !warned) { + /* Only warn about I/O log file errors once. */ + log_warning(SLOG_SEND_MAIL, + N_("unable to write to I/O log file: %s"), errstr); + warned = true; + } + + /* Ignore errors if they occur if the policy says so. */ + if (iolog_details.ignore_iolog_errors) + ret = 1; + } + + debug_return_int(ret); +} + +__dso_public struct io_plugin sudoers_io = { + SUDO_IO_PLUGIN, + SUDO_API_VERSION, + sudoers_io_open, + sudoers_io_close, + sudoers_io_version, + sudoers_io_log_ttyin, + sudoers_io_log_ttyout, + sudoers_io_log_stdin, + sudoers_io_log_stdout, + sudoers_io_log_stderr, + NULL, /* register_hooks */ + NULL, /* deregister_hooks */ + sudoers_io_change_winsize, + sudoers_io_suspend +}; diff --git a/utsudo-0.0.2/plugins/sudoers/iolog.h b/utsudo-0.0.2/plugins/sudoers/iolog.h new file mode 100644 index 0000000..4ef8963 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/iolog.h @@ -0,0 +1,88 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_IOLOG_H +#define SUDOERS_IOLOG_H + +#ifdef HAVE_ZLIB_H +# include /* for gzFile */ +#endif + +/* + * I/O log event types as stored as the first field in the timing file. + * Changing existing values will result in incompatible I/O log files. + */ +#define IO_EVENT_STDIN 0 +#define IO_EVENT_STDOUT 1 +#define IO_EVENT_STDERR 2 +#define IO_EVENT_TTYIN 3 +#define IO_EVENT_TTYOUT 4 +#define IO_EVENT_WINSIZE 5 +#define IO_EVENT_TTYOUT_1_8_7 6 +#define IO_EVENT_SUSPEND 7 +#define IO_EVENT_COUNT 8 + +/* Default maximum session ID */ +#define SESSID_MAX 2176782336U + +union io_fd { + FILE *f; +#ifdef HAVE_ZLIB_H + gzFile g; +#endif + void *v; +}; + +/* + * Info present in the I/O log file + */ +struct log_info { + char *cwd; + char *user; + char *runas_user; + char *runas_group; + char *tty; + char *cmd; + time_t tstamp; + int rows; + int cols; +}; + +struct timing_closure { + const char *decimal; + struct timespec *max_delay; + union io_fd fd; + int event; + union { + struct { + int rows; + int cols; + } winsize; + size_t nbytes; // XXX + int signo; + } u; +}; + +/* iolog_util.c */ +bool parse_timing(const char *buf, struct timespec *delay, struct timing_closure *timing); +char *parse_delay(const char *cp, struct timespec *delay, const char *decimal_point); +struct log_info *parse_logfile(const char *logfile); +void free_log_info(struct log_info *li); +void adjust_delay(struct timespec *delay, struct timespec *max_delay, double scale_factor); + +#endif /* SUDOERS_IOLOG_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/iolog_files.h b/utsudo-0.0.2/plugins/sudoers/iolog_files.h new file mode 100644 index 0000000..b564fa6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/iolog_files.h @@ -0,0 +1,49 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_IOLOG_FILES_H +#define SUDOERS_IOLOG_FILES_H + +/* + * Indexes into io_log_files[] + */ +#define IOFD_STDIN 0 +#define IOFD_STDOUT 1 +#define IOFD_STDERR 2 +#define IOFD_TTYIN 3 +#define IOFD_TTYOUT 4 +#define IOFD_TIMING 5 +#define IOFD_MAX 6 + +struct io_log_file { + bool enabled; + const char *suffix; + union io_fd fd; +}; + +static struct io_log_file io_log_files[] = { + { false, "/stdin" }, /* IOFD_STDIN */ + { false, "/stdout" }, /* IOFD_STDOUT */ + { false, "/stderr" }, /* IOFD_STDERR */ + { false, "/ttyin" }, /* IOFD_TTYIN */ + { false, "/ttyout" }, /* IOFD_TTYOUT */ + { true, "/timing" }, /* IOFD_TIMING */ + { false, NULL } /* IOFD_MAX */ +}; + +#endif /* SUDOERS_IOLOG_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/iolog_path.c b/utsudo-0.0.2/plugins/sudoers/iolog_path.c new file mode 100644 index 0000000..5a5d75a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/iolog_path.c @@ -0,0 +1,289 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudoers.h" + +struct path_escape { + const char *name; + size_t (*copy_fn)(char *, size_t, char *); +}; + +static size_t +fill_seq(char *str, size_t strsize, char *logdir) +{ +#ifdef SUDOERS_NO_SEQ + debug_decl(fill_seq, SUDOERS_DEBUG_UTIL) + debug_return_size_t(strlcpy(str, "%{seq}", strsize)); +#else + static char sessid[7]; + int len; + debug_decl(fill_seq, SUDOERS_DEBUG_UTIL) + + if (sessid[0] == '\0') { + if (!io_nextid(logdir, def_iolog_dir, sessid)) + debug_return_size_t((size_t)-1); + } + + /* Path is of the form /var/log/sudo-io/00/00/01. */ + len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0], + sessid[1], sessid[2], sessid[3], sessid[4], sessid[5]); + if (len < 0) + debug_return_size_t(strsize); /* handle non-standard snprintf() */ + debug_return_size_t(len); +#endif /* SUDOERS_NO_SEQ */ +} + +static size_t +fill_user(char *str, size_t strsize, char *unused) +{ + debug_decl(fill_user, SUDOERS_DEBUG_UTIL) + debug_return_size_t(strlcpy(str, user_name, strsize)); +} + +static size_t +fill_group(char *str, size_t strsize, char *unused) +{ + struct group *grp; + size_t len; + debug_decl(fill_group, SUDOERS_DEBUG_UTIL) + + if ((grp = sudo_getgrgid(user_gid)) != NULL) { + len = strlcpy(str, grp->gr_name, strsize); + sudo_gr_delref(grp); + } else { + len = strlen(str); + len = snprintf(str + len, strsize - len, "#%u", + (unsigned int) user_gid); + } + debug_return_size_t(len); +} + +static size_t +fill_runas_user(char *str, size_t strsize, char *unused) +{ + debug_decl(fill_runas_user, SUDOERS_DEBUG_UTIL) + debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize)); +} + +static size_t +fill_runas_group(char *str, size_t strsize, char *unused) +{ + struct group *grp; + size_t len; + debug_decl(fill_runas_group, SUDOERS_DEBUG_UTIL) + + if (runas_gr != NULL) { + len = strlcpy(str, runas_gr->gr_name, strsize); + } else { + if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) { + len = strlcpy(str, grp->gr_name, strsize); + sudo_gr_delref(grp); + } else { + len = strlen(str); + len = snprintf(str + len, strsize - len, "#%u", + (unsigned int) runas_pw->pw_gid); + } + } + debug_return_size_t(len); +} + +static size_t +fill_hostname(char *str, size_t strsize, char *unused) +{ + debug_decl(fill_hostname, SUDOERS_DEBUG_UTIL) + debug_return_size_t(strlcpy(str, user_shost, strsize)); +} + +static size_t +fill_command(char *str, size_t strsize, char *unused) +{ + debug_decl(fill_command, SUDOERS_DEBUG_UTIL) + debug_return_size_t(strlcpy(str, user_base, strsize)); +} + +/* Note: "seq" must be first in the list. */ +static struct path_escape io_path_escapes[] = { + { "seq", fill_seq }, + { "user", fill_user }, + { "group", fill_group }, + { "runas_user", fill_runas_user }, + { "runas_group", fill_runas_group }, + { "hostname", fill_hostname }, + { "command", fill_command }, + { NULL, NULL } +}; + +/* + * Concatenate dir + file, expanding any escape sequences. + * Returns the concatenated path and sets slashp point to + * the path separator between the expanded dir and file. + */ +char * +expand_iolog_path(const char *prefix, const char *dir, const char *file, + char **slashp) +{ + size_t len, prelen = 0; + char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX]; + char *slash = NULL; + const char *endbrace, *src = dir; + struct path_escape *escapes = NULL; + int pass, oldlocale; + bool strfit; + debug_decl(expand_iolog_path, SUDOERS_DEBUG_UTIL) + + /* Expanded path must be <= PATH_MAX */ + if (prefix != NULL) + prelen = strlen(prefix); + path = malloc(prelen + PATH_MAX); + if (path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + *path = '\0'; + pathend = path + prelen + PATH_MAX; + dst = path; + + /* Copy prefix, if present. */ + if (prefix != NULL) { + memcpy(path, prefix, prelen); + dst += prelen; + *dst = '\0'; + } + + /* Trim leading slashes from file component. */ + while (*file == '/') + file++; + + for (pass = 0; pass < 3; pass++) { + strfit = false; + switch (pass) { + case 0: + src = dir; + escapes = io_path_escapes + 1; /* skip "%{seq}" */ + break; + case 1: + /* Trim trailing slashes from dir component. */ + while (dst > path + prelen + 1 && dst[-1] == '/') + dst--; + /* The NUL will be replaced with a '/' at the end. */ + if (dst + 1 >= pathend) + goto bad; + slash = dst++; + continue; + case 2: + src = file; + escapes = io_path_escapes; + break; + } + dst0 = dst; + for (; *src != '\0'; src++) { + if (src[0] == '%') { + if (src[1] == '{') { + endbrace = strchr(src + 2, '}'); + if (endbrace != NULL) { + struct path_escape *esc; + len = (size_t)(endbrace - src - 2); + for (esc = escapes; esc->name != NULL; esc++) { + if (strncmp(src + 2, esc->name, len) == 0 && + esc->name[len] == '\0') + break; + } + if (esc->name != NULL) { + len = esc->copy_fn(dst, (size_t)(pathend - dst), + path + prelen); + if (len >= (size_t)(pathend - dst)) + goto bad; + dst += len; + src = endbrace; + continue; + } + } + } else if (src[1] == '%') { + /* Collapse %% -> % */ + src++; + } else { + /* May need strftime() */ + strfit = 1; + } + } + /* Need at least 2 chars, including the NUL terminator. */ + if (dst + 1 >= pathend) + goto bad; + *dst++ = *src; + } + *dst = '\0'; + + /* Expand strftime escapes as needed. */ + if (strfit) { + time_t now; + struct tm *timeptr; + + time(&now); + if ((timeptr = localtime(&now)) == NULL) + goto bad; + + /* Use sudoers locale for strftime() */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + /* We only call strftime() on the current part of the buffer. */ + tmpbuf[sizeof(tmpbuf) - 1] = '\0'; + len = strftime(tmpbuf, sizeof(tmpbuf), dst0, timeptr); + + /* Restore old locale. */ + sudoers_setlocale(oldlocale, NULL); + + if (len == 0 || tmpbuf[sizeof(tmpbuf) - 1] != '\0') + goto bad; /* strftime() failed, buf too small? */ + + if (len >= (size_t)(pathend - dst0)) + goto bad; /* expanded buffer too big to fit. */ + memcpy(dst0, tmpbuf, len); + dst = dst0 + len; + *dst = '\0'; + } + } + if (slash != NULL) + *slash = '/'; + if (slashp != NULL) + *slashp = slash; + + debug_return_str(path); +bad: + free(path); + debug_return_str(NULL); +} diff --git a/utsudo-0.0.2/plugins/sudoers/iolog_util.c b/utsudo-0.0.2/plugins/sudoers/iolog_util.c new file mode 100644 index 0000000..e50ea50 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/iolog_util.c @@ -0,0 +1,388 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_debug.h" +#include "sudo_util.h" +#include "iolog.h" + +static int timing_event_adj; + +struct log_info * +parse_logfile(const char *logfile) +{ + FILE *fp; + char *buf = NULL, *cp, *ep; + const char *errstr; + size_t bufsize = 0, cwdsize = 0, cmdsize = 0; + struct log_info *li = NULL; + debug_decl(parse_logfile, SUDO_DEBUG_UTIL) + + fp = fopen(logfile, "r"); + if (fp == NULL) { + sudo_warn(U_("unable to open %s"), logfile); + goto bad; + } + + /* + * ID file has three lines: + * 1) a log info line + * 2) cwd + * 3) command with args + */ + if ((li = calloc(1, sizeof(*li))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (getdelim(&buf, &bufsize, '\n', fp) == -1 || + getdelim(&li->cwd, &cwdsize, '\n', fp) == -1 || + getdelim(&li->cmd, &cmdsize, '\n', fp) == -1) { + sudo_warn(U_("%s: invalid log file"), logfile); + goto bad; + } + + /* Strip the newline from the cwd and command. */ + li->cwd[strcspn(li->cwd, "\n")] = '\0'; + li->cmd[strcspn(li->cmd, "\n")] = '\0'; + + /* + * Crack the log line (rows and cols not present in old versions). + * timestamp:user:runas_user:runas_group:tty:rows:cols + * XXX - probably better to use strtok and switch on the state. + */ + buf[strcspn(buf, "\n")] = '\0'; + cp = buf; + + /* timestamp */ + if ((ep = strchr(cp, ':')) == NULL) { + sudo_warn(U_("%s: time stamp field is missing"), logfile); + goto bad; + } + *ep = '\0'; + li->tstamp = sudo_strtonum(cp, 0, TIME_T_MAX, &errstr); + if (errstr != NULL) { + sudo_warn(U_("%s: time stamp %s: %s"), logfile, cp, errstr); + goto bad; + } + + /* user */ + cp = ep + 1; + if ((ep = strchr(cp, ':')) == NULL) { + sudo_warn(U_("%s: user field is missing"), logfile); + goto bad; + } + if ((li->user = strndup(cp, (size_t)(ep - cp))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* runas user */ + cp = ep + 1; + if ((ep = strchr(cp, ':')) == NULL) { + sudo_warn(U_("%s: runas user field is missing"), logfile); + goto bad; + } + if ((li->runas_user = strndup(cp, (size_t)(ep - cp))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* runas group */ + cp = ep + 1; + if ((ep = strchr(cp, ':')) == NULL) { + sudo_warn(U_("%s: runas group field is missing"), logfile); + goto bad; + } + if (cp != ep) { + if ((li->runas_group = strndup(cp, (size_t)(ep - cp))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + + /* tty, followed by optional rows + columns */ + cp = ep + 1; + if ((ep = strchr(cp, ':')) == NULL) { + /* just the tty */ + if ((li->tty = strdup(cp)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + /* tty followed by rows + columns */ + if ((li->tty = strndup(cp, (size_t)(ep - cp))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + cp = ep + 1; + /* need to NULL out separator to use sudo_strtonum() */ + /* XXX - use sudo_strtonumx */ + if ((ep = strchr(cp, ':')) != NULL) { + *ep = '\0'; + } + li->rows = sudo_strtonum(cp, 1, INT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: tty rows %s: %s", logfile, cp, errstr); + } + if (ep != NULL) { + cp = ep + 1; + li->cols = sudo_strtonum(cp, 1, INT_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: tty cols %s: %s", logfile, cp, errstr); + } + } + } + fclose(fp); + free(buf); + debug_return_ptr(li); + +bad: + if (fp != NULL) + fclose(fp); + free(buf); + free_log_info(li); + debug_return_ptr(NULL); +} + +void +adjust_delay(struct timespec *delay, struct timespec *max_delay, + double scale_factor) +{ + double seconds; + debug_decl(adjust_delay, SUDO_DEBUG_UTIL) + + if (scale_factor != 1.0) { + /* Order is important: we don't want to double the remainder. */ + seconds = (double)delay->tv_sec / scale_factor; + delay->tv_sec = (time_t)seconds; + delay->tv_nsec /= scale_factor; + delay->tv_nsec += (seconds - delay->tv_sec) * 1000000000; + while (delay->tv_nsec >= 1000000000) { + delay->tv_sec++; + delay->tv_nsec -= 1000000000; + } + } + + /* Clamp to max delay. */ + if (max_delay != NULL) { + if (sudo_timespeccmp(delay, max_delay, >)) { + delay->tv_sec = max_delay->tv_sec; + delay->tv_nsec = max_delay->tv_nsec; + } + } + + debug_return; +} + +/* + * Parse the delay as seconds and nanoseconds: %lld.%09ld + * Sudo used to write this as a double, but since timing data is logged + * in the C locale this may not match the current locale. + */ +char * +parse_delay(const char *cp, struct timespec *delay, const char *decimal_point) +{ + char numbuf[(((sizeof(long long) * 8) + 2) / 3) + 2]; + const char *errstr, *ep; + long long llval; + size_t len; + debug_decl(parse_delay, SUDO_DEBUG_UTIL) + + /* Parse seconds (whole number portion). */ + for (ep = cp; isdigit((unsigned char)*ep); ep++) + continue; + len = (size_t)(ep - cp); + if (len >= sizeof(numbuf)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: number of seconds is too large", cp); + debug_return_ptr(NULL); + } + memcpy(numbuf, cp, len); + numbuf[len] = '\0'; + delay->tv_sec = sudo_strtonum(numbuf, 0, TIME_T_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: number of seconds is %s", numbuf, errstr); + debug_return_ptr(NULL); + } + + /* Radix may be in user's locale for sudo < 1.7.4 so accept that too. */ + if (*ep != '.' && *ep != *decimal_point) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid characters after seconds: %s", ep); + debug_return_ptr(NULL); + } + cp = ep + 1; + + /* Parse fractional part, we may read more precision than we can store. */ + for (ep = cp; isdigit((unsigned char)*ep); ep++) + continue; + len = (size_t)(ep - cp); + if (len >= sizeof(numbuf)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: number of nanoseconds is too large", cp); + debug_return_ptr(NULL); + } + memcpy(numbuf, cp, len); + numbuf[len] = '\0'; + llval = sudo_strtonum(numbuf, 0, LLONG_MAX, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: number of nanoseconds is %s", numbuf, errstr); + debug_return_ptr(NULL); + } + + /* Adjust fractional part to nanosecond precision. */ + if (len < 9) { + /* Convert to nanosecond precision. */ + do { + llval *= 10; + } while (++len < 9); + } else if (len > 9) { + /* Clamp to nanoseconds. */ + do { + llval /= 10; + } while (--len > 9); + } + delay->tv_nsec = (long)llval; + + /* Advance to the next field. */ + while (isspace((unsigned char)*ep)) + ep++; + + debug_return_str((char *)ep); +} + +/* + * Parse a timing line, which is formatted as: + * IO_EVENT_TTYOUT sleep_time num_bytes + * IO_EVENT_WINSIZE sleep_time rows cols + * IO_EVENT_SUSPEND sleep_time signo + * Where type is IO_EVENT_*, sleep_time is the number of seconds to sleep + * before writing the data and num_bytes is the number of bytes to output. + * Returns true on success and false on failure. + */ +bool +parse_timing(const char *buf, struct timespec *delay, + struct timing_closure *timing) +{ + unsigned long ulval; + char *cp, *ep; + debug_decl(parse_timing, SUDO_DEBUG_UTIL) + + /* Clear fd. */ + timing->fd.v = NULL; + + /* Parse event type. */ + ulval = strtoul(buf, &ep, 10); + if (ep == buf || !isspace((unsigned char) *ep)) + goto bad; + if (ulval >= IO_EVENT_COUNT) + goto bad; + if (ulval == IO_EVENT_TTYOUT_1_8_7) { + /* work around a bug in timing files generated by sudo 1.8.7 */ + timing_event_adj = 2; + } + timing->event = (int)ulval - timing_event_adj; + for (cp = ep + 1; isspace((unsigned char) *cp); cp++) + continue; + + /* Parse delay, returns the next field or NULL on error. */ + if ((cp = parse_delay(cp, delay, timing->decimal)) == NULL) + goto bad; + + switch (timing->event) { + case IO_EVENT_SUSPEND: + /* Signal name (no leading SIG prefix) or number. */ + if (str2sig(cp, &timing->u.signo) == -1) + goto bad; + break; + case IO_EVENT_WINSIZE: + ulval = strtoul(cp, &ep, 10); + if (ep == cp || !isspace((unsigned char) *ep)) + goto bad; + if (ulval > INT_MAX) + goto bad; + timing->u.winsize.rows = (int)ulval; + for (cp = ep + 1; isspace((unsigned char) *cp); cp++) + continue; + + ulval = strtoul(cp, &ep, 10); + if (ep == cp || *ep != '\0') + goto bad; + if (ulval > INT_MAX) + goto bad; + timing->u.winsize.cols = (int)ulval; + break; + default: + errno = 0; + ulval = strtoul(cp, &ep, 10); + if (ep == cp || *ep != '\0') + goto bad; + /* Note: assumes SIZE_MAX == ULONG_MAX */ + if (errno == ERANGE && ulval == ULONG_MAX) + goto bad; + timing->u.nbytes = (size_t)ulval; + break; + } + + debug_return_bool(true); +bad: + debug_return_bool(false); +} + +void +free_log_info(struct log_info *li) +{ + if (li != NULL) { + free(li->cwd); + free(li->user); + free(li->runas_user); + free(li->runas_group); + free(li->tty); + free(li->cmd); + free(li); + } +} diff --git a/utsudo-0.0.2/plugins/sudoers/ldap.c b/utsudo-0.0.2/plugins/sudoers/ldap.c new file mode 100644 index 0000000..583af5d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ldap.c @@ -0,0 +1,2058 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2019 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LBER_H +# include +#endif +#include +#if defined(HAVE_LDAP_SSL_H) +# include +#elif defined(HAVE_MPS_LDAP_SSL_H) +# include +#endif +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +# ifdef HAVE_SASL_SASL_H +# include +# else +# include +# endif +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +#include "sudoers.h" +#include "gram.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_ldap_conf.h" +#include "sudo_dso.h" + +#ifndef LDAP_OPT_RESULT_CODE +# define LDAP_OPT_RESULT_CODE LDAP_OPT_ERROR_NUMBER +#endif + +#ifndef LDAP_OPT_SUCCESS +# define LDAP_OPT_SUCCESS LDAP_SUCCESS +#endif + +#if defined(HAVE_LDAP_SASL_INTERACTIVE_BIND_S) && !defined(LDAP_SASL_QUIET) +# define LDAP_SASL_QUIET 0 +#endif + +#ifndef HAVE_LDAP_UNBIND_EXT_S +#define ldap_unbind_ext_s(a, b, c) ldap_unbind_s(a) +#endif + +#ifndef HAVE_LDAP_SEARCH_EXT_S +# ifdef HAVE_LDAP_SEARCH_ST +# define ldap_search_ext_s(a, b, c, d, e, f, g, h, i, j, k) \ + ldap_search_st(a, b, c, d, e, f, i, k) +# else +# define ldap_search_ext_s(a, b, c, d, e, f, g, h, i, j, k) \ + ldap_search_s(a, b, c, d, e, f, k) +# endif +#endif + +#define LDAP_FOREACH(var, ld, res) \ + for ((var) = ldap_first_entry((ld), (res)); \ + (var) != NULL; \ + (var) = ldap_next_entry((ld), (var))) + +/* The TIMEFILTER_LENGTH is the length of the filter when timed entries + are used. The length is computed as follows: + 81 for the filter itself + + 2 * 17 for the now timestamp +*/ +#define TIMEFILTER_LENGTH 115 + +/* + * The ldap_search structure implements a linked list of ldap and + * search result pointers, which allows us to remove them after + * all search results have been combined in memory. + */ +struct ldap_search_result { + STAILQ_ENTRY(ldap_search_result) entries; + LDAP *ldap; + LDAPMessage *searchresult; +}; +STAILQ_HEAD(ldap_search_list, ldap_search_result); + +/* + * The ldap_entry_wrapper structure is used to implement sorted result entries. + * A double is used for the order to allow for insertion of new entries + * without having to renumber everything. + * Note: there is no standard floating point type in LDAP. + * As a result, some LDAP servers will only allow an integer. + */ +struct ldap_entry_wrapper { + LDAPMessage *entry; + double order; +}; + +/* + * The ldap_result structure contains the list of matching searches as + * well as an array of all result entries sorted by the sudoOrder attribute. + */ +struct ldap_result { + struct ldap_search_list searches; + struct ldap_entry_wrapper *entries; + unsigned int allocated_entries; + unsigned int nentries; +}; +#define ALLOCATION_INCREMENT 100 + +/* + * The ldap_netgroup structure implements a singly-linked tail queue of + * netgroups a user is a member of when querying netgroups directly. + */ +struct ldap_netgroup { + STAILQ_ENTRY(ldap_netgroup) entries; + char *name; +}; +STAILQ_HEAD(ldap_netgroup_list, ldap_netgroup); + +/* + * LDAP sudo_nss handle. + * We store the connection to the LDAP server and the passwd struct of the + * user the last query was performed for. + */ +struct sudo_ldap_handle { + LDAP *ld; + struct passwd *pw; + struct sudoers_parse_tree parse_tree; +}; + +#ifdef HAVE_LDAP_INITIALIZE +static char * +sudo_ldap_join_uri(struct ldap_config_str_list *uri_list) +{ + struct ldap_config_str *uri; + size_t len = 0; + char *buf = NULL; + debug_decl(sudo_ldap_join_uri, SUDOERS_DEBUG_LDAP) + + STAILQ_FOREACH(uri, uri_list, entries) { + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) { + if (strncasecmp(uri->val, "ldaps://", 8) == 0) { + sudo_warnx(U_("starttls not supported when using ldaps")); + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + } + len += strlen(uri->val) + 1; + } + if (len == 0 || (buf = malloc(len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + char *cp = buf; + + STAILQ_FOREACH(uri, uri_list, entries) { + cp += strlcpy(cp, uri->val, len - (cp - buf)); + *cp++ = ' '; + } + cp[-1] = '\0'; + } + debug_return_str(buf); +} +#endif /* HAVE_LDAP_INITIALIZE */ + +/* + * Wrapper for ldap_create() or ldap_init() that handles + * SSL/TLS initialization as well. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_init(LDAP **ldp, const char *host, int port) +{ + LDAP *ld; + int ret = LDAP_CONNECT_ERROR; + debug_decl(sudo_ldap_init, SUDOERS_DEBUG_LDAP) + +#ifdef HAVE_LDAPSSL_INIT + if (ldap_conf.ssl_mode != SUDO_LDAP_CLEAR) { + const int defsecure = ldap_conf.ssl_mode == SUDO_LDAP_SSL; + DPRINTF2("ldapssl_clientauth_init(%s, %s)", + ldap_conf.tls_certfile ? ldap_conf.tls_certfile : "NULL", + ldap_conf.tls_keyfile ? ldap_conf.tls_keyfile : "NULL"); + ret = ldapssl_clientauth_init(ldap_conf.tls_certfile, NULL, + ldap_conf.tls_keyfile != NULL, ldap_conf.tls_keyfile, NULL); + /* + * Starting with version 5.0, Mozilla-derived LDAP SDKs require + * the cert and key paths to be a directory, not a file. + * If the user specified a file and it fails, try the parent dir. + */ + if (ret != LDAP_SUCCESS) { + bool retry = false; + if (ldap_conf.tls_certfile != NULL) { + char *cp = strrchr(ldap_conf.tls_certfile, '/'); + if (cp != NULL && strncmp(cp + 1, "cert", 4) == 0) { + *cp = '\0'; + retry = true; + } + } + if (ldap_conf.tls_keyfile != NULL) { + char *cp = strrchr(ldap_conf.tls_keyfile, '/'); + if (cp != NULL && strncmp(cp + 1, "key", 3) == 0) { + *cp = '\0'; + retry = true; + } + } + if (retry) { + DPRINTF2("retry ldapssl_clientauth_init(%s, %s)", + ldap_conf.tls_certfile ? ldap_conf.tls_certfile : "NULL", + ldap_conf.tls_keyfile ? ldap_conf.tls_keyfile : "NULL"); + ret = ldapssl_clientauth_init(ldap_conf.tls_certfile, NULL, + ldap_conf.tls_keyfile != NULL, ldap_conf.tls_keyfile, NULL); + } + } + if (ret != LDAP_SUCCESS) { + sudo_warnx(U_("unable to initialize SSL cert and key db: %s"), + ldapssl_err2string(ret)); + if (ldap_conf.tls_certfile == NULL) + sudo_warnx(U_("you must set TLS_CERT in %s to use SSL"), + path_ldap_conf); + goto done; + } + + DPRINTF2("ldapssl_init(%s, %d, %d)", host, port, defsecure); + if ((ld = ldapssl_init(host, port, defsecure)) != NULL) + ret = LDAP_SUCCESS; + } else +#elif defined(HAVE_LDAP_SSL_INIT) && defined(HAVE_LDAP_SSL_CLIENT_INIT) + if (ldap_conf.ssl_mode == SUDO_LDAP_SSL) { + int sslrc; + ret = ldap_ssl_client_init(ldap_conf.tls_keyfile, ldap_conf.tls_keypw, + 0, &sslrc); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_ssl_client_init(): %s (SSL reason code %d)", + ldap_err2string(ret), sslrc); + goto done; + } + DPRINTF2("ldap_ssl_init(%s, %d, NULL)", host, port); + if ((ld = ldap_ssl_init((char *)host, port, NULL)) != NULL) + ret = LDAP_SUCCESS; + } else +#endif + { +#ifdef HAVE_LDAP_CREATE + DPRINTF2("ldap_create()"); + if ((ret = ldap_create(&ld)) != LDAP_SUCCESS) + goto done; + DPRINTF2("ldap_set_option(LDAP_OPT_HOST_NAME, %s)", host); + ret = ldap_set_option(ld, LDAP_OPT_HOST_NAME, host); +#else + DPRINTF2("ldap_init(%s, %d)", host, port); + if ((ld = ldap_init((char *)host, port)) == NULL) + goto done; + ret = LDAP_SUCCESS; +#endif + } + + *ldp = ld; +done: + debug_return_int(ret); +} + +/* + * Wrapper for ldap_get_values_len() that fills in the response code + * on error. + */ +static struct berval ** +sudo_ldap_get_values_len(LDAP *ld, LDAPMessage *entry, char *attr, int *rc) +{ + struct berval **bval; + + bval = ldap_get_values_len(ld, entry, attr); + if (bval == NULL) { + int optrc = ldap_get_option(ld, LDAP_OPT_RESULT_CODE, rc); + if (optrc != LDAP_OPT_SUCCESS) + *rc = optrc; + } else { + *rc = LDAP_SUCCESS; + } + return bval; +} + +/* + * Walk through search results and return true if we have a matching + * non-Unix group (including netgroups), else false. + */ +static int +sudo_ldap_check_non_unix_group(LDAP *ld, LDAPMessage *entry, struct passwd *pw) +{ + struct berval **bv, **p; + bool ret = false; + char *val; + int rc; + debug_decl(sudo_ldap_check_non_unix_group, SUDOERS_DEBUG_LDAP) + + if (!entry) + debug_return_bool(ret); + + /* get the values from the entry */ + bv = sudo_ldap_get_values_len(ld, entry, "sudoUser", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + debug_return_int(-1); + debug_return_bool(false); + } + + /* walk through values */ + for (p = bv; *p != NULL && !ret; p++) { + val = (*p)->bv_val; + if (*val == '+') { + if (netgr_matches(val, def_netgroup_tuple ? user_runhost : NULL, + def_netgroup_tuple ? user_srunhost : NULL, pw->pw_name)) + ret = true; + DPRINTF2("ldap sudoUser netgroup '%s' ... %s", val, + ret ? "MATCH!" : "not"); + } else { + if (group_plugin_query(pw->pw_name, val + 2, pw)) + ret = true; + DPRINTF2("ldap sudoUser non-Unix group '%s' ... %s", val, + ret ? "MATCH!" : "not"); + } + } + + ldap_value_free_len(bv); /* cleanup */ + + debug_return_bool(ret); +} + +/* + * Extract the dn from an entry and return the first rdn from it. + */ +static char * +sudo_ldap_get_first_rdn(LDAP *ld, LDAPMessage *entry) +{ +#ifdef HAVE_LDAP_STR2DN + char *dn, *rdn = NULL; + LDAPDN tmpDN; + debug_decl(sudo_ldap_get_first_rdn, SUDOERS_DEBUG_LDAP) + + if ((dn = ldap_get_dn(ld, entry)) == NULL) + debug_return_str(NULL); + if (ldap_str2dn(dn, &tmpDN, LDAP_DN_FORMAT_LDAP) == LDAP_SUCCESS) { + ldap_rdn2str(tmpDN[0], &rdn, LDAP_DN_FORMAT_UFN); + ldap_dnfree(tmpDN); + } + ldap_memfree(dn); + debug_return_str(rdn); +#else + char *dn, **edn; + debug_decl(sudo_ldap_get_first_rdn, SUDOERS_DEBUG_LDAP) + + if ((dn = ldap_get_dn(ld, entry)) == NULL) + debug_return_str(NULL); + edn = ldap_explode_dn(dn, 1); + ldap_memfree(dn); + debug_return_str(edn ? edn[0] : NULL); +#endif +} + +/* + * Read sudoOption and fill in the defaults list. + * This is used to parse the cn=defaults entry. + */ +static bool +sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry, struct defaults_list *defs) +{ + struct berval **bv, **p; + char *cn, *cp, *source = NULL; + bool ret = false; + int rc; + debug_decl(sudo_ldap_parse_options, SUDOERS_DEBUG_LDAP) + + bv = sudo_ldap_get_values_len(ld, entry, "sudoOption", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + debug_return_bool(false); + debug_return_bool(true); + } + + /* Use sudoRole in place of file name in defaults. */ + cn = sudo_ldap_get_first_rdn(ld, entry); + if (asprintf(&cp, "sudoRole %s", cn ? cn : "UNKNOWN") == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if ((source = rcstr_dup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(cp); + goto done; + } + + /* Walk through options, appending to defs. */ + for (p = bv; *p != NULL; p++) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option((*p)->bv_val, &var, &val); + if (!sudo_ldap_add_default(var, val, op, source, defs)) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + ret = true; + +done: + rcstr_delref(source); + if (cn) + ldap_memfree(cn); + ldap_value_free_len(bv); + + debug_return_bool(ret); +} + +/* + * Build an LDAP timefilter. + * + * Stores a filter in the buffer that makes sure only entries + * are selected that have a sudoNotBefore in the past and a + * sudoNotAfter in the future, i.e. a filter of the following + * structure (spaced out a little more for better readability: + * + * (& + * (| + * (!(sudoNotAfter=*)) + * (sudoNotAfter>__now__) + * ) + * (| + * (!(sudoNotBefore=*)) + * (sudoNotBefore<__now__) + * ) + * ) + * + * If either the sudoNotAfter or sudoNotBefore attributes are missing, + * no time restriction shall be imposed. + */ +static bool +sudo_ldap_timefilter(char *buffer, size_t buffersize) +{ + struct tm *tp; + time_t now; + char timebuffer[sizeof("20120727121554.0Z")]; + int len = -1; + debug_decl(sudo_ldap_timefilter, SUDOERS_DEBUG_LDAP) + + /* Make sure we have a formatted timestamp for __now__. */ + time(&now); + if ((tp = gmtime(&now)) == NULL) { + sudo_warn(U_("unable to get GMT time")); + goto done; + } + + /* Format the timestamp according to the RFC. */ + if (strftime(timebuffer, sizeof(timebuffer), "%Y%m%d%H%M%S.0Z", tp) == 0) { + sudo_warnx(U_("unable to format timestamp")); + goto done; + } + + /* Build filter. */ + len = snprintf(buffer, buffersize, "(&(|(!(sudoNotAfter=*))(sudoNotAfter>=%s))(|(!(sudoNotBefore=*))(sudoNotBefore<=%s)))", + timebuffer, timebuffer); + if (len < 0 || (size_t)len >= buffersize) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + errno = EOVERFLOW; + len = -1; + } + +done: + debug_return_bool(len != -1); +} + +/* + * Builds up a filter to search for default settings + */ +static char * +sudo_ldap_build_default_filter(void) +{ + char *filt; + debug_decl(sudo_ldap_build_default_filter, SUDOERS_DEBUG_LDAP) + + if (!ldap_conf.search_filter) + debug_return_str(strdup("cn=defaults")); + + if (asprintf(&filt, "(&%s(cn=defaults))", ldap_conf.search_filter) == -1) + debug_return_str(NULL); + + debug_return_str(filt); +} + +/* + * Determine length of query value after escaping characters + * as per RFC 4515. + */ +static size_t +sudo_ldap_value_len(const char *value) +{ + const char *s; + size_t len = 0; + + for (s = value; *s != '\0'; s++) { + switch (*s) { + case '\\': + case '(': + case ')': + case '*': + len += 2; + break; + } + } + len += (size_t)(s - value); + return len; +} + +/* + * Like strlcat() but escapes characters as per RFC 4515. + */ +static size_t +sudo_ldap_value_cat(char *dst, const char *src, size_t size) +{ + char *d = dst; + const char *s = src; + size_t n = size; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = size - dlen; + + if (n == 0) + return dlen + strlen(s); + while (*s != '\0') { + switch (*s) { + case '\\': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '5'; + *d++ = 'c'; + n -= 3; + break; + case '(': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = '8'; + n -= 3; + break; + case ')': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = '9'; + n -= 3; + break; + case '*': + if (n < 3) + goto done; + *d++ = '\\'; + *d++ = '2'; + *d++ = 'a'; + n -= 3; + break; + default: + if (n < 1) + goto done; + *d++ = *s; + n--; + break; + } + s++; + } +done: + *d = '\0'; + while (*s != '\0') + s++; + return dlen + (s - src); /* count does not include NUL */ +} + +/* + * Like strdup() but escapes characters as per RFC 4515. + */ +static char * +sudo_ldap_value_dup(const char *src) +{ + char *dst; + size_t size; + + size = sudo_ldap_value_len(src) + 1; + dst = malloc(size); + if (dst == NULL) + return NULL; + + *dst = '\0'; + if (sudo_ldap_value_cat(dst, src, size) >= size) { + /* Should not be possible... */ + free(dst); + dst = NULL; + } + return dst; +} + +/* + * Check the netgroups list beginning at "start" for nesting. + * Parent nodes with a memberNisNetgroup that match one of the + * netgroups are added to the list and checked for further nesting. + * Return true on success or false if there was an internal overflow. + */ +static bool +sudo_netgroup_lookup_nested(LDAP *ld, char *base, struct timeval *timeout, + struct ldap_netgroup_list *netgroups, struct ldap_netgroup *start) +{ + LDAPMessage *entry, *result; + size_t filt_len; + char *filt; + int rc; + debug_decl(sudo_netgroup_lookup_nested, SUDOERS_DEBUG_LDAP); + + DPRINTF1("Checking for nested netgroups from netgroup_base '%s'", base); + do { + struct ldap_netgroup *ng, *old_tail; + + result = NULL; + old_tail = STAILQ_LAST(netgroups, ldap_netgroup, entries); + filt_len = strlen(ldap_conf.netgroup_search_filter) + 7; + for (ng = start; ng != NULL; ng = STAILQ_NEXT(ng, entries)) { + filt_len += sudo_ldap_value_len(ng->name) + 20; + } + if ((filt = malloc(filt_len)) == NULL) + goto oom; + CHECK_STRLCPY(filt, "(&", filt_len); + CHECK_STRLCAT(filt, ldap_conf.netgroup_search_filter, filt_len); + CHECK_STRLCAT(filt, "(|", filt_len); + for (ng = start; ng != NULL; ng = STAILQ_NEXT(ng, entries)) { + CHECK_STRLCAT(filt, "(memberNisNetgroup=", filt_len); + CHECK_LDAP_VCAT(filt, ng->name, filt_len); + CHECK_STRLCAT(filt, ")", filt_len); + } + CHECK_STRLCAT(filt, "))", filt_len); + DPRINTF1("ldap netgroup search filter: '%s'", filt); + rc = ldap_search_ext_s(ld, base, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, timeout, 0, &result); + free(filt); + if (rc == LDAP_SUCCESS) { + LDAP_FOREACH(entry, ld, result) { + struct berval **bv; + + bv = sudo_ldap_get_values_len(ld, entry, "cn", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + goto oom; + } else { + /* Don't add a netgroup twice. */ + STAILQ_FOREACH(ng, netgroups, entries) { + /* Assumes only one cn per entry. */ + if (strcasecmp(ng->name, (*bv)->bv_val) == 0) + break; + } + if (ng == NULL) { + ng = malloc(sizeof(*ng)); + if (ng == NULL || + (ng->name = strdup((*bv)->bv_val)) == NULL) { + free(ng); + ldap_value_free_len(bv); + goto oom; + } +#ifdef __clang_analyzer__ + /* clang analyzer false positive */ + if (__builtin_expect(netgroups->stqh_last == NULL, 0)) + __builtin_trap(); +#endif + STAILQ_INSERT_TAIL(netgroups, ng, entries); + DPRINTF1("Found new netgroup %s for %s", ng->name, base); + } + ldap_value_free_len(bv); + } + } + } + ldap_msgfree(result); + + /* Check for nested netgroups in what we added. */ + start = old_tail ? STAILQ_NEXT(old_tail, entries) : STAILQ_FIRST(netgroups); + } while (start != NULL); + + debug_return_bool(true); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ldap_msgfree(result); + debug_return_bool(false); +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(filt); + debug_return_bool(false); +} + +/* + * Look up netgroups that the specified user is a member of. + * Appends new entries to the netgroups list. + * Return true on success or false if there was an internal overflow. + */ +static bool +sudo_netgroup_lookup(LDAP *ld, struct passwd *pw, + struct ldap_netgroup_list *netgroups) +{ + struct ldap_config_str *base; + struct ldap_netgroup *ng, *old_tail; + struct timeval tv, *tvp = NULL; + LDAPMessage *entry, *result = NULL; + const char *domain; + char *escaped_domain = NULL, *escaped_user = NULL; + char *escaped_host = NULL, *escaped_shost = NULL, *filt = NULL; + int filt_len, rc; + bool ret = false; + debug_decl(sudo_netgroup_lookup, SUDOERS_DEBUG_LDAP); + + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + + /* Use NIS domain if set, else wildcard match. */ + domain = sudo_getdomainname(); + + /* Escape the domain, host names, and user name per RFC 4515. */ + if (domain != NULL) { + if ((escaped_domain = sudo_ldap_value_dup(domain)) == NULL) + goto oom; + } + if ((escaped_user = sudo_ldap_value_dup(pw->pw_name)) == NULL) + goto oom; + if (def_netgroup_tuple) { + escaped_host = sudo_ldap_value_dup(user_runhost); + if (user_runhost == user_srunhost) + escaped_shost = escaped_host; + else + escaped_shost = sudo_ldap_value_dup(user_srunhost); + if (escaped_host == NULL || escaped_shost == NULL) + goto oom; + } + + /* Build query, using NIS domain if it is set. */ + if (domain != NULL) { + if (escaped_host != escaped_shost) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_shost, escaped_user, escaped_domain, + escaped_host, escaped_user, escaped_domain, escaped_user, + escaped_shost, escaped_user, escaped_host, escaped_user); + } else if (escaped_shost != NULL) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,%s\\29)" + "(nisNetgroupTriple=\\28%s,%s,%s\\29)" + "(nisNetgroupTriple=\\28,%s,\\29)" + "(nisNetgroupTriple=\\28%s,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_shost, escaped_user, escaped_domain, + escaped_user, escaped_shost, escaped_user); + } else { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28*,%s,%s\\29)" + "(nisNetgroupTriple=\\28*,%s,\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, + escaped_user); + } + } else { + if (escaped_host != escaped_shost) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, + escaped_shost, escaped_user, escaped_host, escaped_user); + } else if (escaped_shost != NULL) { + filt_len = asprintf(&filt, "(&%s(|" + "(nisNetgroupTriple=\\28,%s,*\\29)" + "(nisNetgroupTriple=\\28%s,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user, + escaped_shost, escaped_user); + } else { + filt_len = asprintf(&filt, + "(&%s(|(nisNetgroupTriple=\\28*,%s,*\\29)))", + ldap_conf.netgroup_search_filter, escaped_user); + } + } + if (filt_len == -1) + goto oom; + DPRINTF1("ldap netgroup search filter: '%s'", filt); + + STAILQ_FOREACH(base, &ldap_conf.netgroup_base, entries) { + DPRINTF1("searching from netgroup_base '%s'", base->val); + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc != LDAP_SUCCESS) { + DPRINTF1("ldap netgroup search failed: %s", ldap_err2string(rc)); + ldap_msgfree(result); + result = NULL; + continue; + } + + old_tail = STAILQ_LAST(netgroups, ldap_netgroup, entries); + LDAP_FOREACH(entry, ld, result) { + struct berval **bv; + + bv = sudo_ldap_get_values_len(ld, entry, "cn", &rc); + if (bv == NULL) { + if (rc == LDAP_NO_MEMORY) + goto oom; + } else { + /* Don't add a netgroup twice. */ + STAILQ_FOREACH(ng, netgroups, entries) { + /* Assumes only one cn per entry. */ + if (strcasecmp(ng->name, (*bv)->bv_val) == 0) + break; + } + if (ng == NULL) { + ng = malloc(sizeof(*ng)); + if (ng == NULL || + (ng->name = strdup((*bv)->bv_val)) == NULL) { + free(ng); + ldap_value_free_len(bv); + goto oom; + } + STAILQ_INSERT_TAIL(netgroups, ng, entries); + DPRINTF1("Found new netgroup %s for %s", ng->name, + base->val); + } + ldap_value_free_len(bv); + } + } + ldap_msgfree(result); + result = NULL; + + /* Check for nested netgroups in what we added. */ + ng = old_tail ? STAILQ_NEXT(old_tail, entries) : STAILQ_FIRST(netgroups); + if (ng != NULL) { + if (!sudo_netgroup_lookup_nested(ld, base->val, tvp, netgroups, ng)) + goto done; + } + } + ret = true; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +done: + free(escaped_domain); + free(escaped_user); + free(escaped_host); + if (escaped_host != escaped_shost) + free(escaped_shost); + free(filt); + ldap_msgfree(result); + debug_return_bool(ret); +} + +/* + * Builds up a filter to check against LDAP. + */ +static char * +sudo_ldap_build_pass1(LDAP *ld, struct passwd *pw) +{ + char *buf, timebuffer[TIMEFILTER_LENGTH + 1], idbuf[MAX_UID_T_LEN + 1]; + struct ldap_netgroup_list netgroups; + struct ldap_netgroup *ng = NULL; + struct gid_list *gidlist; + struct group_list *grlist; + struct group *grp; + size_t sz = 0; + int i; + debug_decl(sudo_ldap_build_pass1, SUDOERS_DEBUG_LDAP) + + STAILQ_INIT(&netgroups); + + /* If there is a filter, allocate space for the global AND. */ + if (ldap_conf.timed || ldap_conf.search_filter) + sz += 3; + + /* Add LDAP search filter if present. */ + if (ldap_conf.search_filter) + sz += strlen(ldap_conf.search_filter); + + /* Then add (|(sudoUser=USERNAME)(sudoUser=#uid)(sudoUser=ALL)) + NUL */ + sz += 29 + (12 + MAX_UID_T_LEN) + sudo_ldap_value_len(pw->pw_name); + + /* Add space for primary and supplementary groups and gids */ + if ((grp = sudo_getgrgid(pw->pw_gid)) != NULL) { + sz += 12 + sudo_ldap_value_len(grp->gr_name); + } + sz += 13 + MAX_UID_T_LEN; + if ((grlist = sudo_get_grlist(pw)) != NULL) { + for (i = 0; i < grlist->ngroups; i++) { + if (grp != NULL && strcasecmp(grlist->groups[i], grp->gr_name) == 0) + continue; + sz += 12 + sudo_ldap_value_len(grlist->groups[i]); + } + } + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (pw->pw_gid == gidlist->gids[i]) + continue; + sz += 13 + MAX_UID_T_LEN; + } + } + + /* Add space for user netgroups if netgroup_base specified. */ + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) { + DPRINTF1("Looking up netgroups for %s", pw->pw_name); + if (sudo_netgroup_lookup(ld, pw, &netgroups)) { + STAILQ_FOREACH(ng, &netgroups, entries) { + sz += 14 + strlen(ng->name); + } + } else { + /* sudo_netgroup_lookup() failed, clean up. */ + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + free(ng->name); + free(ng); + } + } + } + + /* If timed, add space for time limits. */ + if (ldap_conf.timed) + sz += TIMEFILTER_LENGTH; + if ((buf = malloc(sz)) == NULL) + goto bad; + *buf = '\0'; + + /* + * If timed or using a search filter, start a global AND clause to + * contain the search filter, search criteria, and time restriction. + */ + if (ldap_conf.timed || ldap_conf.search_filter) + CHECK_STRLCPY(buf, "(&", sz); + + if (ldap_conf.search_filter) + CHECK_STRLCAT(buf, ldap_conf.search_filter, sz); + + /* Global OR + sudoUser=user_name filter */ + CHECK_STRLCAT(buf, "(|(sudoUser=", sz); + CHECK_LDAP_VCAT(buf, pw->pw_name, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append user-ID */ + (void) snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int)pw->pw_uid); + CHECK_STRLCAT(buf, "(sudoUser=#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append primary group and group-ID */ + if (grp != NULL) { + CHECK_STRLCAT(buf, "(sudoUser=%", sz); + CHECK_LDAP_VCAT(buf, grp->gr_name, sz); + CHECK_STRLCAT(buf, ")", sz); + } + (void) snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int)pw->pw_gid); + CHECK_STRLCAT(buf, "(sudoUser=%#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + + /* Append supplementary groups and group-IDs */ + if (grlist != NULL) { + for (i = 0; i < grlist->ngroups; i++) { + if (grp != NULL && strcasecmp(grlist->groups[i], grp->gr_name) == 0) + continue; + CHECK_STRLCAT(buf, "(sudoUser=%", sz); + CHECK_LDAP_VCAT(buf, grlist->groups[i], sz); + CHECK_STRLCAT(buf, ")", sz); + } + } + if (gidlist != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (pw->pw_gid == gidlist->gids[i]) + continue; + (void) snprintf(idbuf, sizeof(idbuf), "%u", + (unsigned int)gidlist->gids[i]); + CHECK_STRLCAT(buf, "(sudoUser=%#", sz); + CHECK_STRLCAT(buf, idbuf, sz); + CHECK_STRLCAT(buf, ")", sz); + } + } + + /* Done with groups. */ + if (gidlist != NULL) + sudo_gidlist_delref(gidlist); + if (grlist != NULL) + sudo_grlist_delref(grlist); + if (grp != NULL) + sudo_gr_delref(grp); + + /* Add netgroups (if any), freeing the list as we go. */ + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + CHECK_STRLCAT(buf, "(sudoUser=+", sz); + CHECK_LDAP_VCAT(buf, ng->name, sz); + CHECK_STRLCAT(buf, ")", sz); + free(ng->name); + free(ng); + } + + /* Add ALL to list and end the global OR. */ + CHECK_STRLCAT(buf, "(sudoUser=ALL)", sz); + + /* Add the time restriction, or simply end the global OR. */ + if (ldap_conf.timed) { + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR */ + if (!sudo_ldap_timefilter(timebuffer, sizeof(timebuffer))) + goto bad; + CHECK_STRLCAT(buf, timebuffer, sz); + } else if (ldap_conf.search_filter) { + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR */ + } + CHECK_STRLCAT(buf, ")", sz); /* closes the global OR or the global AND */ + + debug_return_str(buf); +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + if (ng != NULL) { + /* Overflow while traversing netgroups. */ + free(ng->name); + free(ng); + } + errno = EOVERFLOW; +bad: + while ((ng = STAILQ_FIRST(&netgroups)) != NULL) { + STAILQ_REMOVE_HEAD(&netgroups, entries); + free(ng->name); + free(ng); + } + free(buf); + debug_return_str(NULL); +} + +/* + * Builds up a filter to check against non-Unix group + * entries in LDAP, including netgroups. + */ +static char * +sudo_ldap_build_pass2(void) +{ + char *filt, timebuffer[TIMEFILTER_LENGTH + 1]; + bool query_netgroups = def_use_netgroups; + int len; + debug_decl(sudo_ldap_build_pass2, SUDOERS_DEBUG_LDAP) + + /* No need to query netgroups if using netgroup_base. */ + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) + query_netgroups = false; + + /* Short circuit if no netgroups and no non-Unix groups. */ + if (!query_netgroups && !def_group_plugin) { + errno = ENOENT; + debug_return_str(NULL); + } + + if (ldap_conf.timed) { + if (!sudo_ldap_timefilter(timebuffer, sizeof(timebuffer))) + debug_return_str(NULL); + } + + /* + * Match all sudoUsers beginning with '+' or '%:'. + * If a search filter or time restriction is specified, + * those get ANDed in to the expression. + */ + if (query_netgroups && def_group_plugin) { + len = asprintf(&filt, "%s%s(|(sudoUser=+*)(sudoUser=%%:*))%s%s", + (ldap_conf.timed || ldap_conf.search_filter) ? "(&" : "", + ldap_conf.search_filter ? ldap_conf.search_filter : "", + ldap_conf.timed ? timebuffer : "", + (ldap_conf.timed || ldap_conf.search_filter) ? ")" : ""); + } else { + len = asprintf(&filt, "(&%s(sudoUser=*)(sudoUser=%s*)%s)", + ldap_conf.search_filter ? ldap_conf.search_filter : "", + query_netgroups ? "+" : "%:", + ldap_conf.timed ? timebuffer : ""); + } + if (len == -1) + filt = NULL; + + debug_return_str(filt); +} + +static char * +berval_iter(void **vp) +{ + struct berval **bv = *vp; + + *vp = bv + 1; + return *bv ? (*bv)->bv_val : NULL; +} + +static bool +ldap_to_sudoers(LDAP *ld, struct ldap_result *lres, + struct userspec_list *ldap_userspecs) +{ + struct userspec *us; + struct member *m; + unsigned int i; + int rc; + debug_decl(ldap_to_sudoers, SUDOERS_DEBUG_LDAP) + + /* We only have a single userspec */ + if ((us = calloc(1, sizeof(*us))) == NULL) + goto oom; + TAILQ_INIT(&us->users); + TAILQ_INIT(&us->privileges); + STAILQ_INIT(&us->comments); + TAILQ_INSERT_TAIL(ldap_userspecs, us, entries); + + /* The user has already matched, use ALL as wildcard. */ + if ((m = calloc(1, sizeof(*m))) == NULL) + goto oom; + m->type = ALL; + TAILQ_INSERT_TAIL(&us->users, m, entries); + + /* Treat each sudoRole as a separate privilege. */ + for (i = 0; i < lres->nentries; i++) { + LDAPMessage *entry = lres->entries[i].entry; + struct berval **cmnds = NULL, **hosts = NULL; + struct berval **runasusers = NULL, **runasgroups = NULL; + struct berval **opts = NULL, **notbefore = NULL, **notafter = NULL; + struct privilege *priv = NULL; + char *cn = NULL; + + /* Ignore sudoRole without sudoCommand. */ + cmnds = sudo_ldap_get_values_len(ld, entry, "sudoCommand", &rc); + if (cmnds == NULL) { + if (rc == LDAP_NO_MEMORY) + goto cleanup; + continue; + } + + /* Get the entry's dn for long format printing. */ + if ((cn = sudo_ldap_get_first_rdn(ld, entry)) == NULL) + goto cleanup; + + /* Get sudoHost */ + hosts = sudo_ldap_get_values_len(ld, entry, "sudoHost", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + /* Get sudoRunAsUser / sudoRunAsGroup */ + runasusers = sudo_ldap_get_values_len(ld, entry, "sudoRunAsUser", &rc); + if (runasusers == NULL) { + if (rc != LDAP_NO_MEMORY) + runasusers = sudo_ldap_get_values_len(ld, entry, "sudoRunAs", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + } + runasgroups = sudo_ldap_get_values_len(ld, entry, "sudoRunAsGroup", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + /* Get sudoNotBefore / sudoNotAfter */ + notbefore = sudo_ldap_get_values_len(ld, entry, "sudoNotBefore", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + notafter = sudo_ldap_get_values_len(ld, entry, "sudoNotAfter", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + /* Parse sudoOptions. */ + opts = sudo_ldap_get_values_len(ld, entry, "sudoOption", &rc); + if (rc == LDAP_NO_MEMORY) + goto cleanup; + + priv = sudo_ldap_role_to_priv(cn, hosts, runasusers, runasgroups, + cmnds, opts, notbefore ? notbefore[0]->bv_val : NULL, + notafter ? notafter[0]->bv_val : NULL, false, true, berval_iter); + + cleanup: + if (cn != NULL) + ldap_memfree(cn); + if (cmnds != NULL) + ldap_value_free_len(cmnds); + if (hosts != NULL) + ldap_value_free_len(hosts); + if (runasusers != NULL) + ldap_value_free_len(runasusers); + if (runasgroups != NULL) + ldap_value_free_len(runasgroups); + if (opts != NULL) + ldap_value_free_len(opts); + if (notbefore != NULL) + ldap_value_free_len(notbefore); + if (notafter != NULL) + ldap_value_free_len(notafter); + + if (priv == NULL) + goto oom; + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + debug_return_bool(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_userspecs(ldap_userspecs); + debug_return_bool(false); +} + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +typedef unsigned int (*sudo_gss_krb5_ccache_name_t)(unsigned int *minor_status, const char *name, const char **old_name); +static sudo_gss_krb5_ccache_name_t sudo_gss_krb5_ccache_name; + +static int +sudo_set_krb5_ccache_name(const char *name, const char **old_name) +{ + int ret = 0; + unsigned int junk; + static bool initialized; + debug_decl(sudo_set_krb5_ccache_name, SUDOERS_DEBUG_LDAP) + + if (!initialized) { + sudo_gss_krb5_ccache_name = (sudo_gss_krb5_ccache_name_t) + sudo_dso_findsym(SUDO_DSO_DEFAULT, "gss_krb5_ccache_name"); + initialized = true; + } + + /* + * Try to use gss_krb5_ccache_name() if possible. + * We also need to set KRB5CCNAME since some LDAP libs may not use + * gss_krb5_ccache_name(). + */ + if (sudo_gss_krb5_ccache_name != NULL) { + ret = sudo_gss_krb5_ccache_name(&junk, name, old_name); + } else { + /* No gss_krb5_ccache_name(), fall back on KRB5CCNAME. */ + if (old_name != NULL) + *old_name = sudo_getenv("KRB5CCNAME"); + } + if (name != NULL && *name != '\0') { + if (sudo_setenv("KRB5CCNAME", name, true) == -1) + ret = -1; + } else { + if (sudo_unsetenv("KRB5CCNAME") == -1) + ret = -1; + } + + debug_return_int(ret); +} + +/* + * Make a copy of the credential cache file specified by KRB5CCNAME + * which must be readable by the user. The resulting cache file + * is root-owned and will be removed after authenticating via SASL. + */ +static char * +sudo_krb5_copy_cc_file(const char *old_ccname) +{ + int nfd, ofd = -1; + ssize_t nread, nwritten = -1; + static char new_ccname[sizeof(_PATH_TMP) + sizeof("sudocc_XXXXXXXX") - 1]; + char buf[10240], *ret = NULL; + debug_decl(sudo_krb5_copy_cc_file, SUDOERS_DEBUG_LDAP) + + old_ccname = sudo_krb5_ccname_path(old_ccname); + if (old_ccname != NULL) { + /* Open credential cache as user to prevent stolen creds. */ + if (!set_perms(PERM_USER)) + goto done; + ofd = open(old_ccname, O_RDONLY|O_NONBLOCK); + if (!restore_perms()) + goto done; + + if (ofd != -1) { + (void) fcntl(ofd, F_SETFL, 0); + if (sudo_lock_file(ofd, SUDO_LOCK)) { + (void)snprintf(new_ccname, sizeof(new_ccname), "%s%s", + _PATH_TMP, "sudocc_XXXXXXXX"); + nfd = mkstemp(new_ccname); + if (nfd != -1) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "copy ccache %s -> %s", old_ccname, new_ccname); + while ((nread = read(ofd, buf, sizeof(buf))) > 0) { + ssize_t off = 0; + do { + nwritten = write(nfd, buf + off, nread - off); + if (nwritten == -1) { + sudo_warn("error writing to %s", new_ccname); + goto write_error; + } + off += nwritten; + } while (off < nread); + } + if (nread == -1) + sudo_warn("unable to read %s", new_ccname); +write_error: + close(nfd); + if (nread != -1 && nwritten != -1) { + ret = new_ccname; /* success! */ + } else { + unlink(new_ccname); /* failed */ + } + } else { + sudo_warn("unable to create temp file %s", new_ccname); + } + } + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to open %s", old_ccname); + } + } +done: + if (ofd != -1) + close(ofd); + debug_return_str(ret); +} + +static int +sudo_ldap_sasl_interact(LDAP *ld, unsigned int flags, void *_auth_id, + void *_interact) +{ + char *auth_id = (char *)_auth_id; + sasl_interact_t *interact = (sasl_interact_t *)_interact; + int ret = LDAP_SUCCESS; + debug_decl(sudo_ldap_sasl_interact, SUDOERS_DEBUG_LDAP) + + for (; interact->id != SASL_CB_LIST_END; interact++) { + if (interact->id != SASL_CB_USER) { + sudo_warnx("sudo_ldap_sasl_interact: unexpected interact id %lu", + interact->id); + ret = LDAP_PARAM_ERROR; + break; + } + + if (auth_id != NULL) + interact->result = auth_id; + else if (interact->defresult != NULL) + interact->result = interact->defresult; + else + interact->result = ""; + + interact->len = strlen(interact->result); +#if SASL_VERSION_MAJOR < 2 + interact->result = strdup(interact->result); + if (interact->result == NULL) { + ret = LDAP_NO_MEMORY; + break; + } +#endif /* SASL_VERSION_MAJOR < 2 */ + DPRINTF2("sudo_ldap_sasl_interact: SASL_CB_USER %s", + (const char *)interact->result); + } + debug_return_int(ret); +} +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +/* + * Create a new sudo_ldap_result structure. + */ +static struct ldap_result * +sudo_ldap_result_alloc(void) +{ + struct ldap_result *result; + debug_decl(sudo_ldap_result_alloc, SUDOERS_DEBUG_LDAP) + + result = calloc(1, sizeof(*result)); + if (result != NULL) + STAILQ_INIT(&result->searches); + + debug_return_ptr(result); +} + +/* + * Free the ldap result structure + */ +static void +sudo_ldap_result_free(struct ldap_result *lres) +{ + struct ldap_search_result *s; + debug_decl(sudo_ldap_result_free, SUDOERS_DEBUG_LDAP) + + if (lres != NULL) { + if (lres->nentries) { + free(lres->entries); + lres->entries = NULL; + } + while ((s = STAILQ_FIRST(&lres->searches)) != NULL) { + STAILQ_REMOVE_HEAD(&lres->searches, entries); + ldap_msgfree(s->searchresult); + free(s); + } + free(lres); + } + debug_return; +} + +/* + * Add a search result to the ldap_result structure. + */ +static struct ldap_search_result * +sudo_ldap_result_add_search(struct ldap_result *lres, LDAP *ldap, + LDAPMessage *searchresult) +{ + struct ldap_search_result *news; + debug_decl(sudo_ldap_result_add_search, SUDOERS_DEBUG_LDAP) + + /* Create new entry and add it to the end of the chain. */ + news = calloc(1, sizeof(*news)); + if (news != NULL) { + news->ldap = ldap; + news->searchresult = searchresult; + STAILQ_INSERT_TAIL(&lres->searches, news, entries); + } + + debug_return_ptr(news); +} + +/* + * Connect to the LDAP server specified by ld. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_bind_s(LDAP *ld) +{ + int ret; + debug_decl(sudo_ldap_bind_s, SUDOERS_DEBUG_LDAP) + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + if (ldap_conf.rootuse_sasl == true || + (ldap_conf.rootuse_sasl != false && ldap_conf.use_sasl == true)) { + const char *old_ccname = NULL; + const char *new_ccname = ldap_conf.krb5_ccname; + const char *tmp_ccname = NULL; + void *auth_id = ldap_conf.rootsasl_auth_id ? + ldap_conf.rootsasl_auth_id : ldap_conf.sasl_auth_id; + int rc; + + /* Make temp copy of the user's credential cache as needed. */ + if (ldap_conf.krb5_ccname == NULL && user_ccname != NULL) { + new_ccname = tmp_ccname = sudo_krb5_copy_cc_file(user_ccname); + if (tmp_ccname == NULL) { + /* XXX - fatal error */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "unable to copy user ccache %s", user_ccname); + } + } + + if (new_ccname != NULL) { + rc = sudo_set_krb5_ccache_name(new_ccname, &old_ccname); + if (rc == 0) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "set ccache name %s -> %s", + old_ccname ? old_ccname : "(none)", new_ccname); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "sudo_set_krb5_ccache_name() failed: %d", rc); + } + } + ret = ldap_sasl_interactive_bind_s(ld, ldap_conf.binddn, + ldap_conf.sasl_mech, NULL, NULL, LDAP_SASL_QUIET, + sudo_ldap_sasl_interact, auth_id); + if (new_ccname != NULL) { + rc = sudo_set_krb5_ccache_name(old_ccname ? old_ccname : "", NULL); + if (rc == 0) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "restore ccache name %s -> %s", new_ccname, + old_ccname ? old_ccname : "(none)"); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "sudo_set_krb5_ccache_name() failed: %d", rc); + } + /* Remove temporary copy of user's credential cache. */ + if (tmp_ccname != NULL) + unlink(tmp_ccname); + } + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_sasl_interactive_bind_s(): %s", + ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_sasl_interactive_bind_s() ok"); + } else +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ +#ifdef HAVE_LDAP_SASL_BIND_S + { + struct berval bv; + + bv.bv_val = ldap_conf.bindpw ? ldap_conf.bindpw : ""; + bv.bv_len = strlen(bv.bv_val); + + ret = ldap_sasl_bind_s(ld, ldap_conf.binddn, LDAP_SASL_SIMPLE, &bv, + NULL, NULL, NULL); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_sasl_bind_s(): %s", ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_sasl_bind_s() ok"); + } +#else + { + ret = ldap_simple_bind_s(ld, ldap_conf.binddn, ldap_conf.bindpw); + if (ret != LDAP_SUCCESS) { + sudo_warnx("ldap_simple_bind_s(): %s", ldap_err2string(ret)); + goto done; + } + DPRINTF1("ldap_simple_bind_s() ok"); + } +#endif +done: + debug_return_int(ret); +} + +/* + * Shut down the LDAP connection. + */ +static int +sudo_ldap_close(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + debug_decl(sudo_ldap_close, SUDOERS_DEBUG_LDAP) + + if (handle != NULL) { + /* Unbind and close the LDAP connection. */ + if (handle->ld != NULL) { + ldap_unbind_ext_s(handle->ld, NULL, NULL); + handle->ld = NULL; + } + + /* Free the handle container. */ + if (handle->pw != NULL) + sudo_pw_delref(handle->pw); + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + debug_return_int(0); +} + +/* + * Open a connection to the LDAP server. + * Returns 0 on success and non-zero on failure. + */ +static int +sudo_ldap_open(struct sudo_nss *nss) +{ + LDAP *ld; + int rc = -1; + bool ldapnoinit = false; + struct sudo_ldap_handle *handle; + debug_decl(sudo_ldap_open, SUDOERS_DEBUG_LDAP) + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_ldap_close(nss); + } + + if (!sudo_ldap_read_config()) + goto done; + + /* Prevent reading of user ldaprc and system defaults. */ + if (sudo_getenv("LDAPNOINIT") == NULL) { + if (sudo_setenv("LDAPNOINIT", "1", true) == 0) + ldapnoinit = true; + } + + /* Set global LDAP options */ + if (sudo_ldap_set_options_global() != LDAP_SUCCESS) + goto done; + + /* Connect to LDAP server */ +#ifdef HAVE_LDAP_INITIALIZE + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + char *buf = sudo_ldap_join_uri(&ldap_conf.uri); + if (buf == NULL) + goto done; + DPRINTF2("ldap_initialize(ld, %s)", buf); + rc = ldap_initialize(&ld, buf); + free(buf); + } else +#endif + rc = sudo_ldap_init(&ld, ldap_conf.host, ldap_conf.port); + if (rc != LDAP_SUCCESS) { + sudo_warnx(U_("unable to initialize LDAP: %s"), ldap_err2string(rc)); + goto done; + } + + /* Set LDAP per-connection options */ + rc = sudo_ldap_set_options_conn(ld); + if (rc != LDAP_SUCCESS) + goto done; + + if (ldapnoinit) + (void) sudo_unsetenv("LDAPNOINIT"); + + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) { +#if defined(HAVE_LDAP_START_TLS_S) + rc = ldap_start_tls_s(ld, NULL, NULL); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_start_tls_s(): %s", ldap_err2string(rc)); + goto done; + } + DPRINTF1("ldap_start_tls_s() ok"); +#elif defined(HAVE_LDAP_SSL_CLIENT_INIT) && defined(HAVE_LDAP_START_TLS_S_NP) + int sslrc; + rc = ldap_ssl_client_init(ldap_conf.tls_keyfile, ldap_conf.tls_keypw, + 0, &sslrc); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_ssl_client_init(): %s (SSL reason code %d)", + ldap_err2string(rc), sslrc); + goto done; + } + rc = ldap_start_tls_s_np(ld, NULL); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_start_tls_s_np(): %s", ldap_err2string(rc)); + goto done; + } + DPRINTF1("ldap_start_tls_s_np() ok"); +#else + sudo_warnx(U_("start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()")); +#endif /* !HAVE_LDAP_START_TLS_S && !HAVE_LDAP_START_TLS_S_NP */ + } + + /* Actually connect */ + rc = sudo_ldap_bind_s(ld); + if (rc != LDAP_SUCCESS) + goto done; + + /* Create a handle container. */ + handle = calloc(1, sizeof(struct sudo_ldap_handle)); + if (handle == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + rc = -1; + goto done; + } + handle->ld = ld; + /* handle->pw = NULL; */ + init_parse_tree(&handle->parse_tree, NULL, NULL); + nss->handle = handle; + +done: + debug_return_int(rc == LDAP_SUCCESS ? 0 : -1); +} + +static int +sudo_ldap_getdefs(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct timeval tv, *tvp = NULL; + struct ldap_config_str *base; + LDAPMessage *entry, *result = NULL; + char *filt = NULL; + int rc, ret = -1; + static bool cached; + debug_decl(sudo_ldap_getdefs, SUDOERS_DEBUG_LDAP) + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if present. */ + if (cached) + debug_return_int(0); + + filt = sudo_ldap_build_default_filter(); + if (filt == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + DPRINTF1("Looking for cn=defaults: %s", filt); + + STAILQ_FOREACH(base, &ldap_conf.base, entries) { + LDAP *ld = handle->ld; + + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + ldap_msgfree(result); + result = NULL; + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, + filt, NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc == LDAP_SUCCESS && (entry = ldap_first_entry(ld, result))) { + DPRINTF1("found:%s", ldap_get_dn(ld, entry)); + if (!sudo_ldap_parse_options(ld, entry, &handle->parse_tree.defaults)) + goto done; + } else { + DPRINTF1("no default options found in %s", base->val); + } + } + cached = true; + ret = 0; + +done: + ldap_msgfree(result); + free(filt); + + debug_return_int(ret); +} + +/* + * Comparison function for ldap_entry_wrapper structures, ascending order. + * This should match role_order_cmp() in parse_ldif.c. + */ +static int +ldap_entry_compare(const void *a, const void *b) +{ + const struct ldap_entry_wrapper *aw = a; + const struct ldap_entry_wrapper *bw = b; + debug_decl(ldap_entry_compare, SUDOERS_DEBUG_LDAP) + + debug_return_int(aw->order < bw->order ? -1 : + (aw->order > bw->order ? 1 : 0)); +} + +/* + * Return the last entry in the list of searches, usually the + * one currently being used to add entries. + */ +static struct ldap_search_result * +sudo_ldap_result_last_search(struct ldap_result *lres) +{ + debug_decl(sudo_ldap_result_last_search, SUDOERS_DEBUG_LDAP) + + debug_return_ptr(STAILQ_LAST(&lres->searches, ldap_search_result, entries)); +} + +/* + * Add an entry to the result structure. + */ +static struct ldap_entry_wrapper * +sudo_ldap_result_add_entry(struct ldap_result *lres, LDAPMessage *entry) +{ + struct ldap_search_result *last; + struct berval **bv; + double order = 0.0; + char *ep; + int rc; + debug_decl(sudo_ldap_result_add_entry, SUDOERS_DEBUG_LDAP) + + /* Determine whether the entry has the sudoOrder attribute. */ + last = sudo_ldap_result_last_search(lres); + if (last != NULL) { + bv = sudo_ldap_get_values_len(last->ldap, entry, "sudoOrder", &rc); + if (rc == LDAP_NO_MEMORY) { + /* XXX - return error */ + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + if (ldap_count_values_len(bv) > 0) { + /* Get the value of this attribute, 0 if not present. */ + DPRINTF2("order attribute raw: %s", (*bv)->bv_val); + order = strtod((*bv)->bv_val, &ep); + if (ep == (*bv)->bv_val || *ep != '\0') { + sudo_warnx(U_("invalid sudoOrder attribute: %s"), + (*bv)->bv_val); + order = 0.0; + } + DPRINTF2("order attribute: %f", order); + } + ldap_value_free_len(bv); + } + } + + /* + * Enlarge the array of entry wrappers as needed, preallocating blocks + * of 100 entries to save on allocation time. + */ + if (++lres->nentries > lres->allocated_entries) { + int allocated_entries = lres->allocated_entries + ALLOCATION_INCREMENT; + struct ldap_entry_wrapper *entries = reallocarray(lres->entries, + allocated_entries, sizeof(lres->entries[0])); + if (entries == NULL) + debug_return_ptr(NULL); + lres->allocated_entries = allocated_entries; + lres->entries = entries; + } + + /* Fill in the new entry and return it. */ + lres->entries[lres->nentries - 1].entry = entry; + lres->entries[lres->nentries - 1].order = order; + + debug_return_ptr(&lres->entries[lres->nentries - 1]); +} + +/* + * Perform the LDAP query for the user. The caller is responsible for + * freeing the result with sudo_ldap_result_free(). + */ +static struct ldap_result * +sudo_ldap_result_get(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct ldap_config_str *base; + struct ldap_result *lres; + struct timeval tv, *tvp = NULL; + LDAPMessage *entry, *result; + LDAP *ld = handle->ld; + char *filt = NULL; + int pass, rc; + debug_decl(sudo_ldap_result_get, SUDOERS_DEBUG_LDAP) + + /* + * Okay - time to search for anything that matches this user + * Lets limit it to only two queries of the LDAP server + * + * The first pass will look by the username, groups, and + * the keyword ALL. We will then inspect the results that + * came back from the query. We don't need to inspect the + * sudoUser in this pass since the LDAP server already scanned + * it for us. + * + * The second pass will return all the entries that contain non- + * Unix groups, including netgroups. Then we take the non-Unix + * groups returned and try to match them against the username. + * + * Since we have to sort the possible entries before we make a + * decision, we perform the queries and store all of the results in + * an ldap_result object. The results are then sorted by sudoOrder. + */ + lres = sudo_ldap_result_alloc(); + if (lres == NULL) + goto oom; + for (pass = 0; pass < 2; pass++) { + filt = pass ? sudo_ldap_build_pass2() : sudo_ldap_build_pass1(ld, pw); + if (filt != NULL) { + DPRINTF1("ldap search '%s'", filt); + STAILQ_FOREACH(base, &ldap_conf.base, entries) { + DPRINTF1("searching from base '%s'", + base->val); + if (ldap_conf.timeout > 0) { + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + tvp = &tv; + } + result = NULL; + rc = ldap_search_ext_s(ld, base->val, LDAP_SCOPE_SUBTREE, filt, + NULL, 0, NULL, NULL, tvp, 0, &result); + if (rc != LDAP_SUCCESS) { + DPRINTF1("ldap search pass %d failed: %s", pass + 1, + ldap_err2string(rc)); + continue; + } + + /* Add the search result to list of search results. */ + DPRINTF1("adding search result"); + if (sudo_ldap_result_add_search(lres, ld, result) == NULL) + goto oom; + LDAP_FOREACH(entry, ld, result) { + if (pass != 0) { + /* Check non-unix group in 2nd pass. */ + switch (sudo_ldap_check_non_unix_group(ld, entry, pw)) { + case -1: + goto oom; + case false: + continue; + default: + break; + } + } + if (sudo_ldap_result_add_entry(lres, entry) == NULL) + goto oom; + } + DPRINTF1("result now has %d entries", lres->nentries); + } + free(filt); + filt = NULL; + } else if (errno != ENOENT) { + /* Out of memory? */ + goto oom; + } + } + + /* Sort the entries by the sudoOrder attribute. */ + if (lres->nentries != 0) { + DPRINTF1("sorting remaining %d entries", lres->nentries); + qsort(lres->entries, lres->nentries, sizeof(lres->entries[0]), + ldap_entry_compare); + } + + debug_return_ptr(lres); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(filt); + sudo_ldap_result_free(lres); + debug_return_ptr(NULL); +} + +/* + * Perform LDAP query for user and host and convert to sudoers + * parse tree. + */ +static int +sudo_ldap_query(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_ldap_handle *handle = nss->handle; + struct ldap_result *lres = NULL; + int ret = -1; + debug_decl(sudo_ldap_query, SUDOERS_DEBUG_LDAP) + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if it matches pw. */ + if (handle->pw != NULL) { + if (pw == handle->pw) { + ret = 0; + goto done; + } + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + + /* Free old userspecs, if any. */ + free_userspecs(&handle->parse_tree.userspecs); + + DPRINTF1("%s: ldap search user %s, host %s", __func__, pw->pw_name, + user_runhost); + if ((lres = sudo_ldap_result_get(nss, pw)) == NULL) + goto done; + + /* Convert to sudoers parse tree. */ + if (!ldap_to_sudoers(handle->ld, lres, &handle->parse_tree.userspecs)) + goto done; + + /* Stash a ref to the passwd struct in the handle. */ + sudo_pw_addref(pw); + handle->pw = pw; + + ret = 0; + +done: + /* Cleanup. */ + sudo_ldap_result_free(lres); + if (ret == -1) + free_userspecs(&handle->parse_tree.userspecs); + debug_return_int(ret); +} + +/* + * Return the initialized (but empty) sudoers parse tree. + * The contents will be populated by the getdefs() and query() functions. + */ +static struct sudoers_parse_tree * +sudo_ldap_parse(struct sudo_nss *nss) +{ + struct sudo_ldap_handle *handle = nss->handle; + debug_decl(sudo_ldap_parse, SUDOERS_DEBUG_LDAP) + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_ptr(NULL); + } + + debug_return_ptr(&handle->parse_tree); +} + +#if 0 +/* + * Create an ldap_result from an LDAP search result. + * + * This function is currently not used anywhere, it is left here as + * an example of how to use the cached searches. + */ +static struct ldap_result * +sudo_ldap_result_from_search(LDAP *ldap, LDAPMessage *searchresult) +{ + struct ldap_search_result *last; + struct ldap_result *result; + LDAPMessage *entry; + + /* + * An ldap_result is built from several search results, which are + * organized in a list. The head of the list is maintained in the + * ldap_result structure, together with the wrappers that point + * to individual entries, this has to be initialized first. + */ + result = sudo_ldap_result_alloc(); + if (result == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + /* + * Build a new list node for the search result, this creates the + * list node. + */ + last = sudo_ldap_result_add_search(result, ldap, searchresult); + + /* + * Now add each entry in the search result to the array of of entries + * in the ldap_result object. + */ + LDAP_FOREACH(entry, last->ldap, last->searchresult) { + if (sudo_ldap_result_add_entry(result, entry) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_ldap_result_free(result); + result = NULL; + break; + } + } + DPRINTF1("sudo_ldap_result_from_search: %d entries found", + result ? result->nentries : -1); + return result; +} +#endif + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_ldap = { + { NULL, NULL }, + sudo_ldap_open, + sudo_ldap_close, + sudo_ldap_parse, + sudo_ldap_query, + sudo_ldap_getdefs +}; diff --git a/utsudo-0.0.2/plugins/sudoers/ldap_conf.c b/utsudo-0.0.2/plugins/sudoers/ldap_conf.c new file mode 100644 index 0000000..52da45d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ldap_conf.c @@ -0,0 +1,937 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2019 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#ifdef HAVE_LBER_H +# include +#endif +#include +#if defined(HAVE_LDAP_SSL_H) +# include +#elif defined(HAVE_MPS_LDAP_SSL_H) +# include +#endif + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_ldap_conf.h" + +/* Older Netscape LDAP SDKs don't prototype ldapssl_set_strength() */ +#if defined(HAVE_LDAPSSL_SET_STRENGTH) && !defined(HAVE_LDAP_SSL_H) && !defined(HAVE_MPS_LDAP_SSL_H) +extern int ldapssl_set_strength(LDAP *ldap, int strength); +#endif + +#if !defined(LDAP_OPT_NETWORK_TIMEOUT) && defined(LDAP_OPT_CONNECT_TIMEOUT) +# define LDAP_OPT_NETWORK_TIMEOUT LDAP_OPT_CONNECT_TIMEOUT +#endif + +#ifndef LDAP_OPT_SUCCESS +# define LDAP_OPT_SUCCESS LDAP_SUCCESS +#endif + +#ifndef LDAPS_PORT +# define LDAPS_PORT 636 +#endif + +/* Default search filter. */ +#define DEFAULT_SEARCH_FILTER "(objectClass=sudoRole)" + +/* Default netgroup search filter. */ +#define DEFAULT_NETGROUP_SEARCH_FILTER "(objectClass=nisNetgroup)" + +/* LDAP configuration structure */ +struct ldap_config ldap_conf; + +static struct ldap_config_table ldap_conf_global[] = { + { "sudoers_debug", CONF_INT, -1, &ldap_conf.debug }, + { "host", CONF_STR, -1, &ldap_conf.host }, + { "port", CONF_INT, -1, &ldap_conf.port }, + { "ssl", CONF_STR, -1, &ldap_conf.ssl }, + { "sslpath", CONF_STR, -1, &ldap_conf.tls_certfile }, + { "uri", CONF_LIST_STR, -1, &ldap_conf.uri }, +#ifdef LDAP_OPT_DEBUG_LEVEL + { "debug", CONF_INT, LDAP_OPT_DEBUG_LEVEL, &ldap_conf.ldap_debug }, +#endif +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + { "tls_checkpeer", CONF_BOOL, LDAP_OPT_X_TLS_REQUIRE_CERT, + &ldap_conf.tls_checkpeer }, + { "tls_reqcert", CONF_REQCERT_VAL, LDAP_OPT_X_TLS_REQUIRE_CERT, + &ldap_conf.tls_reqcert }, +#else + { "tls_checkpeer", CONF_BOOL, -1, &ldap_conf.tls_checkpeer }, +#endif +#ifdef LDAP_OPT_X_TLS_CACERTFILE + { "tls_cacertfile", CONF_STR, LDAP_OPT_X_TLS_CACERTFILE, + &ldap_conf.tls_cacertfile }, + { "tls_cacert", CONF_STR, LDAP_OPT_X_TLS_CACERTFILE, + &ldap_conf.tls_cacertfile }, +#endif +#ifdef LDAP_OPT_X_TLS_CACERTDIR + { "tls_cacertdir", CONF_STR, LDAP_OPT_X_TLS_CACERTDIR, + &ldap_conf.tls_cacertdir }, +#endif +#ifdef LDAP_OPT_X_TLS_RANDOM_FILE + { "tls_randfile", CONF_STR, LDAP_OPT_X_TLS_RANDOM_FILE, + &ldap_conf.tls_random_file }, +#endif +#ifdef LDAP_OPT_X_TLS_CIPHER_SUITE + { "tls_ciphers", CONF_STR, LDAP_OPT_X_TLS_CIPHER_SUITE, + &ldap_conf.tls_cipher_suite }, +#elif defined(LDAP_OPT_SSL_CIPHER) + { "tls_ciphers", CONF_STR, LDAP_OPT_SSL_CIPHER, + &ldap_conf.tls_cipher_suite }, +#endif +#ifdef LDAP_OPT_X_TLS_CERTFILE + { "tls_cert", CONF_STR, LDAP_OPT_X_TLS_CERTFILE, + &ldap_conf.tls_certfile }, +#else + { "tls_cert", CONF_STR, -1, &ldap_conf.tls_certfile }, +#endif +#ifdef LDAP_OPT_X_TLS_KEYFILE + { "tls_key", CONF_STR, LDAP_OPT_X_TLS_KEYFILE, + &ldap_conf.tls_keyfile }, +#else + { "tls_key", CONF_STR, -1, &ldap_conf.tls_keyfile }, +#endif +#ifdef HAVE_LDAP_SSL_CLIENT_INIT + { "tls_keypw", CONF_STR, -1, &ldap_conf.tls_keypw }, +#endif + { "binddn", CONF_STR, -1, &ldap_conf.binddn }, + { "bindpw", CONF_STR, -1, &ldap_conf.bindpw }, + { "rootbinddn", CONF_STR, -1, &ldap_conf.rootbinddn }, + { "sudoers_base", CONF_LIST_STR, -1, &ldap_conf.base }, + { "sudoers_timed", CONF_BOOL, -1, &ldap_conf.timed }, + { "sudoers_search_filter", CONF_STR, -1, &ldap_conf.search_filter }, + { "netgroup_base", CONF_LIST_STR, -1, &ldap_conf.netgroup_base }, + { "netgroup_search_filter", CONF_STR, -1, &ldap_conf.netgroup_search_filter }, +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + { "use_sasl", CONF_BOOL, -1, &ldap_conf.use_sasl }, + { "sasl_mech", CONF_STR, -1, &ldap_conf.sasl_mech }, + { "sasl_auth_id", CONF_STR, -1, &ldap_conf.sasl_auth_id }, + { "rootuse_sasl", CONF_BOOL, -1, &ldap_conf.rootuse_sasl }, + { "rootsasl_auth_id", CONF_STR, -1, &ldap_conf.rootsasl_auth_id }, + { "krb5_ccname", CONF_STR, -1, &ldap_conf.krb5_ccname }, +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + { NULL } +}; + +static struct ldap_config_table ldap_conf_conn[] = { +#ifdef LDAP_OPT_PROTOCOL_VERSION + { "ldap_version", CONF_INT, LDAP_OPT_PROTOCOL_VERSION, + &ldap_conf.version }, +#endif +#ifdef LDAP_OPT_NETWORK_TIMEOUT + { "bind_timelimit", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.bind_timelimit }, + { "network_timeout", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.bind_timelimit }, +#elif defined(LDAP_X_OPT_CONNECT_TIMEOUT) + { "bind_timelimit", CONF_INT, LDAP_X_OPT_CONNECT_TIMEOUT, + &ldap_conf.bind_timelimit }, + { "network_timeout", CONF_INT, LDAP_X_OPT_CONNECT_TIMEOUT, + &ldap_conf.bind_timelimit }, +#endif + { "timelimit", CONF_INT, LDAP_OPT_TIMELIMIT, &ldap_conf.timelimit }, +#ifdef LDAP_OPT_TIMEOUT + { "timeout", CONF_INT, -1 /* needs timeval, set manually */, + &ldap_conf.timeout }, +#endif +#ifdef LDAP_OPT_DEREF + { "deref", CONF_DEREF_VAL, LDAP_OPT_DEREF, &ldap_conf.deref }, +#endif +#ifdef LDAP_OPT_X_SASL_SECPROPS + { "sasl_secprops", CONF_STR, LDAP_OPT_X_SASL_SECPROPS, + &ldap_conf.sasl_secprops }, +#endif + { NULL } +}; + +#ifdef HAVE_LDAP_CREATE +/* + * Rebuild the hosts list and include a specific port for each host. + * ldap_create() does not take a default port parameter so we must + * append one if we want something other than LDAP_PORT. + */ +static bool +sudo_ldap_conf_add_ports(void) +{ + char *host, *last, *port, defport[13]; + char hostbuf[LINE_MAX * 2]; + int len; + debug_decl(sudo_ldap_conf_add_ports, SUDOERS_DEBUG_LDAP) + + hostbuf[0] = '\0'; + len = snprintf(defport, sizeof(defport), ":%d", ldap_conf.port); + if (len < 0 || len >= ssizeof(defport)) { + sudo_warnx(U_("sudo_ldap_conf_add_ports: port too large")); + debug_return_bool(false); + } + + for ((host = strtok_r(ldap_conf.host, " \t", &last)); host; (host = strtok_r(NULL, " \t", &last))) { + if (hostbuf[0] != '\0') + CHECK_STRLCAT(hostbuf, " ", sizeof(hostbuf)); + CHECK_STRLCAT(hostbuf, host, sizeof(hostbuf)); + + /* Append port if there is not one already. */ + if ((port = strrchr(host, ':')) == NULL || + !isdigit((unsigned char)port[1])) { + CHECK_STRLCAT(hostbuf, defport, sizeof(hostbuf)); + } + } + + free(ldap_conf.host); + if ((ldap_conf.host = strdup(hostbuf)) == NULL) + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(ldap_conf.host != NULL); + +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_bool(false); +} +#endif + +#ifndef HAVE_LDAP_INITIALIZE +/* + * For each uri, convert to host:port pairs. For ldaps:// enable SSL + * Accepts: uris of the form ldap:/// or ldap://hostname:portnum/ + * where the trailing slash is optional. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_parse_uri(const struct ldap_config_str_list *uri_list) +{ + const struct ldap_config_str *entry; + char *buf, hostbuf[LINE_MAX]; + int nldap = 0, nldaps = 0; + int ret = -1; + debug_decl(sudo_ldap_parse_uri, SUDOERS_DEBUG_LDAP) + + hostbuf[0] = '\0'; + STAILQ_FOREACH(entry, uri_list, entries) { + char *cp, *host, *last, *port, *uri; + + buf = strdup(entry->val); + if (buf == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + for ((uri = strtok_r(buf, " \t", &last)); uri != NULL; (uri = strtok_r(NULL, " \t", &last))) { + if (strncasecmp(uri, "ldap://", 7) == 0) { + nldap++; + host = uri + 7; + } else if (strncasecmp(uri, "ldaps://", 8) == 0) { + nldaps++; + host = uri + 8; + } else { + sudo_warnx(U_("unsupported LDAP uri type: %s"), uri); + goto done; + } + + /* trim optional trailing slash */ + if ((cp = strrchr(host, '/')) != NULL && cp[1] == '\0') { + *cp = '\0'; + } + + if (hostbuf[0] != '\0') + CHECK_STRLCAT(hostbuf, " ", sizeof(hostbuf)); + + if (*host == '\0') + host = "localhost"; /* no host specified, use localhost */ + + CHECK_STRLCAT(hostbuf, host, sizeof(hostbuf)); + + /* If using SSL and no port specified, add port 636 */ + if (nldaps) { + if ((port = strrchr(host, ':')) == NULL || + !isdigit((unsigned char)port[1])) + CHECK_STRLCAT(hostbuf, ":636", sizeof(hostbuf)); + } + } + + if (nldaps != 0) { + if (nldap != 0) { + sudo_warnx(U_("unable to mix ldap and ldaps URIs")); + goto done; + } + if (ldap_conf.ssl_mode == SUDO_LDAP_STARTTLS) + sudo_warnx(U_("starttls not supported when using ldaps")); + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + free(buf); + } + buf = NULL; + + /* Store parsed URI(s) in host for ldap_create() or ldap_init(). */ + free(ldap_conf.host); + if ((ldap_conf.host = strdup(hostbuf)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + + ret = LDAP_SUCCESS; + +done: + free(buf); + debug_return_int(ret); + +overflow: + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(buf); + debug_return_int(-1); +} +#endif /* HAVE_LDAP_INITIALIZE */ + +/* + * Decode a secret if it is base64 encoded, else return NULL. + */ +static char * +sudo_ldap_decode_secret(const char *secret) +{ + unsigned char *result = NULL; + size_t len, reslen; + debug_decl(sudo_ldap_decode_secret, SUDOERS_DEBUG_LDAP) + + if (strncasecmp(secret, "base64:", sizeof("base64:") - 1) == 0) { + /* + * Decode a base64 secret. The decoded length is 3/4 the encoded + * length but padding may be missing so round up to a multiple of 4. + */ + secret += sizeof("base64:") - 1; + reslen = ((strlen(secret) + 3) / 4 * 3); + result = malloc(reslen + 1); + if (result == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } else { + len = base64_decode(secret, result, reslen); + if (len == (size_t)-1) { + free(result); + result = NULL; + } else { + result[len] = '\0'; + } + } + } + debug_return_str((char *)result); +} + +static void +sudo_ldap_read_secret(const char *path) +{ + FILE *fp; + char *line = NULL; + size_t linesize = 0; + ssize_t len; + debug_decl(sudo_ldap_read_secret, SUDOERS_DEBUG_LDAP) + + if ((fp = fopen(path_ldap_secret, "r")) != NULL) { + len = getdelim(&line, &linesize, '\n', fp); + if (len != -1) { + /* trim newline */ + while (len > 0 && line[len - 1] == '\n') + line[--len] = '\0'; + /* copy to bindpw and binddn */ + free(ldap_conf.bindpw); + ldap_conf.bindpw = sudo_ldap_decode_secret(line); + if (ldap_conf.bindpw == NULL) { + /* not base64 encoded, use directly */ + ldap_conf.bindpw = line; + line = NULL; + } + free(ldap_conf.binddn); + ldap_conf.binddn = ldap_conf.rootbinddn; + ldap_conf.rootbinddn = NULL; + } + fclose(fp); + free(line); + } + debug_return; +} + +/* + * Look up keyword in config tables. + * Returns true if found, else false. + */ +static bool +sudo_ldap_parse_keyword(const char *keyword, const char *value, + struct ldap_config_table *table) +{ + struct ldap_config_table *cur; + const char *errstr; + debug_decl(sudo_ldap_parse_keyword, SUDOERS_DEBUG_LDAP) + + /* Look up keyword in config tables */ + for (cur = table; cur->conf_str != NULL; cur++) { + if (strcasecmp(keyword, cur->conf_str) == 0) { + switch (cur->type) { + case CONF_DEREF_VAL: + if (strcasecmp(value, "searching") == 0) + *(int *)(cur->valp) = LDAP_DEREF_SEARCHING; + else if (strcasecmp(value, "finding") == 0) + *(int *)(cur->valp) = LDAP_DEREF_FINDING; + else if (strcasecmp(value, "always") == 0) + *(int *)(cur->valp) = LDAP_DEREF_ALWAYS; + else + *(int *)(cur->valp) = LDAP_DEREF_NEVER; + break; + case CONF_REQCERT_VAL: +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + if (strcasecmp(value, "never") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_NEVER; + else if (strcasecmp(value, "allow") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_ALLOW; + else if (strcasecmp(value, "try") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_TRY; + else if (strcasecmp(value, "hard") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_HARD; + else if (strcasecmp(value, "demand") == 0) + *(int *)(cur->valp) = LDAP_OPT_X_TLS_DEMAND; +#endif /* LDAP_OPT_X_TLS_REQUIRE_CERT */ + break; + case CONF_BOOL: + *(int *)(cur->valp) = sudo_strtobool(value) == true; + break; + case CONF_INT: + *(int *)(cur->valp) = sudo_strtonum(value, INT_MIN, INT_MAX, + &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s: %s: %s"), + path_ldap_conf, keyword, value, U_(errstr)); + } + break; + case CONF_STR: + { + char *cp = NULL; + + free(*(char **)(cur->valp)); + if (*value && (cp = strdup(value)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + *(char **)(cur->valp) = cp; + break; + } + case CONF_LIST_STR: + { + struct ldap_config_str_list *head; + struct ldap_config_str *str; + size_t len = strlen(value); + + if (len > 0) { + head = (struct ldap_config_str_list *)cur->valp; + if ((str = malloc(sizeof(*str) + len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + memcpy(str->val, value, len + 1); + STAILQ_INSERT_TAIL(head, str, entries); + } + } + break; + } + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S +const char * +sudo_krb5_ccname_path(const char *old_ccname) +{ + const char *ccname = old_ccname; + debug_decl(sudo_krb5_ccname_path, SUDOERS_DEBUG_LDAP) + + /* Strip off leading FILE: or WRFILE: prefix. */ + switch (ccname[0]) { + case 'F': + case 'f': + if (strncasecmp(ccname, "FILE:", 5) == 0) + ccname += 5; + break; + case 'W': + case 'w': + if (strncasecmp(ccname, "WRFILE:", 7) == 0) + ccname += 7; + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "ccache %s -> %s", old_ccname, ccname); + + /* Credential cache must be a fully-qualified path name. */ + debug_return_const_str(*ccname == '/' ? ccname : NULL); +} + +static bool +sudo_check_krb5_ccname(const char *ccname) +{ + int fd = -1; + const char *ccname_path; + debug_decl(sudo_check_krb5_ccname, SUDOERS_DEBUG_LDAP) + + /* Strip off prefix to get path name. */ + ccname_path = sudo_krb5_ccname_path(ccname); + if (ccname_path == NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unsupported krb5 credential cache path: %s", ccname); + debug_return_bool(false); + } + /* Make sure credential cache is fully-qualified and exists. */ + fd = open(ccname_path, O_RDONLY|O_NONBLOCK, 0); + if (fd == -1) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "unable to open krb5 credential cache: %s", ccname_path); + debug_return_bool(false); + } + close(fd); + sudo_debug_printf(SUDO_DEBUG_INFO, + "using krb5 credential cache: %s", ccname_path); + debug_return_bool(true); +} +#endif /* HAVE_LDAP_SASL_INTERACTIVE_BIND_S */ + +bool +sudo_ldap_read_config(void) +{ + char *cp, *keyword, *value, *line = NULL; + struct ldap_config_str *conf_str; + size_t linesize = 0; + FILE *fp; + debug_decl(sudo_ldap_read_config, SUDOERS_DEBUG_LDAP) + + /* defaults */ + ldap_conf.version = 3; + ldap_conf.port = -1; + ldap_conf.tls_checkpeer = -1; + ldap_conf.tls_reqcert = -1; + ldap_conf.timelimit = -1; + ldap_conf.timeout = -1; + ldap_conf.bind_timelimit = -1; + ldap_conf.use_sasl = -1; + ldap_conf.rootuse_sasl = -1; + ldap_conf.deref = -1; + ldap_conf.search_filter = strdup(DEFAULT_SEARCH_FILTER); + ldap_conf.netgroup_search_filter = strdup(DEFAULT_NETGROUP_SEARCH_FILTER); + STAILQ_INIT(&ldap_conf.uri); + STAILQ_INIT(&ldap_conf.base); + STAILQ_INIT(&ldap_conf.netgroup_base); + + if (ldap_conf.search_filter == NULL || ldap_conf.netgroup_search_filter == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + + if ((fp = fopen(path_ldap_conf, "r")) == NULL) + debug_return_bool(false); + + while (sudo_parseln(&line, &linesize, NULL, fp, PARSELN_COMM_BOL|PARSELN_CONT_IGN) != -1) { + if (*line == '\0') + continue; /* skip empty line */ + + /* split into keyword and value */ + keyword = cp = line; + while (*cp && !isblank((unsigned char) *cp)) + cp++; + if (*cp) + *cp++ = '\0'; /* terminate keyword */ + + /* skip whitespace before value */ + while (isblank((unsigned char) *cp)) + cp++; + value = cp; + + /* Look up keyword in config tables */ + if (!sudo_ldap_parse_keyword(keyword, value, ldap_conf_global)) + sudo_ldap_parse_keyword(keyword, value, ldap_conf_conn); + } + free(line); + fclose(fp); + + if (!ldap_conf.host) { + ldap_conf.host = strdup("localhost"); + if (ldap_conf.host == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + } + + DPRINTF1("LDAP Config Summary"); + DPRINTF1("==================="); + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + STAILQ_FOREACH(conf_str, &ldap_conf.uri, entries) { + DPRINTF1("uri %s", conf_str->val); + } + } else { + DPRINTF1("host %s", + ldap_conf.host ? ldap_conf.host : "(NONE)"); + DPRINTF1("port %d", ldap_conf.port); + } + DPRINTF1("ldap_version %d", ldap_conf.version); + + if (!STAILQ_EMPTY(&ldap_conf.base)) { + STAILQ_FOREACH(conf_str, &ldap_conf.base, entries) { + DPRINTF1("sudoers_base %s", conf_str->val); + } + } else { + DPRINTF1("sudoers_base %s", "(NONE: LDAP disabled)"); + } + if (ldap_conf.search_filter) { + DPRINTF1("search_filter %s", ldap_conf.search_filter); + } + if (!STAILQ_EMPTY(&ldap_conf.netgroup_base)) { + STAILQ_FOREACH(conf_str, &ldap_conf.netgroup_base, entries) { + DPRINTF1("netgroup_base %s", conf_str->val); + } + } else { + DPRINTF1("netgroup_base %s", "(NONE: will use nsswitch)"); + } + if (ldap_conf.netgroup_search_filter) { + DPRINTF1("netgroup_search_filter %s", ldap_conf.netgroup_search_filter); + } + DPRINTF1("binddn %s", + ldap_conf.binddn ? ldap_conf.binddn : "(anonymous)"); + DPRINTF1("bindpw %s", + ldap_conf.bindpw ? ldap_conf.bindpw : "(anonymous)"); + if (ldap_conf.bind_timelimit > 0) { + DPRINTF1("bind_timelimit %d", ldap_conf.bind_timelimit); + } + if (ldap_conf.timelimit > 0) { + DPRINTF1("timelimit %d", ldap_conf.timelimit); + } + if (ldap_conf.deref != -1) { + DPRINTF1("deref %d", ldap_conf.deref); + } + DPRINTF1("ssl %s", ldap_conf.ssl ? ldap_conf.ssl : "(no)"); + if (ldap_conf.tls_checkpeer != -1) { + DPRINTF1("tls_checkpeer %s", + ldap_conf.tls_checkpeer ? "(yes)" : "(no)"); + } +#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT + if (ldap_conf.tls_reqcert != -1) { + DPRINTF1("tls_reqcert %s", + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_NEVER ? "hard" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_ALLOW ? "allow" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_TRY ? "try" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_HARD ? "hard" : + ldap_conf.tls_reqcert == LDAP_OPT_X_TLS_DEMAND ? "demand" : + "unknown"); + } +#endif /* LDAP_OPT_X_TLS_REQUIRE_CERT */ + if (ldap_conf.tls_cacertfile != NULL) { + DPRINTF1("tls_cacertfile %s", ldap_conf.tls_cacertfile); + } + if (ldap_conf.tls_cacertdir != NULL) { + DPRINTF1("tls_cacertdir %s", ldap_conf.tls_cacertdir); + } + if (ldap_conf.tls_random_file != NULL) { + DPRINTF1("tls_random_file %s", ldap_conf.tls_random_file); + } + if (ldap_conf.tls_cipher_suite != NULL) { + DPRINTF1("tls_cipher_suite %s", ldap_conf.tls_cipher_suite); + } + if (ldap_conf.tls_certfile != NULL) { + DPRINTF1("tls_certfile %s", ldap_conf.tls_certfile); + } + if (ldap_conf.tls_keyfile != NULL) { + DPRINTF1("tls_keyfile %s", ldap_conf.tls_keyfile); + } +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + if (ldap_conf.use_sasl != -1) { + if (ldap_conf.sasl_mech == NULL) { + /* Default mechanism is GSSAPI. */ + ldap_conf.sasl_mech = strdup("GSSAPI"); + if (ldap_conf.sasl_mech == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } + DPRINTF1("use_sasl %s", ldap_conf.use_sasl ? "yes" : "no"); + DPRINTF1("sasl_mech %s", ldap_conf.sasl_mech); + DPRINTF1("sasl_auth_id %s", + ldap_conf.sasl_auth_id ? ldap_conf.sasl_auth_id : "(NONE)"); + DPRINTF1("rootuse_sasl %d", + ldap_conf.rootuse_sasl); + DPRINTF1("rootsasl_auth_id %s", + ldap_conf.rootsasl_auth_id ? ldap_conf.rootsasl_auth_id : "(NONE)"); + DPRINTF1("sasl_secprops %s", + ldap_conf.sasl_secprops ? ldap_conf.sasl_secprops : "(NONE)"); + DPRINTF1("krb5_ccname %s", + ldap_conf.krb5_ccname ? ldap_conf.krb5_ccname : "(NONE)"); + } +#endif + DPRINTF1("==================="); + + if (STAILQ_EMPTY(&ldap_conf.base)) + debug_return_bool(false); /* if no base is defined, ignore LDAP */ + + if (ldap_conf.bind_timelimit > 0) + ldap_conf.bind_timelimit *= 1000; /* convert to ms */ + + /* + * Interpret SSL option + */ + if (ldap_conf.ssl != NULL) { + if (strcasecmp(ldap_conf.ssl, "start_tls") == 0) + ldap_conf.ssl_mode = SUDO_LDAP_STARTTLS; + else if (sudo_strtobool(ldap_conf.ssl) == true) + ldap_conf.ssl_mode = SUDO_LDAP_SSL; + } + +#if defined(HAVE_LDAPSSL_SET_STRENGTH) && !defined(LDAP_OPT_X_TLS_REQUIRE_CERT) + if (ldap_conf.tls_checkpeer != -1) { + ldapssl_set_strength(NULL, + ldap_conf.tls_checkpeer ? LDAPSSL_AUTH_CERT : LDAPSSL_AUTH_WEAK); + } +#endif + +#ifndef HAVE_LDAP_INITIALIZE + /* Convert uri list to host list if no ldap_initialize(). */ + if (!STAILQ_EMPTY(&ldap_conf.uri)) { + struct ldap_config_str *uri; + + if (sudo_ldap_parse_uri(&ldap_conf.uri) != LDAP_SUCCESS) + debug_return_bool(false); + while ((uri = STAILQ_FIRST(&ldap_conf.uri)) != NULL) { + STAILQ_REMOVE_HEAD(&ldap_conf.uri, entries); + free(uri); + } + ldap_conf.port = LDAP_PORT; + } +#endif + + if (STAILQ_EMPTY(&ldap_conf.uri)) { + /* Use port 389 for plaintext LDAP and port 636 for SSL LDAP */ + if (ldap_conf.port < 0) + ldap_conf.port = + ldap_conf.ssl_mode == SUDO_LDAP_SSL ? LDAPS_PORT : LDAP_PORT; + +#ifdef HAVE_LDAP_CREATE + /* + * Cannot specify port directly to ldap_create(), each host must + * include :port to override the default. + */ + if (ldap_conf.port != LDAP_PORT) { + if (!sudo_ldap_conf_add_ports()) + debug_return_bool(false); + } +#endif + } + + /* If search filter is not parenthesized, make it so. */ + if (ldap_conf.search_filter && ldap_conf.search_filter[0] != '(') { + size_t len = strlen(ldap_conf.search_filter); + cp = ldap_conf.search_filter; + ldap_conf.search_filter = malloc(len + 3); + if (ldap_conf.search_filter == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + ldap_conf.search_filter[0] = '('; + memcpy(ldap_conf.search_filter + 1, cp, len); + ldap_conf.search_filter[len + 1] = ')'; + ldap_conf.search_filter[len + 2] = '\0'; + free(cp); + } + + + /* If rootbinddn set, read in /etc/ldap.secret if it exists. */ + if (ldap_conf.rootbinddn) { + sudo_ldap_read_secret(path_ldap_secret); + } else if (ldap_conf.bindpw) { + cp = sudo_ldap_decode_secret(ldap_conf.bindpw); + if (cp != NULL) { + free(ldap_conf.bindpw); + ldap_conf.bindpw = cp; + } + } + + if (ldap_conf.tls_keypw) { + cp = sudo_ldap_decode_secret(ldap_conf.tls_keypw); + if (cp != NULL) { + free(ldap_conf.tls_keypw); + ldap_conf.tls_keypw = cp; + } + } + +#ifdef HAVE_LDAP_SASL_INTERACTIVE_BIND_S + /* + * Make sure we can open the file specified by krb5_ccname. + */ + if (ldap_conf.krb5_ccname != NULL) { + if (!sudo_check_krb5_ccname(ldap_conf.krb5_ccname)) + ldap_conf.krb5_ccname = NULL; + } +#endif + + debug_return_bool(true); +} + +/* + * Set LDAP options from the specified options table + * Returns LDAP_SUCCESS on success, else non-zero. + */ +static int +sudo_ldap_set_options_table(LDAP *ld, struct ldap_config_table *table) +{ + struct ldap_config_table *cur; + int ival, rc, errors = 0; + char *sval; + debug_decl(sudo_ldap_set_options_table, SUDOERS_DEBUG_LDAP) + + for (cur = table; cur->conf_str != NULL; cur++) { + if (cur->opt_val == -1) + continue; + + switch (cur->type) { + case CONF_BOOL: + case CONF_INT: + ival = *(int *)(cur->valp); + if (ival >= 0) { + DPRINTF1("ldap_set_option: %s -> %d", cur->conf_str, ival); + rc = ldap_set_option(ld, cur->opt_val, &ival); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option: %s -> %d: %s", + cur->conf_str, ival, ldap_err2string(rc)); + errors++; + } + } + break; + case CONF_STR: + sval = *(char **)(cur->valp); + if (sval != NULL) { + DPRINTF1("ldap_set_option: %s -> %s", cur->conf_str, sval); + rc = ldap_set_option(ld, cur->opt_val, sval); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option: %s -> %s: %s", + cur->conf_str, sval, ldap_err2string(rc)); + errors++; + } + } + break; + } + } + debug_return_int(errors ? -1 : LDAP_SUCCESS); +} + +/* + * Set LDAP options based on the global config table. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +int +sudo_ldap_set_options_global(void) +{ + int ret; + debug_decl(sudo_ldap_set_options_global, SUDOERS_DEBUG_LDAP) + + /* Set ber options */ +#ifdef LBER_OPT_DEBUG_LEVEL + if (ldap_conf.ldap_debug) + ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &ldap_conf.ldap_debug); +#endif + + /* Parse global LDAP options table. */ + ret = sudo_ldap_set_options_table(NULL, ldap_conf_global); + debug_return_int(ret); +} + +/* + * Set LDAP options based on the per-connection config table. + * Returns LDAP_SUCCESS on success, else non-zero. + */ +int +sudo_ldap_set_options_conn(LDAP *ld) +{ + int rc; + debug_decl(sudo_ldap_set_options_conn, SUDOERS_DEBUG_LDAP) + + /* Parse per-connection LDAP options table. */ + rc = sudo_ldap_set_options_table(ld, ldap_conf_conn); + if (rc == -1) + debug_return_int(-1); + +#ifdef LDAP_OPT_TIMEOUT + /* Convert timeout to a timeval */ + if (ldap_conf.timeout > 0) { + struct timeval tv; + tv.tv_sec = ldap_conf.timeout; + tv.tv_usec = 0; + DPRINTF1("ldap_set_option(LDAP_OPT_TIMEOUT, %d)", ldap_conf.timeout); + rc = ldap_set_option(ld, LDAP_OPT_TIMEOUT, &tv); + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option(TIMEOUT, %d): %s", + ldap_conf.timeout, ldap_err2string(rc)); + } + } +#endif +#ifdef LDAP_OPT_NETWORK_TIMEOUT + /* Convert bind_timelimit to a timeval */ + if (ldap_conf.bind_timelimit > 0) { + struct timeval tv; + tv.tv_sec = ldap_conf.bind_timelimit / 1000; + tv.tv_usec = 0; + DPRINTF1("ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT, %d)", + ldap_conf.bind_timelimit / 1000); + rc = ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &tv); +# if !defined(LDAP_OPT_CONNECT_TIMEOUT) || LDAP_VENDOR_VERSION != 510 + /* Tivoli Directory Server 6.3 libs always return a (bogus) error. */ + if (rc != LDAP_OPT_SUCCESS) { + sudo_warnx("ldap_set_option(NETWORK_TIMEOUT, %d): %s", + ldap_conf.bind_timelimit / 1000, ldap_err2string(rc)); + } +# endif + } +#endif + +#if defined(LDAP_OPT_X_TLS) && !defined(HAVE_LDAPSSL_INIT) + if (ldap_conf.ssl_mode == SUDO_LDAP_SSL) { + int val = LDAP_OPT_X_TLS_HARD; + DPRINTF1("ldap_set_option(LDAP_OPT_X_TLS, LDAP_OPT_X_TLS_HARD)"); + rc = ldap_set_option(ld, LDAP_OPT_X_TLS, &val); + if (rc != LDAP_SUCCESS) { + sudo_warnx("ldap_set_option(LDAP_OPT_X_TLS, LDAP_OPT_X_TLS_HARD): %s", + ldap_err2string(rc)); + debug_return_int(-1); + } + } +#endif + debug_return_int(LDAP_SUCCESS); +} diff --git a/utsudo-0.0.2/plugins/sudoers/ldap_util.c b/utsudo-0.0.2/plugins/sudoers/ldap_util.c new file mode 100644 index 0000000..7a62e02 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/ldap_util.c @@ -0,0 +1,584 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013, 2016, 2018-2018 Todd C. Miller + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudoers.h" +#include "interfaces.h" +#include "gram.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_digest.h" + +/* + * Returns true if the string pointed to by valp begins with an + * odd number of '!' characters. Intervening blanks are ignored. + * Stores the address of the string after '!' removal in valp. + */ +bool +sudo_ldap_is_negated(char **valp) +{ + char *val = *valp; + bool ret = false; + debug_decl(sudo_ldap_is_negated, SUDOERS_DEBUG_LDAP) + + while (*val == '!') { + ret = !ret; + do { + val++; + } while (isblank((unsigned char)*val)); + } + *valp = val; + debug_return_bool(ret); +} + +/* + * Parse an option string into a defaults structure. + * The members of def are pointers into optstr (which is modified). + */ +int +sudo_ldap_parse_option(char *optstr, char **varp, char **valp) +{ + char *cp, *val = NULL; + char *var = optstr; + int op; + debug_decl(sudo_ldap_parse_option, SUDOERS_DEBUG_LDAP) + + /* check for equals sign past first char */ + cp = strchr(var, '='); + if (cp > var) { + val = cp + 1; + op = cp[-1]; /* peek for += or -= cases */ + if (op == '+' || op == '-') { + /* case var+=val or var-=val */ + cp--; + } else { + /* case var=val */ + op = true; + } + /* Trim whitespace between var and operator. */ + while (cp > var && isblank((unsigned char)cp[-1])) + cp--; + /* Truncate variable name. */ + *cp = '\0'; + /* Trim leading whitespace from val. */ + while (isblank((unsigned char)*val)) + val++; + /* Strip double quotes if present. */ + if (*val == '"') { + char *ep = val + strlen(val); + if (ep != val && ep[-1] == '"') { + val++; + ep[-1] = '\0'; + } + } + } else { + /* Boolean value, either true or false. */ + op = sudo_ldap_is_negated(&var) ? false : true; + } + *varp = var; + *valp = val; + + debug_return_int(op); +} + +/* + * Convert an array of user/group names to a member list. + * The caller is responsible for freeing the returned struct member_list. + */ +static struct member_list * +array_to_member_list(void *a, sudo_ldap_iter_t iter) +{ + struct member_list negated_members = + TAILQ_HEAD_INITIALIZER(negated_members); + struct member_list *members; + struct member *m; + char *val; + debug_decl(bv_to_member_list, SUDOERS_DEBUG_LDAP) + + if ((members = calloc(1, sizeof(*members))) == NULL) + return NULL; + TAILQ_INIT(members); + + while ((val = iter(&a)) != NULL) { + if ((m = calloc(1, sizeof(*m))) == NULL) + goto bad; + m->negated = sudo_ldap_is_negated(&val); + + switch (val[0]) { + case '\0': + /* Empty RunAsUser means run as the invoking user. */ + m->type = MYSELF; + break; + case '+': + m->type = NETGROUP; + m->name = strdup(val); + if (m->name == NULL) { + free(m); + goto bad; + } + break; + case '%': + m->type = USERGROUP; + m->name = strdup(val); + if (m->name == NULL) { + free(m); + goto bad; + } + break; + case 'A': + if (strcmp(val, "ALL") == 0) { + m->type = ALL; + break; + } + /* FALLTHROUGH */ + default: + m->type = WORD; + m->name = strdup(val); + if (m->name == NULL) { + free(m); + goto bad; + } + break; + } + if (m->negated) + TAILQ_INSERT_TAIL(&negated_members, m, entries); + else + TAILQ_INSERT_TAIL(members, m, entries); + } + + /* Negated members take precedence so we insert them at the end. */ + TAILQ_CONCAT(members, &negated_members, entries); + debug_return_ptr(members); +bad: + free_members(&negated_members); + free_members(members); + free(members); + debug_return_ptr(NULL); +} + +static bool +is_address(char *host) +{ + union sudo_in_addr_un addr; + bool ret = false; + char *slash; + debug_decl(is_address, SUDOERS_DEBUG_LDAP) + + /* Check for mask, not currently parsed. */ + if ((slash = strchr(host, '/')) != NULL) + *slash = '\0'; + + if (inet_pton(AF_INET, host, &addr.ip4) == 1) + ret = true; +#ifdef HAVE_STRUCT_IN6_ADDR + else if (inet_pton(AF_INET6, host, &addr.ip6) == 1) + ret = true; +#endif + + if (slash != NULL) + *slash = '/'; + + debug_return_bool(ret); +} + +static struct member * +host_to_member(char *host) +{ + struct member *m; + debug_decl(host_to_member, SUDOERS_DEBUG_LDAP) + + if ((m = calloc(1, sizeof(*m))) == NULL) + goto oom; + m->negated = sudo_ldap_is_negated(&host); + m->name = strdup(host); + if (m->name == NULL) + goto oom; + switch (*host) { + case '+': + m->type = NETGROUP; + break; + case 'A': + if (strcmp(host, "ALL") == 0) { + m->type = ALL; + break; + } + /* FALLTHROUGH */ + default: + if (is_address(host)) { + m->type = NTWKADDR; + } else { + m->type = WORD; + } + break; + } + + debug_return_ptr(m); +oom: + free(m); + debug_return_ptr(NULL); +} + +bool +sudo_ldap_add_default(const char *var, const char *val, int op, + char *source, struct defaults_list *defs) +{ + struct defaults *def; + debug_decl(sudo_ldap_add_default, SUDOERS_DEBUG_LDAP) + + if ((def = calloc(1, sizeof(*def))) == NULL) + goto oom; + + def->type = DEFAULTS; + def->op = op; + if ((def->var = strdup(var)) == NULL) { + goto oom; + } + if (val != NULL) { + if ((def->val = strdup(val)) == NULL) + goto oom; + } + def->file = source; + rcstr_addref(source); + TAILQ_INSERT_TAIL(defs, def, entries); + debug_return_bool(true); + +oom: + if (def != NULL) { + free(def->var); + free(def->val); + free(def); + } + debug_return_bool(false); +} + +/* + * Convert an LDAP sudoRole to a sudoers privilege. + * Pass in struct berval ** for LDAP or char *** for SSSD. + */ +struct privilege * +sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers, + void *runasgroups, void *cmnds, void *opts, const char *notbefore, + const char *notafter, bool warnings, bool store_options, + sudo_ldap_iter_t iter) +{ + struct cmndspec_list negated_cmnds = TAILQ_HEAD_INITIALIZER(negated_cmnds); + struct member_list negated_hosts = TAILQ_HEAD_INITIALIZER(negated_hosts); + struct cmndspec *prev_cmndspec = NULL; + struct privilege *priv; + struct member *m; + char *cmnd; + debug_decl(sudo_ldap_role_to_priv, SUDOERS_DEBUG_LDAP) + + if ((priv = calloc(1, sizeof(*priv))) == NULL) + goto oom; + TAILQ_INIT(&priv->hostlist); + TAILQ_INIT(&priv->cmndlist); + TAILQ_INIT(&priv->defaults); + + priv->ldap_role = strdup(cn ? cn : "UNKNOWN"); + if (priv->ldap_role == NULL) + goto oom; + + if (hosts == NULL) { + /* The host has already matched, use ALL as wildcard. */ + if ((m = calloc(1, sizeof(*m))) == NULL) + goto oom; + m->type = ALL; + TAILQ_INSERT_TAIL(&priv->hostlist, m, entries); + } else { + char *host; + while ((host = iter(&hosts)) != NULL) { + if ((m = host_to_member(host)) == NULL) + goto oom; + if (m->negated) + TAILQ_INSERT_TAIL(&negated_hosts, m, entries); + else + TAILQ_INSERT_TAIL(&priv->hostlist, m, entries); + } + /* Negated hosts take precedence so we insert them at the end. */ + TAILQ_CONCAT(&priv->hostlist, &negated_hosts, entries); + } + + /* + * Parse sudoCommands and add to cmndlist. + */ + while ((cmnd = iter(&cmnds)) != NULL) { + bool negated = sudo_ldap_is_negated(&cmnd); + struct sudo_command *c = NULL; + struct cmndspec *cmndspec; + + /* Allocate storage upfront. */ + if ((cmndspec = calloc(1, sizeof(*cmndspec))) == NULL) + goto oom; + if ((m = calloc(1, sizeof(*m))) == NULL) { + free(cmndspec); + goto oom; + } + if (strcmp(cmnd, "ALL") != 0) { + if ((c = calloc(1, sizeof(*c))) == NULL) { + free(cmndspec); + free(m); + goto oom; + } + m->name = (char *)c; + } + + /* Negated commands have precedence so insert them at the end. */ + if (negated) + TAILQ_INSERT_TAIL(&negated_cmnds, cmndspec, entries); + else + TAILQ_INSERT_TAIL(&priv->cmndlist, cmndspec, entries); + + /* Initialize cmndspec */ + TAGS_INIT(cmndspec->tags); + cmndspec->notbefore = UNSPEC; + cmndspec->notafter = UNSPEC; + cmndspec->timeout = UNSPEC; + cmndspec->cmnd = m; + + if (prev_cmndspec != NULL) { + /* Inherit values from prior cmndspec (common to the sudoRole). */ + cmndspec->runasuserlist = prev_cmndspec->runasuserlist; + cmndspec->runasgrouplist = prev_cmndspec->runasgrouplist; + cmndspec->notbefore = prev_cmndspec->notbefore; + cmndspec->notafter = prev_cmndspec->notafter; + cmndspec->tags = prev_cmndspec->tags; + if (cmndspec->tags.setenv == IMPLIED) + cmndspec->tags.setenv = UNSPEC; + } else { + /* Parse sudoRunAsUser / sudoRunAs */ + if (runasusers != NULL) { + cmndspec->runasuserlist = + array_to_member_list(runasusers, iter); + if (cmndspec->runasuserlist == NULL) + goto oom; + } + + /* Parse sudoRunAsGroup */ + if (runasgroups != NULL) { + cmndspec->runasgrouplist = + array_to_member_list(runasgroups, iter); + if (cmndspec->runasgrouplist == NULL) + goto oom; + } + + /* Parse sudoNotBefore / sudoNotAfter */ + if (notbefore != NULL) + cmndspec->notbefore = parse_gentime(notbefore); + if (notafter != NULL) + cmndspec->notafter = parse_gentime(notafter); + + /* Parse sudoOptions. */ + if (opts != NULL) { + char *opt, *source = NULL; + + if (store_options) { + /* Use sudoRole in place of file name in defaults. */ + size_t slen = sizeof("sudoRole") + strlen(priv->ldap_role); + if ((source = rcstr_alloc(slen)) == NULL) + goto oom; + (void)snprintf(source, slen, "sudoRole %s", priv->ldap_role); + } + + while ((opt = iter(&opts)) != NULL) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option(opt, &var, &val); + if (strcmp(var, "command_timeout") == 0 && val != NULL) { + cmndspec->timeout = parse_timeout(val); +#ifdef HAVE_SELINUX + } else if (strcmp(var, "role") == 0 && val != NULL) { + if ((cmndspec->role = strdup(val)) == NULL) + break; + } else if (strcmp(var, "type") == 0 && val != NULL) { + if ((cmndspec->type = strdup(val)) == NULL) + break; +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + } else if (strcmp(var, "privs") == 0 && val != NULL) { + if ((cmndspec->privs = strdup(val)) == NULL) + break; + } else if (strcmp(var, "limitprivs") == 0 && val != NULL) { + if ((cmndspec->limitprivs = strdup(val)) == NULL) + break; +#endif /* HAVE_PRIV_SET */ + } else if (store_options) { + if (!sudo_ldap_add_default(var, val, op, source, + &priv->defaults)) { + break; + } + } else { + /* Convert to tags. */ + bool converted = sudoers_defaults_to_tags(var, val, op, + &cmndspec->tags); + if (!converted) { + if (warnings) { + /* XXX - callback to process unsupported options. */ + if (val != NULL) { + sudo_warnx(U_("unable to convert sudoOption: %s%s%s"), var, op == '+' ? "+=" : op == '-' ? "-=" : "=", val); + } else { + sudo_warnx(U_("unable to convert sudoOption: %s%s%s"), op == false ? "!" : "", var, ""); + } + } + continue; + } + } + } + rcstr_delref(source); + if (opt != NULL) { + /* Defer oom until we drop the ref on source. */ + goto oom; + } + } + + /* So we can inherit previous values. */ + prev_cmndspec = cmndspec; + } + + /* Fill in command member now that options have been processed. */ + m->negated = negated; + if (c == NULL) { + /* No command name for "ALL" */ + m->type = ALL; + if (cmndspec->tags.setenv == UNSPEC) + cmndspec->tags.setenv = IMPLIED; + } else { + struct command_digest digest; + char *args; + + m->type = COMMAND; + + /* Fill in command with optional digest. */ + if (sudo_ldap_extract_digest(&cmnd, &digest) != NULL) { + if ((c->digest = malloc(sizeof(*c->digest))) == NULL) + goto oom; + *c->digest = digest; + } + if ((args = strpbrk(cmnd, " \t")) != NULL) { + *args++ = '\0'; + if ((c->args = strdup(args)) == NULL) + goto oom; + } + if ((c->cmnd = strdup(cmnd)) == NULL) + goto oom; + } + } + /* Negated commands take precedence so we insert them at the end. */ + TAILQ_CONCAT(&priv->cmndlist, &negated_cmnds, entries); + + debug_return_ptr(priv); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (priv != NULL) { + TAILQ_CONCAT(&priv->hostlist, &negated_hosts, entries); + TAILQ_CONCAT(&priv->cmndlist, &negated_cmnds, entries); + free_privilege(priv); + } + debug_return_ptr(NULL); +} + +/* + * If a digest prefix is present, fills in struct command_digest + * and returns a pointer to it, updating cmnd to point to the + * command after the digest. + */ +struct command_digest * +sudo_ldap_extract_digest(char **cmnd, struct command_digest *digest) +{ + char *ep, *cp = *cmnd; + int digest_type = SUDO_DIGEST_INVALID; + debug_decl(sudo_ldap_check_command, SUDOERS_DEBUG_LDAP) + + /* + * Check for and extract a digest prefix, e.g. + * sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1 /bin/ls + */ + if (cp[0] == 's' && cp[1] == 'h' && cp[2] == 'a') { + switch (cp[3]) { + case '2': + if (cp[4] == '2' && cp[5] == '4') + digest_type = SUDO_DIGEST_SHA224; + else if (cp[4] == '5' && cp[5] == '6') + digest_type = SUDO_DIGEST_SHA256; + break; + case '3': + if (cp[4] == '8' && cp[5] == '4') + digest_type = SUDO_DIGEST_SHA384; + break; + case '5': + if (cp[4] == '1' && cp[5] == '2') + digest_type = SUDO_DIGEST_SHA512; + break; + } + if (digest_type != SUDO_DIGEST_INVALID) { + cp += 6; + while (isblank((unsigned char)*cp)) + cp++; + if (*cp == ':') { + cp++; + while (isblank((unsigned char)*cp)) + cp++; + ep = cp; + while (*ep != '\0' && !isblank((unsigned char)*ep)) + ep++; + if (*ep != '\0') { + digest->digest_type = digest_type; + digest->digest_str = strndup(cp, (size_t)(ep - cp)); + if (digest->digest_str == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + cp = ep + 1; + while (isblank((unsigned char)*cp)) + cp++; + *cmnd = cp; + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s digest %s for %s", + digest_type_to_name(digest_type), + digest->digest_str, cp); + debug_return_ptr(digest); + } + } + } + } + debug_return_ptr(NULL); +} diff --git a/utsudo-0.0.2/plugins/sudoers/linux_audit.c b/utsudo-0.0.2/plugins/sudoers/linux_audit.c new file mode 100644 index 0000000..22dc54d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/linux_audit.c @@ -0,0 +1,113 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_LINUX_AUDIT + +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "linux_audit.h" + +#define AUDIT_NOT_CONFIGURED -2 + +/* + * Open audit connection if possible. + * Returns audit fd on success and -1 on failure. + */ +static int +linux_audit_open(void) +{ + static int au_fd = -1; + debug_decl(linux_audit_open, SUDOERS_DEBUG_AUDIT) + + if (au_fd != -1) + debug_return_int(au_fd); + au_fd = audit_open(); + if (au_fd == -1) { + /* Kernel may not have audit support. */ + if (errno == EINVAL || errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT) + au_fd = AUDIT_NOT_CONFIGURED; + else + sudo_warn(U_("unable to open audit system")); + } else { + (void)fcntl(au_fd, F_SETFD, FD_CLOEXEC); + } + debug_return_int(au_fd); +} + +int +linux_audit_command(char *argv[], int result) +{ + int au_fd, rc = -1; + char *command, *cp, **av; + size_t size, n; + debug_decl(linux_audit_command, SUDOERS_DEBUG_AUDIT) + + /* Don't return an error if auditing is not configured. */ + if ((au_fd = linux_audit_open()) < 0) + debug_return_int(au_fd == AUDIT_NOT_CONFIGURED ? 0 : -1); + + /* Convert argv to a flat string. */ + for (size = 0, av = argv; *av != NULL; av++) + size += strlen(*av) + 1; + command = malloc(size); + if (command == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + for (av = argv, cp = command; *av != NULL; av++) { + n = strlcpy(cp, *av, size - (cp - command)); + if (n >= size - (cp - command)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + cp += n; + *cp++ = ' '; + } + *--cp = '\0'; + + /* Log command, ignoring ECONNREFUSED on error. */ + if (audit_log_user_command(au_fd, AUDIT_USER_CMD, command, NULL, result) <= 0) { + if (errno != ECONNREFUSED) { + sudo_warn(U_("unable to send audit message")); + goto done; + } + } + + rc = 0; + +done: + free(command); + + debug_return_int(rc); +} + +#endif /* HAVE_LINUX_AUDIT */ diff --git a/utsudo-0.0.2/plugins/sudoers/linux_audit.h b/utsudo-0.0.2/plugins/sudoers/linux_audit.h new file mode 100644 index 0000000..2c4f0f6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/linux_audit.h @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010, 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LINUX_AUDIT_H +#define SUDOERS_LINUX_AUDIT_H + +int linux_audit_command(char *argv[], int result); + +#endif /* SUDOERS_LINUX_AUDIT_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/locale.c b/utsudo-0.0.2/plugins/sudoers/locale.c new file mode 100644 index 0000000..6bd32ca --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/locale.c @@ -0,0 +1,158 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#define DEFAULT_TEXT_DOMAIN "sudoers" +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudoers_debug.h" +#include "defaults.h" +#include "logging.h" + +static int current_locale = SUDOERS_LOCALE_USER; +static char *user_locale; +static char *sudoers_locale; + +int +sudoers_getlocale(void) +{ + debug_decl(sudoers_getlocale, SUDOERS_DEBUG_UTIL) + debug_return_int(current_locale); +} + +bool +sudoers_initlocale(const char *ulocale, const char *slocale) +{ + debug_decl(sudoers_initlocale, SUDOERS_DEBUG_UTIL) + + if (ulocale != NULL) { + free(user_locale); + if ((user_locale = strdup(ulocale)) == NULL) + debug_return_bool(false); + } + if (slocale != NULL) { + free(sudoers_locale); + if ((sudoers_locale = strdup(slocale)) == NULL) + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: user locale %s, sudoers locale %s", + __func__, user_locale, sudoers_locale); + debug_return_bool(true); +} + +/* + * Set locale to user or sudoers value. + * Returns true on success and false on failure, + * If prevlocale is non-NULL it will be filled in with the + * old SUDOERS_LOCALE_* value. + */ +bool +sudoers_setlocale(int newlocale, int *prevlocale) +{ + char *res = NULL; + debug_decl(sudoers_setlocale, SUDOERS_DEBUG_UTIL) + + switch (newlocale) { + case SUDOERS_LOCALE_USER: + if (prevlocale) + *prevlocale = current_locale; + if (current_locale != SUDOERS_LOCALE_USER) { + current_locale = SUDOERS_LOCALE_USER; + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: setting locale to %s (user)", __func__, + user_locale ? user_locale : ""); + res = setlocale(LC_ALL, user_locale ? user_locale : ""); + if (res != NULL && user_locale == NULL) { + user_locale = setlocale(LC_ALL, NULL); + if (user_locale != NULL) + user_locale = strdup(user_locale); + if (user_locale == NULL) + res = NULL; + } + } + break; + case SUDOERS_LOCALE_SUDOERS: + if (prevlocale) + *prevlocale = current_locale; + if (current_locale != SUDOERS_LOCALE_SUDOERS) { + current_locale = SUDOERS_LOCALE_SUDOERS; + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: setting locale to %s (sudoers)", __func__, + sudoers_locale ? sudoers_locale : "C"); + res = setlocale(LC_ALL, sudoers_locale ? sudoers_locale : "C"); + if (res == NULL && sudoers_locale != NULL) { + if (strcmp(sudoers_locale, "C") != 0) { + free(sudoers_locale); + sudoers_locale = strdup("C"); + if (sudoers_locale != NULL) + res = setlocale(LC_ALL, "C"); + } + } + } + break; + } + debug_return_bool(res ? true : false); +} + +bool +sudoers_warn_setlocale(bool restore, int *cookie) +{ + debug_decl(sudoers_warn_setlocale, SUDOERS_DEBUG_UTIL) + + if (restore) + debug_return_bool(sudoers_setlocale(*cookie, NULL)); + debug_return_bool(sudoers_setlocale(SUDOERS_LOCALE_USER, cookie)); +} + +/* + * Callback for sudoers_locale sudoers setting. + */ +bool +sudoers_locale_callback(const union sudo_defs_val *sd_un) +{ + debug_decl(sudoers_locale_callback, SUDOERS_DEBUG_UTIL) + + if (sudoers_initlocale(NULL, sd_un->str)) { + if (setlocale(LC_ALL, sd_un->str) != NULL) + debug_return_bool(true); + } + debug_return_bool(false); +} diff --git a/utsudo-0.0.2/plugins/sudoers/logging.c b/utsudo-0.0.2/plugins/sudoers/logging.c new file mode 100644 index 0000000..e88e2d4 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/logging.c @@ -0,0 +1,1107 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_NL_LANGINFO +# include +#endif /* HAVE_NL_LANGINFO */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" + +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + +/* Special message for log_warning() so we know to use ngettext() */ +#define INCORRECT_PASSWORD_ATTEMPT ((char *)0x01) + +static void do_syslog(int, char *); +static bool do_logfile(const char *); +static bool send_mail(const char *fmt, ...); +static bool should_mail(int); +static void mysyslog(int, const char *, ...); +static char *new_logline(const char *, const char *); + +#define MAXSYSLOGTRIES 16 /* num of retries for broken syslogs */ + +/* + * We do an openlog(3)/closelog(3) for each message because some + * authentication methods (notably PAM) use syslog(3) for their + * own nefarious purposes and may call openlog(3) and closelog(3). + */ +static void +mysyslog(int pri, const char *fmt, ...) +{ + const int flags = def_syslog_pid ? LOG_PID : 0; + va_list ap; + debug_decl(mysyslog, SUDOERS_DEBUG_LOGGING) + + openlog("sudo", flags, def_syslog); + va_start(ap, fmt); + vsyslog(pri, fmt, ap); + va_end(ap); + closelog(); + debug_return; +} + +/* + * Log a message to syslog, pre-pending the username and splitting the + * message into parts if it is longer than syslog_maxlen. + */ +static void +do_syslog(int pri, char *msg) +{ + size_t len, maxlen; + char *p, *tmp, save; + const char *fmt; + int oldlocale; + debug_decl(do_syslog, SUDOERS_DEBUG_LOGGING) + + /* A priority of -1 corresponds to "none". */ + if (pri == -1) + debug_return; + + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + /* + * Log the full line, breaking into multiple syslog(3) calls if necessary + */ + fmt = _("%8s : %s"); + maxlen = def_syslog_maxlen - (strlen(fmt) - 5 + strlen(sudo_user_name)); + for (p = msg; *p != '\0'; ) { + len = strlen(p); + if (len > maxlen) { + /* + * Break up the line into what will fit on one syslog(3) line + * Try to avoid breaking words into several lines if possible. + */ + tmp = memrchr(p, ' ', maxlen); + if (tmp == NULL) + tmp = p + maxlen; + + /* NULL terminate line, but save the char to restore later */ + save = *tmp; + *tmp = '\0'; + + mysyslog(pri, fmt, sudo_user_name, p); + + *tmp = save; /* restore saved character */ + + /* Advance p and eliminate leading whitespace */ + for (p = tmp; *p == ' '; p++) + continue; + } else { + mysyslog(pri, fmt, sudo_user_name, p); + p += len; + } + fmt = _("%8s : (command continued) %s"); + maxlen = def_syslog_maxlen - (strlen(fmt) - 5 + strlen(sudo_user_name)); + } + + sudoers_setlocale(oldlocale, NULL); + + debug_return; +} + +static bool +do_logfile(const char *msg) +{ + static bool warned = false; + const char *timestr; + int len, oldlocale; + bool ret = false; + char *full_line; + mode_t oldmask; + FILE *fp; + debug_decl(do_logfile, SUDOERS_DEBUG_LOGGING) + + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + oldmask = umask(S_IRWXG|S_IRWXO); + fp = fopen(def_logfile, "a"); + (void) umask(oldmask); + if (fp == NULL) { + if (!warned) { + log_warning(SLOG_SEND_MAIL|SLOG_NO_LOG, + N_("unable to open log file: %s"), def_logfile); + warned = true; + } + goto done; + } + if (!sudo_lock_file(fileno(fp), SUDO_LOCK)) { + if (!warned) { + log_warning(SLOG_SEND_MAIL|SLOG_NO_LOG, + N_("unable to lock log file: %s"), def_logfile); + warned = true; + } + goto done; + } + + timestr = get_timestr(time(NULL), def_log_year); + if (timestr == NULL) + timestr = "invalid date"; + if (def_log_host) { + len = asprintf(&full_line, "%s : %s : HOST=%s : %s", + timestr, sudo_user_name, user_srunhost, msg); + } else { + len = asprintf(&full_line, "%s : %s : %s", + timestr, sudo_user_name, msg); + } + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if ((size_t)def_loglinelen < sizeof(LOG_INDENT)) { + /* Don't pretty-print long log file lines (hard to grep). */ + (void) fputs(full_line, fp); + (void) fputc('\n', fp); + } else { + /* Write line with word wrap around def_loglinelen chars. */ + writeln_wrap(fp, full_line, len, def_loglinelen); + } + free(full_line); + (void) fflush(fp); + if (ferror(fp)) { + if (!warned) { + log_warning(SLOG_SEND_MAIL|SLOG_NO_LOG, + N_("unable to write log file: %s"), def_logfile); + warned = true; + } + goto done; + } + ret = true; + +done: + if (fp != NULL) + (void) fclose(fp); + sudoers_setlocale(oldlocale, NULL); + + debug_return_bool(ret); +} + +/* + * Log, audit and mail the denial message, optionally informing the user. + */ +bool +log_denial(int status, bool inform_user) +{ + const char *message; + char *logline; + int oldlocale; + bool uid_changed, ret = true; + bool mailit; + debug_decl(log_denial, SUDOERS_DEBUG_LOGGING) + + /* Handle auditing first (audit_failure() handles the locale itself). */ + if (ISSET(status, FLAG_NO_USER | FLAG_NO_HOST)) + audit_failure(NewArgc, NewArgv, N_("No user or host")); + else + audit_failure(NewArgc, NewArgv, N_("validation failure")); + + /* Send mail based on status. */ + mailit = should_mail(status); + + if (def_log_denied || mailit) { + /* Log and mail messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + /* Set error message. */ + if (ISSET(status, FLAG_NO_USER)) + message = _("user NOT in sudoers"); + else if (ISSET(status, FLAG_NO_HOST)) + message = _("user NOT authorized on host"); + else + message = _("command not allowed"); + + logline = new_logline(message, NULL); + if (logline == NULL) + debug_return_bool(false); + + /* Become root if we are not already. */ + uid_changed = set_perms(PERM_ROOT); + + if (mailit) + send_mail("%s", logline); /* XXX - return value */ + + /* Log via syslog and/or a file. */ + if (def_log_denied) { + if (def_syslog) + do_syslog(def_syslog_badpri, logline); + if (def_logfile && !do_logfile(logline)) + ret = false; + } + + if (uid_changed) { + if (!restore_perms()) + ret = false; /* XXX - return -1 instead? */ + } + + free(logline); + + /* Restore locale. */ + sudoers_setlocale(oldlocale, NULL); + } + + /* Inform the user if they failed to authenticate (in their locale). */ + if (inform_user) { + sudoers_setlocale(SUDOERS_LOCALE_USER, &oldlocale); + + if (ISSET(status, FLAG_NO_USER)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s is not in the sudoers " + "file. This incident will be reported.\n"), user_name); + } else if (ISSET(status, FLAG_NO_HOST)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("%s is not allowed to run sudo " + "on %s. This incident will be reported.\n"), + user_name, user_srunhost); + } else if (ISSET(status, FLAG_NO_CHECK)) { + sudo_printf(SUDO_CONV_ERROR_MSG, _("Sorry, user %s may not run " + "sudo on %s.\n"), user_name, user_srunhost); + } else { + sudo_printf(SUDO_CONV_ERROR_MSG, _("Sorry, user %s is not allowed " + "to execute '%s%s%s' as %s%s%s on %s.\n"), + user_name, user_cmnd, user_args ? " " : "", + user_args ? user_args : "", + list_pw ? list_pw->pw_name : runas_pw ? + runas_pw->pw_name : user_name, runas_gr ? ":" : "", + runas_gr ? runas_gr->gr_name : "", user_host); + } + sudoers_setlocale(oldlocale, NULL); + } + debug_return_bool(ret); +} + +/* + * Log and audit that user was not allowed to run the command. + */ +bool +log_failure(int status, int flags) +{ + bool ret, inform_user = true; + debug_decl(log_failure, SUDOERS_DEBUG_LOGGING) + + /* The user doesn't always get to see the log message (path info). */ + if (!ISSET(status, FLAG_NO_USER | FLAG_NO_HOST) && def_path_info && + (flags == NOT_FOUND_DOT || flags == NOT_FOUND)) + inform_user = false; + ret = log_denial(status, inform_user); + + if (!inform_user) { + /* + * We'd like to not leak path info at all here, but that can + * *really* confuse the users. To really close the leak we'd + * have to say "not allowed to run foo" even when the problem + * is just "no foo in path" since the user can trivially set + * their path to just contain a single dir. + */ + if (flags == NOT_FOUND) + sudo_warnx(U_("%s: command not found"), user_cmnd); + else if (flags == NOT_FOUND_DOT) + sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd); + } + + debug_return_bool(ret); +} + +/* + * Log and audit that user was not able to authenticate themselves. + */ +bool +log_auth_failure(int status, unsigned int tries) +{ + int flags = 0; + bool ret = true; + debug_decl(log_auth_failure, SUDOERS_DEBUG_LOGGING) + + /* Handle auditing first. */ + audit_failure(NewArgc, NewArgv, N_("authentication failure")); + + /* + * Do we need to send mail? + * We want to avoid sending multiple messages for the same command + * so if we are going to send an email about the denial, that takes + * precedence. + */ + if (ISSET(status, VALIDATE_SUCCESS)) { + /* Command allowed, auth failed; do we need to send mail? */ + if (def_mail_badpass || def_mail_always) + SET(flags, SLOG_SEND_MAIL); + } else { + /* Command denied, auth failed; make sure we don't send mail twice. */ + if (def_mail_badpass && !should_mail(status)) + SET(flags, SLOG_SEND_MAIL); + /* Don't log the bad password message, we'll log a denial instead. */ + SET(flags, SLOG_NO_LOG); + } + + /* + * If sudoers denied the command we'll log that separately. + */ + if (ISSET(status, FLAG_BAD_PASSWORD)) + ret = log_warningx(flags, INCORRECT_PASSWORD_ATTEMPT, tries); + else if (ISSET(status, FLAG_NON_INTERACTIVE)) + ret = log_warningx(flags, N_("a password is required")); + + debug_return_bool(ret); +} + +/* + * Log and potentially mail the allowed command. + */ +bool +log_allowed(int status) +{ + char *logline; + int oldlocale; + bool uid_changed, ret = true; + bool mailit; + debug_decl(log_allowed, SUDOERS_DEBUG_LOGGING) + + /* Send mail based on status. */ + mailit = should_mail(status); + + if (def_log_allowed || mailit) { + /* Log and mail messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + if ((logline = new_logline(NULL, NULL)) == NULL) + debug_return_bool(false); + + /* Become root if we are not already. */ + uid_changed = set_perms(PERM_ROOT); + + if (mailit) + send_mail("%s", logline); /* XXX - return value */ + + /* + * Log via syslog and/or a file. + */ + if (def_log_allowed) { + if (def_syslog) + do_syslog(def_syslog_goodpri, logline); + if (def_logfile && !do_logfile(logline)) + ret = false; + } + + if (uid_changed) { + if (!restore_perms()) + ret = false; /* XXX - return -1 instead? */ + } + + free(logline); + + sudoers_setlocale(oldlocale, NULL); + } + + debug_return_bool(ret); +} + +/* + * Format an authentication failure message, using either + * authfail_message from sudoers or a locale-specific message. + */ +static int +fmt_authfail_message(char **str, va_list ap) +{ + unsigned int tries = va_arg(ap, unsigned int); + char *src, *dst0, *dst, *dst_end; + size_t size; + int len; + debug_decl(fmt_authfail_message, SUDOERS_DEBUG_LOGGING) + + if (def_authfail_message == NULL) { + debug_return_int(asprintf(str, ngettext("%u incorrect password attempt", + "%u incorrect password attempts", tries), tries)); + } + + src = def_authfail_message; + size = strlen(src) + 33; + if ((dst0 = dst = malloc(size)) == NULL) + debug_return_int(-1); + dst_end = dst + size; + + /* Always leave space for the terminating NUL. */ + while (*src != '\0' && dst + 1 < dst_end) { + if (src[0] == '%') { + switch (src[1]) { + case '%': + src++; + break; + case 'd': + len = snprintf(dst, dst_end - dst, "%u", tries); + if (len < 0 || len >= (int)(dst_end - dst)) + goto done; + dst += len; + src += 2; + continue; + default: + break; + } + } + *dst++ = *src++; + } +done: + *dst = '\0'; + + *str = dst0; +#ifdef __clang_analyzer__ + /* clang analyzer false positive */ + if (__builtin_expect(dst < dst0, 0)) + __builtin_trap(); +#endif + debug_return_int(dst - dst0); +} + +/* + * Perform logging for log_warning()/log_warningx(). + */ +static bool +vlog_warning(int flags, int errnum, const char *fmt, va_list ap) +{ + int oldlocale; + const char *errstr = NULL; + char *logline, *message; + bool uid_changed, ret = true; + va_list ap2; + int len; + debug_decl(vlog_warning, SUDOERS_DEBUG_LOGGING) + + /* Need extra copy of ap for sudo_vwarn()/sudo_vwarnx() below. */ + va_copy(ap2, ap); + + /* Log messages should be in the sudoers locale. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + + /* Expand printf-style format + args (with a special case). */ + if (fmt == INCORRECT_PASSWORD_ATTEMPT) { + len = fmt_authfail_message(&message, ap); + } else { + len = vasprintf(&message, _(fmt), ap); + } + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = false; + goto done; + } + + if (ISSET(flags, SLOG_USE_ERRNO)) + errstr = strerror(errnum); + else if (ISSET(flags, SLOG_GAI_ERRNO)) + errstr = gai_strerror(errnum); + + /* Log to debug file. */ + if (errstr != NULL) { + sudo_debug_printf2(NULL, NULL, 0, + SUDO_DEBUG_WARN|sudo_debug_subsys, "%s: %s", message, errstr); + } else { + sudo_debug_printf2(NULL, NULL, 0, + SUDO_DEBUG_WARN|sudo_debug_subsys, "%s", message); + } + + if (ISSET(flags, SLOG_RAW_MSG)) { + logline = message; + } else { + logline = new_logline(message, errstr); + free(message); + if (logline == NULL) { + ret = false; + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + /* Become root if we are not already. */ + uid_changed = set_perms(PERM_ROOT); + + /* + * Send a copy of the error via mail. + * XXX - return value + */ + if (ISSET(flags, SLOG_SEND_MAIL)) + send_mail("%s", logline); + + /* + * Log to syslog and/or a file. + */ + if (!ISSET(flags, SLOG_NO_LOG)) { + if (def_syslog) + do_syslog(def_syslog_badpri, logline); + if (def_logfile && !do_logfile(logline)) + ret = false; + } + + if (uid_changed) { + if (!restore_perms()) + ret = false; + } + + free(logline); + + /* + * Tell the user (in their locale). + */ + if (!ISSET(flags, SLOG_NO_STDERR)) { + sudoers_setlocale(SUDOERS_LOCALE_USER, NULL); + if (fmt == INCORRECT_PASSWORD_ATTEMPT) { + len = fmt_authfail_message(&message, ap2); + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + ret = false; + goto done; + } + sudo_warnx_nodebug("%s", message); + free(message); + } else { + if (ISSET(flags, SLOG_USE_ERRNO)) { + errno = errnum; + sudo_vwarn_nodebug(_(fmt), ap2); + } else if (ISSET(flags, SLOG_GAI_ERRNO)) { + sudo_gai_vwarn_nodebug(errnum, _(fmt), ap2); + } else + sudo_vwarnx_nodebug(_(fmt), ap2); + } + } + +done: + va_end(ap2); + sudoers_setlocale(oldlocale, NULL); + + debug_return_bool(ret); +} + +bool +log_warning(int flags, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(log_warning, SUDOERS_DEBUG_LOGGING) + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags|SLOG_USE_ERRNO, errno, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +bool +log_warningx(int flags, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(log_warningx, SUDOERS_DEBUG_LOGGING) + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags, 0, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +bool +gai_log_warning(int flags, int errnum, const char *fmt, ...) +{ + va_list ap; + bool ret; + debug_decl(gai_log_warning, SUDOERS_DEBUG_LOGGING) + + /* Log the error. */ + va_start(ap, fmt); + ret = vlog_warning(flags|SLOG_GAI_ERRNO, errnum, fmt, ap); + va_end(ap); + + debug_return_bool(ret); +} + +static void +closefrom_nodebug(int lowfd) +{ + unsigned char *debug_fds; + int fd, startfd; + debug_decl(closefrom_nodebug, SUDOERS_DEBUG_LOGGING) + + startfd = sudo_debug_get_fds(&debug_fds) + 1; + if (lowfd > startfd) + startfd = lowfd; + + /* Close fds higher than the debug fds. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "closing fds >= %d", startfd); + closefrom(startfd); + + /* Close fds [lowfd, startfd) that are not in debug_fds. */ + for (fd = lowfd; fd < startfd; fd++) { + if (sudo_isset(debug_fds, fd)) + continue; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "closing fd %d", fd); +#ifdef __APPLE__ + /* Avoid potential libdispatch crash when we close its fds. */ + (void) fcntl(fd, F_SETFD, FD_CLOEXEC); +#else + (void) close(fd); +#endif + } + debug_return; +} + +#define MAX_MAILFLAGS 63 + +static void __attribute__((__noreturn__)) +exec_mailer(int *pfd) +{ + char *last, *p, *argv[MAX_MAILFLAGS + 1]; + char *mflags, *mpath = def_mailerpath; + int i; +#ifdef NO_ROOT_MAILER + int perm = PERM_FULL_USER; +#else + int perm = PERM_ROOT; + static char *envp[] = { + "HOME=/", + "PATH=/usr/bin:/bin:/usr/sbin:/sbin", + "LOGNAME=root", + "USER=root", +# ifdef _AIX + "LOGIN=root", +# endif + NULL + }; +#endif /* NO_ROOT_MAILER */ + debug_decl(exec_mailer, SUDOERS_DEBUG_LOGGING) + + /* Set stdin to output side of the pipe */ + if (pfd[0] != STDIN_FILENO) { + if (dup2(pfd[0], STDIN_FILENO) == -1) { + mysyslog(LOG_ERR, _("unable to dup stdin: %m")); + sudo_debug_printf(SUDO_DEBUG_ERROR, + "unable to dup stdin: %s", strerror(errno)); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(127); + } + (void) close(pfd[0]); + } + (void) close(pfd[1]); + + /* Build up an argv based on the mailer path and flags */ + if ((mflags = strdup(def_mailerflags)) == NULL) { + mysyslog(LOG_ERR, _("unable to allocate memory")); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(127); + } + if ((argv[0] = strrchr(mpath, '/'))) + argv[0]++; + else + argv[0] = mpath; + + i = 1; + if ((p = strtok_r(mflags, " \t", &last))) { + do { + argv[i] = p; + } while (++i < MAX_MAILFLAGS && (p = strtok_r(NULL, " \t", &last))); + } + argv[i] = NULL; + + /* + * Depending on the config, either run the mailer as root + * (so user cannot kill it) or as the user (for the paranoid). + */ + (void) set_perms(perm); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); +#ifdef NO_ROOT_MAILER + execv(mpath, argv); +#else + execve(mpath, argv, envp); +#endif + mysyslog(LOG_ERR, _("unable to execute %s: %m"), mpath); + sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to execute %s: %s", + mpath, strerror(errno)); + _exit(127); +} + +/* + * Send a message to MAILTO user + */ +static bool +send_mail(const char *fmt, ...) +{ + FILE *mail; + char *p; + const char *timestr; + int fd, pfd[2], status; + pid_t pid, rv; + struct stat sb; + va_list ap; + debug_decl(send_mail, SUDOERS_DEBUG_LOGGING) + + /* If mailer is disabled just return. */ + if (!def_mailerpath || !def_mailto) + debug_return_bool(true); + + /* Make sure the mailer exists and is a regular file. */ + if (stat(def_mailerpath, &sb) != 0 || !S_ISREG(sb.st_mode)) + debug_return_bool(false); + + /* Fork and return, child will daemonize. */ + switch (pid = sudo_debug_fork()) { + case -1: + /* Error. */ + sudo_warn(U_("unable to fork")); + debug_return_bool(false); + break; + case 0: + /* Child. */ + switch (pid = fork()) { + case -1: + /* Error. */ + mysyslog(LOG_ERR, _("unable to fork: %m")); + sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to fork: %s", + strerror(errno)); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(1); + case 0: + /* Grandchild continues below. */ + sudo_debug_enter(__func__, __FILE__, __LINE__, sudo_debug_subsys); + break; + default: + /* Parent will wait for us. */ + _exit(0); + } + break; + default: + /* Parent. */ + for (;;) { + rv = waitpid(pid, &status, 0); + if (rv == -1 && errno != EINTR) + break; + if (rv != -1 && !WIFSTOPPED(status)) + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "child (%d) exit value %d", (int)rv, status); + debug_return_bool(true); + } + + /* Daemonize - disassociate from session/tty. */ + if (setsid() == -1) + sudo_warn("setsid"); + if (chdir("/") == -1) + sudo_warn("chdir(/)"); + fd = open(_PATH_DEVNULL, O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); + if (fd != -1) { + (void) dup2(fd, STDIN_FILENO); + (void) dup2(fd, STDOUT_FILENO); + (void) dup2(fd, STDERR_FILENO); + } + + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, NULL); + + /* Close non-debug fds so we don't leak anything. */ + closefrom_nodebug(STDERR_FILENO + 1); + + if (pipe(pfd) == -1) { + mysyslog(LOG_ERR, _("unable to open pipe: %m")); + sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to open pipe: %s", + strerror(errno)); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(1); + } + + switch (pid = sudo_debug_fork()) { + case -1: + /* Error. */ + mysyslog(LOG_ERR, _("unable to fork: %m")); + sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to fork: %s", + strerror(errno)); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(1); + break; + case 0: + /* Child. */ + exec_mailer(pfd); + /* NOTREACHED */ + } + + (void) close(pfd[0]); + mail = fdopen(pfd[1], "w"); + + /* Pipes are all setup, send message. */ + (void) fprintf(mail, "To: %s\nFrom: %s\nAuto-Submitted: %s\nSubject: ", + def_mailto, def_mailfrom ? def_mailfrom : user_name, "auto-generated"); + for (p = _(def_mailsub); *p; p++) { + /* Expand escapes in the subject */ + if (*p == '%' && *(p+1) != '%') { + switch (*(++p)) { + case 'h': + (void) fputs(user_host, mail); + break; + case 'u': + (void) fputs(user_name, mail); + break; + default: + p--; + break; + } + } else + (void) fputc(*p, mail); + } + +#ifdef HAVE_NL_LANGINFO + if (strcmp(def_sudoers_locale, "C") != 0) + (void) fprintf(mail, "\nContent-Type: text/plain; charset=\"%s\"\nContent-Transfer-Encoding: 8bit", nl_langinfo(CODESET)); +#endif /* HAVE_NL_LANGINFO */ + + if ((timestr = get_timestr(time(NULL), def_log_year)) == NULL) + timestr = "invalid date"; + (void) fprintf(mail, "\n\n%s : %s : %s : ", user_host, timestr, sudo_user_name); + va_start(ap, fmt); + (void) vfprintf(mail, fmt, ap); + va_end(ap); + fputs("\n\n", mail); + + fclose(mail); + for (;;) { + rv = waitpid(pid, &status, 0); + if (rv == -1 && errno != EINTR) + break; + if (rv != -1 && !WIFSTOPPED(status)) + break; + } + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "child (%d) exit value %d", (int)rv, status); + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + _exit(0); +} + +/* + * Determine whether we should send mail based on "status" and defaults options. + */ +static bool +should_mail(int status) +{ + debug_decl(should_mail, SUDOERS_DEBUG_LOGGING) + + debug_return_bool(def_mail_always || ISSET(status, VALIDATE_ERROR) || + (def_mail_all_cmnds && ISSET(sudo_mode, (MODE_RUN|MODE_EDIT))) || + (def_mail_no_user && ISSET(status, FLAG_NO_USER)) || + (def_mail_no_host && ISSET(status, FLAG_NO_HOST)) || + (def_mail_no_perms && !ISSET(status, VALIDATE_SUCCESS))); +} + +#define LL_TTY_STR "TTY=" +#define LL_CWD_STR "PWD=" /* XXX - should be CWD= */ +#define LL_USER_STR "USER=" +#define LL_GROUP_STR "GROUP=" +#define LL_ENV_STR "ENV=" +#define LL_CMND_STR "COMMAND=" +#define LL_TSID_STR "TSID=" + +#define IS_SESSID(s) ( \ + isalnum((unsigned char)(s)[0]) && isalnum((unsigned char)(s)[1]) && \ + (s)[2] == '/' && \ + isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \ + (s)[5] == '/' && \ + isalnum((unsigned char)(s)[6]) && isalnum((unsigned char)(s)[7]) && \ + (s)[8] == '\0') + +/* + * Allocate and fill in a new logline. + */ +static char * +new_logline(const char *message, const char *errstr) +{ + char *line = NULL, *evstr = NULL; +#ifndef SUDOERS_NO_SEQ + char sessid[7]; +#endif + const char *tsid = NULL; + size_t len = 0; + debug_decl(new_logline, SUDOERS_DEBUG_LOGGING) + +#ifndef SUDOERS_NO_SEQ + /* A TSID may be a sudoers-style session ID or a free-form string. */ + if (sudo_user.iolog_file != NULL) { + if (IS_SESSID(sudo_user.iolog_file)) { + sessid[0] = sudo_user.iolog_file[0]; + sessid[1] = sudo_user.iolog_file[1]; + sessid[2] = sudo_user.iolog_file[3]; + sessid[3] = sudo_user.iolog_file[4]; + sessid[4] = sudo_user.iolog_file[6]; + sessid[5] = sudo_user.iolog_file[7]; + sessid[6] = '\0'; + tsid = sessid; + } else { + tsid = sudo_user.iolog_file; + } + } +#endif + + /* + * Compute line length + */ + if (message != NULL) + len += strlen(message) + 3; + if (errstr != NULL) + len += strlen(errstr) + 3; + len += sizeof(LL_TTY_STR) + 2 + strlen(user_tty); + len += sizeof(LL_CWD_STR) + 2 + strlen(user_cwd); + if (runas_pw != NULL) + len += sizeof(LL_USER_STR) + 2 + strlen(runas_pw->pw_name); + if (runas_gr != NULL) + len += sizeof(LL_GROUP_STR) + 2 + strlen(runas_gr->gr_name); + if (tsid != NULL) + len += sizeof(LL_TSID_STR) + 2 + strlen(tsid); + if (sudo_user.env_vars != NULL) { + size_t evlen = 0; + char * const *ep; + + for (ep = sudo_user.env_vars; *ep != NULL; ep++) + evlen += strlen(*ep) + 1; + if (evlen != 0) { + if ((evstr = malloc(evlen)) == NULL) + goto oom; + evstr[0] = '\0'; + for (ep = sudo_user.env_vars; *ep != NULL; ep++) { + strlcat(evstr, *ep, evlen); + strlcat(evstr, " ", evlen); /* NOTE: last one will fail */ + } + len += sizeof(LL_ENV_STR) + 2 + evlen; + } + } + if (user_cmnd != NULL) { + /* Note: we log "sudo -l command arg ..." as "list command arg ..." */ + len += sizeof(LL_CMND_STR) - 1 + strlen(user_cmnd); + if (ISSET(sudo_mode, MODE_CHECK)) + len += sizeof("list ") - 1; + if (user_args != NULL) + len += strlen(user_args) + 1; + } + + /* + * Allocate and build up the line. + */ + if ((line = malloc(++len)) == NULL) + goto oom; + line[0] = '\0'; + + if (message != NULL) { + if (strlcat(line, message, len) >= len || + strlcat(line, errstr ? " : " : " ; ", len) >= len) + goto toobig; + } + if (errstr != NULL) { + if (strlcat(line, errstr, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + } + if (strlcat(line, LL_TTY_STR, len) >= len || + strlcat(line, user_tty, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + if (strlcat(line, LL_CWD_STR, len) >= len || + strlcat(line, user_cwd, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + if (runas_pw != NULL) { + if (strlcat(line, LL_USER_STR, len) >= len || + strlcat(line, runas_pw->pw_name, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + } + if (runas_gr != NULL) { + if (strlcat(line, LL_GROUP_STR, len) >= len || + strlcat(line, runas_gr->gr_name, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + } + if (tsid != NULL) { + if (strlcat(line, LL_TSID_STR, len) >= len || + strlcat(line, tsid, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + } + if (evstr != NULL) { + if (strlcat(line, LL_ENV_STR, len) >= len || + strlcat(line, evstr, len) >= len || + strlcat(line, " ; ", len) >= len) + goto toobig; + free(evstr); + evstr = NULL; + } + if (user_cmnd != NULL) { + if (strlcat(line, LL_CMND_STR, len) >= len) + goto toobig; + if (ISSET(sudo_mode, MODE_CHECK) && strlcat(line, "list ", len) >= len) + goto toobig; + if (strlcat(line, user_cmnd, len) >= len) + goto toobig; + if (user_args != NULL) { + if (strlcat(line, " ", len) >= len || + strlcat(line, user_args, len) >= len) + goto toobig; + } + } + + debug_return_str(line); +oom: + free(evstr); + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_str(NULL); +toobig: + free(evstr); + free(line); + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_str(NULL); +} diff --git a/utsudo-0.0.2/plugins/sudoers/logging.h b/utsudo-0.0.2/plugins/sudoers/logging.h new file mode 100644 index 0000000..f873425 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/logging.h @@ -0,0 +1,85 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2009-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LOGGING_H +#define SUDOERS_LOGGING_H + +#ifdef __STDC__ +# include +#else +# include +#endif + +/* + * Values for sudoers_setlocale() + */ +#define SUDOERS_LOCALE_USER 0 +#define SUDOERS_LOCALE_SUDOERS 1 + +/* Logging types */ +#define SLOG_SYSLOG 0x01 +#define SLOG_FILE 0x02 +#define SLOG_BOTH 0x03 + +/* Flags for log_warning()/log_warningx() */ +#define SLOG_USE_ERRNO 0x01 /* internal use only */ +#define SLOG_GAI_ERRNO 0x02 /* internal use only */ +#define SLOG_RAW_MSG 0x04 /* do not format msg before logging */ +#define SLOG_SEND_MAIL 0x08 /* log via mail */ +#define SLOG_NO_STDERR 0x10 /* do not log via stderr */ +#define SLOG_NO_LOG 0x20 /* do not log via file or syslog */ + +/* + * Maximum number of characters to log per entry. The syslogger + * will log this much, after that, it truncates the log line. + * We need this here to make sure that we continue with another + * syslog(3) call if the internal buffer is more than 1023 characters. + */ +#ifndef MAXSYSLOGLEN +# define MAXSYSLOGLEN 960 +#endif + +/* + * Indentation level for file-based logs when word wrap is enabled. + */ +#define LOG_INDENT " " + +/* XXX - needed for auditing */ +extern int NewArgc; +extern char **NewArgv; + +union sudo_defs_val; + +bool sudoers_warn_setlocale(bool restore, int *cookie); +bool sudoers_setlocale(int newlocale, int *prevlocale); +int sudoers_getlocale(void); +int audit_success(int argc, char *argv[]); +int audit_failure(int argc, char *argv[], char const *const fmt, ...) __printflike(3, 4); +bool log_allowed(int status); +bool log_auth_failure(int status, unsigned int tries); +bool log_denial(int status, bool inform_user); +bool log_failure(int status, int flags); +bool log_warning(int flags, const char *fmt, ...) __printflike(2, 3); +bool log_warningx(int flags, const char *fmt, ...) __printflike(2, 3); +bool gai_log_warning(int flags, int errnum, const char *fmt, ...) __printflike(3, 4); +bool sudoers_initlocale(const char *ulocale, const char *slocale); +bool sudoers_locale_callback(const union sudo_defs_val *); +int writeln_wrap(FILE *fp, char *line, size_t len, size_t maxlen); + +#endif /* SUDOERS_LOGGING_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/logwrap.c b/utsudo-0.0.2/plugins/sudoers/logwrap.c new file mode 100644 index 0000000..fcba62d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/logwrap.c @@ -0,0 +1,82 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011, 2014-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include "sudoers.h" + +int +writeln_wrap(FILE *fp, char *line, size_t linelen, size_t maxlen) +{ + char *indent = ""; + char *beg = line; + char *end; + int len, outlen = 0; + debug_decl(writeln_wrap, SUDOERS_DEBUG_LOGGING) + + /* + * Print out line with word wrap around maxlen characters. + */ + while (linelen > maxlen) { + end = beg + maxlen; + while (end != beg && *end != ' ') + end--; + if (beg == end) { + /* Unable to find word break within maxlen, look beyond. */ + end = strchr(beg + maxlen, ' '); + if (end == NULL) + break; /* no word break */ + } + len = fprintf(fp, "%s%.*s\n", indent, (int)(end - beg), beg); + if (len < 0) + debug_return_int(-1); + outlen += len; + while (*end == ' ') + end++; + linelen -= (end - beg); + beg = end; + if (indent[0] == '\0') { + indent = LOG_INDENT; + maxlen -= sizeof(LOG_INDENT) - 1; + } + } + /* Print remainder, if any. */ + if (linelen) { + len = fprintf(fp, "%s%s\n", indent, beg); + if (len < 0) + debug_return_int(-1); + outlen += len; + } + + debug_return_int(outlen); +} diff --git a/utsudo-0.0.2/plugins/sudoers/match.c b/utsudo-0.0.2/plugins/sudoers/match.c new file mode 100644 index 0000000..20f9082 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/match.c @@ -0,0 +1,674 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#ifdef HAVE_SYS_SYSTEMINFO_H +# include +#endif +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_NETGROUP_H +# include +#else +# include +#endif /* HAVE_NETGROUP_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include + +#ifdef HAVE_FNMATCH +# include +#else +# include "compat/fnmatch.h" +#endif /* HAVE_FNMATCH */ + +static struct member_list empty = TAILQ_HEAD_INITIALIZER(empty); + +/* + * Check whether user described by pw matches member. + * Returns ALLOW, DENY or UNSPEC. + */ +int +user_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member *m) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + int matched = UNSPEC; + struct alias *a; + debug_decl(user_matches, SUDOERS_DEBUG_MATCH) + + switch (m->type) { + case ALL: + matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, + def_netgroup_tuple ? lhost : NULL, + def_netgroup_tuple ? shost : NULL, pw->pw_name)) + matched = !m->negated; + break; + case USERGROUP: + if (usergr_matches(m->name, pw->pw_name, pw)) + matched = !m->negated; + break; + case ALIAS: + if ((a = alias_get(parse_tree, m->name, USERALIAS)) != NULL) { + /* XXX */ + int rc = userlist_matches(parse_tree, pw, &a->members); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + /* FALLTHROUGH */ + case WORD: + if (userpw_matches(m->name, pw->pw_name, pw)) + matched = !m->negated; + break; + } + debug_return_int(matched); +} + +/* + * Check for user described by pw in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +userlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member_list *list) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(userlist_matches, SUDOERS_DEBUG_MATCH) + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + if ((matched = user_matches(parse_tree, pw, m)) != UNSPEC) + break; + } + debug_return_int(matched); +} + +struct gid_list * +runas_getgroups(void) +{ + const struct passwd *pw; + debug_decl(runas_getgroups, SUDOERS_DEBUG_MATCH) + + if (def_preserve_groups) { + sudo_gidlist_addref(user_gid_list); + debug_return_ptr(user_gid_list); + } + + /* Only use results from a group db query, not the front end. */ + pw = runas_pw ? runas_pw : sudo_user.pw; + debug_return_ptr(sudo_get_gidlist(pw, ENTRY_TYPE_QUERIED)); +} + +/* + * Check for user described by pw in a list of members. + * If both lists are empty compare against def_runas_default. + * Returns ALLOW, DENY or UNSPEC. + */ +int +runaslist_matches(struct sudoers_parse_tree *parse_tree, + const struct member_list *user_list, const struct member_list *group_list, + struct member **matching_user, struct member **matching_group) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + int user_matched = UNSPEC; + int group_matched = UNSPEC; + struct member *m; + struct alias *a; + int rc; + debug_decl(runaslist_matches, SUDOERS_DEBUG_MATCH) + + if (ISSET(sudo_user.flags, RUNAS_USER_SPECIFIED) || !ISSET(sudo_user.flags, RUNAS_GROUP_SPECIFIED)) { + /* If no runas user or runas group listed in sudoers, use default. */ + if (user_list == NULL && group_list == NULL) { + debug_return_int(userpw_matches(def_runas_default, + runas_pw->pw_name, runas_pw)); + } + + if (user_list != NULL) { + TAILQ_FOREACH_REVERSE(m, user_list, member_list, entries) { + switch (m->type) { + case ALL: + user_matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, + def_netgroup_tuple ? lhost : NULL, + def_netgroup_tuple ? shost : NULL, + runas_pw->pw_name)) + user_matched = !m->negated; + break; + case USERGROUP: + if (usergr_matches(m->name, runas_pw->pw_name, runas_pw)) + user_matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, RUNASALIAS); + if (a != NULL) { + rc = runaslist_matches(parse_tree, &a->members, + &empty, matching_user, NULL); + if (rc != UNSPEC) + user_matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + /* FALLTHROUGH */ + case WORD: + if (userpw_matches(m->name, runas_pw->pw_name, runas_pw)) + user_matched = !m->negated; + break; + case MYSELF: + if (!ISSET(sudo_user.flags, RUNAS_USER_SPECIFIED) || + strcmp(user_name, runas_pw->pw_name) == 0) + user_matched = !m->negated; + break; + } + if (user_matched != UNSPEC) { + if (matching_user != NULL && m->type != ALIAS) + *matching_user = m; + break; + } + } + } + } + + /* + * Skip checking runas group if none was specified. + */ + if (ISSET(sudo_user.flags, RUNAS_GROUP_SPECIFIED)) { + if (user_matched == UNSPEC) { + if (strcmp(user_name, runas_pw->pw_name) == 0) + user_matched = ALLOW; /* only changing group */ + } + if (group_list != NULL) { + TAILQ_FOREACH_REVERSE(m, group_list, member_list, entries) { + switch (m->type) { + case ALL: + group_matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, RUNASALIAS); + if (a != NULL) { + rc = runaslist_matches(parse_tree, &empty, + &a->members, NULL, matching_group); + if (rc != UNSPEC) + group_matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + /* FALLTHROUGH */ + case WORD: + if (group_matches(m->name, runas_gr)) + group_matched = !m->negated; + break; + } + if (group_matched != UNSPEC) { + if (matching_group != NULL && m->type != ALIAS) + *matching_group = m; + break; + } + } + } + if (group_matched == UNSPEC) { + struct gid_list *runas_groups; + /* + * The runas group was not explicitly allowed by sudoers. + * Check whether it is one of the target user's groups. + */ + if (runas_pw->pw_gid == runas_gr->gr_gid) { + group_matched = ALLOW; /* runas group matches passwd db */ + } else if ((runas_groups = runas_getgroups()) != NULL) { + int i; + + for (i = 0; i < runas_groups->ngids; i++) { + if (runas_groups->gids[i] == runas_gr->gr_gid) { + group_matched = ALLOW; /* matched aux group vector */ + break; + } + } + sudo_gidlist_delref(runas_groups); + } + } + } + + if (user_matched == DENY || group_matched == DENY) + debug_return_int(DENY); + if (user_matched == group_matched || runas_gr == NULL) + debug_return_int(user_matched); + debug_return_int(UNSPEC); +} + +/* + * Check for lhost and shost in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +static int +hostlist_matches_int(struct sudoers_parse_tree *parse_tree, + const struct passwd *pw, const char *lhost, const char *shost, + const struct member_list *list) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(hostlist_matches, SUDOERS_DEBUG_MATCH) + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + matched = host_matches(parse_tree, pw, lhost, shost, m); + if (matched != UNSPEC) + break; + } + debug_return_int(matched); +} + +/* + * Check for user_runhost and user_srunhost in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +hostlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const struct member_list *list) +{ + const char *lhost = parse_tree->lhost ? parse_tree->lhost : user_runhost; + const char *shost = parse_tree->shost ? parse_tree->shost : user_srunhost; + + return hostlist_matches_int(parse_tree, pw, lhost, shost, list); +} + +/* + * Check whether host or shost matches member. + * Returns ALLOW, DENY or UNSPEC. + */ +int +host_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, + const char *lhost, const char *shost, const struct member *m) +{ + struct alias *a; + int matched = UNSPEC; + debug_decl(host_matches, SUDOERS_DEBUG_MATCH) + + switch (m->type) { + case ALL: + matched = !m->negated; + break; + case NETGROUP: + if (netgr_matches(m->name, lhost, shost, + def_netgroup_tuple ? pw->pw_name : NULL)) + matched = !m->negated; + break; + case NTWKADDR: + if (addr_matches(m->name)) + matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, HOSTALIAS); + if (a != NULL) { + /* XXX */ + int rc = hostlist_matches_int(parse_tree, pw, lhost, shost, + &a->members); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + break; + } + /* FALLTHROUGH */ + case WORD: + if (hostname_matches(shost, lhost, m->name)) + matched = !m->negated; + break; + } + debug_return_int(matched); +} + +/* + * Check for cmnd and args in a list of members. + * Returns ALLOW, DENY or UNSPEC. + */ +int +cmndlist_matches(struct sudoers_parse_tree *parse_tree, + const struct member_list *list) +{ + struct member *m; + int matched = UNSPEC; + debug_decl(cmndlist_matches, SUDOERS_DEBUG_MATCH) + + TAILQ_FOREACH_REVERSE(m, list, member_list, entries) { + matched = cmnd_matches(parse_tree, m); + if (matched != UNSPEC) + break; + } + debug_return_int(matched); +} + +/* + * Check cmnd and args. + * Returns ALLOW, DENY or UNSPEC. + */ +int +cmnd_matches(struct sudoers_parse_tree *parse_tree, const struct member *m) +{ + struct alias *a; + struct sudo_command *c; + int rc, matched = UNSPEC; + debug_decl(cmnd_matches, SUDOERS_DEBUG_MATCH) + + switch (m->type) { + case ALL: + matched = !m->negated; + break; + case ALIAS: + a = alias_get(parse_tree, m->name, CMNDALIAS); + if (a != NULL) { + rc = cmndlist_matches(parse_tree, &a->members); + if (rc != UNSPEC) + matched = m->negated ? !rc : rc; + alias_put(a); + } + break; + case COMMAND: + c = (struct sudo_command *)m->name; + if (command_matches(c->cmnd, c->args, c->digest)) + matched = !m->negated; + break; + } + debug_return_int(matched); +} + +/* + * Returns true if the hostname matches the pattern, else false + */ +bool +hostname_matches(const char *shost, const char *lhost, const char *pattern) +{ + const char *host; + bool rc; + debug_decl(hostname_matches, SUDOERS_DEBUG_MATCH) + + host = strchr(pattern, '.') != NULL ? lhost : shost; + if (has_meta(pattern)) { + rc = !fnmatch(pattern, host, FNM_CASEFOLD); + } else { + rc = !strcasecmp(host, pattern); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "host %s matches sudoers pattern %s: %s", + host, pattern, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the user/uid from sudoers matches the specified user/uid, + * else returns false. + */ +bool +userpw_matches(const char *sudoers_user, const char *user, const struct passwd *pw) +{ + const char *errstr; + uid_t uid; + bool rc; + debug_decl(userpw_matches, SUDOERS_DEBUG_MATCH) + + if (pw != NULL && *sudoers_user == '#') { + uid = (uid_t) sudo_strtoid(sudoers_user + 1, &errstr); + if (errstr == NULL && uid == pw->pw_uid) { + rc = true; + goto done; + } + } + if (def_case_insensitive_user) + rc = strcasecmp(sudoers_user, user) == 0; + else + rc = strcmp(sudoers_user, user) == 0; +done: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user %s matches sudoers user %s: %s", + user, sudoers_user, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the group/gid from sudoers matches the specified group/gid, + * else returns false. + */ +bool +group_matches(const char *sudoers_group, const struct group *gr) +{ + const char *errstr; + gid_t gid; + bool rc; + debug_decl(group_matches, SUDOERS_DEBUG_MATCH) + + if (*sudoers_group == '#') { + gid = (gid_t) sudo_strtoid(sudoers_group + 1, &errstr); + if (errstr == NULL && gid == gr->gr_gid) { + rc = true; + goto done; + } + } + if (def_case_insensitive_group) + rc = strcasecmp(sudoers_group, gr->gr_name) == 0; + else + rc = strcmp(sudoers_group, gr->gr_name) == 0; +done: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "group %s matches sudoers group %s: %s", + gr->gr_name, sudoers_group, rc ? "true" : "false"); + debug_return_bool(rc); +} + +/* + * Returns true if the given user belongs to the named group, + * else returns false. + */ +bool +usergr_matches(const char *group, const char *user, const struct passwd *pw) +{ + bool matched = false; + struct passwd *pw0 = NULL; + debug_decl(usergr_matches, SUDOERS_DEBUG_MATCH) + + /* Make sure we have a valid usergroup, sudo style */ + if (*group++ != '%') { + sudo_debug_printf(SUDO_DEBUG_DIAG, "user group %s has no leading '%%'", + group); + goto done; + } + + /* Query group plugin for %:name groups. */ + if (*group == ':' && def_group_plugin) { + if (group_plugin_query(user, group + 1, pw) == true) + matched = true; + goto done; + } + + /* Look up user's primary gid in the passwd file. */ + if (pw == NULL) { + if ((pw0 = sudo_getpwnam(user)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG, "unable to find %s in passwd db", + user); + goto done; + } + pw = pw0; + } + + if (user_in_group(pw, group)) { + matched = true; + goto done; + } + + /* Query the group plugin for Unix groups too? */ + if (def_group_plugin && def_always_query_group_plugin) { + if (group_plugin_query(user, group, pw) == true) { + matched = true; + goto done; + } + } + +done: + if (pw0 != NULL) + sudo_pw_delref(pw0); + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user %s matches group %s: %s", user, group, matched ? "true" : "false"); + debug_return_bool(matched); +} + +#if defined(HAVE_GETDOMAINNAME) || defined(SI_SRPC_DOMAIN) +/* + * Check the domain for invalid characters. + * Linux getdomainname(2) returns (none) if no domain is set. + */ +static bool +valid_domain(const char *domain) +{ + const char *cp; + debug_decl(valid_domain, SUDOERS_DEBUG_MATCH) + + for (cp = domain; *cp != '\0'; cp++) { + /* Check for illegal characters, Linux may use "(none)". */ + if (*cp == '(' || *cp == ')' || *cp == ',' || *cp == ' ') + break; + } + if (cp == domain || *cp != '\0') + debug_return_bool(false); + debug_return_bool(true); +} + +/* + * Get NIS-style domain name and copy from static storage or NULL if none. + */ +const char * +sudo_getdomainname(void) +{ + static char *domain; + static bool initialized; + debug_decl(sudo_getdomainname, SUDOERS_DEBUG_MATCH) + + if (!initialized) { + size_t host_name_max; + int rc; + +# ifdef _SC_HOST_NAME_MAX + host_name_max = (size_t)sysconf(_SC_HOST_NAME_MAX); + if (host_name_max == (size_t)-1) +# endif + host_name_max = 255; /* POSIX and historic BSD */ + + domain = malloc(host_name_max + 1); + if (domain != NULL) { + domain[0] = '\0'; +# ifdef SI_SRPC_DOMAIN + rc = sysinfo(SI_SRPC_DOMAIN, domain, host_name_max + 1); +# else + rc = getdomainname(domain, host_name_max + 1); +# endif + if (rc == -1 || !valid_domain(domain)) { + /* Error or invalid domain name. */ + free(domain); + domain = NULL; + } + } else { + /* XXX - want to pass error back to caller */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + } + initialized = true; + } + debug_return_str(domain); +} +#else +const char * +sudo_getdomainname(void) +{ + debug_decl(sudo_getdomainname, SUDOERS_DEBUG_MATCH) + debug_return_ptr(NULL); +} +#endif /* HAVE_GETDOMAINNAME || SI_SRPC_DOMAIN */ + +/* + * Returns true if "host" and "user" belong to the netgroup "netgr", + * else return false. Either of "lhost", "shost" or "user" may be NULL + * in which case that argument is not checked... + */ +bool +netgr_matches(const char *netgr, const char *lhost, const char *shost, const char *user) +{ +#ifdef HAVE_INNETGR + const char *domain; +#endif + bool rc = false; + debug_decl(netgr_matches, SUDOERS_DEBUG_MATCH) + + if (!def_use_netgroups) { + sudo_debug_printf(SUDO_DEBUG_INFO, "netgroups are disabled"); + debug_return_bool(false); + } + +#ifdef HAVE_INNETGR + /* make sure we have a valid netgroup, sudo style */ + if (*netgr++ != '+') { + sudo_debug_printf(SUDO_DEBUG_DIAG, "netgroup %s has no leading '+'", + netgr); + debug_return_bool(false); + } + + /* get the domain name (if any) */ + domain = sudo_getdomainname(); + + if (innetgr(netgr, lhost, user, domain)) + rc = true; + else if (lhost != shost && innetgr(netgr, shost, user, domain)) + rc = true; + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "netgroup %s matches (%s|%s, %s, %s): %s", netgr, lhost ? lhost : "", + shost ? shost : "", user ? user : "", domain ? domain : "", + rc ? "true" : "false"); +#endif /* HAVE_INNETGR */ + + debug_return_bool(rc); +} diff --git a/utsudo-0.0.2/plugins/sudoers/match_addr.c b/utsudo-0.0.2/plugins/sudoers/match_addr.c new file mode 100644 index 0000000..8b97c68 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/match_addr.c @@ -0,0 +1,213 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#ifdef NEED_RESOLV_H +# include +# include +#endif /* NEED_RESOLV_H */ + +#include "sudoers.h" +#include "interfaces.h" + +static bool +addr_matches_if(const char *n) +{ + union sudo_in_addr_un addr; + struct interface *ifp; +#ifdef HAVE_STRUCT_IN6_ADDR + unsigned int j; +#endif + unsigned int family; + debug_decl(addr_matches_if, SUDOERS_DEBUG_MATCH) + +#ifdef HAVE_STRUCT_IN6_ADDR + if (inet_pton(AF_INET6, n, &addr.ip6) == 1) { + family = AF_INET6; + } else +#endif /* HAVE_STRUCT_IN6_ADDR */ + if (inet_pton(AF_INET, n, &addr.ip4) == 1) { + family = AF_INET; + } else { + debug_return_bool(false); + } + + SLIST_FOREACH(ifp, get_interfaces(), entries) { + if (ifp->family != family) + continue; + switch (family) { + case AF_INET: + if (ifp->addr.ip4.s_addr == addr.ip4.s_addr || + (ifp->addr.ip4.s_addr & ifp->netmask.ip4.s_addr) + == addr.ip4.s_addr) + debug_return_bool(true); + break; +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: + if (memcmp(ifp->addr.ip6.s6_addr, addr.ip6.s6_addr, + sizeof(addr.ip6.s6_addr)) == 0) + debug_return_bool(true); + for (j = 0; j < sizeof(addr.ip6.s6_addr); j++) { + if ((ifp->addr.ip6.s6_addr[j] & ifp->netmask.ip6.s6_addr[j]) != addr.ip6.s6_addr[j]) + break; + } + if (j == sizeof(addr.ip6.s6_addr)) + debug_return_bool(true); + break; +#endif /* HAVE_STRUCT_IN6_ADDR */ + } + } + + debug_return_bool(false); +} + +static bool +addr_matches_if_netmask(const char *n, const char *m) +{ + unsigned int i; + union sudo_in_addr_un addr, mask; + struct interface *ifp; +#ifdef HAVE_STRUCT_IN6_ADDR + unsigned int j; +#endif + unsigned int family; + const char *errstr; + debug_decl(addr_matches_if, SUDOERS_DEBUG_MATCH) + +#ifdef HAVE_STRUCT_IN6_ADDR + if (inet_pton(AF_INET6, n, &addr.ip6) == 1) + family = AF_INET6; + else +#endif /* HAVE_STRUCT_IN6_ADDR */ + if (inet_pton(AF_INET, n, &addr.ip4) == 1) { + family = AF_INET; + } else { + debug_return_bool(false); + } + + if (family == AF_INET) { + if (strchr(m, '.')) { + if (inet_pton(AF_INET, m, &mask.ip4) != 1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv4 netmask %s: %s", m, "invalid value"); + debug_return_bool(false); + } + } else { + i = sudo_strtonum(m, 1, 32, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv4 netmask %s: %s", m, errstr); + debug_return_bool(false); + } + mask.ip4.s_addr = htonl(0xffffffffU << (32 - i)); + } + addr.ip4.s_addr &= mask.ip4.s_addr; + } +#ifdef HAVE_STRUCT_IN6_ADDR + else { + if (inet_pton(AF_INET6, m, &mask.ip6) != 1) { + j = sudo_strtonum(m, 1, 128, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "IPv6 netmask %s: %s", m, errstr); + debug_return_bool(false); + } + for (i = 0; i < sizeof(addr.ip6.s6_addr); i++) { + if (j < i * 8) + mask.ip6.s6_addr[i] = 0; + else if (i * 8 + 8 <= j) + mask.ip6.s6_addr[i] = 0xff; + else + mask.ip6.s6_addr[i] = 0xff00 >> (j - i * 8); + addr.ip6.s6_addr[i] &= mask.ip6.s6_addr[i]; + } + } + } +#endif /* HAVE_STRUCT_IN6_ADDR */ + + SLIST_FOREACH(ifp, get_interfaces(), entries) { + if (ifp->family != family) + continue; + switch (family) { + case AF_INET: + if ((ifp->addr.ip4.s_addr & mask.ip4.s_addr) == addr.ip4.s_addr) + debug_return_bool(true); + break; +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: + for (j = 0; j < sizeof(addr.ip6.s6_addr); j++) { + if ((ifp->addr.ip6.s6_addr[j] & mask.ip6.s6_addr[j]) != addr.ip6.s6_addr[j]) + break; + } + if (j == sizeof(addr.ip6.s6_addr)) + debug_return_bool(true); + break; +#endif /* HAVE_STRUCT_IN6_ADDR */ + } + } + + debug_return_bool(false); +} + +/* + * Returns true if "n" is one of our ip addresses or if + * "n" is a network that we are on, else returns false. + */ +bool +addr_matches(char *n) +{ + char *m; + bool rc; + debug_decl(addr_matches, SUDOERS_DEBUG_MATCH) + + /* If there's an explicit netmask, use it. */ + if ((m = strchr(n, '/'))) { + *m++ = '\0'; + rc = addr_matches_if_netmask(n, m); + *(m - 1) = '/'; + } else + rc = addr_matches_if(n); + + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "IP address %s matches local host: %s", n, rc ? "true" : "false"); + debug_return_bool(rc); +} diff --git a/utsudo-0.0.2/plugins/sudoers/match_command.c b/utsudo-0.0.2/plugins/sudoers/match_command.c new file mode 100644 index 0000000..a92d5fc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/match_command.c @@ -0,0 +1,542 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_GLOB +# include +#else +# include "compat/glob.h" +#endif /* HAVE_GLOB */ +#include +#include +#include + +#include "sudoers.h" +#include + +#ifdef HAVE_FNMATCH +# include +#else +# include "compat/fnmatch.h" +#endif /* HAVE_FNMATCH */ + +#if !defined(O_EXEC) && defined(O_PATH) +# define O_EXEC O_PATH +#endif + +static bool +command_args_match(const char *sudoers_cmnd, const char *sudoers_args) +{ + int flags = 0; + debug_decl(command_args_match, SUDOERS_DEBUG_MATCH) + + /* + * If no args specified in sudoers, any user args are allowed. + * If the empty string is specified in sudoers, no user args are allowed. + */ + if (!sudoers_args || (!user_args && !strcmp("\"\"", sudoers_args))) + debug_return_bool(true); + + /* + * If args are specified in sudoers, they must match the user args. + * If running as sudoedit, all args are assumed to be paths. + */ + if (strcmp(sudoers_cmnd, "sudoedit") == 0) + flags = FNM_PATHNAME; + if (fnmatch(sudoers_args, user_args ? user_args : "", flags) == 0) + debug_return_bool(true); + + debug_return_bool(false); +} + +/* + * Stat file by fd is possible, else by path. + * Returns true on success, else false. + */ +static bool +do_stat(int fd, const char *path, struct stat *sb) +{ + debug_decl(do_stat, SUDOERS_DEBUG_MATCH) + + if (fd != -1) + debug_return_bool(fstat(fd, sb) == 0); + debug_return_bool(stat(path, sb) == 0); +} + +/* + * Check whether the fd refers to a shell script with a "#!" shebang. + */ +static bool +is_script(int fd) +{ + bool ret = false; + char magic[2]; + debug_decl(is_script, SUDOERS_DEBUG_MATCH) + + if (read(fd, magic, 2) == 2) { + if (magic[0] == '#' && magic[1] == '!') + ret = true; + } + if (lseek(fd, (off_t)0, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to rewind script fd"); + } + debug_return_int(ret); +} + +/* + * Open path if fdexec is enabled or if a digest is present. + * Returns false on error, else true. + */ +static bool +open_cmnd(const char *path, const struct command_digest *digest, int *fdp) +{ + int fd = -1; + debug_decl(open_cmnd, SUDOERS_DEBUG_MATCH) + + /* Only open the file for fdexec or for digest matching. */ + if (def_fdexec != always && digest == NULL) + debug_return_bool(true); + + fd = open(path, O_RDONLY|O_NONBLOCK); +# ifdef O_EXEC + if (fd == -1 && errno == EACCES && digest == NULL) { + /* Try again with O_EXEC if no digest is specified. */ + const int saved_errno = errno; + if ((fd = open(path, O_EXEC)) == -1) + errno = saved_errno; + } +# endif + if (fd == -1) + debug_return_bool(false); + + (void)fcntl(fd, F_SETFD, FD_CLOEXEC); + *fdp = fd; + debug_return_bool(true); +} + +static void +set_cmnd_fd(int fd) +{ + debug_decl(set_cmnd_fd, SUDOERS_DEBUG_MATCH) + + if (cmnd_fd != -1) + close(cmnd_fd); + + if (fd != -1) { + if (def_fdexec == never) { + /* Never use fexedcve() */ + close(fd); + fd = -1; + } else if (is_script(fd)) { + char fdpath[PATH_MAX]; + struct stat sb; + int flags; + + /* We can only use fexecve() on a script if /dev/fd/N exists. */ + (void)snprintf(fdpath, sizeof(fdpath), "/dev/fd/%d", fd); + if (stat(fdpath, &sb) != 0) { + /* Missing /dev/fd file, can't use fexecve(). */ + close(fd); + fd = -1; + } else { + /* + * Shell scripts go through namei twice so we can't have the + * close on exec flag set on the fd for fexecve(2). + */ + flags = fcntl(fd, F_GETFD) & ~FD_CLOEXEC; + (void)fcntl(fd, F_SETFD, flags); + } + } + } + + cmnd_fd = fd; + + debug_return; +} + +/* + * Return true if user_cmnd names one of the inodes in dir, else false. + */ +static bool +command_matches_dir(const char *sudoers_dir, size_t dlen, + const struct command_digest *digest) +{ + struct stat sudoers_stat; + struct dirent *dent; + char buf[PATH_MAX]; + int fd = -1; + DIR *dirp; + debug_decl(command_matches_dir, SUDOERS_DEBUG_MATCH) + + /* + * Grot through directory entries, looking for user_base. + */ + dirp = opendir(sudoers_dir); + if (dirp == NULL) + debug_return_bool(false); + + if (strlcpy(buf, sudoers_dir, sizeof(buf)) >= sizeof(buf)) { + closedir(dirp); + debug_return_bool(false); + } + while ((dent = readdir(dirp)) != NULL) { + if (fd != -1) { + close(fd); + fd = -1; + } + + /* ignore paths > PATH_MAX (XXX - log) */ + buf[dlen] = '\0'; + if (strlcat(buf, dent->d_name, sizeof(buf)) >= sizeof(buf)) + continue; + + /* only stat if basenames are the same */ + if (strcmp(user_base, dent->d_name) != 0) + continue; + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(buf, digest, &fd)) + continue; + if (!do_stat(fd, buf, &sudoers_stat)) + continue; + + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + if (digest != NULL && !digest_matches(fd, buf, digest)) + continue; + free(safe_cmnd); + if ((safe_cmnd = strdup(buf)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + dent = NULL; + } + break; + } + } + closedir(dirp); + + if (dent != NULL) { + set_cmnd_fd(fd); + debug_return_bool(true); + } + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +static bool +command_matches_fnmatch(const char *sudoers_cmnd, const char *sudoers_args, + const struct command_digest *digest) +{ + struct stat sb; /* XXX - unused */ + int fd = -1; + debug_decl(command_matches_fnmatch, SUDOERS_DEBUG_MATCH) + + /* + * Return true if fnmatch(3) succeeds AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none required by sudoers OR + * c) there are args in sudoers and on command line and they match + * else return false. + */ + if (fnmatch(sudoers_cmnd, user_cmnd, FNM_PATHNAME) != 0) + debug_return_bool(false); + if (command_args_match(sudoers_cmnd, sudoers_args)) { + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(user_cmnd, digest, &fd)) + goto bad; + if (!do_stat(fd, user_cmnd, &sb)) + goto bad; + /* Check digest of user_cmnd since sudoers_cmnd is a pattern. */ + if (digest != NULL && !digest_matches(fd, user_cmnd, digest)) + goto bad; + set_cmnd_fd(fd); + + /* No need to set safe_cmnd since user_cmnd matches sudoers_cmnd */ + debug_return_bool(true); +bad: + if (fd != -1) { + close(fd); + fd = -1; + } + debug_return_bool(false); + } + debug_return_bool(false); +} + +static bool +command_matches_glob(const char *sudoers_cmnd, const char *sudoers_args, + const struct command_digest *digest) +{ + struct stat sudoers_stat; + bool bad_digest = false; + char **ap, *base, *cp; + int fd = -1; + size_t dlen; + glob_t gl; + debug_decl(command_matches_glob, SUDOERS_DEBUG_MATCH) + + /* + * First check to see if we can avoid the call to glob(3). + * Short circuit if there are no meta chars in the command itself + * and user_base and basename(sudoers_cmnd) don't match. + */ + dlen = strlen(sudoers_cmnd); + if (sudoers_cmnd[dlen - 1] != '/') { + if ((base = strrchr(sudoers_cmnd, '/')) != NULL) { + base++; + if (!has_meta(base) && strcmp(user_base, base) != 0) + debug_return_bool(false); + } + } + /* + * Return true if we find a match in the glob(3) results AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none required by sudoers OR + * c) there are args in sudoers and on command line and they match + * else return false. + */ + if (glob(sudoers_cmnd, GLOB_NOSORT, NULL, &gl) != 0 || gl.gl_pathc == 0) { + globfree(&gl); + debug_return_bool(false); + } + /* If user_cmnd is fully-qualified, check for an exact match. */ + if (user_cmnd[0] == '/') { + for (ap = gl.gl_pathv; (cp = *ap) != NULL; ap++) { + if (fd != -1) { + close(fd); + fd = -1; + } + if (strcmp(cp, user_cmnd) != 0) + continue; + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(cp, digest, &fd)) + continue; + if (!do_stat(fd, cp, &sudoers_stat)) + continue; + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + /* There could be multiple matches, check digest early. */ + if (digest != NULL && !digest_matches(fd, cp, digest)) { + bad_digest = true; + continue; + } + free(safe_cmnd); + if ((safe_cmnd = strdup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + cp = NULL; /* fail closed */ + } + } else { + /* Paths match, but st_dev and st_ino are different. */ + cp = NULL; /* fail closed */ + } + goto done; + } + } + /* No exact match, compare basename, st_dev and st_ino. */ + if (!bad_digest) { + for (ap = gl.gl_pathv; (cp = *ap) != NULL; ap++) { + if (fd != -1) { + close(fd); + fd = -1; + } + + /* If it ends in '/' it is a directory spec. */ + dlen = strlen(cp); + if (cp[dlen - 1] == '/') { + if (command_matches_dir(cp, dlen, digest)) + debug_return_bool(true); + continue; + } + + /* Only proceed if user_base and basename(cp) match */ + if ((base = strrchr(cp, '/')) != NULL) + base++; + else + base = cp; + if (strcmp(user_base, base) != 0) + continue; + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(cp, digest, &fd)) + continue; + if (!do_stat(fd, cp, &sudoers_stat)) + continue; + if (user_stat == NULL || + (user_stat->st_dev == sudoers_stat.st_dev && + user_stat->st_ino == sudoers_stat.st_ino)) { + if (digest != NULL && !digest_matches(fd, cp, digest)) + continue; + free(safe_cmnd); + if ((safe_cmnd = strdup(cp)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + cp = NULL; /* fail closed */ + } + goto done; + } + } + } +done: + globfree(&gl); + if (cp != NULL) { + if (command_args_match(sudoers_cmnd, sudoers_args)) { + /* safe_cmnd was set above. */ + set_cmnd_fd(fd); + debug_return_bool(true); + } + } + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +static bool +command_matches_normal(const char *sudoers_cmnd, const char *sudoers_args, const struct command_digest *digest) +{ + struct stat sudoers_stat; + const char *base; + size_t dlen; + int fd = -1; + debug_decl(command_matches_normal, SUDOERS_DEBUG_MATCH) + + /* If it ends in '/' it is a directory spec. */ + dlen = strlen(sudoers_cmnd); + if (sudoers_cmnd[dlen - 1] == '/') + debug_return_bool(command_matches_dir(sudoers_cmnd, dlen, digest)); + + /* Only proceed if user_base and basename(sudoers_cmnd) match */ + if ((base = strrchr(sudoers_cmnd, '/')) == NULL) + base = sudoers_cmnd; + else + base++; + if (strcmp(user_base, base) != 0) + debug_return_bool(false); + + /* Open the file for fdexec or for digest matching. */ + if (!open_cmnd(sudoers_cmnd, digest, &fd)) + goto bad; + + /* + * Return true if command matches AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none req by sudoers OR + * c) there are args in sudoers and on command line and they match + * d) there is a digest and it matches + */ + if (user_stat != NULL && do_stat(fd, sudoers_cmnd, &sudoers_stat)) { + if (user_stat->st_dev != sudoers_stat.st_dev || + user_stat->st_ino != sudoers_stat.st_ino) + goto bad; + } else { + /* Either user or sudoers command does not exist, match by name. */ + if (strcmp(user_cmnd, sudoers_cmnd) != 0) + goto bad; + } + if (!command_args_match(sudoers_cmnd, sudoers_args)) + goto bad; + if (digest != NULL && !digest_matches(fd, sudoers_cmnd, digest)) { + /* XXX - log functions not available but we should log very loudly */ + goto bad; + } + free(safe_cmnd); + if ((safe_cmnd = strdup(sudoers_cmnd)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + set_cmnd_fd(fd); + debug_return_bool(true); +bad: + if (fd != -1) + close(fd); + debug_return_bool(false); +} + +/* + * If path doesn't end in /, return true iff cmnd & path name the same inode; + * otherwise, return true if user_cmnd names one of the inodes in path. + */ +bool +command_matches(const char *sudoers_cmnd, const char *sudoers_args, const struct command_digest *digest) +{ + bool rc = false; + debug_decl(command_matches, SUDOERS_DEBUG_MATCH) + + /* Check for pseudo-commands */ + if (sudoers_cmnd[0] != '/') { + /* + * Return true if both sudoers_cmnd and user_cmnd are "sudoedit" AND + * a) there are no args in sudoers OR + * b) there are no args on command line and none req by sudoers OR + * c) there are args in sudoers and on command line and they match + */ + if (strcmp(sudoers_cmnd, "sudoedit") == 0 && + strcmp(user_cmnd, "sudoedit") == 0 && + command_args_match(sudoers_cmnd, sudoers_args)) { + /* No need to set safe_cmnd since user_cmnd matches sudoers_cmnd */ + rc = true; + } + goto done; + } + + if (has_meta(sudoers_cmnd)) { + /* + * If sudoers_cmnd has meta characters in it, we need to + * use glob(3) and/or fnmatch(3) to do the matching. + */ + if (def_fast_glob) + rc = command_matches_fnmatch(sudoers_cmnd, sudoers_args, digest); + else + rc = command_matches_glob(sudoers_cmnd, sudoers_args, digest); + } else { + rc = command_matches_normal(sudoers_cmnd, sudoers_args, digest); + } +done: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "user command \"%s%s%s\" matches sudoers command \"%s%s%s\": %s", + user_cmnd, user_args ? " " : "", user_args ? user_args : "", + sudoers_cmnd, sudoers_args ? " " : "", sudoers_args ? sudoers_args : "", + rc ? "true" : "false"); + debug_return_bool(rc); +} diff --git a/utsudo-0.0.2/plugins/sudoers/match_digest.c b/utsudo-0.0.2/plugins/sudoers/match_digest.c new file mode 100644 index 0000000..a531185 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/match_digest.c @@ -0,0 +1,109 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2019 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudoers.h" +#include + +bool +digest_matches(int fd, const char *file, const struct command_digest *digest) +{ + unsigned char *file_digest = NULL; + unsigned char *sudoers_digest = NULL; + bool matched = false; + size_t digest_len; + debug_decl(digest_matches, SUDOERS_DEBUG_MATCH) + + if (fd == -1) + goto done; + + file_digest = sudo_filedigest(fd, file, digest->digest_type, &digest_len); + if (lseek(fd, (off_t)0, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to rewind digest fd"); + } + if (file_digest == NULL) { + /* Warning (if any) printed by sudo_filedigest() */ + goto done; + } + + /* Convert the command digest from ascii to binary. */ + if ((sudoers_digest = malloc(digest_len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + if (strlen(digest->digest_str) == digest_len * 2) { + /* Convert ascii hex to binary. */ + unsigned int i; + for (i = 0; i < digest_len; i++) { + const int h = hexchar(&digest->digest_str[i + i]); + if (h == -1) + goto bad_format; + sudoers_digest[i] = (unsigned char)h; + } + } else { + /* Convert base64 to binary. */ + size_t len = base64_decode(digest->digest_str, sudoers_digest, digest_len); + if (len != digest_len) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "incorrect length for digest, expected %zu, got %zu", + digest_len, len); + goto bad_format; + } + } + + if (memcmp(file_digest, sudoers_digest, digest_len) == 0) { + matched = true; + } else { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "%s digest mismatch for %s, expecting %s", + digest_type_to_name(digest->digest_type), file, digest->digest_str); + } + goto done; + +bad_format: + sudo_warnx(U_("digest for %s (%s) is not in %s form"), file, + digest->digest_str, digest_type_to_name(digest->digest_type)); +done: + free(sudoers_digest); + free(file_digest); + debug_return_bool(matched); +} diff --git a/utsudo-0.0.2/plugins/sudoers/mkdefaults b/utsudo-0.0.2/plugins/sudoers/mkdefaults new file mode 100755 index 0000000..885c1b5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/mkdefaults @@ -0,0 +1,164 @@ +#!/usr/bin/env perl +# +# Generate sudo_defs_table and associated defines +# +# Input should be formatted thusly: +# +# var_name +# TYPE +# description (or NULL) +# array of struct def_values if TYPE == T_TUPLE + +use warnings; +use strict; + +my ($header, $cfile, $infile); + +# Deal with optional -o (output) argument +if ($#ARGV > 0 && $ARGV[0] eq "-o") { + shift; + $header = $cfile = shift; + $header .= '.h'; + $cfile .= '.c'; +} +die "usage: $0 [input_file]\n" unless $#ARGV == -1 || $#ARGV == 0; + +$infile = $ARGV[0] || "def_data.in"; +if (!defined($header)) { + $header = $infile; + $header =~ s/(\.in)?$/.h/; +} +if (!defined($cfile)) { + $cfile = $infile; + $cfile =~ s/(\.in)?$/.c/; +} + +open(IN, "<$infile") || die "$0: can't open $infile: $!\n"; +open(HEADER, ">$header") || die "$0: can't open $header: $!\n"; +open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n"; + +my $count = 0; +my @tuple_values = ( "never" ); +my @records = (); +my ($var, $type, $desc, $values, $callback, $field); +while () { + chomp; + s/\s*#.*$//; + next if /^\s*$/; + + if (/^\S/) { + # Store previous record and begin new one + $records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var); + + $var = $_; + $type = ''; + $desc = undef; + $values = undef; + $callback = undef; + $field = 0; + } else { + $field++; + s/^\s+//; + s/\s+$//; + if ($field == 1) { + # type + $type = $_; + } elsif ($field == 2) { + # description + if ($_ eq "NULL") { + $desc = "NULL"; + } else { + # Strip leading and trailing double quote and escape the rest + s/^"//; + s/"$//; + s/"/\\"/g; + $desc = "N_(\"$_\")"; + } + } elsif ($field == 3 || $field == 4) { + if (s/^\*//) { + $callback = $_; + } else { + die "$0: syntax error near line $.\n" if $type !~ /^T_TUPLE/; + $values = [ split ]; + foreach my $v (@$values) { + push(@tuple_values, $v) unless grep(/^$v$/, @tuple_values); + } + } + } else { + die "$0: syntax error near line $.\n"; + } + } +} +$records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var); + +# Print out value arrays +for (my $i = 0; $i < $count; $i++) { + if (defined($records[$i]->[3])) { + die "Values list specified for non-tuple\n" unless + $records[$i]->[1] =~ /^T_TUPLE/; + printf CFILE "static struct def_values def_data_%s[] = {\n", + $records[$i]->[0]; + foreach (@{$records[$i]->[3]}) { + print CFILE " { \"$_\", $_ },\n"; + } + print CFILE " { NULL, 0 },\n"; + print CFILE "};\n\n"; + } +} + +# Print each record +print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n {\n"; +for (my $i = 0; $i < $count; $i++) { + print_record($records[$i], $i); +} +print CFILE "\tNULL, 0, NULL\n }\n};\n"; + +# Print out def_tuple +if (@tuple_values) { + print HEADER "\nenum def_tuple {\n"; + for (my $i = 0; $i <= $#tuple_values; $i++) { + printf HEADER "\t%s%s\n", $tuple_values[$i], + $i != $#tuple_values ? "," : ""; + } + print HEADER "};\n"; +} + +close(IN); +close(HEADER); +close(CFILE); + +exit(0); + +sub print_record { + my ($rec, $recnum) = @_; + my ($i, $v, $defname); + + # each variable gets a macro to access its value + $defname = "I_" . uc($rec->[0]); + printf HEADER "#define %-23s %d\n", $defname, $recnum; + for ($rec->[1]) { + if (/^T_INT/) { $v = "ival"; } + elsif (/^T_UINT/) { $v = "uival"; } + elsif (/^T_STR/) { $v = "str"; } + elsif (/^T_FLAG/) { $v = "flag"; } + elsif (/^T_MODE/) { $v = "mode"; } + elsif (/^T_LIST/) { $v = "list"; } + elsif (/^T_LOGFAC/) { $v = "ival"; } + elsif (/^T_LOGPRI/) { $v = "ival"; } + elsif (/^T_TUPLE/) { $v = "tuple"; } + elsif (/^T_TIMESPEC/) { $v = "tspec"; } + elsif (/^T_TIMEOUT/) { $v = "ival"; } + else { die "$0: unknown defaults type: $_\n"; } + } + printf HEADER "#define %-23s (sudo_defs_table[$defname].sd_un.${v})\n", + "def_$rec->[0]"; + + print CFILE "\t\"$rec->[0]\", $rec->[1],\n\t$rec->[2],\n"; + if (defined($rec->[3])) { + printf CFILE "\tdef_data_$rec->[0],\n"; + } else { + printf CFILE "\tNULL,\n"; + } + printf CFILE "\t$rec->[4],\n" if defined($rec->[4]); + print CFILE " }, {\n"; +} diff --git a/utsudo-0.0.2/plugins/sudoers/mkdir_parents.c b/utsudo-0.0.2/plugins/sudoers/mkdir_parents.c new file mode 100644 index 0000000..692cf8d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/mkdir_parents.c @@ -0,0 +1,95 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" + +/* + * Create any parent directories needed by path (but not path itself). + * Note that path is modified but is restored before it returns. + */ +bool +sudo_mkdir_parents(char *path, uid_t uid, gid_t gid, mode_t mode, bool quiet) +{ + struct stat sb; + char *slash = path; + debug_decl(sudo_mkdir_parents, SUDOERS_DEBUG_UTIL) + + /* cppcheck-suppress nullPointerRedundantCheck */ + while ((slash = strchr(slash + 1, '/')) != NULL) { + *slash = '\0'; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "mkdir %s, mode 0%o, uid %d, gid %d", path, (unsigned int)mode, + (int)uid, (int)gid); + if (mkdir(path, mode) == 0) { + if (uid != (uid_t)-1 && gid != (gid_t)-1) { + if (chown(path, uid, gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)uid, (int)gid, path); + } + } + } else { + if (errno != EEXIST) { + if (!quiet) + sudo_warn(U_("unable to mkdir %s"), path); + goto bad; + } + /* Already exists, make sure it is a directory. */ + if (stat(path, &sb) != 0) { + if (!quiet) + sudo_warn(U_("unable to stat %s"), path); + goto bad; + } + if (!S_ISDIR(sb.st_mode)) { + if (!quiet) + sudo_warnx(U_("%s exists but is not a directory (0%o)"), + path, (unsigned int) sb.st_mode); + goto bad; + } + } + *slash = '/'; + } + + debug_return_bool(true); +bad: + /* We must restore the path before we return. */ + *slash = '/'; + debug_return_bool(false); +} diff --git a/utsudo-0.0.2/plugins/sudoers/parse.c b/utsudo-0.0.2/plugins/sudoers/parse.c new file mode 100644 index 0000000..2853093 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/parse.c @@ -0,0 +1,865 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudo_lbuf.h" +#include + +/* + * Look up the user in the sudoers parse tree for pseudo-commands like + * list, verify and kill. + */ +static int +sudoers_lookup_pseudo(struct sudo_nss_list *snl, struct passwd *pw, + int validated, int pwflag) +{ + int match; + struct sudo_nss *nss; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + struct defaults *def; + int nopass; + enum def_tuple pwcheck; + debug_decl(sudoers_lookup_pseudo, SUDOERS_DEBUG_PARSER) + + pwcheck = (pwflag == -1) ? never : sudo_defs_table[pwflag].sd_un.tuple; + nopass = (pwcheck == never || pwcheck == all) ? true : false; + + if (list_pw == NULL) + SET(validated, FLAG_NO_CHECK); + CLR(validated, FLAG_NO_USER); + CLR(validated, FLAG_NO_HOST); + match = DENY; + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + SET(validated, VALIDATE_ERROR); + break; + } + TAILQ_FOREACH(us, &nss->parse_tree->userspecs, entries) { + if (userlist_matches(nss->parse_tree, pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH(priv, &us->privileges, entries) { + int priv_nopass = UNSPEC; + + if (hostlist_matches(nss->parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + TAILQ_FOREACH(def, &priv->defaults, entries) { + if (strcmp(def->var, "authenticate") == 0) + priv_nopass = !def->op; + } + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (pwcheck == any) { + if (cs->tags.nopasswd == true || priv_nopass == true) + nopass = true; + } else if (pwcheck == all) { + if (cs->tags.nopasswd != true && priv_nopass != true) + nopass = false; + } + if (match == ALLOW) + continue; + /* Only check the command when listing another user. */ + if (user_uid == 0 || list_pw == NULL || + user_uid == list_pw->pw_uid || + cmnd_matches(nss->parse_tree, cs->cmnd) == ALLOW) + match = ALLOW; + } + } + } + } + if (match == ALLOW || user_uid == 0) { + /* User has an entry for this host. */ + SET(validated, VALIDATE_SUCCESS); + } else if (match == DENY) + SET(validated, VALIDATE_FAILURE); + if (pwcheck == always && def_authenticate) + SET(validated, FLAG_CHECK_USER); + else if (nopass == true) + def_authenticate = false; + debug_return_int(validated); +} + +static int +sudoers_lookup_check(struct sudo_nss *nss, struct passwd *pw, + int *validated, struct cmndspec **matching_cs, + struct defaults_list **defs, time_t now) +{ + int host_match, runas_match, cmnd_match; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + struct member *matching_user; + debug_decl(sudoers_lookup_check, SUDOERS_DEBUG_PARSER) + + TAILQ_FOREACH_REVERSE(us, &nss->parse_tree->userspecs, userspec_list, entries) { + if (userlist_matches(nss->parse_tree, pw, &us->users) != ALLOW) + continue; + CLR(*validated, FLAG_NO_USER); + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + host_match = hostlist_matches(nss->parse_tree, pw, &priv->hostlist); + if (host_match == ALLOW) + CLR(*validated, FLAG_NO_HOST); + else + continue; + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + if (cs->notbefore != UNSPEC) { + if (now < cs->notbefore) + continue; + } + if (cs->notafter != UNSPEC) { + if (now > cs->notafter) + continue; + } + matching_user = NULL; + runas_match = runaslist_matches(nss->parse_tree, + cs->runasuserlist, cs->runasgrouplist, &matching_user, + NULL); + if (runas_match == ALLOW) { + cmnd_match = cmnd_matches(nss->parse_tree, cs->cmnd); + if (cmnd_match != UNSPEC) { + /* + * If user is running command as himself, + * set runas_pw = sudo_user.pw. + * XXX - hack, want more general solution + */ + if (matching_user && matching_user->type == MYSELF) { + sudo_pw_delref(runas_pw); + sudo_pw_addref(sudo_user.pw); + runas_pw = sudo_user.pw; + } + *matching_cs = cs; + *defs = &priv->defaults; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "userspec matched @ %s:%d %s", us->file, us->lineno, + cmnd_match ? "allowed" : "denied"); + debug_return_int(cmnd_match); + } + } + } + } + } + debug_return_int(UNSPEC); +} + +/* + * Apply cmndspec-specific settngs including SELinux role/type, + * Solaris privs, and command tags. + */ +static bool +apply_cmndspec(struct cmndspec *cs) +{ + debug_decl(apply_cmndspec, SUDOERS_DEBUG_PARSER) + + if (cs != NULL) { +#ifdef HAVE_SELINUX + /* Set role and type if not specified on command line. */ + if (user_role == NULL) { + if (cs->role != NULL) { + user_role = strdup(cs->role); + if (user_role == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + user_role = def_role; + } + } + if (user_type == NULL) { + if (cs->type != NULL) { + user_type = strdup(cs->type); + if (user_type == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + user_type = def_type; + } + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Set Solaris privilege sets */ + if (runas_privs == NULL) { + if (cs->privs != NULL) { + runas_privs = strdup(cs->privs); + if (runas_privs == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + runas_privs = def_privs; + } + } + if (runas_limitprivs == NULL) { + if (cs->limitprivs != NULL) { + runas_limitprivs = strdup(cs->limitprivs); + if (runas_limitprivs == NULL) { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + debug_return_bool(false); + } + } else { + runas_limitprivs = def_limitprivs; + } + } +#endif /* HAVE_PRIV_SET */ + if (cs->timeout > 0) + def_command_timeout = cs->timeout; + if (cs->tags.nopasswd != UNSPEC) + def_authenticate = !cs->tags.nopasswd; + if (cs->tags.noexec != UNSPEC) + def_noexec = cs->tags.noexec; + if (cs->tags.setenv != UNSPEC) + def_setenv = cs->tags.setenv; + if (cs->tags.log_input != UNSPEC) + def_log_input = cs->tags.log_input; + if (cs->tags.log_output != UNSPEC) + def_log_output = cs->tags.log_output; + if (cs->tags.send_mail != UNSPEC) { + if (cs->tags.send_mail) { + def_mail_all_cmnds = true; + } else { + def_mail_all_cmnds = false; + def_mail_always = false; + def_mail_no_perms = false; + } + } + if (cs->tags.follow != UNSPEC) + def_sudoedit_follow = cs->tags.follow; + } + + debug_return_bool(true); +} + +/* + * Look up the user in the sudoers parse tree and check to see if they are + * allowed to run the specified command on this host as the target user. + */ +int +sudoers_lookup(struct sudo_nss_list *snl, struct passwd *pw, int validated, + int pwflag) +{ + struct defaults_list *defs = NULL; + struct sudoers_parse_tree *parse_tree = NULL; + struct cmndspec *cs = NULL; + struct sudo_nss *nss; + int m, match = UNSPEC; + time_t now; + debug_decl(sudoers_lookup, SUDOERS_DEBUG_PARSER) + + /* + * Special case checking the "validate", "list" and "kill" pseudo-commands. + */ + if (pwflag) + debug_return_int(sudoers_lookup_pseudo(snl, pw, validated, pwflag)); + + /* Need to be runas user while stat'ing things. */ + if (!set_perms(PERM_RUNAS)) + debug_return_int(validated); + + /* Query each sudoers source and check the user. */ + time(&now); + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + SET(validated, VALIDATE_ERROR); + break; + } + + m = sudoers_lookup_check(nss, pw, &validated, &cs, &defs, now); + if (m != UNSPEC) { + match = m; + parse_tree = nss->parse_tree; + } + + if (!sudo_nss_can_continue(nss, m)) + break; + } + if (match != UNSPEC) { + if (defs != NULL) + update_defaults(parse_tree, defs, SETDEF_GENERIC, false); + if (!apply_cmndspec(cs)) + SET(validated, VALIDATE_ERROR); + else if (match == ALLOW) + SET(validated, VALIDATE_SUCCESS); + else + SET(validated, VALIDATE_FAILURE); + } + if (!restore_perms()) + SET(validated, VALIDATE_ERROR); + debug_return_int(validated); +} + +static int +display_priv_short(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct userspec *us, struct sudo_lbuf *lbuf) +{ + struct privilege *priv; + int nfound = 0; + debug_decl(display_priv_short, SUDOERS_DEBUG_PARSER) + + TAILQ_FOREACH(priv, &us->privileges, entries) { + struct cmndspec *cs, *prev_cs = NULL; + struct cmndtag tags; + + if (hostlist_matches(parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + + sudoers_defaults_list_to_tags(&priv->defaults, &tags); + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + /* Start a new line if RunAs changes. */ + if (prev_cs == NULL || RUNAS_CHANGED(cs, prev_cs)) { + struct member *m; + + if (cs != TAILQ_FIRST(&priv->cmndlist)) + sudo_lbuf_append(lbuf, "\n"); + sudo_lbuf_append(lbuf, " ("); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } else if (cs->runasgrouplist == NULL) { + sudo_lbuf_append(lbuf, "%s", def_runas_default); + } else { + sudo_lbuf_append(lbuf, "%s", pw->pw_name); + } + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, " : "); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } + sudo_lbuf_append(lbuf, ") "); + } else if (cs != TAILQ_FIRST(&priv->cmndlist)) { + sudo_lbuf_append(lbuf, ", "); + } + sudoers_format_cmndspec(lbuf, parse_tree, cs, prev_cs, tags, true); + prev_cs = cs; + nfound++; + } + sudo_lbuf_append(lbuf, "\n"); + } + debug_return_int(nfound); +} + +/* + * Compare the current cmndspec with the previous one to determine + * whether we need to start a new long entry for "sudo -ll". + * Returns true if we should start a new long entry, else false. + */ +static bool +new_long_entry(struct cmndspec *cs, struct cmndspec *prev_cs) +{ + debug_decl(new_long_entry, SUDOERS_DEBUG_PARSER) + + if (prev_cs == NULL) + debug_return_bool(true); + if (RUNAS_CHANGED(cs, prev_cs) || TAGS_CHANGED(prev_cs->tags, cs->tags)) + debug_return_bool(true); +#ifdef HAVE_PRIV_SET + if (cs->privs && (!prev_cs->privs || strcmp(cs->privs, prev_cs->privs) != 0)) + debug_return_bool(true); + if (cs->limitprivs && (!prev_cs->limitprivs || strcmp(cs->limitprivs, prev_cs->limitprivs) != 0)) + debug_return_bool(true); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role && (!prev_cs->role || strcmp(cs->role, prev_cs->role) != 0)) + debug_return_bool(true); + if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0)) + debug_return_bool(true); +#endif /* HAVE_SELINUX */ + if (cs->timeout != prev_cs->timeout) + debug_return_bool(true); + if (cs->notbefore != prev_cs->notbefore) + debug_return_bool(true); + if (cs->notafter != prev_cs->notafter) + debug_return_bool(true); + debug_return_bool(false); +} + +static int +display_priv_long(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct userspec *us, struct sudo_lbuf *lbuf) +{ + struct privilege *priv; + int nfound = 0; + debug_decl(display_priv_long, SUDOERS_DEBUG_PARSER) + + TAILQ_FOREACH(priv, &us->privileges, entries) { + struct cmndspec *cs, *prev_cs; + + if (hostlist_matches(parse_tree, pw, &priv->hostlist) != ALLOW) + continue; + prev_cs = NULL; + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + struct defaults *d; + struct member *m; + + if (new_long_entry(cs, prev_cs)) { + int olen; + + if (priv->ldap_role != NULL) { + sudo_lbuf_append(lbuf, _("\nLDAP Role: %s\n"), + priv->ldap_role); + } else { + sudo_lbuf_append(lbuf, _("\nSudoers entry:\n")); + } + sudo_lbuf_append(lbuf, _(" RunAsUsers: ")); + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m != TAILQ_FIRST(cs->runasuserlist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + } else if (cs->runasgrouplist == NULL) { + sudo_lbuf_append(lbuf, "%s", def_runas_default); + } else { + sudo_lbuf_append(lbuf, "%s", pw->pw_name); + } + sudo_lbuf_append(lbuf, "\n"); + if (cs->runasgrouplist != NULL) { + sudo_lbuf_append(lbuf, _(" RunAsGroups: ")); + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m != TAILQ_FIRST(cs->runasgrouplist)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, ", ", + RUNASALIAS); + } + sudo_lbuf_append(lbuf, "\n"); + } + olen = lbuf->len; + sudo_lbuf_append(lbuf, _(" Options: ")); + TAILQ_FOREACH(d, &priv->defaults, entries) { + sudoers_format_default(lbuf, d); + sudo_lbuf_append(lbuf, ", "); + } + if (TAG_SET(cs->tags.setenv)) + sudo_lbuf_append(lbuf, "%ssetenv, ", cs->tags.setenv ? "" : "!"); + if (TAG_SET(cs->tags.noexec)) + sudo_lbuf_append(lbuf, "%snoexec, ", cs->tags.noexec ? "" : "!"); + if (TAG_SET(cs->tags.nopasswd)) + sudo_lbuf_append(lbuf, "%sauthenticate, ", cs->tags.nopasswd ? "!" : ""); + if (TAG_SET(cs->tags.log_input)) + sudo_lbuf_append(lbuf, "%slog_input, ", cs->tags.log_input ? "" : "!"); + if (TAG_SET(cs->tags.log_output)) + sudo_lbuf_append(lbuf, "%slog_output, ", cs->tags.log_output ? "" : "!"); + if (lbuf->buf[lbuf->len - 2] == ',') { + lbuf->len -= 2; /* remove trailing ", " */ + sudo_lbuf_append(lbuf, "\n"); + } else { + lbuf->len = olen; /* no options */ + } +#ifdef HAVE_PRIV_SET + if (cs->privs) + sudo_lbuf_append(lbuf, " Privs: %s\n", cs->privs); + if (cs->limitprivs) + sudo_lbuf_append(lbuf, " Limitprivs: %s\n", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (cs->role) + sudo_lbuf_append(lbuf, " Role: %s\n", cs->role); + if (cs->type) + sudo_lbuf_append(lbuf, " Type: %s\n", cs->type); +#endif /* HAVE_SELINUX */ + if (cs->timeout > 0) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + (void)snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, " Timeout: %s\n", numbuf); + } + if (cs->notbefore != UNSPEC) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notbefore); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, " NotBefore: %s\n", buf); + } + if (cs->notafter != UNSPEC) { + char buf[sizeof("CCYYMMDDHHMMSSZ")]; + struct tm *tm = gmtime(&cs->notafter); + if (strftime(buf, sizeof(buf), "%Y%m%d%H%M%SZ", tm) != 0) + sudo_lbuf_append(lbuf, " NotAfter: %s\n", buf); + } + sudo_lbuf_append(lbuf, _(" Commands:\n")); + } + sudo_lbuf_append(lbuf, "\t"); + sudoers_format_member(lbuf, parse_tree, cs->cmnd, "\n\t", + CMNDALIAS); + sudo_lbuf_append(lbuf, "\n"); + prev_cs = cs; + nfound++; + } + } + debug_return_int(nfound); +} + +static int +sudo_display_userspecs(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct sudo_lbuf *lbuf, bool verbose) +{ + struct userspec *us; + int nfound = 0; + debug_decl(sudo_display_userspecs, SUDOERS_DEBUG_PARSER) + + TAILQ_FOREACH(us, &parse_tree->userspecs, entries) { + if (userlist_matches(parse_tree, pw, &us->users) != ALLOW) + continue; + + if (verbose) + nfound += display_priv_long(parse_tree, pw, us, lbuf); + else + nfound += display_priv_short(parse_tree, pw, us, lbuf); + } + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display matching Defaults entries for the given user on this host. + */ +static int +display_defaults(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + struct sudo_lbuf *lbuf) +{ + struct defaults *d; + char *prefix; + int nfound = 0; + debug_decl(display_defaults, SUDOERS_DEBUG_PARSER) + + if (lbuf->len == 0 || isspace((unsigned char)lbuf->buf[lbuf->len - 1])) + prefix = " "; + else + prefix = ", "; + + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + switch (d->type) { + case DEFAULTS_HOST: + if (hostlist_matches(parse_tree, pw, d->binding) != ALLOW) + continue; + break; + case DEFAULTS_USER: + if (userlist_matches(parse_tree, pw, d->binding) != ALLOW) + continue; + break; + case DEFAULTS_RUNAS: + case DEFAULTS_CMND: + continue; + } + sudo_lbuf_append(lbuf, "%s", prefix); + sudoers_format_default(lbuf, d); + prefix = ", "; + nfound++; + } + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display Defaults entries of the given type. + */ +static int +display_bound_defaults_by_type(struct sudoers_parse_tree *parse_tree, + int deftype, struct sudo_lbuf *lbuf) +{ + struct defaults *d; + struct member_list *binding = NULL; + struct member *m; + char *dsep; + int atype, nfound = 0; + debug_decl(display_bound_defaults_by_type, SUDOERS_DEBUG_PARSER) + + switch (deftype) { + case DEFAULTS_HOST: + atype = HOSTALIAS; + dsep = "@"; + break; + case DEFAULTS_USER: + atype = USERALIAS; + dsep = ":"; + break; + case DEFAULTS_RUNAS: + atype = RUNASALIAS; + dsep = ">"; + break; + case DEFAULTS_CMND: + atype = CMNDALIAS; + dsep = "!"; + break; + default: + debug_return_int(-1); + } + TAILQ_FOREACH(d, &parse_tree->defaults, entries) { + if (d->type != deftype) + continue; + + nfound++; + if (binding != d->binding) { + binding = d->binding; + if (nfound != 1) + sudo_lbuf_append(lbuf, "\n"); + sudo_lbuf_append(lbuf, " Defaults%s", dsep); + TAILQ_FOREACH(m, binding, entries) { + if (m != TAILQ_FIRST(binding)) + sudo_lbuf_append(lbuf, ","); + sudoers_format_member(lbuf, parse_tree, m, ", ", atype); + sudo_lbuf_append(lbuf, " "); + } + } else + sudo_lbuf_append(lbuf, ", "); + sudoers_format_default(lbuf, d); + } + + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +/* + * Display Defaults entries that are per-runas or per-command + */ +static int +display_bound_defaults(struct sudoers_parse_tree *parse_tree, + struct passwd *pw, struct sudo_lbuf *lbuf) +{ + int nfound = 0; + debug_decl(display_bound_defaults, SUDOERS_DEBUG_PARSER) + + /* XXX - should only print ones that match what the user can do. */ + nfound += display_bound_defaults_by_type(parse_tree, DEFAULTS_RUNAS, lbuf); + nfound += display_bound_defaults_by_type(parse_tree, DEFAULTS_CMND, lbuf); + + if (sudo_lbuf_error(lbuf)) + debug_return_int(-1); + debug_return_int(nfound); +} + +static int +output(const char *buf) +{ + struct sudo_conv_message msg; + struct sudo_conv_reply repl; + debug_decl(output, SUDOERS_DEBUG_NSS) + + /* Call conversation function */ + memset(&msg, 0, sizeof(msg)); + msg.msg_type = SUDO_CONV_INFO_MSG; + msg.msg = buf; + memset(&repl, 0, sizeof(repl)); + if (sudo_conv(1, &msg, &repl, NULL) == -1) + debug_return_int(0); + debug_return_int(strlen(buf)); +} + +/* + * Print out privileges for the specified user. + * Returns true on success or -1 on error. + */ +int +display_privs(struct sudo_nss_list *snl, struct passwd *pw, bool verbose) +{ + struct sudo_nss *nss; + struct sudo_lbuf def_buf, priv_buf; + struct stat sb; + int cols, count, olen, n; + debug_decl(display_privs, SUDOERS_DEBUG_PARSER) + + cols = sudo_user.cols; + if (fstat(STDOUT_FILENO, &sb) == 0 && S_ISFIFO(sb.st_mode)) + cols = 0; + sudo_lbuf_init(&def_buf, output, 4, NULL, cols); + sudo_lbuf_init(&priv_buf, output, 8, NULL, cols); + + sudo_lbuf_append(&def_buf, _("Matching Defaults entries for %s on %s:\n"), + pw->pw_name, user_srunhost); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + n = display_defaults(nss->parse_tree, pw, &def_buf); + if (n == -1) + goto bad; + count += n; + } + if (count != 0) { + sudo_lbuf_append(&def_buf, "\n\n"); + } else { + /* Undo Defaults header. */ + def_buf.len = 0; + } + + /* Display Runas and Cmnd-specific defaults. */ + olen = def_buf.len; + sudo_lbuf_append(&def_buf, _("Runas and Command-specific defaults for %s:\n"), + pw->pw_name); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + n = display_bound_defaults(nss->parse_tree, pw, &def_buf); + if (n == -1) + goto bad; + count += n; + } + if (count != 0) { + sudo_lbuf_append(&def_buf, "\n\n"); + } else { + /* Undo Defaults header. */ + def_buf.len = olen; + } + + /* Display privileges from all sources. */ + sudo_lbuf_append(&priv_buf, + _("User %s may run the following commands on %s:\n"), + pw->pw_name, user_srunhost); + count = 0; + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) != -1) { + n = sudo_display_userspecs(nss->parse_tree, pw, &priv_buf, verbose); + if (n == -1) + goto bad; + count += n; + } + } + if (count == 0) { + def_buf.len = 0; + priv_buf.len = 0; + sudo_lbuf_append(&priv_buf, + _("User %s is not allowed to run sudo on %s.\n"), + pw->pw_name, user_srunhost); + } + if (sudo_lbuf_error(&def_buf) || sudo_lbuf_error(&priv_buf)) + goto bad; + + sudo_lbuf_print(&def_buf); + sudo_lbuf_print(&priv_buf); + + sudo_lbuf_destroy(&def_buf); + sudo_lbuf_destroy(&priv_buf); + + debug_return_int(true); +bad: + sudo_lbuf_destroy(&def_buf); + sudo_lbuf_destroy(&priv_buf); + + debug_return_int(-1); +} + +static int +display_cmnd_check(struct sudoers_parse_tree *parse_tree, struct passwd *pw, + time_t now) +{ + int host_match, runas_match, cmnd_match; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + debug_decl(display_cmnd_check, SUDOERS_DEBUG_PARSER) + + TAILQ_FOREACH_REVERSE(us, &parse_tree->userspecs, userspec_list, entries) { + if (userlist_matches(parse_tree, pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + host_match = hostlist_matches(parse_tree, pw, &priv->hostlist); + if (host_match != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + if (cs->notbefore != UNSPEC) { + if (now < cs->notbefore) + continue; + } + if (cs->notafter != UNSPEC) { + if (now > cs->notafter) + continue; + } + runas_match = runaslist_matches(parse_tree, cs->runasuserlist, + cs->runasgrouplist, NULL, NULL); + if (runas_match == ALLOW) { + cmnd_match = cmnd_matches(parse_tree, cs->cmnd); + if (cmnd_match != UNSPEC) + debug_return_int(cmnd_match); + } + } + } + } + debug_return_int(UNSPEC); +} + +/* + * Check user_cmnd against sudoers and print the matching entry if the + * command is allowed. + * Returns true if the command is allowed, false if not or -1 on error. + */ +int +display_cmnd(struct sudo_nss_list *snl, struct passwd *pw) +{ + struct sudo_nss *nss; + int m, match = UNSPEC; + int ret = false; + time_t now; + debug_decl(display_cmnd, SUDOERS_DEBUG_PARSER) + + /* Iterate over each source, checking for the command. */ + time(&now); + TAILQ_FOREACH(nss, snl, entries) { + if (nss->query(nss, pw) == -1) { + /* The query function should have printed an error message. */ + debug_return_int(-1); + } + + m = display_cmnd_check(nss->parse_tree, pw, now); + if (m != UNSPEC) + match = m; + + if (!sudo_nss_can_continue(nss, m)) + break; + } + if (match == ALLOW) { + const int len = sudo_printf(SUDO_CONV_INFO_MSG, "%s%s%s\n", + safe_cmnd, user_args ? " " : "", user_args ? user_args : ""); + ret = len < 0 ? -1 : true; + } + debug_return_int(ret); +} diff --git a/utsudo-0.0.2/plugins/sudoers/parse.h b/utsudo-0.0.2/plugins/sudoers/parse.h new file mode 100644 index 0000000..f5961f7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/parse.h @@ -0,0 +1,378 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2000, 2004, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_PARSE_H +#define SUDOERS_PARSE_H + +#include "sudo_queue.h" + +/* Characters that must be quoted in sudoers. */ +#define SUDOERS_QUOTED ":\\,=#\"" + +/* Returns true if string 's' contains meta characters. */ +#define has_meta(s) (strpbrk(s, "\\?*[]") != NULL) + +#undef UNSPEC +#define UNSPEC -1 +#undef DENY +#define DENY 0 +#undef ALLOW +#define ALLOW 1 +#undef IMPLIED +#define IMPLIED 2 + +/* + * Initialize all tags to UNSPEC. + */ +#define TAGS_INIT(t) do { \ + (t).follow = UNSPEC; \ + (t).log_input = UNSPEC; \ + (t).log_output = UNSPEC; \ + (t).noexec = UNSPEC; \ + (t).nopasswd = UNSPEC; \ + (t).send_mail = UNSPEC; \ + (t).setenv = UNSPEC; \ +} while (0) + +/* + * Copy any tags set in t2 into t, overriding the value in t. + */ +#define TAGS_MERGE(t, t2) do { \ + if ((t2).follow != UNSPEC) \ + (t).follow = (t2).follow; \ + if ((t2).log_input != UNSPEC) \ + (t).log_input = (t2).log_input; \ + if ((t2).log_output != UNSPEC) \ + (t).log_output = (t2).log_output; \ + if ((t2).noexec != UNSPEC) \ + (t).noexec = (t2).noexec; \ + if ((t2).nopasswd != UNSPEC) \ + (t).nopasswd = (t2).nopasswd; \ + if ((t2).send_mail != UNSPEC) \ + (t).send_mail = (t2).send_mail; \ + if ((t2).setenv != UNSPEC) \ + (t).setenv = (t2).setenv; \ +} while (0) + +/* + * Returns true if any tag are not UNSPEC, else false. + */ +#define TAGS_SET(t) \ + ((t).follow != UNSPEC || (t).log_input != UNSPEC || \ + (t).log_output != UNSPEC || (t).noexec != UNSPEC || \ + (t).nopasswd != UNSPEC || (t).send_mail != UNSPEC || \ + (t).setenv != UNSPEC) + +/* + * Returns true if the specified tag is not UNSPEC or IMPLIED, else false. + */ +#define TAG_SET(tt) \ + ((tt) != UNSPEC && (tt) != IMPLIED) + +/* + * Returns true if any tags set in nt differ between ot and nt, else false. + */ +#define TAGS_CHANGED(ot, nt) \ + ((TAG_SET((nt).follow) && (nt).follow != (ot).follow) || \ + (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \ + (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \ + (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \ + (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \ + (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \ + (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail)) + +/* + * Returns true if the runas user and group lists match, else false. + */ +#define RUNAS_CHANGED(cs1, cs2) \ + ((cs1)->runasuserlist != (cs2)->runasuserlist || \ + (cs1)->runasgrouplist != (cs2)->runasgrouplist) + +struct command_digest { + unsigned int digest_type; + char *digest_str; +}; + +/* + * A command with option args and digest. + * XXX - merge into struct member + */ +struct sudo_command { + char *cmnd; + char *args; + struct command_digest *digest; +}; + +/* + * Tags associated with a command. + * Possible values: true, false, IMPLIED, UNSPEC. + */ +struct cmndtag { + signed int nopasswd: 3; + signed int noexec: 3; + signed int setenv: 3; + signed int log_input: 3; + signed int log_output: 3; + signed int send_mail: 3; + signed int follow: 3; +}; + +/* + * Per-command option container struct. + */ +struct command_options { + time_t notbefore; /* time restriction */ + time_t notafter; /* time restriction */ + int timeout; /* command timeout */ +#ifdef HAVE_SELINUX + char *role, *type; /* SELinux role and type */ +#endif +#ifdef HAVE_PRIV_SET + char *privs, *limitprivs; /* Solaris privilege sets */ +#endif +}; + +/* + * The parsed sudoers file is stored as a collection of linked lists, + * modelled after the yacc grammar. + * + * Other than the alias struct, which is stored in a red-black tree, + * the data structure used is a doubly-linked tail queue. While sudoers + * is being parsed, a headless tail queue is used where the first entry + * acts as the head and the prev pointer does double duty as the tail pointer. + * This makes it possible to trivally append sub-lists. In addition, the prev + * pointer is always valid (even if it points to itself). Unlike a circle + * queue, the next pointer of the last entry is NULL and does not point back + * to the head. When the tail queue is finalized, it is converted to a + * normal BSD tail queue. + */ + +/* + * Tail queue list head structure. + */ +TAILQ_HEAD(defaults_list, defaults); +TAILQ_HEAD(userspec_list, userspec); +TAILQ_HEAD(member_list, member); +TAILQ_HEAD(privilege_list, privilege); +TAILQ_HEAD(cmndspec_list, cmndspec); +STAILQ_HEAD(comment_list, sudoers_comment); + +/* + * Structure describing a user specification and list thereof. + */ +struct userspec { + TAILQ_ENTRY(userspec) entries; + struct member_list users; /* list of users */ + struct privilege_list privileges; /* list of privileges */ + struct comment_list comments; /* optional comments */ + int lineno; /* line number in sudoers */ + char *file; /* name of sudoers file */ +}; + +/* + * Structure describing a privilege specification. + */ +struct privilege { + TAILQ_ENTRY(privilege) entries; + char *ldap_role; /* LDAP sudoRole */ + struct member_list hostlist; /* list of hosts */ + struct cmndspec_list cmndlist; /* list of Cmnd_Specs */ + struct defaults_list defaults; /* list of sudoOptions */ +}; + +/* + * Structure describing a linked list of Cmnd_Specs. + * XXX - include struct command_options instad of its contents inline + */ +struct cmndspec { + TAILQ_ENTRY(cmndspec) entries; + struct member_list *runasuserlist; /* list of runas users */ + struct member_list *runasgrouplist; /* list of runas groups */ + struct member *cmnd; /* command to allow/deny */ + struct cmndtag tags; /* tag specificaion */ + int timeout; /* command timeout */ + time_t notbefore; /* time restriction */ + time_t notafter; /* time restriction */ +#ifdef HAVE_SELINUX + char *role, *type; /* SELinux role and type */ +#endif +#ifdef HAVE_PRIV_SET + char *privs, *limitprivs; /* Solaris privilege sets */ +#endif +}; + +/* + * Generic structure to hold users, hosts, commands. + */ +struct member { + TAILQ_ENTRY(member) entries; + char *name; /* member name */ + short type; /* type (see gram.h) */ + short negated; /* negated via '!'? */ +}; + +struct runascontainer { + struct member *runasusers; + struct member *runasgroups; +}; + +struct sudoers_comment { + STAILQ_ENTRY(sudoers_comment) entries; + char *str; +}; + +/* + * Generic structure to hold {User,Host,Runas,Cmnd}_Alias + * Aliases are stored in a red-black tree, sorted by name and type. + */ +struct alias { + char *name; /* alias name */ + unsigned short type; /* {USER,HOST,RUNAS,CMND}ALIAS */ + short used; /* "used" flag for cycle detection */ + int lineno; /* line number of alias entry */ + char *file; /* file the alias entry was in */ + struct member_list members; /* list of alias members */ +}; + +/* + * Structure describing a Defaults entry in sudoers. + */ +struct defaults { + TAILQ_ENTRY(defaults) entries; + char *var; /* variable name */ + char *val; /* variable value */ + struct member_list *binding; /* user/host/runas binding */ + char *file; /* file Defaults entry was in */ + short type; /* DEFAULTS{,_USER,_RUNAS,_HOST} */ + char op; /* true, false, '+', '-' */ + char error; /* parse error flag */ + int lineno; /* line number of Defaults entry */ +}; + +/* + * Parsed sudoers policy. + */ +struct sudoers_parse_tree { + struct userspec_list userspecs; + struct defaults_list defaults; + struct rbtree *aliases; + const char *shost, *lhost; +}; + +/* alias.c */ +struct rbtree *alloc_aliases(void); +void free_aliases(struct rbtree *aliases); +bool no_aliases(struct sudoers_parse_tree *parse_tree); +const char *alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type, char *file, int lineno, struct member *members); +const char *alias_type_to_string(int alias_type); +struct alias *alias_get(struct sudoers_parse_tree *parse_tree, const char *name, int type); +struct alias *alias_remove(struct sudoers_parse_tree *parse_tree, char *name, int type); +bool alias_find_used(struct sudoers_parse_tree *parse_tree, struct rbtree *used_aliases); +void alias_apply(struct sudoers_parse_tree *parse_tree, int (*func)(struct sudoers_parse_tree *, struct alias *, void *), void *cookie); +void alias_free(void *a); +void alias_put(struct alias *a); + +/* gram.c */ +extern struct sudoers_parse_tree parsed_policy; +bool init_parser(const char *path, bool quiet); +void free_member(struct member *m); +void free_members(struct member_list *members); +void free_privilege(struct privilege *priv); +void free_userspec(struct userspec *us); +void free_userspecs(struct userspec_list *usl); +void free_default(struct defaults *def, struct member_list **binding); +void free_defaults(struct defaults_list *defs); +void init_parse_tree(struct sudoers_parse_tree *parse_tree, const char *shost, const char *lhost); +void free_parse_tree(struct sudoers_parse_tree *parse_tree); +void reparent_parse_tree(struct sudoers_parse_tree *new_tree); + +/* match_addr.c */ +bool addr_matches(char *n); + +/* match_command.c */ +bool command_matches(const char *sudoers_cmnd, const char *sudoers_args, const struct command_digest *digest); + +/* match_digest.c */ +bool digest_matches(int fd, const char *file, const struct command_digest *digest); + +/* match.c */ +struct group; +struct passwd; +bool group_matches(const char *sudoers_group, const struct group *gr); +bool hostname_matches(const char *shost, const char *lhost, const char *pattern); +bool netgr_matches(const char *netgr, const char *lhost, const char *shost, const char *user); +bool usergr_matches(const char *group, const char *user, const struct passwd *pw); +bool userpw_matches(const char *sudoers_user, const char *user, const struct passwd *pw); +int cmnd_matches(struct sudoers_parse_tree *parse_tree, const struct member *m); +int cmndlist_matches(struct sudoers_parse_tree *parse_tree, const struct member_list *list); +int host_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const char *host, const char *shost, const struct member *m); +int hostlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member_list *list); +int runaslist_matches(struct sudoers_parse_tree *parse_tree, const struct member_list *user_list, const struct member_list *group_list, struct member **matching_user, struct member **matching_group); +int user_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member *m); +int userlist_matches(struct sudoers_parse_tree *parse_tree, const struct passwd *pw, const struct member_list *list); +const char *sudo_getdomainname(void); +struct gid_list *runas_getgroups(void); + +/* toke.c */ +void init_lexer(void); + +/* hexchar.c */ +int hexchar(const char *s); + +/* base64.c */ +size_t base64_decode(const char *str, unsigned char *dst, size_t dsize); +size_t base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len); + +/* timeout.c */ +int parse_timeout(const char *timestr); + +/* gmtoff.c */ +long get_gmtoff(time_t *clock); + +/* gentime.c */ +time_t parse_gentime(const char *expstr); + +/* filedigest.c */ +unsigned char *sudo_filedigest(int fd, const char *file, int digest_type, size_t *digest_len); + +/* digestname.c */ +const char *digest_type_to_name(int digest_type); + +/* parse.c */ +struct sudo_nss_list; +int sudoers_lookup(struct sudo_nss_list *snl, struct passwd *pw, int validated, int pwflag); +int display_privs(struct sudo_nss_list *snl, struct passwd *pw, bool verbose); +int display_cmnd(struct sudo_nss_list *snl, struct passwd *pw); + +/* parse_ldif.c */ +bool sudoers_parse_ldif(struct sudoers_parse_tree *parse_tree, FILE *fp, const char *sudoers_base, bool store_options); + +/* fmtsudoers.c */ +struct sudo_lbuf; +bool sudoers_format_cmndspec(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct cmndspec *cs, struct cmndspec *prev_cs, struct cmndtag tags, bool expand_aliases); +bool sudoers_format_default(struct sudo_lbuf *lbuf, struct defaults *d); +bool sudoers_format_default_line(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct defaults *d, struct defaults **next, bool expand_aliases); +bool sudoers_format_member(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct member *m, const char *separator, int alias_type); +bool sudoers_format_privilege(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct privilege *priv, bool expand_aliases); +bool sudoers_format_userspec(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, struct userspec *us, bool expand_aliases); +bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct sudoers_parse_tree *parse_tree, const char *separator, bool expand_aliases, bool flush); +bool sudoers_defaults_to_tags(const char *var, const char *val, int op, struct cmndtag *tags); +bool sudoers_defaults_list_to_tags(struct defaults_list *defs, struct cmndtag *tags); + +#endif /* SUDOERS_PARSE_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/parse_ldif.c b/utsudo-0.0.2/plugins/sudoers/parse_ldif.c new file mode 100644 index 0000000..99dbbc5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/parse_ldif.c @@ -0,0 +1,768 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "sudoers.h" +#include "sudo_ldap.h" +#include "redblack.h" +#include "strlist.h" +#include + +struct sudo_role { + STAILQ_ENTRY(sudo_role) entries; + char *cn; + char *notbefore; + char *notafter; + double order; + struct sudoers_str_list *cmnds; + struct sudoers_str_list *hosts; + struct sudoers_str_list *users; + struct sudoers_str_list *runasusers; + struct sudoers_str_list *runasgroups; + struct sudoers_str_list *options; +}; +STAILQ_HEAD(sudo_role_list, sudo_role); + +static void +sudo_role_free(struct sudo_role *role) +{ + debug_decl(sudo_role_free, SUDOERS_DEBUG_UTIL) + + if (role != NULL) { + free(role->cn); + free(role->notbefore); + free(role->notafter); + str_list_free(role->cmnds); + str_list_free(role->hosts); + str_list_free(role->users); + str_list_free(role->runasusers); + str_list_free(role->runasgroups); + str_list_free(role->options); + free(role); + } + + debug_return; +} + +static struct sudo_role * +sudo_role_alloc(void) +{ + struct sudo_role *role; + debug_decl(sudo_role_alloc, SUDOERS_DEBUG_UTIL) + + role = calloc(1, sizeof(*role)); + if (role != NULL) { + role->cmnds = str_list_alloc(); + role->hosts = str_list_alloc(); + role->users = str_list_alloc(); + role->runasusers = str_list_alloc(); + role->runasgroups = str_list_alloc(); + role->options = str_list_alloc(); + if (role->cmnds == NULL || role->hosts == NULL || + role->users == NULL || role->runasusers == NULL || + role->runasgroups == NULL || role->options == NULL) { + sudo_role_free(role); + role = NULL; + } + } + + debug_return_ptr(role); +} + +/* + * Parse an LDIF line, filling in attribute name and value. + * Modifies line, decodes base64 attribute values if present. + * See http://www.faqs.org/rfcs/rfc2849.html + */ +static bool +ldif_parse_attribute(char *line, char **name, char **value) +{ + bool encoded = false; + char *attr, *cp, *ep, *colon; + size_t len; + debug_decl(ldif_parse_attribute, SUDOERS_DEBUG_UTIL) + + /* Parse attribute name: [a-zA-Z][a-zA-Z0-9-]*: */ + if (!isalpha((unsigned char)*line)) + debug_return_bool(false); + for (cp = line + 1; *cp != ':' && *cp != '\0'; cp++) { + if (!isalnum((unsigned char)*cp) && *cp != '-') + debug_return_bool(false); + } + if (*cp != ':') + debug_return_bool(false); + colon = cp++; + + /* Check for foo:: base64str. */ + if (*cp == ':') { + encoded = true; + cp++; + } + + /* Trim leading and trailing space. */ + while (*cp == ' ') + cp++; + + ep = cp + strlen(cp); + while (ep > cp && ep[-1] == ' ') { + ep--; + /* Don't trim escaped trailing space if not base64. */ + if (!encoded && ep != cp && ep[-1] == '\\') + break; + *ep = '\0'; + } + + attr = cp; + if (encoded) { + /* + * Decode base64 inline and add NUL-terminator. + * The copy allows us to provide a useful message on error. + */ + char *copy = strdup(attr); + if (copy == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + len = base64_decode(attr, (unsigned char *)copy, strlen(copy)); + if (len == (size_t)-1) { + free(copy); + debug_return_bool(false); + } + memcpy(attr, copy, len); + attr[len] = '\0'; + free(copy); + } + + *colon = '\0'; + *name = line; + *value = attr; + + debug_return_bool(true); +} + +/* + * Allocate a struct sudoers_string, store str in it and + * insert into the specified strlist. + */ +static void +ldif_store_string(const char *str, struct sudoers_str_list *strlist, bool sorted) +{ + struct sudoers_string *ls; + debug_decl(ldif_store_string, SUDOERS_DEBUG_UTIL) + + if ((ls = sudoers_string_alloc(str)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (!sorted) { + STAILQ_INSERT_TAIL(strlist, ls, entries); + } else { + struct sudoers_string *prev, *next; + + /* Insertion sort, list is small. */ + prev = STAILQ_FIRST(strlist); + if (prev == NULL || strcasecmp(str, prev->str) <= 0) { + STAILQ_INSERT_HEAD(strlist, ls, entries); + } else { + while ((next = STAILQ_NEXT(prev, entries)) != NULL) { + if (strcasecmp(str, next->str) <= 0) + break; + prev = next; + } + STAILQ_INSERT_AFTER(strlist, prev, ls, entries); + } + } + + debug_return; +} + +/* + * Iterator for sudo_ldap_role_to_priv(). + * Takes a pointer to a struct sudoers_string *. + * Returns the string or NULL if we've reached the end. + */ +static char * +sudoers_string_iter(void **vp) +{ + struct sudoers_string *ls = *vp; + + if (ls == NULL) + return NULL; + + *vp = STAILQ_NEXT(ls, entries); + + return ls->str; +} + +static int +role_order_cmp(const void *va, const void *vb) +{ + const struct sudo_role *a = *(const struct sudo_role **)va; + const struct sudo_role *b = *(const struct sudo_role **)vb; + debug_decl(role_order_cmp, SUDOERS_DEBUG_LDAP) + + debug_return_int(a->order < b->order ? -1 : + (a->order > b->order ? 1 : 0)); +} + +/* + * Parse list of sudoOption and store in the parse tree's defaults list. + */ +static void +ldif_store_options(struct sudoers_parse_tree *parse_tree, + struct sudoers_str_list *options) +{ + struct defaults *d; + struct sudoers_string *ls; + char *var, *val; + debug_decl(ldif_store_options, SUDOERS_DEBUG_UTIL) + + STAILQ_FOREACH(ls, options, entries) { + if ((d = calloc(1, sizeof(*d))) == NULL || + (d->binding = malloc(sizeof(*d->binding))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + TAILQ_INIT(d->binding); + d->type = DEFAULTS; + d->op = sudo_ldap_parse_option(ls->str, &var, &val); + if ((d->var = strdup(var)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (val != NULL) { + if ((d->val = strdup(val)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + TAILQ_INSERT_TAIL(&parse_tree->defaults, d, entries); + } + debug_return; +} + +static int +str_list_cmp(const void *aa, const void *bb) +{ + const struct sudoers_str_list *a = aa; + const struct sudoers_str_list *b = bb; + const struct sudoers_string *lsa = STAILQ_FIRST(a); + const struct sudoers_string *lsb = STAILQ_FIRST(b); + int ret; + + while (lsa != NULL && lsb != NULL) { + if ((ret = strcasecmp(lsa->str, lsb->str)) != 0) + return ret; + lsa = STAILQ_NEXT(lsa, entries); + lsb = STAILQ_NEXT(lsb, entries); + } + return lsa == lsb ? 0 : (lsa == NULL ? -1 : 1); +} + +static int +str_list_cache(struct rbtree *cache, struct sudoers_str_list **strlistp) +{ + struct sudoers_str_list *strlist = *strlistp; + struct rbnode *node; + int ret; + debug_decl(str_list_cache, SUDOERS_DEBUG_UTIL) + + ret = rbinsert(cache, strlist, &node); + switch (ret) { + case 0: + /* new entry, take a ref for the cache */ + strlist->refcnt++; + break; + case 1: + /* already exists, use existing and take a ref. */ + str_list_free(strlist); + strlist = node->data; + strlist->refcnt++; + *strlistp = strlist; + break; + } + debug_return_int(ret); +} + +/* + * Convert a sudoRole to sudoers format and store in the parse tree. + */ +static void +role_to_sudoers(struct sudoers_parse_tree *parse_tree, struct sudo_role *role, + bool store_options, bool reuse_userspec, bool reuse_privilege, + bool reuse_runas) +{ + struct privilege *priv; + struct sudoers_string *ls; + struct userspec *us; + struct member *m; + debug_decl(role_to_sudoers, SUDOERS_DEBUG_UTIL) + + /* + * TODO: use cn to create a UserAlias if multiple users in it? + */ + + if (reuse_userspec) { + /* Re-use the previous userspec */ + us = TAILQ_LAST(&parse_tree->userspecs, userspec_list); + } else { + /* Allocate a new userspec and fill in the user list. */ + if ((us = calloc(1, sizeof(*us))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + TAILQ_INIT(&us->privileges); + TAILQ_INIT(&us->users); + STAILQ_INIT(&us->comments); + + STAILQ_FOREACH(ls, role->users, entries) { + char *user = ls->str; + + if ((m = calloc(1, sizeof(*m))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + m->negated = sudo_ldap_is_negated(&user); + m->name = strdup(user); + if (m->name == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (strcmp(user, "ALL") == 0) { + m->type = ALL; + } else if (*user == '+') { + m->type = NETGROUP; + } else if (*user == '%') { + m->type = USERGROUP; + } else { + m->type = WORD; + } + TAILQ_INSERT_TAIL(&us->users, m, entries); + } + } + + /* Add source role as a comment. */ + if (role->cn != NULL) { + struct sudoers_comment *comment = NULL; + if (reuse_userspec) { + /* Try to re-use comment too. */ + STAILQ_FOREACH(comment, &us->comments, entries) { + if (strncasecmp(comment->str, "sudoRole ", 9) == 0) { + char *tmpstr; + if (asprintf(&tmpstr, "%s, %s", comment->str, role->cn) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + free(comment->str); + comment->str = tmpstr; + break; + } + } + } + if (comment == NULL) { + /* Create a new comment. */ + if ((comment = malloc(sizeof(*comment))) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + if (asprintf(&comment->str, "sudoRole %s", role->cn) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + STAILQ_INSERT_TAIL(&us->comments, comment, entries); + } + } + + /* Convert role to sudoers privilege. */ + priv = sudo_ldap_role_to_priv(role->cn, STAILQ_FIRST(role->hosts), + STAILQ_FIRST(role->runasusers), STAILQ_FIRST(role->runasgroups), + STAILQ_FIRST(role->cmnds), STAILQ_FIRST(role->options), + role->notbefore, role->notafter, true, store_options, + sudoers_string_iter); + if (priv == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + if (reuse_privilege) { + /* Hostspec unchanged, append cmndlist to previous privilege. */ + struct privilege *prev_priv = TAILQ_LAST(&us->privileges, privilege_list); + if (reuse_runas) { + /* Runas users and groups same if as in previous privilege. */ + struct member_list *runasuserlist = + TAILQ_FIRST(&prev_priv->cmndlist)->runasuserlist; + struct member_list *runasgrouplist = + TAILQ_FIRST(&prev_priv->cmndlist)->runasgrouplist; + struct cmndspec *cmndspec = TAILQ_FIRST(&priv->cmndlist); + + /* Free duplicate runas lists. */ + if (cmndspec->runasuserlist != NULL) { + free_members(cmndspec->runasuserlist); + free(cmndspec->runasuserlist); + } + if (cmndspec->runasgrouplist != NULL) { + free_members(cmndspec->runasgrouplist); + free(cmndspec->runasgrouplist); + } + + /* Update cmndspec with previous runas lists. */ + TAILQ_FOREACH(cmndspec, &priv->cmndlist, entries) { + cmndspec->runasuserlist = runasuserlist; + cmndspec->runasgrouplist = runasgrouplist; + } + } + TAILQ_CONCAT(&prev_priv->cmndlist, &priv->cmndlist, entries); + free_privilege(priv); + } else { + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + /* Add finished userspec to the list if new. */ + if (!reuse_userspec) + TAILQ_INSERT_TAIL(&parse_tree->userspecs, us, entries); + + debug_return; +} + +/* + * Convert the list of sudoRoles to sudoers format and store in the parse tree. + */ +static void +ldif_to_sudoers(struct sudoers_parse_tree *parse_tree, + struct sudo_role_list *roles, unsigned int numroles, bool store_options) +{ + struct sudo_role **role_array, *role = NULL; + unsigned int n; + debug_decl(ldif_to_sudoers, SUDOERS_DEBUG_UTIL) + + /* Convert from list of roles to array and sort by order. */ + role_array = reallocarray(NULL, numroles + 1, sizeof(*role_array)); + for (n = 0; n < numroles; n++) { + if ((role = STAILQ_FIRST(roles)) == NULL) + break; /* cannot happen */ + STAILQ_REMOVE_HEAD(roles, entries); + role_array[n] = role; + } + role_array[n] = NULL; + qsort(role_array, numroles, sizeof(*role_array), role_order_cmp); + + /* + * Iterate over roles in sorted order, converting to sudoers. + */ + for (n = 0; n < numroles; n++) { + bool reuse_userspec = false; + bool reuse_privilege = false; + bool reuse_runas = false; + + role = role_array[n]; + + /* Check whether we can reuse the previous user and host specs */ + if (n > 0 && role->users == role_array[n - 1]->users) { + reuse_userspec = true; + + /* + * Since options are stored per-privilege we can't + * append to the previous privilege's cmndlist if + * we are storing options. + */ + if (!store_options) { + if (role->hosts == role_array[n - 1]->hosts) { + reuse_privilege = true; + + /* Reuse runasusers and runasgroups if possible. */ + if (role->runasusers == role_array[n - 1]->runasusers && + role->runasgroups == role_array[n - 1]->runasgroups) + reuse_runas = true; + } + } + } + + role_to_sudoers(parse_tree, role, store_options, reuse_userspec, + reuse_privilege, reuse_runas); + } + + /* Clean up. */ + for (n = 0; n < numroles; n++) + sudo_role_free(role_array[n]); + free(role_array); + + debug_return; +} + +/* + * Given a cn with possible quoted characters, return a copy of + * the cn with quote characters ('\\') removed. + * The caller is responsible for freeing the returned string. + */ +static +char *unquote_cn(const char *src) +{ + char *dst, *new_cn; + size_t len; + debug_decl(unquote_cn, SUDOERS_DEBUG_UTIL) + + len = strlen(src); + if ((new_cn = malloc(len + 1)) == NULL) + debug_return_str(NULL); + + for (dst = new_cn; *src != '\0';) { + if (src[0] == '\\' && src[1] != '\0') + src++; + *dst++ = *src++; + } + *dst = '\0'; + + debug_return_str(new_cn); +} + +/* + * Parse a sudoers file in LDIF format, https://tools.ietf.org/html/rfc2849 + * Parsed sudoRole objects are stored in the specified parse_tree which + * must already be initialized. + */ +bool +sudoers_parse_ldif(struct sudoers_parse_tree *parse_tree, + FILE *fp, const char *sudoers_base, bool store_options) +{ + struct sudo_role_list roles = STAILQ_HEAD_INITIALIZER(roles); + struct sudo_role *role = NULL; + struct rbtree *usercache, *groupcache, *hostcache; + unsigned numroles = 0; + bool in_role = false; + size_t linesize = 0; + char *attr, *name, *line = NULL, *savedline = NULL; + ssize_t savedlen = 0; + bool mismatch = false; + int errors = 0; + debug_decl(sudoers_parse_ldif, SUDOERS_DEBUG_UTIL) + + /* Free old contents of the parse tree (if any). */ + free_parse_tree(parse_tree); + + /* + * We cache user, group and host lists to make it eay to detect when there + * are identical lists (simple pointer compare). This makes it possible + * to merge multiplpe sudoRole objects into a single UserSpec and/or + * Privilege. The lists are sorted since LDAP order is arbitrary. + */ + usercache = rbcreate(str_list_cmp); + groupcache = rbcreate(str_list_cmp); + hostcache = rbcreate(str_list_cmp); + if (usercache == NULL || groupcache == NULL || hostcache == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Read through input, parsing into sudo_roles and global defaults. */ + for (;;) { + int ch; + ssize_t len = getdelim(&line, &linesize, '\n', fp); + + /* Trim trailing return or newline. */ + while (len > 0 && (line[len - 1] == '\r' || line[len - 1] == '\n')) + line[--len] = '\0'; + + /* Blank line or EOF terminates an entry. */ + if (len <= 0) { + if (in_role) { + if (role->cn != NULL && strcasecmp(role->cn, "defaults") == 0) { + ldif_store_options(parse_tree, role->options); + sudo_role_free(role); + } else if (STAILQ_EMPTY(role->users) || + STAILQ_EMPTY(role->hosts) || STAILQ_EMPTY(role->cmnds)) { + /* Incomplete role. */ + sudo_warnx(U_("ignoring incomplete sudoRole: cn: %s"), + role->cn ? role->cn : "UNKNOWN"); + sudo_role_free(role); + } else { + /* Cache users, hosts, runasusers and runasgroups. */ + if (str_list_cache(usercache, &role->users) == -1 || + str_list_cache(hostcache, &role->hosts) == -1 || + str_list_cache(usercache, &role->runasusers) == -1 || + str_list_cache(groupcache, &role->runasgroups) == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + + /* Store finished role. */ + STAILQ_INSERT_TAIL(&roles, role, entries); + numroles++; + } + role = NULL; + in_role = false; + } + if (len == -1) { + /* EOF */ + break; + } + mismatch = false; + continue; + } + + if (savedline != NULL) { + char *tmp; + + /* Append to saved line. */ + linesize = savedlen + len + 1; + if ((tmp = realloc(savedline, linesize)) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + memcpy(tmp + savedlen, line, len + 1); + free(line); + line = tmp; + savedline = NULL; + } + + /* Check for folded line */ + if ((ch = getc(fp)) == ' ') { + /* folded line, append to the saved portion. */ + savedlen = len; + savedline = line; + line = NULL; + linesize = 0; + continue; + } + ungetc(ch, fp); /* not folded, push back ch */ + + /* Skip comment lines or records that don't match the base. */ + if (*line == '#' || mismatch) + continue; + + /* Reject invalid LDIF. */ + if (!ldif_parse_attribute(line, &name, &attr)) { + sudo_warnx(U_("invalid LDIF attribute: %s"), line); + errors++; + continue; + } + + /* Parse dn and objectClass. */ + if (strcasecmp(name, "dn") == 0) { + /* Compare dn to base, if specified. */ + if (sudoers_base != NULL) { + /* Skip over cn if present. */ + if (strncasecmp(attr, "cn=", 3) == 0) { + for (attr += 3; *attr != '\0'; attr++) { + /* Handle escaped ',' chars. */ + if (*attr == '\\') + attr++; + if (*attr == ',') { + attr++; + break; + } + } + } + if (strcasecmp(attr, sudoers_base) != 0) { + /* Doesn't match base, skip the rest of it. */ + mismatch = true; + continue; + } + } + } else if (strcasecmp(name, "objectClass") == 0) { + if (strcasecmp(attr, "sudoRole") == 0) { + /* Allocate new role as needed. */ + if (role == NULL) { + if ((role = sudo_role_alloc()) == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + in_role = true; + } + } + + /* Not in a sudoRole, keep reading. */ + if (!in_role) + continue; + + /* Part of a sudoRole, parse it. */ + if (strcasecmp(name, "cn") == 0) { + free(role->cn); + role->cn = unquote_cn(attr); + if (role->cn == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else if (strcasecmp(name, "sudoUser") == 0) { + ldif_store_string(attr, role->users, true); + } else if (strcasecmp(name, "sudoHost") == 0) { + ldif_store_string(attr, role->hosts, true); + } else if (strcasecmp(name, "sudoRunAs") == 0) { + ldif_store_string(attr, role->runasusers, true); + } else if (strcasecmp(name, "sudoRunAsUser") == 0) { + ldif_store_string(attr, role->runasusers, true); + } else if (strcasecmp(name, "sudoRunAsGroup") == 0) { + ldif_store_string(attr, role->runasgroups, true); + } else if (strcasecmp(name, "sudoCommand") == 0) { + ldif_store_string(attr, role->cmnds, false); + } else if (strcasecmp(name, "sudoOption") == 0) { + ldif_store_string(attr, role->options, false); + } else if (strcasecmp(name, "sudoOrder") == 0) { + char *ep; + role->order = strtod(attr, &ep); + if (ep == attr || *ep != '\0') { + sudo_warnx(U_("invalid sudoOrder attribute: %s"), attr); + errors++; + } + } else if (strcasecmp(name, "sudoNotBefore") == 0) { + free(role->notbefore); + role->notbefore = strdup(attr); + if (role->notbefore == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } else if (strcasecmp(name, "sudoNotAfter") == 0) { + free(role->notafter); + role->notafter = strdup(attr); + if (role->notafter == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + } + } + sudo_role_free(role); + free(line); + + /* Convert from roles to sudoers data structures. */ + ldif_to_sudoers(parse_tree, &roles, numroles, store_options); + + /* Clean up. */ + rbdestroy(usercache, str_list_free); + rbdestroy(groupcache, str_list_free); + rbdestroy(hostcache, str_list_free); + + if (fp != stdin) + fclose(fp); + + debug_return_bool(errors == 0); +} diff --git a/utsudo-0.0.2/plugins/sudoers/po/README b/utsudo-0.0.2/plugins/sudoers/po/README new file mode 100644 index 0000000..ff9b845 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/README @@ -0,0 +1,14 @@ +NLS Translations for sudo are coordinated through the Translation +Project, at http://translationproject.org/ + +If you would like to contribute a translation for sudo, please join +a translation team at the Translation Project instead of contributing +a po file directly. This will avoid duplicated work if there is +already a translation in progress. If you would like to become a +member of a translation team, please follow the instructions at +http://translationproject.org/html/translators.html + +The messages in sudo are split into two domains: sudo and sudoers. +The former is used by the sudo front-end and utility functions. +The latter is used by the sudoers policy and I/O logging plug-ins +as well as the sudoers-specific commands visudo and sudoreplay. diff --git a/utsudo-0.0.2/plugins/sudoers/po/ast.mo b/utsudo-0.0.2/plugins/sudoers/po/ast.mo new file mode 100644 index 0000000000000000000000000000000000000000..05cd28ba8f76eb32651f166e60e1a47aa738e378 GIT binary patch literal 34264 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 F{{@IB7B2t* literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/ast.po b/utsudo-0.0.2/plugins/sudoers/po/ast.po new file mode 100644 index 0000000..0957204 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/ast.po @@ -0,0 +1,2343 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2016. +# enolp , 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-08-03 14:37+0200\n" +"Last-Translator: enolp \n" +"Language-Team: Asturian \n" +"Language: ast\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 19.04.3\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "fallu de sintaxis" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Contraseña de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] contraseña de %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Contraseña:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Información de SEGURANZA pa %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Perdona pero volvi tentalo." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "nun pue allugase memoria" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "un digest rique un nome de camín" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "el valor de notbefore nun ye válidu" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "el valor de notafter nun ye válidu" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "el valor de la escosa del tiempu d'espera ye pergrande" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "la escosa del tiempu d'espera nun ye válida" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Yá se definió l'alias «%s»" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "nun pue biforcase" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, fuzzy, c-format +#| msgid "unable to change expired password: %s" +msgid "unable to change password for %s" +msgstr "nun pue camudase la contraseña caducada: %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nun pue consiguise la clas pal usuariu %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "la triba d'autenticación nun ye válida" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "nun pue aniciase l'autenticaciónde BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "la to cuenta caducó" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "fallu de l'aprobación" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "nun pue lleese la configuración de fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "nun pue coneutase col sirvidor d'autenticación" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "perdióse la conexón col sirvidor d'autenticación" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"fallu del sirvidor d'autenticación:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nun pue analizase «%s»: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nun pue resolvese la caché de credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nun pue allugase les opciones: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nun puen consiguise les credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nun pue aniciase la caché de credenciales: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nun pue atroxase la credencial na caché: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nun pue verificase'l TGT, ¡quiciabes tean atacándote! : %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "nun pue aniciase PAM" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Fallu d'autenticación PAM: %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "fallu de la validación de la cuenta, ¿tienes la cuenta bloquiada?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "Caducó la cuenta o la contraseña, reanicia la to contraseña y volvi tentalo" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nun pue camudase la contraseña caducada: %s" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "Caducó la contraseña, contauta col alministrador de sistemes" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "La cuenta caducó o a la configuración de PAM fálta-y la seición «account» pa sudo, contauta col alministrador de sistemes" + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fallu de la xesión de cuentes PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nun esistes na base de datos %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "fallu al aniciar la biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "nun pue contautase col sirvidor de SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Falló la comunicación de SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "desconozse'l fallu de SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "nun pue aniciase la sesión SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "métodos d'autenticación non válidos" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "¡Compiláronse en sudo métodos d'autenticación non válidos! Nun podríes combinar l'autenticación independiente y non independiente." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "nun hai métodos d'autenticación" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "¡Nun se compilaron en sudo métodos d'autenticación! Si quies desactivar l'autenticación, usa la opción de configuración --disable-authentication ." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Nun puen aniciase los métodos d'autenticación." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Métodos d'autenticación:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Nun pudo determinase la condición d'autoría" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "nun pue unviase'l rexistru d'auditoría" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "desconozse l'UID: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "desconozse l'usuariu: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versión %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Gramática de %s na versión %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nun se sofita'l formatu d'entrada %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nun se sofita'l formatu de salida %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: los ficheros d'entrada y salida han ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "nun puen aniciase los valores predeterminaos de sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: desconozse la pallabra clave: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "la peñera nun ye válida: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "nun pue abrise %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "fallu al analizar el ficheru %s, fallu desconocíu" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fallu d'analís en %s cierca de la llinia %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "fallu d'analís en %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "nun pue escribise en %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "nun pue consiguise la hora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "nun pue formatiase la marca de tiempu" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "fallu internu, sobrecarga de %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "nun s'afitó la variable d'entornu SUDOERS_BASE y tampoco s'especificó la opción -b" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "La prioridá a usar de syslog cuando un usuariu s'autentica con ésitu: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "La prioridá a usar de syslog cuando un usuariu nun s'autentica con ésitu: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Inora «.» en $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Unviar siempres un corréu cuando sudo ta n'execución" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Unvia un corréu si falla l'autenticación del usuariu" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Unvia un corréu si l'usuariu nun ta en sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Unvia un corréu si l'usuariu nun ta nel sudoers d'esti agospiu" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Unvia un corréu si l'usuariu nun tien permisu pa executar un comandu" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Unvia un corréu si l'usuariu tenta d'executar un comandu" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Ficheru que contién la llectura de sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Rique que los usuarios s'autentiquen por defeutu" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root podría executar sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Rexistra l'añu nel ficheru de rexistru (non syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Si s'invoca sudo ensin argumentos, anicia una shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Afita $HOME al usuariu de destín al aniciar una shell con -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Siempres afita $HOME al direutoriu d'aniciu del usuariu de destín" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite la recoyida de della información pa dar mensaxes de fallu útiles" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta al usuariu cuando introduza una contraseña incorreuta" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Namái permite que l'usuariu execute sudo si tien una TTY" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo va respetar la variable d'entornu EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Afita les variables d'entornu LOGNAME y USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Namái afita l'UID efeutivu al usuariu de destín, non al UID real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Llargor al que s'axusten les llinies del ficheru de rexistru (0 pa nun axustar): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Escosa del tiempu d'espera de la marca de tiempu de l'autenticación: %.1f minutes" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Escosa del tiempu d'espera pa la introducción de contraseñes: %.1f minutes" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Númberu d'intentos pa introducir una contraseña: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Camín al ficheru de rexistru: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Camín al programa de corréu: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Banderes pal programa de corréu: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Direición a la qu'unviar correos: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Direición dende la qu'unviar correos: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Asuntu de los mensaxes de corréu: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensaxe de contraseña incorreuta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Camín al direutoriu de marques de tiempu de l'autenticación: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuariu predeterminái pa executar comandos como: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor col qu'anular el $PATH d'usuariu: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Camín al editor que va usar visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si'l direutoriu LDAP ta activu, inoramos el ficheru sudoers llocal" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Si s'afita, los usuarios podríen anular el valor de «closefrom» cola opción -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite que los usuarios afiten variables d'entornu arbitraries" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Reafita l'entornu al conxuntu de variables predetermináu" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variables d'entornu a desaniciar:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variables d'entornu a caltener:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "El rol de SELinux a usar nel contestu de seguranza nuevu: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "La triba de SELinux a usar nel contestu de seguranza nuevu: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Camín al ficheru d'entornu específicu de sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Camín al ficheru d'entornu restrinxíu y específicu de sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "La locale a usar mentanto s'analiza sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite a sudo pidir una contraseña magar que seya visible" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "El umask especificáu en sudoers va anular el del usuariu, magar que seya más permisivu" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Rexistra la entrada d'usuariu pal comandu que ta n'execución" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Rexistra la salida del comandu que ta n'execución" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprime los rexistros d'E/S usando zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa siempres los comandos nuna pseudoTTY" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Complementu pal sofitu de grupos non Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Direutoriu nel que s'atroxen los rexistros d'entrada/salida: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Ficheru nel que s'atroxen los rexistros d'entrada/salida: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Amiesta una entrada al ficheru utmp/utmpx al allugar una PTY" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conxuntu de privilexos permitíos: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conxuntu de privilexos llendaos: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos nuna PTY en segundu planu" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome del serviciu PAM a usar: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome del serviciu PAM a usar pa les shells d'aniciu de sesión: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta d'afitar les credenciales de PAM pal usuariu de destín" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una sesión PAM nueva pal comandu que va executase nella" + +#: plugins/sudoers/def_data.c:402 +#, fuzzy +#| msgid "PAM account management error: %s" +msgid "Perform PAM account validation management" +msgstr "Fallu de la xesión de cuentes PAM: %s" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Númberu máximu de secuencies de rexistru d'E/S: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Comprueba'l permisu d'escritura nos direutorios parentales al editar ficheros con sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Sigue enllaces simbólicos cuando s'editen ficheros con sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel rexistru d'auditoría" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel rexistru d'E/S" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite que los comandos s'executen magar que sudo nun puea escribir nel ficheru de rexistru " + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Les entraes mayores qu'esti valor nun van dixebrase en mensaxes de syslog múltiples: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "L'usuariu que va ser propietariu de los ficheros de rexistru d'E/S: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "El grupu que va ser propietariu de los ficheros de rexistru d'E/S: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos pol descriptor de ficheru en cuentes de pol camín: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "El tiempu en segundos tres el que'l comandu va terminar: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite que l'usuariu especifique na llinia de comandos una escosa del tiempu d'espera" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Rexistru de la marca de tiempu de la triba d'autentiación: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensaxe del fallu d'autenticación: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: desconozse lo predeterminao de la entrada «%s»" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nun s'especificó dengún valor pa «%s»" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nun s'especificó dengún valor pa «%s»" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d los valores pa «%s» han apenzar per «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s los valores pa «%s» han apenzar per «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d la opción «%s» nun garra dengún valor" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: la opción «%s» nun garra dengún valor" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d el valor «%s» nun ye válidu pa la opción «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: el valor «%s» nun ye válidu pa la opción «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "nun pue construyise de nueves l'entornu" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "perdona pero nun tienes permisu p'afitar les variables d'entornu de darréu: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "fallu d'analís en %s cierca de la llinia %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "fallu d'analís en %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nun se sofita la triba de digest %d pa %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: fallu de llectura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ha ser propiedá del UID %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s ha ser namái escribible pol dueñu" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "nun pue cargase %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nun pue alcontrase'l símbolu «group_plugin» en %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nun pue analizase la direición IP «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nun pue analizase la mázcara de rede «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s esiste pero nun ye un direutoriu (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nun pue camudse'l mou de %s a 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "desconozse'l grupu: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "nun pue lleese %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "nun pue crease %s" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nun pue escribise nel ficheru de rexistru d'E/S %s" + +#: plugins/sudoers/iolog.c:1071 +#, fuzzy, c-format +#| msgid "%s: internal error, file index %d not open" +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: fallu internu, l'índiz de ficheros %d nun ta abiertu" + +#: plugins/sudoers/iolog.c:1230 +#, fuzzy, c-format +#| msgid "%s: internal error, file index %d not open" +msgid "%s: internal error, invalid signal %d" +msgstr "%s: fallu internu, l'índiz de ficheros %d nun ta abiertu" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: el ficheru de rexistru nun ye válidu" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: falta'l ficheru de marques de tiempu" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: falta'l campu d'usuariu" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "nun se sofita starttls cuando s'usa LDAPS" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nun pue aniciase la base de datos de claves y certificaos SSL: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "ha afitar TLS_CERT en %s pa usar SSL" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nun pue aniciase LDAP: %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributu sudoOrder non válidu: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: el puertu ye pergrande" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nun se sofita la triba URI de LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nun puen mecese les URIs de LDAP y LDAPS" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nun pue convertise sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "nun pue abrise'l sistema d'auditoría" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nun pue unviase'l mensaxe d'auditoría" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (el comandu siguió) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "nun pue abrise'l ficheru de rexistru: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nun pue bloquiase'l fiheru de rexistru: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "nun pue escribise nel ficheru de rexistru: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "fallu de validación" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "l'usuariu NUN ta en sudoers" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "l'usuariu NUN ta autorizáu nel agospiu" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "comandu non permitíu" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nun ta nel ficheru sudoers. Va informase d'esti incidente.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nun tien permisu pa executar sudo en %s. Va informase d'esti accidente.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Perdona pero l'usuariu %s podría nun executar sudo en %s.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Perdona pero l'usuariu %s nun tien permisu pa executar «%s%s%s» como %s%s%s en %s.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: nun s'alcontró'l comandu" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "fallu d'autenticación" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "ríquese una contraseña" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nun pue facese dup a stdin: %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nun pue executase %s: %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "nun pue biforcase: %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nun pue abrise la tubería: %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "el digest pa %s (%s) nun ta na forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "nun pue facese stat a %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rol LADAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"entrada de sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opciones: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'usuariu %s podría executar los comandos de darréu en %s:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:147 +#, fuzzy, c-format +#| msgid "invalid timeout value" +msgid "ignoring invalid attribute value: %s" +msgstr "la escosa del tiempu d'espera nun ye válida" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "nun pue analizase la llista de direiciones de rede" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "el nome d'usuariu nun lu afitó'l frontal de sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "el fontal de sudo nun la afitó la ID d'usuariu" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "el fontal de sudo nun la afitó la ID de grupu" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "el nome d'agospiu nun lu afitó'l frontal de sudo" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "nun pue executase %s" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versión %s del complementu de polítiques de sudoers\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versión %d de la gramática del ficheru sudoers\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Camín de sudoers: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "camín de nsswitch: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "camín de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "camín de ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "nun pue atroxase na caché l'UID %u, nun hai memoria" + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nun pue atroxase na caché l'UID %u, yá esiste" + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "nun pue atroxase na caché l'usuariu %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nun pue atroxase na caché l'usuariu %s, yá esiste" + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "nun pue atroxase na caché'l GID %u, nun hai memoria" + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nun pue atroxase na caché'l GID %u, yá esiste" + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "nun pue atroxase na caché'l grupu %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nun pue atroxase na caché'l grupu %s, yá esiste" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nun pue atroxase na caché la llista de grupos pa %s, yá esiste" + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "nun pue atroxase na caché la llista de grupos pa %s, nun hai memoria" + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "nun pue camudase'l GID de root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "nun pue camudase'l GID de runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "nun pue afitase'l vector de grupos de runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "nun pue camudase l'UID de runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "nun pue camudase'l GID de sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "milenta procesos" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "nun pue consiguise'l direutoriu actual de trabayu" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "el mensaxe d'audit_failure ye pergrande" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nun pue aniciase la fonte SSS. ¿Ta SSSD instaláu nel sistema?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nun pue alcontrase'l símbolu «%s» en %s" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "problema coles entraes predeterminaes" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "nun s'alcontró denguna fonte de sudoers válida, colando" + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que root nun tien permisu pa usar sudo" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "nun tienes permisu pa usar la opción -C" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "nun hai denguna TTY" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "perdona pero has tener una tty pa executar sudo" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "perdona pero nun tienes permisu p'afitar una escosa del tiempu d'espera de los comandos" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "perdona pero nun tienes permisu pa calternet l'entornu" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "el comandu ye perllargu" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nun ye un ficheru regular" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ye propiedá del UID %u, debería ser %u" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s ye escribible por tol mundu" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s ye propiedá del GID %u, debería ser %u" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "namái root pue usar «-c %s»" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "desconozse la clas d'aniciu de sesión: %s" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "nun pue resolvese l'agospiu %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opción non válida de peñera: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "tiempu máximu d'espera non válidu: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fautor de velocidá non válidu: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/sincronía: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/sincronía: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduciendo la sesión de sudo: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "nun pue amestase l'eventu a la cola" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "nun pue afitase'l mou en bruto a la TTY" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Alvertencia: la terminal ye mui pequeña como pa reproducir el rexistru afayadizamente.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La xeometría del rexistru ye %d x %d, la de la to terminal ye %d x %d" + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "espresión ambigua «%s»" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "nun s'abrió «)» na espresión" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "desconozse'l términu de gueta «%s»" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s rique un argumentu" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "espresión regular non válida: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nun pudo analizase la data «%s»" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "nun se zarró «(» na espresión" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "desconozse la triba de gueta %d" + +#: plugins/sudoers/sudoreplay.c:1607 +#, fuzzy, c-format +#| msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "usu: %s [-hnR] [-d direutoriu] [-m númberu] [-s númberu] ID\n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "usu: %s [-h] [-d direutoriu] -l [espresión de gueta]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz los rexistros de sesión de sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +#, fuzzy +#| msgid "" +#| "\n" +#| "Options:\n" +#| " -d, --directory=dir specify directory for session logs\n" +#| " -f, --filter=filter specify which I/O type(s) to display\n" +#| " -h, --help display help message and exit\n" +#| " -l, --list list available session IDs, with optional expression\n" +#| " -m, --max-wait=num max number of seconds to wait between events\n" +#| " -s, --speed=num speed up or slow down output\n" +#| " -V, --version display version information and exit" +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opciones:\n" +" -d, --directory=dir especifica'l direutoriu pa los rexistros de la sesión\n" +" -f, --filter=filter especifica les tribes d'E/S que van amosase\n" +" -h, --help amuesa esti mensaxe d'ayuda y cola\n" +" -l, --list llista les IDs de sesión disponibles, con una espresión opcional\n" +" -m, --max-wait=num númberu máximu de segundos a esperar ente eventos\n" +" -s, --speed=num acelera o vuelve lenta la salida\n" +" -V, --version amuesa la información de la versión y cola" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comandu permitíu" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comandu ñegáu" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comandu ensin coincidencies" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s ye escribible pol grupu" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "nun pue lleese'l reló" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "inorando la marca de tiempu del futuru" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nun pue bloquiase'l ficheru de marque de tiempu %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "la opción -x va desaniciase en llanzamientos futuros" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "primi retrocesu pa editar %s:" + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor especificáu (%s) nun esiste" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nun s'alcontró dengún editor (camín del editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "fallu d'escritura" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nun pue facese stat al ficheru temporal (%s), %s nun camudó" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "falló l'editor (%s), %s nun camudó" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s nun camudó" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nun pue abrise de nueves el ficheru temporal (%s), %s nun camudó." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "nun pudo analizase'l ficheru temporal (%s), fallu desconocíu" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "fallu internu, ¡nun pue alcontrase %s na llista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nun pue afitase l'UID o GID de %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s y %s nun tán nel mesmu sistema de ficheros, usando mv pa renomar" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "falló'l comandu: «%s %s %s», %s nun camudó" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fallu al renomar %s, %s nun camudó" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "¿Y agora qué?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "nun pue executase %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ta ocupáu, volvi tentalo más sero" + +#: plugins/sudoers/visudo.c:995 +#, fuzzy, c-format +#| msgid "unable to open %s" +msgid "unable to lock %s" +msgstr "nun pue abrise %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fallu: %s:%d %s «%s» referencióse pero nun se definió" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Alvertencia: %s:%d %s «%s» referencióse pero nun se definió" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita de mou seguru'l ficheru sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opciones:\n" +" -c, --check mou de namái comprobación\n" +" -f, --file=sudoers especifica l'allugamientu del ficheru sudoers\n" +" -h, --help amuesa esti mensaxe d'ayuda y cola\n" +" -q, --quiet mensaxes menos detallaos (silenciosos) de los fallos de sintaxis\n" +" -s, --strict comprobación estricta de la sintaxis\n" +" -V, --version amuesa la información de la versión y cola\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "milenta niveles d'inclusión" diff --git a/utsudo-0.0.2/plugins/sudoers/po/ca.mo b/utsudo-0.0.2/plugins/sudoers/po/ca.mo new file mode 100644 index 0000000000000000000000000000000000000000..92413768407c5a8dea4984cc6a6269805b80e1b2 GIT binary patch literal 43707 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/ca.po b/utsudo-0.0.2/plugins/sudoers/po/ca.po new file mode 100644 index 0000000..bfa425f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/ca.po @@ -0,0 +1,2081 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Walter Garcia-Fontes , 2016. +# +# Glossari +# +# principal - Es refereix a "Principals may represent users, network hosts, or network services. A principal that corresponds to a network host is called a host principal", s'ha traduït com a "principal". +# tty - el terminal, això prové de l'acrònim en anglès per a teletip (tty) i ara s'usa per a un terminal obert on es pot entrar informació +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.19b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2016-12-03 19:24-0700\n" +"PO-Revision-Date: 2016-12-29 17:28+0100\n" +"Last-Translator: Walter Garcia-Fontes \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "error de sintaxi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "contrasenya de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] contrasenya per a %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Contrasenya: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informació de SEGURETAT per a %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Ho sentim, proveu un altre cop." + +#: gram.y:186 gram.y:234 gram.y:241 gram.y:248 gram.y:255 gram.y:262 +#: gram.y:278 gram.y:301 gram.y:308 gram.y:315 gram.y:322 gram.y:329 +#: gram.y:384 gram.y:392 gram.y:402 gram.y:432 gram.y:439 gram.y:446 +#: gram.y:453 gram.y:565 gram.y:572 gram.y:581 gram.y:590 gram.y:607 +#: gram.y:663 gram.y:670 gram.y:677 gram.y:685 gram.y:781 gram.y:788 +#: gram.y:795 gram.y:802 gram.y:809 gram.y:835 gram.y:842 gram.y:849 +#: gram.y:972 gram.y:1148 gram.y:1155 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:443 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:618 +#: plugins/sudoers/defaults.c:873 plugins/sudoers/defaults.c:1025 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:234 +#: plugins/sudoers/gc.c:52 plugins/sudoers/group_plugin.c:134 +#: plugins/sudoers/interfaces.c:71 plugins/sudoers/iolog.c:805 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:447 +#: plugins/sudoers/ldap.c:478 plugins/sudoers/ldap.c:530 +#: plugins/sudoers/ldap.c:563 plugins/sudoers/ldap.c:961 +#: plugins/sudoers/ldap.c:1157 plugins/sudoers/ldap.c:1168 +#: plugins/sudoers/ldap.c:1184 plugins/sudoers/ldap.c:1471 +#: plugins/sudoers/ldap.c:1631 plugins/sudoers/ldap.c:1713 +#: plugins/sudoers/ldap.c:1853 plugins/sudoers/ldap.c:1877 +#: plugins/sudoers/ldap.c:1966 plugins/sudoers/ldap.c:1981 +#: plugins/sudoers/ldap.c:2077 plugins/sudoers/ldap.c:2110 +#: plugins/sudoers/ldap.c:2263 plugins/sudoers/ldap.c:2360 +#: plugins/sudoers/ldap.c:3178 plugins/sudoers/ldap.c:3210 +#: plugins/sudoers/ldap.c:3519 plugins/sudoers/ldap.c:3547 +#: plugins/sudoers/ldap.c:3563 plugins/sudoers/ldap.c:3653 +#: plugins/sudoers/ldap.c:3669 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:450 +#: plugins/sudoers/logging.c:471 plugins/sudoers/logging.c:683 +#: plugins/sudoers/logging.c:941 plugins/sudoers/match.c:501 +#: plugins/sudoers/match.c:535 plugins/sudoers/match.c:572 +#: plugins/sudoers/match.c:770 plugins/sudoers/match.c:828 +#: plugins/sudoers/parse.c:236 plugins/sudoers/parse.c:248 +#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:275 +#: plugins/sudoers/policy.c:405 plugins/sudoers/policy.c:632 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:139 +#: plugins/sudoers/pwutil.c:210 plugins/sudoers/pwutil.c:286 +#: plugins/sudoers/pwutil.c:457 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:591 plugins/sudoers/pwutil.c:749 +#: plugins/sudoers/pwutil.c:806 plugins/sudoers/pwutil.c:851 +#: plugins/sudoers/pwutil.c:908 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:390 plugins/sudoers/sssd.c:462 +#: plugins/sudoers/sssd.c:1053 plugins/sudoers/sssd.c:1234 +#: plugins/sudoers/sssd.c:1248 plugins/sudoers/sssd.c:1264 +#: plugins/sudoers/sudoers.c:261 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:279 plugins/sudoers/sudoers.c:363 +#: plugins/sudoers/sudoers.c:660 plugins/sudoers/sudoers.c:775 +#: plugins/sudoers/sudoers.c:819 plugins/sudoers/sudoers_debug.c:107 +#: plugins/sudoers/sudoreplay.c:517 plugins/sudoers/sudoreplay.c:716 +#: plugins/sudoers/sudoreplay.c:828 plugins/sudoers/sudoreplay.c:868 +#: plugins/sudoers/sudoreplay.c:877 plugins/sudoers/sudoreplay.c:887 +#: plugins/sudoers/sudoreplay.c:895 plugins/sudoers/sudoreplay.c:899 +#: plugins/sudoers/sudoreplay.c:1055 plugins/sudoers/sudoreplay.c:1059 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:216 +#: plugins/sudoers/testsudoers.c:233 plugins/sudoers/timestamp.c:374 +#: plugins/sudoers/timestamp.c:418 plugins/sudoers/timestamp.c:834 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:152 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:964 plugins/sudoers/visudo.c:1030 +#: plugins/sudoers/visudo.c:1074 plugins/sudoers/visudo.c:1171 +#: plugins/sudoers/visudo_json.c:1035 toke.l:832 toke.l:932 toke.l:1090 +msgid "unable to allocate memory" +msgstr "no es pot assignar memòria" + +#: gram.y:464 +msgid "a digest requires a path name" +msgstr "au un resum li cal un nom de camí" + +#: gram.y:1148 gram.y:1155 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:443 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:618 plugins/sudoers/defaults.c:873 +#: plugins/sudoers/defaults.c:1025 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:234 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:805 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:447 plugins/sudoers/ldap.c:478 +#: plugins/sudoers/ldap.c:530 plugins/sudoers/ldap.c:563 +#: plugins/sudoers/ldap.c:961 plugins/sudoers/ldap.c:1157 +#: plugins/sudoers/ldap.c:1168 plugins/sudoers/ldap.c:1184 +#: plugins/sudoers/ldap.c:1471 plugins/sudoers/ldap.c:1631 +#: plugins/sudoers/ldap.c:1713 plugins/sudoers/ldap.c:1853 +#: plugins/sudoers/ldap.c:1877 plugins/sudoers/ldap.c:1966 +#: plugins/sudoers/ldap.c:1981 plugins/sudoers/ldap.c:2077 +#: plugins/sudoers/ldap.c:2110 plugins/sudoers/ldap.c:2263 +#: plugins/sudoers/ldap.c:2360 plugins/sudoers/ldap.c:3178 +#: plugins/sudoers/ldap.c:3210 plugins/sudoers/ldap.c:3519 +#: plugins/sudoers/ldap.c:3546 plugins/sudoers/ldap.c:3562 +#: plugins/sudoers/ldap.c:3653 plugins/sudoers/ldap.c:3669 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:188 +#: plugins/sudoers/logging.c:450 plugins/sudoers/logging.c:471 +#: plugins/sudoers/logging.c:941 plugins/sudoers/match.c:500 +#: plugins/sudoers/match.c:534 plugins/sudoers/match.c:572 +#: plugins/sudoers/match.c:770 plugins/sudoers/match.c:827 +#: plugins/sudoers/parse.c:236 plugins/sudoers/parse.c:248 +#: plugins/sudoers/parse.c:263 plugins/sudoers/parse.c:275 +#: plugins/sudoers/policy.c:97 plugins/sudoers/policy.c:106 +#: plugins/sudoers/policy.c:115 plugins/sudoers/policy.c:139 +#: plugins/sudoers/policy.c:250 plugins/sudoers/policy.c:278 +#: plugins/sudoers/policy.c:287 plugins/sudoers/policy.c:326 +#: plugins/sudoers/policy.c:336 plugins/sudoers/policy.c:345 +#: plugins/sudoers/policy.c:354 plugins/sudoers/policy.c:405 +#: plugins/sudoers/policy.c:632 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:139 plugins/sudoers/pwutil.c:210 +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:457 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:591 +#: plugins/sudoers/pwutil.c:749 plugins/sudoers/pwutil.c:806 +#: plugins/sudoers/pwutil.c:851 plugins/sudoers/pwutil.c:908 +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:390 plugins/sudoers/sssd.c:462 +#: plugins/sudoers/sssd.c:1053 plugins/sudoers/sssd.c:1233 +#: plugins/sudoers/sssd.c:1248 plugins/sudoers/sssd.c:1264 +#: plugins/sudoers/sudoers.c:261 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:279 plugins/sudoers/sudoers.c:363 +#: plugins/sudoers/sudoers.c:660 plugins/sudoers/sudoers.c:775 +#: plugins/sudoers/sudoers.c:819 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:517 plugins/sudoers/sudoreplay.c:716 +#: plugins/sudoers/sudoreplay.c:828 plugins/sudoers/sudoreplay.c:868 +#: plugins/sudoers/sudoreplay.c:877 plugins/sudoers/sudoreplay.c:887 +#: plugins/sudoers/sudoreplay.c:895 plugins/sudoers/sudoreplay.c:899 +#: plugins/sudoers/sudoreplay.c:1055 plugins/sudoers/sudoreplay.c:1059 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:216 +#: plugins/sudoers/testsudoers.c:233 plugins/sudoers/timestamp.c:374 +#: plugins/sudoers/timestamp.c:418 plugins/sudoers/timestamp.c:834 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:152 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:964 plugins/sudoers/visudo.c:1030 +#: plugins/sudoers/visudo.c:1074 plugins/sudoers/visudo.c:1171 +#: plugins/sudoers/visudo_json.c:1035 toke.l:832 toke.l:932 toke.l:1090 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "L'àlies «%s» ja està definit" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "no s'ha pogut obtenir la classe d'inici de sessió per a l'usuari %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "no s'ha pogut iniciar l'autenticació bsd" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "tipus no vàlida d'autenticació" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "no s'ha pogut inicialitzar l'autenticació BSD" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "no s'ha pogut llegir la configuració fwtk" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "no s'ha pogut connectar al servidor d'autenticació" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "s'ha perdut la connexió al servidor d'autenticació" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"error de servidor d'autenticació:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: no s'ha pogut convertir el principal a la cadena de caràcters ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: no s'ha pogut analitzar '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: no s'ha pogut resoldre el cau de credencials : %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: no s'han pogut assignar les opcions: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: no s'ha pogut obtenir les credencials: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: no s'ha pogut inicialitzar el cau de credencials: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: no s'ha pogut emmagatzemar la credencial al cau: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: no s'ha pogut obtenir el principal de l'amfitrió: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: No s'ha pogut verificar TGT! Possible atac!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "No s'ha pogut inicialitzar PAM" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "fallada de validació de compte, està bloquejat el vostre compte?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Ha expirat el compte o la contrasenya, restabliu la vostra contrasenya i proveu un altre cop" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "no s'ha pogut canviar la contrasenya expirada: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Ha expirat la contrasenya, contacteu el vostre administrador de sistema" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Ha expirat el compte o la configuració PAM no té una secció \"compte\" per a sudo, contacteu el vostre administrador de sistema" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Error d'autenticació PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:226 +#, c-format +msgid "you do not exist in the %s database" +msgstr "no existiu a la base de dades %s" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "ha fallat la inicialització de la biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "no s'ha pogut contactar el servidor SecurID" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "L'ID de l'usuari esta bloquejat per a Autenticació SecurID" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "nom d'usuari no vàlid per a SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "Mànec d'Autenticació no vàlid per a SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "Ha fallat la comunicació SecurID" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "error desconegut de SecurID" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "longitud no vàlida de contrasenya per a SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "no s'ha pogut inicialitzar la sessió SIA" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "mètodes no vàlids d'autenticació" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Mètodes no vàlids d'autenticació compilats dins del sudo! No podeu barrejar l'autenticació independent i no independent." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "no hi ha mètodes d'autenticació" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "No hi ha mètodes d'autenticació compilats dins del sudo! Si voleu deshabilitar l'autenticació, useu l'opció de configuració --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "No s'han pogut inicialitzar els mètodes d'autenticació." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Mètodes d'autenticació:" + +#: plugins/sudoers/bsm_audit.c:111 plugins/sudoers/bsm_audit.c:200 +msgid "Could not determine audit condition" +msgstr "No s'ha pogut determinar la condició d'auditoria" + +#: plugins/sudoers/bsm_audit.c:172 plugins/sudoers/bsm_audit.c:260 +msgid "unable to commit audit record" +msgstr "no s'ha pogut validar el registre d'auditoria" + +#: plugins/sudoers/check.c:252 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Confiem que heu rebut la llissó habitual de l'Administrador del\n" +"Sistema. Generalment es resumeix en aquestes tres coses:\n" +"\n" +" #1) Respecteu la privacitat dels altres.\n" +" #2) Penseu abans d'escriure.\n" +" #3) Tenir molt de poder està associat amb tenir molta responsabilitat.\n" +"\n" + +#: plugins/sudoers/check.c:295 plugins/sudoers/check.c:305 +#: plugins/sudoers/sudoers.c:696 plugins/sudoers/sudoers.c:738 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconegut: %u" + +#: plugins/sudoers/check.c:300 plugins/sudoers/iolog.c:235 +#: plugins/sudoers/policy.c:805 plugins/sudoers/sudoers.c:1127 +#: plugins/sudoers/testsudoers.c:207 plugins/sudoers/testsudoers.c:365 +#, c-format +msgid "unknown user: %s" +msgstr "usuari desconegut: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Eina syslog si s'està usant syslog per als registres: %s" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioritat de syslog a usar quan l'usuari s'autentica amb èxit: %s" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioritat de syslog a usar quan l'usuari no té èxit a autenticar- %s" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "Poseu la pregunta OTP a la seva pròpia línia" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Ignoreu '.' al $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Envia sempre correu electrònic quan s'executi sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Envia correu electrònic si falla l'autenticació de l'usuari" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correu electrònic si l'usuari no està als sudoers" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia el correu electrònic si l'usuari no està als sudoers per a aquesta amfitrió" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correu electrònic si l'usuari no té permís per executar aquesta ordre" + +#: plugins/sudoers/def_data.c:67 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correu electrònic si l'usuari intenta executar una ordre" + +#: plugins/sudoers/def_data.c:71 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa una marca horària separada per a cada combinació usuari/terminal" + +#: plugins/sudoers/def_data.c:75 +msgid "Lecture user the first time they run sudo" +msgstr "Dóna una llissó a l'usuari cada cop que executi sudo" + +#: plugins/sudoers/def_data.c:79 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fitxer que conté la llissó de sudo: %s" + +#: plugins/sudoers/def_data.c:83 +msgid "Require users to authenticate by default" +msgstr "Requereix de forma predeterminada que els usuaris s'autentiquin" + +#: plugins/sudoers/def_data.c:87 +msgid "Root may run sudo" +msgstr "L'usuari primari pot executar sudo" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra el nom del sistema amfitrió al fitxer de registre (que no és syslog)" + +#: plugins/sudoers/def_data.c:95 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra l'any al fitxer de registre (que no és syslog)" + +#: plugins/sudoers/def_data.c:99 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Si sudo s'invoca sense arguments, inicia un intèrpret d'ordres" + +#: plugins/sudoers/def_data.c:103 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Estableix $HOME per a l'usuari destí quan s'inicia un d'ordres amb -s" + +#: plugins/sudoers/def_data.c:107 +msgid "Always set $HOME to the target user's home directory" +msgstr "Estableix sempre $HOME al directori de l'usuari destí" + +#: plugins/sudoers/def_data.c:111 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permet recollir alguna informació per donar missatges d'error útils" + +#: plugins/sudoers/def_data.c:115 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Requereix noms de sistema amfitrió qualificats completament al sudoers" + +#: plugins/sudoers/def_data.c:119 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta a l'usuari quen entri una contrasenya incorrecta" + +#: plugins/sudoers/def_data.c:123 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permet a l'usuari executar sudo únicament si té un terminal" + +#: plugins/sudoers/def_data.c:127 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo tindrà en compte la variable d'entorn EDITOR" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for root's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari primari, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari runas_default, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:139 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pregunta per la contrasenya de l'usuari destí, no la de l'usuari normal" + +#: plugins/sudoers/def_data.c:143 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica els paràmetres predeterminats a la classe d'inici de sessió de l'usuari destí si hi ha una" + +#: plugins/sudoers/def_data.c:147 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Estableix les variables d'entorn LOGNAME i USER" + +#: plugins/sudoers/def_data.c:151 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Estableix únicament l'uid efectiu de l'usuari destí, no l'uid real" + +#: plugins/sudoers/def_data.c:155 +msgid "Don't initialize the group vector to that of the target user" +msgstr "No inicialitzis el vector de grup perquè coincideixi amb el de l'usuari destí" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "longitud a la qual ajustar les línies del fitxer de registres (0 per a no ajustar): %u" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Temps màxim d'espera per a la marca horària de l'autenticació: %.1f minuts" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Temps màxim d'espera per a la pregunta de la contrasenya: %.1f minuts" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombre de intents per entrar una contrasenya: %u" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a usar o 0777 per usar la de l'usuari: 0%o" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to log file: %s" +msgstr "Camí al fitxer de registre: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Path to mail program: %s" +msgstr "Camí al programa de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Indicadors per al programa de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adreça per enviar correu electrònic: %s" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adreça per enviar correu electrònic des de: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Línia d'assumpte per als missatges de correu electrònic: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Missatge de contrasenya incorrecta: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Camí al directori d'estat de la llissó: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Camí del directori de marques horàries d'autenticació: %s" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Propietari del directori de marques horàries d'autenticació: %s" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Els usuaris d'aquest grup estan exempts dels requeriments contrasenya i PATH: %s" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pregunta predeterminada de contrasenya: %s" + +#: plugins/sudoers/def_data.c:227 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Si està establert, la pregunta de contrasenya primarà sobre la pregunta del sistema en tots els casos." + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuari predeterminat per executar ordres com a: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor per anul·lar el $PATH de l'usuari amb: %s" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Camí a l'editor a usar per visudo: %s" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quan requerir una contrasenya per a la pseudo-ordre 'list': %s" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quan requerir una contrasenya per a la pseudo-ordre 'verify': %s" + +#: plugins/sudoers/def_data.c:251 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Pre-carrega les funcions dummy exex contingudes a la biblioteca sudo_noexec" + +#: plugins/sudoers/def_data.c:255 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si el directori LDAP està actiu, ignorem el fitxer local sudoers?" + +#: plugins/sudoers/def_data.c:259 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Els descriptors de fitxer >= %d es tancaran abans d'executar una ordre" + +#: plugins/sudoers/def_data.c:263 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Si està establert, els usuaris podran anul·lar el valor de `closeform' amb l'opció -C" + +#: plugins/sudoers/def_data.c:267 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permet als usuaris fixar variables arbitràries d'entorn" + +#: plugins/sudoers/def_data.c:271 +msgid "Reset the environment to a default set of variables" +msgstr "Restableix l'entorn a un conjunt predeterminat de variables" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to check for sanity:" +msgstr "Les variables d'entorn per comprovar la validesa:" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to remove:" +msgstr "Variables d'entorn a suprimir:" + +#: plugins/sudoers/def_data.c:283 +msgid "Environment variables to preserve:" +msgstr "Variables d'entorn a preservar:" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rol SELinux a usar al nou context de seguretat: %s" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipus SELinux a usar al nou context de seguretat: %s" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Camí al fitxer d'entorn sudo-específic: %s" + +#: plugins/sudoers/def_data.c:299 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Configuració local a usar quan s'estan analitzant els sudoers: %s" + +#: plugins/sudoers/def_data.c:303 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permet a sudo preguntar per una contrasenya tot i que pugui ser visible" + +#: plugins/sudoers/def_data.c:307 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Proveeix retroalimentació a la pregunta de contrasenya quan hi ha una entrada per l'usuari" + +#: plugins/sudoers/def_data.c:311 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa una expansió que és menys precisa però no accedeix el sistema de fitxers" + +#: plugins/sudoers/def_data.c:315 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Els permisos umask als sudoers anul·larà els permisos de l'usuari, tot i que siguin més permissius" + +#: plugins/sudoers/def_data.c:319 +msgid "Log user's input for the command being run" +msgstr "Registra l'entrada feta per l'usuari per a l'ordre que s'està executant" + +#: plugins/sudoers/def_data.c:323 +msgid "Log the output of the command being run" +msgstr "Registra la sortida de l'ordre que s'està executant" + +#: plugins/sudoers/def_data.c:327 +msgid "Compress I/O logs using zlib" +msgstr "Comprimeix els registres d'entrada/sortida usant zlib" + +#: plugins/sudoers/def_data.c:331 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa sempre les ordres en un pseudo-terminal" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Connector per a suport de grup no Unix: %s" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Directori on arxivar els registres entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:343 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fitxer on arxivar el registre entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:347 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Afegeix una entrada al fitxer utmp/utmpx quan s'estigui assignant un pty" + +#: plugins/sudoers/def_data.c:351 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Estableix l'usuari a utmp perquè sigui l'usuari runas, no l'usuari invocant" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of permitted privileges" +msgstr "Conjunt de privilegis permesos" + +#: plugins/sudoers/def_data.c:359 +msgid "Set of limit privileges" +msgstr "Conjunt de privilegis límit" + +#: plugins/sudoers/def_data.c:363 +msgid "Run commands on a pty in the background" +msgstr "Executa les ordres a un pseudo-terminal (pty) al fons" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use" +msgstr "Nom del servei PAM a usar" + +#: plugins/sudoers/def_data.c:371 +msgid "PAM service name to use for login shells" +msgstr "Nom del servei PAM a usar per a intèrprets d'ordres d'inici de sessió" + +#: plugins/sudoers/def_data.c:375 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Intent d'establir credencials PAM per a l'usuari destí" + +#: plugins/sudoers/def_data.c:379 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una nova sessió PAM on s'executi l'ordre" + +#: plugins/sudoers/def_data.c:383 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Número màxim de seqüència de registre d'entrada/sortida: %u" + +#: plugins/sudoers/def_data.c:387 +msgid "Enable sudoers netgroup support" +msgstr "Habilita el suport de netgroup dels sudoers" + +#: plugins/sudoers/def_data.c:391 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Comprova que el directori pare tingui permisos d'escriptura quan s'estiguin editant fitxers amb sudoedit" + +#: plugins/sudoers/def_data.c:395 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segueix els enllaços simbòlics quan s'estiguin editant fitxers amb sudoedit" + +#: plugins/sudoers/def_data.c:399 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta al connector de grups per grups desconeguts de sistema" + +#: plugins/sudoers/def_data.c:403 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Fes concordar els grups de xarxa en base al conjunt sencer: usuari, amfitrió i domini" + +#: plugins/sudoers/def_data.c:407 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al registre d'auditoria" + +#: plugins/sudoers/def_data.c:411 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al registre d'entrada/sortida" + +#: plugins/sudoers/def_data.c:415 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permet que s'executin les ordres tot i que sudo no pot escriure al fitxer de registre" + +#: plugins/sudoers/def_data.c:419 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resol els grups a sudoers i fes concordar amb l'identificador de grup, no el nom" + +#: plugins/sudoers/def_data.c:423 +msgid "Log entries larger than this value will be split into multiple syslog messages" +msgstr "Les entrades de registre més grans que aquest valor es dividiran en múltiples missatges de syslog" + +#: plugins/sudoers/def_data.c:427 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "L'usuari que serà el propietari dels fitxers d'entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:431 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "El grup que serà el propietari dels fitxers de registre d'entrada/sortida: %s" + +#: plugins/sudoers/def_data.c:435 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Mode de fitxer a usar per als fitxers de registre d'entrada/sortida: 0%o" + +#: plugins/sudoers/defaults.c:211 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/defaults.c:214 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/defaults.c:237 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d no s'ha especificat un valor per a «%s»" + +#: plugins/sudoers/defaults.c:240 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: no s'ha especificat un valor per a «%s»" + +#: plugins/sudoers/defaults.c:259 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d els valors per a «%s» han de començar amb un «/»" + +#: plugins/sudoers/defaults.c:262 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: els valors per a «%s» han de començar amb un «/»" + +#: plugins/sudoers/defaults.c:287 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d l'opció «%s» no pren un valor" + +#: plugins/sudoers/defaults.c:290 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'opció «%s» no pren un valor" + +#: plugins/sudoers/defaults.c:309 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d tipus de paràmetres predeterminats 0x%x per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:312 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: tipus 0x%x no vàlid de paràmetres predeterminats per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:322 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d el valor «%s» no és vàlid per a l'opció «%s»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: el valor «%s» no és vàlid per a l'opció «%s»" + +#: plugins/sudoers/env.c:296 plugins/sudoers/env.c:303 +#: plugins/sudoers/env.c:408 plugins/sudoers/ldap.c:451 +#: plugins/sudoers/ldap.c:541 plugins/sudoers/ldap.c:1253 +#: plugins/sudoers/ldap.c:1475 plugins/sudoers/ldap.c:1801 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:946 +#: plugins/sudoers/policy.c:523 plugins/sudoers/policy.c:533 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:841 +#: plugins/sudoers/testsudoers.c:237 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "error intern, desbordament de %s" + +#: plugins/sudoers/env.c:377 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrupte, discordança de longitud" + +#: plugins/sudoers/env.c:1082 +msgid "unable to rebuild the environment" +msgstr "no s'ha pogut reconstruir l'entorn" + +#: plugins/sudoers/env.c:1156 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "ho sentim, no teniu permís d'establir les següents variables d'entorn: %s" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ha de ser propietat de l'uid %d" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s ha de ser modificable sols pel seu propietari" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:398 +#, c-format +msgid "unable to load %s: %s" +msgstr "no s'ha pogut carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "no s'ha pogut trobar el símbol \"group_plugin\" a %s" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: connector incompatible de group versió principal %d, s'esperava %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "no s'ha pogut analitzar l'adreça IP «%s»" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "no s'ha pogut analitzar la màscara de xarxa «%s»" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Adreça local IP i parelles netmask:\n" + +#: plugins/sudoers/iolog.c:99 plugins/sudoers/mkdir_parents.c:78 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existeix però no és un directori (0%o)" + +#: plugins/sudoers/iolog.c:126 plugins/sudoers/iolog.c:170 +#: plugins/sudoers/mkdir_parents.c:65 plugins/sudoers/timestamp.c:167 +#, c-format +msgid "unable to mkdir %s" +msgstr "no s'ha pogut mkdir %s" + +#: plugins/sudoers/iolog.c:269 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:389 +#, c-format +msgid "unknown group: %s" +msgstr "grup desconegut: %s" + +#: plugins/sudoers/iolog.c:356 plugins/sudoers/sudoers.c:897 +#: plugins/sudoers/sudoreplay.c:304 plugins/sudoers/sudoreplay.c:817 +#: plugins/sudoers/sudoreplay.c:1021 plugins/sudoers/timestamp.c:383 +#: plugins/sudoers/visudo.c:951 plugins/sudoers/visudo_json.c:1011 +#: plugins/sudoers/visudo_json.c:1024 +#, c-format +msgid "unable to open %s" +msgstr "no s'ha pogut obrir %s" + +#: plugins/sudoers/iolog.c:399 plugins/sudoers/sudoers.c:901 +#: plugins/sudoers/sudoreplay.c:1132 +#, c-format +msgid "unable to read %s" +msgstr "no s'ha pogut llegir %s" + +#: plugins/sudoers/iolog.c:435 plugins/sudoers/sudoreplay.c:598 +#: plugins/sudoers/timestamp.c:282 plugins/sudoers/timestamp.c:285 +#, c-format +msgid "unable to write to %s" +msgstr "no s'ha pogut escriure a %s" + +#: plugins/sudoers/iolog.c:509 plugins/sudoers/iolog.c:727 +#, c-format +msgid "unable to create %s" +msgstr "no s'ha pogut crear %s" + +#: plugins/sudoers/iolog.c:895 plugins/sudoers/iolog.c:976 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "no s'ha pogut escriure al fitxer de registre d'entrada/sortida: %s" + +#: plugins/sudoers/iolog.c:927 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "%s: error intern, l'índex %d de fitxers no està obert" + +#: plugins/sudoers/ldap.c:429 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: el port és massa gran" + +#: plugins/sudoers/ldap.c:489 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipus d'uri LDAP no suportat: %s" + +#: plugins/sudoers/ldap.c:516 +msgid "unable to mix ldap and ldaps URIs" +msgstr "no s'han pogut barrejar el ldap i els ldaps URIs " + +#: plugins/sudoers/ldap.c:520 plugins/sudoers/ldap.c:556 +msgid "starttls not supported when using ldaps" +msgstr "starttls no suportat quan s'està usant ldaps" + +#: plugins/sudoers/ldap.c:627 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "no s'ha pogut inicialitzar el certificat SSL i la clau db: %s" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "heu d'establir TLS_CERT a %s per usar SSL" + +#: plugins/sudoers/ldap.c:1239 +msgid "unable to get GMT time" +msgstr "no s'ha pogut obtenir l'hora GMT" + +#: plugins/sudoers/ldap.c:1245 +msgid "unable to format timestamp" +msgstr "no s'ha pogut donar format a la marca horària" + +#: plugins/sudoers/ldap.c:1956 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:2504 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rol LDAP: %s\n" + +#: plugins/sudoers/ldap.c:2506 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Rol LDAP: DESCONEGUT\n" + +#: plugins/sudoers/ldap.c:2562 +#, c-format +msgid " Order: %s\n" +msgstr " Ordre: %s\n" + +#: plugins/sudoers/ldap.c:2570 plugins/sudoers/parse.c:556 +#: plugins/sudoers/sssd.c:1626 +#, c-format +msgid " Commands:\n" +msgstr " Ordres:\n" + +#: plugins/sudoers/ldap.c:3130 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "no s'ha pogut inicialitzar LDAP: %s" + +#: plugins/sudoers/ldap.c:3166 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "s'ha especificat start_tls però les biblioteques LDAP no donen suport a ldap_start_tls_s() o ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3415 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atribut sudoOrder no vàlid: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "no s'ha pogut obrir el sistema d'auditoria" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "no s'ha pogut enviar el missatge d'auditoria" + +#: plugins/sudoers/logging.c:106 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:134 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (ordre continuada) %s" + +#: plugins/sudoers/logging.c:163 +#, c-format +msgid "unable to open log file: %s" +msgstr "no s'ha pogut obrir el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:171 +#, c-format +msgid "unable to lock log file: %s" +msgstr "no s'ha pogut bloquejar el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:204 +#, c-format +msgid "unable to write log file: %s" +msgstr "no s'ha pogut escriure el fitxer de registre: %s" + +#: plugins/sudoers/logging.c:233 +msgid "No user or host" +msgstr "No hi ha usuari o amfitrió" + +#: plugins/sudoers/logging.c:235 +msgid "validation failure" +msgstr "ha fallat la validació" + +#: plugins/sudoers/logging.c:242 +msgid "user NOT in sudoers" +msgstr "l'usuari NO ESTÀ als sudoers" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT authorized on host" +msgstr "l'usuari NO està autoritzat a l'amfitrió" + +#: plugins/sudoers/logging.c:246 +msgid "command not allowed" +msgstr "ordre no permesa" + +#: plugins/sudoers/logging.c:281 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s no està al fitxer sudoers. S'informarà d'aquest incident.\n" + +#: plugins/sudoers/logging.c:284 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s no té permís per executar sudo a %s. S'informarà d'aquest incident.\n" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Ho sentim, l'usuari %s no pot executar sudo a %s.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Ho sentim, l'usuari %s no pot executar '%s%s%s' com a %s%s%s a %s.\n" + +#: plugins/sudoers/logging.c:328 plugins/sudoers/sudoers.c:468 +#: plugins/sudoers/sudoers.c:470 plugins/sudoers/sudoers.c:472 +#: plugins/sudoers/sudoers.c:474 plugins/sudoers/sudoers.c:1247 +#: plugins/sudoers/sudoers.c:1249 +#, c-format +msgid "%s: command not found" +msgstr "%s: no s'ha trobar l'ordre" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:464 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"s'ignorarà «%s» trobat a «.»\n" +"Useu «sudo ./%s» si aquest és el «%s» que voleu executar." + +#: plugins/sudoers/logging.c:347 +msgid "authentication failure" +msgstr "ha fallat l'autenticació" + +#: plugins/sudoers/logging.c:373 +msgid "a password is required" +msgstr "es requereix una contrasenya" + +#: plugins/sudoers/logging.c:444 plugins/sudoers/logging.c:510 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u intent incorrecte de contrasenya" +msgstr[1] "%u intents incorrectes de contrasenya" + +#: plugins/sudoers/logging.c:597 +msgid "unable to fork" +msgstr "no es pot bifurcar" + +#: plugins/sudoers/logging.c:605 plugins/sudoers/logging.c:657 +#, c-format +msgid "unable to fork: %m" +msgstr "no est pot bifurcar: %m" + +#: plugins/sudoers/logging.c:647 +#, c-format +msgid "unable to open pipe: %m" +msgstr "no es pot obrir la canonada: %m" + +#: plugins/sudoers/logging.c:672 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "no es pot duplicar l'entrada estàndard: %m" + +#: plugins/sudoers/logging.c:710 +#, c-format +msgid "unable to execute %s: %m" +msgstr "no es pot executar %s: %m" + +#: plugins/sudoers/match.c:644 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipus de resum no suportat %d per a %s" + +#: plugins/sudoers/match.c:685 +#, c-format +msgid "%s: read error" +msgstr "%s: error de lectura" + +#: plugins/sudoers/match.c:720 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "digest per a %s (%s) no està en forma %s" + +#: plugins/sudoers/mkdir_parents.c:72 plugins/sudoers/sudoers.c:912 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:715 +#, c-format +msgid "unable to stat %s" +msgstr "no s'ha pogut accedir %s" + +#: plugins/sudoers/parse.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "error d'anàlisi a %s a prop de la línia %d" + +#: plugins/sudoers/parse.c:117 +#, c-format +msgid "parse error in %s" +msgstr "error d'anàlisi a la línia %s" + +#: plugins/sudoers/parse.c:503 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrada de sudoers:\n" + +#: plugins/sudoers/parse.c:504 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:527 +#, c-format +msgid " Options: " +msgstr " Opcions: " + +#: plugins/sudoers/policy.c:240 plugins/sudoers/testsudoers.c:260 +msgid "unable to parse network address list" +msgstr "no s'ha pogut analitzar la llista d'adreces de xarxa" + +#: plugins/sudoers/policy.c:690 plugins/sudoers/visudo.c:889 +#, c-format +msgid "unable to execute %s" +msgstr "no s'ha pogut executar %s" + +#: plugins/sudoers/policy.c:823 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versió del connector de política de sudoers %s\n" + +#: plugins/sudoers/policy.c:825 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versió de gramàtica del fitxer sudoers %d\n" + +#: plugins/sudoers/policy.c:829 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Camí del sudoers: %s\n" + +#: plugins/sudoers/policy.c:832 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "camí del nsswitch: %s\n" + +#: plugins/sudoers/policy.c:834 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "camí de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:835 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "camí del ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:868 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "no s'ha pogut registrar el lligam de tipus %d (versió %d.%d)" + +#: plugins/sudoers/pwutil.c:162 plugins/sudoers/pwutil.c:180 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "no s'ha pogut posar al cau l'uid %u, s'ha exhaurit la memòria" + +#: plugins/sudoers/pwutil.c:174 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "no s'ha pogut posar l'uid %u al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:234 plugins/sudoers/pwutil.c:251 +#: plugins/sudoers/pwutil.c:313 plugins/sudoers/pwutil.c:358 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "no s'ha pogut posar l'usuari %s, s'ha exhaurit la memòria" + +#: plugins/sudoers/pwutil.c:246 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "no s'ha pogut posar l'usuari %s al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:474 plugins/sudoers/pwutil.c:492 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "no s'ha pogut posar el gid %u al cau, s'ha exhaurit la memòria" + +#: plugins/sudoers/pwutil.c:486 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "no s'ha pogut posar el gid %u al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:540 plugins/sudoers/pwutil.c:557 +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:646 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "no s'ha pogut posar el grup %s al cau, s'ha exhaurit" + +#: plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "no s'ha pogut posar el grup %s al cau, ja existeix" + +#: plugins/sudoers/pwutil.c:772 plugins/sudoers/pwutil.c:824 +#: plugins/sudoers/pwutil.c:874 plugins/sudoers/pwutil.c:926 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "no s'ha pogut la llista de grups al cau per a %s, ja existeix" + +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:829 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:931 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "no s'ha pogut la llista de grups al cau per a %s, s'ha exhaurit la memòria" + +#: plugins/sudoers/pwutil.c:818 +#, c-format +msgid "unable to parse groups for %s" +msgstr "no s'han pogut analitzar els grups per a %s" + +#: plugins/sudoers/pwutil.c:920 +#, c-format +msgid "unable to parse gids for %s" +msgstr "no s'han pogut analitzar els identificadors de grups per a %s" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:438 +#: plugins/sudoers/set_perms.c:841 plugins/sudoers/set_perms.c:1138 +#: plugins/sudoers/set_perms.c:1430 +msgid "perm stack overflow" +msgstr "desbordament de la pila de permisos" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:369 +#: plugins/sudoers/set_perms.c:446 plugins/sudoers/set_perms.c:708 +#: plugins/sudoers/set_perms.c:849 plugins/sudoers/set_perms.c:1067 +#: plugins/sudoers/set_perms.c:1146 plugins/sudoers/set_perms.c:1363 +#: plugins/sudoers/set_perms.c:1438 plugins/sudoers/set_perms.c:1527 +msgid "perm stack underflow" +msgstr "subdesbordament de la pila de permisos" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:492 +#: plugins/sudoers/set_perms.c:1197 plugins/sudoers/set_perms.c:1470 +msgid "unable to change to root gid" +msgstr "no s'ha pogut canvir el gid de l'usuari primari" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:589 +#: plugins/sudoers/set_perms.c:978 plugins/sudoers/set_perms.c:1274 +msgid "unable to change to runas gid" +msgstr "no s'ha pogut canviar el gid runas" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:594 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1279 +msgid "unable to set runas group vector" +msgstr "no s'ha pogut configurar el vector de grup runas" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:605 +#: plugins/sudoers/set_perms.c:992 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas uid" +msgstr "no s'ha pogut canviar l'uid runas" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:623 +#: plugins/sudoers/set_perms.c:1008 plugins/sudoers/set_perms.c:1304 +msgid "unable to change to sudoers gid" +msgstr "no s'ha pogut canvir el gid del sudoers" + +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 +msgid "too many processes" +msgstr "massa processos" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "no s'ha pogut obtenir el directori actual de treball" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "camí truncat d'auditoria use_cmd: %s" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "camí truncat d'auditoria argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "missatge audit_failure massa llarg" + +#: plugins/sudoers/sssd.c:400 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "no s'ha pogut inicialitzar la font del SSS. Està el SSSD instal·lat al vostre sistema?" + +#: plugins/sudoers/sssd.c:408 plugins/sudoers/sssd.c:417 +#: plugins/sudoers/sssd.c:426 plugins/sudoers/sssd.c:435 +#: plugins/sudoers/sssd.c:444 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "no s'ha pogut trobar el símbol \"%s\" a %s" + +#: plugins/sudoers/sssd.c:1541 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" +"\n" +"Rol SSDD: %s\n" + +#: plugins/sudoers/sssd.c:1546 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" +"\n" +"Rol SSSD: DESCONEGUT\n" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entrades predeterminades concordants per a %s a %s:\n" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas i valors predeterminats específics d'ordres per a %s:\n" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'usuari %s pot executar les ordres següents a %s:\n" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'usuari %s no té permisos per executar sudo a %s.\n" + +#: plugins/sudoers/sudoers.c:166 plugins/sudoers/testsudoers.c:246 +#: plugins/sudoers/visudo.c:232 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:955 +msgid "unable to initialize sudoers default values" +msgstr "no s'han pogut inicialitzar el valors predeterminats dels sudoers" + +#: plugins/sudoers/sudoers.c:196 plugins/sudoers/sudoers.c:859 +msgid "problem with defaults entries" +msgstr "hi ha un problema amb les entrades predeterminades" + +#: plugins/sudoers/sudoers.c:203 +msgid "no valid sudoers sources found, quitting" +msgstr "no s'han trobat fonts vàlides de sudoers, se sortirà" + +#: plugins/sudoers/sudoers.c:242 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "el fitxer sudoers especifica que l'usuari primar no pot executar sudo" + +#: plugins/sudoers/sudoers.c:299 +msgid "you are not permitted to use the -C option" +msgstr "no teniu permisos per usar l'opció -C" + +#: plugins/sudoers/sudoers.c:387 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "propietari de la marca horària (%s): No existeix aquest usuari" + +#: plugins/sudoers/sudoers.c:401 +msgid "no tty" +msgstr "no hi ha una terminal" + +#: plugins/sudoers/sudoers.c:402 +msgid "sorry, you must have a tty to run sudo" +msgstr "ho sentim, heu de tenir una terminal per executar sudo" + +#: plugins/sudoers/sudoers.c:463 +msgid "command in current directory" +msgstr "ordre al directori actual" + +#: plugins/sudoers/sudoers.c:483 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "ho sentim, no teniu permisos per preserver l'entorn" + +#: plugins/sudoers/sudoers.c:804 +msgid "command too long" +msgstr "ordre massa llarga" + +#: plugins/sudoers/sudoers.c:916 +#, c-format +msgid "%s is not a regular file" +msgstr "%s no és un fitxer regular" + +#: plugins/sudoers/sudoers.c:920 plugins/sudoers/timestamp.c:209 toke.l:952 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s és propietat de l'uid %u, hauria de ser %u" + +#: plugins/sudoers/sudoers.c:924 toke.l:957 +#, c-format +msgid "%s is world writable" +msgstr "%s te permís universal d'escriptura" + +#: plugins/sudoers/sudoers.c:928 toke.l:960 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s és propietat del gid %u, hauria de ser %u" + +#: plugins/sudoers/sudoers.c:961 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "sols l'usuari primari pot usar «-c %s»" + +#: plugins/sudoers/sudoers.c:980 +#, c-format +msgid "unknown login class: %s" +msgstr "classe desconeguda d'inici de sessió: %s" + +#: plugins/sudoers/sudoers.c:1063 plugins/sudoers/sudoers.c:1091 +#, c-format +msgid "unable to resolve host %s" +msgstr "no s'ha pogut resoldre l'amfitrió %s" + +#: plugins/sudoers/sudoreplay.c:236 +#, c-format +msgid "invalid filter option: %s" +msgstr "opció no vàlida de filtre: %s" + +#: plugins/sudoers/sudoreplay.c:249 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera màxima no vàlida: %s" + +#: plugins/sudoers/sudoreplay.c:255 +#, c-format +msgid "invalid speed factor: %s" +msgstr "factor no vàlid de velocitat: %s" + +#: plugins/sudoers/sudoreplay.c:258 plugins/sudoers/visudo.c:185 +#, c-format +msgid "%s version %s\n" +msgstr "%s versió %s\n" + +#: plugins/sudoers/sudoreplay.c:290 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:296 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:312 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "S'està tornant a reproduir la sessió sudo: %s\n" + +#: plugins/sudoers/sudoreplay.c:318 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advertiment: el vostre terminal és massa petit per reproduir apropiadament el registre.\n" + +#: plugins/sudoers/sudoreplay.c:319 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La geometria del registre és %d x %d, la geometria del vostre terminal és %d x %d." + +#: plugins/sudoers/sudoreplay.c:410 +msgid "unable to set tty to raw mode" +msgstr "no s'ha pogut configurar el terminal a mode de dades en brut" + +#: plugins/sudoers/sudoreplay.c:439 +#, c-format +msgid "invalid timing file line: %s" +msgstr "línia no vàlida de fitxer de sincronització: %s" + +#: plugins/sudoers/sudoreplay.c:659 plugins/sudoers/sudoreplay.c:684 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressió ambigua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:706 +msgid "unmatched ')' in expression" +msgstr "')' sense concordança a l'expressió" + +#: plugins/sudoers/sudoreplay.c:710 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "terme desconegut de cerca \"%s\"" + +#: plugins/sudoers/sudoreplay.c:725 +#, c-format +msgid "%s requires an argument" +msgstr "%s requereix un argument" + +#: plugins/sudoers/sudoreplay.c:728 plugins/sudoers/sudoreplay.c:1108 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressió regular no vàlida: %s" + +#: plugins/sudoers/sudoreplay.c:732 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "no s'ha pogut analitzar la data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:741 +msgid "unmatched '(' in expression" +msgstr "'(' sense concordança a l'expressió" + +#: plugins/sudoers/sudoreplay.c:743 +msgid "illegal trailing \"or\"" +msgstr "\"or\" final il·legal" + +#: plugins/sudoers/sudoreplay.c:745 +msgid "illegal trailing \"!\"" +msgstr "\"!\" final il·legal" + +#: plugins/sudoers/sudoreplay.c:794 +#, c-format +msgid "unknown search type %d" +msgstr "tipus desconegut de cerca %d" + +#: plugins/sudoers/sudoreplay.c:832 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: fitxer no vàlid de registre" + +#: plugins/sudoers/sudoreplay.c:850 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: no hi ha el camp de marca horària " + +#: plugins/sudoers/sudoreplay.c:857 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marca horària %s: %s" + +#: plugins/sudoers/sudoreplay.c:864 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: no hi ha el camp d'usuari runas" + +#: plugins/sudoers/sudoreplay.c:873 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: no hi ha el camp del grup runas" + +#: plugins/sudoers/sudoreplay.c:882 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: no es troba el camp del grup runas" + +#: plugins/sudoers/sudoreplay.c:1245 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "ús: %s [-h] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1248 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "usage: %s [-h] [-d dir] -l [cerca l'expressió]\n" + +#: plugins/sudoers/sudoreplay.c:1257 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reprodueix els registres de la sessió sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1259 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcions:\n" +" -d, --directori=dir especifiqueu el directori per als registres de la sessió\n" +" -f, --filter=filtre especifiqueu quin(s) tipus d'entrada/sortida mostrar\n" +" -h, --help mostra el missatge d'ajuda i surt\n" +" -l, --list mostra una llista dels IDs de les sessions\n" +" disponibles, amb expressions opcionals\n" +" -m, --max-wait=num nombre màxim de segons a esperar entre esdeveniments\n" +" -s, --speed=num accelera o alenteix la sortida\n" +" -V, --version mostra la versió d'informació i surt" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "\tamfitrió sense concordança" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Ordre permesa" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Ordre denegada" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Ordre sense concordança" + +#: plugins/sudoers/timestamp.c:217 +#, c-format +msgid "%s is group writable" +msgstr "%s és modificable pel grup" + +#: plugins/sudoers/timestamp.c:293 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "no s'ha pogut truncar el fitxer de marca horària a %lld bytes" + +#: plugins/sudoers/timestamp.c:738 plugins/sudoers/timestamp.c:805 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "no s'ha pogut llegir el rellotge" + +#: plugins/sudoers/timestamp.c:752 +msgid "ignoring time stamp from the future" +msgstr "s'ignorarà la marca horària del futur" + +#: plugins/sudoers/timestamp.c:764 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "la marca horària està massa lluny en el futur: %20.20s" + +#: plugins/sudoers/timestamp.c:859 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "no s'ha pogut bloquejar el fitxer de marca horària %s" + +#: plugins/sudoers/timestamp.c:903 plugins/sudoers/timestamp.c:923 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "el camí de l'estat de la llissó és massa llarg: %s/%s" + +#: plugins/sudoers/visudo.c:187 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versió de la gramàtica %d\n" + +#: plugins/sudoers/visudo.c:265 plugins/sudoers/visudo.c:665 +#, c-format +msgid "press return to edit %s: " +msgstr "prem la tecla d'introducció per editar %s: " + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor especificat (%s) no existeix" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "no s'ha trobat un editor (el camí de l'editor = %s)" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "error d'escriptura" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "no s'ha pogut accedir al fitxer temporal (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "fitxer temporal amb longitud nul·la (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "l'editor (%s) ha fallat, no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "no s'ha pogut reobrir el fitxer temporal (%s), no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "no s'ha pogut analitzar el fitxer temporal (%s), error desconegut" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "error intern, no s'ha pogut trobar %s a la llista!" + +#: plugins/sudoers/visudo.c:717 plugins/sudoers/visudo.c:726 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "no s'ha pogut establir (uid, gid) de %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:721 plugins/sudoers/visudo.c:731 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "no s'ha pogut canviar el mode de %s a 0%o" + +#: plugins/sudoers/visudo.c:748 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s no estan al mateix sistema de fitxers, s'usarà mv per reanomenar" + +#: plugins/sudoers/visudo.c:762 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "l'ordre ha fallat: '%s %s %s', no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:772 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "error quan s'estava reanomenant %s, no s'ha modificat %s" + +#: plugins/sudoers/visudo.c:834 +msgid "What now? " +msgstr "Què fem ara? " + +#: plugins/sudoers/visudo.c:848 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Les opcions són:\n" +" (e)dita el fitxer sudoers un altre cop\n" +" (x) surt sense desar els canvis al fitxer sudoers\n" +" (Q) surt i desa el canvis el fitxer sudoers (PERILL!)\n" + +#: plugins/sudoers/visudo.c:894 +#, c-format +msgid "unable to run %s" +msgstr "no s'ha pogut executar %s" + +#: plugins/sudoers/visudo.c:924 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: propietari incorrecte (uid, gid) hauria de ser (%uk, %u)\n" + +#: plugins/sudoers/visudo.c:931 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permisos dolents, hauria de ser mode 0%o\n" + +#: plugins/sudoers/visudo.c:960 plugins/sudoers/visudo_json.c:1031 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "no s'ha pogut analitzar el fitxer %s, error desconegut" + +#: plugins/sudoers/visudo.c:976 plugins/sudoers/visudo_json.c:1042 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "error d'anàlisi a %s a prop de la línia %d\n" + +#: plugins/sudoers/visudo.c:979 plugins/sudoers/visudo_json.c:1045 +#, c-format +msgid "parse error in %s\n" +msgstr "error d'anàlisi a %s\n" + +#: plugins/sudoers/visudo.c:987 plugins/sudoers/visudo.c:994 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: s'analitzat correctament\n" + +#: plugins/sudoers/visudo.c:1041 +#, c-format +msgid "%s busy, try again later" +msgstr "%s està ocupat, proveu un altre cop més tard" + +#: plugins/sudoers/visudo.c:1137 +#, c-format +msgid "%s:%d cycle in %s \"%s\"" +msgstr "%s:%d cicle a %s «%s»" + +#: plugins/sudoers/visudo.c:1140 +#, c-format +msgid "%s:%d %s \"%s\" referenced but not defined" +msgstr "%s:%d %s «%s» s'ha referenciat però no s'ha definit " + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "%s:%d unused %s \"%s\"" +msgstr "%s:%d sense usar %s «%s»" + +#: plugins/sudoers/visudo.c:1403 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita amb seguretat el fitxer sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1405 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Opcions:\n" +" -c, --check mode de sols verificació\n" +" -f, --file=sudoers especifiqueu la ubicació del fitxer sudoers\n" +" -h, --help mostra el missatge d'ajuda i surt\n" +" -q, --quiet missatges d'error de sintaxi menys informatius (silenciós)\n" +" -s, --strict verificació estricta de la sintaxi\n" +" -V, --version mostra la informació de la versió i surt\n" +" -x, --export=output_file escriu el fitxer sudoers en format JSON a output_file" + +#: plugins/sudoers/visudo_json.c:632 plugins/sudoers/visudo_json.c:667 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada «%s» desconeguda de paràmetres predeterminats" + +#: plugins/sudoers/visudo_json.c:1017 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: els fitxers d'entrada i de sortida han de ser diferents" + +#: toke.l:926 +msgid "too many levels of includes" +msgstr "massa nivells d'inclusions" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Advertiment: cicle a %s `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Advertiment: s'ha referenciat però no s'ha definit %s `%s'" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Advertiment: %s `%s' sense usar" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: s'ha exhaurit l'espai quan s'estava expandint hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: s'ha exhaurit l'espai construint hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "discordança d'assignació de sudo_ldap_build_pass1" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "el camí de la marca horària és massa llarg: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "no s'ha pogut accedir l'editor (%s)" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "error intern: espai insuficient per a la línia de registre" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: desbordament de la memòria intermèdia" diff --git a/utsudo-0.0.2/plugins/sudoers/po/cs.mo b/utsudo-0.0.2/plugins/sudoers/po/cs.mo new file mode 100644 index 0000000000000000000000000000000000000000..1f4564e7dbcfba849791e365dae7829bd101fdba GIT binary patch literal 49780 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 Uu!&sOfBZ728m79nB40fFe|Uf;PXGV_ literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/cs.po b/utsudo-0.0.2/plugins/sudoers/po/cs.po new file mode 100644 index 0000000..88c658f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/cs.po @@ -0,0 +1,2429 @@ +# Czech translation for sudo. +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2013 +# Petr Pisar , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +# (AIX) registry → (AIXový) registr +# timestamp → časové údaje +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-07-22 17:45+02:00\n" +"Last-Translator: Petr Pisar \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "chyba syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Heslo pro %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] heslo pro %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Heslo: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BEZPEČNOSTNÍ hlášení o %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Je nám líto, zkuste to znovu." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "nelze alokovat paměť" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "kontrolní součet vyžaduje název cesty" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "neplatná hodnota notbefore (začátek platnosti)" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "neplatná hodnota notafter (konec platnosti)" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "hodnota časového limitu je příliš velká" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "neplatná hodnota časového limitu" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias „%s“ je již definován" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "nelze vytvořit proces" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, c-format +msgid "unable to change password for %s" +msgstr "prošlé heslo pro %s nelze změnit" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nelze získat přihlašovací třídu uživatele %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "nelze zahájit BSD autentizaci" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "neplatný druh autentizace" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "nelze inicializovat BSD autentizaci" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "vašemu účtu skončila platnost" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "schválení selhalo" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "nelze načíst konfiguraci FWTK" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "k autentizačnímu serveru se nelze připojit" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "spojení k autentizačnímu serveru ztraceno" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"chyba autentizačního serveru:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: principála nelze převést na řetězec („%s“): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: „%s“ nelze rozebrat: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nelze najít keš s pověřeními: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nelze alokovat volby: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nelze získat pověření: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nelze inicializovat keš s pověřeními: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: pověření nelze uložit do keše: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nelze získat principála stroje: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT nelze ověřit! Podezření na útok!: %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "PAM nelze inicializovat" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Chyba autentizace PAM: %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "ověření účtu selhalo, není váš účet zamknutý?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "Účtu nebo heslu vypršela platnost, nastavte si nové heslo a zkuste to znovu" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "prošlé heslo nelze změnit: %s" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "Heslu vypršela platnost, kontaktujte správce svého systému" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Účtu vypršela platnost nebo v konfiguraci PAM pro sudo chybí sekce „account“. Kontaktujte správce svého systému" + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "Chyba správy účtů PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "v databázi %s neexistujete" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "inicializace knihovny ACE selhala" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "nelze kontaktovat server SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "ID uživatele je pro autentizaci SecurID uzamčeno" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "neplatná délka uživatelského jména pro SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "neplatný deskriptor autentizace pro SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "komunikace se SecurID selhala" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "neznámá chyba SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "neplatná délka kódu pro SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "nelze inicializovat relaci SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "neplatné autentizační metody" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Sudo bylo sestaveno s neplatnými autentizačními metodami! Nesmíte míchat samostatnou a nesamostatnou autentizaci." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "žádné autentizační metody" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo bylo sestaveno bez autentizačních metod! Chcete-li vypnout autentizaci, použijte při sestavování přepínač --disable-autentizaci." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Nelze inicializovat metody autentizace." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Autentizační metody:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Nebylo možné určit podmínku pro audit" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "auditní zprávu nelze odeslat" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Věříme, že jste od správce místního systému obdrželi obvyklé školení.\n" +"Obvykle se jedná o tyto tři věci:\n" +"\n" +" 1. Respektujte soukromí druhých.\n" +" 2. Přemýšlejte, než začnete psát.\n" +" 3. S velkými právy přichází velká zodpovědnost.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "neznámé UID: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "neznámý uživatel: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "přírůstek pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "počáteční pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "odsazení pořadí: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s verze %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "verze gramatiky %s je %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nepodporovaný formát vstupu %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nepodporovaný formát výstupu %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: vstupní a výstupní soubory se musí lišit" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "nelze inicializovat výchozí hodnoty sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: neznámé klíčové slovo: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "neplatný druh položky defaults: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "neplatný druh potlačení: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "neplatný filtr: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "nelze otevřít %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "rozbor souboru %s se nezdařil, neznámá chyba" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "chyba při rozboru %s kolem řádku %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "chyba při rozboru %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "do %s nelze zapsat" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s – převádí mezí formáty souboru sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Přepínače:\n" +" -b, --base=dn base DN pro ldapové dotazy suda\n" +" -c, --config=konfigurační_soubor\n" +" cesta ke konfiguračnímu souboru\n" +" -d, --defaults=druhydef převede pouze Defaults zadaných druhů\n" +" -e, --expand-aliases při převodu expanduje aliasy\n" +" -f, --output-format=formát nastaví formát výstupu: JSON, LDIF nebo sudoers\n" +" -i, --input-format=formát nastaví formát vstupu: LDIF nebo sudoers\n" +" -I, --increment=číslo množství, o které zvýšit každou definici sudoOrder\n" +" -h, --help zobrazí zprávu s nápovědou a skončí\n" +" -m, --match=filtr převede pouze položky, které odpovídají filtru\n" +" -M, --match-local porovnávací filtr použije databáze passwd a group\n" +" -o, --output=výstupní_soubor\n" +" zapíše převedený sudoers to výstupního_souboru\n" +" -O, --order-start=číslo počáteční bod pro první sudoOrder\n" +" -p, --prune-matches odstraní neodpovídající uživatele, skupiny a stroje\n" +" -P, --padding=číslo základní odsazení přírůstku sudoOrder\n" +" -s, --suppress=oddíl potlačí výstup jistých oddílů\n" +" -V, --version zobrazí údaje o verzi a skončí" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "neznámá položka defaults „%s“" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "nelze získat čas GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "nelze naformátovat časový údaj" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnitřní chyba, přetečení %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "příliš mnoho záznamů sudoers, maximum je %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "proměnná prostředí SUDOERS_BASE není nastavená a přepínač -b nebyl zadán." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Obor systémového protokolu, je-li syslog použit pro protokolování: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorita systémového protokolu, která se použije při úspěšné autentizaci uživatele: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorita systémového protokolu, která se použije při neúspěšné autentizaci: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Dotaz na jednorázový kód bude na vlastním řádku" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignoruje „.“ v PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Vždy, když se použije sudo, odešle e-mail" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Odešle e-mail, když autentizace uživatele selže" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Odešle e-mail, pokud uživatel není v sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Odešle e-mail, když uživatel není v sudoers uveden pro tento stroj" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Odešle e-mail, když uživatel nemá dovoleno spustit příkaz" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Odešle e-mail, když uživatel zkusí spustit příkaz" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Pro každou kombinaci uživatele a TTY použije samostatný časovač" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Před prvním použitím sudo proškolí uživatele" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Soubor obsahující školení k sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Standardně vyžaduje, aby se uživatelé autentizovali" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root může spustit sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Do (nesyslogového) protokolu zaznamenává název stroje" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Do (nesyslogového) protokolu zaznamenává rok" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Je-li sudo zavoláno bez argumentů, spustí shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Nastaví HOME na cílového uživatele, když se pouští shell s -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Vždy nastaví HOME na domovský adresář cílového uživatele" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dovolí sběr některých údajů za účelem užitečných chybových zpráv" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vyžaduje v souboru sudoers plně kvalifikované názvy strojů" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Urazí uživatele, pokud zadá chybné heslo" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Dovolí uživateli spustit sudo, pouze když má TTY" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo bude dodržovat proměnou prostředí EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Ptá se heslo roota, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Ptá se na heslo runas_default uživatele, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Ptá se na heslo cílového uživatele, ne na heslo uživatele" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Použije výchozí nastavení v přihlašovací třídě cílového uživatele, existuje-li" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Nastaví proměnné prostředí LOGNAME a USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nastaví pouze efektivní UID na cílového uživatele, nikoliv reálné UID" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Neinicializuje vektor skupin na vektor cílového uživatele" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Délka zlomu řádků v protokolu (0 pro nezalamování): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Limit na časové údaje autentizace: %.1f min" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Limit na výzvu k heslu: %.1f min" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Počet pokusů na zadání hesla: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask nebo 0777 pro hodnotu uživatele: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Cesta k souboru s protokolem: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Cesta k poštovnímu programu: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Přepínače pro poštovní program: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresa, kam zasílat poštu: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adrese, ze které zasílat poštu: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Řádek s předmětem pro poštovní zprávy: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Zpráva při chybném hesle: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Cesta k adresáři se stavy lekcí: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Cesta k adresáři s časovými údaji autentizace: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Vlastník adresáře s časovými údaji autentizace: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uživatelé v této skupině jsou vyjmuti z požadavků na heslo na PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Výchozí výzva pro heslo: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Je-li nastaveno, passprompt přebije systémovou výzvu ve všech případech." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Výchozí uživatel, pro kterým spouštět příkazy: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Hodnota, kterou přebít PATH uživatele: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Cesta k editoru pro potřeby visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kdy vyžadovat heslo pro pseudopříkaz „list“: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kdy vyžadovat heslo pro pseudopříkaz „verify“: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Přednačíst prázdné spouštěcí funkce obsažené v knihovně sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Pokud je adresář LDAP dostupný, ignorovat místní soubor sudoers" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Souborové deskriptory >= %d budou před spuštěním příkazu uzavřeny" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Je-li nastaveno, uživatelé mohou přebít hodnotu „closefrom“ přepínačem -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Dovolit uživatelům nastavit libovolné proměnné prostředí" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Vrátit prostředí do výchozí množiny proměnných" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Proměnné prostředí kontrolované na logičnost:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Proměnné prostředí, které se mají odstranit:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Proměnné prostředí, které se mají zachovat:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Selinuxový role, která se použije v novém bezpečnostním kontextu: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Selinuxový typ, který se použije v novém bezpečnostním kontextu: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Cesta k souboru s prostředím určeném pro sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Cesta k souboru s omezeným prostředím určeném pro sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Národní prostředí, které se použije pro rozbor sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dovolit sudu ptát se na heslo, i kdyby bylo čitelné" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Indikovat vstup uživatele při dotazu na heslo" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Použit rychlejší expanzi globů, která je méně přesná, ale nepřistupuje k souborovému systému" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umask zadaná v sudoers přebije uživatelovu, i když je volnější" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Zaznamenávat vstup uživatele pro spouštěný příkaz" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Zaznamenávat výstup spouštěného příkazu" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimovat protokoly o vstupu/výstupu pomocí zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Vždy spouštět příkazy v pseudoTTY" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Modul pro podporu neunixových skupin: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Adresář, kam ukládat protokoly o vstupu/výstupu: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Soubor, do kterého ukládat protokol o vstupu/výstupu: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Při alokaci PTY přidat záznam do souboru utmp/utmpx" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Do utmp zapisovat runas uživatele, nikoliv uživatele volajícího" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Množina povolujících práv: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Množina omezujících práv: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Spouštět příkazy v PTY na pozadí" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Použít tuto službu PAM: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Název služby PAM, který se použije pro přihlašovací shelly: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Pokusit se získat pověření PAM pro cílového uživatele" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Vytvořit pro spouštěný příkaz novou relaci PAM" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Ověřit platnost účtu pomocí PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maximální pořadové číslo protokolu o vstupu/výstupu: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Zapnout v sudoers podporu netgroup" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontrolovat nadřazené adresáře na možnost zápisu při úpravě souborů pomocí sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Následovat symbolické odkazy při úpravě souborů pomocí sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Dotazovat se modulu pro skupiny na neznámé systémové skupiny" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Porovnávat netgroups na celou n-tici: uživatel, stroj a doména" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do auditního protokolu" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do I/O protokolu" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Dovolit spuštění příkazu, i když sudo nemůže zapsat do souboru s protokolem" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Překládat skupiny v sudoers a hledat shodu na ID skupiny, ne na jméně" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Položky protokolu větší než tato hodnota budou rozděleny do více zpráv syslogu: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Uživatel, který bude vlastnit soubory s I/O protokolem: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Skupina, která bude vlastnit soubory s I/O protokolem: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Přístupová práva k souboru s I/O protokolem: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Spustit příkazy podle deskriptoru souboru namísto podle cesty: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorovat neznámé položky Defaults v sudoers namísto vypisování varování" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Čas v sekundách, po kterém bude příkaz ukončen: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Povolit uživateli zadat časový limit na příkazovém řádku" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Zapisovat log na disk ihned namísto po větších částech" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Při protokolování přes syslog zahrnout ID procesu" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Druh záznamu s časovým údajem autentizace: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Zpráva o selhání autentizace: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorovat velikost znaků při porovnávání jmen uživatelů" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorovat velikost znaků při porovnávání názvů skupin" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d neznámá položka defaults „%s“" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: neznámá položka defaults „%s“" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d u „%s“ nebyla zadána žádná hodnota" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: u „%s“ nebyla zadána žádná hodnota" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d hodnoty u „%s“ musí začínat na „/“" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: hodnoty u „%s“ musí začínat na „/“" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d volba „%s“ nebere hodnotu" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: volba „%s“ nebere hodnotu" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d neplatný typ Defaults 0x%x u volby „%s“" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: neplatný typ Defaults 0x%x u volby „%s“" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d hodnota „%s“ je pro volbu „%s“ neplatná" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: hodnota „%s“ je pro volbu „%s“ neplatná" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: poškozené pole envp, délka nesouhlasí" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "prostředí nelze znovu sestavit" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "je nám líto, ale nemáte dovoleno nastavovat následující proměnné prostředí: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "chyba rozboru v %s kolem řádku %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "chyba rozboru v %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nepodporovaný druh kontrolního součtu %d pro %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: chyba při čtení" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí být vlastněn UID %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s smí být zapisovatelný jen pro vlastníka" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "nelze zavést %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "v %s nelze nalézt symbol „group_plugin“" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekompatibilní hlavní verze modulu pro skupiny %d, očekávána %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nelze rozebrat IP adresu „%s“" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nelze rozebrat síťovou masku „%s“" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pár místní IP adresy a masky sítě:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existuje, ale nejedná se o adresář (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "nelze vytvořit adresář %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nelze změnit práva %s na 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "neznámá skupina: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "%s nelze číst" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "%s nelze vytvořit" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nelze zapsat do souboru s I/O protokolem: %s" + +#: plugins/sudoers/iolog.c:1071 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: vnitřní chyba, soubor s I/O protokolem pro událost %d není otevřen" + +#: plugins/sudoers/iolog.c:1230 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: vnitřní chyba, neplatný signál %d" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: neplatný soubor s protokolem" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: chybí položka s časovým údajem" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: čas %s: %s" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: chybí položka s uživatelem" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: chybí položka s runas uživatelem" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s chybí položka s runas skupinou" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "při použití ldaps není starttls podporováno" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nelze inicializovat certifikát SSL a databázi klíčů: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "pro SSL musíte v %s nastavit TLS_CERT" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP nelze inicializovat: %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls uvedeno, ale knihovna LDAP nepodporuje ldap_start_tls_s_np() ani ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "neplatný atribut sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port je příliš velký" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodporovaný typ ldapového URI: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nelze míchat URI ldap a ldaps" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nelze převést sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "nelze otevřít auditní systém" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nelze odeslat auditní zprávu" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (příkaz pokračuje) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "nelze otevřít soubor protokolu: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nelze zamknout soubor protokolu: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "nelze zapsat soubor protokolu: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "Žádný uživatel nebo stroj" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "selhání ověření" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "uživatel NENÍ v sudoers" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "uživatel NENÍ na stroji autorizován" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "příkaz nedovolen" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s není v souboru sudoers. Tento událost bude ohlášena.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nemá dovoleno spouštět sudo na %s. Tato událost bude ohlášena.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Je nám líto, uživatel %s nesmí spouštět sudo na %s.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Je nám líto, uživatel %s nemá dovoleno spouštět „%s%s%s“ jako %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: příkaz nenalezen" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignoruje se „%s“ nalezený v „.“\n" +"Použijte „sudo ./%s„, je-li toto „%s“', který chcete spustit." + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "selhání autentizace" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "je vyžadováno heslo" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u chybný pokus zadat heslo" +msgstr[1] "%u chybné pokusy zadat heslo" +msgstr[2] "%u chybných pokusů zadat heslo" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nelze zdvojit standardní vstup: %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nelze spustit %s: %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "nelze vytvořit proces: %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nelze otevřít rouru: %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "součet pro %s (%s) nemá tvar %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "nelze zjistit údaje o %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Role LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Položka v sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Volby: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " Příkazy:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Odpovídající položky Defaults pro %s na %s:\n" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Výchozí hodnoty Runas a Command pro %s:\n" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Uživatel %s smí spustit následující příkazy na %s:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uživatel %s nemá dovoleno spustit sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:147 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "neplatná hodnota hodnota atributu se ignoruje: %s" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "neúplná definice sudoRole se ignoruje: cn: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "neplatné %.*s nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "nelze rozebrat seznam síťových adres" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "uživatelské jméno nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "ID uživatele nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "ID skupiny nenastaveno vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "název počítače nenastaven vnějším rozhraním sudo" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "nelze vykonat %s" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Verze modulu s politikami sudoers je %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Verze gramatiky souboru sudoers je %d\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Cesta sudoers: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "cesta k nsswitch: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "cesta k ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "cesta k ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nelze zaregistrovat háček typu %d (verze %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "nelze zapamatovat si UID %u, nedostatek paměti" + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nelze zapamatovat si UID %u, již existuje" + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "nelze zapamatovat si uživatele %s, nedostatek paměti" + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nelze zapamatovat si uživatele %s, již existuje" + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "nelze zapamatovat si GID %u, nedostatek paměti" + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nelze zapamatovat si GID %u, již existuje" + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "nelze zapamatovat si skupinu %s, nedostatek paměti" + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nelze zapamatovat si skupinu %s, již existuje" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nelze zapamatovat si seznam skupin pro %s, již existuje" + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "nelze zapamatovat si seznam skupin pro %s, nedostatek paměti" + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nelze rozebrat skupiny pro %s" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nelze rozebrat čísla GID pro %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "přetečení zásobníku oprávnění" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "podtečení zásobníku oprávnění" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "nelze přepnout GID na root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "nelze přepnout na běhové GID" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "nelze nastavit vektor běhových skupin" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "nelze přepnout na běhové UID" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "nelze přepnout na GID sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "příliš mnoho procesů" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "současný pracovní adresář nelze zjistit" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "zkrácená auditní cesta user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "zkrácená auditní cesta argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "zpráva audit_failure je příliš dlouhá" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nelze inicializovat zdroj SSS. Je SSSD nainstalován na vašem stroji?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nelze nalézt symbol „%s“ v %s" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "problém s položkami defaults" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "nenalezeny žádné platné zdroje sudoers, končí se" + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers udává, že root nemá dovoleno použít sudo" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "nemáte dovoleno použít přepínač -C" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "vlastník časového údaje (%s): Takový uživatel neexistuje" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "žádné TTY" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "je nám líto, ale pro spuštění sudo musíte mít TTY" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "příkaz v aktuálním adresáři" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "je nám líto, ale nastavit časový limit nemáte dovoleno" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "je nám líto, ale zachovat prostředí nemáte dovoleno" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "příkaz je příliš dlouhý" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s není běžný soubor" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastněn UID %u, měl by být vlastněn %u" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s je zapisovatelný pro všechny" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s je vlastněn GID %u, mělo by být %u" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "pouze root může použít „-c %s“" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "neznáma přihlašovací třída: %s" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "nelze přeložit název stroje %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "neplatná volba filtru: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "neplatná maximální doba čekání: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "neplatný násobek rychlosti: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/časování: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/časování: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Přehrává se relace sudo: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "událost nelze přidat do fronty" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "TTY nelze nastavit do přímého režimu" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Pozor: váš terminál je příliš malý pro správné zobrazení záznamu.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Rozměry záznamu jsou %d × %d, váš terminál má rozměry %d × %d." + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Přehrávání skončilo, pro obnovení terminálu stiskněte libovolnou klávesu." + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "neplatný řádek s časovacím souborem: %s" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "nejednoznačný výraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "ve výrazu neodpovídá „)“" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "neznámý vyhledávací výraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s vyžaduje argument" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "neplatný regulární výraz: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "datum „%s“ se nepodařilo rozebrat" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "ve výrazu neodpovídá „(“" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "zakázané zakončení „or“" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "zakázané zakončení „!“" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "neznámý vyhledávácí typ %d" + +#: plugins/sudoers/sudoreplay.c:1607 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "použití: %s [-hnRS] [-d adresář] [-m číslo] [-s číslo] ID\n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "použití: %s [-h] [-d adresář] -l [vyhledávací_výraz]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s – přehraje záznam relace sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Přepínače:\n" +" -d, --directory=adresář\n" +" určuje adresář pro záznamy relace\n" +" -f, --filter=filtr určuje, které druhy I/O se mají zobrazit\n" +" -h, --help zobrazí nápovědu a skončí\n" +" -l, --list vypíše seznam ID dostupných relací, s volitelným\n" +" výrazem\n" +" -m, --max-wait=číslo čeká maximálně počet sekund mezi událostmi\n" +" -n, --non-interactive žádné výzvy, relace se pošle na standardní výstup\n" +" -R, --no-resize nepokouší ze změnit velikost terminálu\n" +" -S, --suspend-wait čeká pokud byl příkaz pozastaven\n" +" -s, --speed=číslo zrychlí nebo zpomalí výstup\n" +" -V, --version zobrazí údaje o verzi a skončí" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tstroj se neshoduje" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Příkaz povolen" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Příkaz odepřen" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Příkaz se neshoduje" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s je zapisovatelný pro skupinu" + +# TODO: pluralize +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nelze zkrátit soubor s časovými údaji na %lld bajtů" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "nelze přečíst hodiny" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "časový údaj z budoucnosti se ignoruje" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "časový údaj ukazuje příliš do budoucna: %20.20s" + +# TODO: pluralize +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "soubor s časovými údaji %s nelze zamknout" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "cesta ke stavům lekce je příliš dlouhý: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "přepínač -x bude v příštím vydání odstraněn" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "prosím, zvažte použití nástroje cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "pro úpravu %s stiskněte enter: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "zadaný editor (%s) neexistuje" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "žádný editor nenalezen (cesta k editoru = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "chyba zápisu" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nelze získat údaje o dočasném souboru (%s), %s nezměněno" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "dočasný soubor o nulové velikosti (%s), %s nezměněno" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) selhal, %s nezměněno" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s nezměněno" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nelze znovu otevřít dočasný soubor (%s), %s nezměněno." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "nebylo možné rozebrat dočasný soubor (%s), neznámá chyba" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "vnitřní chyba, v seznamu nelze nalézt %s!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nelze nastavit (UID, GID) %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s a %s se nenachází na jednom souborovém systému, pro přejmenování se použije mv" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "příkaz selhal: „'%s %s %s“, %s nezměněno" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "chyba při přejmenování %s, %s nezměněno" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Co teď? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Možnosti jsou:\n" +" (e) upravit soubor sudoers znovu\n" +" (x) skončit bez uložení změn do souboru sudoers\n" +" (Q) skončit a uložit změny do souboru sudoers (NEBEZPEČNÉ!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "nelze spustit %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: chybný vlastník (UID, GID), měl by být (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: chybná práva, měla by být 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: rozbor úspěšný\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s je zaneprázdněn, zkuste to později" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "%s nelze uzamknout" + +# The code indeed checks for non-localized "y" character. +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Přesto upravit? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Chyba: %s:%d: smyčka v %s „%s“" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Pozor: %s:%d: smyčka v %s „%s“" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Chyba: %s:%d: %s „%s“ použit, ale nedefinován" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Pozor: %s:%d: %s „%s“ použit, ale nedefinován" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Pozor> %s:%d nepoužitý %s „%s“" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s – bezpečně upraví soubor sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Přepínače:\n" +" -c, --check pouze kontroluje\n" +" -f, --file=sudoers\n" +" určuje umístění souboru sudoers\n" +" -h, --help zobrazí nápovědu a skončí\n" +" -q, --quiet méně upovídaná (stručnější) hlášení chyb syntaxe\n" +" -s, --strict přísná kontrola syntaxe\n" +" -V, --version zobrazí údaje o verzi a skončí\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "příliš mnoho úrovní zanoření" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Role LDAP: NEZNÁMÁ\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Pořadí: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Role SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Role SSSD: NEZNÁMÁ\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Pozor: smyčka v %s „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Pozor: %s „%s“ použit, ale nedefinován" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Pozor: nepožitý %s „%s“" + +#~ msgid "unable allocate memory" +#~ msgstr "nelze alokovat paměť" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "cesta k časovým údajům je příliš dlouhá: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "nelze zjisti údaje o editoru (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: nedostatek místa na rozšíření hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: nedostatek místo pro vytvoření hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "nesouhlasí alokace sudo_ldap_build_pass1" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "vnitřní chyba: nedostatek místa pro řádek protokolu" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: přetečení bufferu" diff --git a/utsudo-0.0.2/plugins/sudoers/po/da.mo b/utsudo-0.0.2/plugins/sudoers/po/da.mo new file mode 100644 index 0000000000000000000000000000000000000000..c1ccaef3caa188f04e70e4733f54b14b33f150a4 GIT binary patch literal 46504 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, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018. +# +# audit -> overvågning +# dummy -> attrap +# epoch -> epoke +# execute -> udføre (run -> kør) +# overflow -> overløb +# principal -> værtshovedstol +# runas -> runas ? (eller måske bedre med kør som. den er valgt indtil videre) +# stat -> stat +# timeout -> tidsudløb (eller ventetid, er dog lidt noget andet) +# +# der bliver brugt masser af forskellige citationstegn i den her ('' \" \" ``, +# nogle gange også tre styk). De er alle lavet med »« på dansk. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.24b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-07-31 07:13-0600\n" +"PO-Revision-Date: 2018-08-12 07:48+0200\n" +"Last-Translator: joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.11\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksfejl" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%ps adgangskode: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] adgangskode for %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Adgangskode: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIKKERHEDSINFORMATION for %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Beklager, prøv igen." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:122 +#: plugins/sudoers/alias.c:129 plugins/sudoers/alias.c:145 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:519 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/auth/sia.c:59 +#: plugins/sudoers/cvtsudoers.c:116 plugins/sudoers/cvtsudoers.c:157 +#: plugins/sudoers/cvtsudoers.c:174 plugins/sudoers/cvtsudoers.c:185 +#: plugins/sudoers/cvtsudoers.c:278 plugins/sudoers/cvtsudoers.c:405 +#: plugins/sudoers/cvtsudoers.c:538 plugins/sudoers/cvtsudoers.c:555 +#: plugins/sudoers/cvtsudoers.c:660 plugins/sudoers/cvtsudoers.c:773 +#: plugins/sudoers/cvtsudoers.c:781 plugins/sudoers/cvtsudoers.c:1186 +#: plugins/sudoers/cvtsudoers.c:1190 plugins/sudoers/cvtsudoers.c:1290 +#: plugins/sudoers/cvtsudoers_ldif.c:147 plugins/sudoers/cvtsudoers_ldif.c:189 +#: plugins/sudoers/cvtsudoers_ldif.c:236 plugins/sudoers/cvtsudoers_ldif.c:255 +#: plugins/sudoers/cvtsudoers_ldif.c:325 plugins/sudoers/cvtsudoers_ldif.c:380 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:405 +#: plugins/sudoers/cvtsudoers_ldif.c:414 plugins/sudoers/cvtsudoers_ldif.c:560 +#: plugins/sudoers/cvtsudoers_ldif.c:753 plugins/sudoers/cvtsudoers_ldif.c:780 +#: plugins/sudoers/cvtsudoers_ldif.c:848 plugins/sudoers/cvtsudoers_ldif.c:855 +#: plugins/sudoers/cvtsudoers_ldif.c:860 plugins/sudoers/cvtsudoers_ldif.c:936 +#: plugins/sudoers/cvtsudoers_ldif.c:947 plugins/sudoers/cvtsudoers_ldif.c:953 +#: plugins/sudoers/cvtsudoers_ldif.c:978 plugins/sudoers/cvtsudoers_ldif.c:990 +#: plugins/sudoers/cvtsudoers_ldif.c:994 +#: plugins/sudoers/cvtsudoers_ldif.c:1008 +#: plugins/sudoers/cvtsudoers_ldif.c:1176 +#: plugins/sudoers/cvtsudoers_ldif.c:1208 +#: plugins/sudoers/cvtsudoers_ldif.c:1233 +#: plugins/sudoers/cvtsudoers_ldif.c:1262 +#: plugins/sudoers/cvtsudoers_ldif.c:1312 +#: plugins/sudoers/cvtsudoers_ldif.c:1358 +#: plugins/sudoers/cvtsudoers_ldif.c:1368 plugins/sudoers/defaults.c:656 +#: plugins/sudoers/defaults.c:952 plugins/sudoers/defaults.c:1123 +#: plugins/sudoers/editor.c:65 plugins/sudoers/editor.c:83 +#: plugins/sudoers/editor.c:94 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:61 plugins/sudoers/filedigest.c:77 +#: plugins/sudoers/gc.c:52 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/interfaces.c:71 plugins/sudoers/iolog.c:938 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:177 +#: plugins/sudoers/ldap.c:408 plugins/sudoers/ldap.c:412 +#: plugins/sudoers/ldap.c:424 plugins/sudoers/ldap.c:715 +#: plugins/sudoers/ldap.c:879 plugins/sudoers/ldap.c:1228 +#: plugins/sudoers/ldap.c:1654 plugins/sudoers/ldap.c:1691 +#: plugins/sudoers/ldap.c:1771 plugins/sudoers/ldap.c:1906 +#: plugins/sudoers/ldap.c:2007 plugins/sudoers/ldap.c:2023 +#: plugins/sudoers/ldap_conf.c:214 plugins/sudoers/ldap_conf.c:245 +#: plugins/sudoers/ldap_conf.c:297 plugins/sudoers/ldap_conf.c:333 +#: plugins/sudoers/ldap_conf.c:422 plugins/sudoers/ldap_conf.c:437 +#: plugins/sudoers/ldap_conf.c:533 plugins/sudoers/ldap_conf.c:566 +#: plugins/sudoers/ldap_conf.c:647 plugins/sudoers/ldap_conf.c:729 +#: plugins/sudoers/ldap_util.c:519 plugins/sudoers/ldap_util.c:575 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:190 +#: plugins/sudoers/logging.c:506 plugins/sudoers/logging.c:527 +#: plugins/sudoers/logging.c:568 plugins/sudoers/logging.c:745 +#: plugins/sudoers/logging.c:1003 plugins/sudoers/match.c:693 +#: plugins/sudoers/match.c:740 plugins/sudoers/match.c:781 +#: plugins/sudoers/match.c:809 plugins/sudoers/match.c:897 +#: plugins/sudoers/match.c:977 plugins/sudoers/parse.c:192 +#: plugins/sudoers/parse.c:204 plugins/sudoers/parse.c:219 +#: plugins/sudoers/parse.c:231 plugins/sudoers/policy.c:497 +#: plugins/sudoers/policy.c:739 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:263 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:580 plugins/sudoers/pwutil.c:650 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/sssd.c:147 plugins/sudoers/sssd.c:387 +#: plugins/sudoers/sssd.c:450 plugins/sudoers/sssd.c:494 +#: plugins/sudoers/sssd.c:541 plugins/sudoers/sssd.c:732 +#: plugins/sudoers/stubs.c:96 plugins/sudoers/stubs.c:104 +#: plugins/sudoers/sudoers.c:265 plugins/sudoers/sudoers.c:275 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:325 +#: plugins/sudoers/sudoers.c:648 plugins/sudoers/sudoers.c:774 +#: plugins/sudoers/sudoers.c:818 plugins/sudoers/sudoers.c:1092 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1265 +#: plugins/sudoers/sudoreplay.c:1377 plugins/sudoers/sudoreplay.c:1417 +#: plugins/sudoers/sudoreplay.c:1426 plugins/sudoers/sudoreplay.c:1436 +#: plugins/sudoers/sudoreplay.c:1444 plugins/sudoers/sudoreplay.c:1448 +#: plugins/sudoers/sudoreplay.c:1604 plugins/sudoers/sudoreplay.c:1608 +#: plugins/sudoers/testsudoers.c:125 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:232 plugins/sudoers/testsudoers.c:554 +#: plugins/sudoers/timestamp.c:401 plugins/sudoers/timestamp.c:445 +#: plugins/sudoers/timestamp.c:923 plugins/sudoers/toke_util.c:55 +#: plugins/sudoers/toke_util.c:108 plugins/sudoers/toke_util.c:145 +#: plugins/sudoers/tsdump.c:125 plugins/sudoers/visudo.c:145 +#: plugins/sudoers/visudo.c:307 plugins/sudoers/visudo.c:313 +#: plugins/sudoers/visudo.c:423 plugins/sudoers/visudo.c:601 +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo.c:987 +#: plugins/sudoers/visudo.c:1076 toke.l:847 toke.l:948 toke.l:1105 +msgid "unable to allocate memory" +msgstr "kan ikke tildele hukommelse" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "et sammendrag kræver et stinavn" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "ugyldig notbefore-værdi" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "ugyldig notafter-værdi" + +#: gram.y:627 plugins/sudoers/policy.c:313 +msgid "timeout value too large" +msgstr "værdi for tidsudløb er for stor" + +#: gram.y:629 plugins/sudoers/policy.c:315 +msgid "invalid timeout value" +msgstr "ugyldig værdi for tidsudløb" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:349 plugins/sudoers/auth/pam.c:519 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/cvtsudoers.c:116 +#: plugins/sudoers/cvtsudoers.c:156 plugins/sudoers/cvtsudoers.c:173 +#: plugins/sudoers/cvtsudoers.c:184 plugins/sudoers/cvtsudoers.c:277 +#: plugins/sudoers/cvtsudoers.c:404 plugins/sudoers/cvtsudoers.c:537 +#: plugins/sudoers/cvtsudoers.c:554 plugins/sudoers/cvtsudoers.c:660 +#: plugins/sudoers/cvtsudoers.c:773 plugins/sudoers/cvtsudoers.c:780 +#: plugins/sudoers/cvtsudoers.c:1186 plugins/sudoers/cvtsudoers.c:1190 +#: plugins/sudoers/cvtsudoers.c:1290 plugins/sudoers/cvtsudoers_ldif.c:146 +#: plugins/sudoers/cvtsudoers_ldif.c:188 plugins/sudoers/cvtsudoers_ldif.c:235 +#: plugins/sudoers/cvtsudoers_ldif.c:254 plugins/sudoers/cvtsudoers_ldif.c:324 +#: plugins/sudoers/cvtsudoers_ldif.c:379 plugins/sudoers/cvtsudoers_ldif.c:387 +#: plugins/sudoers/cvtsudoers_ldif.c:404 plugins/sudoers/cvtsudoers_ldif.c:413 +#: plugins/sudoers/cvtsudoers_ldif.c:559 plugins/sudoers/cvtsudoers_ldif.c:752 +#: plugins/sudoers/cvtsudoers_ldif.c:779 plugins/sudoers/cvtsudoers_ldif.c:847 +#: plugins/sudoers/cvtsudoers_ldif.c:854 plugins/sudoers/cvtsudoers_ldif.c:859 +#: plugins/sudoers/cvtsudoers_ldif.c:935 plugins/sudoers/cvtsudoers_ldif.c:946 +#: plugins/sudoers/cvtsudoers_ldif.c:952 plugins/sudoers/cvtsudoers_ldif.c:977 +#: plugins/sudoers/cvtsudoers_ldif.c:989 plugins/sudoers/cvtsudoers_ldif.c:993 +#: plugins/sudoers/cvtsudoers_ldif.c:1007 +#: plugins/sudoers/cvtsudoers_ldif.c:1176 +#: plugins/sudoers/cvtsudoers_ldif.c:1207 +#: plugins/sudoers/cvtsudoers_ldif.c:1232 +#: plugins/sudoers/cvtsudoers_ldif.c:1261 +#: plugins/sudoers/cvtsudoers_ldif.c:1311 +#: plugins/sudoers/cvtsudoers_ldif.c:1357 +#: plugins/sudoers/cvtsudoers_ldif.c:1367 plugins/sudoers/defaults.c:656 +#: plugins/sudoers/defaults.c:952 plugins/sudoers/defaults.c:1123 +#: plugins/sudoers/editor.c:65 plugins/sudoers/editor.c:83 +#: plugins/sudoers/editor.c:94 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:61 plugins/sudoers/filedigest.c:77 +#: plugins/sudoers/gc.c:52 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/interfaces.c:71 plugins/sudoers/iolog.c:938 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:177 +#: plugins/sudoers/ldap.c:408 plugins/sudoers/ldap.c:412 +#: plugins/sudoers/ldap.c:424 plugins/sudoers/ldap.c:715 +#: plugins/sudoers/ldap.c:879 plugins/sudoers/ldap.c:1228 +#: plugins/sudoers/ldap.c:1654 plugins/sudoers/ldap.c:1691 +#: plugins/sudoers/ldap.c:1771 plugins/sudoers/ldap.c:1906 +#: plugins/sudoers/ldap.c:2007 plugins/sudoers/ldap.c:2023 +#: plugins/sudoers/ldap_conf.c:214 plugins/sudoers/ldap_conf.c:245 +#: plugins/sudoers/ldap_conf.c:297 plugins/sudoers/ldap_conf.c:333 +#: plugins/sudoers/ldap_conf.c:422 plugins/sudoers/ldap_conf.c:437 +#: plugins/sudoers/ldap_conf.c:533 plugins/sudoers/ldap_conf.c:566 +#: plugins/sudoers/ldap_conf.c:646 plugins/sudoers/ldap_conf.c:729 +#: plugins/sudoers/ldap_util.c:519 plugins/sudoers/ldap_util.c:575 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:190 +#: plugins/sudoers/logging.c:506 plugins/sudoers/logging.c:527 +#: plugins/sudoers/logging.c:567 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/match.c:692 plugins/sudoers/match.c:739 +#: plugins/sudoers/match.c:781 plugins/sudoers/match.c:809 +#: plugins/sudoers/match.c:897 plugins/sudoers/match.c:976 +#: plugins/sudoers/parse.c:191 plugins/sudoers/parse.c:203 +#: plugins/sudoers/parse.c:218 plugins/sudoers/parse.c:230 +#: plugins/sudoers/policy.c:127 plugins/sudoers/policy.c:136 +#: plugins/sudoers/policy.c:145 plugins/sudoers/policy.c:171 +#: plugins/sudoers/policy.c:298 plugins/sudoers/policy.c:313 +#: plugins/sudoers/policy.c:315 plugins/sudoers/policy.c:341 +#: plugins/sudoers/policy.c:351 plugins/sudoers/policy.c:395 +#: plugins/sudoers/policy.c:405 plugins/sudoers/policy.c:414 +#: plugins/sudoers/policy.c:423 plugins/sudoers/policy.c:497 +#: plugins/sudoers/policy.c:739 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:263 +#: plugins/sudoers/pwutil.c:340 plugins/sudoers/pwutil.c:514 +#: plugins/sudoers/pwutil.c:580 plugins/sudoers/pwutil.c:650 +#: plugins/sudoers/pwutil.c:808 plugins/sudoers/pwutil.c:865 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:968 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:146 +#: plugins/sudoers/sssd.c:387 plugins/sudoers/sssd.c:450 +#: plugins/sudoers/sssd.c:494 plugins/sudoers/sssd.c:541 +#: plugins/sudoers/sssd.c:732 plugins/sudoers/stubs.c:96 +#: plugins/sudoers/stubs.c:104 plugins/sudoers/sudoers.c:265 +#: plugins/sudoers/sudoers.c:275 plugins/sudoers/sudoers.c:283 +#: plugins/sudoers/sudoers.c:325 plugins/sudoers/sudoers.c:648 +#: plugins/sudoers/sudoers.c:774 plugins/sudoers/sudoers.c:818 +#: plugins/sudoers/sudoers.c:1092 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1377 +#: plugins/sudoers/sudoreplay.c:1417 plugins/sudoers/sudoreplay.c:1426 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/sudoreplay.c:1444 +#: plugins/sudoers/sudoreplay.c:1448 plugins/sudoers/sudoreplay.c:1604 +#: plugins/sudoers/sudoreplay.c:1608 plugins/sudoers/testsudoers.c:125 +#: plugins/sudoers/testsudoers.c:215 plugins/sudoers/testsudoers.c:232 +#: plugins/sudoers/testsudoers.c:554 plugins/sudoers/timestamp.c:401 +#: plugins/sudoers/timestamp.c:445 plugins/sudoers/timestamp.c:923 +#: plugins/sudoers/toke_util.c:55 plugins/sudoers/toke_util.c:108 +#: plugins/sudoers/toke_util.c:145 plugins/sudoers/tsdump.c:125 +#: plugins/sudoers/visudo.c:145 plugins/sudoers/visudo.c:307 +#: plugins/sudoers/visudo.c:313 plugins/sudoers/visudo.c:423 +#: plugins/sudoers/visudo.c:601 plugins/sudoers/visudo.c:920 +#: plugins/sudoers/visudo.c:987 plugins/sudoers/visudo.c:1076 toke.l:847 +#: toke.l:948 toke.l:1105 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:140 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias »%s« er allerede defineret" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kan ikke hente logindklasse for bruger %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "kan ikke starte bsd-godkendelse" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "ugyldig godkendelsestype" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "kan ikke initialisere BSD-godkendelse" + +#: plugins/sudoers/auth/bsdauth.c:178 +msgid "your account has expired" +msgstr "din konto er udløbet" + +#: plugins/sudoers/auth/bsdauth.c:180 +msgid "approval failed" +msgstr "godkendelse mislykkedes" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "kan ikke læse fwtk-konfiguration" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "kan ikke forbinde til godkendelsesserver" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:119 +msgid "lost connection to authentication server" +msgstr "mistede forbindelsen til godkendelseserveren" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"godkendelsesserverfejl:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: Kan ikke konvertere værtshovedstol til streng (»%s«): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: Kan ikke fortolke »%s«: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: Kan ikke slå akkreditivmellemlager op: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: Kan ikke allokere tilvalg: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: Kan ikke indhente akkreditiver: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: Kan ikke initialisere akkreditivmellemlager: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: Kan ikke gemme akkreditiver i mellemlager: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: Kan ikke indhente værtshovedstol: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan ikke verifiere TGT! Muligt angreb!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "kan ikke initialisere PAM" + +#: plugins/sudoers/auth/pam.c:199 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-godkendelsesserverfejl: %s" + +#: plugins/sudoers/auth/pam.c:216 +msgid "account validation failure, is your account locked?" +msgstr "valideringsfejl for konto, er din konto låst?" + +#: plugins/sudoers/auth/pam.c:224 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto eller adgangskoder er udløbet, nulstil din adgangskode og forsøg igen" + +#: plugins/sudoers/auth/pam.c:233 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kan ikke ændre udløbet adgangskode: %s" + +#: plugins/sudoers/auth/pam.c:241 +msgid "Password expired, contact your system administrator" +msgstr "Adgangskode udløbet, kontakt din systemadministrator" + +#: plugins/sudoers/auth/pam.c:245 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto udløbet eller PAM-konfiguration mangler et »kontoafsnit« for sudo. Kontakt din systemadministrator" + +#: plugins/sudoers/auth/pam.c:252 plugins/sudoers/auth/pam.c:257 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM-kontohåndteringsfejl: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du findes ikke i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "kunne ikke initialisere ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "kan ikke kontakte SecurID-serveren" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "Bruger-ID låst for SecurID-godkendelse" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "ugyldigt brugernavnslængde for SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "ugyldigt godkendelseshåndtag for SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "SecurID-kommunikation fejlede" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "ukendt SecurID-fejl" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "ugyldig adgangskodelængde for SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:124 +msgid "unable to initialize SIA session" +msgstr "kan ikke initialisere SIA-session" + +#: plugins/sudoers/auth/sudo_auth.c:131 +msgid "invalid authentication methods" +msgstr "ugyldige godkendelsesmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:133 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ugyldige godkendelsesmetoder kompileret ind i sudo! Du kan ikke blande uafhængig og ikkeuafhængig godkendelse." + +#: plugins/sudoers/auth/sudo_auth.c:254 plugins/sudoers/auth/sudo_auth.c:304 +msgid "no authentication methods" +msgstr "ingen godkendelsesmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:256 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Der er ingen godkendelsesmetoder kompileret ind i sudo! Hvis du ønsker at fravælge godkendelse så brug konfigurationstilvalget --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:306 +msgid "Unable to initialize authentication methods." +msgstr "Kan ikke initialisere godkendelsesmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:472 +msgid "Authentication methods:" +msgstr "Godkendelsesmetoder:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Kunne ikke bestemme overvågningsbetingelse" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "kan ikke indsende overvågningspost" + +#: plugins/sudoers/check.c:262 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi stoler på, at du har modtaget den gængse advarsel fra den lokale\n" +"systemadministrator. Det drejer sig normalt om følgende tre ting:\n" +"\n" +" #1) Respekter andres privatliv.\n" +" #2) Tænk før du taster.\n" +" #3) Med stor magt følger stort ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:305 plugins/sudoers/check.c:315 +#: plugins/sudoers/sudoers.c:691 plugins/sudoers/sudoers.c:736 +#: plugins/sudoers/tsdump.c:121 +#, c-format +msgid "unknown uid: %u" +msgstr "ukendt uid: %u" + +#: plugins/sudoers/check.c:310 plugins/sudoers/iolog.c:257 +#: plugins/sudoers/policy.c:912 plugins/sudoers/sudoers.c:1131 +#: plugins/sudoers/testsudoers.c:206 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "ukendt bruger: %s" + +#: plugins/sudoers/cvtsudoers.c:191 +#, c-format +msgid "order increment: %s: %s" +msgstr "rækkefølgeforøgelse: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:207 +#, c-format +msgid "starting order: %s: %s" +msgstr "startrækkefølge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:218 plugins/sudoers/sudoreplay.c:310 +#: plugins/sudoers/visudo.c:177 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: plugins/sudoers/cvtsudoers.c:220 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammatikversion %d\n" + +#: plugins/sudoers/cvtsudoers.c:237 +#, c-format +msgid "unsupported input format %s" +msgstr "ej understøttet inddataformat %s" + +#: plugins/sudoers/cvtsudoers.c:252 +#, c-format +msgid "unsupported output format %s" +msgstr "ej understøttet uddataformat %s" + +#: plugins/sudoers/cvtsudoers.c:292 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: inddata- og uddatafiler skal være forskellige" + +#: plugins/sudoers/cvtsudoers.c:308 plugins/sudoers/sudoers.c:168 +#: plugins/sudoers/testsudoers.c:245 plugins/sudoers/visudo.c:233 +#: plugins/sudoers/visudo.c:589 plugins/sudoers/visudo.c:911 +msgid "unable to initialize sudoers default values" +msgstr "kan ikke initialisere sudoers' standardværdier" + +#: plugins/sudoers/cvtsudoers.c:393 plugins/sudoers/ldap_conf.c:412 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:452 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: ukendt nøgleord: %s" + +#: plugins/sudoers/cvtsudoers.c:498 +#, c-format +msgid "invalid defaults type: %s" +msgstr "ugyldig type for standarder: %s" + +#: plugins/sudoers/cvtsudoers.c:521 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ugyldig undertrykkelsestype: %s" + +#: plugins/sudoers/cvtsudoers.c:561 plugins/sudoers/cvtsudoers.c:575 +#, c-format +msgid "invalid filter: %s" +msgstr "ugyldigt filter: %s" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/cvtsudoers.c:1250 +#: plugins/sudoers/cvtsudoers_json.c:1113 +#: plugins/sudoers/cvtsudoers_ldif.c:627 +#: plugins/sudoers/cvtsudoers_ldif.c:1163 plugins/sudoers/iolog.c:415 +#: plugins/sudoers/sudoers.c:898 plugins/sudoers/sudoreplay.c:356 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1570 +#: plugins/sudoers/timestamp.c:410 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:907 +#, c-format +msgid "unable to open %s" +msgstr "kan ikke åbne %s" + +#: plugins/sudoers/cvtsudoers.c:656 plugins/sudoers/visudo.c:916 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "kunne ikke fortolke %s-fil, ukendt fejl" + +#: plugins/sudoers/cvtsudoers.c:664 plugins/sudoers/visudo.c:933 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fortolkningsfejl i %s nær linje %d\n" + +#: plugins/sudoers/cvtsudoers.c:667 plugins/sudoers/visudo.c:936 +#, c-format +msgid "parse error in %s\n" +msgstr "fortolkningsfejl i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1297 plugins/sudoers/iolog.c:502 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:294 +#: plugins/sudoers/timestamp.c:297 +#, c-format +msgid "unable to write to %s" +msgstr "kan ikke skrive til %s" + +#: plugins/sudoers/cvtsudoers.c:1320 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverter mellem sudoers-filformater\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1322 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tilvalg:\n" +" -b, --base=dn base-DN'en for sudo LDAP-forespørgsler\n" +" -d, --defaults=deftyper konverter kun Standarder for angivne typer\n" +" -e, --expand-aliases udvid aliasser under konvertering\n" +" -f, --output-format=format angiv uddataformat: JSON, LDIF eller sudoers\n" +" -i, --input-format=format angiv inddataformat: LDIF eller sudoers\n" +" -I, --increment=num mængde at øge hver sudoOrder med\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -m, --match=filter konverter kun poster som matcher filteret\n" +" -M, --match-local matchfilter bruger passwd og gruppedatabaser\n" +" -o, --output=uddatafil skriv konverteret sudoers til uddatafil\n" +" -O, --order-start=num startpunkt for første sudoOrder\n" +" -p, --prune-matches trim ikkematchende brugere, grupper og værter\n" +" -s, --suppress=sektioner undertryk uddata for bestemte sektioner\n" +" -V, --version vis information om version og afslut" + +#: plugins/sudoers/cvtsudoers_json.c:673 plugins/sudoers/cvtsudoers_json.c:708 +#: plugins/sudoers/cvtsudoers_json.c:924 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "ukendt indgang »%s« for standarder" + +#: plugins/sudoers/cvtsudoers_json.c:844 plugins/sudoers/cvtsudoers_json.c:859 +#: plugins/sudoers/cvtsudoers_ldif.c:299 plugins/sudoers/cvtsudoers_ldif.c:310 +#: plugins/sudoers/ldap.c:474 +msgid "unable to get GMT time" +msgstr "kan ikke indhente GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:847 plugins/sudoers/cvtsudoers_json.c:862 +#: plugins/sudoers/cvtsudoers_ldif.c:302 plugins/sudoers/cvtsudoers_ldif.c:313 +#: plugins/sudoers/ldap.c:480 +msgid "unable to format timestamp" +msgstr "kan ikke formatere tidsstempel" + +#: plugins/sudoers/cvtsudoers_ldif.c:517 plugins/sudoers/env.c:295 +#: plugins/sudoers/env.c:302 plugins/sudoers/env.c:407 +#: plugins/sudoers/ldap.c:488 plugins/sudoers/ldap.c:719 +#: plugins/sudoers/ldap.c:1046 plugins/sudoers/ldap_conf.c:218 +#: plugins/sudoers/ldap_conf.c:308 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:1008 plugins/sudoers/policy.c:618 +#: plugins/sudoers/policy.c:628 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:840 plugins/sudoers/testsudoers.c:236 +#: plugins/sudoers/toke_util.c:157 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern fejl, %s-overløb" + +#: plugins/sudoers/cvtsudoers_ldif.c:622 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljøvariablen SUDOERS_BASE er ikke angivet og tilvalget -b var ikke angivet." + +#: plugins/sudoers/cvtsudoers_ldif.c:757 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "ignorerer ugyldig attributværdi: %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:1197 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorerer ufuldstændig sudoRole: cn: %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:1349 plugins/sudoers/ldap.c:1778 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ugyldig sudoOrder-attribut: %s" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-facilitet hvis syslog bruges til logning: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet at bruge når brugergodkendelser går igennem: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet at bruge når brugergodkendelser ikke går igennem: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Placer OTP-prompter på deres egen linje" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorer ».« i $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Send altid post når sudo køres" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Send post hvis brugergodkendelse fejler" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Send post hvis brugeren ikke er i suoders" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Send post hvis brugeren ikke er i sudoers for denne vært" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Send post hvis brugeren ikke har tilladelse til at køre en kommando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Send post hvis brugeren forsøger at køre en kommando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Brug et separat tidsstempel for hver bruger/tty-kombination" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Undervis brugere den første gang de kører sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil indeholdende sudo-undervisningen: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Kræv som standard at brugere skal godkendes" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root kan køre sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Log værtsnavnet i logfilen (non-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Log året i logfilen (non-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Hvis sudo er startet op uden argumenter så start en skal" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Angiv $HOME for målbrugeren når der startes en skal med -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Angiv altid $HOME for målbrugerens hjemmemappe" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillad lidt informationsindsamling for at lave brugbare fejlbeskeder" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Kræv fuldkvalificerede værtsnavne i sudoersfilen" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Fornærm brugeren når de indtaster en forkert adgangskode" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Tillad kun brugeren at køre sudo hvis de har en tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo vil overholde EDITOR-miljøvariablen" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Spørg om adgangskoden for root, ikke brugerens" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Spørg om brugerens kør som_standard adgangskode, ikke brugernes" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Spørg om målbrugerens adgangskode, ikke brugernes" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Brug standarder i målbrugerens logindklasse hvis der er en" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Angiv LOGNAME- og USER-miljøvariablerne" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Angiv kun den effektive uid til målbrugeren, ikke den reelle uid" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Initialiser ikke gruppevektoren til målbrugerens" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Længde hvor logfillinjer skal ombrydes (0 for ingen ombrydning): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsudløb for godkendelsestidsstempel: %.1f minutter" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsudløb for adgangskodeprompt: %.1f minutter" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antal forsøg for indtastning af adgangskode: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask at bruge eller 0777 for at bruge brugers: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Sti til logfil: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Stil til postprogram: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flag for postprogram: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresse at sende post til: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresse at sende post fra: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Emnelinje for postbeskeder: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Ugyldig adgangskodebesked: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sti til undervisningsstatusmappen: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sti til mappe for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Ejer af mappen for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Brugere i denne gruppe er undtaget fra adgangskode og STI-krav: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard for adgangskodeprompt: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Hvis angivet vil adgangsprompt overskrive systemprompt i alle tilfælde." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbruger at køre kommandoer som: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Værdi at overskrive brugers $PATH med: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Sti til redigeringsprogrammet for brug af visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Hvornår der skal kræves en adgangskode for »list« pseudokommando: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Hvornår der skal kræves en adgangskode for »verify« pseudokommando: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Præindlæs attrap-udførelsesfunktioner indeholdt i biblioteket sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Hvis LDAP-mappe er sat op, ignorer vi så lokal sudoersfil" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Filbeskrivelser >= %d vil blive lukket før udførelse af en kommando" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Hvis angivet kan brugere overskrive værdien af »closeform« med tilvalget -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Tillad at brugere kan angive arbitrære miljøvariabler" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Nulstil miljøet til et standardsæt af variabler" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Miljøvariabler at indstillingskontrollere:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Miljøvariabler at fjerne:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Miljøvariabler at bevare:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolle at bruge i den nye sikkerhedskontekst: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-type at bruge i den nye sikkerhedskontekst: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sti til den sudo-specifikke miljøfil: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sti til det begrænsede sudo-specifikke miljøfil: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Sprog at bruge under fortolkning af sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillad at sudo spørger om en adgangskode selv om den vil være synlig" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Tilbyd visuel tilbagemeldning ved adgangskodeprompten når der er brugerinddata" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Brug hurtigere globbing som er mindre præcis, men som ikke tilgår filsystemet" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umask'en angivet i sudoers vil overskrive brugerens, også selv om den er mere tilladende" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Log brugers inddata for kommandoen der bliver kørt" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Log uddata for kommandoen der bliver kørt" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimer I/O-log med brug af zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Kør altid kommandoer i en pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Udvidelsesmodul for ikke-Unix-gruppeunderstøttelse: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mappe at gemme inddata-/uddatalogge i: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil at gemme inddata-/uddatalog i: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Tilføjer et punkt til utmp/utmpx-filen når der allokeres en pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Angiv brugeren i utmp til brugeren kør som, ikke den opstartende bruger" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Sæt af tilladte privilegier: %s" + +# Det skal forstås som et sæt af grænseprivilegier +# https://www.sudo.ws/man/1.8.21/sudoers.man.html (se limitprivs) +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Sæt af grænseprivilegier: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Kør kommandoer på en pty i baggrunden" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjenestenavn der skal bruges: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjenestenavn der skal bruges for logindskaller: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Forsøg på at etablere PAM-akkreditiver for målbrugeren" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Opret en ny PAM-session som kommandoen kan køre i" + +#: plugins/sudoers/def_data.c:402 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maksimalt I/O-logsekvenstal: %u" + +#: plugins/sudoers/def_data.c:406 +msgid "Enable sudoers netgroup support" +msgstr "Aktiver sudoers netgroup-understøttelse" + +#: plugins/sudoers/def_data.c:410 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroller overmappers skriverettigheder ved redigering af filer med sudoedit" + +#: plugins/sudoers/def_data.c:414 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Følg symbolske henvisninger når filer redigeres med sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Query the group plugin for unknown system groups" +msgstr "Forespørg gruppe-udvidelsesmodulet for ukendte systemgrupper" + +#: plugins/sudoers/def_data.c:422 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Sammenlign netgrupper baseret på hele tuplen: bruger, vært og domæne" + +#: plugins/sudoers/def_data.c:426 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til revisionsloggen" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til I/O-loggen" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillader at kommandoer køres, selv om sudo ikke kan skrive til logfilen" + +#: plugins/sudoers/def_data.c:438 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Slå grupper op i sudoers og match efter gruppe-id, ikke navnet" + +#: plugins/sudoers/def_data.c:442 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Logposter større end denne værdi vil blive opdelt i flere syslogbeskeder: %u" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Bruger som vil eje I/O-logfilerne: %s" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe som vil eje I/O-logfilerne: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filtilstand der skal bruges for I/O-logfilerne: 0%o" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Kør kommandoer efter fildeskriptor i stedet for efter sti: %s" + +# Defaults-punkter/indgange", vil jeg tro +# Vil mene at det er en overskrift i konfigurationsfilen eller lignende +#: plugins/sudoers/def_data.c:462 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer ukendte Defaults-punkter i sudoere i stedet for at give en advarsel" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tid i sekunder hvorefter kommandoen vil blive afsluttet: %u" + +#: plugins/sudoers/def_data.c:470 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Tillad at brugeren angiver et tidsudløb på kommandolinjen" + +#: plugins/sudoers/def_data.c:474 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tøm I/O-logdata til disken med det samme i stedet for at mellemlagre den" + +#: plugins/sudoers/def_data.c:478 +msgid "Include the process ID when logging via syslog" +msgstr "Inkluder proces-id'et når der logges via syslog" + +#: plugins/sudoers/def_data.c:482 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Elementtype for godkendelsestidsstempel: %s" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Authentication failure message: %s" +msgstr "godkendelsesfejlbesked: %s" + +#: plugins/sudoers/def_data.c:490 +msgid "Ignore case when matching user names" +msgstr "Ignorer store/små bogstaver når brugernavne matches" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching group names" +msgstr "Ignorer store/små bogstaver når gruppenavne matches" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d ukendt indgang »%s« for standarder" + +#: plugins/sudoers/defaults.c:227 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: ukendt indgang »%s« for standarder" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d ingen værdi angivet for »%s«" + +#: plugins/sudoers/defaults.c:273 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: ingen værdi angivet for »%s«" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d værdier for »%s« skal begynde med en »/«" + +#: plugins/sudoers/defaults.c:296 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: værdier for »%s« skal begynde med en »/«" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d indstillingen »%s« kan ikke modtage en værdi" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: indstillingen »%s« kan ikke modtage en værdi" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d ugyldig standardtype 0x%x for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:349 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: ugyldig standardtype 0x%x for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d værdien »%s« er ugyldig for tilvalget »%s«" + +#: plugins/sudoers/defaults.c:362 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: værdien »%s« er ugyldig for tilvalget »%s«" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: ødelagt envp, forskellig længde" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "kan ikke genopbygge miljøet" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "beklager, du har ikke tilladelse til at angive de følgende miljøvariabler: %s" + +#: plugins/sudoers/file.c:111 +#, c-format +msgid "parse error in %s near line %d" +msgstr "fortolkningsfejl i %s nær linje %d" + +#: plugins/sudoers/file.c:114 +#, c-format +msgid "parse error in %s" +msgstr "fortolkningsfejl i %s" + +#: plugins/sudoers/filedigest.c:56 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "ej understøttet sammendragstype %d for %s" + +#: plugins/sudoers/filedigest.c:85 +#, c-format +msgid "%s: read error" +msgstr "%s: læsefejl" + +#: plugins/sudoers/group_plugin.c:83 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s skal være ejet af uid %d" + +#: plugins/sudoers/group_plugin.c:87 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s skal være skrivbar af ejer" + +#: plugins/sudoers/group_plugin.c:95 plugins/sudoers/sssd.c:550 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan ikke indlæse %s: %s" + +#: plugins/sudoers/group_plugin.c:101 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kan ikke finde symbol »group_plugin« i %s" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: inkompatibel gruppeudvidelsesmodul for hovedversion %d, forventede %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan ikke fortolke IP-adressen »%s«" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan ikke fortolke netmasken »%s«" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokal IP-adresse og netmaskepar:\n" + +#: plugins/sudoers/iolog.c:119 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s findes men er ikke en mappe (0%o)" + +#: plugins/sudoers/iolog.c:144 plugins/sudoers/iolog.c:184 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:174 +#, c-format +msgid "unable to mkdir %s" +msgstr "kan ikke mkdir %s" + +#: plugins/sudoers/iolog.c:188 plugins/sudoers/visudo.c:718 +#: plugins/sudoers/visudo.c:728 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan ikke ændre tilstand på %s til 0%o" + +#: plugins/sudoers/iolog.c:296 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "ukendt gruppe: %s" + +#: plugins/sudoers/iolog.c:466 plugins/sudoers/sudoers.c:902 +#: plugins/sudoers/sudoreplay.c:868 plugins/sudoers/sudoreplay.c:1681 +#: plugins/sudoers/tsdump.c:140 +#, c-format +msgid "unable to read %s" +msgstr "kan ikke læse %s" + +#: plugins/sudoers/iolog.c:581 plugins/sudoers/iolog.c:800 +#, c-format +msgid "unable to create %s" +msgstr "kan ikke oprette %s" + +#: plugins/sudoers/iolog.c:1032 plugins/sudoers/iolog.c:1107 +#: plugins/sudoers/iolog.c:1188 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kan ikke skrive til I/O-logfilen: %s" + +#: plugins/sudoers/iolog.c:1066 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "%s: intern fejl, filindekset %d er ikke åbent" + +#: plugins/sudoers/ldap.c:170 plugins/sudoers/ldap_conf.c:287 +msgid "starttls not supported when using ldaps" +msgstr "starttls er ikke understøttet, når der bruges ldaps" + +#: plugins/sudoers/ldap.c:241 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan ikke initialisere SSL-cert og key db: %s" + +#: plugins/sudoers/ldap.c:244 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du skal angive at TLS_CERT i %s skal bruge SSL" + +#: plugins/sudoers/ldap.c:1606 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kan ikke initialisere LDAP: %s" + +#: plugins/sudoers/ldap.c:1642 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls angivet men LDAP libs understøtter ikke ldap_start_tls_s() eller ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap_conf.c:196 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port for stor" + +#: plugins/sudoers/ldap_conf.c:256 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "ikkeunderstøttet LDAP uri-type: %s" + +#: plugins/sudoers/ldap_conf.c:283 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan ikke blande ldap og ldaps URI'er" + +#: plugins/sudoers/ldap_util.c:470 plugins/sudoers/ldap_util.c:472 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "kan ikke konvertere sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "kan ikke åbne overvågningssystem" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "kan ikke sende overvågningsbesked" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s: (kommando fortsat) %s" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "kan ikke åbne logfilen: %s" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "kan ikke låse logfilen: %s" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "kan ikke skrive til logfilen: %s" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Ingen bruger eller vært" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "valideringsfejl" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "bruger IKKE i sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "bruger IKKE autoriseret på vært" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "kommando ikke tilladt" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s er ikke sudoersfilen. Denne handling vil blive rapporteret.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s har ikke tilladelse til at køre sudo på %s. Denne handling vil blive rapporteret.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Beklager. Bruger %s må ikke køre sudo på %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Beklager. Bruger %s har ikke tilladelse til at køre »%s%s%s« som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:433 +#: plugins/sudoers/sudoers.c:435 plugins/sudoers/sudoers.c:437 +#: plugins/sudoers/sudoers.c:439 plugins/sudoers/sudoers.c:594 +#: plugins/sudoers/sudoers.c:596 +#, c-format +msgid "%s: command not found" +msgstr "%s: Kommando ikke fundet" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:429 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerer »%s« fundet i ».«\n" +"Brug »sudo ./%s«, hvis dette er den »%s«, du ønsker at køre." + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "godkendelsesfejl" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "der kræves en adgangskode" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u ukorrekt adgangskodeforsøg" +msgstr[1] "%u ukorrekte adgangskodeforsøg" + +#: plugins/sudoers/logging.c:659 +msgid "unable to fork" +msgstr "kan ikke forgrene" + +#: plugins/sudoers/logging.c:667 plugins/sudoers/logging.c:719 +#, c-format +msgid "unable to fork: %m" +msgstr "kan ikke forgrene: %m" + +#: plugins/sudoers/logging.c:709 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kan ikke åbne datakanal: %m" + +#: plugins/sudoers/logging.c:734 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan ikke dup stdin: %m" + +#: plugins/sudoers/logging.c:772 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kan ikke køre %s: %m" + +#: plugins/sudoers/match.c:842 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "sammendrag for %s (%s) er ikke i %s-form" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/visudo.c:416 plugins/sudoers/visudo.c:712 +#, c-format +msgid "unable to stat %s" +msgstr "kan ikke stat %s" + +#: plugins/sudoers/parse.c:434 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolle: %s\n" + +#: plugins/sudoers/parse.c:437 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-punkt:\n" + +#: plugins/sudoers/parse.c:439 +#, c-format +msgid " RunAsUsers: " +msgstr " KørSomBrugere: " + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsGroups: " +msgstr " KørSomGrupper: " + +#: plugins/sudoers/parse.c:464 +#, c-format +msgid " Options: " +msgstr " Tilvalg: " + +#: plugins/sudoers/parse.c:518 +#, c-format +msgid " Commands:\n" +msgstr " Kommandoer:\n" + +#: plugins/sudoers/parse.c:709 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Matchende standardpunkter for %s på %s:\n" + +#: plugins/sudoers/parse.c:727 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Kør som og kommandospecifikke standarder for %s:\n" + +#: plugins/sudoers/parse.c:745 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Bruger %s må køre de følgende kommandoer på %s:\n" + +#: plugins/sudoers/parse.c:760 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Bruger %s har ikke tilladelse til at køre sudo på %s.\n" + +#: plugins/sudoers/policy.c:83 plugins/sudoers/policy.c:109 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ugyldig %.*s angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:288 plugins/sudoers/testsudoers.c:259 +msgid "unable to parse network address list" +msgstr "kan ikke fortolke netværksadresseliste" + +#: plugins/sudoers/policy.c:432 +msgid "user name not set by sudo front-end" +msgstr "brugernavn er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:436 +msgid "user ID not set by sudo front-end" +msgstr "bruger-id er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:440 +msgid "group ID not set by sudo front-end" +msgstr "gruppe-id er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:444 +msgid "host name not set by sudo front-end" +msgstr "værtsnavn er ikke angivet af sudo-brugerfladen" + +#: plugins/sudoers/policy.c:797 plugins/sudoers/visudo.c:215 +#: plugins/sudoers/visudo.c:845 +#, c-format +msgid "unable to execute %s" +msgstr "kan ikke udføre %s" + +#: plugins/sudoers/policy.c:930 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Udvidelsesmodulversion %s for sudoerspolitik\n" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Grammatikversion %d for sudoersfil\n" + +#: plugins/sudoers/policy.c:936 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-sti: %s\n" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-sti: %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-sti: %s\n" + +#: plugins/sudoers/policy.c:942 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-sti: %s\n" + +# lidt i tvivl om hvad hook er her, så har beholdt den uoversat +# Er OK. Er enig med hensyn til hook, skal nok forstås som +# fastgøringspunkt, men lyder for bøvlet +#: plugins/sudoers/policy.c:975 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kan ikke registrere »hook« af typen %d (version %d.%d)" + +#: plugins/sudoers/pwutil.c:214 plugins/sudoers/pwutil.c:233 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "kan ikke cache uid %u, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:227 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan ikke cache uid %u, findes allerede" + +#: plugins/sudoers/pwutil.c:287 plugins/sudoers/pwutil.c:305 +#: plugins/sudoers/pwutil.c:367 plugins/sudoers/pwutil.c:412 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "kan ikke cache bruger %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:300 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan ikke cache bruger %s, findes allerede" + +#: plugins/sudoers/pwutil.c:531 plugins/sudoers/pwutil.c:550 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "kan ikke cache gid %u, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:544 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan ikke cache gid %u, findes allerede" + +#: plugins/sudoers/pwutil.c:598 plugins/sudoers/pwutil.c:616 +#: plugins/sudoers/pwutil.c:663 plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "kan ikke cache gruppe %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:611 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan ikke cache gruppe %s, findes allerede" + +#: plugins/sudoers/pwutil.c:831 plugins/sudoers/pwutil.c:883 +#: plugins/sudoers/pwutil.c:934 plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan ikke cache gruppeliste for %s, findes allerede" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:888 +#: plugins/sudoers/pwutil.c:940 plugins/sudoers/pwutil.c:992 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "kan ikke cache gruppeliste for %s, ikke nok hukommelse" + +#: plugins/sudoers/pwutil.c:877 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan ikke fortolke grupper for %s" + +#: plugins/sudoers/pwutil.c:981 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan ikke fortolke gid'er for %s" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "permanent stakoverløb" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "permanent stakunderløb" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "kan ikke ændre til root gid" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "kan ikke ændre til kør som gid" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "kan ikke angive kør som gruppevektor" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "kan ikke ændre til kør som uid" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "kan ikke ændre til sudoers gid" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "for mange processer" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "kan ikke hente nuværende arbejdsmappe" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "afkortet revisionssti user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "afkortet revisionssti argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "audit_failure-besked er for lang" + +#: plugins/sudoers/sssd.c:552 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "kan ikke initialisere SSS-kilde. Er SSSD installeret på din maskine?" + +#: plugins/sudoers/sssd.c:560 plugins/sudoers/sssd.c:569 +#: plugins/sudoers/sssd.c:578 plugins/sudoers/sssd.c:587 +#: plugins/sudoers/sssd.c:596 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan ikke finde symbol »%s« i %s" + +#: plugins/sudoers/sudoers.c:204 plugins/sudoers/sudoers.c:859 +msgid "problem with defaults entries" +msgstr "problem med standardpunkter" + +#: plugins/sudoers/sudoers.c:208 +msgid "no valid sudoers sources found, quitting" +msgstr "ingen gyldige sudoerskilder fundet, afslutter" + +#: plugins/sudoers/sudoers.c:246 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers angiver at administrator (root) ikke har tilladelse til sudo" + +#: plugins/sudoers/sudoers.c:303 +msgid "you are not permitted to use the -C option" +msgstr "du har ikke tilladelse til at bruge tilvalget -C" + +#: plugins/sudoers/sudoers.c:350 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tidsstempelejer (%s): Ingen sådan bruger" + +#: plugins/sudoers/sudoers.c:365 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:366 +msgid "sorry, you must have a tty to run sudo" +msgstr "beklager, du skal bruge en tty for at køre sudo" + +#: plugins/sudoers/sudoers.c:428 +msgid "command in current directory" +msgstr "kommando i aktuel mappe" + +#: plugins/sudoers/sudoers.c:447 +msgid "sorry, you are not allowed set a command timeout" +msgstr "beklager, men du har ikke tilladelse til at angive tidsudløb for kommando" + +#: plugins/sudoers/sudoers.c:455 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "beklager, men du har ikke tilladelse til at bevare miljøet" + +#: plugins/sudoers/sudoers.c:803 +msgid "command too long" +msgstr "kommando er for lang" + +#: plugins/sudoers/sudoers.c:917 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikke en regulær fil" + +#: plugins/sudoers/sudoers.c:921 plugins/sudoers/timestamp.c:221 toke.l:968 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s er ejet af uid %u, bør være %u" + +#: plugins/sudoers/sudoers.c:925 toke.l:973 +#, c-format +msgid "%s is world writable" +msgstr "%s er skrivbar for alle" + +#: plugins/sudoers/sudoers.c:929 toke.l:976 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s er eget af gid %u, bør være %u" + +#: plugins/sudoers/sudoers.c:962 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "kun administrator (root) kan bruge »-c %s«" + +#: plugins/sudoers/sudoers.c:981 +#, c-format +msgid "unknown login class: %s" +msgstr "ukendt logindklasse: %s" + +#: plugins/sudoers/sudoers.c:1064 plugins/sudoers/sudoers.c:1078 +#, c-format +msgid "unable to resolve host %s" +msgstr "kan ikke slå vært %s op" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid filter option: %s" +msgstr "ugyldigt filtertilvalg: %s" + +#: plugins/sudoers/sudoreplay.c:287 +#, c-format +msgid "invalid max wait: %s" +msgstr "ugyldig maks ventetid: %s" + +#: plugins/sudoers/sudoreplay.c:307 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ugyldig hastighedsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:342 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:348 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:364 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Genafspiller sudosession: %s" + +#: plugins/sudoers/sudoreplay.c:562 plugins/sudoers/sudoreplay.c:609 +#: plugins/sudoers/sudoreplay.c:816 plugins/sudoers/sudoreplay.c:906 +#: plugins/sudoers/sudoreplay.c:985 plugins/sudoers/sudoreplay.c:1000 +#: plugins/sudoers/sudoreplay.c:1007 plugins/sudoers/sudoreplay.c:1014 +#: plugins/sudoers/sudoreplay.c:1021 plugins/sudoers/sudoreplay.c:1028 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "kan ikke tilføje hændelse til køen" + +#: plugins/sudoers/sudoreplay.c:677 +msgid "unable to set tty to raw mode" +msgstr "kan ikke angive tty til rå (raw) tilstand" + +#: plugins/sudoers/sudoreplay.c:728 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advarsel: Din terminal er for lille til korrekt at afspille loggen.\n" + +#: plugins/sudoers/sudoreplay.c:729 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Loggeometri er %d x %d, din terminals geometri er %d x %d." + +#: plugins/sudoers/sudoreplay.c:757 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Genafspilning er afsluttet. Tryk på en tast for at gendanne terminalen." + +#: plugins/sudoers/sudoreplay.c:790 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ugyldig timingfillinje: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "tvetydigt udtryk »%s«" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "manglende »)« i udtryk" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "ukendt søgeterm »%s«" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s kræver et argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1657 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ugyldigt regulært udtryk: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kunne ikke fortolke dato »%s«" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "mangler »(« i udtryk" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "ugyldig kæde »or« (eller)" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "ugyldig kæde »!«" + +#: plugins/sudoers/sudoreplay.c:1343 +#, c-format +msgid "unknown search type %d" +msgstr "ukendt søgeterm %d" + +#: plugins/sudoers/sudoreplay.c:1381 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: Ugyldig logfil" + +#: plugins/sudoers/sudoreplay.c:1399 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: Tidsstempelfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1406 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: Tidsstempel %s: %s" + +#: plugins/sudoers/sudoreplay.c:1413 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: Brugerfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1422 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-brugerfelt mangler" + +#: plugins/sudoers/sudoreplay.c:1431 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-gruppefelt mangler" + +#: plugins/sudoers/sudoreplay.c:1837 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "brug: %s [-hnR] [-d mappe] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1840 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "brug: %s [-h] [-d mappe] -l [søgeudtryk]\n" + +#: plugins/sudoers/sudoreplay.c:1849 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - genafspil sudosessionslogge\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1851 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tilvalg:\n" +" -d, --directory=dir angiv mappe for sessionslogge\n" +" -f, --filter=filter angiv hvilken I/O-type at vise\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -l, --list vis tilgængelige sessions-ID'er med valgfrit udtryk\n" +" -m, --max-wait=num maks antal sekunder at vente mellem hændelser\n" +" -s, --speed=num øg eller sænk uddata\n" +" -V, --version vis versionsinformation og afslut" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "\thost matchede ikke" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommando tilladt" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommando nægtet" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommando ikke matchet" + +#: plugins/sudoers/timestamp.c:229 +#, c-format +msgid "%s is group writable" +msgstr "%s er gruppe-skrivbar" + +#: plugins/sudoers/timestamp.c:305 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kan ikke afkorte tidsstempelfil til %lld byte" + +#: plugins/sudoers/timestamp.c:792 plugins/sudoers/timestamp.c:884 +#: plugins/sudoers/visudo.c:477 plugins/sudoers/visudo.c:483 +msgid "unable to read the clock" +msgstr "kan ikke læse uret" + +#: plugins/sudoers/timestamp.c:803 +msgid "ignoring time stamp from the future" +msgstr "ignorerer tidsstempel fra fremtiden" + +#: plugins/sudoers/timestamp.c:826 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstempel for langt ude i fremtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:948 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kan ikke låse tidsstempelfilen %s" + +#: plugins/sudoers/timestamp.c:992 plugins/sudoers/timestamp.c:1012 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "undervisningsstatussti er for lang: %s/%s" + +#: plugins/sudoers/visudo.c:211 +msgid "the -x option will be removed in a future release" +msgstr "tilvalget -x vil blive fjernet i fremtidige udgivelser" + +#: plugins/sudoers/visudo.c:212 +msgid "please consider using the cvtsudoers utility instead" +msgstr "overvej i stedet for at bruge redskabet cvtsudoers" + +#: plugins/sudoers/visudo.c:263 plugins/sudoers/visudo.c:645 +#, c-format +msgid "press return to edit %s: " +msgstr "tryk retur for at redigere %s: " + +#: plugins/sudoers/visudo.c:324 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "angivet redigeringsprogram (%s) findes ikke" + +#: plugins/sudoers/visudo.c:326 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "intet redigeringsprogram fundet (sti for redigeringsprogram = %s)" + +#: plugins/sudoers/visudo.c:436 plugins/sudoers/visudo.c:444 +msgid "write error" +msgstr "skrivefejl" + +#: plugins/sudoers/visudo.c:490 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan ikke stat midlertidig fil (%s), %s unchanged" + +#: plugins/sudoers/visudo.c:497 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "midlertidig fil med nullængde (%s), %s uændret" + +#: plugins/sudoers/visudo.c:503 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redigeringsprogram (%s) fejlede, %s uændret" + +#: plugins/sudoers/visudo.c:525 +#, c-format +msgid "%s unchanged" +msgstr "%s uændret" + +#: plugins/sudoers/visudo.c:584 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kan ikke genåbne midlertidig fil (%s), %s uændrede." + +#: plugins/sudoers/visudo.c:596 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "kan ikke fortolke midlertidig fil (%s), ukendt fejl" + +#: plugins/sudoers/visudo.c:634 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "intern fejl, kan ikke finde %s på listen!" + +#: plugins/sudoers/visudo.c:714 plugins/sudoers/visudo.c:723 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kan ikke angive (uid, gid) af %s til (%u, %u)" + +#: plugins/sudoers/visudo.c:745 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s og %s er ikke på det samme filsystem, bruger mv til at omdøbe" + +#: plugins/sudoers/visudo.c:759 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommando fejlede: »%s %s %s«, %s uændret" + +#: plugins/sudoers/visudo.c:769 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fejl under omdøbing af %s, %s uændret" + +#: plugins/sudoers/visudo.c:790 +msgid "What now? " +msgstr "Hvad nu? " + +#: plugins/sudoers/visudo.c:804 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Tilvalg er:\n" +" r(e)diger sudoersfil igen\n" +" afslut(x) uden at gemme ændringer til sudoersfil\n" +" afslut(Q) og gem ændringer til sudoersfil (FARLIGT!)\n" + +#: plugins/sudoers/visudo.c:850 +#, c-format +msgid "unable to run %s" +msgstr "kan ikke køre %s" + +#: plugins/sudoers/visudo.c:880 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: forkert ejer (uid, gid) bør være (%u, %u)\n" + +#: plugins/sudoers/visudo.c:887 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: ugyldige rettigheder, bør være tilstand 0%o\n" + +#: plugins/sudoers/visudo.c:944 plugins/sudoers/visudo.c:951 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: fortolket o.k.\n" + +#: plugins/sudoers/visudo.c:998 +#, c-format +msgid "%s busy, try again later" +msgstr "%s travl, forsøg igen senere" + +#: plugins/sudoers/visudo.c:1038 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fejl: %s:%d: cyklus i %s »%s«" + +#: plugins/sudoers/visudo.c:1039 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Advarsel: %s:%d: cyklus i %s »%s«" + +#: plugins/sudoers/visudo.c:1043 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fejl: %s:%d %s »%s« refereret men ikke defineret" + +#: plugins/sudoers/visudo.c:1044 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Advarsel: %s:%d %s »%s« refereret men ikke defineret" + +# (ental) +#: plugins/sudoers/visudo.c:1137 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Advarsel: %s:%d ubrugt %s »%s«" + +#: plugins/sudoers/visudo.c:1252 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - rediger sikkert sudoersfilen\n" +"\n" + +#: plugins/sudoers/visudo.c:1254 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Tilvalg:\n" +" -c, --check kun kontroltilstand\n" +" -f, --file=file angiv filplacering for sudoers\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -q, --quiet mindre uddybende (stille) beskeder for syntaksfejl\n" +" -s, --strict streng syntakskontrol\n" +" -V, --version vis information om version og afslut\n" + +#: toke.l:942 +msgid "too many levels of includes" +msgstr "for mange niveauer af includes (inkluderinger)" diff --git a/utsudo-0.0.2/plugins/sudoers/po/de.mo b/utsudo-0.0.2/plugins/sudoers/po/de.mo new file mode 100644 index 0000000000000000000000000000000000000000..099f4cf20d7ab31eb373cf31784e0fac76bada89 GIT binary patch literal 52479 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/de.po b/utsudo-0.0.2/plugins/sudoers/po/de.po new file mode 100644 index 0000000..ad37882 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/de.po @@ -0,0 +1,2371 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2013 +# Hendrik Knackstedt , 2013 +# Mario Blättermann , 2015. +# Jochen Hein , 2001-2018. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-07-21 12:34+0200\n" +"Last-Translator: Jochen Hein \n" +"Language-Team: German \n" +"Language: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "Syntax-Fehler" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p's Passwort: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] Passwort für %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Passwort: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Sicherheits-Information für %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Das hat nicht funktioniert, bitte nochmal probieren." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "Es kann kein Speicher mehr alloziert werden" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "Eine Prüfsumme erfordert einen Pfadnamen" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "ungültiger Wert für »notbefore«" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "ungültiger Wert für »notafter«" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "Wert für Timeout ist zu groß" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "ungültiger Wert für Timeout" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias »%s« ist bereits definiert" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "Fehler bei fork()" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, c-format +msgid "unable to change password for %s" +msgstr "Das Passwort für %s« kann nicht geändert werden" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "Die Anmeldeklasse des Benutzers »%s« kann nicht gelesen werden" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "Die BSD-Authentifizierung kann nicht begonnen werden" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "Ungültiger Authentifizierungstyp" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "Die BSD-Authentifizierung kann nicht begonnen werden" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "Ihr Account ist abgelaufen" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "Genehmigung fehlgeschlagen" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "Die fwtk-Konfiguration kann nicht gelesen werden" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "Verbindung zum Authentifizierungsserver kann nicht aufgebaut werden" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "Verbindung zum Authentisierungsserver verloren" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"Fehler des Authentifizierungsservers:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: Principal kann nicht in eine Zeichenkette umgewandelt werden (»%s«): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: »%s« kann nicht ausgewertet werden: %s" + +# XXX check source? +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: Anmeldedaten-Zwischenspeicher kann nicht aufgelöst werden: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: Optionen können nicht zugewiesen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: Anmeldedaten können nicht bekommen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: Anmeldedaten-Zwischenspeicher kann nicht initialisiert werden: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: Anmeldedaten können nicht im Zwischenspeicher abgelegt werden: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: Rechner-Principal kann nicht bekommen werden: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT kann nicht verifiziert werden! Möglicher Angriff!: %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "PAM kann nicht initialisiert werden" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Fehler bei der PAM-Authentifizierung: %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "Fehler bei der Validierung des Kontos, ist das Konto gesperrt?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto oder Passwort ist abgelaufen, bitte Passwort zurücksetzen und nochmal probieren" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "Das abgelaufene Passwort kann nicht geändert werden: %s«" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "Das Passwort ist abgelaufen, bitte wenden Sie sich an den Systemadministrator" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Das Konto ist abgelaufen oder in der PAM-Konfiguration fehlt der »account«-Abschnitt für sudo. Bitte wenden Sie sich an den Systemadministrator" + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fehler beim PAM-Account-Management: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Der Benutzer existiert in der %s-Datenbank nicht" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "Die ACE-API-Bibliothek konnte nicht initialisiert werden" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "SecurID-Server kann nicht erreicht werden" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Benutzer-ID ist für SecurID-Authentifizierung gesperrt" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "Ungültige Länge des Benutzernamens für SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "Ungültiges Authentifizierungs-Handle für SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID-Kommunikation fehlgeschlagen" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "Unbekannter SecurID-Fehler" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "Ungültige Länge des Passcodes für SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "Die SIA-Sitzung kann nicht initialisiert werden" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "Ungültige Authentifizierungsmethoden" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ungültige Authentifizierungsmethoden sind in sudo einkompiliert! Standalone- und Nicht-Standalone-Authentifizierung können nicht zusammen verwendet werden." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "Keine Authentifizierungsmethoden" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Es sind keine Authentifizierungsmethoden in sudo einkompiliert! Wenn Sie die Authentifizierung wirklich abschalten wollen, verwenden Sie bitte die configure-Option »--disable-authentication«." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Die Authentifizierungsmethoden können nicht initialisiert werden." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Authentifizierungsmethoden:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Der Audit-Zustand kann nicht bestimmt werden" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "Audit-Satz kann nicht auf Platte geschrieben werden" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die\n" +"Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:\n" +"\n" +" #1) Respektieren Sie die Privatsphäre anderer.\n" +" #2) Denken Sie nach, bevor Sie tippen.\n" +" #3) Mit großer Macht kommt große Verantwortung.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "Unbekannte Benutzer-ID: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "Unbekannter Benutzer: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "Schrittgröße: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "Start der Folge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "Auffüllen der Folge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s Version %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s-Grammatik Version %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "Nicht unterstütztes Eingabeformat %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "Nicht unterstütztes Ausgabeformat %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: Eingabe- und Ausgabedatei müssen unterschiedlich sein" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "Standardwerte für sudoers können nicht initialisiert werden" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: unbekanntes Schlüsselwort: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "Ungültiger Standardtyp: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ungültiger suppression Typ: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "Ungültiger Filter: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "Die Datei »%s« kann nicht geöffnet werden" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "Analyse der Datei %s gescheitert, unbekannter Fehler" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "Analysefehler in %s nahe Zeile %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "Analysefehler in %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "In die Datei »%s« kann nicht geschrieben werden" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s – zwischen sudoers Dateiformaten konvertieren\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Optionen:\n" +" -b, --base=dn Der Basis DN für sudo LDAP Abfragen\n" +" -d, --defaults=deftypes Konvertiere nur Defaults von spezifischen Typen\n" +" -e, --expand-aliases Expandiere Aliase beim Konvertieren\n" +" -f, --output-format=format Ausgabeformat: JSON, LDIF oder sudoers\n" +" -i, --input-format=format Eingabeformat: LDIF oder sudoers\n" +" -I, --increment=num Größe der Schrittweite für sudoOrder\n" +" -h, --help Zeige diese Hilfe an und Ende\n" +" -m, --match=filter Konvertiere nur Einträge die zum Filter passen\n" +" -M, --match-local Filter verwendet passwd und group Databank\n" +" -o, --output=output_file Schreibe die konvertiere sudoers in die Ausgabe-Datei\n" +" -O, --order-start=num Start für die erste sudoOrder\n" +" -p, --prune-matches nicht passende Benutzer, Gruppen und Hosts nicht ausgeben\n" +" -P, --padding=num Auffüllen der sudoOrder Folge\n" +" -s, --suppress=sections Unterdrücke Ausgabe von bestimmten Abschnitten\n" +" -V, --version Zeige Versionsinformationen an und Ende" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "Die GMT-Zeit kann nicht bekommen werden" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "Der Zeitstempel kann nicht formatiert werden" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "Interner Fehler, %s-Überlauf" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "Zu viele sudoers Einträge, Maximum ist %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "Die Umgebunsvariable SUDOERS_BASE ist nicht gesetzt und die Option -b ist nicht angegeben." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog Facility, wenn syslog für Protokollierung verwendet wird: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-Priorität, wenn sich der Benutzer erfolgreich authentifiziert: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-Priorität, wenn sich der Benutzer nicht erfolgreich authentifiziert: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Die OTP-Eingabeaufforderung (One-Time-Passwords) in eine eigene Zeile schreiben" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "».« in $PATH ignorieren" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Immer eine Mail senden, wenn sudo gestartet wird" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Eine Mail senden, wenn die Authentifizierung des Benutzers fehlschlägt" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Eine Mail senden, wenn der Benutzer nicht in der sudoers-Datei steht" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Eine Mail senden, wenn der Benutzer nicht in der sudoers-Datei für diesen Rechner steht" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Eine Mail senden, wenn der Benutzer nicht berechtigt ist, einen Befehl auszuführen" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Eine Mail senden, wenn der Benutzer versucht, einen Befehl auszuführen" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Getrennte Zeitstempel für jede Benutzer/tty-Kombination verwenden" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Den Benutzer beim ersten Aufruf von sudo belehren" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datei mit der sudo-Belehrung: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Standardmäßig muss sich der Benutzer authentifizieren" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root darf sudo verwenden" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Den Hostnamen in der (nicht-syslog-)Protokolldatei speichern" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Das Jahr in der (nicht-syslog-)Protokolldatei speichern" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Eine Shell starten, wenn sudo ohne Parameter aufgerufen wird" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Die Umgebungsvariable $HOME beim Starten einer Shell mit »-s« setzen" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Immer die Variable $HOME auf das Home-Verzeichnis des Ziel-Benutzers setzen" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Informationssammlung für nützliche Fehlermeldungen erlauben" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vollständige Hostnamen in der sudoers-Datei erfordern" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "»Beschimpfung« bei Eingabe eines falschen Passwortes" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Der Benutzer darf sudo nur aufrufen, wenn ein tty vorhanden ist" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo beachtet die Umgebungsvariable »EDITOR«" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Nach dem root-Passwort fragen, nicht nach dem Passwort des Benutzers" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Nach dem Passwort des Benutzers »runas_default« fragen, nicht nach dem Passwort des aufrufenden Benutzers" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Nach dem Passwort des Ziel-Benutzers fragen, nicht nach dem Passwort des aufrufenden Benutzers" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Standards auf die Anmeldeklasse des Zielbenutzers anwenden, falls diese vorhanden ist" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Die Umgebungsvariablen »LOGNAME« und »USER« setzen" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nur die effektive UID auf den Ziel-Benutzer setzen, nicht die reale UID" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Die sekundären Gruppen nicht auf die Gruppen des Ziel-Benutzers setzen" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Zeilenlänge der Protokolldatei für Zeilenumbruch (0 für keinen Zeilenumbruch): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Zeitlimit für den Authentifizierungszeitstempel: %.1f Minuten" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Zeitlimit bei der Eingabe des Passwortes: %.1f Minuten" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Anzahl Versuche zur Eingabe des Passwortes: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Zu verwendende Umask oder 0777, um die Umask des Benutzers zu verwenden: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Pfad zur Protokolldatei: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pfad zum Mail-Programm: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Parameter für das Mail-Programm: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Mail-Adresse des Empfängers: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Mail-Adresse des Absenders: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Betreffzeile für Mails: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Meldung bei Eingabe eines falschen Passwortes: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Verzeichnis für den Belehrungsstatus: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pfad zum Authentifizierungszeitstempel-Verzeichnis: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Besitzer des Authentifizierungszeitstempelverzeichnisses: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Benutzer in dieser Gruppe sind von Passwort- und PATH-Anforderungen ausgenommen: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard-Eingabeaufforderung für das Passwort: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Überschreibt in allen Fällen bei der Passwortabfrage die Systemabfrage, falls gesetzt." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbenutzer, unter dem die Befehle ausgeführt werden: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Wert, mit dem der Inhalt von $PATH des Benutzers überschrieben werden soll: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pfad zum Editor, den visudo verwenden soll: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Wann soll ein Passwort für den Pseudobefehl »list« erforderlich sein: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Wann soll ein Passwort für den Pseudobefehl »verify« erforderlich sein: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Die Dummy-exec-Funktion aus der Bibliothek sudo_noexec vorladen" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Wenn das LDAP-Verzeichnis erreichbar ist, wird die lokale sudoers-Datei ignoriert?" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Datei-Deskriptoren >= %d werden geschlossen, bevor ein Befehl ausgeführt wird" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Benutzer können den Wert für »closeform« mit der der Option -C überschreiben, wenn diese Option gesetzt ist." + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Benutzern das Setzen beliebiger Umgebungsvariablen erlauben" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Die Umgebung auf einen Standardsatz an Variablen zurücksetzen" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Folgende Umgebungsvariablen prüfen:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Folgende Umgebungsvariablen löschen:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Folgende Umgebungsvariablen bewahren:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Im neuen Security-Kontext von SELinux wird diese Rolle verwendet: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Im neuen Security-Kontext von SELinux wird dieser Typ verwendet: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pfad zur sudo-spezifischen »environment«-Datei: %s" + +# XXX +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Pfad zur eingeschränkten sudo »environment«-Datei: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Beim Auswerten der sudoers-Datei wird diese Locale verwendet: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "sudo erlauben, nach einem Passwort zu fragen, auch wenn das Passwort sichtbar wird" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Sichtbare Rückmeldung bei der Passworteingabeaufforderung, wenn der Benutzer etwas eingibt" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Schnelleren Musterabgleich verwenden, der zwar ungenauer ist, aber nicht auf das Dateisystem zugreift" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Die umask in sudoers überschreibt die umask des Benutzers, selbst wenn diese mehr Berechtigungen zulässt" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Benutzereingaben für den ausgeführten Befehl protokollieren" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Die Ausgabe des ausgeführten Befehls protokollieren" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Ein-/Ausgabe-Protokolle mittels zlib protokollieren" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Befehle immer in einem Pseudo-TTY ausführen" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin für Unterstützung von Nicht-Unix-Gruppen: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Verzeichnis zur Speicherung der Ein-/Ausgabe-Protokolle: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datei zur Speicherung der Ein-/Ausgabe-Protokolle: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Einen Eintrag in die utmp/utmpx-Datei einfügen, wenn ein Pseudo-TTY erzeugt wird" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Für den Eintrag in der utmp-Datei den runas-Benutzer verwenden, nicht den aufrufenden Benutzer" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Menge der erlaubten Privilegien: %s" + +# XXX einschränkenden? +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Menge der eingeschränkten Privilegien: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Befehle mit einem Pseudo-TTY im Hintergrund starten" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Verwendeter PAM-Service-Name: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-Service-Namen für Anmelde-Shells: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Versuchen, die PAM-Anmeldedaten für den Ziel-Benutzer zu bekommen" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Eine neue PAM-Sitzung erzeugen, um den Befehl auszuführen" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Ausführen vom PAM-Account-Management" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maximale Sequenznummer des Ein-/Ausgabe-Protokolls: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Unterstützung für netgroups in sudoers aktivieren" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Prüfe die übergeordneten Verzeichnisse auf Schreibbarkeit beim Editieren von Dateien mit »sudoedit«" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Folge symbolischen Links beim Editieren von Dateien mit sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Frage das Group-Plugin nach unbekannten System-Gruppen" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Prüfe die Netgroup-Zuordnung aufgrund des gesamten Tupels: Benutzer, Host und Domain" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein Audit-Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein I/O-Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Erlaubt das Ausführen von Kommandos, auch wenn kein Log geschrieben werden kann" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Beim Auflösen von Gruppen in der sudoers nach der Guppen-ID suchen, nicht nach dem Gruppenname" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Log-Einträge größer als dieser Wert werden auf mehrere Syslog Einträge verteilt: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Eigentümer der I/O Logdateien: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe der I/O Logdateien: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Dateimode der I/O Logdatei: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Führe Kommandos mit Hilfe eines Dateideskriptors anstelle des Pfades aus: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignoriere unbekannte Default-Einträge in der Datei »sudoers« anstatt eine Warnung auszugeben" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Laufzeit in Sekunde, nach der das Kommando abgebrochen wird: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Erlaube dem Benutzer per Kommandozeile einen Timeout anzugeben" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Schreibe Log-Daten direkt ohne zu puffern" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Protokolliere auch die Prozess-ID beim Schreiben ins Systemlog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Typ des Authentifizierungszeitstempelprotokolls: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Fehler bei der Authentifizierung: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Benutzernamen" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignoriere Groß-/Kleinschreibung beim Matchen von Gruppennamen" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: unbekannter defaults-Eintrag »%s«" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d Kein Wert für »%s« angegeben" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: Kein Wert für »%s« angegeben" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d Werte für »%s« müssen mit einem »/« beginnen" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: Werte für »%s« müssen mit einem »/« beginnen" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d Die Option »%s« wird ohne Wert verwendet" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: Die Option »%s« wird ohne Wert verwendet" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d Ungültiger »Defaults« Typ 0x%x für Option »%s«" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Ungültiger »Defaults« Typ 0x%x für Option »%s«" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d Der Wert »%s« ist für die Option »%s« ungültig" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: Der Wert »%s« ist für die Option »%s« ungültig" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp ist beschädigt, die Längen passen nicht" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "Das Environment kann nicht neu erstellt werden" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "Leider dürfen die folgenden Umgebungsvariablen nicht gesetzt werden: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "Syntax-Fehler in %s bei der Zeile %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "Syntax-Fehler in %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "Prüfsummentyp %d wird für %s nicht unterstützt" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: Fehler beim Lesen" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s muss der uid %d gehören" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s darf nur für den Eigentümer der Datei schreibbar sein" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "Laden von %s fehlgeschlagen: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "Das Symbol »group_plugin« kann in %s nicht gefunden werden" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: Die Major-Version %d des Group-Plugins ist inkompatibel, erwartet wird %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "»%s« ist keine gültige IP-Adresse" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "»%s« ist keine gültige Netzmaske" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokale IP-Adresse und Netzmaske:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existiert, aber ist kein Verzeichnis (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "Das Verzeichnis »%s« kann nicht erstellt werden" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "Ändern des Modus von %s auf 0%o gescheitert" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "Unbekannte Gruppe: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "Die Datei »%s« kann nicht gelesen werden" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "Die Datei »%s« kann nicht erstellt werden" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "In die I/O Logdatei kann nicht geschrieben werden: %s" + +#: plugins/sudoers/iolog.c:1071 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: Interner Fehler, Logdatei für Event %d nicht geöffnet!" + +#: plugins/sudoers/iolog.c:1230 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: Interner Fehler, ungültiges Signal %d" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ungültige Protokolldatei" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: Das Feld für den Zeitstempel fehlt" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: Zeitstempel %s: %s" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: Das Benutzerfeld fehlt" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: Das Feld für den »runas«-Benutzer fehlt" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: Das Feld für die »runas«-Gruppe fehlt" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls wird für ldaps nicht unterstützt" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "Die Zertifikat- und Schlüsseldatenbank für SSL kann nicht initialisiert werden: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "In der Datei »%s« muss »TLS_CERT« angegeben sein, um SSL zu nutzen" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP kann nicht initialisiert werden: %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls ist angegeben, aber die LDAP-Bibliotheken unterstützen ldap_start_tls_s() und ldap_start_tls_s_np() nicht" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "Ungültiges »sudoOrder« Attribut: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: Port ist zu groß" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-Adresstyp wird nicht unterstützt: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap- und ldaps-Adressen können nicht zusammen verwendet werden" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption kann nicht konvertiert werden: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "Das Audit-System kann nicht geöffnet werden" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "Die Audit-Nachricht kann nicht gesendet werden" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (Befehl fortgesetzt) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "Die Protokolldatei kann nicht geöffnet werden: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "Die Sperrdatei kann nicht geöffnet werden: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "In die Logdatei kann nicht geschrieben werden: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "Kein Benutzer oder Rechner angegeben" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "Fehler bei der Validierung" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "Der Benutzer ist NICHT in der sudoers-Datei enthalten" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "Der Benutzer ist NICHT auf dem Rechner autorisiert" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "Der Befehl ist nicht erlaubt" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ist nicht in der sudoers-Datei. Dieser Vorfall wird gemeldet.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s darf sudo für %s nicht verwenden. Dieser Vorfall wird gemeldet.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Leider darf der Benutzer %s sudo für %s nicht verwenden.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Leider darf der Benutzer %s »%s%s%s« als %s%s%s auf %s nicht ausführen.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: Befehl nicht gefunden" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"Im aktuellen Verzeichnis ».« gefundenes »%s« wird ignoriert.\n" +"Verwenden Sie »sudo ./%s«, wenn dies der gewünschte Befehl »%s« ist." + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "Fehler bei der Authentifizierung" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "Ein Passwort ist notwendig" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u Fehlversuch bei der Passwort-Eingabe" +msgstr[1] "%u Fehlversuche bei der Passwort-Eingabe" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "Die Standardeingabe kann nicht dupliziert werden: %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s kann nicht ausgeführt werden: %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "Fehler bei fork(): %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "Die Pipe kann nicht geöffnet werden: %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "Prüfsumme für %s (%s) ist nicht in der Form %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "stat konnte nicht auf %s angewendet werden" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-Rolle: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-Eintrag:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Optionen: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " Befehle:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Passende Defaults-Einträge für %s auf %s:\n" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas und befehlsspezifische Standardwerte für %s:\n" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Der Benutzer %s darf die folgenden Befehle auf %s ausführen:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Der Benutzer %s darf sudo auf dem Rechner %s nicht ausführen.\n" + +#: plugins/sudoers/parse_ldif.c:147 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "ignoriere ungültigen Attribut-Wert: %s" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignoriere die unvollständige sudoRole: cn: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ungültige Option »%.*s« durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "Die Netzwerkadressliste kann nicht eingelesen werden" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "Benutzername nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "User-ID nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "Gruppen-ID nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "Hostname nicht durch das sudo-Frontend angegeben" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "%s kann nicht ausgeführt werden" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-Policy-Plugin Version %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-Datei-Grammatik-Version %d\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-Pfad: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-Pfad: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-Pfad: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-Pfad: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "Der Hook vom Typ %d kann nicht registriert werden (Version %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "Die Benutzer-ID %u kann nicht zwischengespeichert werden, kein Speicher verfügbar" + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "Die Benutzer-ID %u kann nicht zwischengespeichert werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "Der Benutzer %s kann nicht in den Zwischenspeicher aufgenommen werden, kein Speicher verfügbar" + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "Der Benutzer %s kann nicht in den Zwischenspeicher aufgenommen werden, er existiert bereits" + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "Die Gruppen-ID %u kann nicht in den Zwischenspeicher aufgenommen werden, kein Speicher verfügbar" + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "Die Gruppen-ID %u kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "Die Gruppe %s kann nicht in den Zwischenspeicher aufgenommen werden, kein Speicher verfügbar" + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "Die Gruppe %s kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "Die Gruppen-Liste für %s kann nicht in den Zwischenspeicher aufgenommen werden, sie existiert bereits" + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "Die Gruppen-Liste für %s kann nicht in den Zwischenspeicher aufgenommen werden, kein Speicher verfügbar" + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "Die Gruppen für %s können nicht eingelesen werden" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "Die Gruppen für %s können nicht geparst werden" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "Stack-Überlauf der Zugriffsrechte" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "Stack-Bereichsunterschreitung der Zugriffsrechte" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "Wechsel zur root-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "Wechsel zur runas-UID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "Die runas-Gruppen können nicht gesetzt werden" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "Wechsel zur runas-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "Wechsel zur sudoers-GID ist nicht möglich" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "Zu viele Prozesse" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "Das aktuelle Arbeitsverzeichnis kann nicht bestimmt werden" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "Audit-Pfad user_cmnd abgeschnitten: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "Audit-Pfad argv[0] abgeschnitten: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure-Meldung ist zu lang" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Die SSS-Quelle kann nicht initialisiert werden. Ist SSSD auf dem Rechner installiert?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "Das Symbol »%s« kann in %s nicht gefunden werden" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "Problem mit den Standard-Einträgen" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "Keine gültige sudoers-Quelle gefunden, Programmende" + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers gibt an, dass root sudo nicht verwenden darf" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "Sie dürfen die Option -C nicht verwenden" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "Zeitstempelbesitzer (%s): Benutzer existiert nicht" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "Kein tty" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "Sie müssen ein TTY haben, um sudo zu verwenden" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "Befehl ist im aktuellen Verzeichnis" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "Sie dürfen keinen Timeout angeben" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "Sie dürfen das Environment nicht erhalten" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "Der Befehl ist zu lang" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ist keine reguläre Datei" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s gehört UID %u, sollte UID %u gehören" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s ist für alle beschreibbar (world writable)" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s gehört GID %u, sollte allerdings %u gehören" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "Nur root kann »-c %s« verwenden" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "Unbekannte Anmeldeklasse: %s" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "Hostname %s kann nicht aufgelöst werden" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "Ungültige Filteroption: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "Ungültige maximale Wartezeit: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "Ungültiger Geschwindigkeitsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/Zeit: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/Zeit: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Sudo-Sitzung wird abgespielt: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "Event kann nicht zur Warteschlange hinzugefügt werden" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "TTY konnte nicht in den Raw-Modus versetzt werden" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" +"Warnung: Ihr Terminal ist zu klein, um das Protokoll korrekt\n" +"wiederzugeben.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Protokollgeometrie ist %d x %d, die Geometrie Ihres Terminals ist %d x %d." + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Wiedergabe beendet, eine Taste drücken um das Terminal wiederherzustellen." + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "Ungültige Zeitdateizeile: %s" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "Mehrdeutiger Ausdruck »%s«" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "»)« ohne öffnende Klammer im Ausdruck" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "Unbekannter Suchbegriff »%s«" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s erfordert ein Argument" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ungültiger regulärer Ausdruck: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "Datum »%s« konnte nicht analysiert werden" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "»(« ohne schließende Klammer im Ausdruck" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "Ungültiges nachgestelltes »or«" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "Ungültiges nachgestelltes »!«" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "Unbekannter Suchtyp %d" + +#: plugins/sudoers/sudoreplay.c:1607 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "Aufruf: %s [-hnRS] [-d Verzeichnis] [-m Max_Wartezeit] [-s Geschwindigkeitsfaktor] ID\n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Aufruf: %s [-h] [-d Verzeichnis] -l [Suchausdruck]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s – sudo-Sitzungsprotokolle abspielen\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Optionen:\n" +" -d, --directory=Verzeichnis gibt ein Verzeichnis für Sitzungsprotokolle an\n" +" -f, --filter=Filter gibt an, welcher E/A-Typ angezeigt werden soll\n" +" -h, --help zeigt einen Hilfetext an und beendet\n" +" das Programm\n" +" -l, --list zeigt verfügbare Sitzungs-IDs an, die mit dem\n" +" Ausdruck übereinstimmen\n" +" -m, --max-wait=Zahl gibt die maximale Wartezeit zwischen Ereignissen\n" +" in Sekunden an\n" +" -n, --non-interactive keine Prompts, Sitzung wird auf die Standard-\n" +" Ausgabe gesendet\n" +" -R, --no-resize Terminal-Größe wird nicht verändert\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=Zahl beschleunigt oder verlangsamt die Wiedergabe\n" +" -V, --version zeigt Versionsinformationen an und beendet\n" +" das Programm" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tHost stimmt nicht überein" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Befehl erlaubt" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Befehl verweigert" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Befehl nicht erkannt" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s ist für die Gruppe beschreibbar" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "Die Zeitstempeldatei kann nicht auf %lld Bytes abgeschnitten werden" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "Die Uhrzeit kann nicht ausgelesen werden" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "Zeitstempel aus der Zukunft wird ignoriert" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "Zeitstempel ist zu weit in der Zukunft: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "Die Zeitstempeldatei »%s« kann nicht gesperrt werden" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "Pfad zur Belehrung ist zu lang: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "Die Option »-x» wird in einer zukünftigen Version entfernt" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "Bitte verwenden Sie stattdessen das Programm »cvtsudoers«" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "Drücken Sie die Eingabetaste, um %s zu bearbeiten: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "Der angegebene Editor (%s) ist nicht vorhanden" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "Kein Editor gefunden (Pfad zum Editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "Schreibfehler" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "Anwenden von stat auf die temporäre Datei (%s) gescheitert, %s ist unverändert" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "Leere temporäre Datei (%s), %s ist unverändert" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "Editor-Aufruf (%s) ist gescheitert, %s ist unverändert" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s unverändert" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "Erneutes Öffnen der temporären Datei (%s) gescheitert, %s ist unverändert." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "Analyse der temporären Datei (%s) gescheitert, unbekannter Fehler" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "Interner Fehler, %s in der Liste nicht gefunden!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "Festlegen von (uid, gid) von %s auf (%u, %u) gescheitert" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s und %s befinden sich nicht im gleichen Dateisystem, werden mit mv umbenannt" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "Befehl gescheitert: »%s %s %s«, %s unverändert" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "Fehler beim Umbenennen von %s, %s unverändert" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Was jetzt? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Optionen sind:\n" +" sudoers-Datei (e)rneut bearbeiten\n" +" Beenden, ohne die Änderungen an der sudoers-Datei zu speichern (mit x)\n" +" Beenden und Änderungen an der sudoers-Datei speichern (mit Q, VORSICHT!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "%s konnte nicht ausgeführt werden" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: Falsche Besitzer-(uid, gid), sollte (%u, %u) sein\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: Falsche Zugriffsrechte, sollte Modus 0%o sein\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: Analyse OK\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ist in Verwendung, versuchen Sie es später erneut" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "Die Datei »%s« kann nicht gesperrt werden" + +# XXX +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Trotzdem ändern? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fehler: %s:%d Zyklus in %s »%s«" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Warnung: %s:%d Zyklus in %s »%s«" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fehler: %s:%d %s »%s« wird verwendet, ist aber nicht definiert" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Warnung: %s:%d %s »%s« wird verwendet, ist aber nicht definiert" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Warnung: %s:%d nicht verwendet: %s »%s«" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s – Die sudoers-Datei sicher bearbeiten\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Optionen:\n" +" -c, --check nur den Prüf-Modus verwenden\n" +" -f, --file=sudoers gibt den Namen der sudoers Datei an\n" +" -h, --help diese Hilfe anzeigen und beenden\n" +" -q, --quiet weniger ausführliche Syntaxfehler-Meldungen\n" +" -s, --strict strikte Syntax-Prüfung\n" +" -V, --version Versionsinformation anzeigen und beenden\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "Zu viele geschachtelte include-Einträge" diff --git a/utsudo-0.0.2/plugins/sudoers/po/el.mo b/utsudo-0.0.2/plugins/sudoers/po/el.mo new file mode 100644 index 0000000000000000000000000000000000000000..9cae8b9791cd8e126970b04726a1334003f3f8bd GIT binary patch literal 51009 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, 2014. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.10b3\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2014-02-07 15:13-0700\n" +"PO-Revision-Date: 2014-06-04 08:01+0300\n" +"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" +"Language-Team: Greek \n" +"Language: el\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.0\n" + +#: confstr.sh:2 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** Πληροφορίες ΑΣΦΑΛΕΙΑΣ για το %h ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Συγνώμη, δοκιμάστε ξανά." + +#: plugins/sudoers/alias.c:136 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Έχει ήδη οριστεί το ψευδώνυμο `%s'" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "αδύνατη η λήψη κλάσης σύνδεσης για τον χρήστη %s" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "unable to begin bsd authentication" +msgstr "αδύνατη η έναρξη της πιστοποίησης bsd" + +#: plugins/sudoers/auth/bsdauth.c:89 +msgid "invalid authentication type" +msgstr "άκυρος τύπος πιστοποίησης" + +#: plugins/sudoers/auth/bsdauth.c:98 +msgid "unable to initialize BSD authentication" +msgstr "αδύνατη η αρχικοποίηση της πιστοποίησης BSD" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "αδύνατη η ανάγνωση του fwtk config" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "αδύνατη η σύνδεση με τον εξυπηρετητή πιστοποίησης" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +msgid "lost connection to authentication server" +msgstr "απώλεια σύνδεσης με τον εξυπηρετητή πιστοποίησης" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"σφάλμα εξυπηρετητή πιστοποίησης:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: αδύνατη η μετατροπή της αρχής ασφάλειας σε συμβολοσειρά ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: αδύνατη η ανάλυση του '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: αδύνατη η επίλυση κρυφής μνήμης διαπιστευτήριων: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: αδύνατη η κατανομή επιλογών: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: αδύνατη η λήψη διαπιστευτηρίων: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: αδύνατη η αρχικοποίηση κρυφής μνήμης διαπιστευτηρίων: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: αδύνατη η αποθήκευση διαπιστευτηρίων στην κρυφή μνήμη: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: αδύνατη η λήψη αρχής ασφάλειας του οικοδεσπότη: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Αδύνατη η επιβεβαίωση TGT! Πιθανή επίθεση!: %s" + +#: plugins/sudoers/auth/pam.c:98 +msgid "unable to initialize PAM" +msgstr "αδύνατη η αρχικοποίηση του PAM" + +#: plugins/sudoers/auth/pam.c:149 +msgid "account validation failure, is your account locked?" +msgstr "αποτυχία επικύρωσης λογαριασμού, είναι κλειδωμένος ο λογαριασμός σας;" + +#: plugins/sudoers/auth/pam.c:153 +msgid "Account or password is expired, reset your password and try again" +msgstr "Ο λογαριασμός ή ο κωδικός πρόσβασης έχει λήξει, επαναφέρτε τον κωδικό πρόσβασής σας και ξαναδοκιμάστε" + +#: plugins/sudoers/auth/pam.c:161 +#, c-format +msgid "unable to change expired password: %s" +msgstr "αδύνατη η αλλαγή του ληγμένου κωδικού πρόσβασης: %s" + +#: plugins/sudoers/auth/pam.c:166 +msgid "Password expired, contact your system administrator" +msgstr "Ο κωδικός πρόσβασης έχει λήξει, επικοινωνήστε με τον διαχειριστή του συστήματος" + +#: plugins/sudoers/auth/pam.c:170 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Ο λογαριασμός έχει λήξει ή το PAM config στερείται μιας ενότητας \"λογαριασμού\" για sudo, επικοινωνήστε με τον διαχειριστή του συστήματός σας" + +#: plugins/sudoers/auth/pam.c:187 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Σφάλμα πιστοποίησης PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:222 +#, c-format +msgid "you do not exist in the %s database" +msgstr "δεν υπάρχετε στη βάση δεδομένων %s" + +#: plugins/sudoers/auth/securid5.c:80 +msgid "failed to initialise the ACE API library" +msgstr "αποτυχία αρχικοποίησης της βιβλιοθήκης ACE API" + +#: plugins/sudoers/auth/securid5.c:106 +msgid "unable to contact the SecurID server" +msgstr "αδύνατη η επικοινωνία με τον εξυπηρετητή SecurID" + +#: plugins/sudoers/auth/securid5.c:115 +msgid "User ID locked for SecurID Authentication" +msgstr "Το αναγνωριστικό του χρήστη για πιστοποίηση SecurID είναι κλειδωμένο" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +msgid "invalid username length for SecurID" +msgstr "άκυρο μήκος ονόματος χρήστη για SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +msgid "invalid Authentication Handle for SecurID" +msgstr "άκυρη διαχείριση πιστοποίησης για SecurID" + +#: plugins/sudoers/auth/securid5.c:127 +msgid "SecurID communication failed" +msgstr "αποτυχία επικοινωνίας SecurID" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +msgid "unknown SecurID error" +msgstr "άγνωστο σφάλμα SecurID" + +#: plugins/sudoers/auth/securid5.c:165 +msgid "invalid passcode length for SecurID" +msgstr "άκυρο μήκος κωδικού περάσματος για το SecurID" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "αδύνατη η αρχικοποίηση της συνεδρίας SIA" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "άκυρες μέθοδοι πιστοποίησης" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Άκυρες μεταγλωττισμένες μέθοδοι πιστοποίησης στο sudo! Δεν μπορείτε να αναμίξετε αυτόνομη και μη αυτόνομη πιστοποίηση." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "δεν υπάρχουν μέθοδοι πιστοποίησης" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Δεν υπάρχουν μεταγλωττισμένες μέθοδοι πιστοποίησης στο sudo! Αν θέλετε να απενεργοποιήσετε την πιστοποίηση, χρησιμοποιήστε την επιλογή ρύθμισης --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Μέθοδοι πιστοποίησης:" + +#: plugins/sudoers/bsm_audit.c:91 plugins/sudoers/bsm_audit.c:158 +msgid "Could not determine audit condition" +msgstr "Αδυναμία εντοπισμού συνθήκης ελέγχου" + +#: plugins/sudoers/bsm_audit.c:134 plugins/sudoers/bsm_audit.c:199 +msgid "unable to commit audit record" +msgstr "αδύνατη η υποβολή εγγραφής ελέγχου" + +#: plugins/sudoers/check.c:189 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Εμπιστευόμαστε ότι έχετε δεχτεί τις συνηθισμένες οδηγίες από τον\n" +"διαχειριστή του τοπικού συστήματος. Συνήθως συμπυκνώνεται σε τρία πράγματα:\n" +"\n" +" #1) Σεβασμός της ιδιωτικότητας των άλλων.\n" +" #2) Σκεφτείτε πριν πληκτρολογήσετε.\n" +" #3) Η μεγάλη ισχύς συνυπάρχει με τη μεγάλη ευθύνη.\n" +"\n" + +#: plugins/sudoers/check.c:232 plugins/sudoers/check.c:238 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:588 +#, c-format +msgid "unknown uid: %u" +msgstr "άγνωστο uid: %u" + +#: plugins/sudoers/check.c:235 plugins/sudoers/policy.c:657 +#: plugins/sudoers/sudoers.c:850 plugins/sudoers/testsudoers.c:211 +#: plugins/sudoers/testsudoers.c:363 +#, c-format +msgid "unknown user: %s" +msgstr "άγνωστος χρήστης: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Ευκολία Syslog αν το syslog χρησιμοποιείται για καταγραφή: %s" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Προτεραιότητα χρήσης Syslog, όταν ο χρήστης πιστοποιείται επιτυχώς: %s" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Προτεραιότητα χρήσης Syslog, όταν ο χρήστης πιστοποιείται ανεπιτυχώς: %s" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "Τοποθέτηση της προτροπής OTP στη δική της γραμμή" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Παράβλεψη '.' στο $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Να στέλνετε πάντα μήνυμα όταν εκτελείται το sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Να στέλνετε μήνυμα αν η πιστοποίηση χρήστη αποτύχει" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν είναι στους χρήστες sudo" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν είναι στους χρήστες sudo για αυτόν τον οικοδεσπότη" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Να στέλνετε μήνυμα αν ο χρήστης δεν επιτρέπεται να εκτελέσει μια εντολή" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Να χρησιμοποιείται ξεχωριστή χρονική σήμανση για κάθε χρήστη/σύνθετο tty" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Να δίνονται οδηγίες στον χρήστη την πρώτη φορά που εκτελεί sudo" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Το αρχείο που περιέχει τις οδηγίες sudo: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Να απαιτείται από τους χρήστες να πιστοποιούνται από προεπιλογή" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Ο υπερχρήστης μπορεί να εκτελεί sudo" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Καταγραφή του ονόματος οικοδεσπότη στο αρχείο καταγραφής (non-syslog)" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "Καταγραφή του έτους στο αρχείο καταγραφής (non-syslog)" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Αν το sudo κλήθηκε χωρίς ορίσματα, να αρχίσει ένα κέλυφος" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ορίστε το $HOME του προοριζόμενου χρήστη όταν ξεκινάτε ένα κέλυφος με -s" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Να ορίζεται πάντα το $HOME στον προσωπικό κατάλογο του προοριζόμενου χρήστη" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Να επιτρέπεται η συγκέντρωση κάποιων πληροφοριών για να δίνονται χρήσιμα μηνύματα σφαλμάτων" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Να απαιτούνται πλήρως χαρακτηρισμένα ονόματα οικοδεσπότη στο αρχείο χρηστών sudo" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Να ειδοποιείται ο χρήστης όταν εισάγει έναν εσφαλμένο κωδικό πρόσβασης" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Να επιτρέπεται στον χρήστη να εκτελεί sudo μόνο αν έχει ένα tty" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Το Visudo θα σεβαστεί τη μεταβλητή περιβάλλοντος του EDITOR" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης του υπερχρήστη, όχι του χρήστη" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης των χρηστών runas_default, όχι των χρηστών" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "Να ζητιέται ο κωδικός πρόσβασης του προοριζόμενου χρήστη, όχι των χρηστών" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Να εφαρμόζονται οι προεπιλογές στην κλάση σύνδεσης του προοριζόμενου χρήστη αν υπάρχει κάποιες" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Να ορίζονται οι μεταβλητές περιβάλλοντος LOGNAME και USER" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Να ορίζεται μόνο το ενεργό uid του προοριζόμενου χρήστη, όχι το πραγματικό uid" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Να μην αρχικοποιείται το διάνυσμα ομάδας σε αυτό του προοριζόμενου χρήστη" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Το μήκος στο οποίο θα αναδιπλώνονται οι γραμμές του αρχείου καταγραφής (0 για χωρίς αναδίπλωση): %u" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Όριο χρόνου χρονικής σήμανσης πιστοποίησης: %.1f λεπτά" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Όριο χρόνου προτροπής κωδικού πρόσβασης: %.1f λεπτά" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Αριθμός προσπαθειών για να εισάγετε έναν κωδικό πρόσβασης: %u" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Χρησιμοποιήστε umask ή 0777 για να χρησιμοποιήσετε του χρήστη: 0%o" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Διαδρομή για το αρχείο καταγραφής: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "Διαδρομή για το πρόγραμμα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Σημαίες για το πρόγραμμα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Διεύθυνση αποστολής αλληλογραφίας προς: %s" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Διεύθυνση λήψης αλληλογραφίας από: %s" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Γραμμή θέματος για μηνύματα αλληλογραφίας: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Εσφαλμένο μήνυμα κωδικού πρόσβασης: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Διαδρομή για τον κατάλογο κατάστασης οδηγιών: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Διαδρομή για τον κατάλογο χρονικής σήμανσης πιστοποίησης: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Κάτοχος καταλόγου χρονικής σήμανσης πιστοποίησης: %s" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Οι χρήστες αυτής της ομάδας εξαιρούνται από τον κωδικό πρόσβασης και της απαιτήσεις PATH: %s" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Default password prompt: %s" +msgstr "Προτροπή προεπιλεγμένου κωδικού πρόσβασης: %s" + +#: plugins/sudoers/def_data.c:223 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Αν οριστεί, η προτροπή περάσματος θα αντικαταστήσει την προτροπή συστήματος σε όλες τις περιπτώσεις." + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Προεπιλεγμένος χρήστης για να εκτελεί εντολές ως: %s" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Τιμή που θα αντικαθιστά τη $PATH χρήστη με: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Διαδρομή για τον επεξεργαστή για χρήση από το visudo: %s" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Πότε θα απαιτείται κωδικός πρόσβασης για τον 'κατάλογο' ψευδοεντολών: %s" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Πότε θα απαιτείται κωδικός πρόσβασης για 'επιβεβαίωση' ψευδοεντολής: %s" + +#: plugins/sudoers/def_data.c:247 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Να προφορτώνονται οι εικονικές συναρτήσεις εκτέλεσης στη βιβλιοθήκη sudo_noexec" + +#: plugins/sudoers/def_data.c:251 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Αν ο κατάλογος LDAP είναι ανεβασμένος, παραβλέπουμε το τοπικό αρχείο χρηστών sudo." + +#: plugins/sudoers/def_data.c:255 +#, fuzzy, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Οι περιγραφείς αρχείων >= %d να είναι κλειστοί πριν την εκτέλεση μιας εντολής" + +#: plugins/sudoers/def_data.c:259 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Αν οριστεί, οι χρήστες μπορούν να αντικαθιστούν την τιμή του `closefrom' με την επιλογή -C" + +#: plugins/sudoers/def_data.c:263 +msgid "Allow users to set arbitrary environment variables" +msgstr "Να επιτρέπεται στους χρήστες να ορίζουν ελεύθερες μεταβλητές περιβάλλοντος" + +#: plugins/sudoers/def_data.c:267 +msgid "Reset the environment to a default set of variables" +msgstr "Να επαναρρυθμίζεται το περιβάλλον σε ένα προεπιλεγμένο σύνολο μεταβλητών" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to check for sanity:" +msgstr "Οι μεταβλητές περιβάλλοντος που θα ελέγχονται για ακεραιότητα:" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to remove:" +msgstr "Οι μεταβλητές περιβάλλοντος προς αφαίρεση:" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to preserve:" +msgstr "Οι μεταβλητές περιβάλλοντος για διατήρηση:" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Ο ρόλος του SELinux που θα χρησιμοποιηθεί στο νέο περιεχόμενο ασφάλειας: %s" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Ο τύπος SELinux που θα χρησιμοποιηθεί στο νέο περιεχόμενο ασφάλειας: %s" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Η διαδρομή προς το αρχείο περιβάλλοντος που είναι ειδικό για sudo: %s" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Οι τοπικές ρυθμίσεις που θα χρησιμοποιηθούν κατά την ανάλυση των χρηστών sudo: %s" + +#: plugins/sudoers/def_data.c:299 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Να επιτρέπεται στο sudo να ζητά κωδικό πρόσβασης ακόμα κι αν θα είναι ορατό" + +#: plugins/sudoers/def_data.c:303 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Να παρέχεται οπτική ανάδραση στην προτροπή κωδικού πρόσβασης όταν υπάρχει είσοδος χρήστη" + +#: plugins/sudoers/def_data.c:307 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Να χρησιμοποιείται γρηγορότερη επέκταση (globbing) που είναι λιγότερο ακριβές, αλλά δεν έχει πρόσβαση στο σύστημα αρχείων" + +#: plugins/sudoers/def_data.c:311 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Η umask που ορίστηκε στους χρήστες sudo θα αντικαταστήσει αυτή του χρήστη, ακόμα κι αν δίνει περισσότερα δικαιώματα." + +#: plugins/sudoers/def_data.c:315 +msgid "Log user's input for the command being run" +msgstr "Να καταγράφεται η είσοδος χρήστη για την εκτελούμενη εντολή" + +#: plugins/sudoers/def_data.c:319 +msgid "Log the output of the command being run" +msgstr "Να καταγράφεται η έξοδος της εκτελούμενης εντολής" + +#: plugins/sudoers/def_data.c:323 +msgid "Compress I/O logs using zlib" +msgstr "Συμπίεση καταγραφών εισόδου/εξόδου χρησιμοποιώντας το zlib" + +#: plugins/sudoers/def_data.c:327 +msgid "Always run commands in a pseudo-tty" +msgstr "Να εκτελούνται πάντα εντολές σε ψευδο-tty" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Πρόσθετο για υποστήριξη ομάδας μη Γιούνιξ: %s" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Κατάλογος στον οποίο αποθηκεύονται οι καταγραφές εισόδου/εξόδου: %s" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Αρχείο στο οποίο θα αποθηκεύεται η καταγραφή εισόδου/εξόδου: %s" + +#: plugins/sudoers/def_data.c:343 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Να προστίθεται μια καταχώριση στο αρχείο utmp/utmpx κατά την εκχώρηση ενός pty" + +#: plugins/sudoers/def_data.c:347 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Να ορίζεται ο χρήστης στο utmp στον χρήστη runas, να μην καλείται ο χρήστης" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of permitted privileges" +msgstr "Να ορίζονται τα επιτρεπόμενα δικαιώματα" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of limit privileges" +msgstr "Να ορίζονται τα δικαιώματα ορίου" + +#: plugins/sudoers/def_data.c:359 +msgid "Run commands on a pty in the background" +msgstr "Να εκτελούνται εντολές σε ένα pty στο παρασκήνιο" + +#: plugins/sudoers/def_data.c:363 +msgid "PAM service name to use" +msgstr "Το όνομα υπηρεσίας PAM που θα χρησιμοποιηθεί" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use for login shells" +msgstr "Το όνομα υπηρεσίας PAM που θα χρησιμοποιηθεί για κελύφη σύνδεσης" + +#: plugins/sudoers/def_data.c:371 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Να γίνεται προσπάθεια δημιουργίας διαπιστευτηρίων για τον προοριζόμενο χρήστη" + +#: plugins/sudoers/def_data.c:375 +msgid "Create a new PAM session for the command to run in" +msgstr "Να δημιουργείται μια νέα συνεδρία PAM για την εκτελούμενη εντολή" + +#: plugins/sudoers/def_data.c:379 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Μέγιστος αριθμός αλληλουχίας καταγραφών εισόδου/εξόδου: %u" + +#: plugins/sudoers/def_data.c:383 +msgid "Enable sudoers netgroup support" +msgstr "Να ενεργοποιείται η υποστήριξη ομάδας δικτύου στους χρήστες sudo" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:600 +#: plugins/sudoers/visudo_json.c:611 plugins/sudoers/visudo_json.c:647 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "άγνωστες προεπιλογές καταχώρισης `%s'" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:248 plugins/sudoers/defaults.c:261 +#: plugins/sudoers/defaults.c:274 plugins/sudoers/defaults.c:287 +#: plugins/sudoers/defaults.c:300 plugins/sudoers/defaults.c:320 +#: plugins/sudoers/defaults.c:330 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "η τιμή `%s' είναι άκυρη για την επιλογή `%s'" + +#: plugins/sudoers/defaults.c:221 plugins/sudoers/defaults.c:231 +#: plugins/sudoers/defaults.c:239 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:326 +#, c-format +msgid "no value specified for `%s'" +msgstr "δεν ορίστηκε τιμή για το `%s'" + +#: plugins/sudoers/defaults.c:244 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "οι τιμές για το `%s' πρέπει να αρχίζουν με ένα '/'" + +#: plugins/sudoers/defaults.c:306 +#, c-format +msgid "option `%s' does not take a value" +msgstr "η επιλογή `%s' δεν παίρνει τιμή" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:442 plugins/sudoers/policy.c:449 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:656 +#: plugins/sudoers/testsudoers.c:241 +#, c-format +msgid "internal error, %s overflow" +msgstr "εσωτερικό σφάλμα, υπερχείλιση του %s" + +#: plugins/sudoers/env.c:367 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: αλλοιωμένο envp, ασυμφωνία μήκους" + +#: plugins/sudoers/env.c:1014 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "συγνώμη, δεν σας επιτρέπετε να ορίσετε τις παρακάτω μεταβλητές περιβάλλοντος: %s" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "το %s πρέπει να κατέχεται από το uid %d" + +#: plugins/sudoers/group_plugin.c:98 +#, c-format +msgid "%s must only be writable by owner" +msgstr "το %s πρέπει να είναι εγγράψιμο μόνο από τον κάτοχο" + +#: plugins/sudoers/group_plugin.c:105 plugins/sudoers/sssd.c:251 +#, c-format +msgid "unable to load %s: %s" +msgstr "αδύνατη η φόρτωση του %s: %s" + +#: plugins/sudoers/group_plugin.c:110 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "αδύνατη η εύρεση συμβόλου \"group_plugin\" στο %s" + +#: plugins/sudoers/group_plugin.c:115 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: ασύμβατη μεγάλη έκδοση %d του προσθέτου ομάδας, αναμενόταν %d" + +#: plugins/sudoers/interfaces.c:116 +msgid "Local IP address and netmask pairs:\n" +msgstr "Ζεύγη τοπικής διεύθυνσης IP και μάσκας δικτύου:\n" + +#: plugins/sudoers/iolog.c:99 plugins/sudoers/iolog.c:112 +#: plugins/sudoers/timestamp.c:227 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "το %s υπάρχει, αλλά δεν είναι κατάλογος (0%o)" + +#: plugins/sudoers/iolog.c:109 plugins/sudoers/iolog.c:123 +#: plugins/sudoers/iolog.c:127 plugins/sudoers/timestamp.c:221 +#: plugins/sudoers/timestamp.c:242 +#, c-format +msgid "unable to mkdir %s" +msgstr "αδύνατο το mkdir %s" + +#: plugins/sudoers/iolog.c:190 plugins/sudoers/sudoers.c:710 +#: plugins/sudoers/sudoreplay.c:342 plugins/sudoers/sudoreplay.c:813 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/timestamp.c:345 +#: plugins/sudoers/visudo.c:823 plugins/sudoers/visudo_json.c:995 +#: plugins/sudoers/visudo_json.c:1001 +#, c-format +msgid "unable to open %s" +msgstr "αδύνατο το άνοιγμα του %s" + +#: plugins/sudoers/iolog.c:229 plugins/sudoers/sudoers.c:713 +#: plugins/sudoers/sudoreplay.c:1117 +#, c-format +msgid "unable to read %s" +msgstr "αδύνατη η ανάγνωση του %s" + +#: plugins/sudoers/iolog.c:259 plugins/sudoers/sudoreplay.c:582 +#: plugins/sudoers/timestamp.c:184 +#, c-format +msgid "unable to write to %s" +msgstr "αδύνατη η εγγραφή σε %s" + +#: plugins/sudoers/iolog.c:319 plugins/sudoers/iolog.c:512 +#, c-format +msgid "unable to create %s" +msgstr "αδύνατη η δημιουργία του %s" + +#: plugins/sudoers/ldap.c:406 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: υπερβολικά μεγάλη θύρα" + +#: plugins/sudoers/ldap.c:429 +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: εκτός χώρου επέκτασης hostbuf" + +#: plugins/sudoers/ldap.c:461 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "ανυποστήρικτος τύπος LDAP uri: %s" + +#: plugins/sudoers/ldap.c:492 +msgid "unable to mix ldap and ldaps URIs" +msgstr "αδύνατη η ανάμιξη URIs ldap και ldaps" + +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:528 +msgid "starttls not supported when using ldaps" +msgstr "το starttls δεν υποστηρίζεται όταν χρησιμοποιείται το ldaps" + +#: plugins/sudoers/ldap.c:514 +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "sudo_ldap_parse_uri: εκτός χώρου δόμησης του hostbuf" + +#: plugins/sudoers/ldap.c:595 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "αδύνατη η αρχικοποίηση των cert SSL και db κλειδιών: %s" + +#: plugins/sudoers/ldap.c:598 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "πρέπει να ορίσετε το TLS_CERT σε %s για να χρησιμοποιήσετε το SSL" + +#: plugins/sudoers/ldap.c:1089 +msgid "unable to get GMT time" +msgstr "αδύνατη η λήψη χρόνου GMT" + +#: plugins/sudoers/ldap.c:1095 +msgid "unable to format timestamp" +msgstr "αδύνατη η μορφοποίηση της χρονικής σήμανσης" + +#: plugins/sudoers/ldap.c:1103 +msgid "unable to build time filter" +msgstr "αδύνατη η δόμηση φίλτρου χρόνου" + +#: plugins/sudoers/ldap.c:1322 +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "ασυμφωνία κατανομής sudo_ldap_build_pass1" + +#: plugins/sudoers/ldap.c:1433 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:1909 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Ρόλος LDAP: %s\n" + +#: plugins/sudoers/ldap.c:1911 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Ρόλος LDAP: ΑΓΝΩΣΤΟΣ\n" + +#: plugins/sudoers/ldap.c:1958 +#, c-format +msgid " Order: %s\n" +msgstr " Σειρά: %s\n" + +#: plugins/sudoers/ldap.c:1966 plugins/sudoers/parse.c:504 +#: plugins/sudoers/sssd.c:1295 +#, c-format +msgid " Commands:\n" +msgstr " Εντολές:\n" + +#: plugins/sudoers/ldap.c:2509 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "αδύνατη η αρχικοποίηση του LDAP: %s" + +#: plugins/sudoers/ldap.c:2551 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "ορίστηκε το start_tls, αλλά οι βιβλιοθήκες LDAP υποστηρίζουν ldap_start_tls_s() ή ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:2784 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "άκυρο γνώρισμα sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:57 +msgid "unable to open audit system" +msgstr "αδύνατο το άνοιγμα συστήματος ελέγχου" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "αδύνατη η αποστολή μηνύματος ελέγχου" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (συνεχιζόμενη εντολή) %s" + +#: plugins/sudoers/logging.c:189 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "αδύνατο το άνοιγμα αρχείου καταγραφής: %s: %s" + +#: plugins/sudoers/logging.c:192 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "αδύνατο το κλείδωμα αρχείου καταγραφής: %s: %s" + +#: plugins/sudoers/logging.c:243 +msgid "No user or host" +msgstr "Χωρίς χρήστη ή οικοδεσπότη" + +#: plugins/sudoers/logging.c:245 +msgid "validation failure" +msgstr "αποτυχία επικύρωσης" + +#: plugins/sudoers/logging.c:252 +msgid "user NOT in sudoers" +msgstr "ο χρήστης ΔΕΝ είναι στους sudo" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT authorized on host" +msgstr "ο χρήστης ΔΕΝ εξουσιοδοτήθηκε στον οικοδεσπότη" + +#: plugins/sudoers/logging.c:256 +msgid "command not allowed" +msgstr "μη επιτρεπόμενη εντολή" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "το %s δεν είναι στο αρχείο χρηστών sudo. Αυτό το συμβάν θα αναφερθεί.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "ο %s δεν επιτρέπεται να εκτελέσει sudo στο %s. Αυτό το συμβάν θα αναφερθεί.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Συγνώμη, ο χρήστης %s δεν μπορεί να εκτελέσει sudo στο %s.\n" + +#: plugins/sudoers/logging.c:296 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Συγνώμη, ο χρήστης %s δεν επιτρέπεται να εκτελέσει '%s%s%s' ως %s%s%s στο %s.\n" + +#: plugins/sudoers/logging.c:333 plugins/sudoers/sudoers.c:382 +#: plugins/sudoers/sudoers.c:383 plugins/sudoers/sudoers.c:385 +#: plugins/sudoers/sudoers.c:386 plugins/sudoers/sudoers.c:1017 +#: plugins/sudoers/sudoers.c:1018 +#, c-format +msgid "%s: command not found" +msgstr "%s: δεν βρέθηκε η εντολή" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:378 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" +"παραβλέπεται το `%s' που βρέθηκε στο '.'\n" +"Χρησιμοποιήστε `sudo ./%s' αν αυτό είναι το `%s' που θέλετε να εκτελέσετε." + +#: plugins/sudoers/logging.c:351 +msgid "authentication failure" +msgstr "αποτυχία πιστοποίησης" + +#: plugins/sudoers/logging.c:377 +msgid "a password is required" +msgstr "απαιτείται κωδικός πρόσβασης" + +#: plugins/sudoers/logging.c:441 plugins/sudoers/logging.c:495 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u ανεπιτυχής προσπάθεια κωδικού πρόσβασης" +msgstr[1] "%u ανεπιτυχείς προσπάθειες κωδικού πρόσβασης" + +#: plugins/sudoers/logging.c:581 +msgid "unable to fork" +msgstr "αδύνατη η διακλάδωση" + +#: plugins/sudoers/logging.c:588 plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to fork: %m" +msgstr "αδύνατη η διακλάδωση: %m" + +#: plugins/sudoers/logging.c:634 +#, c-format +msgid "unable to open pipe: %m" +msgstr "αδύνατο το άνοιγμα της διοχέτευσης: %m" + +#: plugins/sudoers/logging.c:659 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "αδύνατο να dup στην τυπική είσοδο: %m" + +#: plugins/sudoers/logging.c:694 +#, c-format +msgid "unable to execute %s: %m" +msgstr "αδύνατη η εκτέλεση %s: %m" + +#: plugins/sudoers/logging.c:914 +msgid "internal error: insufficient space for log line" +msgstr "εσωτερικό σφάλμα: ανεπαρκής χώρος για γραμμή καταγραφής" + +#: plugins/sudoers/match.c:617 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "ανυποστήρικτος τύπος αφομοίωσης %d για %s" + +#: plugins/sudoers/match.c:647 +#, c-format +msgid "%s: read error" +msgstr "%s: σφάλμα ανάγνωσης" + +#: plugins/sudoers/match.c:661 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "η αφομοίωση για το %s (%s) δεν είναι στη μορφή %s" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "σφάλμα ανάλυσης στο %s κοντά στη γραμμή %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "ανάλυση σφάλματος για %s" + +#: plugins/sudoers/parse.c:451 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Καταχώριση χρηστών sudo:\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:466 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:475 +#, c-format +msgid " Options: " +msgstr " Επιλογές: " + +#: plugins/sudoers/policy.c:109 plugins/sudoers/policy.c:116 +#: plugins/sudoers/policy.c:123 plugins/sudoers/policy.c:145 +#: plugins/sudoers/policy.c:259 plugins/sudoers/policy.c:277 +#: plugins/sudoers/policy.c:284 plugins/sudoers/policy.c:312 +#: plugins/sudoers/policy.c:320 plugins/sudoers/policy.c:327 +#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:702 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1357 +#: plugins/sudoers/set_perms.c:1525 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/policy.c:539 plugins/sudoers/visudo.c:764 +#, c-format +msgid "unable to execute %s" +msgstr "Αδύνατη η εκτέλεση του %s." + +#: plugins/sudoers/policy.c:681 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Η έκδοση προσθέτου πολιτικής χρηστών sudo %s\n" + +#: plugins/sudoers/policy.c:683 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Η έκδοση γραμματικής αρχείου χρηστών sudo %d\n" + +#: plugins/sudoers/policy.c:687 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"διαδρομή χρηστών sudo: %s\n" + +#: plugins/sudoers/policy.c:690 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "διαδρομή nsswitch: %s\n" + +#: plugins/sudoers/policy.c:692 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "διαδρομή ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:693 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "διαδρομή ldap.secret: %s\n" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "αδύνατη η αποθήκευση του uid %u, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "αδύνατη η αποθήκευση του %s χρήστη, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:393 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "αδύνατη η αποθήκευση του gid %u, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:429 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "αδύνατη η αποθήκευση ομάδας %s, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:592 plugins/sudoers/pwutil.c:614 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "αδύνατη η αποθήκευση καταλόγου ομάδας %s, υπάρχει ήδη" + +#: plugins/sudoers/pwutil.c:612 +#, c-format +msgid "unable to parse groups for %s" +msgstr "αδύνατη η ανάλυση ομάδων για %s" + +#: plugins/sudoers/set_perms.c:124 plugins/sudoers/set_perms.c:449 +#: plugins/sudoers/set_perms.c:852 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1441 +msgid "perm stack overflow" +msgstr "υπερχείλιση στοίβας perm" + +#: plugins/sudoers/set_perms.c:132 plugins/sudoers/set_perms.c:457 +#: plugins/sudoers/set_perms.c:860 plugins/sudoers/set_perms.c:1157 +#: plugins/sudoers/set_perms.c:1449 +msgid "perm stack underflow" +msgstr "υποχείλιση στοίβας perm" + +#: plugins/sudoers/set_perms.c:191 plugins/sudoers/set_perms.c:504 +#: plugins/sudoers/set_perms.c:1208 plugins/sudoers/set_perms.c:1481 +msgid "unable to change to root gid" +msgstr "αδύνατη η αλλαγή σε gid υπερχρήστη" + +#: plugins/sudoers/set_perms.c:280 plugins/sudoers/set_perms.c:601 +#: plugins/sudoers/set_perms.c:989 plugins/sudoers/set_perms.c:1285 +msgid "unable to change to runas gid" +msgstr "αδύνατη η αλλαγή σε gid runas" + +#: plugins/sudoers/set_perms.c:292 plugins/sudoers/set_perms.c:613 +#: plugins/sudoers/set_perms.c:999 plugins/sudoers/set_perms.c:1295 +msgid "unable to change to runas uid" +msgstr "αδύνατη η αλλαγή σε uid runas" + +#: plugins/sudoers/set_perms.c:310 plugins/sudoers/set_perms.c:631 +#: plugins/sudoers/set_perms.c:1015 plugins/sudoers/set_perms.c:1311 +msgid "unable to change to sudoers gid" +msgstr "αδύνατη η αλλαγή σε gid χρηστών sudo" + +#: plugins/sudoers/set_perms.c:363 plugins/sudoers/set_perms.c:702 +#: plugins/sudoers/set_perms.c:1061 plugins/sudoers/set_perms.c:1357 +#: plugins/sudoers/set_perms.c:1525 +msgid "too many processes" +msgstr "υπερβολικά πολλές διεργασίες" + +#: plugins/sudoers/set_perms.c:1595 +msgid "unable to set runas group vector" +msgstr "αδύνατος ο ορισμός διανύσματος ομάδας runas" + +#: plugins/sudoers/sssd.c:252 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "αδύνατη η αρχικοποίηση πηγής SSS. Είναι το SSSD εγκατεστημένο στο μηχάνημά σας;" + +#: plugins/sudoers/sssd.c:259 plugins/sudoers/sssd.c:267 +#: plugins/sudoers/sssd.c:275 plugins/sudoers/sssd.c:283 +#: plugins/sudoers/sssd.c:291 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "αδύνατη η εύρεση συμβόλου \"%s\" στο %s" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Συμφωνία προεπιλεγμένων καταχωρίσεων για %s στο %s:\n" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas και προεπιλεγμένες ειδικές εντολές για το %s:\n" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Ο χρήστης %s μπορεί να εκτελέσει τις παρακάτω εντολές στο %s:\n" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Ο χρήστης %s δεν επιτρέπεται να εκτελέσει sudo στο %s.\n" + +#: plugins/sudoers/sudoers.c:154 plugins/sudoers/sudoers.c:188 +#: plugins/sudoers/sudoers.c:675 +msgid "problem with defaults entries" +msgstr "πρόβλημα με τις προεπιλεγμένες καταχωρίσεις" + +#: plugins/sudoers/sudoers.c:160 +msgid "no valid sudoers sources found, quitting" +msgstr "δεν βρέθηκαν έγκυρες πηγές χρηστών sudo, έξοδος" + +#: plugins/sudoers/sudoers.c:222 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "οι χρήστες sudo καθορίζουν ότι ο υπερχρήστης δεν επιτρέπεται να εκτελέσει sudo" + +#: plugins/sudoers/sudoers.c:261 +msgid "you are not permitted to use the -C option" +msgstr "δεν επιτρέπετε να χρησιμοποιήσετε την επιλογή -C" + +#: plugins/sudoers/sudoers.c:314 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "κάτοχος χρονικής σήμανσης (%s): Δεν υπάρχει τέτοιος χρήστης" + +#: plugins/sudoers/sudoers.c:328 +msgid "no tty" +msgstr "χωρίς tty" + +#: plugins/sudoers/sudoers.c:329 +msgid "sorry, you must have a tty to run sudo" +msgstr "συγνώμη, πρέπει να έχετε ένα tty για να εκτελέσετε sudo" + +#: plugins/sudoers/sudoers.c:377 +msgid "command in current directory" +msgstr "εντολή στο τρέχοντα κατάλογο" + +#: plugins/sudoers/sudoers.c:394 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "συγνώμη, δεν σας επιτρέπεται να διατηρήσετε το περιβάλλον" + +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/visudo.c:326 +#: plugins/sudoers/visudo.c:590 +#, c-format +msgid "unable to stat %s" +msgstr "αδύνατο να εκτελεστεί stat %s" + +#: plugins/sudoers/sudoers.c:728 +#, c-format +msgid "%s is not a regular file" +msgstr "το %s δεν είναι ένα κανονικό αρχείο" + +#: plugins/sudoers/sudoers.c:731 plugins/sudoers/timestamp.c:283 toke.l:923 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "το %s κατέχεται από uid %u, θα έπρεπε να είναι %u" + +#: plugins/sudoers/sudoers.c:735 toke.l:930 +#, c-format +msgid "%s is world writable" +msgstr "Το %s είναι εγγράψιμο από όλους" + +#: plugins/sudoers/sudoers.c:738 toke.l:935 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "το %s κατέχεται από gid %u, θα έπρεπε να είναι %u" + +#: plugins/sudoers/sudoers.c:764 +#, c-format +msgid "only root can use `-c %s'" +msgstr "μόνο ο υπερχρήστης μπορεί να χρησιμοποιήσει `-c %s'" + +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:783 +#, c-format +msgid "unknown login class: %s" +msgstr "άγνωστη κλάση σύνδεσης: %s" + +#: plugins/sudoers/sudoers.c:815 +#, c-format +msgid "unable to resolve host %s" +msgstr "αδύνατη η επίλυση οικοδεσπότη %s" + +#: plugins/sudoers/sudoers.c:878 plugins/sudoers/testsudoers.c:387 +#, c-format +msgid "unknown group: %s" +msgstr "άγνωστη ομάδα: %s" + +#: plugins/sudoers/sudoreplay.c:274 +#, c-format +msgid "invalid filter option: %s" +msgstr "άκυρη επιλογή φίλτρου: %s" + +#: plugins/sudoers/sudoreplay.c:287 +#, c-format +msgid "invalid max wait: %s" +msgstr "άκυρη μέγιστη αναμονή: %s" + +#: plugins/sudoers/sudoreplay.c:293 +#, c-format +msgid "invalid speed factor: %s" +msgstr "άκυρος συντελεστής ταχύτητας: %s" + +#: plugins/sudoers/sudoreplay.c:296 plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s έκδοση %s\n" + +#: plugins/sudoers/sudoreplay.c:328 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/χρονισμός: %s" + +#: plugins/sudoers/sudoreplay.c:334 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/χρονισμός: %s" + +#: plugins/sudoers/sudoreplay.c:350 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "Αναπαράγεται η συνεδρία sudo: %s\n" + +#: plugins/sudoers/sudoreplay.c:356 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Προειδοποίηση: το τερματικό σας είναι υπερβολικά μικρό για σωστή επανάληψη του ημερολογίου.\n" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Η γεωμετρία του ημερολογίου είναι %d x %d, η γεωμετρία του τερματικού σας είναι %d x %d." + +#: plugins/sudoers/sudoreplay.c:412 +msgid "unable to set tty to raw mode" +msgstr "αδύνατος ο ορισμός σε ακατέργαστη κατάσταση" + +#: plugins/sudoers/sudoreplay.c:443 +#, c-format +msgid "invalid timing file line: %s" +msgstr "άκυρη γραμμή αρχείου χρονισμού: %s" + +#: plugins/sudoers/sudoreplay.c:649 plugins/sudoers/sudoreplay.c:674 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "ασαφής παράσταση \"%s\"" + +#: plugins/sudoers/sudoreplay.c:696 +msgid "unmatched ')' in expression" +msgstr "ασύμφωνο ')' σε παράσταση" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "άγνωστος όρος αναζήτησης \"%s\"" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "το %s απαιτεί ένα όρισμα" + +#: plugins/sudoers/sudoreplay.c:718 plugins/sudoers/sudoreplay.c:1090 +#, c-format +msgid "invalid regular expression: %s" +msgstr "άκυρη κανονική έκφραση: %s" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "αδύνατη η ανάλυση ημερομηνίας \"%s\"" + +#: plugins/sudoers/sudoreplay.c:733 +msgid "unmatched '(' in expression" +msgstr "ασύμφωνο '(' σε παράσταση" + +#: plugins/sudoers/sudoreplay.c:735 +msgid "illegal trailing \"or\"" +msgstr "απαράδεκτο τελικό \"or\"" + +#: plugins/sudoers/sudoreplay.c:737 +msgid "illegal trailing \"!\"" +msgstr "απαράδεκτο τελικό \"!\"" + +#: plugins/sudoers/sudoreplay.c:790 +#, c-format +msgid "unknown search type %d" +msgstr "άγνωστος τύπος αναζήτησης %d" + +#: plugins/sudoers/sudoreplay.c:827 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: άκυρο αρχείο ημερολογίου" + +#: plugins/sudoers/sudoreplay.c:845 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: το πεδίο σήμανσης χρόνου λείπει" + +#: plugins/sudoers/sudoreplay.c:852 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: η σήμανση χρόνου %s: %s" + +#: plugins/sudoers/sudoreplay.c:859 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: το πεδίο χρήστη λείπει" + +#: plugins/sudoers/sudoreplay.c:867 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: το πεδίο χρήστη runas λείπει" + +#: plugins/sudoers/sudoreplay.c:875 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: το πεδίο ομάδας runas λείπει" + +#: plugins/sudoers/sudoreplay.c:1230 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "χρήση: %s [-h] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "χρήση: %s [-h] [-d dir] -l [παράσταση αναζήτησης]\n" + +#: plugins/sudoers/sudoreplay.c:1242 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - επανάληψη ημερολογίων συνεδρίας sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Επιλογές:\n" +" -d, --directory=κατάλογος καθορισμός καταλόγου για ημερολόγια συνεδρίας\n" +" -f, --filter=φίλτρο ορισμός ποιοι τύποι εισόδου/εξόδου να εμφανίζονται\n" +" -h, --help εμφάνιση μηνύματος βοήθειας και έξοδος\n" +" -l, --list κατάλογος διαθέσιμων αναγνωριστικών συνεδρίας, με προαιρετική παράσταση\n" +" -m, --max-wait=αριθ μέγιστος αριθμός δευτερολέπτων αναμονής μεταξύ συμβάντων\n" +" -s, --speed=αριθ επιτάχυνση ή επιβράδυνση εξόδου\n" +" -V, --version εμφάνιση πληροφοριών έκδοσης και έξοδος" + +#: plugins/sudoers/testsudoers.c:326 +msgid "\thost unmatched" +msgstr " ασύμφωνος οικοδεσπότης" + +#: plugins/sudoers/testsudoers.c:329 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Επιτρεπόμενη εντολή" + +#: plugins/sudoers/testsudoers.c:330 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Απαγορευμένη εντολή" + +#: plugins/sudoers/testsudoers.c:330 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"ασύμφωνη εντολή" + +#: plugins/sudoers/timestamp.c:191 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "αδύνατη η περικοπή αρχείου σήμανσης χρόνου σε %lld ψηφιολέξεις" + +#: plugins/sudoers/timestamp.c:291 +#, c-format +msgid "%s is group writable" +msgstr "το %s είναι εγγράψιμη ομάδα" + +#: plugins/sudoers/timestamp.c:311 +#, c-format +msgid "timestamp path too long: %s/%s" +msgstr "η διαδρομή χρονικής σήμανσης είναι υπερβολικά μεγάλη: %s/%s" + +#: plugins/sudoers/timestamp.c:484 +msgid "ignoring time stamp from the future" +msgstr "να αγνοείται η χρονική σήμανση στο μέλλον" + +#: plugins/sudoers/timestamp.c:496 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "η χρονική σήμανση υπερβολικά μακρινή στο μέλλον: %20.20s" + +#: plugins/sudoers/timestamp.c:596 plugins/sudoers/timestamp.c:618 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "η διαδρομή κατάστασης οδηγίας υπερβολικά μεγάλη: %s/%s" + +#: plugins/sudoers/toke_util.c:176 +msgid "fill_args: buffer overflow" +msgstr "fill_args: υπερχείλιση ενδιάμεσης μνήμης" + +#: plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "γραμματική %s έκδοση %d\n" + +#: plugins/sudoers/visudo.c:257 plugins/sudoers/visudo.c:543 +#, c-format +msgid "press return to edit %s: " +msgstr "πατήστε return για να επεξεργαστείτε το %s: " + +#: plugins/sudoers/visudo.c:342 plugins/sudoers/visudo.c:348 +msgid "write error" +msgstr "σφάλμα εγγραφής" + +#: plugins/sudoers/visudo.c:430 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "αδύνατη η εκτέλεση stat προσωρινού αρχείου (%s), το %s δεν άλλαξε" + +#: plugins/sudoers/visudo.c:435 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "προσωρινό αρχείο μηδενικού μήκους (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:441 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "αποτυχία επεξεργασίας του (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:463 +#, c-format +msgid "%s unchanged" +msgstr "αμετάβλητο %s" + +#: plugins/sudoers/visudo.c:488 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "αδύνατο το ξαναάνοιγμα του προσωρινού αρχείου (%s), το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:498 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "αδύνατη η ανάλυση του προσωρινού αρχείου (%s), άγνωστο σφάλμα" + +#: plugins/sudoers/visudo.c:534 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "εσωτερικό σφάλμα, αδύνατη η εύρεση του %s στον κατάλογο!" + +#: plugins/sudoers/visudo.c:592 plugins/sudoers/visudo.c:601 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "αδύνατος ο ορισμός (uid, gid) του %s στο (%u, %u)" + +#: plugins/sudoers/visudo.c:596 plugins/sudoers/visudo.c:606 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "αδύνατη η αλλαγή κατάστασης του %s στο 0%o" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "τα %s και %s δεν έχουν το ίδιο σύστημα αρχείων, χρησιμοποιήστε το mv για μετονομασία" + +#: plugins/sudoers/visudo.c:637 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "αποτυχία εντολής: '%s %s %s', το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:647 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "σφάλμα μετονομασίας του %s, το %s αμετάβλητο" + +#: plugins/sudoers/visudo.c:709 +msgid "What now? " +msgstr "Τι να γίνει τώρα; " + +#: plugins/sudoers/visudo.c:723 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Οι επιλογές είναι:\n" +" (e)dit νέα επεξεργασία του αρχείου χρηστών sudo\n" +" e(x)it έξοδος χωρίς αποθήκευση αλλαγών στο αρχείο χρηστών sudo\n" +" (Q)uit έξοδος και αποθήκευση αλλαγών στο αρχείο χρηστών sudo (ΚΙΝΔΥΝΟΣ!)\n" + +#: plugins/sudoers/visudo.c:771 +#, c-format +msgid "unable to run %s" +msgstr "αδύνατη η εκτέλεση του %s" + +#: plugins/sudoers/visudo.c:797 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: εσφαλμένος κάτοχος (uid, gid) πρέπει να είναι (%u, %u)\n" + +#: plugins/sudoers/visudo.c:804 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: εσφαλμένα δικαιώματα, πρέπει να είναι κατάσταση 0%o\n" + +#: plugins/sudoers/visudo.c:829 plugins/sudoers/visudo_json.c:1008 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "αποτυχία ανάλυσης αρχείου %s, άγνωστο σφάλμα" + +#: plugins/sudoers/visudo.c:845 plugins/sudoers/visudo_json.c:1017 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "ανάλυση σφάλματος στο %s κοντά στη γραμμή %d\n" + +#: plugins/sudoers/visudo.c:848 plugins/sudoers/visudo_json.c:1020 +#, c-format +msgid "parse error in %s\n" +msgstr "ανάλυση σφάλματος %s\n" + +#: plugins/sudoers/visudo.c:856 plugins/sudoers/visudo.c:863 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: επιτυχής ανάλυση\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s busy, try again later" +msgstr "το %s είναι απασχολημένο, ξαναδοκιμάστε αργότερα" + +#: plugins/sudoers/visudo.c:953 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "ο συγκεκριμένος επεξεργαστής (%s) δεν υπάρχει" + +#: plugins/sudoers/visudo.c:976 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "αδύνατο να εκτελέσουμε stat στον επεξεργαστή (%s)" + +#: plugins/sudoers/visudo.c:1024 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "δεν βρέθηκε κανένας επεξεργαστής (διαδρομή επεξεργαστή = %s)" + +#: plugins/sudoers/visudo.c:1117 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "Σφάλμα: κύκλος στο %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1118 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "Προειδοποίηση: κύκλος στο %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1124 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "Σφάλμα: αναφέρθηκε το %s_Alias `%s', αλλά δεν ορίστηκε" + +#: plugins/sudoers/visudo.c:1125 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "Προειδοποίηση: αναφέρθηκε το %s_Alias `%s', αλλά δεν ορίστηκε" + +#: plugins/sudoers/visudo.c:1267 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "%s: αχρησιμοποίητο %s_Alias %s" + +#: plugins/sudoers/visudo.c:1329 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - ασφαλής επεξεργασία του αρχείου χρηστών sudo\n" +"\n" + +#: plugins/sudoers/visudo.c:1331 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=file specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=file export sudoers in JSON format" +msgstr "" +"\n" +"Επιλογές:\n" +" -c, --check κατάσταση μόνο ελέγχου\n" +" -f, --file=αρχείο καθορισμός θέσης αρχείου χρηστών sudo\n" +" -h, --help εμφάνιση μηνύματος βοήθειας και έξοδος\n" +" -q, --quiet λιγότερο αναλυτική (αθόρυβη) σύνταξη μηνυμάτων σφαλμάτων\n" +" -s, --strict αυστηρός έλεγχος σύνταξης\n" +" -V, --version εμφάνιση πληροφοριών έκδοσης και έξοδος\n" +" -x, --export=αρχείο εξαγωγή χρηστών sudo σε μορφή JSON" + +#: toke.l:894 +msgid "too many levels of includes" +msgstr "περιλαμβάνει υπερβολικά πολλά επίπεδα" diff --git a/utsudo-0.0.2/plugins/sudoers/po/eo.mo b/utsudo-0.0.2/plugins/sudoers/po/eo.mo new file mode 100644 index 0000000000000000000000000000000000000000..ad2b2c2a74a72583f39a92d2bb57ca1c7833fed7 GIT binary patch literal 48204 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, 2012, 2019. +# Felipe Castro , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-26 17:40-0400\n" +"Last-Translator: Keith Bowes \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.7\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "sintaksa eraro" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Pasvorto de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] pasvorto por %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Pasvorto: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SEKURECO: informoj por %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Malĝuste, reprovu." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "ne eblas rezervi memoron" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "resumo postulas vojnomon" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "malvalida valoro notafter" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "validiga valoro notafter" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "eksvalidiĝo-valoro tro grandas" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "malvalida eksvalidiĝo-valoro" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Kromnomo \"%s\" jam ekzistas" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "ne eblas forki" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "ne eblas ŝanĝi pasvorton por %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "ne eblas akiri ensalutan klason por uzanto %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "ne eblas komenci bsd-aŭtentikigon" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "malvalida aŭtentikiga tipo" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "ne eblas komenci BSD-aŭtentikigon" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "via konto ekzvalidiĝis" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "aprobo malsukcesis" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "ne eblas legi fwtk-agordon" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "ne eblas konektiĝi al aŭtentikiga servilo" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "konekto al aŭtentikiga servilo perdita" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"eraro de aŭtentikiga servilo:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s ne eblas konverti ĉefon al ĉeno ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ne eblas analizi: '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: ne eblas trovi ccache-on: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: ne eblas generi elektojn: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: ne eblas akiri atestilojn: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: ne eblas ekigi atestilan kaŝmemoron: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: ne eblas konservi atestilon en kaŝmemoro: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ne eblas atingi gastiganton ĉefan: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Ne eblas kontroli TGT! Ebla atako!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "ne eblas ekigi PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Eraro de aŭtentikiga servilo: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "malsukceso ĉe konta validigo, ĉu via konto estas ŝlosita?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto aŭ pasvorto eksvalidiĝis, restarigu vian pasvorton kaj reprovu" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "ne eblas ŝanĝi eksvalidan pasvorton: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Pasvorto eksvalidiĝis, kontaktu vian sistemestron" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto eksvalidiĝis aŭ PAM-agordon malhavas sekcion \"account\" por sudo, kontaktu vian sistemestron" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Eraro de administro de konto PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vi ne ekzistas en la datumbazo %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "malsukcesis ekigi la bibliotekon de la API ACE" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "ne eblas kontakti la servilon de SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Uzanto-identigilo ŝlosita pro Aŭtentikigo SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "malvalida salutnoma longo por SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "malvalida Aŭtentikiga Traktilo por SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Komunikiĝo kun SecurID malsukcesis" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "nekonata SecurID-eraro" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "malvalida paskoda longo por SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "ne eblas ekigi SIA-seascon" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "malvalidaj aŭtentikigaj metodoj" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Nevalidaj aŭtentikigaj metodoj kompilitaj en sudo! Vi ne rajtas miksi dependan kaj sendependan aŭtentikigon." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "neniu aŭtentikiga metodo" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ekzistas neniaj aŭtentikigaj metodoj kompilitaj en sudo! Se vi volas malŝalti aŭtentikigon, uzu la agordan parametron --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Ne eblas komenci aŭtentikigajn metodojn." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Aŭtentikigaj metodoj:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Ne eblis determini revizian kondiĉon" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "ne eblis konservi revizian rikordon" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ni fidas, ke vi ricevis la kutiman admonojn de la loka\n" +"sistemestro. Resume memoru la jenajn punktojn:\n" +"\n" +" #1) Estimu la privatecon de aliaj.\n" +" #2) Pensu antaŭ ol tajpi.\n" +" #3) Granda povo devigas grandan responson.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "nekonata uid: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "nekonata uzanto: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "alkremento de ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "komenca ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "ŝtopado de ordo: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s eldono %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s gramatika eldono %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nesubtenata enig-formo %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nesubtenata elig-formo %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: eliga kaj eniga dosieroj devas esti malsamaj" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "ne eblas ekigi aŭtomatajn valorojn de sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nekonata ŝlosilvorto: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "malvalida defaŭlto-tipo: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "malvalida demeto-tipo: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "malvalida filtro: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "ne eblas malfermi: %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "malsukcesis analizi dosieron %s, nekonata eraro" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "analiza eraro en %s proksime al linio %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "analiza eraro en %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "ne eblas skribi al %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverti inter dosierformoj de sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Modifiloj:\n" +" -b, --base=DN la baza DN por petoj de sudo LDAP\n" +" -c, --config=agordo la vojo al la agordo-dosiero\n" +" -d, --defaults=deftipoj nur konverti Defaŭltojn el la indikitaj tipoj\n" +" -e, --expand-aliases disvolvigi kromnomojn dum konverto\n" +" -f, --output-format=formo difini elig-formon: JSON, LDIF aŭ sudoers\n" +" -i, --input-format=formo difini enig-formon: LDIF aŭ sudoers\n" +" -I, --increment=num kiom alkrementi po ĉiu sudoOrder\n" +" -h, --help montri helpmesaĝo kaj eliri\n" +" -m, --match=filtro nur konverti enigojn kiuj akordas al la filtro\n" +" -M, --match-local akordo-filtro uzas datumbazojn de passwd kaj de group\n" +" -o, --output=elig_dosiero skribi konvertitan sudoers al elig-dosiero\n" +" -O, --order-start=num ekpunkto por la unua sudoOrder\n" +" -p, --prune-matches pritondi nekongruantajn uzantojn, grupojn kaj gastigantojn\n" +" -P, --padding=num baza ŝtopo por alkremento de sudoOrder\n" +" -s, --suppress=sekcioj demeti eligon el kelkaj sekcioj\n" +" -V, --version montri informon pri versio kaj eliri" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "en defaults estas nekonata enigo \"%s\"" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "ne eblas atingi GMT-tempon" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "ne eblas aranĝi tempo-indikilon" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "interna eraro, troo en %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "tro multaj enigoj de sudoers, maksimume %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la medivariablo SUDOERS_BASE ne estas difinita kaj la modifilo -b ne estis indikata." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-trajto se syslog estas uzata por protokoli: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritato por uzi, kiam uzanto sukcese aŭtentikiĝas: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritato por uzi kiam uzanto malsukcese aŭtentikigas: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Meti OTP-demandilon en sia propra linio" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignori '.' en $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Ĉiam sendi retmesaĝon kiam sudo plenumiĝas" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Sendi retmesaĝon se uzanto-aŭtentikiĝo malsukcesas" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Sendi retmesaĝon se la uzanto ne estas en sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Sendi retmesaĝon se la uzanto ne estas en sudors por la gastiganto" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Sendi retmesaĝon se la uzanto ne estas permesata plenumigi komandon" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Sendi retmesaĝon se la uzanto provi plenumigi komandon" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Uzi apartan tempo-indikilon por ĉiu uzanto/tty-kombino" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Averti uzanton dum la unua fojo ĝi plenumigas je sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Dosiero havanta la sudo-averton: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Postulas, ke uzantoj aŭtentikiĝu aŭtomate" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Ĉefuzanto rajtas plenumigi: sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Protokoli la gastignomon en la (ne syslog) protokolo" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Protokoli la jaron en la (ne syslog) protokolo" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo estas vokata kun neniuj parametroj, komencu ŝelon" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Valorizi medivariablon $HOME al la cela uzanto dum komenci ŝelon kun -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ĉiam valorizi medivariablon $HOME al la hejma dosierujo de la cela uzanto" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permesi, ke iu informokolektado por doni utilajn eraromesaĝojn" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Postuli tute kvalifikitajn gastiganto-nomojn en la dosiero sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulti la uzanton, kiam si enmetas malĝustan pasvorton" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Nur permesi, ke uzanto plenumigu sudo-on se si havas tty-on" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo honoru la medivariablon EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Peti la ĉefuzantan pasvorton, ne la uzanto-pasvorton" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Peti la pasvorton de runas_default, ne de la uzanto" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Peti la pasvorton de la cela uzanto, ne la nuna uzanto" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Apliki aŭtomataĵojn en la ensaluta klaso de la cela uzanto, se ĝi ekzistas" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Valorizi la medivariablojn LOGNAME kaj USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nur valorizi la efikan uid-on al la cela uzanto, ne la realan uid-on" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne ekigi la grupon vektoron al tio de la cela uzanto" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Longo je kiu linfaldi la protokol-dosieraj linioj (0 por senfalda): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Eksvalidiĝo de la aŭtentikiga tempo-indikilo: %.1f minutoj" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Eksvalidiĝo de la pasvortilo: %.1f minutoj" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombro da provoj por enmeti pasvorton: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask uzi aŭ 07777 por uzi uzanton: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Vojo al protokolo: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Vojo al retpoŝtilo: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Parametroj por retpoŝtilo: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Retpoŝtadreso adresata: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Retpoŝtadreso adresanta: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Subjekta linio por ĉiuj mesaĝoj: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Neĝusta pasvorta mesaĝo: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Vojo al dosierujo de prelega stato: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Vojo al dosierujo de aŭtentikiga tempo-indikilo: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Estro de la dosierujo de aŭtentikiga tempo-indikilo: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uzantoj en la grupo en devas plenumi la postulojn de pasvorto kaj PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Defaŭlta pasvorta peto: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se aktivigita, passprompt superregas sistemajn invitojn ĉiuokaze." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Defaŭlta uzanto por plenumigi komandojn: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valoro per kiu superregi la PATH-on de uzanto: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Vojo al la tekstoredaktilo uzota de visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kiam postuli pasvorton por la pseŭdokomando 'list' : %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kiam postuli pasvorton por la pseŭdokamando 'verify' : %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Anstaŭŝargi la falsan exec-funkciojn enhavatajn en la biblioteko sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se LDAP-dosierujo estas aktiva, ni ignoru la lokan suders-dosieron" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Dosiero-priskribiloj >= %d fermiĝos antaŭ ol plenumigi komandon" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Se aktiva, uzantoj rajtas superregi la voloron de `closefrom' per la parametro -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permesi, ke uzantoj valorizu arbitrajn medivariablojn" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Restarigi la medion al apriora aro da variabloj" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Medivariabloj por kontroli por sano:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Medivariabloj por forigi:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Medivariabloj konservi:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolo por uzi en la nova sekureca kunteksto: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-tipo por uzi en la nova sekureca kunteksto: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Vojo al media dosiero specifa al sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Vojo al la neatingebla sudo-specifa medio-dosiero: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokaĵaro por uzi dum analizi dosieron sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permesi, ke sudo peti pasvorton eĉ se ĝi estus videbla" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Doni vidajn indikojn je la pasvorta enmetanta kiam ekzistas enmeto" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Uzi pli rapida kunigo, kiu estas malpli ĝusta sed ne atingas la dosiersistemon" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "La umask specifa en sudors superregos tio de la uzanto, eĉ se ĝi estas pli permesema" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Protokoli enmeton de uzanto por la komando, kiun si plenumigas" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Protokoli la eligon de la komando, kiu estas plenumiĝi" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Kunpremi eneligaj protokoloj per zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Ĉiam protokoli komandojn en pseŭda tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Kromprogramo por kompreno de ne-uniksaj grupoj: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Dosierujo en kiu konservi eneligaj protokoloj: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Dosiero en kiu konservi la eneliga protokolo: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Aldoni eron al la utmp/utmpx-dosiero dum generi pty-on" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Valorizi uzanton en utmp al la plenumigkiela uzanto, ne la vokanta uzanto" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Aro da permesitaj privilegioj: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Aro da limigaj privilegioj: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Plenumigi komandojn en pty en la fono" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-servonomo uzota: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-servonomo uzota por ensalutaj ŝeloj: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Ne eblas establi PAM-atestilojn por la cela uzanto" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Krei novan PAM-seancon en kiu la komando plenumiĝos" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Administradi validigon de konto PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maksimuma sinsekva numero de la en/eliga protokolo: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Aktivigi retgrupan regon de sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroli gepatrajn dosierujojn pri skribeblo dum redakto de dosieroj per sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Sekvi simbolajn ligojn dum redakto de dosieroj per sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Informo-mendi la grupan kromprogramon por nekonataj sistem-grupoj" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Kongrui retgrupoj surbaze de entuta n-opo: uzanto, gastiganto kaj domajno" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la ekzamena protokolo" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la eneliga protokolo" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permesi ke komandoj estu plenumataj eĉ se sudo ne povas skribi al la protokola dosiero" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Solvi grupojn en sudoers kaj kongrui al la grupa ID, ne la nomo" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Protokoleroj pli grandaj ol tiu ĉi valoro estos dividitaj en multoblajn mesaĝojn en syslog: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Uzanto kiu posedos la eneligajn protokol-dosierojn: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo kiu posedos la eneligajn protokol-dosierojn: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Dosier-reĝimo uzota por la eneligaj protokol-dosieroj: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Plenumigi komandojn laŭ dosiernumero anstataŭ laŭ vojo: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignori nekonatajn erojn Defaults en sudoers anstataŭ prezenti averton" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo laŭ sekundoj pust kiu la komando finiĝos: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permesi al la uzanto specifi eksvalidiĝon per la komandlinio" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tuj elbufrigi eneligo-protokolajn datumojn en diskon anstataŭ enbufrigi ĝin" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Inkluzivigi la procezan identigilon dum protokoli per syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de tempindika rikordo por aŭtentikigo: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mesaĝo pri malsukceso dum aŭtentikigo: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Preteratenti usklecon dum kongruo al uzantnomoj" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Preteratenti usklecon dum kongruo al grupnomoj" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Protokoli kiam komando estas permesata de sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Protokoli kiam komando estas malpermesata de sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d nekonata enigo de defaults \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nekonata enigo de defaults \"%s\"" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d neniu valoro indikita por \"%s\"" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: neniu valoro indikita por \"%s\"" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d valoroj por \"%s\" devas komenciĝi per '/'" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: valoroj por \"%s\" devas komenciĝi per '/'" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d parametro \"%s\" ne povas havi valoron" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: parametro \"%s\" ne povas havi valoron" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d malvalida Defaults-tipo 0x%x por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: malvalida Defaults-tipo 0x%x por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d valoro \"%s\" estas malvalida por parametro \"%s\"" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: valoro \"%s\" estas malvalida por parametro \"%s\"" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: medio tro granda" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "ne eblas rekonstrui la medion" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "bedaŭre vi ne estas permesata valorizi la jenajn medivariablojn: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "analiza eraro en %s proksime al linio %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "analiza eraro en %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nekonata resuma tipo %d por %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: lega eraro" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s devas esti estrata de uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s devas esti skribebla nur de estro" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "ne eblas ŝarĝi je %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "ne eblas trovi simbolon \"group_plugin\" en %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekongrua grupa kromprogramo: ĉefa eldono %d, atendita %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "ne eblas trakti IP-adreson \"%s\"" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "ne eblas trakti retmaskon \"%s\"" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Loka IP-adresa kaj retmaska paroj:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s ekzistas sed ne dosierujo (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "ne eblas mkdir-i: %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "ne eblas ŝanĝi reĝimon de %s al 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "nekonata grupo: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "ne eblas legi %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "ne eblas krei: %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "ne eblas skribi al eneliga protokoldosiero: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: interna eraro, protokola dosiero de en/eligo por evento %d ne estas malferma" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: interna eraro, malvalida signalo %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: malvalida protokolo-dosiero" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: mankas temp-indikila kampo" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: temp-indikilo %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: mankas kampo de uzanto" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: mankas kampo de runa uzanto" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: mankas kampo de runa grupo" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls ne estas regata dum uzo de ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "ne eblas ekigi SSL-asertilon kaj ŝlosilan datumbazon: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "por uzi SSL, TLS_CERT devas havi valoron en %s" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "ne eblas ekigi LDAP-on: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls specifita sed LDAP-bibliotekoj ne havas la funkciojn ldap_start_tls_s() kaj ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "malvalida atributo de sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: pordo tro granda" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nekonata retadresa tipo de LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ne eblas miksi sekurajn kaj nesekurajn retadresojn de LDAP" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "ne eblas konverti sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "ne eblas malfermi revizian sistemon" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "ne eblas sendi revizian mesaĝon" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s: %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (komando daŭrigis) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "ne eblas malfermi protokolon: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "ne eblas ŝlosi protokolon: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "ne eblas skribi al protokolo: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Neniu uzanto aŭ gastiganto" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "validiga malsukceso" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "uzanto NE estas en sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "uzanto NE permesata en gastiganto" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "komando ne permesata" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ne estas en la dosiero sudoers. Ĉi tiu estos raportita.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s ne estas permesata plenumigi sudo-on en %s. Ĉi tio estos raportita.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Bedaŭre uzanto %s ne rajtas plenumigi sudo en %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Bedaŭre uzanto %s ne rajtas plenumigi '%s%s%s' kiel %s%s%s en %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: komando ne trovita" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ni malatentas \"%s\" trovita en '.'\n" +"Uzu \"sudo ./%s\" se tio estas la \"%s\" , kiun vi volas plenumigi." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "aŭtentiga malsukceso" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "pasvorto estas bezonata" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u malĝusta pasvorta provo" +msgstr[1] "%u malĝustaj pasvortaj provoj" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "ne eblas kopii enigon: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "ne eblas plenumigi %s-on: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "ne eblas forki: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ne eblas malfermi tubon: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "resumo por %s (%s) ne estas laŭ la formo %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "ne eblas apliki stat al %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolo: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Ero en sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Modifiloj: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Komandoj:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Kongruantaj eroj de Defaults: %s en %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Plenumigkiela komando-specifaj aŭtomataĵoj por %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Uzanto %s rajtas plenumigi la jenajn komandojn en %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uzanto %s ne rajtas plenumigi sudo-on en %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ni preteratentas malkompletan sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "malvalida LDIF-atributo: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "malvalida %.*s difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "ne eblas trakti reto-adresan liston" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "uzantnomo ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "uzanto-ID ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "grupo-ID ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "gastiganta nomo ne difinita de sudo-fasado" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "ne eblas plenumigi: %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Eldono %s de la konduta kromprogramo\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Eldono %d de la gramatikilo de sudoers\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Vojo de sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "vojo de nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "vojo de ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "vojo de ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "ne eblas registri hokon el tipo %d (versio %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "ne eblas konservi uid-on %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ne eblas konservi uid-on %u, jam ekzistas" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "ne eblas krei tenejan uzanton: %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ne eblas konservi uzanton %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "ne eblas konservi gid-on %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ne eblas konservi gid-on %u, jam ekzistas" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "ne eblas konservi grupon %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ne eblas konservi grupon %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "ne eblas konservi grupan liston por %s, jam ekzistas" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "ne eblas konservi grupliston por %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "ne eblas trakti grupon en %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "ne eblas trakti gids por %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "permeso-staka troo" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "permeso-staka maltroo" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "ne eblas ŝanĝi al radika gid" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "ne eblas ŝanĝi al plenumigkiela gid" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "ne eblas elekti vektoron de plenumigkiela grupo" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "ne eblas ŝanĝi al plenumigkiela uid" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "ne eblas ŝanĝi al gid de sudo-redaktantoj" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "tro da procezoj" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "ne eblas scii la nunan labor-dosierujon" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "tranĉita ekzamen-vojo user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "tranĉita ekzamen-vojo argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "mesaĝo audit_failure tro longas" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "ne eblas ekigi SSS-fonton. Ĉu SSSD estas instalita en via maŝino?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "ne eblas trovi simbolon \"%s\" en %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problemoj kun aŭtomataj eroj" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "ne validaj fontotekstoj de sudoers trovita, ĉesiganta" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers specifas, ke ĉefuzanto ne rajtas sudo-i" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "vi ne rajtas uzi la parametron -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tempo-indikila posedanto (%s): Nenia uzanto" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "neniu tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "bedaŭre vi devas havi tty-on por plenumigi sudo-on" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "komando en nuna dosierujo" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "bedaŭre vi ne rajtas elekti komando-eksvalidiĝo" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "bedaŭre vi ne rajtas konservi la medion" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "komando tro longas" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ne estas normala dosiero" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s estas estrita de uid %u, devas esti %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s estas skribebla de ĉiuj" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s estas estrita de gid %u, devas esti %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "nur ĉefuzanto rajtas uzi \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "nekonata ensaluta klaso: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "ne eblas trovi gastiganton %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "malvalida filtrila elekto: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "malvalida maksimuma atendo: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "malvalida rapida faktoro: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s tempo-registrado: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tempo-registrado: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/tempo-registrado: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Refaranta sudo-seancon: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "ne eblas aldoni eventon al atendovico" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "ne eblas elekti tty-on en nudan reĝimon" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Averto: via terminalo estas tro malgranda por konvene reskribi la protokolon.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Protokola grando estas %dx%d, sed via terminala grando estas %dx%d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Refarado finita, premu iu ajn klavon por restarigi la terminalon." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "malvalida linio en la tempo-registran dosieron: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "ambigua esprimo \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "mankas krampo kongruanta al ')' en esprimo" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nekonata serĉaĵo \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s bezonas parametron" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "malvalida regulesprimo: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "ne eblis analizi daton \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "mankas krampo kongruanta al '(' en esprimo" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "malvalida posta \"or\"" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "malvalida posta \"!\"" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "nekonata serĉtipo %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uzado: %s [-hnRS] [-d ujo] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uzado: %s [-h] [-d ujo] -l [serĉaĵo]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - refari sudo-seancajn protokolojn\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Modifiloj:\n" +" -d ,--directory=ujo specifi dosierujon por seancaj protokoloj\n" +" -f, --filter=filtrilo specifi kiajn eneligajn tipo(j)n por montri\n" +" -h, --help montri helpan mesaĝon kaj eliri\n" +" -l, --list listigi haveblajn seancajn ID, kun nedeviga esprimo\n" +" -m, --max-wait=num maksimuma nombro da sekundoj por atendi inter okazoj\n" +" -n, --non-interactive neniu invito, seanco estas sendata al la norma eligo\n" +" -R, --no-resize ne provi regrandigi la terminalon\n" +" -S, --suspend-wait atendi dum la komando estas paŭzigita\n" +" -s, --speed=num rapidigi aŭ malrapidigi eligon\n" +" -V, --version eligi eldonan informon kaj eliri" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\thost sen egalo" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Komando permesata" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Komando rifuzata" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Komando sen egalo" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s estas skribebla de la grupo" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "ne eblas mallongigi tempo-indikilan dosieron ĝis %lld bajtoj" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "ne eblas legi la horloĝon" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "ignoranta tempo-indikilon el la estonteco" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tempo-indikilo tro estonte: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "ne eblas ŝlosi tempo-indikilan dosieron %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "vojo de prelega stato tro longas: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "la domifilo -x estos forigita en posta eldono" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "bonvolu konsideri uzi la utilaĵon cvtsudoers anstataŭe" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "premu enen-klavon por redakti %s-on: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "specifita tekstoredaktilo (%s) ne ekzistas" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "neniu tekstoredaktilo trovita (vojo = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "skriba eraro" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "ne eblas apliki stat al provizora dosiero (%s), %s neŝanĝita" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "nul-longa provizora dosiero (%s), %s neŝanĝita" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redaktilo (%s) malsukcesis, %s neŝanĝita" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s neŝanĝita" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "ne eblas remalfermi provizoran dosieron (%s), %s neŝanĝita." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "ne eblas analizi provizoran dosieron (%s), nekonata eraro" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "interna eraro, ne eblas trovi %s en listo!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "ne eblas ŝanĝi (uid, gid) de %s al (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s kaj %s ne estas la sama dosiersistemo, uzanta mv-on por alinomi" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "komando malsukcesis: '%s %s %s', %s neŝanĝita" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "eraro dum alinomi %s-on; %s neŝanĝita" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Kion nun? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Elektoj estas:\n" +" r(e)dakti refoje sudoers-dosieron\n" +" (x) eliri sen konservi ŝanĝojn al sudoers-dosiero\n" +" (Q) Eliri kaj konservi ŝanĝojn al sudoers-dosiero (DANĜERA!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "ne eblas plenumigi: %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: malĝusta estro (uid, gid) devas esti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: misaj permesoj, devas esti reĝimo 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: analizita senerare\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s okupata, reprovu pli malfrue" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "ne eblas ŝlosi: %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Ĉu redakti ja? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Eraro: %s:%d ciklo en %s \"%s\"" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Averto: %s:%d ciklo en %s \"%s\"" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Eraro: %s:%d %s \"%s\" estas referencita sed ne difinita" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Averto: %s:%d %s \"%s\" estas referencita sed ne difinita" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Averto: %s:%d neuzata %s \"%s\"" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sekure redakti la dosieron sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Modifiloj:\n" +" -c, --check nur kontroli\n" +" -f, --file=sudoers indiki lokon de la dosiero sudoers\n" +" -h, --help montri helpan mesaĝon kaj eliri\n" +" -q, --quiet pli silenta (quiet) pri sintaksaj eraroj\n" +" -s, --strict severa kontrolado de sintakso\n" +" -V, --version montri eldonon kaj eliri\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "tro da niveloj de inkluzivaĵoj" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ni preteratentas malvalidan atribut-valoron: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "ne eblas konservi uzanton %s, memoro plenplena" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "ne eblas konservi grupon %s, memoro plenplena" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "ne eblas konservi grupan liston por %s, memoro plenplena" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-rolo: NEKONATA\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordo: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolo: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolo: NEKONATA\n" diff --git a/utsudo-0.0.2/plugins/sudoers/po/eu.mo b/utsudo-0.0.2/plugins/sudoers/po/eu.mo new file mode 100644 index 0000000000000000000000000000000000000000..5220f12429efe339b512093e34475ade54e20609 GIT binary patch literal 6404 zcmcJSU5s5-6~{MFQ3pXNB8sRRVeGW@&PRdT-ZIb@TBy*Ev;*`-r~BTs=g#5Yd(P#2 z%ye#I0zUWzDlwSo3t~*rL}N@8W5R=dF;QYP27SXsO^^rU3yBG6qQCz>XXf6Sw1^L$ z_RRmBz4uvref-zj>;7^3w&x7j3GSP@pT69fF8Hr){NeiUmBwrbzX#q8z6^c@d<*^uW1enapC_-d%&y)8J`P>z@MUuctx9;oG3T`#C5-y#|K7s^7O09O*X=N}pq( zczO<$ob#Y~@MTc)UaIF`t>^z%zhBN`@#!W|{2jQ#Gzq-YUb@81ySP887cSX&kXtrg!L1l5KXu7( zpXJ`heLJ@<(~(*AL15gbbY3R zz>Qrz&(-hufXcT|aEsr%a8;=BdWPN`*PT4=dB;Y}gQk0>!cqpUcdp zxaZ%cfOIus`_`H*Ju#&-->+c)LUX2o~iyMgQtxPHdGS z`OW{(Ru(`be3@;k_5R!8D{;8Y>53Ecb1EGB%o|wkXyNz&<7UHSq0t zDJEf-2#mOE5-LYrw3o-eN|PSs5sTU`5o_$ZMjO?3n1Smrx)Hg3P)CEL7sEx`twsXL ztMI5Yc(GV{W%7!Nj@{~tMTyA#6D0*^qln;ydfi%D+J2cAcG<0v4KilD(il-~QKm1- z9g8l)$rKlMN-1CI5(c}rul=t~Q`QjOclc1>vqwrn%sSo_ao^{K>kq67O=hPi^PNpg z9_A%JQ$`srraY|Ko?r1jGG<9duUAGsAI%Z_Hkr>*nTYi=LoCEGRgzO+Dd6L?)D%(@ zXNbc{PjC z8Qa2Wm#j`~Crisgty(ogsph@pyZRkBRtr?zPMlo8CzQ+#%_9|{Q0qeV(i~@n;!YJe zA$zJKt5hsAuOWzjPDL!7K2?H=?&%;@V@;V#&yb!*B;(XlH4A5-Hc-u?_(iU8Eth+9 zDoa&U8poo>qt)@zTvwtoH@$CqPa|vZnK&Jew#M%yX*GZx!Ku?hh1JY7BZLQ zoY5(cIv#g@&z|hLoTEE0V*3b_9cS3ezT5&OPiuk);<7k@oDFDeJyyo+J4%q5(ek!rI%-gx02PQTess^lY(VsZc zZ-V-kyXCkT+T3LYX_LFyb$#Y+%3nK4`w*#eU3!htiP(u-tpS->$s zBvLI4Tw^aZh@5R#0(F9=WRZS{GL*69-Un-l0z?cJJo<##FWw(T}^9cOVd z^~Ouf6F`*em0d5B9i$ID@y_c~tynizC&nk0t6Z6NxMX(-Yi92w`mr#IO(RScV^~@?bOcehTaS* z_?SX!jtnUd@sMMYIEBKUa?A}CzaCW76D?pDD_I)0tG{K2j)s$v_L#EC;Sy(YS8ZD$ zlM5YO{b-F2--hpwg*P6?7&U~A<}f~G1N;n$f?}0$hqdfkj=H$Ig=_I$509PqT{uI8 z2}#8v9JEfDiT@&3F&x(i?-9Q$z9Sh`_t)sIH+*DgNsGwYP3ZZZffki3Q6a)dP&mz? z{=I7Ts@8A01}`#KwS=1{Dtf_`_2d}k+PiBIH%Y7e zLPhdo;~Wj+wzgb`qe2n&WYHy?MyM92%At_%b?>OuRpy%U+0a5ZLT%eLP9s^5s&@*l zGT(DhVZ0QmwA4K)t!Yg1cl>e;KMZ~7(C5_P`rWIbZK-7( zei_nihlW&fu2$eHx^fEJ*uZ*8x%gmc>DE`%fzrk2F@ncrtaqXz;m0NG2#hxmxNZr< z#>eW|jmAPl8fu41lFp}&OUAy?*@$5=o*l-9G8~a`Ls-|LYpyy_evOTfVA)uS-87YN znz~rYAS&y{UTTa98m+ERUlJswXcSH*)dkF;E31w*vW#;koHAAF>nIDk#v!Bzg+o5% g8OIVV08a7M*8l(j literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/eu.po b/utsudo-0.0.2/plugins/sudoers/po/eu.po new file mode 100644 index 0000000..6fa330e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/eu.po @@ -0,0 +1,1679 @@ +# Basque translation of sudoers. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Mikel Olasagasti Uranga , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.2-rc2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2011-06-04 18:27-0400\n" +"PO-Revision-Date: 2011-06-06 19:15+0100\n" +"Last-Translator: Mikel Olasagasti Uranga \n" +"Language-Team: Basque \n" +"Language: \n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: plugins/sudoers/alias.c:122 +#, c-format +msgid "Alias `%s' already defined" +msgstr "`%s' alias-a lehendik ere definitua dago" + +#: plugins/sudoers/bsm_audit.c:58 plugins/sudoers/bsm_audit.c:61 +#: plugins/sudoers/bsm_audit.c:109 plugins/sudoers/bsm_audit.c:113 +#: plugins/sudoers/bsm_audit.c:163 plugins/sudoers/bsm_audit.c:167 +msgid "getaudit: failed" +msgstr "getaudit: huts egin du" + +#: plugins/sudoers/bsm_audit.c:87 plugins/sudoers/bsm_audit.c:148 +msgid "Could not determine audit condition" +msgstr "Ezin izan da auditoretza baldintza finkatu" + +#: plugins/sudoers/bsm_audit.c:98 +msgid "getauid failed" +msgstr "getauid-ek huts egin du" + +#: plugins/sudoers/bsm_audit.c:100 plugins/sudoers/bsm_audit.c:157 +msgid "au_open: failed" +msgstr "au_open: huts egin du" + +#: plugins/sudoers/bsm_audit.c:115 plugins/sudoers/bsm_audit.c:169 +msgid "au_to_subject: failed" +msgstr "au_to_subject: huts egin du" + +#: plugins/sudoers/bsm_audit.c:119 plugins/sudoers/bsm_audit.c:173 +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: huts egin du" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:182 +msgid "au_to_return32: failed" +msgstr "au_to_return32: huts egin du" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:185 +msgid "unable to commit audit record" +msgstr "ezin da auditoretza sarrera gorde" + +#: plugins/sudoers/bsm_audit.c:155 +msgid "getauid: failed" +msgstr "getauid: huts egin du" + +#: plugins/sudoers/bsm_audit.c:178 +msgid "au_to_text: failed" +msgstr "au_to_text: huts egin du" + +#: plugins/sudoers/check.c:141 +#, c-format +msgid "sorry, a password is required to run %s" +msgstr "barkatu, pasahitz bat behar da %s abiarazteko" + +#: plugins/sudoers/check.c:225 plugins/sudoers/iolog.c:169 +#: plugins/sudoers/sudoers.c:939 plugins/sudoers/sudoreplay.c:325 +#: plugins/sudoers/sudoreplay.c:334 plugins/sudoers/sudoreplay.c:675 +#: plugins/sudoers/sudoreplay.c:767 plugins/sudoers/visudo.c:700 +#, c-format +msgid "unable to open %s" +msgstr "ezin da %s ireki" + +#: plugins/sudoers/check.c:229 plugins/sudoers/iolog.c:199 +#, c-format +msgid "unable to write to %s" +msgstr "ezin da %s-(e)ra idatzi" + +#: plugins/sudoers/check.c:237 plugins/sudoers/check.c:475 +#: plugins/sudoers/check.c:525 plugins/sudoers/iolog.c:122 +#: plugins/sudoers/iolog.c:153 +#, c-format +msgid "unable to mkdir %s" +msgstr "ezin da mkdir %s egin" + +#: plugins/sudoers/check.c:370 +#, c-format +msgid "internal error, expand_prompt() overflow" +msgstr "barne errorea, expand_prompt() overflow" + +#: plugins/sudoers/check.c:426 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/check.c:454 plugins/sudoers/check.c:498 +#: plugins/sudoers/iolog.c:155 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existitzen da baina ez da direktorio bat (0%o)" + +#: plugins/sudoers/check.c:457 plugins/sudoers/check.c:501 +#: plugins/sudoers/check.c:546 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "%s-(r)en jabea %u uid-a da, %u uid-a beharko luke" + +#: plugins/sudoers/check.c:462 plugins/sudoers/check.c:506 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/check.c:470 plugins/sudoers/check.c:514 +#: plugins/sudoers/check.c:582 plugins/sudoers/sudoers.c:925 +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:500 +#, c-format +msgid "unable to stat %s" +msgstr "ezin da stat egin %s-(r)engan" + +#: plugins/sudoers/check.c:540 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:552 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/check.c:606 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/check.c:652 +#, c-format +msgid "unable to remove %s (%s), will reset to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:659 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:713 plugins/sudoers/check.c:719 +#, c-format +msgid "unknown uid: %u" +msgstr "uid ezezaguna: %u" + +#: plugins/sudoers/check.c:716 plugins/sudoers/sudoers.c:736 +#: plugins/sudoers/sudoers.c:802 plugins/sudoers/sudoers.c:803 +#: plugins/sudoers/sudoers.c:1056 plugins/sudoers/sudoers.c:1057 +#: plugins/sudoers/testsudoers.c:200 plugins/sudoers/testsudoers.c:330 +#, c-format +msgid "unknown user: %s" +msgstr "erabiltzaile ezezaguna: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "root-ek sudo abiarizi lezake" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo-k EDITOR ingurune aldagaia erabiliko du" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in 'noexec_file'" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "File containing dummy exec functions: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Allow sudo to prompt for a password even if it would be visisble" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Compress I/O logs using zlib" +msgstr "Trinkotu S/E gertaerak zlib erabiliz" + +#: plugins/sudoers/def_data.c:327 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Plugin for non-Unix group support" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +msgid "Directory in which to store input/output logs" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "File in which to store the input/output log" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/defaults.c:197 +msgid "" +"Available options in a sudoers ``Defaults'' line:\n" +"\n" +msgstr "" + +#: plugins/sudoers/defaults.c:204 plugins/sudoers/defaults.c:215 +#, c-format +msgid "%s: %s\n" +msgstr "%s: %s\n" + +#: plugins/sudoers/defaults.c:211 +#, c-format +msgid "%s: %.*s\n" +msgstr "%s: %.*s\n" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:249 plugins/sudoers/defaults.c:259 +#: plugins/sudoers/defaults.c:279 plugins/sudoers/defaults.c:292 +#: plugins/sudoers/defaults.c:305 plugins/sudoers/defaults.c:318 +#: plugins/sudoers/defaults.c:331 plugins/sudoers/defaults.c:351 +#: plugins/sudoers/defaults.c:361 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "`%s' balorea baliogabea da `%s' aukerarentzat" + +#: plugins/sudoers/defaults.c:252 plugins/sudoers/defaults.c:262 +#: plugins/sudoers/defaults.c:270 plugins/sudoers/defaults.c:287 +#: plugins/sudoers/defaults.c:300 plugins/sudoers/defaults.c:313 +#: plugins/sudoers/defaults.c:326 plugins/sudoers/defaults.c:346 +#: plugins/sudoers/defaults.c:357 +#, c-format +msgid "no value specified for `%s'" +msgstr "ez da baliorik ezarri `%s'-(r)entzat" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:337 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:259 +#, c-format +msgid "internal error, sudo_setenv() overflow" +msgstr "" + +#: plugins/sudoers/env.c:289 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:694 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/find_path.c:68 plugins/sudoers/find_path.c:107 +#: plugins/sudoers/find_path.c:122 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/sudoers.c:868 toke.l:663 toke.l:814 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: gram.y:103 +#, c-format +msgid ">>> %s: %s near line %d <<<" +msgstr "" + +#: plugins/sudoers/group_plugin.c:91 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:114 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:119 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:124 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:109 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:176 plugins/sudoers/sudoers.c:946 +#, c-format +msgid "unable to read %s" +msgstr "ezin da %s irakurri" + +#: plugins/sudoers/iolog.c:179 +#, c-format +msgid "invalid sequence number %s" +msgstr "" + +#: plugins/sudoers/iolog.c:225 plugins/sudoers/iolog.c:228 +#: plugins/sudoers/iolog.c:478 plugins/sudoers/iolog.c:483 +#: plugins/sudoers/iolog.c:489 plugins/sudoers/iolog.c:497 +#: plugins/sudoers/iolog.c:505 plugins/sudoers/iolog.c:513 +#: plugins/sudoers/iolog.c:521 +#, c-format +msgid "unable to create %s" +msgstr "ezin da %s sortu" + +#: plugins/sudoers/iolog_path.c:245 plugins/sudoers/sudoers.c:361 +#, c-format +msgid "unable to set locale to \"%s\", using \"C\"" +msgstr "" + +#: plugins/sudoers/ldap.c:363 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port too large" + +#: plugins/sudoers/ldap.c:386 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: out of space expanding hostbuf" + +#: plugins/sudoers/ldap.c:415 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:444 +#, c-format +msgid "invalid uri: %s" +msgstr "baliogabeko uri-a: %s" + +#: plugins/sudoers/ldap.c:450 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:454 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:536 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:932 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:938 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:946 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1044 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1539 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1541 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1588 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1596 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1983 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2014 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2245 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:55 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:79 +#, c-format +msgid "internal error, linux_audit_command() overflow" +msgstr "" + +#: plugins/sudoers/linux_audit.c:88 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:193 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:196 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:295 +msgid "user NOT in sudoers" +msgstr "erabiltzailea ez dago sudoers-en" + +#: plugins/sudoers/logging.c:297 +msgid "user NOT authorized on host" +msgstr "erabiltzailea ez dago baimendutako ostalarian" + +#: plugins/sudoers/logging.c:299 +msgid "command not allowed" +msgstr "komandua ez dago baimenduta" + +#: plugins/sudoers/logging.c:309 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ez dago sudoers fitxatzegian. Gertaeraren berri emango da.\n" + +#: plugins/sudoers/logging.c:312 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s ez dago baimenduta sudo abiarazteko %s-(e)n. Gertaeraren berri emango da.\n" + +#: plugins/sudoers/logging.c:316 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Barkatu, %s erabiltzaileak ez luke sudo abiariazi beharko %s-(e)n.\n" + +#: plugins/sudoers/logging.c:319 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Barkatu, %s erabiltzaileak ez du '%s%s%s' %s%s%s bezala exekutatzeko baimenik %s-(e)n.\n" + +#: plugins/sudoers/logging.c:454 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:461 plugins/sudoers/logging.c:518 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:511 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:530 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:564 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:774 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:369 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:371 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:386 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:395 +#, c-format +msgid "" +" Commands:\n" +"\t" +msgstr "" + +#: plugins/sudoers/plugin_error.c:100 plugins/sudoers/plugin_error.c:105 +msgid ": " +msgstr ": " + +#: plugins/sudoers/pwutil.c:244 +#, c-format +msgid "unable to cache uid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:252 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:288 plugins/sudoers/pwutil.c:297 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:511 +#, c-format +msgid "unable to cache gid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:519 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:548 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/set_perms.c:249 plugins/sudoers/set_perms.c:476 +#: plugins/sudoers/set_perms.c:710 +#, c-format +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:514 +#: plugins/sudoers/set_perms.c:748 plugins/sudoers/set_perms.c:882 +msgid "too many processes" +msgstr "prozesu gehiegi" + +#: plugins/sudoers/set_perms.c:943 plugins/sudoers/set_perms.c:959 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:952 +msgid "unable to get runas group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:217 +msgid "unable to reset group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:223 +msgid "unable to get group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:266 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:279 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:292 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:302 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:206 plugins/sudoers/sudoers.c:241 +#: plugins/sudoers/sudoers.c:876 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:210 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:264 +#, c-format +msgid "unable to execute %s: %s" +msgstr "ezin da %s exekutatu: %s" + +#: plugins/sudoers/sudoers.c:311 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:318 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:407 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "data-zigiluaren jabea (%s): ez dago horrelako erabiltzailerik" + +#: plugins/sudoers/sudoers.c:423 +msgid "no tty" +msgstr "tty gabe" + +#: plugins/sudoers/sudoers.c:424 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "barkatu, tty bat behar duzu sudo abiarazteko" + +#: plugins/sudoers/sudoers.c:470 +msgid "No user or host" +msgstr "Ez dago erabiltzaile edo ostalaririk" + +#: plugins/sudoers/sudoers.c:484 plugins/sudoers/sudoers.c:505 +#: plugins/sudoers/sudoers.c:506 plugins/sudoers/sudoers.c:1413 +#: plugins/sudoers/sudoers.c:1414 +#, c-format +msgid "%s: command not found" +msgstr "%s: komandoa ez da aurkitu" + +#: plugins/sudoers/sudoers.c:486 plugins/sudoers/sudoers.c:502 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/sudoers.c:491 +msgid "validation failure" +msgstr "balidazio hutsegitea" + +#: plugins/sudoers/sudoers.c:501 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:513 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:860 +#, c-format +msgid "internal error, set_cmnd() overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:904 +#, c-format +msgid "fixed mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:908 +#, c-format +msgid "set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:911 +#, c-format +msgid "unable to set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:914 +#, c-format +msgid "unable to fix mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:927 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:929 +#, c-format +msgid "%s is mode 0%o, should be 0%o" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:936 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:980 +#, c-format +msgid "only root can use `-c %s'" +msgstr "soilik root-ek erabili dezake `-c %s'" + +#: plugins/sudoers/sudoers.c:990 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1024 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1076 plugins/sudoers/testsudoers.c:342 +#, c-format +msgid "unknown group: %s" +msgstr "talde ezezaguna: %s" + +#: plugins/sudoers/sudoers.c:1108 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1114 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1117 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1119 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-en bidea: %s\n" + +#: plugins/sudoers/sudoers.c:1120 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-en bidea: %s\n" + +#: plugins/sudoers/sudoreplay.c:265 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:278 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:284 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:287 plugins/sudoers/visudo.c:174 +#, c-format +msgid "%s version %s\n" +msgstr "%s bertsioa %s\n" + +#: plugins/sudoers/sudoreplay.c:310 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:316 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "invalid log file %s" +msgstr "baliogabeko %s log fitxategia" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:383 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:425 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:455 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:503 plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:545 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:556 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:562 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:576 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:580 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:586 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:599 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:601 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:603 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:819 +#, c-format +msgid "invalid regex: %s" +msgstr "baliogabeko regex-a: %s" + +#: plugins/sudoers/sudoreplay.c:941 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:944 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:953 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:955 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:228 +#, c-format +msgid "internal error, init_vars() overflow" +msgstr "" + +#: plugins/sudoers/testsudoers.c:304 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:307 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:308 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:308 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: toke.l:667 toke.l:793 toke.l:818 toke.l:904 plugins/sudoers/toke_util.c:111 +#: plugins/sudoers/toke_util.c:163 plugins/sudoers/toke_util.c:202 +msgid "unable to allocate memory" +msgstr "" + +#: toke.l:786 +msgid "too many levels of includes" +msgstr "include maila gehiegi" + +#: plugins/sudoers/toke_util.c:213 +msgid "fill_args: buffer overflow" +msgstr "fill_args: buffer overflow" + +#: plugins/sudoers/visudo.c:175 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:208 plugins/sudoers/auth/rfc1938.c:103 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ez zara %s datubasean existitzen" + +#: plugins/sudoers/visudo.c:238 plugins/sudoers/visudo.c:470 +#, c-format +msgid "press return to edit %s: " +msgstr "sakatu intro %s editatzeko:" + +#: plugins/sudoers/visudo.c:300 plugins/sudoers/visudo.c:306 +#, c-format +msgid "write error" +msgstr "idazketa errorea" + +#: plugins/sudoers/visudo.c:360 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:365 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:371 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:394 +#, c-format +msgid "%s unchanged" +msgstr "%s aldatu gabea" + +#: plugins/sudoers/visudo.c:418 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:428 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:463 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:502 plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to set (uid, gid) of %s to (%d, %d)" +msgstr "" + +#: plugins/sudoers/visudo.c:506 plugins/sudoers/visudo.c:516 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:533 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:547 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:557 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:617 +msgid "What now? " +msgstr "Eta orain?" + +#: plugins/sudoers/visudo.c:631 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:668 +#, c-format +msgid "unable to execute %s" +msgstr "ezin da %s exekutatu" + +#: plugins/sudoers/visudo.c:675 +#, c-format +msgid "unable to run %s" +msgstr "ezin da %s abiarazi" + +#: plugins/sudoers/visudo.c:706 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:718 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:721 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:723 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:737 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%d, %d)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:744 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s busy, try again later" +msgstr "%s okupatuta, saiatu berriz beranduago" + +#: plugins/sudoers/visudo.c:826 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:849 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "" + +#: plugins/sudoers/visudo.c:897 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:986 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:987 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:990 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:991 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1128 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1185 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1187 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:64 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:71 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:79 +msgid "unable to setup authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:93 +#: plugins/sudoers/auth/fwtk.c:126 +#, c-format +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:114 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:127 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:144 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:188 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:204 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:284 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:299 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:99 +msgid "unable to initialize PAM" +msgstr "ezin da PAM hasieratu" + +#: plugins/sudoers/auth/pam.c:142 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:146 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:153 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "pam_chauthtok: %s" + +#: plugins/sudoers/auth/pam.c:157 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:161 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:176 +#, c-format +msgid "pam_authenticate: %s" +msgstr "pam_authenticate: %s" + +#: plugins/sudoers/auth/pam.c:296 +msgid "Password: " +msgstr "Pasahitza: " + +#: plugins/sudoers/auth/pam.c:297 +msgid "Password:" +msgstr "Pasahitza:" + +#: plugins/sudoers/auth/securid.c:82 plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:81 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:169 +#, c-format +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:174 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:213 +#, c-format +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:164 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:106 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:124 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:134 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:243 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "pasahitz sartze saiakera oker %d" +msgstr[1] "%d pasahitz sartze saiakera oker" + +#: plugins/sudoers/auth/sudo_auth.c:335 +msgid "Authentication methods:" +msgstr "Autentikazio metodoak:" diff --git a/utsudo-0.0.2/plugins/sudoers/po/fi.mo b/utsudo-0.0.2/plugins/sudoers/po/fi.mo new file mode 100644 index 0000000000000000000000000000000000000000..84526c22c3c9abcd7baffe2f896da13b2a44fd49 GIT binary patch literal 45870 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/fi.po b/utsudo-0.0.2/plugins/sudoers/po/fi.po new file mode 100644 index 0000000..3797f6c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/fi.po @@ -0,0 +1,2361 @@ +# Finnish messages for sudoers. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# Jorma Karvonen , 2011-2017. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.21b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-08-03 10:04-0600\n" +"PO-Revision-Date: 2017-08-20 16:23+0300\n" +"Last-Translator: Jorma Karvonen \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksivirhe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p:n salasana: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] salasana henkilölle %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Salasana: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** TURVALLISUUS-tietoja kohteelle %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Yritä uudelleen." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:486 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:647 +#: plugins/sudoers/defaults.c:902 plugins/sudoers/defaults.c:1073 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:565 +#: plugins/sudoers/ldap.c:963 plugins/sudoers/ldap.c:1157 +#: plugins/sudoers/ldap.c:1168 plugins/sudoers/ldap.c:1184 +#: plugins/sudoers/ldap.c:1476 plugins/sudoers/ldap.c:1636 +#: plugins/sudoers/ldap.c:1718 plugins/sudoers/ldap.c:1858 +#: plugins/sudoers/ldap.c:1882 plugins/sudoers/ldap.c:1971 +#: plugins/sudoers/ldap.c:1986 plugins/sudoers/ldap.c:2082 +#: plugins/sudoers/ldap.c:2115 plugins/sudoers/ldap.c:2196 +#: plugins/sudoers/ldap.c:2278 plugins/sudoers/ldap.c:2375 +#: plugins/sudoers/ldap.c:3209 plugins/sudoers/ldap.c:3241 +#: plugins/sudoers/ldap.c:3550 plugins/sudoers/ldap.c:3578 +#: plugins/sudoers/ldap.c:3594 plugins/sudoers/ldap.c:3684 +#: plugins/sudoers/ldap.c:3700 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:684 +#: plugins/sudoers/logging.c:942 plugins/sudoers/match.c:617 +#: plugins/sudoers/match.c:664 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:915 plugins/sudoers/parse.c:248 +#: plugins/sudoers/parse.c:260 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse.c:287 plugins/sudoers/policy.c:419 +#: plugins/sudoers/policy.c:653 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:139 plugins/sudoers/pwutil.c:210 +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:457 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:591 +#: plugins/sudoers/pwutil.c:749 plugins/sudoers/pwutil.c:806 +#: plugins/sudoers/pwutil.c:851 plugins/sudoers/pwutil.c:908 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:390 +#: plugins/sudoers/sssd.c:459 plugins/sudoers/sssd.c:1057 +#: plugins/sudoers/sssd.c:1236 plugins/sudoers/sssd.c:1250 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:681 +#: plugins/sudoers/sudoers.c:806 plugins/sudoers/sudoers.c:850 +#: plugins/sudoers/sudoers.c:1122 plugins/sudoers/sudoers_debug.c:107 +#: plugins/sudoers/sudoreplay.c:1234 plugins/sudoers/sudoreplay.c:1346 +#: plugins/sudoers/sudoreplay.c:1386 plugins/sudoers/sudoreplay.c:1395 +#: plugins/sudoers/sudoreplay.c:1405 plugins/sudoers/sudoreplay.c:1413 +#: plugins/sudoers/sudoreplay.c:1417 plugins/sudoers/sudoreplay.c:1573 +#: plugins/sudoers/sudoreplay.c:1577 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:389 plugins/sudoers/timestamp.c:433 +#: plugins/sudoers/timestamp.c:852 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "muistin varaaminen epäonnistui" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "tiiviste vaatii polkunimen" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "virheellinen notbefore-arvo" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "virheellinen notafter-arvo" + +#: gram.y:624 plugins/sudoers/policy.c:266 +msgid "timeout value too large" +msgstr "aikavalvonta-arvo on liian iso" + +#: gram.y:626 plugins/sudoers/policy.c:268 +msgid "invalid timeout value" +msgstr "virheellinen aikavalvonta-arvo" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:486 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:647 plugins/sudoers/defaults.c:902 +#: plugins/sudoers/defaults.c:1073 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:565 +#: plugins/sudoers/ldap.c:963 plugins/sudoers/ldap.c:1157 +#: plugins/sudoers/ldap.c:1168 plugins/sudoers/ldap.c:1184 +#: plugins/sudoers/ldap.c:1476 plugins/sudoers/ldap.c:1636 +#: plugins/sudoers/ldap.c:1718 plugins/sudoers/ldap.c:1858 +#: plugins/sudoers/ldap.c:1882 plugins/sudoers/ldap.c:1971 +#: plugins/sudoers/ldap.c:1986 plugins/sudoers/ldap.c:2082 +#: plugins/sudoers/ldap.c:2115 plugins/sudoers/ldap.c:2195 +#: plugins/sudoers/ldap.c:2278 plugins/sudoers/ldap.c:2375 +#: plugins/sudoers/ldap.c:3209 plugins/sudoers/ldap.c:3241 +#: plugins/sudoers/ldap.c:3550 plugins/sudoers/ldap.c:3577 +#: plugins/sudoers/ldap.c:3593 plugins/sudoers/ldap.c:3684 +#: plugins/sudoers/ldap.c:3700 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:942 +#: plugins/sudoers/match.c:616 plugins/sudoers/match.c:663 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:914 +#: plugins/sudoers/parse.c:248 plugins/sudoers/parse.c:260 +#: plugins/sudoers/parse.c:275 plugins/sudoers/parse.c:287 +#: plugins/sudoers/policy.c:99 plugins/sudoers/policy.c:108 +#: plugins/sudoers/policy.c:117 plugins/sudoers/policy.c:141 +#: plugins/sudoers/policy.c:252 plugins/sudoers/policy.c:266 +#: plugins/sudoers/policy.c:268 plugins/sudoers/policy.c:292 +#: plugins/sudoers/policy.c:301 plugins/sudoers/policy.c:340 +#: plugins/sudoers/policy.c:350 plugins/sudoers/policy.c:359 +#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:419 +#: plugins/sudoers/policy.c:653 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:139 plugins/sudoers/pwutil.c:210 +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:457 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:591 +#: plugins/sudoers/pwutil.c:749 plugins/sudoers/pwutil.c:806 +#: plugins/sudoers/pwutil.c:851 plugins/sudoers/pwutil.c:908 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:390 plugins/sudoers/sssd.c:459 +#: plugins/sudoers/sssd.c:1057 plugins/sudoers/sssd.c:1235 +#: plugins/sudoers/sssd.c:1250 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:681 plugins/sudoers/sudoers.c:806 +#: plugins/sudoers/sudoers.c:850 plugins/sudoers/sudoers.c:1122 +#: plugins/sudoers/sudoers_debug.c:106 plugins/sudoers/sudoreplay.c:1234 +#: plugins/sudoers/sudoreplay.c:1346 plugins/sudoers/sudoreplay.c:1386 +#: plugins/sudoers/sudoreplay.c:1395 plugins/sudoers/sudoreplay.c:1405 +#: plugins/sudoers/sudoreplay.c:1413 plugins/sudoers/sudoreplay.c:1417 +#: plugins/sudoers/sudoreplay.c:1573 plugins/sudoers/sudoreplay.c:1577 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:389 +#: plugins/sudoers/timestamp.c:433 plugins/sudoers/timestamp.c:852 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" on jo määritelty" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kirjautumisluokan saaminen käyttäjälle %s epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "bsd-todentamisen aloittaminen epäonnistui" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "virheellinen todennustyyppi" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "BSD-todentamisen alustaminen epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "fwtk config -asetuksen lukeminen epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "todentamispalvelimelle yhdistäminen epäonnistui" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "kadotettiin yhteys todentamispalvelimelle" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"todentamispalvelinvirhe:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: valtuutetun (’%s’) muuntaminen merkkijonoksi epäonnistui: %s" + +# Ensimmäinen parametri on auth name +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: todentamisnimen ’%s’ jäsentäminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: valtuustietovälimuistin ratkaiseminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: muistin varaaminen valitsimille epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: valtuustietojen hakeminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: valtuustietovälimuistin alustaminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: valtuustietojen tallentaminen valtuustietovälimuistiin epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: tietokoneen valtuutetun hakeminen epäonnistui: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT-lipun todentaminen epäonnistui! Mahdollinen hyökkäys!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "PAM:in alustaminen epäonnistui" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "tilikelpuutushäiriö, onko tilisi lukittu?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Tili tai salasana on vanhentunut, nollaa salasanasi tai yritä uudelleen" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "vanhentuneen salasanan vaihtaminen epäonnistui: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Salasana vanhentunut, ota yhteyttä järjestelmän ylläpitäjään" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Tili vanhentunut tai PAM-asetuksista puuttuu ”account”-lohko sudo-komennolle, ota yhteyttä järjestelmän ylläpitäjään" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-todentamisvirhe: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ei ole olemassa %s-tietokannassa" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "ACE API -kirjaston alustaminen epäonnistui" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "yhteyden ottaminen SecurID-palvelimeen epäonnistui" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "Käyttäjätunniste lukittu SecurID-todennukselle" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "virheellinen käyttäjänimipituus kohteelle SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "virheellinen todentamiskäsittelijä kohteelle SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "SecurID-viestintä epäonnistui" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "tuntematon SecurID-virhe" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "virheellinen salasanakoodipituus kohteelle SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "SIA-istunnon alustaminen epäonnistui" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "virheelliset todennusmetodit" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Virheellisiä todennusmenetelmiä käännetty sudo-ohjelmaan! Yksittäisiä ja ei-yksittäisiä todennuksia ei voi sekoittaa keskenään." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "ei todennusmenetelmiä:" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo-ohjelmaan ei ole käännetty todentamismenelmiä! Jos haluat kääntää pois todentamisen, käytä asetusvalitsinta --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Todentamismenetelmien alustaminen epäonnistui." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Todennusmenetelmät:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Audit-ehdon määrittely epäonnistui" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "commit-toiminnon suorittaminen audit-tietueelle epäonnistui" + +#: plugins/sudoers/check.c:252 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Luotamme, että olet saanut tavanomaisen saarnan paikalliselta järjestelmän\n" +"ylläpitäjältä. Yleensä se tiivistyy kolmeen asiaan:\n" +"\n" +" #1) Kunnioita muiden yksityisyyttä.\n" +" #2) Ajattele ennen kuin kirjoitat.\n" +" #3) Suuren voiman mukana tulee suuri vastuu.\n" +"\n" + +#: plugins/sudoers/check.c:295 plugins/sudoers/check.c:305 +#: plugins/sudoers/sudoers.c:724 plugins/sudoers/sudoers.c:769 +#, c-format +msgid "unknown uid: %u" +msgstr "tuntematon uid-käyttäjätunniste: %u" + +#: plugins/sudoers/check.c:300 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:826 plugins/sudoers/sudoers.c:1161 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "tuntematon käyttäjä: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-apuneuvo, jos syslog-lokia käytetään kirjautumista varten: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Käytettävä syslog-prioriteetti, kun käyttäjä todennetaan onnistuneesti: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Käytettävä syslog-prioriteetti, kun käyttäjän todennus epäonnistui: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Laita OPT-kehote omalle rivilleen" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Ohita ’.’ $PATH-asetuksessa" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Lähetä aina sähkopostia, kun sudo suoritetaan" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Lähetä sähköpostia, jos käyttäjän todennus epäonnistuu" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Lähetä sähköpostia, jos käyttäjä ei ole sudoers-määrittelyssä" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Lähetä sähköpostia, jos käyttäjä ei ole tällä tietokoneella sudoers-määrittelyssä" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Lähetä sähköpostia, jos käyttäjän ei sallita suorittaa komentoa" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Lähetä sähköpostia, jos käyttäjä yrittää suorittaa komennon" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Käytä erillistä aikaleimaa jokaiselle käyttäjä/tty -yhdistelmälle" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Saarnaa ensimmäistä kertaa sudo-ohjelmaa käyttävälle" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Tiedosto, joka sisältää sudo-saarnan: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Vaadi käyttäjien todennus oletuksena" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "Root voi suorittaa sudo-ohjelman" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Kirjaa tietokonenimi (ei-syslog)lokitiedostoon" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Kirjaa vuosi (ei-syslog)lokitiedostoon" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Jos sudo-ohjelmaa kutsutaan ilman argumentteja, käynnistä käyttöjärjestelmäkuori" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Aseta $HOME-muuttujaksi kohdekäyttäjä kun käyttöjärjestelmäkuori käynnistetään valitsimella -s" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "Aseta $HOME-muuttujaksi aina kohdekäyttäjän kotihakemisto" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Salli jotain tietojenkeräystä hyödyllisten virheilmoitusten tarjoamiseksi" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vaadi täysin rakennettu tietokonenimi suoders-tiedostossa" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "Solvaa käyttäjiä, kun he kirjoittavat väärän salasanan" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Salli käyttäjien suorittaa sudo-ohjelma vain jos heillä on tty" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo noudattaa EDITOR-ympäristömuuttujaa" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "Kysy root-käyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Kysy runas_default-käyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "Kysy kohdekäyttäjän salasana, ei käyttäjän" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Käytä oletuksia kohdekäyttäjän kirjautumisluokassa, jos siinä on yhtään" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Aseta LOGNAME- ja USER-ympäristömuuttujat" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Aseta vain voimassa oleva uid-käyttäjätunniste kohdekäyttäjälle, ei oikeaa uid-tunnistetta" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Älä alusta ryhmävektoria kohdekäyttäjän vastaavaan arvoon" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Pituus, jossa pitkät lokitiedostorivit jaetaan seuraavalle riville (0 ei jaeta): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Todennusaikaleiman aikavalvonta: %.1f minuuttia" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Salasanakehotteen aikavalvonta: %.1f minuuttia" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Salasanayritysten lukumäärä: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Käytettävä umask-määrittely tai 0777 käytettäväksi käyttäjän umask-määrittelyksi: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Polku lokitiedostoon: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Polku sähköpostiohjelmaan: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Sähköpostiohjelman liput: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Osoite, johon sähköposti lähetetään: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Osoite, josta sähköposti lähetetään: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Sähköpostiviestin Aihe-rivi: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Virheellinen salasanaviesti: %s" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Polku luentotilahakemistoon: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Polku todennusaikaleimahakemistoon: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Todennusaikaleimahakemiston omistaja: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Käyttäjät tässä ryhmässä on vapautettu salasana- ja PATH-vaatimuksista: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Oletussalasanakehote: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Jos asetettu, salasanakehote korvaa järjestelmäkehotteen kaikissa tapauksissa." + +# Tämä on tekemisessä runas_default -määrittelyn kanssa +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Oletuskäyttäjä suorittaa komennot käyttäjänä: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Arvo, jolla korvataan käyttäjän $PATH-asetus: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Visudo-editorin käyttämä polku: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kun vaaditaan salasana ’list’-näennäiskomennolle: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kun vaaditaan salasana ’verify’-näennäiskomennolle: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Esilataa vale-exec-funktiot, jotka sisältyvät sudo_noexec-kirjastoon" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Jos LDAP-hakemisto on ylhäällä, ohitammeko paikallisen sudoers-tiedoston" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Tiedostokuvaajat >= %d suljetaan ennen komennon suoritusta" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Jos asetettu, käyttäjä voi korvata ’closefrom’-arvon valitsimella -C" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Salli käyttäjien asettaa mielivaltaisia ympäristömuuttujia" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "Nollaa ympäristö muuttujien oletusjoukoksi" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Ympäristömuuttujat, joille tehdään järkevyystarkistus:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Poistettavat ympäristömuuttujat:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Säilytettävät ympäristömuuttujat:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Uudessa turva-asiayhteydessä käytettävä SELinux-rooli: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Uudessa turva-asiayhteydessä käytettävä SELinux-tyyppi: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Polku sudo-kohtaiseen ympäristötiedostoon: %s" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Polku rajoitettuun sudo-kohtaiseen ympäristötiedostoon: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Locale-asetus, jota käytetään sudoers-jäsentämisessä: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Salli sudo-ohjelman kysyä salasana vieläpä jos se olisi näkyvä" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Tarjoa visuaalista palautetta salasanakehotteelta silloin kun on käyttäjäsyöte" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Käyttää nopeampaa jokerimerkkien korvausta, joka on epätarkempi, mutta ei lue tiedostojärjestelmää" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Sudoers umask korvaa käyttäjän umask-määrittelyn, vieläpä jos se on sallivampi" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "Kirjaa lokiin käyttäjän syöte suoritettavalle komennolle" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "Kirjaa lokiin suoritettavan komennon tuloste" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "Tiivistä siirräntälokit käyttäen zlib-ohjelmaa" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "Suorita aina komennot näennäis-tty:ssä" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Lisäosa ei-Unix-ryhmätuelle: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Hakemisto, johon tallennetaan syöte-/tulostelokit: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Tiedosto, johon tallennetaan syöte-/tulosteloki: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Lisää rivi utmp-/utmpx-tiedostoon, kun varataan pty" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Aseta käyttäjäksi utmp-tiedostoon suorittava käyttäjä, ei kutsuva käyttäjä" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Sallittujen käyttöoikeuksien joukko: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Rajoitettujen käyttöoikeuksien joukko: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Suorita komentoja pty:llä taustalla" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Käytettävä PAM-palvelunimi: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Kirjautumiskomentotulkeille käytettävä PAM-palvelunimi: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Yritys perustaa PAM-valtuustiedot kohdekäyttäjälle" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Luo uusi PAM-istunto suoritettavalle komennolle" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Suurin siirräntälokin sarjanumero: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "Ota käyttöön sudoers-verkkoryhmätuki" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Tarkista yläpuolella olevan hakemistojen kirjoituskelpoisuus kun tiedostoja muokataan sudoedit-ohjelmalla" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Seuraa symbolisia linkejä kun tiedostoja muokataan sudoedit-ohjelmalla" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "Kysy ryhmälisäosaa tuntemattomille järjestelmäryhmille" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Täsmäävät verkkoryhmät perustuen koko monikolle: käyttäjä, tietokone ja verkkotunnus" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan valvontatarkastuslokiin" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan siirtolokiin" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Salli komentojen suorittaminen silloinkin kun sudo ei kykene kirjoittamaan lokitiedostoon" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Ratkaise sudoers-ryhmät ja täsmäytä ryhmätunnisteeseen, ei nimeen" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Lokirivit, jotka ovat pitempiä kuin tämä arvo, jaetaan useisiin syslog-viesteihin: %u" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Käyttäjä, joka omistaa siirräntälokitiedostot: %s" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Ryhmä, joka omistaa siirräntälokitiedostot: %s" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Tiedostotila käytettäväksi siirräntälokitiedostoissa: 0%o" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Suorita komentoja tiedostokuvaan avulla eikä polun avulla: %s" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ohita tuntemattomat Defaults-rivit sudoers-tiedostossa sen sijaan että tuottaisit varoituksia" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Sekuntimäärä, jossa komento päätetään: %u" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Salli käyttäjän määritellä aikavalvonta komentorivillä" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tyhjennä siirräntälokitiedot levylle välittömästi sen sijaan että puskuroisit ne" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "Sisällytä prosessitunniste, kun kirjataan syslog-tiedostoon" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Todennusaikaleimatietueen tyyppi: %s" + +#: plugins/sudoers/defaults.c:220 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d tuntematon oletusrivi ”%s”" + +#: plugins/sudoers/defaults.c:223 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: tuntematon oletusrivi ”%s”" + +# parametrinä on variable +#: plugins/sudoers/defaults.c:263 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d arvoa ei ole määritelty muuttujalle ”%s”" + +# parametrinä on variable +#: plugins/sudoers/defaults.c:266 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: arvoa ei ole määritelty muuttujalle ”%s”" + +# Parametri on muuttuja +#: plugins/sudoers/defaults.c:286 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d muuttujan ”%s” arvojen on alettava merkillä ’/’" + +# Parametri on muuttuja +#: plugins/sudoers/defaults.c:289 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: muuttujan ”%s” arvojen on alettava merkillä ’/’" + +#: plugins/sudoers/defaults.c:314 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d valitsin ”%s” ei ota arvoa" + +#: plugins/sudoers/defaults.c:317 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: valitsin ”%s” ei ota arvoa" + +#: plugins/sudoers/defaults.c:339 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d virheellinen Defaults-tyyppi 0x%x valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:342 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: virheellinen Defaults-tyyppi 0x%x valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:352 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d arvo ”%s” on virheellinen valitsimelle ”%s”" + +#: plugins/sudoers/defaults.c:355 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: arvo ”%s” on virheellinen valitsimelle ”%s”" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1253 +#: plugins/sudoers/ldap.c:1480 plugins/sudoers/ldap.c:1806 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:947 +#: plugins/sudoers/policy.c:537 plugins/sudoers/policy.c:547 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:872 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "sisäinen virhe, %s-ylivuoto" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: rikkoutunut envp, pituus ei täsmää" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "ympäristön rakentaminen uudelleen epäonnistui" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "seuraavia ympäristömuuttujia ei ole lupa asettaa: %s" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tukematon tiivistetyyppi %d kohteelle %s" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: kirjoitusvirhe" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s-omistajan on oltava uid %d" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s on vain omistajan kirjoitettava" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:398 +#, c-format +msgid "unable to load %s: %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +# parametrina on path +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "symbolin ”group_plugin” löytäminen polusta %s epäonnistui" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: yhteensopimaton ryhmälisäosan major-versio %d, odotettiin %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "verkko-osoitteen ”%s” jäsentäminen epäonnistui" + +# Parametri on sudoers file +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "verkkopeitteen ”%s” jäsentäminen epäonnistui" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Paikallinen verkko-osoite ja verkkopeiteparit:\n" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s on olemassa, mutta ei ole hakemisto (0%o)" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:170 +#, c-format +msgid "unable to mkdir %s" +msgstr "käskyn mkdir %s suorittaminen epäonnistui" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "tilan %s vaihtaminen arvoon 0%o epäonnistui" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1192 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "tuntematon ryhmä: %s" + +# Avaamisen kohde voi olla timestamp file, sudoers file tai pathbuf +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:928 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1335 +#: plugins/sudoers/sudoreplay.c:1539 plugins/sudoers/timestamp.c:398 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "kohteen %s avaaminen epäonnistui" + +# Parametrinä on sudoers-tiedosto tai pathbuf +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:932 +#: plugins/sudoers/sudoreplay.c:831 plugins/sudoers/sudoreplay.c:1650 +#, c-format +msgid "unable to read %s" +msgstr "kohteen %s lukeminen epäonnistui" + +# Kirjoittamisen kohde voi olla timestamp file tai pathbuf +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1104 +#: plugins/sudoers/timestamp.c:290 plugins/sudoers/timestamp.c:293 +#, c-format +msgid "unable to write to %s" +msgstr "kohteeseen %s kirjoittaminen epäonnistui" + +# Parametrina on pathbuf +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "hakemistopolun %s luominen epäonnistui" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "siirtolokitiedostoon: %s kirjoittaminen epäonnistui" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "%s: sisäinen virhe, tiedostoindeksi %d ei ole avoin" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: portti on liian suuri" + +# URL on verkko-osoite, loogisesti URI on verkkoresurssi(osoite) +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tukematon LDAP-verkkoresurssin tunnustyyppi: %s" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap:n ja ldap-verkkoresurssitunnuksien sekoittaminen epäonnistui" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:558 +msgid "starttls not supported when using ldaps" +msgstr "starttls ei ole tuettu ldaps-käytössä" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL-varmenne- ja -avaintietokannan alustaminen epäonnistui: %s" + +#: plugins/sudoers/ldap.c:632 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "kohteessa %s TLS_CERT on asetettava käyttämään SSL:ää" + +#: plugins/sudoers/ldap.c:1239 +msgid "unable to get GMT time" +msgstr "GMT-ajan saaminen epäonnistui" + +#: plugins/sudoers/ldap.c:1245 +msgid "unable to format timestamp" +msgstr "aikaleiman muotoileminen epäonnistui" + +#: plugins/sudoers/ldap.c:1961 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:2533 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rooli: %s\n" + +#: plugins/sudoers/ldap.c:2535 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"LDAP-rooli: TUNTEMATON\n" + +#: plugins/sudoers/ldap.c:2591 +#, c-format +msgid " Order: %s\n" +msgstr " Järjestys: %s\n" + +#: plugins/sudoers/ldap.c:2599 plugins/sudoers/parse.c:614 +#: plugins/sudoers/sssd.c:1628 +#, c-format +msgid " Commands:\n" +msgstr " Komennot:\n" + +#: plugins/sudoers/ldap.c:3161 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kohteen LDAP alustaminen epäonnistui: %s" + +#: plugins/sudoers/ldap.c:3197 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls määritelty, mutta LDAP-kirjastot ei tue funktiota ldap_start_tls_s() tai funktiota ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3446 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "virheellinen sudoOrder-attribuutti: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "audit-järjestelmän avaaminen epäonnistui" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "audit-viestin lähettäminen epäonnistui" + +#: plugins/sudoers/logging.c:107 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:135 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s: (komento jatkui) %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "unable to open log file: %s" +msgstr "lokitiedoston avaaminen epäonnistui: %s" + +#: plugins/sudoers/logging.c:172 +#, c-format +msgid "unable to lock log file: %s" +msgstr "lokitiedoston lukitseminen epäonnistui: %s" + +#: plugins/sudoers/logging.c:205 +#, c-format +msgid "unable to write log file: %s" +msgstr "lokitiedostoon: %s kirjoittaminen epäonnistui" + +#: plugins/sudoers/logging.c:234 +msgid "No user or host" +msgstr "Ei käyttäjä eikä tietokone" + +#: plugins/sudoers/logging.c:236 +msgid "validation failure" +msgstr "kelpuutushäiriö" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT in sudoers" +msgstr "käyttäjä EI ole sudoers-tiedostossa" + +#: plugins/sudoers/logging.c:245 +msgid "user NOT authorized on host" +msgstr "käyttäjä ei ole varmennettu tietokoneella" + +#: plugins/sudoers/logging.c:247 +msgid "command not allowed" +msgstr "komento ei ole sallittu" + +#: plugins/sudoers/logging.c:282 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "käyttäjä %s ei ole sudoers-tiedostossa. Tästä tapahtumasta ilmoitetaan.\n" + +#: plugins/sudoers/logging.c:285 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "käyttäjä %s ei saa suorittaa komentoa sudo tietokoneella %s. Tästä tapahtumasta ilmoitetaan.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Käyttäjä %s ei voi suorittaa komentoa sudo tietokoneella %s.\n" + +#: plugins/sudoers/logging.c:292 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Käyttäjän %s ei sallita suorittaa ’%s%s%s’ käyttäjänä %s%s%s tietokoneella %s.\n" + +#: plugins/sudoers/logging.c:329 plugins/sudoers/sudoers.c:472 +#: plugins/sudoers/sudoers.c:474 plugins/sudoers/sudoers.c:476 +#: plugins/sudoers/sudoers.c:478 plugins/sudoers/sudoers.c:1297 +#: plugins/sudoers/sudoers.c:1299 +#, c-format +msgid "%s: command not found" +msgstr "%s: komentoa ei löytynyt" + +#: plugins/sudoers/logging.c:331 plugins/sudoers/sudoers.c:468 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ohitetaan komento ”%s”, joka löytyi kohteesta ’.’\n" +"Käytä ”sudo ./%s”, jos tämä on ”%s”-komento, joka halutaan suorittaa." + +#: plugins/sudoers/logging.c:348 +msgid "authentication failure" +msgstr "todentamishäiriö" + +#: plugins/sudoers/logging.c:374 +msgid "a password is required" +msgstr "vaaditaan salasana" + +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:511 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u väärä salasana yritetty" +msgstr[1] "%u väärää salasanaa yritetty" + +#: plugins/sudoers/logging.c:598 +msgid "unable to fork" +msgstr "fork-funktion kutsuminen epäonnistui" + +#: plugins/sudoers/logging.c:606 plugins/sudoers/logging.c:658 +#, c-format +msgid "unable to fork: %m" +msgstr "fork-funktion kutsuminen epäonnistui: %m" + +#: plugins/sudoers/logging.c:648 +#, c-format +msgid "unable to open pipe: %m" +msgstr "putken avaaminen epäonnistui: %m" + +#: plugins/sudoers/logging.c:673 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "funktion dup kutsuminen vakiosyötteellä epäonnistui: %m" + +#: plugins/sudoers/logging.c:711 +#, c-format +msgid "unable to execute %s: %m" +msgstr "käskyn %s suorittaminen epäonnistui: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "tiiviste kohteelle %s (%s) ei ole %s-muodossa" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "funktion stat %s kutsuminen epäonnistui" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "jäsentämisvirhe tiedostossa %s lähellä riviä %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "jäsentämisvirhe tiedostossa %s" + +#: plugins/sudoers/parse.c:540 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-rivi:\n" + +#: plugins/sudoers/parse.c:541 +#, c-format +msgid " RunAsUsers: " +msgstr " SuoritaKäyttäjänä: " + +#: plugins/sudoers/parse.c:555 +#, c-format +msgid " RunAsGroups: " +msgstr " SuoritaRyhmänä: " + +#: plugins/sudoers/parse.c:564 +#, c-format +msgid " Options: " +msgstr " Valitsimet: " + +#: plugins/sudoers/policy.c:242 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "verkko-osoiteluettelon jäsentäminen epäonnistui" + +# Parametri on path, mutta saattaa sisältää suoritettavan ohjelman +#: plugins/sudoers/policy.c:711 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "kohteen %s suorittaminen epäonnistui" + +#: plugins/sudoers/policy.c:844 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-menettelytapalisäosaversio %s\n" + +#: plugins/sudoers/policy.c:846 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-tiedostokielioppiversio %d\n" + +#: plugins/sudoers/policy.c:850 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-polku: %s\n" + +#: plugins/sudoers/policy.c:853 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-polku: %s\n" + +#: plugins/sudoers/policy.c:855 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-polku: %s\n" + +#: plugins/sudoers/policy.c:856 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-polku: %s\n" + +#: plugins/sudoers/policy.c:889 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kytkentätyypin %d (version %d.%d) rekisteröiminen epäonnistui" + +#: plugins/sudoers/pwutil.c:162 plugins/sudoers/pwutil.c:180 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "käyttäjän uid %u laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:174 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "käyttäjän uid %u laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +#: plugins/sudoers/pwutil.c:234 plugins/sudoers/pwutil.c:251 +#: plugins/sudoers/pwutil.c:313 plugins/sudoers/pwutil.c:358 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "käyttäjän %s laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:246 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "käyttäjän %s laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +#: plugins/sudoers/pwutil.c:474 plugins/sudoers/pwutil.c:492 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "ryhmän gid %u laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:486 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ryhmän gid %u laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +#: plugins/sudoers/pwutil.c:540 plugins/sudoers/pwutil.c:557 +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:646 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "ryhmän %s laittaminen välimuistiin epäonnistui, muistia ei riittävästi" + +#: plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ryhmän %s laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +#: plugins/sudoers/pwutil.c:772 plugins/sudoers/pwutil.c:824 +#: plugins/sudoers/pwutil.c:874 plugins/sudoers/pwutil.c:926 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "ryhmäluettelon laittaminen välimuistiin tiedostossa %s epäonnistui, ryhmäluettelo on jo siellä" + +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:829 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:931 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "ryhmäluettelon laittaminen välimuistiin tiedostossa %s epäonnistui, muistia ei riittävästi" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:818 +#, c-format +msgid "unable to parse groups for %s" +msgstr "ryhmien jäsentäminen tiedostossa %s epäonnistui" + +# Parametri on sudoers file +#: plugins/sudoers/pwutil.c:920 +#, c-format +msgid "unable to parse gids for %s" +msgstr "ryhmätunnisteiden jäsentäminen tiedostolle %s epäonnistui" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "käyttöoikeuspinoylivuoto" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "käyttöoikeuspinovajaus" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "vaihtaminen root gid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "vaihtaminen runas gid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "runas-ryhmävektorin asettaminen epäonnistui" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "vaihtaminen runas uid -tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "vaihtaminen sudoers gid-tunnisteeksi epäonnistui" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "liian monta prosessia" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "nykyisen työhakemiston hakeminen epäonnistui" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "typistetty audit-polku user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "typistetty audit-polku argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "audit_failure-viesti on liian pitkä" + +#: plugins/sudoers/sssd.c:400 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "lähteen SSS alustaminen epäonnistui. Onko SSSD asennettu tietokoneeseesi?" + +# parametrina on path +#: plugins/sudoers/sssd.c:408 plugins/sudoers/sssd.c:417 +#: plugins/sudoers/sssd.c:426 plugins/sudoers/sssd.c:435 +#: plugins/sudoers/sssd.c:444 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "symbolin ”%s” löytäminen polusta %s epäonnistui" + +#: plugins/sudoers/sssd.c:1543 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" +"\n" +"SSSD-rooli: %s\n" + +#: plugins/sudoers/sssd.c:1548 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" +"\n" +"SSSD-rooli: TUNTEMATON\n" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Täsmäävät Defaults-rivit kohteelle %s kohteella %s:\n" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas- ja Command-kohtaiset oletukset kohteelle %s:\n" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Käyttäjä %s voi suorittaa seuraavat komennot kohteella %s:\n" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Käyttäjä %s ei saa suorittaa komentoa sudo tietokoneella %s.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "sudoers-oletusarvojen alustaminen epäonnistui" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:890 +msgid "problem with defaults entries" +msgstr "oletusrivien pulma" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "ei löytynyt kelvollisia sudoers-lähteitä, poistutaan" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers määrittelee, että root ei saa suorittaa sudo-komentoa" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "ei käyttöoikeuksia valitsimelle -C" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "aikaleimaomistaja (%s): Tuntematon käyttäjä" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "ei tty:tä" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "sudo-komennon suorittamiseksi on oltava tty" + +#: plugins/sudoers/sudoers.c:467 +msgid "command in current directory" +msgstr "komento nykyisessä hakemistossa" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed set a command timeout" +msgstr "komennon aikavalvonnan asettaminen ei ole sallittua" + +#: plugins/sudoers/sudoers.c:494 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "ympäristöä ei ole lupa säilyttää" + +#: plugins/sudoers/sudoers.c:835 +msgid "command too long" +msgstr "komento on liian pitkä" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ei ole tavallinen tiedosto" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:217 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s on uid %u -käyttäjän omistama, pitäisi olla %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "%s on yleiskirjoitettava" + +#: plugins/sudoers/sudoers.c:959 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s on gid %u -ryhmän omistama, pitäisi olla %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "vain root-käyttäjä voi käyttää valitsinta ”-c %s”" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "tuntematon kirjautumisluokka: %s" + +#: plugins/sudoers/sudoers.c:1094 plugins/sudoers/sudoers.c:1108 +#, c-format +msgid "unable to resolve host %s" +msgstr "tietokoneen %s ratkaiseminen epäonnistui" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "virheellinen suodatinvalitsin: %s" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "virheellinen enimmäisodotusaika: %s" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "virheellinen nopeustekijä: %s" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s versio %s\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/ajoitus: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/ajoitus: %s" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Toistetaan sudo-istunto: %s" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:804 plugins/sudoers/sudoreplay.c:879 +#: plugins/sudoers/sudoreplay.c:958 plugins/sudoers/sudoreplay.c:973 +#: plugins/sudoers/sudoreplay.c:980 plugins/sudoers/sudoreplay.c:987 +#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1001 +#: plugins/sudoers/sudoreplay.c:1143 +msgid "unable to add event to queue" +msgstr "tapahtuman lisääminen jonoon epäonnistui" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "tty:n asettaminen raakatilaan epäonnistui" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Varoitus: pääteikkunasi on liian pieni tämän lokin toistamiseksi oikein.\n" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Lokigeometria on %d x %d, pääteikkunasi geometria on %d x %d." + +#: plugins/sudoers/sudoreplay.c:749 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Toistaminen päättyi, palaa pääteikkunaan painamalla mitä tahansa näppäintä." + +#: plugins/sudoers/sudoreplay.c:782 +#, c-format +msgid "invalid timing file line: %s" +msgstr "virheellinen ajoitustiedostorivi: %s" + +#: plugins/sudoers/sudoreplay.c:1177 plugins/sudoers/sudoreplay.c:1202 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "monimerkityksellinen lauseke ”%s”" + +#: plugins/sudoers/sudoreplay.c:1224 +msgid "unmatched ')' in expression" +msgstr "täsmäämätön ’)’ lausekkeessa" + +#: plugins/sudoers/sudoreplay.c:1228 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "tuntematon hakutermi ”%s”" + +#: plugins/sudoers/sudoreplay.c:1243 +#, c-format +msgid "%s requires an argument" +msgstr "%s vaatii argumentin" + +#: plugins/sudoers/sudoreplay.c:1246 plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "invalid regular expression: %s" +msgstr "virheellinen säännöllinen lauseke: %s" + +#: plugins/sudoers/sudoreplay.c:1250 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "päivämäärän ”%s” jäsentäminen epäonnistui" + +#: plugins/sudoers/sudoreplay.c:1259 +msgid "unmatched '(' in expression" +msgstr "täsmäämätön ’(’ lausekkeessa" + +#: plugins/sudoers/sudoreplay.c:1261 +msgid "illegal trailing \"or\"" +msgstr "virheellinen jäljessä oleva ”or”" + +#: plugins/sudoers/sudoreplay.c:1263 +msgid "illegal trailing \"!\"" +msgstr "virheellinen jäljessä oleva ”!”" + +#: plugins/sudoers/sudoreplay.c:1312 +#, c-format +msgid "unknown search type %d" +msgstr "tuntematon hakutyyppi %d" + +#: plugins/sudoers/sudoreplay.c:1350 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: virheellinen lokitiedosto" + +#: plugins/sudoers/sudoreplay.c:1368 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: aikaleimakenttä puuttuu" + +#: plugins/sudoers/sudoreplay.c:1375 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: aikaleima %s: %s" + +#: plugins/sudoers/sudoreplay.c:1382 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: käyttäjäkenttä puuttuu" + +#: plugins/sudoers/sudoreplay.c:1391 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: suorita käyttäjänä-kenttä puuttuu" + +#: plugins/sudoers/sudoreplay.c:1400 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: suorita ryhmänä-kenttä puuttuu" + +#: plugins/sudoers/sudoreplay.c:1806 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "käyttö: %s [-hnR] [-d hakemisto] [-m numero] [-s numero] ID-tunniste\n" + +#: plugins/sudoers/sudoreplay.c:1809 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "käyttö: %s [-h] [-d hakemisto] -l [hakulauseke]\n" + +#: plugins/sudoers/sudoreplay.c:1818 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - toista sudo-istuntolokit\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1820 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valitsimet:\n" +" -d, --directory=hakemisto määrittele istuntolokien hakemisto\n" +" -f, --filter=suodatin määrittele, mitä siirräntätyyppiä näytetään\n" +" -h, --help näytä opasteviesti ja poistu\n" +" -l, --list [lauseke] luettele käytettävissä oleva istuntotunnisteet, jotka täsmäävät lausekkeeseen\n" +" -m, --max-wait=numero maksimisodotusaika tapahtumien välien enimmäisodotusaika sekunteina\n" +" -s, --speed=numero nopeustekijä nopeuta tai hidasta tulostusta\n" +" -V, --version näytä versiotiedot ja poistu" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "\ttietokone täsmäämätön" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Komento sallittu" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Komento kielletty" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Täsmäämätön komento" + +#: plugins/sudoers/timestamp.c:225 +#, c-format +msgid "%s is group writable" +msgstr "%s on ryhmäkirjoitettava" + +#: plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "aikaleimatiedoston typistäminen %lld-tavun kokoiseksi epäonnistui" + +#: plugins/sudoers/timestamp.c:756 plugins/sudoers/timestamp.c:823 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "kellon lukeminen epäonnistui" + +#: plugins/sudoers/timestamp.c:770 +msgid "ignoring time stamp from the future" +msgstr "ohitetaan aikaleima tulevaisuudesta" + +#: plugins/sudoers/timestamp.c:782 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "aikaleima liian kaukana tulevaisuudessa: %20.20s" + +#: plugins/sudoers/timestamp.c:877 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "aikaleimatiedoston %s lukitseminen epäonnistui" + +#: plugins/sudoers/timestamp.c:921 plugins/sudoers/timestamp.c:941 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "luentotilapolku on liian pitkä: %s/%s" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s kielioppiversio %d\n" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "muokkaa %s painamalla enter-painiketta: " + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "määritelty editori (%s) ei ole olemassa" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "editoria ei löytynyt (editoripolku = %s)" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "kirjoitusvirhe" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "funktion stat kutsuminen tilapäiselle tiedostolle (%s) epäonnistui, %s ennallaan" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "nollapituinen tilapäinen tiedosto (%s), %s ennallaan" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editori (%s) epäonnistui, %s ennallaan" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "%s ennallaan" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "tilapäisen tiedoston (%s) avaaminen uudelleen epäonnistui, %s ennallaan." + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "tilapäisen tiedoston (%s) jäsentäminen epäonnistui, tuntematon virhe" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "sisäinen virhe, kohteen %s löytäminen luettelosta epäonnistui!" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kohteen %s (uid, gid) asettaminen arvoihin (%u, %u) epäonnistui" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s ja %s eivät ole samassa tiedostojärjestelmässä, käytetään komentoa mv uudelleennimeämiseen" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "komento epäonnistui: ’%s %s %s’, %s ennallaan" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "virhe nimettäessä %s uudelleen, %s ennallaan" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "Mitä nyt?" + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Valitsimia ovat:\n" +" (e) muokkaa sudoers-tiedostoa uudelleen\n" +" (x) poistu tallentamatta sudoers-tiedoston muutoksia\n" +" (Q) poistu ja tallenna muutokset sudoers-tiedostoon (VAARA!)\n" + +# Parametri on path, mutta saattaa sisältää suoritettavan ohjelman +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "kohteen %s suorittaminen epäonnistui" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: väärä omistaja (uid, gid), pitäisi olla (%u, %u)\n" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: väärät käyttöoikeudet, pitäisi olla tila 0%o\n" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "tiedoston %s jäsentäminen epäonnistui, tuntematon virhe" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "jäsentämisvirhe tiedostossa %s lähellä riviä %d\n" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "jäsentämisvirhe tiedostossa %s\n" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: jäsentäminen valmis\n" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "%s varattu, yritä myöhemmin uudelleen" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Virhe: %s:%d jakso kohteessa %s \"%s\"" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Varoitus: %s:%d jakso kohteessa %s \"%s\"" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Virhe: %s:%d %s \"%s\" uudelleenviitattu, mutta ei määritelty" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Varoitus: %s:%d %s \"%s\" uudelleenviitattu, mutta ei määritelty" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Varoitus: %s:%d käyttämätön %s \"%s\"" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - muokkaa sudoers-tiedostoa turvallisesti\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Valitsimet:\n" +" -c, --check vain tarkistus -tila\n" +" -f, --file=sudoers määrittele sudoers-tiedoston sijainti\n" +" -h, --help näytä opasteteksti ja poistu\n" +" -q, --quiet vähemmän laveat (hiljaiset) syntaksivirheviestit\n" +" -s, --strict tiukka syntaksitarkistus\n" +" -V, --version näytä versiotiedot ja poistu\n" +" -x, --export=output_file kirjoita sudoers-tiedosto JSON-muodossa tiedostoon output_file" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "tuntematon oletusrivi \"%s\"" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: syöte- ja tulostetiedostojen on oltava erilaiset" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "liian monta include-tasoa" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "aikaleimapolku on liian pitkä: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "funktion stat editor (%s) kutsuminen epäonnistui" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hostbuf-puskuritila loppui" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hostbuf-puskuritila loppui" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1-varaustäsmäämättömyys" + +#~ msgid "Password:" +#~ msgstr "Salasana:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "sisäinen virhe: riittämättömästi tilaa lokiriville" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: puskuriylivuoto" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s: käyttämätön %s_Alias %s" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s on uid %u:n omistama, pitäisi olla uid %u:n omistama" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s on kirjoitettava ei-omistajalle (0%o), pitäisi olla tila 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s on olemassa, mutta ei ole tavallinen tiedosto (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s on kirjoitettava ei-omistajalle (0%o), pitäisi olla tila 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "kohteen %s poistaminen epäonnistui, nollaa Unix-ajan" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "kohteen %s nollaaminen Unix-ajaksi epäonnistui" + +#~ msgid "value out of range" +#~ msgstr "arvo lukualueen ulkopuolella" + +#~ msgid "" +#~ "\n" +#~ "Options:\n" +#~ " -c, --check check-only mode\n" +#~ " -f, --file=file specify sudoers file location\n" +#~ " -h, --help display help message and exit\n" +#~ " -q, --quiet less verbose (quiet) syntax error messages\n" +#~ " -s, --strict strict syntax checking\n" +#~ " -V, --version display version information and exit -x, --export export sudoers in JSON format" +#~ msgstr "" +#~ "\n" +#~ "Valitsimet:\n" +#~ " -c, --check vain tarkistus -tila\n" +#~ " -f, --file=tiedosto määrittele sudoers-tiedoston sijainti\n" +#~ " -h, --help näytä opasteteksti ja poistu\n" +#~ " -q, --quiet vähemmän laveat (hiljaiset) syntaksivirheviestit\n" +#~ " -s, --strict tiukka syntaksitarkistus\n" +#~ " -V, --version näytä versiotiedot ja poistu -x, --export vie sudoers-tiedosto JSON-muodossa" + +#~ msgid "invalid uri: %s" +#~ msgstr "virheellinen verkkoresurssin tunnus: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ldap- ja starttl-kohteiden sekoittaminen epäonnistui" + +#~ msgid "writing to standard output" +#~ msgstr "kirjoitetaan vakiotulosteeseen" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "liian monta sulkumerkillistä lauseketta, enintään %d" + +#~ msgid "unable to setup authentication" +#~ msgstr "asetustodentaminen epäonnistui" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: epäonnistui" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: epäonnistui" + +#~ msgid "au_open: failed" +#~ msgstr "au_open: epäonnistui" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: epäonnistui" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: epäonnistui" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: epäonnistui" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: epäonnistui" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid epäonnistui" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Funktion dlopen %s kutsuminen epäonnistui: %s" + +#~ msgid "invalid regex: %s" +#~ msgstr "virheellinen säännöllinen lauseke: %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s lähellä riviä %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "locale-asetuksen ”%s” asettaminen epäonnistui, käytetään ”C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Komennot:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "käyttäjän uid %u (%s) laittaminen välimuistiin epäonnistui, käyttäjä on jo siellä" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "ryhmän gid %u (%s) laittaminen välimuistiin epäonnistui, ryhmä on jo siellä" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "komennon %s suorittaminen epäonnistui: %s" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "sisäinen virhe, expand_prompt()-ylivuoto" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "sisäinen virhe, sudo_setenv2()-ylivuoto" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "sisäinen virhe, sudo_setenv()-ylivuoto" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "sisäinen virhe, linux_audit_command()-ylivuoto" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "sisäinen virhe, runas_groups-ylivuoto" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "sisäinen virhe, init_vars()-ylivuoto" + +# Parametri on sudoers file +#~ msgid "fixed mode on %s" +#~ msgstr "korjattu tila tiedostossa %s" + +# Parametri on suoders file +#~ msgid "set group on %s" +#~ msgstr "aseta ryhmä tiedostossa %s" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "tilan korjaaminen tiedostossa %s epäonnistui" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s on tila 0%o, pitäisi olla 0%o" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "Tiedosto, joka sisältää vale-exec-funktioita: %s" + +#~ msgid "" +#~ "Available options in a sudoers ``Defaults'' line:\n" +#~ "\n" +#~ msgstr "" +#~ "Käytettävissä olevat valitsimet sudoers ’’Defaults’’ -rivillä:\n" +#~ "\n" + +#~ msgid "%s: %.*s\n" +#~ msgstr "%s: %.*s\n" + +#~ msgid "unable to get runas group vector" +#~ msgstr "runas-ryhmävektorin hakeminen epäonnistui" + +#~ msgid "%s: %s_Alias `%s' references self" +#~ msgstr "%s: %s_Alias ”%s” viittaa itseensä" + +#~ msgid "unable to parse temporary file (%s), unknown error" +#~ msgstr "tilapäisen tiedoston (%s) jäsentäminen epäonnistui, tuntematon virhe" diff --git a/utsudo-0.0.2/plugins/sudoers/po/fr.mo b/utsudo-0.0.2/plugins/sudoers/po/fr.mo new file mode 100644 index 0000000000000000000000000000000000000000..1cb66b937fff9003aa394b41c12e2a759c3b6eba GIT binary patch literal 55950 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, 2014, 2015, 2016. +# Frédéric Marchal , 2019 +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 17:50+0200\n" +"Last-Translator: Frédéric Marchal \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n >= 2);\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "erreur de syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Mot de passe de %p : " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] Mot de passe de %p : " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Mot de passe : " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informations de sécurité pour %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Désolé, essayez de nouveau." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "impossible d'allouer la mémoire" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "un résumé (digest) nécessite un chemin d'accès" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "valeur « notbefore » (pas avant) invalide" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "valeur « notafter » (pas après) invalide" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "valeur trop grande pour le délai d'expiration" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "valeur invalide pour le délai d'expiration" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "L'alias « %s » est déjà défini" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "création du processus fils impossible" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "changement du mot de passe impossible pour %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "récupération de la classe de connexion impossible pour l'utilisateur %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "démarrage de l'authentification bsd impossible" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "type d'authentification non valide" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "démarrage de l'authentification BSD impossible" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "votre compte est expiré" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "échec de l'approbation" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "lecture de la configuration fwtk (firewall) impossible" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "connexion au serveur d'authentification impossible" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "perte de la connexion au serveur d'authentification" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erreur du serveur d'authentification :\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s : conversion de l'identité de l'hôte en chaîne de caractères impossible(« %s ») : %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s : analyse grammaticale (parse) de « %s » impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s : accès au cache des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s : allocation des options impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s : récupération des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s : initialisation du cache des données d'identification impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s : enregistrement des données d'identification dans le cache impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s : récupération de l'identité kerberos de l'hôte (« host principal ») impossible : %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s : vérification du ticket TGT impossible ! Il s'agit peut-être d'une attaque ! : %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "initialisation du module PAM impossible : %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erreur du serveur d'authentification PAM : %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "la validation du compte a échoué, votre compte serait-il verrouillé ?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Le compte ou le mot de passe a expiré, réinitialisez votre mot de passe puis réessayez de vous connecter" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "changement du mot de passe expiré impossible : %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Le mot de passe a expiré, contactez votre administrateur système" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Le compte a expiré, ou la section « account » du module PAM n'est pas renseignée pour sudo, contactez votre administrateur système" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Erreur de gestion du compte PAM : %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "votre compte n'existe pas dans la base de données %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "échec de l'initialisation de la bibliothèque d'API ACE" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "le contact avec le serveur SecurID n'a pas pu être établi" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "l'identifiant de l'utilisateur est verrouillé pour l'authentification SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "la longueur du nom de l'utilisateur n'est pas conforme aux règles fixées pour SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "l'identifiant d'authentification (« Authentication Handle ») est invalide pour SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "la communication avec SecurID a échoué" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "erreur SecurID non identifiée" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "la longueur du mot de passe est invalide pour SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "initialisation de la session SIA impossible" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "méthodes d'authentification invalides" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Méthodes d'authentification non valides compilées dans sudo ! La combinaison d'authentifications autonomes et non-autonomes n'est pas permise." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "pas de méthodes d'authentification" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Aucune méthode d'authentification compilée dans sudo ! Si vous souhaitez désactiver l'authentification, utilisez l'option de configuration --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Initialisation des méthodes d'authentification impossible." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Méthodes d'authentification : " + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Identification de la condition d'audit impossible" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "impossible d'enregistrer l'enregistrement d'audit" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Nous espérons que vous avez reçu de votre administrateur système local\n" +"les consignes traditionnelles. Généralement, elles se concentrent sur ces trois éléments :\n" +"\n" +" #1) Respectez la vie privée des autres.\n" +" #2) Réfléchissez avant d'utiliser le clavier.\n" +" #3) De grands pouvoirs confèrent de grandes responsabilités.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "identifiant utilisateur inconnu : %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "utilisateur inconnu : %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "incrément d'ordre : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordre de départ : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "remplissage de l'ordre : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Version de la grammaire de %s : %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "format d'entrée %s non supporté" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "format de sortie %s non supporté" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s : les fichiers d'entrée et de sortie doivent être différents" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "initialisation des valeurs par défaut de sudoers impossible" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s : %s : %s : %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: mot clé inconnu : %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "type par défaut invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "type de suppression invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "filtre invalide : %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "ouverture de %s impossible" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "échec lors de l'analyse grammaticale de %s, erreur inconnue" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erreur lors de l'analyse grammaticale de %s au environs de la ligne %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "erreur lors de l'analyse grammaticale de %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "écriture impossible dans %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - convertir entre des formats de fichiers sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn le DN de base pour les requêtes LDAP de sudo\n" +" -c, --config=fich_conf le chemin vers le fichier de configuration\n" +" -d, --defaults=typesdef uniquement convertir les Defaults des types spécifiés\n" +" -e, --expand-aliases développer les alias lors de la conversion\n" +" -f, --output-format=format définir le format de sortie : JSON, LDIF ou sudoers\n" +" -i, --input-format=format définir le format d'entrée : LDIF ou sudoers\n" +" -I, --increment=num valeur pour incrémenter chaque sudoOrder\n" +" -h, --help afficher le message d'aide puis terminer\n" +" -m, --match=filtre ne convertir que les entrées correspondant au filtre\n" +" -M, --match-local le filtre de correspondance utilise les bases de données\n" +" des mots de passe et des groupes\n" +" -o, --output=fichier_sortie écrire les sudoers convertis dans fichier_sortie\n" +" -O, --order-start=num point de départ du premier sudoers\n" +" -p, --prune-matches éliminer les utilisateurs, groupes ou hôtes qui ne\n" +" correspondent pas\n" +" -P, --padding=num remplissage de base pour l'incrément de sudoOrder\n" +" -s, --suppress=sections supprimer la sortie de certaines sections\n" +" -V, --version afficher la version et terminer" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrée par défaut inconnue « %s »" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "récupération de l'heure GMT impossible" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "impossible de formater l'horodatage" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "erreur interne, dépassement de %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "trop d'entrées sudoers, maximum %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la variable d'environnement SUDOERS_BASE n'est pas définie et l'option -b n'a pas été spécifiée." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Mécanisme syslog si syslog est utilisé pour la journalisation des événements : %s " + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorité syslog utilisée lorsque l'authentification de l'utilisateur est réussie : %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorité Syslog utilisée lorsque l'authentification de l'utilisateur a échoué : %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Présentation de l'invite OTP sur une ligne distincte" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ne pas tenir compte de « . » dans $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Toujours envoyer un courriel à chaque exécution de sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Envoi d'un courriel lorsqu'une authentification échoue" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Envoi d'un courriel si l'utilisateur ne figure pas dans sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envoi d'un courriel si l'utilisateur ne figure pas dans sudoers pour l'hôte sur lequel sudo est exécuté" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envoi d'un courriel si l'utilisateur n'est pas autorisé à exécuter une commande" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Envoi d'un courriel si l'utilisateur tente d'exécuter une commande" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Utilisation d'un horodatage distinct pour chaque couple utilisateur/terminal (user/tty)" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Adresse les recommandations d'usage à l'utilisateur lors de la première exécution de sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fichier contenant les recommandations sur l'usage de sudo : %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Exige l'authentification de l'utilisateur par défaut" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "L'utilisateur root peut exécuter sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Consignation du nom de l'hôte dans le fichier de journalisation (qui n'est pas syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Consignation de l'année dans le fichier de journalisation (qui n'est pas syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Démarrage d'un interpréteur de commande lorsque sudo est lancé sans argument" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Assigner le répertoire de l'utilisateur cible dans $HOME lorsque l'interpréteur de commandes est lancé avec l'option -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Assignation systématique du répertoire personnel de l'utilisateur cible dans $HOME" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Autorise la collecte de certaines informations dans le but d'afficher des messages d'erreurs pertinents" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Exige l'emploi du nom complet (fully qualified) de l'ordinateur dans le fichier sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Sermonne l'utilisateur lorsqu'un mot de passe incorrect est saisi" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Autorise l'utilisateur à exécuter sudo seulement à la condition qu'il dispose d'un terminal tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo se conformera au contenu de la variable d'environnement EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Demande de la saisie du mot de passe de root et non de celui de l'utilisateur" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Demande de la saisie du mot de passe runas_default de l'utilisateur et non de son propre mot de passe" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Demande de la saisie du mot de passe de l'utilisateur cible et non de celui de l'utilisateur exécutant la commande" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Utilisation des paramètres par défaut de la classe de connexion de l'utilisateur cible (lorsqu'elle existe)" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Définir les variables d'environnement LOGNAME et USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Assigne uniquement l'identifiant utilisateur (UID) effectif à l'utilisateur cible, et non à l'identifiant réel." + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "N'initialise pas le vecteur de groupe avec les valeurs de l'utilisateur cible" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Longueur après laquelle intercaler un retour à la ligne dans le fichier journal (0 indique qu'il n'y a pas de retour à la ligne) : %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Délai d'expiration de l'horodatage de l'authentification : %.1f minutes" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Délai d'expiration de l'invite de saisie de mot de passe : %.1f minutes" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Nombre de tentatives de saisie du mot de passe : %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask à utiliser, ou 0777 pour hériter de celui de l'utilisateur : 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Emplacement du fichier de journalisation : %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Emplacement du programme d'envoi de courriel : %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Attributs à utiliser avec le programme d'envoi de courriel : %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresse du destinataire des courriels : %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresse de l'expéditeur des courriels : %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Champ objet des courriels envoyés : %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Message informant de la saisie d'un mot de passe incorrect : %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Répertoire contenant l'attestation que l'utilisateur a déjà reçu les recommandations : %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Répertoire contenant l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Propriétaire du répertoire contenant l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Les utilisateurs de ce groupe sont affranchis des contraintes relatives au mot de passe et à PATH : %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Invite de mot de passe par défaut : %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "S'il est défini, passprompt se substituera toujours à l'invite du système." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utilisateur par défaut avec l'identité duquel exécuter les commandes : %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Nouvelle valeur prise par la variable $PATH de l'utilisateur : %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Emplacement de l'éditeur appelé par visudo : %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quand demander un mot de passe pour l'usage de la pseudo commande « list » : %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quand demander un mot de passe pour l'utilisation de la pseudo commande « verify » : %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Préchargement des fonctions d'exécution « à blanc » contenues dans la bibliothèque sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Si un annuaire LDAP est actif, faut-il tenir compter du fichier sudoers local" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Les descripteurs de fichiers >= %d seront fermés avant l'exécution d'une commande" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Si elle est définie, les utilisateurs peuvent passer outre la valeur de « closeform » grâce à l'option -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Autorise les utilisateurs à définir des variables d'environnement arbitraires" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Réinitialise l'environnement à un jeu de variables par défaut" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Variables d'environnement à valider pour s'assurer du bon fonctionnement :" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variables d'environnement à supprimer :" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variables d'environnement à conserver :" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rôle SELinux à utiliser dans le nouveau contexte de sécurité : %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Type SELinux à utiliser dans le nouveau contexte de sécurité : %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Emplacement du fichiers d'environnement propre à sudo : %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Emplacement du fichiers d'environnement restreint propre à sudo : %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Environnement linguistique à utiliser lors de l'analyse syntaxique de sudoers : %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Autoriser sudo à demander la saisie d'un mot de passe même lorsque celui-ci sera affiché « en clair »" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Afficher un contrôle visuel lors de la saisie du mot de passe" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Utiliser le développement rapide des noms de fichiers, qui est moins fiable, mais ne nécessite pas d'accès au système de fichiers" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "L'umask indiqué dans sudoers se substituera à celui de l'utilisateur, même s'il est plus permissif" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Consignation des saisies des utilisateur dans le journal pour la commande en cours d'exécution" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Consignation du retour de la commande en cours d'exécution dans le journal" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Compression des informations renvoyées par les opérations d'E/S avec zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Exécute toujours les commandes dans un pseudo-terminal (tty)" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Greffon pour la prise en charge des groupes non-Unix : %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Répertoire dans lequel les informations renvoyées par les opérations d'entrée/sortie seront stockées : %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fichier dans lequel les informations renvoyées par les opérations d'entrée/sortie seront stockées : %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Ajout d'une entrée au fichier utmp/utmpx lors de l'allocation d'un pseudo-terminal" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Conservation dans utmp du nom de l'utilisateur runas, et non de celui de l'utilisateur appelant sudo" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Ensemble des privilèges permis : %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Ensemble des privilèges limités : %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Exécution des commandes sur un pseudo-terminal en tâche de fond" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nom de service PAM à utiliser : %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nom de service PAM à utiliser pour les interpréteurs de commandes : %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentative de création des données d'identification PAM pour l'utilisateur cible" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Création d'une nouvelle session PAM pour l'exécution de la commande" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Réaliser la gestion de la validation du compte PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Numéro de séquence maximum dans le journal E/S : %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Activation de la prise en charge de netgroup par sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Vérification que les droits du répertoire parent autorisent la modification des fichiers avec sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Suivre les liens symboliques lors de l'édition des fichiers avec sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Interroge le greffon de groupe pour les groupes système inconnus" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Faire correspondre les netgroups sur base du tuple entier: utilisateur, hôte et domaine" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le journal d'audit" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le journal des E/S" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Autoriser l'exécution des commandes même si sudo ne sait pas écrire dans le fichier journal" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Résoudre les groupes dans sudoers et établir la correspondance sur le ID de groupe au lieu du nom" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Les entrées du journal plus longues que cette valeur seront scindées en plusieurs messages dans syslog : %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utilisateur qui possèdera les fichiers journaux des E/S : %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Groupe qui possèdera les fichiers journaux des E/S : %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Mode de permission à utiliser sur les fichiers de journaux des E/S : 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Exécuter les commandes par descripteur de fichier plutôt que par chemin : %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer les entrées « Defaults » inconnues dans sudoers au lieu d'afficher un avertissement" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Temps en secondes après lequel la commande sera terminée : %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Autoriser l'utilisateur à spécifier un délai d'expiration sur la ligne de commande" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Forcer l'écriture des données du journal d'E/S sur disque immédiatement au lieu de les garde dans un tampon" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Inclure le ID du processus lors de la journalisation via syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Type de l'enregistrement de l'horodatage de l'authentification : %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Message de l'échec de l'authentification : %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorer la casse lors de la correspondance des noms d'utilisateurs" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorer la casse lors de la correspondance des noms de groupes" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Écrire dans le journal lorsqu'une commande est autorisée par sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Écrire dans le journal lorsqu'une commande est interdite par sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d entrée par défaut inconnue « %s »" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrée par défaut inconnue « %s »" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d pas de valeur précisée pour « %s »" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: pas de valeur précisée pour « %s »" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d les valeurs de « %s » doivent commencer par « / »" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: les valeurs de « %s » doivent commencer par « / »" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d l'option « %s » ne prend pas de valeur" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'option « %s » ne prend pas de valeur" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d type Defaults 0x%x invalide pour l'option « %s »" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: type Defaults 0x%x invalide pour l'option «␣%s␣»" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d la valeur « %s » ne convient pas pour l'option « %s »" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: la valeur « %s » ne convient pas pour l'option « %s »" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv : envp est corrompu, longueur incorrecte" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "impossible de créer à nouveau l'environnement" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "désolé, vous n'êtes pas autorisé à définir ces variables d'environnement : %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erreur d'analyse grammaticale dans %s aux environs de la ligne %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "erreur d'analyse grammaticale dans %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "le type résumé (digest type) %d pour n'est pas autorisé pour %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s : erreur en lecture" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s doit appartenir à l'utilisateur (uid) %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "seul le propriétaire doit avoir le droit en écriture sur %s" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "chargement de %s impossible : %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "le symbole « group_plugin » est introuvable dans %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s : la version majeure %d du greffon group est incompatible, la version attendue est %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossible de reconnaître le format de l'adresse IP « %s »" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossible de reconnaître le format du masque de sous-réseau « %s »" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Couples adresse IP locale/masque de sous-réseau :\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe mais n'est pas un répertoire (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "création du répertoire (mkdir) %s impossible" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossible de changer le mode de %s pour lui affecter 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "groupe inconnu : %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "lecture de %s impossible" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "création de %s impossible" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossible d'écrire dans le journal des E/S : %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erreur interne, le fichier journal des E/S pour l'événement %d n'est pas ouvert" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erreur interne, signal %d invalide" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: fichier de journalisation incorrect" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: il manque le champ d'horodatage" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: horodatage %s : %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: il manque le champ utilisateur" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: il manque le champ précisant l'utilisateur effectif (runas)" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: il manque le champ précisant le groupe effectif (runas)" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls n'est pas pris en charge lors de l'utilisation de ldap" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossible d'initialiser le certificat SSL et la base de clés : %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "TLS_CERT doit être défini dans %s pour pouvoir utiliser SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "initialisation de LDAP impossible : %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls est spécifié mais les bibliothèques LDAP ne gèrent pas ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "attribut sudoOrder invalide : %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports : valeur de port trop élevée" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "type d'uri LDAP non pris en charge : %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "fusion des URIs ldap et ldaps impossible" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossible de convertir sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "ouverture du fichier d'audit du système impossible" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "envoi du message d'audit impossible" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (suite de la commande) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "ouverture du fichier de journalisation impossible : %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "verrouillage du fichier de journalisation impossible : %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossible d'écrire le fichier journal : %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Pas d'utilisateur ou d'hôte" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "échec de la validation" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "l'utilisateur n'apparaît PAS dans sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "l'utilisateur n'est PAS autorisé sur cet hôte" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "commande non autorisée" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s n'apparaît pas dans le fichier sudoers. Cet incident sera signalé.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s n'est pas autorisé à exécuter sudo sur %s. Cet incident sera signalé.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Désolé, l'utilisateur %s ne peut pas utiliser sudo sur %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Désolé, l'utilisateur %s n'est pas autorisé à exécuter « %s%s%s » en tant que %s%s%s sur %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s : commande introuvable" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"« %s » trouvé dans « . » n'a pas été exécuté\n" +"Utilisez « sudo ./%s » si c'est bien la version de « %s » que vous souhaitez exécuter." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "échec de l'authentification" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "il est nécessaire de saisir un mot de passe" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u saisie de mot de passe incorrecte" +msgstr[1] "%u saisies de mots de passe incorrectes" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "duplication (dup) de stdin impossible : %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "exécution de %s impossible : %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "création du processus fils impossible : %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ouverture du tube impossible : %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "le résume (digest) de %s (%s) n'est pas dans le forme %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "impossible d'appliquer la fonction stat à %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rôle LDAP : %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrée sudoers :\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers : " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups : " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Options : " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Commandes :\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entrées Defaults correspondant pour %s sur %s :\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Paramètres par défaut de runas ou spécifiques aux commandes pour %s :\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utilisateur %s peut utiliser les commandes suivantes sur %s :\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utilisateur %s n'est pas autorisé à exécuter sudo sur %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "le sudoRole incomplet est ignoré : cn : %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "attribut LDIF invalide : %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s invalide défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "impossible d'analyser la liste des adresses réseau" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nom d'utilisateur pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID utilisateur pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID de groupe pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "nom d'hôte pas défini par l'interface utilisateur de sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "exécution de %s impossible" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "La version du greffon de politique de sudoers est %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "La version de la grammaire du fichier sudoers est %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Chemin d'accès à sudoers : %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "chemin d'accès à nsswitch : %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "chemin d'accès à ldap.conf : %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "chemin d'accès à ldap.secret : %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "activation d'un point d'ancrage de type %d (version %d.%d) impossible" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "enregistrement de l'uid %u dans le cache impossible" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "enregistrement de l'uid %u dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "impossible d'écrire l'utilisateur %s dans la cache" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "enregistrement des informations de l'utilisateur %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "enregistrement du gid %u dans le cache impossible" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "enregistrement du gid %u dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "impossible d'écrire le groupe %s dans la cache" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "enregistrement du groupe %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "enregistrement de la liste de groupe %s dans le cache impossible, l'entrée existe déjà" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossible d'écrire la liste de groupes dans la cache pour %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossible d'analyser les groupes pour %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossible d'analyser les gids pour %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "débordement de la pile perm" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "débordement inférieur de la pile perm" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "changement de l'identificateur de groupe (gid) de root impossible" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "changement du groupe effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "définition du vecteur du groupe effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "changement de l'uid effectif (runas) impossible" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "changement du groupe (gid) de sudoers impossible" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "trop de processus" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "récupération du répertoire de travail impossible" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "le chemin d'accès à l'audit user_cmnd a été tronqué : %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "le chemin d'accès à l'audit argv[0] a été tronqué : %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "le message audit_failure est trop long" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "initialisation de la source SSS impossible. SSSD est-il installé sur cette machine ?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "Le symbole « %s » est introuvable dans %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "les entrées par défaut posent un problème" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "aucune source sudoers valide n'a été trouvée, fin d'exécution" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "il est précisé dans sudoers que root n'est pas autorisé à utiliser sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "vous n'êtes pas autorisé à utiliser l'option -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "propriétaire du fichier d'horodatage (%s) : utilisateur inconnu" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "pas de terminal tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "désolé, vous devez avoir un terminal tty pour exécuter sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "commande dans le répertoire courant" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "désolé, vous n'êtes pas autorisé à définir un délai d'expiration de la commande" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "désolé, vous n'êtes pas autorisé à conserver l'environnement" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "commande trop longue" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s n'est pas un fichier ordinaire" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "Le fichier %s est la propriété de l'utilisateur (uid) %u, alors qu'il devrait appartenir à %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "Le fichier %s est ouvert en écriture pour tous" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "Le fichier %s a pour groupe (gid) %u, alors qu'il devrait appartenir au groupe %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "« -c %s » est réservé à l'utilisateur root" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de connexion inconnue : %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossible de résoudre l'hôte %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "option du filtre invalide : %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "attente maximum invalide : %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "facteur de vitesse invalide : %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing : %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing : %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing : %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Rejeu de la session sudo : %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "impossible d'ajouter l'événement à la queue" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "impossible d'initialiser le terminal tty en mode direct" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Attention : la taille du terminal n'est pas suffisante pour pouvoir rejouer correctement la séquence.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La taille du journal est %d × %d, la taille de votre terminal est %d × %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Rejeu terminé, appuyez sur n'importe quelle touche pour rétablir le terminal." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ligne invalide dans le fichier de timing : %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expression ambiguë « %s »" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "« ) » sans parenthèse ouvrante dans l'expression" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "terme de recherche « %s » inconnu" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s requiert un argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expression rationnelle invalide : %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "analyse de la date « %s » impossible" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "« ( » sans parenthèse fermante dans l'expression" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "« or » n'est pas autorisé en fin d'expression" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "« ! » n'est pas autorisé en fin d'expression" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "type de recherche %d inconnu" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "utilisation : %s [-hnRS] [-d répertoire] [-m nombre] [-s nombre] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "utilisation : %s [-h] [-d répertoire] -l [expression recherchée]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - rejeu du journal de la session sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options :\n" +" -d, --directory=rép indique le répertoire pour les journaux de sessions\n" +" -f, --filter=filtre indique quel(s) type(s) E/S à afficher\n" +" -h, --help affiche le message d'aide puis termine l'exécution\n" +" -l, --list liste les identificateurs de sessions disponibles,\n" +" il est possible d'ajouter une expression en paramètre\n" +" -m, --max-wait=val nombre maximum de secondes de temporisation entre les événements\n" +" -n, --non-interactive aucune demande, la session est envoyée sur la sortie standard\n" +" -R, --no-resize ne pas tenter de redimensionner le terminal\n" +" -S, --suspend-wait attend pendant que la commande a été suspendue\n" +" -s, --speed=valeur accélère ou ralentit l'exécution\n" +" -V, --version affiche la version du programme, puis termine l'exécution" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tl'hôte n'a pas de correspondance" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Commande autorisée" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Commande refusée" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Commande sans correspondance" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s est accessible en écriture pour les membres du groupe" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossible de tronquer le fichier d'horodatage à %lld octets" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "lecture de l'horloge impossible" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "un horodatage dans le futur a été ignoré" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "l'horodatage est trop avancé dans le future : %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "verrouillage du fichier d'horodatage %s impossible" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "le chemin d'accès au fichier d'état de la recommandation est trop long : %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "l'option -x sera supprimée dans une version ultérieure" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "envisagez plutôt l'utilisation de l'utilitaire cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "appuyer sur entrée pour éditer %s : " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'éditeur indiqué (%s) n'existe pas" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "aucun éditeur trouvé (chemin d'accès à l'éditeur : %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "erreur en écriture" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossible d'appliquer la fonction stat au fichier temporaire (%s), %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "fichier temporaire vide (%s), %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "l'éditeur (%s) a échoué, %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossible de rouvrir le fichier temporaire (%s), %s n'a pas été modifié." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "impossible d'analyser le fichier temporaire (%s), erreur inconnue" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erreur interne, impossible de trouver %s dans la liste !" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossible de définir (uid, gid) de %s à (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s et %s ne sont pas dans le même système de fichiers, tentative de renommage à l'aide de la commande mv" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "la commande a échoué : « %s %s %s », %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erreur lors du renommage de %s, %s n'a pas été modifié" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Et maintenant ?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Les options sont :\n" +" (e)dition du fichier sudoers (de nouveau)\n" +" e(x)it sans sauvegarde des modifications apportées au fichier sudoers\n" +" (Q)uitter et sauvegarder les modifications apportées au fichier sudoers (DANGER!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "exécution de %s impossible" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s : mauvais propriétaire (uid, gid), celui-ci devrait être (%u,%u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s : mauvais droits d'utilisation, le mode devrait être 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s : analyse réussie\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s n'est pas disponible, réessayez plus tard" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "impossible de verrouiller %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Éditer quand même ? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Erreur : %s:%d boucle dans %s « %s »" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Attention : %s:%d boucle dans %s « %s »" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Erreur : %s:%d il est fait mention de %s « %s » alors qu'il n'a pas été défini" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Attention : %s:%d il est fait mention de %s « %s » alors qu'il n'a pas été défini" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Attention : %s:%d %s « %s » n'est pas utilisé" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - édite le fichier sudoers en toute sécurité\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Options :\n" +" -c, --check mode de validation\n" +" -f, --file=fichier précise l'emplacement du fichier sudoers\n" +" -h, --help affiche l'aide puis termine l'exécution\n" +" -q, --quiet moins de messages d'erreur de syntaxe (mode silencieux)\n" +" -s, --strict validation stricte de la syntaxe\n" +" -V, --version affiche la version, puis termine l'exécution\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "nombre de niveaux d'inclusions trop élevé" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "la valeur d'attribut invalide est ignorée : %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "enregistrement des informations de l'utilisateur %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "enregistrement du groupe %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "enregistrement de la liste de groupe %s dans le cache impossible, mémoire insuffisante" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Rôle LDAP : INCONNU\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordre : %s\n" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "Chemin d'accès au fichier d'horodatage trop long : %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "impossible d'obtenir les stats de l'éditeur (%s)" + +#~ msgid "Password:" +#~ msgstr "Mot de passe :" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports : espace insuffisant pour étendre hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri :espace insuffisant pour créer hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 : erreur d'allocation" + +#~ msgid "unable to setup authentication" +#~ msgstr "configuration de l'authentification impossible" + +#~ msgid "invalid uri: %s" +#~ msgstr "uri invalide : %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "fusion ldaps et starttls impossible" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "erreur interne : espace insuffisant pour la ligne de journalisation" + +#~ msgid "value out of range" +#~ msgstr "valeur hors de limites " + +#~ msgid "writing to standard output" +#~ msgstr "écriture vers la sortie standard" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "le nombre d'expressions entre parenthèses est trop élevé, le maximum autorisé est %d" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s appartient à l'utilisateur identifié par %u, alors qu'il devrait appartenir à l'utilisateur identifié par %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s peut être modifié par d'autres utilisateur que son propriétaire (0%o), le mode des privilèges devrait être 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s existe mais n'est pas un fichier ordinaire (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s peut être modifié par d'autres utilisateurs que son propriétaire (0%o), le mode des privilèges devrait être 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "suppression de %s impossible, l'horodatage sera réinitialisé à la date courante" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args : débordement du tampon" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s : %s_Alias %s n'est pas utilisé" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s : %s aux environs de la ligne %d <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok : %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate : %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit : échec" + +#~ msgid "getauid failed" +#~ msgstr "échec de getauid" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject : échec" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args : échec" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32 : échec" + +#~ msgid "getauid: failed" +#~ msgstr "getauid : échec" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text : échec" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "impossible d'initialiser la localisation à « %s », initialisation à « C »" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Commandes :\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr " : " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "impossible d'enregistrer l'uid %u (%s) dans le cache, l'entrée existe déjà" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "impossible d'enregistrer le gid %u (%s) dans le cache, l'entrée existe déjà" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "impossible d'appliquer dlopen à %s : %s" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "impossible d'exécuter %s : %s" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep : tv_sec %ld, tv_nsec %ld" + +#~ msgid "invalid regex: %s" +#~ msgstr "Expression régulière invalide : %s" diff --git a/utsudo-0.0.2/plugins/sudoers/po/fur.mo b/utsudo-0.0.2/plugins/sudoers/po/fur.mo new file mode 100644 index 0000000000000000000000000000000000000000..8fb36e6d02aadf6cc8ef3ed9258bf7eaef7ae319 GIT binary patch literal 9485 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 Pq4jM*qU!o2h<5)UJCWTz literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/fur.po b/utsudo-0.0.2/plugins/sudoers/po/fur.po new file mode 100644 index 0000000..4423803 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/fur.po @@ -0,0 +1,2119 @@ +# Friulian translations for sudoers package +# This file is put in the public domain. +# Fabio Tomat , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.22b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-18 10:37-0700\n" +"PO-Revision-Date: 2017-12-24 14:18+0100\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.3\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "erôr di sintassi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Password di %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] password par %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Password: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** informazions di SIGURECE par %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Torne prove." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:651 +#: plugins/sudoers/defaults.c:906 plugins/sudoers/defaults.c:1077 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2221 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3607 +#: plugins/sudoers/ldap.c:3623 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:563 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:998 +#: plugins/sudoers/match.c:617 plugins/sudoers/match.c:664 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:915 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:353 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1073 plugins/sudoers/sssd.c:1252 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sssd.c:1282 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1254 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1406 +#: plugins/sudoers/sudoreplay.c:1415 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/sudoreplay.c:1433 plugins/sudoers/sudoreplay.c:1437 +#: plugins/sudoers/sudoreplay.c:1593 plugins/sudoers/sudoreplay.c:1597 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:397 +#: plugins/sudoers/timestamp.c:441 plugins/sudoers/timestamp.c:868 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "impussibil assegnâ memorie" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "un digest al domande un non di percors" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "" + +#: gram.y:624 plugins/sudoers/policy.c:314 +msgid "timeout value too large" +msgstr "valôr di timeout masse larc" + +#: gram.y:626 plugins/sudoers/policy.c:316 +msgid "invalid timeout value" +msgstr "valôr di timeout no valit" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:651 plugins/sudoers/defaults.c:906 +#: plugins/sudoers/defaults.c:1077 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2220 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3606 +#: plugins/sudoers/ldap.c:3622 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:562 +#: plugins/sudoers/logging.c:998 plugins/sudoers/match.c:616 +#: plugins/sudoers/match.c:663 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:914 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:128 +#: plugins/sudoers/policy.c:137 plugins/sudoers/policy.c:146 +#: plugins/sudoers/policy.c:172 plugins/sudoers/policy.c:299 +#: plugins/sudoers/policy.c:314 plugins/sudoers/policy.c:316 +#: plugins/sudoers/policy.c:342 plugins/sudoers/policy.c:352 +#: plugins/sudoers/policy.c:396 plugins/sudoers/policy.c:406 +#: plugins/sudoers/policy.c:415 plugins/sudoers/policy.c:424 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/set_perms.c:387 +#: plugins/sudoers/set_perms.c:766 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1476 plugins/sudoers/set_perms.c:1641 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:352 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1073 +#: plugins/sudoers/sssd.c:1251 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sssd.c:1282 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1254 plugins/sudoers/sudoreplay.c:1366 +#: plugins/sudoers/sudoreplay.c:1406 plugins/sudoers/sudoreplay.c:1415 +#: plugins/sudoers/sudoreplay.c:1425 plugins/sudoers/sudoreplay.c:1433 +#: plugins/sudoers/sudoreplay.c:1437 plugins/sudoers/sudoreplay.c:1593 +#: plugins/sudoers/sudoreplay.c:1597 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:397 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/timestamp.c:868 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impussibil otignî la classe di login pal utent %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "impussibil tacâ la autenticazion bsd" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "gjenar di autenticazion no valit" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "impussibil inizializâ la autenticazion BSD" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "impussibil conetisi al servidôr di autenticazion" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "conession pierdude al servidôr di autenticazion" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erôr dal servidôr di autenticazion:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impussibil analizâ '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impussibil assegnâ opzions: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impussibil otignî credenziâls: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impussibil archiviâ la credenziâl te cache: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Impussibil verificâ TGT! Pussibil atac in vore!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "impussibil inizializâ PAM" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "validazion account falide, isal blocât?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Acount o password scjadude, ristabilìs la password e torne prove" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impussibil cambiâ la password scjadude: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Password scjadude, contatâ l'aministradôr di sisteme" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erôr di autenticazion PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "no tu esistis te base di dâts %s" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "no si è rivâts a inizializâ la librarie API ACE" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "impussibil contatâ il servidôr SecurID" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "ID utent blocât pe autenticazion SecurID" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "lungjece dal non utent no valide par SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "Comunicazion SecurID falide" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "erôr SecurID no cognossût" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "lungjece dal passcode no valide par SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "impussibil inizializâ la session SIA" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "metodis di autenticazion no valits" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "nissun metodi di autenticazion" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Impussibil inizializâ i metodis di autenticazion." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Metodis di autenticazion:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "uid no cognossût: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:908 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "utent no cognossût: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Ignore '.' in $PATH" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Invie une mail se la autenticazion dal utent e falìs" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Invie une mail se l'utent nol è tai sudoers" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Invie une mail se l'utent nol è tai sudoers par chest host" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Invie une mail se l'utent nol pues eseguî un comant" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Invie une mail se l'utent al cîr di eseguî un comant" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "L'utent root al pues eseguî sudo" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Regjistre il non host tal file di regjistri (no-syslog)" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Regjistre l'an tal file di regjistri (no-syslog)" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Non dal servizi PAM di doprâ: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Non dal servizi PAM di doprâ pes interfacis di acès: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentatîf di stabilî lis credentziâls PAM pal utent designât" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:485 +#, fuzzy, c-format +#| msgid "Authentication methods:" +msgid "Authentication failure message: %s" +msgstr "Metodis di autenticazion:" + +#: plugins/sudoers/defaults.c:221 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:267 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:290 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:343 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1270 +#: plugins/sudoers/ldap.c:1497 plugins/sudoers/ldap.c:1822 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/policy.c:619 plugins/sudoers/policy.c:629 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "erôr interni, %s overflow (stranfât)" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: erôr di leture" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "impussibil cjariâ %s: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:175 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1355 +#: plugins/sudoers/sudoreplay.c:1559 plugins/sudoers/timestamp.c:406 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "impussibil vierzi %s" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:857 plugins/sudoers/sudoreplay.c:1670 +#, c-format +msgid "unable to read %s" +msgstr "impussibil lei %s" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:295 plugins/sudoers/timestamp.c:298 +#, c-format +msgid "unable to write to %s" +msgstr "impussibil scrivi su %s" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "impussibil creâ %s" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impussibil scrivi sul file di regjistri I/O: %s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to get GMT time" +msgstr "impussibil otignî la ore GMT" + +#: plugins/sudoers/ldap.c:1262 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1986 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2559 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2561 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2617 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2625 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1647 +#, c-format +msgid " Commands:\n" +msgstr " Comants:\n" + +#: plugins/sudoers/ldap.c:3187 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impussibil inizializâ LDAP: %s" + +#: plugins/sudoers/ldap.c:3223 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3475 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "impussibil vierzi il sisteme di audit" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "impussibil inviâ il messaç di audit" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "impussibil vierzi il file di regjistri: %s" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "impussibil blocâ il file di regjistri: %s" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "impussibil scrivi il file di regjistri: %s" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Nissun utent o host" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "validazion falide" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "l'utent NOL è in sudoers" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "l'utent NOL è autorizât sul host" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "comant no permetût" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nol è tal file sudoers. Chest incident al vignarà segnalât.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nol è permetût eseguî sudo su %s. Chest incident al vignarà segnalât.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Mi displâs, l'utent %s nol pues eseguî sudo su %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: comant no cjatât" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "autenticazion falide" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "e covente une password" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:654 +msgid "unable to fork" +msgstr "impussibil inglovâ (fâ il fork)" + +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to fork: %m" +msgstr "impussibil inglovâ (fâ il fork): %m" + +#: plugins/sudoers/logging.c:704 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impussibil vierzi il condot (pipe): %m" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impussibil fâ il \"dup\" di \"stdin\": %m" + +#: plugins/sudoers/logging.c:767 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impussibil eseguî %s: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr " Opzions: " + +#: plugins/sudoers/policy.c:84 plugins/sudoers/policy.c:110 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:289 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:433 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:437 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:441 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:445 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:793 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "impussibil eseguî %s" + +#: plugins/sudoers/policy.c:926 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:928 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Percors di sudoers: %s\n" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "percors di nsswitch: %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "percors di ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:938 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "percors di ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:971 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "masse procès" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "impussibil otignî la cartele di vore atuâl" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sssd.c:1562 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" + +#: plugins/sudoers/sssd.c:1567 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utent %s al pues eseguî su %s i comants chi daurman:\n" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utent %s nol pues eseguî sudo su %s.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "impussibil inizializâ i valôrs predefinîts di sudoers" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "mi displâs, si scugne vê un tty par eseguî sudo" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:487 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "comant masse lunc" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nol è un file regolâr" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:222 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:993 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:805 plugins/sudoers/sudoreplay.c:895 +#: plugins/sudoers/sudoreplay.c:974 plugins/sudoers/sudoreplay.c:989 +#: plugins/sudoers/sudoreplay.c:996 plugins/sudoers/sudoreplay.c:1003 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/sudoreplay.c:1017 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:750 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1222 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1248 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1263 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1266 plugins/sudoers/sudoreplay.c:1646 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1279 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1281 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1283 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1332 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1370 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1388 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1395 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1402 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1411 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1420 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1826 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1829 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1838 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1840 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:230 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:306 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:772 plugins/sudoers/timestamp.c:839 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/timestamp.c:786 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:798 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:893 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:937 plugins/sudoers/timestamp.c:957 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/hr.mo b/utsudo-0.0.2/plugins/sudoers/po/hr.mo new file mode 100644 index 0000000000000000000000000000000000000000..25c507a33c552fa0ce35cf563146e8a8f3980947 GIT binary patch literal 50700 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/hr.po b/utsudo-0.0.2/plugins/sudoers/po/hr.po new file mode 100644 index 0000000..94e99f6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/hr.po @@ -0,0 +1,2558 @@ +# Translation of sudoers to Croatian. +# This file is put in the public domain. +# +# Božidar Putanec , 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 12:58-0700\n" +"Last-Translator: Božidar Putanec \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.2.4\n" +"X-Poedit-Basepath: ../packages/sudo-1.8.23b2\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "pogreška u sintaksi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Lozinka za %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] lozinka za %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Lozinka: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIGURNOSNE informacije za %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Pokušajte ponovo." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "nije moguće dodijeliti memoriju" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "kontrolni zbroj zahtijeva ime staze" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "nevaljana „notbefore“ vrijednost" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "nevaljana „notafter“ vrijednost" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "vrijednost za istek vremena je prevelika" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "nevaljana vrijednost za istek vremena" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias „%s“ je već definirani" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "nije moguće stvoriti novi proces (greška u fork())" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "nije moguće promijeniti lozinku za %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nije moguće dobiti razred klasu korisnika %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "nije moguće početi s BSD autentifikacijom" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "nevaljana vrsta autentifikacije" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "nije moguće inicijalizirati BSD autentifikaciju" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "vaš račun nije valjan, istekao je" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "odobrenje nije uspjelo" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "nije moguće pročitati konfiguraciju FWTK" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "nije moguće spojiti se na autentifikacijski poslužitelj" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "veza s autentifikacijskim poslužiteljem je prekinuta (izgubljena)" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"greška autentifikacijskoga poslužitelja:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: nije moguće pretvoriti principala u string („%s“): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nije moguće raščlaniti „%s“: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nije moguće naći verifikacijsku predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nije moguće dodijeliti opcije: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nije moguće dobiti verifikaciju: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nije moguće inicijalizirati verifikacijsku predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nije moguće spremiti verifikaciju u predmemoriju: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nije moguće dobiti principala: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nije moguće provjeriti TGT! Mogući napad!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "nije moguće inicijalizirati PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Greška PAM autentifikacije: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "provjera valjanosti računa nije uspjela, je li vaš račun zaključan?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Račun ili lozinka su istekli, postavite novu lozinku i pokušajte ponovo" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nije moguće promijeniti zastarjelu lozinku: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Lozinka je istekla, javite se vašem administratoru sustava" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Račun je istekao ili PAM konfiguracija nema sekciju „account“ za sudo, javite se vašem administratoru sustava" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Pogreška u upravljanju PAM računom: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vas nema u %s bazi podataka" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "nije uspjelo inicijalizirati ACE API biblioteku" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "nije moguće uspostaviti vezu sa SecurID poslužiteljem" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Korisnikov ID je zaključan prilikom SecurID autentifikacije" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "nevaljana duljina imena korisnika za SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "nevaljani autentifikacijski token za SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID komunikacija nije uspjela" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "nepoznata SecurID greška" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "nevaljana duljina lozinke za SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "nije moguće inicijalizirati SIA sesiju" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "nevaljane metode autentifikacije" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Nevaljane metode autentifikacije su ugrađene u sudo! Ne smijete miješati samostalne i nesamostalne autentifikacije." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "nema metoda autentifikacije" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Metode autentifikacije nisu ugrađene u sudo! Ako želite isključiti autentifikaciju, koristite konfiguracijsku opciju --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Nije moguće inicijalizirati metode autentifikacije." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Metode autentifikacije:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Nije bilo moguće odrediti uvjete za reviziju" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "revizijski izvještaj nije bilo moguće zapisati na disk" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vjerujemo da vam je administrator lokalnog sustava održao uobičajeno\n" +"predavanje. To se obično svodi na sljedeće tri stvari:\n" +"\n" +" #1) Poštujte tuđu privatnost.\n" +" #2) Mislite prije tipkanja.\n" +" #3) S velikim moćima dolazi velika odgovornost.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "nepoznati UID: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "nepoznati korisnik: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "inkrement redoslijeda (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "početni redoslijed (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "popuna redoslijeda (order): %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s inačica %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s inačica gramatike %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nepodržani ulazni formata %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nepodržani izlazni formata %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: ulazna i izlazna datoteka moraju biti različite datoteke" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "nije moguće inicijalizirati zadane vrijednosti sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nepoznata ključna riječ: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "nevaljane zadane vrste: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "nevaljana vrsta za izostavljanje: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "nevaljani filtar: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "nije moguće otvoriti %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "nije uspjelo raščlaniti %s datoteku, nepoznata greška" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "greška u raščlambi u %s blizu retka %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "greška u raščlambi u %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "nije moguće pisati u %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - pretvara formate sudoers datoteka\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcije:\n" +" -b, --base=dn osnovni DN za sudo LDAP upite\n" +" -c, --config=conf_file staza do konfiguracijske datoteke\n" +" -d, --defaults=deftypes pretvori samo Defaults od specificiranih deftypes\n" +" -e, --expand-aliases proširuje aliase kada pretvara\n" +" -f, --output-format=format izlazni format jedan od: JSON, LDIF ili sudoers\n" +" -i, --input-format=format ulazni format jedan od: LDIF ili sudoers\n" +" -I, --increment=num inkrement za num svaki sudoOrder\n" +" -h, --help pokaže ovu pomoć i završi\n" +" -m, --match=filter pretvori samo stavke koje podudaraju filter\n" +" -M, --match-local filter rabi passwd i group baze podataka\n" +" -o, --output=output_file pretvoreni sudoers zapiše u output_file\n" +" -O, --order-start=num prvi sudoOrder započinje od num\n" +" -p, --prune-matches izreže nepodudarne korisnike, grupe i računala\n" +" -P, --padding=num osnovna popuna za sudoOrder inkrement\n" +" -s, --suppress=sections izostavi izlaz od sections sekcija\n" +" -V, --version informira o inačici ovog programa i završi" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "nepoznati unos defaults „%s“" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "nije moguće dobiti GMT vrijeme" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "nije moguće oblikovati vremensku oznaku" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "**interna greška**, %s prelijevanje" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "previše sudoers grešaka, maksimum je %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "varijabla okoline SUDOERS_BASE nije postavljena i -b opcija nije specificirana." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Alat za bilježenje ako se syslog koristi za pisanje dnevnika: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Pri uspješnoj autentifikaciji korisnika rabi se syslog prioritet: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Pri neuspješnoj autentifikaciji korisnika rabi se syslog prioritet: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Postavite OTP (One-Time-Password) prompt u zasebni, vlastiti redak" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorira se „.“ u $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Poštu poslati kad god se pokrene sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Poštu poslati ako autentifikacija korisnika nije uspjela" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Poštu poslati ako korisnik nije u sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Poštu poslati ako korisnik nije u sudoers na ovom računalu" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Poštu poslati ako korisnik nema dopuštenje za pokretanje naredbe" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Poštu poslati ako korisnik pokušava unositi naredbe" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Za svaku kombinaciju korisnik/terminal koristi se zasebna vremenska oznaka" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Korisnika podučiti prilikom prvog pokretanja sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datoteka koja sadrži sudo poduku: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Po zadanim postavkama zahtijeva se autentifikacija korisnika" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root smije pokrenuti sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ime računala zapiše se u (ne-syslog) dnevničku datoteku" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Godina se zapiše u (ne-syslog) dnevničku datoteku" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ako se sudo pozove bez argumenata, pokrene se ljuska" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Postavlja $HOME na ciljanoga korisnika pri pokretanju ljuske s opcijom -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Uvijek postavlja $HOME na osobni direktorij ciljanoga korisnika" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dopušteno je prikupljanje informacija za ispis korisnih poruka o greškama" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Datoteka sudoers zahtjeva potpuno kvalificirana (fully-qualified) imena računala" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Korisnika izgrditi ako upiše netočnu lozinku" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Korisniku dopustiti pokretanje sudo samo ako ima tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo poštuje varijablu okoline EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Zatražiti root lozinku umjesto lozinke korisnika" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Zatražiti lozinku runas_default korisnika a ne lozinku trenutačnoga korisnika" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Zatražiti lozinku ciljanoga korisnika a ne lozinku trenutačnoga korisnika" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Ako postoje, primijeniti zadane vrijednosti iz login klase ciljanoga korisnika" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Postavlja varijable okoline LOGNAME i USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Postavlja samo efektivni UID na onaj ciljanoga korisnika umjesto stvarnog UID" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne inicijalizirati grupni vektor na onaj od ciljanoga korisnika" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Pozicija na kojoj se prelamaju redci dnevničke datoteke (0, bez prelamanja): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Istek vremena za vremensku oznaku autentifikacije: %.1f minuta" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Istek vremena za unos lozinke: %.1f minuta" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Broj pokušaja unosa lozinke: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask za korištenje ili 0777 za korisničku: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Staza do dnevničke datoteke: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Staza do programa pošte: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Zastavice za program pošte: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adresa na koju se šalje pošta: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adresa s koje se šalje pošta: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Redak za upis predmeta (subject) poštanskih poruka: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Poruka za netočnu lozinku: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Staza do direktorija s lekcijom: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Staza do direktorija s vremenskim oznakama autentifikacije: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Vlasnik direktorija s vremenskim oznakama autentifikacije: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Korisnici u ovoj grupi su izuzeti od zahtjeva za unos lozinke i PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Zadani zahtjev (prompt) za lozinku: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ako je postavljen, passprompt će zamijeniti prompt sustava u svim slučajevima." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Zadani korisnik za pokretanje naredbi: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Vrijednost s kojom se zamijeni korisnikov $PATH: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Staza do uređivača koji će koristiti visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kada zatražiti lozinku za pseudonaredbu „list“: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kada zatražiti lozinku za pseudonaredbu „verify“: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Prethodno učitati prividne izvršne funkcije sadržane u biblioteci sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ako je dostupni LDAP direktorij, zanemaruje li se lokalna sudoers datoteka" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Deskriptori datoteka >= %d biti će zatvoreni prije izvršavanja naredbe" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Ako je postavljena, korisnici mogu zamijeniti vrijednost „closeform“ s opcijom -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Korisnici mogu postaviti bilo koje varijable okoline" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Okolinu vratiti u zadani skup varijabli okoline" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Varijable okoline čije „zdravlje“ treba ispitati:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Varijable okoline koje treba ukloniti:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Varijable okoline koje treba sačuvati:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux uloga za korištenje u novom sigurnosnom kontekstu: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux vrsta za korištenje u novom sigurnosnom kontekstu: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Staza do datoteke okoline specifične za sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Staza do datoteke okoline s ograničenim pristupom specifične za sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Locale za korištenje pri obradi sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dopustiti da sudo zatraži lozinku čak i ako će biti vidljiva" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Vizualno pokazati rezultat nakon unosa lozinke korisnikom" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Rabi se brže i manje precizno podudaranje ali nema dostupa datotečnom sustavu" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "U sudoers specificirani umask zamijeniti će korisnički čak i ako je tolerantniji" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Urudžbirati korisnikom pokrenute naredbe" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Urudžbirati izlaz pokrenute naredbe" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "U/I urudžbirane dnevnike komprimirati s programom zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Naredbe uvijek pokrenuti u pseudo-TTY" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin za podršku za ne-Unix grupe: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Direktorij u kojem se spremaju ulazno/izlazni dnevnici: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datoteka u koju se sprema ulazno/izlazni dnevnik: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodati stavku u utmp/utmpx datoteku pri dodijeli pseudoterminala" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Postaviti korisnika u utmp na runas-korisnika umjesto na pozivatelja" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Skup dopuštenih privilegija: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Skup limitiranih privilegija: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Pokrenuti naredbe na pseudoterminalu u pozadini" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Naziv PAM usluge za upotrebu: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Naziv PAM usluge za upotrebu za prijavnu ljusku: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Pokušaj da se uspostavi PAM verifikacija za ciljanoga korisnika" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Kreira novu PAM sesiju za izvršavanje naredbe" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Provjeri upravljanje s PAM računom" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maksimalni redni broj U/I dnevnika: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Omogućite podršku mrežnih grupa (netgroup) u sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Provjerite mogućnost pisanja u naddirektorijima kad se koristi sudoedit za uređivanje" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Slijedi simboličke veze kad se koristi sudoedit za uređivanje datoteka" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Ispituje plugin grupe za nepoznate sustavske grupe" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Podudaranje mrežnih grupa bazira se na kompletnoj n-torki: korisnik, računalo, domena" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u revizijski dnevnik" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u U/I dnevnik" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Naredbe je dopušteno izvršiti iako ih sudo ne može upisati u dnevnik" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Razriješi grupe u sudoers i podudari ih po ID grupe umjesto po imenu grupe" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Dnevničke stavke veće od ove vrijednosti podijeliti će se u više syslog poruka: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Korisnik koji će biti vlasnik U/I dnevnika: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupa koja će biti vlasnik U/I dnevnika: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Prava pristupa za uporabu za U/I dnevnike: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Izvrši naredbe pomoću deskriptora datoteke umjesto staze: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Nepoznati zadani podaci za sudoers se ignoriraju umjesto ispisa upozorenja" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Vrijeme u sekundama nakon kojeg se naredba prekida: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Dopustite korisniku da specificira istek vremena na komandnom retku" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "U/I dnevnik ispisivati direktno na disk umjesto preko međuspremnika" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "U syslog dnevnik upisivati i ID procesa" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Vrsta zapisa autentifikacijskih vremenskih oznaka: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Greška u provjeri autentičnosti: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorira se veličina slova kad se uspoređuju imena korisnika" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorira se veličinu slova kada se uspoređuju imena grupa" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Dnevniči (upiše u dnevnik) onda kad sudoers dopusti naredbu" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Dnevniči (upiše u dnevnik) onda kad sudoers ne dopusti naredbu" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d nepoznata stavka zadanih vrijednosti „%s“" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nepoznata stavka zadanih vrijednosti „%s“" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nije navedena vrijednost za „%s“" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nije navedena vrijednost za „%s“" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d vrijednost za „%s“ mora početi s „/“" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: vrijednost za „%s“ mora početi s „/“" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d opcija „%s“ ne prihvaća vrijednost" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opcija „%s“ ne prihvaća vrijednost" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d nevaljana zadana vrsta 0x%x za opciju „%s“" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: nevaljana Defaults vrsta 0x%x za opciju „%s“" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d vrijednost „%s“ nije ispravna za opciju „%s“" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: vrijednost „%s“ nije ispravna za opciju „%s“" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: oštećen envp, duljina ne odgovara" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "nije moguće obnoviti okolinu" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "nemate dopuštenje za postavljanje sljedećih varijabli okoline: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "greška u raščlambi u %s blizu retka %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "greška u raščlambi u %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nepodržana vrsta kontrolnog zbroja %d za %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: greška čitanja" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "vlasnik %s mora biti UID %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mora biti dostupan za pisanje samo vlasniku" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "nije moguće učitati %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nije moguće pronaći simbol „group_plugin“ u %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nekompatibilna glavna inačica plugin grupe %d, očekivano je %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "„%s“ nije valjana IP adresa (nemoguće ju je raščlaniti)" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "„%s“ nije valjana mrežna maska (nemoguće ju je raščlaniti)" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Parovi lokalnih IP adresa i mrežnih maski:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s postoji, ali nije direktorij (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "nije moguće napraviti direktorij %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nije moguće promijeniti mȏd od %s na 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "nepoznata grupa: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "nije moguće pročitati %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "nije moguće stvoriti %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nije moguće pisati u U/I dnevnik: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: interna greška, U/I dnevnička datoteka za događaj %d nije otvorena" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: interna greška, nevaljani signal %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: nevaljana dnevnička datoteka" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: nedostaje polje za vremensku oznaku" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: vremenska oznaka %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: nedostaje polje za korisnika" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: nedostaje polje za runas-korisnika" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: nedostaje polje za runas-grupe" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls nije podržan kad se koristi ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nije moguće inicijalizirati SSL certifikat i bazu podataka ključeva: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "morate postaviti TLS_CERT u %s da koristite SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nije moguće inicijalizirati LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls je specificirani, ali LDAP biblioteke ne podržavaju ldap_start_tls_s() ili ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "nevaljani sudoOrder atribut: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port vrijednost je prevelika" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodržana vrsta adrese LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ne možete zajedno koristiti ldap i ldaps adrese" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nije moguće pretvoriti sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "nije moguće otvoriti sustav revizije" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nije moguće poslati revizijsku poruku" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (naredba se nastavlja) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "nije moguće otvoriti dnevničku datoteku: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nije moguće zaključati dnevničku datoteku: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "nije moguće pisati u dnevničku datoteku: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Nema korisnika ili računala" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "greška pri provjeri valjanosti" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "korisnik NIJE u sudoers" + +# Authentication is about who somebody is. +# Authorisation is about what they're allowed to do. +# https://en.wikipedia.org/wiki/AAA_(computer_security)#Authorization +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "korisnik NEMA ovlasti na računalu (nije autoriziran)" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "naredba nije dopuštena" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nije u sudoers datoteci. Ovaj će incident biti prijavljen.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" +"%s nema dopuštenja pokrenuti sudo na %s. Ovaj će incident biti prijavljen.\n" +"\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Nažalost, korisnik %s ne smije pokrenuti sudo na %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Nažalost, korisniku %s nije dopušteno izvršiti „%s%s%s“ kao %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: naredba nije pronađena" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"zanemaruje se „%s“ pronađen u „.“\n" +"Koristite „sudo ./%s“ ako je to „%s“ koji želite pokrenuti." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "neuspješna autentifikacija" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "nužna je lozinka" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u netočni pokušaj unosa lozinke" +msgstr[1] "%u netočna pokušaja unosa lozinke" +msgstr[2] "%u netočnih pokušaja unosa lozinke" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nije moguće duplicirati stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nije moguće izvršiti %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "nije moguće stvoriti novi proces (greška u fork()): %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nije moguće otvoriti cijev: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "kontrolni zbroj za %s (%s) nije u %s obliku" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "nije moguće dobiti status od %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP uloga: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers stavka:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opcije: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Naredbe:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Odgovarajući Defaults unosi za %s na %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas i Command-specifične zadane vrijednosti za %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Korisnik %s može pokrenuti sljedeće naredbe na %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Korisniku %s nije dopušteno pokrenuti sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorira se nekompletni sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "nevaljani LDIF atribut: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "nevaljana opcija %.*s postavljena kroz sudo front-end" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "nije moguće pročitati popis mrežnih adresa (nemoguće ih je raščlaniti)" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "ime korisnika nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "korisnički ID (user-ID) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "groupni ID (group-ID) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "ime računala (host name) nije postavio front-end sudo-a" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "nije moguće izvršiti %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Inačica sudoers plugina s pravilima %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Inačica sudoers datotečne gramatike %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Staza do sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch staza: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf staza: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret staza: %s\n" + +# hook: A location in a routine or program in which the programmer can connect or insert other routines for the purpose of debugging or enhancing functionality. +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nije moguće registrirati rutinu (hook) vrste %d (inačica %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "nije moguće zapamtiti (cache) UID %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nije moguće predmemorirati UID %u jer već postoji" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "nije moguće zapamtiti (cache) korisnika %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nije moguće predmemorirati korisnika %s jer već postoji" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "nije moguće zapamtiti (cache) GID %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nije moguće predmemorirati GID %u jer već postoji" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "nije moguće zapamtiti (cache) grupu %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nije moguće predmemorirati grupu %s jer već postoji" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nije moguće predmemorirati popis grupa za %s jer već postoji" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nije moguće zapamtiti (cache) popis grupa za %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nije moguće pročitati grupe za %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nije moguće razabrati GID-ove za %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "prelijevanje snopa s pravima pristupa" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "iscrpljenje snopa s pravima pristupa" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "nije moguće promijeniti na GID od root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "nije moguće promijeniti na runas GID" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "nije moguće postaviti runas grupni vektor" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "nije moguće promijeniti na runas UID" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "nije moguće promijeniti na sudoers GID" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "previše procesa" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "nije moguće odrediti trenutačni radni direktorij" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "skraćena (audit) staza revizije user_cmd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "skraćena (audit) staza revizije argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure poruka (revizije) je preduga" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nije moguće inicijalizirati SSS izvor. Je li SSSD instaliran na vašem računalu?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nije moguće pronaći simbol „%s“ u %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problem sa stavkama defaults" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "nisu pronađeni valjani sudoers izvori, kraj rada" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers specificira da root ne može koristiti sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "vama nije dopušteno koristi opciju -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "vlasnik vremenske oznake (%s): Nema takvog korisnika" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "nema TTY" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "nažalost, da pokrenete sudo morate imati TTY" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "naredba u trenutačnom direktoriju" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "nažalost, vama nije dopušteno postavljanje isteka vremena za naredbu" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "nažalost, vama nije dopušteno sačuvati okolinu" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "naredba je preduga" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nije obična datoteka" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "vlasnik %s je UID %u, a treba biti %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s smije svako mijenjati/pisati" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "vlasnik %s je GID %u, a treba biti %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "samo root može koristiti „-c %s“" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "nepoznata klasa prijave: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "nije moguće pronaći računalo %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "nevaljana opcija filtra: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "nevaljano maksimalno vrijeme čekanja: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "nevaljani faktor brzine: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/vrijeme: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/vrijeme: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/vrijeme: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduciranje sudo sesije: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "nije moguće dodati događaj u red čekanja" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "nije moguće postaviti TTY u direktni mȏd (da ne interpretira posebne znakove)" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Upozorenje: vaš terminal je premaleni da pravilno reproducira dnevnik.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Veličina dnevnika je %d x %d, a veličina vašeg terminala %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodukcija je završena -- obnovite terminal pritiskom na bilo koju tipku." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "nevaljani redak u timing datoteci: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "dvosmisleni izraz „%s“" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "nesparena „)“ u izrazu" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nepoznati pojam za pretragu „%s“" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s zahtijeva argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "nevaljani regularni izraz: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nije moguće raščlaniti datum „%s“" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "nesparena „(“ u izrazu" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "nedopušteni zaostali „or“" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "nedopušteni zaostali „!“" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "nepoznata vrsta za pretragu %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uporaba: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uporaba: %s [-h] [-d direktorij] -l [izraz za pretragu]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproducira dnevnike sudo sesija\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -d, --directory=dir navedite direktorij dir za dnevnike sesija\n" +" -f, --filter=filter navedite (filter) vrstu/vrste U/I koje treba prikazati\n" +" -h, --help pokaže ovu pomoć i iziđe\n" +" -l, --list popis dostupnih ID-ova sjednica koji se podudaraju\n" +" s neobveznim izrazom za pretragu\n" +" -m, --max-wait=num čekati ne više od num sekundi između događaja\n" +" -n, --non-interactive bez prompta - sesija se šalje na standardni izlaz\n" +" -R, --no-resize ne mijenjati veličinu terminala\n" +" -S, --suspend-wait čeka dok je naredba obustavljena\n" +" -s, --speed=num ubrza ili uspori reprodukciju\n" +" -V, --version informira o inačici ovog programa i iziđe" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tračunalo se ne podudara" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Naredba je dopuštena" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Naredba nije dopuštena" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Naredba nije prepoznata" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s članovi grupe mogu mijenjati/pisati" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nije moguće skratiti datoteku s vremenskim podacima na %lld bajtova" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "nije moguće pročitati vrijeme (clock)" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "ignorira se vremenska oznaka iz budućnosti" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "vremenska oznaka je predaleko u budućnosti: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nije moguće zaključati datoteku s vremenskim oznakama %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "staza do lekcije je preduga: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "opcija -x biti će uklonjena iz buduće inačice" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "molimo da umjesto toga pokušate rabiti cvtsudoers uslužni program" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "pritisnite return/enter za redigirati %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "navedeni uređivač (%s) ne postoji" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nijedan uređivač nije pronađen (editor path = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "greška pisanja" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nije moguće dobiti status privremene datoteke (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "privremena datoteka duljine nula (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "greška uređivač (%s), %s nije promijenjena" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s nije promijenjeno" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nije moguće ponovo otvoriti privremenu datoteku (%s), %s nije promijenjena." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "nije moguće raščlaniti privremenu datoteku (%s), nepoznata greška" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "**interna greška**, nije moguće pronaći %s na popisu!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nije moguće postaviti (UID, GID) od %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s nisu na istom datotečnom sustavu, koristi se mv za preimenovanje" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "naredba nije uspjela: „%s %s %s“, %s nije promijenjena" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "greška u preimenovanju %s, %s nije promijenjena" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Što sada? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Mogućnosti su:\n" +" (e) datoteku sudoers ponovno redigirati\n" +" (x) završiti bez spremanja promjena u datoteku sudoers)\n" +" (Q) prekinuti i spremiti promjene u datoteku sudoers (OPASNO!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "nije moguće pokrenuti %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: krivi vlasnik (UID, GID) a treba biti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: loša prava pristupa, trebala bi biti 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: raščlamba je uspjela\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s je zauzeti, pokušajte ponovo kasnije" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "nije moguće zaključati %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Ipak redigirati? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Greška: %s:%d ciklus u %s „%s“" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Upozorenje: %s:%d ciklus u %s „%s“" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Greška: %s:%d %s „%s“ se koristi ali nije definirano" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Upozorenje: %s:%d %s „%s“ se koristi ali nije definirano" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Upozorenje: %s:%d neupotrijebljeno %s „%s“" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sigurno redigira sudoers datoteku\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcije:\n" +" -c, --check samo testira sudoers datoteku\n" +" -f, --file=sudoers navedite alternativnu lokaciju sudoers datoteke\n" +" -h, --help pokaže ovu pomoć i iziđe\n" +" -q, --quite manje opširne (tihe) poruke grešaka u sintaksi\n" +" -s, --strick striktna testira sintaksu sudoers datoteke\n" +" -V, --version informira o inačici ovog programa i iziđe\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "previše razina uključivanja" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorira se nevaljana vrijednost atributa: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "nije moguće predmemorirati korisnika %s jer nema dovoljno memorije" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "nije moguće predmemorirati grupu %s jer nema dovoljno memorije" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "nije moguće predmemorirati popis grupa za %s jer nema dovoljno memorije" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP uloga: NEPOZNATA\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Redoslijed: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD uloga: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD uloga: NEPOZNATA\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Upozorenje: ciklus u %s „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Upozorenje: %s „%s“ ima referenciju ali nije definiran" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Upozorenje: %s „%s“ nije upotrebljen" + +#~ msgid "Password:" +#~ msgstr "Lozinka:" + +#~ msgid "unable to setup authentication" +#~ msgstr "ne mogu postaviti provjeru" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: nije uspio" + +#~ msgid "getauid failed" +#~ msgstr "getauid nije uspio" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: nije uspio" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: nije uspio" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: nije uspio" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: nije uspio" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: nije uspio" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: nema dovoljno prostora za proširenje međuspremnika računala" + +#~ msgid "invalid uri: %s" +#~ msgstr "neispravan uri: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ne mogu miješati ldaps i starttls" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: nema dovoljno prostora za izgradnju međuspremnika računala" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "neodgovarajuća sudo_ldap_build_pass1 alokacija" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "interna greška: nema dovoljno prostora za redak dnevnika" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Ne mogu izvršiti dlopen %s: %s" + +#~ msgid "writing to standard output" +#~ msgstr "ispisujem na standardni izlaz" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "previše izraza u zagradama, najviše %d" + +#~ msgid "invalid regex: %s" +#~ msgstr "neispravni regularni izraz: %s" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "vlasnik %s je uid %u, treba biti uid %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "nevlasnici imaju dozvolu za pisanje u %s (0%o), treba biti mod 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s postoji, ali nije obična datoteka (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "nevlasnici imaju dozvolu za pisanje u %s (0%o), treba biti mod 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "ne mogu ukloniti %s, vratit ću na početnu epohu" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: preljev međuspremnika" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "ne mogu odrediti stanje uređivača (%s)" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s kod retka %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "ne mogu postaviti lokal u „%s”, koristim „C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Naredbe:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "ne mogu staviti uid %u (%s) u spremnik, već postoji" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "ne mogu staviti gid %u (%s) u spremnik, već postoji" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "ne mogu izvršiti %s: %s" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "interna greška, expand_prompt() preljev" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "interna greška, sudo_setenv2() preljev" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "interna greška, sudo_setenv() preljev" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "interna greška, linux_audit_command() preljev" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "interna greška, runas_groups preljev" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "interna greška, init_vars() preljev" diff --git a/utsudo-0.0.2/plugins/sudoers/po/hu.mo b/utsudo-0.0.2/plugins/sudoers/po/hu.mo new file mode 100644 index 0000000000000000000000000000000000000000..97ad917dfd211e7ea9ed7995195576fd9a8853e6 GIT binary patch literal 26073 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

|1!ED8*8tPWJ~#Jz^lt0~1*=th;OOC2 zE`Nm#ptLcUPtYASl_)cR3_(uJ%d_uxTgAy#Vl=3c9=!<<%l9mhP@jmFG*Sy}GgD9fD9W}Lt+D$QJv zXUUw8J7ERAnS=8O_l;M+eRkW-9unK^yUGIQVP}{V!)@iDK54y$(hkrksptG2!xWtZ$MR7=IM{~0?M=;S*TG`KK z95z-9Rl(0}*N)eP?(42it?-In;r7k1W2l>A@>-6F2igtHCVPGR?2egW=GLgQ$hqtA zY~%b_qq3+Gk^_!g=kDzehG+1chi7ZLH&R@-nZ6-~bLry6aA|n@1l|<46^3V8aRWcP z9@U1Yvq;U?yC;M=i{dnH#FqBSF8p}z1N{s= zRmy}@)AjCJ;Vuo5;aPX=JUqR~_Xg`6KGYStR+W_LV1ou=Z#>8$M}X6l+&V}(mlO;jT;C!DLaqKUu_SF0o(TK$Br2sdg(v5Sda<#Up0 z*S~y+P_w~NhPDz->wON~91|n_%X*(Kb&BjCttX*RL^=_b;X?z&fGh(3)E0~s!@$u- z)X5`B=b+utv{7@tT8qnCk`ki5Qra?L-bH;bW7C6UZ2jxjN$WbIYvvOo3e=rcS(|(c-&(xFfM4QVK z`S`lnO&lb*(?+{?0#jQ@<47pDhmoGUH!rGjZETJpixtKaUHb-|RR^k`sn_E)Ji!!; z3u8wJx?8ASc2FR7qZ|+GmFuwj&X^)}DihJ9ef%4U7WrFaAv!S|aL2H?Go~$Hl2pXU zZ9m4=o*O=Tq8sr&msFsB{Y|p5s&JaRnhbI-xeZU(;f{FFh@l#bj%g8X8fbJ5)0<(; zf*HSxPUutBS_l5!QjdF2$`70{ZZok8ZU)+1i<}Mj4Z>(3InT8S>?z$7)i>hq@Uhfg zFXQZ(RZmS0)?ZL#H_e`1E6ch3cB0m9X^$d{>?za77M!&bIc#>*tY~6~MHkkDmE(Lv z19q)8Xo#jZ1t2Q8{6J@8(TZLAGcI#QFax%^zWe}#6-wPJy910q^hEJaWva& z;_HY_Hu;L8VIg(mvu!%G z8@tdt<(gK6cx29G`f=FU-jQI+OYM59oywNW5}2wzXPkGH;e48%yO%g!gCmf5a*aYE zHIVlPmVoB1MQFO|Pv3F>hU`z@@iENx8hv55)w?OLGfXMMcf~xUaRc2gp8zcaZ?)#CFQ_MJS5wE5 z3XU;`XV>5&7k%;PjIB-!4bOJE!?RKa&PwT?-Q!i!UAx`$Z(KNh=-BX{o92l>aKqV1 z&hH^eId^Z0B>PKu9Q&BTjipI-O-uX1F7#AOUP%>8!7`DZ{vg3+r4pp}2`q$23ab%i zs2_8X#(Q@Q7j4*;;s@`%G$TqfNt4D1;skSkHhvbSh=*s9A)DM5?P9q}P>w){A?d^` zYowjmSdfBVC`ePx!EQW*df%Mu<@Nxb;=E)j%JQ{6dDFbNrEytrVz)KgU8c4;dGapO2@|l<#G9@utTRGwL)RpcZ2`)=)4bQB|jOuR>>TrZuR0gWs z9;`&cq2U?KGHIeRTX6^K{d1o=A${+n0TN_!P4?HkA}&3^9Na5-SdB*hHoF>SGCa+? zxqx8`48NY}tHoNTIcbzBI8rV2!0-&5Y(OBgnz$pZ6Hb^;W5wB2x5Nc>izwJ^SSgYx z3!0-b@i&~_!U5@`e+RMi&(fSdj7M0OMuvbNUY8Ph>1qo1(&{!vy44lJiZ+~?Oa2%n zIOyIRqfX#67wix}6V2YQmIg)Lv8-{OIr0Z$C_iY77LxofLf?tSaC=;Sz=T)cjku~9 z5l~56Hyt;yO)24GGct!^&7P`AtqeGh7(7kFwtNK~0$6WkmQ*Bgw-t~yT1Np9q7ccM zvUEa$F+e=J3fI;ew8a3y&69dx@u-}YxUqBkRYLGU2*@Nj*Wx>56!VdPU0Iah43p5- zkD1;s;uJYd-ki%9Vm&-5M{=5)1zEapNG??O$(p)-ja)!`B4y_im0c)pP=zr?SVY|> z)eA$ROO0*^utIGm>6$~BV6z}h&_dy2lbP(pSDvpVgN!NCCXv`OJWR}k;e97eLyn^t zdB=G-W+Rz(=Hfc7ScsQV{qm|qF0!O-LMYHfESMlns;%JGwUq(78_|}RH6c2v#+d&X!oj$% zbc%~^*H$Oow}hLgSFpnm>G~Q*X1$7T+F`q)DB&y#`lyce(hWYhgU>o~^lIO{^)yy) z0j1?`Uvh5ZX&53NT}V3O8xiOk{wiiULUqfnbMX(PvVJazQ{JEOjIwFm5~rwBdBD!< z@WXE;1k`FA8zgosv%w`J-OF?#F@Yb<{dqUw&8%zS?ruU$pO!$t%z}B#ze2R&%mro? z>A@a9)~IMic{TX_ZGRU<<~R@N(zj;=iB;qF-tw0=j2QuTm%<<0WwwP0@ap&iRm=9I zwzmtvgT4`F^JWQ6&p+72zGJgl-@a262WnsB#)^;bhsrCG)*qP*Zi$Y(c_|>#%Xv$l zIdY2pB~c;~qD+*lEEaM2Ln}4{{y;%L3>x&vh@Rz)c|D`?%*qf&BScJRR?{GzPe8*) zN5~&qu^w^roTlqe^t7K(%}H23e>i0*ppSZyM71Mw*d*$>yD6K?ldVc!JB!lB>J(wCHxf*ClmxM!f;lPV72m_p+4;m4 z(;`;nimV>%KwMWUh|3a|x^xRdbKoCGmV;@Mxgq%=$(ZQV1vjEZu#Y|CeOYAE++gjE z!aL&roHAGn->s`XmQOG@x8zup?e{WLvc0l@6Qg3*%wv<*iBtSJ;wSm1EmVN(7m;8; zIPX_!jWYWrhO7L{E?QKKQ<@P$uO*fZ87UhkFIk*)GpqXY{V`>-NX7{;!S5WPimxsWT zYP%imeM&hug@;%S;}l|X?bn-vF(DQAl~QY%F8;=5($B(~A3j#En;BxGo6|LXMD9Ij zvvU)9iBf_={^{6bD0bk)US}Ui+Iw6YEL|j?s4`AiJc0gJX@H-jmjk1~+~rQ#MwS$5 z^~sYs?{l?JB^P95(TR`N+*e8?B zYp^po{BUK#rdsK=$Y&#%nhrg?tEI(R0(pcZ2V&&i@#g^kfMOi1xuHln@ju9rf`Lhh zVHf|^Z0e&Y!tuEQ9>Zws$-ynQvs0SI6={psxwj_0idFtOdT@t<)#AD67RqmvYcS z)=-{wd4>})!>uld;}kzz}n z*tK$eIG`>;Tal=v3|5r*DR2E%ev)b3$vR_CNdl|jhj6{z33-WqO1Mf9>2C*pw!O$6 z&rZDEfEFq@Hi=%nk+pnp7b?l*(g7WnZX&@Z5BG9tDmTu%&O6zp$1HMA(JWfMWGyLyc z)^6(W+;8X<{w&rdkWbJ^6mmH`HGI^?Uo9NO((!yTyV8sUJIgE|Cb+Y7WXT;YviT4g zm)3^+Hv|(*_XqD&&l;q+T-b{3urPQAwv98mlEz7|rt~r&K8ngyR%rNWpqk?ohw@(2 z*&z&?^LO!A#WWFT4rkU)n~_s6Z<$s4OSl!=X6I>A-u36}Iw1hl&9JFDBo>RS`=vDJ znw8u|{`G6Y#s+%V5$XIZu&e#BFF`MkE_}I7G(nuwVN@vZhV3;qwTZ2U{$5#o_|k#3 ztdX5@*OcHnkBBI6V@@Ek*p_;?xGC?V@L= z4U5xlCB%4A_8?7f+7%LaK+B&C49{|r7kSkU^@&9h!68=W&X>E83xg`+l&9E!(8b3^ z{uWiKy75M%+HD(ubtf}BODA^dHg3xn;BEp5AsH#thG@F-0UT$LFVoobGlyfXBDL$Cm3q=#}1r+j{nYrYsc>IEVyhI zbG2-&cKJJt)s2cjwy+2bM*{xBvhE literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/hu.po b/utsudo-0.0.2/plugins/sudoers/po/hu.po new file mode 100644 index 0000000..2e9239e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/hu.po @@ -0,0 +1,2152 @@ +# Hungarian translation for sudoers. +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2014. +# Gabor Kelemen , 2015. +# Balázs Úr , 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.22b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-18 10:37-0700\n" +"PO-Revision-Date: 2018-01-20 14:06+0100\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.2\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "szintaktikai hiba" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p jelszava: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p jelszava: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Jelszó: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BIZTONSÁGI információk erről: %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Elnézést, próbálja újra." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:651 +#: plugins/sudoers/defaults.c:906 plugins/sudoers/defaults.c:1077 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2221 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3607 +#: plugins/sudoers/ldap.c:3623 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:563 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:998 +#: plugins/sudoers/match.c:617 plugins/sudoers/match.c:664 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:915 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:353 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1073 plugins/sudoers/sssd.c:1252 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sssd.c:1282 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:1254 +#: plugins/sudoers/sudoreplay.c:1366 plugins/sudoers/sudoreplay.c:1406 +#: plugins/sudoers/sudoreplay.c:1415 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/sudoreplay.c:1433 plugins/sudoers/sudoreplay.c:1437 +#: plugins/sudoers/sudoreplay.c:1593 plugins/sudoers/sudoreplay.c:1597 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:397 +#: plugins/sudoers/timestamp.c:441 plugins/sudoers/timestamp.c:868 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "nem foglalható memória" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "egy kivonat egy útvonalnevet igényel" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "érvénytelen „notbefore” érték" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "érvénytelen „notafter” érték" + +#: gram.y:624 plugins/sudoers/policy.c:314 +msgid "timeout value too large" +msgstr "az időkorlát értéke túl nagy" + +#: gram.y:626 plugins/sudoers/policy.c:316 +msgid "invalid timeout value" +msgstr "érvénytelen időkorlát érték" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:651 plugins/sudoers/defaults.c:906 +#: plugins/sudoers/defaults.c:1077 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:980 plugins/sudoers/ldap.c:1174 +#: plugins/sudoers/ldap.c:1185 plugins/sudoers/ldap.c:1201 +#: plugins/sudoers/ldap.c:1493 plugins/sudoers/ldap.c:1653 +#: plugins/sudoers/ldap.c:1735 plugins/sudoers/ldap.c:1883 +#: plugins/sudoers/ldap.c:1907 plugins/sudoers/ldap.c:1996 +#: plugins/sudoers/ldap.c:2011 plugins/sudoers/ldap.c:2107 +#: plugins/sudoers/ldap.c:2140 plugins/sudoers/ldap.c:2220 +#: plugins/sudoers/ldap.c:2303 plugins/sudoers/ldap.c:2400 +#: plugins/sudoers/ldap.c:3235 plugins/sudoers/ldap.c:3267 +#: plugins/sudoers/ldap.c:3579 plugins/sudoers/ldap.c:3606 +#: plugins/sudoers/ldap.c:3622 plugins/sudoers/ldap.c:3713 +#: plugins/sudoers/ldap.c:3729 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:190 plugins/sudoers/logging.c:501 +#: plugins/sudoers/logging.c:522 plugins/sudoers/logging.c:562 +#: plugins/sudoers/logging.c:998 plugins/sudoers/match.c:616 +#: plugins/sudoers/match.c:663 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:914 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:128 +#: plugins/sudoers/policy.c:137 plugins/sudoers/policy.c:146 +#: plugins/sudoers/policy.c:172 plugins/sudoers/policy.c:299 +#: plugins/sudoers/policy.c:314 plugins/sudoers/policy.c:316 +#: plugins/sudoers/policy.c:342 plugins/sudoers/policy.c:352 +#: plugins/sudoers/policy.c:396 plugins/sudoers/policy.c:406 +#: plugins/sudoers/policy.c:415 plugins/sudoers/policy.c:424 +#: plugins/sudoers/policy.c:498 plugins/sudoers/policy.c:735 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/pwutil.c:165 +#: plugins/sudoers/pwutil.c:236 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:486 plugins/sudoers/pwutil.c:551 +#: plugins/sudoers/pwutil.c:620 plugins/sudoers/pwutil.c:778 +#: plugins/sudoers/pwutil.c:835 plugins/sudoers/pwutil.c:880 +#: plugins/sudoers/pwutil.c:938 plugins/sudoers/set_perms.c:387 +#: plugins/sudoers/set_perms.c:766 plugins/sudoers/set_perms.c:1150 +#: plugins/sudoers/set_perms.c:1476 plugins/sudoers/set_perms.c:1641 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:352 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1073 +#: plugins/sudoers/sssd.c:1251 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sssd.c:1282 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:1254 plugins/sudoers/sudoreplay.c:1366 +#: plugins/sudoers/sudoreplay.c:1406 plugins/sudoers/sudoreplay.c:1415 +#: plugins/sudoers/sudoreplay.c:1425 plugins/sudoers/sudoreplay.c:1433 +#: plugins/sudoers/sudoreplay.c:1437 plugins/sudoers/sudoreplay.c:1593 +#: plugins/sudoers/sudoreplay.c:1597 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:397 plugins/sudoers/timestamp.c:441 +#: plugins/sudoers/timestamp.c:868 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "A(z) „%s” álnév már meg van határozva" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "a bejelentkezési osztály lekérése sikertelen ennél a felhasználónál: %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "a BSD hitelesítés elkezdése sikertelen" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "érvénytelen hitelesítési típus" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "a BSD hitelesítés előkészítése sikertelen" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "az fwtk beállítás olvasása sikertelen" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "a hitelesítési kiszolgálóhoz való kapcsolódás sikertelen" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "a kapcsolat megszakadt a hitelesítési kiszolgálóval" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"hitelesítési kiszolgáló hiba:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: az elsődleges átalakítása karakterláncra („%s”) sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: „%s” feldolgozása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárának feloldása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: a kapcsolók lefoglalása sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: a hitelesítési adatok lekérése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárának előkészítése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: a hitelesítési adatok gyorsítótárban való tárolósa sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: az elsődleges gép lekérése sikertelen: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: a TGT nem ellenőrizhető! Lehetséges támadás! %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "a PAM előkészítése sikertelen" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "fiókellenőrzési hiba, a fiókja zárolva van?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "A fiók vagy a jelszó lejárt, állítsa vissza a jelszavát, és próbálja újra" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "a lejárt jelszó megváltoztatása sikertelen: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "A jelszó lejárt, vegye fel a kapcsolatot a rendszergazdával" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "A fiók lejárt vagy a PAM beállításból hiányzik egy „account” szakasz a sudo számára, vegye fel a kapcsolatot a rendszergazdával" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM hitelesítési hiba: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Ön nem létezik a(z) %s adatbázisban" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "nem sikerült előkészíteni az ACE API programkönyvtárat" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "a SecurID kiszolgálóhoz való kapcsolódás sikertelen" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "A felhasználó-azonosító zárolva van a SecurID hitelesítéshez" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "érvénytelen felhasználónév hossz a SecurID-nál" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "érvénytelen hitelesítéskezelés a SecurID-nál" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "a SecurID kommunikáció meghiúsult" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "ismeretlen SecurID hiba" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "érvénytelen jelkód hossz a SecurID-nál" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "a SIA munkamenet előkészítése sikertelen" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "érvénytelen hitelesítési módszerek" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Érvénytelen hitelesítési módszerek lettek belefordítva a sudo programba! Nem keverheti az önálló és a nem önálló hitelesítéseket." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "nincsenek hitelesítési módszerek" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Nincsenek hitelesítési módszerek belefordítva a sudo programba! Ha ki szeretné kapcsolni a hitelesítést, akkor használja a --disable-authentication konfigurációs kapcsolót." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "A hitelesítési módszerek előkészítése sikertelen." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Hitelesítési módszerek:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Nem sikerült meghatározni a felülvizsgálati feltételt" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "a felülvizsgálati rekord véglegesítése sikertelen" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Bízunk benne, hogy megkapta a szokásos tudnivalókat a helyi\n" +"rendszergazdától. Általában a következő három dolog lényeges:\n" +"\n" +" #1) Tartsa tiszteletben mások személyiségi jogait.\n" +" #2) Gondolkodjon gépelés előtt.\n" +" #3) A nagy erő nagy felelősséggel jár.\n" +"\n" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "ismeretlen uid: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:908 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "ismeretlen felhasználó: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog képesség, ha a syslog programot használják naplózáshoz: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "A használandó syslog prioritás, amikor a felhasználó sikeresen hitelesíti magát: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "A használandó syslog prioritás, amikor a felhasználó sikertelenül hitelesíti magát: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Az OTP kérdés elhelyezés a saját sorába" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "A „.” figyelmen kívül hagyása a $PATH változóban" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Mindig küldjön levelet, amikor a sudo fut" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Levél küldése, ha a felhasználó-hitelesítés sikertelen" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Levél küldése, ha a felhasználó nincs a sudoers fájlban" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Levél küldése, ha a felhasználó nincs a sudoers fájlban ennél a gépnél" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Levél küldése, ha a felhasználónak nem engedélyezett egy parancs futtatása" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Levél küldése, ha a felhasználó megpróbál egy parancsot futtatni" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Különálló időbélyeg használata minden felhasználó/tty párosnál" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Felhasználó oktatása a sudo első alkalommal történő futtatásakor" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "A sudo oktatóanyagot tartalmazó fájl: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Felhasználók hitelesítésének megkövetelése alapértelmezetten" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "A rendszergazda futtathatja a sudo programot" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "A gépnév naplózása a (nem syslog) naplófájlba" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Az év naplózása a (nem syslog) naplófájlba" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ha a sudo programot argumentumok nélkül hívják meg, akkor indítson egy parancsértelmezőt" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "A $HOME beállítása a célfelhasználóra, amikor a -s kapcsolóval indít egy parancsértelmezőt" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "Mindig állítsa be a $HOME értékét a célfelhasználó saját könyvtárára" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Néhány információ begyűjtésének engedélyezése hasznos hibaüzenetek adásához" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Teljes képzésű gépnevek megkövetelése a sudoers fájlban" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "A felhasználó piszkálása, amikor helytelen jelszót ad meg" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Csak akkor engedélyezze a sudo futtatását a felhasználónak, ha rendelkezik tty-nal" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "A visudo el fogja fogadni az EDITOR környezeti változót" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "A rendszergazda jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "A runas_default felhasználó jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "A célfelhasználó jelszavának bekérése, nem a felhasználóénak" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Alapértelmezések alkalmazása a célfelhasználó bejelentkezési osztályán, ha van ilyen" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "A LOGNAME és a USER környezeti változók beállítása" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Csak a tényleges uid beállítása a célfelhasználóra, nem a valódi uid értékének" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne készítse elő a csoportvektort a célfelhasználóéra" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "A hossz, amelyre a naplófájl sorait tördelni kell (0 esetén nincs tördelés): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Hitelesítési időbélyeg időkorlát: %.1f perc" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Jelszóbekérési időkorlát: %.1f perc" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Egy jelszómegadás kísérleteinek száma: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "A használandó umask vagy 0777 a felhasználóé használatához: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Útvonal a naplófájlhoz: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Útvonal a levelezőprogramhoz: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Jelzők a levelezőprogramhoz: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "A cím, amelyre a levelet küldeni kell: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "A cím, amelyről a levelet küldeni kell: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Tárgysor a levél üzeneteihez: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Helytelen jelszó üzenet: %s" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Útvonal az oktatóanyag állapot könyvtárához: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Útvonal a hitelesítési időbélyeg könyvtárához: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "A hitelesítési időbélyeg könyvtárának tulajdonosa: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Az ebben a csoportban lévő felhasználók mentesülnek a jelszó és PATH követelmények alól: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Alapértelmezett jelszóbekérés: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ha be van állítva, akkor a jelszóbekérés minden esetben felül fogja bírálni a rendszer bekéréseit." + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Alapértelmezett felhasználó a parancsok futtatásához másként: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Érték a felhasználó $PATH változójának felülbírálásához ezzel: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Útvonal a visudo által használt szerkesztőhöz: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Mikor szükséges jelszó a „list” álparancshoz: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Mikor szükséges jelszó a „verify” álparancshoz: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "A sudo_noexec programkönyvtárban található üres végrehajtási függvények előtöltése" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ha az LDAP könyvtár be van kapcsolva, akkor mellőzzük-e a helyi sodoers fájlt" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "A fájlleírók >= %d le lesznek zárva a parancs végrehajtása előtt" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Ha be van állítva, akkor a felhasználók felülbírálhatják a „closefrom” értékét a -C kapcsolóval" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Lehetővé teszi a felhasználóknak tetszőleges környezeti változók beállítását" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "A környezet visszaállítása egy alapértelmezett változókészletre" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Környezeti változók az épség ellenőrzéséhez:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Eltávolítandó környezeti változók:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Megőrzendő környezeti változók:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Az új biztonsági környezetben használandó SELinux szerep: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Az új biztonsági környezetben használandó SELinux típus: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Útvonal a sudo specifikus környezeti fájlhoz: %s" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Útvonal a korlátozott sudo specifikus környezeti fájlhoz: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "A sudoers feldolgozásakor használandó területi beállítás: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Lehetővé tenni a sudo számára egy jelszó bekérését akkor is, ha látható lesz" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Látható visszajelzés nyújtása a jelszóbekérésnél, amikor felhasználói bevitel van" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Gyorsabb mintaillesztés használata, ami kevésbé pontos, de nem fér hozzá a fájlrendszerhez" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "A sudoers fájlban megadott umask felül fogja bírálni a felhasználóét akkor is, ha az engedékenyebb" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "A futtatott parancs felhasználói bevitelének naplózása" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "A futtatott parancs kimenetének naplózása" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "I/O naplók tömörítése zlib használatával" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "A parancsokat mindig egy ál-tty-ban futtassa" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Bővítmény a nem Unix csoport támogatáshoz: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "A könyvtár, amelyben a bemeneti/kimeneti naplók tárolva lesznek: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "A fájl, amelyben a bemeneti/kimeneti napló tárolva lesz: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Bejegyzés hozzáadása az utmp/utmpx fájlhoz egy pty lefoglalásakor" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Az utmp-ben lévő felhasználó beállítása a runas felhasználóra, nem a meghívó felhasználóra" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Engedélyezett jogosultságok halmaza: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Korlátozott jogosultságok halmaza: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Parancsok futtatása egy pty-on a háttérben" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "A használandó PAM szolgáltatás neve: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "A bejelentkezési parancsértelmezőkhöz használandó PAM szolgáltatás neve: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "PAM hitelesítési adatok kiépítésének kísérlete a célfelhasználónál" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Új PAM munkamenet létrehozása annál a parancsnál, amelyben fut" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Legnagyobb I/O napló sorozatszáma: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "A sudoers netgroup támogatásának engedélyezése" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "A szülőkönyvtárak írhatóságának ellenőrzése a sudoedit programmal történő fájlszerkesztéskor" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Szimbolikus linkek követése a sudoedit programmal történő fájlszerkesztéskor" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:485 +#, c-format +msgid "Authentication failure message: %s" +msgstr "" + +#: plugins/sudoers/defaults.c:221 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:224 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:267 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:270 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:290 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:293 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:318 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:343 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:346 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:359 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1270 +#: plugins/sudoers/ldap.c:1497 plugins/sudoers/ldap.c:1822 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:1003 +#: plugins/sudoers/policy.c:619 plugins/sudoers/policy.c:629 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: olvasási hiba" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s a(z) %d uid tulajdona kell legyen" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s csak a tulajdonos által írható lehet" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "a(z) %s nem tölthető be: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nem található a „group_plugin” szimbólum ebben: %s" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:175 +#, c-format +msgid "unable to mkdir %s" +msgstr "%s könyvtár létrehozása sikertelen" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nem lehet a(z) %s módját megváltoztatni erre: 0%o" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "ismeretlen csoport: %s" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1355 +#: plugins/sudoers/sudoreplay.c:1559 plugins/sudoers/timestamp.c:406 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "%s nem nyitható meg" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:857 plugins/sudoers/sudoreplay.c:1670 +#, c-format +msgid "unable to read %s" +msgstr "%s nem olvasható" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1124 +#: plugins/sudoers/timestamp.c:295 plugins/sudoers/timestamp.c:298 +#, c-format +msgid "unable to write to %s" +msgstr "az írás sikertelen ebbe: %s" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "%s létrehozása sikertelen" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1262 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1986 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2559 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2561 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2617 +#, c-format +msgid " Order: %s\n" +msgstr " Sorrend: %s\n" + +#: plugins/sudoers/ldap.c:2625 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1647 +#, c-format +msgid " Commands:\n" +msgstr " Parancsok:\n" + +#: plugins/sudoers/ldap.c:3187 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:3223 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3475 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:108 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:136 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (parancs folytatása) %s" + +#: plugins/sudoers/logging.c:165 +#, c-format +msgid "unable to open log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:173 +#, c-format +msgid "unable to lock log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:206 +#, c-format +msgid "unable to write log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:235 +msgid "No user or host" +msgstr "Nem felhasználó vagy gép" + +#: plugins/sudoers/logging.c:237 +msgid "validation failure" +msgstr "érvényesítési hiba" + +#: plugins/sudoers/logging.c:244 +msgid "user NOT in sudoers" +msgstr "a felhasználó NINCS a sudoers-ben" + +#: plugins/sudoers/logging.c:246 +msgid "user NOT authorized on host" +msgstr "a felhasználó NINCS felhatalmazva a gépen" + +#: plugins/sudoers/logging.c:248 +msgid "command not allowed" +msgstr "a parancs nem engedélyezett" + +#: plugins/sudoers/logging.c:283 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nincs a sudoers fájlban. Ez az eset jelentésre kerül.\n" + +#: plugins/sudoers/logging.c:286 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nem futtathatja a sudo-t ezen: %s. Ez az eset jelentésre kerül.\n" + +#: plugins/sudoers/logging.c:290 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Elnézést, %s felhasználó nem futtathatja a sudo-t ezen: %s.\n" + +#: plugins/sudoers/logging.c:293 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:330 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: parancs nem található" + +#: plugins/sudoers/logging.c:332 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:349 +msgid "authentication failure" +msgstr "hitelesítési hiba" + +#: plugins/sudoers/logging.c:375 +msgid "a password is required" +msgstr "jelszó szükséges" + +#: plugins/sudoers/logging.c:438 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u helytelen jelszópróbálkozás" +msgstr[1] "%u helytelen jelszópróbálkozás" + +#: plugins/sudoers/logging.c:654 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:714 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:704 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:729 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:767 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "%s nem érhető el" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:84 plugins/sudoers/policy.c:110 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:289 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:433 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:437 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:441 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:445 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:793 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "%s nem hajtható végre" + +#: plugins/sudoers/policy.c:926 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:928 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:932 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:938 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:971 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "túl sok folyamat" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "az aktuális munkakönyvtár lekérése meghiúsult" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sssd.c:1562 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" + +#: plugins/sudoers/sssd.c:1567 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:487 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "a parancs túl hosszú" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "a(z) %s nem egy szabályos fájl" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:222 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s a(z) %u uid tulajdona, ennek kellene lennie: %u" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "%s bárki számára írható" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s a(z) %u gid tulajdona, ennek kellene lennie: %u" + +#: plugins/sudoers/sudoers.c:993 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "ismeretlen bejelentkezési osztály: %s" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s: %s verzió\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:805 plugins/sudoers/sudoreplay.c:895 +#: plugins/sudoers/sudoreplay.c:974 plugins/sudoers/sudoreplay.c:989 +#: plugins/sudoers/sudoreplay.c:996 plugins/sudoers/sudoreplay.c:1003 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/sudoreplay.c:1017 +#: plugins/sudoers/sudoreplay.c:1163 +msgid "unable to add event to queue" +msgstr "az esemény hozzáadása a sorhoz sikertelen" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:750 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 plugins/sudoers/sudoreplay.c:1222 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1244 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1248 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1263 +#, c-format +msgid "%s requires an argument" +msgstr "%s egy argumentumot igényel" + +#: plugins/sudoers/sudoreplay.c:1266 plugins/sudoers/sudoreplay.c:1646 +#, c-format +msgid "invalid regular expression: %s" +msgstr "érvénytelen reguláris kifejezés: %s" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1279 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1281 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1283 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1332 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1370 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1388 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1395 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1402 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1411 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1420 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1826 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "használat: %s [-hnR] [-d kvt] [-m szám] [-s szám] ID\n" + +#: plugins/sudoers/sudoreplay.c:1829 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "használat: %s [-h] [-d kvt] -l [keresőkifejezés]\n" + +#: plugins/sudoers/sudoreplay.c:1838 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo munkamenetek naplójának újrajátszása\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1840 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Beállítások:\n" +" -d, --directory=kvt munkamenet-naplók könyvtárának megadása\n" +" -f, --filter=szűrő megjelenítendő I/O típusok megadása\n" +" -h, --help súgóüzenet megjelenítése és kilépés\n" +" -l, --list elérhető munkamenet-azonosítók listája, elhagyható\n" +" kifejezéssel\n" +" -m, --max-wait=szám események közti várakozás legfeljebb ennyi másodpercig\n" +" -s, --speed=szám kimenet felgyorsítása vagy lelassítása\n" +" -V, --version verzióinformációk kiírása és kilépés" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:230 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:306 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:772 plugins/sudoers/timestamp.c:839 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/timestamp.c:786 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:798 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:893 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:937 plugins/sudoers/timestamp.c:957 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "íráshiba" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - a sudoers fájl biztonságos szerkesztése\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Kapcsolók:\n" +" -c, --check csak ellenőrzés mód\n" +" -f, --file=sudoers a sudoers fájl helyének megadása\n" +" -h, --help súgóüzenet megjelenítése és kilépés\n" +" -q, --quiet kevésbé részletes (csendes) szintaktikai hiba\n" +" üzenetek\n" +" -s, --strict szigorú szintaxis-ellenőrzés\n" +" -V, --version verzióinformációk kiírása és kilépés\n" +" -x, --export=KIMENETIFÁJL a sudoers kiírása JSON formátumban a\n" +" KIMENETIFÁJLBA" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/it.mo b/utsudo-0.0.2/plugins/sudoers/po/it.mo new file mode 100644 index 0000000000000000000000000000000000000000..0d6cc0fa33cf789a9523b89a58c0c7fb2cd49cd4 GIT binary patch literal 50152 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/it.po b/utsudo-0.0.2/plugins/sudoers/po/it.po new file mode 100644 index 0000000..0927c1f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/it.po @@ -0,0 +1,2385 @@ +# Italian translations for sudoers package +# This file is put in the public domain. +# Milo Casagrande , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 16:24+0200\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2.3\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "errore di sintassi" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "password di %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] password di %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Password: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informazioni di SICUREZZA per %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Riprovare." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "impossibile allocare memoria" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "un digest richiede il nome di percorso" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "valore notbefore non valido" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "valore notafter non valido" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "valore timeout troppo grande" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "valore timeout non valido" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" già definito" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "impossibile eseguire fork" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "impossibile modificare la password per %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impossibile ottenere la classe di login per l'utente %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "impossibile iniziare l'autenticazione bsd" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "tipo di autenticazione non valida" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "impossibile iniziare l'autenticazione BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "il proprio account è scaduto" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "approvazione non riuscita" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "impossibile leggere la configurazione fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "impossibile connettersi al server di autenticazione" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "connessione al server di autenticazione persa" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"errore del server di autenticazione:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: impossibile convertire il principal in stringa (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impossibile analizzare \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: impossibile risolvere la cache delle credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impossibile allocare le opzioni: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impossibile ottenere le credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: impossibile inizializzare la cache delle credenziali: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impossibile memorizzare le credenziali nella cache: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: impossibile ottenere il principal dell'host: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: impossibile verificare TGT. Possibile attacco in corso: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "impossibile inizializzare PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Errore autenticazione PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "validazione dell'account non riuscita: forse è bloccato?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Account o password scaduto: reimpostare la password e provare nuovamente" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impossibile modificare la password scaduta: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Password scaduta, contattare l'amministratore di sistema" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Account scaduto o alla configurazione PAM manca una sezione \"account\" per sudo: contattare l'amministratore di sistema" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Errore gestione account PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "l'utente attuale non esiste nel database %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "inizializzazione della libreria API ACE non riuscita" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "impossibile contattare il server SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "ID utente bloccato per l'autenticazione SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "lunghezza del nome utente per SecurID non valida" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "gestore di autenticazione per SecurID non valido" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Comunicazione SecurID non riuscita" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "errore sconosciuto di SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "lunghezza del passcode per SecurID errata" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "impossibile inizializzare la sessione SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "metodi di autenticazione non validi" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Metodi di autenticazione non validi compilati all'interno di sudo. Non è possibile usare assieme autenticazione standalone e non-standalone." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "nessun metodo di autenticazione" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Non ci sono metodi di autenticazione compilati all'interno di sudo. Per disabilitare l'autenticazione, usare l'opzione di configurazione --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Impossibile inizializzare i metodi di autenticazione." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Metodi di autenticazione:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Impossibile determinare la condizione di audit" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "impossibile inviare il record di audit" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Questa lezione dovrebbe essere stata impartita dall'amministratore\n" +"di sistema locale. Solitamente equivale a:\n" +"\n" +" #1) Rispettare la privacy degli altri\n" +" #2) Pensare prima di digitare\n" +" #3) Da grandi poteri derivano grandi responsabilità\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid sconosciuto: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "utente sconosciuto: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "ordine di incremento: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordine di partenza: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "ordine di riempimento: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versione %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versione grammaticale %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "formato di input %s non supportato" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "formato di output %s non supportato" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: i file di input e output devono essere diversi" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "impossibile inizializzare i valori predefiniti di sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: chiave sconosciuta: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo di defaults non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo di occultamento non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro non valido: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "impossibile aprire %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "analisi del file %s non riuscita, errore sconosciuto" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "errore di analisi in %s vicino alla riga %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "errore di analisi in %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "impossibile scrivere su %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - Converte tra formati del file sudoers\n" +"\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opzioni:\n" +" -b, --base=dn Il DN base per le ricerche LDAP\n" +" -c, --config=FILE_CONF Il percorso al file di configurazione\n" +" -d, --defaults=TIPIDEF Converte Defaults solo dei tipi indicati\n" +" -e, --expand-aliases Espande gli alias nella conversione\n" +" -f, --output-format=FORMATO Imposta il formato di output: JSON, LDIF o sudoers\n" +" -i, --input-format=FORMATO Imposta il formato di input: LDIF o sudoers\n" +" -I, --increment=num Di quanto incrementare il valore sudoOrder\n" +" -h, --help Mostra il messaggio di aiuto ed esce\n" +" -m, --match=FILTRO Converte le voci che corrispondo al filtro\n" +" -M, --match-local Il filtro usa i dati da passwd e group\n" +" -o, --output=file_output Scrive il file convertito su file_output\n" +" -O, --order-start=num Punto di partenza del primo sudoOrder\n" +" -p, --prune-matches Elimina utenti, gruppi e host che non corrispondono\n" +" -P, --padding=num Riempimento base per incrementi di sudoOrder\n" +" -s, --suppress=SEZIONI Disabilita l'output per alcune sezioni\n" +" -V, --version Visualizza la versione ed esce" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "impossibile ottenere l'ora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "impossibile formattare la marcatura temporale" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "errore interno, overflow di %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "troppe voci sudoers, massimo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "la variabile d'ambiente SUDOERS_BASE non è impostata e non è stata specificata l'opzione -b." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Infrastruttura syslog se syslog viene utilizzato per le registrazioni: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorità di syslog se l'utente si identifica con successo: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorità di syslog se l'utente non si identifica con successo: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Mette il prompt OTP su una riga a parte" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignora \".\" in $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Invia sempre una email quando viene eseguito sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Invia una email se l'autenticazione utente non riesce" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Invia una email se l'utente non è tra i sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Invia una email se l'utente non è tra i sudoers per questo host" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Invia una email se l'utente non è abilitato a eseguire un comando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Invia una email se l'utente tenta di eseguire un comando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa una marcatura temporale diversa per ogni combinazione utente/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Aiuta gli utenti alla prima esecuzione di sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "File contenente la lezione su sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Richiede in modo predefinito l'autenticazione degli utenti" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root può eseguire sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra il nome host nel file di registro (non-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra l'anno nel file di registro (non-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo viene lanciato senza alcun argomento, avvia una shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Imposta $HOME all'utente definito quando viene avviata una shell con -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Imposta sempre $HOME alla directory home dell'utente definito" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Consente la raccolta di alcune informazioni per dare messaggi di errore utili" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Richiede nomi host completi nel file sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Apostrofa l'utente quando inserisce una password errata" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Consente all'utente di seguire sudo solo se dispone di un tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "visudo utilizzerà il valore definito nella variabile EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Chiede la password di root, non quella dell'utente" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Chiede la password dell'utente runas_default, non quella dell'utente" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Chiede la password dell'utente definito, non quella dell'invocante" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Applica i Defaults nella classe di login dell'utente definito, se presente" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Imposta le variabili d'ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Imposta lo uid effettivo all'utente definito, non lo uid reale" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Non inizializza il vettore di gruppo con quello dell'utente definito" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Lunghezza a cui andare a capo nei file di registro (0 per non andare a capo): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Timeout marcatura temporale di autenticazione: %.1f minuti" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Timeout per inserimento password: %.1f minuti" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Numero di tentativi per l'inserimento della password: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "umask da utilizzare o 0777 per utilizzare quella dell'utente: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Percorso al file di registro: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Percorso al programma email: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flag per il programma email: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Indirizzo a cui mandare l'email: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Indirizzo da cui mandare l'email: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Oggetto dell'email: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Messaggio password errata: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Percorso directory di stato della lezione: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Percorso directory con la marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Proprietario directory con la marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Agli utenti di questo gruppo non sono richiesti password e PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Prompt predefinito per la password: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se impostato, passprompt scavalcherà sempre il prompt di sistema." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utente predefinito con cui eseguire i comandi: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valore con cui sovrascrivere la variabile $PATH dell'utente: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Percorso all'editor per visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando richiedere una password per il pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando richiedere una password per il pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Pre-carica le funzioni exec dummy contenute nella libreria sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se LDAP è funzionante, viene ignorato il file sudoers locale" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "I descrittori di file >= %d verranno chiusi prima dell'esecuzione di un comando" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Se impostata, gli utenti possono sovrascrivere il valore di \"closefrom\" con l'opzione -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Consente agli utenti di impostare variabili d'ambiente" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Reimposta l'ambiente con le variabili predefinite" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Variabile d'ambienti da validare:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variabili d'ambiente da rimuovere:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variabili d'ambiente da preservare:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Ruolo SELinux da usare nel nuovo contesto di sicurezza: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipologia di SELinux da usare nel nuovo contesto di sicurezza: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Percorso al file d'ambiente specifico di sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Percorso al file d'ambiente riservato specifico di sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Localizzazione da usare durante l'analisi del file sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Abilita sudo a chiedere una password anche se sarebbe visibile" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornisce riscontro visibile al prompt della password nel caso di input utente" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa glob più veloce e meno preciso, ma non accede al file system" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "La umask definita in sudoers scavalca quella dell'utente, anche se è più permissiva" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Registra l'input dell'utente per il comando in esecuzione" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Registra l'output del comando in esecuzione" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprime i registri utilizzando zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Esegue sempre i comandi in uno pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin per supporto ai gruppi non-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Directory in cui salvare i registri di I/O: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "File in cui salvare il registro I/O: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Aggiunge una voce al file utmp/utmpx quando viene allocato un pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Imposta l'utente in utmp all'utente runas, non l'utente invocante" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Insieme di privilegi concessi: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Insieme di privilegi non concessi: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Esegue i comandi in un pty in background" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome del servizio PAM da usare: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome del servizio PAM da usare per le shell di login: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tentativo di stabilire le credenziali PAM per l'utente finale" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Crea una nuova sessione PAM in cui eseguire il comando" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Esegue la gestione della convalida dell'account PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Numero massimo di sequenze I/O di registro: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Abilita support netgroup in sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Controlla le directory superiori per accesso in scrittura durante le modifiche con sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue i collegamenti simbolici durante le modifiche con sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Interroga il plugin dei gruppi per gruppi di sistema sconosciuti" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Corrispondenza gruppi di rete con tutti i valori: utente, host e dominio" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di controllo" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul registro di I/O" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Consente di eseguire i comandi anche se sudo non può scrivere sul file di registro" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Gestisce i gruppi attraverso sudoers ed esegue la corrispondenza sull'ID del gruppo, non sul nome" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Voci di registro più grandi di questo valore vengono divise su più messaggi: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utente proprietario dei file di registro di I/O: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppo proprietario dei file di registro di I/O: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modalità dei file di registro di I/O: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Esegue comandi in base al descrittore del file e non sul percorso: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora le voci Defaults sconosciute nel file sudoers invece di inviare un avviso" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo in secondi dopo il quale il comando viene terminato: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Consente all'utente di specificare un timeout attraverso la riga di comando" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Scrive immediatamente i dati I/O del registro sul disco invece di tenerli in memoria" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Include l'ID del processo quando viene usato syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo di marcatura temporale di autenticazione: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Messaggio di autenticazione non riuscita: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignora maiuscole/minuscole nella corrispondenza coi nomi utente" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignora maiuscole/minuscole nella corrispondenza coi gruppi" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Registra quando un comando è consentito da sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Registra quando un comando viene negato da sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: voce Defaults \"%s\" sconosciuta" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nessun valore specificato per \"%s\"" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nessun valore specificato per \"%s\"" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d i valori per \"%s\" devono iniziare con un carattere \"/\"" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: i valori per \"%s\" devono iniziare con un carattere \"/\"" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d l'opzione \"%s\" non accetta un valore" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: l'opzione \"%s\" non accetta un valore" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d tipo Defaults 0x%x non valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: tipo Defaults 0x%x non valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d il valore \"%s\" non è valido per l'opzione \"%s\"" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: il valore \"%s\" non è valido per l'opzione \"%s\"" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp danneggiato, discordanza nella lunghezza" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "impossibile ricostruire l’ambiente" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "permessi non sufficienti per impostare le seguenti variabili d'ambiente: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "errore di analisi in %s vicino alla riga %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "errore di analisi in %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo di digest %d non supportato per %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: errore di lettura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve essere di proprietà dello uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s deve essere scrivibile solo dal proprietario" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossibile caricare %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "impossibile trovare il simbolo \"group_plugin\" in %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: version major %d del plugin per il gruppo non compatibile, atteso %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossibile analizzare l'indirizzo IP \"%s\"" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossibile analizzare la maschera di rete \"%s\"" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Coppia indirizzo IP locale e maschera di rete:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s esiste, ma non è una directory (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "impossibile creare la directory %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossibile modificare la modalità di %s a 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "gruppo sconosciuto: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "impossibile leggere %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "impossibile creare %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossibile scrivere sul file di registro di I/O: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: errore interno, file registro IO per l'evento %d non aperto" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: errore interno, segnale %d non valido" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: file di registro non valido" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: manca il campo della marcatura temporale" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marcatura temporale %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: manca il campo utente" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: manca il campo utente di runas" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: manca il campo gruppo di runas" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls non supportato quando viene utilizzato ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossibile inizializzare il certificato SSL e il database delle chiavi: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "è necessario impostare TLS_CERT in %s per usare SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impossibile inizializzare LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "specificato start_tls ma le librerie LDAP non supportano ldap_start_tls_s() o ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "attributo sudoOrder non valido: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: porta troppo grande" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipologia di uri LDAP non supportata: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "impossibile utilizzare URI ldap e ldaps assieme" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossibile convertire sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "impossibile aprire il sistema di audit" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "impossibile inviare il messaggio di audit" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuato) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "impossibile aprire il file di registro: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "impossibile impostare il blocco sul file di registro: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossibile scrivere sul file di registro: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Nessun utente o host" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "validazione non riuscita" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "utente non tra i sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "utente non autorizzato sull'host" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "comando non consentito" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s non è nel file sudoers. Questo evento verrà segnalato.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "A %s non è consentito eseguire sudo su %s. Questo evento verrà segnalato.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "L'utente %s non può eseguire sudo su %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "All'utente %s non è consentito eseguire \"%s%s%s\" come %s%s%s su %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando non trovato" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"viene ignorato \"%s\" trovato in \".\"\n" +"Usare \"sudo ./%s\" per eseguire \"%s\"." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "autenticazione non riuscita" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "è necessaria una password" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativo di immissione password non corretto" +msgstr[1] "%u tentativi di immissione password non corretti" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impossibile eseguire dup sullo stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impossibile eseguire %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "impossibile eseguire fork: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impossibile aprire una pipe: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "il digest per %s (%s) non è nella forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "impossibile eseguire stat su %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Ruolo LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Voce sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opzioni: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Comandi:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Corrispondenza voci Defaults per %s su %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Valori predefiniti per Runas e Command per %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "L'utente %s può eseguire i seguenti comandi su %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "L'utente %s non è abilitato all'esecuzione di sudo su %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorato sudoRole non completo: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "attributo LDIF non valido: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s non valido impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "impossibile analizzare l'elenco degli indirizzi di rete" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nome utente non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID utente non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID gruppo non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "nome dell'host non impostato dal front-end sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "impossibile eseguire %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versione %s del plugin della politica sudoers\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versione %d della grammatica del file sudoers\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Percorso sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "percorso nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "percorso ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "percorso ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "impossibile registrare un hook di tipo %d (versione %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "impossibile memorizzare in cache lo uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "impossibile memorizzare in cache lo uid %u, esiste già" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "impossibile memorizzare in cache l'utente %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "impossibile memorizzare in cache l'utente %s, esiste già" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "impossibile memorizzare in cache il gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "impossibile memorizzare in cache il gid %u, esiste già" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "impossibile memorizzare in cache il gruppo %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "impossibile memorizzare in cache il gruppo %s, esiste già" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "impossibile memorizzare in cache l'elenco di gruppo %s, esiste già" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossibile memorizzare in cache l'elenco di gruppo %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossibile analizzare i gruppi per %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossibile analizzare i gid per %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "overflow dello stack perm" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "underflow dello stack perm" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "impossibile passare al gid root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "impossibile passare al gid runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "impossibile impostare il vettore di gruppo per runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "impossibile passare allo uid runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "impossibile passare al gid sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "troppi processi" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "impossibile ottenere la directory di lavoro corrente" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "percorso audit user_cmnd troncato: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "percorso audit argv[0] troncato: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "messaggio audit_failure troppo lungo" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "impossibile inizializzare la sorgente SSS. È stato installato SSSD?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossibile trovare il simbolo \"%s\" in %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problema con le voci Defaults" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "nessuna sorgente valida di sudoers trovata, uscita" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers indica che a root non è consentito usare sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "utente non abilitato all'uso dell'opzione -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "proprietario marcatura temporale (%s): utente inesistente" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "nessun tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "è necessario disporre di un tty per eseguire sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "comando nella directory corrente" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "non è consentito impostare un timeout per i comandi" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "non è consentito preservare l'ambiente" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "comando troppo lungo" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s non è un file regolare" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s è di proprietà dello uid %u, dovrebbe essere %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s è scrivibile da tutti" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s è di proprietà del gid %u, dovrebbe essere %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "solo root può usare \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "classe di login sconosciuta: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossibile risolvere l'host %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opzione di filtro non valida: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "attesa massima non valida: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fattore di velocità non valido: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Riproduzione della sessione sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "impossibile aggiungere l'evento alla coda" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "impossibile impostare il terminale in modalità raw" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Attenzione: il terminale è troppo piccolo per riprodurre correttamente il registro.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "La geometria del registro è %dx%d, quella del terminale è %dx%d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Riproduzione terminata. Premere un tasto per ripristinare il terminale." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "riga di timing del file non valida: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "espressione \"%s\" ambigua" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "carattere \")\" nell'espressione non corrisposto" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termine di ricerca \"%s\" sconosciuto" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s richiede un argomento" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "espressione regolare non valida: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "impossibile analizzare la data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "carattere \"(\" nell'espressione non corrisposto" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "\"or\" finale non consentito" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "carattere \"!\" finale non consentito" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "tipo di ricerca %d sconosciuto" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d DIR] [-m NUM] [-s NUM] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d DIR] -l [ESPRESSIONE DI RICERCA]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - Riproduce i registri di sessione di sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opzioni:\n" +" -d, --directory=DIR Specifica la directory per i registri di sessione\n" +" -f, --filter=FILTRO Specifica il tipo di I/O da mostrare\n" +" -h, --help Visualizza il messaggio di aiuto ed esce\n" +" -l, --list Elenca gli ID di sessione disponibili corrispondenti\n" +" -m, --max-wait=NUM Secondi da attendere tra gli eventi\n" +" -n, --non-interactive Non interattivo, la sessione è inviato all'output standard\n" +" -R, --no-resize Non ridimensiona il terminale\n" +" -S, --suspend-wait Attende mentre il comando è sospeso\n" +" -s, --speed=NUME Velocizza o rallenta l'output\n" +" -V, --version Visualizza la versione ed esce" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\thost non corrispondente" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando consentito" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negato" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando non corrispondente" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s è scrivibile da tutti" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossibile troncare il file della marcatura temporale a %lld byte" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "impossibile leggere l'orologio" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "marcatura temporale dal futuro ignorata" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "marcatura temporale troppo avanti nel tempo: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "impossibile bloccare il file della marcatura temporale %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "percorso marcatura temporale troppo lungo: %s %s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "l'opzione -x verrà rimossa in una prossima versione" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "utilizzare lo strumento cvtsudoers al suo posto" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "premere Invio per modificare %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "l'editor specificato (%s) non esiste" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nessun editor trovato (percorso dell'editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "errore di scrittura" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossibile eseguire stat sul file temporaneo (%s), %s non modificato" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "file temporaneo di lunghezza pari a zero (%s), %s non modificato" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) non riuscito, %s non modificato" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s non modificato" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossibile riaprire il file temporaneo (%s), %s non modificato." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "impossibile analizzare il file temporaneo (%s), errore sconosciuto" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "errore interno, impossibile trovare %s nell'elenco." + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossibile impostare (uid, gid) di %s a (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s non sono sullo stesso file system, viene usato \"mv\" per rinominare" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "comando non riuscito: \"%s %s %s\", %s non modificato" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "errore nel rinominare %s, %s non è stato modificato" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Che fare ora? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Le opzioni sono:\n" +" (e) Modifica nuovamente il file sudoers\n" +" (x) Esce senza salvare le modifiche al file sudoers\n" +" (Q) Esce e salva le modifiche al file sudoers (pericoloso)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "impossibile avviare %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: proprietario errato (uid, gid), dovrebbe essere (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permessi errati, dovrebbe avere modalità 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: analisi effettuata correttamente\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s occupato, riprovare" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "impossibile bloccare %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Modificare comunque? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Errore: %s:%d ciclo in %s \"%s\"" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Attenzione: %s:%d ciclo in %s \"%s\"" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Attenzione: %1$s:%2$d riferimento a \"%4$s\" %3$s, ma non definito" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Attenzione: %1$s:%2$d riferimento a \"%4$s\" %3$s, ma non definito" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Attenzione %s:%d inutilizzato %s \"%s\"" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "%s - Modifica in sicurezza il file sudoers\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opzioni:\n" +" -c, --check Modalità solo verifica\n" +" -f, --file=sudoers Specifica la posizione del file sudoers\n" +" -h, --help Visualizza il messaggio di aiuto ed esce\n" +" -q, --quiet Messaggi di errore meno prolissi\n" +" -s, --strict Verifica precisa della sintassi\n" +" -V, --version Visualizza la versione ed esce\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "troppi livelli di inclusioni" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "valore attributo non valido ignorato: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "impossibile memorizzare in cache l'utente %s, memoria esaurita" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "impossibile memorizzare in cache il gruppo %s, memoria esaurita" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "impossibile memorizzare in cache l'elenco di gruppo %s, memoria esaurita" diff --git a/utsudo-0.0.2/plugins/sudoers/po/ja.mo b/utsudo-0.0.2/plugins/sudoers/po/ja.mo new file mode 100644 index 0000000000000000000000000000000000000000..3169a848a3d5d840fc0b6b61c96449dfd3bcd114 GIT binary patch literal 57055 zcmcJY34k3{neR)-Z89Q?3J5M0ASQuyCoBR6A_Nj32uaAoB4W7dzUegSjlO-e;3(;C zLP8P<1QHBe0)!+a(gE4GWJYJyr=#OI`W$thqjq|Uz8Rf)I*xCg@%{eaIj5G}w>trS z4VC|`sv=;Iy&qhEL=;VZV-)@FI9=uMq$qkP@CJ`Zfk$$F zB6t*dx<9`NJpD~kbS1ceveu5HEXw)Wc$a_K1ebmd_+R9^AAAS6r6!7~GTH^c3w#b# zeP0FN27Vt@yM79)-rs|#fJfFw(TBiuz!Sl1!HeMKDFL(}k4tNC!X`@ z!5CEgKMtzgWuWMNFZe$2Nsu9rzUJ{)pxXVxk3^{ofh&L=^-5Pcg|`nOJwBCQ2l%voB{p}6y45X zP*vU)pvo_UYUeJ0{jWfVHW~!g-{bh_DDWy!^t}NT-PeMu?^!Sg{{e(Wqu+w+|M)3U zM3vFSpvJEYJRjT%D%~I``W{Q?j{~QHqQe6IfuzwxpvLXHp!)ZFkfNir>9poa8H5$0 zSHO3JzXZj1Z#v)AcQUAc&jLkiuYwF|GyvWRetDhvUJ&CNSpwOW^y#1EA*R8z9EKMRfmw}WcWUQqr22k<@M zZ@^>0w_oh;j{#w+XeKCntpU}q=RuYC6ObySw_f7L?Q&4`SOIFho(D-1{R^mi&V=}y zU-Lon^R1x9c^@eHe;*tN9(k#2_t_vMkD9=Dfj!_@@Gn61a}ZSj-urQfGeFVdGoZ@5 z4^;YZ`Sbq(m9O?PCwH#}HNIV-==Cc2A@KX4`ukf@{TX+;tA7#5kVVTumHP^K0(bz7 z!MDzI^Kl%g{#^=c+`2&ZQH^3(}P6 z$Kc6e%@wYFSA*j@Uk!?GPk{_!^aD`s8x5153eNEOX;A%p0{j5@4e)&M=in%C!d%zx zvp|h|D=2<=98~%*f=7ct22Tfn1HKPDWuD{P>7d4WKB#mZpz2!(s(pJvjn8+$cZ2^5 zz7u@&d{@rV;7OcM0%LGKsQgPo<=+f`7~Btv?)~72;GaTNNEp?C%KsTq*B=4j1AZBN zFZe@HJ#q%yFj&XGN^QygKAd;sPb+G-vw?0m2M}fcD@9vecuOF|8GIj?}%%iemMbD zc~^nrhZ{lh=LYah@Gn57aP%8c<23b?u0M-G{*Tu4kLYv|6n{q7x%Q3&#qU>ur-7dZ z-wr+nihuWk^TA(&8mEgs<@(bGs{d=i27eDKUA(~2{X$UvxE|E? zn?SYeK~U{}20Rx0At-wP3LFi7;Ck1d^FXD)5mfp$py<07RKLCgNCO;i1RP_^KXOV&tHP-$MFjto)2nVilFLS0cw2i0@dCfU<~dDmH)@! zJHS7yb96ZlJdX1kQ0>12RC^bIYVT@){sgG@eHT=F{|^|0@2q#@bSiiu=br*4w;ln- zSKkE1R|i0i$G?N4!J~=}&j2+(SAt5{2rAvDJ>CndUr&Rg$JhP!pMz@8TNknT?eY)H-RUDcY>#b&-m+up!)aUpvpO}(e-ZvsP;_*H4fK-M}i%o+I0)4 ze49Kz1*$#Y0M(zL`|C&C;My@BoXGWyK(%uzsQf!Y@ynM$weNeN^8Y8OarnRzcmtdS zo(!G~DqREkVQ?L&c76e@0lyB8ej{=L)c73V;`rtqj|K1)uCE5w->1P}yeW$Q8r=T| z?7~tMUHvE6X=Qi+o68+Nehhw;`~Lx|U8mjT=sF!#IoE=sOEdU3@UvhHt_DTFUEoK- z{T_b{Y8+1gG`aw60M7&a!0F(aKX-In0_uDXsQ!HuBy03LumCP2v*gbAL7h+hteY=) zfoF66BB=cT28!Ni-|TQ6sCKo1W5Cs*%s4Vi@zRAtXF#S{^v2uqA;Bh4{d)ma`~L;J z3aq&UT7#>=OTjm6aP#6a@CeSEK+*Lk@CNV&P~&pqoo<}wgR?pB29@qR;6>n3ce(yv z1FHV}z%gJysQTZ&(T(@VL5*vN$2-6|obLiJ2mcei44iSdqw8jH9_L>JCxail$MN$g zK#f}$DE@m26yJ~94PU2WhCI{i;j^RxDI z&c0j>&g6U>_&oRv@B(n>mMHoJ_%l%Hr{CwwyBTcfd_O39oOZwK$7ez1`+HDyJo*7w zZUd-v&v|^~gKnH=f}+dUz=`0o4>`WL1RTft3UD&`2&nP@Utm9Y@m4oJwcFf$XaYaL z^)2AJ;Pc=~;IBaS_k9n$^f!X<;(RZta{m%M1^gZOA#mIyZd@+`Kf-wnsD5t;Yrr3Y zXMt~r$<@DU;Pv1pZ~^%5U>Uq}yBn9k0mYBgA9HfzFTv|MfA z=1y1d8c^f>MesCm+%Cs&*Mj1s`@s3&0C+Vx<#DGkHiH_Um%uB)n%!=G-3*Ez{or)) zV|$RP;4R<@;O{(s=<}}s7l1c%eK|N5{290sJn9Ko?%km1+y{z2qk5biJ{!D<^BXhJmBDc}O|RB#dP zJeu=6!AroM;4$DY!SUeR{?eVF=J8Tc7=|0G!E{7&$C@GXCZZ38xd=YxL>o(aD5uZeYn7lUfoKY^MbzX3I_AN#T!=VjnE zoWBYl2_EwmCr`(Mi#fjmRR8`S91Fhxt8V^J12yjVfuhUT!E?c%ffs;dnQYU*8$hMo z>+#3n37o&{Ypy?Mfa0&kpy>TPsQGyioD81%bywewpy>A%Q0e~@RQgN*#-;yra0=)D z15~|l{f3hdmw~mM-vpimKJKv(RQ}Q5bnTl9p3M0z-~@0lcnbKB;PK$w{?_S-lR%wc z4t@x11Z%lHa9z6fMjt&olCvyHOSOfk991R}%Kb?L#6;wYy4T^5N z!85@xgO`K<1ibTfejHT2+d$p_ zBB*}-GpK$Z@dHPvGeNauKB((Af=YKE7=tf){2{3Fe+R0)ANir9LzBk`LDBJ>;2Gc> z|Ix|6vp~_|Mo|6Q3aX#~0v->Z`@bAs4Nm901Dp)L1bzbiHFzF4`$sPSo!}cd*WXkJ zX8-+feiymX4vy!zgx}Y2z(&z0z72E;7nWLNEYdG{bk@Et$h2sSd@$U?d z0R+DEMZMPjS7K z<1~(EIX@qa!OwCm;kW+k97MZ0|2Rjxzy2p4o4G%RV;AR3!J|3;ghPL)ag5>m6+Z2! zI3LgN64=7=VGjNMisL@6*K;5)Os}m3^>;DH9UODGx0K^c{C=LJhvU~A;qPDh@y{GT z<@hI#8Km9Jp}!A%Tn4Ulm!jW*XK>!+@4dpg^wN?3ek0h*F`DCO()=0tagNpe{u%g2 zpO2r(-(T?S9}O;QAZEV|Bs*jpNz|j@vk22~OqscYZ$x&IWG-_4hlD_w#!_cn)}+F7o$% z2j)-c=TH3kJ4tggzt85_%5VL};9t9+=KudGzn|hb$zOXMJcTp^{`^ROe}ms09OwEn zbgPf!zx9K^+c~;8Zt?dwf+ui(KUl*th2tRS`n!PRN&CfIkz=vHUj_#`ru*~HfOm6z znl#J&wYTy6IexznJPZ7azdo7s+d0DD|KZ09jt^z7E#~)Zj#(TZ;W*$EUjqIe$N%NH zljG+cH5_Mf>>-{0Iy_zs{w3!(_;cM`sDCnlzvOo($BF*hcffz-_@+Pa2T$R6(4XG| zUd8cMe||S*-^}qa$9Y`)97i3$f8g)m11{ivvOizWZ~eWA?iUGA(W`b;NPGrMb{ix42jzjk>V4xw+6%9~YXMT9;)n)E8SCv*(#S zmra{GJD$_pRGb`-DUFIo&1&mtY;7q`9u>zm3n#=iH46)+;*|Q9IQQ4FxESk3JZ)yY zsI@&VmFrt$E9%B_vAwZaQuaD!uWM~t)YvdZuwYSRQ_+f1_O?RD;<%$V)^C@n++I-K zv63l&z4F%=7Zu7)9i=J!=vdKKEUAFjmZlZTw6xgX5l{0e;?_l0SgEa8*SLuO#+F_s z6;)Dkc^ky3DKs_Ga4UwA+(jtnE-qVKYzYN7wlpa3BIRu@ceIr|YUnD&p5h=b6+2>g zLp0#VFs-X=<%2G=)-P zpV}8**66eqN~L9RGR!t&NaY{Jp5Low=sMjHb%pru=Q~<(8tOO~O*KU5r~= zTigwmM4#GA6I@qH)+&t8_r%+!{y6nKlZi2PBJIO3_V`^h9R!~bQxTdC5Zfk32 z@TQcCbvA=V-Ec9mDKn%Fx)d5)U^|yg1zf2DAXrJWFZUOCBiw9kah$G%fkpB%!%h0d z#kwWAf?_08-I5w(nC8}co8LCGG})(wQF2+_1YVJhosz`j81+l-9gdenYlr3J8`aSp z%Z*Ij++P!fi|OOSR;JH5OE5kzt!U{eERT!r?J$6!7dB#!-Y|PzzL=7`#j3&2gpinl!$J!&5zUVOW|siRMj>QdOBhyHHqKXlyDhWOSL=*3uc%Anvk8G()TD zA%p}HT72z?-piupHOmT(>6C3|oREnN5lyf-tlipDZ*yL$;)TVIWkuwAaVZnV2+^W8 zX@WApi|qww!cr7dODj{iwYjZ>HiQN>miX!9s}vQYp{2giUhgNA$TG*3RYM~iZ*uC5 zexeRrT07!GM@NwYMalMJjU`YqRNCCwQfN~CxyoNEGYTjtYp=*;KNt~c;}oRR?8^$Y z$E7XSE4Smtwqmh9D?2C**@x7W62casIm=oyZLZFbVJJu9#%R=BFHt4#S4@UG!v!gH zZ$w;0tJ}*A`HI$Zytn{yVap;!Mkmw#a;eO~Ho>Xo_F}vUn%iZk6y~ldL9!A=_ zgH6!dUK`KoaJkU?3tJnTO0GwcmGYRg9gEwG`j`2J=>lQm_{3Ak$8(BeZpcriZS9Rq z3w0~RAg!FYmug+I)5gd1$hQPGLADjG$ub=L?bFA{SBW1R(5)S4gk|tpT`S_iUt!qW zu$LMaHa0bOtf(C|DpKX%5~D448jPyg&gPU`rj{<2Rx3@;T$wK&!G$qrmtxV;{}@MY zX4S#e9gQvJV*Pl#**4Z|$=3FI z$rYtd%4sh)l$*$;_GNE4W7!&5MlXsUbZ1PdHWp)0KucXC26P827r^XfYAjq4H#9=hGU8`(Yq^OlMb3O%lQiYw(=2OkCs(%j&6}gOz8w)s7oH|w~Hu4 zu9lg}i94lcC7CjXAdBgz2-#6s!jQO(R!Uo;y#$43ecTZp8H!sWgUaq=JfqJXnQ_=) zU8b82T}wkIfsAJeQ{_JFV>-FHEp|L(xiVL)=Au>&FUmuXGG-;y!+X6HV@0G%f|rT< zKn}D)Wb(<Eb49UAVg7qkZk1wCfXXkkA}uYh z!@V3B^ghz9~&i{mnkW*xSaC1YeuZeq+_HfJ~%;;|FQTFPbZtqhV$vv?d* z6aT9b<(W!^aT2v-%HxeWnQEch!<#oYH%FW#q{y^>_-R7AK(b*-N{Yj#P)K`d8kJ4n zwM)G^hnukqCTlciq`Rf)m!<4uRw!mVrNpu<&NgIiTVeTDSO5OLtb2H>KEd+jupyD z@#bmZCDfxN8k@|XHIA=(x1-hFQ^3h)3_?g^afN16BW6G}RR&4WPgXYC15s%zA#TLK zk%?00l%k7w_(scjLx}$YB^1gs_x`Xl5;fvFQo>lyF-QY`0;(J$((DF#UI_R_Wv>bo zPuusxI!i+5nHhIMdqsyd(9)7335{MBET*N6W*YeXGRjPWP=-@w7@e_H1X?=St-%;* zVgP(TiO^0~J zrAhh3SjxHwyE49MijMfCOJ-d@UG!1&iB3sfs72WPi$%}GCXS}IwPB?vV#AxE`7Dfx zWOx%)6R|{ohNMLA>22zv7LlS0am*LHS(@rEqk2V4qN!!Bpx<0rCSC;V%bW9o6368E zB+bQ+#jW+F$(30(7*vfC_rpTw+EW){3AB_upzehhO+vki=%MF|G)mMs!_}NGH%aBN zh`BUvOHL(-$hsU|h;e5V*3T47S@TbBYHD1_O_|&>W9o~}LC2P{`G62op{*^^h4KPr z;rWi3U(s-vaX4cqZ~aLh{(M) z#_1Q&2duvr#!4oy=Xp0VCd(6wE@~CguTxCrg^L92_;CnRZdDX|d9Z=7p_Ijdd}S6=iQCZ=?x&vBmn0 zH;qEFGS$=24x7~0z8Q<$dQ*@GG=w};KUf+59+XGzqi&h$wMk~D9hzA+fhAowHPhK>u*vl{u8M4pbs|W2YcBNWpcNw} zPLr`YTbIBA7WBmF3Vya+S1n5*Yf8jco1z)6M`LTpk|#cC_SAWogllS?qpdBwXb9X4 zRlKD%LMoFxxkSMZ^^yrY%CG8BXCPx{%pp>Jxy~`{vO>G2K{TVKuBi+i)n)G2$v~Ph z&9x61g(_-@mp0O^6@(@&d259Un$;mQT1qVcSz*>%Vy$xQF#Sc@fU!&vr8e)|iQOS~Bc@6sNJwr` zPJXeNQhcuSaYlOMmhlOdlGI-Nc~utl@4}+GE2}D$x}r$z?~o;G_-J3UAZrb%UZ`^k zg5pqjj3>XFPZne5UUA&=@p2Rh=gaml6_$!# zE|lp^ecC9iUwT4iT`|6F#t`u}HF%hm@wjPIXI?yg&S>HYvlKcFW>tmoNzGhzmd!vp z!`}Br^0ct-ZhnOY$kGHkLF1xl$xYczjT$>mmyEt|GK=37hqDP)Rh7i9pv0SUe){2f z-Lpd;uO_Qo?jaTH6SML9)WSm(#U~8QL&)5YGV48oX5qG%mc9qB@F7-AsMVMY#(<$U z9V8f;qq0{|a_5t*{au zrG4<hyDXL}$4Or{*1(h5Y;A}+a zxK$U1u&HSUyA?2GY&TO-ixyf?X&T5Nt|-vfYOJp&%rX+6!)B5Hw0HMS~= zWf{^DDN{Wcx+R-*KKd>>55|<+-07DQG*}+Dv!N}>L(lf|*oiNeSsJvxV;#liY}gu8 zib5V+B=Iuzka<)PMy)J^a!WP_LI7`W5(;#|7SDfvJ=5C=;tVKI2=>Fsxl)QBZaVMw z!TsW!VR9wfe1xXhL8(KR_2kW z4MnG_R4n&w6_4N)>v==(i~TQ~b@9xpmrpm=m_K*=oSb-0c~`|LxfcQ!*%fQ(8r_Ds zbSGt3bI80Yr_>QjvxXAmctNCKMHnEd{HYg`fqGZ74E0A!B{r-rG_$s z*P&6+#7fhZ7v6wDWU|Qy)D)a|k36+9LICwJbX|O|PtYbmoalwqD#=17tG08^v?hXA z=fY@ktvBxJoHL|pX}vW7!$J<6n>a2X!_#V$%Fi8>z1Fo1*Wl2U%60MuO{~41{AE1B ziW25&T+R7OS1Hq}0=MD0=Nxo3Yb>sHCT>h0n1&s zwxAs^%L;zSP`RC5H;Wckl%ZV_P9LznwXviSa!o}oC~cNV1FS^;KORn(K(q$~o3mAd&xQ9qhkACt~H>#QJ59RXeR zXnwMenu#@5RN%=~8_lQ7NP!}rs3NFo#nP>|V^u{@#3fKy7PeZ3MFj$H?Qug>>%xVa zk`@?Zz-+%B){}M&qukKx$r3bIZAAu>Sg^>Jj8qt_Qq^YbkU1BUYEtT^uG|(N!+equhrX zgRRIhBnn$`zuZDoli+SzpRM8rBTAyTqm}SYvjTMV6IX;uj0ftsHfiLLSIFC|6zpcn z`n;H*tQe8llS^htAf?7`tTrZ&_3Ji%u#HNG%7;K@cS^OK*Gi;cm#=0_8!izBS0hTV zBeVr8hg5hnW-(f>!T_@gI{`?Ac7c$LK?@D=S79)g$R>Yyr^_DrCY5puxYpz z_rsQNFkNiDV?o7Qj!~JQR|B`9>5w&_%FA#W)bO6_s4=A|$R?F5d4y)vWJEWz{Eq%j zwiAVf$T{YAZoOwkQc6bMCfCFV)--iUJTns{^j1@Q zG)c|fW{L4+?d`2b(U2rBz~f7hwYU`-5uX%hk8H3Pt-TRtBZ#=9b#psNKDtB_1v^!e+iE|g>6=y;~jdEHgm;G8){0cz$!-p}e3x`n%s0y(RjE$F@DzhQk0F#0Zz-CWZ!TBGOqx+3u*gqk`EKOw>>gwdGh?$IOl%!ui(`=?Wqt4@|VA!%YY z8ggaS&`ZRHvZ(~d0^RO+S|XAr$1}C8iinY{jZ`v$?G;dQX^|1b4@ID8 zk(gq`J*JmDx9p`bNBta|Kp}4JYD_ue`H~iG-PIberl`q7#&PMjldd!Nu9`s2Sy0#9 z;_8z{p59ql)W)iXrOJioOcL8U>-Y5!b9n;M zBew<6J^nB>neB=gQyTWhVU}PIT{#1In4&T%4q2vq4q-?^?((5?GZM(vq1oN_k@DNK z2XbX>Q)zJDY|zu8af@|?cCcCCH;hF_R(oECBnbtWVV7@_tBH&@uh~63G`DV2B!2pc zcePYGq-OF47O%)nSXnEN#@Q}1lg;f63U#Q$dW3dZ#QCJQeO7WHge9saBA0)>)s|C5 zOZ}HE$?bg0U90B_vr-2Su9ChvlQu*^bBWW76{*cacN>MAx8V$jlv=q2<`6A#QB3xV z%XQ1t40A83IIXPBp43j`Pnp!(WO?!B^Xy*5<=~C7(!E5gCE0aUk*t0OzbI+Z7nLQG0QFN_X)h`^O zw7GM=QON^&rFiaKI-t!!XgcID_N_%9nt46}Q|`R#6$Xa)29&egvt6^*OmAeSJfKiU zo&ey4L6F*9Cf25Nl$WN97cJ{pBEy^@cV%LUDt6D+W#@5wabdZU zxQ^~+4BA}Q23pHxTin`;UqB2)0q-&O@i;`Ae@3u&O#S#=7PqKr@soTL3H#NW5@`wp^zi=N>Q^hK-Y_4|3E>u7)i}svt8%8Alu(3(r+;dOiXc z&Vu@Kaj|eU=ZE=6kitDv6~5jj_P|m`Jm;>L@INtD6b%~ZaTW1rrn~Lo?p)Rmibw*HG8YG|H-l|36ni=&qS321?IZ!V? zwf5}V(>~f>cj_oMrr_SzTwX$1)Lc+*DAmkkr_{&H)ih6Q}okr7et0u>%O*-|XHK$IhIqj_Y)Jc;+a_T9QK00aAsLNQ9tC`ncXesf` zw&Hm6c;vIRxRKx}tA>Rojq$mQVXgKX+RoP~m1TwG*Np(D0S8=qEtTJ5Q6*10CVX0visGih?na@U{scHiII z^U!2VPh?xcZsi&U<@1_w{yi{qAT~Z`aek-4FG4^Y3jW8Qk?$--f-tott{Q z)>|slZXJ@Uf8EBuJ9iu^)zIpCJ9k>`lxU)@@6{LkZu^2{4lj@B?b_YjeQ$5q^S#|W zY0n{EJ0;S@y`4QyM)r2??d{st+r3+tdb_vucE3Wec_kHlH*4zjS`BAmRJ?p@aMu%k zJ@@r?)7yu8ySDds@9FJ)!AiJ`?8-~9beI=U^{-#8ydvh-zE>aVdu4-KGcCMrxJ&M0aZ3-|CX-a&OPdrnzg&P>k*A2r9HLj;O2E{X~Vyg zs&Dm6eQT+=r~m#JXk6}vR5r3(dpq|AX`zM<|6Z!TRgdM1vNevXg$)08s@~2Aji(;6 ze|xNE7wV^teUIGRx8_#0Vz?Lj#Bp!;=QKdDNcY3N-QB%iFWV@;096Jb-ZilOB^!$! z1J8CHc9QFsF(KB7^23ee@UO5ketJ}G?b-fFhtE~h36Mm&92VUJjaL=x^^~1m3DsYRNsawNH#uSo$zm>WdSRt_B z@bA0oe_&{^$T2uXPR~a%gD%iz&{{XNwliC_PyYJu zc)D*dbAPw1$5T!6A<%2M0er2)H;le=>LNU*>0ZfYf(mgJ*sJ>qO#_CK`QL?@_`I0U z$(o_#62=!nmAt1bNIOx(p52g~k(xkx9@fCV&OuFH-*xR2IRe*->`q=`G7NUVsv(n5 zPWw7z8ZD9;uw!So(IyFU${xd@|G|e3y!@PPOOXt74C)G&JgD}zFY7eAUZVQo=DRg< z_pR#fd>G~FP9@H^?;O~8}cg2~v4 zmBjF*HEqqo=RS=o8u<;M=ZAT@D1`VVC~xTAC68T5yvEQHvSdCS;=mp31H z2}6X*4evZ|40@+pCVO;a-;-+(u4b%_j8w$18I8C==j+lfe| z0lDYnRx~~?af{s{KDrCyo}OVf8Z6E3U&%5xHpkyS;xPetkML}yprr< z3nsEvP0gL7*OtwfQ>WLBRlKAuTkgPfTLzxH@4yRB_!pHS!y%1Eu(unbhXS~5a)e7; zlbSCXW89h5HkBD4rixk8i8$B0T6|83m!FwV$aZa%1*f4v$fE5TbPZT|?^(iDnL0I0 zJ-79(V(RS~cz)Nx`=Oh$x7Egw$=w&B??k0wkirJRb;vN_ffv@2zZdrG;)i#(80@|~ zZ`Zg|2Yu00cdW3rw~I-&M=wX?Ua$datxa5Ov--+V_IAUcFF?70wa@jhf-5}Z_U)rN zJNs_Eeem%ertMs2=H@oBYUeFJf8P_I>wCb76;Z-U9HNF)=-!IP^AM_k6`Zz)R}}pL!Sy4DR~e!S!G0?S2_cuJ10!F`e?7 zx1s84T-0|fqNmFEzn&T}*HVI_QSm5vA&(WmySMYvER*;?$aVLLpeQ^DpCG!BCm8}~ zO>;IC`XZ%xRAm2cEBhZHAdt}?#)hw@hQZyKIXip1y0W7^bf|k=T_&yf>OoG$>aD4C z4^cs9C_W*y1f@fg7Sq z=F+T~Orx0anV`}R7!dJ`E~ZK87*384ytI+vNdHRO#RxJ|m?^5lPeTrr}c&3tonH>9&Mozr!@@8D_;@-YBj~U(6 z)4(A)+PLy=U3IXVU`=prR(5K|BWs|#1|Sa2{Lj{beWj32j=gE&kP-)OdAM&a^B9GX zsRNnT_IB@~SZjd2(vN;tsBpK8Zd#XU0~EpSBHV!t4laW?GIxa1y@;3`hYKjsAx#ci z+^V*H!EjFBO2&A7@GL7Nho3m&jhy8l8n{=v(bqJml1ciXKq8^fHuUdYhw>TR`Dp(` zaB4CqxwX~t-QeygkON+=gt4$T+EQDVx6s5!564W9MA6R-%O~x1IWuvL!_FCKyiMi~ z^cDx-8@oAdjjEc!#)`fjvSAg3gm^xjnHL0!@UYng?U6*-qj!l9kR6*>_dP-E?Oyi+ zLye-3SLUQiQpn)btNXXTl0-L%+Vt&%{?!xrc0)xhJ>qDXV3k#moHt()?iloNj^$&p z&_<$E%<;bUn}@4gFF#bmJkL~b=OOA6!##yje>jt{h^z+8E6~84JovcnjY&P}NcUZ|`)7qJg7)*PESV-FD^Y>V~y?W)M zRD%l{2LE+fH9k3ZN*whwg6l)Z{+;=|)K+e05&nvpyS|aDITr(tGR;3qd&UiPM)% zT3t{Gc_=Gls0NVTBV{`@u0W{g(Sc`i6KFouBI9TcX(N5KI76NqQkB`Zn{8%xR*qDn zW)GAmwsm0t!+ooe!dQa0nNMwjn5wC;Fe*}ENFkHLWWm40`$UNBVHIs)AG5#0VAv9w z1y#lNP$Va7>)Wt7;fw{zND#8>vS?k_3hnU@Vd@0RGmHlAe^in6|KHX8f3JY0RA@P{ z$1Lq&`q=O>Ui6RnQ+A~+7k4o43c8tz4sFBQMc;-ylK6*@9;MWS4`FPvNSp>3Rk>KH2w3w~QwXH3w-kVyi7E zxo2SWT?bxyMbGWX=GUCawk!=~guW`?U^CnYIJoYow}QKhb7IXBbFpcw*sZ3m$qgGX z_nHPt2utcbTniuJn`EiT>HSv9wkj(X5*W62E_r0-`hr$r>{XOv-h=btw9-LT6jr75 zoZ$m4Lu^Vk>)ZBB-J#W;sIv?kF=&9K|WzEqfvsdPQt+x?);Yp!o3 z$Y(KyAl~q`u^C)I1_pxLN#vGKvl4D{1O*14c-~PUf2Z#@w~Q}h=kN3ey(HphUl+hU z@7vHdunMvzN<#})5);E32mPu6DsesfF{z$`j;ui z^2pHFded6^AV!dyLif>=R8nNC%ksHvty?xaxS4PU{OKg~;c;!Kl>LBt8x+O_b%6@pf{lawS=7EYD?G7| zEHZA<>RlF#L&T;bOB+So+g43!u6JX^dYA~~RGjpi`SkcTW@o!bSMJ?FJl^u~;11#) ze$Gc31-vya3pyy)4}*mYpp_!Q1kiWbRwSOT)4M}tHD_EKrMGQfPR4ra3PZoJ)@heR zRh-lM>vONYRoTYOdhcz8^9!$Ks?Z>s(t_#P%|JlTYnmvrdMsKGEv!8|2cLbuZyl~A zM9C0A{lcM>n9al?Y%D32PhL!Zq4y%GG4E^>82A+9@7PHFg_05wT z+z;}zB4}G37$VP$sTJ~i@@FKuW0?L2b`NZY)3dt_B~i^27T3y>Nqe!fbMT2BTDPKU zt1$(jlIaouLZ`6PQIpj8H^YHqV3<1*m6chg^5nV!IQ_BcQz2tyN6%2COIeLaKwo=W+TF1k2)))s@EZQ{V!NPkGe|5y-6&ONTsfoGWk zE;gKz!6qSj6f6t4it>JYv zRnNgqsOU|4fiNeDO&t<3X~Yrkg~C}W6!X}TQNerpGC&h!f`uI~gnOVVI|mX*t&Fy6 z8aUzyLsM6*4^No|vd7rNcdCMw6^+Nhbdm#8Wv%rER|}nvj9}|T=iv6$wsOaAMfd)( z3g(mTu;x}pLcCca2|$(QKu1bXw%@oVBE6#+T4}RSl`T3IX_)5>YdmyN;&Hw~DD%GU zn=u@d0E@|nz~-1R3Xe-VNPgHnb2>Y#*mbXxGtw=JzV@_&pdVguv-)0qCXE2RrZ#06 zJn`R$Z(q*Xa0i8pklEO`6{!q|Za2qDQzPoX_YqFa1uz>nk?ozk zu#WMF(FF0h9GwZN=>_!VPi=+kSr{vpt6+>HHRr zz{cE=w9m*+?SW9<;XJ5#KKmJL#)Sw424oLw@M-UC8->endc_oDg=L}#5O^~~^{q)7 zzFTi+cU*-hMxN!v=CNlBe66Vu>8;$bZ{7Esg06Ut1(7q^{q9SN$DQ1F`%?$Ez-V$w zN1x1#se{sT3&7hlx(y~C>dK}DuL*0tJzA-@?vRw$KiK>OHRE2^dPULO?&{(W8LyEk7X@BThi+lH@oV8cGM zq#I91@-Hba!*E3QbIb%rI;@~sIzi)l11Wuy^!eDuK`_YK^KrGQJu z)F4>PoI?3qXoCO)X7YwR59~wkr=%wAfMO2we+2OYGx`Uqqyiy~nfrS}G&Gc$E*EEH zTaK$M44N#%SF-e;zD?NOw(3%(qu|bSTlpzD@dy5V6T9-5B~{3yX;B*|U3Kf6u{3_vI|1aTi@N zZ6*eIHU6$xfT$Sc^;JI65Pi98U!V4iXnYnKMyRDQc+8B8u5FBOt;N1$5yn5KB!Vl4> z4kh_B%uMVH@yA@n;YK+$R#=b7i^fw*iX1Gl~C)ItT(FlUqX z1M!7eE8QYsCC~u23!t{lr?REAprMSX!rR>$n)JcbKW3?60^e(#8s1XClLWQ^$IdES zRPyYinUbRqb1B%qrcf0|Fd@RfS@$L#HX>v!k=-hORH0elh9Hb7@}cX0*&*R^g@nW0 zmgTSpM{%-=gQ^ zdcaJ`gdW5Gi*)hT_W%DemR)UC+XpxZxA<+mUicUzimQ5v341fGT9WVr{bWkU_8R@1 zK$B}094cos>7%H0H0&L5hEZn5Lka{{5D4PXEb~c>3{~NJj-f*L<9U-;v74yBhdsE@ zO8V)1t1a7dkC}pA+NLf_Hg<({W{im?<$mWS5mhH|<=2q;*YbzCv_sO$Jy8(a?}VgD ze?1$JeNH~HBjpuSKeEa-bmRu4b$B;8J9~Ig4v`;^o9jLbFg`{r z467XpQ0tjXnIA*|(hbv@z?~KZ39CJCLL+C-#_^Dh>~wd|K{jffMBp%3GmkI_`H@8E z!j}cCwXeUJ@Sy=;OggkxCoqGW4@3Hy5E`8;EeI;uGi(JB=lYKeSZJogQ0U3rqx(Y^ zO!5I6*gKnEk@nMQ- zr-ge-g1$9S5etDB1S5v|LIKk!L#ZKiF{ixr5{f7KHxsS)V_-}Uw-ZZVf3Wio#!1h6 zv5v75LpK=#%{|7tJff#8;y4T1Dc~$4rX(jAu8$Z{W9U4#cgjFqcVf=1ScNjY03uYb z7Y90W`oUq+4zn3qk|T+*}TfF?q#dCshxQo~oA7c{RCN7(nVH}uX3?+t6OT$7$UZ3IzG^)jVQ)oWc9jmUPZ z?S63NIPVRML+ksV#PY!Gz`MP}87WTxf1VjdwcKHXVW_V*L!E6pk^ioQ+xC}b=Fmtt zSC9Z$IT+qK=F%+m+~k>vF}Kkk%iHbjvlBxL7Nca8vPqZMRJQ+a#TZ$8%%xn5!X`MR zp}hmgREbMc@km`oMrL8~p&=0)N%K)B=|VvlYvf zF??~ZtWdThi+F0zILpV#^}UQNe^5tghnkoDcm_P@L~vNsaEu;UJYNb50Ji$PdF*R^ z#8wOrsW^p@3}Ld)qjACFc*s)Y-&gfftJPyMi6JEDzxOd>zw}wk0C)}b|@zgHB~8AbjWFYCP?mqxGH&QN+uGRV=st9=mtiB`|dTJnA(`w6w;53 zJC*{u_@U5F@c*hw(Zt_(pDi z-6sfcn+b{3y55_9;p8-*GRQ`$!AeIG>bcM&(!u(a{j5oqc0_E_>3>k0bdbw^YhIRI zNW!|9Vf+>~Q3#biAm^UGCz(k+pfcLJcyN`ytVi=8ofg?-dhv?91f0 zokC9H_<<%mOXs~rB@kPg)4anZs>U;?5|QiE!O5%%kB)+ivDnnkNmn z{pVb&-w!skBemDn68&1dFin;(FCit4#Ndt%T7cL92Mwi!J_J#$M^ox+FESv!4_!GV z#wG5JaKn#Vcp=wN$~$_vWyUJqPnsL1Be5t}To8dsv*17Z)s&VwdsL} zTD>+@SYAjokDg*zMcRahvyG)RxSu_QJ706HufG8QQJoNVa4zy;C=L7U z&X8Peq(p+OG$G<_ioB}He0|3|y;{Oy#T04jerQkYftMdOPKKBEgu!%9lDTM@k$M9L z?pLJ-7dfSAGw<=qI6p)@O*BgmxFyQU{A|srkooTUY=(p-(Sr{&gQ|^umEdpcq7aaQ zB;KA5MoQ(wX~ELU^>XB}Nwtu3rq&AAKlcEOdok3Z;xdP*pkE&EYkCZ>iWzB>a47lw zYH-DRr94f0Y>rXLd6GdZGn{zQ)m?zhLRau!>@!04=^_dYWmGg0Z%(TTeuqB`pV?g< z>xX={h>sbW{L@CdAvf)tM&i$2If3Ds9M8lA>O#B1I#SPYpFIkN8?(C!f;Kci4sOeq zUC|p8%OY;|uOej{g*I{GGvm%$#_*LSeH%$e;lQ?M`n6f!O(oY0ZIg97ku_3!tS{5M zG~S-*bZjO?DBY)4$l~qCRFY?=1)&(?Ax{uBt>_zzMdlqD14v3od}L{e8Me3Y$y=Sh zZZgMAV?|5p?B4JolPj3fz#h$hbtyNclufZ^MgGsnO30e(TVY>Uz zoaf05v0e`w7M`J3Y7;@Sp%w-61Mx~|!Fiexr03v$cl15AU92#ar!3gU68_5;vnB7`0QR=JNP(zxd@Lj z;1VEw!!7-i)axul?>|q!HDy9$i)lvKoY{}7%~l39;~pM3vghv;Q^kcbwD^uH-JN@= z-^b&bOemtWt9=e{ESuY*1z{`8Tp1dPrV-p2KazVUi-#fWyi$ zQuS_kuFP`xJ`Zge$OW5Wkq~&xv8LG#Vj&*^_N!jWRtK9ta%3sMzr2iSnR^9euAs;l za(LB-9aYG~l$8}rd!c&a!Q6BD%SHHy0c@hV&+Dwx}C05gC*_X&9A4FEYOg~qk2H!qW=48l$ zS0Av)$a85T|Ds;^CVNEZ_SJ)r@^EJ^5d}3H15{a6G(qet2qQ5xuZc})^Z@G4$GEXx z$YsuBHmn|s^EV`JlYIH_nxQ8vwJM*`SOTl(>W`{jv<_7_CGdFcy8!*0o*{x>S(v_k z<^!0}qS{NokbxsEA`F`?!?9tm*-mr+7yy<6R`rV-YhEnITBvhQM1*{Q4@1W}E1inDWRTS(|QgD!!6Ztd+BkpCEuwbKa(H~9*WCt?~Cj_0Eb|f*-hAo24F7lVN zOyd?DVRn1S%c#XVfAtYy`WZEN`L?qt+{6l2Ii80b?DXxF-n}p-VBf#T?tZeGTDaNv~gg|%X;f^K8Loj znNH8_AGB}iCCh%s>=AR5wFR@poCht~s+5%YWOs=gu+ z%P;eaz+?-4C1p}Wt`|}57sZjE6~U*(c*DQpNsM6(FN=gzvA*D!+MwDo>tY4@%3W97 zYqFfuo*=TG=!AHGA%(kdpG!@N*I}KqeBW-NaDT|DAo`+VH2{2E#pFupuMfD z>_v5|U$zJgsu#C*4bRsu&ud5;XLfR#y>sX~Mxbgg2tQ;zpyseE?a7Vg!@IqTO1h;3 zSYS((q^KHh4yI&9(v0l2>FSm^GeuRit2D1G5)#xHc;=D8-4EsJN!~W$ZU=VY1-A9s z=BD8vTvmPiQq1b>C|6II+%H9J<8bRL_K`%moYpf0_LVa0Z6*OLNEwrLGHnR*F9h&Z8zGz9_?Ov_vIU{YJi_=(g1d>$r3SipOI2p@0bE`$ zCYgG8-(nn+=WxEqn8F$2sA|%Ni9CBuv~RFC!6|@usbAM+#kMgB}DWP z;6t9yNkxs`4VRy>Ro-MXOniETWt&Kzoj2EQGt*Ev!I3l{Ix`(ECj$|jUk`Iy3ESS4 z#*+f}s-g5tl;jAyM`mzXHbJ{&cYLL-GD|A+tT)Qe@5-}xmogzks3v&^Legv)dkXs? Qec#6Vc#;, 2011. +# Takeshi Hamasaki , 2012, 2015, 2016, 2017, 2018, 2019 +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-27 10:51+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-Basepath: sudo-1.8.23b2\n" +"X-Generator: Poedit 2.2.1\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "構文エラー" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p のパスワード:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p のパスワード:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "パスワード: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h のセキュリティ情報 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "残念、また試してください。" + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "メモリ割り当てを行えませんでした" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "認証方式にはパスが必要です" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "notbefore の値が無効です" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "notafter の値が無効です" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "制限時間の値が大き過ぎます" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "時間制限値が無効です" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "別名 \"%s\" はすでに定義されています" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "fork できません" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "%s のパスワードを変更できません" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "ユーザー%s のログインクラスを得ることができません" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "BSD 認証を開始できません" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "無効な認証タイプです" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "BSD 認証を開始できません" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "あなたのアカウントの有効期限が切れています" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "認証に失敗しました" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "fwtk 設定を読み込めません" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "認証サーバーに接続できません" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "認証サーバーへの接続が失われました" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"認証サーバーエラーです:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: プリンシパルを文字列('%s')に変換できません: %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: '%s' を構文解析できません: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: 資格情報キャッシュ を解決できません: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: オプションを設定できません: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: 資格情報を取得できません: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: 資格情報キャッシュ を初期化できません: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: 資格情報をキャッシュできません: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ホストプリンシパルを取得できません: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT を検証できません! おそらく攻撃です!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "PAM を初期化できません: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 認証エラーです: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "アカウントの有効性検証に失敗しました。あなたのアカウントはロックされていませんか?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "アカウントまたはパスワードが期限切れです。パスワードをリセットして再試行してください" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "期限の切れたパスワードを変更できません: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "パスワードが期限切れです。システム管理者に連絡してください" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "アカウントの期限切れ、または sudo 用の PAM 設定に \"account\" セクションがありません。システム管理者に連絡してください" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM アカウント管理エラーです: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "あなたは %s データベース内に存在しません" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "ACE API ライブラリの初期化に失敗しました" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "SecurID サーバーに接続できません" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "SecurID 認証のユーザーIDがロックされています" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "SecurID 用のユーザー名の長さが無効です" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID 用の認証ハンドルが無効です" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID 通信に失敗しました" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "不明な SecurID エラーです" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "SecurID 用のパスコード長が無効です" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "SIA セッションを初期化できません" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "無効な認証方法" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "無効な認証方法が sudo のコンパイル時に組み込まれています! スタンドアローンと非スタンドアローン認証を混在させてはいけません。" + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "認証方法がありません" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "認証方法が sudo のコンパイル時に組み込まれていません! 認証を無効にする場合には、configure オプションで --disable-authentication を指定してください。" + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "認証方法を初期化できません。" + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "認証方法:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "監査条件を決定できませんでした" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "監査レコードをコミットできません" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"あなたはシステム管理者から通常の講習を受けたはずです。\n" +"これは通常、以下の3点に要約されます:\n" +"\n" +" #1) 他人のプライバシーを尊重すること。\n" +" #2) タイプする前に考えること。\n" +" #3) 大いなる力には大いなる責任が伴うこと。\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "不明なユーザーID (uid) です: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "不明なユーザーです: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "order の増分: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "開始の order: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "order の増分: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s バージョン %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 文法バージョン %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "サポートされてない入力形式です %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "サポートされてない出力形式です %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: 入力ファイルと出力ファイルは別である必要があります" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "sudoers のデフォルト値を初期化できません" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: 不明なキーワードです: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "無効なデフォルトの指定です: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "無効な抑制の指定です: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "無効なフィルターです: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "%s を開けません" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s ファイルの構文解析に失敗しました。不明なエラーです" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s 内 %d 行付近で構文解析エラーが発生しました\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 内で構文解析エラーが発生しました\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "%s へ書き込むことができません" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - sudoers ファイル形式間での変換を行う\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"オプション:\n" +" -b, --base=dn sudo の LDAP クエリ のベース DN\n" +" -c, --config=conf_file 設定ファイルへのパス\n" +" -d, --defaults=deftypes 指定した形式の Defaults のみを変換する\n" +" -e, --expand-aliases 変換する時にエイリアスを展開する\n" +" -f, --output-format=format 出力の書式: JSON, LDIF または sudoers\n" +" -i, --input-format=format 入力の書式: LDIF または sudoers\n" +" -I, --increment=num それぞれの sudoOrder の増分\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -m, --match=filter filter にマッチするエントリのみを変換する\n" +" -M, --match-local フィルタは passwd および group データベースを使用する\n" +" -o, --output=output_file 変換された sudoers を output_file に出力する\n" +" -O, --order-start=num 最初の sudoOrder の開始点\n" +" -p, --prune-matches マッチしないユーザー、グループ、ホストを取り除く\n" +" -P, --padding=num base padding for sudoOrder の増分\n" +" -s, --suppress=sections いくつかのセクションの出力を抑制する\n" +" -V, --version バージョン情報を表示して終了する" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "不明なデフォルト項目 \"%s\" です" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "GMT 時刻を取得できません" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "タイムスタンプを書式整形できません" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部エラー、%s がオーバーフローしました" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers の項目が多すぎます、最大は %u です。" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "SUDOERS_BASE 環境変数が設定されておらず -b オプションも指定されていません。" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "ログ記録時に syslog を使用する場合の syslog facility: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "ログ記録時に syslog を使用する場合の syslog priority: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "ユーザー認証に失敗したと時に使用される syslog priority: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "ワンタイムパスワード入力要求をそれのみの行に表示します" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "$PATH 内にある '.' を無視します" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "sudo を実行した時に、常にメールを送信します" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "ユーザー認証に失敗した場合にメールを送信します" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "ユーザー他 sudoers 内に存在しない場合にメールを送信します" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "ユーザーがこのホスト用の sudoers 内に存在しない場合にメールを送信します" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "ユーザーが許可されていないコマンドを実行しようとした場合にメールを送信します" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "ユーザーがマンドを実行しようとした場合にメールを送信します" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "ユーザー/tty の組み合わせごとに分離したタイムスタンプを使用します" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "ユーザーが最初に sudo を実行した時に講義を行う" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "sudo の講義が含まれているファイル: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "デフォルトでユーザーが認証されていることを必要とします" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "root が sudo を実行するかもしれません" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr " ログファイル (syslog 以外) に記録する時にホスト名を含めます" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "ログファイル (syslog 以外) に記録する時に年情報を含めます" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "sudo を引数無しで起動した場合、シェルを開始します" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "シェルを -s で開始した時に $HOME を変更後のユーザーのホームディレクトリに設定します" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "$HOME を常に変更後のユーザーのホームディレクトリに設定します" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "役に立つエラーメッセージを表示するためにいくつかの情報を収集することを許可します" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "sudoers ファイルに完全修飾ホスト名 (FQDN) を要求します" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "間違ったパスワードを入力した時にユーザーを侮辱します" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "tty がある場合のみ sudo の実行を許可します" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "visudo が EDITOR 環境変数を尊重して使用します" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "ユーザーのパスワードではなく、root のパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "ユーザーのパスワードではなく、 runas_default ユーザーのパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "現在のユーザーのパスワードではなく、変更先ユーザーのパスワードの入力を要求します" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "変更先ユーザーのログインクラスのデフォルトが存在する場合は、デフォルトを適用します" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME および USER 環境変数を設定します" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "実効ユーザーIDのみ変更先ユーザーの UID に設定し、実ユーザーIDは変更しない" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "グループベクトルを変更先ユーザーの値で初期化しない" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "ログファイルの行頭から改行までの長さ (0 の場合は改行しない): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "認証タイムスタンプのタイムアウト値: %.1f 分" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "パスワード入力要求のタイムアウト値: %.1f 分" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "パスワード入力の試行回数: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "使用する umask 値 (0777 の場合はユーザーの設定値を使用します): 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "ログファイルのパス: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "メールプログラムのパス: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "メールプログラムの引数フラグ: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "メールの送信先アドレス: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "メールの送信元アドレス: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "メールの件名 (Subject) 行: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "パスワードを間違った時のメッセージ: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "受講状況ディレクトリのパス: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "認証タイムスタンプディレクトリのパス: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "認証タイムスタンプディレクトリの所有者: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "パスワード入力と PATH の要求が免除されるグループに属するユーザー: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "パスワード入力要求時に表示される文字列: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "設定した場合、すべての場合において passprompt がシステムの入力要求表示を上書きします" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "コマンドを実行するデフォルトの変更先ユーザー: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "ユーザーの $PATH を上書きする時の値: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo で使用されるエディターのパス: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "'list' 疑似コマンド使用するためにパスワードを要求される時: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "'verify' 疑似コマンドを使用するためにパスワードを要求される時: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "sudo_noexec ライブラリに含まれるダミーの exec 関数群を事前ロードします" + +# do はたぶん強調の do +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP ディレクトリが実行中の場合、ローカルの sudoers ファイルを無視します" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "%d 以上の値をもつファイル記述子をコマンド実行前に閉じます" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "設定した場合、ユーザーが `closefrom' の値を -C オプションで上書きするかもしれません" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "ユーザーが任意の環境変数を設定することを許可します" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "環境変数の集合をデフォルトに設定します" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "正当性の確認を行う環境変数:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "削除する環境変数:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "保護する環境変数:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "新しいセキュリティコンテキスト内で使用する SELinux の役割: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "新しいセキュリティコンテキスト内で使用する SELinux のタイプ: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 固有の環境ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "制限付きsudo 固有の環境ファイルのパス: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "sudoers を構文解析する時に使用するロケール: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "パスワードが表示されてしまう状態であっても sudo がパスワード入力を要求することを許可します" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "パスワード入力要求でユーザーの入力があった時に、視覚的なフィードバックを提供します" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "ファイルシステムにアクセスしないがより正確では無い、素早い一致確認処理を行います" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers で指定した umask 値でユーザーの umask 値を上書きします (ユーザーの umask 値より緩い場合でも)" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "コマンドを実行した時のユーザー入力をログに記録します" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "コマンドを実行した時の出力をログに記録します" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "I/O ログを zlib を使用して圧縮します" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "常に疑似 tty 内でコマンドを実行します" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "UNIX 以外のグループをサポートするためのプラグインです:%s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "入出力 (I/O) ログを保存するディレクトリです:%s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "入出力 (I/O) ログを保存するファイルです:%s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "pty を割り当てた時に utmp/utmpx ファイルに記録を加えます" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "utmp に記録するユーザーを、実行したユーザーではなく、変更後のユーザーにします" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "許容される権限の集合: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "制限される権限の集合: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "コマンドを pty でバックグラウンドで実行する" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "利用する PAM サービス名: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "ログインシェルで利用する PAM サービス名: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "ターゲットユーザーの PAM 資格情報による認証を試みる" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "実行するコマンドのために新しい PAM セッションを生成する" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "PAM アカウント検証管理を実行しています" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "I/O ログシーケンス番号の最大値: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "sudoers のネットグループサポートを有効にする" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "ファイルを sudoedit で編集するときに親ディレクトリが書き込み可能か確かめる" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "ファイルを sudoedit で編集するときにシンボリックリンクを追う" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "不明なシステムグループについて、グループプラグインに問い合わせる" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "ネットグループについて、すべてのタプル(ユーザー、ホスト、ドメイン)を基に判定する" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "監査ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "I/O ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "ログファイルへの書き込みができなくても、コマンドの実行を許可する" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "グループの照合を sudoers の中で行い、グループ名でなくグループIDを用いる" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "ログエントリーがこの値より長くなると、複数の syslog メッセージに分割されます: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "I/O ログの所有者となるユーザー: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "I/O ログの所有者となるグループ: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O ログのファイルモード: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "コマンドの実行時にパスでなくファイル記述子を使う: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "sudoers の中の未知の Defaults エントリーを無視し、警告を出さない" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "コマンドが中断されるまでの経過時間を秒で指定する: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "ユーザーがコマンド実行の制限時間をコマンドラインで指定できるようにする" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "I/O ログのデータをバッファせずに、即ディスクにフラッシュする" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "syslog へのログ記録時にプロセスIDを含める" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "認証タイムスタンプのタイプ: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "認証失敗メッセージ: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "ユーザー名の検索で大文字小文字を同一視する" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "グループ名の検索で大文字小文字を同一視する" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "コマンドが sudoers で許可された場合にログに記録します" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "コマンドが sudoers で拒否された場合にログに記録します" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d 不明なデフォルト項目 \"%s\" です" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: 不明なデフォルト項目 \"%s\" です" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d \"%s\" に値が指定されていません" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: \"%s\" に値が指定されていません" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d \"%s\" の値は '/' で開始しなければいけません" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: \"%s\" の値は '/' で開始しなければいけません" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d オプション \"%s\" は値をとりません" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: オプション \"%s\" は値をとりません" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d 0x%x はオプション \"%s\" のデフォルトタイプとして無効です" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: 0x%x はオプション \"%s\" のデフォルトタイプとして無効です" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d \"%s\" はオプション \"%s\" の値としては無効です" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: \"%s\" はオプション \"%s\" の値としては無効です" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp が破損しています。長さが合いません" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "環境を再構築できません" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "残念ですが、あなたは次の環境変数を設定することを許可されていません: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s 内 %d 行付近で構文解析エラーが発生しました" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "%s 内で構文解析エラーが発生しました" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "サポートされてない 認証方式 %d です: %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: 読み込みエラー" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s の所有者は uid %d でなければいけません" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s は所有者のみ書き込み可能でなければいけません" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s をロードできません: %su" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "%s 内にシンボル \"group_plugin\" がありません" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: 互換性のないグループプラグインメジャーバージョン %d です。予期されるのは %d です" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "IPアドレス \"%s\" を解析できません" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "ネットマスク \"%s\" を解析できません" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "ローカル IP アドレスとネットマスクの組:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s が存在しますがディレクトリではありません (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "ディレクトリ %s を作成できません" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "%s のアクセス権限のモードを 0%o に変更できません" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "不明なグループです: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "%s を読み込めません" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "%s を作成できません" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "%s へ I/O ログを書き込むことができません" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: 内部エラー、I/O イベント %d のログファイルを開けません" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: 内部エラー、無効なシグナル %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: 無効なログファイルのパス" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: タイムスタンプのフィールドがありません" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: タイムスタンプ %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: ユーザー名フィールドがありません" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runasユーザー名フィールドがありません" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runasグループ名フィールドがありません" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls は ldaps を使用時にはサポートされていません" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL 証明書と鍵データベースを初期化できません: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "SSL を使用するためには %s の中の TLS_CERT を設定する必要があります" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP を初期化できません: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls が指定されていますが、LDAP ライブラリが ldap_start_tls_s() または ldap_start_tls_s_np() をサポートしていません" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "無効な sudoOrder 属性です: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: ポートが大きすぎます" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "サポートされてない LDAP URI タイプです: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap と ldaps の URI を混ぜて使用できません" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption を変換できません: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "監査システムを開くことができません" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "監査メッセージを送ることができません" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (コマンド継続中) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "ログファイルを開けません: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "ログファイルをロックできません: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "%s へログを書き込むことができません" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "ユーザーまたはホストがありません" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "検証に失敗しました" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "ユーザーが sudoers 内にありません" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "ホスト上でユーザーが認証されていません" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "コマンドが許可されていません" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s は sudoers ファイル内にありません。この事象は記録・報告されます。\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s は %s 上で sudo を実行することを許可されていません。この事象は記録・報告されます。\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "残念ですが、ユーザー %s は %s 上で sudo を実行できません。\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "残念ですが、ユーザー %s は'%s%s%s' を %s%s%s として %s 上で実行することは許可されていません。\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: コマンドが見つかりません" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"'.' 内で見つかった \"%1$s\" を無視します\n" +"この \"%3$s\" を実行したい場合は \"sudo ./%2$s\" を使用してください。" + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "認証失敗" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "パスワードが必要です" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 回パスワード試行を間違えました" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "標準入力を複製できません: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s を実行できません: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "fork できません: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "パイプを開けません: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s (%s) の認証方式は %s 形式ではありません" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "%s の状態取得 (stat) ができません" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 役割: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"sudoers 項目:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " オプション: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " コマンド:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "既定値のエントリと照合中 (ユーザー名 %s) (ホスト名 %s):\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "ユーザー %s 用の Runas およびコマンド特有のデフォルト:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "ユーザー %s は %s 上で コマンドを実行できます\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "ユーザー %s は %s 上で sudo を実行することを許可されていません。\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "不完全な sudoRole: cn: %s を無視します" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "無効な LDIF 属性です: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "無効な %.*s が sudo のフロントエンドで設定されています" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "ネットワークのアドレスリストを解析できません" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "ユーザー名が sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ユーザーIDが sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "グループIDが sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "ホスト名が sudo のフロントエンドで設定されていません" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "%s を実行できません" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "sudoers ポリシープラグイン バージョン %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "sudoers ファイル文法バージョン %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"sudoers のパス: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch のパス: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf のパス: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret のパス: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "タイプ %d のフックを登録できません (バージョン %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "ユーザーID %u をキャッシュできません" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ユーザーID %u をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "ユーザー %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ユーザー %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "グループID %u をキャッシュできません" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "グループID %u をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "グループ %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "グループ %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "グループリスト %s をキャッシュできません。すでに存在します" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "グループリスト %s をキャッシュできません" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "%s のグループを解析できません" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "%s のグループIDを解析できません" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "perm スタックがオーバーフローしました" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "perm スタックがアンダーフローしました" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "root のグループIDへ変更できません" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "実行するためのグループIDに変更できません" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "グループベクトルを実行するためのものに変更できません" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "実行するためのユーザーIDに変更できません" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "sudoers のグループIDへ変更できません" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "プロセスが多すぎます" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "カレントディレクトリを取得できません" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "検証の対象とする長さを切り詰めました user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "検証の対象とする長さを切り詰めました argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure のメッセージが長すぎます" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "SSS のソースを初期化できません。SSSD はあなたのマシンにインストールされていますか?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "シンボル \"%s\" が %s 内にありません" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "デフォルト項目で問題が発生しました" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "有効な sudoers のソースが見つかりません。終了します" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers の指定により root が sudo を使用することは禁止されています" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "-C オプションを使用することは許可されていません" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "タイムスタンプの所有者 (%s): そのようなユーザーはありません" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "tty がありません" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "残念ですが、sudo を実行するには tty が必要です" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "コマンドがカレントディレクトリにあります" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "残念ですが、あなたはコマンド実行の制限時間を設定することを許可されていません。" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "残念ですが、あなたは環境変数を保存することを許可されていません。" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "コマンド名が長すぎます" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s は通常ファイルではありません" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s はユーザーID %u によって所有されています。これは %u であるべきです" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s は誰でも書き込み可能です" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s のグループIDは %u になっています。これは %u であるべきです" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "root のみ \"-c %s\" を使用できます" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "不明なログインクラスです: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "ホスト %s の名前解決ができません" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "無効なフィルターオプションです: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "無効な最大待機時間です: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "無効な speed_factor の値です: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/タイミング: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/タイミング: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/タイミング: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "再生する sudo セッション: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "イベントをキューに追加できません" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "tty を raw モードに設定できません" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告: ログをきちんとリプレイするには端末が小さすぎます。\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "ログの大きさは %d x %d で、端末の大きさは %d x %d です。" + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "再生が終了しました、何かキーを押すと端末を回復します。" + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "無効なタイミングファイルの行です: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "曖昧な式 \"%s です\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "式内で ')' が不一致です" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "不明な検索語 \"%s\" です" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s は引数が必要です" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "無効な正規表現です: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "日付 \"%s\" を構文解析できませんでした" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "式内で '(' が不一致です" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "末尾に \"or\" を配置できません" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "末尾に \"!\" を配置できません" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "未知の検索タイプ %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "使用法: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "使用法: %s [-h] [-d dir] -l [search expression]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo セッションログをリプレイします\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"オプション:\n" +" -d, --directory=dir セッションログのディレクトリを指定する\n" +" -f, --filter=filter 表示する I/O タイプを指定する\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -l, --list[=expr] 使用可能なセッションIDを一覧表示する、オプションで条件 expr を指定可能\n" +" -m, --max-wait=num イベント間の待ち時間の最大秒数を指定する\n" +" -n, --non-interactive プロンプトなしで、セッションは標準出力に送られます\n" +" -R, --no-resize 端末の大きさを変更しようとしない\n" +" -S, --suspend-wait コマンドがサスペンドされている間、待機する\n" +" -s, --speed=num 出力速度を速くする、または遅くする\n" +" -V, --version バージョン情報を表示して終了する" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tホストが一致しません" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"コマンドが許可されました" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"コマンドが拒否されました" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"コマンドが一致しませんでした" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s はグループのメンバーによる書き込みが可能です" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "タイムスタンプファイルを %lld バイトに切り詰めることができません" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "時刻を読み込むことができません" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "未来の時刻のタイムスタンプを無視します" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "タイムスタンプが遠すぎる将来になっています: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "タイムスタンプファイル %s をロックすることができません" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "受講状況格納パスが長すぎます: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "-x オプションは将来のリリースでは削除されます" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "cvtsudoers ユーティリティーを代わりに使用することを検討してください" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "%s を編集するためにリターンを押してください: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定したエディター (%s) が存在しません" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "エディターが見つかりません (エディターのパス = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "書き込みエラーです" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "一時ファイル (%s) の状態取得 (stat) ができません。%s は変更されません" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "一時ファイル (%s) の大きさが 0 です。%s は変更されません" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "エディター (%s) が異常終了しました。%s は変更されません" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s は変更されません" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "一時ファイル (%s) を再度開くことができません。%s は変更されません。" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "一時ファイル (%s) の構文解析ができません。不明なエラーです" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "内部エラー、リスト内に %s が見つかりません!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "%s の (ユーザーID, グループID) を (%u, %u) に設定できません" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s と %s は同じファイルシステム上にありません。名前を変更するために mv を使用しています" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "コマンドの失敗です: '%s %s %s'。%s は変更されません" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "%s の名前変更に失敗しました。%s は変更されません" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "次は何でしょうか? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"オプション:\n" +" e -- sudoers ファイルを再度編集します\n" +" x -- sudoers ファイルへの変更を保存せずに終了します\n" +" Q -- sudoers ファイルへの変更を保存して終了します (*危険です!*)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "%s を実行できません" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: 所有権に誤りがあります。(ユーザーID, グループID) は (%u, %u) であるべきです\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: アクセス権限に誤りがあります。モードは 0%o であるべきです\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: 正しく構文解析されました\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s がビジー状態です。後で再試行してください" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "%s をロックできません" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "それでも編集しますか? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "エラー: %s:%d %s のエイリアス \"%s\" で定義が循環しています" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "警告: %s:%d %s のエイリアス \"%s\" で定義が循環しています" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "エラー: %s:%d %s \"%s\" は参照されているのに定義されていません" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "警告: %s:%d %s \"%s\" は参照されているのに定義されていません" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "警告: %s:%d エイリアス %s として \"%s\" は使用されていません" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sudoers ファイルを安全に編集する\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"オプション:\n" +" -c, --check 検査のみを行う\n" +" -f, --file=sudoers sudoers ファイルの位置を指定する\n" +" -h, --help ヘルプメッセージを表示して終了する\n" +" -q, --quiet 文法エラーメッセージをより少なく (静かに) する\n" +" -s, --strict 厳密な文法検査を行う\n" +" -V, --version バージョン情報を表示して終了する\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "インクルードの階層が大きすぎます" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "無効な属性値を無視します: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "ユーザー %s をキャッシュできません。メモリ不足です。" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "グループ %s をキャッシュできません。メモリ不足です。" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "グループリスト %s をキャッシュできません。メモリ不足です。" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 役割: 不明\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Order: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 役割: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 役割: 不明\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "警告: 循環を発見 %s `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "警告: %s `%s' は参照されていますが定義されていません" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "警告: 使われていません %s `%s'" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "タイムスタンプのパスが長過ぎます: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "エディター (%s) の状態取得 (stat) ができません" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s (%d行付近) <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "Password:" +#~ msgstr "パスワード:" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: 失敗しました" + +#~ msgid "getauid failed" +#~ msgstr "getauid に失敗しました" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: 失敗しました" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: 失敗しました" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: 失敗しました" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: 失敗しました" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: 失敗しました" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s はユーザーID (uid) %u によって所有されています。これはユーザーID %u であるべきです" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s は所有者以外でも書き込み可能 (0%o) です。アクセス権限のモードは 0700 であるべきです" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s が存在しますが通常ファイル (0%o) ではありません" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s は所有者以外でも書き込み可能 (0%o) です。アクセス権限のモードは 0600 であるべきです" + +#~ msgid "unable to remove %s (%s), will reset to the epoch" +#~ msgstr "%s (%s) を削除できません。エポックにリセットします" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "ロケールを \"%s\" に設定できません。 \"C\" を使用します" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hostbuf を拡張中にメモリ空間が不足しました" + +#~ msgid "invalid uri: %s" +#~ msgstr "無効な URI です: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "ldaps と starttls を混ぜて使用できません" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hostbuf を構築中にメモリ空間が不足しました" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 配置が一致しません" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "内部エラー: ログの行に十分な空間がありません" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " コマンド:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "ユーザーID %u (%s) をキャッシュできません。すでに存在します" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "グループID %u (%s) をキャッシュできません。すでに存在します" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "dlopen %s を行うことができません: %s" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "%s を実行できません: %s" + +#~ msgid "writing to standard output" +#~ msgstr "標準出力に書き込んでいます" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "式内の小括弧のくくりが多すぎます。最大は %d です。" + +#~ msgid "invalid regex: %s" +#~ msgstr "無効な正規表現です: %s" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: バッファオーバーフローが発生しました" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "内部エラー、expand_prompt() がオーバーフローしました" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "内部エラー、 sudo_setenv2() がオーバーフローしました" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "内部エラー、 sudo_setenv() がオーバーフローしました" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "内部エラー、linux_audit_command() がオーバーフローしました" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "内部エラー、runas_groups がオーバーフローしました" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "内部エラー、init_vars() がオーバーフローしました" + +#~ msgid "fixed mode on %s" +#~ msgstr "%s のアクセス権限のモードを修正しました" + +#~ msgid "set group on %s" +#~ msgstr "%s のグループを設定しました" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "%s のアクセス権限のモードを修正できません" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s のアクセス権限のモードは 0%o です。これは 0%o であるべきです" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "偽の exec 関数が含まれるファイル: %s" diff --git a/utsudo-0.0.2/plugins/sudoers/po/ko.mo b/utsudo-0.0.2/plugins/sudoers/po/ko.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe271818bbed1c6aa7db870c5f751faf19822738 GIT binary patch literal 51972 zcmb`Q3xHi!dGEK@XMCX|0)p&Bh9sDoJdjsNgg^pB0trcYDAI5;b21q-FXzn3L#rks zV8}yW2?R)DkPw1~l7s+3K-6Aut@YY_YpvRAy=}F&%{k+>Rj>Bi>izw{Z>@dyIddk7 zdIxv@XYalC+G~C5d#|;Z-+#+1wkG_2?qx}G8aVidB)RbAN%Hkmbu~%$zbi>j01pKG zGWaIWzX`qt{6RSXKj1m9NRn5bnIwy-YwEZp*+e}Lj`!!sPVn*G?|l+{H~12G23P@kb@IA4+6_(wPX@cdv%t0BN#Nt) ziQpH*{cnMnbN*xS67bxKUeEG?4}vQH1yH2;CO8`WG5B`ygh@&AdT<>0M(|uv?VJgo z02aVkfdioKuL9NX^&q544uNk2{}#Lm{3!@Yl8KX(R|JoDZhlFMuky7Sww_6V4BVV>tf~_#W_Ap!zlGoFrlBlKCJcO;&*F&!gbk z;Fm$Qe+X2)r|_`od?9!WI3HxFlkR}`fok^`LAsXwZ&2?^&rOoC;H99>KLo1YO#u&s z(>VVjsBs+)F*?9m;0*AypvJiho(`UMev-TcoC#{2ZUI&9qu^!Wi{Pc;%PvTg_kuIQ zi@{q#ZY6&LLW1O1px)O;VG?ftaiQ+)b%AGLzrv;)!!Guw}Af+ioUPsqUb&W)cbA#Q}81oESNk5s{elu z@`~hNK#kv-)19AZgDSTH6n#Gro(ld56dhj1KaeoF1k|{#0M);TL8?mr29$ifoz64l z$sdAm1@8gHmwQ0H@9UuY{jZ?taM2}6@=owWAVZkk0e%>K3DkQgGdODRO`x8?4-`K< z56%aF0Mf+dJO)jCI0)+gXFxswHBfZ<8F&eJ27@elx&;(n?*QKfJ^|{v7eUegA3>U! zoIEp0HiI{Us{cn|3Z6L2$L(BDayTD+2lxq4{eK8-0sjIV1^yh=dqpJmcRY9^cqMo; zcr&Q`%RyKs`7|i{d>2$dUUP-lHwC1s)O$V&N}l$B z;@@wB8rL^52%`7d;5hIWQ0=}0grv!f;G4nUfMdZozt8)5A*gao0zL?y#`!lu)mH&k ze)Ls-J{uH$J^`Ku?gKTR-vmXkH_mbXJsVVi-v_Ect3bW~S&*Sf{tQ&TZ@Aj|`&=;P z{6=szxC&JN9s)IP-vrfp|7i2}-WkfGM~K)boD|>iK^HHEt(d=X5_Gd>7{*03lWKaZt~HBj8WN{gWa3 ziCmusz74z<)OdG-qUWvP81Rol(erc_7@l{@tYZ{K+V=YenG`iDT(`!Vn&@E-8( z;Nzg$^(9dC{39qjzT!sj&*`A(FdbBTJ`m3PK|Qw_d@Fb$-2Y0r{y#y{;Wwb@HSYc1 z?n}W}ab5&Smf=R1*)CB;AHSVQ2qTXsPg{~s(gBjm%AL)^#b&I|KXMh@?^TCtBIbaGFK|Oyv z_(t#msB!)xcq;f!P~-4pQ2l#lySKL$)cFEX?fWRGdLIB&@E~Y<3A~JRIXCYHW`g3Y zeo%aMJE-y4295>~1^jDJ?f50Aa<40Txzht)2x?rf14WOXaD6kV_B;-Xet!y{3H}fi zU%qyU*Y{pf{hJ4>-OE6|e;p{k+5>9bzY9w5{1jAuujq7ojRsTB=YV=&52$u-1U2qE z0)7LuaRk-x)0R4)PXW*2{CZH=H-MtUE>QKn0IGlA0M))9ff|S3fYP5Qb$Pqa0`=Va z0T+O3PamlMY!26-1l5i|2PcC64622>2xUPOg6`oc|s87q3W?e*<^%+?NL! zuRlnV_CbGc+Y0C3&w_2-e+iV_|9GY2uRyi?HLILXr-85G{2WmHF%1-de-Kpvmx1EX zhrn~euY#~z@@w!?u>B*hr}lu7o4*D1+`ob9&zO&*)4{92`QS6)Ebz5|og*{>7mBvk?@%4uPY=Dk!?V@l)=P7C^mk z7kDlB-@#6B%$gJU_r3)J`@2KD|SQ2c-Ky?%WgD1Q5I;Mw3$LACdtTfCpwfI5E=6g|EMs-Hgt z)!vh~x}H1_yoB>k@O$81a58w?eXduZ1>eT`UxAW?BcSL%`u-%j2Am1L3%nP6HTW#3 z{=WpOeLn`puP1Kvac%|Q&G{Tq{JauO!5!iH7r=8lKLXAH(+9jCJ>VrO2Wniu4_*zP z{Gi9XOF+rzBjEMm--D-u7d+(ryZ{tkw}GO|7s1QHpMavr`P;pJH-KvYr@-^U7X$tr zRC`-@__)por*Qr#D7pC#crkd|PM41lf>(0B6+9XIe!yRVqRR=N_VGLq)cfuP5$)s) zp!#*$E^pV}V9NOc@GS5z!Arn@2d@C9KJ2&_?Be`uAgr9c=QGYHUj{|*Ux2OPyB_iW zUki%PYrq@8XTiDPn|6DD7J(OV{s^dkeh-|j`;R&u-w%qf)_{_`&xP|}fbZpe^d9fu zE#T>#KL<_)zYR_U-}0FA)m-o#&WqqF-~-?!@G0;u;19t!fWH9Mk5}&X^U0v-dNFu8 zcq6Fyd>T9pd=b?6{}5C=e*@}0;~)2Y-Ob=7oIe0+oc{(?yWjFz=a*|i_3J)x4fqe> zXt3jRJ}$R|I^P4n1N>^Z{=;zn75khY&H~lnC7|T$5%BHcx4;w}0`>eGpKv@IJdyLu zLG|M%@FZ|8sOKI4RnGzNo!}2ZJ^%7Q_VagwI-ef!{ookR%iu-eHqhi5RDDN4$-~Q^ zbpDtE>ixHX8iz7C3fu#VJ_o}6pMcT_uiWqTO$#_5Jb~*=!8e1ez;}Tg!4~jIQ0@Cx zz<&ir|2G_Pxt;~8U!MTq2kr!~1^)%S5xnT2kIxqHOwPXxZUlb~s$UzPa(eFq#lL?G z&IV69IEO?^Fi^+Qc(Tg2&%s4 z!SUeVgXe&+d(p?~V(?VXSAiO@E#P~=r@(RGKZ6&5Z~lVkeclJ^y_-PQcNi31{~=s| z^-He5&jIIi{llQ%_g_Gj|0SsQjrpRtdlsno4S?r^kAbb={{qhd-|!`GM=Pl3uLsqi z)u8&l2Rs}6CMf#-8oUHN>&xEmPEg~q3mgOf5)>WZ@h2|#mx7{G2Y4~K1yp^11?v63 z0oC6#{)@}qRiMV}lc1jaJgD+Vzz>3N`-$?H}37o|F&%qY(tgpHMGY8ar?*!+7&w?)l4|3@5 zRUGf-!rQ<*K**H*jH8v`vqAlRoa5UZmvZfKj{IMRlbKw*4tyWSef-uqz7D*%q3l|& zf1l%r9P#f14P{nwV?NhzZMd%TALZx_*Z&W{5v^ny=l=@oZ#u_MINrmxAAyf>v~%2( zt7`+lzs0rx$?=CAAL9J=;lB9c{#@BJa=*EijN)9n=~E5Yji6i?A9Qi=k3juR=XVv{ zVP}j9=T~rimg7IU_DYV=gnN&I(og@yaWVHl0G7Zh94q+!1CC#Cyn^Ep$G>o_=N{_H z{M(;`U*yo=Xs++|pUDULy^`ZSoQq$!@mqhRIKFPb&?{V960R@i+N1nF5boUteu(4F za6ZVrY5blQ%Krzy7jhKCIc#lzh=u8ilfyacCpp6LWsYBmYvXyQgJTZI?Oc0TsN>Xt zGq^UIVm30>@JO<#u>0WuM}FQSKStJ|Ucc0+ihA?;(Cmr@j{41uooOv zV>|faP+$|kzsv94;F~$_;^^Vn#F9*-0 zoc<<(4}h=cDDZnK_yG6^p#DC}Z`t88IGLk`V=c$o9G~O*297NpV>tgB_z_Tlf5S0> zV@){MwXbkYX+d`MdaiCC4=!Dd$&!F9%-$$Ab5P@$Y4v>+c^q&f<7qIDeSm z_j0_S<07uj19yTqbG(M*4$g1k(BCGGcXMp!`0pHJIo?K@@!&*o4%o|~zlS+r4$kLz zlP-k6Q^4D~cOA!D`29KXSKtDUlQ$9bKImK z{Pl7DHt=eW#r(d6<1~KH1J4D|;dnjAI*!kCOyc-Ujz_rvccA`e@Vl4e9sK@;UGdoL zHm>RK0**nBz2ST{zZY@nZw(iux~8;&6WNzMh^!Z%10_?(SQWztB8M8|lnz(j|QZX{p@N zms(XHE*A&7iX}bXuE*Q^dY5!{P8Td%($!tGYV>%2VQ^_W*q7?J7b*`F^zKx}^n8b& z?e(fFwy!+cUmk3ws}Os-Ls}{hrhY>-;KtPS zeGBGZGXX-(zB~<7DGnGdx>QS7@9;{j7Q2yE(&X{k{&@R9v8UKOIK8*rV|3)7LQh}0 zcTj}v>gBe^q*!QQY9lgtprbgDE?%W>EL9Cli{1V4!3;aPO8wo1RjJ+VDV9ow&SEMy zDz5Ar)T2Fm)R=5KLo-N~@vm+iXqZNxF(?eCR@{ceA5lG5XZ5sp_q7+gV=ZYY9V#zt zbovXW(h4}4W^@kpmHX3s^|OleE&eXx9GIVSSq!PX>VVz-%w5T zX`nR0yHc`VNqDU<^Q@jiM+fEd1Dm>l_4}Pn%6v?1ti=jy2^F`tmdgG80}S5uQnB46 zSk#RdBby>2?a-yr)eGBsF;#HADu7@mNnhPxkJqArN#DTbrq#( zsP<*8#xOm79VXuU;qXPa$zIp^oH5n>#HgGrSP0}IOvd(2pk)HH1am+ zWLJt^0}Nl^z^dsTT_%l@WSsg9=NG!Ak?QX2w1!85Bf>dJj?b=G+J)YjJ#nt-&2gpi z5}MG$k*OZLFe1&nMf2`1nX25MT_`LsbafXNGrGvNwRHAOh`XW-%g|?b2ql4r7GH;< z54vb&>xx2GO=No*Cv@UsR1+)?Yxnhbn9QqGy0|#FqKIBEE=ORD5WQ-X1Qhu$4iu1t zkK18>#r+<((#0GVh`04sph6>ft+ff+k2m&Rt%=fxlX=K+&+`Q3G%wcceU|JX) zEK;E;IZ$l10;-0W_H^|Yy7l}5Jzpv_3K%DAugGLS7!hdW2GTA2iURHNvc(QP?Y!7u zEOz8|2bH1w(3&zr_yRO%MQ^Un&G|77<f>kAGHflx(6oPB;3Hk=w(%FOl z6n1}cUsrd@djwgj51AcYI#ATV$Q!N;gh|tPO&*`lFN(P#KQHYc=vrQAUnK_V<9wjh z=EbIrPZ#psGS~#&R%wsDp5YVeiLZ>RQ~@-8HzX zZPchlFAts=ZL!nnRHb${zuY^cbcL*1X=?7ub+Qp$Xt|)2ijLvOINoMn9ZWsg)mtuh zjJKQpV}q6K8|cterL;AAE*Zy1y=ofNHFt>?TG@f3S$!4BxZM;*xL+zPDMIaH2NERu z*{q&{VrRLV zht$6O4R@BUfo1HX=s|Z{N^Pkag9>`vyKtZf(M#RkkQQF7ZOzJ*M=rCXZ-A%rz3-6}QceBS9jeoAnL*}$d`68> zSsRUkBBl@q$JD2VfzGlV4n0}!ZC_gG?Ifb$BpU;whnCXBmbNMRe+Ih{<4$L1u9qg( zT?p3&@t}^W>1Bmp(UhvYmaIw_Ua@d=Idt5< zM?# z^X3P|FaXvHgoUOZT}ze}2b^Yl5j>90cZXtv8CvAc#YH}*nJ21tfx;Yw_SHYu)w`Tv z1;@6lQ6n(%m{6$~kMFmOm_M$Tk=-nSQnRv$a+RQc z>8A)eSXjo8_=8qUe_@~mh2~!6L`Q29NXUhU; z!#-w(d-_x78G9;swdqs5Rl|$9P-u)Ji9m!nmujqvT9Fu6Vla^Weu&I-^6gM$ z#*WW;ul7(UE+yfY^h8&o+qk)*T9vSfJ*&4#HJCg-FGr$QTiQ-QXYqMMl}77SO=?mV za@*I9@NOX0Z2WuSP z^zLAv-&2aoBnBlUwYW;s)P>#UAEN0vV?UfJG zK+8&sBs6+O^pTc#nQIW9mm6jVggV@m;bx{X5m@QysYYj@n*j*V>6tLF81;e0UBn*f zxMJ_}F4T&AA0%?1OO~X>BP$B4N;XKLD(NsWNvX(SwGN6`yiAQxjHRr5uq)$RD>0a! zdF9-zXNf*)KKUq_3$+L@f2ru1dBMqy{(k)OOl<_mv;GlAL^`}1s)<-4KSNTY_w=?F zlNQmUiwVV-x|G)Jmr=c;CCQ93SFmrMh)I{g`ikE|YQ&kmzDQ4TaA{vhX=>x68Vp{I z5f8({!)=q7;0g4W2chm|mOsM0iRiKC$}LLOxT|X6mJ6vu6fu{?w&W&3MAqfxGMqaT z*dQr5uNIMfq`PY|H|1o@jp-LPxSSURS1$f z4{DfuS<6wdYN;5D0G8;taadg@ z&|2yYGMhYyT!sy?6{^)$O5ZzOUVV%n+q+3JDzt-v$kkh8+`a@p@V5*fdcCZ1_-ik; zScegSu`=NeJnw=rRgq9~d3T}H#mFodoT*satLZMI2;wu!w`)X63N1^!dU}v1{G*v1u*rn6TB^(0c{Ts@ueAP&Il#Wu$^iEx&=!XW)gdY{= zad>AWV{XhLQb)Pn8FocsKw^;0?rrZbLq~O)`|Wa&X3zBYp`$QGo$2x}y0waAq!sUL za6$7nWOi?f2|ugMT5Bvs)iT9sX*q5R+Uske4GaZwaiOUNlCbx~3-b73YV~V$n!cax zq()S_qo-?S$nJJyBrT{{f|wB@;p>;`YHmyBpjl=AtdZ)vPZC)yYR#2y*PAHW+er!$ z^_yw)6$6ESd0nn~DQANLdx%l-n>QluEI zkcGFjMejgMDK-?{!w{MT&Eb7!nhoR}tsAR$kSa*B(^l;U%pk2BI6w~WuIl$8$F zFPO4ue-{_kU3pcp)>TEaeaEa(!$>5H<6h$u+;}!;3KC4!sPA_<}E4wKdr%Pie?#`L#ZgbF0&$|n!S2Zc@ z6=lJXhtf-`atl51%7-}} z@vX*OFa``QagZLv@glHe#OrEMK|DvBYDEBbzcnN*+u`||Un(9M_T=#tFAmUx9`p6% z*qdqb#VIv5NalH-SnZX*x~>-!Qs*c8>j#S6eYlcpct^RX2Q!Axmo6cR?(_7)pETQK zrPRnpy?s`UFhx;lGS4O^jWz>)eS;{h7!lV*PSRW&TgsO;YANTssKZyum~#4Up3VvP zu^wA4UrIxUdl(@KX4*E# z&XUX+^vj)<4y&ajc*c^w-f0=V_-+mfmxj&#=_wF?7iT4l`~GX3ZhSUzrZD;wh;zW`w6QYkribnDFG7$x^c9W*{7FGE!d2y>kmV#N;97@SvpCABDrZ znZ6@a%+xvBw6o}@O4V}DCf&#-G5t3DzSw`x+$*k`arG=?jq4W7nqQ}$YrL!KR6HmF zOT>!$x<AK`79#u$g3oTa|3y zk!jTh<_VK4QE7@j^8svtY2d#!6Zt|9&?mD?4% znOgf@o-Y%)HPoX z)Xb#%7FHh>mMB;a0UuI=m+>>BYEV)3X_4uG$0&B(dC%&G4u)CXt#+>oA#%MJ1HF zDLt{ol22+uAagC8vf@|*5<|+ms5c9OahOrZIo^ij$waBjVC3nm8&okPibadPY(Z0h z^uJ{omAb*tFb6;pglmTDZML0Z%p{;}-0!I#Q^h8R*P9pY!m_lFESGh8*38)p=Qh`= z$qk;E(bLD7GHrNbSkkoNez}*XX1Unf`)txJI#E)+gMDOMdX!J2pM)X^F%f83d!&&= zU!iYrP;QzT=8IE)GQmUPKrXo*k(3&{v06DeHcYdG!8R%#>p2uEi%FV2d6QK7&GoNo z=_e$@;p)QZ4aT#c2Qp~dEm216uu(1Iw!Nc28%i|sQMX~%}Qs?n~f>= zh^to68>$vS9c)90Gwe-Cbf>MM^2-TZ%|$>9^bWS-X(qPn!x8}MO!G39y;g&5g@Y|m zQn$(djzZg{W30-yiMCooQ#eqD|4D%C0W)fv$CKccd)tz%K40I|&HR=%%fIw!?=_Lh z6|x9dD**<&(AFWZU0+BRK`ByZ?Xo4COUg=tCYbSJrxwZ#z(CfE(PNri>>J=}!!jty zD)qMnr+e5voWHPahw#m`4J48LkEW=%xTWoEtFBD{Ewm7(k%@FSp~;=POIpaRrN4C-;Tm@)=yJLCN-l>!P){zu#^T3Sge9u1XmJK zPe^eT1~sLf^s?%qONr-NXKcl$azI)TVvg#V)^;i%li(i0Xb8N2C8VAiG5vb@kR-e6 zTFup^DcEG#l~KblkpU;Eu2hVc9u9k=?lzCJE>kLlJWwX&xoh+_NIrS<0%{KWmq;Qh z|0kZ1dTU=k7>QIK4B?MY&L*D8VW{QBGhQOM^_e?;D2^VFW;4+YQy)pmLq_RL4*FT8x!9 zlk&W^JiyjgCl>K98e|21t+f1e`*;uAr}kC+S1Pm?QdXd#Ev0lWK*CH)9fQtom6(2&=R$h>`w@^&$ zdItu|{mMgd%5-p06|5??yq6U=84Jr=Wj66PO@xAjkxLG!4N3mfpG1Syx-zcoi{YEE zP0)NI4C7`Hufy2bo>*|*%(=7XFIaTxj0LlrCO)EbV=RYtv)3%nUPDg8s1?`Zwk0|H zD@rV>O>X(?A@`I?ZBr(dtYoHWb7WHuj0FZfERjSdO---Sd?+eLx;9bGq_|f>#pOjt zjEEG4qS;-ljrR~Q#c=scQAUG|O`sB=#cC-hd>n;PF&wUr)KCe4I7cJ#q9`#P17^(c)O_7?m-K z=;ULzQlo92rqyy& zyqzsBl9kBS&nK(aY<>%S@XuiQd6v+ zYtPH@Kyh)oi$sy`<^1BhM>}b4Q43)D2ro#AD1+Y8k&Z*Hg|7nJS~|wpJ>s*ZmXN7$ zB6;Mx3$|$6hdIpVjmixRUGc@t*l7^zVKe7~N;e9!7LjmQ~Wo`;9%yQ-LvbLh3 zVY+h60m)Snohwst3dWSbQLxP$Te>0f;#FF5UE?_az+eP6&b~gVqgHk`u36FxauRB@ zsm`rUn_iz%i)Ybvd7>>|tqbSECrI(0(Kx(!nSHR7Q_XePON6obyh>Gj_AyowZ#XkS z7Ow|O&hzEkIrcPEXi)~*aO^l+r&&v>P&m6ce)zqxn3^Xo_F~?IO3{XNw5^rqIOH}j9)FmQ9)+MV7MI$!I;&7+cX zzI^Ze1-VCVYVFaYG+iND(T~|P^+0hz%ReoAK~jb%M6JX%a~GN&WNPvw^pcc|&4Xw6 zF!I52c#X$Mpjtk~m*^;StE{ARrE^a{*tdy9o47^jZ5OmnxnS|+Q7m*JNN&Blgso`3wA@*0UC7F*rGtZf zWj=A@;&SIl$kGgC%_KORnogNC`NG!8lUgUApH7}M_1wwt zo^;`)Nu%a4!`HfSpwL_5BW+~^7ZjOjXkFTuUdAzv%@CHgcMY(_zHQQbrkr<4rzXJ3 z%JsaLCwn`~@LKD_qE?t+#T+gPt7+tjtuDQoHTFHN%la=^5Cb82IX=Kvt3oYBKl_C@Qn!T&{BCP>rT48Ydbqgnv6d zYp0c|=>>e?GwMd8)YR08r~Gwno6n9|{Gh?F>rAwlZKGHMHc;qpy&UNxOVNvi%4uo( zW2@8Z)(zDSPggdsuWa0%jH-P0w#u&O(xLm;S08+QXzSkW%8>*6E6=RXU8(Lk zG`yl6o03tcWvcf-F|>7;#GjoTs@tBf-nQ)+TRn+kTtihK+)_RGL}lOM>iu`6)wTPq zCA-oihxb>WI?PT`NA};tqRiHIZD`?^e)_cPy4}@XTZcAnqHphIV+1;BS5m)}9y$18 z<>Bp>M_)+kvr2A#+`Fur$b{xLfSTqn8rrtCx^aiq<&UKGH!6>9N-IyT9(n*m=IR=G z3n(vK-MF2{)>WT-qPk;UI`qKS>dr^A3bYqQvyGsp#l}>h*B@rd8K}uDbIsCo*(CvVV=e($n?TJv(5r%BSzp z>qpu@CrvANuB$$@y7JgvY31=PkOT^AY=-XM&Iycp$a0r(uPsh z2UZ71tFn1NlED4S!Cm}7%8bd3Yej?n7E;rE_-b4l`Dc3^v=r8?JatG_)E8El#Fr26 zP^H86l&T*TaX=UjNW1gyv~qAg8bD8yw`^^`n^dDx5Zzq(80`t^k!KHA9(is;nrRZd zziWH-fx{X5>IL)c1tiZFokGx` zLzmQvWxV9nt?odl4R2TTt!ShuDhJn9cdg4&{uo?Xr_Wpo4c~@Jg1zG~m99g3rIpX_ zt=zj^UK25wxFx@+(@D{f*>I^L$|K3tUa6#J+y8FNg8RBDu%nd zjzL9F?K@mKxHYYAgQvIEOKNrZIw=sd8sn<>-(KCif4ti1qh+h6MceGJdjGm32QesF zrAH2~hPzUU`+cS?MjD`D!*k5O)eVsA_V}ga^l6nXTPnNmki72MCoZC^@KcI$fWy=L zU1QDR#v+a&F8%bVa8eZcmdfLYB&D%=Sel);1%2)6TMEC4^=US=zsImP+Xt(-~ zdqw@wUEJo%{yWp^Gh5^k!0=IP8p-lW??O z<)D0ww0dwG)IGAF?jBm7RyOX1ozv>m+bf$^ryS@pjXU?nF};%SVS8i^ZCO`&cpv{# zp9Uh6NeC#HMFztAVrCS(v3qrp|E%SeTLXjYHBGk95)(XmxU%l9bZE^!Yt+O0(Z6aN z^tZPTcac=r0-D^glUDGXsvCF1&PK+^*F#+?$;zD%RJTF~>v)~6bYZbgwQ_V6Q@WY2 z-o80Bq`GaND2flZ7G7O@sIuq9+K4ohoZnh%YWr)svCQwd<<3)Z=3tBJ^Cr0RC~w=I z9yzp{wn=N;f7g+No8%N$_HV21T4M?j0eWt)5oG^ERmjQc?Ace@@j_a8@} zXCigrw(8Dxa)>?5=D`h@n{+vEge|&)FYNnqIlBbg%0e)y%Wy3-z1nlDVW+OZ zY)5b-Z{Hjq2%B{oO}1{qO6xi8)fL>qXjy8iC^{d}dDUJep?p*mt`#K-jfx;wSaY84 z(%2YmT@Q6dXINqAQ-`aMF(7rXkm6}6VW!7HM~I7f?0CV5Yu>xW&pAs&B-0Y3lQ!+| z<$Vw8Nh)U#q(^J*-*V)oJ6tB{2badt?D5fq*?o6rt=goaVH4F($iv%$z~{%_syH+b zUZjeh>&1|A_j9&Gdb7H9U1j3~!3f4Z!-CNa0_Z!2Wu0{|O1$FEoSdHOdf1qE#BSQV z194oIGV&5}#{G|0m{6w%S-3PKoSKBOeRkqyMuq?+Div{A6x zxY-6|Ssx-p)dg6?$LhDKk{w~lCKyR?-y~yoUm!W@-^N>84^_9qE`g=$Xi(ONfFspX ze`|OxVh7x`yYEs3$2U4H?5lj*6j8wfBBiUrw#qj90oz@1z4m4oC zGUM_uAW~wz4ON0|BsMZy({0gAQ68%7-)uQVTY)sO@mjbghzIpf)plrNBspq(c4Um2 zlgH8Nk*A) z;uz51pRYJ0E5fV3;>@&k@P?#i@|ld`n3i+SWaBG0I{wyd96X)k_CQ;>O*wOA z=w>WZ*D$-M*&P%0;1@HT8nPyXVar9sdtvL5iVZQy>vmvo4!}!3!qpuwnvFKvd5g@e z%El5EcrV@~#3w`W@TN?S<;!N~6KOnJaRf;6fc?gqxm6BlCJqhPk5N%1F*%*ByUa5P znmxy*S=HpRj1jY7U&$^xP=|cuH+etNJRhYRDGJ1|mNS4Tq)c!YUAr`UHA14U%1h7Q zejJb0y(+DK{w^5{nVCcD87!ioW(p$fueOfMOtKI8QOl3?w&Qu!nr1xONS*2~2AX8s z(I~nVBD(_b` zh-NyIK$oV~+Kx^!I@A)wFe2o7M5228I2G?AN_1w0WVj|`b2Wx7<%w8XNvMZTA(uK_ z{Ys^vCOT;AdyZSJoa1T*#dqAwBb1G5Yh?97!D{_jG#{~8p=qJxC3V9?$3yHKq0I+} z@|I+E&k90IGi!f4wy~2(O;||#D|=qBP3`2*6MjmbFpyHJxSeZb)Ta;kePqPka>77m zBt6w6wyte==P5DO(V!!-MbW(;7PyI(cG$E)7Ct4RO_gmP^mwltTbOBJYPS;Ns_0t> zTTVO4L^&bqJZ*NnQ*qiKv}T17&25qwLJRur5*U&ei4wfVop(foh?lDmDq)Q89UK;V zuFOD~SV?lV9@#Hl8WK?df2ypr+v1krv6Z-~c&irUHcJ8S+K$Z@-;pv>xF56!;lDf- zvo2DmM1Zl|&K+jDLxOS}u{REs2$iFWm&>H*!7WFg-j~&3sdZThc>p$DrId@y0*PO1 zu4R|Zl?;wbE({_en`8=FmEbfoVluc={iY+}RE6~0NZOcc4NM#?$IkT@+-7b*j9I;P zP3D^N@b+E2K}+ysyKMAr*fqp4ID>RBdwjf(p>JK6gzNTYwek6;)p||VcKLHKemZpL zAyH8#z}lJ6>bin~x#V&TtvOU7hp}O|I!@Gyl#;hJ26>9q%RP+S8WE_m3cbrT5aG!l z{58w)W#Sy;9R)ACOK&&rttE_28pFNH{>Mo)PEEpTqmxxPfIP=;eU)d{8R4|nT%D}t z8e)3E$w-%#XUqrbf$gE#n=%Ha-$1 z!0Fo1eB-ao)5%lA>uul-4QvRKDhD4XC0cXoXxn;C`06$u1R@#i za3xPjvdHY;nnQ`_NKLAgqCu)dHf!DX>iS*5MGMKR`;=>uIj|8C(QIDexxJz|60KS) z_wKIVcSsV7AL?~kX`(yK-NxNW^8VrPP`Y^-z@>UfNhN%AmO1 zn9+v8JM42^{$aRVV4`nQP!^u<+-sru&Ta6Nb!S-3wfR)}5C_){ZGNHhnDVlsgS65{ zl<=NA%w%raqEKedKGO;o;a4{vI6hrL*!~om=qJeSt`UbSZ@c3KL_QhTqME*O?^%6y ziLoBoa)-Q_+31nfWZqS2Mm!7b8#hit&|M06 zkD}@|iTAwD$Vel%(Y>_%ZBq(iq=K?;Lj|Mw>oYF)N_Gn}SDvk7} z`Yeg1msZw20vl&KEE6(nh9uS7P=FS;B)09KWQ$KxEwR!-l%S(T&OMOqxphaLcE1Uh zxP6mHL4lGr>u!mcV-|w6=jp&_BP;$IC@5r?O-FZAFSP`o`UIl4*C?Yb6_TifXQ+vVN<(4AfZ8 z`fu~i7y*r`R3ny78zPG16*fM$X+oNt-yE@YoWpMm6^~{Pn-Zib3zJ~0 zUE8zy3HM2cdG$fUsM41QkQItSgtuAztf(kBB5oJ7l5e;;gn&Q#h(XxL&CgiK?E@*$(f?7Pwur%4&okxyZ5eFqxOoI6Xf+ z%abvm$Jri&VU}5-L4!gB<_tPw+*U_9_l3PPL3vvc)exK6l1wWVm7;r)xyPG1kh$Bw zZ{sl1ItwDMa+|2z-XRt=-N1UR5Mu-*(ojeXwni+FX9JrU3t2R?X6s2E-BI)7q)L(2 z%Emi1!tTIGA9)xQyo~(JRMyV8E2E~C(6@&*c~xPJh5T)g2=KCrVp!+R7LS-RiKy1H z?7@?LW<8~0L;9chgp6f!@k!;8y*3Nrti((sIhLc9x35dG?Hy|xEo!b~R?w(?qK7m5 z)u!R;xH_A;GTzR-Qya%!oJ#fu6~65KjM zRiD8-s!ag7DfhX~#I0K{j~5LLy2;$UP%fs)+!%VSVlI~3*C097I4@-FR!#s1rzQf? zb+U!NftIcUZP?vf&7P@cw!t_@c8#qvhsi|RBI%^E|A6X2U>-cgRE%zuSq>~RJSL7A zD=igKOl8SgpPF_D(4uG(#L?>GM9Soo(}{`u=l2fXwplJBX%3M*)9eev-jlU8@W0)2 zJ|$}-8$V5AZ4`m8y@sZ4+FO^R&ScRd&*9-e?p0U;;{JFp(GlVVSF_HPhbp8V>#B6) zov9A^8u>W-BO1kw(c(}Q2Y#zMe9*$!nBFw6C>P!ws|{k?dYX;Y-_}xn$SZ>_O>MDh z4Bkde#A0Hi*A!SNrZFuaYar$+ua<>fwJ z;NH41vvop@68URvLSu83&rAc(I{(~u)zAtap5J8 zl^d;mndS&m zy|-W}`tf4jKq)iL!(-7=VIrxPt;R{%&Wwg^g3BOv)U>N6T(u}VTR_6LnW2C(i3e`8 z1Xs4!BojjUK!ZZs3hwT|@Avf72JY^3E!>S)F4og2Z(Al(4 z)+=?o_Ox4*FdLyaS#OV?v&gM?;Qw_Ym@Oxu>9#fNf~g&GyUk$EYKu7{8S*j^6;oK{ zjERz+$J9P#=?6?7669;1qZ3`mA#o#Gzt|+L>{?%aaSH}ZhFTLNq^;|bXX@ES+kjxM?+>gE&DRjJPXo z=vi-OwJd=pk6pR%d7t?mHUXA|{X&WN zXmMb&V0ZB%LKGsNiAxJj(c6HGWg`LGGW2(OIBY7~;@*KV6Dz-s*AHRHYW}H5xoAaS zGL3)Mu)fp-rF;{klN|FN9`MSU*tC}~!fd&U`Rh3`&}?8rbc*+9X{wDoY^;*%hUX9` zqsXSciS2lhZ7(W64juB?YP~!V|HyN!uh;Z+)SUj>>}=h3Ol!=+Xm8P|mCcn1?`hm& z6cO@CKrI)qEu=+RW$dHSZ6^bmTk0)&^4h~oB#H40*~pjrwjrw|>KHiAS*g|=UwE>X zNllwmj)73fvgH(Y0+%-oqc+5F9T}{J5nsVlScINrnGf5z)JfJR6?n{!Yl&-M4gw%i z2Vn^GJ-!-}xU*?P)*{X9k*Uzk(a5O9i-RR`YBVpVwMF$|x#i#5JTSJnewT$}vZhoa zl^-I@*)vV#!y=BRBPI{SC)9>jlEpEZ?7(+Nt4lLj(jqn$q##|4KSn9#F_t5^eUsac zn$l_;6&C77#^DXd$MTdcJ20WPH7oA*n81%_5;6r@^U_HLkpW<8-4d_bi#4={UF>{I z);Pa|X1aZ|O~AAE!&_`RNy((0Bnukc6>LZ-g{_N=3g!1`;f1Y4OvkV#>#%zy`KxR9 z%W#g-=B!$-m0QIu&SNl{>}3*{$&&~74=+*UVE;ZXWQ_NJ!D!&gnoIykH)jfkAKJ&& zN6$5vcY+D4+Gs@kZ`q@m`#7u#c}qz(d!p9iI&UmTh;ZG#Jk4PQ<(5%VeyU~{a&BOD z4^?d|GyFSxwW7(#c9{cEE5_CtzT+$7nyZq_VaHcp58hBNm*z8T&cw%{ z#;&bLp2fF~9~d?^(>`!Rt`7S=N4{T@$nX)facJYCx9+Iye7ZTgV)Sj^x4NC{n>ZR1 zxPNn|bHXx=d^e+q78T;LI;?G;e2ZAOvTAGnCb9YJ%KvIY({ti}rR1wUAlUOPO7;LCaa0aoL@aD^Gm`S#1>*o{f{!hfSF% z5{^;QLwCWkCKS0E?fa^1%BHQhwQQaQp3PGNA#5re(=YOrgF*`?G4IXWtFkKL;{r1jN#h0kgv~yds6K{cVi{o7KJ2M{8SyIdO?{!T0j+$kTUq_q zpvu^fs3(p0?mJB6TT^qnU1v3~w^14Vp^f`%j(bLpLrObF4NqS(edq(2845NBwS8)p zMkaiy)TfcBhBPnj*NzBorVb-7*!=B$0y#Xj65Xn>;BVOa%3uha_%97v8p%?eSE;S3 zlgq2+UB{F8X>44K=;|VwI!k{X=_Kc%`h=1(x>ZzfgteekmkELy4e?2SrM<+O<=dG+ z$pvc^x7xP2R=sCU;>T{j`$>cM6g(Men1(XdfV9mG6yv>mI#IDedMv>uRM7ADy6#O>endJhUc!#%%U_QQT=)`|FBw zNBD9$r`p;`oJrjnQAzYS-@-;s(0qeC2-;dx<#pAX9!FHv;EOakFRn2mxshM^9rApV z=0~?BY|I;zLQwIUEw-(~9zrRmcXo$&Ax5l7q#R$svaL%r@pU`&j?AlZc!(pkIBI{| zx;T3!O3_&*ORMC=jkctTn`TsYCr&hviythot&m&YwL2d*Gx}jq-(j}1>2Ni^FqCsyz0o%xO#XC2(9cha;3*Dy0z&kyPCiVXUJzYhEvb zgL^|q_CG0^&|;bLk^PvFY>2`p!EmQ7`K_5`xk`Lc6+;zM7Fu#*8wMX=@u4;PFy1@~ z+a1BU(Dq$umY!2KS}Q2|MqY|0`zRtzM`kTaw7sXBdUJrYiHczb{R3KiYwgo07I`yE zsbo}x=M1s%j`S%6-_ol{$N>-@+K0HuUr*K%8@y*$S06r*udS5jv0(1suVKG^Rma&j z6ol=CA*ba3PZNLZ8jsOZ`{Mcd$K)tu%gUeQujd%8!b6M-;P~qtv2DLoZAWh*u@=cG z=^^y0Qum(wQe$l+0aSd0T$tqJLHg=u71U?TInAp52Zldpj@q_kSD%FGZGDlaRevMY z=1Bp4D}NlNG@?hTE9%Z;R2EcXHcw##N?!397Ay}}A4z?zBE4s^O4G7gn%x7NqZd|l z{r}=u`i?X?mb6)|8YtUbI_Dx2XAr#)8`DI~J$5r_wlu`6ecJ5b@QzV!Pu}Z}>6zgr zkFS*1S6grx(?hl{-86dh%!X=r&t^>hUe(oOJ}D1uEjyMpY4XUotep+kUMvvu7)o>T zq3Sb8P=mlE+UuIEE{n+29gM&TUnVCZ)8zzgcHY3>ehM3mHnAJca%5l!%s-=9HMYWE!9Mf#-RyOk8g5B(<@XIK0({@q77u@XxrZ9 zF*(gZk5Ek7jUC#=3L};9FIrjANoqgW{v%of*hE(|&l(gu*+oKIeNzQ@RPH^%i<*t& zxVWyR!?r$GYAr4+JjS@>$uLYV$W#W7$A5$1^3K!_ec%nVHquLVv1a7hI~g>Qyx>X& zzV%NZ^{zOx)8vu)Gj53fAAVKH1s$clH?NlKI*KW)W4e$TR%=FnM4WkitT!w>P*Z-k zFFVdAo-oN7d5c=aB`P$Mx?aCv_NDrp^G4L+M=g}#bcK&ZylTbB$EdT8NKrCJmgEs9 z3>)SVGdI*TJq>qF5d}NvNmH60XTF?!tiuhDg-+#tk!Hn?Fr|L$9r{8}?@1ae@w-7Z zS%J}bAI_)Ja^vO9De^b+aS=N^LSAi`kk6SZ6T)Wl34?vK65}aB_9>r3)RXqzBW5u) z&)${$f~MIc4b$0K$0nai*P6US4xahuq2!2#{A(juVTpI2HF|1NZS(p1oj-ja`e}jw z?DNbH^ur#^cA;;4RvXgC9UFaD`r6sF*)!kkUyF?}pPUU3i-__Xr|GL4 lZHs1K9^5MpWC2S^4Aj={BlJ19fO0VrJt@l~{uUbf{{eTLryc+R literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/ko.po b/utsudo-0.0.2/plugins/sudoers/po/ko.po new file mode 100644 index 0000000..d55bc7b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/ko.po @@ -0,0 +1,2390 @@ +# Korean translation for the sudoers plugin +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2015 +# Seong-ho Cho , 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-10-17 10:51+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.2.1\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "문법 오류" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p의 암호: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p의 암호: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "암호:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 보안 알림 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "죄송합니다만, 다시 시도하십시오." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "메모리를 할당할 수 없습니다" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "다이제스트에 경로 이름이 필요합니다" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "잘못된 notbefore 값" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "잘못된 notafter 값" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "제한 시간 값이 너무 큽니다" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "잘못된 제한 시간 값" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "\"%s\" 별칭을 이미 정의했습니다" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "포킹할 수 없습니다" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, c-format +msgid "unable to change password for %s" +msgstr "%s의 암호를 바꿀 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "%s 사용자의 로그인 클래스를 가져올 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "BSD 인증을 시작할 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "잘못된 인증 형식입니다" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "BSD 인증을 초기화할 수 없습니다" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "계정 유효 기간이 지났습니다" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "승인 실패" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "fwtk 설정을 읽을 수 없습니다" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "인증 서버에 연결할 수 없습니다" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "인증 서버의 연결이 끊어졌습니다" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"인증 서버 오류:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: 본인 정보를 문자열('%s')로 변환할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: '%s'을(를) 해석할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: 자격 정보 캐시를 해석할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: 옵션을 할당할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: 자격 정보를 가져올 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: 자격 정보 캐시를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: 캐시에 자격 정보를 저장할 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: 호스트 정보를 가져올 수 없습니다: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT를 검증할 수 없습니다! 공격 가능성이 있습니다!: %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "PAM을 초기화할 수 없습니다" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 인증 오류: %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "계정 검증 실패, 계정이 잠겼습니까?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "계정 또는 암호 기한이 지났습니다. 암호를 다시 설정한 후 시도하십시오" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "기한이 지난 암호를 바꿀 수 없습니다: %s" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "암호 기한이 지났습니다. 시스템 관리자에게 문의하십시오" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "계정 기한이 지났거나 PAM 설정에 sudo에서 확인할 \"account\" 섹션이 빠졌습니다. 시스템 관리자에게 문의하십시오." + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 계정 관리 오류: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 데이터베이스에 없습니다" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "ACE API 라이브러리 초기화에 실패했습니다" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "SecurID 서버에 연결할 수 없습니다" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "SecurID 인증 과정에 사용자 ID가 잠겼습니다" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "SecurID용 사용자 이름 길이가 잘못되었습니다" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID용 인증 핸들이 잘못되었습니다" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID 통신에 실패했습니다" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "알 수 없는 SecurID 오류" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "SecurID용 암호 길이가 잘못되었습니다" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "SIA 세션을 초기화할 수 없습니다" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "잘못된 인증 방식" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo에 컴파일한 인증 방식이 잘못됐습니다! 독립-비독립 인증 방식을 혼합하여 활용하면 안됩니다." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "인증 방식 없음" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo에 컴파일한 인증 방식이 없습니다! 인증 기능을 끄려면 --disable-authentication 설정 옵션을 사용하십시오." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "인증 방식을 초기화할 수 없습니다." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "인증 방식:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "감사 상태를 결정할 수 없습니다" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "감사 레코드를 제출할 수 없습니다" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"로컬 시스템 관리자에게 일반적인 지침을 받았으리라 믿습니다.\n" +"보통 세가지로 요약합니다:\n" +"\n" +" #1) 타인의 사생활을 존중하십시오.\n" +" #2) 입력하기 전에 한 번 더 생각하십시오.\n" +" #3) 막강한 힘에는 상당한 책임이 뒤따릅니다.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "알 수 없는 uid: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "알 수 없는 사용자: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "순서 증가: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "순서 시작: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "순서 패딩: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s 버전 %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 문법 버전 %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "지원하지 않는 %s 입력 형식" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "지원하지 않는 %s 출력 형식" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: 입출력 파일은 달라야합니다" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "sudoers 기본 값을 초기화할 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: 알 수 없는 키워드: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "잘못된 기본 형식: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "잘못된 생략 형식: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "잘못된 필터: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "%s을(를) 열 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s 파일 해석에 실패했습니다. 알 수 없는 오류." + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s %d번째 줄 인근 해석 오류\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 해석 오류\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "%s에 기록할 수 없습니다" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - sudoers 파일 형식을 변환합니다\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"옵션:\n" +" -b, --base=dn sudo LDAP 요청문에 사용할 기본 DN값\n" +" -c, --config=<설정파일> 설정 파일 경로를 지정합니다\n" +" -d, --defaults=<기본형식> 지정 <기본형식>만 변환합니다\n" +" -e, --expand-aliases 변환시 별칭을 확장합니다.\n" +" -f, --output-format=<형식> 출력 <형식> 지정: JSON, LDIF, sudoers\n" +" -i, --input-format=<형식> 입력 <형식> 지정: LDIF, sudoers\n" +" -I, --increment=<숫자> 각 sudoOrder 증가량\n" +" -h, --help 도움말 메시지를 표시하고 빠져나갑니다\n" +" -m, --match=<필터> <필터>에 일치하는 항목만 변환합니다\n" +" -M, --match-local 일치 필터에서 passwd와 group 데이터베이스를 사용\n" +" -o, --output=<출력파일> 변환한 sudoers 정보를 <출력파일>에 기록\n" +" -O, --order-start=<숫자> sudoOrder 시작 번호\n" +" -p, --prune-matches 일치하지 않는 사용자, 그룹, 호스트는 제외합니다\n" +" -P, --padding=<숫자> sudoOrder 숫자를 증가할 기본 패딩값\n" +" -s, --suppress=<섹션> 지정 <섹션> 출력은 제외합니다\n" +" -V, --version 버전 정보를 표시하고 빠져나갑니다" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "GMT 시간을 가져올 수 없습니다" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "타임스탬프를 형식에 맞출 수 없습니다" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "내부 오류. %s 오버플로우" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers 항목이 너무 많습니다. 최대 갯수는 %u개 입니다" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "SUDOERS_BASE 환경 변수를 설정하지 않았으며 -b 옵션을 지정하지 않았습니다." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "syslog를 기록 목적으로 활용할 때의 syslog 기능: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "사용자 인증에 성공했을 때 사용할 syslog 우선 순위: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "사용자 인증에 실패했을 때 사용할 syslog 우선 순위: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "일회용 암호 입력 프롬프트를 자체 줄에 표시" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "$PATH의 '.'은 무시합니다" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "sudo를 실행할 때 항상 메일을 보냄" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "사용자가 인증에 실패했을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "사용자가 sudoer가 아닐 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "사용자가 이 호스트의 sudoer가 아닐 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "사용자가 명령을 실행하도록 허용하지 않았을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "사용자가 명령 실행을 시도했을 때 메일을 보냄" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "각 사용자/tty에 타임스탬프를 따로 사용" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "sudo를 처음 실행할 때 사용자에게 지침 안내" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "sudo 지침 안내가 들어있는 파일: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "기본적으로 사용자 인증 필요" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "루트 사용자의 sudo 실행" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "로그(비 syslog) 파일에 호스트 이름 기록" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "로그(비 syslog) 파일에 연도 기록" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "sudo에 인자를 넣어 실행하지 않으면 셸 시작" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "-s 옵션으로 셸을 시작할 때 $HOME을 대상 사용자로 설정" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "항상 $HOME을 대상 사용자의 내 폴더로 설정" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "쓸만한 오류 메시지를 제공할 목적으로 일부 정보 수집 허용" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "sudoers 파일에 완전한 형태를 갖춘 호스트 이름 필요" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "올바르지 않은 암호를 입력했을 때 사용자 놀리기" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "tty를 보유한 사용자만 sudo 실행 허용" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "EDITOR 환경 변수 대신 visudo 사용" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "사용자 암호가 아닌 루트 암호 요구" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "사용자 암호가 아닌 runas_default 사용자 암호 요구" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "사용자 암호가 아닌 대상 사용자 암호 요구" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "대상 사용자 로그인 클래스가 있다면 기본값 적용" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME 및 USER 환경 변수 설정" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "실제 uid가 아닌 대상 사용자에게 유효한 uid 설정" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "대상 사용자의 그룹 벡터 초기화 안함" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "로그 파일 줄을 바꿀 줄의 한계 길이(0 값은 줄 바꿈 안함): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "인증 타임스탬프 제한 시간: %.1f분" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "암호 요구 제한시간: %.1f분" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "암호 입력 시도 횟수: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "사용자가 활용할 umask 또는 0777: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "로그 파일 경로: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "메일 프로그램 경로: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "메일 프로그램 플래그: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "메일을 보낼 주소: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "메일을 보내려는 주소: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "메일 메시지 제목 줄: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "올바르지 않은 암호 메시지: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "지침 상태 디렉터리 경로: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "인증 타임스탬프 디렉터리 경로: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "인증 타임스탬프 디렉터리 소유자: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "암호와 PATH 변수 요구를 하지 않을 이 그룹의 사용자: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "기본 암호 프롬프트: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "설정하면 모든 경우의 시스템 프롬프트 대신 이 암호 프롬프트를 사용합니다." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "명령을 실행할 기본 사용자: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "사용자의 $PATH를 대신할 값: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo에서 사용할 편집기 경로: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "'list' 유사 명령 실행시 암호가 필요할 때: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "'verify' 유사 명령 실행시 암호가 필요할 때: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "sudo_noexec 라이브러리에 있는 모조 exec 함수 미리 불러오기" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP 디렉터리가 동작 중이라면 로컬 sudoers 파일을 무시합니다" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "%d보다 큰 파일 서술자는 명령을 실행하기 전에 닫습니다" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "이 값을 설정하면 -C 옵션으로 `closefrom' 값을 대신 사용합니다" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "사용자가 환경 변수 값을 임의대로 설정할 수 있게 합니다" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "변수 기본 설정 값으로 환경 초기화" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "무결성 검사할 환경 변수:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "제거할 환경 변수:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "유지할 환경 변수:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "새 보안 컨텍스트에 사용할 SELinux 역할: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "새 보안 컨텍스트에 사용할 SELinux 형식: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo용 환경 파일 경로: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "sudo 전용 환경 파일 경로: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "sudoers 파일을 해석할 때 사용할 로캘: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "암호가 나타나더라도 sudo에서 암호 입력 요구 허용" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "사용자 입력이 있을 때 암호 프롬프트에서 시각 반응 처리" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "덜 정확하지만 파일 시스템에 접근하지 않는 빠른 비교 검사 사용" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers에 지정한 umask 값이 관대한 권한이라 하더라도 사용자의 umask 값으로 적용" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "실행 명령에 대한 사용자 입력 기록" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "실행 명령에 대한 출력 기록" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "zlib로 입출력 로그 압축" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "항상 명령을 유사 tty에서 실행" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "비 유닉스 그룹을 지원하는 플러그인: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "입출력 로그를 저장할 디렉터리: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "입출력 로그를 저장할 파일: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "pty를 할당할 때 utmp/utmpx 파일에 항목 추가" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "utmp의 사용자를 실제 실행 사용자가 아닌 대리 실행 사용자로 설정" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "권한 허용 설정: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "권한 제한 설정: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "백그라운드의 pty에서 명령을 실행합니다" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "사용할 PAM 서비스 이름: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "로그인 셸에서 사용할 PAM 서비스 이름: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "대상 사용자의 PAM 인증 처리 시도합니다" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "실행할 명령에 새 PAM 세션을 만듭니다" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "PAM 계정 검증 관리를 수행합니다" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "최대 입출력 로그 순차 번호: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "sudoers에 네트워크 그룹 지원 활성화" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "sudoedit로 파일을 편집할 때 상위 디렉터리 기록 가능 여부 확인" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "sudoedit로 파일을 편집할 때 심볼릭 링크 따라감" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "알 수 없는 시스템 그룹에 그룹 플러그인 요청" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "user, host, domain 전체 튜플을 기반으로 네트워크 그룹 비교" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "sudo에서 감시 로그를 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "sudo에서 입출력 로그를 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "sudo에서 로그 파일에 기록할 수 없을 경우에도 명령 실행 허용" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "sudoers의 그룹을 해석하고 그룹 이름이 아닌 ID와 비교" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "이 값보다 큰 로그 항목은 다수의 syslog 메시지로 나눕니다: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "입출력 로그 파일을 소유할 사용자: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "입출력 로그 파일을 소유할 그룹: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "입출력 로그 파일에 사용할 파일 모드: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "경로가 아닌 파일 서술자로 명령어 실행: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "경고를 출력하는 대신 sudoers에서 알 수 없는 기본 항목을 무시" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "명령 처리가 끝난 후의 초 단위 시간: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "사용자가 명령행에서 제한 시간을 지정하도록 허용" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "입출력 로그 데이터를 버퍼링하는 대신 즉시 디스크로 플러싱" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "syslog로 로깅할 때 프로세스 ID 포함" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "인증 타임스탬프 레코드 형식: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "인증 실패 메시지: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "사용자 이름 비교시 대소문자 무시" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "그룹 이름 비교시 대소문자 무시" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d 알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: 알 수 없는 \"%s\" 기본 항목" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d \"%s\"에 지정한 값이 없습니다" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: \"%s\"에 지정한 값이 없습니다" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d \"%s\" 값은 '/' 문자로 시작해야합니다" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: \"%s\" 값은 '/' 문자로 시작해야합니다" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d \"%s\" 옵션에 값이 없습니다" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: \"%s\" 옵션에 값이 없습니다" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d \"%4$s\" 옵션의 잘못된 기본 형식 0x%3$x" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s: \"%3$s\" 옵션의 잘못된 기본 형식 0x%2$x" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: \"%s\" 값은 \"%s\" 옵션에 맞지 않습니다" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp가 깨졌습니다. 길이가 일치하지 않습니다" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "환경 구성을 다시 갖출 수 없습니다" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "죄송하지만 다음 환경 변수를 설정하도록 허가받지 않았습니다: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s %d번째 줄에서 해석 오류" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "%s 해석 오류" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "%2$s에서 지원하지 않는 다이제스트 형식 %1$d" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: 읽기 오류" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s은(는) %d uid가 소유해야 합니다" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s은(는) 소유자만 쓸 수 있습니다" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s을(를) 불러올 수 없습니다: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "%s에서 \"group_plugin\" 심볼을 찾을 수 없습니다" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: 호환되지 않는 그룹 플러그인 주 버전 %d입니다. %d이(가) 필요합니다." + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "\"%s\" IP 주소를 해석할 수 없습니다" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "\"%s\" 네트워크 마스크 주소를 해석할 수 없습니다" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "로컬 IP 주소 및 넷마스크 쌍:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s이(가) 있지만 디렉터리가 아닙니다(0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "mkdir %s 명령을 실행할 수 없습니다" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "%s 모드를 0%o 값으로 바꿀 수 없습니다" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "잘못된 그룹: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "%s을(를) 읽을 수 없습니다" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "%s을(를) 만들 수 없습니다" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "입출력 로그에 기록할 수 없습니다: %s" + +#: plugins/sudoers/iolog.c:1071 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: 내부 오류. 이벤트 %d 번의 입출력 로그 파일을 열지 않았습니다" + +#: plugins/sudoers/iolog.c:1230 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: 내부 오류. 잘못된 시그널 %d번" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: 잘못된 로그 파일" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: 타임스탬프 필드가 빠졌습니다" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: %s 타임스탬프: %s" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: 사용자 필드가 빠졌습니다" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: 실행 사용자 필드가 빠졌습니다" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: 실행 그룹 필드가 빠졌습니다" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "ldaps를 사용할 때 starttls를 지원하지 않습니다" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "SSL 인증서 및 키 DB를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "SSL을 사용하려면 %s에서 TLS_CERT를 설정해야 합니다" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "LDAP를 초기화할 수 없습니다: %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls를 지정했지만 LDAP 라이브러리에서 ldap_start_tls_s() 또는 ldap_start_tls_s_np() 함수를 지원하지 않습니다" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "잘못된 sudoOrder 속성: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: 포트 값이 너무 큽니다" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "지원하지 않는 LDAP URI 형식: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "ldap 및 ldaps URI를 함께 사용할 수 없습니다" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "sudoOption을 변환할 수 없습니다: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "감시 시스템을 열 수 없습니다" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "감시 메시지를 보낼 수 없습니다" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (명령 계속 실행) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "로그 파일을 열 수 없습니다: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "로그 파일을 잠글 수 없습니다: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "로그 파일에 기록할 수 없습니다: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "사용자 또는 호스트 없음" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "검증 실패" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "사용자가 sudoers에 없습니다" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "사용자가 호스트에서 인증하지 않았습니다" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "명령을 허용하지 않았습니다" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s은(는) sudoers 설정 파일에 없습니다. 이 시도를 보고합니다.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s은(는) %s에서 sudo를 실행하도록 허가받지 않았습니다. 이 시도를 보고합니다.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "죄송하지만, %s 사용자는 %s에서 sudo를 실행하면 안됩니다.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "죄송하지만 %1$s 사용자는 '%2$s%3$s%4$s'을(를) %8$s의 %5$s%6$s%7$s(으)로 실행하도록 허가받지 않았습니다.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: 명령이 없습니다" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"'.'에 무시 중인 \"%1$s\" 요소가 있습니다.\n" +"\"%3$s\" 명령을 실행하려면, \"sudo ./%2$s\" 명령을 사용하십시오." + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "인증 실패" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "암호가 필요합니다" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "잘못된 암호 입력 시도 %u번" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "표준 입력을 복제할 수 없습니다: %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "%s을(를) 실행할 수 없습니다: %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "포킹할 수 없습니다: %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "파이프를 열 수 없습니다: %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s 다이제스트(%s)는 %s 형식이 아닙니다" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "%s의 상태를 가져올 수 없습니다" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 역할: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 항목:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " 실행 사용자: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " 실행 그룹: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " 옵션: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " 명령:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "%2$s에서 %1$s에 일치하는 기본 항목:\n" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s의 실행 권한 및 명령별 기본 값:\n" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "%s 사용자는 %s에서 다음 명령을 실행해야 합니다:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "%s 사용자는 %s에서 sudo를 실행하도록 허가받지 않았습니다.\n" + +#: plugins/sudoers/parse_ldif.c:147 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "잘못된 속성 값 무시: %s" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "미완결 sudoRole 무시: cn: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 프론트엔드의 %.*s 설정이 잘못되었습니다" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "네트워크 주소 목록을 해석할 수 없습니다" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "sudo 프론트엔드에서 사용자 이름을 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "sudo 프론트엔드에서 사용자 ID를 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "sudo 프론트엔드에서 그룹 ID를 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "sudo 프론트엔드에서 호스트 이름을 설정하지 않았습니다" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "%s을(를) 실행할 수 없습니다" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 정책 플러그인 버전 %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 파일 문법 버전 %d\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 경로: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 경로: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 경로: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 경로: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "%d 형식의 후크를 등록할 수 없습니다(버전 %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "%u uid를 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "%u uid를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "%s 사용자를 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "%s 사용자를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "%u gid를 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "%u gid를 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "%s 그룹을 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "%s 그룹을 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다. 이미 존재합니다." + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "%s 그룹 목록을 캐시에 적재할 수 없습니다. 메모리가 부족합니다." + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "%s 그룹을 해석할 수 없습니다" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "%s 그룹 ID를 해석할 수 없습니다" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "perm 스택 오버플로우" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "parm 스택 언더플로우" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "루트 gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "실행 gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "실행 그룹 벡터를 설정할 수 없습니다" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "실행 uid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "sudoers gid로 바꿀 수 없습니다" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "동작 중인 프로세스가 너무 많습니다" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "현재 작업 디렉터리를 가져올 수 없습니다" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "user_cmnd 감사 경로가 잘렸습니다: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "argv[0] 감사 경로가 잘렸습니다: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure 메시지가 너무 깁니다" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "SSS 소스를 초기화할 수 없습니다. 머신에 SSSD를 설치했습니까?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "%2$s에서 \"%1$s\" 심볼을 찾을 수 없습니다" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "기본 항목에 문제 발생" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "올바른 sudoers 설정 원본이 없습니다. 나갑니다." + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers에서 root가 sudo를 실행하지 못하게 지정했습니다" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "-C 옵션 사용을 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "타임스탬프 소유자(%s): 사용자 없음" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "tty 없음" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "죄송하지만 sudo를 실행하려면 tty를 확보해야합니다" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "현재 디렉터리의 명령" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "죄송하지만, 명령 처리 제한 시간을 설정할 수 없습니다" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "죄송하지만 이 환경 상태를 유지하도록 허가받지 않았습니다" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "명령이 너무 깁니다" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s은(는) 일반 파일이 아닙니다" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s은(는) %u uid가 소유했지만, %u uid가 소유해야합니다" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s에 모두가 기록할 수 있습니다" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s은(는) %u gid가 소유했지만, %u gid가 소유해야합니다" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "루트만 \"-c %s\" 옵션을 사용할 수 있습니다" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "알 수 없는 로그인 클래스: %s" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "%s 호스트를 해석할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "잘못된 필터 옵션: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "잘못된 최대 대기 시간 값: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "잘못된 속도 인수: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/타이밍: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/타이밍: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "sudo 세션 재현 중: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "큐에 이벤트를 추가할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "RAW 모드로 tty를 설정할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "경고: 터미널 화면이 로그를 올바르게 나타내기에 너무 작습니다.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "로그 화면 크기는 %d x %d 이지만, 터미널 화면 크기는 %d x %d 입니다." + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "재현에 끝났습니다. 터미널을 복원하려면 아무 키나 누르십시오." + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "잘못된 타이밍 파일 행: %s" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "모호한 식 \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "수식에 일치하지 않는 ')'" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "알 수 없는 검색어 \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s에 인자가 필요합니다" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "잘못된 정규 표현식: %s" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "\"%s\" 날짜를 해석할 수 없습니다" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "수식에 일치하지 않는 '('" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "잘못된 후위 연산자 \"or\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "잘못된 후위 문자 \"!\"" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "알 수 없는 검색 형식 %d" + +#: plugins/sudoers/sudoreplay.c:1607 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "사용법: %s [-hnRS] [-d <디렉터리>] [-m <숫자>] [-s <숫자>] \n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "사용법: %s [-h] [-d <디렉터리>] -l [<검색식>]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo 세션 로그를 보여줍니다\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"옵션:\n" +" -d, --directory=<디렉터리> 세션 로그 디렉터리를 지정합니다\n" +" -f, --filter=<필터> 화면에 나타낼 입출력 형식을 지정합니다\n" +" -h, --help 도움말 메시지를 나타낸 후 빠져나갑니다\n" +" -l, --list 유효한 세션 ID 및 추가 표현식을 목록으로 보여줍니다\n" +" -m, --max-wait=<숫자> 이벤트 처리간 초 단위 최대 대기 시간\n" +" -n, --non-interactive 프롬프트를 표시하지 않고 세션을 표준출력으로 보냅니다\n" +" -R, --no-resize 터미널 크기 조정 시도를 하지 않습니다\n" +" -S, -suspend-wait 명령 실행을 멈추는 동안 대기합니다\n" +" -s, --speed=<숫자> 출력 속도를 올리거나 내립니다\n" +" -V, --version 버전 정보를 나타낸 후 빠져나갑니다" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\t호스트가 일치하지 않습니다" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"명령 허용함" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"명령 거부함" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"명령이 일치하지 않음" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s은(는) 그룹이 기록할 수 있습니다" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "타임스탬프 파일을 %lld 바이트로 자를 수 없습니다" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "클록을 읽을 수 없습니다" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "미래 타임스탬프 값 무시" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "타임스탬프 값이 미래 값으로 너무 밀려있습니다: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "%s 타임스탬프 파일을 잠글 수 없습니다" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "지침 상태 경로가 너무 깁니다: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "-x 옵션은 추후 릴리스에서 제거 예정입니다" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "cvtsudoers 유틸리티를 대신 사용해보십시오" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "%s을(를) 편집하려면 return 키를 누르십시오:" + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "지정 편집기(%s)가 없습니다" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "편집기가 없습니다(편집기 경로 = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "쓰기 오류" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "임시 파일 상태를 가져올 수 없습니다(%s). %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "임시 파일 길이가 0입니다(%s). %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "편집기(%s) 실패. %s을(를) 바꾸지 않았습니다." + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s 바꾸지 않음" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "임시 파일(%s)을 다시 열 수 없습니다. %s을(를) 바꾸지 않았습니다." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "임시 파일(%s)을 해석할 수 없습니다. 알 수 없는 오류." + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "내부 오류. %s을(를) 목록에서 찾을 수 없습니다!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "%s의 uid/gid를 %u/%u 값으로 설정할 수 없습니다" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 및 %s은(는) 동일한 파일 시스템에 없습니다. mv 명령으로 이름을 바꿉니다" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "명령 실행 실패: '%s %s %s', %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "%s 이름 바꾸기 오류. %s을(를) 바꾸지 않았습니다" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "어떻게 하시겠습니까?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"사용할 수 있는 옵션:\n" +" sudoers 파일을 다시 편집합니다(E)\n" +" sudoers 파일을 바꾼 상태에서 저장하지 않고 나갑니다(X)\n" +" sudoers 파일을 바꾼 상태에서 저장하고 끝냅니다(Q)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "%s을(를) 실행할 수 없음" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: 잘못된 소유자 uid/gid를 %u/%u 값으로 설정해야 합니다\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: 잘못된 권한입니다. 0%o 모드 값을 설정해야 합니다\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: 해석 성공\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s을(를) 사용중입니다. 나중에 다시 시도하십시오" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "%s을(를) 잠글 수 없습니다" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "그래도 편집하시겠습니까? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "오류: %3$s \"%4$s\"의 %1$s:%2$d사이클" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "경고: %3$s \"%4$s\"의 %1$s:%2$d사이클" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "오류: %s: %d %s \"%s\"을(를) 참조했지만 정의하지 않았습니다" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "경고: %s: %d %s \"%s\"을(를) 참조했지만 정의하지 않았습니다" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "경고: %s:%d 사용하지 않는 %s \"%s\"이(가) 있습니다" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sudoers 파일을 안전하게 편집합니다\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"옵션:\n" +" -c, --check 확인 전용 모드\n" +" -f, --file=sudoers sudoers 파일 위치 지정\n" +" -h, --help 도움말 메시지를 나타낸 후 빠져나갑니다\n" +" -q, --quiet 자세한 문법 오류 메시지를 줄입니다(없앰)\n" +" -s, --strict 엄격한 문법 검사 시행\n" +" -V, --version 버전 정보를 나타낸 후 빠져나갑니다\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "포함 레벨이 너무 많습니다" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 역할: 알 수 없음\n" + +#~ msgid " Order: %s\n" +#~ msgstr " 순서: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 역할: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 역할: 알 수 없음\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "경고: %s의 사이클 `%s'" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "경고: %s `%s'을(를) 참조했지만 정의하지 않았습니다" diff --git a/utsudo-0.0.2/plugins/sudoers/po/lt.mo b/utsudo-0.0.2/plugins/sudoers/po/lt.mo new file mode 100644 index 0000000000000000000000000000000000000000..1d2e70d0eb21ffe1065124cdcf865746e8ba17b6 GIT binary patch literal 1994 zcma)+OK%)S5XUEAUPE|@OGLz>BD66Hp7qQ^kTvlp4v8&UiouFEfm`U^Y45gorhC=h zC71 zp~!P;bJBdEwB=bn{ErzS$@aKk&b6U+k@K?~P(z6wv`5qx8P&=eGCfu1c*7y>J2})T zPthq#W8I45ikVyPrf{lC?PNY5z?w{)9f2uw(tx(GjlWuqP zP1J$k>0ni>4c@WQauz*6RfLl1VTF?VT>VqsNy2-+oY9Iw@}tkou8CSIrJl8ebar+) z9M;{Ds1MC-8*}06m(e}GDV(k74zoO^Mw~RFxDhq3QIe$BKKnRs#Bq3+85^}UlO|_Y z>6C8eT~RP;k&+dryRb3-PLzh`i%RN1sIx<*g>Jz_Uhk;l25iZ0$+|phaaN>sSJ+<3 zq(HFqeN_w|=60d4myD?nuwM#1^AP z*-@F0-IV6q!iKAPsaYN^DP7?3$$=M5^ONgTJvKj*wIpsf6S{nv++%#HnIv?RVuCv4 z8_kBB@@nyX64Rqcl^!PID^N_J*tp`qRmpQMvdL4y3Pziwem1g#ofLjB>X|g-sqwyXVfNj)lfMED!*RrYw$nmyj2X=7IoT+tG&vk$^85n5M z&sk~IVFQr9CZ!&4+sPmMP2foDpar~0%a&STgOx!SpI7#6z)!U&zv1P0PqWFcDsURD z=#ycaLJHY0Mc}^H6U|^PX9LS7Pf<6M2FD}{?(hvZLy{qdR&A65d85, YEAR. +# Algimantas Margevičius , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.4rc1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2012-02-06 15:48-0500\n" +"PO-Revision-Date: 2012-02-25 11:56+0200\n" +"Last-Translator: Algimantas Margevičius \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: plugins/sudoers/alias.c:125 +#, c-format +msgid "Alias `%s' already defined" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:61 plugins/sudoers/bsm_audit.c:64 +#: plugins/sudoers/bsm_audit.c:113 plugins/sudoers/bsm_audit.c:117 +#: plugins/sudoers/bsm_audit.c:169 plugins/sudoers/bsm_audit.c:173 +msgid "getaudit: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:91 plugins/sudoers/bsm_audit.c:154 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:102 +msgid "getauid failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:104 plugins/sudoers/bsm_audit.c:163 +msgid "au_open: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:119 plugins/sudoers/bsm_audit.c:175 +msgid "au_to_subject: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:179 +msgid "au_to_exec_args: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:127 plugins/sudoers/bsm_audit.c:188 +msgid "au_to_return32: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:130 plugins/sudoers/bsm_audit.c:191 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:161 +msgid "getauid: failed" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:184 +msgid "au_to_text: failed" +msgstr "" + +#: plugins/sudoers/check.c:158 +#, c-format +msgid "sorry, a password is required to run %s" +msgstr "" + +#: plugins/sudoers/check.c:249 plugins/sudoers/iolog.c:172 +#: plugins/sudoers/sudoers.c:992 plugins/sudoers/sudoreplay.c:348 +#: plugins/sudoers/sudoreplay.c:357 plugins/sudoers/sudoreplay.c:703 +#: plugins/sudoers/sudoreplay.c:797 plugins/sudoers/visudo.c:790 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/check.c:253 plugins/sudoers/iolog.c:202 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/check.c:261 plugins/sudoers/check.c:506 +#: plugins/sudoers/check.c:556 plugins/sudoers/iolog.c:123 +#: plugins/sudoers/iolog.c:156 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/check.c:396 +#, c-format +msgid "internal error, expand_prompt() overflow" +msgstr "" + +#: plugins/sudoers/check.c:456 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/check.c:485 plugins/sudoers/check.c:529 +#: plugins/sudoers/iolog.c:158 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:488 plugins/sudoers/check.c:532 +#: plugins/sudoers/check.c:577 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "" + +#: plugins/sudoers/check.c:493 plugins/sudoers/check.c:537 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/check.c:501 plugins/sudoers/check.c:545 +#: plugins/sudoers/check.c:613 plugins/sudoers/sudoers.c:978 +#: plugins/sudoers/visudo.c:320 plugins/sudoers/visudo.c:582 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/check.c:571 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/check.c:583 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/check.c:637 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/check.c:684 +#, c-format +msgid "unable to remove %s (%s), will reset to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:692 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/check.c:752 plugins/sudoers/check.c:758 +#: plugins/sudoers/sudoers.c:829 plugins/sudoers/sudoers.c:833 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:755 plugins/sudoers/sudoers.c:770 +#: plugins/sudoers/sudoers.c:1108 plugins/sudoers/testsudoers.c:218 +#: plugins/sudoers/testsudoers.c:362 +#, c-format +msgid "unknown user: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in \"_PATH_SUDO_NOEXEC" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/defaults.c:208 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:216 plugins/sudoers/defaults.c:226 +#: plugins/sudoers/defaults.c:246 plugins/sudoers/defaults.c:259 +#: plugins/sudoers/defaults.c:272 plugins/sudoers/defaults.c:285 +#: plugins/sudoers/defaults.c:298 plugins/sudoers/defaults.c:318 +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:219 plugins/sudoers/defaults.c:229 +#: plugins/sudoers/defaults.c:237 plugins/sudoers/defaults.c:254 +#: plugins/sudoers/defaults.c:267 plugins/sudoers/defaults.c:280 +#: plugins/sudoers/defaults.c:293 plugins/sudoers/defaults.c:313 +#: plugins/sudoers/defaults.c:324 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:242 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:304 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:258 +#, c-format +msgid "internal error, sudo_setenv() overflow" +msgstr "" + +#: plugins/sudoers/env.c:291 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:710 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/find_path.c:69 plugins/sudoers/find_path.c:108 +#: plugins/sudoers/find_path.c:123 plugins/sudoers/iolog.c:125 +#: plugins/sudoers/sudoers.c:923 toke.l:668 toke.l:823 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: gram.y:110 +#, c-format +msgid ">>> %s: %s near line %d <<<" +msgstr "" + +#: plugins/sudoers/group_plugin.c:91 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s turi priklausyti uid %d" + +#: plugins/sudoers/group_plugin.c:107 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s turi būti įrašomas tik savininkui" + +#: plugins/sudoers/group_plugin.c:114 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:119 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:124 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:112 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:179 plugins/sudoers/sudoers.c:999 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:182 +#, c-format +msgid "invalid sequence number %s" +msgstr "" + +#: plugins/sudoers/iolog.c:231 plugins/sudoers/iolog.c:234 +#: plugins/sudoers/iolog.c:499 plugins/sudoers/iolog.c:504 +#: plugins/sudoers/iolog.c:510 plugins/sudoers/iolog.c:518 +#: plugins/sudoers/iolog.c:526 plugins/sudoers/iolog.c:534 +#: plugins/sudoers/iolog.c:542 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/iolog_path.c:256 plugins/sudoers/sudoers.c:362 +#, c-format +msgid "unable to set locale to \"%s\", using \"C\"" +msgstr "" + +#: plugins/sudoers/ldap.c:374 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:397 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:427 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:456 +#, c-format +msgid "invalid uri: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:462 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:466 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:485 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:550 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:958 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:964 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:972 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1185 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1705 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1707 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1754 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1762 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2161 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2192 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2428 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:82 +#, c-format +msgid "internal error, linux_audit_command() overflow" +msgstr "" + +#: plugins/sudoers/linux_audit.c:91 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:198 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:201 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:270 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nėra „sudoers“ faile. Apie šį įvykį bus pranešta.\n" + +#: plugins/sudoers/logging.c:273 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s neleidžiama vykdyti „sudo“ kompiuteryje %s. Apie šį įvykį bus pranešta.\n" + +#: plugins/sudoers/logging.c:277 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Deja, naudotojas %s negali vykdyti „sudo“ kompiuteryje %s.\n" + +#: plugins/sudoers/logging.c:280 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Deja, naudotojui %s neleidžiama vykdyti „%s%s%s“ kaip %s%s%s kompiuteryje %s.\n" + +#: plugins/sudoers/logging.c:420 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:427 plugins/sudoers/logging.c:489 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:479 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:504 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:540 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/parse.c:123 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:126 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:389 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:391 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:406 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:415 +#, c-format +msgid "" +" Commands:\n" +"\t" +msgstr "" + +#: plugins/sudoers/plugin_error.c:100 plugins/sudoers/plugin_error.c:105 +msgid ": " +msgstr ": " + +#: plugins/sudoers/pwutil.c:260 +#, c-format +msgid "unable to cache uid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:268 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:305 plugins/sudoers/pwutil.c:314 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:655 +#, c-format +msgid "unable to cache gid %u (%s), already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:663 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:693 plugins/sudoers/pwutil.c:702 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/set_perms.c:114 plugins/sudoers/set_perms.c:365 +#: plugins/sudoers/set_perms.c:601 plugins/sudoers/set_perms.c:837 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:373 +#: plugins/sudoers/set_perms.c:609 plugins/sudoers/set_perms.c:845 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:228 plugins/sudoers/set_perms.c:466 +#: plugins/sudoers/set_perms.c:706 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:236 plugins/sudoers/set_perms.c:473 +#: plugins/sudoers/set_perms.c:713 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:250 plugins/sudoers/set_perms.c:486 +#: plugins/sudoers/set_perms.c:726 +#, c-format +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:291 plugins/sudoers/set_perms.c:524 +#: plugins/sudoers/set_perms.c:764 plugins/sudoers/set_perms.c:906 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/set_perms.c:970 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:243 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:256 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:269 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:279 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Naudotojui %s neleidžiama vykdyti „sudo“ kompiuteryje %s.\n" + +#: plugins/sudoers/sudoers.c:201 plugins/sudoers/sudoers.c:232 +#: plugins/sudoers/sudoers.c:931 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:257 +#, c-format +msgid "unable to execute %s: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:311 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:318 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:408 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:424 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:425 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:464 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/sudoers.c:478 plugins/sudoers/sudoers.c:499 +#: plugins/sudoers/sudoers.c:500 plugins/sudoers/sudoers.c:1509 +#: plugins/sudoers/sudoers.c:1510 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/sudoers.c:480 plugins/sudoers/sudoers.c:496 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/sudoers.c:485 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/sudoers.c:495 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:507 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:657 plugins/sudoers/sudoers.c:664 +#, c-format +msgid "internal error, runas_groups overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:914 +#, c-format +msgid "internal error, set_cmnd() overflow" +msgstr "" + +#: plugins/sudoers/sudoers.c:957 +#, c-format +msgid "fixed mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:961 +#, c-format +msgid "set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:964 +#, c-format +msgid "unable to set group on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:967 +#, c-format +msgid "unable to fix mode on %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:980 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:982 +#, c-format +msgid "%s is mode 0%o, should be 0%o" +msgstr "" + +#: plugins/sudoers/sudoers.c:986 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s priklauso uid %u, nors turėtų %u" + +#: plugins/sudoers/sudoers.c:989 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s priklauso gid %u, nors turėtų %u" + +#: plugins/sudoers/sudoers.c:1038 +#, c-format +msgid "only root can use `-c %s'" +msgstr "„-c %s“ gali naudoti tik „root“ naudotojas" + +#: plugins/sudoers/sudoers.c:1049 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1077 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1129 plugins/sudoers/testsudoers.c:380 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1178 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1180 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1184 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1187 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1189 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:1190 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:299 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:308 plugins/sudoers/visudo.c:187 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:333 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:364 +#, c-format +msgid "invalid log file %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:366 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:392 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:406 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:448 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:480 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:529 plugins/sudoers/sudoreplay.c:554 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:571 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:582 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:588 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:602 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:606 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:612 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:625 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:627 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:629 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:851 +#, c-format +msgid "invalid regex: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:976 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:979 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:988 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:990 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:246 +#, c-format +msgid "internal error, init_vars() overflow" +msgstr "" + +#: plugins/sudoers/testsudoers.c:331 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:334 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:335 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:335 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: toke.l:672 toke.l:802 toke.l:827 toke.l:923 plugins/sudoers/toke_util.c:113 +#: plugins/sudoers/toke_util.c:167 plugins/sudoers/toke_util.c:207 +msgid "unable to allocate memory" +msgstr "" + +#: toke.l:795 +msgid "too many levels of includes" +msgstr "" + +#: plugins/sudoers/toke_util.c:218 +msgid "fill_args: buffer overflow" +msgstr "" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:221 plugins/sudoers/auth/rfc1938.c:104 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/visudo.c:253 plugins/sudoers/visudo.c:539 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:336 plugins/sudoers/visudo.c:342 +#, c-format +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:424 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:429 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:435 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:458 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:484 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:494 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:532 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:584 plugins/sudoers/visudo.c:593 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:588 plugins/sudoers/visudo.c:598 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:615 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:629 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:639 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:702 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:716 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/visudo.c:764 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:796 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:808 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:811 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:814 plugins/sudoers/visudo.c:816 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:826 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:833 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:880 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:924 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:947 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:1089 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1090 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1093 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1094 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1229 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1286 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1288 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:78 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:84 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:92 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:101 +msgid "unable to setup authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:60 +#, c-format +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:65 +#, c-format +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:71 plugins/sudoers/auth/fwtk.c:95 +#: plugins/sudoers/auth/fwtk.c:128 +#, c-format +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:75 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:117 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:160 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:218 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:234 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:251 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:331 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:100 +msgid "unable to initialize PAM" +msgstr "" + +#: plugins/sudoers/auth/pam.c:144 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:148 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:155 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:159 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:163 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:178 +#, c-format +msgid "pam_authenticate: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:306 +msgid "Password: " +msgstr "Slaptažodis: " + +#: plugins/sudoers/auth/pam.c:307 +msgid "Password:" +msgstr "Slaptažodis:" + +#: plugins/sudoers/auth/securid5.c:81 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:107 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:171 +#, c-format +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:176 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:128 +#, c-format +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:132 plugins/sudoers/auth/securid5.c:215 +#, c-format +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:166 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:109 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:117 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:199 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:271 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/auth/sudo_auth.c:374 +msgid "Authentication methods:" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/nb.mo b/utsudo-0.0.2/plugins/sudoers/po/nb.mo new file mode 100644 index 0000000000000000000000000000000000000000..6392cd15d013bf499263d079cef9addd43701a5b GIT binary patch literal 48881 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Ν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 M5w{YW=_g_SKkF, 2011-2013. +# Åka Sikrom , 2014-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 10:39-0600\n" +"PO-Revision-Date: 2019-07-21 11:18+0200\n" +"Last-Translator: Åka Sikrom \n" +"Language-Team: Norwegian Bokmaal \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaksfeil" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "passord for %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] passord for %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Passord:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SIKKERHETSinformasjon om %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Feil. Prøv igjen." + +#: gram.y:194 gram.y:242 gram.y:249 gram.y:256 gram.y:263 gram.y:270 +#: gram.y:286 gram.y:310 gram.y:317 gram.y:324 gram.y:331 gram.y:338 +#: gram.y:401 gram.y:409 gram.y:419 gram.y:452 gram.y:459 gram.y:466 +#: gram.y:473 gram.y:555 gram.y:562 gram.y:571 gram.y:580 gram.y:597 +#: gram.y:709 gram.y:716 gram.y:723 gram.y:731 gram.y:831 gram.y:838 +#: gram.y:845 gram.y:852 gram.y:859 gram.y:885 gram.y:892 gram.y:899 +#: gram.y:1022 gram.y:1296 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:664 plugins/sudoers/defaults.c:957 +#: plugins/sudoers/defaults.c:1128 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:85 plugins/sudoers/iolog_util.c:124 +#: plugins/sudoers/iolog_util.c:133 plugins/sudoers/iolog_util.c:143 +#: plugins/sudoers/iolog_util.c:151 plugins/sudoers/iolog_util.c:155 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1235 plugins/sudoers/ldap.c:1662 +#: plugins/sudoers/ldap.c:1699 plugins/sudoers/ldap.c:1780 +#: plugins/sudoers/ldap.c:1915 plugins/sudoers/ldap.c:2016 +#: plugins/sudoers/ldap.c:2032 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:445 +#: plugins/sudoers/ldap_conf.c:460 plugins/sudoers/ldap_conf.c:557 +#: plugins/sudoers/ldap_conf.c:590 plugins/sudoers/ldap_conf.c:682 +#: plugins/sudoers/ldap_conf.c:764 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:566 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:519 +#: plugins/sudoers/logging.c:545 plugins/sudoers/logging.c:586 +#: plugins/sudoers/logging.c:727 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:143 +#: plugins/sudoers/parse_ldif.c:170 plugins/sudoers/parse_ldif.c:239 +#: plugins/sudoers/parse_ldif.c:246 plugins/sudoers/parse_ldif.c:251 +#: plugins/sudoers/parse_ldif.c:327 plugins/sudoers/parse_ldif.c:338 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:369 +#: plugins/sudoers/parse_ldif.c:381 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:399 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:596 plugins/sudoers/parse_ldif.c:621 +#: plugins/sudoers/parse_ldif.c:681 plugins/sudoers/parse_ldif.c:700 +#: plugins/sudoers/parse_ldif.c:746 plugins/sudoers/parse_ldif.c:756 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:746 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:272 plugins/sudoers/pwutil.c:350 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:590 +#: plugins/sudoers/pwutil.c:661 plugins/sudoers/pwutil.c:820 +#: plugins/sudoers/pwutil.c:878 plugins/sudoers/pwutil.c:923 +#: plugins/sudoers/pwutil.c:982 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "klarte ikke å tildele minne" + +#: gram.y:484 +msgid "a digest requires a path name" +msgstr "kontrollsummering krever at du velger et stinavn" + +#: gram.y:610 +msgid "invalid notbefore value" +msgstr "ugyldig «notbefore»-verdi" + +#: gram.y:618 +msgid "invalid notafter value" +msgstr "ugyldig «notafter»-verdi" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "for langt tidsavbrudd" + +#: gram.y:629 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "ugyldig tidsavbrudd" + +#: gram.y:1296 plugins/sudoers/auth/pam.c:468 plugins/sudoers/auth/pam.c:656 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:664 +#: plugins/sudoers/defaults.c:957 plugins/sudoers/defaults.c:1128 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:941 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:85 +#: plugins/sudoers/iolog_util.c:124 plugins/sudoers/iolog_util.c:133 +#: plugins/sudoers/iolog_util.c:143 plugins/sudoers/iolog_util.c:151 +#: plugins/sudoers/iolog_util.c:155 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1235 +#: plugins/sudoers/ldap.c:1662 plugins/sudoers/ldap.c:1699 +#: plugins/sudoers/ldap.c:1780 plugins/sudoers/ldap.c:1915 +#: plugins/sudoers/ldap.c:2016 plugins/sudoers/ldap.c:2032 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:445 plugins/sudoers/ldap_conf.c:460 +#: plugins/sudoers/ldap_conf.c:557 plugins/sudoers/ldap_conf.c:590 +#: plugins/sudoers/ldap_conf.c:681 plugins/sudoers/ldap_conf.c:764 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:566 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:519 plugins/sudoers/logging.c:545 +#: plugins/sudoers/logging.c:585 plugins/sudoers/logging.c:1087 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:482 +#: plugins/sudoers/match_digest.c:67 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:142 +#: plugins/sudoers/parse_ldif.c:169 plugins/sudoers/parse_ldif.c:238 +#: plugins/sudoers/parse_ldif.c:245 plugins/sudoers/parse_ldif.c:250 +#: plugins/sudoers/parse_ldif.c:326 plugins/sudoers/parse_ldif.c:337 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:368 +#: plugins/sudoers/parse_ldif.c:380 plugins/sudoers/parse_ldif.c:384 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:566 +#: plugins/sudoers/parse_ldif.c:595 plugins/sudoers/parse_ldif.c:620 +#: plugins/sudoers/parse_ldif.c:680 plugins/sudoers/parse_ldif.c:699 +#: plugins/sudoers/parse_ldif.c:745 plugins/sudoers/parse_ldif.c:755 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:746 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:272 +#: plugins/sudoers/pwutil.c:350 plugins/sudoers/pwutil.c:524 +#: plugins/sudoers/pwutil.c:590 plugins/sudoers/pwutil.c:661 +#: plugins/sudoers/pwutil.c:820 plugins/sudoers/pwutil.c:878 +#: plugins/sudoers/pwutil.c:923 plugins/sudoers/pwutil.c:982 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:745 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:271 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:290 +#: plugins/sudoers/sudoers.c:332 plugins/sudoers/sudoers.c:655 +#: plugins/sudoers/sudoers.c:781 plugins/sudoers/sudoers.c:825 +#: plugins/sudoers/sudoers.c:1119 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:581 plugins/sudoers/sudoreplay.c:584 +#: plugins/sudoers/sudoreplay.c:1261 plugins/sudoers/sudoreplay.c:1461 +#: plugins/sudoers/sudoreplay.c:1465 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias «%s» er allerede definert" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:788 +msgid "unable to fork" +msgstr "klarte ikke å kopiere prosess" + +#: plugins/sudoers/auth/aix_auth.c:281 +#, c-format +msgid "unable to change password for %s" +msgstr "klarte ikke å endre passord for %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "klarte ikke å hente innloggingsklasse for brukeren %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "klarte ikke å starte bsd-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "ugyldig autentiseringstype" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "klarte ikke å starte opp BSD-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "kontoen din er utgått" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "godkjenning mislyktes" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "klarte ikke å lese fwtk-innstillinger" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "klarte ikke å koble til autentiseringstjener" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "tilkobling til autentiseringstjener ble brutt" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"det oppstod en feil med autentiseringstjener:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: klarte ikke å konvertere fullmaktsgiver til streng («%s»). %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: klarte ikke å tolke «%s». %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: klarte ikke å slå opp i akkreditiv-hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: klarte ikke å tildele innstillinger. %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: klarte ikke å hente akkreditiver. %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: klarte ikke å starte opp akkreditiv-hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: klarte ikke å lagre akkreditiv i hurtiglager. %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: klarte ikke å hente vertens fullmaktsgiver. %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Klarte ikke å bekrefte TGT! Dette kan være et tegn på at du er under angrep! %s" + +#: plugins/sudoers/auth/pam.c:200 +msgid "unable to initialize PAM" +msgstr "klarte ikke å starte opp PAM" + +#: plugins/sudoers/auth/pam.c:299 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Feil ved PAM-autentisering. %s" + +#: plugins/sudoers/auth/pam.c:318 +msgid "account validation failure, is your account locked?" +msgstr "det oppstod en feil ved validering av brukerkonto. Er kontoen din sperret?" + +#: plugins/sudoers/auth/pam.c:329 +msgid "Account or password is expired, reset your password and try again" +msgstr "Kontoen eller passordet er utgått. Tilbakestill passordet ditt og prøv igjen" + +#: plugins/sudoers/auth/pam.c:337 +#, c-format +msgid "unable to change expired password: %s" +msgstr "klarte ikke å endre et utgått passord. %s" + +#: plugins/sudoers/auth/pam.c:348 +msgid "Password expired, contact your system administrator" +msgstr "Passordet er utgått. Kontakt systemadministratoren" + +#: plugins/sudoers/auth/pam.c:353 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Kontoen er utgått, eller PAM-innstillingene mangler en «account»-del for sudo. Kontakt systemadministratoren" + +#: plugins/sudoers/auth/pam.c:361 plugins/sudoers/auth/pam.c:367 +#, c-format +msgid "PAM account management error: %s" +msgstr "Feil med PAM-kontohåndtering: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du finnes ikke i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "klarte ikke å starte opp ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "klarte ikke å kontakte SecurID-tjener" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Bruker-ID-en er sperret fra SecurID-autentisering" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "lengden på brukernavnet er ugyldig for SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "ugyldig autentiseringshåndtak for SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "Det oppstod en feil under kommunikasjon med SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "ukjent SecurID-feil" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "kodelengden er ugyldig for SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "kalrte ikke å starte opp SIA-økt" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "ugyldige autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Din installasjon av sudo har ugyldige autentiseringsmetoder! Du kan ikke blande selvgående og tjeneravhengige autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "fant ingen autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Din installasjon av sudo har ingen autentiseringsmetoder tilgjengelig! Bruk valget «--disable-authentication» hvis du vil skru av autentisering." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Klarte ikke å starte opp autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Autentiseringsmetoder:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Klarte ikke å finne revisjonsstatus" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "klarte ikke å kjøre revisjonsoppføring" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi går ut i fra at systemadministrator har gitt deg en\n" +"typisk moralpreken om det du gjør. Det koker som regel ned til tre ting:\n" +"\n" +" #1) Ha respekt for andres privatliv og personvern.\n" +" #2) Tenk før du skriver.\n" +" #3) Makt medfører plikt og ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:698 plugins/sudoers/sudoers.c:743 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid-en «%u» er ukjent" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:917 plugins/sudoers/sudoers.c:1158 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "brukeren %s er ukjent" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "økning: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "begynnende rekkefølge: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "sorteringsutfylling: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versjon %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s gramatikkversjon %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "inndata-format %s støttes ikke" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "utdata-format %s støttes ikke" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: inndata- og utdatafiler må være ulike" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:174 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "klarte ikke å laste inn standardverdier for sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:435 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nøkkelord %s er ukjent" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "%s er en ukjent forvalgtype" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "%s er en ukjent utelatelsestype" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "%s er et ugyldig filter" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:74 plugins/sudoers/sudoers.c:909 +#: plugins/sudoers/sudoreplay.c:335 plugins/sudoers/sudoreplay.c:1427 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "klarte ikke å åpne %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "klarte ikke å tolke %s. Ukjent feil" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "tolkefeil i %s ved linje %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "tolkefeil i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1131 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "klarte ikke å skrive til %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konverter mellom «sudoers»-filformater\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valg:\n" +" -b, --base=dn base-domenenavn for sudo LDAP-forespørsler\n" +" -c, --config=fil sti til oppsettsfil\n" +" -d, --defaults=deftypes bare konverter standardverdier av valgte typer\n" +" -e, --expand-aliases utvid aliaser ved konvertering\n" +" -f, --output-format=format velg utdata-format («JSON», «LDIF» eller «sudoers»)\n" +" -i, --input-format=format velg inndata-format («LDIF» eller «sudoers»)\n" +" -I, --increment=tall mengde som hver sudoOrder skal økes med\n" +" -h, --help vis hjelpetekst og avslutt\n" +" -m, --match=filter bare konverter oppføringer som samsvarer med valgt filter\n" +" -M, --match-local filtrer på passwd- og group-databaser\n" +" -o, --output=utdatafile lagre konvertert sudoers i valgt utdatafil\n" +" -O, --order-start=num startpunkt for første sudoOrder\n" +" -p, --prune-matches fjern brukere, grupper og vertsnavn som ikke samsvarer\n" +" -P, --padding=num grunnutfylling for sudoOrder-økning\n" +" -s, --suppress=områder fjern utdata for valgte områder\n" +" -V, --version vis versjonsinfo og avslutt" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "forvalg «%s» er ukjent" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "klarte ikke å hente GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "klarte ikke å formatere tidsstempel" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1054 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1092 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:847 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern feil: %s er full" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers inneholder for mange linjer. Maksgrense er %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljøvariabel «SUDOERS_BASE» er tom, og «-b» er ikke valgt." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-plassering, hvis syslog brukes til loggføring: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet når brukeren har autentisert seg: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet når brukeren ikke har klart å autentisere seg: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Legg OTP-ledetekst på egen linje" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorer «.» i $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Send alltid e-post når noen kjører sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Send e-post hvis en bruker mislykkes i å autentisere seg" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Send e-post hvis bruker ikke finnes i sudoers-fil" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Send e-post hvis brukeren ikke finnes i sudoers-fil for denne verten" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Send e-post hvis brukeren ikke har lov til å kjøre en kommando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Send e-post hvis brukeren prøver å kjøre en kommando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Bruk separat tidsstempel for hver kombinasjon av bruker og tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Gi brukere en moralpreken første gang de kjører sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil som inneholder sudo-moralpreken: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Krev at brukere skal autentisere seg som standard" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Rotbruker kan kjøre sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ta med vertsnavn i loggfil (ikke syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Ta med år i loggfil (ikke syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Start et skall hvis sudo kjøres uten argumenter" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Velg målbrukers $HOME når et skall startes med «-s»" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Bruk alltid målbrukers hjemmemappe som $HOME" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillat informasjonsinnhenting for å gjøre feilmeldingene nyttige" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Krev fullstendige vertsnavn i sudoers-fil" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Send brukere en fornærmelsestekst når de oppgir feil passord" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Bare tillat brukere å kjøre sudo hvis de bruker en tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo tar hensyn til miljøvariabelen EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Spør etter rotbrukers passord, i stedet for eget passord" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Spør etter passord for «runas_default» i stedet for eget passord" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Spør etter målbrukers passord, i stedet for eget passord" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Bruk standardverdier i målbrukers innloggingsklasse, hvis den finnes" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Gi verdier til miljøvariablene «LOGNAME» og «USER»" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Velg målbrukers uid som effektiv uid, i stedet for faktisk uid" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ikke last inn målbrukers gruppevektor" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Hvilken lengde linjer i loggfiler skal pakkes ned til (bruk 0 for å deaktivere pakking): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsavbrudd for autentiseringstidsstempel: %.1f minutter" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsavbrudd for passordetterspørsel: %.1f minutter" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antall forsøk på å skrive inn passord: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "U-maske som skal brukes, eller 0777 for å bruke egen maske: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Sti til loggfil: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Sti til e-postprogram: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Valg for e-postprogram: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Hvilken adresse det skal sendes e-post til: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Hvilken adresse e-posten skal sendes fra: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Emnelinje i e-postmeldinger: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Melding om feil passord: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sti til mappe for moralpreken-status: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sti til mappe for autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Eieren av mappa for autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Brukerne i denne gruppa fritas fra passord- og PATH-krav: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard passord-ledetekst: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Hvis dette er valgt, blir system-ledetekst alltid overstyrt av passord-ledetekst." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardbruker for kjøring av kommandoer: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Verdi som overstyrer brukerspesifikk $PATH: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Filsti til tekstbehandler som visudo skal bruke: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Når pseudokommandoen «list» skal kreve passord: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Når pseudokommandoen «verify» skal kreve passord: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Last inn prøvekjøringsfunksjonene som ligger i biblioteket «sudo_noexec»" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Om lokal sudoers-fil skal ignoreres når en LDAP er aktiv" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Fildeskriptorne >= %d lukkes før en kommando blir kjørt" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Hvis dette er valgt, har brukerne mulighet til å overstyre «closefrom»-verdien med valget «-C»" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Tillat brukere å velge arbitrære miljøvariabler" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Tilbakestill brukermiljøet til et sett med standardvariabler" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Miljøvariabler som skal kontrolleres:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Miljøvariabler som skal fjernes:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Miljøvariabler som skal beholdes:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-rolle som skal brukes i ny sikkerhetskontekst: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-type som skal brukes i ny sikkerhetskontekst: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sti til sudo-spesifikk miljøfil: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sti til sudo-spesifikk miljøfil: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Regioninnstilling som skal brukes når «sudoers» tolkes: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillat sudo å spørre etter et passord som - hvis skrevet inn - blir synlig på skjermen" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Gi visuell respons når brukere skriver inn passord" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Bruk raskere joker-søking som er mindre presis (og som ikke søker i filsystemet)" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "U-masker som er valgt i sudoers overstyrer brukermasker, selv hvis sudoers åpner for mer tilgang enn brukermaska" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Loggfør bruker-inndata i kommandoen som kjøres" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Loggfør utskrift fra kommandoen som kjøres" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimer inn- og utdatalogger ved bruk av «zlib»" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Kjør alltid kommandoer i en pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Støttetillegg for grupper som ikke er Unix-grupper: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mappe hvor inn- og utdatalogger skal lagres: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil hvor inn- og utdatalogger skal lagres: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Legg til en oppføring i utmp-/utmpx-fil ved tildeling av pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Kjør kommandoer som utmp-bruker, i stedet for brukeren som skriver inn kommando" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Tillatte privilegier: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Begrensningsprivilegier: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Kjør kommandoer på en pty i bakgrunnen" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjenestenavn som skal brukes: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjenestenavn som skal brukes til innloggingsskall: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Prøv å sette opp PAM-akkreditiver for målbruker" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Lag en ny PAM-økt som kommandoen kjøres i" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Håndter validering av PAM-kontoer" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Høyeste tillatte sekvensnummer i inn-/utdatalogg: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Slå på støtte for sudoers-nettgruppe" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontroller skrivetillatelse til foreldermapper ved redigering av filer med sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Følg symbolske lenker ved redigering av filer med sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Spør gruppetillegget om ukjente systemgrupper" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Kontroller nettgrupper basert på både bruker, vert og domene" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til revisjonslogg" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til I/O-logg" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillat kjøring av kommandoer selv om sudo ikke klarer å skrive til loggfil" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Slå opp grupper i sudoers på gruppe-ID i stedet for gruppenavn" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Loggoppføringer som er større enn dette blir delt opp i flere syslog-meldinger: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Bruker som skal eie I/O-loggfiler: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Gruppe som skal eie I/O-loggfiler: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filmodus for I/O-loggfiler: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Kjør kommandoer med fildeskriptor i stedet for sti: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorer ukjente standardverdier i sudoers i stedet for å vise advarsel" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "TIdsavbrudd for kommando: %u sekunder" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "La bruker velge tidsavbrudd via kommandolinje" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Tøm inn- og utdata direkte til disk i stedet for å mellomlagre" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Ta med prosess-ID ved bruk av syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Type autentiseringstidsstempel: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Feilmelding ved autentisering: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorer små/store bokstaver i brukernavn" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorer små/store bokstaver i gruppenavn" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s: %d «%s» er en ukjent standardoppføring" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: «%s» er en ukjent standardoppføring" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s: %d «%s» har ingen verdi" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: «%s» har ingen verdi" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d verdier av «%s» må begynne med «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: verdier av «%s» må begynne med «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d «%s» kan ikke ha en verdi" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: «%s» kan ikke ha en verdi" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d Defaults-type 0x%x for valget «%s» er ugyldig" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Defaults-type 0x%x for valget «%s» er ugyldig" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d «%s» er en ugyldig verdi for valget «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: verdien «%s» er ugyldig valget «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp er korrupt (lengde samsvarer ikke)" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "klarte ikke å bygge opp miljøet på nytt" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "du har ikke tillatelse til å bestemme følgende miljøvariabler: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "tolkningsfeil i %s ved linje %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "tolkningsfeil i %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "behandlingstype %d for %s støttes ikke" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: lesefeil" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s må eies av uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s kan ikke gi skrivetillatelse til andre enn eieren" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:563 +#, c-format +msgid "unable to load %s: %s" +msgstr "klarte ikke å laste inn %s. %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "fant ikke symbolet «group_plugin» i %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versjon %d av gruppetillegget passer ikke (forventet versjon %d)" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "klarte ikke å tolke IP-adresse «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "klarte ikke å tolke nettverksmaske «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokale par av IP-adresser og nettverksmasker:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s finnes, men er ikke en mappe (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "klarte ikke å utføre mkdir %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "klarte ikke å endre %s modus til 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1189 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "%s er en ukjent gruppe" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:913 +#: plugins/sudoers/sudoreplay.c:842 plugins/sudoers/sudoreplay.c:1538 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "klarte ikke å lese %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:799 +#, c-format +msgid "unable to create %s" +msgstr "klarte ikke å opprette %s" + +#: plugins/sudoers/iolog.c:822 plugins/sudoers/iolog.c:1037 +#: plugins/sudoers/iolog.c:1113 plugins/sudoers/iolog.c:1207 +#: plugins/sudoers/iolog.c:1267 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "klarte ikke å skrive til I/O-loggfil: %s" + +#: plugins/sudoers/iolog.c:1071 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: intern feil. Inn-/ut-loggfil for hendelse %d er ikke åpen" + +#: plugins/sudoers/iolog.c:1230 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: intern feil. Signal %d er ugyldig" + +#: plugins/sudoers/iolog_util.c:89 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ugyldig loggfil" + +#: plugins/sudoers/iolog_util.c:107 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tidsstempel-felt mangler" + +#: plugins/sudoers/iolog_util.c:113 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tidsstempel %s: %s" + +#: plugins/sudoers/iolog_util.c:120 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: brukerfelt mangler" + +#: plugins/sudoers/iolog_util.c:129 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: «kjør som bruker»-felt mangler" + +#: plugins/sudoers/iolog_util.c:138 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: «kjør som gruppe»-felt mangler" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls støttes ikke når du bruker ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "klarte ikke å starte opp database for SSL-sertifikater og -nøkler. %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du må velge TLS_CERT i %s for å bruke SSL" + +#: plugins/sudoers/ldap.c:1614 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "klarte ikke å starte opp LDAP. %s" + +#: plugins/sudoers/ldap.c:1650 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls er valgt, men LDAP-bibliotekene støtter hverken «ldap_start_tls_s()» eller «ldap_start_tls_s_np()»" + +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/parse_ldif.c:737 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "«%s» er en ugyldig sudoOrder-attributt" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: portnummeret er for stort" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-ens adressetype %s støttes ikke" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "du kan ikke blande ldap- og ldaps-nettadresser" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "klarte ikke å konvertere sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "klarte ikke å åpne revisjonssystemet" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "klarte ikke å sende revisjonsmelding" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kommando fortsetter) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "klarte ikke å åpne loggfil: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "klarte ikke å låse loggfil: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "klarte ikke å skrive loggfil: %s" + +#: plugins/sudoers/logging.c:247 +msgid "No user or host" +msgstr "Ingen bruker eller vert" + +#: plugins/sudoers/logging.c:249 +msgid "validation failure" +msgstr "feil ved gyldighetssjekk" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT in sudoers" +msgstr "brukeren er IKKE i sudoers" + +#: plugins/sudoers/logging.c:258 +msgid "user NOT authorized on host" +msgstr "brukeren er IKKE autorisert på verten" + +#: plugins/sudoers/logging.c:260 +msgid "command not allowed" +msgstr "denne kommandoen tillates ikke" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s finnes ikke i sudoers-fil. Denne hendelsen blir rapportert.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s has ikke tillatelse til å kjøre sudo på %s. Denne hendelsen blir rapportert.\n" + +#: plugins/sudoers/logging.c:302 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Brukeren %s kan ikke kjøre sudo på %s.\n" + +#: plugins/sudoers/logging.c:305 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Brukeren %s har ikke tillatelse til å kjøre «%s%s%s» som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:342 plugins/sudoers/sudoers.c:440 +#: plugins/sudoers/sudoers.c:442 plugins/sudoers/sudoers.c:444 +#: plugins/sudoers/sudoers.c:446 plugins/sudoers/sudoers.c:601 +#: plugins/sudoers/sudoers.c:603 +#, c-format +msgid "%s: command not found" +msgstr "%s: fant ikke kommando" + +#: plugins/sudoers/logging.c:344 plugins/sudoers/sudoers.c:436 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerer «%s» i «.».\n" +"Bruk «sudo ./%s» hvis dette er «%s»-programmet du prøver å kjøre." + +#: plugins/sudoers/logging.c:361 +msgid "authentication failure" +msgstr "feil ved autentisering" + +#: plugins/sudoers/logging.c:387 +msgid "a password is required" +msgstr "du må oppgi et passord" + +#: plugins/sudoers/logging.c:450 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u mislykket passordforsøk" +msgstr[1] "%u mislykkede passordforsøk" + +#: plugins/sudoers/logging.c:715 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "klarte ikke å duplisere standard innkanal. %m" + +#: plugins/sudoers/logging.c:755 +#, c-format +msgid "unable to execute %s: %m" +msgstr "klarte ikke å kjøre %s. %m" + +#: plugins/sudoers/logging.c:796 plugins/sudoers/logging.c:852 +#, c-format +msgid "unable to fork: %m" +msgstr "klarte ikke å kopiere prosess. %m" + +#: plugins/sudoers/logging.c:842 +#, c-format +msgid "unable to open pipe: %m" +msgstr "klarte ikke å åpne datarør. %m" + +#: plugins/sudoers/match_digest.c:100 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "behandlingen for %s (%s) er ikke i %s-skjemaet" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:938 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "klarte ikke å lage statistikk av %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-rolle: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Oppføring i sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " Kjør som-brukere: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " Kjør som-grupper: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Valg: " + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " Commands:\n" +msgstr " Kommandoer:\n" + +#: plugins/sudoers/parse.c:726 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Standardoppføringer som gjelder for %s på %s:\n" + +#: plugins/sudoers/parse.c:744 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Kjør-som- og kommandospesifikke standardoppføringer for %s:\n" + +#: plugins/sudoers/parse.c:762 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Brukeren %s kan kjøre følgende kommandoer på %s:\n" + +#: plugins/sudoers/parse.c:777 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Brukeren %s har ikke tillatelse til å kjøre sudo på %s.\n" + +#: plugins/sudoers/parse_ldif.c:147 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "ignorerer ugyldig attributtverdi: %s" + +#: plugins/sudoers/parse_ldif.c:586 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorerer ufullstendig sudoRole: cn: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ugyldig %.*s fra sudo-grenseflate" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "klarte ikke å tolke nettverksadresse-liste" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt brukernavn" + +#: plugins/sudoers/policy.c:443 +msgid "user ID not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt bruker-ID" + +#: plugins/sudoers/policy.c:447 +msgid "group ID not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt gruppe-ID" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "sudo-grenseflate har ikke angitt vertsnavn" + +#: plugins/sudoers/policy.c:804 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "klarte ikke å kjøre %s" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers regeltillegg versjon %s\n" + +#: plugins/sudoers/policy.c:937 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-grammatikkversjon %d\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sti til «sudoers»-fil: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Sti til «nsswitch»: %s\n" + +#: plugins/sudoers/policy.c:946 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Sti til «ldap.conf»: %s\n" + +#: plugins/sudoers/policy.c:947 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Stil til «ldap.secret»: %s\n" + +#: plugins/sudoers/policy.c:980 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "klarte ikke å tildele krok av typen %d (versjon %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:241 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "klarte ikke å hurtiglagre uid %u. Minnet er fullt" + +#: plugins/sudoers/pwutil.c:235 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "klarte ikke å hurtiglagre uid %u. Uid-en eksisterer allerede" + +#: plugins/sudoers/pwutil.c:296 plugins/sudoers/pwutil.c:314 +#: plugins/sudoers/pwutil.c:377 plugins/sudoers/pwutil.c:422 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "klarte ikke å hurtiglagre brukeren %s. Minnet er fullt" + +#: plugins/sudoers/pwutil.c:309 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "klarte ikke å hurtiglagre brukeren %s. Brukeren eksisterer allerede" + +#: plugins/sudoers/pwutil.c:541 plugins/sudoers/pwutil.c:560 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "klarte ikke å hurtiglagre gid %u. Minnet er fullt" + +#: plugins/sudoers/pwutil.c:554 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "klarte ikke å hurtiglagre gid %u. Gid-en eksisterer allerede" + +#: plugins/sudoers/pwutil.c:608 plugins/sudoers/pwutil.c:626 +#: plugins/sudoers/pwutil.c:674 plugins/sudoers/pwutil.c:716 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "klarte ikke å hurtiglagre gruppa %s. Minnet er fullt" + +#: plugins/sudoers/pwutil.c:621 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "klarte ikke å hurtiglagre gruppa %s. Gruppa eksisterer allerede" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:1001 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "klarte ikke å hurtiglagre liste over %s. Lista eksisterer allerede" + +#: plugins/sudoers/pwutil.c:849 plugins/sudoers/pwutil.c:901 +#: plugins/sudoers/pwutil.c:953 plugins/sudoers/pwutil.c:1006 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "klarte ikke å hurtiglagre liste over %s. Minnet er fullt" + +#: plugins/sudoers/pwutil.c:890 +#, c-format +msgid "unable to parse groups for %s" +msgstr "klarte ikke å tolke grupper for %s" + +#: plugins/sudoers/pwutil.c:995 +#, c-format +msgid "unable to parse gids for %s" +msgstr "klarte ikke å tolke gid-er for %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "perm-stabelen er full" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "perm-stabelen er tom" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "klarte ikke å endre gid til rotbruker" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "klarte ikke å endre til kjør som-gid" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "klarte ikke å velge «kjør som»-gruppevektor" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "klarte ikke å endre uid til «kjør som»-bruker" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "klarte ikke å endre gid til sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "for mange prosesser" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "klarte ikke å hente gjeldende arbeidsmappe" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "forkortet revisjonssti «user_cmnd»: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "forkortet revisjonssti «argv[0]»: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure-meldinga er for lang" + +#: plugins/sudoers/sssd.c:565 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "klarte ikke å starte opp SSS-kilde. Har du installert SSSD på maskinen?" + +#: plugins/sudoers/sssd.c:573 plugins/sudoers/sssd.c:582 +#: plugins/sudoers/sssd.c:591 plugins/sudoers/sssd.c:600 +#: plugins/sudoers/sssd.c:609 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "fant ikke symbolet «%s» i %s" + +#: plugins/sudoers/sudoers.c:210 plugins/sudoers/sudoers.c:866 +msgid "problem with defaults entries" +msgstr "det har oppstått et problem med én eller flere standardoppføringer" + +#: plugins/sudoers/sudoers.c:214 +msgid "no valid sudoers sources found, quitting" +msgstr "fant ingen gyldig sudoers-kilde. Avslutter." + +#: plugins/sudoers/sudoers.c:252 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers-fil tillater ikke rotbruker å kjøre sudo" + +#: plugins/sudoers/sudoers.c:310 +msgid "you are not permitted to use the -C option" +msgstr "du har ikke tillatelse til å bruke valget «-C»" + +#: plugins/sudoers/sudoers.c:357 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "eier («%s») av tidsstempel finnes ikke" + +#: plugins/sudoers/sudoers.c:372 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:373 +msgid "sorry, you must have a tty to run sudo" +msgstr "du må ha en tty for å kunne kjøre sudo" + +#: plugins/sudoers/sudoers.c:435 +msgid "command in current directory" +msgstr "kommando i gjeldende mappe" + +#: plugins/sudoers/sudoers.c:454 +msgid "sorry, you are not allowed set a command timeout" +msgstr "du har ikke tillatelse til å velge tidsavbrudd for kommandoer" + +#: plugins/sudoers/sudoers.c:462 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "du har ikke tillatelse til å beholde brukermiljøet" + +#: plugins/sudoers/sudoers.c:810 +msgid "command too long" +msgstr "kommandoen er for lang" + +#: plugins/sudoers/sudoers.c:942 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikke en vanlig fil" + +#: plugins/sudoers/sudoers.c:946 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s eies av uid %u, som skulle vært %u" + +#: plugins/sudoers/sudoers.c:950 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s kan overskrives av alle" + +#: plugins/sudoers/sudoers.c:954 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s eies av gid %u, som skulle vært %u" + +#: plugins/sudoers/sudoers.c:987 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "du må være rotbruker for å velge «-c %s»" + +#: plugins/sudoers/sudoers.c:1006 +#, c-format +msgid "unknown login class: %s" +msgstr "innloggingsklasse %s er ukjent" + +#: plugins/sudoers/sudoers.c:1091 plugins/sudoers/sudoers.c:1105 +#, c-format +msgid "unable to resolve host %s" +msgstr "klarte ikke å slå opp vertsnavn %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "%s er et ugyldig filtervalg" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "%s er ugyldig maksimal ventetid" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "%s er en ugyldig hastighetsfaktor" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/tidsberegning: %s" + +#: plugins/sudoers/sudoreplay.c:327 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/tidsberegning: %s" + +#: plugins/sudoers/sudoreplay.c:343 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Spiller av sudo-økt i reprise: %s" + +#: plugins/sudoers/sudoreplay.c:541 plugins/sudoers/sudoreplay.c:588 +#: plugins/sudoers/sudoreplay.c:785 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:979 plugins/sudoers/sudoreplay.c:994 +#: plugins/sudoers/sudoreplay.c:1001 plugins/sudoers/sudoreplay.c:1008 +#: plugins/sudoers/sudoreplay.c:1015 plugins/sudoers/sudoreplay.c:1022 +#: plugins/sudoers/sudoreplay.c:1170 +msgid "unable to add event to queue" +msgstr "klarte ikke å legge hendelse i kø" + +#: plugins/sudoers/sudoreplay.c:656 +msgid "unable to set tty to raw mode" +msgstr "klarte ikke å velge råmodus for tty" + +#: plugins/sudoers/sudoreplay.c:707 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Advarsel: terminalen din er for liten for å spille av loggen skikkelig.\n" + +#: plugins/sudoers/sudoreplay.c:708 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Loggens størrelse er %d x %d, mens terminalstørrelsen din er %d x %d." + +#: plugins/sudoers/sudoreplay.c:736 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Sudo-reprise ferdig. Trykk på en knapp for å gå tilbake til terminal." + +#: plugins/sudoers/sudoreplay.c:768 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linja for tidsberegningsfil er ugyldig: %s" + +#: plugins/sudoers/sudoreplay.c:1204 plugins/sudoers/sudoreplay.c:1229 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "uttrykket «%s» er flertydig" + +#: plugins/sudoers/sudoreplay.c:1251 +msgid "unmatched ')' in expression" +msgstr "fant ingenting som samsvarer med deluttrykket «)»" + +#: plugins/sudoers/sudoreplay.c:1255 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "«%s» er et ukjent søkevalg" + +#: plugins/sudoers/sudoreplay.c:1270 +#, c-format +msgid "%s requires an argument" +msgstr "%s krever at du bruker et argument" + +#: plugins/sudoers/sudoreplay.c:1273 plugins/sudoers/sudoreplay.c:1514 +#, c-format +msgid "invalid regular expression: %s" +msgstr "%s er et ugyldig regulært uttrykk" + +#: plugins/sudoers/sudoreplay.c:1277 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "klarte ikke å tolke datoen «%s»" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "unmatched '(' in expression" +msgstr "uttrykkets «(» samsvarer ikke" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"or\"" +msgstr "du kan ikke avslutte med «or»" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "illegal trailing \"!\"" +msgstr "du kan ikke avslutte med «!»" + +#: plugins/sudoers/sudoreplay.c:1340 +#, c-format +msgid "unknown search type %d" +msgstr "«%d» er en ukjent søketype" + +#: plugins/sudoers/sudoreplay.c:1607 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "bruk: %s [-hnRS] [-d mappe] [-m tall] [-s tall] ID\n" + +#: plugins/sudoers/sudoreplay.c:1610 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "bruk: %s [-h] [-d dir] -l [søkeuttrykk]\n" + +#: plugins/sudoers/sudoreplay.c:1619 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - spill av sudo-øktlogg\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1621 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Valg:\n" +" -d, --directory=dir velg loggfil-mappe\n" +" -f, --filter=filter velg hvilke(n) inn- og utdatatype(r) som skal vises\n" +" -h, --help vis hjelpetekst og avslutt\n" +" -l, --list vis tilgjengelige ID-er, med valgfritt uttrykk\n" +" -m, --max-wait=num maskimal ventetid mellom hendelser (i sekunder)\n" +" -n, --non-interactive ingen ledetekst (send alt til standardutdata)\n" +" -R, --no-resize ikke prøv å endre terminalstørrelse\n" +" -S, --suspend-wait vent mens kommando er på pause\n" +" -s, --speed=num øk eller senk utskriftshastigheten\n" +" -V, --version vis versjon og avslutt" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tvert samsvarer ikke" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommando tillatt" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommandoen tillates ikke" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommandoen samsvarer ikke" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s kan overskrives av gruppa den tilhører" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "klarte ikke å korte ned tidsstempel-fil til %lld byte" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "klarte ikke å lese klokka" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "tidsstempel for fremtidig tidspunkt blir ignorert" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstempelet er for langt inn i fremtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "klarte ikke å låse tidsstempel-fil %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "filsti for moralpreken-status («%s/%s») er for lang" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "valget «-x» blir fjernet i en fremtidig versjon" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "bruk verktøyet cvtsudoers i stedet" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "trykk linjeskift for å redigere %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "finner ikke valgt redigeringsprogram (%s)" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "fant ingen redigeringsprogram («editor»-sti = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "skrivefeil" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "klarte ikke å undersøke midlertidig fil (%s). %s er ikke endret" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "midlertidig fil (%s) er tom. %s er ikke endret" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "noe gikk galt med behandleren (%s). %s er ikke endret" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s er ikke endret" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "klarte ikke å åpne midlertidig fil (%s) på nytt. %s er ikke endret" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "klarte ikke å tolke midlertidig fil (%s). Ukjent feil" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "intern feil: fant ikke %s i lista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "klarte ikke å endre uid og gid for %s til (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s og %s er ikke på samme filsystem. Bruker «mv» til å gi nye navn" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommando mislyktes. «%s %s %s». %s er ikke endret" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "klarte ikke å gi %s nytt navn. %s er ikke endret" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Hva nå? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Du har følgende valgmuligheter:\n" +" (e) rediger sudoers-fil på nytt\n" +" (x) avslutt uten å lagre endringer i sudoers-fil\n" +" (Q) avslutt og lagre endringene i sudoers-fil (FARLIG!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "klarte ikke å kjøre %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: feil eier. uid og gid skulle vært «%u, %u»\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: feil tillatelsesmodus. Skulle vært modus 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: lest og tolket OK\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s er opptatt. Prøv igjen senere" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "klarte ikke å låse %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Vil du redigere likevel [j/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Feil: %s:%d sløyfe i %s «%s»" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Advarsel: %s:%d sløyfe i %s «%s»" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Feil: %s:%d referanse til %s «%s», som ikke er definert" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Advarsel: %s:%d referanse til %s «%s», som ikke er definert" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Advarsel: %s:%d %s «%s» står ubrukt" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - rediger sudoers-fil på en trygg måte\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Valg:\n" +" -c, --check undersøkelsesmodus\n" +" -f, --file=sudoers oppgi hvor sudoers-fila ligger\n" +" -h, --help vis denne hjelpeteksten og avslutt\n" +" -q, --quiet mindre detaljerte meldinger om syntaksfeil\n" +" -s, --strict streng syntakskontroll\n" +" -V, --version vis versjon og avslutt\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "du har for mange nivåer av inkluderte filer" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-role: UKJENT\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Sorter: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolle: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-rolle: UKJENT\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Advarsel: sløyfe i %s «%s»" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Advarsel: det refereres til %s «%s», som ikke er definert" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Advarsel: %s «%s» er ubrukt" + +#~ msgid "unable allocate memory" +#~ msgstr "klarte ikke å tildele minne" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "filstien «%s/%s» for tidsstempel er for lang" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "klarte ikke å undersøke redigeringsprogrammet (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: ikke nok lagringsplass for å utvide vertens hurtiglager" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: ikke nok lagringsplass til å bygge opp vertens hurtiglager" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 samsvar ikke ved tildeling" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "intern feil: logglinje mangler plass" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: hurtiglageret er fullt" diff --git a/utsudo-0.0.2/plugins/sudoers/po/nl.mo b/utsudo-0.0.2/plugins/sudoers/po/nl.mo new file mode 100644 index 0000000000000000000000000000000000000000..c07b4d6f440ce1b8e3ac369ffe53d99573a32db7 GIT binary patch literal 39096 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 TF1ia%nY){}@juKgnXCT~*bi-$ literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/nl.po b/utsudo-0.0.2/plugins/sudoers/po/nl.po new file mode 100644 index 0000000..3ea66a0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/nl.po @@ -0,0 +1,2282 @@ +# Dutch translation for sudoers. +# This file is distributed under the same license as the sudo package. +# P. Hamming , 2013. +# Benno Schulenberg , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.22b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-12-01 15:42-0700\n" +"PO-Revision-Date: 2017-12-05 21:44+0100\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.0.4\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "invoerfout" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p's wachtwoord: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] wachtwoord voor %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Wachtwoord: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** VEILIGHEIDSinformatie voor %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Sorry, probeer het opnieuw." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:650 +#: plugins/sudoers/defaults.c:905 plugins/sudoers/defaults.c:1076 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:974 plugins/sudoers/ldap.c:1168 +#: plugins/sudoers/ldap.c:1179 plugins/sudoers/ldap.c:1195 +#: plugins/sudoers/ldap.c:1487 plugins/sudoers/ldap.c:1647 +#: plugins/sudoers/ldap.c:1729 plugins/sudoers/ldap.c:1877 +#: plugins/sudoers/ldap.c:1901 plugins/sudoers/ldap.c:1990 +#: plugins/sudoers/ldap.c:2005 plugins/sudoers/ldap.c:2101 +#: plugins/sudoers/ldap.c:2134 plugins/sudoers/ldap.c:2215 +#: plugins/sudoers/ldap.c:2297 plugins/sudoers/ldap.c:2394 +#: plugins/sudoers/ldap.c:3228 plugins/sudoers/ldap.c:3260 +#: plugins/sudoers/ldap.c:3572 plugins/sudoers/ldap.c:3600 +#: plugins/sudoers/ldap.c:3616 plugins/sudoers/ldap.c:3706 +#: plugins/sudoers/ldap.c:3722 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:684 +#: plugins/sudoers/logging.c:942 plugins/sudoers/match.c:617 +#: plugins/sudoers/match.c:664 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:915 plugins/sudoers/parse.c:252 +#: plugins/sudoers/parse.c:264 plugins/sudoers/parse.c:279 +#: plugins/sudoers/parse.c:291 plugins/sudoers/policy.c:441 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:165 plugins/sudoers/pwutil.c:236 +#: plugins/sudoers/pwutil.c:312 plugins/sudoers/pwutil.c:486 +#: plugins/sudoers/pwutil.c:551 plugins/sudoers/pwutil.c:620 +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:835 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:938 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:353 +#: plugins/sudoers/sssd.c:392 plugins/sudoers/sssd.c:1067 +#: plugins/sudoers/sssd.c:1246 plugins/sudoers/sssd.c:1260 +#: plugins/sudoers/sssd.c:1276 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:682 +#: plugins/sudoers/sudoers.c:807 plugins/sudoers/sudoers.c:851 +#: plugins/sudoers/sudoers.c:1123 plugins/sudoers/sudoers_debug.c:107 +#: plugins/sudoers/sudoreplay.c:1253 plugins/sudoers/sudoreplay.c:1365 +#: plugins/sudoers/sudoreplay.c:1405 plugins/sudoers/sudoreplay.c:1414 +#: plugins/sudoers/sudoreplay.c:1424 plugins/sudoers/sudoreplay.c:1432 +#: plugins/sudoers/sudoreplay.c:1436 plugins/sudoers/sudoreplay.c:1592 +#: plugins/sudoers/sudoreplay.c:1596 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:389 plugins/sudoers/timestamp.c:433 +#: plugins/sudoers/timestamp.c:852 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "kan geen geheugen reserveren" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "een digest vereist een padnaam" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "ongeldige 'notbefore'-waarde" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "ongeldige 'notafter'-waarde" + +#: gram.y:624 plugins/sudoers/policy.c:267 +msgid "timeout value too large" +msgstr "" + +#: gram.y:626 plugins/sudoers/policy.c:269 +msgid "invalid timeout value" +msgstr "" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:490 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:650 plugins/sudoers/defaults.c:905 +#: plugins/sudoers/defaults.c:1076 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:566 +#: plugins/sudoers/ldap.c:974 plugins/sudoers/ldap.c:1168 +#: plugins/sudoers/ldap.c:1179 plugins/sudoers/ldap.c:1195 +#: plugins/sudoers/ldap.c:1487 plugins/sudoers/ldap.c:1647 +#: plugins/sudoers/ldap.c:1729 plugins/sudoers/ldap.c:1877 +#: plugins/sudoers/ldap.c:1901 plugins/sudoers/ldap.c:1990 +#: plugins/sudoers/ldap.c:2005 plugins/sudoers/ldap.c:2101 +#: plugins/sudoers/ldap.c:2134 plugins/sudoers/ldap.c:2214 +#: plugins/sudoers/ldap.c:2297 plugins/sudoers/ldap.c:2394 +#: plugins/sudoers/ldap.c:3228 plugins/sudoers/ldap.c:3260 +#: plugins/sudoers/ldap.c:3572 plugins/sudoers/ldap.c:3599 +#: plugins/sudoers/ldap.c:3615 plugins/sudoers/ldap.c:3706 +#: plugins/sudoers/ldap.c:3722 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:942 +#: plugins/sudoers/match.c:616 plugins/sudoers/match.c:663 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:914 +#: plugins/sudoers/parse.c:252 plugins/sudoers/parse.c:264 +#: plugins/sudoers/parse.c:279 plugins/sudoers/parse.c:291 +#: plugins/sudoers/policy.c:100 plugins/sudoers/policy.c:109 +#: plugins/sudoers/policy.c:118 plugins/sudoers/policy.c:142 +#: plugins/sudoers/policy.c:253 plugins/sudoers/policy.c:267 +#: plugins/sudoers/policy.c:269 plugins/sudoers/policy.c:293 +#: plugins/sudoers/policy.c:303 plugins/sudoers/policy.c:343 +#: plugins/sudoers/policy.c:353 plugins/sudoers/policy.c:362 +#: plugins/sudoers/policy.c:371 plugins/sudoers/policy.c:441 +#: plugins/sudoers/policy.c:678 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:165 plugins/sudoers/pwutil.c:236 +#: plugins/sudoers/pwutil.c:312 plugins/sudoers/pwutil.c:486 +#: plugins/sudoers/pwutil.c:551 plugins/sudoers/pwutil.c:620 +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:835 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:938 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:352 plugins/sudoers/sssd.c:392 +#: plugins/sudoers/sssd.c:1067 plugins/sudoers/sssd.c:1245 +#: plugins/sudoers/sssd.c:1260 plugins/sudoers/sssd.c:1276 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:682 plugins/sudoers/sudoers.c:807 +#: plugins/sudoers/sudoers.c:851 plugins/sudoers/sudoers.c:1123 +#: plugins/sudoers/sudoers_debug.c:106 plugins/sudoers/sudoreplay.c:1253 +#: plugins/sudoers/sudoreplay.c:1365 plugins/sudoers/sudoreplay.c:1405 +#: plugins/sudoers/sudoreplay.c:1414 plugins/sudoers/sudoreplay.c:1424 +#: plugins/sudoers/sudoreplay.c:1432 plugins/sudoers/sudoreplay.c:1436 +#: plugins/sudoers/sudoreplay.c:1592 plugins/sudoers/sudoreplay.c:1596 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:389 +#: plugins/sudoers/timestamp.c:433 plugins/sudoers/timestamp.c:852 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" is al gedefinieerd" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kan de loginklasse voor gebruiker %s niet verkrijgen" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "kan de bsd-aanmelding niet starten" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "ongeldig type verificatie" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "kan de bsd-aanmelding niet initialiseren" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "kan fwtk-configuratie niet lezen" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "kan niet verbinden met aanmeldingsserver" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "verbinding met aanmeldingsserver verloren" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"aanmeldingsserverfout:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, fuzzy, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: kan opdrachtgever niet converteren naar een string ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: kan '%s' niet ontleden: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kan cache voor aanmeldingsgegevens niet vinden: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: kan opties niet reserveren: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kan aanmeldingsgegevens niet verkrijgen: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kan cache voor aanmeldingsgegevens niet initialiseren: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kan aanmeldingsgegeven niet opslaan in cache: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: kan belangrijkste server niet vinden: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan TGT niet verifieren! U bent mogelijk aangevallen!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "kan PAM niet initialiseren" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "fout bij valideren van account, is uw account geblokkeerd?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Account of wachtwoord is verlopen, stel uw wachtwoord opnieuw in en probeer het opnieuw" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kan verlopen wachtwoord niet wijzigen: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Wachtwoord is verlopen, neem contact op met uw systeembeheerder" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Account is verlopen of PAM-configuratie heeft geen \"account\"-gedeelte voor sudo, neem contact op met uw systeembeheerder" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "fout in PAM-aanmelding: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "u bestaat niet in de %s-database" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "initialiseren van de ACE API-bibliotheek is mislukt" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "kan geen contact krijgen met de SecurID-server" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "Gebruikers-ID is geblokkeerd voor SecurID-verificatie" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "ongeldige gebruikersnaamlengte voor SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "kan verificatie voor SecurID op deze manier niet afhandelen" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "SecurID-communicatie is mislukt" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "onbekende SecurID-fout" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "ongeldige lengte van passcode voor SecurID" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "kan SIA-sessie niet initialiseren" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "ongeldige verificatiemethoden" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Er zijn ongeldige verificatiemethoden in sudo gecompileerd! U kunt geen zelfstandige en niet-zelfstandige verificatiemethoden door elkaar gebruiken." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "geen verificatiemethoden" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Er zijn geen verificatie-methoden in sudo gecompileerd! Als u verificatie wilt uitschakelen, dient u de --disable-authentication configuratie-optie te gebruiken." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Kon verificatiemethoden niet starten." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Verificatie-methoden:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Kan voorwaarden voor controle niet bepalen" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "kan controlestructuur niet opbouwen" + +#: plugins/sudoers/check.c:259 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Als het goed is hebt u de gebruikelijke informatie ontvangen van uw\n" +"systeembeheerder. Gewoonlijk komt het neer op de volgende drie punten:\n" +"\n" +" 1. Respecteer de privacy van anderen.\n" +" 2. Denk na voordat u iets doet.\n" +" 3. Veel mogelijkheden betekent veel verantwoordelijkheid.\n" +"\n" + +#: plugins/sudoers/check.c:302 plugins/sudoers/check.c:312 +#: plugins/sudoers/sudoers.c:725 plugins/sudoers/sudoers.c:770 +#, c-format +msgid "unknown uid: %u" +msgstr "onbekend gebruikersnummer: %u" + +#: plugins/sudoers/check.c:307 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:851 plugins/sudoers/sudoers.c:1162 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "onbekende gebruiker: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-voorziening als syslog wordt gebruikt voor loggen: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioriteit wanneer aanmelden van gebruiker gelukt is: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioriteit wanneer aanmelden van gebruiker niet gelukt is: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Geef OTP-prompt een eigen regel" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Negeer '.' in $PATH" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Stuur altijd een mail wanneer sudo is gebruikt" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Stuur een mail wanneer aanmelden van gebruiker mislukt" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Stuur een mail als de gebruiker niet in sudoers staat" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Stuur een mail als de gebruiker niet voor deze computer in sudoers staat" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Stuur een mail als de gebruiker een opdracht niet mag gebruiken" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Stuur een mail als de gebruiker een opdracht probeert te gebruiken" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Gebruik een verschillende tijd voor elke gebruiker/terminal-combinatie" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Instrueer gebruikers de eerste keer dat ze sudo gebruiken" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Bestand met de sudo-instructies: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Standaard is verificatie van gebruikers vereist" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "Root mag sudo gebruiken" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Log de computernaam in het (niet-syslog) logbestand" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Log het jaar in het (niet-syslog) logbestand" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Start een shell als sudo wordt aangeroepen zonder argumenten" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Stel $HOME in op de doelgebruiker wanneer een shell wordt gestart met -s" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "$HOME altijd instellen op de persoonlijke map van de doelgebruiker" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Sta verzamelen van informatie toe om bruikbare foutberichten te geven" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Vereis volledig-gekwalificeerde computernamen (fqdn) in het sudoers-bestand" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "Beledig de gebruiker wanneer ze een verkeerd wachtwoord invoeren" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Gebruiker alleen toestaan sudo te gebruiken wanneer deze een terminal heeft" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo zal de EDITOR omgevingsvariabele in acht nemen" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "Vraag naar wachtwoord van root, niet van de gebruiker" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Vraag naar wachtwoord van runas_default gebruiker, niet van huidige gebruiker" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "Vraag naar wachtwoord van doelgebruiker, niet van huidige gebruiker" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Pas de standaardinstellingen van de doelgebruikers inlogklasse toe wanneer deze bestaat" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Stel de LOGNAME en USER omgevingsvariabelen in" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Stel het effectieve gebruikersnummer van de doelgebuiker in, niet het werkelijke gebruikersnummer" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "De groepsvector niet initialiseren naar die van de doelgebruiker" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Breek regels in logbestanden af op (0 voor niet afbreken): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Aanmeldtijd timeout: %.1f minuten" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Wachtwoordprompt timeout: %.1f minuten" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Aantal pogingen om een wachtwoord in te voeren: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Te gebruiken umask of 0777 om die van gebruiker te gebruiken: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Pad naar logbestand: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pad naar mailprogramma: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Opties voor mailprogramma: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adres waarnaar mail wordt verzonden: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Afzenderadres: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Onderwerp voor mails: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Boodschap voor verkeerd wachtwoord: %s" + +#: plugins/sudoers/def_data.c:221 +#, fuzzy, c-format +msgid "Path to lecture status dir: %s" +msgstr "Pad naar aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pad naar aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Eigenaar van aanmeld-tijdmap: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Gebruikers in deze groep zijn uitgezonderd van de wachtwoord- en PATH-vereisten: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standaard wachtwoordprompt: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Indien ingesteld, zal de wachtwoordprompt altijd de systeemprompt vervangen." + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standaardgebruiker om opdrachten uit te voeren: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Waarde waarmee $PATH van gebruiker wordt vervangen: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pad naar de editor bij gebruik van visudo: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Wanneer een wachtwoord noodzakelijk is voor 'list'-pseudopdracht: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Wanneer een wachtwoord noodzakelijk is voor 'verify'-pseudopdracht: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Laadt vooraf de dummy uitvoerfuncties uit de sudo_noexec-bibliotheek" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Als de LDAP-map beschikbaar is, wordt het lokale sudoersbestand genegeerd?" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Bestandsdescriptors >= %d zullen worden gesloten vóór het uitvoeren van een opdracht" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Indien ingesteld, mogen gebruikers de waarde van 'closefrom' vervangen met de optie -C" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Gebruikers toestaan willekeurige omgevingsvariabelen in te stellen" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "Stel de omgevingsvariablen in op een standaard set" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Op \"gezondheid\" te controleren omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Te verwijderen omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Te behouden omgevingsvariabelen:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux role om in de nieuwe beveiligingscontext te gebruiken: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux type om in de nieuwe beveiligingscontext te gebruiken: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pad naar het omgevingsbestand voor sudo: %s" + +#: plugins/sudoers/def_data.c:313 +#, fuzzy, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Pad naar het omgevingsbestand voor sudo: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Te gebruiken taalregio bij ontleden van sudoers: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Sta sudo toe ook te vragen naar een wachtwoord wanneer dit zichtbaar zou worden" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Zorg voor zichtbare terugkoppeling op de wachtwoordprompt wanneer er gebruikersinvoer is" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Gebruik snellere expansie van jokertekens. Dit is minder nauwkeurig, maar maakt geen gebruik van het bestandsysteem" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "De umask die is opgegeven in het sudoersbestand zal die van de gebruiker vervangen, ook wanneer deze meer toestaat" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "Log gebruikersinvoer voor de uitgevoerde opdracht" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "Log uitvoer voor de uitgevoerde opdracht" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "Comprimeer in-/uitvoerlogs met zlib" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "Voer opdrachten altijd uit in een pseudo-terminal" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plugin voor ondersteuning van niet-Unixgroepen: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Map waarin in-/uitvoerlogs moeten worden opgeslagen: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Bestand waarin in-/uitvoerlogs moeten worden opgeslagen: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Voeg een item toe aan het utmp/utmpx-bestand wanneer een virtuele terminal wordt gereserveerd" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Stel in utmp de gebruiker in op de runas-gebruiker, niet op de aanroepende gebruiker" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Set van toegestane privileges: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Set van beperkende privileges: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Draai opdrachten op een virtuele terminal op de achtergrond." + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "te gebruiken naam van PAM-service: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "te gebruiken naam van PAM-service voor inlog-shells: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Probeer PAM-aanmeldgegevens voor doelgebruiker te verkrijgen" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Maak een nieuwe PAM-sessie om de opdracht in uit te voeren" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maximaal in-/uitvoerlog volgnummer: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "Ondersteuning voor sudoers-netgroup inschakelen" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:481 +#, fuzzy, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Eigenaar van aanmeld-tijdmap: %s" + +#: plugins/sudoers/defaults.c:220 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d onbekend standaarditem \"%s\"" + +#: plugins/sudoers/defaults.c:223 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: onbekend standaarditem \"%s\"" + +#: plugins/sudoers/defaults.c:266 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d geen waarde opgegeven voor \"%s\"" + +#: plugins/sudoers/defaults.c:269 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: geen waarde opgegeven voor \"%s\"" + +#: plugins/sudoers/defaults.c:289 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d waarden voor \"%s\" moeten beginnen met een '/'" + +#: plugins/sudoers/defaults.c:292 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: waarden voor \"%s\" moeten beginnen met een '/'" + +#: plugins/sudoers/defaults.c:317 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d optie '%s' accepteert geen waarde" + +#: plugins/sudoers/defaults.c:320 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: optie '%s' accepteert geen waarde" + +#: plugins/sudoers/defaults.c:342 +#, fuzzy, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/defaults.c:345 +#, fuzzy, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/defaults.c:355 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d waarde \"%s\" is ongeldig voor optie '%s'" + +#: plugins/sudoers/defaults.c:358 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: waarde \"%s\" is ongeldig voor optie '%s'" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1264 +#: plugins/sudoers/ldap.c:1491 plugins/sudoers/ldap.c:1816 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:947 +#: plugins/sudoers/policy.c:562 plugins/sudoers/policy.c:572 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:873 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "interne fout, %s overflow" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp bevat fouten, verkeerde lengte" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "kan omgeving niet opnieuw opbouwen" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "sorry, u mag de volgende omgevingsvariabelen niet instellen: %s" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "niet-ondersteund type controlegetal %d voor %s" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: leesfout" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s moet eigendom zijn van gebruikersnummer %d" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mag enkel schrijfbaar zijn voor eigenaar" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:400 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan %s niet laden: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kan symbool \"group_plugin\" niet vinden in %s" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: incompatibele groepplugin hoofdversie %d, verwacht wordt %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan IP-adres \"%s\" niet ontleden" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan netmasker \"%s\" niet ontleden" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Combinaties van lokale IP-adressen en netwerkmaskers:\n" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s bestaat al, maar is geen map (0%o)" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:170 +#, c-format +msgid "unable to mkdir %s" +msgstr "mkdir %s: aanmaken mislukt" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan modus van %s niet wijzigen naar 0%o" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1193 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "onbekende groep: %s" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:929 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1354 +#: plugins/sudoers/sudoreplay.c:1558 plugins/sudoers/timestamp.c:398 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "kan %s niet openen" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:933 +#: plugins/sudoers/sudoreplay.c:856 plugins/sudoers/sudoreplay.c:1669 +#, c-format +msgid "unable to read %s" +msgstr "kan %s niet lezen" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1123 +#: plugins/sudoers/timestamp.c:290 plugins/sudoers/timestamp.c:293 +#, c-format +msgid "unable to write to %s" +msgstr "kan %s niet schrijven" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "kan %s niet aanmaken" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kan niet schrijven naar in-/uitvoerlogbestand: %s" + +#: plugins/sudoers/iolog.c:1069 +#, fuzzy, c-format +msgid "%s: internal error, file index %d not open" +msgstr "interne fout, kan %s niet in de lijst vinden!" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: poort te groot" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "niet-ondersteund LDAP uri type: %s" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan ldap en ldaps URIs niet door elkaar gebruiken" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:559 +msgid "starttls not supported when using ldaps" +msgstr "starttls wordt niet ondersteund in combinatie met ldaps" + +#: plugins/sudoers/ldap.c:630 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan SSL cert en key db niet initialiseren: %s" + +#: plugins/sudoers/ldap.c:633 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "u moet TLS_CERT in %s instellen om SSL te gebruiken" + +#: plugins/sudoers/ldap.c:1250 +msgid "unable to get GMT time" +msgstr "kan GMT-tijd niet verkrijgen" + +#: plugins/sudoers/ldap.c:1256 +msgid "unable to format timestamp" +msgstr "kan tijd niet juist opmaken" + +#: plugins/sudoers/ldap.c:1980 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:2552 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP Role: %s\n" + +#: plugins/sudoers/ldap.c:2554 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"LDAP Role: UNKNOWN\n" + +#: plugins/sudoers/ldap.c:2610 +#, c-format +msgid " Order: %s\n" +msgstr " Volgorde: %s\n" + +#: plugins/sudoers/ldap.c:2618 plugins/sudoers/parse.c:618 +#: plugins/sudoers/sssd.c:1641 +#, c-format +msgid " Commands:\n" +msgstr " Opdrachten:\n" + +#: plugins/sudoers/ldap.c:3180 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kan LDAP niet initialiseren: %s" + +#: plugins/sudoers/ldap.c:3216 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls opgegeven maar LDAP bibliotheken ondersteunen geen ldap_start_tls_s() of ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3468 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ongeldig sudoOrder kenmerk: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "kan controlesysteem niet openen" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "kan controleboodschap niet verzenden" + +#: plugins/sudoers/logging.c:107 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:135 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (opdracht voortgezet) %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "unable to open log file: %s" +msgstr "kan logbestand niet openen: %s" + +#: plugins/sudoers/logging.c:172 +#, c-format +msgid "unable to lock log file: %s" +msgstr "kan logbestand niet vergrendelen: %s" + +#: plugins/sudoers/logging.c:205 +#, c-format +msgid "unable to write log file: %s" +msgstr "kan logbestand niet schrijven: %s" + +#: plugins/sudoers/logging.c:234 +msgid "No user or host" +msgstr "Geen gebruiker of computer" + +#: plugins/sudoers/logging.c:236 +msgid "validation failure" +msgstr "geldigheidsfout" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT in sudoers" +msgstr "gebruiker NIET in sudoers" + +#: plugins/sudoers/logging.c:245 +msgid "user NOT authorized on host" +msgstr "gebruiker NIET aangemeld op computer" + +#: plugins/sudoers/logging.c:247 +msgid "command not allowed" +msgstr "opdracht is niet toegestaan" + +#: plugins/sudoers/logging.c:282 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s zit niet in het sudoersbestand. Dit incident zal worden gerapporteerd.\n" + +#: plugins/sudoers/logging.c:285 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s heeft niet het recht om sudo te gebruiken op %s. Dit incident zal worden gerapporteerd.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Sorry, gebruiker %s mag sudo niet gebruiken op %s.\n" + +#: plugins/sudoers/logging.c:292 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Sorry, gebruiker %s mag '%s%s%s' niet uitvoeren als %s%s%s op %s.\n" + +#: plugins/sudoers/logging.c:329 plugins/sudoers/sudoers.c:473 +#: plugins/sudoers/sudoers.c:475 plugins/sudoers/sudoers.c:477 +#: plugins/sudoers/sudoers.c:479 plugins/sudoers/sudoers.c:1298 +#: plugins/sudoers/sudoers.c:1300 +#, c-format +msgid "%s: command not found" +msgstr "%s: opdracht niet gevonden" + +#: plugins/sudoers/logging.c:331 plugins/sudoers/sudoers.c:469 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"\"%s\" gevonden in '.' wordt genegeerd.\n" +"Gebruik 'sudo ./%s' als dit de '%s' die u wilt uitvoeren." + +#: plugins/sudoers/logging.c:348 +msgid "authentication failure" +msgstr "aanmeldingsfout" + +#: plugins/sudoers/logging.c:374 +msgid "a password is required" +msgstr "een wachtwoord is verplicht" + +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:511 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u verkeerde wachtwoordpoging" +msgstr[1] "%u verkeerde wachtwoordpogingen" + +#: plugins/sudoers/logging.c:598 +msgid "unable to fork" +msgstr "kan niet afsplitsen" + +#: plugins/sudoers/logging.c:606 plugins/sudoers/logging.c:658 +#, c-format +msgid "unable to fork: %m" +msgstr "kan niet afsplitsen: %m" + +#: plugins/sudoers/logging.c:648 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kan pipe niet openen: %m" + +#: plugins/sudoers/logging.c:673 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan stdin niet klonen: %m" + +#: plugins/sudoers/logging.c:711 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kan %s niet uitvoeren: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "controlegetal voor %s (%s) is niet in de %s-vorm" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:944 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "kan stat op %s niet uitvoeren" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "ontleedfout in %s bij regel %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "ontleedfout in %s" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-item:\n" + +#: plugins/sudoers/parse.c:545 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:559 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:568 +#, c-format +msgid " Options: " +msgstr " Opties: " + +#: plugins/sudoers/policy.c:243 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "kan netwerkadressenlijst niet ontleden" + +#: plugins/sudoers/policy.c:380 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:384 +msgid "user ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:388 +msgid "group ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:392 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:736 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "kan %s niet uitvoeren" + +#: plugins/sudoers/policy.c:869 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers-beleidsplugin versie %s\n" + +#: plugins/sudoers/policy.c:871 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versie van sudoers-bestandsgrammatica %d\n" + +#: plugins/sudoers/policy.c:875 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers-pad: %s\n" + +#: plugins/sudoers/policy.c:878 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch-pad: %s\n" + +#: plugins/sudoers/policy.c:880 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf-pad: %s\n" + +#: plugins/sudoers/policy.c:881 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret-pad: %s\n" + +#: plugins/sudoers/policy.c:914 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:188 plugins/sudoers/pwutil.c:206 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "kan gebruikersnummer %u niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:200 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan gebruikersnummer %u niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:260 plugins/sudoers/pwutil.c:277 +#: plugins/sudoers/pwutil.c:339 plugins/sudoers/pwutil.c:384 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "kan gebruiker %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:272 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan gebruiker %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:503 plugins/sudoers/pwutil.c:521 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "kan groepsnummer %u niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:515 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan groepsnummer %u niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:569 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:633 plugins/sudoers/pwutil.c:675 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "kan groep %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:581 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan groep %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:801 plugins/sudoers/pwutil.c:853 +#: plugins/sudoers/pwutil.c:904 plugins/sudoers/pwutil.c:957 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan groepslijst voor %s niet bufferen, bestaat reeds" + +#: plugins/sudoers/pwutil.c:807 plugins/sudoers/pwutil.c:858 +#: plugins/sudoers/pwutil.c:910 plugins/sudoers/pwutil.c:962 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "kan groepslijst voor %s niet bufferen, onvoldoende geheugen" + +#: plugins/sudoers/pwutil.c:847 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan groepen voor %s niet ontleden" + +#: plugins/sudoers/pwutil.c:951 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan groepsnummers voor %s niet ontleden" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "overloop van rechtenstapel" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "onderloop van rechtenstapel" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "kan niet wijzigen naar rootgroepsnummer" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "kan niet wijzigen naar runas-groepsnummer" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "kan runas-groepsvector niet instellen" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "kan niet wijzigen naar runas-gebruikersnummer" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "kan niet wijzigen naar sudoers-groepsnummer" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "te veel processen" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "kan huidige werkmap niet achterhalen" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "boodschap voor audit_failure is te lang" + +#: plugins/sudoers/sssd.c:402 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Kan SSS-bron niet initialiseren. Is SSSD op uw machine geinstalleerd?" + +#: plugins/sudoers/sssd.c:410 plugins/sudoers/sssd.c:419 +#: plugins/sudoers/sssd.c:428 plugins/sudoers/sssd.c:437 +#: plugins/sudoers/sssd.c:446 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan symbool \"%s\" niet vinden in %s" + +#: plugins/sudoers/sssd.c:1556 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" +"\n" +"SSSD Role: %s\n" + +#: plugins/sudoers/sssd.c:1561 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" +"\n" +"SSSD Role: UNKNOWN\n" + +#: plugins/sudoers/sudo_nss.c:289 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Overeenkomende standaarditems voor %s op %s:\n" + +#: plugins/sudoers/sudo_nss.c:307 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas en opdrachtspecifieke standaarden voor %s:\n" + +#: plugins/sudoers/sudo_nss.c:325 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Gebruiker %s mag de volgende opdrachten uitvoeren op %s:\n" + +#: plugins/sudoers/sudo_nss.c:338 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Gebruiker %s mag geen sudo gebruiken op %s.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "kan sudoers-standaardwaarden niet initialiseren" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:891 +msgid "problem with defaults entries" +msgstr "probleem met standaarditems" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "geen geldige sudoers-bronnen gevonden, afsluiten" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers geeft aan dat root geen sudo mag gebruiken" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "u heeft niet de rechten om de optie -C te gebruiken" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tijd-eigenaar (%s): Gebruiker bestaat niet" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "geen terminal" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "sorry, u moet een terminal hebben om sudo te gebruiken" + +#: plugins/sudoers/sudoers.c:468 +msgid "command in current directory" +msgstr "opdracht in huidige map" + +#: plugins/sudoers/sudoers.c:487 +#, fuzzy +msgid "sorry, you are not allowed set a command timeout" +msgstr "sorry, u mag de omgeving niet behouden" + +#: plugins/sudoers/sudoers.c:495 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "sorry, u mag de omgeving niet behouden" + +#: plugins/sudoers/sudoers.c:836 +msgid "command too long" +msgstr "opdracht is te lang" + +#: plugins/sudoers/sudoers.c:948 +#, c-format +msgid "%s is not a regular file" +msgstr "%s in geen regulier bestand" + +#: plugins/sudoers/sudoers.c:952 plugins/sudoers/timestamp.c:217 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s is eigendom van gebruikersnummer %u, zou %u moeten zijn" + +#: plugins/sudoers/sudoers.c:956 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "%s kan door iedereen worden geschreven" + +#: plugins/sudoers/sudoers.c:960 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s is eigendom van groepsnummer %u, zou %u moeten zijn" + +#: plugins/sudoers/sudoers.c:993 +#, fuzzy, c-format +msgid "only root can use \"-c %s\"" +msgstr "alleen root kan '-c %s' gebruiken" + +#: plugins/sudoers/sudoers.c:1012 +#, c-format +msgid "unknown login class: %s" +msgstr "onbekende loginklasse: %s" + +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/sudoers.c:1109 +#, c-format +msgid "unable to resolve host %s" +msgstr "kan computernaam %s niet herleiden" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "ongeldige filteroptie: %s" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "ongeldige maximale wachttijd: %s" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ongeldige snelheidsfactor: %s" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s versie %s\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:357 +#, fuzzy, c-format +msgid "Replaying sudo session: %s" +msgstr "Bekijken van sudo sessie: %s\n" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:804 plugins/sudoers/sudoreplay.c:894 +#: plugins/sudoers/sudoreplay.c:973 plugins/sudoers/sudoreplay.c:988 +#: plugins/sudoers/sudoreplay.c:995 plugins/sudoers/sudoreplay.c:1002 +#: plugins/sudoers/sudoreplay.c:1009 plugins/sudoers/sudoreplay.c:1016 +#: plugins/sudoers/sudoreplay.c:1162 +msgid "unable to add event to queue" +msgstr "kan gebeurtenis niet aan wachtrij toevoegen" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "kan terminal niet instellen op rauwe modus" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Waarschuwing: uw terminal is te klein om de log goed op te bekijken.\n" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Logverhouding is %d x %d, de verhouding van uw terminal is %d x %d." + +#: plugins/sudoers/sudoreplay.c:749 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:782 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ongeldige timingsbestandregel: %s" + +#: plugins/sudoers/sudoreplay.c:1196 plugins/sudoers/sudoreplay.c:1221 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "dubbelzinnige expressie \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1243 +msgid "unmatched ')' in expression" +msgstr "ongepaarde ')' in expressie" + +#: plugins/sudoers/sudoreplay.c:1247 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "onbekende zoekterm \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1262 +#, c-format +msgid "%s requires an argument" +msgstr "%s vereist een argument" + +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1645 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ongeldige reguliere expressie: %s" + +#: plugins/sudoers/sudoreplay.c:1269 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kan datum niet ontleden \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1278 +msgid "unmatched '(' in expression" +msgstr "ongepaarde '(' in expressie" + +#: plugins/sudoers/sudoreplay.c:1280 +msgid "illegal trailing \"or\"" +msgstr "ongeldige afsluitende \"or\"" + +#: plugins/sudoers/sudoreplay.c:1282 +msgid "illegal trailing \"!\"" +msgstr "ongeldige afsluitende \"!\"" + +#: plugins/sudoers/sudoreplay.c:1331 +#, c-format +msgid "unknown search type %d" +msgstr "onbekend zoektype %d" + +#: plugins/sudoers/sudoreplay.c:1369 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ongeldig logbestand" + +#: plugins/sudoers/sudoreplay.c:1387 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tijdveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1394 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tijdstempel %s: %s" + +#: plugins/sudoers/sudoreplay.c:1401 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: gebruikersveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1410 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-gebuikersveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1419 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-groepveld ontbreekt" + +#: plugins/sudoers/sudoreplay.c:1825 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "Gebruik: %s [-hnR] [-d map] [-m wachttijd] [-s snelheidsfactor] ID\n" + +#: plugins/sudoers/sudoreplay.c:1828 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Gebruik: %s [-h] [-d map] -l [zoek-expressie]\n" + +#: plugins/sudoers/sudoreplay.c:1837 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - sudo sessielogs bekijken\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1839 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opties:\n" +" -d, --directory=map map voor sessielogs opgeven\n" +" -f, --filter=filter opgeven welk type in-/uitvoer moet worden weergegeven\n" +" -h, --help geef help weer (dit bericht) en sluit af\n" +" -l, --list [expressie] som beschikbare sessienummers\n" +" die overeenkomen met de expressie op\n" +" -m, --max-wait=num wacht tussen gebeurtenissen maximaal m seconden\n" +" -s, --speed=num snelheid van uitvoer verhogen of verlagen\n" +" -V, --version geef versieinformatie weer en sluit af" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "\tcomputer komt niet overeen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Opdracht toegestaan" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Opdracht niet toegestaan" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Opdracht komt niet overeen" + +#: plugins/sudoers/timestamp.c:225 +#, c-format +msgid "%s is group writable" +msgstr "%s kan door groep worden gewijzigd" + +#: plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kan tijdstempelbestand niet inkorten naar %lld bytes" + +#: plugins/sudoers/timestamp.c:756 plugins/sudoers/timestamp.c:823 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "kan de klok niet lezen" + +#: plugins/sudoers/timestamp.c:770 +msgid "ignoring time stamp from the future" +msgstr "tijdstempel uit de toekomst wordt genegeerd" + +#: plugins/sudoers/timestamp.c:782 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tijd is te ver in de toekomst: %20.20s" + +#: plugins/sudoers/timestamp.c:877 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kan tijdstempelbestand %s niet vergrendelen" + +#: plugins/sudoers/timestamp.c:921 plugins/sudoers/timestamp.c:941 +#, fuzzy, c-format +msgid "lecture status path too long: %s/%s" +msgstr "tijd voor pad te lang: %s" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammaticaversie %d\n" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "Druk op Enter om %s te bewerken: " + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "opgegeven editor (%s) bestaat niet" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "geen editor gevonden (editorpad = %s)" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "schrijffout" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan status van tijdelijk bestand (%s) niet vaststellen, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "tijdelijk bestand (%s) leeg, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) is mislukt, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "%s ongewijzigd" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kan tijdelijk bestand (%s) niet openen, %s ongewijzigd." + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "kan tijdelijke bestand (%s) niet ontleden, onbekende fout" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "interne fout, kan %s niet in de lijst vinden!" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kan %s niet wijzigen (gebruikers- of groepsnummer) naar (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s en %s niet op hetzelfde bestandssyteem, gebuikt mv om te hernoemen" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "opdracht mislukt: '%s %s %s', %s ongewijzigd" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fout bij hernoemen %s, %s ongewijzigd" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "Wat nu? " + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Opties zijn:\n" +" (e)dit sudoers bestand opnieuw\n" +" e(x)it zonder de wijzigingen op te slaan\n" +" (Q)uit en sla wijziging op in het sudoers bestand (GEVAAR!)\n" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "kan %s niet uitvoeren" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: verkeerde eigenaar (gebruikers-, groepsnummer) zou moeten zijn (%u, %u)\n" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: verkeerde toegangsrechten, zou modus 0%o moeten zijn\n" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "kan %s-bestand niet ontleden, onbekende fout" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "fout bij ontleden van %s bij regel %d\n" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "fout bij ontleden van %s\n" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: ontleden is geslaagd\n" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "%s bezig, probeer het later opnieuw" + +#: plugins/sudoers/visudo.c:1159 +#, fuzzy, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fout: cyclus in %s '%s'" + +#: plugins/sudoers/visudo.c:1160 +#, fuzzy, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Waarschuwing: cyclus in %s '%s'" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fout: %s:%d %s \"%s\" wordt naar verwezen, maar is niet gedefinieerd" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Waarschuwing: %s:%d %s \"%s\" wordt naar verwezen, maar is niet gedefinieerd" + +#: plugins/sudoers/visudo.c:1318 +#, fuzzy, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Waarschuwing: %s '%s' wordt niet gebruikt" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bewerk het sudoersbestand voorzichtig\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Opties:\n" +" -c, --check alleen lezen modus\n" +" -f, --file=bestand geef lokatie van sudoersbestand op\n" +" -h, --help geef help weer (dit bericht) en sluit af\n" +" -q, --quiet minder uitgebreide syntactische fout berichten\n" +" -s, --strict stricte controle van syntaxis\n" +" -V, --verion geef versieinformatie weer en sluit af" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "onbekend standaarditem '%s'" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: in- en uitvoerbestanden moeten verschillen" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "te veel niveaus van insluitingen" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: ruimte ontoereikend bij uitbreiden hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: ruimte ontoereikend bij bouwen van hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 reserveren mislukt" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "tijd voor pad te lang: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "kan status van editor (%s) niet verkrijgen" + +#~ msgid "Password:" +#~ msgstr "Wachtwoord:" + +#~ msgid "unable to setup authentication" +#~ msgstr "kan verificatie niet instellen" + +#~ msgid "invalid uri: %s" +#~ msgstr "ongeldige uri: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "kan ldaps en starttls niet door elkaar gebruiken" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "interne fout: onvoldoende ruimte voor logregel" + +#~ msgid "value out of range" +#~ msgstr "waarde buiten bereik" + +#~ msgid "writing to standard output" +#~ msgstr "naar standaarduitvoer schrijven" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "te veel geneste expressies, maximum %d" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s is van gebruikersnummer %u, zou gebruikersnummer %u moeten zijn" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s kan geschreven worden door niet-eigenaar (0%o), zou ingesteld moeten zijn op 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s bestaat maar is geen normaal bestand (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s kan geschreven worden bij niet-eigenaar (0%o), zou ingesteld moeten zijn op 0600" + +#~ msgid "unable to remove %s, will reset to the epoch" +#~ msgstr "kan %s niet verwijderen, wordt geherinitialiseerd op de epoch" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: stapeloverloop" + +#~ msgid "%s: unused %s_Alias %s" +#~ msgstr "%s: ongebruikte %s_Alias %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s bij regel %d <<<" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: mislukt" + +#~ msgid "getauid failed" +#~ msgstr "getauid mislukt" + +#~ msgid "au_open: failed" +#~ msgstr "au_open: mislukt" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: mislukt" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: mislukt" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: mislukt" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: failed" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: failed" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "kan taaldefinitie niet instellen op \"%s\", gebruikt wordt \"C\"" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Opdrachten:\n" +#~ "\t" + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "kan gebruikersnummer %u niet bufferen (%s), bestaat reeds" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "kan groepsnummer %u niet bufferen (%s), bestaat reeds" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Kan niet dlopen %s: %s" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "kan %s niet uitvoeren: %s" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "invalid regex: %s" +#~ msgstr "ongeldige reguliere expressie: %s" diff --git a/utsudo-0.0.2/plugins/sudoers/po/pl.mo b/utsudo-0.0.2/plugins/sudoers/po/pl.mo new file mode 100644 index 0000000000000000000000000000000000000000..4235fcb27c76dac4732e37e395db866aebe10ece GIT binary patch literal 50837 zcmb`Q3xHi!dG9wC(MA!aiad2E5RyP)k zwg-0p`?1#AYklim-)pVC=5J0t@!o{rhfYY6v%y!LoFwZXlO+Fqrtb1PFG-#ZoDlF- z@D#4k1y2Pp4%gR$7oV6Uw}5*o>+YqLMLCZy^ZYZ*J^fwazmV^K@JZl(LrKCbllOy9 z0Y47veV+#(4}Jqwy}kqLy}tx61Wy@Gl4pWffaijHz{|mxfTx3h2%Zmq6+8|6IrvoY z$t(Q%V(?n7uL9SBhd`C{CjlP?mHtU9lSHIA7hDKl1wI{o9{5D?AowKk5U6_I13nr2 z2zWC18So_VE1=T-C8+xU9SDh%Q&%O))4(ghE5MsUNRzx8ycGNdxETB~NE4E$U*z?= z7F7H9fO`G{Q02cP;6q@_^`}6k`xdD8Bp3VjY2YF*F9k0FZw1x9*MM|k@(>8Aldpqn z*RPT20x$(t{~JM-I|GW|Zv@W(9|Gy}0R0;=B6cvh0o!>O-Q~9D*fZuBnerP>p;=(rQp-ScY$i>AAy^} zM?ul;5;|4o-3+Sy4yby*KioeI(zVI=K(+Tw{y7!g4T`?|LDBtgQ1AOsU<&>f2#Y2^ z2i5*%Ym1UG`B!(RS@q{&-B_1o7$weOc8MJKCi zw8lvXgcXv9!QTLX1d8uYT<7n*093oTfuh5G;4{F_gLG-~_u%uvbLbSk=e3~f`-hU16&VM<>VeveE3yR&()dAzZ4W*c7Pg3F9P-az2G|V&%^ywHah)RgQsx+ zIiS+jK=sExAWca=2fiA7+$MkDyiclgC}}{k8=ZJ-VR!>kmMZ zBtHQ4o=YLV#@8-T{QPoI{rm_h`hNpl3Z8O<*LyVx$&(uR6!1gf67bWY+W9?D?R(md zj+;Tz;YFazdlRViUkTSg1C?+1CYQT=K=tn(py>5U@R{H@K(+VhpxU!^i@$#yq|1_n zpvrw1Tm*g>Ou@%(_3^kARQqlK)o*uzYR6~5Tfh^yCCTf-Js>Qc{1Chl9NzBb-Ucq` z`VLU^`Y=dUl5c?*fI~NX{hkdjL!RQ(phq^rQq0bc;BeIEqR0lx&U z1HTV00GE$=y)OgR?+sA=@BvWiKLefyeha)9{3&<_c;Qax+fAVQc^9a3ZBXxfC8+v6 z2&#Yn0{ji|$KaE}$L{iSP6N;5dL@{GyFleX04o0*!1KXRfuj50f#-t14pAXtG6X9B zi$L9fC-_wGPr#>v-vrgqKL$m|lXrVLt3lCm4=8>-1gafx2bKO)pxXJ(fd3afmFrWU z?d2~5PviPB@af=IQ12fHRnFbu>EH)IwdXUS=#ihmygcY!|w)lb(x*V{7C(MU_YI)h@jOuXXF=8LEuiZCG4OQoo1p0Z6L2AT&hxxJSA$Cbd{F7{0!7~sgKF33 zK*`4+f-3)MC9lV7@NBMc1H>kope-`7Fa_aDI&d~(_Q zX%)DE>*s=!TkizLSAPzQuf7YaKmH%M5InWwcnPTfxdl|ZDyVcX2>3=&?fNJvdVDe5 z|30YtJZ{|Uvlu*&>ubPEzzI<0y%|*dJ_L#$e+ugT-vPx}Cr)_3Uj|C<+zhIHqoC;Z z5-!HyMd{(N@E`|ED-DLj7A^=*TA#EUxHVHXTQkpnOi}%=e3~HeFId#Jod%TM;C+Y-y1-+zXpnKuLsrN4}vQ9 z5m0pcCU^#zyu|tIOi+BV8oUV{1Frxd0xt*u7brP={!3jByb#>U^#?%F?O(wZ-0_=^ zE$|s!-vg@LkAmXUzX8{QPrAeVZ5yciycASFy$2K@ei>Bz{t?vpUHCF=d~hcydVK+; ztCC-Ws@LqDZqI!M6hA!SkiYLra3R+b-9PuLD09 zu1|Tj%m2$km0tp{0bc}e20sm|{};T*+j}jzo9ny4b>O$aHQ>V6I-flURD0W?=<^{^ zbo>!`HF()?J73Iz8aKZSLh9rTp!ode*Lk_G0oATAgDU4I;4R>#zvJ(FHK_J~9=s6z zMZhJm_va(vrQClFco}#E+yVXzxCGpOkJIBIsCK^-OuJsQR7u z1|Rn$;4`^C0A32d0ZhR!f$FaxfGfaD-stkG42mvOpx*yJQ1AURsDA%Gcon$dcfEf$ zgG&E8Q006Pya4sQ$el)ctRP*Mp1Ro`MLrw;`(Kv%6TuS=U)Kz z-p9Vf>2M=B&h-#~`>uccI;7Kr13Z4sY05^gQz`H=z=k?%K;8(zBf~UOC ze zeji*6KJ^3MPisK&-6SafxE~Zhd>tGDlLwrx!{9P5?*;YzQ{Y+PqoB3>K`-}Qa25AA zgU4VZ#I3wXxwdA>EEo<9#f6`TcC-&ccr&&NT%=d0lP;19ut;AtQ9 z>($^hxZVqjUM~hkk2i<=4}5 zGf?B|q7VD~w}85CfU5u9p!)IM;M2fA1Xa$LLAB?npz4)Ai=iq z{-dDkz4RkKuJ?c|xqb*#Io}4yz!QGo-(Las{3W3J>mg9%^shnn+fzR3cGs1l-ggst z6W9eW2LA*UUH=IbpPv0OZ{HqJ?K%LeoL7S9fgcCeAKwHo1RwLCyg!FQ)njM4J_KIE z^@HL1TjBbokGtHt0u&wggW}KkgG&GBpz8T+f8hFQC3q3nHBkNbHc;>X5~zGX0Y&FC z|Fh!;Q1q{XE5Lg|$&bU}F!)PQ^&b91=das9(QPJNzXMFUegsrK{uaCxeBvj(pEiJ^ zR|(Yfmxb$xK&AUCsB!=6f8^uhT2S>o2#S7h1y%pgg6qIX!DoXPKJ4|p6I{ggr$F)d zcRfJ%4PBi`sC4fFQ}D~6%KZ_z7ChtAUa#HYIb7cXioS0L)n8u*#Sf49V}I|(pyXKz z+zcK9*MVOKO|E^$+q)W6zTM#U;9cO;!T$oPo&Nxy3ZC>?zdi$8#Py}&`d0ACTps{W z2VViIes2%>2zV~n{|!{XB!@l!`2jbBYF`b!7JL8{U4IOo2R`G7(`^H|itB@*>h%D4 zGWa=gG5B>b1%CmG56}J+_Y-acMejY}37~%K9c=vlFU~7GXoBL)>p8!b<13us2JQs) zyNTmOt`Bj1jC0MO6@Om{7k>u6nd5(O{2pokD>%W?|9c%b-Wbui71CXh1bsefK!gOU`3J(Y+XFt8d(Ys|?^WE}0qzdZ zZsYuAoWC4=FZfuFmvMdi2~3On&<&j`KL)`?YYcad|Ome*=6SsGr7^ej6OJfA8b@ zRUyp@0e>63k`$6#$Mahm@?9PhzYBaU$8)*g;JAnbHI=LbQ}D$clbq`}=8!zV^^F|O zaR1i=PVrphUa^n^;AtGc#-ZOu9E-Vsb4dGKu9tD%0_z;-bLjUIjyG|?%<?$%i=pFGu|Sn3Mm_@g0u8<=9NxH*n~8e!v;Fj zweaj=t~YX=5}sGV2FF5<(@66K@J5bTaQ-Oxn2?Xt?DuKT?%}@V@Z&h1!|@)DmvB6l z`&&7tLcV*!YdK!YA-SvHCpl(0&f?xM$9p;dI>*Hv`n{Xu8ty*^JY6@!Zz=a)%kf)W zzZ6{0@&7n~54autEl|II<~W=4SAkc6XX+-uZ#X1>8t~fzpG=wyIA6{2HqP}+K}5U# z_Ve$rb9{v3JiCKj052rX--qi{IR6soZH_BL8G7_TIsR2A{9es*2gjY^`R{;>xV|48 z;#kY^4_xba4aY-v##rP2AlcBq=Xe2WX2QM4bN+G8&j2q2KNs$=;ri7a z@%N9MbUB_`xVMkJU!y+2&* z*{J?0{C>pwZ*rU)?)?S$-#Gp}T>l+-A;(+7^_}2uj?ahd*HiXOINrf=HTQm(V~q2^ z4$toa_j0`^Tp#3IzY{rrk7F0dbGRqlApRDFG#kOwIX=vT7lwP^3W?4N_)hQ~o}CPK z!5@NO=6HHY&uMaMIDakY@8!zs_+B=M|2v94k3K!!g3~Y@SVUJc)Dt_BfDfU!&Dd(@uS= z)E?VcDJKgyG^VCX^>SLO)fzL!8|6y9TD&ggxoPA2?dgt2t+FOv+**(<*f!m+HtMZ4 z3(|CGba^^7G+Js^)|TsO&#%3&lIlUaacer>Xr`@Bxsh5?&+k;4)k;g*$CQ1nQ6H~P ztQG7XuhuG7jIvLc+WXRWBh|Sl>NHDwcdBH{UsnEdWxUj>wOeaBX?Le9EfvtH*SgAd zpweuo8$*h;F>ZymrYmFBaoU?&dX-dBNtJ`s5ND`Vt5R_*hLZdy6!V)i`zrNVaJ4?6 zyyME-=(MLh?ID^9vDZ4Jtx7xf2ciKF)}%L#Y}>jVLTtV^4OFQ#jTTjvQmxM|#7eOT zSs??mZ}#kC&B|1z-ddr!>{*)Y~Ftwa#PpNu@Nl&w6BAvs`JWqg^#)pGw$Q zsZGa>8J4T9=~}6q+QX?zt5uq)q++AW!D?Gsry8Fs!_J_Z6iyAeQoR|&*B5PoAsTNq~aL0OZA

cq9q0jGB8Mr;a8iY$}<7k87v(yqSOIzJ~yL2$EG@CF$7#G%KPH&ifthbn! z-wOGx!9j-1N8niDqmj2yCc99qHtD`bv%9ujwb2+!#-%@SexX_Fsaj*gDjo^W5H5`5 zn0IDh6}ho_#Ws_hOIyn{XhIF=r+RF{yfm+g=C!I+RpDnhN(V~ST4|KtWn5cLH*bWv zGgUN0!}JhB0tqd?4qYE)(ZQjaQZ*m4Q}h!uaTL)6i^JNDdfCRjQl+Dn_Dlu2UOB*k zF+$W;Ck;@>ccockBpg67)f)`m#?*A1I>ZW9Tb#Olm7+p4)XSx2ISeR~WrvqFL?x@U zuHI-T>agBur=@ngLV==Wvod4}R17bjs@6+2f>oEW#x8WoUT;LMcF}N$UdZ|ln}N6)tRXm>O7bqV^t=^8?>0K=z7oWREh`WiolNsPtqvVqgHt=rN;(eB?Y1k0k!}l`Em&WMLU0W> zL8CdGZf<)n^!{k0T5EZWAS>lDX50Ik75&S2!*qc#X?pIeW$BKJm>cr*(&=XPKxwQi z25E5JYz=#|i0P@x{y1-QvdybZZ-pFawW`H4q2k4&6SDy;L2o z)~fC9@PY-2ULGtl>SCACs7mc>N2k8Nb)B?YYfa(KF6jtvEMDD8MaOWml((5x2UEAJ z^-iU{%pOiJ30ktzEGt(l9g3Dq#_>_Engn&p-J*t;wplT)uOu0_o1h5KTcz;|)UK2n zL84!=EH6U}fTG0b2pLOLnxa3&v@Pq!<#d|V-_!vg0d=11?W3JmcR4K5O-mC}MzsVcor;I!sL5QFz)0VDW+*qb$6U`DdX-Z_9*jQY)N|VKn1z7=-D@vP{)2vK% zYGhLViVxgawhDI8i=qe3S=<^<#TXP&AFEDWrQ}zyt+^KLC>YAnL%%5ha(Ii)~^-~&!6w{l#tTOG9DP*3a;)$wk+^SYf2)9np3f)ob=wlp@mFv~hxDyP$uuBI_0$TLdH z>`37tRdbETu#GB}JdO#iwyaTKqW~~8RJQZdbgeT%=T4ROBTTc#qJ~jS$QJr-amm0jzP* zrwG|DP0}Tv(Mp*vHCs?<+l@|iWGHTh3@Uqy@r*umGUKqpx(qk#y81*RfsAJeGvGPw zV>)?iI(440T!p&>bMaPnFUmuXGG-;iBY3?OV@2diqL+#KKn_epWb(<-1ovKO$ieeNu zYUttPD5r(O?MVpt_rG(pj*v*BZ=TXlWO>FLow`4ttaMXE66z_Eb>5zIUQ-F;fymb4 zxB{bDgDqvt7}=7W7&Dj64aZWtWW^FoIn!*=NhZzGrASTuuPVwjmk3KGY8Q8w8FMn! z;%kp@+}PMW>L4LSq4x6+6VgSJ%|lXB95;nx+GEqGWAd&k_392ceHBgCWbx6Swvr1j zxF8+bv|-nd%{yGt(oWTg-iLg|l9nrc~8 z@^p)2xqAeNlv2dYl@}oVsF$0qIGDxC+va-=0h)PolX%+uQCd!yAMUQucO3Qaci2plED0O7+ z{rk$u)QC5vg|XbjAQSirsB(x%wI}3xA>hY5K^116c4&n)mW1w^8FxW@MTgYU(vl(x zm7a+f(}Aj)1|h$UGE*Rw;i?RyGnI-!OGmpk8Ur;tAmme?(6K1>=4cg91Q}PUAE+W$ zWC<}Mn^kF&7FlLW-IjGyC`vL+Owy{*Swn5{il@o>#8}Fj2fNb0d5U&=-u2tIY!ZD` zeWFuR7pf69|31+(vx$@S)6-b#nb-(sXm1vJL^8Yv)kG|jpDt<9dRm)%s1>B>D319) zAEmkeGOG90Bw63#4*Jc*GU+(1FK;dcN}S1ilT20G`x@oen*OZn3|@^A58XoM;Z@^U z0`*QC>Ta-T66#Gvk1bcEQKH5TS9896kjh~Zb7|PNTqTIex}9vmxU&HpMhd2^`6sir z>L?Foa?6Y4WyYu!;{>XTC=@w~uG5gM){~%2a-MZg zHUh?&+@BdV8|T?IoikW1?PZdtr($;t274z?jfGECgn~)GAS% z?wa|Ns#_|}1C^sBA@<#{1hOARzBOpN#X*QRD`s4ep=IPedM~;>-Be6J)*VBdL&=aa z*>tcn2AAbz#{n{lU#_&qn$>BMt6C={f#nLhcpBpz$+c1prl6p;#2I9^@f;!>*2R`6 zFRPVawN_Sr^d-k?gdFAQ!9Yartun4(0w4HW=61ba*5Cd43(eP|2Vksh@CKgufw4xO zP;zapG~vU@G#8vH&)SQrbr1wGkD~ADQ9?wMX?1Ff(Zo1F@DxeYk%ObkGt#bYm=R5_oMcJFkJK6xf&SL$>n?@m7nQCdQhYf10-{x_jZ;JAOsxX=f%A*@+Ak9Qw z1oeB|V#}={6c{ z@;vKTMYfi>2-4G`4Z$3=Vx+{WGB#&p5)QDSCr(%Nv*o&KS^`w$5 zrHYZ#GTh{}_m)5%=nDMe(m)NQ!9EQy$l`~o)vkqUdMmL?^{8aWRP|tp_0~|5=F}@( zOpg%$^;iHT z{cm8PX^mCjh;K z5sr2P6sawOe3klGB}|}L zKW;V6f$!b4_as}hxs@=*+lZsj#AxvGJIOZ9%NrGpZax;=5)wgz@yS%PrUXzZn8lVw z9-4Z(f(G%)7zH^Qnz~uAWtV%DiJRDAwUk83HjmsOH!E7Ru(YyF223Eok0*;U^Q^M; z;4(Q1g!5(lw@L>@FArt9sZSkc^-E8vtecm0%orlRrV7uKGF`fH{nqO??N~@0VVgpy z(X8qdKDn8T&ax3GXE^x2NS-?L?&eomfGkhYBWOH&mOYfsR8`+;xD@n#%`ARX9Bvcp zRRa=xL76w@e){ov-P>cHpe6@f?lBef6Wj6nRKsHvB_xc~L&)5AhxwjJv-mhj%g_QZ ze2x_p-)hVSW5CcF4ibzEQanX^yr%>u#1yreTn3Z1=#k>MH@btBy|UF}(ft%}T9-ZK{fwJ5y8WMU2RFoEW_?0|*8x zjS0d}mE2ozSTg(`xwXl5oA)%@G#iaJ5-_^h`H<6SZY^mQ(;BrD#NAu=MK~s$ewEyX z!F{Z32V|V7%NY6N%x{hoKav(zC1P!3m>^mSNKNFj$srTz$#w?*ww>E!I)q}C`6ii} z=KJ5w>ZPug=#&n@f8&`D)C@r=d)`WR_$(Tp27Yq|P3Qh44pge>Ck!uck}0ZcMh!R| z@2>TC~uDN>fKhaYcbPS7U88VOAJu#_XYoNSI06 z0y}GD#wdd9W67{QzCj*~9($w3Nb%j$K)%)|=qjh%=8ZYuNH!%q;3~7OGBapL(bpxj zMbsjXs&7>i(=wzZQl|H8@F|;oJccH@2V=@@WYbLq4GyMF7PLiq7}#DOJMqO1Q-ij4 ztX(&8Bm}U?T4f1 z$|-)l>4Mt__ls}l$(3pIqg2HPPl1^%#!IjV!oeo<1*+WKHxEWk9-J8Wa)vxB99Cm? zkkB(T^GMT)imNIW%QKtBBRIu;-rVP6|C_d5w{`uNO~x9#MmFu}5zjgAsyHPNLck)s zVh!D++3=R0F1Sa5S_L71dYC&eJ`xg4%MT}d;aVk|$Yj=b z#7t`rlw`90EUGeI3GBkkM3#MpbBHhWUn=?z%@8Dtq6X^Hcm-C$64b8m4srsQR0w8-fMq_ zAm(5flGuV)yv&rsilI)ERX5|~ePw7>gzE#Aw^myUArJMv1*OdtiTp{QKpIYVYN}Ih z3yYgdRtX@Ma+%+~8+J!!=-$_<^KO+jBoY{T#tvx0rF>}wD9_a3X7MyG5e8Qk zrPq#i!O9^Oo{U*cg^JP8P~CDez-I_kFUv&`qfkuaJb86eni@rzH1MMG#gslVn0sB+4e0D|v)w)L=w6GX0MJ z&6X3zgvdF@cF%lIH!G!}ZnJyh1FInu&S4TqAun7a2?$%55NNGV=ABCyv%VF2sW9Hg z9Ue?2icOQio_cNjYG}SWy+IdA94tnc^t8Y;iNT^w45EJhhE3`E?VC~M?s4S_y`riC z)Im1{Kf~UX*ytZZzNn(I%R_8QQlQ=*!qQA^8Hoh|=1*hca8=lrOxSuSHJf1a0;Em4 z$gGax6}J3Bb3#yt|22RtgDEvl3~JzX>cdG^o-dfHF=1wwi+@NmR<|LOC6cgLIF%W` zY_aEfN8!>04PBYgqM9bWVHI4sXu!=zle>LOrl6Q4+c+_|InS``!V(`mGZQ4VRzrIs zNzL76itz%i?HxqXn50*Lr`IEEaVrWUJ}b;V*m&`8hgGB)-8dNVr014aM{7NC&rNv6O$eyb$zRFsFc;N(UqW(B3+QSdy&gn_ zxWF1pGsM$^>^5L(0csN|@YZAy}hcS5#BA zpJPtCtW4&$Gxa10B_Fj*!WOrSbxsWumn#{Sg zVD2sA-o)k=fYA!ZIXQYBlbz+Ak|sodvhiQIM_YqXAX;8RxIzCGp(928#1j%~V+Y!i zNS$_YdVG#I@%Rm0E!&;`61lC-JZT_Prrd|khGv*SNm}kGN>aMxko$xZGMS$r*Ek$4 z1Fwzq;a1&3-0>LM^eQzlH&_dK^MH=^V4=pghAt1v2QhCFJ;^<*qH>hItyKoLU^_8C ze{Y**`FUzt<@QA&8c)mhQ`1hqWFXa$+MDIt+giFza}E7>_tvMEF7v|GbH;KRt66Tn zvQRGaC3v4oui{#XI(n~_tYN*EnX|oGwE!0jXeyS2X1_ckOL(D}mIpVRooPiMxMWs2 zhzb^`TC~d&+ZYS0W2G#yF>MG1v!W0ZP#u!u_e6<0Y3N{F9vGcAU*ceq+7j_Un@}Xa zD>k+qBfBfpB*Lf_m-G%N1=TD{jOTM?{(8uL z(aPbAR<)O5TCnR+)4Ppq^_mAn&Z_FHF-!s9@w+;c4O~>2~?fEV^eislA2oy za79>g&Ddi;42@WLNXX7s2~V*Cghyv~kVq;kmi>kRtKZkNQ+om2=)q z-pJy8xd|(4=FvFYBQwR^ZcwN}ebyti!y@iYYRhLO2Vz)aP$F`L&s%LeRkYN9#gcsG zThF~RUzoMpe7H*bsY2Qq0qseg-|S0m7P>DKa&N;8hn!kH3Ctnd>rqVBipzB?ycy=6 z?7QrLn|-OB$DazRwaD_iEj#U5-|gs)GSfXN)sn3`>PzSIuD;Sz15NU#w}#OzWKI7y zBOCiVuuxhdowTTWWbjjFcISUMvUxo|j(rO=IQPiNP4-E!MbR~5RUSP`X(J=SsN{pZ zRys051GE?jO@|!DzP0GX6yGOc%3VG9g^}Td0p)gkv1vA&8H~)F2NcTaC4t?6-e%x8&DR-<}(`XxqCvOuiJ#k*!tu zyd+aL@#~Vlq(NJlO84cseF+o-msTmwnD#0@Whq2o#dPPG9a1PFT16)0)XMJ0B}RHdVT96;I5-xb8(8(;2w1#|>dWI|@otYF z7Cu3W&rDT>_fFaeO9k=VbH9cEiLt84vIh%e5%GaD6J+sn(B|ataNu^hSL zL+$pVs;7H~_TA1udPDQ}bf}i@360O2aQlL!Q%qmqF;d8~XJ|@m$aDucLnoUzDnq52 zZr!%iG#&GVv$O$CVUyC?Gt_v{3!eTM(M;t#dQ8*;A-ZPlOR}Wuwd2?*l0v4v= z-VSYPp)7{3=}feScCylGU%Smm=POo>b|z*Cy_SYW_Tib+r)w_0=)#p3tz5a_CT8S@b~a1(7T;_uj(0<8vNM`q)0pVAX45O5 zKiX)t_N|+)mD%!vg&4z)=EPNGs!w#_v!R_8tuEirOf<3ND~b79F?uKK>!*gMYwM(Q zTEiZ>f=eeV!)T?v1f2HTf-Rf3Y|5LyYIr3Z9}ycS9KO@yq*~drf{)v)^((Yyk7x#EwqsEFb+=W}#m#lYR5runL;U7BI-tM-Fpw9J;K zyY14EJ6)E|8hf&!a%fC@UAWp`%aY>By_1Tx>UZS+v1;YW!;{R3p&NMAN%c%~;B4Bk zzh0SWr~ty4g)N~Ff?dnaKcr@BhSvU4z5uq}txYofIoYfnxgTf%pZ(~JN}7L5 zs3v5>`aXOgHNrFJJ3X?bGvbCx-HLCjs+jqAhYB)wrn_HlEA{LRRb$8mfu};|-yA9y zQi+AwL_=TpzRjUn<}o{3GP?Nb^0bleFHIgkMEnH(e)ttB4Lp3`WNWrW#C5WCXYayt+;cP*etS7DxM{9*Ye(Nt3Y@z_EOH3^ygR=PIrEsvx!tj{OQKn?BPT0NeW`} zrP*#AxgWw$S1Zk#)@&>}BRCPpp~0I;jm>sjvrgF5NM4|mnyWX|tCO&(wwK}q7+QIh zpY(1R0o(1JM81%J#m!^1@zkuw@=Ui$(mIqyrXUq2n+=9#52G;s*|YW3B*Mbq4r^qC zD2{=Y9%+;b1k%T?3TbT!4c?4KrSvje_{f-C@UxBeY9HrmC#oo|T-40nhf3x0b;76$ zzXN`oRqI;QSli`U=Nz#~+$pJlYbxaq0woN9BX=~8Jj^-M^(M6n!+QQv)ZerQtjFip zbB57;`&FqLQ&fC^+8BkKni|FpEkv9w;XE|bQJQvN*|ve3JaR{=TsJ~{XW7zb70~mO zjA|XZBPWHCrI304Ug~emvHPh8cu82On+Nw$mdv_%zP_1%Un}XbR{QXM)5hq` z-CLa{jEWMD(S_s{=cp#V`&!8%({HLYNnos0Q{!E#Gi;dPN)axV$*K#zDP(zhwwunf zF_i=`D-%>=T|;xu9#^B4*-SgL(^i*0xAE;&||@5t$8CZCzu^7ZgQ2k0%4Pm&6Zm9_-qON0#ngep&hV}ys2Qk1OX7t zr(NTvDb|nD(Xj6%J<0bm#qA5yPI;D{O{z!kNE>D9jg>~NrFdp1X*@(2UU1t?cM^s` zNTEz%X?A-#d>>8}pJOufYi11{k4)9Sv+T)5Tho;7uVfvfB3P~h;U}fjq=K5L$adZJ zQME1}b)CURSTVyC1Ep56#PZi@u9#%X)3GDgET0-2c^HFYM$!d6$E4`tLu#Z|O%F?1 zduG|f#9tS8$BL$EDcc@PQrow}!k=JQ02Eobcq7+zW4hnJMHWiC-K}>@W0-%eb2U4- zWZPt2UxLGN!E#MmN^S8KF4a)M7>R?(4K9XIpE%bRA!KNj+bDDFCO8XmB*V~0j(R=r zti_;!A<--)W{aVjxSrY-p%&n500MRINN_Gbys%n@9Q@YR&k$VQ!F;U9CD7KBnL@pQz!6K(oiM*fX z>&@N0OCs6gTDF{JMe(w59#RP6L0QZJtGlTs{W;5Py5m(@!&KL{@Y=$YS{20%35pwd zndyQ-6S)Mo2z>yvSr=q`cv)kj3yj+sN4~wChqDunGB1Z?%#Mw1ok3>K!qJj4_H}Be zhajx)F|AWS&)qp+*ZU_DY#uhggD8nW-}(o3nKdO4whbA~Qo6 zE}5oQfLe_(errgyu#QKh8&r}Tbr7M|WwS37MyP9cALllAer>lejm-uoan+-mvE=*8 zl#*2}Qp;^FtR(kV#;P{7ZKgmORZht#=u~Ct-ThNGx40jsAvVsOAt>8Hm-MC|{N@^3s6o90%-N6`~8isd{Nviel5H_c<1~j0M z;1hLF|I~zy6=3?{49{PYkatc6pr^b%A`XET{coKmGFBbi9~1s{eZU!>d z5cWIE1VK?jEicYZnQBtwy7dORU%^7>o*mG9n3{Mv9$~VWSrGNCIcxI?4kbE1*%696 zD*crvwDUMfsMNm_6+3z1W<>FhV0D{6LeQSUov<}psDtF7c|S)_CL7%n4lGVvsby}5 z!ne{-geF)au<5q#n>TH^ZPSsLjqKdL-k2opt#%_OuRPibH*n?m%*dV%AyY)YKKV9g z^iWHhZ?h(~AcM7FGRlH3MHj&sYqr->LGHR?+DZJ?dZW=JuLU2`1&@PWM{(m|F!sh( ze2PsSyq-Al1?v>Or`Q&AowLbCB13X$vEeKlf*_TO>J+zPlbp_lHHkZ68#X+gcTLn1vIv6@@Jdq66#*X|jrt>-|aA0vIfTbrrs{S0ihxHfDf7Kpe= zZmTHfZXPG47HnFL4ml(kyY>77bg(< z{0EloeWXhF6*@bLGPC}qPpxA#3Nk*&x}bxlcX3AbBnx24sq*2)S+P(j8HNRO3*wVT zWGW}@M7c{C0!Kn>-E6a&Y8lfGHdPB15CwIsPJ&FCFCUolL3 z(&fhSRxdW&Cj6i_nWb%KNA4#Y#S4iq&+sJKm3ut}4k7kI97DzV#&MdE);{5#WOv|V znk_c&C`_WHHX@AOh_}Li9-rk~GmSs1jent=mmIu3={DK21$roMHO6iN#v!|c&*|-Q zUo9v@H4MF1YO$cRF(LjBq4yArE|!xnjr@N2&@#3TKv+7h5DTg=X+0i1$o4T2CSf&S zC2x#D&%iJUi-HNI;%&HZsk9qxuvmPiI=1Op(lR>*$t7WC0Rj&;C_lb{McUe)b=ckzTWLI;=^byK1T(P4x|D3CE=8+0Ft)@nN|3b+EKScvz%DKJ zu?ZX21mo$1K!&u2kvwBi$&s8FNnk#qd9V?Wx3Hqyh;=( zlQq<5y;j5+o+aN7qwl9%^ffG2tPD=#KKN&fa5WW+z^h{fSqy1j&e;M(Wd7(>b&5b* zBkp&%TW(yKav{Ec&OW;R6)NCcUY2cw=ibGslT$;{i6~yJi88QY~ zGk+GEvd;(9Q4+CzzE4lW!Pl6}DZ=n2rocTk8!&jEG0xMYtNQYc5nZG?A*)L!7bXSC zr25Yi>}ARJWV36#;<@CXRp^Ewk~muvxK-~YdA%0NZMq{vXR)bDhdCeIEzt(zS;~!B zf$oxu!+ndqQN|HUoELN_rM^`GHp&%WhUyVq%3S{KdSed@$>ScxK)cK>4Z;WEqIT%5 z(qTTh^3Czw2M(iB+k;hWR_m?A#K!hn%Oyl-o3r``*(F(Cj@Yo=WoxcTq|pxXMepBa zdxO>yClx0X)0J|NLjl#K>TjWj1loK0rt)`-+b`BSm5aTV-YJzdYW^o{zL2YveaqH2P z3-?@jU|v(v77_gRr2hDb8pqpK49(t{5IdNfQ*DA_&slM|J-Her8`{v% z$T&p}f<8venJ%JO6CbWF+2jCgH*9bZEBKCi)=zBXz=nG>#r^ieeUt>t3rwK1Ia-C? zh1E-8Hd;-maQWsYIeJPw?won^Crdpgz%%A0Ne*E-ihDQ4zk-zsri}6g0~k6!*Mynv z(#`me&!PyNBL}sXhml~PU$!-dB$v-5f;S|(}aNyjhpO6Xd)OO zGYF=oLKq*=BzjJ0mEcb8HeO0+umIVWPcMx#n6MAuOAgZA3sY&k5M6{NSjzw-5I|?n zkB%|@i*?6?o?A=}wHl+MSHF@UW~ju=^u*Dq#vFskVpohfue%ku zRQ+h|hp?SmR>%@90}RsKz;N3u*z9@nwtC@s%MF^Nmy3JtqIq7!WCylpR7@eZn=QRk z2Wc<`+aa&rz-+UnQ9kn~RPWj^&$lsK^rD@8^%+LdGT~u!jG?Ao!Zq5pa-%(Y_&)Xy z%m-!ILQsAfdq$Mlpv|YJ-T&_90!6LHIDiK*GPHkSn3HCwO#UJWyRug%XV^dx6U;ix z%u{2EYZTutyb5O;=BRdl+f?Nz(tAinJvxe8K6wtvgKf&A$STVsXa&J-oQTT(yf~}#Te1n zP1=AE+clfZipm`SAjH5W_}ts+7k?%k+%Tk)_%MfCc`$--^bQ zgXc!GITJqn$`Uy9D+obK5sO!B*t>^zv}{(j>pgrF<6Zy8$W_tbixx;0MHt}a`CFNA z&S&_8vv=Gy9gq|Luj`L11cTTu<~&`-78*|0_}*u302YkVp2r9u>GEI>DzfFV5Df%0 zE0W0sP+{xCp6t$$azb&gm}S)f$Q>I7AD@n5Fes|R6N!e*k{?jcapv6Jh0C1Hi>z1l znIyy%q7uZ$Cx10tM_bh{bI9xa+Ck|B}J&WKuh#^P(XNkl(u z&P{eyI?5mYsW#fg>a0y+i^ODmpPOsn0y1S4%vu*&J#uDlmL4f&(^uJsiLsnaeQDkY z+8(2jf+(A}gk2&2C09pMJuDy5s1CJuUg)WvLLDV0g3PcqGq#lMG6O4k#Bx!!-oUm| zl=+UtX=&2Pf@R6Ja*PY))2#aYorPcswTafN>n>aHV0}jRe1Sz=R0ZPgDS z!rBXQHie>))w6iJ#Q(7W@VI1hMRQ}gr_g-4hVzHbk&8all_PhU*=R<4SSOj;AyHw+ z_y+CHau$W5g|z07RX)XTg8KPV&f>^`jnTnca$|#vz-fc^Q|9QXLhPNW^}6O825p}i z0@#K{kAqe;wAZ%BJ|bh7T@@ABd$W}o* zm~7a=cSI~Zi90viJu@O~mAP-cIN7p+9OM(cNfb?Ho@<^-m20}wmedf3Y{4Mbbvv2v z{&yB3U*r%$y5Q4DEQHUD<_26t9J4T3JbW*k8z~}TRB#Kpn}sIk#BS#)%BB`F_wBfA z(3{O@Y<7zqTF3Kpv%)l$9~;2viPfij`$NyL3M(-no#LE0LxpfD?B6L`U>T1+5=J)!s6NRDyTOT zL22AqvYKjF$zp2?eJ?iEp9hi`rr{eK;s&J07i_hsMEO?Smv&{|C0b#MY&c6-q>`E5 zjDVxBo67c@wCaT2Ce31Jl~jEFz+!FoDI>gmXqneB>&}Y46PpPfAc|`C0deNSvww|P zk2#C?hdt^^qAq}|*nX8TOtfIN?r4Xt)6GU9lN-Uc#K#SjWxms-ae5FGK9RRwdrz`p zf<Is?Rv*`vG+j-E-A zp2abP>Bwf5P)BM>!6et&y^D-Y2>XXM`w5N`*(tnOdt7EE5c^~WzXq1Yc+#cX>v9<@ zO?`QPx#7#HNRS8f8)Zc=v$fdI6ar*eAAlejQabj1#~pef|$ z+sVvY_O*z#ZHmy5W{@N@LQnxkZ!4ggH1-hMW-qkW#Zzv|=u7zmzZhr6@8`9j zk!@nC(iS9hpS5f=)BdOZap^P{*VZiUXxibcY(C(ZDWup*j0s}#OYJaGP~>V~`Z1N* zD%8QYv<7f-q-CNzue5J+YGv3qr@a}1VwMGc)!h?}4~ z5&Q!h+vP1-x(Gm9^APtzji1cZ$6BvipRlmKbyx8_>E0(A7Q~n0HxWp-T;BBDTwpBG zpOo}i%zXLDjIFIiEHmSXWjz2=f7ZQ2I#3g4z63$H!*79ntK3}SuzX-_h z$s&vT1i7x5z1E!IsAc=ACNpD5%ead|*iKbd+HZ?fu%+o~#oI7;Q|jtlt7498AuLN? zqA+6li)w1&6JO1oH$fJ;i(C_*#SsR3Drzaa=xDj~pZ|3<})!V?UTW-zfX*A!2??%$b^pBGO6Agm+D}*GA0;_RH)h3 z=Bw@@7VHt*Nl1CZEQwskIh(95UB-F==5G6TWc9sQi@O+zwcR^0F4p93Hv3|A&}OVX zF&E<&^ycyG!|Jj|@-5Nm-5WPzQ4Plz z@#w4yw(+dO`v+0t-zTsiYxFb25<4x5z^bTK*nng|Yn9kvq?&j)mkJz%Q=9f|&8k-$ z-{cm7Ek=PYi9<1KW#446qe^o8W)Msic4Ez~jvkiJDA@Z&VK(_2<0!J9{ksjQ!=iut z+_u+(bRpA zH5c!;BvqRx=UcbVn@Af!<=eN4%Ek4rWr&MakbhmrNVCqHG#S#97EzRc@fE)alC0=S zh3NAUK(R%|X7YyZ8|P$Tejn+j7Lr3dFR^H%b9|{Vu%UTAy!-3YTQqAv}bCUl`FSA7#$0Siq^{W-lh|fa+$DmY^{UPfyUu26A>0)U#K3lOR zIz*Sr-Yn*RgE^KozvOz1qBm#P;bX%_#*mT*{AR3EsRuQrlM=x z)gD(uh(CYz!h6GLpPR1K*5nW>pN7Y{Zeb02e+8mZDO-a%&ZF6s$C)+yQ%Ww&jtUpH z_~A9Gy8jJPb(?K^+h26YR?4eR1G<3E-0``2rp<6wdbS^Ke=%Xv>3qf5id1_@MW*JE zQeQH&o5Lqa;fsSi?uMI5+5f6RiF-HB9hfa^3#*hT=hUF*>A*U+eD?&@A+?N}Eq-^~ zU&rb2{i^%_?7KVXg)v18HEI4P#+qRDQTdk4uJsq(i3l^5EGWUdbj#K2@ zcL?6-Y^&b>O7)Z*7gHTIkuOwW1K*?9k-eI5wb{Pem+_je_K#A#+H`QREGm8g>|PTQ zUXqUtryD5FHug39Mb*Z(vqiZIkrC?MubB#b=Bh_Kdxc!F;JJ|n8OigD3aY@04zZ4W zf&oJ<3$$920b~gi3_Ny^I$JNTk6_<6*bU~nS|uAK+4jNx z@8&cA5I-N##Qb5L%{hv+%o87@xrKy{HhXvt9K2Fx#qg`GK<=chKenlY{$}(iNBxNR z<}n%Oq}H0%<4mi+M#qG)FK~tZj;lIumSn4_^X0K~*e3fzwLm3{$FL)dWRrifAftJ1 zD0z5JX}-UKGx1R#<}<3ez}gJ?C}|OL{LQ>M2}IISl$VW|!g8WH30cm`oCJ#vJ*h_@ zSuxw4X2%3JNH(_yJGE^4Blq`n@k@P=LHPph0n8h{+QGw*J z?SljuKSpNr!t_OCWs(WH)@&zkr4~ht*Tcf&#m9u-viz9Eh*9(HJaxgch}x^g)W6={ zwcVikax+c_TDHPd_Ji(!8bd3VJw)=QeTo)FPa4(MC(3MC=fbrom0M_ZpMMz_dVFA# zuyLu9jKob{)Utf1=wOWbZqZre6noEU%AV14a%cNSX9Z~QXy4(^w~r<^zc&xahn=Kz zhc0E^y9ZeK0~jm-(v~AOg~!(g7FkFNy5ISc{UQCO zNqf)7_{R!dj$lJuXkmWXmm%Aw+8hB@E#Jl=(U3(y1ohYT*rPV7)@Q=G+?lHnlm8D~ CGf7nd literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/pl.po b/utsudo-0.0.2/plugins/sudoers/po/pl.po new file mode 100644 index 0000000..e1d6f6a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/pl.po @@ -0,0 +1,2374 @@ +# Polish translation for sudo/sudoers. +# This file is put in the public domain. +# Jakub Bogusz , 2011-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-25 20:32+0200\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "błąd składni" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Hasło użytkownika %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] hasło użytkownika %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Hasło: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** informacje dotyczące BEZPIECZEŃSTWA dla %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Niestety, proszę spróbować ponownie." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "nie udało się przydzielić pamięci" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "skrót wymaga nazwy pliku" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "błędna wartość notbefore" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "błędna wartość notafter" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "wartość limitu czasu zbyt duża" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "błędna wartość limitu czasu" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" jest już zdefiniowany" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "nie udało się wykonać fork" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "nie udało się zmienić hasła dla %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "nie udało się uzyskać klasy logowania dla użytkownika %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "nie udało się rozpocząć uwierzytelnienia BSD" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "błędny rodzaj uwierzytelnienia" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "nie udało się zainicjować uwierzytelnienia BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "konto wygasło" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "zezwolenie nie powiodło się" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "nie udało się odczytać konfiguracji fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "nie udało się połączyć z serwerem uwierzytelniającym" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "utracono połączenie z serwerem uwierzytelniającym" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"błąd serwera uwierzytelniającego:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: nie udało się przekształcić nazwy principal do łańcucha ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: nie udało się przeanalizować '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: nie udało się rozwiązać pamięci podręcznej danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: nie udało się przydzielić opcji: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: nie udało się pobrać danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: nie udało się zainicjować pamięci podręcznej danych uwierzytelniających: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: nie udało się zapisać danych uwierzytelniających w pamięci podręcznej: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: nie udało się pobrać nazwy principal dla hosta: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Nie można zweryfikować TGT! Możliwy atak!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "nie udało się zainicjować PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Błąd uwierzytelniania PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "błąd kontroli poprawności konta - konto zablokowane?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Konto lub hasło wygasło, należy ustawić ponownie hasło i spróbować jeszcze raz" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "nie udało się zmienić przedawnionego hasła: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Hasło wygasło, proszę skontaktować się z administratorem systemu" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto wygasło lub w konfiguracji PAM brak sekcji \"account\" dla sudo, proszę skontaktować się z administratorem systemu" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Błąd zarządzania kontem PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nie istniejesz w bazie danych %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "nie udało się zainicjować biblioteki ACE API" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "nie udało się połączyć z serwerem SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "ID użytkownika zablokowany dla uwierzytelnienia SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "błędna długość nazwy użytkownika dla SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "błędny uchwyt uwierzytelnienia dla SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "błąd komunikacji SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "nieznany błąd SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "błędna długość hasła dla SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "nie udało się zainicjować sesji SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "błędne metody uwierzytelniania" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "W sudo wkompilowano błędne metody uwierzytelniania! Nie można mieszać samodzielnych i niesamodzielnych sposobów uwierzytelniania." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "brak metod uwierzytelniania" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "W sudo nie wkompilowano żadnych metod uwierzytelniania! Aby wyłączyć uwierzytelnianie, proszę użyć opcji konfiguracyjnej --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Nie udało się zainicjować metod uwierzytelniania." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Metody uwierzytelniania:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Nie udało się określić warunku audytowego" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "nie udało się zatwierdzić rekordu audytowego" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ufamy, że lokalny administrator udzielił odpowiedniego szkolenia.\n" +"Zwykle sprowadza się ono do tych trzech rzeczy:\n" +"\n" +" 1) należy respektować prywatność innych,\n" +" 2) należy myśleć przed pisaniem,\n" +" 3) z dużą władzą wiąże się duża odpowiedzialność.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "nieznany uid: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "nieznany użytkownik: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "zwiększenie rangi: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "początkowa ranga: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "wyrównanie rangi: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s wersja %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s, wersja gramatyki %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "nieobsługiwany format wejścia %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "nieobsługiwany format wyjścia %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: pliki wejściowy i wyjściowy muszą być różne" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "nie udało się zainicjować wartości domyślnych sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: nieznane słowo kluczowe: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "błędny typ wartości domyślnej: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "błędny typ ograniczenia: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "błędny filtr: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "nie udało się otworzyć %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "nie udało się przeanalizować pliku %s, nieznany błąd" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "błąd składni w %s w okolicy linii %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "błąd składni w %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "nie udało się zapisać do %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konwersja między formatami pliku sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcje:\n" +" -b. --base=dn podstawowe DN do zapytań LDAP z sudo\n" +" -c, --config=plik_konf ścieżka do pliku konfiguracyjnego\n" +" -d, --defaults=typy konwersja Defaults tylko określonych typów\n" +" -e, --expand-aliases rozwinięcie aliasów w trakcie konwersji\n" +" -f, --output-format=format format wyjścia: JSON, LDIF lub sudoers\n" +" -i, --input-format=format format wejścia: LDIF lub sudoers\n" +" -I, --increment=liczba liczba, o jaką ma być zwiększane każde sudoOrder\n" +" -h, --help wyświetlenie pomocy i zakończenie\n" +" -m, --match=filtr konwersja tylko wpisów pasujących do filtra\n" +" -M, --match-local filtr dopasowania używający baz passwd i group\n" +" -o, --output=plik zapis skonwertowanego sudoers do pliku wyjciowego\n" +" -O, --order-start=liczba początkowa wartość pierwszego sudoOrder\n" +" -p, --prune-matches czyszczenie nie pasujących użytkowników, grup,\n" +" hostów\n" +" -P, --padding=num bazowe wyrównanie dla kroku sudoOrder\n" +" -s, --suppress=sekcje pominięcie wyjścia z podanych sekcji\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "nie udało się pobrać czasu GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "nie udało się sformatować znacznika czasu" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "błąd wewnętrzny, przepełnienie %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "zbyt dużo wpisów sudoers, maksimum to %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "zmienna środowiskowa SUDOERS_BASE nie jest ustawiona i nie podano opcji -b." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Rodzaj komunikatu sysloga, jeśli syslog jest używany: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Priorytet komunikatu sysloga w przypadku udanego uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Priorytet komunikatu sysloga w przypadku nieudanego uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Umieszczenie zachęty OTP we własnej linii" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorowanie '.' w $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Wysyłanie listu zawsze przy uruchomieniu sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Wysyłanie listu przy błędnym uwierzytelnieniu" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Wysyłanie listu jeśli użytkownik nie jest w sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Wysyłanie listu jeśli użytkownik nie jest w sudoers dla tego hosta" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Wysyłanie listu jeśli użytkownik nie ma prawa do uruchomienia polecenia" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Wysyłanie listu jeśli użytkownik próbuje uruchomić polecenie" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Użycie osobnego znacznika czasu dla każdej pary użytkownik/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Poinstruowanie użytkownika przy pierwszym uruchomieniu sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Plik zawierający instrukcję do sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Domyślne wymaganie uwierzytelnienia przez użytkowników" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Możliwość uruchamiania sudo przez roota" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Logowanie nazwy hosta w pliku logu (niesyslogowym)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Logowanie roku w pliku logu (niesyslogowym)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Uruchomienie powłoki przy wywołaniu sudo bez argumentów" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ustawianie $HOME na katalog użytkownika docelowego przy uruchamianiu powłoki z -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ustawianie $HOME zawsze na katalog domowy użytkownika docelowego" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Zezwolenie na zbieranie niektórych informacji do przydatnych komunikatów błędów" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Wymaganie pełnych nazw hostów w pliku sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Lżenie użytkownika po podaniu błędnego hasła" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Możliwość uruchamiania sudo tylko z poziomu terminala" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Honorowanie zmiennej środowiskowej EDITOR przez visudo" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Pytanie o hasło roota zamiast hasła użytkownika" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pytanie o hasło użytkownika runas_default zamiast uruchamiającego" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pytanie o hasło użytkownika docelowego zamiast uruchamiającego" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Użycie ustawień domyślnych z klasy logowania użytkownika docelowego (jeśli są)" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Ustawianie zmiennych środowiskowych LOGNAME i USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Ustawianie na użytkownika docelowego tylko efektywnego uid-a, nie rzeczywistego uid-a" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Pomijanie inicjalizacji wektora grup na grupy użytkownika docelowego" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Długość, na której zawijać linie logu (0 bez zawijania): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Limit czasu znacznika uwierzytelniania (w minutach): %.1f" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Limit czasu pytania o hasło (w minutach): %.1f" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Liczba prób wpisania hasła: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Wartość umask lub 0777, aby użyć wartości użytkownika: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Ścieżka do pliku logu: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Ścieżka do programu mail: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flagi dla programu mail: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adres, na który mają być wysyłane listy: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adres, z którego mają być wysyłane listy: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Temat wysyłanych listów: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Komunikat o błędnym haśle: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Ścieżka katalogu stanu instrukcji: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Ścieżka katalogu znaczników czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Właściciel katalogu znaczników czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Grupa, której użytkownicy są zwolnieni z wymagań dot. haseł i PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Domyślne pytanie o hasło: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Czy passprompt ma być używane zamiast systemowego zapytania we wszystkich przypadkach" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Domyślny użytkownik do uruchamiania poleceń: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Wartość do podstawienia za $PATH użytkownika: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Ścieżka do edytora, który ma być używany przez visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kiedy ma być wymagane hasło dla pseudopolecenia 'list': %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kiedy ma być wymagane hasło dla pseudopolecenia 'verify': %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Wczytanie pustych funkcji exec zawartych w bibliotece sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Jeśli istnieje katalog LDAP, czy ignorować lokalny plik sudoers" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Deskryptory plików >= %d będą zamykane przed uruchomieniem polecenia" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Czy użytkownicy mogą zmieniać wartość `closefrom' opcją -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Zezwolenie użytkownikom na ustawianie dowolnych zmiennych środowiskowych" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Wyczyszczenie środowiska do domyślnego zbioru zmiennych" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Zmienne środowiskowe do sprawdzania poprawności:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Zmienne środowiskowe do usunięcia:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Zmienne środowiskowe do zachowania:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Rola SELinuksa do używania w nowym kontekście bezpieczeństwa: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Typ SELinuksa do używania w nowym kontekście bezpieczeństwa: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Ścieżka do pliku środowiska specyficznego dla sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Ścieżka do pliku ograniczonego środowiska specyficznego dla sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokalizacja, jak ma być używana przy analizie pliku sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Zezwolenie sudo na pytanie o hasło nawet gdyby miało być widoczne" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Uwidocznienie wprowadzania hasła przez użytkownika w miarę wpisywania" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Użycie szybszych masek (glob) - mniej dokładnych, ale nie odwołujących się do systemu plików" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Wartość umask podana w sudoers ma zastąpić wartość użytkownika, nawet jeśli pozwala na więcej" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Logowanie wejścia użytkownika dla uruchamianych poleceń" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Logowanie wyjścia z uruchamianych poleceń" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Kompresja logów we/wy przy użyciu zliba" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Uruchamianie poleceń zawsze na pseudoterminalu" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Wtyczka do obsługi grup nieuniksowych: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Katalog do zapisu logów wejścia/wyjścia: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Plik do zapisu logu wejścia/wyjścia: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodawanie wpisu do pliku utmp/utmpx przy przydzielaniu pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Ustawianie użytkownika w utmp jako docelowego, nie wywołującego" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Zbiór dozwolonych uprawnień: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Zbiór ograniczonych uprawnień: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Uruchomienie poleceń na pseudoterminalu w tle" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nazwa usługi PAM do użycia: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nazwa usługi PAM do użycia dla powłok logowania: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Próba ustanowienia danych uwierzytelniających PAM dla użytkownika docelowego" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Utworzenie nowej sesji PAM dla uruchamianego polecenia" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Wykonanie zarządzania poprawnością konta PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Maksymalny numer sekwencji logu we/wy: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Włączenie obsługi grup sieciowych w sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Sprawdzanie katalogów nadrzędnych pod kątem możliwości zapisu przy edycji plików programem sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Podążanie za dowiązaniami symbolicznymi przy edycji programem sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Odpytanie wtyczki group pod kątem nieznanych grup systemowych" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Dopasowanie grup sieciowych w oparciu o całą krotkę: użytkownik, host i domena" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do logu audytowego" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do logu we/wy" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Zezwolenie na uruchamianie poleceń nawet jeśli sudo nie może pisać do pliku logu" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Rozwiązanie grup z sudoers i dopasowywanie po ID grupy zamiast nazwy" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Wpisy logu większe niż ta wartość będą dzielone na wiele wiadomości sysloga: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Użytkownik, który będzie właścicielem plików logu we/wy: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupa, która będzie właścicielem plików logu we/wy: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Uprawnienia dla plików logu we/wy: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Uruchomienie poleceń poprzez deskryptor pliku zamiast ścieżki: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignorowanie nieznanych wpisów Defaults w sudoers zamiast ostrzeżenia" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Czas w sekundach, po którym polecenie będzie kończone: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Zezwolenie użytkownikowi na określenie limitu czasu z linii poleceń" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Natychmiastowy zrzut danych logu we/wy na dysk zamiast buforowania" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Dołączanie identyfikatora procesu przy logowaniu przez syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Rodzaj rekordu znacznika czasu uwierzytelniania: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Komunikat błędu uwierzytelnienia: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw użytkownika" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorowanie wielkości liter przy dopasowywaniu nazw grup" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Logowanie kiedy polecenie jest dozwolone przez sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Logowanie kiedy polecenie jest zabronione przez sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d: nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: nieznany wpis domyślny \"%s\"" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d: nie podano wartości dla \"%s\"" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nie podano wartości dla \"%s\"" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d: wartości \"%s\" muszą zaczynać się od '/'" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: wartości \"%s\" muszą zaczynać się od '/'" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d: opcja \"%s\" nie przyjmuje wartości" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opcja \"%s\" nie przyjmuje wartości" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d: błędny typ Defaults 0x%x dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: błędny typ Defaults 0x%x dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d: błędna wartość \"%s\" dla opcji \"%s\"" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: błędna wartość \"%s\" dla opcji \"%s\"" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: uszkodzone envp, niezgodność długości" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "nie udało się przebudować środowiska" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "niestety nie jest dozwolone ustawianie następujących zmiennych środowiskowych: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "błąd składni w %s w okolicy linii %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "błąd składni w %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "nieobsługiwany typ skrótu %d dla %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: błąd odczytu" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "właścicielem %s musi być uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "prawo zapisu do %s może mieć tylko właściciel" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie udało się załadować %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "nie udało się odnaleźć symbolu \"group_plugin\" w %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: niezgodna główna wersja wtyczki grup %d, oczekiwano %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "nie udało się przeanalizować adresu IP \"%s\"" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "nie udało się przeanalizować maski sieciowej \"%s\"" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pary lokalnych adresów IP i masek:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s istnieje, ale nie jest katalogiem (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "nie udało się wykonać mkdir %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "nie udało się zmienić uprawnień %s na 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "nieznana grupa: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "nie udało się odczytać %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "nie udało się utworzyć %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "nie udało się zapisać do pliku logu we/wy: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: błąd wewnętrzny, plik logu we/wy dla zdarzenia %d nie jest otwarty" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: błąd wewnętrzny, błędny sygnał %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: błędny plik logu" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: brak pola znacznika czasu" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: znacznik czasu %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: brak pola z użytkownikiem" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: brak pola z użytkownikiem runas" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: brak pola z grupą runas" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "brak obsługi starttls w przypadku użycia ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "nie udało się zainicjować bazy certyfikatów i kluczy SSL: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "aby używać SSL, trzeba ustawić TLS_CERT w %s" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "nie udało się zainicjować LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "wybrano start_tls, ale biblioteki LDAP nie obsługują ldap_start_tls_s() ani ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "błędny atrybut sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port zbyt duży" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nieobsługiwany rodzaj URI LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "nie można mieszać URI ldap i ldaps" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "nie można skonwertować sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "nie udało się otworzyć systemu audytowego" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "nie udało się wysłać komunikatu audytowego" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kontynuacja polecenia) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "nie udało się otworzyć pliku logu: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "nie udało się zablokować pliku logu: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "nie udało się zapisać pliku logu: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Brak użytkownika lub hosta" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "błąd kontroli poprawności" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "użytkownik NIE występuje w sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "użytkownik NIE jest autoryzowany na hoście" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "polecenie niedozwolone" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s nie występuje w pliku sudoers. Ten incydent zostanie zgłoszony.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nie ma uprawnień do uruchamiania sudo na %s. Ten incydent zostanie zgłoszony.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Niestety użytkownik %s nie może uruchamiać sudo na %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Niestety użytkownik %s nie ma uprawnień do uruchamiania '%s%s%s' jako %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: nie znaleziono polecenia" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"zignorowano plik \"%s\" znaleziony w '.'\n" +"Proszę użyć \"sudo ./%s\", jeśli to \"%s\" ma być uruchomiony." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "błąd uwierzytelniania" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "wymagane jest hasło" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u błędna próba wprowadzenia hasła" +msgstr[1] "%u błędne próby wprowadzenia hasła" +msgstr[2] "%u błędnych prób wprowadzenia hasła" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "nie udało się wykonać dup na stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "nie udało się wywołać %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "nie udało się wykonać fork: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "nie udało się otworzyć potoku: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "skrót dla %s (%s) nie jest w postaci %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "nie udało się wykonać stat na %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Rola LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Wpis sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " Jako użytkownicy: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " Jako grupy: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opcje: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Polecenia:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Pasujące wpisy Defaults dla %s na %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Wartości specyficzne dla Runas i Command dla %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Użytkownik %s może uruchamiać na %s następujące polecenia:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Użytkownik %s nie ma uprawnień do uruchamiania sudo na %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "zignorowano niekompletne sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "błędny atrybut LDIF: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "błędna wartość %.*s ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "nie udało się przeanalizować listy adresów sieciowych" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nazwa użytkownika nie ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID użytkownika nie ustawiony przez frontend sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID grupy nie ustawiony przez frontend sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "nazwa hosta nie ustawiona przez frontend sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "nie udało się wywołać %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Wersja wtyczki polityki sudoers %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Wersja gramatyki pliku sudoers %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Ścieżka do sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "ścieżka do nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ścieżka do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ścieżka do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "nie udało się zarejestrować uchwytu typu %d (wersja %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "nie udało się zapamiętać uid-a %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "nie udało się zapamiętać uid-a %u, już istnieje" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "nie udało się zapamiętać użytkownika %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "nie udało się zapamiętać użytkownika %s, już istnieje" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "nie udało się zapamiętać gid-a %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "nie udało się zapamiętać gid-a %u, już istnieje" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "nie udało się zapamiętać grupy %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "nie udało się zapamiętać grupy %s, już istnieje" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "nie udało się zapamiętać listy grup dla %s, już istnieje" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "nie udało się zapamiętać listy grup dla %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "nie udało się przeanalizować grup dla %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "nie udało się przeanalizować gidów dla %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "przepełnienie stosu uprawnień" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "niedopełnienie stosu uprawnień" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "nie udało się zmienić na gid roota" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "nie udało się zmienić na docelowy gid" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "nie udało się ustawić wektora grup docelowych" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "nie udało się zmienić na docelowy uid" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "nie udało się zmienić na gid sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "zbyt dużo procesów" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "nie udało się pobrać bieżącego katalogu roboczego" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "ucięta ścieżka audytu user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "ucięta ścieżka audytu argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "komunikat audit_failure zbyt długi" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "nie udało się zainicjować źródła SSS. Czy SSSD jest zainstalowany na tej maszynie?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nie udało się odnaleźć symbolu \"%s\" w %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problem z wpisami domyślnymi" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "nie znaleziono poprawnych źródeł sudoers, zakończenie" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "wg sudoers root nie ma prawa używać sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "brak uprawnień do używania opcji -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "właściciel znacznika czasu (%s): nie ma takiego użytkownika" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "brak tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "niestety do uruchomienia sudo konieczny jest tty" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "polecenie w bieżącym katalogu" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "niestety brak uprawnień do ustawienia limitu czasu polecenia" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "niestety brak uprawnień do zachowania środowiska" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "polecenie zbyt długie" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie jest zwykłym plikiem" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "właścicielem %s jest uid %u, powinien być %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s jest zapisywalny dla świata" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "właścicielem %s jest gid %u, powinien być %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "tylko root może używać \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "nieznana klasa logowania: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "nie udało się rozwiązać nazwy hosta %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "błędna opcja filtra: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "błędny maksymalny czas oczekiwania: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "błędny współczynnik szybkości: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/czas: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/czas: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/czas: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Odtwarzanie sesji sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "nie udało się dodać zdarzenia do kolejki" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "nie udało się przestawić tty w tryb surowy" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Uwaga: ten terminal jest za mały, aby właściwie odtworzyć log.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometria logu to %d x %d, geometria terminala to %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Odtwarzanie zakończone, proszę nacisnąć dowolny klawisz, aby odzyskać terminal." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "błędna linia pliku czasu: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "niejednoznaczne wyrażenie \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "niesparowany ')' w wyrażeniu" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "nieznany warunek wyszukiwania \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s wymaga argumentu" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "błędne wyrażenie regularne: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "nie udało się przeanalizować daty \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "niesparowany '(' w wyrażeniu" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "niedozwolone kończące \"or\"" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "niedozwolony kończący \"!\"" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "nieznany typ wyszukiwania %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "Składnia: %s [-hnRS] [-d katalog] [-m liczba] [-s wsp_szybkości] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "Składnia: %s [-h] [-d katalog] -l [wyrażenie wyszukiwania]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - odtwarzanie logów sesji sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opcje:\n" +" -d, --directory=kat podanie katalogu na logi sesji\n" +" -f, --filter=filtr określenie rodzaju we/wy do wyświetlania\n" +" -h, --help wyświetlenie opisu i zakończenie\n" +" -l, --list lista dostępnych ID sesji pasujących do wyrażenia\n" +" -m, --max-wait=ile maksymalna liczba sekund oczekiwania między zdarzeniami\n" +" -n, --non-interactive bez zapytań, wysłanie sesji na standardowe wyjście\n" +" -R, --no-resize bez próby zmiany rozmiaru terminala\n" +" -S, --suspend-wait oczekiwanie w czasie zawieszenia polecenia\n" +" -s, --speed=ile przyspieszenie lub spowolnienie wyjścia\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\thost nie znaleziony" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Polecenie dozwolone" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Polecenie niedozwolone" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Polecenie nie znalezione" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s jest zapisywalny dla groupy" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "nie udało się uciąć pliku znacznika czasu do długości %lld" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "nie udało się odczytać zegara" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "znacznik czasu zbyt daleko w przyszłości" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "znacznik czasu zbyt daleko w przyszłości: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "nie udało się zablokować pliku znacznika czasu %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "ścieżka stanu instrukcji zbyt długa: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "opcja -x będzie usunięta w kolejnej wersji" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "należy rozważyć użycie zamiast niej narzędzia cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "wciśnięcie return przejdzie do edycji %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "podany edytor (%s) nie istnieje" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nie znaleziono edytora (ścieżka = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "błąd zapisu" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "nie udało się wykonać stat na pliku tymczasowym (%s), %s nie zmieniony" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "plik tymczasowy (%s) zerowej długości, %s nie zmieniony" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "błąd edytora (%s), %s nie zmieniony" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s nie zmieniony" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "nie udało się ponownie otworzyć pliku tymczasowego (%s), %s nie zmieniony." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "nie udało się przeanalizować pliku tymczasowego (%s), nieznany błąd" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "błąd wewnętrzny, nie znaleziono %s na liście!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "nie udało się ustawić (uid, gid) %s na (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s i %s nie są na tym samym systemie plików, użycie mv do zmiany nazwy" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "polecenie nie powiodło się: '%s %s %s', %s nie zmieniony" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "błąd podczas zmiany nazwy %s, %s nie zmieniony" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Co teraz? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Możliwe opcje:\n" +" (e) ponowna edycja pliku sudoers\n" +" (x) wyjście bez zapisu zmian do pliku sudoers\n" +" (Q) wyjście i zapisanie zmian w pliku sudoers (NIEBEZPIECZNE!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "nie udało się uruchomić %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: błędny właściciel, (uid, gid) powinny wynosić (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: błędne uprawnienia, powinny być 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: składnia poprawna\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s zajęty, proszę spróbować później" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "nie udało się zablokować %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Modyfikować mimo to? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Błąd: %s:%d: cykl w %s \"%s\"" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Uwaga: %s:%d: cykl w %s \"%s\"" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Błąd: %s:%d: %s \"%s\" użyty, ale nie zdefiniowany" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Uwaga: %s:%d: %s \"%s\" użyty, ale nie zdefiniowany" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Uwaga: %s:%d: nie użyty %s \"%s\"" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bezpieczna edycja pliku sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opcje:\n" +" -c, --check tryb wyłącznie sprawdzający\n" +" -f, --file=sudoers określenie położenia pliku sudoers\n" +" -h, --help wyświetlenie opisu i zakończenie\n" +" -q, --quiet mniej obszerne komunikaty o błędach składni\n" +" -s, --strict ścisłe sprawdzanie składni\n" +" -V, --version wyświetlenie informacji o wersji i zakończenie\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "za dużo poziomów include" diff --git a/utsudo-0.0.2/plugins/sudoers/po/pt.mo b/utsudo-0.0.2/plugins/sudoers/po/pt.mo new file mode 100644 index 0000000000000000000000000000000000000000..c8367401db1821e8b0f09daa0baf5723f2518e7d GIT binary patch literal 49337 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 aKe9h#H_66)aUfG*3=-R>rhRl*@_zuRn3lHy literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/pt.po b/utsudo-0.0.2/plugins/sudoers/po/pt.po new file mode 100644 index 0000000..9f88940 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/pt.po @@ -0,0 +1,2387 @@ +# Portuguese (Portugal) translation for the sudoers package. +# Copyright (C) 2018 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2018 +# Pedro Albuquerque , 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-25 06:30+0100\n" +"Last-Translator: Pedro Albuquerque \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "erro de sintaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "senha de %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] senha para %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Senha: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informação de SEGURANÇA para %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Enganou-se, tente de novo." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "impossível alocar memória" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "um resumo requer um nome de caminho" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "valor notbefore inválido" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "valor notafter inválido" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "valor de inacção muito grande" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "valor de inacção inválido" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Aliás \"%s\" já definido" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "impossível bifurcar" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "impossível alterar a senha para %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "impossível obter classe de sessão para o utilizador %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "impossível iniciar autenticação bsd" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "tipo de autenticação inválido" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "impossível inicializar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "a sua conta expirou" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "aprovação falhou" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "impossível ler fwtk config" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "impossível ligar ao servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "ligação ao servidor de autenticação perdida" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erro no servidor de autenticação:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: impossível converter principal para cadeia (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: impossível analisar \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: impossível resolver cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: impossível alocar opções: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: impossível obter credentiais: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: impossível inicializar a cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: impossível armazenar a credencial em cache: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: impossível obter o principal do anfitrião: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Impossível verificar TGT! Possível ataque!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "impossível inicializar PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "erro de autenticação PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "falha na validação de conta, tem a conta trancada?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Conta ou senha expiradas, reponha a sua senha e tente novamente" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "impossível alterar senha expirada: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Senha expirada, contacte o administrador do sistema" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Conta expirada ou configuração PAM sem secção \"account\" para sudo, contacte o administrador do sistema" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Erro de gestão de conta PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "utilizador não existente na base de dados %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "falha ao inicializar a biblioteca ACE API" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "impossível contactar o servidor SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "ID de utilizador bloqueada para autenticação SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "tamanho de nome de utilizador inválido para SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "gestão de autenticação inválida para SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "falha na comunicação SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "erro SecurID desconhecido" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "tamanho de senha inválido para SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "impossível inicializar sessão SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "métodos de autenticação inválidos" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Métodos de autenticação inválidos compilados com sudo! Não pode misturar autenticação independente com outra." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "sem métodos de autenticação" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Não há métodos de autenticação compilados com sudo! Se pretende desligar a autenticação. use a opção de configuração --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Impossível inicializar métodos de autenticaçao." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Métodos de autenticação:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Impossível determinar condição de auditoria" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "impossível submeter registo de auditoria" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Acreditamos que recebeu a lição de moral do administrador de\n" +"sistema local. Normalmente resume-se a estes três pontos:\n" +"\n" +" 1) respeite a privacidade dos outros;\n" +" 2) pense antes de escrever;\n" +" 3) lembre-se que com grande poder vem grande responsabilidade.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconhecida: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "utilizador desconhecido: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "incremento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordem inicial: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "espaço de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versão %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s versão gramatical %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "formato de entrada %s não suportado" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "formato de saída %s não suportado" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: os ficheiros de entrada e saída têm de ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "impossível inicializar valores predefinidos de sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: palavra-chave desconhecida: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo de predefinições inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo de supressão inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "impossível abrir %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "falha ao analisar o ficheiro %s, erro desconhecido" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erro de análise em %s, perto da linha %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "erro de análise em %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "impossível escrever em %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - converte entre formatos de ficheiros sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -b, --base=dn o DN base para consultas sudo LDAP\n" +" -c, --config=fich_conf o caminho para o ficheiro de configuração\n" +" -d, --defaults=tipopred só converte predefinições do tipo especificado\n" +" -e, --expand-alias expande aliás ao converter\n" +" -f, --output-format=formato define o formato de saída: JSON, LDIF ou sudoers\n" +" -i, --input-format=formato define o formato de entrada: LDIF ou sudoers\n" +" -I, --increment=número valor a incrementar cada sudoOrder\n" +" -h, --help mostra a ajuda e sai\n" +" -m, --match=filtro só converte entradas que cumpram o filtro\n" +" -M, --match-local filtro de comparação usa bases de dados de senha e grupo\n" +" -o, --output=fich_saída escreve sudoers convertidos em fich_saída\n" +" -O, --order-start=número ponto inicial para o primeiro sudoOrder\n" +" -p, --prune-matches poda utilizadores, grupos e anfitriões não-correspondentes\n" +" -P, --padding=num espaço base para incremento sudoOrder\n" +" -s, --suppress=secções suprime saída de certas secções\n" +" -V, --version mostra informação da versão e sai" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada de predefinições \"%s\" desconhecida" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "impossível obter hora GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "impossível formatar datação" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, transporte %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "demasiadas entradas sudoers, máximo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "a variável de ambiente SUDOERS_BASE não está definida e a opção -b não foi especificada." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Facilidade syslog se syslog estiver a ser usado para início de sessão: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioridade syslog a usar quando o utilizador se autentica com sucesso: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioridade syslog a usar quando o utilizador não se autentica com sucesso: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Põe o prompt OPT na sua própria linha" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignora \".\" em $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Envia sempre correio quando executa sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Envia correio se a autenticação do utilizador falhar" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correio se o utilizador não estiver em sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia correio se o utilizador não estiver em sudoers neste anfitrião" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correio se o utilizador não puder executar um comando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correio se o utilizador tentar executar um comando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa uma datação separada para cada par utilizador/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Avisar o utilizador a primeira vez que executa sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Ficheiro com a lição de moral sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Requer autenticação dos utilizadores por predefinição" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root pode executar sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Regista o nome de anfitrião no diário (não-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Regista o ano no diário (não-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo for chamado sem argumentos, iniciar uma shel" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Definir $HOME para o utilizador alvo ao iniciar uma shell com -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Definir $HOME sempre como a pasta home do utilizador alvo" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite a recolha de alguma informação para dar mensagens de erro úteis" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Requer nomes de anfitrião completamente qualificados no ficheiro sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta o utilizador quando se engana na senha" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permitir ao utilizador a execução de sudo só se tiver tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo honra a variável de ambiente EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Pedir senha root, não a do utilizador" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pedir a senha de utilizador runas_default, não a do utilizador" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pedir a senha do utilizador alvo, não a do utilizador" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica predefinições à classe de sessão do utilizador alvo, se existir" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Define as variáveis de ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Definir a uid efectiva só para o utilizador alvo, não a uid real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Não inicializar o vector de grupo para o do utilizador alvo" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Tamanho máximo de linhas longas do diário (0 para não quebrar): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Expiração da datação de autenticação: %.1f minutos" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Expiração do pedido de senha: %.1f minutos" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Número de tentativas de inserção de senha: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a usar ou 0777 para usar a do utilizador: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Caminho para o ficheiro de diário: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Caminho para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Bandeiras para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Endereço para onde enviar o correio: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Endereço de onde enviar o correio: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Linha de assunto para as mensagens: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensagem de senha incorrecta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Caminho para a pasta de estado da lição de moral: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Caminho para a pasta de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Dono da pasta de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Utilizadores deste grupo estão dispensados de usar senhas e necessidades de PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pedido de senha predefinido: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se definido, o pedido de senha sobrepõe-se ao prompt do sistema em qualquer caso." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Utilizador predefinido para executar comandos: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor a sobrepor a $PATH: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Caminho para o editor a usar com visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando pedir uma senha para o pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando pedir uma senha para o pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Pré-carregar as funções dummy exec contidas na biblioteca sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Se a pasta LDAP está em cima, ignoramos o ficheiro sudoers" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Descritores de ficheiro >= %d será fechado antes de executar um comando" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Se definido, os utilizadores podem sobrepor o valor de \"closefrom\" com a opção -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite aos utilizadores definir variáveis de ambiente arbitrárias" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Repor o ambiente num conjunto predefinido de variáveis" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Variáveis de ambiente para verificar a sanidade:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variáveis de ambiente para remover:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variáveis de ambiente para preservar:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Papel SELinux a usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipo SELinux a usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Caminho para o ficheiro de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Caminho para o ficheiro restrito de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Idioma a usar ao analisar sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite ao sudo pedir uma senha mesmo que fique visível" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornece resposta visual no pedido de senha quando há entrada do utilizador" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa globbing mais rápido e menos preciso, mas não acede ao sistema de ficheiros" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "A umask especificada no sudoers sobrepõe-se à do utilizador, mesmo que seja mais permissiva" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Regista as entradas do utilizador para o comando em execução" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Regista a saída do comando em execução" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprime diários de E/S com zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Executa sempre os comandos num pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Extensão para suporte de grupo não-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Pasta onde armazenar os diários de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Ficheiro onde armazenar o diário de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Adiciona uma entrada ao ficheiro utmp/utmpx ao alocar um pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Define o utilizador em utmp como utilizador runas mestre, não como utilizador chamador" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conjunto de privilégios permitidos: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conjunto de privilégios limite: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos num pty em 2º plano" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome de serviço PAM a usar: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome de serviço PAM a usar para shells de sessão: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta estabelecer credenciais PAM para o utilizador alvo" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Cria uma nova sessão PAM onde o comando será executado" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Realizar gestão de validação de conta PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Número de sequência máximo do diário de E/S: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Activa o suporte a sudoers netgroup" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Verifica se as pastas-mãe se podem escrever ao editar ficheiros com sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue ligações simbólicas ao editar ficheiros com sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta a extensão de grupo para grupos de sistema desconhecidos" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Compara netgroups baseado em todo o conjunto: utilizador, anfitrião e domínio" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário de auditoria" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário de E/S" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite executar comandos mesmo que o sudo não possa escrever no diário" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resolve grupos no sudoers e compara a ID de grupo, não o nome" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Entradas de diário maiores que este valor serão divididas em múltiplas mensagens de syslog: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Utilizador que será dono dos ficheiros de E/S: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo que será dono dos ficheiros de E/S: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modo de ficheiro a usar para os ficheiros de E/S: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos por descritor de ficheiro em vez de por caminho: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora entradas Defaults desconhecidas no sudoers, em vez de produzir um aviso" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo em segundos após o qual cada comando será terminado: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite ao utilizador especificar um tempo de inacção na linha de comandos" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Despejar dados de E/S para o disco imediatamente, em vez de usar um buffer" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Incluir a ID de processo ao registar via syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de registo de datação de autenticação: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensagem de falha na autenticação: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignorar maiúsculas ao comparar nomes de utilizadores" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignorar maiúsculas ao comparar nomes de grupos" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Registar um comando permitido por sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Registar um comando negado por sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d entrada defaults desconhecida \"%s\"" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s entrada defaults desconhecida \"%s\"" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d sem valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s sem valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d valores para \"%s\" têm de começar com \"/\"" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s valores para \"%s\" têm de começar com \"/\"" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d opção \"%s\" não recebe valores" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s opção \"%s\" não recebe valores" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d tipo Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s tipo Defaults 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrompido, tamanho trocado" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "impossível reconstruir o ambiente" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "desculpe, não tem permissão para definir as seguintes variáveis de ambiente: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erro de análise em %s perto da linha %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "erro de análise em %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo de resumo %d não suportado para %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: erro de leitura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s tem de ser propriedade de uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s só pode ter permissão de escrita para o dono" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossível carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "impossível encontrar o símbolo \"group_plugin\" em %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versão principal de extensão de grupo %d incompatível, esperada %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "impossível analisar endereço IP \"%s\"" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "impossível analisar netmask \"%s\"" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pares endereço IP local e netmask:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe mas não é uma pasta (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "impossível criar pasta %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "impossível alterar o modo de %s para 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "grupo desconhecido: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "impossível ler %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "impossível criar %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "impossível escrever no ficheiro de E/S: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erro interno, ficheiro de diário E/S do evento %d não aberto" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erro interno, sinal inválido %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ficheiro de diário inválido" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: campo de datação em falta" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: datação %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: campo de utilizador em falta" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: campo de utilizador runas em falta" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: campo de grupo runas em falta" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls não suportado quando usa ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "impossível inicializar certificado SSL e db de chave: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "tem de definir TLS_CERT em %s para usar SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "impossível inicializar LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls especificado mas LDAP libs não suporta ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributo sudoOrder inválido: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: porta muito grande" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipo de uri LDAP não suportado: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "impossível misturar URIs ldap e ldaps" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "impossível converter sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "impossível abrir o sistema de auditoria" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "impossível enviar mensagem de auditoria" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuado) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "impossível abrir o diário: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "impossível bloquear o diário: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "impossível escrever o diário: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Sem utilizador ou anfitrião" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "falha de validação" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "utilizador NÃO está no sudores" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "utilizador NÃO autorizado no anfitrião" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "comando não permitido" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s não está no ficheiro sudoers. O incidente será reportado.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s não tem permissão para executar sudo em %s. O incidente será reportado.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Desculpe, %s não pode executar sudo em %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Desculpe, %s não tem permissão para executar \"%s%s%s\" como %s%s%s em %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando não encontrado" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"a ignorar \"%s\" encontrado em \".\"\n" +"Use \"sudo ./%s\" se este é o \"%s\" que deseja executar." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "falha de autenticação" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "é necessária uma senha" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativa incorrecta" +msgstr[1] "%u tentativas incorrectas" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "impossível duplicar stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "impossível executar %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "impossível bifurcar: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "impossível abrir túnel: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "resumo para %s (%s) não está na forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "impossível obter informações de %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Papel LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entrada sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAsUsers: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAsGroups: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opções: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entradas Defaults correspondentes para %s em %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Predefinições Runas específicas de comandos para %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "O utilizador %s pode executar os seguintes comandos em %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "O utilizador %s não tem permissão para executar sudo em %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "a ignorar sudoRole incompleto: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atributo LDIF inválido: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s inválido definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "impossível analisar a lista de endereços da rede" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nome de utilizador não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID de utilizador não definida pelo front-end do sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID de grupo não definida pelo front-end do sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "Nome de anfitrião não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "impossível executar %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Extensão de política sudoers versão %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Gramática do ficheiro sudoers versão %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Caminho do sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "caminho nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "caminho do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "caminho do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "impossível registar hook do tipo %d (versão %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "impossível guardar uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "impossível guardar uid %u, já existe" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "impossível guardar utilizador %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "impossível guardar utilizador %s, já existe" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "impossível guardar gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "impossível guardar gid %u, já existe" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "impossível guardar grupo %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "impossível guardar grupo %s, já existe" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "impossível guardar lista de grupo para %s, já existe" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "impossível guardar lista de grupos para %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "impossível analisar grupos para %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "impossível analisar gids para %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "transporte de pilha perm" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "importe de pilha perm" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "impossível mudar para gid root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "impossível mudar para gid runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "impossível definir vector de grupo runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "impossível mudar para uid runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "impossível mudar para gid sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "demasiados processos" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "impossível obter a pasta de trabalho actual" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "caminho de auditoria truncado user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "caminho de auditoria truncado argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "mensagem audit_failure muito longa" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "impossível inicializar fonte SSS. Tem o SSSD instalado?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossível encontrar símbolo \"%s\" em %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problema com entradas defaults" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "sme fontes sudoers válidas, a sair" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que root não tem permissão para sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "não tem permissão para usar a opção -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "dono da datação (%s): utilizador inexistente" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "sem tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "desculpe, tem de ter um tty para executar sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "comando na pasta actual" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "desculpe, não tem permissão para definir um tempo de inacção" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "desculpe, não tem permissão para preservar o ambiente" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "comando muito longo" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um ficheiro normal" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s é propriedade de uid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s é escrito universalmente" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s é propriedade de gid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "só root pode usar \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de sessão desconhecida: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "impossível resolver o anfitrião %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opção de filtro inválida: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera máxima inválida: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "factor de velocidade inválido: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/temporização: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/temporização: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/temporização: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "A reproduzir sessão sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "impossível adicionar evento à fila" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "impossível definir tty para modo raw" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Aviso: o seu terminal é muito pequeno para reproduzir correctamente o diário.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "A geometria do diário é %d x %d, o seu terminal é %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodução terminada, prima qualquer tecla para restaurar o terminal." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linha de ficheiro de temporização inválida : %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressão ambígua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "\")\" sem par em expressão" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termo de procura \"%s\" desconhecido" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s requer um argumento" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressão regular inválida: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "impossível analisar a data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "\"(\" sem par em expressão" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "\"or\" final ilegal" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "\"!\" final ilegal" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "tipo de procura %d desconhecido" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d pasta] [-m núm] [-s núm] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d pasta] -l [expressão de procura]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz os diários de sessão sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -d, --directory=pasta especifica a pasta para diários de sessão\n" +" -f, --filter=filtro especifica os tipos de E/S a mostrar\n" +" -h, --help mostra a ajuda e sai\n" +" -l, --list lista as IDs de sessão disponíveis, com expressão opcional\n" +" -m, --max-wait=número número máximo de segundos a aguardar entre eventos\n" +" -n, --non-interactive sem prompts, a sessão é enviada para a saída padrão\n" +" -R, --no-resize não tenta redimensionar o terminal\n" +" -S, --suspend-wait espera enquanto o comando foi suspenso\n" +" -s, --speed=número acelera ou trava a saída\n" +" -V, --version mostra informação da versão e sai" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\thost sem correspondência" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando permitido" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negado" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando sem correspondência" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s é escrito pelo grupo" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "impossível truncar o ficheiro de datação para %lld bytes" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "impossível ler o relógio" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "a ignorar datação do futuro" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "datação demasiado no futuro: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "impossível bloquear ficheiro de datação %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "caminho do estado da lição de moral muito longo: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "a opção -x será removida numa futura versão" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "por favor, considere usar antes o utilitário cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "prima Enter para editar %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "o editor especificado (%s) não existe" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "sem editor (caminho do editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "erro de escrita" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "impossível obter informação do ficheiro temporário (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "ficheiro temporário de tamanho zero (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "falha no editor (%s), %s inalterado" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s inalterado" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "impossível reabrir o ficheiro temporário (%s), %s inalterado." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "impossível analisar o ficheiro temporário (%s), erro desconhecido" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erro interno, impossível encontrar %s na lista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "impossível definir (uid, gid) de %s para (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s em sistemas de ficheiros diferentes, a usar mv para renomear" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "falha no comando: \"%s %s %s\", %s inalterado" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erro ao renomear %s, %s inalterado" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "E agora?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"As opções são:\n" +" (e) editar o ficheiro sudoers de novo\n" +" (x) sair sem gravar as alterações ao ficheiro sudoers\n" +" (Q) sair e gravar as alterações ao ficheiro sudoers (PERIGO!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "impossível executar %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: dono errrado (uid, gid), deveria ser (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permissões erradas, devia ser modo 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: análise com sucesso\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ocupado, tente mais tarde" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "impossível bloquear %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Editar mesmo assim ? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Erro: %s:%d ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Aviso: %s:%d ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Erro: %s:%d %s \"%s\" referenciado mas não definido" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Aviso: %s:%d %s \"%s\" referenciado mas não definido" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Aviso: %s:%d não usado %s \"%s\"" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - editar com segurança o ficheiro sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -c, --check modo só de verificação\n" +" -f, --file=sudoers especifica a localização do ficheiro sudoers\n" +" -h, --help mostra a ajuda e sai\n" +" -q, --quiet mensagens de erro de sintaxe menos verbosas (silêncio)\n" +" -s, --strict verificação de sintaxe estrita\n" +" -V, --version mostra informação da versão e sai\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "demasiados níveis de includes" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "a ignorar valor de atributo inválido: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "impossível guardar utilizador %s, sem memória" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "impossível guardar grupo %s, sem memória" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "impossível guardar lista de grupo para %s, sem memória" diff --git a/utsudo-0.0.2/plugins/sudoers/po/pt_BR.mo b/utsudo-0.0.2/plugins/sudoers/po/pt_BR.mo new file mode 100644 index 0000000000000000000000000000000000000000..2cab23d27fe94fe457e70d4d4d73732f773ea0db GIT binary patch literal 51032 zcmcJ&34mQkb>@EwW)pb9VB-bjtF{}pY;|j~@giHcWvM00)@HS2V~i2EyI;4S_4>W$ zEiJVP*nrvhU_yYf7!zy^W-}zgYzdtSB!q-86B1xD15Cm?fxu*A!i4|tJE!X2`(D46 zWM=-)zWVM`Rk!NYsk2qx>i>4~ac@reedrNM@>K9O$0y0gUrUl-oT0n?&P|e&fJX#8 z89b5ebHJ0q3&Qml@Pgx#uT1U( zp9uagsP}yld@T5NQ1$u_sQ3O7JRdx9BuUN&F9Xj3Zw4;~ZwF5UKM6h^{3>`V_;c{d z;7P0f`5?H3>np&kz?Xt5=Z^#a5LEgT)+C8YaSpf~yaId*_+0P_;9>9t@TH*Yc^7yR z_)+k9@bloK!LNWy_t&86|6LFgB`2>C+c532mT1AYWdx&9oebl(E?p5y|*J{26`@*?m;@Fr00dmTs@CLaMIb@ErB z+Vw~hod>3%>VF-mau0!`_glcz!HbWr6#_ zE5P@FSAyRLNs=swc_2}86R7vS22?#i0@8%!tDw?9W_^;7CD{s!es_RR0q+6T&QF2c zz#oF5+l6$h%DWy^`5jR8yf57UBap65z7MLsXYkL-;EkZ@dn+iqzY5g*J^`lS-+-`a z@^et_U%4SkcxAE`RR6sgyb8P*RJ!kjqVH)m{tR$4C_3!tA4r>(g9(Gi4vyLW-2!&||pfnNma(&T&K^T4y{6usy5pz8Zc zQ1$&MQ2cN@owNts2vX(bE>L{naV!|iY|LVjiVQUdj3A}D)7(4{S!Ak{VxGe zfkrK^GJkGnvcl6(PtE%=yGf8U$Ilv%8kdiN7-xbbpy+WeI0(KFTn4@u zRDC`Ss{MZhJ{kO1@HFrVTmAVU2ume9LDB0KpxX6&pvwC;$Sae_T;u(=0~9^xLG{<~ zfh0+O4C*}>L41v`eW3XHWuW@`v!Lkzb#Mqg@mjCl%Wd?VXk?%oWle_srWUY`Na2EPufy*~%lo}nH7{wa_y zOAdo7_tW42_;+9mK4zzn$01PdyB1Wxy%V2;U zRlg5_>Yx7tJ_-COcoO)ieO}I~;JI9{0aI`vsQh!F^8Y6IbntVa=>A>s9Pn`v6%r=H zpz^-})cyB>PX_-OJO%tFsDAz_C^{a0qnC3DC_3H@iXUGJsvYkJmHu;}+WF0Z{|uhY z^@-2)@&~|ExxN^D3b+&0`=>ya^D6K(@cp3L^LbEo_ztLg{W4sia+Bv<2Z}y7fO>vw zxPJ#II=mM=9sDvVI(!d&G`Q?p{``rc>bD+Lx*eeEH4Un~+rcM-Zw8g_UQqRX2vq&P z4(k0s2SvZ*Z+87M0IIwjLGi=$K=J46!Hd8@02#u`zk=$gjnDS>902)0c@6)FPCo#} zpUEv=-yu-^em%Gjd?EM*@S~vk_p{(W@E<|-)0XFWduBnk{}tew;0Hjp=L?|t;2U5H z{t{HWbidPm6R37P7u5aRK-KFVpz8f`@HFt7py>Ti;BxS+=X!mv1eN}Ipwhnr6n#Go zs$E|IB_DqRs{B(jug4|eQ@OqgJPVu)co%p!*B=YlUj@aV{|KrbXO25w1*%^vpx!qR zs(;=Hs=n_7Q}A=3@_!3F0et*~)8!2C46cVk)&Ck$_1zDuzAq2g4}hxQUxBLc{{mC+ zq)G3mwcsYMp94y6y$2Lu{W&PU`a4kl@h{+V@Z^f)g`oQ922km$pwc}*;9Eeo>p@WT z_)@t4BT)5u%#_z>5ImRbtHBGwX;9_;HmLS}2oyd31l0S#1B$PXoA!Rc7?j+(9#s3r zLDB1WFa_@i^}a8GD)$GV`261kt~%iPZUNQq+rV?cH-Hy_9}oAx52}6t0jiucs@}d; zpz607R6pDTo(Q%<)$2}B`Q9AxqoC^ZWl-(;QMiBntzM6n;A-w~0aedAQ2Fl##V-q> z>i5^6^8Y)iemLtOyaBEO&jT+9m2Mh*I{0c(_52t(41Njxw?`lsK+)}IGhWV#b+7*b zsQ0b|)sCIuL&w2i;OoeDMhhGLk;uWexBG!ZUj83}PvrUEf+vvgCx;#X0~FnkpLae# z8+PP|qI%cY|L8 zH-amk@A9S^@J*o7eFl6Q_;pZp`ZrMhc=oS5JuU*(j%}dc^Gs0m=zyy4%fLs2cY#Xx zcJONOe()mjA3(k5+!y#by9#^;*LQ-~fe(S=|3|;j_4WDSQ@Nf1)&4s`_2Ye@-uq{u z_~38BOTeFkmx1Tq?&Dz!RR7-*@B^UQ|20r@`LsK{UZbG${W>@V{ywPkz71Xqp7A1= zBYVLCu5SZX&v$_0&(DJ+;Lkvf+vP9zd^dnAxqbsU2tEX=9p3`guaA9+^Ywc0Dy|QL zs_zFuNR|9GcsaQDPOsk^LB03Op!(-$pybNwFLk?pE%;2X?*ye+{uUHnFL;@^`*!eZ zuKzGxANO)^?-o$?Z-8p=JHajB--PS4U*Yw>2~_{R2o!zZ0p0+94Ll1Rex>)@b)e|^ z5>V+s2deyUf+}~}tNi)(;OShy7JNE*FR1qZdANT3tG&JJK*^sQ!KZ?+21mjBK=tE~ z!R_FguW`Hd0H}7{2d)6W13n8}_FAuB1yp(O0IvuC5|o{F&g=ZT1?u^K0;Pw34yrvT zyx#5FYe9{tSAt6S4e)F|e}lhw1cVin1EA>iJ@6VZeWUYB6;%Jf6}$!f5~zMz`5XS8 z8mMyb14qFB3T_4;|0ch`8(hQnouKIX2~g$z0$dG_+~stC4!DZz+rTTpd%;cMcfn7A z=e^negzti)|MK7T@qZ0?G1t@J0QfFY_4_<1dOqqc=qzv;yb^o{sPr9hIrspm^8NxG z2LA$H2b_hrmnU=H-op+qr%Z zn1Vk6)lVnA-Sy&ja6Q+zgW{Kmz^8!8Z-?;@s{Bz<>E^*p!H23x^ zhu4D_fnNnL1|RoMfA2<6?S26$I=vTEfBYGE3-}B0Ebv+Hf|tR=;3eQ!K=t3_-tFlx z1J&;b!Rx@cfokV>!DoRN+>MO~z7C{{$xpz`!PmUU%li{h^!>Gayj>TAdfo(|4SqP> zf5Lmc{#(Iy+`k=EyFLbP1%Cjl{%e27`7Hxg?r(r<#}~k}!M_JZr$@cd^}udW?RpL< zy1oTG75plA4)_D`H1PO)o!(Ceb^ToMWN;pQI`|q;{qoITzcmNy%-vFwdPlo&70#|bV*!MfV*MS;Glc4m_n?d!{m%u@A<^9eFyFk6~dEisQ z*MjGQ_k-&HzW~)=kNJSp?;=p?XF!$nN-zaK3_cC~3Mjh$1XR6G{GgY6E~tDP!}TrT z`CQ)yrr`U)<=_{>^$!9rd%*Sm`Jmpn1yn!Qz|+BdK$ZI$Q2qCHQ2chnhrHaYKwW3x zGVo2H#>G29^~+a5)%QoB%6a^Uy&Wq+_3IW;@3{q3eGh>v!FxdE`!Xnc{R4Ovc=AX5 zyd&{+yN^8?}82Ro8T$nbszKl8Mun;mw{^cgWy%*55W_` z^B?qfUj{yh>sfFO_!pr1Bl)*Fw}WcW`#`ntE8uGI7vKQ6>J!eF zyFl^X3&0D(_krhu-vm{!NB^$p+W>CjdInVbkAh174R9Dd@%MaOYykD1L*NK_FR1dq z2C80<_{(e?J4fp6ffo z_2Ab)z5j`y@qV}vRJ*SSF9GiWMW0WCs>k=hGr`Aw*4s4*>iIrU^?6CS|0z)Q{Shd7 zpYl0x_Z8r!TsOgMzz>3_gZ~U#Km38$X9K8w&jl|BUkR#Re+)hi{4uD0I{ptszk%w{ zL!j#aK~U+x3GM$lOt?34e=d4&f} zQ2DRn{3edCaQ-ZCFR0&kj^ns~DaXe-*Zf)e_ow0F&%od2_#Ye}B+b{rX^!6C8@ch@ zp^UeOhwtS237mf^T&o}N=6Dsy&p5VlJU8TFxY+Nx{QKWH9?ku)+8unTfNJo`oIeJ9 z567c9e**Z+@Ej5)ui#q0Z*ttjxoADf@c@T@FXEp1|9-o|J_sndnP;B@pBe7`I;gSr zE{+z@Zr~6PKcC|~&h`60953MfZ|n*`lk*e8Gx6z794`*nO7dfly!ud-^%g(92yVXIL_d{eoy6i z66eb~uI2nUICgM8#WBkf#Lw0IQDV8CEV9o)^ERq{rjK8`B~rvqahm`BfU~=} zFZMp3ME795W%`o53v{ujY`v)$cPLw{e`wy%CQ0asF2v7jWqJUXH7| z|7+lBx)FXu+;<3yaRrpV>Dd90DKe2^GS0k+80NT; z;{&AAuN`nJ_=jBI8m{$hT>q4Q|H%1^IL-<8{tNhDIsQCce-}KT;~nApPVh#KFNW(k zQTFW|cXM3Hz2D-P;QSlm`CZ_CuGfd_!<_4P9LEPa_HjI$d$JAUZ&^sQ89a^S!#w!) zaPM0o(U}3?1D?gRnhuYzN{5HXvsPupWIgTrwGUKMJxDk2Os5*nwAGnxq*m1P zI+bR%(o*&bWuIu&r>fH%1pB9|wTcy^?6X<>K-zAkI`>4KW~O(iN~Zji%0F3|$~v`n zYXc|k`PoWK1vKild1acbG~4OskRokNSz)c&%0zXF_NJCzB~?^XXuyN@>9u3KcCLaD+qR^E zDwU?uqN-A=^~Hr)DfS>Qq)+y3o_(TOnW@y<8|s}Iqa*)hGmTEYEkai7JXW7nvWWxM zBfFZDm1a6VuVx%j2?r{**_biM$!cr1md&U3aHi5~Wz&^ZY*aa1Z7b`HvKo_ZpljL` z8Gl{6 zor&X&nhllYq~G8WdFxQK+BSX?Yrq0xOu9hyDJ4{Gc3Bys&~U4rHA_UbOL{+@ZB!wx z_!ef<@hUGqNcoWCFTm)jDkF$yC4% zDgc7DH2S)JkvHPQYTY?q2_uVi%M2g%2PzW>y9!E?P!k7-jbUaQlQzC>WNEN(h`r=l zd;rhqeWxU;I7aPKeV5|pSlcBz`FU#S^Ey=qZr85{;ZoW--eC9)S%Q^mYrfvj4yTo7 z69x$5!g|c<4YN;l7t``vA)hrk$dIK794mYz^7hDN7mC#;-PdT&Zt(6)yp@vISJvL!Un%6}0T2-p5^s^h; zTvn}Re0m}HUG&4rR9Ez#lVCXhxX4}*uR;b$I)a9!b6{4X& znKdWFfD&2ucv-_#vU;1VH`<9htT)oD_&Ni!a*~GjUq``HwHR8$EtxWfl?;vb~Y^zw6WjKV#7pzQg6hBU*Tia-a zL-5!{191@U(CxF>OV#met=gU+S+*?E%Y!9GUFC`v2wo0qD)|c+=laAoV z;3ch8bPOj$yv?jSn7Uo9cPf)B?cwZ-pd}m4N#$y#!_jidIX=o&lb|lSTh!3fHY=v} zl_ckO6BOZjE1Rl7?aCx0Nc1b08TwO9+p=ClL13<{`ER5762$fa5h(!$HL z4H*|B@ujLKt>~rFu@}JTWN3`fr_)tP+ClsrXmo1asc;qQny2Y3o#s%ZNv?A1XEX{a zraSkf%CtwOka-^Ss1izRz0s_o3Sn?meVR3=J2E(wvs0fqkkzO0D7eV`0PkV2wR&)5 zUHPAOm0>*X?9Bbv>h2p|S0R-k9+bE~-IUcuVO~_7nosv`-Mc*9-9RHqaUfu`iG$1Y ztmD~aIxFdF8bg9Sr=-k|6b@1~*J}*hs8Y#On9yp=di6C507FA%J1@=FI@5ISOm-{6 zG;b_w7{!Eaq2C5$UaWhwilS2hqXjZU;mPXMRHf+@)QjMFG=Q5It4!@O`h4)n;xuJN z(LTIT4xxVC*{bz9To=sT>a+^WYvOlv&q(qtU2}Nwu$cv}TGN5S)<7uKlgIblO_U*b zJB;Mqol>>(Or=7Q#k5m|Y-b1Q63=L*%x29N6xwy26CD|fTOotWo?<+s&z#ISY_KlF z&AP5WT}mM18N&2=4*Qr+o|#RZXDnCgZr@zIRo#p7kfV%Q$?ynXFU439MUv=cqCSuV zvk;klvh)yZLn{VbD^}*bS7e&Tz{DAo)Tm}PQfY>xKTq7A454U6mC~SxWD(E2kQulH2UT#?L?O6ywR!q^MjT76p@5_ ziez1~C!N<+f_NaZwK%TCXx3m$*)m49do;go(M9oQlG0LR%8h=BAZodk``GGW%DiTq)?P(n3$whp|ghD;uTL*@QJaMH4k>B ze~T3D^xSK9?HCn(RDGgTQWvTbHva+9Gq;J8jkB{@>ABblW@vX7dPFk32Gv9?k)JMU z(Rx~2c&HVm=s1q~0UxD>{xYif)Fj#1;ST!E!!qdE)24QC}g4 zBsU&ZF}Jej5U{GL7z=k6U%0nhMYcYFqi!!56&VxtO4|!lbP-30 z=Y7V6-eDmy>!nskZRXc6omAaYY0g!Skc8NG!xG4T6#3Sp=>~%kZC1>4KQV={WUG69zrWXAzAi9cCsO*E^sB3HFeNCL|ha`80AIg%|>45px< zwZs`@w(%Sy8`i~^s3@zIUa>(|ee@+KYJ?o+=)pil?yWMeUjiTaTNZb{Ue??F#S6{X zp$A~BeDDUI_kpoqo=~!-mQDLGGR*~N%Cq)jY8?bY%%kYLdXx~+!L&Lv!)Rh0Ab858 z>BzxRtTc1>bGsm=bNHD zpel@Jg7WCbLy%^=E`oYUDRQoICuGDRSY_ieC>4JdzFiYXKUx{#8I(uuqiz}LBY9@m z4l~S}z>=O#)pQ#THhHe~t0G$~TmrJGrPZLl?{N~d9 zP&1pA)#Z{$R!A!yT4N&@me5mqnVn?2O`C1ojS1|Arwm!-@l3|BoXwb|BH(C=%)O;9 zdIwTUzM<$Iy3j_@cHS3zm$=w8#AM)Uyup^v$x%u%L5Nl`V$IMS)me)4?u+_fnn(46 z^C}o9GOj5FL3fycR=N4@N;Rut#Pmr73CS(W$uAaDiqCaDWTZE4S(#HQPaU*hP-Rj7 zj#t!NSyi#r`3kYWqn4=dqkj2>tW}_Yq3#ky#i8cPKVaTnN+J;2-o7}Y&&QY3?a&;4 zu3CwJGNe&BP5^odBOq;ep!<5`uvH#BQ1?$Zklppf3Q(IDja+lcWb8?0E+gUL>J0P8 zQKYsA@>S{+l`w%~{kYRK2flaH-jnRi=T^cLZzGOA6QjY$? z#wSzFni4>vU=~{zd1&hC3L3;GV-)0MXzFIkmR;phCT?Pf)lw2AyF7A(+^lHL!cb+U z446QEA5Ruz=2>Ov@Jcxfg!5(lx3W3W%R`xN>QhHq{n8UE>-v=)Glqz-slrR7Oouja z+_`mh&vN1jyA(Q&W>t^yDa>4SmW@C;!@>7O^3<7kH^0IHWJQ85LF3W0{Gn{7s`^gD zrKIm`X7QWiaGOxC>XXCkExiS*p1hx8Xlb}Az_>zLguzR z%=bi^#m7Nfh8B3?i>#RVR%0$01BTXckYHqx;wjSOT_q?Xrl`&2G63~_I7C1v;Q7MP z6^|^+c`V5*O=>V>&O_{b(^bCqrC@_(w+Eh8UkSi{b#zjf;q9+)R%#7wQ&oJjGc$u; z#E49%h|&8pfMB4~m>~RA$^G?)CByHLTbt~*c~7HFv(acH0i%mu3^|SF){0g+tx-!s z-2Icj2*-re!^vG5+(*kcC*w?A#>k&yesi4ok+i5P5o;U61kp-BY9g0S4w*<#b~EsI z?cE*IAr!03H_6O2-~W16FU?ztPU#T*H=YSW%@BmL=dEOq&!XXJ;5S#$bnai`K&6U) z!tmlInWCy@)PN%)UsTC)0?vALkI%Z$g|*r|s}(S0Y&BCKo7PA{tNS& z!A1~gK!GgU4@b^bQ2bca1-B3G7vC(AE7#^nsEQ4q5;IwhmtYTsgH4tSRJplt9*meg zI5F>zanYA4=)0zn0gon}K+F;z%I5(uJ>7-Qv!$J<64;;@&_cUx!g|TC@*P2%1 z8XTHdXF|T9iM3xPe+N&nr-Z%gS95-fS;}Ilz-@T$T@JdcwF1|=6gQ@gGm_77)_AUx zP%Jkx4msrA_E!jE_IDwPEojBdp)9Nz>NHt(Gd0yyhE_$mK45ukwWSd9aL-#%+Dwti zpY#c&kz}u?I@PwYxG9^G_ZvJ&$Pj&$=&}V>!}x*Lon)_OfEiUi?;gK)`kgH7Mljrj=Z825YZ$V9OX!yC*B_Q7(XLDo#SGGj#IKrWdbk(BDY67S0>raIKrfX z7ga2#^x681MZ*o;51YQhbg}u4{XKIzMrDFt(>#Wzi{^ZKZ^LC!BY3LI23tv#O)6LN z2+gR$h;C&19sQdxCyEJ?bByh-`JVZ_l#;s5?}-nrhDgazj4!Ox^ee5 zRJnUxMMAHrY5;Z64Z+W_HzhXuhmkL;sO<6(Tapy0w}-Jb6I(`N0f42`SU6l2wj~p` z-bu|Sn7j;WlMa~GF|yj0UuaGU%J9DikYzBXrinofoKAft$;KLTfd&my^`oZKfE{)7svC6pcx`1$cT5vKF_ZB;xbJ?2`@FqBW~1BaaKjLVCtb zP>6ZXp2u=R@@Kh!qq|PhPm+zxY5-S;IV zC$xaB=F#hZM2HJ43nA0>Mocs*NLF+B^j+ReG2brxRHZ)!<5vvwJQh(xyrpPfcXhcd zX3~f<L`n07snaz&K`Z7tZY|9e6huzhLS>og$cSFEG#HUPfM=_*)45oz1 zJr;sB>UBjmRr^Keq|3@=Njp82NI~1<$eM}{`Rw{`isep5~=qU@L#hMq4As7}v zdR2;f(ALa&QfKi*RpI8MF}4g;ksqxqG4pg_c!I(Q5{yC^jbZMe9;szUOurw#PRZ}O zEOQ}gVl`QGXW8Og#J!2lD*&SvjEiz~JtjNLJ0(qs{^aAobdRAK6eTI$aVUI3 z37Oo_k82!`l!4dA`EaXlDeicbYMSC+~}z69@6=~Y}SQAh8$k~OUNGjq0Is}|s50Zqkn(Cn8dWC<@6)AHbE zvoovc1DDJy2T{S|REu_5VjE*&b*z*nHl_`sU{;hu0;)q&{+=jNCk-Et%LAj+=1Uwb zQkxO~vk67wyJBO@F}82>uF*YX`>)?C|&QrFU5&GBl8nmnW*=Wbqei?Mg#1gg&d ziJ7`DNiD1dxFW2$X6!K^hDIzsBxGl+glAZRLa@AeGG5Wbs_|CuL~|*Lt(*<(`j@!9 zis+Fq0rbxw7ALb+5reHI9~@%|_R*Caz)KWWN^#UO{X2w31^Mlx=cXr+tBbSy{UhbK zZx7_k*rL+tzFDUiUE`B=gm$o5;5Up#dRA**7A1)Vm|@plBYzVaZCtZ@cyVq$q)7bq zBRPhGGuD;Sz15NU# zyN1y%WKI9oW1D+AuvA(powTTWr2kW9c9(uQwrwLmj(rQ$Klj+!cKamQqUf5jnjAku zX=7u-sN{pZRysCD1GE?jO@|!DzP0GX4BsbU%3az2g^}Td0p)gkxoI|=8H~(=2NcTa zCV}07-e%=YF>{bk?tUfVr5=8>J3dT(Ua-_? zd$vRc?b&SAyt?wpaoe}Fz{f%t1sVJ~!XnOjmEISgNmnfSG_DouTPzR7-}&MqDT7k^ ze86he))%b}TMTVvRji~t2r|-@iMi=6%1hIwQ-|6IWtbD>?oBLF#p=0<@;Gi*#yeHw zI(k+zXuGmbQ(Fexfkp$rfEb1X-h-3r5TY%7BRDcRxw0#ZPik8Hq`QiQeYLS*mnJ-&v&C?LZjO?9Tb47}L?HaFh zZYiFH#d73|54GEes-E6FeBc)T(Hok#q{FrJ=Fs?}3AZduI_32BJ!7RTHxJKf4VmuX zX6R(wW@V@})1ABanxF&qd==7jn0+M zJ!LQ5=KXA*8Lp&c_nGpgx=I?HSF_G#a!3q8vA88kqBQ;)8lqtD_Obn&M)&M>+eECc zLeaBI#(LH8P1FHQ#$duGw^f=rp&nT4J0f^l5hUN;Y-mz=c-!Rg4KCZ(N9v_(M=lvz zcWHBC?J^do;NA}JXrU~IukK8@hWE14=|H>9N9U_ok9VeTBlMb$i0mVWTFZ9t8s1aU zmouz1+KgMZK3%tF?WMzO*9@<_kO{!`7pxs#vu@3rW!ssN8{XT@>Mg$6Rvd3nHkDOs z=@z2Vl{)K`E9vD;yEQd+6)To!DkF{N^cCc*Pj_Io;k^|tFu%H)@%}2Yrrp%CGu_cg z{Fm1zXUChvgo3Sfs&bW7P;0~kSupK%WdtQvl!g!A-hcI;WjnU*7%hmgc4Q4(A*nu8 z)gq@_>#>^8-K+J>w2F_3f%b-dd$$ZTSP>CFY@swYq2(wK20;kDFPzn;>3Y)2K5Rp|HIN^p$DFHh&^MjbPQ+ z&+RG!2ki%Cx9Wu0%h&y~@6KlF#%OBVrXvgYE_{MD8LWgHUV0~}hPHsRt)P(TigMX{ zZJ67{81)f{sfY>fbKxp~L)N4nbB+DFWH%>*j)ZFum{Q2N43All6l?@2O=a$}a)@M> zc7hz6={v#a*E$8xU5hQrirIwNw)j!?poA+O|;4SciR~GU^yg zZmKa$ZVJ_4>ks>mPu?UlmQN;_`p6a@n9RC&hw8*JtKyd09g5QW6sK@Vrt*BFsIHQF zH;P(#DBmfHm1IoaO=eWcx+;(967zv1a1}k}ad#caa28KM7wsQaw+1}junL0 zY)DwQX+tW_#Cbv$(SLgy72$jrJ~s{})3>tm)i`55?MLO0Omw;2S-c??ks+%*c}*se z_6|>YJ@}{tQ=}3cUsST^bxT_my z%cc<}nciT-Dt&@kHlBsdryRayBeQ1tJ95UgHclycBJlzLZIjlx&RT- z)f>H<#Km{~rZMhcRiY_H@U*?~APfviS?t4ijaDP#7(oZbuEAipjjUX_lnT+RSrm!n zzOs(49`iA!Dp!vn+q_9fkZMcsW|d*?mg`9~B*_*Yn5$G76SD*&rJiLDo6JHSLEI&N zEQDYbvvg;60yBuV(1>7%i_gPMt2(D=L##M@HH>9dVlogihp&;*EjGZR3RFg=F;j!S zmiXmDJ7c*{tZVo#+8Rq1gU!D?t20a}&AKC9c)z*iQXr;Q^0Cd_U^Dbr|2?uy9?43} zXwal&jLc885gjKZhIXrkV=hprZ+U~P40Ez6eN#8R2B{EjZtiG0VovHzSz4w)TqyZA zS&>ALKC>-tFgdXCHDlbV(lDkd8tnKZJxTd4sFofE$216%WuvaMHUAP7hW5_d6bv6R z20|1uCSQyPyU~N48G6nY<6L86;eMzzQ5ml=!Kl??e524QBp@AxtTqvp?~X8u7N-#{ z1x64vCagx%tFsms5X5d{{@7dCm`u7{WW!WyF5KUOl&nj{^fM04chb_{8G7Q6Nhw~RV^F6fe*yZHe#XF z!o8XAxMgmq4I4U3f&gwJAT>jYp_3tas1GcU0VI*b?pro8S+#^emNiws#zcqliCob5 z(>m8VX9+!nrQsOOwgsDkAbX{DEPy6Tx283+``?ADBO}7 zyFI9j^a^W(7aPe(dpk4vGdMP`$W=S7{yu|%d=QBw(6mR_C{<-N_!eC-d!@N>H?+q) zrFp(XS5C0IMX&h2K<8sBLA9ZN(npk_T`LG`vUkiRf|ETU^j3v~XjpH`I2*P&Wfyg{ z!ZoYepj0VJEg9JLQY&gQf2?;FWyF}01jHn>U6BD!f1}TSy(h{Yn3VsAu>yZ;&O}5 zddJNW-fY_@Fy3vvsEgVNfhm|=J>Q)%`bG~UFFOsoh+}Z`c6Iuo_hMe1o+N!LU|rWe z0HE50texns#8Uet&4UlpzF{9SBXQh`Or$P$BI{E^W8CD4ZR&!LSuGl|Wa8pgaB_@2 z63l_W2^ zH#du8IGC?iAKJm{$2v|V28r<#8^L9B&1{%xBBHwdIInxo9FgVv@ud$PwONLAKDweQ zT^>00UQ5sD&Bqt-o{FoVA4w(%!ziqoPff(1|{ zxx);@fEOz>hoHAg#ZW@gl-&cfMR6#C^~e@TdO0uk7KU0}h9zM^P5D%Mks2raq}y`b zI7#pd|IKO>`;91G)F7oT)pXZ|AH1rK)JC;vlL(M`>lXggG_QuL)O^*y(Jm4h_b-)f zW3jc`t*8O3xx(SQEikS)p}C0)IkDcZP#$~-=B6|qECbUC%px_ZHVgG}GLxJ0sOSIJ zMcNEAb7a~7lY&dOt}E}n)LZ$B0nj$9v8Ai|lIG3?XVPfP4c08vayjJ$cuRq%g@@V% zH1e|ON~0D+neJDy&Wz%boSrOUl<;G(H?~l%y8V}zpb0XMSCYn8CQ2>B8Ln^bBT;Q} zpcTUM%knPFi%{%17NP;jilI!lMYAgBgY}r?(MK@GvA&s`0;E|h8FRlmSP%to(9vSe zV*9q3P;42wl9;ubmPPcmS#$U2%H5Aw>H9xD(HQ3M%LdqeG z3W$c=f+EwVK7-wxN&A&ErP>jFy;qaHwAFq3aj37Zq^HY@Pcp>EQBFGYQh^=bm$F$tQuWY`EOf#=E>Gb?^P_2{Pc12gf#I!~3jVck{HD;j1rxO{A^66&^V`nF z&Pm(?PQ!$v*#9jT+{Gx}B;QZ$F87%(@PJr}utC&F(iFUbj;v{fPs%!nGA>U;ZyROz z#qkhXz#2~%=N@pBVU~Pz5ie!TTjX*IwH=HOIb{szINY3PMis=czmkBH%%>vNnYek}H5SH!6^Z>b)e9rg{;+`@wY45< z((nDpsuot#AREDR7N>&6gV(4%<-`i>m&$BZ3k&J9=8=>6%4-sh5=<94`hD0~wTMX` z7RfbBInP9u#Y-NXaQ|o2os&YeSR_OiBOgsWd839z=*(4a6TvMF2Bc<1t#dXyTZio!Z^Ny^(wx|V|6)yA^QT0CGpK=)-r}JI15$@ zK5HMg+7aeiVj~%NRNo~Jua3i&Mu##`tp0uRuHYC&F-1I0A*Y}L3cFx4&CR%+MrtCB ztVvzP#R7=PPcX^myVrTVOFb269@}FvgmK%<4l&Ns1nC_%uY;+_7al}7i(*HSH(M3x zvMEi`8Y4t;BO~<^?Hz0-qr@-Nvm`7Aw9lgFGYL#TAO>u7Qw#gRj$v2WSYbFpN+zbL zJxS4p2pYv0W_v^qe|>}HoZ~oD!Mafuqb(@HxOnG9Y%oWJx4XP306d6`tnDtz4RX3+ zAm0jaKs?3xkCy-NCY6{gPndB=tYPt~u-m*QD_kT=9hWx3qtyc=1M=QVJKM$ZoT|5q$zf!o!l0(MOs@I>oY=6uiSYPE9zM{Qlb6kp0$h#8Td6bx? zrZkWpsag#-ujAW@DjmjWpOOXsVFaCQ6FD)S!wsUCngen8$Fp7vEI>m zkuVQ2dedb+xs#>UeBrK|wq-{>bzf-Y^7ICqvj}bq?cm!P#c@zc-KGGS3m>OTq-R+{ zhGf!i2!3k>Vo1n|8hOPrh-{v_N{C5gSJt0dm@a8OKAfw3OC@jyVH4Ar3>R5?#k8H>hRSEm=<&(lzBr=a?^TrtD z$Q7S;&S;z*3N^8CBphlDQ+(S8QxMye?3NtCt-c{2 zrV72Ih7xGN|JBBPm&J|v{2|t^qRxyQ4AUZ&b}Q2AS{keF#fmD$gVf(qv`0c(A9@W| z7I{giw_^!}*l00h2hUNrpnY)FO7F|a_V8a32BTV>vyH2qsMln6^?zqD>I)SpQsk?u z^wn5ywdD2eo5z=3b!FJ3NHTPcCXjFRXCY$~x9o|>CVwpLiM3`HCNBDd?2Va)2kO-Z z?y|+1yQND>#M#^%5o%)*Y?)=r&hGhOF|;=R3oB(p#{s5%VVV%fiPca{AXX$Vi{x?& zEG!a?!zf5hh#2=puUoua>J0DeApJ92b0N*9VeD=qj^8wzfA!=Y>vK=z(+Gk3aWs!5d?KWAf4 zi@zctd^ws0gR}vi3!kuhq`QRt@lG4>(#q^Kr~pmw-k4CcKJa}8O}1*^K`Zvi`7Ftp z2a-J0by=8Mg}zolsw#CrXCEnG)$2uB#Hx>5X|G}~cT;(xVad!oR+@I@?=sXV0sGB% zD%5;rVVPS~d-8P)%zi1BvUOuY5?%OQ$RatO7!Ph$YmyZk0=KuTP*TTNV(qaE$QdCI ziCEla;Q^LLx(RrM{NlA3Nm(k}9!4DsPz_+TC1u|8O+<(R^%n7)Cg6lw{GHS$=@#RQbG*0m@oH{;E&4(XJ3(5rx7Yi1Nhc zm72(s!qB&Vxfn5}870i3r161&0vI`Zq2dY_PF6!Ru;oyN7?=0GI5aauu~-Kr6T}L;jqN-nj6Bq$ zS4UnQJ@P2iQ+RFt-Z3#%u2O_ZxVVxg59 z9YQkH$6PB5smJkPtZQ~dT_M&YghxG#U?f@n!=peyR7X%5=&q6ym%->BfF;bi%55;; zQBmt>qTLki-qGH80}_=w5oMRXh;hOD$i$dYOk8WUq`yi-*{lkvCTElf>41H)G@wjo zO883gxND-fS@tdEqBkYBF+UEwgwc{SU%+Am*XEUerJQ*nl8V`ei#gke?}F@43lx!A zx~^nxm=of5MO;O|Oo>%J7@g*Rg+?E}C^*z&*+tj=DtVwNoL<;fqg}D(?iQG#l?M@z zT-z*iZHU&Y=iq?I*P0mT8;EFHd2E`dmkB13B>s!jiext>uhGO3Ux^0iaEeA^uzlmg z`=?oOjB~}u2a3SB{#hznZccl;VC5mEi(#T#=b9$&^;k)@(_^f9sfWen{Iwp{uXI;Z zJtrD+Lr+WND5r?03jv5^jCC2TB4N7}5{vMq^-%;t%1`qWFtwe@G{)pYxq#|su>t?8 z+TtKuN1*>SC|SqEE{sPkckw{aGj8`;5&Da{K$kjr7|^oIAuLa%5oEXJ(ok3dwPFod zG!i6Yk*g%bNnEC&d`w?b1Z*g|@PM!WDkWzH(H7fC(xdb|v0Wl9Zsn)>Ob`l-7nS0H zgz$>!hI7Vl+g!4{EFZXLeinXL-V?bU>yzQ^LZO+KU^i%|%7;^!_35z`y-TqZHsLop z8on`+M2uwYA8U&x?oME@E#F!k9mzS1(V; zP(2oi;fos$24qgHIxY95M@ne9pzNR+or5`$?JHqD|kT@GyaTOkzlkkxP$q)@~s~HPoG2q-OEGU=K)K z5m0c;Br>qRW}8#=kBN(3#)1WHv*eVjB)W;Lzvo3diMx8)rerN>Wsz0pg-r+ zML@&N;figJX`}xJTcu{5)Dx?=5OO(IuAXc`ey*K-ugqklqPNQW zaORG>GA)`s>UtVG*Ci&(WFWq>H*jaVi@t!+$RKNST#if(gE=$g=46-vv8WvSXCvQ! zh`-3gHksG^%(h5sp=pgWO}<-M6zLP=aaa%NJ567;^)NHqbl$vY4I5>aUS#X9u|2{^ z&&7gPk3u4$+@DX1H3tkKtz1C;YJxw>?Z!B780nh zqZc0Fdjp@)%Wy>Eyt9gLbdsQH{WCai+EQ$xDJw!+mgsR&nOsL%Z4!&rNLeVx!m52U zeY%3=>%%shCPe9Zn2i4i%#>^Bk63D~b}#FVeM7mWKnD>DB4YV74WZl?%WpgTgi4zV z>=u}L7#n9*e;CSGG4v5?gUZ+jnwHb4ii2ruOn8=rxJB4wQ}pXwe>9*I=f^CMs_sGQk}j&Q%y;%|_$Rk9n_HDjn+&uktismzX;?^dX}ZRBo+8T= z(1MJpi`KY@%%+V>W?A^;H9lvy0Q&XZ^s31kMW|!pqb9W=(Mt?D;@Tdzg!8RH<3yr6z}Le(-2N}c^w}I6%h$nlA_pm_V?HGlwNObBOt<*KD&x3yb(F=HNyP+ z<#lsS z&`y#L+G1!#_Ou$kEa`pHvfV{{o-GwocGr~2wEDDBXtmX_UO613Ig^7vmwF_P5@&b< z_bz75m>`Jjl295d)jm8880}CN19n8iI2+vZnaf?!? zNSN>O&@53niZkyo?oo<3^W8~pglU^dEh}>e5|*Iq@e5{hc0Ud>AC(ZkJ}`IOr4fnC zwB0SW? zrhS<{!Sc}-sFAxubXjwM_NiyWwpY=4!%h0? zVHKykV?I$+MsNtoKCA*5|_+f+B+mV z3SxMu-gjkOlEJK&dSyNi#h!d1pAQ+0#XHCbN;G$Lw;tAwRVVzT%I;3Zr+zeyod>n%nEh zT7?x7UvWkUbg#q}udPp`OHH5S;W1CfJCg9Jx`Z_Xl|TP#69b_*M!v<-G&x}9=VPDb zQMUUdTe4uXkaYyPOqbK0eZpw&w46h01cqu1k$ftT(t@4j$kD*QRtJ;TGdJ!Z$ zmRA(1kJbub2qLF5#GJIEf%uB4i9Q_^)5jf1WIjkEYIoWrB#*@(p-*DTVm>-RGucNf z(Mk$w!z|xXlZ*5eeXPkt=|MvDD?NPZldo+IUQ&=1{c@le*#Ask{*evb#e<%ltkEzV zp&V<8&PpHRlY_{Sj3G6_|JbPdRsZ#^8?r>9ihj?0tZCC+>6!4Ua4?-HbEaRO=*BNm zWa;rzB@})$-`(i1amOfw0=fNOS!B?xU!JFX)APt;wl(M>#ceC;m{hBY0mQf9{&9?RpiTiY~kE48l z;yx*|@g|;Ce;)E@kWF?Ut{hFuEwg^)kLhDrw)48JSy`gJF=a4msQ*zC8b5X~?mlWYN(N9~f2)+%hWBd# zD^snLB3aD`4zf%}dcTJnwqii zYx}%5YKqd=^2RD|o5e5W`@JdV?EYNtC{|L;1ZiTV!0bV`eeU;;sP7PK>Wq25GT*bRXj4n<_L@imp=35hQ6yk9z3e_e+&0!uS&QzWOtl zGE0*s#Oz9wKrxCJtVCW>e%Nis`2VAXPNLWAfp|F;2NKhB= z^(nU)`0k&C0Hho1MK+`_n^s59rd*(@w1J@kn?@`xLbTum*6QIHT2BU6^4XO}FnfgM z+b%I5Q%Vx+rA@5u1GZ8q$zBu_ggHaxLMeq0IB4YNpb;Tj%jIOWK3*YrREXdfo@RD8W=-A$c7is24 z`(JDLLar#>itZ>SWt`+zjjg{|l0raZ+|d9g%051qk#tQyaf zqXcy==2i-?Z7OH*=!S%V?aC^G=XNHY8K*C8KNXJ+=X+_JAaKU8S7-0r7ilm8C{;~2F7 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/pt_BR.po b/utsudo-0.0.2/plugins/sudoers/po/pt_BR.po new file mode 100644 index 0000000..96fed1e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/pt_BR.po @@ -0,0 +1,2526 @@ +# Brazilian Portuguese translation of sudoers. +# Traduções em português brasileiro para o pacote sudoers. +# Copyright (C) 2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Rafael Fontenelle , 2013-2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 07:31-0200\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Virtaal 1.0.0-beta1\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "erro de sintaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "senha do %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] senha para %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Senha: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Informação de SEGURANÇA para %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Sinto muito, tente novamente." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "não foi possível alocar memória" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "um digest requer um nome de caminho" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "valor de notbefore inválido" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "falha de notafter inválido" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "valor de timeout grande demais" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "valor de timeout inválido" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Alias \"%s\" já definido" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "não foi possível fazer fork" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "não foi possível alterar a senha para %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "não foi possível obter classe de login para o usuário %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "não foi possível iniciar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "tipo de autenticação inválida" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "não foi possível inicializar autenticação BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "sua conta expirou" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "aprovação falhou" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "não foi possível ler configuração de fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "não foi possível conectar ao servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "conexão perdida com o servidor de autenticação" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"erro no servidor de autenticação:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: não foi possível converter principal para string (\"%s\"): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: não foi possível analisar \"%s\": %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: não foi possível resolver cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: não foi possível alocar opções: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: não foi possível obter credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: não foi possível inicializar cache de credenciais: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: não foi possível armazenar credenciais no cache: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: não foi possível obter principal da máquina: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Não foi possível verificar TGT! Possivelmente um ataque!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "não foi possível inicializar PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Erro de autenticação PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "falha de verificação da conta; sua conta está travada?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Conta ou senha expirou; redefina sua senha e tente novamente" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "não foi possível alterar a senha expirada: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Senha expirou; entre em contato com o administrador do seu sistema" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Conta expirou ou a configuração do PAM não possui uma seção \"account\" para sudo; contate o administrador do seu sistema" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "erro de gerenciamento de conta PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "você não existe no banco de dados de %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "falha ao inicializar a biblioteca API ACE" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "não foi possível contatar o servidor de SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "ID de usuário travado pela autenticação SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "comprimento de nome de usuário inválido para SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "manipulação inválida de autenticação para SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "falha de comunicação de SecurID" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "erro de SecurID desconhecido" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "comprimento de senha inválida para SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "não foi possível inicializar a sessão SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "métodos de autenticação inválidos" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Métodos de autenticação inválidos compilado no sudo! Você não pode misturar autenticação autônoma com não-autônoma." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "nenhum método de autenticação" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Não há métodos de autenticação compilados no sudo! Se você quiser desligar a autenticação, use a opção de configuração --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Não foi possível inicializar métodos de autenticação." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Métodos de autenticação:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Não foi possível determinar a condição de auditoria" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "não foi possível enviar o registro de auditoria" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Presumimos que você recebeu as instruções de sempre do administrador\n" +"de sistema local. Basicamente, resume-se a estas três coisas:\n" +"\n" +" #1) Respeite a privacidade dos outros.\n" +" #2) Pense antes de digitar.\n" +" #3) Com grandes poderes vêm grandes responsabilidades.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "uid desconhecido: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "usuário desconhecido: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "incremento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "ordem inicial: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "preenchimento de ordem: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s versão %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "gramática de %s versão %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "formato de entrada sem suporte %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "formato de saída sem suporte %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: arquivos de entrada e saída devem ser diferentes" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "não foi possível inicializar valores padrões do sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: palavra-chave desconhecida: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "tipo de defaults inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "tipo de supressão inválida: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "filtro inválido: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "não foi possível abrir %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "falha em analisar o arquivo %s, erro desconhecido" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "erro de análise em %s perto da linha %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "erro de análise em \"%s\"\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "não foi possível gravar em %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - converte entre formatos de arquivo sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -b, --base=dn o DN base para consultas LDAP do sudo\n" +" -c, --config=arquivo_conf o caminho para o arquivo de configuração\n" +" -d, --defaults=tiposdeft só converte Defaults dos tipos especificados\n" +" -e, --expand-aliases expande aliases ao converter\n" +" -f, --output-format=formato define formato de saída: JSON, LDIF ou sudoers\n" +" -i, --input-format=formato define formato de entrada: LDIF ou sudoers\n" +" -I, --increment=núm quantidade para incrementar cada sudoOrder por\n" +" -h, --help exibe a mensagem de ajuda e sai\n" +" -m, --match=filtro só converte entradas que corresponde ao filtro\n" +" -M, --match-local filtro de correspondência usa bancos de dados\n" +" passwd e group\n" +" -o, --output=arquivo_saída escreve sudoers convertido para arquivo_saída\n" +" -O, --order-start=núm ponto inicial para o primeiro sudoOrder\n" +" -p, --prune-matches suprime usuários/grupos/hosts não correspondentes\n" +" -P, --padding=núm preenchimento base para incremento de sudoOrder\n" +" -s, --suppress=seções suprime a saída de certas seções\n" +" -V, --version exibe informações de versão e sai" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "entrada padrão \"%s\" desconhecido" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "não foi possível obter o horário GMT" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "não é possível formatar marca de tempo" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, estouro de pilha de %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "entradas de sudoers demais, máximo %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "a variável de ambiente SUDOERS_BASE não está definida e a opção -b não foi especificada." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Facilidade do syslog, se syslog estiver sendo usado para registrar logs: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prioridade do syslog para usar quando um usuário autenticar com sucesso: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prioridade do syslog para usar quando um usuário não usuário autenticar com sucesso: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Colocar prompt OTP na sua própria linha" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorar \".\" no $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Sempre envia correio quando sudo for executado" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Envia correio se a autenticação de um usuário falhar" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Envia correio se o usuário não estiver no sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Envia correio se o usuário não estiver no sudoers desta máquina" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Envia correio se o usuário não tiver permissão para executar um comando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Envia correio se o usuário tentar executar um comando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Usa uma marca de tempo separada para cada combo usuário/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Instrui o usuário na primeira vez que ele executar sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Arquivo contendo as instruções do sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Exige que os usuários se autentiquem, por padrão" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root pode executar sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Registra o nome da máquina no arquivo de log (não-syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Registra o ano no arquivo de log (não-syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Se sudo for chamado sem argumentos, inicia um shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Define $HOME com o usuário alvo ao iniciar um shell com -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Sempre define $HOME para a pasta pessoal do usuário alvo" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Permite juntar algumas informações para fornecer mensagens de erro úteis" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Exige nomes de máquina completos (FQDN) no arquivo sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Insulta o usuário quando ele digitar uma senha incorreta" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Permite que o usuário execute sudo apenas se ele tiver um tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo vai honrar a variável de ambiente EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Pede a senha do root, e não a do usuário" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pede a senha do usuário runas_default, e não a do usuário" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pede a senha do usuário alvo, e não a do usuário" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Aplica o padrão na classe de login do usuário alvo, se houver alguma" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Define as variáveis de ambiente LOGNAME e USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Define o uid efetivo apenas para o usuário alvo, e não o uid real" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Não inicializa o vetor de grupos para aquele usuário alvo" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Comprimento da quebra de linha do arquivo de log (0 para sem quebra): %u" + +# "Limite de tempo da marca de tempo de autenticação" ficaria estranho, então utilizei "... expira em" +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Marca de tempo de autenticação expira em: %.1f minutos" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Pedido de senha expira em: %.1f minutos" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Número de tentativas para digitar senha: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask a ser usada ou 0777 para usar do usuário: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Caminho para o arquivo de log: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Caminho para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Opções para o programa de correio: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Endereço para onde enviar correio: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Endereço de onde enviar correio: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Linha do assunto para as mensagens de correio: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mensagem de senha incorreta: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Caminho para o diretório de status de instruções: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Caminho para diretório de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Dono do diretório de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Usuários neste grupo estão eximidos da exigência de senha e PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Pedido de senha padrão: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Se definido, o pedido de senha vai sobrescrever o do sistema em todos os casos." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Usuário padrão para se executar comandos: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Valor para sobrescrever o $PATH do usuário: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Caminho do editor a ser usado pelo visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Quando exigir uma senha para o pseudo-comando \"list\": %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Quando exigir uma senha para o pseudo-comando \"verify\": %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Pré-carrega as funções de exec de teste contidas na biblioteca sudo_noexec" + +# ideia da frase original: se acontecer algo, se deve ou não ignorar. Traduzi reorganizando a frase com a finalidade de manter a ideia original. -- Rafael +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Estando o diretório LDAP disponível, se devemos ignorar o arquivo sudoers local" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Descritores, de arquivos, >= %d serão fechados antes de executar um comando" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Se definido, usuários podem sobrescrever o valor de \"closefrom\" com a opção -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Permite que usuários definam variáveis de ambiente arbitrárias" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Redefine o ambiente para um conjunto padrão de variáveis" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Variáveis de ambiente nas quais deve-se verificar sanidade:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Variáveis de ambiente para remover:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Variáveis de ambiente para preservar:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Papel SELinux para usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Tipo SELinux para usar no novo contexto de segurança: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Caminho do arquivo de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Caminho do arquivo restrito de ambiente específico do sudo: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Localização para usar ao analisar o sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Permite ao sudo solicitar uma senha mesmo se ele estiver visível" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Fornece feedback visual na solicitação de senha quando houver entrada do usuário" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Usa um englobamento mais rápido que é menos preciso, mas não acessa o sistema de arquivos" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "O umask especificado no sudoers vai sobrescrever o do usuário, mesmo se ele foi mais permissivo" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Registra no log a entrada do usuário para o comando sendo executado" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Registra no log a saída do comando sendo executado" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Comprime logs I/O usando zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Sempre executa comandos em um pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Plug-in para suporte a grupo não-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Diretório no qual devem ser armazenados os logs de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Arquivo no qual deve ser armazenado o log de entrada/saída: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Adiciona uma entrada ao arquivo utmp/utmpx ao alocar um pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Define o usuário em utmp como usuário a ser executado como, e não o usuário a ser chamado" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Conjunto de privilégios permitidos: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Conjunto de privilégios limitados: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Executa comandos em um pty em plano de fundo" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Nome do serviço PAM para usar: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Nome do serviço PAM para usar para shells de login: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Tenta estabelecer as credenciais PAM para o usuário alvo" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Cria uma nova sessão PAM para o comando ser executado nela" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Realiza de gerenciamento de validação de conta PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Número máximo de sequência de log de E/S: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Habilita suporte a netgroup no sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Verifica diretórios pai para capacidade de gravação ao editar arquivos com sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Segue links simbólicos ao editar arquivos com sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Consulta o plug-in de grupo por grupos de sistema desconhecidos" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Compara netgroups baseada em toda tupla: usuário, máquina e domínio" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever em logs de auditoria" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever em logs de E/S" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Permite comandos serem executados mesmo se sudo não puder escrever no arquivo de log" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Resolve grupos no sudoers e corresponde ao ID de grupo, e não o nome" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Entradas de log maiores que este valor serão divididos em múltiplas mensagens de syslog: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Usuário que será dono dos arquivos de log de E/S: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupo que será dono dos arquivos de log de E/S: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Modo de arquivo usado para os arquivos de log de E/S: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Executa comandos pelo descritor de arquivo em vez de pelo caminho: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ignora entradas desconhecidas de Defaults no sudoers em vez de produzir um aviso" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tempo em segundos após o qual o comando será terminado: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Permite o usuário especificar um tempo limite na linha de comando" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Descarrega os dados de log de E/S para o disco imediatamente em vez de armazenar no buffer" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Inclui o ID de processo ao registrar log via syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Tipo de registro de marca de tempo de autenticação: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Mensagem de falha de autenticação: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ignora maiúsculo/minúsculo ao corresponder nomes de usuário" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ignora maiúsculo/minúsculo ao corresponder nomes de grupo" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Registra quando um comando é permitido por sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Registra quando um comando é negado por sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d entrada padrão \"%s\" desconhecida" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: entrada padrão \"%s\" desconhecida" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d nenhum valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: nenhum valor especificado para \"%s\"" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d valores para \"%s\" devem iniciar com um \"/\"" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: valores para \"%s\" devem iniciar com um \"/\"" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d opção \"%s\" não leva um valor" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: opção \"%s\" não leva um valor" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d Tipo de padrões 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: Tipo de padrões 0x%x inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: valor \"%s\" é inválido para a opção \"%s\"" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp corrompido, cumprimento não confere" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "não foi possível recompilar o ambiente" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "sinto muito, você não tem permissão para definir as seguintes variáveis de ambiente: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "erro de análise em %s próximo à linha %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "erro de análise em %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "tipo de digest %d sem suporte para %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: erro de leitura" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve ter como dono o uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s deve ser gravável apenas pelo dono" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "não foi possível carregar %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "não foi possível localizar um símbolo \"group_plugin\" %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: versão maior do plug-in de grupo %d incompatível, esperava %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "não foi possível analisar o endereço IP \"%s\"" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "não foi possível analisar a máscara de rede \"%s\"" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Par de endereço IP e máscara de rede locais:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s existe, mas não é um diretório (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "não foi possível fazer mkdir %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "não foi possível alterar modo de %s para 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "grupo desconhecido %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "não foi possível ler %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "não foi possível criar %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "não foi possível gravar no arquivo de log de E/S: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: erro interno, o arquivo de log de E/S para evento %d não está aberto" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: erro interno, sinal inválido %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: arquivo de log inválido" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: campo de marca de tempo está faltando" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: marca de tempo %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: campo de usuário está faltando" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: campo de usuário, a ser executado como, está faltando" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: campo de grupo, a ser executado como, está faltando" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "sem suporte a starttls ao usar ldaps" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "não foi possível inicializar bando de dados de chaves e certificados SSL: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "você deve definir TLS_CERT em %s para usar SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "não foi possível inicializar LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls especificado, mas bibliotecas LDAP não possuem suporte a ldap_start_tls_s() ou ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "atributo sudoOrder inválido: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: porta muito grande" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "tipo de uri LDAP sem suporte: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "não foi possível misturar ldap e ldaps URIs" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "não foi possível converter sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "não foi possível abrir o sistema de auditoria" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "não foi possível enviar mensagem de auditoria" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (comando continuado) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "não foi possível abrir o arquivo de log: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "não foi possível travar o arquivo de log: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "não foi possível gravar no arquivo de log: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "nenhum usuário ou máquina" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "falha de validação" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "usuário NÃO ESTÁ no sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "usuário NÃO ESTÁ autorizado na máquina" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "comando não permitido" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s não está no arquivo sudoers. Este incidente será relatado.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s não tem permissão para executar sudo em %s. Este incidente será relatado.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Sinto muito, usuário %s não pode executar sudo em %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Sinto muito, usuário %s não tem permissão para executar \"%s%s%s\" como %s%s%s em %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: comando não encontrado" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorando \"%s\" encontrado em \".\"\n" +"Use \"sudo ./%s\" se isto é o \"%s\" que você deseja executar." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "falha de autenticação" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "uma senha é necessária" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u tentativa de senha incorreta" +msgstr[1] "%u tentativas de senha incorreta" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "não foi possível fazer dup da entrada padrão: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "não foi possível executar %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "não foi possível fazer fork: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "não foi possível abrir um redirecionamento (pipe): %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "digest de %s (%s) não está na forma %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "não foi possível obter o estado de %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Papel LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Entradas no sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " UsuáriosRunAs: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " GruposRunAs: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Opções: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Comandos:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Entradas de Defaults correspondentes a %s em %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Padrões específicos de comandos e \"runas\" de %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Usuário %s pode executar os seguintes comandos em %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Usuário %s não tem permissão para executar sudo em %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ignorando sudoRole incompleto: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "atributo LDIF inválido: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s inválido definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "não foi possível analisar a lista de endereços de rede" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "nome de usuário não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ID de usuário não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ID de grupo não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "nome da máquina não definido pelo front-end do sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "não foi possível executar %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Versão de plug-in de política do sudoers %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Versão de gramática de arquivo do sudoers %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Caminho do sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "caminho do nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "caminho do ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "caminho do ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "não foi possível registrar hook do tipo %d (versão %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "não foi possível fazer cache de uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "não foi possível fazer cache de uid %u, já existe" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "não foi possível fazer cache de usuário %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "não foi possível fazer cache de usuário %s, já existe" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "não foi possível fazer cache de gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "não foi possível fazer cache de gid %u, já existe" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "não foi possível fazer cache de grupo %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "não foi possível fazer cache de grupo %s, já existe" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "não foi possível fazer cache da lista de grupos de %s, já existe" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "não foi fazer cache de lista de grupos para %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "não foi possível analisar grupos de %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "não foi possível analisar os gids de %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "estouro da pilha de permissões" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "esvaziamento da pilha de permissões" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "não foi possível alterar gid de root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "não foi possível alterar para gid de \"runas\"" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "não foi possível definir vetor de grupo de \"runas\"" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "não foi possível alterar para uid de \"runas\"" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "não foi possível alterar para gid de sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "processos demais" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "não foi possível definir diretório de trabalho atual" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "caminho de auditoria truncado user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "caminho de auditoria truncado argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "mensagem de audit_failure muito grande" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "não foi possível inicializar a fonte SSS. SSSD está instalado em sua máquina?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "não foi possível localizar símbolo \"%s\" em %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problema com o entradas padrão" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "nenhuma fonte de sudoers válida encontrada; saindo" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers especifica que o root não tem permissão para usar sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "você não tem permissão para usar a opção -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "dono da marca de tempo (%s): Usuário inexistente" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "nenhum tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "sinto muito, você deve ter um tty para executar sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "comando no diretório atual" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "sinto muito, você não tem permissão para definir um tempo limite de comando" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "sinto muito, você não tem permissão para preservar o ambiente" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "comando muito grande" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um arquivo comum" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s tem como dono o uid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s é gravável globalmente" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s tem como dono o gid %u, deveria ser %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "apenas o root pode usar \"-c %s\"" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "classe de login desconhecida: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "não foi possível resolver máquina %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "opção de filtro inválida: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "espera máxima inválida: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "fator de velocidade inválido: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/timing: %s" + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Reproduzindo sessão de sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "não foi possível adicionar evento para a fila" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "não foi possível definir o tty para modo raw" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Aviso: seu terminal é muito pequeno para reproduzir adequadamente o log.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometria do log é %d x %d; geometria do seu terminal é %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Reprodução finalizada, pressione qualquer tecla para restaurar o terminal." + +# timing é o nome do arquivo gerado pelo sudo; não traduzir. +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "linha inválida no arquivo timing: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "expressão ambígua \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "\")\" não coincidente na expressão" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "termo de pesquisa desconhecido \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s requer um argumento" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressão regular inválida: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "não foi possível analisar a data \"%s\"" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "\"(\" sem correspondente na expressão" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "fim de linha ilegal com \"or\"" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "fim de linha ilegal com \"!\"" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "tipo de pesquisa desconhecido %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "uso: %s [-hnRS] [-d diretório] [-m número] [-s número] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "uso: %s [-h] [-d diretório] -l [expressão de pesquisa]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - reproduz logs de sessão do sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Opções:\n" +" -d, --directory=dir especifica o diretório dos logs de sessão\n" +" -f, --filter=filtro especifica qual o tipo de E/S para exibir\n" +" -h, --help exibe mensagem de ajuda e sai\n" +" -l, --list lista IDs de sessão disponíveis, podendo ser filtrado\n" +" com uso opcional de expressão regular\n" +" -m, --max-wait=núm número máximo, em segundos, de espera entre eventos\n" +" -n, --non-interactive sem interação, a sessão é enviada para a saída padrão\n" +" -R, --no-resize não tenta redimensionar o terminal\n" +" -S, --suspend-wait aguarda enquanto o comando estava suspenso\n" +" -s, --speed=núm aumenta ou diminui a velocidade da saída\n" +" -V, --version exibe a informação da versão e sai" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tmáquina sem correspondente" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Comando permitido" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Comando negado" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Comando sem correspondente" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s é gravável pelo grupo" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "não foi possível truncar o arquivo de marca de tempo para %lld bytes" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "não foi possível ler do relógio" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "ignorado marca de tempo no futuro" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "marca de tempo muito a frente no futuro: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "não foi possível travar o arquivo de marca de tempo %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "caminho de status de instruções muito longo: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "a opção -x será removida em um lançamento futuro" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "por favor, em vez disso, considere usar o utilitário cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "pressione enter para editar %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "editor especificado (%s) não existe" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "nenhum editor encontrado (caminho do editor = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "erro de escrita" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "não foi possível obter estado de arquivo temporário (%s), %s sem alteração" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "arquivo de temporário (%s) com comprimento zero, %s sem alteração" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "editor (%s) falhou, %s sem alteração" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s sem alteração" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "não foi possível reabrir arquivo temporário (%s), %s sem alteração." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "não foi possível analisar arquivo temporário (%s), erro desconhecido" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "erro interno, não foi possível localizar %s na lista!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "não foi possível definir (uid, gid) de %s para (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s e %s não estão no mesmo sistema de arquivos, usando mv para renomear" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "comando \"%s %s %s\" falhou, %s sem alteração" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "erro ao renomear %s, %s sem alteração" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Agora o que? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Opções são:\n" +" (e)dit - editar arquivos sudoers novamente\n" +" e(x)it - sair sem salvar alterações no arquivo sudoers\n" +" (Q)uit - sair e salvar alterações no arquivo sudoers (PERIGO!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "não foi possível executar %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: dono (uid, gid) incorreto; deveria ser (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: permissões incorretas; deveria estar no modo 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: análise OK\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s ocupado, tente novamente" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "não foi possível travar %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Editar mesmo assim? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Erro: %s:%d ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Aviso: %s:%d ciclo em %s \"%s\"" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Erro: %s:%d %s \"%s\" referenciado, mas não definido" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Aviso: %s:%d %s \"%s\" referenciado, mas não definido" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Aviso: %s:%d %s não usado \"%s\"" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - edita o arquivo sudoers com segurança\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Opções:\n" +" -c, --check modo de verificação, apenas\n" +" -f, --file=sudoers especifica localização do arquivo sudoers\n" +" -h, --help exibe uma mensagem de ajuda e sai\n" +" -q, --quiet mensagens de erro de sintaxe menos detalhada\n" +" -s, --strict verificação rigorosa de sintaxe\n" +" -V, --version exibe a informação da versão e sai\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "níveis de inclusões demais" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorando valor de atributo inválido: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "não foi possível fazer cache de usuário %s, memória insuficiente" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "não foi possível fazer cache de grupo %s, memória insuficiente" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "não foi possível fazer cache da lista de grupos de %s, memória insuficiente" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Papel LDAP: DESCONHECIDO\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordem: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Papel SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Papel SSSD: DESCONHECIDO\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Aviso: ciclo em %s \"%s\"" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Aviso: %s \"%s\" referenciado, mas não definido" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Aviso: %s não usado \"%s\"" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "caminho de marca de tempo muito longo: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "não foi possível obter estado do editor (%s)" + +# Mantive, pois hostbuf é uma variável do plugins/sudoers/ldap.c +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: sem espaço para expansão de hostbuf" + +# Mantive, pois hostbuf é uma variável do plugins/sudoers/ldap.c +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: sem espaço na construção de hostbuf" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "alocação de sudo_ldap_build_pass1 não confere" + +#~ msgid "Password:" +#~ msgstr "Senha:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "erro interno: espaço insuficiente para linha de log" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: estouro de buffer" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s tem como dono o uid %u, deveria ser uid %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s gravável por não-dono (0%o); deveria estar no modo 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s existe, mas não é um arquivo comum (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s gravável por não-dono (0%o); deveria estar no modo 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "não foi possível remover %s, redefinindo para como estava no Unix" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "não foi possível redefinir %s para como estava no Unix" + +#~ msgid "value out of range" +#~ msgstr "valor fora da faixa" + +#~ msgid "invalid uri: %s" +#~ msgstr "uri inválida: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "não foi possível misturar ldaps e starttls" + +#~ msgid "writing to standard output" +#~ msgstr "escrevendo para saída padrão" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "parênteses de expressões demais, máximo %d" + +#~ msgid "unable to setup authentication" +#~ msgstr "não foi possível configurar autenticação" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: falhou" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: falhou" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: falhou" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: falhou" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: falhou" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: falhou" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid falhou" + +#, fuzzy +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "não foi possível fazer dlopen %s: %s" + +#~ msgid "invalid regex: %s" +#~ msgstr "expressão regular inválida: %s" diff --git a/utsudo-0.0.2/plugins/sudoers/po/ru.mo b/utsudo-0.0.2/plugins/sudoers/po/ru.mo new file mode 100644 index 0000000000000000000000000000000000000000..a8f1f1604a36255d5495158aa29846fb2ab1ee19 GIT binary patch literal 11555 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 AX8-^I literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/ru.po b/utsudo-0.0.2/plugins/sudoers/po/ru.po new file mode 100644 index 0000000..64a42d2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/ru.po @@ -0,0 +1,1868 @@ +# Transation of sudoers messages to Russian. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# +# Artem Vorotnikov , 2015. +# Pavel Maryanov , 2015. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.14b2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2015-07-03 07:09-0600\n" +"PO-Revision-Date: 2015-09-10 19:15+0300\n" +"Last-Translator: Pavel Maryanov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.8.4\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "ошибка синтаксиса" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "пароль %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] пароль для %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Пароль: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Данные БЕЗОПАСНОСТИ для %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Попробуйте ещё раз." + +#: gram.y:181 gram.y:199 gram.y:205 gram.y:211 gram.y:217 gram.y:223 +#: gram.y:239 gram.y:246 gram.y:253 gram.y:260 gram.y:267 gram.y:283 +#: gram.y:306 gram.y:313 gram.y:320 gram.y:327 gram.y:334 gram.y:387 +#: gram.y:395 gram.y:405 gram.y:435 gram.y:442 gram.y:449 gram.y:456 +#: gram.y:568 gram.y:575 gram.y:584 gram.y:593 gram.y:610 gram.y:661 +#: gram.y:668 gram.y:675 gram.y:683 gram.y:775 gram.y:782 gram.y:789 +#: gram.y:796 gram.y:803 gram.y:829 gram.y:836 gram.y:843 gram.y:1110 +#: gram.y:1117 plugins/sudoers/alias.c:123 plugins/sudoers/alias.c:136 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:371 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/auth/sia.c:110 +#: plugins/sudoers/defaults.c:516 plugins/sudoers/defaults.c:720 +#: plugins/sudoers/defaults.c:880 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:92 +#: plugins/sudoers/env.c:233 plugins/sudoers/group_plugin.c:131 +#: plugins/sudoers/iolog.c:582 plugins/sudoers/iolog.c:614 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:446 +#: plugins/sudoers/ldap.c:477 plugins/sudoers/ldap.c:529 +#: plugins/sudoers/ldap.c:562 plugins/sudoers/ldap.c:914 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap.c:1339 +#: plugins/sudoers/ldap.c:1512 plugins/sudoers/ldap.c:1588 +#: plugins/sudoers/ldap.c:1724 plugins/sudoers/ldap.c:1748 +#: plugins/sudoers/ldap.c:1778 plugins/sudoers/ldap.c:1831 +#: plugins/sudoers/ldap.c:1846 plugins/sudoers/ldap.c:1942 +#: plugins/sudoers/ldap.c:1975 plugins/sudoers/ldap.c:2128 +#: plugins/sudoers/ldap.c:2225 plugins/sudoers/ldap.c:3028 +#: plugins/sudoers/ldap.c:3061 plugins/sudoers/ldap.c:3375 +#: plugins/sudoers/ldap.c:3403 plugins/sudoers/ldap.c:3414 +#: plugins/sudoers/ldap.c:3504 plugins/sudoers/ldap.c:3520 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:188 +#: plugins/sudoers/logging.c:662 plugins/sudoers/logging.c:916 +#: plugins/sudoers/match.c:501 plugins/sudoers/match.c:537 +#: plugins/sudoers/match.c:695 plugins/sudoers/match.c:752 +#: plugins/sudoers/parse.c:235 plugins/sudoers/parse.c:247 +#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:274 +#: plugins/sudoers/policy.c:384 plugins/sudoers/policy.c:575 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/sssd.c:160 +#: plugins/sudoers/sssd.c:192 plugins/sudoers/sssd.c:198 +#: plugins/sudoers/sssd.c:236 plugins/sudoers/sssd.c:243 +#: plugins/sudoers/sssd.c:279 plugins/sudoers/sssd.c:324 +#: plugins/sudoers/sssd.c:916 plugins/sudoers/sssd.c:1049 +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:294 +#: plugins/sudoers/sudoers.c:304 plugins/sudoers/sudoers.c:312 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:663 +#: plugins/sudoers/sudoers.c:749 plugins/sudoers/sudoers.c:793 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:471 +#: plugins/sudoers/sudoreplay.c:667 plugins/sudoers/sudoreplay.c:779 +#: plugins/sudoers/sudoreplay.c:819 plugins/sudoers/sudoreplay.c:828 +#: plugins/sudoers/sudoreplay.c:838 plugins/sudoers/sudoreplay.c:846 +#: plugins/sudoers/sudoreplay.c:850 plugins/sudoers/sudoreplay.c:1006 +#: plugins/sudoers/sudoreplay.c:1010 plugins/sudoers/testsudoers.c:130 +#: plugins/sudoers/testsudoers.c:187 plugins/sudoers/testsudoers.c:214 +#: plugins/sudoers/testsudoers.c:231 plugins/sudoers/visudo.c:155 +#: plugins/sudoers/visudo.c:215 plugins/sudoers/visudo.c:299 +#: plugins/sudoers/visudo.c:305 plugins/sudoers/visudo.c:435 +#: plugins/sudoers/visudo.c:971 plugins/sudoers/visudo.c:1015 +#: plugins/sudoers/visudo.c:1111 +msgid "unable to allocate memory" +msgstr "не удаётся выделить память" + +#: gram.y:467 +msgid "a digest requires a path name" +msgstr "для дайджеста нужно указать полный путь" + +#: gram.y:1110 gram.y:1117 plugins/sudoers/auth/pam.c:371 +#: plugins/sudoers/auth/rfc1938.c:109 plugins/sudoers/defaults.c:516 +#: plugins/sudoers/defaults.c:720 plugins/sudoers/defaults.c:880 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:92 plugins/sudoers/env.c:233 +#: plugins/sudoers/group_plugin.c:131 plugins/sudoers/iolog.c:582 +#: plugins/sudoers/iolog.c:614 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:446 plugins/sudoers/ldap.c:477 +#: plugins/sudoers/ldap.c:529 plugins/sudoers/ldap.c:562 +#: plugins/sudoers/ldap.c:914 plugins/sudoers/ldap.c:1060 +#: plugins/sudoers/ldap.c:1339 plugins/sudoers/ldap.c:1512 +#: plugins/sudoers/ldap.c:1588 plugins/sudoers/ldap.c:1724 +#: plugins/sudoers/ldap.c:1748 plugins/sudoers/ldap.c:1778 +#: plugins/sudoers/ldap.c:1831 plugins/sudoers/ldap.c:1846 +#: plugins/sudoers/ldap.c:1942 plugins/sudoers/ldap.c:1975 +#: plugins/sudoers/ldap.c:2128 plugins/sudoers/ldap.c:2225 +#: plugins/sudoers/ldap.c:3028 plugins/sudoers/ldap.c:3061 +#: plugins/sudoers/ldap.c:3375 plugins/sudoers/ldap.c:3403 +#: plugins/sudoers/ldap.c:3414 plugins/sudoers/ldap.c:3504 +#: plugins/sudoers/ldap.c:3520 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:916 +#: plugins/sudoers/match.c:501 plugins/sudoers/match.c:537 +#: plugins/sudoers/match.c:695 plugins/sudoers/match.c:752 +#: plugins/sudoers/parse.c:235 plugins/sudoers/parse.c:247 +#: plugins/sudoers/parse.c:262 plugins/sudoers/parse.c:274 +#: plugins/sudoers/policy.c:97 plugins/sudoers/policy.c:106 +#: plugins/sudoers/policy.c:115 plugins/sudoers/policy.c:139 +#: plugins/sudoers/policy.c:250 plugins/sudoers/policy.c:271 +#: plugins/sudoers/policy.c:280 plugins/sudoers/policy.c:319 +#: plugins/sudoers/policy.c:329 plugins/sudoers/policy.c:338 +#: plugins/sudoers/policy.c:384 plugins/sudoers/policy.c:575 +#: plugins/sudoers/prompt.c:93 plugins/sudoers/set_perms.c:356 +#: plugins/sudoers/set_perms.c:695 plugins/sudoers/set_perms.c:1054 +#: plugins/sudoers/set_perms.c:1350 plugins/sudoers/set_perms.c:1514 +#: plugins/sudoers/sssd.c:160 plugins/sudoers/sssd.c:192 +#: plugins/sudoers/sssd.c:198 plugins/sudoers/sssd.c:236 +#: plugins/sudoers/sssd.c:243 plugins/sudoers/sssd.c:279 +#: plugins/sudoers/sssd.c:324 plugins/sudoers/sssd.c:916 +#: plugins/sudoers/sssd.c:1049 plugins/sudoers/sudoers.c:159 +#: plugins/sudoers/sudoers.c:294 plugins/sudoers/sudoers.c:304 +#: plugins/sudoers/sudoers.c:312 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:663 plugins/sudoers/sudoers.c:749 +#: plugins/sudoers/sudoers.c:793 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:471 plugins/sudoers/sudoreplay.c:667 +#: plugins/sudoers/sudoreplay.c:779 plugins/sudoers/sudoreplay.c:819 +#: plugins/sudoers/sudoreplay.c:828 plugins/sudoers/sudoreplay.c:838 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:850 +#: plugins/sudoers/sudoreplay.c:1006 plugins/sudoers/sudoreplay.c:1010 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:187 +#: plugins/sudoers/testsudoers.c:214 plugins/sudoers/testsudoers.c:231 +#: plugins/sudoers/visudo.c:155 plugins/sudoers/visudo.c:215 +#: plugins/sudoers/visudo.c:299 plugins/sudoers/visudo.c:305 +#: plugins/sudoers/visudo.c:435 plugins/sudoers/visudo.c:971 +#: plugins/sudoers/visudo.c:1015 plugins/sudoers/visudo.c:1111 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:132 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Псевдоним «%s» уже определён" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не удаётся получить класс логина для пользователя %s" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "не удаётся начать BSD-аутентификацию" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "некорректный тип аутентификации" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "не удаётся запустить BSD-аутентификацию" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "не удаётся прочитать конфигурацию ftwk" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "не удаётся связаться с сервером аутентификации" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:120 +msgid "lost connection to authentication server" +msgstr "потеряно соединение с сервером аутентификации" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"ошибка сервера аутентификации:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не удаётся преобразовать принципал в строку ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не удаётся прочитать '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не удаётся разрешить кэш учётных данных: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не удаётся выделить параметры: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не удаётся получить учётные данные: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не удаётся инициализировать кэш учётных данных: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не удаётся сохранить учётные данные в кэше: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не удаётся получить принципал хоста: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Не удаётся проверить TGT. Нас атакуют?!: %s" + +#: plugins/sudoers/auth/pam.c:90 +msgid "unable to initialize PAM" +msgstr "не удаётся инициализировать PAM" + +#: plugins/sudoers/auth/pam.c:146 +msgid "account validation failure, is your account locked?" +msgstr "ошибка проверки учётной записи. Она заблокирована?" + +#: plugins/sudoers/auth/pam.c:150 +msgid "Account or password is expired, reset your password and try again" +msgstr "Учётные данные устарели. Сбросьте пароль и попробуйте ещё раз" + +#: plugins/sudoers/auth/pam.c:158 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не удаётся сменить устаревший пароль: %s" + +#: plugins/sudoers/auth/pam.c:163 +msgid "Password expired, contact your system administrator" +msgstr "Пароль устарел. Обратитесь к системному администратору" + +#: plugins/sudoers/auth/pam.c:167 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Срок действия учётной записи истёк или в настройках PAM нет раздела «account» для sudo. Обратитесь к системному администратору" + +#: plugins/sudoers/auth/pam.c:179 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Ошибка PAM-аутентификации: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:220 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Вы не существуете в базе данных %s" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "не удалось инициализировать библиотеку API для ACE" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "не удалось связаться с сервером SecurID" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "ID пользователя заблокирован для аутентификации SecurID" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "недопустимая длина имени пользователя для SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "недопустимый обработчик аутентификации для SecurID" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "ошибка связи с SecurID" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:207 +msgid "unknown SecurID error" +msgstr "неизвестная ошибка SecurID" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "недопустимая длина пароля для SecurID" + +#: plugins/sudoers/auth/sia.c:120 +msgid "unable to initialize SIA session" +msgstr "не удаётся инициализировать сеанс SIA" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "недопустимые методы аутентификации" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo скомпилирован с неверными методами аутентификации! Нельзя смешивать зависимую и независимую аутентификацию." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:273 +msgid "no authentication methods" +msgstr "методы аутентификации отсутствуют" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo скомпилирован без методов аутентификации! Если нужно отключить аутентификацию, используйте параметр --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:275 +msgid "Unable to initialize authentication methods." +msgstr "Не удаётся инициализировать методы аутентификации." + +#: plugins/sudoers/auth/sudo_auth.c:433 +msgid "Authentication methods:" +msgstr "Методы аутентификации:" + +#: plugins/sudoers/bsm_audit.c:111 plugins/sudoers/bsm_audit.c:200 +msgid "Could not determine audit condition" +msgstr "Не удалось определить состояние аудита" + +#: plugins/sudoers/bsm_audit.c:172 plugins/sudoers/bsm_audit.c:260 +msgid "unable to commit audit record" +msgstr "не удаётся отправить запись аудита" + +#: plugins/sudoers/check.c:200 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Мы полагаем, что ваш системный администратор изложил вам основы\n" +"безопасности. Как правило, всё сводится к трём следующим правилам:\n" +"\n" +" №1) Уважайте частную жизнь других.\n" +" №2) Думайте, прежде что-то вводить.\n" +" №3) С большой властью приходит большая ответственность.\n" +"\n" + +#: plugins/sudoers/check.c:243 plugins/sudoers/check.c:253 +#: plugins/sudoers/sudoers.c:699 plugins/sudoers/sudoers.c:728 +#, c-format +msgid "unknown uid: %u" +msgstr "неизвестный uid: %u" + +#: plugins/sudoers/check.c:248 plugins/sudoers/policy.c:747 +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/testsudoers.c:205 +#: plugins/sudoers/testsudoers.c:360 +#, c-format +msgid "unknown user: %s" +msgstr "неизвестный пользователь: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Игнорировать '.' в переменной $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Отправлять письмо при каждом запуске sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Отправлять письмо при ошибке аутентификации" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Отправлять письмо, если пользователя нет в группе sudoers" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Отправлять письмо, если пользователя нет в группе sudoers для данного компьютера" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Отправлять письмо, если пользователю не разрешено выполнять команду" + +#: plugins/sudoers/def_data.c:67 +msgid "Send mail if the user tries to run a command" +msgstr "Отправлять письмо, если пользователь пытается выполнить команду" + +#: plugins/sudoers/def_data.c:71 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use" +msgstr "" + +#: plugins/sudoers/def_data.c:371 +msgid "PAM service name to use for login shells" +msgstr "" + +#: plugins/sudoers/def_data.c:375 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:379 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:383 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:387 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/defaults.c:199 plugins/sudoers/defaults.c:608 +#: plugins/sudoers/visudo_json.c:633 plugins/sudoers/visudo_json.c:668 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:217 +#: plugins/sudoers/defaults.c:241 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:220 +#: plugins/sudoers/defaults.c:228 plugins/sudoers/defaults.c:251 +#: plugins/sudoers/defaults.c:264 plugins/sudoers/defaults.c:277 +#: plugins/sudoers/defaults.c:290 plugins/sudoers/defaults.c:310 +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:233 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:404 plugins/sudoers/ldap.c:450 +#: plugins/sudoers/ldap.c:540 plugins/sudoers/ldap.c:1143 +#: plugins/sudoers/ldap.c:1345 plugins/sudoers/ldap.c:1517 +#: plugins/sudoers/ldap.c:1673 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:921 plugins/sudoers/policy.c:494 +#: plugins/sudoers/policy.c:503 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:815 plugins/sudoers/testsudoers.c:235 +#: plugins/sudoers/toke_util.c:160 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1047 +msgid "unable to rebuild the environment" +msgstr "не удаётся перестроить среду" + +#: plugins/sudoers/env.c:1121 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:85 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:89 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:96 plugins/sudoers/sssd.c:331 +#, c-format +msgid "unable to load %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:101 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:110 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:92 plugins/sudoers/iolog.c:110 +#: plugins/sudoers/timestamp.c:218 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:103 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/iolog.c:131 plugins/sudoers/timestamp.c:212 +#: plugins/sudoers/timestamp.c:233 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:200 plugins/sudoers/sudoers.c:871 +#: plugins/sudoers/sudoreplay.c:302 plugins/sudoers/sudoreplay.c:768 +#: plugins/sudoers/sudoreplay.c:972 plugins/sudoers/timestamp.c:370 +#: plugins/sudoers/visudo.c:895 plugins/sudoers/visudo_json.c:1026 +#: plugins/sudoers/visudo_json.c:1039 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/iolog.c:241 plugins/sudoers/sudoers.c:875 +#: plugins/sudoers/sudoreplay.c:1083 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:273 plugins/sudoers/sudoreplay.c:549 +#: plugins/sudoers/timestamp.c:171 plugins/sudoers/timestamp.c:174 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/iolog.c:338 plugins/sudoers/iolog.c:536 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:428 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:488 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:515 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:519 plugins/sudoers/ldap.c:555 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:626 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1129 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1135 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1821 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2360 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Роль LDAP: %s\n" + +#: plugins/sudoers/ldap.c:2362 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Роль LDAP: НЕИЗВЕСТНО\n" + +#: plugins/sudoers/ldap.c:2409 +#, c-format +msgid " Order: %s\n" +msgstr " Порядок: %s\n" + +#: plugins/sudoers/ldap.c:2417 plugins/sudoers/parse.c:573 +#: plugins/sudoers/sssd.c:1408 +#, c-format +msgid " Commands:\n" +msgstr " Команды:\n" + +#: plugins/sudoers/ldap.c:2980 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не удаётся инициализировать LDAP: %s" + +#: plugins/sudoers/ldap.c:3016 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "указано start_tls, но библиотеки LDAP не поддерживают ldap_start_tls_s() или ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:3273 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "недопустимый атрибут sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "не удаётся открыть систему аудита" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "не удаётся отправить сообщение аудита" + +#: plugins/sudoers/logging.c:106 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:134 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (выполнение команды продолжено) %s" + +#: plugins/sudoers/logging.c:159 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "не удаётся открыть файл журнала: %s: %s" + +#: plugins/sudoers/logging.c:162 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "не удаётся заблокировать файл журнала: %s: %s" + +#: plugins/sudoers/logging.c:211 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:213 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/logging.c:220 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:222 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:224 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:259 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:262 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:266 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:306 plugins/sudoers/sudoers.c:471 +#: plugins/sudoers/sudoers.c:473 plugins/sudoers/sudoers.c:475 +#: plugins/sudoers/sudoers.c:477 plugins/sudoers/sudoers.c:1220 +#: plugins/sudoers/sudoers.c:1222 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:308 plugins/sudoers/sudoers.c:467 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:325 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:351 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:422 plugins/sudoers/logging.c:484 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/sudoers/logging.c:572 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:580 plugins/sudoers/logging.c:636 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:626 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:651 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:689 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:606 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:635 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:649 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:117 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:520 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:521 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:535 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:544 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:240 plugins/sudoers/testsudoers.c:252 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:632 plugins/sudoers/visudo.c:836 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:765 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:767 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:771 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:774 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:776 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:777 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:810 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:136 plugins/sudoers/pwutil.c:153 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:147 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:207 +#: plugins/sudoers/pwutil.c:250 plugins/sudoers/pwutil.c:294 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:202 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:427 plugins/sudoers/pwutil.c:444 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:438 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:476 plugins/sudoers/pwutil.c:492 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:565 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:487 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:676 plugins/sudoers/pwutil.c:710 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:682 plugins/sudoers/pwutil.c:715 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:438 +#: plugins/sudoers/set_perms.c:841 plugins/sudoers/set_perms.c:1138 +#: plugins/sudoers/set_perms.c:1430 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:369 +#: plugins/sudoers/set_perms.c:446 plugins/sudoers/set_perms.c:708 +#: plugins/sudoers/set_perms.c:849 plugins/sudoers/set_perms.c:1067 +#: plugins/sudoers/set_perms.c:1146 plugins/sudoers/set_perms.c:1363 +#: plugins/sudoers/set_perms.c:1438 plugins/sudoers/set_perms.c:1527 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:493 +#: plugins/sudoers/set_perms.c:1197 plugins/sudoers/set_perms.c:1470 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:590 +#: plugins/sudoers/set_perms.c:978 plugins/sudoers/set_perms.c:1274 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:595 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1279 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:606 +#: plugins/sudoers/set_perms.c:992 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:624 +#: plugins/sudoers/set_perms.c:1008 plugins/sudoers/set_perms.c:1304 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:332 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:340 plugins/sudoers/sssd.c:349 +#: plugins/sudoers/sssd.c:358 plugins/sudoers/sssd.c:367 +#: plugins/sudoers/sssd.c:376 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:172 plugins/sudoers/testsudoers.c:244 +#: plugins/sudoers/visudo.c:225 plugins/sudoers/visudo.c:562 +msgid "unable to initialize sudoers default values" +msgstr "не удаётся инициализировать значения по умолчанию для sudoers" + +#: plugins/sudoers/sudoers.c:197 plugins/sudoers/sudoers.c:239 +#: plugins/sudoers/sudoers.c:833 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:275 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:332 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:396 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:410 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:411 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:466 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:778 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:886 plugins/sudoers/visudo.c:428 +#: plugins/sudoers/visudo.c:662 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:890 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/timestamp.c:274 toke.l:933 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:898 toke.l:940 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:902 toke.l:945 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:952 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1031 plugins/sudoers/sudoers.c:1059 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1126 plugins/sudoers/testsudoers.c:384 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:234 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:247 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:253 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:256 plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:294 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:310 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:316 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:317 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:610 plugins/sudoers/sudoreplay.c:635 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:657 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:661 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:676 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:679 plugins/sudoers/sudoreplay.c:1059 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:692 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:694 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:696 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:745 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:783 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:801 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:808 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:815 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:824 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:833 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1196 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1199 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1208 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1210 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:323 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:326 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:182 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:282 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:303 +#, c-format +msgid "timestamp path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/timestamp.c:362 plugins/sudoers/timestamp.c:446 +#: plugins/sudoers/visudo.c:483 plugins/sudoers/visudo.c:489 +msgid "unable to read the clock" +msgstr "не удаётся прочитать часы" + +#: plugins/sudoers/timestamp.c:516 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:528 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:638 plugins/sudoers/timestamp.c:658 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:256 plugins/sudoers/visudo.c:614 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:321 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:337 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:445 plugins/sudoers/visudo.c:451 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:496 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:503 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:509 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:531 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:557 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:568 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:664 plugins/sudoers/visudo.c:673 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:668 plugins/sudoers/visudo.c:678 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:695 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:709 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:719 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:795 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:843 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:869 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:876 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:901 plugins/sudoers/visudo_json.c:1046 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:917 plugins/sudoers/visudo_json.c:1055 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo_json.c:1058 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:928 plugins/sudoers/visudo.c:935 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:982 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1078 +#, c-format +msgid "Error: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1079 +#, c-format +msgid "Warning: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1083 +#, c-format +msgid "Error: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1084 +#, c-format +msgid "Warning: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1227 +#, c-format +msgid "Warning: unused %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1340 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1342 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:904 +msgid "too many levels of includes" +msgstr "слишком много уровней включения" diff --git a/utsudo-0.0.2/plugins/sudoers/po/sk.mo b/utsudo-0.0.2/plugins/sudoers/po/sk.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec67774e9c8095002bb27eafddbcadf56a93190a GIT binary patch literal 4927 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, 2011-2015 +# Dušan Kazik , 2015 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.15b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2015-09-10 14:28-0600\n" +"PO-Revision-Date: 2015-10-05 13:26+0200\n" +"Last-Translator: Dušan Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Poedit 1.8.5\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: .\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "chyba syntaxe" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Heslo používateľa %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] heslo pre používateľa %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Heslo: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** BEZPEČNOSTNÉ informácie pre %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Prepáčte, skúste to znovu." + +#: gram.y:183 gram.y:201 gram.y:207 gram.y:213 gram.y:219 gram.y:225 +#: gram.y:241 gram.y:248 gram.y:255 gram.y:262 gram.y:269 gram.y:285 +#: gram.y:308 gram.y:315 gram.y:322 gram.y:329 gram.y:336 gram.y:391 +#: gram.y:399 gram.y:409 gram.y:439 gram.y:446 gram.y:453 gram.y:460 +#: gram.y:572 gram.y:579 gram.y:588 gram.y:597 gram.y:614 gram.y:670 +#: gram.y:677 gram.y:684 gram.y:692 gram.y:784 gram.y:791 gram.y:798 +#: gram.y:805 gram.y:812 gram.y:838 gram.y:845 gram.y:852 gram.y:1136 +#: gram.y:1143 plugins/sudoers/alias.c:123 plugins/sudoers/alias.c:136 +#: plugins/sudoers/auth/bsdauth.c:141 plugins/sudoers/auth/kerb5.c:119 +#: plugins/sudoers/auth/kerb5.c:145 plugins/sudoers/auth/pam.c:397 +#: plugins/sudoers/auth/pam.c:445 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:110 plugins/sudoers/defaults.c:516 +#: plugins/sudoers/defaults.c:720 plugins/sudoers/defaults.c:880 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:92 plugins/sudoers/env.c:233 +#: plugins/sudoers/group_plugin.c:133 plugins/sudoers/iolog.c:586 +#: plugins/sudoers/iolog.c:618 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:446 plugins/sudoers/ldap.c:477 +#: plugins/sudoers/ldap.c:529 plugins/sudoers/ldap.c:562 +#: plugins/sudoers/ldap.c:914 plugins/sudoers/ldap.c:1061 +#: plugins/sudoers/ldap.c:1348 plugins/sudoers/ldap.c:1521 +#: plugins/sudoers/ldap.c:1597 plugins/sudoers/ldap.c:1733 +#: plugins/sudoers/ldap.c:1757 plugins/sudoers/ldap.c:1787 +#: plugins/sudoers/ldap.c:1840 plugins/sudoers/ldap.c:1855 +#: plugins/sudoers/ldap.c:1951 plugins/sudoers/ldap.c:1984 +#: plugins/sudoers/ldap.c:2137 plugins/sudoers/ldap.c:2234 +#: plugins/sudoers/ldap.c:3041 plugins/sudoers/ldap.c:3074 +#: plugins/sudoers/ldap.c:3388 plugins/sudoers/ldap.c:3416 +#: plugins/sudoers/ldap.c:3427 plugins/sudoers/ldap.c:3517 +#: plugins/sudoers/ldap.c:3533 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:188 plugins/sudoers/logging.c:662 +#: plugins/sudoers/logging.c:916 plugins/sudoers/match.c:501 +#: plugins/sudoers/match.c:537 plugins/sudoers/match.c:699 +#: plugins/sudoers/match.c:756 plugins/sudoers/parse.c:235 +#: plugins/sudoers/parse.c:247 plugins/sudoers/parse.c:262 +#: plugins/sudoers/parse.c:274 plugins/sudoers/policy.c:384 +#: plugins/sudoers/policy.c:579 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/sssd.c:160 plugins/sudoers/sssd.c:192 +#: plugins/sudoers/sssd.c:235 plugins/sudoers/sssd.c:242 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:323 +#: plugins/sudoers/sssd.c:917 plugins/sudoers/sssd.c:1050 +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:294 +#: plugins/sudoers/sudoers.c:304 plugins/sudoers/sudoers.c:312 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:663 +#: plugins/sudoers/sudoers.c:749 plugins/sudoers/sudoers.c:793 +#: plugins/sudoers/sudoers_debug.c:107 plugins/sudoers/sudoreplay.c:472 +#: plugins/sudoers/sudoreplay.c:668 plugins/sudoers/sudoreplay.c:780 +#: plugins/sudoers/sudoreplay.c:820 plugins/sudoers/sudoreplay.c:829 +#: plugins/sudoers/sudoreplay.c:839 plugins/sudoers/sudoreplay.c:847 +#: plugins/sudoers/sudoreplay.c:851 plugins/sudoers/sudoreplay.c:1007 +#: plugins/sudoers/sudoreplay.c:1011 plugins/sudoers/testsudoers.c:130 +#: plugins/sudoers/testsudoers.c:188 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:232 plugins/sudoers/timestamp.c:390 +#: plugins/sudoers/timestamp.c:426 plugins/sudoers/timestamp.c:838 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:147 plugins/sudoers/visudo.c:152 +#: plugins/sudoers/visudo.c:213 plugins/sudoers/visudo.c:297 +#: plugins/sudoers/visudo.c:303 plugins/sudoers/visudo.c:433 +#: plugins/sudoers/visudo.c:974 plugins/sudoers/visudo.c:1018 +#: plugins/sudoers/visudo.c:1114 toke.l:785 toke.l:806 toke.l:816 toke.l:924 +#: toke.l:1082 +msgid "unable to allocate memory" +msgstr "nie je možné alokovať pamäť" + +#: gram.y:471 +msgid "a digest requires a path name" +msgstr "" + +#: gram.y:1136 gram.y:1143 plugins/sudoers/auth/pam.c:397 +#: plugins/sudoers/auth/pam.c:445 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:516 plugins/sudoers/defaults.c:720 +#: plugins/sudoers/defaults.c:880 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:92 +#: plugins/sudoers/env.c:233 plugins/sudoers/group_plugin.c:133 +#: plugins/sudoers/iolog.c:586 plugins/sudoers/iolog.c:618 +#: plugins/sudoers/iolog_path.c:167 plugins/sudoers/ldap.c:446 +#: plugins/sudoers/ldap.c:477 plugins/sudoers/ldap.c:529 +#: plugins/sudoers/ldap.c:562 plugins/sudoers/ldap.c:914 +#: plugins/sudoers/ldap.c:1061 plugins/sudoers/ldap.c:1348 +#: plugins/sudoers/ldap.c:1521 plugins/sudoers/ldap.c:1597 +#: plugins/sudoers/ldap.c:1733 plugins/sudoers/ldap.c:1757 +#: plugins/sudoers/ldap.c:1787 plugins/sudoers/ldap.c:1840 +#: plugins/sudoers/ldap.c:1855 plugins/sudoers/ldap.c:1951 +#: plugins/sudoers/ldap.c:1984 plugins/sudoers/ldap.c:2137 +#: plugins/sudoers/ldap.c:2234 plugins/sudoers/ldap.c:3041 +#: plugins/sudoers/ldap.c:3074 plugins/sudoers/ldap.c:3388 +#: plugins/sudoers/ldap.c:3416 plugins/sudoers/ldap.c:3427 +#: plugins/sudoers/ldap.c:3517 plugins/sudoers/ldap.c:3533 +#: plugins/sudoers/linux_audit.c:76 plugins/sudoers/logging.c:188 +#: plugins/sudoers/logging.c:916 plugins/sudoers/match.c:501 +#: plugins/sudoers/match.c:537 plugins/sudoers/match.c:699 +#: plugins/sudoers/match.c:756 plugins/sudoers/parse.c:235 +#: plugins/sudoers/parse.c:247 plugins/sudoers/parse.c:262 +#: plugins/sudoers/parse.c:274 plugins/sudoers/policy.c:97 +#: plugins/sudoers/policy.c:106 plugins/sudoers/policy.c:115 +#: plugins/sudoers/policy.c:139 plugins/sudoers/policy.c:250 +#: plugins/sudoers/policy.c:271 plugins/sudoers/policy.c:280 +#: plugins/sudoers/policy.c:319 plugins/sudoers/policy.c:329 +#: plugins/sudoers/policy.c:338 plugins/sudoers/policy.c:384 +#: plugins/sudoers/policy.c:579 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 plugins/sudoers/sssd.c:160 +#: plugins/sudoers/sssd.c:192 plugins/sudoers/sssd.c:235 +#: plugins/sudoers/sssd.c:242 plugins/sudoers/sssd.c:278 +#: plugins/sudoers/sssd.c:323 plugins/sudoers/sssd.c:917 +#: plugins/sudoers/sssd.c:1050 plugins/sudoers/sudoers.c:159 +#: plugins/sudoers/sudoers.c:294 plugins/sudoers/sudoers.c:304 +#: plugins/sudoers/sudoers.c:312 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:663 plugins/sudoers/sudoers.c:749 +#: plugins/sudoers/sudoers.c:793 plugins/sudoers/sudoers_debug.c:106 +#: plugins/sudoers/sudoreplay.c:472 plugins/sudoers/sudoreplay.c:668 +#: plugins/sudoers/sudoreplay.c:780 plugins/sudoers/sudoreplay.c:820 +#: plugins/sudoers/sudoreplay.c:829 plugins/sudoers/sudoreplay.c:839 +#: plugins/sudoers/sudoreplay.c:847 plugins/sudoers/sudoreplay.c:851 +#: plugins/sudoers/sudoreplay.c:1007 plugins/sudoers/sudoreplay.c:1011 +#: plugins/sudoers/testsudoers.c:130 plugins/sudoers/testsudoers.c:188 +#: plugins/sudoers/testsudoers.c:215 plugins/sudoers/testsudoers.c:232 +#: plugins/sudoers/timestamp.c:390 plugins/sudoers/timestamp.c:426 +#: plugins/sudoers/timestamp.c:838 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:213 +#: plugins/sudoers/visudo.c:297 plugins/sudoers/visudo.c:303 +#: plugins/sudoers/visudo.c:433 plugins/sudoers/visudo.c:974 +#: plugins/sudoers/visudo.c:1018 plugins/sudoers/visudo.c:1114 toke.l:785 +#: toke.l:806 toke.l:816 toke.l:924 toke.l:1082 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:132 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Alias „%s“ už je definovaný" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:120 +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:92 +msgid "unable to initialize PAM" +msgstr "" + +#: plugins/sudoers/auth/pam.c:164 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:168 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:176 +#, c-format +msgid "unable to change expired password: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:181 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:185 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:199 +#, c-format +msgid "PAM authentication error: %s" +msgstr "" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:218 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:207 +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:120 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:225 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:227 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Nie je možné inicializovať spôsoby overenia totožnosti." + +#: plugins/sudoers/auth/sudo_auth.c:435 +msgid "Authentication methods:" +msgstr "Spôsoby overenia totožnosti:" + +#: plugins/sudoers/bsm_audit.c:111 plugins/sudoers/bsm_audit.c:200 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:172 plugins/sudoers/bsm_audit.c:260 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:250 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Veríme, že ste boli poučený miestnym správcom systému.\n" +"Dodržiavajte tieto tri zásady:\n" +"\n" +" 1.) Rešpektujte súkromie iných.\n" +" 2.) Premýšľajte pred tým, než niečo napíšete.\n" +" 3.) S veľkou mocou prichádza veľká zodpovednosť.\n" +"\n" + +#: plugins/sudoers/check.c:293 plugins/sudoers/check.c:303 +#: plugins/sudoers/sudoers.c:699 plugins/sudoers/sudoers.c:728 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:298 plugins/sudoers/policy.c:751 +#: plugins/sudoers/sudoers.c:1095 plugins/sudoers/testsudoers.c:206 +#: plugins/sudoers/testsudoers.c:361 +#, c-format +msgid "unknown user: %s" +msgstr "neznámy používateľ: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:67 +msgid "Send mail if the user tries to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:71 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:75 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:79 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:83 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:87 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:99 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:103 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:107 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:111 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:115 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:119 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:123 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:127 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:143 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:147 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:247 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:251 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:323 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:367 +msgid "PAM service name to use" +msgstr "" + +#: plugins/sudoers/def_data.c:371 +msgid "PAM service name to use for login shells" +msgstr "" + +#: plugins/sudoers/def_data.c:375 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:379 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:383 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:387 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:391 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/defaults.c:199 plugins/sudoers/defaults.c:608 +#: plugins/sudoers/visudo_json.c:633 plugins/sudoers/visudo_json.c:668 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:217 +#: plugins/sudoers/defaults.c:241 plugins/sudoers/defaults.c:256 +#: plugins/sudoers/defaults.c:269 plugins/sudoers/defaults.c:282 +#: plugins/sudoers/defaults.c:295 plugins/sudoers/defaults.c:315 +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:210 plugins/sudoers/defaults.c:220 +#: plugins/sudoers/defaults.c:228 plugins/sudoers/defaults.c:251 +#: plugins/sudoers/defaults.c:264 plugins/sudoers/defaults.c:277 +#: plugins/sudoers/defaults.c:290 plugins/sudoers/defaults.c:310 +#: plugins/sudoers/defaults.c:321 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:233 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:450 +#: plugins/sudoers/ldap.c:540 plugins/sudoers/ldap.c:1152 +#: plugins/sudoers/ldap.c:1354 plugins/sudoers/ldap.c:1526 +#: plugins/sudoers/ldap.c:1682 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/logging.c:921 plugins/sudoers/policy.c:498 +#: plugins/sudoers/policy.c:507 plugins/sudoers/prompt.c:161 +#: plugins/sudoers/sudoers.c:815 plugins/sudoers/testsudoers.c:236 +#: plugins/sudoers/toke_util.c:160 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnútorná chyba, %s pretečenie" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1052 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1126 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:85 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí byť vlastnený identifikátorom uid %d" + +#: plugins/sudoers/group_plugin.c:89 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:97 plugins/sudoers/sssd.c:331 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie je možné načítať %s:%s" + +#: plugins/sudoers/group_plugin.c:103 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:117 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:92 plugins/sudoers/iolog.c:110 +#: plugins/sudoers/timestamp.c:169 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:103 plugins/sudoers/iolog.c:124 +#: plugins/sudoers/iolog.c:131 plugins/sudoers/timestamp.c:163 +#: plugins/sudoers/timestamp.c:184 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:200 plugins/sudoers/sudoers.c:871 +#: plugins/sudoers/sudoreplay.c:300 plugins/sudoers/sudoreplay.c:769 +#: plugins/sudoers/sudoreplay.c:973 plugins/sudoers/timestamp.c:399 +#: plugins/sudoers/visudo.c:898 plugins/sudoers/visudo_json.c:1012 +#: plugins/sudoers/visudo_json.c:1025 +#, c-format +msgid "unable to open %s" +msgstr "nie je možné otvoriť %s" + +#: plugins/sudoers/iolog.c:241 plugins/sudoers/sudoers.c:875 +#: plugins/sudoers/sudoreplay.c:1084 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:277 plugins/sudoers/sudoreplay.c:550 +#: plugins/sudoers/timestamp.c:298 plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to write to %s" +msgstr "nie je možné zapísať do %s" + +#: plugins/sudoers/iolog.c:342 plugins/sudoers/iolog.c:540 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:428 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:488 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:515 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:519 plugins/sudoers/ldap.c:555 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:626 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1138 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1144 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1830 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2372 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2374 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2421 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2429 plugins/sudoers/parse.c:555 +#: plugins/sudoers/sssd.c:1417 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2993 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:3029 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:3286 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "nie je možné otvoriť systém auditu" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "nie je možné odoslať správu auditu" + +#: plugins/sudoers/logging.c:106 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:134 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:159 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:162 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "" + +#: plugins/sudoers/logging.c:211 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:213 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/logging.c:220 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:222 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:224 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:259 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:262 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:266 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:269 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:306 plugins/sudoers/sudoers.c:471 +#: plugins/sudoers/sudoers.c:473 plugins/sudoers/sudoers.c:475 +#: plugins/sudoers/sudoers.c:477 plugins/sudoers/sudoers.c:1222 +#: plugins/sudoers/sudoers.c:1224 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:308 plugins/sudoers/sudoers.c:467 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:325 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:351 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:422 plugins/sudoers/logging.c:484 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/sudoers/logging.c:572 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:580 plugins/sudoers/logging.c:636 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:626 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:651 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:689 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/match.c:606 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:639 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:653 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:117 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:502 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:503 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:517 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:526 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:240 plugins/sudoers/testsudoers.c:253 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:636 plugins/sudoers/visudo.c:839 +#, c-format +msgid "unable to execute %s" +msgstr "nie je možné vykonať %s" + +#: plugins/sudoers/policy.c:769 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:771 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:775 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:778 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:780 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:781 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:814 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:136 plugins/sudoers/pwutil.c:153 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:147 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:191 plugins/sudoers/pwutil.c:207 +#: plugins/sudoers/pwutil.c:250 plugins/sudoers/pwutil.c:294 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:202 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:427 plugins/sudoers/pwutil.c:444 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:438 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:476 plugins/sudoers/pwutil.c:492 +#: plugins/sudoers/pwutil.c:524 plugins/sudoers/pwutil.c:565 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:487 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:676 plugins/sudoers/pwutil.c:710 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:682 plugins/sudoers/pwutil.c:715 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "" + +#: plugins/sudoers/pwutil.c:705 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:438 +#: plugins/sudoers/set_perms.c:841 plugins/sudoers/set_perms.c:1138 +#: plugins/sudoers/set_perms.c:1430 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:369 +#: plugins/sudoers/set_perms.c:446 plugins/sudoers/set_perms.c:708 +#: plugins/sudoers/set_perms.c:849 plugins/sudoers/set_perms.c:1067 +#: plugins/sudoers/set_perms.c:1146 plugins/sudoers/set_perms.c:1363 +#: plugins/sudoers/set_perms.c:1438 plugins/sudoers/set_perms.c:1527 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:493 +#: plugins/sudoers/set_perms.c:1197 plugins/sudoers/set_perms.c:1470 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:590 +#: plugins/sudoers/set_perms.c:978 plugins/sudoers/set_perms.c:1274 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:595 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1279 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:606 +#: plugins/sudoers/set_perms.c:992 plugins/sudoers/set_perms.c:1288 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:624 +#: plugins/sudoers/set_perms.c:1008 plugins/sudoers/set_perms.c:1304 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:356 plugins/sudoers/set_perms.c:695 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1350 +#: plugins/sudoers/set_perms.c:1514 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:333 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:341 plugins/sudoers/sssd.c:350 +#: plugins/sudoers/sssd.c:359 plugins/sudoers/sssd.c:368 +#: plugins/sudoers/sssd.c:377 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:172 plugins/sudoers/testsudoers.c:245 +#: plugins/sudoers/visudo.c:223 plugins/sudoers/visudo.c:565 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/sudoers.c:197 plugins/sudoers/sudoers.c:239 +#: plugins/sudoers/sudoers.c:833 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:275 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:332 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:396 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:410 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:411 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:466 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:778 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:886 plugins/sudoers/visudo.c:426 +#: plugins/sudoers/visudo.c:665 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:890 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie je regulárny súbor" + +#: plugins/sudoers/sudoers.c:894 plugins/sudoers/timestamp.c:225 toke.l:947 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastnený identifikátorom uid %u a mal by byť vlastnený %u" + +#: plugins/sudoers/sudoers.c:898 toke.l:954 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:902 toke.l:959 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:933 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:952 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1031 plugins/sudoers/sudoers.c:1059 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1126 plugins/sudoers/testsudoers.c:385 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:232 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:245 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:251 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:254 plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s version %s\n" +msgstr "%s verzia %s\n" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:308 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:314 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:315 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:368 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:401 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:611 plugins/sudoers/sudoreplay.c:636 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:658 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:662 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:677 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:680 plugins/sudoers/sudoreplay.c:1060 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:684 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:693 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:695 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:697 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:746 +#, c-format +msgid "unknown search type %d" +msgstr "neznámy typ vyhľadávania %d" + +#: plugins/sudoers/sudoreplay.c:784 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: neplatný súbor záznamu" + +#: plugins/sudoers/sudoreplay.c:802 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: chýba pole časovej značky" + +#: plugins/sudoers/sudoreplay.c:809 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: časová značka %s: %s" + +#: plugins/sudoers/sudoreplay.c:816 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:825 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:834 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1197 +#, c-format +msgid "usage: %s [-h] [-d dir] [-m num] [-s num] ID\n" +msgstr "použitie: %s [-h] [-d adresár] [-m číslo] [-s číslo] ID\n" + +#: plugins/sudoers/sudoreplay.c:1200 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "použitie: %s [-h] [-d adresár] -l [hľadaný výraz]\n" + +#: plugins/sudoers/sudoreplay.c:1209 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1211 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Voľby:\n" +" -d, --directory=adresárr určí adresár pre záznamy relácie\n" +" -f, --filter=filter určuje, ktoré vstupno-výstupné typy sa majú zorbaziť\n" +" -h, --help zorbazí správu pomocníka a skončí\n" +" -l, --list vypíše identifikátory dostupných relácií, s voliteľným výrazom\n" +" -m, --max-wait=číslo maximálny počet sekúnd čakania medzi udalosťami\n" +" -s, --speed=číslo zrýchli alebo spomalí výstup\n" +" -V, --version zobrazí informácie o verzii a skončí" + +#: plugins/sudoers/testsudoers.c:324 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:327 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Príkaz povolený" + +#: plugins/sudoers/testsudoers.c:328 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Príkaz odmietnutý" + +#: plugins/sudoers/testsudoers.c:328 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Príkaz nevyhovujúci" + +#: plugins/sudoers/timestamp.c:233 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:309 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:742 plugins/sudoers/timestamp.c:809 +#: plugins/sudoers/visudo.c:486 plugins/sudoers/visudo.c:492 +msgid "unable to read the clock" +msgstr "nie je možné čítať hodiny" + +#: plugins/sudoers/timestamp.c:756 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:768 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:906 plugins/sudoers/timestamp.c:926 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:254 plugins/sudoers/visudo.c:617 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:319 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:337 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:454 +msgid "write error" +msgstr "chyba zápisu" + +#: plugins/sudoers/visudo.c:499 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:506 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:512 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:534 +#, c-format +msgid "%s unchanged" +msgstr "%s nezmenený" + +#: plugins/sudoers/visudo.c:560 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:571 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:608 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:667 plugins/sudoers/visudo.c:676 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:671 plugins/sudoers/visudo.c:681 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:698 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:712 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:722 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:784 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:798 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:846 +#, c-format +msgid "unable to run %s" +msgstr "nie je možné spustiť %s" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:879 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:904 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:920 plugins/sudoers/visudo_json.c:1041 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:923 plugins/sudoers/visudo_json.c:1044 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/visudo.c:931 plugins/sudoers/visudo.c:938 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:985 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Error: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1082 +#, c-format +msgid "Warning: cycle in %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Error: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1087 +#, c-format +msgid "Warning: %s `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1230 +#, c-format +msgid "Warning: unused %s `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1343 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - bezpečne upraví súbor sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1345 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" + +#: plugins/sudoers/visudo_json.c:1018 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: toke.l:918 +msgid "too many levels of includes" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/sl.mo b/utsudo-0.0.2/plugins/sudoers/po/sl.mo new file mode 100644 index 0000000000000000000000000000000000000000..832663fdea5839ddb8f4018e0452d3f2b05a1f44 GIT binary patch literal 36413 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 m_fPC{r?)G+8my)XLy=GNoAQV%lnCQr%@6, 2012. +# Klemen Košir , 2012 - 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.7b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2013-04-02 10:40-0400\n" +"PO-Revision-Date: 2013-04-06 09:44+0100\n" +"Last-Translator: Klemen Košir \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" +"X-Generator: Poedit 1.5.5\n" + +#: confstr.sh:2 plugins/sudoers/auth/pam.c:340 +msgid "Password:" +msgstr "Geslo:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** Varnostni podatki za %h ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Prosimo, poskusite znova." + +#: plugins/sudoers/alias.c:124 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Vzdevek `%s' je že določen" + +#: plugins/sudoers/auth/bsdauth.c:77 +#, c-format +msgid "unable to get login class for user %s" +msgstr "prijavnega razreda uporabnika %s ni mogoče pridobiti" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "unable to begin bsd authentication" +msgstr "ni mogoče začeti overitve bsd" + +#: plugins/sudoers/auth/bsdauth.c:91 +msgid "invalid authentication type" +msgstr "neveljavna vrsta overitve" + +#: plugins/sudoers/auth/bsdauth.c:100 +msgid "unable to setup authentication" +msgstr "ni mogoče nastaviti overitve" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "ni mogoče brati nastavitev fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "ni se mogoče povezati s strežnikom overitve" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +#, c-format +msgid "lost connection to authentication server" +msgstr "povezava s strežnikom overitve je bila izgubljena" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"napaka strežnika overitve:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to unparse princ ('%s'): %s" +msgstr "%s: ni mogoče odrazčleniti princ ('%s'): %s" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ni mogoče razčleniti '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve ccache: %s" +msgstr "%s: ni mogoče razrešiti ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: ni mogoče dodeliti možnosti: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: ni mogoče dobiti poverila: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize ccache: %s" +msgstr "%s: ni mogoče začeti ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store cred in ccache: %s" +msgstr "%s: ni mogoče shraniti cred v ccache: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: ni mogoče pridobiti predstojnika gostitve: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: ni mogoče preveriti TGT! Možen napad!: %s" + +#: plugins/sudoers/auth/pam.c:100 +msgid "unable to initialize PAM" +msgstr "ni mogoče začeti PAM" + +#: plugins/sudoers/auth/pam.c:145 +msgid "account validation failure, is your account locked?" +msgstr "potrditev veljavnosti računa je spodletela, je vaš račun zaklenjen?" + +#: plugins/sudoers/auth/pam.c:149 +msgid "Account or password is expired, reset your password and try again" +msgstr "Geslo ali račun je potekel, ponastavite svoje geslo in poskusite znova" + +#: plugins/sudoers/auth/pam.c:156 +#, c-format +msgid "pam_chauthtok: %s" +msgstr "pam_chauthtok: %s" + +#: plugins/sudoers/auth/pam.c:160 +msgid "Password expired, contact your system administrator" +msgstr "Veljavnost gesla je potekla. Stopite v stik s svojim sistemskim skrbnikom" + +#: plugins/sudoers/auth/pam.c:164 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Račun je potekel ali pa nastavitvam PAM primanjkuje odsek \"account\" za sudo, obrnite se na sistemskega skrbnika" + +#: plugins/sudoers/auth/pam.c:181 +#, c-format +msgid "pam_authenticate: %s" +msgstr "pam_authenticate: %s" + +#: plugins/sudoers/auth/pam.c:339 +msgid "Password: " +msgstr "Geslo: " + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:212 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ne obstajate v podatkovni zbirki %s" + +#: plugins/sudoers/auth/securid5.c:80 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "začenjanje knjižnice ACE API je spodletelo" + +#: plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "ni mogoče navezati stika s strežnikom SecurID" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "ID uporabnika je zaklenjen zaradi overitve SecurID" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +#, c-format +msgid "invalid username length for SecurID" +msgstr "neveljavna dolžina imena uporabnika za SecurID" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "neveljavna ročica overitve za SecurID" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "sporazumevanje SecurID je spodletelo" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +#, c-format +msgid "unknown SecurID error" +msgstr "neznana napaka SecurID" + +#: plugins/sudoers/auth/securid5.c:165 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "neveljavna dolžina gesla za SecurID" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "ni mogoče začeti seje SIA" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "neveljavni načini overitve" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may mix standalone and non-standalone authentication." +msgstr "Neveljavni načini overitve so kodno prevedeni v sudo! Mešate lahko samostojno in nesamostojno overjanje." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "ni načinov overjanja" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ni načinov overitve, kodno prevedenih v sudo! Če želite izklopiti overjanje, uporabite nastavitveno možnost --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Načini overjanja:" + +#: plugins/sudoers/bsm_audit.c:60 plugins/sudoers/bsm_audit.c:63 +#: plugins/sudoers/bsm_audit.c:112 plugins/sudoers/bsm_audit.c:116 +#: plugins/sudoers/bsm_audit.c:168 plugins/sudoers/bsm_audit.c:172 +#, c-format +msgid "getaudit: failed" +msgstr "getaudit: spodletelo" + +#: plugins/sudoers/bsm_audit.c:90 plugins/sudoers/bsm_audit.c:153 +#, c-format +msgid "Could not determine audit condition" +msgstr "Pogoja presoje varnosti ni bilo mogoče določiti" + +#: plugins/sudoers/bsm_audit.c:101 +#, c-format +msgid "getauid failed" +msgstr "getauid je spodletel" + +#: plugins/sudoers/bsm_audit.c:103 plugins/sudoers/bsm_audit.c:162 +#, c-format +msgid "au_open: failed" +msgstr "au_open: spodletelo" + +#: plugins/sudoers/bsm_audit.c:118 plugins/sudoers/bsm_audit.c:174 +#, c-format +msgid "au_to_subject: failed" +msgstr "au_to_subject: spodletelo" + +#: plugins/sudoers/bsm_audit.c:122 plugins/sudoers/bsm_audit.c:178 +#, c-format +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: spodletelo" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:187 +#, c-format +msgid "au_to_return32: failed" +msgstr "au_to_return32: spodletelo" + +#: plugins/sudoers/bsm_audit.c:129 plugins/sudoers/bsm_audit.c:190 +#, c-format +msgid "unable to commit audit record" +msgstr "ni bilo mogoče uveljaviti zapisa presoje varnosti" + +#: plugins/sudoers/bsm_audit.c:160 +#, c-format +msgid "getauid: failed" +msgstr "getauid: spodletelo" + +#: plugins/sudoers/bsm_audit.c:183 +#, c-format +msgid "au_to_text: failed" +msgstr "au_to_text: spodletelo" + +#: plugins/sudoers/check.c:174 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Verjetno vam je skrbnik sistemov že pridigal o varnosti,\n" +"vendar si vseeno zapomnite naslednja pravila:\n" +"\n" +" #1) Spoštujte zasebnost drugih.\n" +" #2) Premislite, preden izvedete ukaze.\n" +" #3) Velika moč prinaša veliko odgovornost.\n" +"\n" + +#: plugins/sudoers/check.c:212 plugins/sudoers/check.c:218 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:566 +#, c-format +msgid "unknown uid: %u" +msgstr "neznan ID uporabnika: %u" + +#: plugins/sudoers/check.c:215 plugins/sudoers/policy.c:635 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:359 +#, c-format +msgid "unknown user: %s" +msgstr "neznan uporabnik: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Pripomoček syslog, če se syslog uporablja za beleženje: %s" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Prednost syslog, ko se uporabnik uspešno overi: %s" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Prednost syslog, ko se uporabnik ne overi uspešno: %s" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "postavi poziv OTP v svojo vrstico" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "Prezri '.' v $PATH" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Vedno pošlji pošto, kadar se zažene sudo" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Pošlji pošto, če overitev uporabnika spodleti" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Pošlji pošto, če uporabnik ni v sudoers" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Pošlji pošto, če uporabnik ni v sudoers za tega gostitelja" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Pošlji pošto, če uporabniku ni dovoljeno zagnati ukaza" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Uporabi ločen časovni žig za vsako kombinacijo uporabnik/tty" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Poduči uporabnika, ko prvič zažene sudo" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Datoteka, ki vsebuje poduk sudo: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Privzeto zahtevaj od uporabnikov, da se overijo" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Skrbnik lahko zažene sudo" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Beleži ime gostitelja v datoteko dnevnika (ne v sistemski dnevnik)" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "Beleži leto v (ne-syslog) dnevniško datoteko" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Če je sudo poklican brez argumentov, začni lupino" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Postavi $HOME ciljnemu uporabniku, kadar se začne lupina s -s" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Vedno postavi $HOME domači mapi ciljnega uporabnika" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Dovoli zbrati nekaj podrobnosti za uporabna sporočila napak" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Zahtevaj povsem uvrščena imena gostiteljev v datoteki sudoers" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Užali uporabnika, ko vnese nepravilno geslo" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Dovoli uporabniku zagnati sudo samo v primeru, če imajo tty" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo bo spoštoval spremenljivko okolja UREJEVALNIKA" + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "Pozovi za geslo skrbnika, ne uporabnika" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Pozovi za geslo uporabnika runas_default namesto uporabnikovega gesla" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "Pozovi za geslo ciljnega uporabnika namesto uporabnikovega" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Uveljavi privzete vrednosti v ciljnem uporabniškem razredu prijave, če le ta obstaja" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Nastavi spremenljivke okolja LOGNAME in USER" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Nastavi samo dejanski ID uporabnika ciljnemu uporabniku, ne resničnega ID-ja" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Ne začenjaj vektorja skupine ciljnega uporabnika" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "Dolžina, pri kateri se naj prelomijo vrstice datotek beleženja (0 za brez lomljenja):% d" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Časovni potek overitve časovnega žiga: %.1f minut" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Zakasnitev poziva gesla: %.1f minut" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "Število poskusov vnosa gesla: %d" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Uporabniška maska, ki bo uporabljena ali 0777 za uporabo uporabnikove: 0%o" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Pot do datoteke beleženja: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "Pot do programa pošte: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Zastavice za program pošte: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Naslov prejemnika pošte: %s" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Naslov pošiljatelja pošte: %s" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Vrstica zadeve za poštna sporočila: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Nepravilno sporočilo gesla: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Pot do mape časovnega žiga overitve: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Lastnik mape časovnega žiga overitve: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Uporabnikov v tej skupini zahteve gesla in PATH ne omejujejo: %s" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "Privzeti poziv gesla: %s" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Če je poziv gesla nastavljen, bo prepisal sistemski poziv v vseh primerih." + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Privzet uporabnik za izvajanje ukazov kot: %s" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Vrednost, s katerim se bo prepisal $PATH uporabnika: %s" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Pot do urejevalnika za uporabo z visudo: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Kdaj naj bo zahtevano geslo za psevdoukaz 'list': %s" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Kdaj naj bo zahtevano geslo za psevdoukaz 'verify': %s" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Prednaloži preizkusne funkcije, shranjene v knjižnici sudo_noexec" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Če je mapa LDAP na voljo, bodo krajevne datoteke sudoers prezrte" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Opisniki datotek >= %d bodo končani pred izvedbo ukaza" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Če je nastavljeno, lahko uporabniki prepišejo vrednost `closefrom' z možnostjo -C" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "Dovoli uporabnikom nastavljanje poljubnih spremenljivk okolja" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "Ponastavi okolje na privzet nabor spremenljivk" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "Spremenljivke okolja, ki bodo preverjene za smiselnost:" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "Spremenljivke okolja za odstranitev:" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "Spremenljivke okolja za ohranitev:" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Vloga SELinux za uporabo v novi vsebini varnosti: %s" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Vrsta SELinux za uporabo v novi vsebini varnosti: %s" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Pot do določene sudo datoteke okolja: %s" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Jezikovna oznaka za uporabo pri razčlenjevanju sudoers: %s" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Dovoli programu sudo, da vpraša za geslo, čeprav bi bilo le-to vidno" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Zagotovi viden odziv ob vnosu gesla ob vnosu uporabnika" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Uporabi hitrejše razširjanje imen poti, ki je manj natančno, vendar ne dostopa do datotečnega sistema" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Uporabniška maska v sudoers bo prepisala uporabnikovo tudi, če je bolj premisivna" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "Beleži vnos uporabnika za ukaz, ki se izvaja" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "Beleži izpis ukaza, ki se izvaja" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "Stisni dnevnike I/O s pomočjo zlib" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "Vedno zaženi ukaze v psevdo-tty" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Vstavek za podporo skupinam, ki niso del Unixa: %s" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Mapa, v kateri bodo shranjeni dnevniki vnosov/izpisov: %s" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Datoteka, v kateri bo shranjen dnevnik vnosov/izpisov: %s" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Dodaj vstop datoteki utmp/utmpx, kadar se dodeljuje pty" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Nastavi uporabnika v utmp uporabniku runas, ne poklicanemu uporabniku" + +#: plugins/sudoers/def_data.c:347 +msgid "Set of permitted privileges" +msgstr "Niz omogočenih dovoljenj" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of limit privileges" +msgstr "Niz omejenih dovoljenj" + +#: plugins/sudoers/def_data.c:355 +msgid "Run commands on a pty in the background" +msgstr "Zaženi ukaze v terminalu v ozadju" + +#: plugins/sudoers/def_data.c:359 +msgid "Create a new PAM session for the command to run in" +msgstr "Ustvari sejo PAM, v kateri se bodo ukazi izvajali" + +#: plugins/sudoers/def_data.c:363 +msgid "Maximum I/O log sequence number" +msgstr "Največja zaporedna številka dnevnika I/O" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:587 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "neznan privzet vnos `%s'" + +#: plugins/sudoers/defaults.c:215 plugins/sudoers/defaults.c:225 +#: plugins/sudoers/defaults.c:245 plugins/sudoers/defaults.c:258 +#: plugins/sudoers/defaults.c:271 plugins/sudoers/defaults.c:284 +#: plugins/sudoers/defaults.c:297 plugins/sudoers/defaults.c:317 +#: plugins/sudoers/defaults.c:327 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "vrednost `%s' je neveljavna za možnost `%s'" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:236 plugins/sudoers/defaults.c:253 +#: plugins/sudoers/defaults.c:266 plugins/sudoers/defaults.c:279 +#: plugins/sudoers/defaults.c:292 plugins/sudoers/defaults.c:312 +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "no value specified for `%s'" +msgstr "za `%s' ni določena nobena vrednost" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "vrednosti za `%s' se morajo začeti s '/'" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "option `%s' does not take a value" +msgstr "možnost `%s' ne sprejme vrednosti" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:420 plugins/sudoers/policy.c:427 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:654 +#: plugins/sudoers/testsudoers.c:243 +#, c-format +msgid "internal error, %s overflow" +msgstr "notranja napaka, prekoračitev funkcije %s" + +#: plugins/sudoers/env.c:367 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: pokvarjen envp, neujemanje dolžine" + +#: plugins/sudoers/env.c:1012 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "nimate dovoljenj nastavljati naslednjih spremenljivk okolja: %s" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s mora biti v lasti ID-ja uporabnika %d" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s mora biti zapisljiv samo za lastnika" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "ni mogoče uporabiti dlopen %s: %s" + +#: plugins/sudoers/group_plugin.c:118 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "ni mogoče najti simbola \"group_plugin\" v %s" + +#: plugins/sudoers/group_plugin.c:123 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: nezdružljiva večja različica vstavka skupin %d, pričakovana %d" + +#: plugins/sudoers/interfaces.c:119 +msgid "Local IP address and netmask pairs:\n" +msgstr "Pari krajevnih naslovov IP in omrežnih mask:\n" + +#: plugins/sudoers/iolog.c:131 plugins/sudoers/iolog.c:144 +#: plugins/sudoers/timestamp.c:199 plugins/sudoers/timestamp.c:243 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s že obstaja, toda ni mapa (0%o)" + +#: plugins/sudoers/iolog.c:141 plugins/sudoers/iolog.c:155 +#: plugins/sudoers/iolog.c:159 plugins/sudoers/timestamp.c:164 +#: plugins/sudoers/timestamp.c:220 plugins/sudoers/timestamp.c:270 +#, c-format +msgid "unable to mkdir %s" +msgstr "ustvarjenje mape %s z mkdir ni mogoče" + +#: plugins/sudoers/iolog.c:217 plugins/sudoers/sudoers.c:708 +#: plugins/sudoers/sudoreplay.c:354 plugins/sudoers/sudoreplay.c:815 +#: plugins/sudoers/sudoreplay.c:978 plugins/sudoers/timestamp.c:154 +#: plugins/sudoers/visudo.c:809 +#, c-format +msgid "unable to open %s" +msgstr "ni mogoče odpreti %s" + +#: plugins/sudoers/iolog.c:250 plugins/sudoers/sudoers.c:711 +#, c-format +msgid "unable to read %s" +msgstr "ni mogoče brati %s" + +#: plugins/sudoers/iolog.c:274 plugins/sudoers/timestamp.c:158 +#, c-format +msgid "unable to write to %s" +msgstr "ni mogoče pisati v %s" + +#: plugins/sudoers/iolog.c:334 +#, c-format +msgid "unable to create %s" +msgstr "ni mogoče ustvariti %s" + +#: plugins/sudoers/ldap.c:385 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: vrednost vrat je prevelika" + +#: plugins/sudoers/ldap.c:408 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "sudo_ldap_conf_add_ports: med razširjanjem hostbuf je zmanjkalo prostora" + +#: plugins/sudoers/ldap.c:438 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "nepodprta vrsta uri-ja LDAP: %s" + +#: plugins/sudoers/ldap.c:467 +#, c-format +msgid "invalid uri: %s" +msgstr "neveljaven uri: %s" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "ni mogoče mešati URI-jev ldap in ldaps" + +#: plugins/sudoers/ldap.c:477 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "ni mogoče mešati ldaps in starttls" + +#: plugins/sudoers/ldap.c:496 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "sudo_ldap_parse_uri: med izgradnjo hostbuf je zmanjkalo prostora" + +#: plugins/sudoers/ldap.c:570 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "ni mogoče začenjati potrdila SSL in ključa db: %s" + +#: plugins/sudoers/ldap.c:573 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "za uporabo SSL-ja morate nastaviti TSL_CERT v datoteki %s" + +#: plugins/sudoers/ldap.c:996 +#, c-format +msgid "unable to get GMT time" +msgstr "ni mogoče dobiti časa GMT" + +#: plugins/sudoers/ldap.c:1002 +#, c-format +msgid "unable to format timestamp" +msgstr "ni mogoče oblikovati časovnega žiga" + +#: plugins/sudoers/ldap.c:1010 +#, c-format +msgid "unable to build time filter" +msgstr "ni mogoče izgraditi časovnega filtra" + +#: plugins/sudoers/ldap.c:1229 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "sudo_ldap_build_pass1 neujemanje dodelitve" + +#: plugins/sudoers/ldap.c:1776 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Vloga LDAP: %s\n" + +#: plugins/sudoers/ldap.c:1778 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"Vloga LDAP: NEZNANA\n" + +#: plugins/sudoers/ldap.c:1825 +#, c-format +msgid " Order: %s\n" +msgstr " Vrstni red: %s\n" + +#: plugins/sudoers/ldap.c:1833 plugins/sudoers/parse.c:515 +#: plugins/sudoers/sssd.c:1173 +#, c-format +msgid " Commands:\n" +msgstr " Ukazi:\n" + +#: plugins/sudoers/ldap.c:2255 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "ni mogoče začeti LDAP: %s" + +#: plugins/sudoers/ldap.c:2289 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls je določen, toda knjižnice LDAP ne podpirajo ldap_start_tls_s() ali ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:2525 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "neveljaven atribut sudoOrder: %s" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "ni mogoče odpreti nadzornega sistema" + +#: plugins/sudoers/linux_audit.c:93 +#, c-format +msgid "unable to send audit message" +msgstr "ni mogoče poslati nadzornega sporočila" + +#: plugins/sudoers/logging.c:140 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:168 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (ukaz) %s" + +#: plugins/sudoers/logging.c:194 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "ni mogoče odpreti datoteke dnevnika: %s: %s" + +#: plugins/sudoers/logging.c:197 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "ni mogoče zakleniti datoteke dnevnika: %s: %s" + +#: plugins/sudoers/logging.c:245 +msgid "No user or host" +msgstr "Brez uporabnika ali gostitelja" + +#: plugins/sudoers/logging.c:247 +msgid "validation failure" +msgstr "potrjevanje veljavnosti ni uspelo" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT in sudoers" +msgstr "uporabnika NI v sudoers" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT authorized on host" +msgstr "uporabnik NI pooblaščen na gostitelju" + +#: plugins/sudoers/logging.c:258 +msgid "command not allowed" +msgstr "ukaz ni dovoljen" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s ni v datoteki sudoers. Ta dogodek bo zabeležen.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s nima dovoljenj za izvajanje sudo na %s. Ta dogodek bo zabeležen.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Uporabnik %s ne sme izvajati sudo na %s.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Uporabnik %s ne sme zagnati '%s%s%s' kot %s%s%s na %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:383 +#: plugins/sudoers/sudoers.c:384 plugins/sudoers/sudoers.c:386 +#: plugins/sudoers/sudoers.c:387 plugins/sudoers/sudoers.c:1001 +#: plugins/sudoers/sudoers.c:1002 +#, c-format +msgid "%s: command not found" +msgstr "%s: ukaza ni bilo mogoče najti" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:379 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" +"prezrtje `%s', najdenega v '.'\n" +"Uporabite `sudo ./%s', če je to `%s', ki ga želite zagnati." + +#: plugins/sudoers/logging.c:353 +msgid "authentication failure" +msgstr "napaka overitve" + +#: plugins/sudoers/logging.c:379 +msgid "a password is required" +msgstr "zahtevano je geslo" + +#: plugins/sudoers/logging.c:443 plugins/sudoers/logging.c:487 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "%d nepravilnih poskusov vnosa gesla" +msgstr[1] "%d nepravilen poskus vnosa gesla" +msgstr[2] "%d nepravilna poskusa vnosa gesla" +msgstr[3] "%d nepravilni poskusi vnosa gesla" + +#: plugins/sudoers/logging.c:566 +#, c-format +msgid "unable to fork" +msgstr "ni mogoče razvejiti" + +#: plugins/sudoers/logging.c:573 plugins/sudoers/logging.c:629 +#, c-format +msgid "unable to fork: %m" +msgstr "ni mogoče razvejiti: %m" + +#: plugins/sudoers/logging.c:619 +#, c-format +msgid "unable to open pipe: %m" +msgstr "ni mogoče odpreti cevi: %m" + +#: plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "ni mogoče podvojiti stdin: %m" + +#: plugins/sudoers/logging.c:680 +#, c-format +msgid "unable to execute %s: %m" +msgstr "ni mogoče izvesti %s: %m" + +#: plugins/sudoers/logging.c:899 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "notranja napaka: premalo prostora za vrstico dnevnika" + +#: plugins/sudoers/parse.c:124 +#, c-format +msgid "parse error in %s near line %d" +msgstr "napaka razčlenjevanja v %s blizu vrstice %d" + +#: plugins/sudoers/parse.c:127 +#, c-format +msgid "parse error in %s" +msgstr "napaka med razčlenjevanjem datoteke %s" + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Vnos sudoers:\n" + +#: plugins/sudoers/parse.c:463 +#, c-format +msgid " RunAsUsers: " +msgstr " ZaženiKotUporabniki: " + +#: plugins/sudoers/parse.c:477 +#, c-format +msgid " RunAsGroups: " +msgstr " ZaženiKotSkupine: " + +#: plugins/sudoers/parse.c:486 +#, c-format +msgid " Options: " +msgstr " Možnosti: " + +#: plugins/sudoers/policy.c:517 plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to execute %s" +msgstr "ni mogoče izvršiti %s" + +#: plugins/sudoers/policy.c:659 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Vstavek pravilnika sudoers različica %s\n" + +#: plugins/sudoers/policy.c:661 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Datoteka slovnice sudoers različica %d\n" + +#: plugins/sudoers/policy.c:665 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Pot sudoers: %s\n" + +#: plugins/sudoers/policy.c:668 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "pot nsswitch: %s\n" + +#: plugins/sudoers/policy.c:670 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "pot ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:671 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "pot ldap.secret: %s\n" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "ni mogoče predpomniti ID-ja uporabnika %u, že obstaja" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "ni mogoče predpomniti uporabnika %s, že obstaja" + +#: plugins/sudoers/pwutil.c:374 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "ni mogoče predpomniti ID-ja skupine %u, že obstaja" + +#: plugins/sudoers/pwutil.c:410 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "ni mogoče predpomniti skupine %s, že obstaja" + +#: plugins/sudoers/pwutil.c:564 plugins/sudoers/pwutil.c:586 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "seznama skupina za %s ni mogoče predpomniti, saj že obstaja" + +#: plugins/sudoers/pwutil.c:584 +#, c-format +msgid "unable to parse groups for %s" +msgstr "skupin za %s ni mogoče razčleniti" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:445 +#: plugins/sudoers/set_perms.c:846 plugins/sudoers/set_perms.c:1141 +#: plugins/sudoers/set_perms.c:1431 +msgid "perm stack overflow" +msgstr "prekoračitev trajnega sklada" + +#: plugins/sudoers/set_perms.c:130 plugins/sudoers/set_perms.c:453 +#: plugins/sudoers/set_perms.c:854 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1439 +msgid "perm stack underflow" +msgstr "prekoračitev spodnje meje trajnega sklada" + +#: plugins/sudoers/set_perms.c:189 plugins/sudoers/set_perms.c:500 +#: plugins/sudoers/set_perms.c:1200 plugins/sudoers/set_perms.c:1471 +msgid "unable to change to root gid" +msgstr "številke skupine skrbnika ni mogoče spremeniti" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1277 +msgid "unable to change to runas gid" +msgstr "ni mogoče spremeniti v ID-ja skupine runas" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:609 +#: plugins/sudoers/set_perms.c:993 plugins/sudoers/set_perms.c:1287 +msgid "unable to change to runas uid" +msgstr "ni mogoče spremeniti v ID-ja uporabnika runas" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:627 +#: plugins/sudoers/set_perms.c:1009 plugins/sudoers/set_perms.c:1303 +msgid "unable to change to sudoers gid" +msgstr "ni mogoče spremeniti ID-ja skupine sudoers" + +#: plugins/sudoers/set_perms.c:361 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1055 plugins/sudoers/set_perms.c:1349 +#: plugins/sudoers/set_perms.c:1515 +msgid "too many processes" +msgstr "preveč opravil" + +#: plugins/sudoers/set_perms.c:1583 +msgid "unable to set runas group vector" +msgstr "ni mogoče nastaviti vektorja skupine runas" + +#: plugins/sudoers/sssd.c:256 +#, c-format +msgid "Unable to dlopen %s: %s" +msgstr "ni mogoče uporabiti dlopen %s: %s" + +#: plugins/sudoers/sssd.c:257 +#, c-format +msgid "Unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Vira SSS ni mogoče zagnati. Ali je SSSD pravilno nameščen?" + +#: plugins/sudoers/sssd.c:263 plugins/sudoers/sssd.c:271 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:285 +#: plugins/sudoers/sssd.c:292 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "simbola \"%s\" ni mogoče najti v %s" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "Ujemajoči vpisi privzetih vrednosti za %s na tem gostitelju:\n" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas in ukazno določene privzete vrednosti za %s:\n" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "Na tem gostitelju lahko uporabnik %s zažene naslednje ukaze:\n" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Uporabniku %s ni dovoljeno zagnati sudo na %s.\n" + +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:193 +#: plugins/sudoers/sudoers.c:673 +msgid "problem with defaults entries" +msgstr "težave z vnosi privzetih vrednosti" + +#: plugins/sudoers/sudoers.c:165 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "najdenih niso bili nobeni veljavni viri sudoers, končanje" + +#: plugins/sudoers/sudoers.c:227 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers določa, da skrbniku ni dovoljeno uporabiti sudo" + +#: plugins/sudoers/sudoers.c:234 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "ni vam dovoljeno uporabiti možnosti -C" + +#: plugins/sudoers/sudoers.c:315 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "lastnik časovnega žiga (%s): ni takšnega uporabnika" + +#: plugins/sudoers/sudoers.c:329 +msgid "no tty" +msgstr "brez tty" + +#: plugins/sudoers/sudoers.c:330 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "za izvajanje sudo morate imeti tty" + +#: plugins/sudoers/sudoers.c:378 +msgid "command in current directory" +msgstr "ukaz v trenutni mapi" + +#: plugins/sudoers/sudoers.c:395 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "nimate dovoljenj za ohranjanje okolja" + +#: plugins/sudoers/sudoers.c:723 plugins/sudoers/timestamp.c:215 +#: plugins/sudoers/timestamp.c:259 plugins/sudoers/timestamp.c:327 +#: plugins/sudoers/visudo.c:310 plugins/sudoers/visudo.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "stanja %s ni mogoče dobiti" + +#: plugins/sudoers/sudoers.c:726 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ni običajna datoteka" + +#: plugins/sudoers/sudoers.c:729 toke.l:842 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je v lasti ID-ja uporabnika %u, moral bi biti %u" + +#: plugins/sudoers/sudoers.c:733 toke.l:849 +#, c-format +msgid "%s is world writable" +msgstr "v datoteko %s lahko zapisujejo vsi uporabniki" + +#: plugins/sudoers/sudoers.c:736 toke.l:854 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s je v lasti ID-ja skupine %u, moral bi biti %u" + +#: plugins/sudoers/sudoers.c:763 +#, c-format +msgid "only root can use `-c %s'" +msgstr "samo skrbnik lahko uporabi `-c %s'" + +#: plugins/sudoers/sudoers.c:780 plugins/sudoers/sudoers.c:782 +#, c-format +msgid "unknown login class: %s" +msgstr "neznan razred prijave: %s" + +#: plugins/sudoers/sudoers.c:814 +#, c-format +msgid "unable to resolve host %s" +msgstr "ni mogoče razrešiti gostitelja %s" + +#: plugins/sudoers/sudoers.c:866 plugins/sudoers/testsudoers.c:377 +#, c-format +msgid "unknown group: %s" +msgstr "neznana skupina: %s" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "invalid filter option: %s" +msgstr "neveljavna možnost filtra: %s" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid max wait: %s" +msgstr "neveljavna zgornja meja čakanja: %s" + +#: plugins/sudoers/sudoreplay.c:311 +#, c-format +msgid "invalid speed factor: %s" +msgstr "neveljaven dejavnik hitrosti: %s" + +#: plugins/sudoers/sudoreplay.c:314 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s version %s\n" +msgstr "%s različica %s\n" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/časovna uskladitev: %s" + +#: plugins/sudoers/sudoreplay.c:345 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/časovna uskladitev: %s" + +#: plugins/sudoers/sudoreplay.c:363 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "Izpisovanje dnevnika seje sudo: %s\n" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Opozorilo: terminal je premajhen za pravilno izpisovanje dnevnika.\n" + +#: plugins/sudoers/sudoreplay.c:370 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Geometrija dnevnika je %d x %d, medtem ko je geometrija terminala %d x %d." + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "ni mogoče nastaviti tty na surov način" + +#: plugins/sudoers/sudoreplay.c:416 +#, c-format +msgid "invalid timing file line: %s" +msgstr "neveljavna vrstica datoteke časovne uskladitve: %s" + +#: plugins/sudoers/sudoreplay.c:499 +#, c-format +msgid "writing to standard output" +msgstr "pisanje na standardni izhod" + +#: plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#: plugins/sudoers/sudoreplay.c:641 plugins/sudoers/sudoreplay.c:666 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "dvoumen izraz \"%s\"" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "preveč izrazov z oklepaji, največje število %d" + +#: plugins/sudoers/sudoreplay.c:694 +#, c-format +msgid "unmatched ')' in expression" +msgstr "v izrazu je neujemajoč ')'" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "naznan iskalni izraz \"%s\"" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "%s zahteva argument" + +#: plugins/sudoers/sudoreplay.c:718 +#, c-format +msgid "invalid regular expression: %s" +msgstr "neveljaven logični izraz: %s" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "ni mogoče razčleniti datuma \"%s\"" + +#: plugins/sudoers/sudoreplay.c:737 +#, c-format +msgid "unmatched '(' in expression" +msgstr "v izrazu je neujemajoč '('" + +#: plugins/sudoers/sudoreplay.c:739 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "neveljaven zaključni \"or\"" + +#: plugins/sudoers/sudoreplay.c:741 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "neveljaven zaključni \"!\"" + +#: plugins/sudoers/sudoreplay.c:1058 +#, c-format +msgid "invalid regex: %s" +msgstr "neveljavni logični izraz: %s" + +#: plugins/sudoers/sudoreplay.c:1182 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "uporaba: %s [-h] [-d mapa] [-m zg_meja_čakanja] [-s faktor_hitrosti] ID\n" + +#: plugins/sudoers/sudoreplay.c:1185 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "uporaba: %s [-h] [-d mapa] -l [iskalni izraz]\n" + +#: plugins/sudoers/sudoreplay.c:1194 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - ponovno predvajaj dnevnike sej sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1196 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" +"\n" +"Možnosti:\n" +" -d mapa določi mapo za dnevnike sej\n" +" -f filter navedi, katera vrsta I/O se naj prikaže \n" +" -h prikaži sporočilo pomoči in končaj\n" +" -l [izraz] navedi razpoložljive ID-je sej, ki se ujemajo z izrazom\n" +" -m zg_meja_čakanja največje število sekund za čakanje med dogodki\n" +" -s faktor_hitrosti pospeši ali upočasni izhod\n" +" -V prikaži podrobnosti o različici in končaj" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "\tgostitelj se ne ujema" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Ukaz je dovoljen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Ukaz je bil zavrnjen" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Ukaz se ne ujema" + +#: plugins/sudoers/timestamp.c:128 +#, c-format +msgid "timestamp path too long: %s" +msgstr "pot časovnega žiga je predolga : %s" + +#: plugins/sudoers/timestamp.c:202 plugins/sudoers/timestamp.c:246 +#: plugins/sudoers/timestamp.c:291 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "%s je v lasti ID-ja uporabnika %u, moral bi biti ID uporabnika %u" + +#: plugins/sudoers/timestamp.c:207 plugins/sudoers/timestamp.c:251 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "%s je zapisljiv za ne-lastnika (0%o), moral bi biti način 0700" + +#: plugins/sudoers/timestamp.c:285 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "%s obstaja, toda ni običajna datoteka (0%o)" + +#: plugins/sudoers/timestamp.c:297 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "%s je zapisljiv za ne-lastnika (0%o), moral bi biti način 0600" + +#: plugins/sudoers/timestamp.c:352 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "časovni žig je predaleč v prihodnosti: %20.20s" + +#: plugins/sudoers/timestamp.c:406 +#, c-format +msgid "unable to remove %s, will reset to the epoch" +msgstr "%s ni mogoče odstraniti" + +#: plugins/sudoers/timestamp.c:413 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "%s ni mogoče ponastaviti na epoho" + +#: plugins/sudoers/toke_util.c:221 +#, c-format +msgid "fill_args: buffer overflow" +msgstr "fill_args: prekoračitev medpomnilnika" + +#: plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s različica slovnice %d\n" + +#: plugins/sudoers/visudo.c:243 plugins/sudoers/visudo.c:533 +#, c-format +msgid "press return to edit %s: " +msgstr "za urejanje %s pritisnite return: " + +#: plugins/sudoers/visudo.c:326 plugins/sudoers/visudo.c:332 +#, c-format +msgid "write error" +msgstr "napaka med pisanjem" + +#: plugins/sudoers/visudo.c:414 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "ni mogoče začeti začasne datoteke (%s), %s nepsremenjeno" + +#: plugins/sudoers/visudo.c:419 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "začasna datoteka brez dolžine (%s), %s nespremenjena" + +#: plugins/sudoers/visudo.c:425 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "urejevalnik (%s) je spodletel, %s nespremenjen" + +#: plugins/sudoers/visudo.c:448 +#, c-format +msgid "%s unchanged" +msgstr "%s nespremenjeno" + +#: plugins/sudoers/visudo.c:477 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "ni mogoče ponovno odpreti začasne datoteke (%s), %s je nespremenjen." + +#: plugins/sudoers/visudo.c:487 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "ni mogoče razčleniti začasne datoteke (%s), neznana napaka" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "notranja napaka, na seznamu ni mogoče najti %s!" + +#: plugins/sudoers/visudo.c:578 plugins/sudoers/visudo.c:587 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "ni mogoče nastaviti (ID uporabnika, ID skupine) od %s do (%u, %u)" + +#: plugins/sudoers/visudo.c:582 plugins/sudoers/visudo.c:592 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "ni mogoče spremeniti načina iz %s na 0%o" + +#: plugins/sudoers/visudo.c:609 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s in %s nista na enakem datotečnem sistemu, uporaba mv za preimenovanje" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "ukaz je spodletel: '%s %s %s', %s nespremenjen" + +#: plugins/sudoers/visudo.c:633 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "napaka med preimenovanjem %s, %s nespremenjen" + +#: plugins/sudoers/visudo.c:695 +msgid "What now? " +msgstr "Kaj pa zdaj? " + +#: plugins/sudoers/visudo.c:709 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Možnosti so:\n" +" (e)ponovno uredi datoteko sudoers\n" +" (x)končaj brez shranjevanja sprememb v datoteko sudoers\n" +" (Q)končaj in shrani spremembe v datoteko sudoers (NEVARNOST!)\n" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to run %s" +msgstr "ni mogoče zagnati %s" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: napačen lastnik (ID uporabnika, ID skupine) moralo bi biti (%u, %u)\n" + +#: plugins/sudoers/visudo.c:790 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: slaba dovoljenja, moral bi biti način 0%o\n" + +#: plugins/sudoers/visudo.c:815 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "razčlenjevanje datoteke %s je spodletelo, neznana napaka" + +#: plugins/sudoers/visudo.c:831 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "napaka razčlenjevanja v %s blizu vrstice %d\n" + +#: plugins/sudoers/visudo.c:834 +#, c-format +msgid "parse error in %s\n" +msgstr "napaka razčlenjevanja v %s\n" + +#: plugins/sudoers/visudo.c:841 plugins/sudoers/visudo.c:846 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: uspešno razčlenjeno\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s busy, try again later" +msgstr "%s zaseden, poskusite ponovno pozneje" + +#: plugins/sudoers/visudo.c:937 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "določen urejevalnik (%s) se ne konča" + +#: plugins/sudoers/visudo.c:960 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "ni mogoče začeti urejevalnika (%s)" + +#: plugins/sudoers/visudo.c:1008 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "najdenega ni nobenega urejevalnika (pot urejevalnika = %s)" + +#: plugins/sudoers/visudo.c:1100 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "Napaka: kroženje v %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1101 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "Opozorilo: kroženje v %s_Alias `%s'" + +#: plugins/sudoers/visudo.c:1104 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "Napaka: %s_Alias `%s' sklicevan, toda ne določen" + +#: plugins/sudoers/visudo.c:1105 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "Warning: %s_Alias `%s' sklicevan, toda ne določen" + +#: plugins/sudoers/visudo.c:1240 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "%s: neuporabljen %s_Alias %s" + +#: plugins/sudoers/visudo.c:1302 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - varno uredi datoteko sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1304 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" +"\n" +"Možnosti:\n" +" -c način samo preverjanja\n" +" -f sudoers določi mesto datoteke sudoers\n" +" -h prikaži sporočilo pomoči in končaj\n" +" -q manj podroben izpis (tih) sporočil skladenjskih napak\n" +" -s strogo preverjanje skladnje\n" +" -V prikaži podrobnosti različice in končaj" + +#: toke.l:815 +msgid "too many levels of includes" +msgstr "preveč stopenj vključitev" diff --git a/utsudo-0.0.2/plugins/sudoers/po/sr.mo b/utsudo-0.0.2/plugins/sudoers/po/sr.mo new file mode 100644 index 0000000000000000000000000000000000000000..4296785db5a6b009252f97ffa9a89de3da3c5ceb GIT binary patch literal 57779 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/sr.po b/utsudo-0.0.2/plugins/sudoers/po/sr.po new file mode 100644 index 0000000..f3f71d5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/sr.po @@ -0,0 +1,2172 @@ +# Serbian translation for sudoers. +# This file is put in the public domain. +# Мирослав Николић , 2014—2017. +msgid "" +msgstr "" +"Project-Id-Version: sudoers-1.8.21b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-08-03 10:04-0600\n" +"PO-Revision-Date: 2017-08-06 14:50+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "грешка синтаксе" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Лозинка корисника %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[судо] лозинка за корисника %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Лозинка: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** информације БЕЗБЕДНОСТИ за %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Извините, покушајте поново." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:307 gram.y:314 gram.y:321 gram.y:328 gram.y:335 +#: gram.y:398 gram.y:406 gram.y:416 gram.y:449 gram.y:456 gram.y:463 +#: gram.y:470 gram.y:552 gram.y:559 gram.y:568 gram.y:577 gram.y:594 +#: gram.y:706 gram.y:713 gram.y:720 gram.y:728 gram.y:824 gram.y:831 +#: gram.y:838 gram.y:845 gram.y:852 gram.y:878 gram.y:885 gram.y:892 +#: gram.y:1015 gram.y:1195 gram.y:1202 plugins/sudoers/alias.c:124 +#: plugins/sudoers/alias.c:139 plugins/sudoers/auth/bsdauth.c:141 +#: plugins/sudoers/auth/kerb5.c:119 plugins/sudoers/auth/kerb5.c:145 +#: plugins/sudoers/auth/pam.c:486 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/auth/sia.c:59 plugins/sudoers/defaults.c:647 +#: plugins/sudoers/defaults.c:902 plugins/sudoers/defaults.c:1073 +#: plugins/sudoers/editor.c:64 plugins/sudoers/editor.c:82 +#: plugins/sudoers/editor.c:93 plugins/sudoers/env.c:233 +#: plugins/sudoers/filedigest.c:120 plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:565 +#: plugins/sudoers/ldap.c:963 plugins/sudoers/ldap.c:1157 +#: plugins/sudoers/ldap.c:1168 plugins/sudoers/ldap.c:1184 +#: plugins/sudoers/ldap.c:1476 plugins/sudoers/ldap.c:1636 +#: plugins/sudoers/ldap.c:1718 plugins/sudoers/ldap.c:1858 +#: plugins/sudoers/ldap.c:1882 plugins/sudoers/ldap.c:1971 +#: plugins/sudoers/ldap.c:1986 plugins/sudoers/ldap.c:2082 +#: plugins/sudoers/ldap.c:2115 plugins/sudoers/ldap.c:2196 +#: plugins/sudoers/ldap.c:2278 plugins/sudoers/ldap.c:2375 +#: plugins/sudoers/ldap.c:3209 plugins/sudoers/ldap.c:3241 +#: plugins/sudoers/ldap.c:3550 plugins/sudoers/ldap.c:3578 +#: plugins/sudoers/ldap.c:3594 plugins/sudoers/ldap.c:3684 +#: plugins/sudoers/ldap.c:3700 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:684 +#: plugins/sudoers/logging.c:942 plugins/sudoers/match.c:617 +#: plugins/sudoers/match.c:664 plugins/sudoers/match.c:714 +#: plugins/sudoers/match.c:738 plugins/sudoers/match.c:826 +#: plugins/sudoers/match.c:915 plugins/sudoers/parse.c:248 +#: plugins/sudoers/parse.c:260 plugins/sudoers/parse.c:275 +#: plugins/sudoers/parse.c:287 plugins/sudoers/policy.c:419 +#: plugins/sudoers/policy.c:653 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:139 plugins/sudoers/pwutil.c:210 +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:457 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:591 +#: plugins/sudoers/pwutil.c:749 plugins/sudoers/pwutil.c:806 +#: plugins/sudoers/pwutil.c:851 plugins/sudoers/pwutil.c:908 +#: plugins/sudoers/sssd.c:162 plugins/sudoers/sssd.c:194 +#: plugins/sudoers/sssd.c:237 plugins/sudoers/sssd.c:244 +#: plugins/sudoers/sssd.c:280 plugins/sudoers/sssd.c:390 +#: plugins/sudoers/sssd.c:459 plugins/sudoers/sssd.c:1057 +#: plugins/sudoers/sssd.c:1236 plugins/sudoers/sssd.c:1250 +#: plugins/sudoers/sssd.c:1266 plugins/sudoers/sudoers.c:263 +#: plugins/sudoers/sudoers.c:273 plugins/sudoers/sudoers.c:281 +#: plugins/sudoers/sudoers.c:365 plugins/sudoers/sudoers.c:681 +#: plugins/sudoers/sudoers.c:806 plugins/sudoers/sudoers.c:850 +#: plugins/sudoers/sudoers.c:1122 plugins/sudoers/sudoers_debug.c:107 +#: plugins/sudoers/sudoreplay.c:1234 plugins/sudoers/sudoreplay.c:1346 +#: plugins/sudoers/sudoreplay.c:1386 plugins/sudoers/sudoreplay.c:1395 +#: plugins/sudoers/sudoreplay.c:1405 plugins/sudoers/sudoreplay.c:1413 +#: plugins/sudoers/sudoreplay.c:1417 plugins/sudoers/sudoreplay.c:1573 +#: plugins/sudoers/sudoreplay.c:1577 plugins/sudoers/testsudoers.c:131 +#: plugins/sudoers/testsudoers.c:217 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/timestamp.c:389 plugins/sudoers/timestamp.c:433 +#: plugins/sudoers/timestamp.c:852 plugins/sudoers/toke_util.c:56 +#: plugins/sudoers/toke_util.c:109 plugins/sudoers/toke_util.c:146 +#: plugins/sudoers/visudo.c:153 plugins/sudoers/visudo.c:309 +#: plugins/sudoers/visudo.c:315 plugins/sudoers/visudo.c:446 +#: plugins/sudoers/visudo.c:624 plugins/sudoers/visudo.c:985 +#: plugins/sudoers/visudo.c:1051 plugins/sudoers/visudo.c:1095 +#: plugins/sudoers/visudo.c:1197 plugins/sudoers/visudo_json.c:1025 toke.l:849 +#: toke.l:949 toke.l:1106 +msgid "unable to allocate memory" +msgstr "не могу да доделим меморију" + +#: gram.y:481 +msgid "a digest requires a path name" +msgstr "зборник захтева назив путање" + +#: gram.y:607 +msgid "invalid notbefore value" +msgstr "неисправна вредност не-пре" + +#: gram.y:615 +msgid "invalid notafter value" +msgstr "неисправна вредност не-после" + +#: gram.y:624 plugins/sudoers/policy.c:266 +msgid "timeout value too large" +msgstr "вредност временског истека је превелика" + +#: gram.y:626 plugins/sudoers/policy.c:268 +msgid "invalid timeout value" +msgstr "неисправна вредност временског ограничења" + +#: gram.y:1195 gram.y:1202 plugins/sudoers/auth/pam.c:320 +#: plugins/sudoers/auth/pam.c:486 plugins/sudoers/auth/rfc1938.c:109 +#: plugins/sudoers/defaults.c:647 plugins/sudoers/defaults.c:902 +#: plugins/sudoers/defaults.c:1073 plugins/sudoers/editor.c:64 +#: plugins/sudoers/editor.c:82 plugins/sudoers/editor.c:93 +#: plugins/sudoers/env.c:233 plugins/sudoers/filedigest.c:120 +#: plugins/sudoers/filedigest_gcrypt.c:72 +#: plugins/sudoers/filedigest_gcrypt.c:90 +#: plugins/sudoers/filedigest_openssl.c:111 plugins/sudoers/gc.c:52 +#: plugins/sudoers/group_plugin.c:134 plugins/sudoers/interfaces.c:71 +#: plugins/sudoers/iolog.c:941 plugins/sudoers/iolog_path.c:167 +#: plugins/sudoers/ldap.c:449 plugins/sudoers/ldap.c:480 +#: plugins/sudoers/ldap.c:532 plugins/sudoers/ldap.c:565 +#: plugins/sudoers/ldap.c:963 plugins/sudoers/ldap.c:1157 +#: plugins/sudoers/ldap.c:1168 plugins/sudoers/ldap.c:1184 +#: plugins/sudoers/ldap.c:1476 plugins/sudoers/ldap.c:1636 +#: plugins/sudoers/ldap.c:1718 plugins/sudoers/ldap.c:1858 +#: plugins/sudoers/ldap.c:1882 plugins/sudoers/ldap.c:1971 +#: plugins/sudoers/ldap.c:1986 plugins/sudoers/ldap.c:2082 +#: plugins/sudoers/ldap.c:2115 plugins/sudoers/ldap.c:2195 +#: plugins/sudoers/ldap.c:2278 plugins/sudoers/ldap.c:2375 +#: plugins/sudoers/ldap.c:3209 plugins/sudoers/ldap.c:3241 +#: plugins/sudoers/ldap.c:3550 plugins/sudoers/ldap.c:3577 +#: plugins/sudoers/ldap.c:3593 plugins/sudoers/ldap.c:3684 +#: plugins/sudoers/ldap.c:3700 plugins/sudoers/linux_audit.c:76 +#: plugins/sudoers/logging.c:189 plugins/sudoers/logging.c:451 +#: plugins/sudoers/logging.c:472 plugins/sudoers/logging.c:942 +#: plugins/sudoers/match.c:616 plugins/sudoers/match.c:663 +#: plugins/sudoers/match.c:714 plugins/sudoers/match.c:738 +#: plugins/sudoers/match.c:826 plugins/sudoers/match.c:914 +#: plugins/sudoers/parse.c:248 plugins/sudoers/parse.c:260 +#: plugins/sudoers/parse.c:275 plugins/sudoers/parse.c:287 +#: plugins/sudoers/policy.c:99 plugins/sudoers/policy.c:108 +#: plugins/sudoers/policy.c:117 plugins/sudoers/policy.c:141 +#: plugins/sudoers/policy.c:252 plugins/sudoers/policy.c:266 +#: plugins/sudoers/policy.c:268 plugins/sudoers/policy.c:292 +#: plugins/sudoers/policy.c:301 plugins/sudoers/policy.c:340 +#: plugins/sudoers/policy.c:350 plugins/sudoers/policy.c:359 +#: plugins/sudoers/policy.c:368 plugins/sudoers/policy.c:419 +#: plugins/sudoers/policy.c:653 plugins/sudoers/prompt.c:93 +#: plugins/sudoers/pwutil.c:139 plugins/sudoers/pwutil.c:210 +#: plugins/sudoers/pwutil.c:286 plugins/sudoers/pwutil.c:457 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:591 +#: plugins/sudoers/pwutil.c:749 plugins/sudoers/pwutil.c:806 +#: plugins/sudoers/pwutil.c:851 plugins/sudoers/pwutil.c:908 +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 plugins/sudoers/sssd.c:162 +#: plugins/sudoers/sssd.c:194 plugins/sudoers/sssd.c:237 +#: plugins/sudoers/sssd.c:244 plugins/sudoers/sssd.c:280 +#: plugins/sudoers/sssd.c:390 plugins/sudoers/sssd.c:459 +#: plugins/sudoers/sssd.c:1057 plugins/sudoers/sssd.c:1235 +#: plugins/sudoers/sssd.c:1250 plugins/sudoers/sssd.c:1266 +#: plugins/sudoers/sudoers.c:263 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:281 plugins/sudoers/sudoers.c:365 +#: plugins/sudoers/sudoers.c:681 plugins/sudoers/sudoers.c:806 +#: plugins/sudoers/sudoers.c:850 plugins/sudoers/sudoers.c:1122 +#: plugins/sudoers/sudoers_debug.c:106 plugins/sudoers/sudoreplay.c:1234 +#: plugins/sudoers/sudoreplay.c:1346 plugins/sudoers/sudoreplay.c:1386 +#: plugins/sudoers/sudoreplay.c:1395 plugins/sudoers/sudoreplay.c:1405 +#: plugins/sudoers/sudoreplay.c:1413 plugins/sudoers/sudoreplay.c:1417 +#: plugins/sudoers/sudoreplay.c:1573 plugins/sudoers/sudoreplay.c:1577 +#: plugins/sudoers/testsudoers.c:131 plugins/sudoers/testsudoers.c:217 +#: plugins/sudoers/testsudoers.c:234 plugins/sudoers/timestamp.c:389 +#: plugins/sudoers/timestamp.c:433 plugins/sudoers/timestamp.c:852 +#: plugins/sudoers/toke_util.c:56 plugins/sudoers/toke_util.c:109 +#: plugins/sudoers/toke_util.c:146 plugins/sudoers/visudo.c:153 +#: plugins/sudoers/visudo.c:309 plugins/sudoers/visudo.c:315 +#: plugins/sudoers/visudo.c:446 plugins/sudoers/visudo.c:624 +#: plugins/sudoers/visudo.c:985 plugins/sudoers/visudo.c:1051 +#: plugins/sudoers/visudo.c:1095 plugins/sudoers/visudo.c:1197 +#: plugins/sudoers/visudo_json.c:1025 toke.l:849 toke.l:949 toke.l:1106 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:135 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Псеудоним „%s“ је већ одређен" + +#: plugins/sudoers/auth/bsdauth.c:68 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не могу да добавим разред пријаве за корисника „%s“" + +#: plugins/sudoers/auth/bsdauth.c:73 +msgid "unable to begin bsd authentication" +msgstr "не могу да почнем бсд потврђивање идентитета" + +#: plugins/sudoers/auth/bsdauth.c:81 +msgid "invalid authentication type" +msgstr "неисправна врста потврђивање идентитета" + +#: plugins/sudoers/auth/bsdauth.c:90 +msgid "unable to initialize BSD authentication" +msgstr "не могу да покренем БСД потврђивање идентитета" + +#: plugins/sudoers/auth/fwtk.c:52 +msgid "unable to read fwtk config" +msgstr "не могу да читам „fwtk“ подешавања" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to connect to authentication server" +msgstr "не могу да се повежем на сервер потврђивања идентитета" + +#: plugins/sudoers/auth/fwtk.c:63 plugins/sudoers/auth/fwtk.c:87 +#: plugins/sudoers/auth/fwtk.c:121 +msgid "lost connection to authentication server" +msgstr "изгубио сам везу са сервером потврђивања идентитета" + +#: plugins/sudoers/auth/fwtk.c:67 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"грешка сервера потврђивања идентитета:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:111 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не могу да претворим главника у ниску („%s“): %s" + +#: plugins/sudoers/auth/kerb5.c:161 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не могу да обрадим „%s“: %s" + +#: plugins/sudoers/auth/kerb5.c:170 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не могу да решим оставу пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не могу да доделим опције: %s" + +#: plugins/sudoers/auth/kerb5.c:232 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не могу да добавим пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:245 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не могу да покренем оставу пуномоћства: %s" + +#: plugins/sudoers/auth/kerb5.c:248 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не могу да сместим пуномоћства у оставу: %s" + +#: plugins/sudoers/auth/kerb5.c:312 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не могу да добавим главника домаћина: %s" + +#: plugins/sudoers/auth/kerb5.c:326 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Не могу потврдити ТГТ! Могући напад!: %s" + +#: plugins/sudoers/auth/pam.c:108 +msgid "unable to initialize PAM" +msgstr "не могу да покренем ПАМ" + +#: plugins/sudoers/auth/pam.c:194 +msgid "account validation failure, is your account locked?" +msgstr "неуспех провере налога, да ли је ваш налог закључан?" + +#: plugins/sudoers/auth/pam.c:198 +msgid "Account or password is expired, reset your password and try again" +msgstr "Налог или лозинка је истекла, поново поставите лозинку и покушајте поново" + +#: plugins/sudoers/auth/pam.c:206 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не могу да изменим истеклу лозинку: %s" + +#: plugins/sudoers/auth/pam.c:211 +msgid "Password expired, contact your system administrator" +msgstr "Лозинка је истекла, обратите се администратору система" + +#: plugins/sudoers/auth/pam.c:215 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Налог је истекао или ПАМ подешавањима недостаје одељак „налог“ за судо, обратите се администратору система" + +#: plugins/sudoers/auth/pam.c:229 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Грешка ПАМ потврђивања идентитета: %s" + +#: plugins/sudoers/auth/rfc1938.c:97 plugins/sudoers/visudo.c:227 +#, c-format +msgid "you do not exist in the %s database" +msgstr "ви не постојите у бази подтака „%s“" + +#: plugins/sudoers/auth/securid5.c:73 +msgid "failed to initialise the ACE API library" +msgstr "нисам успео да покренем АЦЕ АПИ библиотеку" + +#: plugins/sudoers/auth/securid5.c:99 +msgid "unable to contact the SecurID server" +msgstr "не могу да ступим у везу са сервером безбеднног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:108 +msgid "User ID locked for SecurID Authentication" +msgstr "ИБ корисника је закључан за потврђивање идентитета безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:112 plugins/sudoers/auth/securid5.c:163 +msgid "invalid username length for SecurID" +msgstr "неисправна дужина корисничког имена за безбедни ИБ" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:168 +msgid "invalid Authentication Handle for SecurID" +msgstr "неисправна ручка потврђивања идентитета за безбедни ИБ" + +#: plugins/sudoers/auth/securid5.c:120 +msgid "SecurID communication failed" +msgstr "Није успело комуницирање безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:124 plugins/sudoers/auth/securid5.c:213 +msgid "unknown SecurID error" +msgstr "непозната грешка безбедног ИБ-а" + +#: plugins/sudoers/auth/securid5.c:158 +msgid "invalid passcode length for SecurID" +msgstr "неисправна дужина пропусне шифре за безбедни ИБ" + +#: plugins/sudoers/auth/sia.c:69 plugins/sudoers/auth/sia.c:125 +msgid "unable to initialize SIA session" +msgstr "не могу да покренем СИА сесију" + +#: plugins/sudoers/auth/sudo_auth.c:126 +msgid "invalid authentication methods" +msgstr "неисправни начини потврђивања идентитета" + +#: plugins/sudoers/auth/sudo_auth.c:128 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Неисправни начини потврђивања идентитета су преведени у судоу! Не можете мешати самостално и несамостално потврђивање идентитета." + +#: plugins/sudoers/auth/sudo_auth.c:224 plugins/sudoers/auth/sudo_auth.c:274 +msgid "no authentication methods" +msgstr "нема начина потврђивања идентитета" + +#: plugins/sudoers/auth/sudo_auth.c:226 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Нема начина потврђивања идентитета преведених у судоу! Ако желите да искључите потврђивање идентитета, користите „--disable-authentication“." + +#: plugins/sudoers/auth/sudo_auth.c:276 +msgid "Unable to initialize authentication methods." +msgstr "Не могу да покренем методе потврђивања идентитета." + +#: plugins/sudoers/auth/sudo_auth.c:441 +msgid "Authentication methods:" +msgstr "Начини потврђивања идентитета:" + +#: plugins/sudoers/bsm_audit.c:120 plugins/sudoers/bsm_audit.c:211 +msgid "Could not determine audit condition" +msgstr "Не могу да утврдим услов прегледа" + +#: plugins/sudoers/bsm_audit.c:183 plugins/sudoers/bsm_audit.c:273 +msgid "unable to commit audit record" +msgstr "не могу да предам снимак прегледа" + +#: plugins/sudoers/check.c:252 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Верујемо да вам је администратор система објаснио неке ствари.\n" +"Обично се своде на следеће три:\n" +"\n" +" #1) Поштујте приватност других.\n" +" #2) Размислите пре куцања.\n" +" #3) Са великом моћи долази и велика одговорност.\n" +"\n" + +#: plugins/sudoers/check.c:295 plugins/sudoers/check.c:305 +#: plugins/sudoers/sudoers.c:724 plugins/sudoers/sudoers.c:769 +#, c-format +msgid "unknown uid: %u" +msgstr "непознат јиб: %u" + +#: plugins/sudoers/check.c:300 plugins/sudoers/iolog.c:260 +#: plugins/sudoers/policy.c:826 plugins/sudoers/sudoers.c:1161 +#: plugins/sudoers/testsudoers.c:208 plugins/sudoers/testsudoers.c:366 +#, c-format +msgid "unknown user: %s" +msgstr "непознат корисник: %s" + +#: plugins/sudoers/def_data.c:41 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Помоћник сисдневника ако је сисдневник коришћен за пријављивање: %s" + +#: plugins/sudoers/def_data.c:45 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Приоритет системског дневника за коришћење када корисник успешно потврди идентитет: %s" + +#: plugins/sudoers/def_data.c:49 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Приоритет системског дневника за коришћење када корисник неуспешно потврди идентитет: %s" + +#: plugins/sudoers/def_data.c:53 +msgid "Put OTP prompt on its own line" +msgstr "Поставља ОТП упит на свом реду" + +#: plugins/sudoers/def_data.c:57 +msgid "Ignore '.' in $PATH" +msgstr "Занемарује . у $ПУТАЊИ" + +#: plugins/sudoers/def_data.c:61 +msgid "Always send mail when sudo is run" +msgstr "Увек шаље пошту када је судо покренут" + +#: plugins/sudoers/def_data.c:65 +msgid "Send mail if user authentication fails" +msgstr "Пошаљи поруку ако потврђивање идентитета корисника не успе" + +#: plugins/sudoers/def_data.c:69 +msgid "Send mail if the user is not in sudoers" +msgstr "Пошаљи поруку ако корисник није у судоерсу" + +#: plugins/sudoers/def_data.c:73 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Пошаљи поруку ако корисник није у судоерсу за овог домаћина" + +#: plugins/sudoers/def_data.c:77 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Пошаљи поруку ако кориснику није дозвољено да покрене наредбу" + +#: plugins/sudoers/def_data.c:81 +msgid "Send mail if the user tries to run a command" +msgstr "Пошаљи поруку ако корисник покуша да покрене наредбу" + +#: plugins/sudoers/def_data.c:85 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Користи одвојене временске ознаке за сваку комбинацију корисник/конзола" + +#: plugins/sudoers/def_data.c:89 +msgid "Lecture user the first time they run sudo" +msgstr "Подучава корисника када први пут покрену судо" + +#: plugins/sudoers/def_data.c:93 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Датотека садржи судо обучавања: %s" + +#: plugins/sudoers/def_data.c:97 +msgid "Require users to authenticate by default" +msgstr "Захтева да корисници потврде идентитет по основи" + +#: plugins/sudoers/def_data.c:101 +msgid "Root may run sudo" +msgstr "Администратор може да покрене судо" + +#: plugins/sudoers/def_data.c:105 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Бележи назив домаћина у (не-сисдневник) датотеци дневника" + +#: plugins/sudoers/def_data.c:109 +msgid "Log the year in the (non-syslog) log file" +msgstr "Бележи годину у (не-сисдневник) датотеци дневника" + +#: plugins/sudoers/def_data.c:113 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Ако је судо призван без аргумената, покреће шкољку" + +#: plugins/sudoers/def_data.c:117 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Подешава $HOME на крајњег корисника када покреће шкољку са „-s“" + +#: plugins/sudoers/def_data.c:121 +msgid "Always set $HOME to the target user's home directory" +msgstr "Увек подешава $HOME на циљни лични директоријум корисника" + +#: plugins/sudoers/def_data.c:125 +msgid "Allow some information gathering to give useful error messages" +msgstr "Дозвољава прикупљање неких података да би дао корисне поруке грешака" + +#: plugins/sudoers/def_data.c:129 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Захтева потпуно одређене називе домаћина у датотеци судоерса" + +#: plugins/sudoers/def_data.c:133 +msgid "Insult the user when they enter an incorrect password" +msgstr "Вређа корисника када унесе нетачну лозинку" + +#: plugins/sudoers/def_data.c:137 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Дозвољава кориснику да покрене судо само ако има конзолу" + +#: plugins/sudoers/def_data.c:141 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Висудо ће поштовати променљиву окружења УРЕЂИВАЧА" + +#: plugins/sudoers/def_data.c:145 +msgid "Prompt for root's password, not the users's" +msgstr "Тражи администраторову лозинку, а не корисника" + +#: plugins/sudoers/def_data.c:149 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Тражи корисникову лозинку покреникао_основни, а не корисника" + +#: plugins/sudoers/def_data.c:153 +msgid "Prompt for the target user's password, not the users's" +msgstr "Тражи корисникову лозинку мете, а не корисника" + +#: plugins/sudoers/def_data.c:157 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Примењује основности у циљни кориснички разред пријављивања ако постоји" + +#: plugins/sudoers/def_data.c:161 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Подешава променљиве окружења НАЗИВДНЕВНИКА и КОРИСНИК" + +#: plugins/sudoers/def_data.c:165 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Подешава само ефективни јиб на крајњег корисника, а не стваран јиб" + +#: plugins/sudoers/def_data.c:169 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Не покреће вектор групе ка оном крајњег корисника" + +#: plugins/sudoers/def_data.c:173 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Дужина за преламање редова у датотеци дневника (0 — без преламања): %u" + +#: plugins/sudoers/def_data.c:177 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Време истека временске ознаке потврђивања идентитета: %.1f минута" + +#: plugins/sudoers/def_data.c:181 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Време истека упита лозинке: %.1f минута" + +#: plugins/sudoers/def_data.c:185 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Број покушаја за уношење лозинке: %u" + +#: plugins/sudoers/def_data.c:189 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Умаска за коришћење или 0777 за коришћење корисника: 0%o" + +#: plugins/sudoers/def_data.c:193 +#, c-format +msgid "Path to log file: %s" +msgstr "Путања до датотеке дневника: %s" + +#: plugins/sudoers/def_data.c:197 +#, c-format +msgid "Path to mail program: %s" +msgstr "Путања до програма поште: %s" + +#: plugins/sudoers/def_data.c:201 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Опције за програм поште: %s" + +#: plugins/sudoers/def_data.c:205 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Адреса на коју послати поруку: %s" + +#: plugins/sudoers/def_data.c:209 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Адреса са које послати поруку: %s" + +#: plugins/sudoers/def_data.c:213 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Ред теме за поруке поште: %s" + +#: plugins/sudoers/def_data.c:217 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Порука нетачне лозинке: %s" + +#: plugins/sudoers/def_data.c:221 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Путања до директоријума стања обучавања: %s" + +#: plugins/sudoers/def_data.c:225 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Путања до директоријума временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/def_data.c:229 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Власник директоријума временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/def_data.c:233 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Корисницима у овој групи се не захтева лозинка и ПУТАЊА: %s" + +#: plugins/sudoers/def_data.c:237 +#, c-format +msgid "Default password prompt: %s" +msgstr "Основни упит лозинке: %s" + +#: plugins/sudoers/def_data.c:241 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Ако је подешено, упит лозинке ће преписати системски упит у свим случајевима." + +#: plugins/sudoers/def_data.c:245 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Основни корисник за покретање наредби као: %s" + +#: plugins/sudoers/def_data.c:249 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Вредност за преписивање корисничке $ПУТАЊЕ са: %s" + +#: plugins/sudoers/def_data.c:253 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Путања до уређивача кога ће да користи висудо: %s" + +#: plugins/sudoers/def_data.c:257 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Када да затражи лозинку за псеудонаредбу „list“: %s" + +#: plugins/sudoers/def_data.c:261 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Када да затражи лозинку за псеудонаредбу „verify“: %s" + +#: plugins/sudoers/def_data.c:265 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Унапред учитава лажне функције извршавања које се налазе у библиотеци „sudo_noexec“" + +#: plugins/sudoers/def_data.c:269 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Ако је ЛДАП директоријум изнет, да ли занемарујемо месну датотеку судоерса" + +#: plugins/sudoers/def_data.c:273 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Описници датотека >= %d ће бити затворени пре извршавања наредбе" + +#: plugins/sudoers/def_data.c:277 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Ако је подешено, корисници могу да препишу вредност „closefrom“ са опцијом „-C“" + +#: plugins/sudoers/def_data.c:281 +msgid "Allow users to set arbitrary environment variables" +msgstr "Дозвољава корисницима да подесе произвољне променљиве окружења" + +#: plugins/sudoers/def_data.c:285 +msgid "Reset the environment to a default set of variables" +msgstr "Враћа окружење на основни скуп променљивих" + +#: plugins/sudoers/def_data.c:289 +msgid "Environment variables to check for sanity:" +msgstr "Променљиве окружења за проверу исправности:" + +#: plugins/sudoers/def_data.c:293 +msgid "Environment variables to remove:" +msgstr "Променљиве окружења за уклањање:" + +#: plugins/sudoers/def_data.c:297 +msgid "Environment variables to preserve:" +msgstr "Променљиве окружења за очување:" + +#: plugins/sudoers/def_data.c:301 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "СЕЛинукс улога за употребу у новом контексту безбедности: %s" + +#: plugins/sudoers/def_data.c:305 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "СЕЛинукс врста за употребу у новом контексту безбедности: %s" + +#: plugins/sudoers/def_data.c:309 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Путања до судо-посебне датотеке окружења: %s" + +#: plugins/sudoers/def_data.c:313 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Путања до ограничене судо-посебне датотеке окружења: %s" + +#: plugins/sudoers/def_data.c:317 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Језк за коришћење при обради судоерса: %s" + +#: plugins/sudoers/def_data.c:321 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Дозвољава да судо тражи лозинку чак и ако би била видљива" + +#: plugins/sudoers/def_data.c:325 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Обезбеђује видну повратну поруку при тражењу лозинке када постоји унос корисника" + +#: plugins/sudoers/def_data.c:329 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Користи брже упоређивање које је мање тачно али не приступа систему датотека" + +#: plugins/sudoers/def_data.c:333 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Умаска наведена у судоерсима ће преписати корисникову, чак и ако има већа овлашћења" + +#: plugins/sudoers/def_data.c:337 +msgid "Log user's input for the command being run" +msgstr "Бележи корисников улаз за покренуту наредбу" + +#: plugins/sudoers/def_data.c:341 +msgid "Log the output of the command being run" +msgstr "Бележи излаз покренуте наредбе" + +#: plugins/sudoers/def_data.c:345 +msgid "Compress I/O logs using zlib" +msgstr "Пакује У/И дневнике користећи злиб" + +#: plugins/sudoers/def_data.c:349 +msgid "Always run commands in a pseudo-tty" +msgstr "Увек покреће наредбе у привидној конзоли" + +#: plugins/sudoers/def_data.c:353 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Прикључак за подршку не-Јуникс групе: %s" + +#: plugins/sudoers/def_data.c:357 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Директоријум за смештај улазних/излазних дневника: %s" + +#: plugins/sudoers/def_data.c:361 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Датотека за смештај улазно/излазног дневника: %s" + +#: plugins/sudoers/def_data.c:365 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Додаје унос у датотеку „utmp/utmpx“ када додељује „pty“" + +#: plugins/sudoers/def_data.c:369 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Подешава корисника у „utmp“-у на корисника покрени-као, не призивајући корисника" + +#: plugins/sudoers/def_data.c:373 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Скуп допуштених повластица: %s" + +#: plugins/sudoers/def_data.c:377 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Скуп повластица ограничења: %s" + +#: plugins/sudoers/def_data.c:381 +msgid "Run commands on a pty in the background" +msgstr "Покреће наредбе у позадини на назовитерминалу" + +#: plugins/sudoers/def_data.c:385 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Назив ПАМ услуге за коришћење: %s" + +#: plugins/sudoers/def_data.c:389 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Назив ПАМ услуге за шкољке пријављивања: %s" + +#: plugins/sudoers/def_data.c:393 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Покушава да успостави ПАМ пуномоћства за циљног корисника" + +#: plugins/sudoers/def_data.c:397 +msgid "Create a new PAM session for the command to run in" +msgstr "Прави нову ПАМ сесију за покретање наредбе" + +#: plugins/sudoers/def_data.c:401 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Највећи број низа У/И дневника: %u" + +#: plugins/sudoers/def_data.c:405 +msgid "Enable sudoers netgroup support" +msgstr "Укључује подршку нетгрупе судоерса" + +#: plugins/sudoers/def_data.c:409 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Проверава родитељски директоријум за уписивошћу када уређује датотеке са „sudoedit“" + +#: plugins/sudoers/def_data.c:413 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Прати симболичке везе када уређује датотеке са „sudoedit“" + +#: plugins/sudoers/def_data.c:417 +msgid "Query the group plugin for unknown system groups" +msgstr "Пропитује прикључак групе за непознатим групама система" + +#: plugins/sudoers/def_data.c:421 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Упоређује мрежне групе на основу читавог слога: корисник, домаћин и домен" + +#: plugins/sudoers/def_data.c:425 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник прегледа" + +#: plugins/sudoers/def_data.c:429 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у дневник У/И" + +#: plugins/sudoers/def_data.c:433 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Допушта покретање наредби чак и ако судо не може да пише у датотеку дневника" + +#: plugins/sudoers/def_data.c:437 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Решава групе у судоерсима и упоређује ИД групе, а не назив" + +#: plugins/sudoers/def_data.c:441 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Уноси дневника већи од ове вредности биће подељени на више порука системског дневника: %u" + +#: plugins/sudoers/def_data.c:445 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Корисник који ће поседовати датотеке дневника У/И: %s" + +#: plugins/sudoers/def_data.c:449 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Група која ће поседовати датотеке дневника У/И: %s" + +#: plugins/sudoers/def_data.c:453 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Режим датотеке за коришћење за датотеке дневника У/И: 0%o" + +#: plugins/sudoers/def_data.c:457 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Извршава наредбе описником датотеке уместо путањом: %s" + +#: plugins/sudoers/def_data.c:461 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Занемарује непознате уносе основности у судоерсу уместо да даје упозорење" + +#: plugins/sudoers/def_data.c:465 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Време у секундама након ког ће наредба бити окончана: %u" + +#: plugins/sudoers/def_data.c:469 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Допушта кориснику да наведе време на линији наредби" + +#: plugins/sudoers/def_data.c:473 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Пребацује У/И податке дневника на диск одмах уместо да га смешта у међумеморију" + +#: plugins/sudoers/def_data.c:477 +msgid "Include the process ID when logging via syslog" +msgstr "Укључује ИБ процеса приликом пријављивања путем дневника система" + +#: plugins/sudoers/def_data.c:481 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Врста временске ознаке потврђивања идентитета: %s" + +#: plugins/sudoers/defaults.c:220 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d непознат унос основности „%s“" + +#: plugins/sudoers/defaults.c:223 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: непознат унос основности „%s“" + +#: plugins/sudoers/defaults.c:263 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d није наведена вредност за „%s“" + +#: plugins/sudoers/defaults.c:266 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: није наведена вредност за „%s“" + +#: plugins/sudoers/defaults.c:286 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d вредност за „%s“ мора да почиње /" + +#: plugins/sudoers/defaults.c:289 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: вредност за „%s“ мора да почиње /" + +#: plugins/sudoers/defaults.c:314 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d опција „%s“ не узима вредност" + +#: plugins/sudoers/defaults.c:317 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: опција „%s“ не узима вредност" + +#: plugins/sudoers/defaults.c:339 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d неисправна врста основности 0x%x за опцију „%s“" + +#: plugins/sudoers/defaults.c:342 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: неисправна врста основности 0x%x за опцију „%s“" + +#: plugins/sudoers/defaults.c:352 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d вредност „%s“ је неисправна за опцију „%s“" + +#: plugins/sudoers/defaults.c:355 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: вредност „%s“ је неисправна за опцију „%s“" + +#: plugins/sudoers/env.c:295 plugins/sudoers/env.c:302 +#: plugins/sudoers/env.c:407 plugins/sudoers/ldap.c:453 +#: plugins/sudoers/ldap.c:543 plugins/sudoers/ldap.c:1253 +#: plugins/sudoers/ldap.c:1480 plugins/sudoers/ldap.c:1806 +#: plugins/sudoers/linux_audit.c:82 plugins/sudoers/logging.c:947 +#: plugins/sudoers/policy.c:537 plugins/sudoers/policy.c:547 +#: plugins/sudoers/prompt.c:161 plugins/sudoers/sudoers.c:872 +#: plugins/sudoers/testsudoers.c:238 plugins/sudoers/toke_util.c:158 +#, c-format +msgid "internal error, %s overflow" +msgstr "унутрашња грешка, прекорачење „%s“" + +#: plugins/sudoers/env.c:376 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: оштећено стави окружење, дужине не одговарају" + +#: plugins/sudoers/env.c:1055 +msgid "unable to rebuild the environment" +msgstr "не могу поново да изградим окружење" + +#: plugins/sudoers/env.c:1129 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "извините, није вам дозвољено да подесите следеће променљиве окружења: %s" + +#: plugins/sudoers/filedigest.c:104 plugins/sudoers/filedigest_gcrypt.c:66 +#: plugins/sudoers/filedigest_openssl.c:95 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "неподржана врста прихватања потврђивања иднтитета „%d“ за „%s“" + +#: plugins/sudoers/filedigest.c:129 plugins/sudoers/filedigest_gcrypt.c:98 +#: plugins/sudoers/filedigest_openssl.c:120 +#, c-format +msgid "%s: read error" +msgstr "%s: грешка читања" + +#: plugins/sudoers/group_plugin.c:86 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "„%s“ мора бити у власништву јиб-а %d" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must only be writable by owner" +msgstr "Само корисник може да пише у „%s“" + +#: plugins/sudoers/group_plugin.c:98 plugins/sudoers/sssd.c:398 +#, c-format +msgid "unable to load %s: %s" +msgstr "не могу да учитам %s: %s" + +#: plugins/sudoers/group_plugin.c:104 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "не могу да нађем симбол „group_plugin“ у „%s“" + +#: plugins/sudoers/group_plugin.c:109 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: несагласно веће издање прикључка групе %d, очекивано је %d" + +#: plugins/sudoers/interfaces.c:79 plugins/sudoers/interfaces.c:96 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "не могу да обрадим ИП адресу „%s“" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "не могу да обрадим мрежну маску „%s“" + +#: plugins/sudoers/interfaces.c:129 +msgid "Local IP address and netmask pairs:\n" +msgstr "Месна ИП адреса и парови мрежне маске:\n" + +#: plugins/sudoers/iolog.c:121 plugins/sudoers/mkdir_parents.c:75 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s постоји али није директоријум (0%o)" + +#: plugins/sudoers/iolog.c:146 plugins/sudoers/iolog.c:187 +#: plugins/sudoers/mkdir_parents.c:64 plugins/sudoers/timestamp.c:170 +#, c-format +msgid "unable to mkdir %s" +msgstr "не могу да направим директоријум „%s“" + +#: plugins/sudoers/iolog.c:191 plugins/sudoers/visudo.c:740 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "не могу да променим режим „%s“ на 0%o" + +#: plugins/sudoers/iolog.c:299 plugins/sudoers/sudoers.c:1192 +#: plugins/sudoers/testsudoers.c:390 +#, c-format +msgid "unknown group: %s" +msgstr "непозната група: %s" + +#: plugins/sudoers/iolog.c:418 plugins/sudoers/sudoers.c:928 +#: plugins/sudoers/sudoreplay.c:349 plugins/sudoers/sudoreplay.c:1335 +#: plugins/sudoers/sudoreplay.c:1539 plugins/sudoers/timestamp.c:398 +#: plugins/sudoers/visudo.c:972 plugins/sudoers/visudo_json.c:1001 +#: plugins/sudoers/visudo_json.c:1014 +#, c-format +msgid "unable to open %s" +msgstr "не могу да отворим „%s“" + +#: plugins/sudoers/iolog.c:469 plugins/sudoers/sudoers.c:932 +#: plugins/sudoers/sudoreplay.c:831 plugins/sudoers/sudoreplay.c:1650 +#, c-format +msgid "unable to read %s" +msgstr "не могу да прочитам „%s“" + +#: plugins/sudoers/iolog.c:505 plugins/sudoers/sudoreplay.c:1104 +#: plugins/sudoers/timestamp.c:290 plugins/sudoers/timestamp.c:293 +#, c-format +msgid "unable to write to %s" +msgstr "не могу да пишем у „%s“" + +#: plugins/sudoers/iolog.c:584 plugins/sudoers/iolog.c:803 +#, c-format +msgid "unable to create %s" +msgstr "не могу да направим „%s“" + +#: plugins/sudoers/iolog.c:1035 plugins/sudoers/iolog.c:1110 +#: plugins/sudoers/iolog.c:1191 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "не могу да пишем у датотеку дневника У/И: %s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, file index %d not open" +msgstr "%s: унутрашња грешка, индекс датотеке %d није отворен" + +#: plugins/sudoers/ldap.c:431 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: прикључник је превелик" + +#: plugins/sudoers/ldap.c:491 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "неподржана врста ЛДАП путање: %s" + +#: plugins/sudoers/ldap.c:518 +msgid "unable to mix ldap and ldaps URIs" +msgstr "не могу да помешам лдап и лдапс путање" + +#: plugins/sudoers/ldap.c:522 plugins/sudoers/ldap.c:558 +msgid "starttls not supported when using ldaps" +msgstr "старттлс није подржано када се користи лдапс" + +#: plugins/sudoers/ldap.c:629 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "не могу да покренем ССЛ уверење и бп кључа: %s" + +#: plugins/sudoers/ldap.c:632 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "морате да подесите „TLS_CERT“ у „%s“ да користите ССЛ" + +#: plugins/sudoers/ldap.c:1239 +msgid "unable to get GMT time" +msgstr "не могу да добавим ГМТ време" + +#: plugins/sudoers/ldap.c:1245 +msgid "unable to format timestamp" +msgstr "не могу да обликујем временску ознаку" + +#: plugins/sudoers/ldap.c:1961 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/ldap.c:2533 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"ЛДАП улога: %s\n" + +#: plugins/sudoers/ldap.c:2535 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" +"\n" +"ЛДАП улога: НЕПОЗНАТО\n" + +#: plugins/sudoers/ldap.c:2591 +#, c-format +msgid " Order: %s\n" +msgstr " Поредак: %s\n" + +#: plugins/sudoers/ldap.c:2599 plugins/sudoers/parse.c:614 +#: plugins/sudoers/sssd.c:1628 +#, c-format +msgid " Commands:\n" +msgstr " Наредбе:\n" + +#: plugins/sudoers/ldap.c:3161 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не могу да покренем ЛДАП: %s" + +#: plugins/sudoers/ldap.c:3197 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "„start_tls“ је наведено али ЛДАП библиотеке не подржавају „ldap_start_tls_s()“ или „ldap_start_tls_s_np()“" + +#: plugins/sudoers/ldap.c:3446 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "неисправна особина „sudoOrder“: %s" + +#: plugins/sudoers/linux_audit.c:52 +msgid "unable to open audit system" +msgstr "не могу да отворим систем прегледа" + +#: plugins/sudoers/linux_audit.c:93 +msgid "unable to send audit message" +msgstr "не могу да пошаљем поруку прегледа" + +#: plugins/sudoers/logging.c:107 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:135 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (наредба је настављена) %s" + +#: plugins/sudoers/logging.c:164 +#, c-format +msgid "unable to open log file: %s" +msgstr "не могу да отворим датотеку дневника: %s" + +#: plugins/sudoers/logging.c:172 +#, c-format +msgid "unable to lock log file: %s" +msgstr "не могу да закључам датотеку дневника: %s" + +#: plugins/sudoers/logging.c:205 +#, c-format +msgid "unable to write log file: %s" +msgstr "не могу да запишем датотеку дневника: %s" + +#: plugins/sudoers/logging.c:234 +msgid "No user or host" +msgstr "Нема корисника или домаћина" + +#: plugins/sudoers/logging.c:236 +msgid "validation failure" +msgstr "неуспех потврђивања" + +#: plugins/sudoers/logging.c:243 +msgid "user NOT in sudoers" +msgstr "корисник НИЈЕ у судоерсу" + +#: plugins/sudoers/logging.c:245 +msgid "user NOT authorized on host" +msgstr "корисник НИЈЕ овлашћен на домаћину" + +#: plugins/sudoers/logging.c:247 +msgid "command not allowed" +msgstr "наредба није допуштена" + +#: plugins/sudoers/logging.c:282 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "„%s“ се не налази у датотеци судоерса. О овом инциденту ће бити поднет извештај.\n" + +#: plugins/sudoers/logging.c:285 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "„%s“ нема права да покрене судо над „%s“. О овом инциденту ће бити поднет извештај.\n" + +#: plugins/sudoers/logging.c:289 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Извините, корисник %s не може покренути судо на %s.\n" + +#: plugins/sudoers/logging.c:292 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Извините, кориснику %s није дозвољено да изврши „%s%s%s“ као %s%s%s на %s.\n" + +#: plugins/sudoers/logging.c:329 plugins/sudoers/sudoers.c:472 +#: plugins/sudoers/sudoers.c:474 plugins/sudoers/sudoers.c:476 +#: plugins/sudoers/sudoers.c:478 plugins/sudoers/sudoers.c:1297 +#: plugins/sudoers/sudoers.c:1299 +#, c-format +msgid "%s: command not found" +msgstr "%s: нема такве наредбе" + +#: plugins/sudoers/logging.c:331 plugins/sudoers/sudoers.c:468 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"занемарујем „%s“ пронађено у „.“\n" +"Користите „sudo ./%s“ ако је то „%s“ које желите да покренете." + +#: plugins/sudoers/logging.c:348 +msgid "authentication failure" +msgstr "потврђивање идентитета није успело" + +#: plugins/sudoers/logging.c:374 +msgid "a password is required" +msgstr "потребна је лозинка" + +#: plugins/sudoers/logging.c:445 plugins/sudoers/logging.c:511 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u покушај нетачне лозинке" +msgstr[1] "%u покушаја нетачне лозинке" +msgstr[2] "%u покушаја нетачне лозинке" + +#: plugins/sudoers/logging.c:598 +msgid "unable to fork" +msgstr "не могу да исцепим" + +#: plugins/sudoers/logging.c:606 plugins/sudoers/logging.c:658 +#, c-format +msgid "unable to fork: %m" +msgstr "не могу да исцепим: %m" + +#: plugins/sudoers/logging.c:648 +#, c-format +msgid "unable to open pipe: %m" +msgstr "не могу да отворим спојку: %m" + +#: plugins/sudoers/logging.c:673 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "не могу да удвостручим стандардни улаз: %m" + +#: plugins/sudoers/logging.c:711 +#, c-format +msgid "unable to execute %s: %m" +msgstr "не могу да извршим „%s“: %m" + +#: plugins/sudoers/match.c:771 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "приказ за %s (%s) није у %s облику" + +#: plugins/sudoers/mkdir_parents.c:70 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:439 plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to stat %s" +msgstr "не могу да добијем податке о „%s“" + +#: plugins/sudoers/parse.c:115 +#, c-format +msgid "parse error in %s near line %d" +msgstr "грешка обраде у %s близу реда %d" + +#: plugins/sudoers/parse.c:118 +#, c-format +msgid "parse error in %s" +msgstr "грешка обраде у %s" + +#: plugins/sudoers/parse.c:540 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Унос судоерса:\n" + +#: plugins/sudoers/parse.c:541 +#, c-format +msgid " RunAsUsers: " +msgstr " „Покрени-као“ корисници: " + +#: plugins/sudoers/parse.c:555 +#, c-format +msgid " RunAsGroups: " +msgstr " „Покрени-као“ групе: " + +#: plugins/sudoers/parse.c:564 +#, c-format +msgid " Options: " +msgstr " Опције: " + +#: plugins/sudoers/policy.c:242 plugins/sudoers/testsudoers.c:261 +msgid "unable to parse network address list" +msgstr "не могу да обрадим списак адреса мреже" + +#: plugins/sudoers/policy.c:711 plugins/sudoers/visudo.c:910 +#, c-format +msgid "unable to execute %s" +msgstr "не могу да извршим „%s“" + +#: plugins/sudoers/policy.c:844 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Издање %s прикључка политике судоерса\n" + +#: plugins/sudoers/policy.c:846 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Граматика датотеке судоерса издање %d\n" + +#: plugins/sudoers/policy.c:850 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Путања судоерса: %s\n" + +#: plugins/sudoers/policy.c:853 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "путања нс-прекидача: %s\n" + +#: plugins/sudoers/policy.c:855 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "путања лдап.подешавања: %s\n" + +#: plugins/sudoers/policy.c:856 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "путања лдап.тајне: %s\n" + +#: plugins/sudoers/policy.c:889 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "немогу да региструјем прикачку врсте „%d“ (издање %d.%d)" + +#: plugins/sudoers/pwutil.c:162 plugins/sudoers/pwutil.c:180 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "не могу да сместим у оставу јиб „%u“, нема више меморије" + +#: plugins/sudoers/pwutil.c:174 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "не могу да сместим у оставу јиб „%u“, већ постоји" + +#: plugins/sudoers/pwutil.c:234 plugins/sudoers/pwutil.c:251 +#: plugins/sudoers/pwutil.c:313 plugins/sudoers/pwutil.c:358 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "не могу да сместим у оставу корисника „%s“, нема више меморије" + +#: plugins/sudoers/pwutil.c:246 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "не могу да сместим у оставу корисника „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:474 plugins/sudoers/pwutil.c:492 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "не могу да сместим у оставу гиб „%u“, нема више меморије" + +#: plugins/sudoers/pwutil.c:486 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "не могу да сместим у оставу гиб „%u“, већ постоји" + +#: plugins/sudoers/pwutil.c:540 plugins/sudoers/pwutil.c:557 +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:646 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "не могу да сместим у оставу групу „%s“, нема више меморије" + +#: plugins/sudoers/pwutil.c:552 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "не могу да сместим у оставу групу „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:772 plugins/sudoers/pwutil.c:824 +#: plugins/sudoers/pwutil.c:874 plugins/sudoers/pwutil.c:926 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "не могу да сместим у оставу списак групе за „%s“, већ постоји" + +#: plugins/sudoers/pwutil.c:778 plugins/sudoers/pwutil.c:829 +#: plugins/sudoers/pwutil.c:880 plugins/sudoers/pwutil.c:931 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "не могу да сместим у оставу списак групе за „%s“, нема више меморије" + +#: plugins/sudoers/pwutil.c:818 +#, c-format +msgid "unable to parse groups for %s" +msgstr "не могу да обрадим групе за „%s“" + +#: plugins/sudoers/pwutil.c:920 +#, c-format +msgid "unable to parse gids for %s" +msgstr "не могу да обрадим гид-ове за „%s“" + +#: plugins/sudoers/set_perms.c:113 plugins/sudoers/set_perms.c:469 +#: plugins/sudoers/set_perms.c:912 plugins/sudoers/set_perms.c:1239 +#: plugins/sudoers/set_perms.c:1556 +msgid "perm stack overflow" +msgstr "стално прекорачење спремника" + +#: plugins/sudoers/set_perms.c:121 plugins/sudoers/set_perms.c:400 +#: plugins/sudoers/set_perms.c:477 plugins/sudoers/set_perms.c:779 +#: plugins/sudoers/set_perms.c:920 plugins/sudoers/set_perms.c:1163 +#: plugins/sudoers/set_perms.c:1247 plugins/sudoers/set_perms.c:1489 +#: plugins/sudoers/set_perms.c:1564 plugins/sudoers/set_perms.c:1654 +msgid "perm stack underflow" +msgstr "стално поткорачење спремника" + +#: plugins/sudoers/set_perms.c:180 plugins/sudoers/set_perms.c:523 +#: plugins/sudoers/set_perms.c:1298 plugins/sudoers/set_perms.c:1596 +msgid "unable to change to root gid" +msgstr "не могу да пређем на гиб администратора" + +#: plugins/sudoers/set_perms.c:269 plugins/sudoers/set_perms.c:620 +#: plugins/sudoers/set_perms.c:1049 plugins/sudoers/set_perms.c:1375 +msgid "unable to change to runas gid" +msgstr "не могу да пређем на гиб покреникао" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to set runas group vector" +msgstr "не могу да подесим вектор „покрени-као група“" + +#: plugins/sudoers/set_perms.c:285 plugins/sudoers/set_perms.c:636 +#: plugins/sudoers/set_perms.c:1063 plugins/sudoers/set_perms.c:1389 +msgid "unable to change to runas uid" +msgstr "не могу да пређем на јиб покреникао" + +#: plugins/sudoers/set_perms.c:303 plugins/sudoers/set_perms.c:654 +#: plugins/sudoers/set_perms.c:1079 plugins/sudoers/set_perms.c:1405 +msgid "unable to change to sudoers gid" +msgstr "не могу да пређем на гиб судоерса" + +#: plugins/sudoers/set_perms.c:387 plugins/sudoers/set_perms.c:766 +#: plugins/sudoers/set_perms.c:1150 plugins/sudoers/set_perms.c:1476 +#: plugins/sudoers/set_perms.c:1641 +msgid "too many processes" +msgstr "превише процеса" + +#: plugins/sudoers/solaris_audit.c:51 +msgid "unable to get current working directory" +msgstr "не могу да добавим тренутни радни директоријум" + +#: plugins/sudoers/solaris_audit.c:59 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "корисничка_наредба скраћене путање прегледа: %s" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "„argv[0]“ скраћене путање прегледа: %s" + +#: plugins/sudoers/solaris_audit.c:115 +msgid "audit_failure message too long" +msgstr "порука неуспеха прегледа је предуга" + +#: plugins/sudoers/sssd.c:400 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "не могу да покренем ССС извор. Да ли је СССД инсталиран на вашем рачунару?" + +#: plugins/sudoers/sssd.c:408 plugins/sudoers/sssd.c:417 +#: plugins/sudoers/sssd.c:426 plugins/sudoers/sssd.c:435 +#: plugins/sudoers/sssd.c:444 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не могу да нађем симбол „%s“ у „%s“" + +#: plugins/sudoers/sssd.c:1543 +#, c-format +msgid "" +"\n" +"SSSD Role: %s\n" +msgstr "" +"\n" +"СССД улога: %s\n" + +#: plugins/sudoers/sssd.c:1548 +#, c-format +msgid "" +"\n" +"SSSD Role: UNKNOWN\n" +msgstr "" +"\n" +"СССД улога: НЕПОЗНАТО\n" + +#: plugins/sudoers/sudo_nss.c:290 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Упоређује уносе основности за „%s“ на %s:\n" + +#: plugins/sudoers/sudo_nss.c:308 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Покрени-као и Наредбено-посебне основности за „%s“:\n" + +#: plugins/sudoers/sudo_nss.c:326 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Корисник „%s“ може да покреће следеће наредбе на %s:\n" + +#: plugins/sudoers/sudo_nss.c:339 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Корисник „%s“ нема права да покрене судо над „%s“.\n" + +#: plugins/sudoers/sudoers.c:168 plugins/sudoers/testsudoers.c:247 +#: plugins/sudoers/visudo.c:233 plugins/sudoers/visudo.c:612 +#: plugins/sudoers/visudo.c:976 +msgid "unable to initialize sudoers default values" +msgstr "не могу да покренем основне вредности судоерса" + +#: plugins/sudoers/sudoers.c:198 plugins/sudoers/sudoers.c:890 +msgid "problem with defaults entries" +msgstr "неприлике са основним уносима" + +#: plugins/sudoers/sudoers.c:205 +msgid "no valid sudoers sources found, quitting" +msgstr "нисам пронашао исправне изворе судоерса, прекидам" + +#: plugins/sudoers/sudoers.c:244 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "судоерси наводе да администратор није дозвољен у судоу" + +#: plugins/sudoers/sudoers.c:301 +msgid "you are not permitted to use the -C option" +msgstr "није вам допуштено да користите опцију „-C“" + +#: plugins/sudoers/sudoers.c:390 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "власник временске ознаке (%s): нема таквог корисника" + +#: plugins/sudoers/sudoers.c:405 +msgid "no tty" +msgstr "нема конзоле" + +#: plugins/sudoers/sudoers.c:406 +msgid "sorry, you must have a tty to run sudo" +msgstr "извините, морате имати конзолу да покренете судо" + +#: plugins/sudoers/sudoers.c:467 +msgid "command in current directory" +msgstr "наредба у текућем директоријуму" + +#: plugins/sudoers/sudoers.c:486 +msgid "sorry, you are not allowed set a command timeout" +msgstr "извините, није вам дозвољено да подесите време истека наредбе" + +#: plugins/sudoers/sudoers.c:494 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "извините, није вам дозвољено да сачувате окружење" + +#: plugins/sudoers/sudoers.c:835 +msgid "command too long" +msgstr "наредба је предуга" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "„%s“ није обична датотека" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:217 toke.l:969 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s је у власништву уиб-а %u, а треба бити %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:974 +#, c-format +msgid "%s is world writable" +msgstr "Сви могу да пишу у „%s“" + +#: plugins/sudoers/sudoers.c:959 toke.l:977 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s је у власништву уиб-а %u, а треба бити %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "само администратор може да користи „-c %s“" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "непознат разред пријављивања: %s" + +#: plugins/sudoers/sudoers.c:1094 plugins/sudoers/sudoers.c:1108 +#, c-format +msgid "unable to resolve host %s" +msgstr "не могу да решим домаћина „%s“" + +#: plugins/sudoers/sudoreplay.c:275 +#, c-format +msgid "invalid filter option: %s" +msgstr "неисправна опција пропусника: %s" + +#: plugins/sudoers/sudoreplay.c:288 +#, c-format +msgid "invalid max wait: %s" +msgstr "неисправно најдуже чекање: %s" + +#: plugins/sudoers/sudoreplay.c:300 +#, c-format +msgid "invalid speed factor: %s" +msgstr "неисправан чинилац брзине: %s" + +#: plugins/sudoers/sudoreplay.c:303 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s version %s\n" +msgstr "%s издање %s\n" + +#: plugins/sudoers/sudoreplay.c:335 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/временисање: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/временисање: %s" + +#: plugins/sudoers/sudoreplay.c:357 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Понављам сесију судоа: %s" + +#: plugins/sudoers/sudoreplay.c:555 plugins/sudoers/sudoreplay.c:602 +#: plugins/sudoers/sudoreplay.c:804 plugins/sudoers/sudoreplay.c:879 +#: plugins/sudoers/sudoreplay.c:958 plugins/sudoers/sudoreplay.c:973 +#: plugins/sudoers/sudoreplay.c:980 plugins/sudoers/sudoreplay.c:987 +#: plugins/sudoers/sudoreplay.c:994 plugins/sudoers/sudoreplay.c:1001 +#: plugins/sudoers/sudoreplay.c:1143 +msgid "unable to add event to queue" +msgstr "не могу да додам догађај у ред" + +#: plugins/sudoers/sudoreplay.c:670 +msgid "unable to set tty to raw mode" +msgstr "не могу да подесим конзолу на сирови режим" + +#: plugins/sudoers/sudoreplay.c:721 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Упозорење: ваш терминал је премали да би исправно приказао дневник.\n" + +#: plugins/sudoers/sudoreplay.c:722 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Геометрија дневника је %d x %d, а геометрија терминала је %d x %d." + +#: plugins/sudoers/sudoreplay.c:749 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Одговор је завршен, притисните неки тастер да повратите терминал." + +#: plugins/sudoers/sudoreplay.c:782 +#, c-format +msgid "invalid timing file line: %s" +msgstr "неисправан ред датотеке временисања: %s" + +#: plugins/sudoers/sudoreplay.c:1177 plugins/sudoers/sudoreplay.c:1202 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "нејасан израз „%s“" + +#: plugins/sudoers/sudoreplay.c:1224 +msgid "unmatched ')' in expression" +msgstr "непоклопљена ) у изразу" + +#: plugins/sudoers/sudoreplay.c:1228 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "непознат појам претраге „%s“" + +#: plugins/sudoers/sudoreplay.c:1243 +#, c-format +msgid "%s requires an argument" +msgstr "„%s“ захтева аргумент" + +#: plugins/sudoers/sudoreplay.c:1246 plugins/sudoers/sudoreplay.c:1626 +#, c-format +msgid "invalid regular expression: %s" +msgstr "неисправан регуларан израз: %s" + +#: plugins/sudoers/sudoreplay.c:1250 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "не могу да обрадим датум „%s“" + +#: plugins/sudoers/sudoreplay.c:1259 +msgid "unmatched '(' in expression" +msgstr "непоклопљена ( у изразу" + +#: plugins/sudoers/sudoreplay.c:1261 +msgid "illegal trailing \"or\"" +msgstr "недозвољено пратеће „или“" + +#: plugins/sudoers/sudoreplay.c:1263 +msgid "illegal trailing \"!\"" +msgstr "недозвољени пратећи „!“" + +#: plugins/sudoers/sudoreplay.c:1312 +#, c-format +msgid "unknown search type %d" +msgstr "непозната врста претраге „%d“" + +#: plugins/sudoers/sudoreplay.c:1350 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: неисправна датотека дневника" + +#: plugins/sudoers/sudoreplay.c:1368 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: недостаје поље временске ознаке" + +#: plugins/sudoers/sudoreplay.c:1375 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: временска ознака %s: %s" + +#: plugins/sudoers/sudoreplay.c:1382 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: недостаје поље корисника" + +#: plugins/sudoers/sudoreplay.c:1391 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: недостаје поље „покрени-као корисник“" + +#: plugins/sudoers/sudoreplay.c:1400 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: недостаје поље „покрени-као група“" + +#: plugins/sudoers/sudoreplay.c:1806 +#, c-format +msgid "usage: %s [-hnR] [-d dir] [-m num] [-s num] ID\n" +msgstr "употреба: %s [-hnR] [-d дир] [-m број] [-s број] ИБ\n" + +#: plugins/sudoers/sudoreplay.c:1809 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "употреба: %s [-h] [-d дир] -l [израз претраге]\n" + +#: plugins/sudoers/sudoreplay.c:1818 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s — понавља дневнике сесије судоа\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1820 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Опције:\n" +" -d, --directory=дир наводи директоријум за дневнике сесије\n" +" -f, --filter=пропусник наводи У/И врсту(е) за приказивање\n" +" -h, --help приказује поруку помоћи и излази\n" +" -l, --list исписује доступне ИБ-ове сесије, са изборним изразом\n" +" -m, --max-wait=број највећи број секунди за чекање између догађаја\n" +" -s, --speed=број убрзава или успорава излаз\n" +" -V, --version приказује податке о издању и излази" + +#: plugins/sudoers/testsudoers.c:329 +msgid "\thost unmatched" +msgstr "\tдомаћин није поклопљен" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Наредба је допуштена" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Наредба је одбијена" + +#: plugins/sudoers/testsudoers.c:333 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Наредба није поклопљена" + +#: plugins/sudoers/timestamp.c:225 +#, c-format +msgid "%s is group writable" +msgstr "Група може да пише у „%s“" + +#: plugins/sudoers/timestamp.c:301 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "не могу да скратим датотеку временске ознаке на %lld бајта" + +#: plugins/sudoers/timestamp.c:756 plugins/sudoers/timestamp.c:823 +#: plugins/sudoers/visudo.c:500 plugins/sudoers/visudo.c:506 +msgid "unable to read the clock" +msgstr "не могу да прочитам сат" + +#: plugins/sudoers/timestamp.c:770 +msgid "ignoring time stamp from the future" +msgstr "занемарујем временску ознаку из будућности" + +#: plugins/sudoers/timestamp.c:782 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "временска ознака је превише у будућности: %20.20s" + +#: plugins/sudoers/timestamp.c:877 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "не могу да закључам датотеку временске ознаке „%s“" + +#: plugins/sudoers/timestamp.c:921 plugins/sudoers/timestamp.c:941 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "путања стања обучавања је предуга: %s/%s" + +#: plugins/sudoers/visudo.c:188 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s граматика издање %d\n" + +#: plugins/sudoers/visudo.c:266 plugins/sudoers/visudo.c:667 +#, c-format +msgid "press return to edit %s: " +msgstr "притисните „унеси“ да уредите „%s“: " + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "наведени уређивач (%s) не постоји" + +#: plugins/sudoers/visudo.c:349 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "нисам пронашао уређивача (путања уређивача = %s)" + +#: plugins/sudoers/visudo.c:459 plugins/sudoers/visudo.c:467 +msgid "write error" +msgstr "грешка писања" + +#: plugins/sudoers/visudo.c:513 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "не могу да добавим податке привремене датотеке (%s), %s је неизмењено" + +#: plugins/sudoers/visudo.c:520 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "привремена датотека нулте дужине (%s), %s је неизмењено" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "уређивач (%s) није успео, %s је неизмењено" + +#: plugins/sudoers/visudo.c:548 +#, c-format +msgid "%s unchanged" +msgstr "„%s“ је неизмењено" + +#: plugins/sudoers/visudo.c:607 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "не могу поново да отворим привремену датотеку (%s), %s је неизмењено." + +#: plugins/sudoers/visudo.c:619 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "не могу да обрадим привремену датотеку (%s), непозната грешка" + +#: plugins/sudoers/visudo.c:656 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "унутрашња грешка, не могу да пронађем „%s“ на списку!" + +#: plugins/sudoers/visudo.c:736 plugins/sudoers/visudo.c:745 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "не могу да подесим (јиб, гиб) за %s на (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "„%s“ и „%s“ нису на истом систему датотека, користим „mv“ за преименовање" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "наредба није успела: „%s %s %s“, %s је неизмењено" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "грешка преименовања „%s“, %s је неизмењено" + +#: plugins/sudoers/visudo.c:855 +msgid "What now? " +msgstr "Шта сада? " + +#: plugins/sudoers/visudo.c:869 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Опције су:\n" +" e — опет уређује датотеку судоерса\n" +" x — излази без чувања измена у датотеци судоерса\n" +" Q — прекида и чува измене у датотеци судоерса (ОПАСНО!)\n" + +#: plugins/sudoers/visudo.c:915 +#, c-format +msgid "unable to run %s" +msgstr "не могу да покренем %s" + +#: plugins/sudoers/visudo.c:945 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: погрешан власник (јиб, гиб) треба бити (%u, %u)\n" + +#: plugins/sudoers/visudo.c:952 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: лоша овлашћења, требају бити у режиму 0%o\n" + +#: plugins/sudoers/visudo.c:981 plugins/sudoers/visudo_json.c:1021 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "нисам успео да обрадим %s датотеку, непозната грешка" + +#: plugins/sudoers/visudo.c:997 plugins/sudoers/visudo_json.c:1032 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "грешка обраде у %s близу реда %d\n" + +#: plugins/sudoers/visudo.c:1000 plugins/sudoers/visudo_json.c:1035 +#, c-format +msgid "parse error in %s\n" +msgstr "грешка обраде у %s\n" + +#: plugins/sudoers/visudo.c:1008 plugins/sudoers/visudo.c:1015 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: успешно је обрађено\n" + +#: plugins/sudoers/visudo.c:1062 +#, c-format +msgid "%s busy, try again later" +msgstr "„%s“ је заузет, покушајте касније" + +#: plugins/sudoers/visudo.c:1159 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Грешка: %s:%d циклус у „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1160 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Упозорење: %s:%d циклус у „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1164 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Грешка: %s:%d упута за „%s“ „%s“ постоји али није одређена" + +#: plugins/sudoers/visudo.c:1165 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Упозорење: %s:%d упута за „%s“ „%s“ постоји али није одређена" + +#: plugins/sudoers/visudo.c:1318 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Упозорење: %s:%d некоришћено „%s“ „%s“" + +#: plugins/sudoers/visudo.c:1433 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s — безбедно уређује датотеку судоерса\n" +"\n" + +#: plugins/sudoers/visudo.c:1435 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +" -x, --export=output_file write sudoers in JSON format to output_file" +msgstr "" +"\n" +"Опције:\n" +" -c, --check режим само провере\n" +" -f, --file=судоерс наводи место датотеке судоерса\n" +" -h, --help приказује поруку помоћи и излази\n" +" -q, --quiet мање опширне (тихе) поруке грешке синтаксе\n" +" -s, --strict строга провера синтаксе\n" +" -V, --version приказује податке о издању и излази\n" +" -x, --export=изл._датотека извози судоерсе у ЈСОН запису" + +#: plugins/sudoers/visudo_json.c:616 plugins/sudoers/visudo_json.c:651 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "непознат унос основности „%s“" + +#: plugins/sudoers/visudo_json.c:1007 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: улазна датотека треба да се разликује од излазне" + +#: toke.l:943 +msgid "too many levels of includes" +msgstr "превише нивоа укључивања" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Упозорење: циклус у „%s“ „%s“" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Упозорење: упута за „%s“ „%s“ постоји али није одређена" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Упозорење: некоришћено „%s“ „%s“" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "путања временске ознаке је предуга: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "не могу да добавим податке уређивача (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: нестаде простора проширујући међумеморију домаћина" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: нестаде простора изграђујући међумеморију домаћина" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "не поклапа се додела „sudo_ldap_build_pass1“" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "унутрашња грешка: недовољно простора за ред дневника" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: прекорачење међумеморије" diff --git a/utsudo-0.0.2/plugins/sudoers/po/sv.mo b/utsudo-0.0.2/plugins/sudoers/po/sv.mo new file mode 100644 index 0000000000000000000000000000000000000000..f36e7ec7c809d1a83ad50f8b0a45687973bb4b2b GIT binary patch literal 48795 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 ViB`{I)TC!Pb%^ihil9e2{68ax>+b*n literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/sv.po b/utsudo-0.0.2/plugins/sudoers/po/sv.po new file mode 100644 index 0000000..6f1da97 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/sv.po @@ -0,0 +1,2515 @@ +# Swedish translation for sudoers. +# Copyright © 2012, 2016, 2017, 2018, 2019 Free Software Foundation, Inc. +# This file is put in the public domain. +# Daniel Nylander , 2012. +# Sebastian Rasmussen , 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 15:02+0200\n" +"Last-Translator: Sebastian Rasmussen \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2.3\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "syntaxfel" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "lösenord för %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] lösenord för %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Lösenord: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** SÄKERHETSINFORMATION för %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Försök igen." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "kunde inte allokera minne" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "en kontrollsumma kräver ett sökvägsnamn" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "ogiltigt notbefore-värde" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "ogiltigt notafter-värde" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "tidsgränsvärde för stort" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "ogiltigt värde för tidsgräns" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Aliaset ”%s” är redan definierat" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "kunde inte grena process" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "kunde inte ändra lösenord för %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kunde inte få inloggningsklass för användaren %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "kan inte påbörja bsd-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "ogiltig autentiseringstyp" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "kunde inte initiera BSD-autentisering" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "ditt konto har gått ut" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "godkännande misslyckades" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "kan inte läsa fwtk-konfiguration" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "kunde inte ansluta till autentiseringsservern" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "förlorade kontakten med autentiseringsservern" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"fel i autentiseringsservern:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: kunde inte konvertera principal till sträng (”%s”): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: kunde inte tolka ”%s”: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kunde inte slå upp inloggningsuppgiftscache: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: kunde inte allokera flaggor: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kan inte hämta inloggningsuppgifter: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kunde inte initiera inloggningsuppgiftscache: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kunde inte lagra inloggningsuppgifter i cache: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: kan inte hämta principal för värd: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Kan inte verifiera TGT! Möjlig attack!: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "kunde inte initiera PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM-autentiseringsfel: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "kontovalidering misslyckades. Är ditt konto låst?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Kontot eller lösenordet har gått ut. Återställ ditt lösenord och försök igen" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "kunde inte ändra utgånget lösenord: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Lösenordet har gått ut. Kontakta din systemadministratör" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Konto utgånget eller så saknar PAM-konfigurationen ett ”account”-avsnitt för sudo, kontakta din systemadministratör" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Fel vid hantering av PAM-konto: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du finns inte i %s-databasen" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "misslyckades med att initiera ACE API-biblioteket" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "kunde inte kontakta SecurID-servern" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Användar-ID låst för SecurID-autentisering" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "ogiltig längd för användarnamn för SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "ogiltigt autentiseringshandtag för SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID-kommunikation misslyckades" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "okänt SecurID-fel" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "ogiltig lösenordslängd för SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "kunde inte initiera SIA-session" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "ogiltiga autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Ogiltiga autentiseringsmetoder inkompilerade i sudo! Du får inte blanda fristående och icke-fristående autentisering." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "inga autentiseringsmetoder" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Det finns inga autentiseringsmetoder inbyggda i sudo! Om du vill inaktivera autentisering, använd konfigurationsflaggan --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Kunde inte initiera autentiseringsmetoder." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Autentiseringsmetoder:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Kunde inte fastställa granskningsvillkor" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "kunde inte bekräfta granskningsberättelse" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Vi litar på att du har fått den vanliga lektionen från den lokala system-\n" +"administratören. Den kan vanligtvis reduceras till dessa tre saker:\n" +"\n" +" #1) Respektera andras integritet.\n" +" #2) Tänk innan du skriver.\n" +" #3) Med stor makt kommer ett stort ansvar.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "okänt uid: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "okänd användare: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "ordningsinkrement: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "startordning: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "ordningsutfyllnad: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s version %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s grammatikversion %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "inmatningsformat %s stöds inte" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "umatningsformat %s stöds inte" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: in- och utmatningsfiler måste vara olika" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "kunde inte initiera sudoers standardvärden" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: okänt nyckelord: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "ogiltig standardtyp: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "ogiltig undertryckningstyp: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "ogiltigt filter: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "kunde inte öppna %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "misslyckades med att tolka %s-filen, okänt fel" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "tolkningsfel i %s nära rad %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "tolkningsfel i %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "kunde inte skriva till %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - konvertera mellan sudoers filformat\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Flaggor:\n" +" -b, --base=dn DN-bas för sudo LDAP-förfrågningar\n" +" -c, --config=konffil sökvägen till konfigurationsfilen\n" +" -d, --defaults=stdtyper konvertera endast Standard av de angivna typerna\n" +" -e, --expand-aliases expandera alias under konvertering\n" +" -f, --output-format=format ställ in utmatningsformat: JSON, LDIF eller sudoers\n" +" -i, --input-format=format ställ in inmatningsformat: LDIF eller sudoers\n" +" -I, --increment=ant antal att öka varje sudoOrder med\n" +" -h, --help visa hjälpmeddelande och avslut\n" +" -m, --match=filter konvertera endast poster som matchar filtret\n" +" -M, --match-local filtermatchning använder passwd och gruppdatabaser\n" +" -o, --output=utmatningsfil skriv konverterad sudoers till utmatningsfil\n" +" -O, --order-start=ant startpunkt för första sudoOrder\n" +" -p, --prune-matches skala bort användare, grupper och värdar som inte matchar\n" +" -P, --padding=num basutfyllnad för sudoOrder-inkrement\n" +" -s, --suppress=avsnitt undertryck utmatning av vissa avsnitt\n" +" -V, --version visa versionsinformation och avsluta" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "okänd standardpost ”%s”" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "kunde inte få GMT-tid" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "kunde inte formatera tidsstämpel" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "internt fel, %s spill" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "för många sudoers-poster, maximalt %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "miljövariabeln SUDOERS_BASE är inte satt och flaggan -b angavs inte." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Syslog-facilitet om syslog används för loggning: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Syslog-prioritet att använda när användaren lyckas med autentisering: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Syslog-prioritet att använda när användaren misslyckas med autentisering: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Lägg OTP-prompt på en egen rad" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ignorera ”.” i $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Skicka alltid e-post när sudo körs" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Skicka e-post om användarens autentisering misslyckas" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Skicka e-post om användaren inte finns med i sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Skicka e-post om användaren inte finns med i sudoers för denna värddator" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Skicka e-post om användaren inte tillåts att köra ett kommando" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Skicka e-post om användaren försöker köra ett kommando" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Använd en separat tidsstämpel för varje användar-/tty-kombination" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Lär upp användaren första gången de kör sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Fil som innehåller sudo-lektion: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Kräv att användare autentiseras som standard" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root får köra sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Logga värdnamnet i (den icke syslog-baserade) loggfilen" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Logga året i (den icke syslog-baserade) loggfilen" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Om sudo startas utan argument, starta ett skal" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Ställ in $HOME till målanvändaren när ett skal startas med -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Ställ alltid in $HOME till målanvändarens hemkatalog" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Tillåt viss informationsinsamling för att ge meningsfulla felmeddelanden" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Kräv fullständiga värdnamn i sudoers-filen" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Förolämpa användaren när de anger ett felaktigt lösenord" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Tillåt bara användare att köra sudo om de har en tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo kommer att respektera miljövariabeln EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Fråga efter root-lösenordet, inte användarens" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Fråga efter runas_default-användarens lösenord, inte användarens" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Fråga efter målanvändarens lösenord, inte användarens" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Tillämpa standardvärden i målanvändarens inloggningsklass om det finns en" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Ställ in miljövariablerna LOGNAME och USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Sätt bara det effektiva uid:t till målanvändaren, inte till det riktiga uid:t" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Initiera inte gruppvektorn till den från målanvändaren" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Längden vid vilken långa loggfilsrader radbryts (0 för att inte radbryta): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Tidsgräns för autentiseringstidsstämpel: %.1f minuter" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Tidsgräns för lösenordsprompt: %.1f minuter" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Antal försök att ange ett lösenord: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask att använda eller 0777 för att använda användarens: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Sökväg till loggfil: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Sökväg till e-postprogram: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Flaggor för e-postprogram: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Adress att skicka e-post till: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Adress att skicka e-post från: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Ämnesrad för e-postmeddelanden: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Meddelande vid felaktigt lösenord: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Sökväg till lektionsstatuskatalog: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Sökväg till katalog för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Ägare av katalogen för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Användare i denna grupp är undantagna från lösenords- och SÖKVÄGs-kraven: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Standard lösenordsprompt: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Om inställt kommer passprompt att åsidosätta systemprompten i varje fall." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Standardanvändaren att köra kommandon som: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Värde att åsidosätta användarens $PATH med: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Sökväg till textredigerare för användning av visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "När ett lösenord ska krävas för pseudokommandot ”list”: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "När lösenord ska krävas för pseudokommandot ”verify”: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Förinläs attrapp-exec-funktioner som finns i biblioteket sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Om LDAP-registret är uppe, ignorerar vi den lokala sudoers-filen" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Fildeskriptorer >= %d kommer att stängas innan ett kommando exekveras" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Om inställt kan användare åsidosätta värdet ”closefrom” med flaggan -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Låt användare ställa in godtyckliga miljövariabler" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Återställ miljön till standarduppsättningen av variabler" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Miljövariabler att kontrollera:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Miljövariabler att ta bort:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Miljövariabler att behålla:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "SELinux-roll att använda i den nya säkerhetskontexten: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "SELinux-typ att använda i den nya säkerhetskontexten: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Sökväg till den sudo-specifika miljöfilen: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Sökväg till den begränsade sudo-specifika miljöfilen: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Lokalanpassning att använda vid tolkning av sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Tillåt sudo att fråga efter ett lösenord även om det skulle vara synligt" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Ge visuell återkoppling vid lösenordsprompten när det finns användarinmatad data" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Använd snabbare matchning som är mindre exakt men inte använder filsystemet" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Umasken angiven i sudoers kommer att åsidosätta användarens, även om den är mer tillåtande" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Logga användarens inmatning för kommandot som körs" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Logga utmatningen för kommandot som körs" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Komprimera I/O-loggar med hjälp av zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Kör alltid kommandon i en pseudo-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Insticksmodul för stöd för icke-Unix-grupper: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Katalog i vilken in-/utmatningsloggar lagras: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Fil i vilken in-/utmatningsloggar lagras: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Lägg till en post till utmp/utmpx-filen när en pty allokeras" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Sätt användaren i utmp till runas-användaren, inte användaren som anropar" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Uppsättning tillåtna rättigheter: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Uppsättning av begränsningsrättigheter: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Kör kommandon i en pty i bakgrunden" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "PAM-tjänstnamn att använda: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "PAM-tjänstnamn att använda för inloggningsskal: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Försök att etablera PAM-inloggningsuppgifter för målanvändaren" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Skapa en ny PAM-session för kommandot att köra i" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Utför valideringshantering av PAM-konto" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Största sekvensnummer i I/O-logg: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Aktivera sudoers nätgruppsstöd" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kontrollera överordnade kataloger för skrivbarhet när filer redigeras med sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Följ symboliska länkar när filer redigeras med sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Fråga gruppinsticksmodulen efter okända systemgrupper" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Matcha nätgrupper baserat på hela tupeln: användare, värd och domän" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till granskningsloggen" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva I/O-loggen" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Tillåt kommandon att köras även om sudo inte kan skriva till loggfilen" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Gör namnupplösning för grupper i sudoers och matcha efter grupp-ID, inte namnet" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Loggposter större än detta värde kommer att delas upp i flera syslog-meddelanden: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Användare som kommer att äga I/O-loggfilerna: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Grupp som kommer att äga I/O-loggfilerna: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Filrättigheter att använda för I/O-loggfilerna: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Exekvera kommandon efter fildeskriptor istället för efter sökväg: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Hoppa över okända Defaults-poster i sudoers istället för att skriva ut en varning" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Tid i sekunder efter vilka kommandot kommer att avslutas: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Tillåt användaren att ange en tidsgräns på kommandoraden" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Spola ut I/O-loggdata till disk omedelbart istället för att buffra det" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Inkludera process-ID:t vid loggning via syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Typ av post för autentiseringstidsstämplar: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Autentiseringsfelsmeddelande: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Matcha användarnamn skiftlägesokänsligt" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Matcha gruppnamn skiftlägesokänsligt" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Logga när ett kommando tillåts av sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Logga när ett kommando nekas av sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d okänd standardpost ”%s”" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: okänd standardpost ”%s”" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d inget värde angivet för ”%s”" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: inget värde angivet för ”%s”" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d värden för ”%s” måste börja med ett ”/”" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: värden för ”%s” måste börja med ett ”/”" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d flaggan ”%s” tar inte emot något värde" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: flaggan ”%s” tar inte emot något värde" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d ogiltig standardtyp 0x%x för flagga ”%s”" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: ogiltig standardtyp 0x%x för flagga ”%s”" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d värdet ”%s” är ogiltigt för flaggan ”%s”" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: värdet ”%s” är ogiltigt för flaggan ”%s”" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: trasig envp, längd stämmer inte" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "kan inte återuppbygga miljön" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "du får inte lov att ställa in följande miljövariabler: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "tolkningsfel i %s nära rad %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "tolkningsfel i %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "typ %d av kontrollsumma stöds inte för %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: läsfel" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s måste ägas av uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s får endast vara skrivbar av ägaren" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan inte läsa in %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "kunde inte hitta symbolen ”group_plugin” i %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: inkompatibel gruppinsticksmodul huvudversion %d, förväntade %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "kan inte tolka IP-adress ”%s”" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "kan inte tolka nätmask ”%s”" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Lokala IP-adress- och nätmaskpar:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s finns men är inte en katalog (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "kunde inte skapa katalogen %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "kan inte ändra läge för %s till 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "okänd grupp: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "kunde inte läsa %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "kunde inte skapa %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "kunde inte skriva till I/O-loggfil: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: internt fel, I/O-loggfil för event %d inte öppen" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: internt fel, ogiltig signal %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: ogiltig loggfil" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: tidsstämpelfält saknas" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: tidsstämpel %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: användarfältet saknas" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: runas-användarfältet saknas" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: runas-gruppfältet saknas" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "starttls stöds inte när ldaps används" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "kan inte initiera SSL-certifikat och nyckeldatabas: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "du måste ställa in TLS_CERT i %s för att använda SSL" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "kunde inte initiera LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls angivet men LDAP-bibliotek har inte stöd för ldap_start_tls_s() eller ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "ogiltigt sudoOrder-attribut: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: port är för stor" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "LDAP-uri-typ stöds ej: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "kan inte blanda ldap- och ldaps-URI:er" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "kunde inte konvertera sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "kan inte öppna granskningssystem" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "kan inte skicka granskningsmeddelande" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (kommando fortsätter) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "kunde inte öppna loggfil: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "kunde inte låsa loggfil: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "kunde inte skriva till loggfil: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Ingen användare eller värddator" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "valideringsfel" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "användare finns INTE i sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "användaren är INTE auktoriserad på värddatorn" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "kommandot tillåts inte" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s finns inte i filen sudoers. Denna incident kommer att rapporteras.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s tillåts inte att köra sudo på %s. Denna incident kommer att rapporteras.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Tyvärr, användaren %s får inte köra sudo på %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Tyvärr, användaren %s tillåts inte att köra ”%s%s%s” som %s%s%s på %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: kommandot hittades inte" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"ignorerar ”%s” som hittades i ”.”\n" +"Använd ”sudo ./%s” om detta är den ”%s” som du vill köra." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "autentiseringsfel" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "ett lösenord krävs" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u felaktigt lösenordsförsök" +msgstr[1] "%u felaktiga lösenordsförsök" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "kan inte duplicera stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "kunde inte köra %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "kunde inte grena process: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "kunde inte öppna rör: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "kontrollsumma för %s (%s) är inte på %s-form" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "kunde inte ta status på %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP-roll: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers-post:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " KörSomAnvändare: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " KörSomGrupper: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Flaggor: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Kommandon:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Matchande standardposter för %s på %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas- och kommando-specifika standardvärden för %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Användare %s får köra följande kommandon på %s:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Användaren %s tillåts inte att köra sudo på %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "hoppar över ofullständig sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "ogiltigt LDIF-attribut: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "ogiltigt %.*s inställt av sudo-framände" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "kan inte tolka nätverksadresslista" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "användarnamn inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "användar-ID inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "grupp-ID inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "värdnamn inte inställt av sudo-framände" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "kunde inte köra %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers policyinsticksmodul version %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers-filgrammatik version %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sökväg till sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Sökväg till nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Sökväg till ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Sökväg till ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "kan inte registrera krok av typ %d (version %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "kan inte cacha uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "kan inte cacha uid %u, finns redan" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "kan inte cache användare %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "kan inte cacha användare %s, finns redan" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "kan inte cacha gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "kan inte cacha gid %u, finns redan" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "kan inte cacha grupp %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "kan inte cacha grupp %s, finns redan" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "kan inte cacha grupplista för %s, finns redan" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "kan inte cacha grupplista för %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "kan inte tolka grupper för %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "kan inte tolka gids för %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "perm-stackspill" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "perm-stackunderspill" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "kan inte ändra till root-gid" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "kan inte ändra till runas-gid" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "kan inte ställa in gruppvektor för runas" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "kan inte ändra till runas-uid" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "kan inte ändra till sudoers-gid" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "för många processer" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "kan inte hämta aktuell arbetskatalog" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "trunkerad granskningssökväg user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "trunkerad granskningssökväg argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure-meddelande för långt" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "kan inte initiera SSS-källa. Är SSSD installerat på din maskin?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan inte hitta symbol ”%s” i %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "problem med standardposter" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "inga giltiga sudoers-källor hittades, avslutar" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers anger att root inte tillåts att använda sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "du tillåts inte att använda flaggan -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "tidsstämpelägare (%s): Det finns ingen sådan användare" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "ingen tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "tyvärr, du måste ha en tty för att köra sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "kommando i aktuell katalog" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "tyvärr, du tillåts inte att ställa in en tidsgräns för kommandon" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "tyvärr, du tillåts inte att behålla miljövariabler" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "kommandot för långt" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s är inte en vanlig fil" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ägs av uid %u, ska vara %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s är skrivbar för alla" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s ägs av gid %u, ska vara %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "endast root kan använda ”-c %s”" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "okänd inloggningsklass: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "kunde inte slå upp värddatorn %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "ogiltig filterflagga: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "ogiltig största väntan: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "ogiltig hastighetsfaktor: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/tidsmätning: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/tidsmätning: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/tidsmätning: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Spelar upp sudo-session: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "kan inte lägga till händelse till kö" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "kan inte ställa in tty i råläge" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Varning: din terminal är för liten för att korrekt spela upp loggen.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Logg-geometri är %d x %d, din terminals geometri är %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Uppspelning avslutad, tryck på en tangent för att återställa terminalen." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "ogiltig rad i tidsmätningsfil: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "tvetydigt uttryck ”%s”" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "omatchat ”)” i uttryck" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "okänt sökvillkor ”%s”" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s kräver ett argument" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "ogiltigt reguljärt uttryck: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "kunde inte tolka datumet ”%s”" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "omatchat ”(” i uttryck" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "ogiltigt avslutande ”or”" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "ogiltigt efterföljande ”!”" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "okänd söktyp %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "användning: %s [-hnRS] [-d kat] [-m num] [-s num] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "användning: %s [-h] [-d kat] -l [sökuttryck]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - spela upp loggar från sudo-session\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Flaggor:\n" +" -d, --directory=kat ange katalog för sessionsloggar\n" +" -f, --filter=filter ange vilka I/O-typer som ska visas\n" +" -h, --help visa hjälptext och avsluta\n" +" -l, --list lista tillgängliga sessions-ID:n, med valfritt uttryck\n" +" -m, --max-wait=num största antal sekunder att vänta mellan händelser\n" +" -n, --non-interactive inga frågor, sessionen skickas till standard ut\n" +" -R, --no-resize försök inte att ändra storlek på terminalen\n" +" -S, --suspend-wait vänta medan kommandot var i viloläge\n" +" -s, --speed=num påskynda eller fördröj utmatning\n" +" -V, --version visa versionsinformation och avsluta" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tvärd omatchad" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Kommandot tillåts" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Kommandot nekades" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Kommando omatchat" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s är skrivbar för gruppen" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "kunde inte trunkera tidsstämpelfil till %lld byte" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "kunde inte läsa klockan" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "ignorerar tidsstämpel från framtiden" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "tidsstämpel är för långt in i framtiden: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "kunde inte låsa tidsstämpelfil %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "sökväg för lektionsstatus för lång: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "flaggan -x kommer att tas bort i en framtida version" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "överväg att använda verktyget cvtsudoers istället" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "tryck på retur för att redigera %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "angiven redigerare (%s) finns inte" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "ingen textredigerare hittad (sökväg för textredigerare = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "skrivfel" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "kan inte hämta filinformation för temporärfil (%s), %s oförändrad" + +# sebras: not an exact translation, but I think it captures the meaning of the original text. +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "temporärfil tom (%s), %s oförändrad" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "redigeraren (%s) misslyckades, %s är oförändrad" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s oförändrad" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "kunde inte återöppna temporärfil (%s), %s är oförändrad." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "kunde inte tolka temporärfil (%s), okänt fel" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "internt fel, kunde inte hitta %s i listan!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "kunde inte ställa in (uid, gid) för %s till (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s och %s finns inte på samma filsystem, använder mv för att byta namn" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "kommandot misslyckades: ”%s %s %s”, %s är oförändrad" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "fel vid namnbyte för %s, %s är oförändrad" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "Nu då? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Alternativen är:\n" +" r(e)digera sudoers-filen igen\n" +" avsluta (x) utan att spara ändringar i sudoers-filen\n" +" Avsluta (Q) och spara ändringar i sudoers-filen (FARLIGT!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "kunde inte köra %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: felaktig ägare (uid, gid) ska vara (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: felaktiga rättigheter, bör vara läge 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: tolkad OK\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s är upptagen, försök igen senare" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "kunde inte låsa %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Redigera ändå? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Fel: %s:%d cykel i %s ”%s”" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Varning: %s:%d cykel i %s ”%s”" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Fel: %s:%d %s ”%s” refererad till men inte definierad" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Varning: %s:%d %s ”%s” refererad till men inte definierad" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Varning: %s:%d oanvänd %s ”%s”" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - redigera sudoers-filen på ett säkert sätt\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Flaggor:\n" +" -c, --check genomför endast kontroller\n" +" -f, --file=sudoers ange plats för sudoers-filen\n" +" -h, --help visa hjälptext och avsluta\n" +" -q, --quiet mindre utförliga (tysta) syntaxfelmeddelanden\n" +" -s, --strict strikt syntaxkontroll\n" +" -V, --version visa versionsinformation och avsluta\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "för många nivåer av inkluderingar" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ignorerar ogiltigt attributvärde: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "kan inte cacha användare %s, slut på minne" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "kan inte cacha grupp %s, slut på minne" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "kan inte cacha grupplista för %s, slut på minne" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP-roll: OKÄND\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Ordning: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-roll: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD-roll: OKÄND\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Varning: cykel i %s ”%s”" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Varning: %s ”%s” refererad till men inte definierad" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: misslyckades" + +#~ msgid "getauid failed" +#~ msgstr "getauid misslyckades" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: misslyckades" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: misslyckades" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: misslyckades" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: misslyckades" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: misslyckades" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "internt fel, stackspill i expand_prompt()" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s ägs av uid %u, ska vara uid %u" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s finns men är inte en vanlig fil (0%o)" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "internt fel, stackspill i sudo_setenv2()" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "internt fel, stackspill i sudo_setenv()" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s nära rad %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "kunde inte ställa in lokalanpassning till \"%s\", använder \"C\"" + +#~ msgid "invalid uri: %s" +#~ msgstr "ogiltig uri: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "kunde inte blanda ldaps och starttls" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "internt fel, stackspill i linux_audit_command()" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "internt fel: otillräckligt utrymme för loggrad" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Kommandon:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "kunde inte mellanlagra uid %u (%s), finns redan" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "kunde inte mellanlagra gid %u (%s), finns redan" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "kunde inte köra %s: %s" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "internt fel, stackspill i runas_groups" + +#~ msgid "writing to standard output" +#~ msgstr "skriver till standard ut" + +#~ msgid "invalid regex: %s" +#~ msgstr "ogiltigt reguljärt uttryck: %s" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "internt fel, stackspill i init_vars()" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: buffertöverflöde" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "Password:" +#~ msgstr "Lösenord:" diff --git a/utsudo-0.0.2/plugins/sudoers/po/tr.mo b/utsudo-0.0.2/plugins/sudoers/po/tr.mo new file mode 100644 index 0000000000000000000000000000000000000000..da71fd49d94909d4f13151b3ed352306b76a1013 GIT binary patch literal 13979 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, 2011-2013 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.7b2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2013-04-17 15:52-0400\n" +"PO-Revision-Date: 2013-04-27 23:41+0200\n" +"Last-Translator: Özgür Sarıer \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.5\n" + +#: confstr.sh:2 +msgid "Password:" +msgstr "Parola:" + +#: confstr.sh:3 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h için GÜVENLİK bilgisi ***" + +#: confstr.sh:4 +msgid "Sorry, try again." +msgstr "Üzgünüm, yeniden deneyin." + +#: plugins/sudoers/alias.c:124 +#, c-format +msgid "Alias `%s' already defined" +msgstr "Takma ad `%s' önceden tanımlanmış" + +#: plugins/sudoers/auth/bsdauth.c:77 +#, c-format +msgid "unable to get login class for user %s" +msgstr "kullanıcı %s için oturum açma sınıfı elde edilemedi" + +#: plugins/sudoers/auth/bsdauth.c:83 +msgid "unable to begin bsd authentication" +msgstr "bsd kimlik doğrulama işlemine başlanılamadı" + +#: plugins/sudoers/auth/bsdauth.c:91 +msgid "invalid authentication type" +msgstr "geçersiz kimlik doğrulama türü" + +#: plugins/sudoers/auth/bsdauth.c:100 +msgid "unable to setup authentication" +msgstr "kimlik doğrulama gerçekleştirilemedi" + +#: plugins/sudoers/auth/fwtk.c:59 +#, c-format +msgid "unable to read fwtk config" +msgstr "fwtk yapılandırması okunamadı" + +#: plugins/sudoers/auth/fwtk.c:64 +#, c-format +msgid "unable to connect to authentication server" +msgstr "kimlik doğrulama sunucusuna bağlanılamadı" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:127 +#, c-format +msgid "lost connection to authentication server" +msgstr "kimlik doğrulama sunucusunda bağlantı kaybı" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"kimlik doğrulama sunucusu hatası:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:116 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:159 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: ayrıştırılamayan öge '%s': %s" + +#: plugins/sudoers/auth/kerb5.c:169 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: kimlik bilgisi önbelleği çözülemedi: %s" + +#: plugins/sudoers/auth/kerb5.c:217 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: seçenekler ayrılamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:233 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: kimlik bilgileri elde edilemedi: %s" + +#: plugins/sudoers/auth/kerb5.c:246 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: kimlik bilgisi önbelleği hazırlanamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: kimlik bilgisi önbellekte saklanamadı: %s" + +#: plugins/sudoers/auth/kerb5.c:315 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: TGT doğrulanamadı! Muhtemel saldırı!: %s" + +#: plugins/sudoers/auth/pam.c:105 +msgid "unable to initialize PAM" +msgstr "PAM başlatılamadı" + +#: plugins/sudoers/auth/pam.c:150 +msgid "account validation failure, is your account locked?" +msgstr "hesap geçerliliği teyit edilemedi, hesabınız kilitli mi?" + +#: plugins/sudoers/auth/pam.c:154 +msgid "Account or password is expired, reset your password and try again" +msgstr "Hesabın veya hesap parolasının süresi dolmuş, parolanızı sıfırlayınız ve yeniden deneyiniz" + +#: plugins/sudoers/auth/pam.c:162 +#, c-format +msgid "unable to change expired password: %s" +msgstr "zaman aşımına uğramış parola değiştirilemedi: %s" + +#: plugins/sudoers/auth/pam.c:167 +msgid "Password expired, contact your system administrator" +msgstr "Parola geçerlilik süresi dolmuş, sistem yöneticinizle temasa geçiniz" + +#: plugins/sudoers/auth/pam.c:171 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Hesap geçerlilik süresi dolmuş veya sudo için PAM yapılandırması bir \"account\" bölümünden yoksun, sistem yöneticinizle temasa geçiniz" + +#: plugins/sudoers/auth/pam.c:188 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM kimlik doğrulama hatası: %s" + +#: plugins/sudoers/auth/pam.c:247 +#, c-format +msgid "unable to establish credentials: %s" +msgstr "kimlik bilgileri oluşturulamadı: %s" + +#: plugins/sudoers/auth/rfc1938.c:103 plugins/sudoers/visudo.c:212 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s veritabanında bulunmuyorsunuz" + +#: plugins/sudoers/auth/securid5.c:80 +#, c-format +msgid "failed to initialise the ACE API library" +msgstr "ACE API kütüphanesinin hazırlanması başarısız oldu" + +#: plugins/sudoers/auth/securid5.c:106 +#, c-format +msgid "unable to contact the SecurID server" +msgstr "SecurID sunucusuyla bağlantı kurulamadı" + +#: plugins/sudoers/auth/securid5.c:115 +#, c-format +msgid "User ID locked for SecurID Authentication" +msgstr "Kullanıcı Kimliği(User ID), SecurID Kimlik Doğrulaması için kilitli" + +#: plugins/sudoers/auth/securid5.c:119 plugins/sudoers/auth/securid5.c:170 +#, c-format +msgid "invalid username length for SecurID" +msgstr "SecurID için geçersiz kullanıcı adı uzunluğu" + +#: plugins/sudoers/auth/securid5.c:123 plugins/sudoers/auth/securid5.c:175 +#, c-format +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID için geçersiz Kimlik Doğrulama İşleyicisi" + +#: plugins/sudoers/auth/securid5.c:127 +#, c-format +msgid "SecurID communication failed" +msgstr "SecurID iletişimi başarısız oldu" + +#: plugins/sudoers/auth/securid5.c:131 plugins/sudoers/auth/securid5.c:214 +#, c-format +msgid "unknown SecurID error" +msgstr "bilinmeyen SecurID hatası" + +#: plugins/sudoers/auth/securid5.c:165 +#, c-format +msgid "invalid passcode length for SecurID" +msgstr "SecurID için geçersiz şifre uzunluğu" + +#: plugins/sudoers/auth/sia.c:108 +msgid "unable to initialize SIA session" +msgstr "SIA oturumu başlatılamadı" + +#: plugins/sudoers/auth/sudo_auth.c:119 +msgid "invalid authentication methods" +msgstr "geçersiz kimlik doğrulama yöntemleri" + +#: plugins/sudoers/auth/sudo_auth.c:120 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Sudo içinde geçersiz kimlik doğrulama yöntemleri derlenmiş! Bağımsız ve bağımsız olmayan kimlik doğrulama yöntemlerini karma bir şekilde kullanamayabilirsiniz." + +#: plugins/sudoers/auth/sudo_auth.c:203 +msgid "no authentication methods" +msgstr "kimlik doğrulama yöntemleri yok" + +#: plugins/sudoers/auth/sudo_auth.c:205 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Sudo içinde herhangi bir kimlik doğrulama yöntemi derlenmemiş! Kimlik doğrulamayı kapatmak isterseniz, --disable-authentication seçeneğini kullanınız." + +#: plugins/sudoers/auth/sudo_auth.c:389 +msgid "Authentication methods:" +msgstr "Kimlik doğrulama yöntemleri:" + +#: plugins/sudoers/bsm_audit.c:60 plugins/sudoers/bsm_audit.c:63 +#: plugins/sudoers/bsm_audit.c:112 plugins/sudoers/bsm_audit.c:116 +#: plugins/sudoers/bsm_audit.c:168 plugins/sudoers/bsm_audit.c:172 +#, c-format +msgid "getaudit: failed" +msgstr "getaudit: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:90 plugins/sudoers/bsm_audit.c:153 +#, c-format +msgid "Could not determine audit condition" +msgstr "Denetim durumu belirlenemedi" + +#: plugins/sudoers/bsm_audit.c:101 plugins/sudoers/bsm_audit.c:160 +#, c-format +msgid "getauid: failed" +msgstr "getauid: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:103 plugins/sudoers/bsm_audit.c:162 +#, c-format +msgid "au_open: failed" +msgstr "au_open: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:118 plugins/sudoers/bsm_audit.c:174 +#, c-format +msgid "au_to_subject: failed" +msgstr "au_to_subject: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:122 plugins/sudoers/bsm_audit.c:178 +#, c-format +msgid "au_to_exec_args: failed" +msgstr "au_to_exec_args: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:126 plugins/sudoers/bsm_audit.c:187 +#, c-format +msgid "au_to_return32: failed" +msgstr "au_to_return32: işlem başarısız" + +#: plugins/sudoers/bsm_audit.c:129 plugins/sudoers/bsm_audit.c:190 +#, c-format +msgid "unable to commit audit record" +msgstr "denetim kaydı işlenemiyor" + +#: plugins/sudoers/bsm_audit.c:183 +#, c-format +msgid "au_to_text: failed" +msgstr "au_to_text: işlem başarısız" + +#: plugins/sudoers/check.c:189 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Yerel Sistem Yöneticisinden olağan öğütleri aldığınıza güveniyoruz.\n" +"Bunları genellikle aşağıdaki üç şeyle özetleyebiliriz:\n" +"\n" +" #1) Diğer kişilerin özel hayatına saygı gösterin.\n" +" #2) Bir yazmadan önce iki kere düşünün.\n" +" #3) Büyük gücün büyük bir sorumluluk getirdiğini unutmayın.\n" +"\n" + +#: plugins/sudoers/check.c:227 plugins/sudoers/check.c:233 +#: plugins/sudoers/sudoers.c:562 plugins/sudoers/sudoers.c:566 +#, c-format +msgid "unknown uid: %u" +msgstr "bilinmeyen uid: %u" + +#: plugins/sudoers/check.c:230 plugins/sudoers/policy.c:635 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:215 +#: plugins/sudoers/testsudoers.c:359 +#, c-format +msgid "unknown user: %s" +msgstr "bilinmeyen kullanıcı: %s" + +#: plugins/sudoers/def_data.c:27 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:31 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:35 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:39 +msgid "Put OTP prompt on its own line" +msgstr "OTP güdüsünü kendi satırına yerleştir" + +#: plugins/sudoers/def_data.c:43 +msgid "Ignore '.' in $PATH" +msgstr "$PATH içindeki '.' ögesini yoksay" + +#: plugins/sudoers/def_data.c:47 +msgid "Always send mail when sudo is run" +msgstr "Sudonun çalıştırıldığı her zaman e-posta gönder" + +#: plugins/sudoers/def_data.c:51 +msgid "Send mail if user authentication fails" +msgstr "Kullanıcı kimlik doğrulaması başarısız olursa e-posta gönder" + +#: plugins/sudoers/def_data.c:55 +msgid "Send mail if the user is not in sudoers" +msgstr "Kullanıcı sudoers içinde değilse e-posta gönder" + +#: plugins/sudoers/def_data.c:59 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Kullanıcı bu makinedeki sudoers içinde değilse e-posta gönder" + +#: plugins/sudoers/def_data.c:63 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Kullanıcının bir komut çalıştırmasına izin verilmiyor ise e-posta gönder" + +#: plugins/sudoers/def_data.c:67 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Her kullanıcı/tty birleşik girişi için ayrı bir zaman damgası kullan" + +#: plugins/sudoers/def_data.c:71 +msgid "Lecture user the first time they run sudo" +msgstr "Sudoyu ilk defa çalıştırdıkları zaman kullanıcıya gerekli öğütleri ver" + +#: plugins/sudoers/def_data.c:75 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Dosya sudo öğüdü içeriyor: %s" + +#: plugins/sudoers/def_data.c:79 +msgid "Require users to authenticate by default" +msgstr "Öntanımlı olarak kullanıcıların kimlik doğrulaması gerekmektedir" + +#: plugins/sudoers/def_data.c:83 +msgid "Root may run sudo" +msgstr "Kök kullanıcı (root) sudoyu çalıştırabilir" + +#: plugins/sudoers/def_data.c:87 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:91 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:95 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Eğer sudo herhangi bir bağımsız değişkenle uyandırılmazsa, bir kabuk başlat" + +#: plugins/sudoers/def_data.c:99 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Kabuğu -s ile başlatırken $HOME çevre değişkenini hedef kullanıcıya ata" + +#: plugins/sudoers/def_data.c:103 +msgid "Always set $HOME to the target user's home directory" +msgstr "Her zaman $HOME çevre değişkenini hedef kullanıcının ev dizinine ata" + +#: plugins/sudoers/def_data.c:107 +msgid "Allow some information gathering to give useful error messages" +msgstr "Yararlı hata iletilerinin verilmesi için bazı bilgilerin toplanmasına izin ver" + +#: plugins/sudoers/def_data.c:111 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Sudoers dosyası içerisinde tam nitelikli ana makine adlarının olması gerekmektedir" + +#: plugins/sudoers/def_data.c:115 +msgid "Insult the user when they enter an incorrect password" +msgstr "Hatalı parola girdikleri zaman kullanıcıyı aşağıla" + +#: plugins/sudoers/def_data.c:119 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Ancak bir tty sahibi iseler kullanıcıya sudoyu çalıştırma izni ver" + +#: plugins/sudoers/def_data.c:123 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo EDITOR çevre değişkeninin gereğini şerefle yerine getirecektir." + +#: plugins/sudoers/def_data.c:127 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:131 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:135 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:139 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Eğer bir tane varsa hedef kullanıcı oturum açma sınıfında öntanımlıları uygula" + +#: plugins/sudoers/def_data.c:143 +msgid "Set the LOGNAME and USER environment variables" +msgstr "LOGNAME ve USER çevre değişkenlerini ata" + +#: plugins/sudoers/def_data.c:147 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:151 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:155 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %d" +msgstr "" + +#: plugins/sudoers/def_data.c:159 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:163 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:167 +#, c-format +msgid "Number of tries to enter a password: %d" +msgstr "Bir parola girişinde deneme sayısı: %d" + +#: plugins/sudoers/def_data.c:171 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:175 +#, c-format +msgid "Path to log file: %s" +msgstr "Günlük kütüğü yolu: %s" + +#: plugins/sudoers/def_data.c:179 +#, c-format +msgid "Path to mail program: %s" +msgstr "E-posta programı yolu: %s" + +#: plugins/sudoers/def_data.c:183 +#, c-format +msgid "Flags for mail program: %s" +msgstr "E-posta programı için bayraklar: %s" + +#: plugins/sudoers/def_data.c:187 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:191 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:195 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "E-posta iletileri için konu satırı: %s" + +#: plugins/sudoers/def_data.c:199 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Hatalı parola iletisi: %s" + +#: plugins/sudoers/def_data.c:203 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Kimlik doğrulama zaman damgası dizininin yolu: %s" + +#: plugins/sudoers/def_data.c:207 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Kimlik doğrulama zaman damgası dizininin sahibi: %s" + +#: plugins/sudoers/def_data.c:211 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:215 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:219 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:223 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:227 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:231 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Visudo tarafından kullanılacak düzenleyici yolu: %s" + +#: plugins/sudoers/def_data.c:235 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:239 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:243 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Sudo_noexec kütüphanesinin içerdiği taklit exec işlevlerini önyükle" + +#: plugins/sudoers/def_data.c:247 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "LDAP dizini kullanılabilir durumda ise, yerel sudoers dosyalarını yok sayalım mı" + +#: plugins/sudoers/def_data.c:251 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:255 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:259 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:263 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:267 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:271 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:275 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:279 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:283 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:287 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:291 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:295 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:299 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:303 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:307 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:311 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:315 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:319 +msgid "Compress I/O logs using zlib" +msgstr "I/O günlüklerini zlib kullanarak sıkıştır" + +#: plugins/sudoers/def_data.c:323 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:327 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:331 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:335 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:339 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:343 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:347 +msgid "Set of permitted privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:351 +msgid "Set of limit privileges" +msgstr "" + +#: plugins/sudoers/def_data.c:355 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:359 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:363 +msgid "Maximum I/O log sequence number" +msgstr "" + +#: plugins/sudoers/defaults.c:207 plugins/sudoers/defaults.c:587 +#, c-format +msgid "unknown defaults entry `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:215 plugins/sudoers/defaults.c:225 +#: plugins/sudoers/defaults.c:245 plugins/sudoers/defaults.c:258 +#: plugins/sudoers/defaults.c:271 plugins/sudoers/defaults.c:284 +#: plugins/sudoers/defaults.c:297 plugins/sudoers/defaults.c:317 +#: plugins/sudoers/defaults.c:327 +#, c-format +msgid "value `%s' is invalid for option `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:218 plugins/sudoers/defaults.c:228 +#: plugins/sudoers/defaults.c:236 plugins/sudoers/defaults.c:253 +#: plugins/sudoers/defaults.c:266 plugins/sudoers/defaults.c:279 +#: plugins/sudoers/defaults.c:292 plugins/sudoers/defaults.c:312 +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "no value specified for `%s'" +msgstr "" + +#: plugins/sudoers/defaults.c:241 +#, c-format +msgid "values for `%s' must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "option `%s' does not take a value" +msgstr "" + +#: plugins/sudoers/env.c:288 plugins/sudoers/env.c:293 +#: plugins/sudoers/env.c:395 plugins/sudoers/linux_audit.c:82 +#: plugins/sudoers/policy.c:420 plugins/sudoers/policy.c:427 +#: plugins/sudoers/prompt.c:171 plugins/sudoers/sudoers.c:654 +#: plugins/sudoers/testsudoers.c:243 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/env.c:367 +#, c-format +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1012 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:102 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:113 plugins/sudoers/sssd.c:256 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:118 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:123 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:119 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:131 plugins/sudoers/iolog.c:144 +#: plugins/sudoers/timestamp.c:200 plugins/sudoers/timestamp.c:244 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:141 plugins/sudoers/iolog.c:155 +#: plugins/sudoers/iolog.c:159 plugins/sudoers/timestamp.c:165 +#: plugins/sudoers/timestamp.c:221 plugins/sudoers/timestamp.c:271 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:217 plugins/sudoers/sudoers.c:708 +#: plugins/sudoers/sudoreplay.c:354 plugins/sudoers/sudoreplay.c:815 +#: plugins/sudoers/sudoreplay.c:978 plugins/sudoers/timestamp.c:155 +#: plugins/sudoers/visudo.c:809 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/iolog.c:250 plugins/sudoers/sudoers.c:711 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:274 plugins/sudoers/timestamp.c:159 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/iolog.c:334 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/ldap.c:385 +#, c-format +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap.c:408 +#, c-format +msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:438 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:467 +#, c-format +msgid "invalid uri: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:473 +#, c-format +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap.c:477 +#, c-format +msgid "unable to mix ldaps and starttls" +msgstr "" + +#: plugins/sudoers/ldap.c:496 +#, c-format +msgid "sudo_ldap_parse_uri: out of space building hostbuf" +msgstr "" + +#: plugins/sudoers/ldap.c:570 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:573 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1062 +#, c-format +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/ldap.c:1068 +#, c-format +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/ldap.c:1076 +#, c-format +msgid "unable to build time filter" +msgstr "" + +#: plugins/sudoers/ldap.c:1295 +#, c-format +msgid "sudo_ldap_build_pass1 allocation mismatch" +msgstr "" + +#: plugins/sudoers/ldap.c:1842 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1844 +#, c-format +msgid "" +"\n" +"LDAP Role: UNKNOWN\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1891 +#, c-format +msgid " Order: %s\n" +msgstr "" + +#: plugins/sudoers/ldap.c:1899 plugins/sudoers/parse.c:515 +#: plugins/sudoers/sssd.c:1242 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/ldap.c:2321 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:2355 +#, c-format +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:2591 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:57 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:93 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:140 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:168 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:194 +#, c-format +msgid "unable to open log file: %s: %s" +msgstr "günlük kütüğü açılamadı: %s: %s" + +#: plugins/sudoers/logging.c:197 +#, c-format +msgid "unable to lock log file: %s: %s" +msgstr "günlük kütüğü kilitlenemedi: %s: %s" + +#: plugins/sudoers/logging.c:245 +msgid "No user or host" +msgstr "Kullanıcı veya ana makine yok" + +#: plugins/sudoers/logging.c:247 +msgid "validation failure" +msgstr "doğrulama başarısız" + +#: plugins/sudoers/logging.c:254 +msgid "user NOT in sudoers" +msgstr "kullancı sudoers içinde DEĞİL" + +#: plugins/sudoers/logging.c:256 +msgid "user NOT authorized on host" +msgstr "kullanıcı ana makine üzerinde yetkili DEĞİL" + +#: plugins/sudoers/logging.c:258 +msgid "command not allowed" +msgstr "komuta izin verilmiyor" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s sudoers dosyası içinde değil. Bu olay rapor edilecek.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s, %s üzerinde sudoyu çalıştırma iznine sahip değil. Bu olay rapor edilecek.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Üzgünüm, %s kullanıcısı %s üzerinde sudoyu çalıştıramayabilir.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Üzgünüm, %s kullanıcısı '%s%s%s' komutunu %s%s%s olarak %s üzerinde çalıştırma iznine sahip değil.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:383 +#: plugins/sudoers/sudoers.c:384 plugins/sudoers/sudoers.c:386 +#: plugins/sudoers/sudoers.c:387 plugins/sudoers/sudoers.c:1001 +#: plugins/sudoers/sudoers.c:1002 +#, c-format +msgid "%s: command not found" +msgstr "%s: komut bulunamadı" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:379 +#, c-format +msgid "" +"ignoring `%s' found in '.'\n" +"Use `sudo ./%s' if this is the `%s' you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:353 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:379 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:443 plugins/sudoers/logging.c:487 +#, c-format +msgid "%d incorrect password attempt" +msgid_plural "%d incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:566 +#, c-format +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/logging.c:573 plugins/sudoers/logging.c:629 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:619 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/logging.c:644 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:680 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:899 +#, c-format +msgid "internal error: insufficient space for log line" +msgstr "" + +#: plugins/sudoers/match.c:631 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/match.c:661 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/match.c:670 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/parse.c:124 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/parse.c:127 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/parse.c:462 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:463 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:477 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:486 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/policy.c:517 plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:659 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:661 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:665 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:668 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:670 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:671 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/pwutil.c:148 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:190 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:374 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:410 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:564 plugins/sudoers/pwutil.c:586 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:584 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:122 plugins/sudoers/set_perms.c:445 +#: plugins/sudoers/set_perms.c:846 plugins/sudoers/set_perms.c:1141 +#: plugins/sudoers/set_perms.c:1431 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:130 plugins/sudoers/set_perms.c:453 +#: plugins/sudoers/set_perms.c:854 plugins/sudoers/set_perms.c:1149 +#: plugins/sudoers/set_perms.c:1439 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:189 plugins/sudoers/set_perms.c:500 +#: plugins/sudoers/set_perms.c:1200 plugins/sudoers/set_perms.c:1471 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:597 +#: plugins/sudoers/set_perms.c:983 plugins/sudoers/set_perms.c:1277 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:609 +#: plugins/sudoers/set_perms.c:993 plugins/sudoers/set_perms.c:1287 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:627 +#: plugins/sudoers/set_perms.c:1009 plugins/sudoers/set_perms.c:1303 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:361 plugins/sudoers/set_perms.c:698 +#: plugins/sudoers/set_perms.c:1055 plugins/sudoers/set_perms.c:1349 +#: plugins/sudoers/set_perms.c:1515 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/set_perms.c:1583 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/sssd.c:257 +#, c-format +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:263 plugins/sudoers/sssd.c:271 +#: plugins/sudoers/sssd.c:278 plugins/sudoers/sssd.c:285 +#: plugins/sudoers/sssd.c:292 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:283 +#, c-format +msgid "Matching Defaults entries for %s on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:296 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:309 +#, c-format +msgid "User %s may run the following commands on this host:\n" +msgstr "" + +#: plugins/sudoers/sudo_nss.c:318 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/sudoers.c:159 plugins/sudoers/sudoers.c:193 +#: plugins/sudoers/sudoers.c:673 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:165 +#, c-format +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:227 +#, c-format +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:234 +#, c-format +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:315 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:329 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:330 +#, c-format +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:378 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:395 +#, c-format +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:723 plugins/sudoers/timestamp.c:216 +#: plugins/sudoers/timestamp.c:260 plugins/sudoers/timestamp.c:328 +#: plugins/sudoers/visudo.c:310 plugins/sudoers/visudo.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:726 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:729 toke.l:913 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:733 toke.l:920 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:736 toke.l:925 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:763 +#, c-format +msgid "only root can use `-c %s'" +msgstr "" + +#: plugins/sudoers/sudoers.c:780 plugins/sudoers/sudoers.c:782 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:814 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:866 plugins/sudoers/testsudoers.c:377 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:292 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:305 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:311 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:314 plugins/sudoers/visudo.c:179 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:339 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:345 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:363 +#, c-format +msgid "Replaying sudo session: %s\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:369 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:370 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:400 +#, c-format +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:416 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:499 +#, c-format +msgid "writing to standard output" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:528 +#, c-format +msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:641 plugins/sudoers/sudoreplay.c:666 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:683 +#, c-format +msgid "too many parenthesized expressions, max %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:694 +#, c-format +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:700 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:714 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:718 plugins/sudoers/sudoreplay.c:1058 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:724 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:737 +#, c-format +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:739 +#, c-format +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:741 +#, c-format +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1182 +#, c-format +msgid "usage: %s [-h] [-d directory] [-m max_wait] [-s speed_factor] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1185 +#, c-format +msgid "usage: %s [-h] [-d directory] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1194 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1196 +msgid "" +"\n" +"Options:\n" +" -d directory specify directory for session logs\n" +" -f filter specify which I/O type to display\n" +" -h display help message and exit\n" +" -l [expression] list available session IDs that match expression\n" +" -m max_wait max number of seconds to wait between events\n" +" -s speed_factor speed up or slow down output\n" +" -V display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:328 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:331 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:332 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:129 +#, c-format +msgid "timestamp path too long: %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:203 plugins/sudoers/timestamp.c:247 +#: plugins/sudoers/timestamp.c:292 +#, c-format +msgid "%s owned by uid %u, should be uid %u" +msgstr "" + +#: plugins/sudoers/timestamp.c:208 plugins/sudoers/timestamp.c:252 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0700" +msgstr "" + +#: plugins/sudoers/timestamp.c:286 +#, c-format +msgid "%s exists but is not a regular file (0%o)" +msgstr "" + +#: plugins/sudoers/timestamp.c:298 +#, c-format +msgid "%s writable by non-owner (0%o), should be mode 0600" +msgstr "" + +#: plugins/sudoers/timestamp.c:353 +#, c-format +msgid "timestamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:407 +#, c-format +msgid "unable to remove %s, will reset to the epoch" +msgstr "" + +#: plugins/sudoers/timestamp.c:414 +#, c-format +msgid "unable to reset %s to the epoch" +msgstr "" + +#: plugins/sudoers/toke_util.c:176 +#, c-format +msgid "fill_args: buffer overflow" +msgstr "" + +#: plugins/sudoers/visudo.c:180 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/visudo.c:243 plugins/sudoers/visudo.c:533 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:326 plugins/sudoers/visudo.c:332 +#, c-format +msgid "write error" +msgstr "yazma hatası" + +#: plugins/sudoers/visudo.c:414 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:419 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:425 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:448 +#, c-format +msgid "%s unchanged" +msgstr "%s değişmemiş" + +#: plugins/sudoers/visudo.c:477 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "geçici dosya (%s) yeniden açılamadı, %s değişmemiş." + +#: plugins/sudoers/visudo.c:487 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:526 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:578 plugins/sudoers/visudo.c:587 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:582 plugins/sudoers/visudo.c:592 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/visudo.c:609 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:623 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:633 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:695 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:709 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:757 +#, c-format +msgid "unable to run %s" +msgstr "%s çalıştırılamadı" + +#: plugins/sudoers/visudo.c:783 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:790 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:815 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "%s dosyasının ayrıştırılması başarısız oldu, bilinmeyen hata" + +#: plugins/sudoers/visudo.c:831 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s içindeki %d satırı yakınında ayrıştırma hatası\n" + +#: plugins/sudoers/visudo.c:834 +#, c-format +msgid "parse error in %s\n" +msgstr "%s içinde ayrıştırma hatası\n" + +#: plugins/sudoers/visudo.c:841 plugins/sudoers/visudo.c:846 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: ayrıştırma TAMAM\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s busy, try again later" +msgstr "%s meşgul, daha sonra tekrar deneyin" + +#: plugins/sudoers/visudo.c:937 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "belirtilen düzenleyici (%s) yok" + +#: plugins/sudoers/visudo.c:960 +#, c-format +msgid "unable to stat editor (%s)" +msgstr "düzenleyici (%s) başlatılamadı" + +#: plugins/sudoers/visudo.c:1008 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "hiçbir düzenleyici bulunamadı (düzenleyici yolu = %s)" + +#: plugins/sudoers/visudo.c:1100 +#, c-format +msgid "Error: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1101 +#, c-format +msgid "Warning: cycle in %s_Alias `%s'" +msgstr "" + +#: plugins/sudoers/visudo.c:1104 +#, c-format +msgid "Error: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1105 +#, c-format +msgid "Warning: %s_Alias `%s' referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1240 +#, c-format +msgid "%s: unused %s_Alias %s" +msgstr "" + +#: plugins/sudoers/visudo.c:1302 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1304 +msgid "" +"\n" +"Options:\n" +" -c check-only mode\n" +" -f sudoers specify sudoers file location\n" +" -h display help message and exit\n" +" -q less verbose (quiet) syntax error messages\n" +" -s strict syntax checking\n" +" -V display version information and exit" +msgstr "" +"\n" +"Seçenekler:\n" +" -c sadece denetim kipi\n" +" -f sudoers sudoers dosyasının konumu\n" +" -h yardım iletisini görüntüle ve çık\n" +" -q daha az ayrıntılı (sessiz=quiet) sözdizim hata iletileri\n" +" -s sıkı sözdizim denetimi\n" +" -V sürüm bilgisini görüntüle ve çık" + +#: toke.l:886 +msgid "too many levels of includes" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/uk.mo b/utsudo-0.0.2/plugins/sudoers/po/uk.mo new file mode 100644 index 0000000000000000000000000000000000000000..950ed2accba868c9add394468d81819aa35eecad GIT binary patch literal 68120 zcmd753xHi!dH22XZdz|x?^1Wbm;^JE1Q0L~AS3~UKtd(~X~gkl=45ir%sIn3b8^8O z5D`=qF9FnwC|JQ#H6&aDgkY()wpN|7+KRST{d~Pvt8cB=SF7Le|2%8$v-i17CP=^c z8`$}uz4zMd@~r2+*4gJ9hd<`pguhQ5mL$&yuYOXJEPGUv{N}m3%HIo<0ngz46!0|g3Q+ZYCg2Z2m4EW0BoQf&0%wD#fX@P74gMjx9egr)1*m@R0-p-r z4n7Hd5PTds398&bf$INvK}eJwzBoyq0iFb&1fB;%n&j=^@!-AS9Pno#Lr9)=jQ8sd zP~+bK>i%m%)&JpuyTO$62SAnkCa89jWBvS@;E|jj4;}|z2x@%q0GYyMHwdYduYelY zqbYPWn1bs6%R$w<4HUhv2cHA(2AT5Y?*jfDRKNfDB}u}NlXF0|^9FD(_@QwASy1)< zFyJ#8{K=f34r*TB2o8fcgUi4toZ$0)7I*~bZvvkO-UMpC4uC565V#zC-ig!&4uYqE zH-V>u-vTL;%!YX&QF0-u_O1ri&)pzHNWKKB{NtA-36CUaf}-E0;IqJ+L5=f1a25DN zP;@(vNmYI4fvUd=s-L%p>z@Xh+T{D7#`|3UIUKwI6n$REKU6@!exi^Y)GgHSX1*=qh zLGi3<^l6t2G# zRJl=5^RWwLD9PV|ZwDX0(%ZWhOgaB6@cH0(K*{A{5aW4ZKPY;f1RoC}IxSAiPW-Jt6G7D$uH<6q|Ub`B_d>;N@icY_p3 zegdkU;~~D}Ydt7_elw_fJ^+gT4}tT*r<~>eJ`sfE$td_V@Dt!%@Kd11`F&91d&bKh zSAn9#>p|7`eo*Bn!}))KdanO$*Si})&F|%)=ygB%0`MVF z_3j6c1iu5O;N#DAd7KAod}o20x646|<3aFz@G+~C^sl<_X==6=U0NF+wCAzn0yUX|7OFai@{X^Ukhq{9|w;BKM$S; z{s^1}E*S8Bp8#s!YoPeyW1z}E2tE`1CU`9POYk}1i`O~dt^_sD>p_*90M*{xK=to7 zQ1kO;@af>sz^8(bUGMcg6MP}(i@+3I59;}?pq{@Dd=dBnD7t?aJPLdwM1_P&AE@VF z59<0&;2(jX0iOYW9n?Jk3=|!obb;4%A}Bg;0L712fEve#K$U+0)HuH$@IS%BIe*G4 zy#6D>XL5c5_$=^TQ0;F5RnJ?&XM-ODHJ%4S(c#;m`t`eT{)`L#xnn@l=X_B2UlXoh z3W^RN0iOeY9uytE2R;s*^(TJ+X`uSI1XQ_mK=o?`RDEv*p9WqFs@yH0`gt#?{yhY$ z{a=Bi-;*}DeK`_TeHVb@hl@e+=QZH*;HN-DIQb>0d0O^LAJ1lx|C6ivM|AoDDE>?? z^8U^P#qZ~V$AE7D{}8+#6#pIo*MmO=HBV=}%EvPfYW!D$&jW7*HJ-l##Rp#lQ}B17 z%B6!&_vN6*@oG@lF9FrB8$k8@4)EFF*Fn+y=iqGch*x`mP6bu|Vo>F;0!80Xf*RM~ zfYOiu4yyiVl)N7&g3sstLhuN1YrtLL3pn2s&c6hTKYt2p9M9Y6cp9jADT8Wn2dMdZ z7pVSz6imSfKt2CW@X6pG3^`q%3qF_gK2ZIC8L0jag6i*;;r!#E`u7!3{rwLx1)n8+bU@zobV@zr-g&Brgm+2G-2$KycF&-tLrRX~+{ZNTe6jcYF`dVDTi z{}HJEJbsh+XAby6&QAxA14lsB_W@Aj`vfR@{4J>VzYU779y8+eegY`Ha~`PiZ3IQH zH-ahn=b+mA9H@GK0E*9l9dN;Bf9@hs zfPVq1-5-I=ACLTjujIMqThUXGMXzpmy4~`6@8|vC>D+$^6hA-zQg3%LsD7LUYW^+; zp8$RY)VzNj6kWd!o(cXOTmhbZne*pm;PssUHMk7C=yKOnH-aZ~{*R!Zd-_fv{|1mQ zCT|8`4gNQHJou_NIbI8*5|h6NPX*^*ktDAGN5GT7Pl1}x-+&s&)8Fj#GY{0ft_0_R z=Yx*}Uk5%J+zG1PcZ076pLnI~o!5Z6{vHq#CbO<`|8EC~%aJ_(E$)Y|2SuM-LG}0R zASNL>{H?CnN5R>gzYV18$;ZKWgU7th+xcto<(&TnTn;X|+Wp`+fah}lQ}812)VHI1 zz#BmE`J>-~%>+*XMVI%0>eo*|_2=YkJf5k6=X1UX6uqDLPA_*JxQ_E1!4tusgQ~CZ zU2f0c0*by5fvdn{==86_*MTnvx4(yHz>k18fbZMo<38b9Z|7YB9|9M1fA)36?%)7; zBRC7@&~twdQbqEz_Yzxz{|qwZWXt>f{J+4{IluD#?uY#y2nmyC{i#296S$Z2<3Hfz z`XP8U=O}o2JQ!+3_g{~-vGV;Ka6)8J~(kA2YRc_;Wv&VL7P z17G=9u1CHMUc&hqpJr~szXX?o1Apy$^IGsi&Zoeez!!hU?bsK<%Q*iXxDmYUZ`^)= z2Nb=33yQDL`Ybvcd?P6N{Ra4MaO`iBpEO{|agz zj{1_@hkc;<j;4}Zp4JzzUF?&c5o5rw}PtoA@Bn5*5~>wCdt!C!#KgGc|X)1?G1;r!3Q zb>KI_=Yuc#rrXQ4;8xBr21TFmgL?kNZ~6FZ;FCH3BDe+o2KYSitZ#e2H-VDxj|Th_ zcogTq1vQ^X{y!dfp9wDG{3`Gm@b5s4>%YMfaKU$6K6Zhc$4T&N@Nxgk^}~C>?VSG* zR6mBk>*M+&_(9HReb4*xF|fk^mgzKoc|P@1J-`v^tcv$8|Oa+UkPsg zq08GpfR}Lof**Om-w)2_{GUO|&u>BT)hqtZ>GgI{eDP^;0DQ`i{d@>~G3TEESAkyx zHU1a=#P!ex;8M|&&OaH>zYVHCvwrUMJ|0}b`Ng36 zeHW;C{W+-qAOD}ukM9NtIR6Sb2G0M5w|71GQqKPk6#u{Im(E9nV3YG3!JXhU{>$h6 zeW1qkQ?L&_@>edmYryk4zaCr<{scT8T=9Q=9IpjWv*0>u163VDhNL%#Yats{S8?nzv_Qv|j+e z3OpKo1Go_U7^r?f6!6iHIn3s<4-_3Q40t7Y66be<>%gCZ;?px8dzk5!cY=Sy`9FXY zVE^L|Gy8cn_)^Y)4sO=<#~)_?)AiuVoIm{uhnb#O1D?nEC@4NU0E!=e2x{J5@x;SS zUOxdI#<~7PSN)0a5vQcgjXJ3Dyo}Ema$t6nKLOQe{fX9eJ-LG84nAxBEdTd+;pFeZ z4{)G%lE0wLKY}A1?SJp$!UsYfe;RInkn=y}^XI~OKlovew{jpx=EuD{JaZ4{`g=9U zH#i_u@+DAzu(JPg?QlLpvg9U?$MN|OL0H88KEuCPajw6wbKK15mw@7vk8|knGOj%X z{Bt{V*$y9*4cxnrlUIZb;%CjpjT{Z`ozF3k&#&b;n$P-!os-w|`Kxw@F6Hx+!@bp9 z6YpLg&Q%0;m8|3ZY>w;r{IPKFqJV$IwLj+2-_=}O3tkZJiLZ9@`OV-*L0HUW|0>S) zw~+G^_&$z(9O85F=5x8Ozvpv2ozJs5&f@dCInLqpCXR8ABROv6+DpMxIZorV{%+y3 z{@x4j1s8xvg=^2@T>AAA&bNd5`-5=rY2ZqZ7jnGcZzX%c1sqMTRXJ`6*9Gt3d^yK@ zj_bp9=_vgTI@rJe5I!FP9!uG$gYN?MC*7w%>8AYO`?!BfD1(ZyzjuO?y>s#fr}?}n zJonO2=4SA*9IxVfjpG=OJ2^iMOu;vBY~i#1h8&VV=ltay^>F>s0VU(Iv$t}-6?`Vg zqdD|<496UiiJelEvYcsRo3l;cD`>+eGx7jfLiG0t&3*AIaD`#7Ixfo}!pa-7BSYrBJPPxW5Y=Z4KL!svdya_yldrty)fd3ADk>gpR zJRg(8!{=-G{1HB13l4;9zv6R=&-a2)0-puy?+tu@8u-WH19pY^2S3Ph1J~Znp}!A- zbHRV&_%z32&Y#F}KA+1R=W;CKc#va&;}zT+;dnBi^|!%+hc?$56KUG4j+G{cHkXH! zS<7o|o0^V~CMuUNJwU0WM1FG=S#W+k&$k55!;)y9%pY1+4O zLE6{1vD7Fp9j>N@zlqJ|R5#KU=cb!#^|a9(uBBGh#m#cPQf}z+Aw51+t8S`{EENoH zs*IMc8a+N1bs8vUI=%KCU z`b4@Slt^ovtg^;Z_3~J`IoXYk#Z_FDsQh$=+QAfYD~72shOb4_*a+*I;NRt4oVZL z6}Rc|M^w)_Sv`HDwV~2ztR)SlL*-4)&UmTO*aj!ljgfk-Ii3!eCQ9Nsqh?JtIq8== zMBds~uS^&}i8WvWF(y+W`s50#H><4&X=fzaP`KkbdH6(q7zsMW$ zW~J(!u7Z(8iaNuEesg(fOQE6^4K=i-&lqN`Hf-{3k|kkZ8fVELaRJ_u&7F#*;uwuf z{q4oev9~=r`C<+9;${WGE&Po_xRfz&tRX)0tib%Vv7MXh0U1L8)hFW zR@3lH;W-;{&>_7D96LN6dE0cdE5%Bk>8sUuEFG?xG)9tf>NlKU7?x&gv^HWLj|4}A zbCMjN-L|=c-dMG8wdu`yjrkIq(8JzTk3;B5^HI@!v?5cL`?CwBt)hHuoc5pts%O#vGED|5Ia<9@X__F3>B)OI$Wv`2Z0h<)_Pri zbh2`Zn>WUZIjq(u($d64nF>Y8db!UEs2Um_t5i#)dVWC9H=4`>#>x6CGT8@a1lqWP zbj!Z2M1Q<&d00<7FOHYX!+G67W#~S%ri>820NvSE&GorEKgOw?jvJF%13{xo-S1ce zcg71c=)sA&fL_;|O!Q*xUgjzB4d*oezVbJVn^ZBX1$zlg64MFjl#f=1~i+s zY#0i`HTVRzdVjiV!k@zKZ>&{D8$Ke)N`1)e#O8Wg{~~X=E)XV7k6JuGU0W7&Lw*_^ zuUEE~hIWWSYMj>_{a);t`RO{I+X9=Q+sf8uIS%3WvGdal#E&D`)(I@aHh65PhB^pW znD%k}rOL+2Xk}tY|EyVw8V{ZreX-N%RHb&dwpm@)I8#=wu_Sk8y=(**=A76_MaS@A z9<7;I2UAZ}s?GB7e7iY5H(1G9eOOO5(!S`qWE>y$s%cQy+zonYW$R_L`YMufyD5rr zzfsy$hT7#}BuMnj*X4D{08o|q93^9AN@L8Yn6_cFxPVEM`5W8n5>Vy7THn}g>{tMc z>_|%^GDf2%BtkcEIWUXdpGc8BlOR-3)M@h;&8f{-v5|TSn$)GTO>N8>wodbiI}7px zq*qintEXNbX^!%c`j@}q&a!o|iCq*u7|xtVe=5eHg6dEO2YLd%G&%}t;pOp~oQwY0 zsQSq$+Nm`23Xo1jW8;o=qykBssGrTX<|tRnoQ1w-WtzRqY^&9IDnI%$Ng>q~pB`47 zcFPPh_v16_gv#1%)XSJc7#vfdmg*x-IUIVjSsmJ3s*Vs*aFWdd(Zig^!a4oNt?5GYFGpr4is!@Xv^&E(T%0y zbX?liEQS<$MoGCHDIBD3E|CnIRH^1oxX>EQ63sOR07pZ0J1>ooHb27OoW_x%QZF9cw~H76ImAl&YDO%O^VmuTm<5nUbA?l?XtD;pTMwyro^uRbo z<~ezKsI_@>=QQTd&v>u(&Vwe^oG^ zEsZcws&-CuzA-1F7Mq=!+?Z@mDn@}kcP4YNjg#F7RY11uEUT!6J! zo(4xWcVC`M=6xi~hLvatOzbXY+MF00U#Ndjnet~WF%;B=M8A}dPwdc>RBw?6QNl1r zqB3g!tZ{tTyAw6Pr-YM93`$69afhU-f*X)5lS2~ilhuv&KvkMaNGrrQa#4odD0;pl zbXu_+O8obzq12SS_xsh6nGqjI182FwAS1*Hm~x0nw?`Ctq2M<)gDK1+?Jx=(ECoF> zGwy=+$_{CwWhF%tI=wA=Oj|4F8ieQNl$imc4mV{uovBO&Ryz8v(HR(J0>X28CQK|w zy}q$RB!Z4BSGQJBEAoVp$a+PVq`@QGN;?`hNues~FfmD^%w+XVh*!K!i%*QDYtNoko&G#0r`(2-x4g{oS;POWpl2FurdlB zeHLAxuFRJo+A)MShmzsJWaakq5M0(GI{}bs{NZwAs9qTtxhhps5_qnVi@Pz;k(?pJ zU-UzOW*@nYysQ^cvN7BxynH6j77~5DItqi4TR*b!=yy*n=Ow08fZyJT~WdkX6+N%YRmx_10L3s%47N(sJAsv=?ij4@?DdajB~XlCY1%3-b73YK?1lnqEk* zQZp*uF;>|ga=oJ%Nek+gE@nnZ|N5mu&Hc&QXja)j>!gP6OGXxpT6d+})evGK_FQk#qTV#?8OX#km%w}@7Et{=cgA44AryN=I@mLA5951m*MZ(bv zS$Iod)CO8gv7zW5rqCqlY}$*nOI~aQVj_5wH`vlSIcg~u2(b!AtTASzGES8~ebL^_ z@~D4sUKs~P&Na25=(h9E0(ZaNsFp@?V!9N9ggh!xnh*K+`{5Lw8pbt3YG!kX#GMD(Y=3aT;_W24FNaxGzAESUFXejnlnUxO&#u0 zGM%?#*|}$~TsxaQ!fK^Xqg&Ocd|GZUHp?VX!ElIu(L7bw-7T)L1X-&xQ(X#sMOifEar#W6?ltk5U?#hJ?y(f>6Kjb2)Wd@lB@~Ry zL+IRzChI+sX7P5=mSF^5d50GhTQ%l_F<@wkgA^k|N~Fk)7iv&JTv1!eMF4fbFJwT6 z;Q5xLD<0{1awf&gb$T#n!9$#TvsJ$LrNsux8c#f{zfyqftJtK1(BK9_>38I&P)TsuUiw#p%g2uH_6Sk*#A6sFYT}zozfxsZ#)x{njr~g_Z!JtUqvI*AZ{*W={&w9 zfJ&A9gyF?aaz)k6XaW1fbI~Nn1vs10wZ7`Y6poJWV7CH}jO}KMX3lvz&DjM>8sQ83fCId+z0#w>#TW9hI~euHN$d+dW2BgM95fqbt|uvJdCRV!M2 zBi)p&g{#cF%G{u}`B;~SEu$8BRCBAESeBt2nKHGr+?Q-x@)(BX5sVqPft6>IG}xZj z+0YjCVPJbj?Bo}lEDhS;v5E3_Hf+slB=H$rBndk7pwFlxoLYGX&1yaeLIQ6fO9gte zCGcNZ&kR0-I0FilqW>`cQ!R?mv|I@L;C}Hc?e=W%IWh*;jmFw2T47%GLJSLDZ8mswcN8+Jd#ta=XKr}`=7n~%yXBWv(i{& z{lLn#1@+wGT~(*zK?zu9SFE9H3>)6koff-VK&C$Haxy?TIHG>UxPzry2&Qg3|t700=05V0Q1nf zEE|fSFkQe>0ki_gBLXun1j+bqvuw$rMXV=Z9O>K2(SA^RGwzpOqN+I{P zwSv)RiA3?FFCg_N>$KFVv4zb|rA>-{Lj(yKVvG_)wqRSGIaua_Go>!j+)CgwlxsQ)t{_q$Y_Bwk*G4Lt%hY=ZO5vr zUPwrwp=_+#1Di@D-s(0iKHclm@wO~hxeo%!x%SgdbR}3Ra=pPB$h0)B_mbF zs#G^=?U1=xR6?nn(i593o24EEGPlAhD~=@~)1)+xMl%qM!?FVBcpqkx+ESIl$TL3f6Fi`7lfZ-4uB#E*9_;|@;%d-NkG%M-*ZQ%icJj9H!s+QWpjAdvtkTsix!Y>bR`H?}CDl7oBYiWb1Rdif z6hVlIK*QE1%^dm)eS3kD-7Hz3n(~nqBMJv{$?b@w)ZES0#>BZ{-6l-7QR!gMp-|bK z((TC&Qt1~Jo0&6CNQA>x!RSrIzTo9hib%#hrd-DuXz1>6(j{gHOD_vV5Tj5m<2-q4 zQX1QcGN}t8(DtG{$|^WVnOsAvRzp3*^$+fGq>3_@qzV_1?RAcqm&mRkrae& zObE2rB-7@+IqYwRUaE}NxWbLGM7e1S*j?{!TMsQZXEvB3se?J#lEMi5Au(9gi9yvb zTfQ<~wq_Nk+#{}5LGP$~0ClhpAdk)Kt1O!9tfuw5g^JZ&(LsAKB$%ttO;HQCSzhyJ6HiE~4Q-u>L~2fipvTvE6VKl;)$-k$FOl2E%$*uKWz1vPOf+jMeOEHJPgy{Su;2l~;9*L=!z|HA}1qSvecjt_8SQz)*$21WNZbdF7pgtt|?-M1Oq`vKO zdteOOe2ar+YD?t*Y(bIyuGrX~7+Akz^~$vagQqVWSlKn*5nUQ%ISijQvoULiOoUM@ zZt3k$a;907*wk7h^X4JAB~@+R)f%rv)bt_qxOKy# zi;TUy7EpHvhsLVDCAH-xz!hP~HL}Ng7#1;ila!t95*}j*3d!=;osDH}tlHRUUue!1 zv7NJFUw@Cw3&EA=>sK_rL{Ap$a zz1sP>U!U%I`|g248QWAE!#A7s*3|f79jP6B7WfTkk(t$=myRN_0(0z&J@S@#(Bzuk z!<|p-CRGxrPkUEOl^refY-I7ar%5Yo<H zTOpnbUvIVLRMArZF}M!Kvg6d5v^nfB|ST5S9)-jDKs{hcUjNfGc-u_XZ=w2M5ai_WaOn zH8VJwEgn!Rqeud~0=>=2Z|k$&%b7Nd0}2Gx1|K;EHg0niQns?^`!TkKNiH@?dZ~@y z?23!2uM6e|ZTEU~(C&>_EUL>(j{Cm34L+8-XpzD1qb%Z@SFXKqPqw1x-MCk%Yqi`I ze`lMEWDIik^95Gxw!YC?v(3;(R^>{HNs#`+L##~~C@)KwZrV1nMUFX1?)Jh`RqUP{ z%FA)Rys=p!ucLc8hqmzO2)#wvHrHyz1>`W4@SZcA&O^0@?+EtK8J=Hw#1}O!e^Trs zY2U&H+qCV|92Q@4^~l%CeZ3?zHu2jfZAF8%Fq7`vaoY+g1um;n+Gf@(f0wNgZ5`8< zgHA}Uis%)Yl2a6=oQ$GmTAVWqi8t=hmg^SB`4A9|5FJ{2vSu|gs7mHU5aai~YQoLuTBDA~3zOa;2&xPv^;!m7aWtKfz7^{dkoS7ht z*Ml|Z`DW`JH6JRp@BnQ%cb@IjY~?~IoZXw>c`t0H=1B{hSf*~}I<)d-Tdlbp(wLFG zGjFa{BHO!0bIvWTdttL2PsN*h+lRWIZs^;55&x)#`bBBqXu2T`zBPo4W+lyh`Rdw% z+#?(M#;lA1kc%C_pNXb4`-JD1BLH3Y@tD@hWS@votw3f7%H zFt~i>+I8-mh}Bgoc2>pMuNuA+wHcQ&xUk73xN^iT%gCv_7_c zk-dLgW7eA0eQV45<_tTHRuEP#Nsn2y_@#Y|7xf);T)OzUC5slnc+s(o7R@@F6}i53 z^-{ILcea(syHK3Ed~>Z{t?~W(YI^bxl1`kS*4$F>$D*9VBh`^6T-LX)ti9#yw~*?s zR#cRvZ?)0a+;W;MO{0HPc^JDw9H`;-*Xkp!XW8|*W!5>X&RN+S^5XtQyzq#eFlq30 zmLJuQj)i=wy;40%d-X{FPb^)(?u@<@TjkUso7DSOvSnB=Tv?Ky$Txdty}~H8Bz2-G z8ExZJ%FYJGndMbm!#V zllST4{gZd5e7=8j_vAekzLQS}l3A1Q=b`;vyMOYIshue|4p3+h|K8WD$la8_ee%H6 zr4*vlP|pors#p6xI(BcX*~xu$<3nn3>T1)C(pJ27V)Dkx-88bB?%g?cIiL0&u*+{K5_JQ^d=@lLBtt_2-6NT@Yyl;?! z?H1{#u9~`>H$F^VrMjlB@F!y_r)*XZa_`}(`=_o}wd7=T@3)$|oNmzz>assR-^r*L zo9I1t>C`*)tV*RcyN~v4!o25~adky}4;JN^T^kiMO_#iC4NlGWei;_cX?pisbC<`) z9+rP~fG~Tg)47s*3-8(DQP?eNKsDLiGF-g|M<8Bp5WbHoo%+g zpbNt6gKYQFG5c$sFOaD1PN%M6j_yoV#wZEdZ|4I%4nG-}7$KydZD~Z~>h;>Alo2_J zjFild#MEU=f&}d}Me&jZ+NBp#rc>8B|5FGayNYg$!;BLo#g|X*RMWXvfK9zA^b?u$ z!SQc92ONx97Z?H5cDoALJ@pP6y*kY|<9+D;`mi=0x-Z{)d;M^*sMOYi45MbV3i94!tAZi7KdjL+V$@%gtI0s5uiinCxB-7m7is^m4moW+A9WlWJJvfHZ>j zCSyf1;(gs;erBwA-_%ZP(3F*oK$ls_(*s)54~B!#h~?CysVhY_#3hj1I5ik7-O(`D zST{)CV#=2mhiJo;92nyxbFxHYc-py)j~ca2u~`5_QY=697H>NgEl3|L{kgZSsWcpO zhh%|zoTwUr>|`cJMvQ{$GD+cbP|Uen;+VR>o5>pJkaC%l>(Z&W&=>It^-72@gT=3( zfnfKvp>FRw-{Hpi?wq`fG49WqprHFT#oWJla-Sw9zG3$w|m1 zY)sy(!8*^`ml0a@JfJqs1A@~iV?m%AbbV%TE2ORi^yy857)#069dH0G zhpTk^%^bVLh@n0x%1vs{47of0TsITX;GJc%`+3o&e)Sd>S3my0(}UR9>uK2}E}AjD zG;#7)dYgrd!M?@F_5+$RAC?>pIYYakFOJL9HSi#Y#AZSBWPz{Cizsgz5enS};qW9m zHREKAC^GXL72cr$<_;5*=nf;N@QBE}dzPtUX*Z|m0XY-0Q)1yeB}x6M4N8dsSugxj z_(PMR-rnA`X-^#7!LV_^HI^V6W(j#3amc;9k@(&`Q^rCAYTCKuep5@Xq~H;J;y8w@ zgX^qWmLj{~{4l~d=bH}Svh@PU$q&+P)V&eX+hW8DyRWBC81Z@=phZYfmAX+bVlT1l z{Vg#`r>>v6qV?iPWltmuqMR3EMl9%3oF)5>K#8Ev;=8HRBM-ZGw{@Sme`*)>#~V`f z=l=xv!3~}9n<7NzkTU0@fx(?2&s`wB|sz* zoEAh0`2`_VvXkgV>UCdUkCC#Y7VFBTE=yiZruDOW{0*4ancHdpZtId9IbwRLD5;yh z#W`;UaD|RQKDuL1#&MZ7k<^D!m`Rs|FTTSX#(E%{U&zVk)O9dwU`+bqGOL2n7P1`B zn>geAMz`@EZph+?+>{tp1X4U~!iBg_9tZ-yN1x%8>oifOqiE%T`m4#jj%Or{q^48@ zpNO>7G*8RunCXH*yCjm*H@awYPekD__Y@y;*=CULi=tgUTy4B&pfTLJhNV86Rt6_E zDRFy%XXQTVQZCq(7oq4B&1eOr=u8CnMhURd+f35YoRYKR`|}g9KOCEZ=2J2@V++h)Th!^lW7dt zEf^?wq`GMN$=%kY9{rUzg4=TH8Md%o1=FsV3urg0Miich%WWDvc#LqkgU8_PkfROi zbPrc@JZBX%-%wWiLUqG!5?xEeTTg;_rPPFUiHj+$9mtG0nTKbbfIrFQcApD? z*pk`lxi7s#MQq6U&}ESkWqyoBmt^uU`@N@-ycQ|sr*%(g`-t7nWc5nH+u+d$iu2MA;*vmCTbYu|<*{s=*s~b?J{ifEc+2wN)`pLsX_lzMyd+B7VAfDS832 zHF7y*r<}1{Dku_JWlUo8T)Nxdp4vA3QW%;a_1pakmyC`PxrsA}J?6(E(@*Y`#HC*R!ScX=`WPa*#ECM2Ua3Oq7WoD}qy3nRV($tG0#6=_a8ipFW9B z$7y?J@)EfuO#LI)9~L(mnyl_#W2%Erkz88j9CEZxSJ3}%X$s7vip>U@vFqSlXw70$ zUQYd{wQY2naJge@@^_x_~3osJ?V;Q#HEo;LJO{IZm*;JB&y__x9aIk5a!a0h+fX7cz!9)`QMsUshB z9BTLV;`7N}aw;$>t)4Q09Oue~DOc|P^KY3V#_OS*5wTaFM zA*TyH6y(9XiR)??u>dXJAR(o&&j!^iO_eZpG2k*sH|FL=gpANINbUvj5XGEOUxo^_ zRe1LnhU_uAUIq^X+`&zvzezcYcjsJHO~2+$yJ6tZ``d zTu-aM;v-M%-YgKo~2ip%>Cvxy7eh?RGT1)t-|KboHB0d1lG&CbEs6DqK{TlI-_9HR&mAkOrI3m8mNXB~umryDT_9bklom|9=(;pB7Qlldlt4Gy z1P`m&4`d(3X?jI%B%sJ(rN3@ z%*PM4{9Sf7I+;RID5`YZn@+O|SHaZ;3s$b-tRSg>RbDlWTr6WgQ{AdSl9f4|=C8 zCl;MBEgh0@@N|hyUSS2bXc*0BN{W7ps}5H*?ycmNhsg@WWm=+oh3o(>8C~{NH zG$|-Oq&OX#W;<^+i!uzwuaJ;Cmdi|2Gt*7URT<)?Va?)nAd*xU}AoQ3#GOYD=xyGdVNnhQ+R0 zmLiijn~-4qvb}#DlDcFjEtqPy=0inoS+R##iFiA=-I_{nG&b|4u-&#evX7>f!%?(i zDSxRy+vMhYk%Vq|kDn(Q+>A&xNl9sjI|7BaHvD;9DjDPZM0u7?LwaiR-FDUXi}{r2 zUn!a8b#U~){AQoVivWGE&+f$1^MR- zW3!$^&O9!KRN<+($YCRbm#{S12YwOz-5y2R}4=EqVJi zvyK?oXi#S6Oemy@Z3RQC)3yP~bD*|Ki&kL;+rW5zX4s7(Eh3CO5BU^eC4w>jL8EB-mmn-^fkb)Z{T|nq@~lnMVe4}-P=3RL2_qVs zo)QV<#o*8h>dbeG1TW(y88@_(^(XU7Wf)~$LP#PPE3_O{yZ75Y-d$#qOg%{dGhryZ zb_Yn`u1+RDiJ;0$Hg~C|4T6efP9@9Qw0U_;H*g+Z0ruypfZ3E*E`wP@Tjri@PmCS3 z)toqmV8M3RSqjAyMlH3H*UEv#qt_I(QV-si{S1+I)6g>`iujAZMprJ3OQPiA$8LV9 zs6`?Vyj|JmqpisHPL=FwFd-icB(OxX(+7=fNj5;gGanAU; zi^Cjb+kraTN}Q|jW&ql6V+j&#$Wpy67t_?GO^l0Xwut5F5HXYml12zB>Jjs?smUT8 z6J)AG4tQ<-i$K-$S4Fh*33d1QPbPJn@Q8o{g8Jvs{(OQ+)>keO~#JqhH9P}3+9Jy zJ^C0lyoi)%wVnD!tk#BGF}V9zhz*qo_V(Y&3Qhy#YqKCs+p0Bv5Fljgjm}E;Xcq7F z%%+7CEIZFiCjV4dDUJOJhK3L=8;I+~EbrkgE1AieX)4HX=n|oLXG3K5u=t>fC=4|; z1`p7NJMV3~<}qCCAs3I^T!a;yHUl8vg!#9OrgXlo2RY?4pGF+*IX?#KTEk;KnTRY) zTj-rBSYsqx@nJAcv`T@qVywYriaw$+v2?K()*}7K!QcSvn=y;#zx4>WG|3*kDNx>R zED#=r&#z~8?8_Bxd@j{4jg@W7aOE`(b4kjBE}P$@-rzz)R!x28ZA(`3&b(Z#HZBOP zBGKp2j;O9ZM-1$nPXWQb}~1kqh12K_4P0PbaC zB(dlk21>nPK23}43IuB7U^G`)L5_4FJNSOatjGZc7p8(vdF*(*c(Bm2Ivw46W%_7y z7kv*r7!$JH>CcSkcsi$v#Iwu|Jdd^}^%j%!o{2zx8>uGueEZV(aZeMW1dU$i+^$da ztQJ!4A~NnSgS4%jZkM}t5aRGfI|!)Mmh_ea&3m-LoxX8X(iJG9J)rj8F~2XH-WGj_ zAK8oF!x6iCw#I6iJ}9NJAjNzMk00X;U&2vu)Uzy-Ru6MFJvd8psM{1{uD0_!Ys0(K zqjBq5<^n_ZoE->tr1RjhYbW2uaXq8HmfZghlONP?`r$C=0%7r=d{Y@C z!dvzAZoT!y4OAgEM+wQb*$D$^VT2k(Qot5^qt`>39FG|(f}0-LG9T5MPsMh0dTzVs zZTbpPu@m8u>4MkwVe{Ut<*?-@C)mah&~h)FuQAKHkfzSIVyK7Eqvw|+CFk8Yz7!G# zGHseI_k(O2bGd_UUVrN6gmbqNCJAUOER!ne^gUpr6Y!trWPT*<&~+>yd=$IOQj=h zcjkXLvPfoWQFw|xxB_WQ>4kX7g+sa~uX`vj4lJyw!T5>HA0^(p{@q3HfDjzKxId@90xM}swtP3i7hd{qQ_{Jh& z2>h2Xqs!zSl-7*#pS~D*b&N@s(f4<2;Ak+F-hWSP$i{Fi8R+YC(!8-!|`gVpke06(%I7!hg@E#f>v`Lw=8reVAUl=caV|9nuQf zL z&6s|6)KnssOXf8h?R$G<2n!np^EH|GqklNW*XA&UNFrx_5E=R+ci%h5=fuN5}dB1cdKuu-s=A-6Dfb)UJl=z7~`qNbH(#dpx68jiNqRkXDB z1xnNy!Y)fIse%@{@Sc$V-RgTsr)W5P!;1-_D}tLdb&6C+SB|p2LPfhi!$FOCSEK+m z9`gVY*$^^l#`8M?{ELU0|Ljd0(|B{C-=Y?+hJ6cCINqiuJJlvSMN8{5*;yqm95Xs$ z05NVPO_r^0ry5Ri2Tx(6m-B*k!?;587a~*n?2!`o)p2}4F%FZ?1hi#?#k*Pi{)4W@ z!`P^t0?i4grbFIySfNPGl7BpIz{22GqyxIbzN?9G~`H{jBSGh zY8p68O}Z#(SQZWQpq|aOFHV&8@c>sMP0W~vABCN9)=$LosrPJvSHb81wdqp zi5OS8H$G^ah13rVQ(aA!VqNp@0_kj(EjNI`1=&7HHBijAXjSeYJfm%pH}GJas+@7# zVI)dR?vhdrPFPeRk7VVRFt+pxjF6MrH_K=7m_3)W_&o;Yf*h4q_9hLf28pzr3??_n z`oAX`o###X#XiKtuGyW(Jfw$jd#s5_VdlaBq^|XX)36h>LvzW?lig_PbrZU<(=8K{ zjK`Sg?n*(tpDjH)%k!(m##2E-n{-I`cx6%wv}GHNG(Hj~))kX&`6fZ2HG!c9*uAhmqSU9cu0-luAVUFC=SnJ2Y(9M{o{oq6#|J_p#Z; z3N@r4~+bc^gVXy4V1)27m+9@}o?SU?R(=H^bEUoKE(oOr> z*POen80}cne_AZ>7?R&IDWhKA!SO%Q0}Bx8vcC7LCT@ZQ>3g;X8fMz#mg7Cfgc_F& zbPv|5sQ9{I_v9t=js57ictxU0do=|oTn1l^LoW$` zP`&`ABX1A#4dFDn5QO zlEiLib4;k*(urhkdl%4Ut(+1xwxM){2cy7@wt6crBZ)hq$vUVlxEE zEiJcl-v>l@Y3;~ZwwT{ls5G!3R?xS#hS7z6{MX%S5qs@FL>}Zf?-XbDUe2jGRblVo z4L)so@5K0`=Qr?eN=zG0$0pGJgT~QP&gQPS$Y7`05fUK`^wXMg8YH{1`U9T$J?02sa!40Rzsb$JyoM-RA!)o=2 zZf#cDha(%~0g4uTG;Kj3;=J;J7+#4>WBYJlf*XFXrYo890-8x(w*80MHV#2|Guw~Y ze#XS-xv) z({7u;5zg|bNOwwrqt?_`ea?bGf>R>bLJdt+ZtH!k4lOa{Y6*M`&GoRR&=$2U9)+Az z|GA`GD&N`Wh$du#ElUt0EBOM_L#Ew4pp_OfA4IC8-~-C1eW%q$3pgoeicV#<>SpS+ z#F;lF`$CeW$V!o0a^D{es#F74BI&`~^h+`i-sjx*NY%+Nh*dW22(@mI%DO1uv8!EO z+6yXU7bU-Be;A~tlQb`;K+){xf%HgFqT}tm3kepzR|Yd?{jW~U+R6Zhwd2AL9%}G7 zTv8es$@0SVNtT(8<(HK^7i#)b0vx!ay`*^+nGfL8MNQPFK?nVKY9bEhTyI;DhLoZ6 z9q#yS*t0PG@jD`co%4p;l&a@}#g1X?ybs!qol=M`3ur&jHW+^G$v9S=sS40t*fUz) zE7m;(vf1=?)$Z+;$OEIar@0BDdzytMvlLB8Kyni&!eQYc5~EyVU!0K?D-g9`))Os7 zXctLS$4PBA(t#S!%D?PYkP_3F zf07Ws+a$teRuf!EM_@aPGwE8KdDT&n6z<8j^!~@xY^q-wOpR{h5wk~XPKD!F(DfeG zcGA+ee@h};>9v}AQ?+eoqT25Aj#OIfT}>BKOerAg>3GT+EG#u@_FRCm$_#nG2JQM; z6`77^=)^$gh>OG1Wy@F2Y!+fxz{X&++>$8fwLpY~p7r#Zavp;Zxr=*>_@ORb2EAq* zhc-#Jr{SbqH3D0j5e2f;XsTZ7ywm+XdRFkr5Xg~}Y%EnTqchdRUyjH5fO$RAotLp(R(NF(wN$Qlkz0>Np-C|Hf zPPa6`3?AXHCvD6czem-RCut*ajAC=WaMB0`gF*S=&PmjY z`|C*j^&ib3I-fSXiy&HmaN5ugmK~kO*huEIw3US-J!-{9Kuz+mBD?*)W|KP2|BIwC9cQEgK)X7LvwfT}QuZG5fBG36=(om?!nhlI-R#y2H{cKZ^%U+Llp|Gn_sn9MH+l}fPF^V$2<5GGi`!=P1 zmDhfiQhKbDi#sL^{`K6Br#d9WMl0VOLsF_k0~Geb>36UD^}B`|FOga2%|>~sUY_vV zkjH`(v*h|mewckVUg<>37zN|()Nq~Reywz~SS)Y8(->9C=63q&Y7_&CJ~!d})$oo4Y?|VhWYo)Jd?!0KPQOGUo>6j0ikGJ{ z?+;QK>%^EuUeM6iiNI`PV#~%MSc-M@>`H#2w=Tw%Bf_)YzO=6ShmKaW$Q;%@k?WkT zM>q%{GapwS6z_^Z^XtaJ#WwK~KPgM7m40!)JZ&SAMUdRc?>TTq-c^l508K#<1)Xr1 zN|WVs4M*gD$ernYu}e^7`3=E$9&)wQj4?}$$7BN26t!o*QQjM3s<(}}A?4Re2#a?h zkY^D?>LH7kg2Is7OPmQ0N%0^>3VE3q|H4at*)jyWky~22($fH%Trnqez^^7G{EB^j zVsK)V#r{Gi=srtL%9l4SR0y!?>lOA3znWdtRtzcbaCV9e)43;ER&y|GbFeXw#DuR; zwci=6j?Y80Yq(khvfha@*A3i`oVC$O+$<V^z%(+a8!kiNo_ZMhIRLJn4QU5Mw>zU{enRmqLNtH-sG z_)=t%mesa?Bdso~pz;$IdL~?lKii}_@@Fpmag~%wHe6?Gc5Yjol>6YH-RZ#k6{}aS z9T+@)*}zH!DUhxpJDSA8NO-JoBMYBx%pr$E%2hVXHK?SfVL2_|x1e0IHClQuwF2K7ovja94hUiE zV-` zBAX!r`OYuM9=)!t7b-)?3b>7|2gTdbY?t1y&iu!6p02U zEa0?KLwYBMOqV2rFkE7a!O89X6d7XV$+j(tcW<#THbbRh-@ggIwPV|CT@R3;g;7ys z?G}R{Z0bH&#p>a*|bTq(wo!2GA#N>H(W4yH zCGCiz&&Q#S34YBUF&XPxHPvPdxYoN~Rd<%_U1xB4tUf3vduc&)SbkFc)T^0k9v!LI zn&X4xqs@^@)nDP&qmmACg+Ku3NA9wWnsZK9ip==w-s5klRV$Zmj(N+R=RDj_FS2Xz z;G--L>fEH%iPG%^7wo*!t9s4FGEaAgRmk~>3;pg=%8N0NM5k0K={1*Xa_MeggP0h4VW-n6cqT!}} zP^t!+v*|b;SheiX>0ti8y}7NG#C7#0zOi*Dn^!tPqS_Mvs119E{GN1R;A|i64HhaE z)cUl&rX=EJ)|M?i)HA>mmEO!~=2}dopftY700-QnQ*BcYFZJ>S1Yr+d;^`Hq9{R{N zK6CUDiB5|?t;KQ=LsVB+Nff9q*s$l^n?X~K5d)F)yn8TikJ53$CY>y7ZadUQvug5c z1sBR_5gi-ULrbi3*^QvH%u31JD0|Y1Bv6XlLBqEjAgIz)@qK5?_=tNfL)3k$+KpFH zowPdB<~&%k1foW>*^8v@7~-Wn`S`Y_#`41BA`dm&{-fvup9K zX<28n!dv9%cHGX?MQi9OQ*zlJs4P5SZjqxN9wm47WP5UZl6~6BV`w+?rxht%)=9}4 z*9&*SE{8Hap3lW{SuJQscvjy=&$zKG{{>B8dmE&Dq=|Y=xG9ePIq3-tVwz2TR9dIk z9xYN?-R8>kEaAs1gEEe0Yb21x}Q#KwN?= zy_Cgm4P_=;NP04wNALJNd!?2If4+k#8(1V!{C&Lc^Vl`0QK~R3fMnXh>~m|>;*Y6o zy4M+(H8dUS@jk7#$c$^k;Q?hYaXt76`?idlT)iMj-D__5npvori2h-(scP3&_DrV0 z)jf=Wxx$(lR~K0~rj_UJeYEyaA81?~d#kBdBTAEZm|Ow|{at+BJ$z=XXyf9T zeF^uVb1JQ9|>GIQ%H)88-daBB&)MMIgjEi5O?5Vb9FXomBauGpcFl$;Dpqs0z| zu*+80rLw{s&oYlNS5+)3-`$33DPVMakET`L1cNu4EAWdiu-4XtVkb!GL`53)4GM`q zG}}vtK6Hd|-d_>y9(aLSP69; zKhDemz`%u2ZU)bqB?wtb--+t$U~-7{lhXE6>K?@gDVna*{L5%HukeUcSw%-fK8BNc znxPeIVz>oi^D2VaLtJ->rGJq`O-s6=Z}Ua`gF-5V_ZOvoqv-}Ji(jdre-@$Vc;zDY zm~;f}#j2}o2fEk3p>Is9E?U7NXi^#W#^%nAAh4TQv=yW(JJ79B>GqVCwR7J@T$^{L z=@q<*X>s?=^YLV|e-0kN)OB4(kyXg#?q)$yhAsM^lBpOy(#`#IdnYbvXu2g*NLIX}QRl1S4iPik+u$dOCMi@UQ9Br~>$ff@+Z XPUKkch>=ntsYk1EopQRkCi#B>hjHYs literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/uk.po b/utsudo-0.0.2/plugins/sudoers/po/uk.po new file mode 100644 index 0000000..e6df537 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/uk.po @@ -0,0 +1,2387 @@ +# Ukrainian translation for sudoers. +# This file is put in the public domain. +# +# Yuri Chornoivan , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 14:01+0300\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 19.04.0\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "синтаксична помилка" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Пароль %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] пароль до %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Пароль: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Дані щодо ЗАХИСТУ %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Вибачте, повторіть спробу." + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "не вдалося отримати потрібний об’єм пам’яті" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "для контрольної суми слід вказати шлях" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "некоректне значення notbefore" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "некоректне значення notafter" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "значення часу очікування є надто великим" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "некоректне значення часу очікування" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Замінник «%s» вже визначено" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "не вдалося створити відгалуження" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "не вдалося змінити пароль до %s" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "не вдалося отримати клас входу до системи для користувача %s" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "не вдалося розпочати розпізнавання за BSD" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "некоректний тип розпізнавання" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "не вдалося ініціалізувати розпізнавання за BSD" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "термін дії вашого облікового запису вичерпано" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "не вдалося підтвердити" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "не вдалося прочитати налаштування fwtk" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "не вдалося встановити з’єднання з сервером розпізнавання" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "втрачено зв’язок з сервером розпізнавання" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"помилка сервера розпізнавання:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: не вдалося перетворити реєстраційний запис на рядок («%s»): %s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: не вдалося обробити «%s»: %s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: не вдалося визначити кеш реєстраційних даних: %s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: не вдалося розмістити параметри: %s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: не вдалося отримати реєстраційні дані: %s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: не вдалося ініціалізувати кеш реєстраційних даних: %s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: не вдалося зберегти реєстраційні дані у кеші: %s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: не вдалося отримати реєстраційний запис вузла: %s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: спроба перевірки TGT зазнала невдачі! Ймовірно, вас атаковано: %s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "не вдалося ініціалізувати PAM: %s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "Помилка розпізнавання PAM: %s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "помилка під час спроби перевірки облікового запису. Ваш обліковий запис заблоковано?" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "Строк дії облікового запису або пароля збіг, визначте новий пароль і повторіть спробу" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "не вдалося змінити пароль, строк дії якого завершився: %s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "Строк дії пароля збіг, зверніться до адміністратора вашої системи щодо поновлення пароля" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Строк дії облікового запису збіг або у файлі налаштувань PAM немає розділу \"account\" для sudo. Повідомте про це адміністратора вашої системи." + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "Помилка керування обліковими записами PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "вас немає у базі даних %s" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "не вдалося ініціалізувати бібліотеку програмного інтерфейсу до ACE" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "не вдалося встановити зв’язок з сервером SecurID" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "Ідентифікатор користувача заблоковано для розпізнавання SecurID" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "некоректна довжина імені користувача для SecurID" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "некоректний дескриптор розпізнавання для SecurID" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "спроба обміну даними з SecurID зазнала невдачі" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "невідома помилка SecurID" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "некоректна довжина коду пароля для SecurID" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "не вдалося ініціалізувати сеанс SIA" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "некоректні способи розпізнавання" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo зібрано з підтримкою некоректних способів розпізнавання! Не можна змішувати власні і зовнішні способи розпізнавання." + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "немає способів розпізнавання" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo зібрано без можливостей з взаємодії з інструментами розпізнавання! Якщо ви хочете вимкнути розпізнавання, скористайтеся параметром налаштування --disable-authentication." + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "Не вдалося ініціалізувати методи розпізнавання." + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "Способи розпізнавання:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "Не вдалося визначити умови аудита" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "не вдалося надіслати запис аудита" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Ми сподіваємося, що ви отримали належні настанови від адміністратора\n" +"локальної системи. Зазвичай, подібні настанови зводяться до такого:\n" +"\n" +" #1) Поважайте конфіденційність даних інших користувачів.\n" +" #2) Обдумайте свої дії, перш ніж виконувати їх.\n" +" #3) Користування широкими правами розширює сферу відповідальності.\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "невідоме значення uid: %u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "невідомий користувач: %s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "збільшення порядку: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "початковий порядок: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "доповнення порядку: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s, версія %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Граматична перевірка %s, версія %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "непідтримуваний формат вхідних даних, %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "непідтримуваний формат виведення, %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: файли вхідних і вихідних даних мають бути різними файлами" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "не вдалося ініціалізувати типові значення sudoers" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: невідоме ключове слово: %s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "некоректний тип типових значень: %s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "некоректний тип придушення: %s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "некоректний фільтр: %s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "не вдалося відкрити %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "не вдалося обробити файл %s, невідома помилка" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "помилка обробки у %s поблизу рядка %d\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "помилка обробки у %s\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "не вдалося виконати запис до %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s — перетворення форматів файлів sudoers\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Параметри:\n" +" -b, --base=dn базовий DN для запитів sudo до LDAP\n" +" -c, --config=файл_налашт шлях до файла налаштувань\n" +" -d, --defaults=типи перетворювати лише записи Defaults вказаних типів\n" +" -e, --expand-aliases розгортати псевдоніми під час перетворення\n" +" -f, --output-format=формат встановити формат виведення: JSON, LDIF або sudoers\n" +" -i, --input-format=формат встановити формат вхідних даних: LDIF або sudoers\n" +" -I, --increment=число число, на яке слід збільшувати sudoOrder\n" +" -h, --help вивести довідкове повідомлення і завершити роботу\n" +" -m, --match=фільтр перетворювати лише записи, які відповідають фільтру\n" +" -M, --match-local встановлювати відповідність фільтра за базами даних passwd та груп\n" +" -o, --output=файл_результатів записати перетворені дані sudoers до файла файл_результатів\n" +" -O, --order-start=число початкова точка для першого sudoOrder\n" +" -p, --prune-matches вилучити невідповідні записи користувачів, груп і вузлів\n" +" -P, --padding=число доповнення основи для нарощування sudoOrder\n" +" -s, --suppress=розділи придушити виведення певних розділів\n" +" -V, --version вивести дані щодо версії і завершити роботу" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "невідомий запис типових параметрів «%s»" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "не вдалося отримати гринвіцький час" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "не вдалося виконати форматування часового штампа" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "внутрішня помилка, переповнення %s" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "забагато записів sudoers, максимальна кількість — %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "не встановлено значення змінної середовища SUDOERS_BASE і не вказано параметра -b." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Інструмент ведення журналу, якщо використано syslog: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Пріоритетність, яка використовуватиметься у syslog для успішних розпізнавань: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Пріоритетність, яка використовуватиметься у syslog для неуспішних розпізнавань: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Розташовувати запит щодо OTP у окремому рядку" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Ігнорувати «.» у $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Завжди надсилати листа, коли викликано sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Надсилати листа, якщо користувачу не вдалося пройти розпізнавання" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Надсилати листа, якщо користувача немає серед sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Надсилати листа, якщо користувача немає у списку sudoers цього вузла" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Надсилати листа, якщо користувачеві заборонено виконувати команду" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Надсилати листа, якщо користувач намагається віддати команду" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Окремий часовий штамп для кожної комбінації користувач/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Показувати настанови користувачеві під час першого запуску sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "Файл з настановами щодо sudo: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Типово, вимагати розпізнавання" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root може виконувати sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Записувати назву вузла до файла журналу (не syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Записувати рік до файла журналу (не syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Якщо sudo викликано без параметрів, запускати командну оболонку" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Встановлювати $HOME відповідно до вказаного користувача для запуску оболонки з -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Завжди встановлювати значенням $HOME домашній каталог вказаного користувача" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Дозволити збирання даних з метою формування зрозумілих повідомлень про помилки" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "У файлі sudoers слід вказати повні назви вузлів" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Знущатися з користувача, якщо введено помилковий пароль" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Дозволяти користувачеві виконувати sudo, лише якщо з ним пов’язано tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo зважатимwill honor the EDITOR environment variable" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Надсилати запит на пароль root, а не користувача" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Надсилати запит щодо пароля runas_default, але пароля самого користувача" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Надсилати запит щодо пароля потрібного користувача, але пароля самого користувача" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Застосовувати типові параметри у класі вказаного користувача, якщо такий клас є" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Встановити значення змінних середовища LOGNAME і USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Встановлювати для потрібного користувача ефективний uid, а не справжній uid" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Не ініціалізувати вектор групи відповідно до вказаного користувача" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Позиція, на якій слід переносити рядки файла журналу (0 — без перенесення): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Час очікування на часовий штамп розпізнавання: %.1f хвилина" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Час очікування на введення пароля: %.1f хвилина" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Кількість спроб введення пароля: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Потрібне значення umask або 0777 для користувачевого: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Шлях до файла журналу: %s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Шлях до програми ел. пошти: %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Параметри програми ел. пошти: %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Адреса, на яку надсилатимуться листи: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Адреса, з якої надсилатимуться листи: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Тема листів: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Повідомлення про помилковий пароль: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Шлях до каталогу стану отримання настанов: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Шлях до каталогу часових штампів розпізнавання: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Власник каталогу часових штампів розпізнавання: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Користувачів цієї групи звільнено від потреби у введенні пароля і PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Типовий запит пароля: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Якщо встановлено, запит щодо паролю замінюватиме запит системи." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Типовий користувач для запуску команд: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Значення для заміни $PATH користувача: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Шлях до редактора, який використовуватиме visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Умови запиту пароля для псевдокоманди «list»: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Умови запиту пароля для псевдокоманди «verify»: %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Попередньо завантажувати фіктивні функції виконання з бібліотеки sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Чи слід ігнорувати локальний файл sudoers, якщо є доступ до каталогу LDAP" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Дескриптори файлів >= %d буде закрито перед виконанням команди" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Якщо встановлено, користувачі можуть перевизначати значення «closefrom» за допомогою параметра -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Дозволити користувачам встановлювати значення довільних змінних середовища" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Відновити типовий набір змінних середовища" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Змінні середовища, коректність яких слід перевіряти:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Змінні середовища, які слід вилучити:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Змінні середовища, які слід зберегти:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Роль SELinux, яку слід використати у новому контексті захисту: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Тип SELinux, який слід використати у новому контексті захисту: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Шлях до специфічного для sudo файла середовища: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Шлях до специфічного для sudo файла середовища з обмеженим доступом: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Локаль, яку слід використати під час обробки sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Дозволити sudo надсилати запит щодо пароля, навіть якщо цей пароль буде видимим" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Супроводжувати введення користувачем пароля показом замінників символів пароля" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Швидше встановлення відповідності, менш точне, але без доступу до файлової системи" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Значення umask, вказане у sudoers, перевизначатиме значення користувача, навіть якщо це значення відкриває ширший доступ" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Записувати дані, вказані користувачем під час виконання команди" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Записувати дані, виведені командою під час виконання" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Стискати журнали за допомогою zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Завжди запускати команди у псевдо-tty" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Додаток для підтримки не-Unix груп: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Каталог, у якому слід зберігати журнали введення/виведення: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Файл, у якому слід зберігати журнал введення/виведення даних: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Додати запис до файла utmp/utmpx під час розміщення pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Встановити користувача у utmp у значення користувача, від імені якого виконується команда" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Набір дозвільних прав доступу: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Набір обмежувальних прав доступу: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Виконувати команди у pty у фоновому режимі" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Назва служби PAM, якою слід скористатися: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Назва служби PAM, якою слід скористатися для оболонок входу до системи: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Спробувати встановити реєстраційні дані PAM для користувача, від імені якого виконуватимуться дії" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Створити сеанс PAM для виконання команди" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "Виконати керування коректністю облікового запису PAM" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Максимальний номер у послідовності журналу введення-виведення: %u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "Увімкнути підтримку мережевих груп у sudoers" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Перевіряти можливість запису до батьківського каталогу під час редагування фалів за допомогою sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Переходити за символічними посиланнями під час редагування файлів за допомогою sudoedit" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "Надсилати запит до додатка груп щодо невідомих груп системи" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Встановлювати відповідність мережевим групам за усім кортежем даних: користувачем, вузлом і доменом" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до журналу аудиту" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до журналу введення-виведення" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Дозволити виконання команд, навіть якщо sudo не може здійснювати запис до файла журналу" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Визначати групи у sudoers і встановлювати відповідність не назві, а ідентифікатору групи" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Записи журналу, які виявляться довшими за це значення, буде поділено на декілька повідомлень журналу системи: %u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Користувач, який буде власником усіх файлів журналу введення-виведення: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Група, яка буде власником усіх файлів журналу введення-виведення: %s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Режим доступу до файлів, яким слід скористатися для файлів журналу введення-виведення: 0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Виконати команди за дескриптором файла замість виконання за шляхом: %s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Ігнорувати невідомі записи Defaults у sudoers замість показу попередження" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Час у секундах, який має минути, щоб команду буде перервано: %u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Надати змогу користувачеві встановлювати час очікування у командному рядку" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Скидати дані журналу введення-виведення на диск негайно, без буферизації" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "Включати ідентифікатор процесу до журналів syslog" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Тип запису часової позначки розпізнавання: %s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Повідомлення про помилку розпізнавання: %s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "Ігнорувати регістр символів при пошуку імен користувачів" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "Ігнорувати регістр символів при пошуку назв груп" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "Записувати до журналу дані, коли виконання команди дозволене sudoers" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "Записувати до журналу дані, коли виконання команди заборонене sudoers" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d невідомий запис типових параметрів, «%s»" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: невідомий запис типових параметрів, «%s»" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d не вказано значення для «%s»" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: не вказано значення для «%s»" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d значення для «%s» має починатися з «/»" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: значення для «%s» має починатися з «/»" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d параметру «%s» не потрібно передавати значення" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: параметру «%s» не потрібно передавати значення" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d некоректний тип Defaults, 0x%x, для параметра «%s»" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: некоректний тип Defaults, 0x%x, для параметра «%s»" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d значення «%s» є некоректним для параметра «%s»" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: значення «%s» є некоректним для параметра «%s»" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: помилкове значення envp, невідповідність довжин" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "не вдалося перебудувати середовище" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "вибачте, вам не дозволено встановлювати такі змінні середовища: %s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "помилка обробки у %s поблизу рядка %d" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "помилка обробки у %s" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "непідтримуваний тип контрольної суми, %d, для %s" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s: помилка читання" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s має належати користувачеві з uid %d" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s має бути доступним до запису лише для власника" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "не вдалося завантажити %s: %s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "не вдалося знайти символ «group_plugin» у %s" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: несумісна основна версія додатка обробки груп %d, мало бути — %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "не вдалося обробити IP-адресу «%s»" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "не вдалося обробити маску мережі «%s»" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "Пари локальних IP-адрес і масок мережі:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s існує, але не є каталогом (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "не вдалося створити каталог %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "не вдалося змінити режим доступу до %s на значення 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "невідома група: %s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "не вдалося прочитати %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "не вдалося створити %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "не вдалося здійснити запис до файла журналу введення-виведення: %s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: внутрішня помилка, файл журналу введення-виведення для події %d не відкрито" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: внутрішня помилка, некоректний сигнал %d" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: некоректний файл журналу" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: не вказано даних щодо часової позначки" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: часова позначка %s: %s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: не вказано даних щодо користувача" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: не вказано даних щодо користувача, від імені якого відбуватиметься виконання" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: не вказано даних щодо групи, від імені якої відбуватиметься виконання" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "підтримки starttls, якщо використовується ldaps, не передбачено" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "не вдалося ініціалізувати базу даних сертифікатів і ключів SSL: %s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "щоб скористатися SSL, вам слід встановити для TLS_CERT значення %s" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "не вдалося ініціалізувати LDAP: %s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls вказано, але у бібліотеках LDAP не передбачено підтримки ldap_start_tls_s() або ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "некоректний атрибут sudoOrder: %s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: занадто великий номер порту" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "непідтримуваний тип адреси LDAP: %s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "не можна використовувати суміш з адрес ldap і ldaps" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "не вдалося перетворити запис sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "не вдалося відкрити систему аудита" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "не вдалося надіслати повідомлення аудита" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (команда продовжується) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "не вдалося відкрити файл журналу: %s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "не вдалося заблокувати файл журналу: %s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "не вдалося виконати запис до файла журналу: %s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "Немає користувача або вузла" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "помилка під час спроби перевірки" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "користувача немає у списку sudoers" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "користувача не уповноважено на дії на вузлі" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "виконання команди заборонено" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s немає у файлі sudoers. Запис про подію додано до звіту.\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s заборонено виконувати sudo на %s. Запис про подію додано до звіту.\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Вибачте, користувач %s не має права виконувати sudo на %s.\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Вибачте, користувач %s не має права виконувати «%s%s%s» від імені %s%s%s на %s.\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s: команду не знайдено" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"пропущено «%s» знайдений у «.»\n" +"Скористайтеся командою «sudo ./%s», якщо вам потрібно виконати саме «%s»." + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "помилка під час спроби розпізнавання" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "слід вказати пароль" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u невдала спроба введення пароля" +msgstr[1] "%u невдалих спроби введення пароля" +msgstr[2] "%u невдалих спроб введення пароля" +msgstr[3] "одна невдала спроба введення пароля" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "не вдалося здублювати stdin: %m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "не вдалося виконати %s: %m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "не вдалося створити відгалуження: %m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "не вдалося відкрити канал: %m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "контрольну суму для %s (%s) подано не у формі %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "не вдалося виконати stat для %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Роль LDAP: %s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Запис sudoers:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " Користувачі для запуску: " + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " Групи для запуску: " + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " Параметри: " + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " Команди:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Відповідність записів Defaults для %s на %s:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Типові значення для запуску від імені і команд для %s:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Користувач %s має право виконувати на %s такі команди:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Користувач %s не має права виконувати sudo на %s.\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "ігноруємо неповний запис sudoRole: cn: %s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "некоректний атрибут LDIF: %s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "оболонкою sudo встановлено некоректне значення параметра %.*s" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "не вдалося обробити список мережевих адрес" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "ім'я користувача не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "ідентифікатор користувача не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "ідентифікатор групи не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "назву вузла не встановлено за допомогою оболонки sudo" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "не вдалося виконати %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Додаток правил sudoers версії %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Граматична перевірка файла sudoers версії %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Шлях до sudoers: %s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "Шлях до nsswitch: %s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "Шлях до ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "Шлях до ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "неможливо зареєструвати процедуру перехоплення типу %d (версія %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "не вдалося кешувати uid %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "не вдалося кешувати uid %u, запис вже існує" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "не вдалося кешувати користувача %s" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "не вдалося кешувати користувача %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "не вдалося кешувати gid %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "не вдалося кешувати gid %u, запис вже існує" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "не вдалося кешувати групу %s" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "не вдалося кешувати групу %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "не вдалося кешувати список груп %s, запис вже існує" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "не вдалося кешувати список груп %s" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "не вдалося обробити записи груп %s" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "не вдалося обробити записи ідентифікаторів груп %s" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "переповнення стека доступу" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "вичерпання стека доступу" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "не вдалося змінити ідентифікатор групи (gid) root" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "не вдалося змінити gid на runas" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "не вдалося встановити вектор групи виконання" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "не вдалося змінити uid на runas" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "не вдалося змінити gid на sudoers" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "забагато процесів" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "не вдалося отримати поточний робочий каталог" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "обрізаний шлях аудиту user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "обрізаний шлях аудиту argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "повідомлення audit_failure є надто довгим" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "Не вдалося ініціалізувати джерело SSS. Чи встановлено у вашій системі SSSD?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не вдалося знайти символ «%s» у %s" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "проблема з типовими записами" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "не знайдено коректних джерел даних sudoers, завершення роботи" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers вказує, що sudo не можна користуватися для виконання команд від root" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "вам не дозволено використовувати параметр -C" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "власник часового штампа (%s): не знайдено користувача з таким іменем" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "немає tty" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "вибачте, для виконання sudo вашому користувачеві потрібен tty" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "команда у поточному каталозі" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "вибачте, вам не дозволено встановлювати час очікування на виконання команди" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "вибачте, вам не дозволено зберігати середовище" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "надто довга команда" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s не є звичайним файлом" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s належить uid %u, має належати %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "Запис до «%s» можливий для довільного користувача" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s належить gid %u, має належати %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "використовувати «-c %s» може лише root" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "невідомий клас входу: %s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "не вдалося визначити адресу вузла %s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "некоректний параметр фільтрування: %s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "некоректне значення макс. очікування: %s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "некоректний коефіцієнт швидкості: %s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/розклад за часом: %s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/timing: %s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Відтворення сеансу sudo: %s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "не вдалося додати подію до черги обробки" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "не вдалося перевести tty у режим без обробки даних" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Попередження: розміри вашого термінала є замалими для належного показу журналу.\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Встановлено формат журналу %d x %d, тоді як формат термінала — %d x %d." + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Відтворення завершено, натисніть будь-яку клавішу, щоб повернутися до термінала." + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "некоректний рядок у файлі timing: %s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "неоднозначний вираз «%s»" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "зайва дужка, «)», у виразі" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "невідомий ключ пошуку «%s»" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s потребує визначення аргументу" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "некоректний формальний вираз: %s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "не вдалося обробити дату «%s»" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "зайва дужка, «(», у виразі" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "помилкове завершальне «or»" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "помилкове завершальне «!»" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "невідомий тип пошуку %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "користування: %s [-hnRS] [-d каталог] [-m число] [-s число] ідентифікатор\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "використання: %s [-h] [-d каталог] -l [вираз для пошуку]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s — відтворення журналів сеансів sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Параметри:\n" +" -d, --directory=каталог вказати каталог для журналів сеансу\n" +" -f, --filter=фільтр вказати, який тип вводу-виводу слід показувати\n" +" -h, --help показати довідкове повідомлення і завершити роботу\n" +" -l, --list показати список можливих ідентифікаторів сеансів, відповідних до виразу\n" +" -m, --max-wait=макс_очік максимальний час (у секундах) очікування між подіями\n" +" -n, --non-interactive на надсилати запитів, сеанс роботи буде надіслано до стандартного виведення\n" +" -R, --no-resize не намагатися змінити розміри термінала\n" +" -S, --suspend-wait очікувати, доки виконання команди призупинено\n" +" -s, --speed=коеф_швидк коефіцієнт прискорення або сповільнення виводу даних\n" +" -V, --version показати дані щодо версії і завершити роботу" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\tвідповідника вузла не знайдено" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Команду дозволено" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Команду заборонено" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Не знайдено відповідника команди" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s доступний до запису учасниками групи" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "не вдалося обрізати файл часової позначки до %lld байтів" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "не вдалося прочитати час на годиннику" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "ігноруємо часову позначку з майбутнього" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "занадто далека часова позначка у майбутньому: %20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "не вдалося заблокувати файл часової позначки %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "шлях до даних щодо стану отримання настанов є занадто довгим: %s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "параметр -x буде вилучено у наступному випуску" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "будь ласка, скористайтеся замість нього програмою cvtsudoers" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "натисніть Enter для редагування %s: " + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "вказаного редактора (%s) не існує" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "не знайдено жодного редактора (шлях до редактора = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "помилка запису" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "не вдалося обробити stat файл тимчасових даних (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "файл тимчасових даних має нульовий об’єм (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "помилка редактора (%s), %s не змінено" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s не змінено" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "не вдалося повторно відкрити файл тимчасових даних (%s), %s не змінено." + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "не вдалося обробити файл тимчасових даних (%s), невідома помилка" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "внутрішня помилка, не вдалося знайти %s у списку!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "не вдалося встановити (uid, gid) %s у значення (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s і %s не перебувають у одній файловій системі, використовуємо mv для перейменування" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "помилка команди: «%s %s %s», %s не змінено" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "помилка перейменування %s, %s не змінено" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "А зараз що? " + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Параметри:\n" +" (e) — повторне редагування файла sudoers\n" +" (x) — вийти без внесення змін до файла sudoers\n" +" (Q) — вийти зі збереженням файла sudoers (НЕБЕЗПЕЧНО!)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "не вдалося виконати %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: помилковий власник (uid, gid), має бути (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: помилкові права доступу, режим доступу має бути 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: вдала обробка\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s зайнято, повторіть спробу пізніше" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "не вдалося заблокувати %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "Редагувати попри усе? [y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Помилка: %s:%d цикл у %s «%s»" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Попередження: %s:%d цикл у %s «%s»" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Помилка: виявлено посилання %s:%d %s «%s», яке не визначено" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Попередження: виявлено посилання %s:%d %s «%s», яке не визначено" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Попердження: %s:%d не використано %s «%s»" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s — безпечне редагування файла sudoers\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Параметри:\n" +" -c, --check режим лише перевірки\n" +" -f, --file=файл вказати розташування файла sudoers\n" +" -h, --help показати довідкове повідомлення і завершити роботу\n" +" -q, --quiet стислі повідомлення щодо синтаксичних помилок\n" +" -s, --strict строга перевірка синтаксису\n" +" -V, --version показати дані щодо версії і завершити роботу\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "занадто високий рівень вкладеності" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "ігноруємо некоректне значення атрибута: %s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "не вдалося кешувати користувача %s, не вистачає пам’яті" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "не вдалося кешувати групу %s, не вистачає пам’яті" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "не вдалося кешувати список груп %s, не вистачає пам’яті" diff --git a/utsudo-0.0.2/plugins/sudoers/po/utsudoers.pot b/utsudo-0.0.2/plugins/sudoers/po/utsudoers.pot new file mode 100644 index 0000000..859d4cd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/utsudoers.pot @@ -0,0 +1,2318 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# Todd C. Miller , 2011-2018 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: utsudo 0.0.2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "" + +#: confstr.sh:4 +msgid "Password: " +msgstr "" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "" + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 gram.y:288 +#: gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 gram.y:403 gram.y:412 +#: gram.y:423 gram.y:456 gram.y:463 gram.y:470 gram.y:477 gram.y:559 gram.y:566 +#: gram.y:575 gram.y:584 gram.y:601 gram.y:713 gram.y:720 gram.y:727 gram.y:735 +#: gram.y:835 gram.y:842 gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 +#: gram.y:903 gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:371 +msgid "" +"Account expired or PAM config lacks an \"account\" section for sudo, contact " +"your system administrator" +msgstr "" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "" +"Invalid authentication methods compiled into sudo! You may not mix " +"standalone and non-standalone authentication." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "" +"There are no authentication methods compiled into sudo! If you want to turn " +"off authentication, use the --disable-authentication configure option." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "" + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "" +"the SUDOERS_BASE environment variable is not set and the -b option was not " +"specified." +msgstr "" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "" + +#: plugins/sudoers/def_data.c:330 +msgid "" +"Use faster globbing that is less accurate but does not access the filesystem" +msgstr "" + +#: plugins/sudoers/def_data.c:334 +msgid "" +"The umask specified in sudoers will override the user's, even if it is more " +"permissive" +msgstr "" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "" + +#: plugins/sudoers/def_data.c:414 +msgid "" +"Check parent directories for writability when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "" +"Log entries larger than this value will be split into multiple syslog " +"messages: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:466 +msgid "" +"Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "" +"sorry, you are not allowed to set the following environment variables: %s" +msgstr "" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "" + +#: plugins/sudoers/ldap.c:1656 +msgid "" +"start_tls specified but LDAP libs do not support ldap_start_tls_s() or " +"ldap_start_tls_s_np()" +msgstr "" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "" +msgstr[1] "" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr "" + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr "" + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr "" + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr "" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "" + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional " +"expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "" + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "" diff --git a/utsudo-0.0.2/plugins/sudoers/po/vi.mo b/utsudo-0.0.2/plugins/sudoers/po/vi.mo new file mode 100644 index 0000000000000000000000000000000000000000..b0901abffbd0bedf4e39976affdd2a10f5ab976e GIT binary patch literal 54696 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 olwNH!k3*QipMl7FxEys8d=|jp=JPDRk, 2012-2014, 2015, 2016, 2017, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-01 14:10+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Language-Team-Website: \n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Gtranslator 2.91.7\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "lỗi cú pháp" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "Mật khẩu của %p: " + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] mật khẩu dành cho %p: " + +#: confstr.sh:4 +msgid "Password: " +msgstr "Mật khẩu: " + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** Thông tin AN NINH cho %h ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "Rất tiếc, hãy thử lại." + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:308 gram.y:315 gram.y:322 gram.y:329 gram.y:336 +#: gram.y:399 gram.y:407 gram.y:417 gram.y:450 gram.y:457 gram.y:464 +#: gram.y:471 gram.y:553 gram.y:560 gram.y:569 gram.y:578 gram.y:595 +#: gram.y:707 gram.y:714 gram.y:721 gram.y:729 gram.y:829 gram.y:836 +#: gram.y:843 gram.y:850 gram.y:857 gram.y:883 gram.y:890 gram.y:897 +#: gram.y:1020 gram.y:1294 plugins/sudoers/alias.c:130 +#: plugins/sudoers/alias.c:137 plugins/sudoers/alias.c:153 +#: plugins/sudoers/auth/bsdauth.c:146 plugins/sudoers/auth/kerb5.c:121 +#: plugins/sudoers/auth/kerb5.c:147 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/auth/sia.c:62 +#: plugins/sudoers/cvtsudoers.c:123 plugins/sudoers/cvtsudoers.c:164 +#: plugins/sudoers/cvtsudoers.c:181 plugins/sudoers/cvtsudoers.c:192 +#: plugins/sudoers/cvtsudoers.c:304 plugins/sudoers/cvtsudoers.c:432 +#: plugins/sudoers/cvtsudoers.c:565 plugins/sudoers/cvtsudoers.c:582 +#: plugins/sudoers/cvtsudoers.c:645 plugins/sudoers/cvtsudoers.c:760 +#: plugins/sudoers/cvtsudoers.c:768 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_ldif.c:152 plugins/sudoers/cvtsudoers_ldif.c:195 +#: plugins/sudoers/cvtsudoers_ldif.c:242 plugins/sudoers/cvtsudoers_ldif.c:261 +#: plugins/sudoers/cvtsudoers_ldif.c:332 plugins/sudoers/cvtsudoers_ldif.c:387 +#: plugins/sudoers/cvtsudoers_ldif.c:395 plugins/sudoers/cvtsudoers_ldif.c:412 +#: plugins/sudoers/cvtsudoers_ldif.c:421 plugins/sudoers/cvtsudoers_ldif.c:568 +#: plugins/sudoers/defaults.c:661 plugins/sudoers/defaults.c:954 +#: plugins/sudoers/defaults.c:1125 plugins/sudoers/editor.c:70 +#: plugins/sudoers/editor.c:88 plugins/sudoers/editor.c:99 +#: plugins/sudoers/env.c:247 plugins/sudoers/filedigest.c:64 +#: plugins/sudoers/filedigest.c:80 plugins/sudoers/gc.c:57 +#: plugins/sudoers/group_plugin.c:136 plugins/sudoers/interfaces.c:76 +#: plugins/sudoers/iolog.c:939 plugins/sudoers/iolog_path.c:172 +#: plugins/sudoers/iolog_util.c:83 plugins/sudoers/iolog_util.c:122 +#: plugins/sudoers/iolog_util.c:131 plugins/sudoers/iolog_util.c:141 +#: plugins/sudoers/iolog_util.c:149 plugins/sudoers/iolog_util.c:153 +#: plugins/sudoers/ldap.c:183 plugins/sudoers/ldap.c:414 +#: plugins/sudoers/ldap.c:418 plugins/sudoers/ldap.c:430 +#: plugins/sudoers/ldap.c:721 plugins/sudoers/ldap.c:885 +#: plugins/sudoers/ldap.c:1233 plugins/sudoers/ldap.c:1660 +#: plugins/sudoers/ldap.c:1697 plugins/sudoers/ldap.c:1778 +#: plugins/sudoers/ldap.c:1913 plugins/sudoers/ldap.c:2014 +#: plugins/sudoers/ldap.c:2030 plugins/sudoers/ldap_conf.c:221 +#: plugins/sudoers/ldap_conf.c:252 plugins/sudoers/ldap_conf.c:304 +#: plugins/sudoers/ldap_conf.c:340 plugins/sudoers/ldap_conf.c:443 +#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:555 +#: plugins/sudoers/ldap_conf.c:588 plugins/sudoers/ldap_conf.c:680 +#: plugins/sudoers/ldap_conf.c:762 plugins/sudoers/ldap_util.c:508 +#: plugins/sudoers/ldap_util.c:564 plugins/sudoers/linux_audit.c:81 +#: plugins/sudoers/logging.c:195 plugins/sudoers/logging.c:511 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:573 +#: plugins/sudoers/logging.c:752 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:725 plugins/sudoers/match.c:772 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1009 +#: plugins/sudoers/parse.c:195 plugins/sudoers/parse.c:207 +#: plugins/sudoers/parse.c:222 plugins/sudoers/parse.c:234 +#: plugins/sudoers/parse_ldif.c:141 plugins/sudoers/parse_ldif.c:168 +#: plugins/sudoers/parse_ldif.c:237 plugins/sudoers/parse_ldif.c:244 +#: plugins/sudoers/parse_ldif.c:249 plugins/sudoers/parse_ldif.c:325 +#: plugins/sudoers/parse_ldif.c:336 plugins/sudoers/parse_ldif.c:342 +#: plugins/sudoers/parse_ldif.c:367 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:383 plugins/sudoers/parse_ldif.c:397 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:619 plugins/sudoers/parse_ldif.c:679 +#: plugins/sudoers/parse_ldif.c:698 plugins/sudoers/parse_ldif.c:744 +#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/policy.c:502 +#: plugins/sudoers/policy.c:744 plugins/sudoers/prompt.c:98 +#: plugins/sudoers/pwutil.c:197 plugins/sudoers/pwutil.c:269 +#: plugins/sudoers/pwutil.c:346 plugins/sudoers/pwutil.c:520 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:656 +#: plugins/sudoers/pwutil.c:814 plugins/sudoers/pwutil.c:871 +#: plugins/sudoers/pwutil.c:916 plugins/sudoers/pwutil.c:974 +#: plugins/sudoers/sssd.c:152 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:112 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +msgid "unable to allocate memory" +msgstr "không thể cấp phát bộ nhớ" + +#: gram.y:482 +msgid "a digest requires a path name" +msgstr "tóm lược yêu cầu một đối số là tên đường dẫn" + +#: gram.y:608 +msgid "invalid notbefore value" +msgstr "giá trị notbefore không hợp lệ" + +#: gram.y:616 +msgid "invalid notafter value" +msgstr "giá trị notafter không hợp lệ" + +#: gram.y:625 plugins/sudoers/policy.c:318 +msgid "timeout value too large" +msgstr "giá trị timeout quá lớn" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "invalid timeout value" +msgstr "giá trị timeout không hợp lệ" + +#: gram.y:1294 plugins/sudoers/auth/pam.c:354 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/cvtsudoers.c:123 +#: plugins/sudoers/cvtsudoers.c:163 plugins/sudoers/cvtsudoers.c:180 +#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:303 +#: plugins/sudoers/cvtsudoers.c:431 plugins/sudoers/cvtsudoers.c:564 +#: plugins/sudoers/cvtsudoers.c:581 plugins/sudoers/cvtsudoers.c:645 +#: plugins/sudoers/cvtsudoers.c:760 plugins/sudoers/cvtsudoers.c:767 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:241 +#: plugins/sudoers/cvtsudoers_ldif.c:260 plugins/sudoers/cvtsudoers_ldif.c:331 +#: plugins/sudoers/cvtsudoers_ldif.c:386 plugins/sudoers/cvtsudoers_ldif.c:394 +#: plugins/sudoers/cvtsudoers_ldif.c:411 plugins/sudoers/cvtsudoers_ldif.c:420 +#: plugins/sudoers/cvtsudoers_ldif.c:567 plugins/sudoers/defaults.c:661 +#: plugins/sudoers/defaults.c:954 plugins/sudoers/defaults.c:1125 +#: plugins/sudoers/editor.c:70 plugins/sudoers/editor.c:88 +#: plugins/sudoers/editor.c:99 plugins/sudoers/env.c:247 +#: plugins/sudoers/filedigest.c:64 plugins/sudoers/filedigest.c:80 +#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:136 +#: plugins/sudoers/interfaces.c:76 plugins/sudoers/iolog.c:939 +#: plugins/sudoers/iolog_path.c:172 plugins/sudoers/iolog_util.c:83 +#: plugins/sudoers/iolog_util.c:122 plugins/sudoers/iolog_util.c:131 +#: plugins/sudoers/iolog_util.c:141 plugins/sudoers/iolog_util.c:149 +#: plugins/sudoers/iolog_util.c:153 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:414 plugins/sudoers/ldap.c:418 +#: plugins/sudoers/ldap.c:430 plugins/sudoers/ldap.c:721 +#: plugins/sudoers/ldap.c:885 plugins/sudoers/ldap.c:1233 +#: plugins/sudoers/ldap.c:1660 plugins/sudoers/ldap.c:1697 +#: plugins/sudoers/ldap.c:1778 plugins/sudoers/ldap.c:1913 +#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2030 +#: plugins/sudoers/ldap_conf.c:221 plugins/sudoers/ldap_conf.c:252 +#: plugins/sudoers/ldap_conf.c:304 plugins/sudoers/ldap_conf.c:340 +#: plugins/sudoers/ldap_conf.c:443 plugins/sudoers/ldap_conf.c:458 +#: plugins/sudoers/ldap_conf.c:555 plugins/sudoers/ldap_conf.c:588 +#: plugins/sudoers/ldap_conf.c:679 plugins/sudoers/ldap_conf.c:762 +#: plugins/sudoers/ldap_util.c:508 plugins/sudoers/ldap_util.c:564 +#: plugins/sudoers/linux_audit.c:81 plugins/sudoers/logging.c:195 +#: plugins/sudoers/logging.c:511 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:572 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:724 plugins/sudoers/match.c:771 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1008 +#: plugins/sudoers/parse.c:194 plugins/sudoers/parse.c:206 +#: plugins/sudoers/parse.c:221 plugins/sudoers/parse.c:233 +#: plugins/sudoers/parse_ldif.c:140 plugins/sudoers/parse_ldif.c:167 +#: plugins/sudoers/parse_ldif.c:236 plugins/sudoers/parse_ldif.c:243 +#: plugins/sudoers/parse_ldif.c:248 plugins/sudoers/parse_ldif.c:324 +#: plugins/sudoers/parse_ldif.c:335 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:366 plugins/sudoers/parse_ldif.c:378 +#: plugins/sudoers/parse_ldif.c:382 plugins/sudoers/parse_ldif.c:396 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:593 +#: plugins/sudoers/parse_ldif.c:618 plugins/sudoers/parse_ldif.c:678 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:743 +#: plugins/sudoers/parse_ldif.c:753 plugins/sudoers/policy.c:132 +#: plugins/sudoers/policy.c:141 plugins/sudoers/policy.c:150 +#: plugins/sudoers/policy.c:176 plugins/sudoers/policy.c:303 +#: plugins/sudoers/policy.c:318 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:356 +#: plugins/sudoers/policy.c:400 plugins/sudoers/policy.c:410 +#: plugins/sudoers/policy.c:419 plugins/sudoers/policy.c:428 +#: plugins/sudoers/policy.c:502 plugins/sudoers/policy.c:744 +#: plugins/sudoers/prompt.c:98 plugins/sudoers/pwutil.c:197 +#: plugins/sudoers/pwutil.c:269 plugins/sudoers/pwutil.c:346 +#: plugins/sudoers/pwutil.c:520 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:656 plugins/sudoers/pwutil.c:814 +#: plugins/sudoers/pwutil.c:871 plugins/sudoers/pwutil.c:916 +#: plugins/sudoers/pwutil.c:974 plugins/sudoers/set_perms.c:392 +#: plugins/sudoers/set_perms.c:771 plugins/sudoers/set_perms.c:1155 +#: plugins/sudoers/set_perms.c:1481 plugins/sudoers/set_perms.c:1646 +#: plugins/sudoers/sssd.c:151 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:111 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "Bí danh “%s” đã được định nghĩa rồi" + +#: plugins/sudoers/auth/bsdauth.c:73 +#, c-format +msgid "unable to get login class for user %s" +msgstr "không thể lấy lớp đăng nhập cho tài khoản %s" + +#: plugins/sudoers/auth/bsdauth.c:78 +msgid "unable to begin bsd authentication" +msgstr "không thể khởi chạy xác thực kiểu bsd" + +#: plugins/sudoers/auth/bsdauth.c:86 +msgid "invalid authentication type" +msgstr "kiểu xác thực không hợp lệ" + +#: plugins/sudoers/auth/bsdauth.c:95 +msgid "unable to initialize BSD authentication" +msgstr "không thể khởi tạo xác thực kiểu BSD" + +#: plugins/sudoers/auth/bsdauth.c:183 +msgid "your account has expired" +msgstr "tài khoản bạn đã hết hiệu lực" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "approval failed" +msgstr "gặp lỗi khi chấp thuận" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to read fwtk config" +msgstr "không thể đọc cấu hình fwtk" + +#: plugins/sudoers/auth/fwtk.c:62 +msgid "unable to connect to authentication server" +msgstr "không thể kết nối tới máy chủ xác thực" + +#: plugins/sudoers/auth/fwtk.c:68 plugins/sudoers/auth/fwtk.c:92 +#: plugins/sudoers/auth/fwtk.c:124 +msgid "lost connection to authentication server" +msgstr "mất kết nối đến máy phục vụ xác thực" + +#: plugins/sudoers/auth/fwtk.c:72 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"lỗi máy phục vụ xác thực:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:113 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s: không thể chuyển đổi người ủy nhiệm sang chuỗi (“%s”): %s" + +#: plugins/sudoers/auth/kerb5.c:163 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s: không thể phân tích “%s”: %s" + +#: plugins/sudoers/auth/kerb5.c:172 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s: không thể phân giải bộ nhớ đệm “credential”: %s" + +#: plugins/sudoers/auth/kerb5.c:219 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s: không thể phân bổ các tùy chọn: %s" + +#: plugins/sudoers/auth/kerb5.c:234 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s: không thể lấy giấy ủy nhiệm: %s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s: không thể khởi tạo bộ nhớ đệm “credential”: %s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s: không thể cất giữ “credential” trong bộ nhớ tạm: %s" + +#: plugins/sudoers/auth/kerb5.c:314 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s: không thể lấy tên máy chủ chính: %s" + +#: plugins/sudoers/auth/kerb5.c:328 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s: Không thể thẩm tra TGT! Gần như chắc chắn là bị tấn công!: %s" + +#: plugins/sudoers/auth/pam.c:113 +msgid "unable to initialize PAM" +msgstr "không thể khởi tạo PAM" + +#: plugins/sudoers/auth/pam.c:204 +#, c-format +msgid "PAM authentication error: %s" +msgstr "lỗi xác thực PAM: %s" + +#: plugins/sudoers/auth/pam.c:221 +msgid "account validation failure, is your account locked?" +msgstr "xác thực tài khoản gặp lỗi nghiêm trọng, có phải tài khoản của bạn đã bị khóa?" + +#: plugins/sudoers/auth/pam.c:229 +msgid "Account or password is expired, reset your password and try again" +msgstr "Mật khẩu hay tài khoản đã hết hạn sử dụng, hãy đặt lại mật khẩu của bạn và thử lại" + +#: plugins/sudoers/auth/pam.c:238 +#, c-format +msgid "unable to change expired password: %s" +msgstr "không thể thay đổi mật khẩu đã hết hạn: %s" + +#: plugins/sudoers/auth/pam.c:246 +msgid "Password expired, contact your system administrator" +msgstr "Mật khẩu đã hết hạn dùng, hãy liên lạc với người quản trị hệ thống của bạn" + +#: plugins/sudoers/auth/pam.c:250 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "Tài khoản hết hạn hoặc cấu hình PAM không có phiên “tài khoản” cho sudo, hãy liên hệ với người quản trị hệ thống của bạn" + +#: plugins/sudoers/auth/pam.c:257 plugins/sudoers/auth/pam.c:262 +#, c-format +msgid "PAM account management error: %s" +msgstr "lỗi quản lý tài khoảnthực PAM: %s" + +#: plugins/sudoers/auth/rfc1938.c:102 plugins/sudoers/visudo.c:232 +#, c-format +msgid "you do not exist in the %s database" +msgstr "bạn không tồn tại trong cơ sở dữ liệu %s" + +#: plugins/sudoers/auth/securid5.c:75 +msgid "failed to initialise the ACE API library" +msgstr "gặp lỗi khi khởi tạo thư viện “ACE API”" + +#: plugins/sudoers/auth/securid5.c:101 +msgid "unable to contact the SecurID server" +msgstr "không thể liên lạc được với máy chủ SecurID" + +#: plugins/sudoers/auth/securid5.c:110 +msgid "User ID locked for SecurID Authentication" +msgstr "ID người dùng bị khóa với “SecurID Authentication”" + +#: plugins/sudoers/auth/securid5.c:114 plugins/sudoers/auth/securid5.c:165 +msgid "invalid username length for SecurID" +msgstr "sai chiều dài tên tài khoản cho SecurID" + +#: plugins/sudoers/auth/securid5.c:118 plugins/sudoers/auth/securid5.c:170 +msgid "invalid Authentication Handle for SecurID" +msgstr "sai Bộ Tiếp Hợp Xác Thực cho SecurID" + +#: plugins/sudoers/auth/securid5.c:122 +msgid "SecurID communication failed" +msgstr "Truyền thông với SecurID gặp lỗi" + +#: plugins/sudoers/auth/securid5.c:126 plugins/sudoers/auth/securid5.c:215 +msgid "unknown SecurID error" +msgstr "không hiểu lỗi SecurID" + +#: plugins/sudoers/auth/securid5.c:160 +msgid "invalid passcode length for SecurID" +msgstr "sai chiều dài passcode cho SecurID" + +#: plugins/sudoers/auth/sia.c:72 plugins/sudoers/auth/sia.c:127 +msgid "unable to initialize SIA session" +msgstr "không thể khởi tạo phiên SIA" + +#: plugins/sudoers/auth/sudo_auth.c:136 +msgid "invalid authentication methods" +msgstr "Phương thức xác thực không hợp lệ" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "Phương thức xác thực không hợp lệ được biên dịch vào trong sudo! Bạn không thể pha trộn kiểu xác thực giữa standalone và non-standalone" + +#: plugins/sudoers/auth/sudo_auth.c:259 plugins/sudoers/auth/sudo_auth.c:309 +msgid "no authentication methods" +msgstr "chưa có phương thức xác thực" + +#: plugins/sudoers/auth/sudo_auth.c:261 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "Ở đây không có phương thức xác thực nào được dịch vào trong sudo! Nếu bạn muốn tắt xác thực, sử dụng tùy chọn cấu hình --disable-authentication" + +#: plugins/sudoers/auth/sudo_auth.c:311 +msgid "Unable to initialize authentication methods." +msgstr "Không thể khởi tạo phương thức xác thực." + +#: plugins/sudoers/auth/sudo_auth.c:477 +msgid "Authentication methods:" +msgstr "Phương thức xác thực:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:215 +msgid "Could not determine audit condition" +msgstr "Không thể phân giải điều kiện audit" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:279 +msgid "unable to commit audit record" +msgstr "không thể chuyển giao bản ghi “audit”" + +#: plugins/sudoers/check.c:267 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"Chúng tôi tin rằng bạn đã nhận được bài giảng từ Quản trị Hệ thống\n" +"nội bộ. Có thể tóm lược chúng lại thành một số điểm quan trọng sau:\n" +"\n" +" #1) Tôn trọng sự riêng tư của người khác.\n" +" #2) Nghĩ trước khi gõ một lệnh.\n" +" #3) Quyền lực lớn đi kèm với trách nhiệm lớn.\n" +"\n" + +#: plugins/sudoers/check.c:310 plugins/sudoers/check.c:320 +#: plugins/sudoers/sudoers.c:696 plugins/sudoers/sudoers.c:741 +#: plugins/sudoers/tsdump.c:124 +#, c-format +msgid "unknown uid: %u" +msgstr "không biết mã số người dùng: %u" + +#: plugins/sudoers/check.c:315 plugins/sudoers/iolog.c:253 +#: plugins/sudoers/policy.c:915 plugins/sudoers/sudoers.c:1136 +#: plugins/sudoers/testsudoers.c:225 plugins/sudoers/testsudoers.c:398 +#, c-format +msgid "unknown user: %s" +msgstr "không biết người dùng: %s" + +#: plugins/sudoers/cvtsudoers.c:198 +#, c-format +msgid "order increment: %s: %s" +msgstr "gia tăng thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:214 +#, c-format +msgid "starting order: %s: %s" +msgstr "bắt đầu thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:224 +#, c-format +msgid "order padding: %s: %s" +msgstr "đệm thứ tự: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:232 plugins/sudoers/sudoreplay.c:287 +#: plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s version %s\n" +msgstr "%s phiên bản %s\n" + +#: plugins/sudoers/cvtsudoers.c:234 plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s grammar version %d\n" +msgstr "Ngữ pháp %s phiên bản %d\n" + +#: plugins/sudoers/cvtsudoers.c:251 plugins/sudoers/testsudoers.c:173 +#, c-format +msgid "unsupported input format %s" +msgstr "không hỗ trợ định dạng đầu vào %s" + +#: plugins/sudoers/cvtsudoers.c:266 +#, c-format +msgid "unsupported output format %s" +msgstr "không hỗ trợ định dạng đầu ra %s" + +#: plugins/sudoers/cvtsudoers.c:318 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s: các tập tin đầu vào và đầu ra phải khác nhau" + +#: plugins/sudoers/cvtsudoers.c:334 plugins/sudoers/sudoers.c:172 +#: plugins/sudoers/testsudoers.c:264 plugins/sudoers/visudo.c:238 +#: plugins/sudoers/visudo.c:594 plugins/sudoers/visudo.c:917 +msgid "unable to initialize sudoers default values" +msgstr "không thể khởi giá trị mặc định sudoers" + +#: plugins/sudoers/cvtsudoers.c:420 plugins/sudoers/ldap_conf.c:433 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:479 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s: không biết từ khóa: %s" + +#: plugins/sudoers/cvtsudoers.c:525 +#, c-format +msgid "invalid defaults type: %s" +msgstr "kiểu mặc định không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:548 +#, c-format +msgid "invalid suppression type: %s" +msgstr "kiểu biểu thức không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:588 plugins/sudoers/cvtsudoers.c:602 +#, c-format +msgid "invalid filter: %s" +msgstr "bộ lọc không hợp lệ: %s" + +#: plugins/sudoers/cvtsudoers.c:621 plugins/sudoers/cvtsudoers.c:638 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:1128 +#: plugins/sudoers/cvtsudoers_ldif.c:641 plugins/sudoers/iolog.c:411 +#: plugins/sudoers/iolog_util.c:72 plugins/sudoers/sudoers.c:903 +#: plugins/sudoers/sudoreplay.c:333 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/timestamp.c:446 plugins/sudoers/tsdump.c:133 +#: plugins/sudoers/visudo.c:913 +#, c-format +msgid "unable to open %s" +msgstr "không thể mở “%s”" + +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/visudo.c:922 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "gặp lỗi khi phân tích tập tin %s, không rõ bị lỗi gì" + +#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:939 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "lỗi cú pháp trong %s gần dòng %d\n" + +#: plugins/sudoers/cvtsudoers.c:652 plugins/sudoers/visudo.c:942 +#, c-format +msgid "parse error in %s\n" +msgstr "lỗi cú pháp trong %s\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/iolog.c:498 +#: plugins/sudoers/sudoreplay.c:1129 plugins/sudoers/timestamp.c:330 +#: plugins/sudoers/timestamp.c:333 +#, c-format +msgid "unable to write to %s" +msgstr "không thể ghi vào %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "%s - chuyển đổi giữa các định dạng các tập tin sudoers\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Options:\n" +" -b, --base=dn DN cơ sở cho sudo truy vấn LDAP\n" +" -d, --defaults=deftypes chỉ chuyển đổi mặc định của kiểu đã cho\n" +" -e, --expand-aliases khai triển bí danh khi chuyển đổi\n" +" -f, --output-format=format đặt định dạng đầu ra: JSON, LDIF hay sudoers\n" +" -i, --input-format=format đặt định dạng đầu vào: LDIF hoặc sudoers\n" +" -I, --increment=số tổng gia tăng cho từng sudoOrder\n" +" -h, --help hiển thị trợ giúp rồi thoát\n" +" -m, --match=filter chỉ chuyển đổi những hạng mục khớp bộ lọc\n" +" -M, --match-local khớp lọc sử dụng cơ sở dữ liệu passwd và group người dùng\n" +" -o, --output=tập_tin_đầu_ra ghi sudoers đã chuyển đổi sang tập_tin_đầu_ra\n" +" -O, --order-start=số điểm đầu cho sudoOrder đầu tiên\n" +" -p, --prune-matches cắt bỏ những người dùng, nhóm và máy không khớp mẫu\n" +" -P, --padding=số đệm cơ sở cho gia tăng sudoOrder\n" +" -s, --suppress=sections chặn xuất cho từng phần cụ thể\n" +" -V, --version hiển thị phiên bản rồi thoát" + +#: plugins/sudoers/cvtsudoers_json.c:682 plugins/sudoers/cvtsudoers_json.c:718 +#: plugins/sudoers/cvtsudoers_json.c:936 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/cvtsudoers_json.c:856 plugins/sudoers/cvtsudoers_json.c:871 +#: plugins/sudoers/cvtsudoers_ldif.c:306 plugins/sudoers/cvtsudoers_ldif.c:317 +#: plugins/sudoers/ldap.c:480 +msgid "unable to get GMT time" +msgstr "không thể lấy giờ quốc tế (GMT)" + +#: plugins/sudoers/cvtsudoers_json.c:859 plugins/sudoers/cvtsudoers_json.c:874 +#: plugins/sudoers/cvtsudoers_ldif.c:309 plugins/sudoers/cvtsudoers_ldif.c:320 +#: plugins/sudoers/ldap.c:486 +msgid "unable to format timestamp" +msgstr "không thể định dạng dấu-vết-thời-gian" + +#: plugins/sudoers/cvtsudoers_ldif.c:524 plugins/sudoers/env.c:309 +#: plugins/sudoers/env.c:316 plugins/sudoers/env.c:421 +#: plugins/sudoers/ldap.c:494 plugins/sudoers/ldap.c:725 +#: plugins/sudoers/ldap.c:1052 plugins/sudoers/ldap_conf.c:225 +#: plugins/sudoers/ldap_conf.c:315 plugins/sudoers/linux_audit.c:87 +#: plugins/sudoers/logging.c:1015 plugins/sudoers/policy.c:623 +#: plugins/sudoers/policy.c:633 plugins/sudoers/prompt.c:166 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:255 +#: plugins/sudoers/toke_util.c:159 +#, c-format +msgid "internal error, %s overflow" +msgstr "lỗi nội bộ, %s bị tràn" + +#: plugins/sudoers/cvtsudoers_ldif.c:593 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "Quá nhiều mục tin sudoers, tối đa là %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:636 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "biến môi trường SUDOERS_BASE chưa được đặt và tùy chọn chưa được đưa ra." + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "Trang bị Syslog nếu syslog được sử dụng cho việc ghi nhật ký: %s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "Mức ưu tiên Syslog sẽ sử dụng khi người dùng đăng nhập thành công: %s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "Mức ưu tiên Syslog sẽ sử dụng khi người dùng đăng nhập không thành công: %s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "Đặt nhắc OTP (mật khẩu dùng một lần) tại dòng nó sở hữu" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "Bỏ qua “.” trong biến $PATH" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "Luôn gửi thư mỗi khi chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "Gửi thư nếu xác thực người dùng gặp lỗi" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "Gửi thư nếu người dùng không ở trong sudoers" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "Gửi thư nếu người dùng không có trong sudoers cho máy chủ này" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "Gửi thư nếu người dùng không được phép chạy lệnh nào đó" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "Gửi thư nếu người cố chạy lệnh nào đó" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "Sử dụng dấu vết thời gian riêng rẽ cho từng cặp tkhoản/tty" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "Hướng dẫn người dùng lần đầu tiên họ chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "TẬP-TIN chứa thuyết trình về “sudo”: %s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "Yêu cầu người dùng chứng thực theo mặc định" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Siêu người dùng (root) có thể chạy lệnh sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "Ghi nhật ký tên-máy-chủ vào tập tin nhật ký (không dùng syslog)" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "Ghi nhật ký năm vào tập tin nhật ký (không dùng syslog)" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "Nếu lệnh sudo được triệu gọi mà không đưa ra tham số thì khởi chạy hệ vỏ" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "Đặt biến $HOME cho người dùng đích khi sử dụng hệ vỏ (shell) với tùy chọn -s" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "Luôn đặt biến $HOME cho thư mục cá nhân của người dùng đích" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "Cho phép một số thông tin được thu thập để đưa ra các thông tin về lỗi hữu dụng" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "Yêu cầu tên máy chủ dạng đầy đủ trong tập tin sudoers" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "Lăng mạ người dùng khi họ nhập vào mật khẩu sai" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "Chỉ cho phép người dùng chạy lệnh sudo nếu họ có tty" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo sẽ tôn trọng biến môi trường EDITOR" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "Hỏi mật khẩu của siêu người dùng, chứ không phải của người dùng" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "Nhắc mật khẩu của người dùng runas_mặc_định, không phải của người dùng" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "Nhắc mật khẩu của người dùng đích, không phải cái hiện tại" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "Áp dụng mặc định trong lớp đăng nhập người dùng đích nếu ở đây có một" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "Đặt biến môi trường LOGNAME và USER" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "Chỉ đặt uid đang có hiệu lực cho người dùng đích, không sử dụng uid thật" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "Không khởi tạo véc-tơ nhóm cho người dùng đích" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "Độ dài mà tại đó các dòng trong tập tin nhật ký được ngắt dòng (0 là không ngắt dòng): %u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "Thời gian chờ dấu vết thời gian xác thực tối đa: %.1f phút" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "Thời gian chờ nhắc mật khẩu tối đa: %.1f phút" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "Số lần nhập mật khẩu: %u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "Umask để sử dụng hoặc 0777 để sử dụng của người dùng: 0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "Đường dẫn tới tập tin nhật ký: “%s”" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "Đường dẫn tới chương trình gửi thư (mail) %s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "Các cờ dành cho chương trình gửi thư (mail): %s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "Địa chỉ để gửi thư đến: %s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "Địa chỉ dùng để gửi thư từ: %s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "Chủ đề cho thư: %s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "Mật khẩu không đúng: %s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "Đường dẫn đến thư mục trạng thái thuyết trình: %s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "Đường dẫn thư mục dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "Chủ sở hữu đường dẫn thư mục dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "Những tài khoản trong nhóm này được miễn mật khẩu và yêu cầu PATH: %s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "Lời nhắc nhập mật khẩu mặc định: %s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "Nếu được đặt, lời nhắc mật khẩu sẽ đè lên dấu nhắc hệ thống trong mọi trường hợp." + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "Tài khoản mặc định chạy lệnh như là: %s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "Giá trị dùng để ghi đè lên $PATH của người dùng: %s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "Đường dẫn tới trình biên soạn để sử dụng cho lệnh visudo: %s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "Khi được yêu cầu mật khẩu cho “liệt kê” lệnh-giả: %s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "Khi được yêu cầu mật khẩu cho lệnh-giả “verify” (“thẩm tra”): %s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "Tải trước các hàm thi hành giả được chứa trong thư viện sudo_noexec" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "Nếu thư mục LDAP đã bật, chúng tôi sẽ lờ đi tập tin sudoers phải không" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr "Các bộ mô tả tập tin >= %d sẽ bị đóng trước khi chạy một lệnh" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "Nếu được đặt, người dùng có thể ghi đè lên giá trị của “closefrom” bằng tùy chọn -C" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "Cho phép người dùng đặt biến môi trường tùy ý" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "Đặt lại biến môi trường thành giá trị mặc định của chúng" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "Các biến môi trường được kiểm tra xem có đúng mực không:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "Các biến môi trường bị gỡ bỏ:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "Các biến môi trường được giữ lại:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "Vai trò SELinux được dùng trong ngữ cảnh an ninh mới: %s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "Kiểu SELinux được dùng trong ngữ cảnh an ninh mới: %s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "Đường dẫn tới tập tin môi trường đặc-tả-sudo: %s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "Đường dẫn tới tập tin môi trường đặc-tả-sudo-hạn-chế: %s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "Miền địa phương sẽ sử dụng khi phân tích sudoers: %s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "Cho phép sudo hỏi mật khẩu thậm chí ngay cả khi nó đã rõ ràng" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "Cung cấp phản hồi ảo lúc nhắc mật khẩu khi đây là đầu nhập người dùng" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "Sử dụng globbing kiểu nhanh hơn mà nó thì kém chính xác hơn nhưng lại không cần truy cập hệ thống tập tin" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "Giá trị umask được chỉ định trong sudoers sẽ ghi đè lên giá trị này của người dùng, thậm chí nó còn dễ dãi hơn" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "Ghi nhật ký kết xuất từ người dùng cho lệnh đang chạy" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "Ghi lại nhật ký kết xuất của lệnh đang chạy" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "Nén nhật ký V/R sử dụng định dạng zlib" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "Luôn chạy lệnh ở tty-giả" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "Phần bổ sung cho hỗ trợ nhóm không-Unix: %s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "Thư mục mà nó sẽ lưu nhật ký vào/ra: %s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "Tập tin mà nó sẽ lưu nhật ký vào/ra: %s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "Thêm một mục vào tập tin utmp/utmpx khi phân bổ một pty" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "Đặt người dùng trong utmp thành người dùng runasr, không phải người dùng gọi" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "Tập hợp các đặc quyền được phép: %s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "Tập hợp các quyền bị giới hạn: %s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "Chạy các câu lệnh trên một pty trong nền hệ thống" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "Tên dịch vụ PAM được dùng: %s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "Tên dịch vụ PAM được dùng cho các hệ vỏ đăng nhập: %s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "Thử thiết lập ủy nhiệm PAM cho người dùng đích" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "Tạo một phiên PAM mới để lệnh chạy với nó" + +#: plugins/sudoers/def_data.c:402 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "Số lượng nhật ký I/O tối đa: %u" + +#: plugins/sudoers/def_data.c:406 +msgid "Enable sudoers netgroup support" +msgstr "Bật hỗ trợ nhóm-mạng “sudoers”" + +#: plugins/sudoers/def_data.c:410 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "Kiểm tra xem các thư mục cha có ghi được hay không khi sửa các tập tin bằng sudoedit" + +#: plugins/sudoers/def_data.c:414 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "Theo các liên kết mềm khi sửa các tập tin bằng sudoedit" + +#: plugins/sudoers/def_data.c:418 +msgid "Query the group plugin for unknown system groups" +msgstr "Truy vấn các phần bổ sung nhóm cho các nhóm hệ thống chưa biết" + +#: plugins/sudoers/def_data.c:422 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "Khớp nhóm mạng trên cơ sở toàn thể bộ dữ liệu : tài khoản, tên máy và tên miền" + +#: plugins/sudoers/def_data.c:426 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào nhật ký audit" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào nhật ký V/R" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "Cho phép các lệnh có thể chạy ngay cả khi sudo không thể ghi vào tập tin nhật ký" + +#: plugins/sudoers/def_data.c:438 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "Phân giải các nhóm trong sudoers và khớp dựa trên mã số nhóm, không phải là tên" + +#: plugins/sudoers/def_data.c:442 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "Các mục tin của nhật ký lớn hơn giá trị này sẽ được chia thành nhiều chuỗi syslog nhỏ: %u" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "Người mà sẽ sở hữu tập tin nhật ký V/R: %s" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "Nhóm mà sẽ sở hữu tập tin nhật ký V/R: %s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "Chế độ tập tin được dùng cho tập tin nhật ký V/R: 0%o" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "Thực thi các lệnh theo bộ mô tả tập tin thay cho đường dẫn: %s" + +#: plugins/sudoers/def_data.c:462 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "Bỏ qua các mục tin Mặc định chưa biết trong sudoers thay vì đưa ra cảnh báo" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "Thời gian theo giây sau đó thì lệnh sẽ bị chấm dứt: %u" + +#: plugins/sudoers/def_data.c:470 +msgid "Allow the user to specify a timeout on the command line" +msgstr "Cho phép người dùng chỉ định thời gian chờ dòng lệnh tối đa" + +#: plugins/sudoers/def_data.c:474 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "Đẩy dữ liệu nhật ký V/R lên đĩa ngay lập tức thay vì nhớ đệm nó" + +#: plugins/sudoers/def_data.c:478 +msgid "Include the process ID when logging via syslog" +msgstr "Bao gồm mã số tiến trình khi ghi nhật ký thông qua syslog" + +#: plugins/sudoers/def_data.c:482 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "Kiểu của bản ghi dấu vết thời gian xác thực: %s" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Authentication failure message: %s" +msgstr "Thông tin xác thực gặp lỗi nghiêm trọng: %s" + +#: plugins/sudoers/def_data.c:490 +msgid "Ignore case when matching user names" +msgstr "Bỏ qua HOA/thường khi khớp tên người dùng" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching group names" +msgstr "Bỏ qua HOA/thường khi khớp tên nhóm" + +#: plugins/sudoers/defaults.c:229 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/defaults.c:232 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s: không hiểu mục tin mặc định “%s”" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d chưa chỉ ra giá trị cho “%s”" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s: chưa chỉ ra giá trị cho “%s”" + +#: plugins/sudoers/defaults.c:298 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d giá trị cho “%s” phải bắt đầu bằng dấu “/”" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s: giá trị cho “%s” phải bắt đầu bằng dấu “/”" + +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d tùy chọn “%s” không nhận giá trị" + +#: plugins/sudoers/defaults.c:326 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s: tùy chọn “%s” không nhận giá trị" + +#: plugins/sudoers/defaults.c:351 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s:%d kiểu Defaults không hợp lệ 0x%x cho tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:354 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%s: kiểu Defaults không hợp lệ 0x%x cho tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:364 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%s:%d giá trị “%s” là không hợp lệ đối với tùy chọn “%s”" + +#: plugins/sudoers/defaults.c:367 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s: giá trị “%s” là không hợp lệ đối với tùy chọn “%s”" + +#: plugins/sudoers/env.c:390 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv: envp sai hỏng, chiều dài không khớp" + +#: plugins/sudoers/env.c:1111 +msgid "unable to rebuild the environment" +msgstr "không thể xây dựng lại môi trường" + +#: plugins/sudoers/env.c:1185 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "rất tiếc, bạn không được phép đặt các biến môi trường sau đây: %1s" + +#: plugins/sudoers/file.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "lỗi phân tích trong %s gần dòng %d" + +#: plugins/sudoers/file.c:117 +#, c-format +msgid "parse error in %s" +msgstr "gặp lỗi phân tích trong %s" + +#: plugins/sudoers/filedigest.c:59 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "không hỗ trợ kiểu tóm lược %d dành cho %s" + +#: plugins/sudoers/filedigest.c:88 +#, c-format +msgid "%s: read error" +msgstr "%s: lỗi đọc" + +#: plugins/sudoers/group_plugin.c:88 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s phải được sở hữu bởi uid %d" + +#: plugins/sudoers/group_plugin.c:92 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s phải là những thứ chỉ có thể ghi bởi chủ sở hữu" + +#: plugins/sudoers/group_plugin.c:100 plugins/sudoers/sssd.c:561 +#, c-format +msgid "unable to load %s: %s" +msgstr "không thể tải %s: %s" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "không tìm thấy ký hiệu “group_plugin” trong %s" + +#: plugins/sudoers/group_plugin.c:111 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s: phiên bản số lớn phần bổ sung nhóm không tương thích %d, mong đợi %d" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "không thể phân tích địa chỉ IP \"%s\"" + +#: plugins/sudoers/interfaces.c:89 plugins/sudoers/interfaces.c:106 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "không thể phân tích mặt nạ mạng \"%s\"" + +#: plugins/sudoers/interfaces.c:134 +msgid "Local IP address and netmask pairs:\n" +msgstr "Cặp địa chỉ IP và mặt nạ cục bộ:\n" + +#: plugins/sudoers/iolog.c:115 plugins/sudoers/mkdir_parents.c:80 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s có tồn tại nhưng nó không phải là một thư mục (0%o)" + +#: plugins/sudoers/iolog.c:140 plugins/sudoers/iolog.c:180 +#: plugins/sudoers/mkdir_parents.c:69 plugins/sudoers/timestamp.c:210 +#, c-format +msgid "unable to mkdir %s" +msgstr "không thể tạo thư mục “%s”" + +#: plugins/sudoers/iolog.c:184 plugins/sudoers/visudo.c:723 +#: plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "không thể chuyển đổi chế độ của %s thành 0%o" + +#: plugins/sudoers/iolog.c:292 plugins/sudoers/sudoers.c:1167 +#: plugins/sudoers/testsudoers.c:422 +#, c-format +msgid "unknown group: %s" +msgstr "không nhận ra nhóm: %s" + +#: plugins/sudoers/iolog.c:462 plugins/sudoers/sudoers.c:907 +#: plugins/sudoers/sudoreplay.c:840 plugins/sudoers/sudoreplay.c:1536 +#: plugins/sudoers/tsdump.c:143 +#, c-format +msgid "unable to read %s" +msgstr "không thể đọc %s" + +#: plugins/sudoers/iolog.c:577 plugins/sudoers/iolog.c:797 +#, c-format +msgid "unable to create %s" +msgstr "không thể tạo “%s”" + +#: plugins/sudoers/iolog.c:820 plugins/sudoers/iolog.c:1035 +#: plugins/sudoers/iolog.c:1111 plugins/sudoers/iolog.c:1205 +#: plugins/sudoers/iolog.c:1265 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "không thể ghi vào tập tin nhật ký V/R: %s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s: lỗi bên trong, tập tin nhật ký vào ra cho sự kiện %d chưa được mở" + +#: plugins/sudoers/iolog.c:1228 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s: lỗi bên trong, tín hiệu %d không hợp lệ" + +#: plugins/sudoers/iolog_util.c:87 +#, c-format +msgid "%s: invalid log file" +msgstr "%s: tập tin nhật ký không hợp lệ" + +#: plugins/sudoers/iolog_util.c:105 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s: thiếu trường dấu vết thời gian" + +#: plugins/sudoers/iolog_util.c:111 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s: dấu vết thời gian “%s”: %s" + +#: plugins/sudoers/iolog_util.c:118 +#, c-format +msgid "%s: user field is missing" +msgstr "%s: thiếu trường tài khoản người dùng" + +#: plugins/sudoers/iolog_util.c:127 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s: thiếu trường “runas user” (chạy với tư cách tài khoản này)" + +#: plugins/sudoers/iolog_util.c:136 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s: thiếu trường “runas group” (chạy dưới danh nghĩa nhóm này)" + +#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:294 +msgid "starttls not supported when using ldaps" +msgstr "“starttls” chỉ được hỗ trợ khi dùng với “ldaps”" + +#: plugins/sudoers/ldap.c:247 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "không thể khởi tạo chứng nhận SSL và csdl khóa: %s" + +#: plugins/sudoers/ldap.c:250 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "bạn phải đặt TLS_CERT trong %s để sử dụng SSL" + +#: plugins/sudoers/ldap.c:1612 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "không thể khởi tạo LDAP: %s" + +#: plugins/sudoers/ldap.c:1648 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "start_tls được chỉ ra nhưng thư viện LDAP không hỗ trợ ldap_start_tls_s() hoặc ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1785 plugins/sudoers/parse_ldif.c:735 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "thuộc tính sudoOrder không hợp lệ: %s" + +#: plugins/sudoers/ldap_conf.c:203 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports: cổng quá lớn" + +#: plugins/sudoers/ldap_conf.c:263 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "không hỗ trợ kiểu “LDAP uri”: %s" + +#: plugins/sudoers/ldap_conf.c:290 +msgid "unable to mix ldap and ldaps URIs" +msgstr "không thể trộn ldap và ldaps URIs" + +#: plugins/sudoers/ldap_util.c:454 plugins/sudoers/ldap_util.c:456 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "không thể chuyển đổi sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:57 +msgid "unable to open audit system" +msgstr "không thể mở hệ thống audit" + +#: plugins/sudoers/linux_audit.c:98 +msgid "unable to send audit message" +msgstr "không thể gửi thông tin audit" + +#: plugins/sudoers/logging.c:113 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:141 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (lệnh tiếp tục) %s" + +#: plugins/sudoers/logging.c:170 +#, c-format +msgid "unable to open log file: %s" +msgstr "không thể mở tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:178 +#, c-format +msgid "unable to lock log file: %s" +msgstr "không thể khóa tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:211 +#, c-format +msgid "unable to write log file: %s" +msgstr "không thể ghi vào tập tin nhật ký: %s" + +#: plugins/sudoers/logging.c:240 +msgid "No user or host" +msgstr "Không có tài khoản hay tên máy chủ" + +#: plugins/sudoers/logging.c:242 +msgid "validation failure" +msgstr "việc phê chuẩn thất bại" + +#: plugins/sudoers/logging.c:249 +msgid "user NOT in sudoers" +msgstr "tài khoản KHÔNG có trong sudoers" + +#: plugins/sudoers/logging.c:251 +msgid "user NOT authorized on host" +msgstr "tài khoản KHÔNG được cho phép sử dụng trên máy chủ" + +#: plugins/sudoers/logging.c:253 +msgid "command not allowed" +msgstr "lệnh không được phép" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s không trong tập tin sudoers. Sự việc này sẽ được báo cáo.\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s không được phép chạy lệnh sudo trên %s. Sự việc này sẽ được báo cáo.\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "Rất tiếc, tài khoản %s không được chạy lệnh sudo trên %s.\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "Rất tiếc, tài khoản %s không được phép thi hành “%s%s%s” như là %s%s%s trên %s.\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:438 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:599 +#: plugins/sudoers/sudoers.c:601 +#, c-format +msgid "%s: command not found" +msgstr "%s: không tìm thấy lệnh" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:434 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"đang bỏ qua “%s” được tìm thấy trong “.”\n" +"Sử dụng “sudo ./%s” nếu đây là “%s” bạn muốn chạy." + +#: plugins/sudoers/logging.c:354 +msgid "authentication failure" +msgstr "xác thực gặp lỗi nghiêm trọng" + +#: plugins/sudoers/logging.c:380 +msgid "a password is required" +msgstr "bắt buộc phải có mật khẩu" + +#: plugins/sudoers/logging.c:443 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "đã sai mật khẩu %u lần" + +#: plugins/sudoers/logging.c:666 +msgid "unable to fork" +msgstr "không thể tạo tiến trình con" + +#: plugins/sudoers/logging.c:674 plugins/sudoers/logging.c:726 +#, c-format +msgid "unable to fork: %m" +msgstr "không thể tạo tiến trình con: %m" + +#: plugins/sudoers/logging.c:716 +#, c-format +msgid "unable to open pipe: %m" +msgstr "không thể mở ống dẫn lệnh: %m" + +#: plugins/sudoers/logging.c:741 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "không thể dup (nhân đôi) stdin: %m" + +#: plugins/sudoers/logging.c:779 +#, c-format +msgid "unable to execute %s: %m" +msgstr "không thể thực thi %s: %m" + +#: plugins/sudoers/match.c:874 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "tóm lược cho %s (%s) không ở dạng thức %s" + +#: plugins/sudoers/mkdir_parents.c:75 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/visudo.c:421 plugins/sudoers/visudo.c:717 +#, c-format +msgid "unable to stat %s" +msgstr "không thể lấy thống kê %s" + +#: plugins/sudoers/parse.c:444 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"Vai trò LDAP: %s\n" + +#: plugins/sudoers/parse.c:447 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Mục Sudoers:\n" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid " RunAsUsers: " +msgstr " ChạyVớiTưCáchNgườiDùng: " + +#: plugins/sudoers/parse.c:464 +#, c-format +msgid " RunAsGroups: " +msgstr " ChạyVớiTưCáchNhóm: " + +#: plugins/sudoers/parse.c:474 +#, c-format +msgid " Options: " +msgstr " Tùy chọn: " + +#: plugins/sudoers/parse.c:528 +#, c-format +msgid " Commands:\n" +msgstr " Lệnh:\n" + +#: plugins/sudoers/parse.c:719 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "Các mục mặc định khớp cho %s trên máy %s:\n" + +#: plugins/sudoers/parse.c:737 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "Runas và Đặc-tả-lệnh mặc định cho %s:\n" + +#: plugins/sudoers/parse.c:755 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "Người dùng %s có thể chạy những lệnh sau trên máy %s:\n" + +#: plugins/sudoers/parse.c:770 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "Tài khoản %s không được phép thi hành sudo trên %s.\n" + +#: plugins/sudoers/parse_ldif.c:145 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "bỏ qua giá trị thuộc tính không hợp lệ: %s" + +#: plugins/sudoers/parse_ldif.c:584 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "bỏ qua sudoRole chưa hoàn thiện: cn: %s" + +#: plugins/sudoers/policy.c:88 plugins/sudoers/policy.c:114 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "%.*s không hợp lệ đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:293 plugins/sudoers/testsudoers.c:278 +msgid "unable to parse network address list" +msgstr "không thể phân tích danh sách địa chỉ mạng" + +#: plugins/sudoers/policy.c:437 +msgid "user name not set by sudo front-end" +msgstr "tên người dùng không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:441 +msgid "user ID not set by sudo front-end" +msgstr "mã số người dùng không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:445 +msgid "group ID not set by sudo front-end" +msgstr "mã số nhóm không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:449 +msgid "host name not set by sudo front-end" +msgstr "tên máy không đặt bởi ứng dụng chạy phía trước sudo" + +#: plugins/sudoers/policy.c:802 plugins/sudoers/visudo.c:220 +#: plugins/sudoers/visudo.c:851 +#, c-format +msgid "unable to execute %s" +msgstr "không thể thực thi %s" + +#: plugins/sudoers/policy.c:933 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Phiên bản của phần bổ sung chính sách Sudoers %s\n" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Phiên bản ngữ pháp tập tin Sudoers %d\n" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Đường dẫn Sudoers: %s\n" + +#: plugins/sudoers/policy.c:942 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "đường dẫn nsswitch: %s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "đường dẫn ldap.conf: %s\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "đường dẫn ldap.secret: %s\n" + +#: plugins/sudoers/policy.c:978 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "không thể đăng ký móc kiểu %d (phiên bản %d.%d)" + +#: plugins/sudoers/pwutil.c:220 plugins/sudoers/pwutil.c:239 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "không thể lưu nhớ tạm uid %u, hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:233 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "không thể lưu nhớ tạm uid %u, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:293 plugins/sudoers/pwutil.c:311 +#: plugins/sudoers/pwutil.c:373 plugins/sudoers/pwutil.c:418 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "không thể lưu nhớ tạm tài khoản %s, hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:306 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "không thể lưu nhớ tạm tài khoản %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:537 plugins/sudoers/pwutil.c:556 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "không thể lưu nhớ tạm gid %u, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:550 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "không thể lưu nhớ tạm gid %u, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:669 plugins/sudoers/pwutil.c:711 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "không thể lưu nhớ tạm nhóm %s, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "không thể lưu nhớ tạm nhóm %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:889 +#: plugins/sudoers/pwutil.c:940 plugins/sudoers/pwutil.c:993 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "không thể lưu nhớ tạm danh sách nhóm cho %s, đã có sẵn rồi" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:894 +#: plugins/sudoers/pwutil.c:946 plugins/sudoers/pwutil.c:998 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "không thể lưu nhớ tạm danh sách nhóm cho %s, đã hết bộ nhớ rồi" + +#: plugins/sudoers/pwutil.c:883 +#, c-format +msgid "unable to parse groups for %s" +msgstr "không thể phân tích nhóm cho %s" + +#: plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to parse gids for %s" +msgstr "không thể phân tích mã số nhóm cho %s" + +#: plugins/sudoers/set_perms.c:118 plugins/sudoers/set_perms.c:474 +#: plugins/sudoers/set_perms.c:917 plugins/sudoers/set_perms.c:1244 +#: plugins/sudoers/set_perms.c:1561 +msgid "perm stack overflow" +msgstr "ngăn xếp perm bị tràn" + +#: plugins/sudoers/set_perms.c:126 plugins/sudoers/set_perms.c:405 +#: plugins/sudoers/set_perms.c:482 plugins/sudoers/set_perms.c:784 +#: plugins/sudoers/set_perms.c:925 plugins/sudoers/set_perms.c:1168 +#: plugins/sudoers/set_perms.c:1252 plugins/sudoers/set_perms.c:1494 +#: plugins/sudoers/set_perms.c:1569 plugins/sudoers/set_perms.c:1659 +msgid "perm stack underflow" +msgstr "ngăn xếp stack tràn ngầm" + +#: plugins/sudoers/set_perms.c:185 plugins/sudoers/set_perms.c:528 +#: plugins/sudoers/set_perms.c:1303 plugins/sudoers/set_perms.c:1601 +msgid "unable to change to root gid" +msgstr "không thể thay đổi mã số nhóm của siêu người dùng root" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to change to runas gid" +msgstr "không thể thay đổi thành runas gid" + +#: plugins/sudoers/set_perms.c:279 plugins/sudoers/set_perms.c:630 +#: plugins/sudoers/set_perms.c:1059 plugins/sudoers/set_perms.c:1385 +msgid "unable to set runas group vector" +msgstr "không thể đặt véc-tơ nhóm runas" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:641 +#: plugins/sudoers/set_perms.c:1068 plugins/sudoers/set_perms.c:1394 +msgid "unable to change to runas uid" +msgstr "không thể thay đổi thành runas uid" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:659 +#: plugins/sudoers/set_perms.c:1084 plugins/sudoers/set_perms.c:1410 +msgid "unable to change to sudoers gid" +msgstr "không thể thay đổi thành mã số nhóm sudoers" + +#: plugins/sudoers/set_perms.c:392 plugins/sudoers/set_perms.c:771 +#: plugins/sudoers/set_perms.c:1155 plugins/sudoers/set_perms.c:1481 +#: plugins/sudoers/set_perms.c:1646 +msgid "too many processes" +msgstr "quá nhiều tiến trình" + +#: plugins/sudoers/solaris_audit.c:56 +msgid "unable to get current working directory" +msgstr "không thể lấy thư mục làm việc hiện tại" + +#: plugins/sudoers/solaris_audit.c:64 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "đã cắt ngắn đường dẫn audit user_cmnd: %s" + +#: plugins/sudoers/solaris_audit.c:71 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "đã cắt ngắn đường dẫn audit argv[0]: %s" + +#: plugins/sudoers/solaris_audit.c:120 +msgid "audit_failure message too long" +msgstr "thông điệp audit_failure quá dài" + +#: plugins/sudoers/sssd.c:563 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "không thể khởi tạo nguồn SSS. SSSD đã được cài đặt trên máy của bạn chưa vậy?" + +#: plugins/sudoers/sssd.c:571 plugins/sudoers/sssd.c:580 +#: plugins/sudoers/sssd.c:589 plugins/sudoers/sssd.c:598 +#: plugins/sudoers/sssd.c:607 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "không thể tìm thấy ký hiệu “%s” trong %s" + +#: plugins/sudoers/sudoers.c:208 plugins/sudoers/sudoers.c:864 +msgid "problem with defaults entries" +msgstr "trục trặc với các mục mặc định" + +#: plugins/sudoers/sudoers.c:212 +msgid "no valid sudoers sources found, quitting" +msgstr "không có người dùng hợp lệ nào được tìm thấy, đang thoát ra" + +#: plugins/sudoers/sudoers.c:250 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers đã ghi rõ là siêu người dùng (root) không được phép chạy sudo" + +#: plugins/sudoers/sudoers.c:308 +msgid "you are not permitted to use the -C option" +msgstr "bạn không được phép sử dụng tùy chọn -C" + +#: plugins/sudoers/sudoers.c:355 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "người sở hữu dấu vết thời gian (%s): Không có người dùng nào như vậy" + +#: plugins/sudoers/sudoers.c:370 +msgid "no tty" +msgstr "không có tty" + +#: plugins/sudoers/sudoers.c:371 +msgid "sorry, you must have a tty to run sudo" +msgstr "rất tiếc, bạn phải có tty mới có thể chạy sudo" + +#: plugins/sudoers/sudoers.c:433 +msgid "command in current directory" +msgstr "lệnh trong thư mục hiện hành" + +#: plugins/sudoers/sudoers.c:452 +msgid "sorry, you are not allowed set a command timeout" +msgstr "rất tiếc, bạn không được phép đặt thời gian chờ lệnh tối đa" + +#: plugins/sudoers/sudoers.c:460 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "rất tiếc, bạn không được phép giữ lại môi trường" + +#: plugins/sudoers/sudoers.c:808 +msgid "command too long" +msgstr "lệnh quá dài" + +#: plugins/sudoers/sudoers.c:922 +#, c-format +msgid "%s is not a regular file" +msgstr "%s không phải tập tin thường" + +#: plugins/sudoers/sudoers.c:926 plugins/sudoers/timestamp.c:257 toke.l:965 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s được sở hữu bởi người dùng mang mã số %u, nên là %u" + +#: plugins/sudoers/sudoers.c:930 toke.l:970 +#, c-format +msgid "%s is world writable" +msgstr "%s ai ghi cũng được" + +#: plugins/sudoers/sudoers.c:934 toke.l:973 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s được sở hữu bởi nhóm mang mã số %u, nên là %u" + +#: plugins/sudoers/sudoers.c:967 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "chỉ có siêu người dùng (root) mới có thể sử dụng “-c %s”" + +#: plugins/sudoers/sudoers.c:986 +#, c-format +msgid "unknown login class: %s" +msgstr "không rõ lớp đăng nhập: %s" + +#: plugins/sudoers/sudoers.c:1069 plugins/sudoers/sudoers.c:1083 +#, c-format +msgid "unable to resolve host %s" +msgstr "không thể phân giải địa chỉ của máy %s" + +#: plugins/sudoers/sudoreplay.c:248 +#, c-format +msgid "invalid filter option: %s" +msgstr "tùy chọn lọc không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:261 +#, c-format +msgid "invalid max wait: %s" +msgstr "thời gian chờ tối đa không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:284 +#, c-format +msgid "invalid speed factor: %s" +msgstr "sai hệ số nhân tốc độ: %s" + +#: plugins/sudoers/sudoreplay.c:319 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/thời-gian: %s" + +#: plugins/sudoers/sudoreplay.c:325 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/thời-gian: %s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "Đang chạy lại phiên sudo: %s" + +#: plugins/sudoers/sudoreplay.c:539 plugins/sudoers/sudoreplay.c:586 +#: plugins/sudoers/sudoreplay.c:783 plugins/sudoers/sudoreplay.c:892 +#: plugins/sudoers/sudoreplay.c:977 plugins/sudoers/sudoreplay.c:992 +#: plugins/sudoers/sudoreplay.c:999 plugins/sudoers/sudoreplay.c:1006 +#: plugins/sudoers/sudoreplay.c:1013 plugins/sudoers/sudoreplay.c:1020 +#: plugins/sudoers/sudoreplay.c:1168 +msgid "unable to add event to queue" +msgstr "không thể thêm sự kiện vào hàng đợi" + +#: plugins/sudoers/sudoreplay.c:654 +msgid "unable to set tty to raw mode" +msgstr "không thể đặt thiết bị tty chế độ thô (raw)" + +#: plugins/sudoers/sudoreplay.c:705 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "Cảnh báo: thiết bị cuối quá nhỏ để có thể chạy nhật ký một cách đúng đắn.\n" + +#: plugins/sudoers/sudoreplay.c:706 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "Định dạng của nhật ký là %d x %d, định dạng của thiết bị cuối là %d x %d." + +#: plugins/sudoers/sudoreplay.c:734 +msgid "Replay finished, press any key to restore the terminal." +msgstr "Trình diễn lại đã kết thúc, vui lòng bấm một phím bất kỳ để hoàn lại thiết bị cuối." + +#: plugins/sudoers/sudoreplay.c:766 +#, c-format +msgid "invalid timing file line: %s" +msgstr "sai dòng ghi thời gian trong tập tin: %s" + +#: plugins/sudoers/sudoreplay.c:1202 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "biểu thức không rõ ràng “%s”" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "thiếu “)” trong biểu thức" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "không hiểu giới hạn tìm kiếm “%s”" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s yêu cầu một đối số" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1512 +#, c-format +msgid "invalid regular expression: %s" +msgstr "biểu thức chính quy không hợp lệ: %s" + +#: plugins/sudoers/sudoreplay.c:1275 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "không thể phân tích ngày tháng “%s”" + +#: plugins/sudoers/sudoreplay.c:1284 +msgid "unmatched '(' in expression" +msgstr "thiếu “(” trong biểu thức" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "illegal trailing \"or\"" +msgstr "thừa “or” ở cuối" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"!\"" +msgstr "thừa “!” ở cuối" + +#: plugins/sudoers/sudoreplay.c:1338 +#, c-format +msgid "unknown search type %d" +msgstr "không hiểu kiểu tìm kiếm “%d”" + +#: plugins/sudoers/sudoreplay.c:1605 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "cách dùng: %s [-hnRS] [-d thư-mục] [-m số] [-s số] ID\n" + +#: plugins/sudoers/sudoreplay.c:1608 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "cách dùng: %s [-h] [-d th.mục] -l [biểu thức tìm kiếm]\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - chạy lại nhật ký phiên sudo\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1619 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"Tùy chọn:\n" +" -d, --directory=th.mục chỉ định thư mục cho nhật ký phiên\n" +" -f, --filter=bộ-lọc chỉ định kiểu V/R để hiển thị\n" +" -h, --help hiển thị thông tin trợ giúp rồi thoát\n" +" -l, --list liệt kê ID phiên sẵn có, với biểu thức tùy chọn\n" +" -m, --max-wait=sô số giây tối đa sẽ chờ giữa hai sự kiện\n" +" -S, --suspend-wait chờ trong khi lệnh bị treo\n" +" -s, --speed=số tăng hoặc giảm tốc độ kết xuất\n" +" -V, --version hiển thị thông tin về phiên bản rồi thoát" + +#: plugins/sudoers/testsudoers.c:360 +msgid "\thost unmatched" +msgstr "\tmáy chủ không khớp" + +#: plugins/sudoers/testsudoers.c:363 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"Lệnh được phép" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"Lệnh bị cấm" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"Lệnh không khớp" + +#: plugins/sudoers/timestamp.c:265 +#, c-format +msgid "%s is group writable" +msgstr "%s là người cùng nhóm được ghi" + +#: plugins/sudoers/timestamp.c:341 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "không thể cắt ngắn tập tin dấu-vết-thời-gian thành %lld byte" + +#: plugins/sudoers/timestamp.c:827 plugins/sudoers/timestamp.c:919 +#: plugins/sudoers/visudo.c:482 plugins/sudoers/visudo.c:488 +msgid "unable to read the clock" +msgstr "không thể đọc khóa" + +#: plugins/sudoers/timestamp.c:838 +msgid "ignoring time stamp from the future" +msgstr "bỏ qua dấu vết thời gian nằm ở thì tương lai" + +#: plugins/sudoers/timestamp.c:861 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "dấu vết thời gian nằm ở thì tương lai: %20.20s" + +#: plugins/sudoers/timestamp.c:983 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "không thể khóa tập tin dấu-vết-thời-gian %s" + +#: plugins/sudoers/timestamp.c:1027 plugins/sudoers/timestamp.c:1047 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "đường dẫn đến thư mục thuyết trình quá dài: %s/%s" + +#: plugins/sudoers/visudo.c:216 +msgid "the -x option will be removed in a future release" +msgstr "tùy chọn -x sẽ bị xóa bỏ trong tương lai" + +#: plugins/sudoers/visudo.c:217 +msgid "please consider using the cvtsudoers utility instead" +msgstr "vui lòng cân nhắc sử dụng tiện ích cvtsudoers để thay thế" + +#: plugins/sudoers/visudo.c:268 plugins/sudoers/visudo.c:650 +#, c-format +msgid "press return to edit %s: " +msgstr "bấm phím để trở về chỉnh sửa %s:" + +#: plugins/sudoers/visudo.c:329 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "trình biên soạn đã chỉ ra (%s) không tồn tại" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "không tìm thấy trình biên soạn (đường dẫn của nó = %s)" + +#: plugins/sudoers/visudo.c:441 plugins/sudoers/visudo.c:449 +msgid "write error" +msgstr "lỗi ghi" + +#: plugins/sudoers/visudo.c:495 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "không thể lấy thống kê tập tin tạm (%s), %s không thay đổi gì." + +#: plugins/sudoers/visudo.c:502 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "tập tin tạm (%s) có kích cỡ bằng không, %s không thay đổi gì" + +#: plugins/sudoers/visudo.c:508 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "trình biên soạn (%s) gặp lỗi, %s không thay đổi gì" + +#: plugins/sudoers/visudo.c:530 +#, c-format +msgid "%s unchanged" +msgstr "%s không thay đổi" + +#: plugins/sudoers/visudo.c:589 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "không thể mở lại tập tin tạm (%s), %s không thay đổi gì." + +#: plugins/sudoers/visudo.c:601 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "không thể phân tích tập tin tạm (%s), lỗi chưa được biết" + +#: plugins/sudoers/visudo.c:639 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "lỗi hệ thống, không thể tìm thấy %s trong danh sách!" + +#: plugins/sudoers/visudo.c:719 plugins/sudoers/visudo.c:728 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "không thể đặt (uid, gid) của %s thành (%u, %u)" + +#: plugins/sudoers/visudo.c:751 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s và %s không ở trên cùng một hệ thống tập tin, sử dụng lệnh mv để đổi tên" + +#: plugins/sudoers/visudo.c:765 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "thực hiện lệnh gặp lỗi: “%s %s %s”, %s không thay đổi" + +#: plugins/sudoers/visudo.c:775 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "gặp lỗi khi đổi tên %s, %s không thay đổi" + +#: plugins/sudoers/visudo.c:796 +msgid "What now? " +msgstr "Vậy làm gì bây giờ? " + +#: plugins/sudoers/visudo.c:810 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"Các tùy chọn là:\n" +" (e) sửa lại tập tin sudoers\n" +" (x) thoát ra mà không ghi lại tập tin sudoerse\n" +" (q) thoát ra và ghi lại tập tin sudoers (NGUY HIỂM!)\n" + +#: plugins/sudoers/visudo.c:856 +#, c-format +msgid "unable to run %s" +msgstr "không thể chạy %s" + +#: plugins/sudoers/visudo.c:886 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s: sai sở hữu (uid, gid) đáng lẽ là (%u, %u)\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s: phân quyền sai, phải ở chế độ 0%o\n" + +#: plugins/sudoers/visudo.c:950 plugins/sudoers/visudo.c:957 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s: vượt qua kiểm duyệt\n" + +#: plugins/sudoers/visudo.c:976 +#, c-format +msgid "%s busy, try again later" +msgstr "%s đang bận, hãy thử lại sau" + +#: plugins/sudoers/visudo.c:979 +#, c-format +msgid "unable to lock %s" +msgstr "không thể khóa %s" + +#: plugins/sudoers/visudo.c:980 +msgid "Edit anyway? [y/N]" +msgstr "Vẫn sửa? (có/KHÔNG) [y/N]" + +#: plugins/sudoers/visudo.c:1064 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "Lỗi: %s:%d bị quẩn tròn trong %s “%s”" + +#: plugins/sudoers/visudo.c:1065 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "Cảnh báo: %s:%d bị quẩn tròn trong %s “%s”" + +#: plugins/sudoers/visudo.c:1069 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "Lỗi: %s:%d %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#: plugins/sudoers/visudo.c:1070 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "Cảnh báo: %s:%d %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#: plugins/sudoers/visudo.c:1161 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "Cảnh báo: %s:%d không dùng %s “%s”" + +#: plugins/sudoers/visudo.c:1276 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - sửa tập tin sudoers một cách an toàn\n" +"\n" + +#: plugins/sudoers/visudo.c:1278 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"Các tùy chọn:\n" +" -c, --check chế độ chỉ kiểm tra\n" +" -f, --file=tập-tin chỉ định vị trí tập tin sudoers\n" +" -h, --help hiển thị thông tin trợ giúp rồi thoát\n" +" -q, --quiet tối thiểu hóa các thông tin (quiet: im lặng)\n" +" -s, --strict kiểm tra cú pháp ngặt nghèo\n" +" -V, --version hiển thị thông tin về phiên bản rồi thoát\n" + +#: toke.l:939 +msgid "too many levels of includes" +msgstr "quá nhiều cấp bao gồm (include)" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò LDAP: KHÔNG HIỂU\n" + +#~ msgid " Order: %s\n" +#~ msgstr " Thứ tự: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò SSSD: %s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "Vai trò SSSD: KHÔNG HIỂU\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "Cảnh báo: quẩn tròn trong %s “%s”" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "Cảnh báo: %s “%s” được tham chiếu nhưng chưa được định nghĩa" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "Cảnh báo: chưa được dùng %s “%s”" + +#~ msgid "unable allocate memory" +#~ msgstr "không thể cấp phát bộ nhớ" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "đường dẫn dấu vết thời gian quá dài: %s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "không thể lấy thống kê trình biên soạn (%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports: hết bộ nhớ để mở rộng hostbuf" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri: hết bộ nhớ để biên dịch “hostbuf”" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 phân bổ không khớp" + +#~ msgid "Password:" +#~ msgstr "Mật khẩu:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "lỗi nội bộ: thiếu khoảng trống cho dòng ghi nhật ký" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args: bộ đệm bị tràn" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s được sở hữu bởi uid %u, nên là %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s có thể được ghi bởi người không sở hữu nó (0%o), cần đặt chế độ 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s đã sẵn có nhưng không phải là một tập tin bình thường (0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s có thể được ghi bởi người không sở hữu nó (0%o), cần đặt chế độ 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "không thể gỡ bỏ %s, sẽ đặt lại thành thời điểm bắt đầu kiểu Unix" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "không thể đặt lại %s thành thời điểm bắt đầu kiểu Unix" + +#~ msgid "value out of range" +#~ msgstr "giá trị nằm ngoài phạm vi" + +#~ msgid "invalid uri: %s" +#~ msgstr "URI không hợp lệ: %s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "không thể trộn ldaps và starttls" + +#~ msgid "writing to standard output" +#~ msgstr "ghi vào đầu ra tiêu chuẩn" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "có quá nhiều biểu thức trong dấu ngoặc đơn, tối đa là %d" + +#~ msgid "unable to setup authentication" +#~ msgstr "không thể cài đặt xác thực" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit: gặp lỗi" + +#~ msgid "getauid: failed" +#~ msgstr "getauid: gặp lỗi" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject: gặp lỗi" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args: gặp lỗi" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32: gặp lỗi" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text: gặp lỗi" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep: tv_sec %ld, tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok: %s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate: %s" + +#~ msgid "getauid failed" +#~ msgstr "getauid gặp lỗi" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "Không thể dlopen %s: %s" + +#~ msgid "invalid regex: %s" +#~ msgstr "biểu thức chính quy không hợp lệ: %s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s: %s gần dòng %d <<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "không thể đặt địa phương thành “%s”, sẽ dùng “C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " Lệnh:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "không thể lưu nhớ tạm uid %u (%s), đã có sẵn rồi" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "không thể lưu nhớ tạm gid %u (%s), đã có sẵn rồi" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "không thể thực thi %s: %s" diff --git a/utsudo-0.0.2/plugins/sudoers/po/zh_CN.mo b/utsudo-0.0.2/plugins/sudoers/po/zh_CN.mo new file mode 100644 index 0000000000000000000000000000000000000000..8f5f41c76acc16bf2450d76e79d9cef3879fcd1a GIT binary patch literal 44876 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/zh_CN.po b/utsudo-0.0.2/plugins/sudoers/po/zh_CN.po new file mode 100644 index 0000000..cad59f9 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/zh_CN.po @@ -0,0 +1,2549 @@ +# Chinese simplified translation for sudoers. +# This file is put in the public domain. +# Wylmer Wang , 2011-2018 +# +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-05 09:13+0800\n" +"Last-Translator: Wylmer Wang \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "语法错误" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p 的密码:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p 的密码:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "密码:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 安全信息 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "对不起,请重试。" + +#: gram.y:192 gram.y:240 gram.y:247 gram.y:254 gram.y:261 gram.y:268 +#: gram.y:284 gram.y:308 gram.y:315 gram.y:322 gram.y:329 gram.y:336 +#: gram.y:399 gram.y:407 gram.y:417 gram.y:450 gram.y:457 gram.y:464 +#: gram.y:471 gram.y:553 gram.y:560 gram.y:569 gram.y:578 gram.y:595 +#: gram.y:707 gram.y:714 gram.y:721 gram.y:729 gram.y:829 gram.y:836 +#: gram.y:843 gram.y:850 gram.y:857 gram.y:883 gram.y:890 gram.y:897 +#: gram.y:1020 gram.y:1294 plugins/sudoers/alias.c:130 +#: plugins/sudoers/alias.c:137 plugins/sudoers/alias.c:153 +#: plugins/sudoers/auth/bsdauth.c:146 plugins/sudoers/auth/kerb5.c:121 +#: plugins/sudoers/auth/kerb5.c:147 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/auth/sia.c:62 +#: plugins/sudoers/cvtsudoers.c:123 plugins/sudoers/cvtsudoers.c:164 +#: plugins/sudoers/cvtsudoers.c:181 plugins/sudoers/cvtsudoers.c:192 +#: plugins/sudoers/cvtsudoers.c:304 plugins/sudoers/cvtsudoers.c:432 +#: plugins/sudoers/cvtsudoers.c:565 plugins/sudoers/cvtsudoers.c:582 +#: plugins/sudoers/cvtsudoers.c:645 plugins/sudoers/cvtsudoers.c:760 +#: plugins/sudoers/cvtsudoers.c:768 plugins/sudoers/cvtsudoers.c:1178 +#: plugins/sudoers/cvtsudoers.c:1182 plugins/sudoers/cvtsudoers.c:1284 +#: plugins/sudoers/cvtsudoers_ldif.c:152 plugins/sudoers/cvtsudoers_ldif.c:195 +#: plugins/sudoers/cvtsudoers_ldif.c:242 plugins/sudoers/cvtsudoers_ldif.c:261 +#: plugins/sudoers/cvtsudoers_ldif.c:332 plugins/sudoers/cvtsudoers_ldif.c:387 +#: plugins/sudoers/cvtsudoers_ldif.c:395 plugins/sudoers/cvtsudoers_ldif.c:412 +#: plugins/sudoers/cvtsudoers_ldif.c:421 plugins/sudoers/cvtsudoers_ldif.c:568 +#: plugins/sudoers/defaults.c:661 plugins/sudoers/defaults.c:954 +#: plugins/sudoers/defaults.c:1125 plugins/sudoers/editor.c:70 +#: plugins/sudoers/editor.c:88 plugins/sudoers/editor.c:99 +#: plugins/sudoers/env.c:247 plugins/sudoers/filedigest.c:64 +#: plugins/sudoers/filedigest.c:80 plugins/sudoers/gc.c:57 +#: plugins/sudoers/group_plugin.c:136 plugins/sudoers/interfaces.c:76 +#: plugins/sudoers/iolog.c:939 plugins/sudoers/iolog_path.c:172 +#: plugins/sudoers/iolog_util.c:83 plugins/sudoers/iolog_util.c:122 +#: plugins/sudoers/iolog_util.c:131 plugins/sudoers/iolog_util.c:141 +#: plugins/sudoers/iolog_util.c:149 plugins/sudoers/iolog_util.c:153 +#: plugins/sudoers/ldap.c:183 plugins/sudoers/ldap.c:414 +#: plugins/sudoers/ldap.c:418 plugins/sudoers/ldap.c:430 +#: plugins/sudoers/ldap.c:721 plugins/sudoers/ldap.c:885 +#: plugins/sudoers/ldap.c:1233 plugins/sudoers/ldap.c:1660 +#: plugins/sudoers/ldap.c:1697 plugins/sudoers/ldap.c:1778 +#: plugins/sudoers/ldap.c:1913 plugins/sudoers/ldap.c:2014 +#: plugins/sudoers/ldap.c:2030 plugins/sudoers/ldap_conf.c:221 +#: plugins/sudoers/ldap_conf.c:252 plugins/sudoers/ldap_conf.c:304 +#: plugins/sudoers/ldap_conf.c:340 plugins/sudoers/ldap_conf.c:443 +#: plugins/sudoers/ldap_conf.c:458 plugins/sudoers/ldap_conf.c:555 +#: plugins/sudoers/ldap_conf.c:588 plugins/sudoers/ldap_conf.c:680 +#: plugins/sudoers/ldap_conf.c:762 plugins/sudoers/ldap_util.c:508 +#: plugins/sudoers/ldap_util.c:564 plugins/sudoers/linux_audit.c:81 +#: plugins/sudoers/logging.c:195 plugins/sudoers/logging.c:511 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:573 +#: plugins/sudoers/logging.c:752 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:725 plugins/sudoers/match.c:772 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1009 +#: plugins/sudoers/parse.c:195 plugins/sudoers/parse.c:207 +#: plugins/sudoers/parse.c:222 plugins/sudoers/parse.c:234 +#: plugins/sudoers/parse_ldif.c:141 plugins/sudoers/parse_ldif.c:168 +#: plugins/sudoers/parse_ldif.c:237 plugins/sudoers/parse_ldif.c:244 +#: plugins/sudoers/parse_ldif.c:249 plugins/sudoers/parse_ldif.c:325 +#: plugins/sudoers/parse_ldif.c:336 plugins/sudoers/parse_ldif.c:342 +#: plugins/sudoers/parse_ldif.c:367 plugins/sudoers/parse_ldif.c:379 +#: plugins/sudoers/parse_ldif.c:383 plugins/sudoers/parse_ldif.c:397 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:594 +#: plugins/sudoers/parse_ldif.c:619 plugins/sudoers/parse_ldif.c:679 +#: plugins/sudoers/parse_ldif.c:698 plugins/sudoers/parse_ldif.c:744 +#: plugins/sudoers/parse_ldif.c:754 plugins/sudoers/policy.c:502 +#: plugins/sudoers/policy.c:744 plugins/sudoers/prompt.c:98 +#: plugins/sudoers/pwutil.c:197 plugins/sudoers/pwutil.c:269 +#: plugins/sudoers/pwutil.c:346 plugins/sudoers/pwutil.c:520 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:656 +#: plugins/sudoers/pwutil.c:814 plugins/sudoers/pwutil.c:871 +#: plugins/sudoers/pwutil.c:916 plugins/sudoers/pwutil.c:974 +#: plugins/sudoers/sssd.c:152 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:112 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +msgid "unable to allocate memory" +msgstr "无法分配内存" + +#: gram.y:482 +msgid "a digest requires a path name" +msgstr "摘要需要路径参数" + +#: gram.y:608 +msgid "invalid notbefore value" +msgstr "无效的 notbefore 值" + +#: gram.y:616 +msgid "invalid notafter value" +msgstr "无效的 notafter 值" + +#: gram.y:625 plugins/sudoers/policy.c:318 +msgid "timeout value too large" +msgstr "超时值过大" + +#: gram.y:627 plugins/sudoers/policy.c:320 +msgid "invalid timeout value" +msgstr "无效的超时值" + +#: gram.y:1294 plugins/sudoers/auth/pam.c:354 plugins/sudoers/auth/pam.c:524 +#: plugins/sudoers/auth/rfc1938.c:114 plugins/sudoers/cvtsudoers.c:123 +#: plugins/sudoers/cvtsudoers.c:163 plugins/sudoers/cvtsudoers.c:180 +#: plugins/sudoers/cvtsudoers.c:191 plugins/sudoers/cvtsudoers.c:303 +#: plugins/sudoers/cvtsudoers.c:431 plugins/sudoers/cvtsudoers.c:564 +#: plugins/sudoers/cvtsudoers.c:581 plugins/sudoers/cvtsudoers.c:645 +#: plugins/sudoers/cvtsudoers.c:760 plugins/sudoers/cvtsudoers.c:767 +#: plugins/sudoers/cvtsudoers.c:1178 plugins/sudoers/cvtsudoers.c:1182 +#: plugins/sudoers/cvtsudoers.c:1284 plugins/sudoers/cvtsudoers_ldif.c:151 +#: plugins/sudoers/cvtsudoers_ldif.c:194 plugins/sudoers/cvtsudoers_ldif.c:241 +#: plugins/sudoers/cvtsudoers_ldif.c:260 plugins/sudoers/cvtsudoers_ldif.c:331 +#: plugins/sudoers/cvtsudoers_ldif.c:386 plugins/sudoers/cvtsudoers_ldif.c:394 +#: plugins/sudoers/cvtsudoers_ldif.c:411 plugins/sudoers/cvtsudoers_ldif.c:420 +#: plugins/sudoers/cvtsudoers_ldif.c:567 plugins/sudoers/defaults.c:661 +#: plugins/sudoers/defaults.c:954 plugins/sudoers/defaults.c:1125 +#: plugins/sudoers/editor.c:70 plugins/sudoers/editor.c:88 +#: plugins/sudoers/editor.c:99 plugins/sudoers/env.c:247 +#: plugins/sudoers/filedigest.c:64 plugins/sudoers/filedigest.c:80 +#: plugins/sudoers/gc.c:57 plugins/sudoers/group_plugin.c:136 +#: plugins/sudoers/interfaces.c:76 plugins/sudoers/iolog.c:939 +#: plugins/sudoers/iolog_path.c:172 plugins/sudoers/iolog_util.c:83 +#: plugins/sudoers/iolog_util.c:122 plugins/sudoers/iolog_util.c:131 +#: plugins/sudoers/iolog_util.c:141 plugins/sudoers/iolog_util.c:149 +#: plugins/sudoers/iolog_util.c:153 plugins/sudoers/ldap.c:183 +#: plugins/sudoers/ldap.c:414 plugins/sudoers/ldap.c:418 +#: plugins/sudoers/ldap.c:430 plugins/sudoers/ldap.c:721 +#: plugins/sudoers/ldap.c:885 plugins/sudoers/ldap.c:1233 +#: plugins/sudoers/ldap.c:1660 plugins/sudoers/ldap.c:1697 +#: plugins/sudoers/ldap.c:1778 plugins/sudoers/ldap.c:1913 +#: plugins/sudoers/ldap.c:2014 plugins/sudoers/ldap.c:2030 +#: plugins/sudoers/ldap_conf.c:221 plugins/sudoers/ldap_conf.c:252 +#: plugins/sudoers/ldap_conf.c:304 plugins/sudoers/ldap_conf.c:340 +#: plugins/sudoers/ldap_conf.c:443 plugins/sudoers/ldap_conf.c:458 +#: plugins/sudoers/ldap_conf.c:555 plugins/sudoers/ldap_conf.c:588 +#: plugins/sudoers/ldap_conf.c:679 plugins/sudoers/ldap_conf.c:762 +#: plugins/sudoers/ldap_util.c:508 plugins/sudoers/ldap_util.c:564 +#: plugins/sudoers/linux_audit.c:81 plugins/sudoers/logging.c:195 +#: plugins/sudoers/logging.c:511 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:572 plugins/sudoers/logging.c:1010 +#: plugins/sudoers/match.c:724 plugins/sudoers/match.c:771 +#: plugins/sudoers/match.c:813 plugins/sudoers/match.c:841 +#: plugins/sudoers/match.c:929 plugins/sudoers/match.c:1008 +#: plugins/sudoers/parse.c:194 plugins/sudoers/parse.c:206 +#: plugins/sudoers/parse.c:221 plugins/sudoers/parse.c:233 +#: plugins/sudoers/parse_ldif.c:140 plugins/sudoers/parse_ldif.c:167 +#: plugins/sudoers/parse_ldif.c:236 plugins/sudoers/parse_ldif.c:243 +#: plugins/sudoers/parse_ldif.c:248 plugins/sudoers/parse_ldif.c:324 +#: plugins/sudoers/parse_ldif.c:335 plugins/sudoers/parse_ldif.c:341 +#: plugins/sudoers/parse_ldif.c:366 plugins/sudoers/parse_ldif.c:378 +#: plugins/sudoers/parse_ldif.c:382 plugins/sudoers/parse_ldif.c:396 +#: plugins/sudoers/parse_ldif.c:564 plugins/sudoers/parse_ldif.c:593 +#: plugins/sudoers/parse_ldif.c:618 plugins/sudoers/parse_ldif.c:678 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:743 +#: plugins/sudoers/parse_ldif.c:753 plugins/sudoers/policy.c:132 +#: plugins/sudoers/policy.c:141 plugins/sudoers/policy.c:150 +#: plugins/sudoers/policy.c:176 plugins/sudoers/policy.c:303 +#: plugins/sudoers/policy.c:318 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:346 plugins/sudoers/policy.c:356 +#: plugins/sudoers/policy.c:400 plugins/sudoers/policy.c:410 +#: plugins/sudoers/policy.c:419 plugins/sudoers/policy.c:428 +#: plugins/sudoers/policy.c:502 plugins/sudoers/policy.c:744 +#: plugins/sudoers/prompt.c:98 plugins/sudoers/pwutil.c:197 +#: plugins/sudoers/pwutil.c:269 plugins/sudoers/pwutil.c:346 +#: plugins/sudoers/pwutil.c:520 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:656 plugins/sudoers/pwutil.c:814 +#: plugins/sudoers/pwutil.c:871 plugins/sudoers/pwutil.c:916 +#: plugins/sudoers/pwutil.c:974 plugins/sudoers/set_perms.c:392 +#: plugins/sudoers/set_perms.c:771 plugins/sudoers/set_perms.c:1155 +#: plugins/sudoers/set_perms.c:1481 plugins/sudoers/set_perms.c:1646 +#: plugins/sudoers/sssd.c:151 plugins/sudoers/sssd.c:398 +#: plugins/sudoers/sssd.c:461 plugins/sudoers/sssd.c:505 +#: plugins/sudoers/sssd.c:552 plugins/sudoers/sssd.c:743 +#: plugins/sudoers/stubs.c:101 plugins/sudoers/stubs.c:109 +#: plugins/sudoers/sudoers.c:269 plugins/sudoers/sudoers.c:279 +#: plugins/sudoers/sudoers.c:288 plugins/sudoers/sudoers.c:330 +#: plugins/sudoers/sudoers.c:653 plugins/sudoers/sudoers.c:779 +#: plugins/sudoers/sudoers.c:823 plugins/sudoers/sudoers.c:1097 +#: plugins/sudoers/sudoers_debug.c:111 plugins/sudoers/sudoreplay.c:579 +#: plugins/sudoers/sudoreplay.c:582 plugins/sudoers/sudoreplay.c:1259 +#: plugins/sudoers/sudoreplay.c:1459 plugins/sudoers/sudoreplay.c:1463 +#: plugins/sudoers/testsudoers.c:134 plugins/sudoers/testsudoers.c:234 +#: plugins/sudoers/testsudoers.c:251 plugins/sudoers/testsudoers.c:585 +#: plugins/sudoers/timestamp.c:437 plugins/sudoers/timestamp.c:481 +#: plugins/sudoers/timestamp.c:958 plugins/sudoers/toke_util.c:57 +#: plugins/sudoers/toke_util.c:110 plugins/sudoers/toke_util.c:147 +#: plugins/sudoers/tsdump.c:128 plugins/sudoers/visudo.c:150 +#: plugins/sudoers/visudo.c:312 plugins/sudoers/visudo.c:318 +#: plugins/sudoers/visudo.c:428 plugins/sudoers/visudo.c:606 +#: plugins/sudoers/visudo.c:926 plugins/sudoers/visudo.c:1013 +#: plugins/sudoers/visudo.c:1102 toke.l:844 toke.l:945 toke.l:1102 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: plugins/sudoers/alias.c:148 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "别名“%s”已定义过" + +#: plugins/sudoers/auth/bsdauth.c:73 +#, c-format +msgid "unable to get login class for user %s" +msgstr "无法获取用户 %s 的登录类别(login class)" + +#: plugins/sudoers/auth/bsdauth.c:78 +msgid "unable to begin bsd authentication" +msgstr "无法开始 bsd 认证" + +#: plugins/sudoers/auth/bsdauth.c:86 +msgid "invalid authentication type" +msgstr "无效的认证类型" + +#: plugins/sudoers/auth/bsdauth.c:95 +msgid "unable to initialize BSD authentication" +msgstr "无法初始化 bsd 认证" + +#: plugins/sudoers/auth/bsdauth.c:183 +msgid "your account has expired" +msgstr "您的账户已过期" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "approval failed" +msgstr "批准失败" + +#: plugins/sudoers/auth/fwtk.c:57 +msgid "unable to read fwtk config" +msgstr "无法读取 fwtk 配置" + +#: plugins/sudoers/auth/fwtk.c:62 +msgid "unable to connect to authentication server" +msgstr "无法连接到认证服务器" + +#: plugins/sudoers/auth/fwtk.c:68 plugins/sudoers/auth/fwtk.c:92 +#: plugins/sudoers/auth/fwtk.c:124 +msgid "lost connection to authentication server" +msgstr "丢失了到认证服务器的连接" + +#: plugins/sudoers/auth/fwtk.c:72 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"认证服务器错误:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:113 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s:无法将主体(principal)转换为字符串(“%s”):%s" + +#: plugins/sudoers/auth/kerb5.c:163 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s:无法解析“%s”:%s" + +#: plugins/sudoers/auth/kerb5.c:172 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s:无法解析凭据缓存:%s" + +#: plugins/sudoers/auth/kerb5.c:219 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s:无法分配选项:%s" + +#: plugins/sudoers/auth/kerb5.c:234 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s:无法获取凭据:%s" + +#: plugins/sudoers/auth/kerb5.c:247 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s:无法初始化凭据缓存:%s" + +#: plugins/sudoers/auth/kerb5.c:250 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s:无法在缓存中储存凭据:%s" + +#: plugins/sudoers/auth/kerb5.c:314 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s:无法获取主机主体(principal):%s" + +#: plugins/sudoers/auth/kerb5.c:328 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s:无法验证目标!可能遭到了攻击!:%s" + +#: plugins/sudoers/auth/pam.c:113 +msgid "unable to initialize PAM" +msgstr "无法初始化 PAM" + +#: plugins/sudoers/auth/pam.c:204 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 认证出错:%s" + +#: plugins/sudoers/auth/pam.c:221 +msgid "account validation failure, is your account locked?" +msgstr "账户验证失败,您的账户是不是上锁了?" + +#: plugins/sudoers/auth/pam.c:229 +msgid "Account or password is expired, reset your password and try again" +msgstr "账户或密码过期,重置您的密码并重试" + +#: plugins/sudoers/auth/pam.c:238 +#, c-format +msgid "unable to change expired password: %s" +msgstr "无法更改过期的密码:%s" + +#: plugins/sudoers/auth/pam.c:246 +msgid "Password expired, contact your system administrator" +msgstr "密码过期,联系您的系统管理员" + +#: plugins/sudoers/auth/pam.c:250 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "账户过期,或 PAM 配置缺少 sudo 使用的“account”节,联系您的系统管理员" + +#: plugins/sudoers/auth/pam.c:257 plugins/sudoers/auth/pam.c:262 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 账户管理出错:%s" + +#: plugins/sudoers/auth/rfc1938.c:102 plugins/sudoers/visudo.c:232 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 数据库中没有您" + +#: plugins/sudoers/auth/securid5.c:75 +msgid "failed to initialise the ACE API library" +msgstr "初始化 ACE API 库失败" + +#: plugins/sudoers/auth/securid5.c:101 +msgid "unable to contact the SecurID server" +msgstr "无法联络 SecurID 服务器" + +#: plugins/sudoers/auth/securid5.c:110 +msgid "User ID locked for SecurID Authentication" +msgstr "为进行 SecurID 认证,已锁定用户 ID" + +#: plugins/sudoers/auth/securid5.c:114 plugins/sudoers/auth/securid5.c:165 +msgid "invalid username length for SecurID" +msgstr "SecurID 的用户名长度无效" + +#: plugins/sudoers/auth/securid5.c:118 plugins/sudoers/auth/securid5.c:170 +msgid "invalid Authentication Handle for SecurID" +msgstr "SecurID 的认证句柄无效" + +#: plugins/sudoers/auth/securid5.c:122 +msgid "SecurID communication failed" +msgstr "SecurID 通讯失败" + +#: plugins/sudoers/auth/securid5.c:126 plugins/sudoers/auth/securid5.c:215 +msgid "unknown SecurID error" +msgstr "未知的 SecurID 错误" + +#: plugins/sudoers/auth/securid5.c:160 +msgid "invalid passcode length for SecurID" +msgstr "无效的 SecurID 密码长度" + +#: plugins/sudoers/auth/sia.c:72 plugins/sudoers/auth/sia.c:127 +msgid "unable to initialize SIA session" +msgstr "无法初始化 SIA 会话" + +#: plugins/sudoers/auth/sudo_auth.c:136 +msgid "invalid authentication methods" +msgstr "无效的认证方法" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "编译进 sudo 的认证方法无效!您不能混用独立和非独立认证。" + +#: plugins/sudoers/auth/sudo_auth.c:259 plugins/sudoers/auth/sudo_auth.c:309 +msgid "no authentication methods" +msgstr "无认证方法" + +#: plugins/sudoers/auth/sudo_auth.c:261 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "sudo 编译时没有加入任何认证方法!如果您想关闭认证,使用 --disable-authentication 配置选项。" + +#: plugins/sudoers/auth/sudo_auth.c:311 +msgid "Unable to initialize authentication methods." +msgstr "无法初始化认证方法。" + +#: plugins/sudoers/auth/sudo_auth.c:477 +msgid "Authentication methods:" +msgstr "认证方法:" + +#: plugins/sudoers/bsm_audit.c:123 plugins/sudoers/bsm_audit.c:215 +msgid "Could not determine audit condition" +msgstr "无法确定审核条件" + +#: plugins/sudoers/bsm_audit.c:188 plugins/sudoers/bsm_audit.c:279 +msgid "unable to commit audit record" +msgstr "无法提交审核记录" + +#: plugins/sudoers/check.c:267 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"我们信任您已经从系统管理员那里了解了日常注意事项。\n" +"总结起来无外乎这三点:\n" +"\n" +" #1) 尊重别人的隐私。\n" +" #2) 输入前要先考虑(后果和风险)。\n" +" #3) 权力越大,责任越大。\n" +"\n" + +#: plugins/sudoers/check.c:310 plugins/sudoers/check.c:320 +#: plugins/sudoers/sudoers.c:696 plugins/sudoers/sudoers.c:741 +#: plugins/sudoers/tsdump.c:124 +#, c-format +msgid "unknown uid: %u" +msgstr "未知的用户 ID:%u" + +#: plugins/sudoers/check.c:315 plugins/sudoers/iolog.c:253 +#: plugins/sudoers/policy.c:915 plugins/sudoers/sudoers.c:1136 +#: plugins/sudoers/testsudoers.c:225 plugins/sudoers/testsudoers.c:398 +#, c-format +msgid "unknown user: %s" +msgstr "未知用户:%s" + +#: plugins/sudoers/cvtsudoers.c:198 +#, c-format +msgid "order increment: %s: %s" +msgstr "顺序增量:%s: %s" + +#: plugins/sudoers/cvtsudoers.c:214 +#, c-format +msgid "starting order: %s: %s" +msgstr "起始顺序:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:224 +#, c-format +msgid "order padding: %s: %s" +msgstr "顺序填充:%s: %s" + +#: plugins/sudoers/cvtsudoers.c:232 plugins/sudoers/sudoreplay.c:287 +#: plugins/sudoers/visudo.c:182 +#, c-format +msgid "%s version %s\n" +msgstr "%s 版本 %s\n" + +#: plugins/sudoers/cvtsudoers.c:234 plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 语法版本 %d\n" + +#: plugins/sudoers/cvtsudoers.c:251 plugins/sudoers/testsudoers.c:173 +#, c-format +msgid "unsupported input format %s" +msgstr "不支持的输入格式 %s" + +#: plugins/sudoers/cvtsudoers.c:266 +#, c-format +msgid "unsupported output format %s" +msgstr "不支持的输出格式 %s" + +#: plugins/sudoers/cvtsudoers.c:318 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s:输入和输出文件不能相同" + +#: plugins/sudoers/cvtsudoers.c:334 plugins/sudoers/sudoers.c:172 +#: plugins/sudoers/testsudoers.c:264 plugins/sudoers/visudo.c:238 +#: plugins/sudoers/visudo.c:594 plugins/sudoers/visudo.c:917 +msgid "unable to initialize sudoers default values" +msgstr "无法初始化 sudoers 默认值" + +#: plugins/sudoers/cvtsudoers.c:420 plugins/sudoers/ldap_conf.c:433 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s:%s:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:479 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s:未知的关键词:%s" + +#: plugins/sudoers/cvtsudoers.c:525 +#, c-format +msgid "invalid defaults type: %s" +msgstr "无效的默认值类型:%s" + +#: plugins/sudoers/cvtsudoers.c:548 +#, c-format +msgid "invalid suppression type: %s" +msgstr "无效的压缩类型:%s" + +#: plugins/sudoers/cvtsudoers.c:588 plugins/sudoers/cvtsudoers.c:602 +#, c-format +msgid "invalid filter: %s" +msgstr "无效的过滤器:%s" + +#: plugins/sudoers/cvtsudoers.c:621 plugins/sudoers/cvtsudoers.c:638 +#: plugins/sudoers/cvtsudoers.c:1244 plugins/sudoers/cvtsudoers_json.c:1128 +#: plugins/sudoers/cvtsudoers_ldif.c:641 plugins/sudoers/iolog.c:411 +#: plugins/sudoers/iolog_util.c:72 plugins/sudoers/sudoers.c:903 +#: plugins/sudoers/sudoreplay.c:333 plugins/sudoers/sudoreplay.c:1425 +#: plugins/sudoers/timestamp.c:446 plugins/sudoers/tsdump.c:133 +#: plugins/sudoers/visudo.c:913 +#, c-format +msgid "unable to open %s" +msgstr "无法打开 %s" + +#: plugins/sudoers/cvtsudoers.c:641 plugins/sudoers/visudo.c:922 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "解析 %s 文件失败,未知错误" + +#: plugins/sudoers/cvtsudoers.c:649 plugins/sudoers/visudo.c:939 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "%s 中第 %d 行附近出现解析错误\n" + +#: plugins/sudoers/cvtsudoers.c:652 plugins/sudoers/visudo.c:942 +#, c-format +msgid "parse error in %s\n" +msgstr "%s 中出现解析错误\n" + +#: plugins/sudoers/cvtsudoers.c:1291 plugins/sudoers/iolog.c:498 +#: plugins/sudoers/sudoreplay.c:1129 plugins/sudoers/timestamp.c:330 +#: plugins/sudoers/timestamp.c:333 +#, c-format +msgid "unable to write to %s" +msgstr "无法写入 %s" + +#: plugins/sudoers/cvtsudoers.c:1314 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - 转换 sudoers 文件格式\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1316 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"选项:\n" +" -b, --base=dn 用于 sudo LDAP 查询的基础 DN\n" +" -d, --defaults=deftypes 只转换指定类型的默认值\n" +" -e, --expand-aliases 在转换时展开别名\n" +" -f, --output-format=format 设置输出格式:JSON、LDIF 或 sudoers\n" +" -i, --input-format=format 设置输入格式:LDIF 或 sudoers\n" +" -I, --increment=num 每个 sudoOrder 的增加量\n" +" -h, --help 显示帮助消息并退出\n" +" -m, --match=filter 只转换与过滤器匹配的条目\n" +" -M, --match-local 让匹配过滤器使用 passwd 和 group 数据库\n" +" -o, --output=output_file 将转换后的 sudoers 写入 output_file\n" +" -O, --order-start=num 第一个 sudoOrder 的起点\n" +" -p, --prune-matches 清理不匹配的用户、组和主机\n" +" -P, --padding=num sudoOrder 的增加基数\n" +" -s, --suppress=sections 压缩某些部分的输出\n" +" -V, --version 显示版本信息并退出" + +#: plugins/sudoers/cvtsudoers_json.c:682 plugins/sudoers/cvtsudoers_json.c:718 +#: plugins/sudoers/cvtsudoers_json.c:936 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "未知的默认条目“%s”" + +#: plugins/sudoers/cvtsudoers_json.c:856 plugins/sudoers/cvtsudoers_json.c:871 +#: plugins/sudoers/cvtsudoers_ldif.c:306 plugins/sudoers/cvtsudoers_ldif.c:317 +#: plugins/sudoers/ldap.c:480 +msgid "unable to get GMT time" +msgstr "无法获取 GMT 时间" + +#: plugins/sudoers/cvtsudoers_json.c:859 plugins/sudoers/cvtsudoers_json.c:874 +#: plugins/sudoers/cvtsudoers_ldif.c:309 plugins/sudoers/cvtsudoers_ldif.c:320 +#: plugins/sudoers/ldap.c:486 +msgid "unable to format timestamp" +msgstr "无法格式化时间戳" + +#: plugins/sudoers/cvtsudoers_ldif.c:524 plugins/sudoers/env.c:309 +#: plugins/sudoers/env.c:316 plugins/sudoers/env.c:421 +#: plugins/sudoers/ldap.c:494 plugins/sudoers/ldap.c:725 +#: plugins/sudoers/ldap.c:1052 plugins/sudoers/ldap_conf.c:225 +#: plugins/sudoers/ldap_conf.c:315 plugins/sudoers/linux_audit.c:87 +#: plugins/sudoers/logging.c:1015 plugins/sudoers/policy.c:623 +#: plugins/sudoers/policy.c:633 plugins/sudoers/prompt.c:166 +#: plugins/sudoers/sudoers.c:845 plugins/sudoers/testsudoers.c:255 +#: plugins/sudoers/toke_util.c:159 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部错误,%s 溢出" + +#: plugins/sudoers/cvtsudoers_ldif.c:593 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "sudoers 条目过多,最多为 %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:636 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "没有设置 SUDOERS_BASE 环境变量,并且没有指定 -b 选项。" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "若使用了 syslog,用于记录日志的 syslog 设施:%s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "用户认证成功时使用的 syslog 优先级:%s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "用户认证不成功时使用的 syslog 优先级:%s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "将 OPT 提示放在独自的行中" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "忽略 $PATH 中的“.”" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "在运行 sudo 时总是发送邮件" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "在用户认证失败时发送邮件" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "在用户不在 sudoers 列表中时发送邮件" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "在用户不在此主机的 sudoers 列表中时发送邮件" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "在用户不允许执行某个命令时发送邮件" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "在用户尝试执行某个命令时发送邮件" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "对每个用户/终端组合使用独立的时间戳" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "在用户第一次运行 sudo 时向他致辞" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "包含 sudo 致辞的文件:%s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "默认要求用户认证" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "root 可以运行 sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "将主机名记录在(非 syslog)的日志文件中" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "将年份记录在(非 syslog)的日志文件中" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "如果不带参数调用 sudo,启动一个 shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "若使用 -s 选项启动 shell,将 $HOME 设为目标用户的主目录" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "总是将 $HOME 设为目标用户的主目录" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "允许收集一些信息,以提供有用的错误消息" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "要求 sudoers 文件中包含完全限定的主机名" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "在用户输入错误密码时对他们进行(玩笑式的)嘲讽" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "只允许拥有终端的用户执行 sudo" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo 将优先考虑 EDITOR 环境变量" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "询问 root 用户的密码而非用户的密码" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "询问 runas_default 用户的密码,而非用户密码" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "询问目标用户的密码,而非用户密码" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "应用目标用户登录类别中的默认设置,如果没有设置的话" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "设置 LOGNAME 和 USER 环境变量" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "只将有效用户 ID 设为目标用户的,而不是实际用户 ID" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "不将组向量初始化为目标用户的" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "日志文件折行的长度(0 则不折行):%u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "认证时间戳延时:%.1f 分钟" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "密码提示延时:%.1f 分钟" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "输入密码的尝试次数:%u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "要使用的 umask,或 0777 使用用户的:0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "日志文件路径:%s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "邮件程序路径:%s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "邮件程序标志:%s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "发送邮件的地址:%s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "接收邮件的地址:%s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "邮件消息的主题行:%s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "密码错误消息:%s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "致辞(lecture)状态文件夹的路径:%s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "认证时间戳文件夹的路径:%s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "认证时间戳的所有者:%s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "此组的用户不要求密码和 PATH:%s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "默认密码提示:%s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "如果设置,密码提示将覆盖各种情况下的系统提示。" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "运行命令的默认用户:%s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "覆盖用户的 $PATH 变量的值:%s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo 所使用的编辑器的路径:%s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "何时为“list”伪命令请求密码:%s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "何时为“verify”伪命令请求密码:%s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "预加载“sudo_noexec”库中包含的哑 exec 函数" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "如果 LDAP 目录有效,是不是忽略本地的 sudoers 文件" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr ">= %d 的文件描述符将会在执行命令前关闭" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "如果设置,用户可以通过 -C 选项覆盖“closefrom”的值" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "允许用户设置任意的环境变量" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "将环境重设为默认的变量集" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "要检查完整性的环境变量:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "要移除的环境变量:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "要保留的环境变量:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "在新的安全环境中使用的 SELinux 角色:%s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "在新的安全环境中使用的 SELinux 类型:%s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 特定环境文件的路径:%s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "受限的 sudo 特定环境文件的路径:%s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "解析 sudoers 时使用的区域设置:%s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "允许 sudo 询问密码,即使它不可见" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "用户在询问密码窗口输入时提供视觉反馈" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "使用不太精确但不访问文件系统的较快通配方法" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers 中指定的 umask 会覆盖用户的,即使它允许的权限更多" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "记录用户在所执行命令中的输入" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "记录所执行命令的输出" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "使用 zlib 压缩 I/O 日志" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "总是在伪终端中运行命令" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "用于非 Unix 组支持的插件:%s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "用于保存输入/输出日志的目录:%s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "用于保存输入/输出日志的文件:%s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "在分配伪终端时向 utmp/utmpx 文件中添加一条记录" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "将 utmp 中的用户设为 runas 用户,而不是调用用户" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "允许权限的集合:%s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "限制权限的集合:%s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "在后台的伪终端上运行命令" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "要使用的 PAM 服务名称:%s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "用于登录 shell 的 PAM 服务名称:%s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "尝试为目标用户建立 PAM 凭据" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "创建一个新的 PAM 会话来运行该命令" + +#: plugins/sudoers/def_data.c:402 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "最大 I/O 日志序列号:%u" + +#: plugins/sudoers/def_data.c:406 +msgid "Enable sudoers netgroup support" +msgstr "启用 support netgroup 支持" + +#: plugins/sudoers/def_data.c:410 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "在使用 sudoedit 编辑文件时检查上级目录是否可写" + +#: plugins/sudoers/def_data.c:414 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "使用 sudoedit 编辑文件时循符号连接(定位到原文件)" + +#: plugins/sudoers/def_data.c:418 +msgid "Query the group plugin for unknown system groups" +msgstr "通过 组 插件查询未知的系统组" + +#: plugins/sudoers/def_data.c:422 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "基于整个元组(用户、主机和域)来匹配网络组" + +#: plugins/sudoers/def_data.c:426 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "即使 sudo 无法写入审核日志也允许命令运行" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "即使 sudo 无法写入 I/O 日志也允许命令运行" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "即使 sudo 无法写入日志文件也允许命令允许" + +#: plugins/sudoers/def_data.c:438 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "解析 sudoers 中的组并与 组 ID (而不是名字) 匹配" + +#: plugins/sudoers/def_data.c:442 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "大于此数值的日志条目会分为多条 syslog 消息:%u" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "将拥有 I/O 日志文件的用户:%s" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "将拥有 I/O 日志文件的组:%s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O 日志文件要使用的文件模式:0%o" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "根据文件描述符执行命令,而非根据路径:%s" + +#: plugins/sudoers/def_data.c:462 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "忽略 sudoers 中未知的 Defaults 条目而非产生警告" + +#: plugins/sudoers/def_data.c:466 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "超过指定时间后终止命令(秒):%u" + +#: plugins/sudoers/def_data.c:470 +msgid "Allow the user to specify a timeout on the command line" +msgstr "允许用户在命令行中指定超时时间" + +#: plugins/sudoers/def_data.c:474 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "立即冲洗(flush) I/O 日志数据而非将其缓存" + +#: plugins/sudoers/def_data.c:478 +msgid "Include the process ID when logging via syslog" +msgstr "通过 syslog 登录时包含进程 ID" + +#: plugins/sudoers/def_data.c:482 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "认证时间戳记录的类型:%s" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Authentication failure message: %s" +msgstr "认证失败消息:%s" + +#: plugins/sudoers/def_data.c:490 +msgid "Ignore case when matching user names" +msgstr "在匹配 用户 名时忽略大小写" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching group names" +msgstr "在匹配 组 名时忽略大小写" + +#: plugins/sudoers/defaults.c:229 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d 未知的默认条目“%s”" + +#: plugins/sudoers/defaults.c:232 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s:未知的默认条目“%s”" + +#: plugins/sudoers/defaults.c:275 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d 没有给“%s”指定值" + +#: plugins/sudoers/defaults.c:278 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s:没有给“%s”指定值" + +#: plugins/sudoers/defaults.c:298 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d “%s”的值必须以“/”开头" + +#: plugins/sudoers/defaults.c:301 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s:“%s”的值必须以“/”开头" + +#: plugins/sudoers/defaults.c:323 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d “%s”选项不带值" + +#: plugins/sudoers/defaults.c:326 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s:“%s”选项不带值" + +#: plugins/sudoers/defaults.c:351 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d 选项“%4$s”的默认类型 0x%3$x 无效" + +#: plugins/sudoers/defaults.c:354 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:选项“%3$s”的默认类型 0x%2$x 无效" + +#: plugins/sudoers/defaults.c:364 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%1$s:%2$d 值“%3$s”对选项“%4$s”无效" + +#: plugins/sudoers/defaults.c:367 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:值“%s”对选项“%s”无效" + +#: plugins/sudoers/env.c:390 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv:envp 损坏,长度不符" + +#: plugins/sudoers/env.c:1111 +msgid "unable to rebuild the environment" +msgstr "无法重建环境" + +#: plugins/sudoers/env.c:1185 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "对不起,您无权设置以下环境变量:%s" + +#: plugins/sudoers/file.c:114 +#, c-format +msgid "parse error in %s near line %d" +msgstr "%s 中第 %d 行附近有解析错误" + +#: plugins/sudoers/file.c:117 +#, c-format +msgid "parse error in %s" +msgstr "%s 中出现解析错误" + +#: plugins/sudoers/filedigest.c:59 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "%2$s 的摘要类型 %1$d 不支持" + +#: plugins/sudoers/filedigest.c:88 +#, c-format +msgid "%s: read error" +msgstr "%s:写错误" + +#: plugins/sudoers/group_plugin.c:88 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必须属于用户 ID %d" + +#: plugins/sudoers/group_plugin.c:92 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s 必须只对所有者可写" + +#: plugins/sudoers/group_plugin.c:100 plugins/sudoers/sssd.c:561 +#, c-format +msgid "unable to load %s: %s" +msgstr "无法加载 %s:%s" + +#: plugins/sudoers/group_plugin.c:106 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "无法在 %s 中找到符号“group_plugin”" + +#: plugins/sudoers/group_plugin.c:111 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s:不兼容的组插件主版本号 %d,应为 %d" + +#: plugins/sudoers/interfaces.c:84 plugins/sudoers/interfaces.c:101 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "无法解析 IP 地址列表“%s”" + +#: plugins/sudoers/interfaces.c:89 plugins/sudoers/interfaces.c:106 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "无法解析网络掩码“%s”" + +#: plugins/sudoers/interfaces.c:134 +msgid "Local IP address and netmask pairs:\n" +msgstr "本地 IP 地址和网络掩码对:\n" + +#: plugins/sudoers/iolog.c:115 plugins/sudoers/mkdir_parents.c:80 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s 存在,但不是目录(0%o)" + +#: plugins/sudoers/iolog.c:140 plugins/sudoers/iolog.c:180 +#: plugins/sudoers/mkdir_parents.c:69 plugins/sudoers/timestamp.c:210 +#, c-format +msgid "unable to mkdir %s" +msgstr "无法创建目录 %s" + +#: plugins/sudoers/iolog.c:184 plugins/sudoers/visudo.c:723 +#: plugins/sudoers/visudo.c:734 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "无法将 %s 的模式更改为 0%o" + +#: plugins/sudoers/iolog.c:292 plugins/sudoers/sudoers.c:1167 +#: plugins/sudoers/testsudoers.c:422 +#, c-format +msgid "unknown group: %s" +msgstr "未知组:%s" + +#: plugins/sudoers/iolog.c:462 plugins/sudoers/sudoers.c:907 +#: plugins/sudoers/sudoreplay.c:840 plugins/sudoers/sudoreplay.c:1536 +#: plugins/sudoers/tsdump.c:143 +#, c-format +msgid "unable to read %s" +msgstr "无法读取 %s" + +#: plugins/sudoers/iolog.c:577 plugins/sudoers/iolog.c:797 +#, c-format +msgid "unable to create %s" +msgstr "无法创建 %s" + +#: plugins/sudoers/iolog.c:820 plugins/sudoers/iolog.c:1035 +#: plugins/sudoers/iolog.c:1111 plugins/sudoers/iolog.c:1205 +#: plugins/sudoers/iolog.c:1265 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "无法写入 I/O 日志文件:%s" + +#: plugins/sudoers/iolog.c:1069 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s:内部错误,事件 %d 的 I/O 日志文件未打开" + +#: plugins/sudoers/iolog.c:1228 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s:内部错误,信号 %d 无效" + +#: plugins/sudoers/iolog_util.c:87 +#, c-format +msgid "%s: invalid log file" +msgstr "%s:无效的日志文件" + +#: plugins/sudoers/iolog_util.c:105 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s:缺少 时间戳 字段" + +#: plugins/sudoers/iolog_util.c:111 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s:时间戳 %s:%s" + +#: plugins/sudoers/iolog_util.c:118 +#, c-format +msgid "%s: user field is missing" +msgstr "%s:缺少 用户 字段" + +#: plugins/sudoers/iolog_util.c:127 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s:缺少 runas 用户 字段" + +#: plugins/sudoers/iolog_util.c:136 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s:缺少 runas 组 字段" + +#: plugins/sudoers/ldap.c:176 plugins/sudoers/ldap_conf.c:294 +msgid "starttls not supported when using ldaps" +msgstr "使用 ldaps 时不支持 starttls" + +#: plugins/sudoers/ldap.c:247 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "无法初始化 SSL 证书和密钥数据库:%s" + +#: plugins/sudoers/ldap.c:250 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "要使用 SSL,您必须在 %s 中设置 TLS_CERT" + +#: plugins/sudoers/ldap.c:1612 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "无法初始化 LDAP:%s" + +#: plugins/sudoers/ldap.c:1648 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "指定了 start_tls,但 LDAP 库不支持 ldap_start_tls_s() 或 ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1785 plugins/sudoers/parse_ldif.c:735 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "无效的 sudoOrder 属性:%s" + +#: plugins/sudoers/ldap_conf.c:203 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports:端口太大" + +#: plugins/sudoers/ldap_conf.c:263 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "不支持的 LDAP URI 类型:%s" + +#: plugins/sudoers/ldap_conf.c:290 +msgid "unable to mix ldap and ldaps URIs" +msgstr "无法混合 ldap 和 ldaps URI" + +#: plugins/sudoers/ldap_util.c:454 plugins/sudoers/ldap_util.c:456 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "无法转换 sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:57 +msgid "unable to open audit system" +msgstr "无法打开审核系统" + +#: plugins/sudoers/linux_audit.c:98 +msgid "unable to send audit message" +msgstr "无法发送审核消息" + +#: plugins/sudoers/logging.c:113 +#, c-format +msgid "%8s : %s" +msgstr "%8s:%s" + +#: plugins/sudoers/logging.c:141 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s:(命令继续执行) %s" + +#: plugins/sudoers/logging.c:170 +#, c-format +msgid "unable to open log file: %s" +msgstr "无法打开日志文件:%s" + +#: plugins/sudoers/logging.c:178 +#, c-format +msgid "unable to lock log file: %s" +msgstr "无法锁定日志文件:%s" + +#: plugins/sudoers/logging.c:211 +#, c-format +msgid "unable to write log file: %s" +msgstr "无法写入日志文件: %s" + +#: plugins/sudoers/logging.c:240 +msgid "No user or host" +msgstr "无用户或主机" + +#: plugins/sudoers/logging.c:242 +msgid "validation failure" +msgstr "校验失败" + +#: plugins/sudoers/logging.c:249 +msgid "user NOT in sudoers" +msgstr "用户不在 sudoers 中" + +#: plugins/sudoers/logging.c:251 +msgid "user NOT authorized on host" +msgstr "用户未获得此主机上的授权" + +#: plugins/sudoers/logging.c:253 +msgid "command not allowed" +msgstr "命令禁止使用" + +#: plugins/sudoers/logging.c:288 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s 不在 sudoers 文件中。此事将被报告。\n" + +#: plugins/sudoers/logging.c:291 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s 无权在 %s 上运行 sudo。此事将被报告。\n" + +#: plugins/sudoers/logging.c:295 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "对不起,用户 %s 不能在 %s 上运行 sudo。\n" + +#: plugins/sudoers/logging.c:298 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "对不起,用户 %1$s 无权以 %5$s%6$s%7$s 的身份在 %8$s 上执行 %2$s%3$s%4$s。\n" + +#: plugins/sudoers/logging.c:335 plugins/sudoers/sudoers.c:438 +#: plugins/sudoers/sudoers.c:440 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:599 +#: plugins/sudoers/sudoers.c:601 +#, c-format +msgid "%s: command not found" +msgstr "%s:找不到命令" + +#: plugins/sudoers/logging.c:337 plugins/sudoers/sudoers.c:434 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"忽略在“.”中找到的“%s”\n" +"请使用“sudo ./%s”,如果这是您想运行的“%s”。" + +#: plugins/sudoers/logging.c:354 +msgid "authentication failure" +msgstr "认证失败" + +#: plugins/sudoers/logging.c:380 +msgid "a password is required" +msgstr "需要密码" + +#: plugins/sudoers/logging.c:443 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 次错误密码尝试" + +#: plugins/sudoers/logging.c:666 +msgid "unable to fork" +msgstr "无法执行 fork" + +#: plugins/sudoers/logging.c:674 plugins/sudoers/logging.c:726 +#, c-format +msgid "unable to fork: %m" +msgstr "无法执行 fork:%m" + +#: plugins/sudoers/logging.c:716 +#, c-format +msgid "unable to open pipe: %m" +msgstr "无法打开管道:%m" + +#: plugins/sudoers/logging.c:741 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "无法 dup stdin:%m" + +#: plugins/sudoers/logging.c:779 +#, c-format +msgid "unable to execute %s: %m" +msgstr "无法执行 %s:%m" + +#: plugins/sudoers/match.c:874 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s(%s) 的摘要不是 %s 形式" + +#: plugins/sudoers/mkdir_parents.c:75 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/visudo.c:421 plugins/sudoers/visudo.c:717 +#, c-format +msgid "unable to stat %s" +msgstr "无法 stat %s" + +#: plugins/sudoers/parse.c:444 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 角色:%s\n" + +#: plugins/sudoers/parse.c:447 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 条目:\n" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAs 用户:" + +#: plugins/sudoers/parse.c:464 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAs 组:" + +#: plugins/sudoers/parse.c:474 +#, c-format +msgid " Options: " +msgstr " 选项:" + +#: plugins/sudoers/parse.c:528 +#, c-format +msgid " Commands:\n" +msgstr " 命令:\n" + +#: plugins/sudoers/parse.c:719 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "匹配 %2$s 上 %1$s 的默认条目:\n" + +#: plugins/sudoers/parse.c:737 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s Runas 和命令特定的默认值:\n" + +#: plugins/sudoers/parse.c:755 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "用户 %s 可以在 %s 上运行以下命令:\n" + +#: plugins/sudoers/parse.c:770 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "用户 %s 无权在 %s 上运行 sudo。\n" + +#: plugins/sudoers/parse_ldif.c:145 +#, c-format +msgid "ignoring invalid attribute value: %s" +msgstr "将忽略无效的属性值:%s" + +#: plugins/sudoers/parse_ldif.c:584 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "将忽略不完整的 sudoRole:cn:%s" + +#: plugins/sudoers/policy.c:88 plugins/sudoers/policy.c:114 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 前端设置了无效的 %.*s" + +#: plugins/sudoers/policy.c:293 plugins/sudoers/testsudoers.c:278 +msgid "unable to parse network address list" +msgstr "无法解析网络地址列表" + +#: plugins/sudoers/policy.c:437 +msgid "user name not set by sudo front-end" +msgstr "用户名未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:441 +msgid "user ID not set by sudo front-end" +msgstr "用户 ID 未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:445 +msgid "group ID not set by sudo front-end" +msgstr "组 ID 未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:449 +msgid "host name not set by sudo front-end" +msgstr "主机名未通过 sudo 前端设置" + +#: plugins/sudoers/policy.c:802 plugins/sudoers/visudo.c:220 +#: plugins/sudoers/visudo.c:851 +#, c-format +msgid "unable to execute %s" +msgstr "无法执行 %s" + +#: plugins/sudoers/policy.c:933 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 策略插件版本 %s\n" + +#: plugins/sudoers/policy.c:935 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 文件语法版本 %d\n" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 路径:%s\n" + +#: plugins/sudoers/policy.c:942 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 路径:%s\n" + +#: plugins/sudoers/policy.c:944 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 路径:%s\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 路径:%s\n" + +#: plugins/sudoers/policy.c:978 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "无法注册类型为 %d 的钩子(hook)(版本 %d.%d)" + +#: plugins/sudoers/pwutil.c:220 plugins/sudoers/pwutil.c:239 +#, c-format +msgid "unable to cache uid %u, out of memory" +msgstr "无法缓存用户 ID %u,内存不足" + +#: plugins/sudoers/pwutil.c:233 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "无法缓存用户 ID %u,已存在" + +#: plugins/sudoers/pwutil.c:293 plugins/sudoers/pwutil.c:311 +#: plugins/sudoers/pwutil.c:373 plugins/sudoers/pwutil.c:418 +#, c-format +msgid "unable to cache user %s, out of memory" +msgstr "无法缓存用户 %s,内存不足" + +#: plugins/sudoers/pwutil.c:306 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "无法缓存用户 %s,已存在" + +#: plugins/sudoers/pwutil.c:537 plugins/sudoers/pwutil.c:556 +#, c-format +msgid "unable to cache gid %u, out of memory" +msgstr "无法缓存组 ID %u,内存不足" + +#: plugins/sudoers/pwutil.c:550 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "无法缓存组 ID %u,已存在" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:669 plugins/sudoers/pwutil.c:711 +#, c-format +msgid "unable to cache group %s, out of memory" +msgstr "无法缓存组 %s,内存不足" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "无法缓存组 %s,已存在" + +#: plugins/sudoers/pwutil.c:837 plugins/sudoers/pwutil.c:889 +#: plugins/sudoers/pwutil.c:940 plugins/sudoers/pwutil.c:993 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "无法缓存组列表 %s,已存在" + +#: plugins/sudoers/pwutil.c:843 plugins/sudoers/pwutil.c:894 +#: plugins/sudoers/pwutil.c:946 plugins/sudoers/pwutil.c:998 +#, c-format +msgid "unable to cache group list for %s, out of memory" +msgstr "无法缓存组列表 %s,内存不足" + +#: plugins/sudoers/pwutil.c:883 +#, c-format +msgid "unable to parse groups for %s" +msgstr "无法对 %s 解析组" + +#: plugins/sudoers/pwutil.c:987 +#, c-format +msgid "unable to parse gids for %s" +msgstr "无法解析 %s 的组 ID" + +#: plugins/sudoers/set_perms.c:118 plugins/sudoers/set_perms.c:474 +#: plugins/sudoers/set_perms.c:917 plugins/sudoers/set_perms.c:1244 +#: plugins/sudoers/set_perms.c:1561 +msgid "perm stack overflow" +msgstr "权限堆栈上溢" + +#: plugins/sudoers/set_perms.c:126 plugins/sudoers/set_perms.c:405 +#: plugins/sudoers/set_perms.c:482 plugins/sudoers/set_perms.c:784 +#: plugins/sudoers/set_perms.c:925 plugins/sudoers/set_perms.c:1168 +#: plugins/sudoers/set_perms.c:1252 plugins/sudoers/set_perms.c:1494 +#: plugins/sudoers/set_perms.c:1569 plugins/sudoers/set_perms.c:1659 +msgid "perm stack underflow" +msgstr "权限堆栈下溢" + +#: plugins/sudoers/set_perms.c:185 plugins/sudoers/set_perms.c:528 +#: plugins/sudoers/set_perms.c:1303 plugins/sudoers/set_perms.c:1601 +msgid "unable to change to root gid" +msgstr "无法切换为 root 组 ID" + +#: plugins/sudoers/set_perms.c:274 plugins/sudoers/set_perms.c:625 +#: plugins/sudoers/set_perms.c:1054 plugins/sudoers/set_perms.c:1380 +msgid "unable to change to runas gid" +msgstr "无法切换为 runas 组 ID" + +#: plugins/sudoers/set_perms.c:279 plugins/sudoers/set_perms.c:630 +#: plugins/sudoers/set_perms.c:1059 plugins/sudoers/set_perms.c:1385 +msgid "unable to set runas group vector" +msgstr "无法设置 runas 组向量" + +#: plugins/sudoers/set_perms.c:290 plugins/sudoers/set_perms.c:641 +#: plugins/sudoers/set_perms.c:1068 plugins/sudoers/set_perms.c:1394 +msgid "unable to change to runas uid" +msgstr "无法切换为 runas 用户 ID" + +#: plugins/sudoers/set_perms.c:308 plugins/sudoers/set_perms.c:659 +#: plugins/sudoers/set_perms.c:1084 plugins/sudoers/set_perms.c:1410 +msgid "unable to change to sudoers gid" +msgstr "无法切换为 sudoers 组 ID" + +#: plugins/sudoers/set_perms.c:392 plugins/sudoers/set_perms.c:771 +#: plugins/sudoers/set_perms.c:1155 plugins/sudoers/set_perms.c:1481 +#: plugins/sudoers/set_perms.c:1646 +msgid "too many processes" +msgstr "进程过多" + +#: plugins/sudoers/solaris_audit.c:56 +msgid "unable to get current working directory" +msgstr "无法获取当前工作目录" + +#: plugins/sudoers/solaris_audit.c:64 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "截断的审核路径 user_cmnd:%s" + +#: plugins/sudoers/solaris_audit.c:71 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "截断的审核路径 argv[0]:%s" + +#: plugins/sudoers/solaris_audit.c:120 +msgid "audit_failure message too long" +msgstr "audit_failure(审核失败)消息过长" + +#: plugins/sudoers/sssd.c:563 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "无法初始化 SSS 资源。您的计算机上安装 SSSD 了吗?" + +#: plugins/sudoers/sssd.c:571 plugins/sudoers/sssd.c:580 +#: plugins/sudoers/sssd.c:589 plugins/sudoers/sssd.c:598 +#: plugins/sudoers/sssd.c:607 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "无法在 %s 中找到符号“%s”" + +#: plugins/sudoers/sudoers.c:208 plugins/sudoers/sudoers.c:864 +msgid "problem with defaults entries" +msgstr "默认条目有问题" + +#: plugins/sudoers/sudoers.c:212 +msgid "no valid sudoers sources found, quitting" +msgstr "没有找到有效的 sudoers 资源,退出" + +#: plugins/sudoers/sudoers.c:250 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers 指定 root 不允许执行 sudo" + +#: plugins/sudoers/sudoers.c:308 +msgid "you are not permitted to use the -C option" +msgstr "您无权使用 -C 选项" + +#: plugins/sudoers/sudoers.c:355 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "时间戳所有者(%s):无此用户" + +#: plugins/sudoers/sudoers.c:370 +msgid "no tty" +msgstr "无终端" + +#: plugins/sudoers/sudoers.c:371 +msgid "sorry, you must have a tty to run sudo" +msgstr "抱歉,您必须拥有一个终端来执行 sudo" + +#: plugins/sudoers/sudoers.c:433 +msgid "command in current directory" +msgstr "当前目录中的命令" + +#: plugins/sudoers/sudoers.c:452 +msgid "sorry, you are not allowed set a command timeout" +msgstr "抱歉,您无权设置超时时间" + +#: plugins/sudoers/sudoers.c:460 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "抱歉,您无权保留环境" + +#: plugins/sudoers/sudoers.c:808 +msgid "command too long" +msgstr "命令过长" + +#: plugins/sudoers/sudoers.c:922 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 不是常规文件" + +#: plugins/sudoers/sudoers.c:926 plugins/sudoers/timestamp.c:257 toke.l:965 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 属于用户 ID %u,应为 %u" + +#: plugins/sudoers/sudoers.c:930 toke.l:970 +#, c-format +msgid "%s is world writable" +msgstr "%s 可被任何人写" + +#: plugins/sudoers/sudoers.c:934 toke.l:973 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s 属于组 ID %u,应为 %u" + +#: plugins/sudoers/sudoers.c:967 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "只有 root 才能使用“-c %s”" + +#: plugins/sudoers/sudoers.c:986 +#, c-format +msgid "unknown login class: %s" +msgstr "未知的登录类别:%s" + +#: plugins/sudoers/sudoers.c:1069 plugins/sudoers/sudoers.c:1083 +#, c-format +msgid "unable to resolve host %s" +msgstr "无法解析主机:%s" + +#: plugins/sudoers/sudoreplay.c:248 +#, c-format +msgid "invalid filter option: %s" +msgstr "无效的过滤器选项:%s" + +#: plugins/sudoers/sudoreplay.c:261 +#, c-format +msgid "invalid max wait: %s" +msgstr "无效的最大等待:%s" + +#: plugins/sudoers/sudoreplay.c:284 +#, c-format +msgid "invalid speed factor: %s" +msgstr "无法的速度系数:%s" + +#: plugins/sudoers/sudoreplay.c:319 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/时序:%s" + +#: plugins/sudoers/sudoreplay.c:325 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/时序:%s" + +#: plugins/sudoers/sudoreplay.c:341 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "回放 sudo 会话:%s" + +#: plugins/sudoers/sudoreplay.c:539 plugins/sudoers/sudoreplay.c:586 +#: plugins/sudoers/sudoreplay.c:783 plugins/sudoers/sudoreplay.c:892 +#: plugins/sudoers/sudoreplay.c:977 plugins/sudoers/sudoreplay.c:992 +#: plugins/sudoers/sudoreplay.c:999 plugins/sudoers/sudoreplay.c:1006 +#: plugins/sudoers/sudoreplay.c:1013 plugins/sudoers/sudoreplay.c:1020 +#: plugins/sudoers/sudoreplay.c:1168 +msgid "unable to add event to queue" +msgstr "无法将事件添加到队列" + +#: plugins/sudoers/sudoreplay.c:654 +msgid "unable to set tty to raw mode" +msgstr "无法将终端设为原始模式" + +#: plugins/sudoers/sudoreplay.c:705 +#, c-format +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告:您的终端尺寸太小,不能正常地回放日志。\n" + +#: plugins/sudoers/sudoreplay.c:706 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "日志的几何尺寸为 %dx%d,您终端的几何尺寸为 %dx%d。" + +#: plugins/sudoers/sudoreplay.c:734 +msgid "Replay finished, press any key to restore the terminal." +msgstr "回放完成,请按任意键返回终端。" + +#: plugins/sudoers/sudoreplay.c:766 +#, c-format +msgid "invalid timing file line: %s" +msgstr "无效的时序文件行:%s" + +#: plugins/sudoers/sudoreplay.c:1202 plugins/sudoers/sudoreplay.c:1227 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "有歧义的表达式“%s”" + +#: plugins/sudoers/sudoreplay.c:1249 +msgid "unmatched ')' in expression" +msgstr "表达式中的“)”不匹配" + +#: plugins/sudoers/sudoreplay.c:1253 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "未知的搜索词“%s”" + +#: plugins/sudoers/sudoreplay.c:1268 +#, c-format +msgid "%s requires an argument" +msgstr "%s 需要参数" + +#: plugins/sudoers/sudoreplay.c:1271 plugins/sudoers/sudoreplay.c:1512 +#, c-format +msgid "invalid regular expression: %s" +msgstr "无效的正则表达式:%s" + +#: plugins/sudoers/sudoreplay.c:1275 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "无法解析日期“%s”" + +#: plugins/sudoers/sudoreplay.c:1284 +msgid "unmatched '(' in expression" +msgstr "表达式中的“(”不匹配" + +#: plugins/sudoers/sudoreplay.c:1286 +msgid "illegal trailing \"or\"" +msgstr "非法的结尾字符“or”" + +#: plugins/sudoers/sudoreplay.c:1288 +msgid "illegal trailing \"!\"" +msgstr "非法的结尾字符“!”" + +#: plugins/sudoers/sudoreplay.c:1338 +#, c-format +msgid "unknown search type %d" +msgstr "未知的搜索类型 %d" + +#: plugins/sudoers/sudoreplay.c:1605 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "用法:%s [-hnRS] [-d 目录] [-m 数值] [-s 数值] ID\n" + +#: plugins/sudoers/sudoreplay.c:1608 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "用法:%s [-h] [-d 目录] -l [搜索表达式]\n" + +#: plugins/sudoers/sudoreplay.c:1617 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - 回放 sudo 会话记录\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1619 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"选项:\n" +" -d, --directory=目录 指定会话日志目录\n" +" -f, --filter=过滤器 指定要显示的 I/O 类型\n" +" -h, --help 显示帮助信息并退出\n" +" -l, --list 列出可用会话 ID,可加表达式限定\n" +" -m, --max-wait=数值 事件间等待的最大秒数\n" +" -S, --suspend-wait 在命令挂起时等待\n" +" -s, --speed=数值 加速或减慢输出\n" +" -V, --version 显示版本信息并退出" + +#: plugins/sudoers/testsudoers.c:360 +msgid "\thost unmatched" +msgstr "\t主机不匹配" + +#: plugins/sudoers/testsudoers.c:363 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"命令允许" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"命令被拒" + +#: plugins/sudoers/testsudoers.c:364 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"命令不匹配" + +#: plugins/sudoers/timestamp.c:265 +#, c-format +msgid "%s is group writable" +msgstr "%s 可被组写" + +#: plugins/sudoers/timestamp.c:341 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "无法将时间戳文件截短为 %lld 字节" + +#: plugins/sudoers/timestamp.c:827 plugins/sudoers/timestamp.c:919 +#: plugins/sudoers/visudo.c:482 plugins/sudoers/visudo.c:488 +msgid "unable to read the clock" +msgstr "无法读取时钟" + +#: plugins/sudoers/timestamp.c:838 +msgid "ignoring time stamp from the future" +msgstr "将忽略超前的时间戳" + +#: plugins/sudoers/timestamp.c:861 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "时间戳太超前:%20.20s" + +#: plugins/sudoers/timestamp.c:983 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "无法锁定时间戳文件 %s" + +#: plugins/sudoers/timestamp.c:1027 plugins/sudoers/timestamp.c:1047 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "致辞(lecture)状态路径过长:%s/%s" + +#: plugins/sudoers/visudo.c:216 +msgid "the -x option will be removed in a future release" +msgstr "未来版本中 -x 选项会移除" + +#: plugins/sudoers/visudo.c:217 +msgid "please consider using the cvtsudoers utility instead" +msgstr "请考虑换用 cvtsudoers 工具" + +#: plugins/sudoers/visudo.c:268 plugins/sudoers/visudo.c:650 +#, c-format +msgid "press return to edit %s: " +msgstr "按回车键编辑 %s:" + +#: plugins/sudoers/visudo.c:329 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定的编辑器(%s)不存在" + +#: plugins/sudoers/visudo.c:331 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "未找到编辑器(编辑器路径 = %s)" + +#: plugins/sudoers/visudo.c:441 plugins/sudoers/visudo.c:449 +msgid "write error" +msgstr "写错误" + +#: plugins/sudoers/visudo.c:495 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "无法 stat 临时文件(%s),%s 未更改" + +#: plugins/sudoers/visudo.c:502 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "零长度的临时文件(%s),%s 未更改" + +#: plugins/sudoers/visudo.c:508 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "编辑器(%s)失败,%s 未更改" + +#: plugins/sudoers/visudo.c:530 +#, c-format +msgid "%s unchanged" +msgstr "%s 未更改" + +#: plugins/sudoers/visudo.c:589 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "无法重新打开临时文件(%s),%s 未更改" + +#: plugins/sudoers/visudo.c:601 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "无法解析临时文件(%s),未知错误" + +#: plugins/sudoers/visudo.c:639 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "内部错误,在列表中找不到 %s!" + +#: plugins/sudoers/visudo.c:719 plugins/sudoers/visudo.c:728 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "无法将 %s 的 (uid, gid) 设为 (%u, %u)" + +#: plugins/sudoers/visudo.c:751 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 和 %s 不在同一个文件系统,使用 mv 进行重命名" + +#: plugins/sudoers/visudo.c:765 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "命令失败:“%s %s %s”,%s 未更改" + +#: plugins/sudoers/visudo.c:775 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "重命名 %s 出错,%s 未更改" + +#: plugins/sudoers/visudo.c:796 +msgid "What now? " +msgstr "现在做什么?" + +#: plugins/sudoers/visudo.c:810 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"选项有:\n" +" 重新编辑 sudoers 文件(e)\n" +" 退出,不保存对 sudoers 文件的更改(x)\n" +" 退出并将更改保存到 sudoers 文件(危险!)(Q)\n" + +#: plugins/sudoers/visudo.c:856 +#, c-format +msgid "unable to run %s" +msgstr "无法运行 %s" + +#: plugins/sudoers/visudo.c:886 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s:错误的所有者(uid, gid),应为 (%u, %u)\n" + +#: plugins/sudoers/visudo.c:893 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s:权限不正确,模式应该是 0%o\n" + +#: plugins/sudoers/visudo.c:950 plugins/sudoers/visudo.c:957 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s:解析正确\n" + +#: plugins/sudoers/visudo.c:976 +#, c-format +msgid "%s busy, try again later" +msgstr "%s 忙,请稍后重试" + +#: plugins/sudoers/visudo.c:979 +#, c-format +msgid "unable to lock %s" +msgstr "无法锁定 %s" + +#: plugins/sudoers/visudo.c:980 +msgid "Edit anyway? [y/N]" +msgstr "仍然编辑?[y/N]" + +#: plugins/sudoers/visudo.c:1064 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "错误:%s:%d 在 %s “%s”中循环" + +#: plugins/sudoers/visudo.c:1065 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "警告:%s:%d 在 %s “%s”中循环" + +#: plugins/sudoers/visudo.c:1069 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "错误:%s:%d 引用了 %s “%s”但尚未定义" + +#: plugins/sudoers/visudo.c:1070 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "警告:%s:%d 引用了 %s “%s”但尚未定义" + +#: plugins/sudoers/visudo.c:1161 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "警告:%s:%d 未使用的 %s “%s”" + +#: plugins/sudoers/visudo.c:1276 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - 安全地编辑 sudoers 文件\n" +"\n" + +#: plugins/sudoers/visudo.c:1278 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"选项:\n" +" -c, --check 纯检查模式\n" +" -f, --file=sudoers 指定 sudoers 文件的位置\n" +" -h, --help 显示帮助信息并退出\n" +" -q, --quiet 较简略(安静)的语法错误信息\n" +" -s, --strict 严格语法检查\n" +" -V, --version 显示版本信息并退出\n" + +#: toke.l:939 +msgid "too many levels of includes" +msgstr "include 嵌套层数过多" + +#~ msgid "" +#~ "\n" +#~ "LDAP Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "LDAP 角色:未知\n" + +#~ msgid " Order: %s\n" +#~ msgstr " 顺序:%s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: %s\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 角色:%s\n" + +#~ msgid "" +#~ "\n" +#~ "SSSD Role: UNKNOWN\n" +#~ msgstr "" +#~ "\n" +#~ "SSSD 角色:未知\n" + +#~ msgid "Warning: cycle in %s `%s'" +#~ msgstr "警告:在 %s “%s”中循环" + +#~ msgid "Warning: %s `%s' referenced but not defined" +#~ msgstr "警告:引用了 %s “%s”但尚未定义" + +#~ msgid "Warning: unused %s `%s'" +#~ msgstr "警告:%s “%s”未使用" + +#~ msgid "unable allocate memory" +#~ msgstr "无法分配内存" + +#~ msgid "timestamp path too long: %s/%s" +#~ msgstr "时间戳路径过长:%s/%s" + +#~ msgid "unable to stat editor (%s)" +#~ msgstr "无法 stat 编辑器(%s)" + +#~ msgid "sudo_ldap_conf_add_ports: out of space expanding hostbuf" +#~ msgstr "sudo_ldap_conf_add_ports:扩展主机缓存时空间不足" + +#~ msgid "sudo_ldap_parse_uri: out of space building hostbuf" +#~ msgstr "sudo_ldap_parse_uri:构建主机缓存时空间不足" + +#~ msgid "sudo_ldap_build_pass1 allocation mismatch" +#~ msgstr "sudo_ldap_build_pass1 分配不匹配" + +#~ msgid "Password:" +#~ msgstr "密码:" + +#~ msgid "internal error: insufficient space for log line" +#~ msgstr "内部错误:没有足够的空间存放日志行" + +#~ msgid "fill_args: buffer overflow" +#~ msgstr "fill_args:缓存溢出" + +#~ msgid "%s owned by uid %u, should be uid %u" +#~ msgstr "%s 属于用户 ID %u,应为用户 ID %u" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0700" +#~ msgstr "%s 对非所有者可写(0%o),模式应该为 0700" + +#~ msgid "%s exists but is not a regular file (0%o)" +#~ msgstr "%s 存在,但不是常规文件(0%o)" + +#~ msgid "%s writable by non-owner (0%o), should be mode 0600" +#~ msgstr "%s 对非所有者可写(0%o),模式应该为 0600" + +#~ msgid "unable to remove %s, will reset to the Unix epoch" +#~ msgstr "无法移除 %s ,将重设为 Unix 戳记" + +#~ msgid "unable to reset %s to the Unix epoch" +#~ msgstr "无法将 %s 重设为 Unix 戳记" + +#~ msgid "value out of range" +#~ msgstr "值超出范围" + +#~ msgid "invalid uri: %s" +#~ msgstr "无效的 URI:%s" + +#~ msgid "unable to mix ldaps and starttls" +#~ msgstr "无法混合 ldaps 和 starttls" + +#~ msgid "writing to standard output" +#~ msgstr "写入标准输出" + +#~ msgid "too many parenthesized expressions, max %d" +#~ msgstr "括号表达式过多,最多 %d" + +#~ msgid "unable to setup authentication" +#~ msgstr "无法设置认证" + +#~ msgid "getaudit: failed" +#~ msgstr "getaudit:失败" + +#~ msgid "getauid: failed" +#~ msgstr "getauid:失败" + +#~ msgid "au_to_subject: failed" +#~ msgstr "au_to_subject:失败" + +#~ msgid "au_to_exec_args: failed" +#~ msgstr "au_to_exec_args:失败" + +#~ msgid "au_to_return32: failed" +#~ msgstr "au_to_return32:失败" + +#~ msgid "au_to_text: failed" +#~ msgstr "au_to_text:失败" + +#~ msgid "nanosleep: tv_sec %ld, tv_nsec %ld" +#~ msgstr "nanosleep:tv_sec %ld,tv_nsec %ld" + +#~ msgid "pam_chauthtok: %s" +#~ msgstr "pam_chauthtok:%s" + +#~ msgid "pam_authenticate: %s" +#~ msgstr "pam_authenticate:%s" + +#~ msgid "getauid failed" +#~ msgstr "getauid 失败" + +#~ msgid "Unable to dlopen %s: %s" +#~ msgstr "无法执行 dlopen %s:%s" + +#~ msgid "invalid regex: %s" +#~ msgstr "无效的正则表达式:%s" + +#~ msgid ">>> %s: %s near line %d <<<" +#~ msgstr ">>> %s:%s 在行 %d 附近<<<" + +#~ msgid "unable to set locale to \"%s\", using \"C\"" +#~ msgstr "无法将区域设置为“%s”,将使用“C”" + +#~ msgid "" +#~ " Commands:\n" +#~ "\t" +#~ msgstr "" +#~ " 命令:\n" +#~ "\t" + +#~ msgid ": " +#~ msgstr ":" + +#~ msgid "unable to cache uid %u (%s), already exists" +#~ msgstr "无法缓存用户 ID %u(%s),已存在" + +#~ msgid "unable to cache gid %u (%s), already exists" +#~ msgstr "无法缓存组 ID %u(%s),已存在" + +#~ msgid "unable to execute %s: %s" +#~ msgstr "无法执行 %s:%s" + +#~ msgid "internal error, expand_prompt() overflow" +#~ msgstr "内部错误,expand_prompt() 溢出" + +#~ msgid "internal error, sudo_setenv2() overflow" +#~ msgstr "内部错误,sudo_setenv2() 溢出" + +#~ msgid "internal error, sudo_setenv() overflow" +#~ msgstr "内部错误,sudo_setenv()溢出" + +#~ msgid "internal error, linux_audit_command() overflow" +#~ msgstr "内部错误,linux_audit_command() 溢出" + +#~ msgid "internal error, runas_groups overflow" +#~ msgstr "内部错误,runas_groups 溢出" + +#~ msgid "internal error, init_vars() overflow" +#~ msgstr "内部错误,init_vars() 溢出" + +#~ msgid "fixed mode on %s" +#~ msgstr "对 %s 修正了模式" + +#~ msgid "set group on %s" +#~ msgstr "对 %s 设置组" + +#~ msgid "unable to fix mode on %s" +#~ msgstr "无法对 %s 修正模式" + +#~ msgid "%s is mode 0%o, should be 0%o" +#~ msgstr "%s 的模式为 0%o,应为 0%o" + +#~ msgid "File containing dummy exec functions: %s" +#~ msgstr "含有哑 exec 函数的文件:%s" + +#~ msgid "" +#~ "Available options in a sudoers ``Defaults'' line:\n" +#~ "\n" +#~ msgstr "" +#~ "sudoers 中“Defaults”行中的可用选项:\n" +#~ "\n" + +#~ msgid "%s: %.*s\n" +#~ msgstr "%s:%.*s\n" + +#~ msgid "unable to get runas group vector" +#~ msgstr "无法获取 runas 组向量" + +#~ msgid "%s: %s_Alias `%s' references self" +#~ msgstr "%s:%s_Alias “%s”引用了自己" diff --git a/utsudo-0.0.2/plugins/sudoers/po/zh_TW.mo b/utsudo-0.0.2/plugins/sudoers/po/zh_TW.mo new file mode 100644 index 0000000000000000000000000000000000000000..0670cfb9f4d574741d73403bb4cfb4974a0c1252 GIT binary patch literal 46422 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 Qcu33xV6KvZq;K&515|JxN&o-= literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/plugins/sudoers/po/zh_TW.po b/utsudo-0.0.2/plugins/sudoers/po/zh_TW.po new file mode 100644 index 0000000..63ff30c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/po/zh_TW.po @@ -0,0 +1,2386 @@ +# Portable object template file for the sudoers plugin +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2018. +# Hugwalk , 2019. +# pan93412 , 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudoers 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 21:17+0800\n" +"Last-Translator: pan93412 \n" +"Language-Team: Chinese (traditional) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 19.08.2\n" + +#: confstr.sh:1 +msgid "syntax error" +msgstr "語法錯誤" + +#: confstr.sh:2 +msgid "%p's password: " +msgstr "%p 的密碼:" + +#: confstr.sh:3 +msgid "[sudo] password for %p: " +msgstr "[sudo] %p 的密碼:" + +#: confstr.sh:4 +msgid "Password: " +msgstr "密碼:" + +#: confstr.sh:5 +msgid "*** SECURITY information for %h ***" +msgstr "*** %h 須知的安全資訊 ***" + +#: confstr.sh:6 +msgid "Sorry, try again." +msgstr "抱歉,請重試。" + +#: gram.y:196 gram.y:244 gram.y:251 gram.y:258 gram.y:265 gram.y:272 +#: gram.y:288 gram.y:312 gram.y:319 gram.y:326 gram.y:333 gram.y:340 +#: gram.y:403 gram.y:412 gram.y:423 gram.y:456 gram.y:463 gram.y:470 +#: gram.y:477 gram.y:559 gram.y:566 gram.y:575 gram.y:584 gram.y:601 +#: gram.y:713 gram.y:720 gram.y:727 gram.y:735 gram.y:835 gram.y:842 +#: gram.y:849 gram.y:856 gram.y:863 gram.y:889 gram.y:896 gram.y:903 +#: gram.y:1026 gram.y:1303 plugins/sudoers/alias.c:132 +#: plugins/sudoers/alias.c:139 plugins/sudoers/alias.c:155 +#: plugins/sudoers/auth/bsdauth.c:148 plugins/sudoers/auth/kerb5.c:123 +#: plugins/sudoers/auth/kerb5.c:149 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/auth/sia.c:64 +#: plugins/sudoers/cvtsudoers.c:124 plugins/sudoers/cvtsudoers.c:165 +#: plugins/sudoers/cvtsudoers.c:182 plugins/sudoers/cvtsudoers.c:193 +#: plugins/sudoers/cvtsudoers.c:305 plugins/sudoers/cvtsudoers.c:433 +#: plugins/sudoers/cvtsudoers.c:566 plugins/sudoers/cvtsudoers.c:583 +#: plugins/sudoers/cvtsudoers.c:646 plugins/sudoers/cvtsudoers.c:761 +#: plugins/sudoers/cvtsudoers.c:769 plugins/sudoers/cvtsudoers.c:1179 +#: plugins/sudoers/cvtsudoers.c:1183 plugins/sudoers/cvtsudoers.c:1285 +#: plugins/sudoers/cvtsudoers_ldif.c:154 plugins/sudoers/cvtsudoers_ldif.c:197 +#: plugins/sudoers/cvtsudoers_ldif.c:244 plugins/sudoers/cvtsudoers_ldif.c:263 +#: plugins/sudoers/cvtsudoers_ldif.c:334 plugins/sudoers/cvtsudoers_ldif.c:389 +#: plugins/sudoers/cvtsudoers_ldif.c:397 plugins/sudoers/cvtsudoers_ldif.c:414 +#: plugins/sudoers/cvtsudoers_ldif.c:423 plugins/sudoers/cvtsudoers_ldif.c:570 +#: plugins/sudoers/defaults.c:666 plugins/sudoers/defaults.c:959 +#: plugins/sudoers/defaults.c:1130 plugins/sudoers/editor.c:72 +#: plugins/sudoers/editor.c:90 plugins/sudoers/editor.c:101 +#: plugins/sudoers/env.c:268 plugins/sudoers/filedigest.c:66 +#: plugins/sudoers/filedigest.c:82 plugins/sudoers/gc.c:59 +#: plugins/sudoers/group_plugin.c:138 plugins/sudoers/interfaces.c:78 +#: plugins/sudoers/iolog.c:943 plugins/sudoers/iolog_path.c:174 +#: plugins/sudoers/iolog_util.c:86 plugins/sudoers/iolog_util.c:125 +#: plugins/sudoers/iolog_util.c:134 plugins/sudoers/iolog_util.c:144 +#: plugins/sudoers/iolog_util.c:152 plugins/sudoers/iolog_util.c:156 +#: plugins/sudoers/ldap.c:185 plugins/sudoers/ldap.c:416 +#: plugins/sudoers/ldap.c:420 plugins/sudoers/ldap.c:432 +#: plugins/sudoers/ldap.c:723 plugins/sudoers/ldap.c:887 +#: plugins/sudoers/ldap.c:1241 plugins/sudoers/ldap.c:1668 +#: plugins/sudoers/ldap.c:1705 plugins/sudoers/ldap.c:1786 +#: plugins/sudoers/ldap.c:1921 plugins/sudoers/ldap.c:2022 +#: plugins/sudoers/ldap.c:2038 plugins/sudoers/ldap_conf.c:223 +#: plugins/sudoers/ldap_conf.c:254 plugins/sudoers/ldap_conf.c:306 +#: plugins/sudoers/ldap_conf.c:342 plugins/sudoers/ldap_conf.c:446 +#: plugins/sudoers/ldap_conf.c:461 plugins/sudoers/ldap_conf.c:558 +#: plugins/sudoers/ldap_conf.c:591 plugins/sudoers/ldap_conf.c:683 +#: plugins/sudoers/ldap_conf.c:765 plugins/sudoers/ldap_util.c:510 +#: plugins/sudoers/ldap_util.c:567 plugins/sudoers/linux_audit.c:83 +#: plugins/sudoers/logging.c:202 plugins/sudoers/logging.c:532 +#: plugins/sudoers/logging.c:558 plugins/sudoers/logging.c:599 +#: plugins/sudoers/logging.c:740 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:249 plugins/sudoers/match_command.c:367 +#: plugins/sudoers/match_command.c:414 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:200 +#: plugins/sudoers/parse.c:212 plugins/sudoers/parse.c:227 +#: plugins/sudoers/parse.c:239 plugins/sudoers/parse_ldif.c:156 +#: plugins/sudoers/parse_ldif.c:187 plugins/sudoers/parse_ldif.c:256 +#: plugins/sudoers/parse_ldif.c:263 plugins/sudoers/parse_ldif.c:268 +#: plugins/sudoers/parse_ldif.c:344 plugins/sudoers/parse_ldif.c:355 +#: plugins/sudoers/parse_ldif.c:361 plugins/sudoers/parse_ldif.c:386 +#: plugins/sudoers/parse_ldif.c:398 plugins/sudoers/parse_ldif.c:402 +#: plugins/sudoers/parse_ldif.c:416 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:614 plugins/sudoers/parse_ldif.c:639 +#: plugins/sudoers/parse_ldif.c:697 plugins/sudoers/parse_ldif.c:714 +#: plugins/sudoers/parse_ldif.c:742 plugins/sudoers/parse_ldif.c:749 +#: plugins/sudoers/policy.c:504 plugins/sudoers/policy.c:750 +#: plugins/sudoers/prompt.c:100 plugins/sudoers/pwutil.c:199 +#: plugins/sudoers/pwutil.c:270 plugins/sudoers/pwutil.c:348 +#: plugins/sudoers/pwutil.c:522 plugins/sudoers/pwutil.c:586 +#: plugins/sudoers/pwutil.c:657 plugins/sudoers/pwutil.c:816 +#: plugins/sudoers/pwutil.c:873 plugins/sudoers/pwutil.c:917 +#: plugins/sudoers/pwutil.c:975 plugins/sudoers/sssd.c:154 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:114 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +msgid "unable to allocate memory" +msgstr "無法分配記憶體" + +#: gram.y:488 +msgid "a digest requires a path name" +msgstr "摘要需要路徑名稱" + +#: gram.y:614 +msgid "invalid notbefore value" +msgstr "notbefore 的值無效" + +#: gram.y:622 +msgid "invalid notafter value" +msgstr "notafter 的值無效" + +#: gram.y:631 plugins/sudoers/policy.c:320 +msgid "timeout value too large" +msgstr "timeout 值過長" + +#: gram.y:633 plugins/sudoers/policy.c:322 +msgid "invalid timeout value" +msgstr "timeout 值無效" + +#: gram.y:1303 plugins/sudoers/auth/pam.c:483 plugins/sudoers/auth/pam.c:670 +#: plugins/sudoers/auth/rfc1938.c:116 plugins/sudoers/cvtsudoers.c:124 +#: plugins/sudoers/cvtsudoers.c:164 plugins/sudoers/cvtsudoers.c:181 +#: plugins/sudoers/cvtsudoers.c:192 plugins/sudoers/cvtsudoers.c:304 +#: plugins/sudoers/cvtsudoers.c:432 plugins/sudoers/cvtsudoers.c:565 +#: plugins/sudoers/cvtsudoers.c:582 plugins/sudoers/cvtsudoers.c:646 +#: plugins/sudoers/cvtsudoers.c:761 plugins/sudoers/cvtsudoers.c:768 +#: plugins/sudoers/cvtsudoers.c:1179 plugins/sudoers/cvtsudoers.c:1183 +#: plugins/sudoers/cvtsudoers.c:1285 plugins/sudoers/cvtsudoers_ldif.c:153 +#: plugins/sudoers/cvtsudoers_ldif.c:196 plugins/sudoers/cvtsudoers_ldif.c:243 +#: plugins/sudoers/cvtsudoers_ldif.c:262 plugins/sudoers/cvtsudoers_ldif.c:333 +#: plugins/sudoers/cvtsudoers_ldif.c:388 plugins/sudoers/cvtsudoers_ldif.c:396 +#: plugins/sudoers/cvtsudoers_ldif.c:413 plugins/sudoers/cvtsudoers_ldif.c:422 +#: plugins/sudoers/cvtsudoers_ldif.c:569 plugins/sudoers/defaults.c:666 +#: plugins/sudoers/defaults.c:959 plugins/sudoers/defaults.c:1130 +#: plugins/sudoers/editor.c:72 plugins/sudoers/editor.c:90 +#: plugins/sudoers/editor.c:101 plugins/sudoers/env.c:268 +#: plugins/sudoers/filedigest.c:66 plugins/sudoers/filedigest.c:82 +#: plugins/sudoers/gc.c:59 plugins/sudoers/group_plugin.c:138 +#: plugins/sudoers/interfaces.c:78 plugins/sudoers/iolog.c:943 +#: plugins/sudoers/iolog_path.c:174 plugins/sudoers/iolog_util.c:86 +#: plugins/sudoers/iolog_util.c:125 plugins/sudoers/iolog_util.c:134 +#: plugins/sudoers/iolog_util.c:144 plugins/sudoers/iolog_util.c:152 +#: plugins/sudoers/iolog_util.c:156 plugins/sudoers/ldap.c:185 +#: plugins/sudoers/ldap.c:416 plugins/sudoers/ldap.c:420 +#: plugins/sudoers/ldap.c:432 plugins/sudoers/ldap.c:723 +#: plugins/sudoers/ldap.c:887 plugins/sudoers/ldap.c:1241 +#: plugins/sudoers/ldap.c:1668 plugins/sudoers/ldap.c:1705 +#: plugins/sudoers/ldap.c:1786 plugins/sudoers/ldap.c:1921 +#: plugins/sudoers/ldap.c:2022 plugins/sudoers/ldap.c:2038 +#: plugins/sudoers/ldap_conf.c:223 plugins/sudoers/ldap_conf.c:254 +#: plugins/sudoers/ldap_conf.c:306 plugins/sudoers/ldap_conf.c:342 +#: plugins/sudoers/ldap_conf.c:446 plugins/sudoers/ldap_conf.c:461 +#: plugins/sudoers/ldap_conf.c:558 plugins/sudoers/ldap_conf.c:591 +#: plugins/sudoers/ldap_conf.c:682 plugins/sudoers/ldap_conf.c:765 +#: plugins/sudoers/ldap_util.c:510 plugins/sudoers/ldap_util.c:567 +#: plugins/sudoers/linux_audit.c:83 plugins/sudoers/logging.c:202 +#: plugins/sudoers/logging.c:532 plugins/sudoers/logging.c:558 +#: plugins/sudoers/logging.c:598 plugins/sudoers/logging.c:1100 +#: plugins/sudoers/match_command.c:248 plugins/sudoers/match_command.c:366 +#: plugins/sudoers/match_command.c:413 plugins/sudoers/match_command.c:485 +#: plugins/sudoers/match_digest.c:70 plugins/sudoers/parse.c:199 +#: plugins/sudoers/parse.c:211 plugins/sudoers/parse.c:226 +#: plugins/sudoers/parse.c:238 plugins/sudoers/parse_ldif.c:155 +#: plugins/sudoers/parse_ldif.c:186 plugins/sudoers/parse_ldif.c:255 +#: plugins/sudoers/parse_ldif.c:262 plugins/sudoers/parse_ldif.c:267 +#: plugins/sudoers/parse_ldif.c:343 plugins/sudoers/parse_ldif.c:354 +#: plugins/sudoers/parse_ldif.c:360 plugins/sudoers/parse_ldif.c:385 +#: plugins/sudoers/parse_ldif.c:397 plugins/sudoers/parse_ldif.c:401 +#: plugins/sudoers/parse_ldif.c:415 plugins/sudoers/parse_ldif.c:584 +#: plugins/sudoers/parse_ldif.c:613 plugins/sudoers/parse_ldif.c:638 +#: plugins/sudoers/parse_ldif.c:696 plugins/sudoers/parse_ldif.c:713 +#: plugins/sudoers/parse_ldif.c:741 plugins/sudoers/parse_ldif.c:748 +#: plugins/sudoers/policy.c:134 plugins/sudoers/policy.c:143 +#: plugins/sudoers/policy.c:152 plugins/sudoers/policy.c:178 +#: plugins/sudoers/policy.c:305 plugins/sudoers/policy.c:320 +#: plugins/sudoers/policy.c:322 plugins/sudoers/policy.c:348 +#: plugins/sudoers/policy.c:358 plugins/sudoers/policy.c:402 +#: plugins/sudoers/policy.c:412 plugins/sudoers/policy.c:421 +#: plugins/sudoers/policy.c:430 plugins/sudoers/policy.c:504 +#: plugins/sudoers/policy.c:750 plugins/sudoers/prompt.c:100 +#: plugins/sudoers/pwutil.c:199 plugins/sudoers/pwutil.c:270 +#: plugins/sudoers/pwutil.c:348 plugins/sudoers/pwutil.c:522 +#: plugins/sudoers/pwutil.c:586 plugins/sudoers/pwutil.c:657 +#: plugins/sudoers/pwutil.c:816 plugins/sudoers/pwutil.c:873 +#: plugins/sudoers/pwutil.c:917 plugins/sudoers/pwutil.c:975 +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 plugins/sudoers/sssd.c:153 +#: plugins/sudoers/sssd.c:400 plugins/sudoers/sssd.c:463 +#: plugins/sudoers/sssd.c:507 plugins/sudoers/sssd.c:554 +#: plugins/sudoers/sssd.c:746 plugins/sudoers/stubs.c:103 +#: plugins/sudoers/stubs.c:111 plugins/sudoers/sudoers.c:273 +#: plugins/sudoers/sudoers.c:283 plugins/sudoers/sudoers.c:292 +#: plugins/sudoers/sudoers.c:334 plugins/sudoers/sudoers.c:657 +#: plugins/sudoers/sudoers.c:786 plugins/sudoers/sudoers.c:830 +#: plugins/sudoers/sudoers.c:1124 plugins/sudoers/sudoers_debug.c:113 +#: plugins/sudoers/sudoreplay.c:584 plugins/sudoers/sudoreplay.c:587 +#: plugins/sudoers/sudoreplay.c:1265 plugins/sudoers/sudoreplay.c:1465 +#: plugins/sudoers/sudoreplay.c:1469 plugins/sudoers/testsudoers.c:136 +#: plugins/sudoers/testsudoers.c:236 plugins/sudoers/testsudoers.c:253 +#: plugins/sudoers/testsudoers.c:587 plugins/sudoers/timestamp.c:439 +#: plugins/sudoers/timestamp.c:483 plugins/sudoers/timestamp.c:960 +#: plugins/sudoers/toke_util.c:59 plugins/sudoers/toke_util.c:112 +#: plugins/sudoers/toke_util.c:149 plugins/sudoers/tsdump.c:130 +#: plugins/sudoers/visudo.c:152 plugins/sudoers/visudo.c:328 +#: plugins/sudoers/visudo.c:334 plugins/sudoers/visudo.c:444 +#: plugins/sudoers/visudo.c:622 plugins/sudoers/visudo.c:942 +#: plugins/sudoers/visudo.c:1029 plugins/sudoers/visudo.c:1118 toke.l:846 +#: toke.l:947 toke.l:1104 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: plugins/sudoers/alias.c:151 +#, c-format +msgid "Alias \"%s\" already defined" +msgstr "別名「%s」已定義過" + +#: plugins/sudoers/auth/aix_auth.c:203 plugins/sudoers/logging.c:801 +msgid "unable to fork" +msgstr "無法執行 fork" + +#: plugins/sudoers/auth/aix_auth.c:283 +#, c-format +msgid "unable to change password for %s" +msgstr "無法變更 %s 的密碼" + +#: plugins/sudoers/auth/bsdauth.c:75 +#, c-format +msgid "unable to get login class for user %s" +msgstr "無法取得使用者 %s 的登入類別" + +#: plugins/sudoers/auth/bsdauth.c:80 +msgid "unable to begin bsd authentication" +msgstr "無法開始進行 BSD 認證" + +#: plugins/sudoers/auth/bsdauth.c:88 +msgid "invalid authentication type" +msgstr "無效的認證類型" + +#: plugins/sudoers/auth/bsdauth.c:97 +msgid "unable to initialize BSD authentication" +msgstr "無法初始化 BSD 認證程序" + +#: plugins/sudoers/auth/bsdauth.c:185 +msgid "your account has expired" +msgstr "您的帳號已經過期" + +#: plugins/sudoers/auth/bsdauth.c:187 +msgid "approval failed" +msgstr "核可失敗" + +#: plugins/sudoers/auth/fwtk.c:59 +msgid "unable to read fwtk config" +msgstr "無法讀取 fwtk 組態設定" + +#: plugins/sudoers/auth/fwtk.c:64 +msgid "unable to connect to authentication server" +msgstr "無法連線到認證伺服器" + +#: plugins/sudoers/auth/fwtk.c:70 plugins/sudoers/auth/fwtk.c:94 +#: plugins/sudoers/auth/fwtk.c:126 +msgid "lost connection to authentication server" +msgstr "失去對認證伺服器的連線" + +#: plugins/sudoers/auth/fwtk.c:74 +#, c-format +msgid "" +"authentication server error:\n" +"%s" +msgstr "" +"認證伺服器發生錯誤:\n" +"%s" + +#: plugins/sudoers/auth/kerb5.c:115 +#, c-format +msgid "%s: unable to convert principal to string ('%s'): %s" +msgstr "%s:無法將主體轉換成字串 ('%s'):%s" + +#: plugins/sudoers/auth/kerb5.c:165 +#, c-format +msgid "%s: unable to parse '%s': %s" +msgstr "%s:無法解析「%s」:%s" + +#: plugins/sudoers/auth/kerb5.c:174 +#, c-format +msgid "%s: unable to resolve credential cache: %s" +msgstr "%s:無法解析憑證快取:%s" + +#: plugins/sudoers/auth/kerb5.c:221 +#, c-format +msgid "%s: unable to allocate options: %s" +msgstr "%s:無法分配選項:%s" + +#: plugins/sudoers/auth/kerb5.c:236 +#, c-format +msgid "%s: unable to get credentials: %s" +msgstr "%s:無法取得憑證:%s" + +#: plugins/sudoers/auth/kerb5.c:249 +#, c-format +msgid "%s: unable to initialize credential cache: %s" +msgstr "%s:無法初始化憑證快取:%s" + +#: plugins/sudoers/auth/kerb5.c:252 +#, c-format +msgid "%s: unable to store credential in cache: %s" +msgstr "%s:無法將憑證儲存於快取:%s" + +#: plugins/sudoers/auth/kerb5.c:316 +#, c-format +msgid "%s: unable to get host principal: %s" +msgstr "%s:無法取得主機主體:%s" + +#: plugins/sudoers/auth/kerb5.c:330 +#, c-format +msgid "%s: Cannot verify TGT! Possible attack!: %s" +msgstr "%s:無法驗證 TGT!可能發生攻擊事件!:%s" + +#: plugins/sudoers/auth/pam.c:223 +#, c-format +msgid "unable to initialize PAM: %s" +msgstr "無法初始化 PAM:%s" + +#: plugins/sudoers/auth/pam.c:319 +#, c-format +msgid "PAM authentication error: %s" +msgstr "PAM 認證發生錯誤:%s" + +#: plugins/sudoers/auth/pam.c:338 +msgid "account validation failure, is your account locked?" +msgstr "檢查帳號有效性失敗,請檢查您的帳號是否被鎖定。" + +#: plugins/sudoers/auth/pam.c:349 +msgid "Account or password is expired, reset your password and try again" +msgstr "帳號或密碼已標為過期,請重設密碼後重試" + +#: plugins/sudoers/auth/pam.c:355 +#, c-format +msgid "unable to change expired password: %s" +msgstr "無法變更已過期密碼:%s" + +#: plugins/sudoers/auth/pam.c:366 +msgid "Password expired, contact your system administrator" +msgstr "密碼已標為過期,請聯絡您的系統管理員" + +#: plugins/sudoers/auth/pam.c:371 +msgid "Account expired or PAM config lacks an \"account\" section for sudo, contact your system administrator" +msgstr "帳號已過期或是 PAM 組態設定缺少 sudo 的 \"account\" 部份,請聯絡您的系統管理員" + +#: plugins/sudoers/auth/pam.c:379 plugins/sudoers/auth/pam.c:384 +#, c-format +msgid "PAM account management error: %s" +msgstr "PAM 帳號管理發生錯誤:%s" + +#: plugins/sudoers/auth/rfc1938.c:104 plugins/sudoers/visudo.c:248 +#, c-format +msgid "you do not exist in the %s database" +msgstr "您不在 %s 資料庫中" + +#: plugins/sudoers/auth/securid5.c:77 +msgid "failed to initialise the ACE API library" +msgstr "無法初始化 ACE API 函式庫" + +#: plugins/sudoers/auth/securid5.c:103 +msgid "unable to contact the SecurID server" +msgstr "無法聯繫 SecurID 伺服器" + +#: plugins/sudoers/auth/securid5.c:112 +msgid "User ID locked for SecurID Authentication" +msgstr "用於 SecurID 認證的使用者 ID 已被鎖定" + +#: plugins/sudoers/auth/securid5.c:116 plugins/sudoers/auth/securid5.c:167 +msgid "invalid username length for SecurID" +msgstr "用於 SecurID 的使用者名稱長度無效" + +#: plugins/sudoers/auth/securid5.c:120 plugins/sudoers/auth/securid5.c:172 +msgid "invalid Authentication Handle for SecurID" +msgstr "用於 SecurID 的認證處理無效" + +#: plugins/sudoers/auth/securid5.c:124 +msgid "SecurID communication failed" +msgstr "SecurID 通訊失敗" + +#: plugins/sudoers/auth/securid5.c:128 plugins/sudoers/auth/securid5.c:217 +msgid "unknown SecurID error" +msgstr "未知 SecurID 錯誤" + +#: plugins/sudoers/auth/securid5.c:162 +msgid "invalid passcode length for SecurID" +msgstr "用於 SecurID 的密碼長度無效" + +#: plugins/sudoers/auth/sia.c:74 plugins/sudoers/auth/sia.c:129 +msgid "unable to initialize SIA session" +msgstr "無法初始化 SIA 工作階段" + +#: plugins/sudoers/auth/sudo_auth.c:138 +msgid "invalid authentication methods" +msgstr "無效的認證方式" + +#: plugins/sudoers/auth/sudo_auth.c:140 +msgid "Invalid authentication methods compiled into sudo! You may not mix standalone and non-standalone authentication." +msgstr "sudo 被編譯進無效的認證方式!您不能混合獨立及非獨立認證方式。" + +#: plugins/sudoers/auth/sudo_auth.c:261 plugins/sudoers/auth/sudo_auth.c:311 +msgid "no authentication methods" +msgstr "沒有認證方式" + +#: plugins/sudoers/auth/sudo_auth.c:263 +msgid "There are no authentication methods compiled into sudo! If you want to turn off authentication, use the --disable-authentication configure option." +msgstr "沒有編譯進 sudo 的認證方式!若要關閉認證功能,請使用 --disable-authentication 設定選項。" + +#: plugins/sudoers/auth/sudo_auth.c:313 +msgid "Unable to initialize authentication methods." +msgstr "無法初始化認證方式。" + +#: plugins/sudoers/auth/sudo_auth.c:479 +msgid "Authentication methods:" +msgstr "認證方式:" + +#: plugins/sudoers/bsm_audit.c:125 plugins/sudoers/bsm_audit.c:217 +msgid "Could not determine audit condition" +msgstr "無法確定稽核條件" + +#: plugins/sudoers/bsm_audit.c:190 plugins/sudoers/bsm_audit.c:281 +msgid "unable to commit audit record" +msgstr "無法提交稽核記錄" + +#: plugins/sudoers/check.c:269 +msgid "" +"\n" +"We trust you have received the usual lecture from the local System\n" +"Administrator. It usually boils down to these three things:\n" +"\n" +" #1) Respect the privacy of others.\n" +" #2) Think before you type.\n" +" #3) With great power comes great responsibility.\n" +"\n" +msgstr "" +"\n" +"我們相信您已經從本機系統管理員取得\n" +"日常注意事項。注意事項通常可以歸結為三件事情:\n" +"\n" +" #1) 尊重他人隱私。\n" +" #2) 輸入指令前先三思。\n" +" #3) 權力越大則責任越大。\n" +"\n" + +#: plugins/sudoers/check.c:312 plugins/sudoers/check.c:322 +#: plugins/sudoers/sudoers.c:700 plugins/sudoers/sudoers.c:748 +#: plugins/sudoers/tsdump.c:126 +#, c-format +msgid "unknown uid: %u" +msgstr "未知 UID:%u" + +#: plugins/sudoers/check.c:317 plugins/sudoers/iolog.c:255 +#: plugins/sudoers/policy.c:921 plugins/sudoers/sudoers.c:1163 +#: plugins/sudoers/testsudoers.c:227 plugins/sudoers/testsudoers.c:400 +#, c-format +msgid "unknown user: %s" +msgstr "未知使用者:%s" + +#: plugins/sudoers/cvtsudoers.c:199 +#, c-format +msgid "order increment: %s: %s" +msgstr "新增順序:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:215 +#, c-format +msgid "starting order: %s: %s" +msgstr "順序開頭:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:225 +#, c-format +msgid "order padding: %s: %s" +msgstr "順序間距:%s:%s" + +#: plugins/sudoers/cvtsudoers.c:233 plugins/sudoers/sudoreplay.c:289 +#: plugins/sudoers/visudo.c:184 +#, c-format +msgid "%s version %s\n" +msgstr "%s 版本 %s\n" + +#: plugins/sudoers/cvtsudoers.c:235 plugins/sudoers/visudo.c:186 +#, c-format +msgid "%s grammar version %d\n" +msgstr "%s 語法版本 %d\n" + +#: plugins/sudoers/cvtsudoers.c:252 plugins/sudoers/testsudoers.c:175 +#, c-format +msgid "unsupported input format %s" +msgstr "不支援的輸入格式 %s" + +#: plugins/sudoers/cvtsudoers.c:267 +#, c-format +msgid "unsupported output format %s" +msgstr "不支援的輸出格式 %s" + +#: plugins/sudoers/cvtsudoers.c:319 +#, c-format +msgid "%s: input and output files must be different" +msgstr "%s:輸入及輸出檔案必須不一致" + +#: plugins/sudoers/cvtsudoers.c:335 plugins/sudoers/sudoers.c:176 +#: plugins/sudoers/testsudoers.c:266 plugins/sudoers/visudo.c:254 +#: plugins/sudoers/visudo.c:610 plugins/sudoers/visudo.c:933 +msgid "unable to initialize sudoers default values" +msgstr "無法初始化 sudoers 預設值" + +#: plugins/sudoers/cvtsudoers.c:421 plugins/sudoers/ldap_conf.c:436 +#, c-format +msgid "%s: %s: %s: %s" +msgstr "%s: %s: %s: %s" + +#: plugins/sudoers/cvtsudoers.c:480 +#, c-format +msgid "%s: unknown key word: %s" +msgstr "%s:關鍵詞未知:%s" + +#: plugins/sudoers/cvtsudoers.c:526 +#, c-format +msgid "invalid defaults type: %s" +msgstr "預設類型無效:%s" + +#: plugins/sudoers/cvtsudoers.c:549 +#, c-format +msgid "invalid suppression type: %s" +msgstr "隱藏類型無效:%s" + +#: plugins/sudoers/cvtsudoers.c:589 plugins/sudoers/cvtsudoers.c:603 +#, c-format +msgid "invalid filter: %s" +msgstr "篩選器無效:%s" + +#: plugins/sudoers/cvtsudoers.c:622 plugins/sudoers/cvtsudoers.c:639 +#: plugins/sudoers/cvtsudoers.c:1245 plugins/sudoers/cvtsudoers_json.c:1130 +#: plugins/sudoers/cvtsudoers_ldif.c:643 plugins/sudoers/iolog.c:413 +#: plugins/sudoers/iolog_util.c:75 plugins/sudoers/sudoers.c:914 +#: plugins/sudoers/sudoreplay.c:338 plugins/sudoers/sudoreplay.c:1431 +#: plugins/sudoers/timestamp.c:448 plugins/sudoers/tsdump.c:135 +#: plugins/sudoers/visudo.c:929 +#, c-format +msgid "unable to open %s" +msgstr "無法開啟 %s" + +#: plugins/sudoers/cvtsudoers.c:642 plugins/sudoers/visudo.c:938 +#, c-format +msgid "failed to parse %s file, unknown error" +msgstr "無法解析 %s 檔案,原因:未知錯誤" + +#: plugins/sudoers/cvtsudoers.c:650 plugins/sudoers/visudo.c:955 +#, c-format +msgid "parse error in %s near line %d\n" +msgstr "因接近行 %2$d 的 %1$s 字串而導致解析錯誤\n" + +#: plugins/sudoers/cvtsudoers.c:653 plugins/sudoers/visudo.c:958 +#, c-format +msgid "parse error in %s\n" +msgstr "因 %s 導致解析錯誤\n" + +#: plugins/sudoers/cvtsudoers.c:1292 plugins/sudoers/iolog.c:500 +#: plugins/sudoers/sudoreplay.c:1135 plugins/sudoers/timestamp.c:332 +#: plugins/sudoers/timestamp.c:335 +#, c-format +msgid "unable to write to %s" +msgstr "無法寫入 %s" + +#: plugins/sudoers/cvtsudoers.c:1315 +#, c-format +msgid "" +"%s - convert between sudoers file formats\n" +"\n" +msgstr "" +"%s - 轉換 sudoers 檔案之間的格式\n" +"\n" + +#: plugins/sudoers/cvtsudoers.c:1317 +msgid "" +"\n" +"Options:\n" +" -b, --base=dn the base DN for sudo LDAP queries\n" +" -c, --config=conf_file the path to the configuration file\n" +" -d, --defaults=deftypes only convert Defaults of the specified types\n" +" -e, --expand-aliases expand aliases when converting\n" +" -f, --output-format=format set output format: JSON, LDIF or sudoers\n" +" -i, --input-format=format set input format: LDIF or sudoers\n" +" -I, --increment=num amount to increase each sudoOrder by\n" +" -h, --help display help message and exit\n" +" -m, --match=filter only convert entries that match the filter\n" +" -M, --match-local match filter uses passwd and group databases\n" +" -o, --output=output_file write converted sudoers to output_file\n" +" -O, --order-start=num starting point for first sudoOrder\n" +" -p, --prune-matches prune non-matching users, groups and hosts\n" +" -P, --padding=num base padding for sudoOrder increment\n" +" -s, --suppress=sections suppress output of certain sections\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"選項:\n" +" -b, --base=dn 用於 sudo LDAP 查詢的基礎 DN\n" +" -c, --config=設定檔 組態設定檔的路徑\n" +" -d, --defaults=deftypes 只轉換指定類型的預設值\n" +" -e, --expand-aliases 在轉換時展開別名\n" +" -f, --output-format=格式 設定輸出格式:JSON、LDIF 或 sudoers\n" +" -i, --input-format=格式 設定輸入格式:LDIF 或 sudoers\n" +" -I, --increment=量 每個 sudoOrder 的增加量\n" +" -h, --help 顯示說明訊息後退出\n" +" -m, --match=篩選器 只轉換符合過濾器的條目\n" +" -M, --match-local 符合使用 passwd 和群組資料庫的篩選器\n" +" -o, --output=輸出檔 將轉換後的 sudoers 寫入 <輸出檔>\n" +" -O, --order-start=起點值 第一個 sudoOrder 的起點\n" +" -p, --prune-matches 清理不符合的使用者、群組和主機\n" +" -P, --padding=間隔 sudoOrder 的增加間隔\n" +" -s, --suppress=部份 隱藏某些部分的輸出\n" +" -V, --version 顯示版本訊息後退出" + +#: plugins/sudoers/cvtsudoers_json.c:684 plugins/sudoers/cvtsudoers_json.c:720 +#: plugins/sudoers/cvtsudoers_json.c:938 +#, c-format +msgid "unknown defaults entry \"%s\"" +msgstr "預設項目「%s」未知" + +#: plugins/sudoers/cvtsudoers_json.c:858 plugins/sudoers/cvtsudoers_json.c:873 +#: plugins/sudoers/cvtsudoers_ldif.c:308 plugins/sudoers/cvtsudoers_ldif.c:319 +#: plugins/sudoers/ldap.c:482 +msgid "unable to get GMT time" +msgstr "無法取得 GMT 時間" + +#: plugins/sudoers/cvtsudoers_json.c:861 plugins/sudoers/cvtsudoers_json.c:876 +#: plugins/sudoers/cvtsudoers_ldif.c:311 plugins/sudoers/cvtsudoers_ldif.c:322 +#: plugins/sudoers/ldap.c:488 +msgid "unable to format timestamp" +msgstr "無法格式化時間戳" + +#: plugins/sudoers/cvtsudoers_ldif.c:526 plugins/sudoers/env.c:330 +#: plugins/sudoers/env.c:337 plugins/sudoers/env.c:442 +#: plugins/sudoers/ldap.c:496 plugins/sudoers/ldap.c:727 +#: plugins/sudoers/ldap.c:1060 plugins/sudoers/ldap_conf.c:227 +#: plugins/sudoers/ldap_conf.c:317 plugins/sudoers/linux_audit.c:89 +#: plugins/sudoers/logging.c:1105 plugins/sudoers/policy.c:625 +#: plugins/sudoers/policy.c:635 plugins/sudoers/prompt.c:168 +#: plugins/sudoers/sudoers.c:852 plugins/sudoers/testsudoers.c:257 +#: plugins/sudoers/toke_util.c:161 +#, c-format +msgid "internal error, %s overflow" +msgstr "內部錯誤,%s 溢出" + +#: plugins/sudoers/cvtsudoers_ldif.c:595 +#, c-format +msgid "too many sudoers entries, maximum %u" +msgstr "過多 sudoers 項,最大值為 %u" + +#: plugins/sudoers/cvtsudoers_ldif.c:638 +msgid "the SUDOERS_BASE environment variable is not set and the -b option was not specified." +msgstr "未設定 SUDOERS_BASE 環境變數,且亦未指定 -b 選項。" + +#: plugins/sudoers/def_data.c:42 +#, c-format +msgid "Syslog facility if syslog is being used for logging: %s" +msgstr "若使用了 syslog 記錄,要使用的 syslog 裝置:%s" + +#: plugins/sudoers/def_data.c:46 +#, c-format +msgid "Syslog priority to use when user authenticates successfully: %s" +msgstr "使用者認證成功時要使用的 syslog 記錄優先級:%s" + +#: plugins/sudoers/def_data.c:50 +#, c-format +msgid "Syslog priority to use when user authenticates unsuccessfully: %s" +msgstr "使用者認證不成功時使用的 syslog 記錄優先級:%s" + +#: plugins/sudoers/def_data.c:54 +msgid "Put OTP prompt on its own line" +msgstr "將 OPT 提示放在獨自的行中" + +#: plugins/sudoers/def_data.c:58 +msgid "Ignore '.' in $PATH" +msgstr "忽略 $PATH 中的「.」" + +#: plugins/sudoers/def_data.c:62 +msgid "Always send mail when sudo is run" +msgstr "永遠在 sudo 執行時傳送信件" + +#: plugins/sudoers/def_data.c:66 +msgid "Send mail if user authentication fails" +msgstr "使用者認證失敗後傳送信件" + +#: plugins/sudoers/def_data.c:70 +msgid "Send mail if the user is not in sudoers" +msgstr "當使用者不在 sudoers 中時傳送信件" + +#: plugins/sudoers/def_data.c:74 +msgid "Send mail if the user is not in sudoers for this host" +msgstr "當使用者不在此主機的 sudoers 中時傳送信件" + +#: plugins/sudoers/def_data.c:78 +msgid "Send mail if the user is not allowed to run a command" +msgstr "當使用者不允許執行某指令時傳送信件" + +#: plugins/sudoers/def_data.c:82 +msgid "Send mail if the user tries to run a command" +msgstr "當使用者嘗試執行某指令時傳送信件" + +#: plugins/sudoers/def_data.c:86 +msgid "Use a separate timestamp for each user/tty combo" +msgstr "對每個使用者和終端組合使用單獨的時間戳" + +#: plugins/sudoers/def_data.c:90 +msgid "Lecture user the first time they run sudo" +msgstr "在使用者第一次執行 sudo 時,通知使用者相關使用指引" + +#: plugins/sudoers/def_data.c:94 +#, c-format +msgid "File containing the sudo lecture: %s" +msgstr "包含 sudo 使用指引的檔案:%s" + +#: plugins/sudoers/def_data.c:98 +msgid "Require users to authenticate by default" +msgstr "預設要求使用者認證" + +#: plugins/sudoers/def_data.c:102 +msgid "Root may run sudo" +msgstr "Root 可以執行 sudo" + +#: plugins/sudoers/def_data.c:106 +msgid "Log the hostname in the (non-syslog) log file" +msgstr "在(非 syslog)記錄檔中記錄主機名稱" + +#: plugins/sudoers/def_data.c:110 +msgid "Log the year in the (non-syslog) log file" +msgstr "在(非 syslog)記錄檔中記錄年份" + +#: plugins/sudoers/def_data.c:114 +msgid "If sudo is invoked with no arguments, start a shell" +msgstr "若 sudo 不傳入參數呼叫,就開啟 shell" + +#: plugins/sudoers/def_data.c:118 +msgid "Set $HOME to the target user when starting a shell with -s" +msgstr "若以 -s 參數開啟 shell,就設定目標使用者的 $HOME" + +#: plugins/sudoers/def_data.c:122 +msgid "Always set $HOME to the target user's home directory" +msgstr "永遠將 $HOME 設定為目標使用者的家目錄" + +#: plugins/sudoers/def_data.c:126 +msgid "Allow some information gathering to give useful error messages" +msgstr "允許收集一些訊息以提供有用的錯誤訊息" + +#: plugins/sudoers/def_data.c:130 +msgid "Require fully-qualified hostnames in the sudoers file" +msgstr "要求在 sudoers 檔案中包含完整的主機名稱" + +#: plugins/sudoers/def_data.c:134 +msgid "Insult the user when they enter an incorrect password" +msgstr "在使用者輸入錯誤密碼時嘲諷他們" + +#: plugins/sudoers/def_data.c:138 +msgid "Only allow the user to run sudo if they have a tty" +msgstr "只允許有終端的使用者執行 sudo" + +#: plugins/sudoers/def_data.c:142 +msgid "Visudo will honor the EDITOR environment variable" +msgstr "Visudo 將優先考慮 EDITOR 環境變數" + +#: plugins/sudoers/def_data.c:146 +msgid "Prompt for root's password, not the users's" +msgstr "詢問 root 使用者的密碼而非使用者的密碼" + +#: plugins/sudoers/def_data.c:150 +msgid "Prompt for the runas_default user's password, not the users's" +msgstr "詢問 runas_default 使用者的密碼,而非使用者密碼" + +#: plugins/sudoers/def_data.c:154 +msgid "Prompt for the target user's password, not the users's" +msgstr "詢問目標使用者的密碼,而非使用者密碼" + +#: plugins/sudoers/def_data.c:158 +msgid "Apply defaults in the target user's login class if there is one" +msgstr "若有則套用目標使用者登入類別中的預設設定" + +#: plugins/sudoers/def_data.c:162 +msgid "Set the LOGNAME and USER environment variables" +msgstr "設定 LOGNAME 和 USER 環境變數" + +#: plugins/sudoers/def_data.c:166 +msgid "Only set the effective uid to the target user, not the real uid" +msgstr "只將有效使用者 ID 設為目標使用者的 ID,而非實際使用者的 ID" + +#: plugins/sudoers/def_data.c:170 +msgid "Don't initialize the group vector to that of the target user" +msgstr "不將群組集合初始化成目標使用者的群組集合" + +#: plugins/sudoers/def_data.c:174 +#, c-format +msgid "Length at which to wrap log file lines (0 for no wrap): %u" +msgstr "記錄檔案要換行的長度 (0 則不換行):%u" + +#: plugins/sudoers/def_data.c:178 +#, c-format +msgid "Authentication timestamp timeout: %.1f minutes" +msgstr "認證時間戳逾時:%.1f 分鐘" + +#: plugins/sudoers/def_data.c:182 +#, c-format +msgid "Password prompt timeout: %.1f minutes" +msgstr "密碼提示逾時:%.1f 分鐘" + +#: plugins/sudoers/def_data.c:186 +#, c-format +msgid "Number of tries to enter a password: %u" +msgstr "密碼輸入嘗試次數:%u" + +#: plugins/sudoers/def_data.c:190 +#, c-format +msgid "Umask to use or 0777 to use user's: 0%o" +msgstr "要使用的 umask,或設定 0777 以使用使用者的 umask:0%o" + +#: plugins/sudoers/def_data.c:194 +#, c-format +msgid "Path to log file: %s" +msgstr "記錄檔案路徑:%s" + +#: plugins/sudoers/def_data.c:198 +#, c-format +msgid "Path to mail program: %s" +msgstr "郵件程式路徑:%s" + +#: plugins/sudoers/def_data.c:202 +#, c-format +msgid "Flags for mail program: %s" +msgstr "郵件程式旗標:%s" + +#: plugins/sudoers/def_data.c:206 +#, c-format +msgid "Address to send mail to: %s" +msgstr "傳送郵件的位址:%s" + +#: plugins/sudoers/def_data.c:210 +#, c-format +msgid "Address to send mail from: %s" +msgstr "接收郵件的位址:%s" + +#: plugins/sudoers/def_data.c:214 +#, c-format +msgid "Subject line for mail messages: %s" +msgstr "郵件訊息的主旨:%s" + +#: plugins/sudoers/def_data.c:218 +#, c-format +msgid "Incorrect password message: %s" +msgstr "密碼不正確的訊息:%s" + +#: plugins/sudoers/def_data.c:222 +#, c-format +msgid "Path to lecture status dir: %s" +msgstr "指引狀態資料夾的路徑:%s" + +#: plugins/sudoers/def_data.c:226 +#, c-format +msgid "Path to authentication timestamp dir: %s" +msgstr "認證時間戳資料夾的路徑:%s" + +#: plugins/sudoers/def_data.c:230 +#, c-format +msgid "Owner of the authentication timestamp dir: %s" +msgstr "認證時間戳的所有者:%s" + +#: plugins/sudoers/def_data.c:234 +#, c-format +msgid "Users in this group are exempt from password and PATH requirements: %s" +msgstr "此群組內的使用者不需要輸入密碼和 PATH:%s" + +#: plugins/sudoers/def_data.c:238 +#, c-format +msgid "Default password prompt: %s" +msgstr "預設密碼提示:%s" + +#: plugins/sudoers/def_data.c:242 +msgid "If set, passprompt will override system prompt in all cases." +msgstr "如果設定,密碼提示將覆蓋所有情況下的系統提示。" + +#: plugins/sudoers/def_data.c:246 +#, c-format +msgid "Default user to run commands as: %s" +msgstr "要執行指令的預設使用者:%s" + +#: plugins/sudoers/def_data.c:250 +#, c-format +msgid "Value to override user's $PATH with: %s" +msgstr "要覆蓋使用者 $PATH 變數的值:%s" + +#: plugins/sudoers/def_data.c:254 +#, c-format +msgid "Path to the editor for use by visudo: %s" +msgstr "visudo 所使用編輯器的路徑:%s" + +#: plugins/sudoers/def_data.c:258 +#, c-format +msgid "When to require a password for 'list' pseudocommand: %s" +msgstr "何時要為「list」偽指令請求密碼:%s" + +#: plugins/sudoers/def_data.c:262 +#, c-format +msgid "When to require a password for 'verify' pseudocommand: %s" +msgstr "何時要為「verify」偽指令請求密碼:%s" + +#: plugins/sudoers/def_data.c:266 +msgid "Preload the dummy exec functions contained in the sudo_noexec library" +msgstr "預載「sudo_noexec」函式庫中包含的空 exec 函數" + +#: plugins/sudoers/def_data.c:270 +msgid "If LDAP directory is up, do we ignore local sudoers file" +msgstr "如果有啟用 LDAP 目錄,是否要忽略本機的 sudoers 檔案" + +#: plugins/sudoers/def_data.c:274 +#, c-format +msgid "File descriptors >= %d will be closed before executing a command" +msgstr ">= %d 的檔案描述符將會在執行指令前關閉" + +#: plugins/sudoers/def_data.c:278 +msgid "If set, users may override the value of `closefrom' with the -C option" +msgstr "如果設定,使用者可以透過 -C 選項覆蓋「closefrom」的值" + +#: plugins/sudoers/def_data.c:282 +msgid "Allow users to set arbitrary environment variables" +msgstr "允許使用者設定任意的環境變數" + +#: plugins/sudoers/def_data.c:286 +msgid "Reset the environment to a default set of variables" +msgstr "將環境重設為預設的變數集" + +#: plugins/sudoers/def_data.c:290 +msgid "Environment variables to check for sanity:" +msgstr "要檢查完整性的環境變數:" + +#: plugins/sudoers/def_data.c:294 +msgid "Environment variables to remove:" +msgstr "要移除的環境變數:" + +#: plugins/sudoers/def_data.c:298 +msgid "Environment variables to preserve:" +msgstr "要保留的環境變數:" + +#: plugins/sudoers/def_data.c:302 +#, c-format +msgid "SELinux role to use in the new security context: %s" +msgstr "要在新的安全上下文中使用的 SELinux 角色:%s" + +#: plugins/sudoers/def_data.c:306 +#, c-format +msgid "SELinux type to use in the new security context: %s" +msgstr "要在新的安全上下文中使用的 SELinux 類型:%s" + +#: plugins/sudoers/def_data.c:310 +#, c-format +msgid "Path to the sudo-specific environment file: %s" +msgstr "sudo 特定環境檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:314 +#, c-format +msgid "Path to the restricted sudo-specific environment file: %s" +msgstr "受限 sudo 特定環境檔案的路徑:%s" + +#: plugins/sudoers/def_data.c:318 +#, c-format +msgid "Locale to use while parsing sudoers: %s" +msgstr "解析 sudoers 時要使用的區域設定:%s" + +#: plugins/sudoers/def_data.c:322 +msgid "Allow sudo to prompt for a password even if it would be visible" +msgstr "允許 sudo 詢問密碼,即使它不可見" + +#: plugins/sudoers/def_data.c:326 +msgid "Provide visual feedback at the password prompt when there is user input" +msgstr "使用者在密碼提示輸入時提供視覺回饋" + +#: plugins/sudoers/def_data.c:330 +msgid "Use faster globbing that is less accurate but does not access the filesystem" +msgstr "使用不太精確但不用存取檔案系統的較快 glob 方法" + +#: plugins/sudoers/def_data.c:334 +msgid "The umask specified in sudoers will override the user's, even if it is more permissive" +msgstr "sudoers 中指定的 umask 會覆蓋使用者的 umask,即使使用者允許的權限更多" + +#: plugins/sudoers/def_data.c:338 +msgid "Log user's input for the command being run" +msgstr "記錄指令執行時使用者的輸入內容" + +#: plugins/sudoers/def_data.c:342 +msgid "Log the output of the command being run" +msgstr "記錄指令執行時的輸出內容" + +#: plugins/sudoers/def_data.c:346 +msgid "Compress I/O logs using zlib" +msgstr "使用 zlib 壓縮 I/O 記錄" + +#: plugins/sudoers/def_data.c:350 +msgid "Always run commands in a pseudo-tty" +msgstr "總是在偽終端中執行指令" + +#: plugins/sudoers/def_data.c:354 +#, c-format +msgid "Plugin for non-Unix group support: %s" +msgstr "用於非 Unix 群組支援的外掛程式:%s" + +#: plugins/sudoers/def_data.c:358 +#, c-format +msgid "Directory in which to store input/output logs: %s" +msgstr "用於儲存輸入/輸出記錄的目錄:%s" + +#: plugins/sudoers/def_data.c:362 +#, c-format +msgid "File in which to store the input/output log: %s" +msgstr "用於儲存輸入/輸出記錄的檔案:%s" + +#: plugins/sudoers/def_data.c:366 +msgid "Add an entry to the utmp/utmpx file when allocating a pty" +msgstr "在分配偽終端時向 utmp/utmpx 檔案中附加一條記錄" + +#: plugins/sudoers/def_data.c:370 +msgid "Set the user in utmp to the runas user, not the invoking user" +msgstr "將 utmp 中的使用者設為 runas 使用者,而不是呼叫使用者" + +#: plugins/sudoers/def_data.c:374 +#, c-format +msgid "Set of permitted privileges: %s" +msgstr "核准的權限集合:%s" + +#: plugins/sudoers/def_data.c:378 +#, c-format +msgid "Set of limit privileges: %s" +msgstr "限制的權限集合:%s" + +#: plugins/sudoers/def_data.c:382 +msgid "Run commands on a pty in the background" +msgstr "在背景的偽終端上執行指令" + +#: plugins/sudoers/def_data.c:386 +#, c-format +msgid "PAM service name to use: %s" +msgstr "要使用的 PAM 服務名稱:%s" + +#: plugins/sudoers/def_data.c:390 +#, c-format +msgid "PAM service name to use for login shells: %s" +msgstr "用於登入 shell 的 PAM 服務名稱:%s" + +#: plugins/sudoers/def_data.c:394 +msgid "Attempt to establish PAM credentials for the target user" +msgstr "嘗試為目標使用者建立 PAM 憑證" + +#: plugins/sudoers/def_data.c:398 +msgid "Create a new PAM session for the command to run in" +msgstr "建立一個新的 PAM 工作階段來執行該指令" + +#: plugins/sudoers/def_data.c:402 +msgid "Perform PAM account validation management" +msgstr "執行 PAM 帳戶驗證管理工具" + +#: plugins/sudoers/def_data.c:406 +#, c-format +msgid "Maximum I/O log sequence number: %u" +msgstr "最大 I/O 記錄序號:%u" + +#: plugins/sudoers/def_data.c:410 +msgid "Enable sudoers netgroup support" +msgstr "啟用 sudoers netgroup 支援" + +#: plugins/sudoers/def_data.c:414 +msgid "Check parent directories for writability when editing files with sudoedit" +msgstr "在使用 sudoedit 編輯檔案時檢查上層目錄是否可寫" + +#: plugins/sudoers/def_data.c:418 +msgid "Follow symbolic links when editing files with sudoedit" +msgstr "使用 sudoedit 編輯檔案時跟隨符號連結(定位到原檔案)" + +#: plugins/sudoers/def_data.c:422 +msgid "Query the group plugin for unknown system groups" +msgstr "透過群組外掛程式查詢未知的系統群組" + +#: plugins/sudoers/def_data.c:426 +msgid "Match netgroups based on the entire tuple: user, host and domain" +msgstr "基於整個元組(使用者、主機和網域)來符合網路群組" + +#: plugins/sudoers/def_data.c:430 +msgid "Allow commands to be run even if sudo cannot write to the audit log" +msgstr "即使 sudo 無法寫入稽核記錄也允許執行指令" + +#: plugins/sudoers/def_data.c:434 +msgid "Allow commands to be run even if sudo cannot write to the I/O log" +msgstr "即使 sudo 無法寫入 I/O 記錄也允許執行指令" + +#: plugins/sudoers/def_data.c:438 +msgid "Allow commands to be run even if sudo cannot write to the log file" +msgstr "即使 sudo 無法寫入記錄檔案也允許執行指令" + +#: plugins/sudoers/def_data.c:442 +msgid "Resolve groups in sudoers and match on the group ID, not the name" +msgstr "解析 sudoers 中的群組並基於群組 ID(不是名稱)比較" + +#: plugins/sudoers/def_data.c:446 +#, c-format +msgid "Log entries larger than this value will be split into multiple syslog messages: %u" +msgstr "大於此數值的記錄條目會分為多條 syslog 訊息:%u" + +#: plugins/sudoers/def_data.c:450 +#, c-format +msgid "User that will own the I/O log files: %s" +msgstr "將擁有 I/O 記錄檔案的使用者:%s" + +#: plugins/sudoers/def_data.c:454 +#, c-format +msgid "Group that will own the I/O log files: %s" +msgstr "將擁有 I/O 記錄檔案的群組:%s" + +#: plugins/sudoers/def_data.c:458 +#, c-format +msgid "File mode to use for the I/O log files: 0%o" +msgstr "I/O 記錄檔案要使用的檔案模式:0%o" + +#: plugins/sudoers/def_data.c:462 +#, c-format +msgid "Execute commands by file descriptor instead of by path: %s" +msgstr "根據檔案描述符執行指令,而非根據路徑:%s" + +#: plugins/sudoers/def_data.c:466 +msgid "Ignore unknown Defaults entries in sudoers instead of producing a warning" +msgstr "忽略 sudoers 中未知的預設 (Defaults) 條目而非產生警告" + +#: plugins/sudoers/def_data.c:470 +#, c-format +msgid "Time in seconds after which the command will be terminated: %u" +msgstr "超過指定時間後終止指令 (秒):%u" + +#: plugins/sudoers/def_data.c:474 +msgid "Allow the user to specify a timeout on the command line" +msgstr "允許使用者在指令行中指定逾時時間" + +#: plugins/sudoers/def_data.c:478 +msgid "Flush I/O log data to disk immediately instead of buffering it" +msgstr "立即重新整理 I/O 記錄資料而非快取資料" + +#: plugins/sudoers/def_data.c:482 +msgid "Include the process ID when logging via syslog" +msgstr "透過 syslog 登入時包含行程 ID" + +#: plugins/sudoers/def_data.c:486 +#, c-format +msgid "Type of authentication timestamp record: %s" +msgstr "認證時間戳記錄的類型:%s" + +#: plugins/sudoers/def_data.c:490 +#, c-format +msgid "Authentication failure message: %s" +msgstr "認證失敗訊息:%s" + +#: plugins/sudoers/def_data.c:494 +msgid "Ignore case when matching user names" +msgstr "在比較使用者名稱時忽略大小寫" + +#: plugins/sudoers/def_data.c:498 +msgid "Ignore case when matching group names" +msgstr "在比較群組名稱時忽略大小寫" + +#: plugins/sudoers/def_data.c:502 +msgid "Log when a command is allowed by sudoers" +msgstr "當指令被 sudoers 允許通行時記錄" + +#: plugins/sudoers/def_data.c:506 +msgid "Log when a command is denied by sudoers" +msgstr "當指令被 sudoers 拒絕通行時記錄" + +#: plugins/sudoers/defaults.c:231 +#, c-format +msgid "%s:%d unknown defaults entry \"%s\"" +msgstr "%s:%d 未知的預設條目「%s」" + +#: plugins/sudoers/defaults.c:234 +#, c-format +msgid "%s: unknown defaults entry \"%s\"" +msgstr "%s:未知的預設條目「%s」" + +#: plugins/sudoers/defaults.c:277 +#, c-format +msgid "%s:%d no value specified for \"%s\"" +msgstr "%s:%d 沒有給「%s」指定值" + +#: plugins/sudoers/defaults.c:280 +#, c-format +msgid "%s: no value specified for \"%s\"" +msgstr "%s:沒有給「%s」指定值" + +#: plugins/sudoers/defaults.c:300 +#, c-format +msgid "%s:%d values for \"%s\" must start with a '/'" +msgstr "%s:%d 「%s」的值必須以「/」開頭" + +#: plugins/sudoers/defaults.c:303 +#, c-format +msgid "%s: values for \"%s\" must start with a '/'" +msgstr "%s:「%s」的值必須以「/」開頭" + +#: plugins/sudoers/defaults.c:325 +#, c-format +msgid "%s:%d option \"%s\" does not take a value" +msgstr "%s:%d 「%s」選項不帶值" + +#: plugins/sudoers/defaults.c:328 +#, c-format +msgid "%s: option \"%s\" does not take a value" +msgstr "%s:「%s」選項不帶值" + +#: plugins/sudoers/defaults.c:353 +#, c-format +msgid "%s:%d invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:%2$d 選項「%4$s」的預設類型 0x%3$x 無效" + +#: plugins/sudoers/defaults.c:356 +#, c-format +msgid "%s: invalid Defaults type 0x%x for option \"%s\"" +msgstr "%1$s:選項「%3$s」的預設類型 0x%2$x 無效" + +#: plugins/sudoers/defaults.c:366 +#, c-format +msgid "%s:%d value \"%s\" is invalid for option \"%s\"" +msgstr "%1$s:%2$d 值「%3$s」對選項「%4$s」無效" + +#: plugins/sudoers/defaults.c:369 +#, c-format +msgid "%s: value \"%s\" is invalid for option \"%s\"" +msgstr "%s:值「%s」對選項「%s」無效" + +#: plugins/sudoers/env.c:411 +msgid "sudo_putenv: corrupted envp, length mismatch" +msgstr "sudo_putenv:envp 損壞,長度不符" + +#: plugins/sudoers/env.c:1132 +msgid "unable to rebuild the environment" +msgstr "無法重建環境" + +#: plugins/sudoers/env.c:1206 +#, c-format +msgid "sorry, you are not allowed to set the following environment variables: %s" +msgstr "對不起,您沒有權限設定以下環境變數:%s" + +#: plugins/sudoers/file.c:116 +#, c-format +msgid "parse error in %s near line %d" +msgstr "解析接近第 %2$d 行的 %1$s 時發生錯誤" + +#: plugins/sudoers/file.c:119 +#, c-format +msgid "parse error in %s" +msgstr "解析 %s 中的內容時發生錯誤" + +#: plugins/sudoers/filedigest.c:61 +#, c-format +msgid "unsupported digest type %d for %s" +msgstr "不支援 %2$s 的摘要類型 %1$d" + +#: plugins/sudoers/filedigest.c:90 +#, c-format +msgid "%s: read error" +msgstr "%s:讀取錯誤" + +#: plugins/sudoers/group_plugin.c:90 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必須由使用者 ID %d 所有" + +#: plugins/sudoers/group_plugin.c:94 +#, c-format +msgid "%s must only be writable by owner" +msgstr "%s 必須只允許所有者可寫" + +#: plugins/sudoers/group_plugin.c:102 plugins/sudoers/sssd.c:562 +#, c-format +msgid "unable to load %s: %s" +msgstr "無法載入 %s:%s" + +#: plugins/sudoers/group_plugin.c:108 +#, c-format +msgid "unable to find symbol \"group_plugin\" in %s" +msgstr "無法在 %s 中找到符號「group_plugin」" + +#: plugins/sudoers/group_plugin.c:113 +#, c-format +msgid "%s: incompatible group plugin major version %d, expected %d" +msgstr "%s:不相容的群組外掛程式主要版本號碼 %d,版本應該為 %d" + +#: plugins/sudoers/interfaces.c:86 plugins/sudoers/interfaces.c:103 +#, c-format +msgid "unable to parse IP address \"%s\"" +msgstr "無法解析 IP 位址列表「%s」" + +#: plugins/sudoers/interfaces.c:91 plugins/sudoers/interfaces.c:108 +#, c-format +msgid "unable to parse netmask \"%s\"" +msgstr "無法解析網路遮罩「%s」" + +#: plugins/sudoers/interfaces.c:136 +msgid "Local IP address and netmask pairs:\n" +msgstr "本機 IP 位址和網路遮罩配對:\n" + +#: plugins/sudoers/iolog.c:117 plugins/sudoers/mkdir_parents.c:82 +#, c-format +msgid "%s exists but is not a directory (0%o)" +msgstr "%s 存在,但非目錄 (0%o)" + +#: plugins/sudoers/iolog.c:142 plugins/sudoers/iolog.c:182 +#: plugins/sudoers/mkdir_parents.c:71 plugins/sudoers/timestamp.c:212 +#, c-format +msgid "unable to mkdir %s" +msgstr "無法建立目錄 %s" + +#: plugins/sudoers/iolog.c:186 plugins/sudoers/visudo.c:739 +#: plugins/sudoers/visudo.c:750 +#, c-format +msgid "unable to change mode of %s to 0%o" +msgstr "無法將 %s 的模式變更為 0%o" + +#: plugins/sudoers/iolog.c:294 plugins/sudoers/sudoers.c:1194 +#: plugins/sudoers/testsudoers.c:424 +#, c-format +msgid "unknown group: %s" +msgstr "未知群組:%s" + +#: plugins/sudoers/iolog.c:464 plugins/sudoers/sudoers.c:918 +#: plugins/sudoers/sudoreplay.c:846 plugins/sudoers/sudoreplay.c:1542 +#: plugins/sudoers/tsdump.c:145 +#, c-format +msgid "unable to read %s" +msgstr "無法讀取 %s" + +#: plugins/sudoers/iolog.c:579 plugins/sudoers/iolog.c:801 +#, c-format +msgid "unable to create %s" +msgstr "無法建立 %s" + +#: plugins/sudoers/iolog.c:824 plugins/sudoers/iolog.c:1039 +#: plugins/sudoers/iolog.c:1115 plugins/sudoers/iolog.c:1209 +#: plugins/sudoers/iolog.c:1270 +#, c-format +msgid "unable to write to I/O log file: %s" +msgstr "無法寫入 I/O 記錄檔案:%s" + +#: plugins/sudoers/iolog.c:1073 +#, c-format +msgid "%s: internal error, I/O log file for event %d not open" +msgstr "%s:內部錯誤,未開啟事件 %d 的 I/O 記錄檔案" + +#: plugins/sudoers/iolog.c:1233 +#, c-format +msgid "%s: internal error, invalid signal %d" +msgstr "%s:內部錯誤,訊號 %d 無效" + +#: plugins/sudoers/iolog_util.c:90 +#, c-format +msgid "%s: invalid log file" +msgstr "%s:無效的記錄檔案" + +#: plugins/sudoers/iolog_util.c:108 +#, c-format +msgid "%s: time stamp field is missing" +msgstr "%s:缺少 時間戳 欄位" + +#: plugins/sudoers/iolog_util.c:114 +#, c-format +msgid "%s: time stamp %s: %s" +msgstr "%s:時間戳 %s:%s" + +#: plugins/sudoers/iolog_util.c:121 +#, c-format +msgid "%s: user field is missing" +msgstr "%s:缺少 使用者 欄位" + +#: plugins/sudoers/iolog_util.c:130 +#, c-format +msgid "%s: runas user field is missing" +msgstr "%s:缺少 runas 使用者 欄位" + +#: plugins/sudoers/iolog_util.c:139 +#, c-format +msgid "%s: runas group field is missing" +msgstr "%s:缺少 runas 群組 欄位" + +#: plugins/sudoers/ldap.c:178 plugins/sudoers/ldap_conf.c:296 +msgid "starttls not supported when using ldaps" +msgstr "使用 ldaps 時不支援使用 starttls" + +#: plugins/sudoers/ldap.c:249 +#, c-format +msgid "unable to initialize SSL cert and key db: %s" +msgstr "無法初始化 SSL 憑證和金鑰資料庫:%s" + +#: plugins/sudoers/ldap.c:252 +#, c-format +msgid "you must set TLS_CERT in %s to use SSL" +msgstr "要使用 SSL,您必須在 %s 設定 TLS_CERT" + +#: plugins/sudoers/ldap.c:1620 +#, c-format +msgid "unable to initialize LDAP: %s" +msgstr "無法初始化 LDAP:%s" + +#: plugins/sudoers/ldap.c:1656 +msgid "start_tls specified but LDAP libs do not support ldap_start_tls_s() or ldap_start_tls_s_np()" +msgstr "指定了 start_tls,但 LDAP 函式庫不支援 ldap_start_tls_s() 或 ldap_start_tls_s_np()" + +#: plugins/sudoers/ldap.c:1793 plugins/sudoers/parse_ldif.c:734 +#, c-format +msgid "invalid sudoOrder attribute: %s" +msgstr "無效的 sudoOrder 屬性:%s" + +#: plugins/sudoers/ldap_conf.c:205 +msgid "sudo_ldap_conf_add_ports: port too large" +msgstr "sudo_ldap_conf_add_ports:連線埠過大" + +#: plugins/sudoers/ldap_conf.c:265 +#, c-format +msgid "unsupported LDAP uri type: %s" +msgstr "不支援的 LDAP URI 類型:%s" + +#: plugins/sudoers/ldap_conf.c:292 +msgid "unable to mix ldap and ldaps URIs" +msgstr "無法混合 ldap 和 ldaps URI" + +#: plugins/sudoers/ldap_util.c:456 plugins/sudoers/ldap_util.c:458 +#, c-format +msgid "unable to convert sudoOption: %s%s%s" +msgstr "無法轉換 sudoOption: %s%s%s" + +#: plugins/sudoers/linux_audit.c:59 +msgid "unable to open audit system" +msgstr "無法開啟稽核系統" + +#: plugins/sudoers/linux_audit.c:100 +msgid "unable to send audit message" +msgstr "無法傳送稽核訊息" + +#: plugins/sudoers/logging.c:120 +#, c-format +msgid "%8s : %s" +msgstr "%8s : %s" + +#: plugins/sudoers/logging.c:148 +#, c-format +msgid "%8s : (command continued) %s" +msgstr "%8s : (指令繼續執行) %s" + +#: plugins/sudoers/logging.c:177 +#, c-format +msgid "unable to open log file: %s" +msgstr "無法開啟記錄檔案:%s" + +#: plugins/sudoers/logging.c:185 +#, c-format +msgid "unable to lock log file: %s" +msgstr "無法鎖定記錄檔案:%s" + +#: plugins/sudoers/logging.c:218 +#, c-format +msgid "unable to write log file: %s" +msgstr "無法寫入記錄檔案:%s" + +#: plugins/sudoers/logging.c:248 +msgid "No user or host" +msgstr "找不到使用者或主機" + +#: plugins/sudoers/logging.c:250 +msgid "validation failure" +msgstr "檢查有效性失敗" + +#: plugins/sudoers/logging.c:261 +msgid "user NOT in sudoers" +msgstr "使用者不在 sudoers 中" + +#: plugins/sudoers/logging.c:263 +msgid "user NOT authorized on host" +msgstr "使用者未取得此主機上的授權" + +#: plugins/sudoers/logging.c:265 +msgid "command not allowed" +msgstr "不允許使用指令" + +#: plugins/sudoers/logging.c:301 +#, c-format +msgid "%s is not in the sudoers file. This incident will be reported.\n" +msgstr "%s 不在 sudoers 檔案中。此事件將會回報。\n" + +#: plugins/sudoers/logging.c:304 +#, c-format +msgid "%s is not allowed to run sudo on %s. This incident will be reported.\n" +msgstr "%s 沒有權限在 %s 上執行 sudo。此事件將會回報。\n" + +#: plugins/sudoers/logging.c:308 +#, c-format +msgid "Sorry, user %s may not run sudo on %s.\n" +msgstr "對不起,使用者 %s 不能在 %s 上執行 sudo。\n" + +#: plugins/sudoers/logging.c:311 +#, c-format +msgid "Sorry, user %s is not allowed to execute '%s%s%s' as %s%s%s on %s.\n" +msgstr "對不起,使用者 %1$s 不允許以 %8$s 上的 %5$s%6$s%7$s 身份執行「%2$s%3$s%4$s」\n" + +#: plugins/sudoers/logging.c:348 plugins/sudoers/sudoers.c:442 +#: plugins/sudoers/sudoers.c:444 plugins/sudoers/sudoers.c:446 +#: plugins/sudoers/sudoers.c:448 plugins/sudoers/sudoers.c:603 +#: plugins/sudoers/sudoers.c:605 +#, c-format +msgid "%s: command not found" +msgstr "%s:找不到指令" + +#: plugins/sudoers/logging.c:350 plugins/sudoers/sudoers.c:438 +#, c-format +msgid "" +"ignoring \"%s\" found in '.'\n" +"Use \"sudo ./%s\" if this is the \"%s\" you wish to run." +msgstr "" +"忽略在「.」中找到的「%s」\n" +"請使用「sudo ./%s」,若這是您想執行的「%s」。" + +#: plugins/sudoers/logging.c:367 +msgid "authentication failure" +msgstr "認證失敗" + +#: plugins/sudoers/logging.c:393 +msgid "a password is required" +msgstr "需要密碼" + +#: plugins/sudoers/logging.c:463 +#, c-format +msgid "%u incorrect password attempt" +msgid_plural "%u incorrect password attempts" +msgstr[0] "%u 次密碼錯誤嘗試" + +#: plugins/sudoers/logging.c:728 +#, c-format +msgid "unable to dup stdin: %m" +msgstr "無法 dup stdin:%m" + +#: plugins/sudoers/logging.c:768 +#, c-format +msgid "unable to execute %s: %m" +msgstr "無法執行 %s:%m" + +#: plugins/sudoers/logging.c:809 plugins/sudoers/logging.c:865 +#, c-format +msgid "unable to fork: %m" +msgstr "無法執行 fork:%m" + +#: plugins/sudoers/logging.c:855 +#, c-format +msgid "unable to open pipe: %m" +msgstr "無法開啟管線:%m" + +#: plugins/sudoers/match_digest.c:103 +#, c-format +msgid "digest for %s (%s) is not in %s form" +msgstr "%s(%s) 的摘要的形式不是 %s" + +#: plugins/sudoers/mkdir_parents.c:77 plugins/sudoers/sudoers.c:943 +#: plugins/sudoers/visudo.c:437 plugins/sudoers/visudo.c:733 +#, c-format +msgid "unable to stat %s" +msgstr "無法 stat %s" + +#: plugins/sudoers/parse.c:449 +#, c-format +msgid "" +"\n" +"LDAP Role: %s\n" +msgstr "" +"\n" +"LDAP 角色:%s\n" + +#: plugins/sudoers/parse.c:452 +#, c-format +msgid "" +"\n" +"Sudoers entry:\n" +msgstr "" +"\n" +"Sudoers 條目:\n" + +#: plugins/sudoers/parse.c:454 +#, c-format +msgid " RunAsUsers: " +msgstr " RunAs 使用者:" + +#: plugins/sudoers/parse.c:469 +#, c-format +msgid " RunAsGroups: " +msgstr " RunAs 群組:" + +#: plugins/sudoers/parse.c:479 +#, c-format +msgid " Options: " +msgstr " 選項:" + +#: plugins/sudoers/parse.c:529 +#, c-format +msgid " Commands:\n" +msgstr " 指令:\n" + +#: plugins/sudoers/parse.c:720 +#, c-format +msgid "Matching Defaults entries for %s on %s:\n" +msgstr "比較 %2$s 上 %1$s 的預設條目:\n" + +#: plugins/sudoers/parse.c:738 +#, c-format +msgid "Runas and Command-specific defaults for %s:\n" +msgstr "%s RunAs 和指令指定的預設值:\n" + +#: plugins/sudoers/parse.c:756 +#, c-format +msgid "User %s may run the following commands on %s:\n" +msgstr "使用者 %s 可以在 %s 上執行以下指令:\n" + +#: plugins/sudoers/parse.c:771 +#, c-format +msgid "User %s is not allowed to run sudo on %s.\n" +msgstr "使用者 %s 沒有權限在 %s 上執行 sudo。\n" + +#: plugins/sudoers/parse_ldif.c:604 +#, c-format +msgid "ignoring incomplete sudoRole: cn: %s" +msgstr "將忽略不完整的 sudoRole:cn:%s" + +#: plugins/sudoers/parse_ldif.c:664 +#, c-format +msgid "invalid LDIF attribute: %s" +msgstr "LDIF 屬性無效:%s" + +#: plugins/sudoers/policy.c:90 plugins/sudoers/policy.c:116 +#, c-format +msgid "invalid %.*s set by sudo front-end" +msgstr "sudo 前端設定的 %.*s 無效" + +#: plugins/sudoers/policy.c:295 plugins/sudoers/testsudoers.c:280 +msgid "unable to parse network address list" +msgstr "無法解析網路位址列表" + +#: plugins/sudoers/policy.c:439 +msgid "user name not set by sudo front-end" +msgstr "sudo 前端未設定使用者名稱" + +#: plugins/sudoers/policy.c:443 +msgid "user-ID not set by sudo front-end" +msgstr "sudo 前端未設定使用者 ID (user-ID)" + +#: plugins/sudoers/policy.c:447 +msgid "group-ID not set by sudo front-end" +msgstr "sudo 前端未設定群組 ID (group-ID)" + +#: plugins/sudoers/policy.c:451 +msgid "host name not set by sudo front-end" +msgstr "sudo 前端未設定主機名稱" + +#: plugins/sudoers/policy.c:808 plugins/sudoers/visudo.c:236 +#: plugins/sudoers/visudo.c:867 +#, c-format +msgid "unable to execute %s" +msgstr "無法執行 %s" + +#: plugins/sudoers/policy.c:939 +#, c-format +msgid "Sudoers policy plugin version %s\n" +msgstr "Sudoers 策略外掛程式版本 %s\n" + +#: plugins/sudoers/policy.c:941 +#, c-format +msgid "Sudoers file grammar version %d\n" +msgstr "Sudoers 檔案文法版本 %d\n" + +#: plugins/sudoers/policy.c:945 +#, c-format +msgid "" +"\n" +"Sudoers path: %s\n" +msgstr "" +"\n" +"Sudoers 路徑:%s\n" + +#: plugins/sudoers/policy.c:948 +#, c-format +msgid "nsswitch path: %s\n" +msgstr "nsswitch 路徑:%s\n" + +#: plugins/sudoers/policy.c:950 +#, c-format +msgid "ldap.conf path: %s\n" +msgstr "ldap.conf 路徑:%s\n" + +#: plugins/sudoers/policy.c:951 +#, c-format +msgid "ldap.secret path: %s\n" +msgstr "ldap.secret 路徑:%s\n" + +#: plugins/sudoers/policy.c:984 +#, c-format +msgid "unable to register hook of type %d (version %d.%d)" +msgstr "無法註冊類型為 %d 的觸發器 (版本 %d.%d)" + +#: plugins/sudoers/pwutil.c:222 plugins/sudoers/pwutil.c:240 +#, c-format +msgid "unable to cache uid %u" +msgstr "無法快取使用者 ID %u" + +#: plugins/sudoers/pwutil.c:234 +#, c-format +msgid "unable to cache uid %u, already exists" +msgstr "無法快取使用者 ID %u,原因:使用者 ID 已存在" + +#: plugins/sudoers/pwutil.c:294 plugins/sudoers/pwutil.c:312 +#: plugins/sudoers/pwutil.c:375 plugins/sudoers/pwutil.c:420 +#, c-format +msgid "unable to cache user %s" +msgstr "無法快取 %s 使用者" + +#: plugins/sudoers/pwutil.c:307 +#, c-format +msgid "unable to cache user %s, already exists" +msgstr "無法快取使用者 %s,原因:已存在" + +#: plugins/sudoers/pwutil.c:539 plugins/sudoers/pwutil.c:557 +#, c-format +msgid "unable to cache gid %u" +msgstr "無法快取群組 ID %u" + +#: plugins/sudoers/pwutil.c:551 +#, c-format +msgid "unable to cache gid %u, already exists" +msgstr "無法快取群組 ID %u,原因:已經存在" + +#: plugins/sudoers/pwutil.c:604 plugins/sudoers/pwutil.c:622 +#: plugins/sudoers/pwutil.c:670 plugins/sudoers/pwutil.c:712 +#, c-format +msgid "unable to cache group %s" +msgstr "無法快取 %s 群組" + +#: plugins/sudoers/pwutil.c:617 +#, c-format +msgid "unable to cache group %s, already exists" +msgstr "無法快取群組 %s,原因:已經存在" + +#: plugins/sudoers/pwutil.c:839 plugins/sudoers/pwutil.c:891 +#: plugins/sudoers/pwutil.c:941 plugins/sudoers/pwutil.c:994 +#, c-format +msgid "unable to cache group list for %s, already exists" +msgstr "無法快取群組列表 %s,原因:已經存在" + +#: plugins/sudoers/pwutil.c:845 plugins/sudoers/pwutil.c:896 +#: plugins/sudoers/pwutil.c:947 plugins/sudoers/pwutil.c:999 +#, c-format +msgid "unable to cache group list for %s" +msgstr "無法快取 %s 的群組列表" + +#: plugins/sudoers/pwutil.c:885 +#, c-format +msgid "unable to parse groups for %s" +msgstr "無法解析 %s 的群組" + +#: plugins/sudoers/pwutil.c:988 +#, c-format +msgid "unable to parse gids for %s" +msgstr "無法解析 %s 的群組 ID" + +#: plugins/sudoers/set_perms.c:120 plugins/sudoers/set_perms.c:478 +#: plugins/sudoers/set_perms.c:921 plugins/sudoers/set_perms.c:1254 +#: plugins/sudoers/set_perms.c:1573 +msgid "perm stack overflow" +msgstr "權限堆疊溢位" + +#: plugins/sudoers/set_perms.c:128 plugins/sudoers/set_perms.c:409 +#: plugins/sudoers/set_perms.c:486 plugins/sudoers/set_perms.c:788 +#: plugins/sudoers/set_perms.c:929 plugins/sudoers/set_perms.c:1178 +#: plugins/sudoers/set_perms.c:1262 plugins/sudoers/set_perms.c:1506 +#: plugins/sudoers/set_perms.c:1581 plugins/sudoers/set_perms.c:1672 +msgid "perm stack underflow" +msgstr "權限堆疊反向溢位" + +#: plugins/sudoers/set_perms.c:187 plugins/sudoers/set_perms.c:532 +#: plugins/sudoers/set_perms.c:1315 plugins/sudoers/set_perms.c:1614 +msgid "unable to change to root gid" +msgstr "無法切換為 root 群組 ID" + +#: plugins/sudoers/set_perms.c:278 plugins/sudoers/set_perms.c:629 +#: plugins/sudoers/set_perms.c:1060 plugins/sudoers/set_perms.c:1392 +msgid "unable to change to runas gid" +msgstr "無法切換為 runas 群組 ID" + +#: plugins/sudoers/set_perms.c:283 plugins/sudoers/set_perms.c:634 +#: plugins/sudoers/set_perms.c:1065 plugins/sudoers/set_perms.c:1397 +msgid "unable to set runas group vector" +msgstr "無法設定 runas 群組集合" + +#: plugins/sudoers/set_perms.c:294 plugins/sudoers/set_perms.c:645 +#: plugins/sudoers/set_perms.c:1074 plugins/sudoers/set_perms.c:1406 +msgid "unable to change to runas uid" +msgstr "無法切換成 runas 使用者 ID" + +#: plugins/sudoers/set_perms.c:312 plugins/sudoers/set_perms.c:663 +#: plugins/sudoers/set_perms.c:1090 plugins/sudoers/set_perms.c:1422 +msgid "unable to change to sudoers gid" +msgstr "無法切換為 sudoers 群組 ID" + +#: plugins/sudoers/set_perms.c:396 plugins/sudoers/set_perms.c:775 +#: plugins/sudoers/set_perms.c:1165 plugins/sudoers/set_perms.c:1493 +#: plugins/sudoers/set_perms.c:1659 +msgid "too many processes" +msgstr "行程過多" + +#: plugins/sudoers/solaris_audit.c:58 +msgid "unable to get current working directory" +msgstr "無法取得目前工作目錄" + +#: plugins/sudoers/solaris_audit.c:66 +#, c-format +msgid "truncated audit path user_cmnd: %s" +msgstr "截短的稽核路徑 user_cmnd:%s" + +#: plugins/sudoers/solaris_audit.c:73 +#, c-format +msgid "truncated audit path argv[0]: %s" +msgstr "截短的稽核路徑 argv[0]:%s" + +#: plugins/sudoers/solaris_audit.c:122 +msgid "audit_failure message too long" +msgstr "audit_failure 訊息過長" + +#: plugins/sudoers/sssd.c:564 +msgid "unable to initialize SSS source. Is SSSD installed on your machine?" +msgstr "無法初始化 SSS 來源。是否已在您的電腦上安裝 SSSD?" + +#: plugins/sudoers/sssd.c:572 plugins/sudoers/sssd.c:581 +#: plugins/sudoers/sssd.c:590 plugins/sudoers/sssd.c:599 +#: plugins/sudoers/sssd.c:608 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "無法在 %2$s 中找到符號「%1$s」" + +#: plugins/sudoers/sudoers.c:212 plugins/sudoers/sudoers.c:871 +msgid "problem with defaults entries" +msgstr "預設條目有問題" + +#: plugins/sudoers/sudoers.c:216 +msgid "no valid sudoers sources found, quitting" +msgstr "未找到有效的 sudoers 來源,退出" + +#: plugins/sudoers/sudoers.c:254 +msgid "sudoers specifies that root is not allowed to sudo" +msgstr "sudoers 指定 root 不允許執行 sudo" + +#: plugins/sudoers/sudoers.c:312 +msgid "you are not permitted to use the -C option" +msgstr "您沒有權限使用 -C 選項" + +#: plugins/sudoers/sudoers.c:359 +#, c-format +msgid "timestamp owner (%s): No such user" +msgstr "時間戳所有者 (%s):無此使用者" + +#: plugins/sudoers/sudoers.c:374 +msgid "no tty" +msgstr "找不到終端" + +#: plugins/sudoers/sudoers.c:375 +msgid "sorry, you must have a tty to run sudo" +msgstr "抱歉,您必須先要有終端才能執行 sudo" + +#: plugins/sudoers/sudoers.c:437 +msgid "command in current directory" +msgstr "目前目錄中的指令" + +#: plugins/sudoers/sudoers.c:456 +msgid "sorry, you are not allowed set a command timeout" +msgstr "抱歉,您沒有權限設定逾時時間" + +#: plugins/sudoers/sudoers.c:464 +msgid "sorry, you are not allowed to preserve the environment" +msgstr "抱歉,您沒有權限保留環境" + +#: plugins/sudoers/sudoers.c:815 +msgid "command too long" +msgstr "指令過長" + +#: plugins/sudoers/sudoers.c:947 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 不是一般檔案" + +#: plugins/sudoers/sudoers.c:951 plugins/sudoers/timestamp.c:259 toke.l:967 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 由使用者 ID %u 所有,應為 %u" + +#: plugins/sudoers/sudoers.c:955 toke.l:972 +#, c-format +msgid "%s is world writable" +msgstr "%s 允許任何人寫入" + +#: plugins/sudoers/sudoers.c:959 toke.l:975 +#, c-format +msgid "%s is owned by gid %u, should be %u" +msgstr "%s 屬於群組 ID %u,應為 %u" + +#: plugins/sudoers/sudoers.c:992 +#, c-format +msgid "only root can use \"-c %s\"" +msgstr "只有 root 才能使用「-c %s」" + +#: plugins/sudoers/sudoers.c:1011 +#, c-format +msgid "unknown login class: %s" +msgstr "未知的登入類別:%s" + +#: plugins/sudoers/sudoers.c:1096 plugins/sudoers/sudoers.c:1110 +#, c-format +msgid "unable to resolve host %s" +msgstr "無法解析主機:%s" + +#: plugins/sudoers/sudoreplay.c:250 +#, c-format +msgid "invalid filter option: %s" +msgstr "無效的過濾器選項:%s" + +#: plugins/sudoers/sudoreplay.c:263 +#, c-format +msgid "invalid max wait: %s" +msgstr "無效的最大等待時間:%s" + +#: plugins/sudoers/sudoreplay.c:286 +#, c-format +msgid "invalid speed factor: %s" +msgstr "無效的速度因數:%s" + +#: plugins/sudoers/sudoreplay.c:321 +#, c-format +msgid "%s/%.2s/%.2s/%.2s/timing: %s" +msgstr "%s/%.2s/%.2s/%.2s/計時:%s" + +#: plugins/sudoers/sudoreplay.c:326 +#, c-format +msgid "%s/timing: %s" +msgstr "%s/計時:%s" + +#: plugins/sudoers/sudoreplay.c:330 +#, c-format +msgid "%s/%s/timing: %s" +msgstr "%s/%s/計時:%s" + +#: plugins/sudoers/sudoreplay.c:346 +#, c-format +msgid "Replaying sudo session: %s" +msgstr "重播 sudo 工作階段:%s" + +#: plugins/sudoers/sudoreplay.c:544 plugins/sudoers/sudoreplay.c:591 +#: plugins/sudoers/sudoreplay.c:789 plugins/sudoers/sudoreplay.c:898 +#: plugins/sudoers/sudoreplay.c:983 plugins/sudoers/sudoreplay.c:998 +#: plugins/sudoers/sudoreplay.c:1005 plugins/sudoers/sudoreplay.c:1012 +#: plugins/sudoers/sudoreplay.c:1019 plugins/sudoers/sudoreplay.c:1026 +#: plugins/sudoers/sudoreplay.c:1174 +msgid "unable to add event to queue" +msgstr "無法將事件附加到佇列" + +#: plugins/sudoers/sudoreplay.c:659 +msgid "unable to set tty to raw mode" +msgstr "無法將終端設為原始 (RAW) 模式" + +#: plugins/sudoers/sudoreplay.c:710 +msgid "Warning: your terminal is too small to properly replay the log.\n" +msgstr "警告:您的終端尺寸太小,不能正常地重播記錄。\n" + +#: plugins/sudoers/sudoreplay.c:711 +#, c-format +msgid "Log geometry is %d x %d, your terminal's geometry is %d x %d." +msgstr "記錄的幾何尺寸為 %dx%d,但您終端的幾何尺寸為 %dx%d。" + +#: plugins/sudoers/sudoreplay.c:739 +msgid "Replay finished, press any key to restore the terminal." +msgstr "重播完成,請按任意鍵返回終端。" + +#: plugins/sudoers/sudoreplay.c:772 +#, c-format +msgid "invalid timing file line: %s" +msgstr "無效的計時檔案行號:%s" + +#: plugins/sudoers/sudoreplay.c:1208 plugins/sudoers/sudoreplay.c:1233 +#, c-format +msgid "ambiguous expression \"%s\"" +msgstr "不明確的表達式「%s」" + +#: plugins/sudoers/sudoreplay.c:1255 +msgid "unmatched ')' in expression" +msgstr "表達式中的「)」不對稱" + +#: plugins/sudoers/sudoreplay.c:1259 +#, c-format +msgid "unknown search term \"%s\"" +msgstr "未知的搜尋詞彙「%s」" + +#: plugins/sudoers/sudoreplay.c:1274 +#, c-format +msgid "%s requires an argument" +msgstr "%s 需要參數" + +#: plugins/sudoers/sudoreplay.c:1277 plugins/sudoers/sudoreplay.c:1518 +#, c-format +msgid "invalid regular expression: %s" +msgstr "無效的正規表示式:%s" + +#: plugins/sudoers/sudoreplay.c:1281 +#, c-format +msgid "could not parse date \"%s\"" +msgstr "無法解析日期「%s」" + +#: plugins/sudoers/sudoreplay.c:1290 +msgid "unmatched '(' in expression" +msgstr "表達式中的「(」不對稱" + +#: plugins/sudoers/sudoreplay.c:1292 +msgid "illegal trailing \"or\"" +msgstr "無效的結尾字元「or」" + +#: plugins/sudoers/sudoreplay.c:1294 +msgid "illegal trailing \"!\"" +msgstr "無效的結尾字元「!」" + +#: plugins/sudoers/sudoreplay.c:1344 +#, c-format +msgid "unknown search type %d" +msgstr "未知的搜尋類型 %d" + +#: plugins/sudoers/sudoreplay.c:1611 +#, c-format +msgid "usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n" +msgstr "用法:%s [-hnRS] [-d 目錄] [-m 數值] [-s 數值] ID\n" + +#: plugins/sudoers/sudoreplay.c:1614 +#, c-format +msgid "usage: %s [-h] [-d dir] -l [search expression]\n" +msgstr "用法:%s [-h] [-d 目錄] -l [搜尋表達式]\n" + +#: plugins/sudoers/sudoreplay.c:1623 +#, c-format +msgid "" +"%s - replay sudo session logs\n" +"\n" +msgstr "" +"%s - 重播 sudo 工作階段記錄\n" +"\n" + +#: plugins/sudoers/sudoreplay.c:1625 +msgid "" +"\n" +"Options:\n" +" -d, --directory=dir specify directory for session logs\n" +" -f, --filter=filter specify which I/O type(s) to display\n" +" -h, --help display help message and exit\n" +" -l, --list list available session IDs, with optional expression\n" +" -m, --max-wait=num max number of seconds to wait between events\n" +" -n, --non-interactive no prompts, session is sent to the standard output\n" +" -R, --no-resize do not attempt to re-size the terminal\n" +" -S, --suspend-wait wait while the command was suspended\n" +" -s, --speed=num speed up or slow down output\n" +" -V, --version display version information and exit" +msgstr "" +"\n" +"選項:\n" +" -d, --directory=目錄 指定工作階段的記錄目錄\n" +" -f, --filter=過濾器 指定要顯示的 I/O 類型\n" +" -h, --help 顯示說明訊息並退出\n" +" -l, --list 列出可用工作階段 ID,可加表達式限定列出階段\n" +" -m, --max-wait=數值 事件間等待的最大秒數\n" +" -n, --non-interactive 不提示,將工作階段送至標準輸出\n" +" -R, --no-resize 不嘗試重新調整終端機大小\n" +" -S, --suspend-wait 在指令暫停時等待\n" +" -s, --speed=數值 加速或減速輸出速度\n" +" -V, --version 顯示版本訊息並退出" + +#: plugins/sudoers/testsudoers.c:362 +msgid "\thost unmatched" +msgstr "\t主機不相符" + +#: plugins/sudoers/testsudoers.c:365 +msgid "" +"\n" +"Command allowed" +msgstr "" +"\n" +"指令已允許" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command denied" +msgstr "" +"\n" +"指令被拒" + +#: plugins/sudoers/testsudoers.c:366 +msgid "" +"\n" +"Command unmatched" +msgstr "" +"\n" +"指令不相符" + +#: plugins/sudoers/timestamp.c:267 +#, c-format +msgid "%s is group writable" +msgstr "%s 允許群組寫入" + +#: plugins/sudoers/timestamp.c:343 +#, c-format +msgid "unable to truncate time stamp file to %lld bytes" +msgstr "無法將時間戳檔案截短為 %lld 位元組" + +#: plugins/sudoers/timestamp.c:829 plugins/sudoers/timestamp.c:921 +#: plugins/sudoers/visudo.c:498 plugins/sudoers/visudo.c:504 +msgid "unable to read the clock" +msgstr "無法讀取時鐘" + +#: plugins/sudoers/timestamp.c:840 +msgid "ignoring time stamp from the future" +msgstr "將忽略未來時間的時間戳" + +#: plugins/sudoers/timestamp.c:863 +#, c-format +msgid "time stamp too far in the future: %20.20s" +msgstr "時間戳超前目前時間過多:%20.20s" + +#: plugins/sudoers/timestamp.c:985 +#, c-format +msgid "unable to lock time stamp file %s" +msgstr "無法鎖定時間戳檔案 %s" + +#: plugins/sudoers/timestamp.c:1029 plugins/sudoers/timestamp.c:1049 +#, c-format +msgid "lecture status path too long: %s/%s" +msgstr "指引狀態路徑過長:%s/%s" + +#: plugins/sudoers/visudo.c:232 +msgid "the -x option will be removed in a future release" +msgstr "未來版本會移除 -x 選項" + +#: plugins/sudoers/visudo.c:233 +msgid "please consider using the cvtsudoers utility instead" +msgstr "請考慮換用 cvtsudoers 工具" + +#: plugins/sudoers/visudo.c:284 plugins/sudoers/visudo.c:666 +#, c-format +msgid "press return to edit %s: " +msgstr "按確認鍵編輯 %s:" + +#: plugins/sudoers/visudo.c:345 +#, c-format +msgid "specified editor (%s) doesn't exist" +msgstr "指定的編輯器 (%s) 不存在" + +#: plugins/sudoers/visudo.c:347 +#, c-format +msgid "no editor found (editor path = %s)" +msgstr "未找到編輯器 (編輯器路徑 = %s)" + +#: plugins/sudoers/visudo.c:457 plugins/sudoers/visudo.c:465 +msgid "write error" +msgstr "寫入時發生錯誤" + +#: plugins/sudoers/visudo.c:511 +#, c-format +msgid "unable to stat temporary file (%s), %s unchanged" +msgstr "無法 stat 暫存檔 (%s),%s 未變更" + +#: plugins/sudoers/visudo.c:518 +#, c-format +msgid "zero length temporary file (%s), %s unchanged" +msgstr "暫存檔內沒有內容 (%s),%s 未變更" + +#: plugins/sudoers/visudo.c:524 +#, c-format +msgid "editor (%s) failed, %s unchanged" +msgstr "編輯器 (%s) 執行失敗,%s 未變更" + +#: plugins/sudoers/visudo.c:546 +#, c-format +msgid "%s unchanged" +msgstr "%s 未變更" + +#: plugins/sudoers/visudo.c:605 +#, c-format +msgid "unable to re-open temporary file (%s), %s unchanged." +msgstr "無法重新開啟暫存檔 (%s),%s 未變更。" + +#: plugins/sudoers/visudo.c:617 +#, c-format +msgid "unabled to parse temporary file (%s), unknown error" +msgstr "無法解析暫存檔 (%s),未知錯誤" + +#: plugins/sudoers/visudo.c:655 +#, c-format +msgid "internal error, unable to find %s in list!" +msgstr "內部錯誤,原因:列表中找不到 %s!" + +#: plugins/sudoers/visudo.c:735 plugins/sudoers/visudo.c:744 +#, c-format +msgid "unable to set (uid, gid) of %s to (%u, %u)" +msgstr "無法將 %s 的 (uid, gid) 設為 (%u, %u)" + +#: plugins/sudoers/visudo.c:767 +#, c-format +msgid "%s and %s not on the same file system, using mv to rename" +msgstr "%s 和 %s 不在同一個檔案系統,將使用 mv 進行重新命名" + +#: plugins/sudoers/visudo.c:781 +#, c-format +msgid "command failed: '%s %s %s', %s unchanged" +msgstr "指令失敗:「%s %s %s」,%s 未變更" + +#: plugins/sudoers/visudo.c:791 +#, c-format +msgid "error renaming %s, %s unchanged" +msgstr "重新命名 %s 發生錯誤,%s 未變更" + +#: plugins/sudoers/visudo.c:812 +msgid "What now? " +msgstr "現在該做些什麼?" + +#: plugins/sudoers/visudo.c:826 +msgid "" +"Options are:\n" +" (e)dit sudoers file again\n" +" e(x)it without saving changes to sudoers file\n" +" (Q)uit and save changes to sudoers file (DANGER!)\n" +msgstr "" +"選項有:\n" +" 重新編輯 sudoers 檔案 (e)\n" +" 退出,不儲存對 sudoers 檔案的變更 (x)\n" +" 退出並將變更儲存到 sudoers 檔案(十分危險!)(Q)\n" + +#: plugins/sudoers/visudo.c:872 +#, c-format +msgid "unable to run %s" +msgstr "無法執行 %s" + +#: plugins/sudoers/visudo.c:902 +#, c-format +msgid "%s: wrong owner (uid, gid) should be (%u, %u)\n" +msgstr "%s:所有者無效,(uid, gid) 應為 (%u, %u)\n" + +#: plugins/sudoers/visudo.c:909 +#, c-format +msgid "%s: bad permissions, should be mode 0%o\n" +msgstr "%s:權限不正確,模式應該是 0%o\n" + +#: plugins/sudoers/visudo.c:966 plugins/sudoers/visudo.c:973 +#, c-format +msgid "%s: parsed OK\n" +msgstr "%s:解析正確\n" + +#: plugins/sudoers/visudo.c:992 +#, c-format +msgid "%s busy, try again later" +msgstr "%s 忙碌中,請稍後重試" + +#: plugins/sudoers/visudo.c:995 +#, c-format +msgid "unable to lock %s" +msgstr "無法鎖定 %s" + +#: plugins/sudoers/visudo.c:996 +msgid "Edit anyway? [y/N]" +msgstr "仍然編輯?[y/N]" + +#: plugins/sudoers/visudo.c:1080 +#, c-format +msgid "Error: %s:%d cycle in %s \"%s\"" +msgstr "錯誤:%s:%d 在 %s「%s」中發生循環" + +#: plugins/sudoers/visudo.c:1081 +#, c-format +msgid "Warning: %s:%d cycle in %s \"%s\"" +msgstr "警告:%s:%d 在 %s「%s」中發生循環" + +#: plugins/sudoers/visudo.c:1085 +#, c-format +msgid "Error: %s:%d %s \"%s\" referenced but not defined" +msgstr "錯誤:%s:%d 引用了 %s「%s」但尚未定義" + +#: plugins/sudoers/visudo.c:1086 +#, c-format +msgid "Warning: %s:%d %s \"%s\" referenced but not defined" +msgstr "警告:%s:%d 引用了 %s「%s」但尚未定義" + +#: plugins/sudoers/visudo.c:1177 +#, c-format +msgid "Warning: %s:%d unused %s \"%s\"" +msgstr "警告:%s:%d 未使用的 %s「%s」" + +#: plugins/sudoers/visudo.c:1292 +#, c-format +msgid "" +"%s - safely edit the sudoers file\n" +"\n" +msgstr "" +"%s - 安全地編輯 sudoers 檔案\n" +"\n" + +#: plugins/sudoers/visudo.c:1294 +msgid "" +"\n" +"Options:\n" +" -c, --check check-only mode\n" +" -f, --file=sudoers specify sudoers file location\n" +" -h, --help display help message and exit\n" +" -q, --quiet less verbose (quiet) syntax error messages\n" +" -s, --strict strict syntax checking\n" +" -V, --version display version information and exit\n" +msgstr "" +"\n" +"選項:\n" +" -c, --check 純檢查模式\n" +" -f, --file=sudoers 指定 sudoers 檔的位置\n" +" -h, --help 顯示說明訊息並退出\n" +" -q, --quiet 不詳細(不輸出)的語法錯誤訊息\n" +" -s, --strict 嚴格語法檢查\n" +" -V, --version 顯示版本訊息並退出\n" + +#: toke.l:941 +msgid "too many levels of includes" +msgstr "include 嵌套層數過多" + +#~ msgid "ignoring invalid attribute value: %s" +#~ msgstr "將忽略無效的屬性值:%s" + +#~ msgid "unable to cache user %s, out of memory" +#~ msgstr "無法快取使用者 %s,原因:記憶體不足" + +#~ msgid "unable to cache group %s, out of memory" +#~ msgstr "無法快取群組 %s,原因:記憶體不足" + +#~ msgid "unable to cache group list for %s, out of memory" +#~ msgstr "無法快取群組列表 %s,原因:已經存在" diff --git a/utsudo-0.0.2/plugins/sudoers/policy.c b/utsudo-0.0.2/plugins/sudoers/policy.c new file mode 100644 index 0000000..d685017 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/policy.c @@ -0,0 +1,1010 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" +#include "sudoers_version.h" +#include "interfaces.h" + +/* + * Info passed in from the sudo front-end. + */ +struct sudoers_policy_open_info { + char * const *settings; + char * const *user_info; + char * const *plugin_args; +}; + +/* + * Command execution args to be filled in: argv, envp and command info. + */ +struct sudoers_exec_args { + char ***argv; + char ***envp; + char ***info; +}; + +static unsigned int sudo_version; +static const char *interfaces_string; +sudo_conv_t sudo_conv; +sudo_printf_t sudo_printf; +const char *path_ldap_conf = _PATH_LDAP_CONF; +const char *path_ldap_secret = _PATH_LDAP_SECRET; + +extern __dso_public struct policy_plugin sudoers_policy; + +#ifdef HAVE_BSD_AUTH_H +extern char *login_style; +#endif /* HAVE_BSD_AUTH_H */ + +static int +parse_bool(const char *line, int varlen, int *flags, int fval) +{ + debug_decl(parse_bool, SUDOERS_DEBUG_PLUGIN) + + switch (sudo_strtobool(line + varlen + 1)) { + case true: + SET(*flags, fval); + debug_return_int(true); + case false: + CLR(*flags, fval); + debug_return_int(false); + default: + sudo_warn(U_("invalid %.*s set by sudo front-end"), + varlen, line); + debug_return_int(-1); + } +} + +/* + * Deserialize args, settings and user_info arrays. + * Fills in struct sudo_user and other common sudoers state. + */ +int +sudoers_policy_deserialize_info(void *v, char **runas_user, char **runas_group) +{ + const int edit_mask = MODE_EDIT|MODE_IGNORE_TICKET|MODE_NONINTERACTIVE; + struct sudoers_policy_open_info *info = v; + const char *p, *errstr, *groups = NULL; + const char *remhost = NULL; + char * const *cur; + int flags = 0; + debug_decl(sudoers_policy_deserialize_info, SUDOERS_DEBUG_PLUGIN) + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0) + +#define CHECK(s, v) do { \ + if ((s)[sizeof(v) - 1] == '\0') { \ + sudo_warn(U_("invalid %.*s set by sudo front-end"), \ + (int)(sizeof(v) - 2), v); \ + goto bad; \ + } \ +} while (0) + + /* Parse sudo.conf plugin args. */ + if (info->plugin_args != NULL) { + for (cur = info->plugin_args; *cur != NULL; cur++) { + if (MATCHES(*cur, "sudoers_file=")) { + CHECK(*cur, "sudoers_file="); + sudoers_file = *cur + sizeof("sudoers_file=") - 1; + continue; + } + if (MATCHES(*cur, "sudoers_uid=")) { + p = *cur + sizeof("sudoers_uid=") - 1; + sudoers_uid = (uid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sudoers_gid=")) { + p = *cur + sizeof("sudoers_gid=") - 1; + sudoers_gid = (gid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sudoers_mode=")) { + p = *cur + sizeof("sudoers_mode=") - 1; + sudoers_mode = sudo_strtomode(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "ldap_conf=")) { + CHECK(*cur, "ldap_conf="); + path_ldap_conf = *cur + sizeof("ldap_conf=") - 1; + continue; + } + if (MATCHES(*cur, "ldap_secret=")) { + CHECK(*cur, "ldap_secret="); + path_ldap_secret = *cur + sizeof("ldap_secret=") - 1; + continue; + } + } + } + + /* Parse command line settings. */ + user_closefrom = -1; + for (cur = info->settings; *cur != NULL; cur++) { + if (MATCHES(*cur, "closefrom=")) { + errno = 0; + p = *cur + sizeof("closefrom=") - 1; + user_closefrom = sudo_strtonum(p, 4, INT_MAX, &errstr); + if (user_closefrom == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "runas_user=")) { + CHECK(*cur, "runas_user="); + *runas_user = *cur + sizeof("runas_user=") - 1; + SET(sudo_user.flags, RUNAS_USER_SPECIFIED); + continue; + } + if (MATCHES(*cur, "runas_group=")) { + CHECK(*cur, "runas_group="); + *runas_group = *cur + sizeof("runas_group=") - 1; + SET(sudo_user.flags, RUNAS_GROUP_SPECIFIED); + continue; + } + if (MATCHES(*cur, "prompt=")) { + /* Allow epmpty prompt. */ + user_prompt = *cur + sizeof("prompt=") - 1; + def_passprompt_override = true; + continue; + } + if (MATCHES(*cur, "set_home=")) { + if (parse_bool(*cur, sizeof("set_home") - 1, &flags, + MODE_RESET_HOME) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "preserve_environment=")) { + if (parse_bool(*cur, sizeof("preserve_environment") - 1, &flags, + MODE_PRESERVE_ENV) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "run_shell=")) { + if (parse_bool(*cur, sizeof("run_shell") -1, &flags, + MODE_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "login_shell=")) { + if (parse_bool(*cur, sizeof("login_shell") - 1, &flags, + MODE_LOGIN_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "implied_shell=")) { + if (parse_bool(*cur, sizeof("implied_shell") - 1, &flags, + MODE_IMPLIED_SHELL) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "preserve_groups=")) { + if (parse_bool(*cur, sizeof("preserve_groups") - 1, &flags, + MODE_PRESERVE_GROUPS) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "ignore_ticket=")) { + if (parse_bool(*cur, sizeof("ignore_ticket") -1, &flags, + MODE_IGNORE_TICKET) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "noninteractive=")) { + if (parse_bool(*cur, sizeof("noninteractive") - 1, &flags, + MODE_NONINTERACTIVE) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "sudoedit=")) { + if (parse_bool(*cur, sizeof("sudoedit") - 1, &flags, + MODE_EDIT) == -1) + goto bad; + continue; + } + if (MATCHES(*cur, "login_class=")) { + CHECK(*cur, "login_class="); + login_class = *cur + sizeof("login_class=") - 1; + def_use_loginclass = true; + continue; + } +#ifdef HAVE_PRIV_SET + if (MATCHES(*cur, "runas_privs=")) { + CHECK(*cur, "runas_privs="); + def_privs = *cur + sizeof("runas_privs=") - 1; + continue; + } + if (MATCHES(*cur, "runas_limitprivs=")) { + CHECK(*cur, "runas_limitprivs="); + def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1; + continue; + } +#endif /* HAVE_PRIV_SET */ +#ifdef HAVE_SELINUX + if (MATCHES(*cur, "selinux_role=")) { + CHECK(*cur, "selinux_role="); + user_role = *cur + sizeof("selinux_role=") - 1; + continue; + } + if (MATCHES(*cur, "selinux_type=")) { + CHECK(*cur, "selinux_type="); + user_type = *cur + sizeof("selinux_type=") - 1; + continue; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_BSD_AUTH_H + if (MATCHES(*cur, "bsdauth_type=")) { + CHECK(*cur, "login_style="); + login_style = *cur + sizeof("bsdauth_type=") - 1; + continue; + } +#endif /* HAVE_BSD_AUTH_H */ + if (MATCHES(*cur, "network_addrs=")) { + interfaces_string = *cur + sizeof("network_addrs=") - 1; + if (!set_interfaces(interfaces_string)) { + sudo_warn(U_("unable to parse network address list")); + goto bad; + } + continue; + } + if (MATCHES(*cur, "max_groups=")) { + errno = 0; + p = *cur + sizeof("max_groups=") - 1; + sudo_user.max_groups = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.max_groups == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "remote_host=")) { + CHECK(*cur, "remote_host="); + remhost = *cur + sizeof("remote_host=") - 1; + continue; + } + if (MATCHES(*cur, "timeout=")) { + p = *cur + sizeof("timeout=") - 1; + user_timeout = parse_timeout(p); + if (user_timeout == -1) { + if (errno == ERANGE) + sudo_warnx(U_("%s: %s"), p, U_("timeout value too large")); + else + sudo_warnx(U_("%s: %s"), p, U_("invalid timeout value")); + goto bad; + } + continue; + } +#ifdef ENABLE_SUDO_PLUGIN_API + if (MATCHES(*cur, "plugin_dir=")) { + CHECK(*cur, "plugin_dir="); + path_plugin_dir = *cur + sizeof("plugin_dir=") - 1; + continue; + } +#endif + } + + /* Sudo front-end should restrict mode flags for sudoedit. */ + if (ISSET(flags, MODE_EDIT) && (flags & edit_mask) != flags) { + sudo_warnx(U_("invalid mode flags from sudo front end: 0x%x"), flags); + goto bad; + } + + user_gid = (gid_t)-1; + user_sid = (pid_t)-1; + user_uid = (gid_t)-1; + user_umask = (mode_t)-1; + for (cur = info->user_info; *cur != NULL; cur++) { + if (MATCHES(*cur, "user=")) { + CHECK(*cur, "user="); + if ((user_name = strdup(*cur + sizeof("user=") - 1)) == NULL) + goto oom; + continue; + } + if (MATCHES(*cur, "uid=")) { + p = *cur + sizeof("uid=") - 1; + user_uid = (uid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "gid=")) { + p = *cur + sizeof("gid=") - 1; + user_gid = (gid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "groups=")) { + CHECK(*cur, "groups="); + groups = *cur + sizeof("groups=") - 1; + continue; + } + if (MATCHES(*cur, "cwd=")) { + CHECK(*cur, "cwd="); + if ((user_cwd = strdup(*cur + sizeof("cwd=") - 1)) == NULL) + goto oom; + continue; + } + if (MATCHES(*cur, "tty=")) { + CHECK(*cur, "tty="); + if ((user_ttypath = strdup(*cur + sizeof("tty=") - 1)) == NULL) + goto oom; + user_tty = user_ttypath; + if (strncmp(user_tty, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + user_tty += sizeof(_PATH_DEV) - 1; + continue; + } + if (MATCHES(*cur, "host=")) { + CHECK(*cur, "host="); + if ((user_host = strdup(*cur + sizeof("host=") - 1)) == NULL) + goto oom; + if ((p = strchr(user_host, '.')) != NULL) { + user_shost = strndup(user_host, (size_t)(p - user_host)); + if (user_shost == NULL) + goto oom; + } else { + user_shost = user_host; + } + continue; + } + if (MATCHES(*cur, "lines=")) { + errno = 0; + p = *cur + sizeof("lines=") - 1; + sudo_user.lines = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.lines == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "cols=")) { + errno = 0; + p = *cur + sizeof("cols=") - 1; + sudo_user.cols = sudo_strtonum(p, 1, INT_MAX, &errstr); + if (sudo_user.cols == 0) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "sid=")) { + p = *cur + sizeof("sid=") - 1; + user_sid = (pid_t) sudo_strtoid(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + if (MATCHES(*cur, "umask=")) { + p = *cur + sizeof("umask=") - 1; + sudo_user.umask = sudo_strtomode(p, &errstr); + if (errstr != NULL) { + sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); + goto bad; + } + continue; + } + } + + /* User name, user-ID, group-ID and host name must be specified. */ + if (user_name == NULL) { + sudo_warnx(U_("user name not set by sudo front-end")); + goto bad; + } + if (user_uid == (uid_t)-1) { + sudo_warnx(U_("user-ID not set by sudo front-end")); + goto bad; + } + if (user_gid == (gid_t)-1) { + sudo_warnx(U_("group-ID not set by sudo front-end")); + goto bad; + } + if (user_host == NULL) { + sudo_warnx(U_("host name not set by sudo front-end")); + goto bad; + } + + if ((user_runhost = strdup(remhost ? remhost : user_host)) == NULL) + goto oom; + if ((p = strchr(user_runhost, '.')) != NULL) { + user_srunhost = strndup(user_runhost, (size_t)(p - user_runhost)); + if (user_srunhost == NULL) + goto oom; + } else { + user_srunhost = user_runhost; + } + if (user_cwd == NULL) { + if ((user_cwd = strdup("unknown")) == NULL) + goto oom; + } + if (user_tty == NULL) { + if ((user_tty = strdup("unknown")) == NULL) + goto oom; + /* user_ttypath remains NULL */ + } + + if (groups != NULL) { + /* sudo_parse_gids() will print a warning on error. */ + user_ngids = sudo_parse_gids(groups, &user_gid, &user_gids); + if (user_ngids == -1) + goto bad; + } + + /* umask is only set in user_info[] for API 1.10 and above. */ + if (user_umask == (mode_t)-1) { + user_umask = umask(0); + umask(user_umask); + } + + /* Always reset the environment for a login shell. */ + if (ISSET(flags, MODE_LOGIN_SHELL)) + def_env_reset = true; + + /* Some systems support fexecve() which we use for digest matches. */ + cmnd_fd = -1; + + /* Dump settings and user info (XXX - plugin args) */ + for (cur = info->settings; *cur != NULL; cur++) + sudo_debug_printf(SUDO_DEBUG_INFO, "settings: %s", *cur); + for (cur = info->user_info; *cur != NULL; cur++) + sudo_debug_printf(SUDO_DEBUG_INFO, "user_info: %s", *cur); + +#undef MATCHES + debug_return_int(flags); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + debug_return_int(MODE_ERROR); +} + +/* + * Setup the execution environment. + * Builds up the command_info list and sets argv and envp. + * Consumes iolog_path if not NULL. + * Returns 1 on success and -1 on error. + */ +int +sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask, + char *iolog_path, void *v) +{ + struct sudoers_exec_args *exec_args = v; + char **command_info; + int info_len = 0; + debug_decl(sudoers_policy_exec_setup, SUDOERS_DEBUG_PLUGIN) + + /* Increase the length of command_info as needed, it is *not* checked. */ + command_info = calloc(48, sizeof(char *)); + if (command_info == NULL) + goto oom; + + command_info[info_len] = sudo_new_key_val("command", safe_cmnd); + if (command_info[info_len++] == NULL) + goto oom; + if (def_log_input || def_log_output) { + if (iolog_path) + command_info[info_len++] = iolog_path; /* now owned */ + if (def_log_input) { + if ((command_info[info_len++] = strdup("iolog_stdin=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_ttyin=true")) == NULL) + goto oom; + } + if (def_log_output) { + if ((command_info[info_len++] = strdup("iolog_stdout=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_stderr=true")) == NULL) + goto oom; + if ((command_info[info_len++] = strdup("iolog_ttyout=true")) == NULL) + goto oom; + } + if (def_compress_io) { + if ((command_info[info_len++] = strdup("iolog_compress=true")) == NULL) + goto oom; + } + if (def_maxseq) { + if (asprintf(&command_info[info_len++], "maxseq=%u", def_maxseq) == -1) + goto oom; + } + } + if (ISSET(sudo_mode, MODE_EDIT)) { + if ((command_info[info_len++] = strdup("sudoedit=true")) == NULL) + goto oom; + if (!def_sudoedit_checkdir) { + if ((command_info[info_len++] = strdup("sudoedit_checkdir=false")) == NULL) + goto oom; + } + if (def_sudoedit_follow) { + if ((command_info[info_len++] = strdup("sudoedit_follow=true")) == NULL) + goto oom; + } + } + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + /* Set cwd to run user's homedir. */ + if ((command_info[info_len++] = sudo_new_key_val("cwd", runas_pw->pw_dir)) == NULL) + goto oom; + } + if (def_stay_setuid) { + if (asprintf(&command_info[info_len++], "runas_uid=%u", + (unsigned int)user_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_gid=%u", + (unsigned int)user_gid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_euid=%u", + (unsigned int)runas_pw->pw_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_egid=%u", + runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid) == -1) + goto oom; + } else { + if (asprintf(&command_info[info_len++], "runas_uid=%u", + (unsigned int)runas_pw->pw_uid) == -1) + goto oom; + if (asprintf(&command_info[info_len++], "runas_gid=%u", + runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid) == -1) + goto oom; + } + if (def_preserve_groups) { + if ((command_info[info_len++] = strdup("preserve_groups=true")) == NULL) + goto oom; + } else { + int i, len; + gid_t egid; + size_t glsize; + char *cp, *gid_list; + struct gid_list *gidlist; + + /* Only use results from a group db query, not the front end. */ + gidlist = sudo_get_gidlist(runas_pw, ENTRY_TYPE_QUERIED); + + /* We reserve an extra spot in the list for the effective gid. */ + glsize = sizeof("runas_groups=") - 1 + + ((gidlist->ngids + 1) * (MAX_UID_T_LEN + 1)); + gid_list = malloc(glsize); + if (gid_list == NULL) + goto oom; + memcpy(gid_list, "runas_groups=", sizeof("runas_groups=") - 1); + cp = gid_list + sizeof("runas_groups=") - 1; + + /* On BSD systems the effective gid is the first group in the list. */ + egid = runas_gr ? (unsigned int)runas_gr->gr_gid : + (unsigned int)runas_pw->pw_gid; + len = snprintf(cp, glsize - (cp - gid_list), "%u", (unsigned int)egid); + if (len < 0 || (size_t)len >= glsize - (cp - gid_list)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(gid_list); + goto bad; + } + cp += len; + for (i = 0; i < gidlist->ngids; i++) { + if (gidlist->gids[i] != egid) { + len = snprintf(cp, glsize - (cp - gid_list), ",%u", + (unsigned int) gidlist->gids[i]); + if (len < 0 || (size_t)len >= glsize - (cp - gid_list)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + free(gid_list); + goto bad; + } + cp += len; + } + } + command_info[info_len++] = gid_list; + sudo_gidlist_delref(gidlist); + } + if (def_closefrom >= 0) { + if (asprintf(&command_info[info_len++], "closefrom=%d", def_closefrom) == -1) + goto oom; + } + if (def_ignore_iolog_errors) { + if ((command_info[info_len++] = strdup("ignore_iolog_errors=true")) == NULL) + goto oom; + } + if (def_noexec) { + if ((command_info[info_len++] = strdup("noexec=true")) == NULL) + goto oom; + } + if (def_exec_background) { + if ((command_info[info_len++] = strdup("exec_background=true")) == NULL) + goto oom; + } + if (def_set_utmp) { + if ((command_info[info_len++] = strdup("set_utmp=true")) == NULL) + goto oom; + } + if (def_use_pty) { + if ((command_info[info_len++] = strdup("use_pty=true")) == NULL) + goto oom; + } + if (def_utmp_runas) { + if ((command_info[info_len++] = sudo_new_key_val("utmp_user", runas_pw->pw_name)) == NULL) + goto oom; + } + if (def_iolog_mode != (S_IRUSR|S_IWUSR)) { + if (asprintf(&command_info[info_len++], "iolog_mode=0%o", (unsigned int)def_iolog_mode) == -1) + goto oom; + } + if (def_iolog_user != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("iolog_user", def_iolog_user)) == NULL) + goto oom; + } + if (def_iolog_group != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("iolog_group", def_iolog_group)) == NULL) + goto oom; + } + if (def_command_timeout > 0 || user_timeout > 0) { + int timeout = user_timeout; + if (timeout == 0 || def_command_timeout < timeout) + timeout = def_command_timeout; + if (asprintf(&command_info[info_len++], "timeout=%u", timeout) == -1) + goto oom; + } + if (cmnd_umask != ACCESSPERMS) { + if (asprintf(&command_info[info_len++], "umask=0%o", (unsigned int)cmnd_umask) == -1) + goto oom; + } + if (force_umask) { + if ((command_info[info_len++] = strdup("umask_override=true")) == NULL) + goto oom; + } + if (cmnd_fd != -1) { + if (sudo_version < SUDO_API_MKVERSION(1, 9)) { + /* execfd only supported by plugin API 1.9 and higher */ + close(cmnd_fd); + cmnd_fd = -1; + } else { + if (asprintf(&command_info[info_len++], "execfd=%d", cmnd_fd) == -1) + goto oom; + } + } +#ifdef HAVE_LOGIN_CAP_H + if (def_use_loginclass) { + if ((command_info[info_len++] = sudo_new_key_val("login_class", login_class)) == NULL) + goto oom; + } +#endif /* HAVE_LOGIN_CAP_H */ +#ifdef HAVE_SELINUX + if (user_role != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("selinux_role", user_role)) == NULL) + goto oom; + } + if (user_type != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("selinux_type", user_type)) == NULL) + goto oom; + } +#endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + if (runas_privs != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("runas_privs", runas_privs)) == NULL) + goto oom; + } + if (runas_limitprivs != NULL) { + if ((command_info[info_len++] = sudo_new_key_val("runas_limitprivs", runas_limitprivs)) == NULL) + goto oom; + } +#endif /* HAVE_SELINUX */ + + /* Free on exit; they are not available in the close function. */ + sudoers_gc_add(GC_VECTOR, argv); + sudoers_gc_add(GC_VECTOR, envp); + sudoers_gc_add(GC_VECTOR, command_info); + + /* Fill in exec environment info. */ + *(exec_args->argv) = argv; + *(exec_args->envp) = envp; + *(exec_args->info) = command_info; + + debug_return_int(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + while (info_len--) + free(command_info[info_len]); + free(command_info); + debug_return_int(-1); +} + +static int +sudoers_policy_open(unsigned int version, sudo_conv_t conversation, + sudo_printf_t plugin_printf, char * const settings[], + char * const user_info[], char * const envp[], char * const args[]) +{ + struct sudo_conf_debug_file_list debug_files = TAILQ_HEAD_INITIALIZER(debug_files); + struct sudoers_policy_open_info info; + const char *cp, *plugin_path = NULL; + char * const *cur; + debug_decl(sudoers_policy_open, SUDOERS_DEBUG_PLUGIN) + + sudo_version = version; + sudo_conv = conversation; + sudo_printf = plugin_printf; + + /* Plugin args are only specified for API version 1.2 and higher. */ + if (sudo_version < SUDO_API_MKVERSION(1, 2)) + args = NULL; + + /* Initialize the debug subsystem. */ + for (cur = settings; (cp = *cur) != NULL; cur++) { + if (strncmp(cp, "debug_flags=", sizeof("debug_flags=") - 1) == 0) { + cp += sizeof("debug_flags=") - 1; + if (!sudoers_debug_parse_flags(&debug_files, cp)) + debug_return_int(-1); + continue; + } + if (strncmp(cp, "plugin_path=", sizeof("plugin_path=") - 1) == 0) { + plugin_path = cp + sizeof("plugin_path=") - 1; + continue; + } + } + if (!sudoers_debug_register(plugin_path, &debug_files)) + debug_return_int(-1); + + /* Call the sudoers init function. */ + info.settings = settings; + info.user_info = user_info; + info.plugin_args = args; + debug_return_int(sudoers_policy_init(&info, envp)); +} + +static void +sudoers_policy_close(int exit_status, int error_code) +{ + debug_decl(sudoers_policy_close, SUDOERS_DEBUG_PLUGIN) + + /* We do not currently log the exit status. */ + if (error_code) { + errno = error_code; + sudo_warn(U_("unable to execute %s"), safe_cmnd); + } + + /* Close the session we opened in sudoers_policy_init_session(). */ + if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT)) + (void)sudo_auth_end_session(runas_pw); + + /* Deregister the callback for sudo_fatal()/sudo_fatalx(). */ + sudo_fatal_callback_deregister(sudoers_cleanup); + + /* Free remaining references to password and group entries. */ + /* XXX - move cleanup to function in sudoers.c */ + sudo_pw_delref(sudo_user.pw); + sudo_user.pw = NULL; + sudo_pw_delref(runas_pw); + runas_pw = NULL; + if (runas_gr != NULL) { + sudo_gr_delref(runas_gr); + runas_gr = NULL; + } + if (user_gid_list != NULL) { + sudo_gidlist_delref(user_gid_list); + user_gid_list = NULL; + } + free(user_gids); + user_gids = NULL; + + sudoers_debug_deregister(); + + return; +} + +/* + * The init_session function is called before executing the command + * and before uid/gid changes occur. + * Returns 1 on success, 0 on failure and -1 on error. + */ +static int +sudoers_policy_init_session(struct passwd *pwd, char **user_env[]) +{ + debug_decl(sudoers_policy_init_session, SUDOERS_DEBUG_PLUGIN) + + /* user_env is only specified for API version 1.2 and higher. */ + if (sudo_version < SUDO_API_MKVERSION(1, 2)) + user_env = NULL; + + debug_return_int(sudo_auth_begin_session(pwd, user_env)); +} + +static int +sudoers_policy_check(int argc, char * const argv[], char *env_add[], + char **command_infop[], char **argv_out[], char **user_env_out[]) +{ + struct sudoers_exec_args exec_args; + int ret; + debug_decl(sudoers_policy_check, SUDOERS_DEBUG_PLUGIN) + + if (!ISSET(sudo_mode, MODE_EDIT)) + SET(sudo_mode, MODE_RUN); + + exec_args.argv = argv_out; + exec_args.envp = user_env_out; + exec_args.info = command_infop; + + ret = sudoers_policy_main(argc, argv, 0, env_add, false, &exec_args); + if (ret == true && sudo_version >= SUDO_API_MKVERSION(1, 3)) { + /* Unset close function if we don't need it to avoid extra process. */ + if (!def_log_input && !def_log_output && !def_use_pty && + !sudo_auth_needs_end_session()) + sudoers_policy.close = NULL; + } + debug_return_int(ret); +} + +static int +sudoers_policy_validate(void) +{ + debug_decl(sudoers_policy_validate, SUDOERS_DEBUG_PLUGIN) + + user_cmnd = "validate"; + SET(sudo_mode, MODE_VALIDATE); + + debug_return_int(sudoers_policy_main(0, NULL, I_VERIFYPW, NULL, false, NULL)); +} + +static void +sudoers_policy_invalidate(int remove) +{ + debug_decl(sudoers_policy_invalidate, SUDOERS_DEBUG_PLUGIN) + + user_cmnd = "kill"; + /* XXX - plugin API should support a return value for fatal errors. */ + timestamp_remove(remove); + sudoers_cleanup(); + + debug_return; +} + +static int +sudoers_policy_list(int argc, char * const argv[], int verbose, + const char *list_user) +{ + int ret; + debug_decl(sudoers_policy_list, SUDOERS_DEBUG_PLUGIN) + + user_cmnd = "list"; + if (argc) + SET(sudo_mode, MODE_CHECK); + else + SET(sudo_mode, MODE_LIST); + if (list_user) { + list_pw = sudo_getpwnam(list_user); + if (list_pw == NULL) { + sudo_warnx(U_("unknown user: %s"), list_user); + debug_return_int(-1); + } + } + ret = sudoers_policy_main(argc, argv, I_LISTPW, NULL, verbose, NULL); + if (list_user) { + sudo_pw_delref(list_pw); + list_pw = NULL; + } + + debug_return_int(ret); +} + +static int +sudoers_policy_version(int verbose) +{ + debug_decl(sudoers_policy_version, SUDOERS_DEBUG_PLUGIN) + + sudo_printf(SUDO_CONV_INFO_MSG, _("Sudoers policy plugin version %s\n"), + PACKAGE_VERSION); + sudo_printf(SUDO_CONV_INFO_MSG, _("Sudoers file grammar version %d\n"), + SUDOERS_GRAMMAR_VERSION); + + if (verbose) { + sudo_printf(SUDO_CONV_INFO_MSG, _("\nSudoers path: %s\n"), sudoers_file); +#ifdef HAVE_LDAP +# ifdef _PATH_NSSWITCH_CONF + sudo_printf(SUDO_CONV_INFO_MSG, _("nsswitch path: %s\n"), _PATH_NSSWITCH_CONF); +# endif + sudo_printf(SUDO_CONV_INFO_MSG, _("ldap.conf path: %s\n"), path_ldap_conf); + sudo_printf(SUDO_CONV_INFO_MSG, _("ldap.secret path: %s\n"), path_ldap_secret); +#endif + dump_auth_methods(); + dump_defaults(); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + if (interfaces_string != NULL) { + dump_interfaces(interfaces_string); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + } + debug_return_int(true); +} + +static struct sudo_hook sudoers_hooks[] = { + { SUDO_HOOK_VERSION, SUDO_HOOK_SETENV, sudoers_hook_setenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_UNSETENV, sudoers_hook_unsetenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_GETENV, sudoers_hook_getenv, NULL }, + { SUDO_HOOK_VERSION, SUDO_HOOK_PUTENV, sudoers_hook_putenv, NULL }, + { 0, 0, NULL, NULL } +}; + +/* + * Register environment function hooks. + * Note that we have not registered sudoers with the debug subsystem yet. + */ +static void +sudoers_policy_register_hooks(int version, int (*register_hook)(struct sudo_hook *hook)) +{ + struct sudo_hook *hook; + + for (hook = sudoers_hooks; hook->hook_fn != NULL; hook++) { + if (register_hook(hook) != 0) { + sudo_warn_nodebug( + U_("unable to register hook of type %d (version %d.%d)"), + hook->hook_type, SUDO_API_VERSION_GET_MAJOR(hook->hook_version), + SUDO_API_VERSION_GET_MINOR(hook->hook_version)); + } + } +} + +__dso_public struct policy_plugin sudoers_policy = { + SUDO_POLICY_PLUGIN, + SUDO_API_VERSION, + sudoers_policy_open, + sudoers_policy_close, + sudoers_policy_version, + sudoers_policy_check, + sudoers_policy_list, + sudoers_policy_validate, + sudoers_policy_invalidate, + sudoers_policy_init_session, + sudoers_policy_register_hooks +}; diff --git a/utsudo-0.0.2/plugins/sudoers/prompt.c b/utsudo-0.0.2/plugins/sudoers/prompt.c new file mode 100644 index 0000000..3d8a97d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/prompt.c @@ -0,0 +1,170 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996,1998-2005, 2007-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" + +/* + * Expand %h and %u escapes (if present) in the prompt and pass back + * the dynamically allocated result. + */ +char * +expand_prompt(const char *old_prompt, const char *auth_user) +{ + size_t len, n; + int subst; + const char *p; + char *np, *new_prompt, *endp; + debug_decl(expand_prompt, SUDOERS_DEBUG_AUTH) + + /* How much space do we need to malloc for the prompt? */ + subst = 0; + for (p = old_prompt, len = strlen(old_prompt); *p; p++) { + if (p[0] =='%') { + switch (p[1]) { + case 'h': + p++; + len += strlen(user_shost) - 2; + subst = 1; + break; + case 'H': + p++; + len += strlen(user_host) - 2; + subst = 1; + break; + case 'p': + p++; + len += strlen(auth_user) - 2; + subst = 1; + break; + case 'u': + p++; + len += strlen(user_name) - 2; + subst = 1; + break; + case 'U': + p++; + len += strlen(runas_pw->pw_name) - 2; + subst = 1; + break; + case '%': + p++; + len--; + subst = 1; + break; + default: + break; + } + } + } + + if ((new_prompt = malloc(++len)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_str(NULL); + } + + if (subst) { + endp = new_prompt + len; + for (p = old_prompt, np = new_prompt; *p; p++) { + if (p[0] =='%') { + switch (p[1]) { + case 'h': + p++; + n = strlcpy(np, user_shost, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'H': + p++; + n = strlcpy(np, user_host, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'p': + p++; + n = strlcpy(np, auth_user, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'u': + p++; + n = strlcpy(np, user_name, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case 'U': + p++; + n = strlcpy(np, runas_pw->pw_name, np - endp); + if (n >= (size_t)(np - endp)) + goto oflow; + np += n; + continue; + case '%': + /* convert %% -> % */ + p++; + break; + default: + /* no conversion */ + break; + } + } + *np++ = *p; + if (np >= endp) + goto oflow; + } + *np = '\0'; + } else { + /* Nothing to expand. */ + memcpy(new_prompt, old_prompt, len); /* len includes NUL */ + } + + debug_return_str(new_prompt); + +oflow: + /* We pre-allocate enough space, so this should never happen. */ + free(new_prompt); + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_str(NULL); +} diff --git a/utsudo-0.0.2/plugins/sudoers/pwutil.c b/utsudo-0.0.2/plugins/sudoers/pwutil.c new file mode 100644 index 0000000..5176686 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/pwutil.c @@ -0,0 +1,1107 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_SETAUTHDB +# include +#endif /* HAVE_SETAUTHDB */ +#include +#include +#include + +#include "sudoers.h" +#include "redblack.h" +#include "pwutil.h" + +/* + * The passwd and group caches. + */ +static struct rbtree *pwcache_byuid, *pwcache_byname; +static struct rbtree *grcache_bygid, *grcache_byname; +static struct rbtree *gidlist_cache, *grlist_cache; + +static int cmp_pwuid(const void *, const void *); +static int cmp_pwnam(const void *, const void *); +static int cmp_grgid(const void *, const void *); + +/* + * Default functions for building cache items. + */ +static sudo_make_pwitem_t make_pwitem = sudo_make_pwitem; +static sudo_make_gritem_t make_gritem = sudo_make_gritem; +static sudo_make_gidlist_item_t make_gidlist_item = sudo_make_gidlist_item; +static sudo_make_grlist_item_t make_grlist_item = sudo_make_grlist_item; + +#define cmp_grnam cmp_pwnam + +/* + * AIX has the concept of authentication registries (files, NIS, LDAP, etc). + * This allows you to have separate ID <-> name mappings based on which + * authentication registries the user was looked up in. + * We store the registry as part of the key and use it when matching. + */ +#ifdef HAVE_SETAUTHDB +# define getauthregistry(u, r) aix_getauthregistry((u), (r)) +#else +# define getauthregistry(u, r) ((r)[0] = '\0') +#endif + +/* + * Change the default pwutil backend functions. + * The default functions query the password and group databases. + */ +void +sudo_pwutil_set_backend(sudo_make_pwitem_t pwitem, sudo_make_gritem_t gritem, + sudo_make_gidlist_item_t gidlist_item, sudo_make_grlist_item_t grlist_item) +{ + debug_decl(sudo_pwutil_set_backend, SUDOERS_DEBUG_NSS) + + make_pwitem = pwitem; + make_gritem = gritem; + make_gidlist_item = gidlist_item; + make_grlist_item = grlist_item; + + debug_return; +} + +/* + * Compare by user-ID. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_pwuid(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + if (ci1->k.uid == ci2->k.uid) + return strcmp(ci1->registry, ci2->registry); + if (ci1->k.uid < ci2->k.uid) + return -1; + return 1; +} + +/* + * Compare by user/group name. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_pwnam(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + int ret = strcmp(ci1->k.name, ci2->k.name); + if (ret == 0) + ret = strcmp(ci1->registry, ci2->registry); + return ret; +} + +/* + * Compare by user name, taking into account the source type. + * Need to differentiate between group-IDs received from the front-end + * (via getgroups()) and groups IDs queried from the group database. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_gidlist(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + int ret = strcmp(ci1->k.name, ci2->k.name); + if (ret == 0) { + if (ci1->type == ENTRY_TYPE_ANY || ci1->type == ci2->type) + return strcmp(ci1->registry, ci2->registry); + if (ci1->type < ci2->type) + return -1; + return 1; + } + return ret; +} + +void +sudo_pw_addref(struct passwd *pw) +{ + debug_decl(sudo_pw_addref, SUDOERS_DEBUG_NSS) + ptr_to_item(pw)->refcnt++; + debug_return; +} + +static void +sudo_pw_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_pw_delref_item, SUDOERS_DEBUG_NSS) + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_pw_delref(struct passwd *pw) +{ + debug_decl(sudo_pw_delref, SUDOERS_DEBUG_NSS) + sudo_pw_delref_item(ptr_to_item(pw)); + debug_return; +} + +/* + * Get a password entry by uid and allocate space for it. + */ +struct passwd * +sudo_getpwuid(uid_t uid) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getpwuid, SUDOERS_DEBUG_NSS) + + if (pwcache_byuid == NULL) { + pwcache_byuid = rbcreate(cmp_pwuid); + if (pwcache_byuid == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.uid = uid; + getauthregistry(IDtouser(uid), key.registry); + if ((node = rbfind(pwcache_byuid, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache passwd db entry if it exists or a negative response if not. + */ +#ifdef HAVE_SETAUTHDB + aix_setauthdb(IDtouser(uid), key.registry); +#endif + item = make_pwitem(uid, NULL); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (item == NULL) { + if (errno != ENOENT || (item = calloc(1, sizeof(*item))) == NULL) { + sudo_warn(U_("unable to cache uid %u"), (unsigned int) uid); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.uid = uid; + /* item->d.pw = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(pwcache_byuid, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache uid %u, already exists"), + (unsigned int) uid); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache uid %u"), (unsigned int) uid); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: uid %u [%s] -> user %s [%s] (%s)", __func__, + (unsigned int)uid, key.registry, + item->d.pw ? item->d.pw->pw_name : "unknown", + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.pw != NULL) + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Get a password entry by name and allocate space for it. + */ +struct passwd * +sudo_getpwnam(const char *name) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getpwnam, SUDOERS_DEBUG_NSS) + + if (pwcache_byname == NULL) { + pwcache_byname = rbcreate(cmp_pwnam); + if (pwcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = (char *) name; + getauthregistry((char *) name, key.registry); + if ((node = rbfind(pwcache_byname, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache passwd db entry if it exists or a negative response if not. + */ +#ifdef HAVE_SETAUTHDB + aix_setauthdb((char *) name, key.registry); +#endif + item = make_pwitem((uid_t)-1, name); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (item == NULL) { + const size_t len = strlen(name) + 1; + if (errno != ENOENT || (item = calloc(1, sizeof(*item) + len)) == NULL) { + sudo_warn(U_("unable to cache user %s"), name); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.name = (char *) item + sizeof(*item); + memcpy(item->k.name, name, len); + /* item->d.pw = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(pwcache_byname, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache user %s, already exists"), name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache user %s"), name); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s [%s] -> uid %d [%s] (%s)", __func__, name, + key.registry, item->d.pw ? (int)item->d.pw->pw_uid : -1, + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.pw != NULL) + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Take a user, uid, gid, home and shell and return a faked up passwd struct. + * If home or shell are NULL default values will be used. + */ +struct passwd * +sudo_mkpwent(const char *user, uid_t uid, gid_t gid, const char *home, + const char *shell) +{ + struct cache_item_pw *pwitem; + struct cache_item *item; + struct passwd *pw; + size_t len, name_len, home_len, shell_len; + int i; + debug_decl(sudo_mkpwent, SUDOERS_DEBUG_NSS) + + if (pwcache_byuid == NULL) + pwcache_byuid = rbcreate(cmp_pwuid); + if (pwcache_byname == NULL) + pwcache_byname = rbcreate(cmp_pwnam); + if (pwcache_byuid == NULL || pwcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + /* Optional arguments. */ + if (home == NULL) + home = "/"; + if (shell == NULL) + shell = _PATH_BSHELL; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: creating and caching passwd struct for %s:%u:%u:%s:%s", __func__, + user, (unsigned int)uid, (unsigned int)gid, home, shell); + + name_len = strlen(user); + home_len = strlen(home); + shell_len = strlen(shell); + len = sizeof(*pwitem) + name_len + 1 /* pw_name */ + + sizeof("*") /* pw_passwd */ + sizeof("") /* pw_gecos */ + + home_len + 1 /* pw_dir */ + shell_len + 1 /* pw_shell */; + + for (i = 0; i < 2; i++) { + struct rbtree *pwcache; + struct rbnode *node; + + pwitem = calloc(1, len); + if (pwitem == NULL) { + sudo_warn(U_("unable to cache user %s"), user); + debug_return_ptr(NULL); + } + pw = &pwitem->pw; + pw->pw_uid = uid; + pw->pw_gid = gid; + pw->pw_name = (char *)(pwitem + 1); + memcpy(pw->pw_name, user, name_len + 1); + pw->pw_passwd = pw->pw_name + name_len + 1; + memcpy(pw->pw_passwd, "*", 2); + pw->pw_gecos = pw->pw_passwd + 2; + pw->pw_gecos[0] = '\0'; + pw->pw_dir = pw->pw_gecos + 1; + memcpy(pw->pw_dir, home, home_len + 1); + pw->pw_shell = pw->pw_dir + home_len + 1; + memcpy(pw->pw_shell, shell, shell_len + 1); + + item = &pwitem->cache; + item->refcnt = 1; + item->d.pw = pw; + if (i == 0) { + /* Store by uid. */ + item->k.uid = pw->pw_uid; + pwcache = pwcache_byuid; + } else { + /* Store by name. */ + item->k.name = pw->pw_name; + pwcache = pwcache_byname; + } + getauthregistry(NULL, item->registry); + switch (rbinsert(pwcache, item, &node)) { + case 1: + /* Already exists. */ + item = node->data; + if (item->d.pw == NULL) { + /* Negative cache entry, replace with ours. */ + sudo_pw_delref_item(item); + item = node->data = &pwitem->cache; + } else { + /* Good entry, discard our fake one. */ + free(pwitem); + } + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache user %s"), user); + item->refcnt = 0; + break; + } + } + item->refcnt++; + debug_return_ptr(item->d.pw); +} + +/* + * Take a uid in string form "#123" and return a faked up passwd struct. + */ +struct passwd * +sudo_fakepwnam(const char *user, gid_t gid) +{ + const char *errstr; + uid_t uid; + debug_decl(sudo_fakepwnam, SUDOERS_DEBUG_NSS) + + uid = (uid_t) sudo_strtoid(user + 1, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "uid %s %s", user, errstr); + debug_return_ptr(NULL); + } + debug_return_ptr(sudo_mkpwent(user, uid, gid, NULL, NULL)); +} + +void +sudo_freepwcache(void) +{ + debug_decl(sudo_freepwcache, SUDOERS_DEBUG_NSS) + + if (pwcache_byuid != NULL) { + rbdestroy(pwcache_byuid, sudo_pw_delref_item); + pwcache_byuid = NULL; + } + if (pwcache_byname != NULL) { + rbdestroy(pwcache_byname, sudo_pw_delref_item); + pwcache_byname = NULL; + } + + debug_return; +} + +/* + * Compare by group-ID. + * v1 is the key to find or data to insert, v2 is in-tree data. + */ +static int +cmp_grgid(const void *v1, const void *v2) +{ + const struct cache_item *ci1 = (const struct cache_item *) v1; + const struct cache_item *ci2 = (const struct cache_item *) v2; + if (ci1->k.gid == ci2->k.gid) + return strcmp(ci1->registry, ci2->registry); + if (ci1->k.gid < ci2->k.gid) + return -1; + return 1; +} + +void +sudo_gr_addref(struct group *gr) +{ + debug_decl(sudo_gr_addref, SUDOERS_DEBUG_NSS) + ptr_to_item(gr)->refcnt++; + debug_return; +} + +static void +sudo_gr_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_gr_delref_item, SUDOERS_DEBUG_NSS) + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_gr_delref(struct group *gr) +{ + debug_decl(sudo_gr_delref, SUDOERS_DEBUG_NSS) + sudo_gr_delref_item(ptr_to_item(gr)); + debug_return; +} + +/* + * Get a group entry by gid and allocate space for it. + */ +struct group * +sudo_getgrgid(gid_t gid) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getgrgid, SUDOERS_DEBUG_NSS) + + if (grcache_bygid == NULL) { + grcache_bygid = rbcreate(cmp_grgid); + if (grcache_bygid == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.gid = gid; + getauthregistry(NULL, key.registry); + if ((node = rbfind(grcache_bygid, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gritem(gid, NULL); + if (item == NULL) { + if (errno != ENOENT || (item = calloc(1, sizeof(*item))) == NULL) { + sudo_warn(U_("unable to cache gid %u"), (unsigned int) gid); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.gid = gid; + /* item->d.gr = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grcache_bygid, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache gid %u, already exists"), + (unsigned int) gid); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache gid %u"), (unsigned int) gid); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: gid %u [%s] -> group %s [%s] (%s)", __func__, + (unsigned int)gid, key.registry, + item->d.gr ? item->d.gr->gr_name : "unknown", + item->registry, node ? "cache hit" : "cached"); + } + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +/* + * Get a group entry by name and allocate space for it. + */ +struct group * +sudo_getgrnam(const char *name) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_getgrnam, SUDOERS_DEBUG_NSS) + + if (grcache_byname == NULL) { + grcache_byname = rbcreate(cmp_grnam); + if (grcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = (char *) name; + getauthregistry(NULL, key.registry); + if ((node = rbfind(grcache_byname, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gritem((gid_t)-1, name); + if (item == NULL) { + const size_t len = strlen(name) + 1; + if (errno != ENOENT || (item = calloc(1, sizeof(*item) + len)) == NULL) { + sudo_warn(U_("unable to cache group %s"), name); + /* cppcheck-suppress memleak */ + debug_return_ptr(NULL); + } + item->refcnt = 1; + item->k.name = (char *) item + sizeof(*item); + memcpy(item->k.name, name, len); + /* item->d.gr = NULL; */ + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grcache_byname, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group %s, already exists"), name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group %s"), name); + item->refcnt = 0; + break; + } +done: + if (item->refcnt != 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: group %s [%s] -> gid %d [%s] (%s)", __func__, name, + key.registry, item->d.gr ? (int)item->d.gr->gr_gid : -1, + item->registry, node ? "cache hit" : "cached"); + } + if (item->d.gr != NULL) + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +/* + * Take a gid in string form "#123" and return a faked up group struct. + */ +struct group * +sudo_fakegrnam(const char *group) +{ + struct cache_item_gr *gritem; + struct cache_item *item; + const char *errstr; + struct group *gr; + size_t len, name_len; + int i; + debug_decl(sudo_fakegrnam, SUDOERS_DEBUG_NSS) + + if (grcache_bygid == NULL) + grcache_bygid = rbcreate(cmp_grgid); + if (grcache_byname == NULL) + grcache_byname = rbcreate(cmp_grnam); + if (grcache_bygid == NULL || grcache_byname == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + + name_len = strlen(group); + len = sizeof(*gritem) + name_len + 1; + + for (i = 0; i < 2; i++) { + struct rbtree *grcache; + struct rbnode *node; + + gritem = calloc(1, len); + if (gritem == NULL) { + sudo_warn(U_("unable to cache group %s"), group); + debug_return_ptr(NULL); + } + gr = &gritem->gr; + gr->gr_gid = (gid_t) sudo_strtoid(group + 1, &errstr); + gr->gr_name = (char *)(gritem + 1); + memcpy(gr->gr_name, group, name_len + 1); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "gid %s %s", group, errstr); + free(gritem); + debug_return_ptr(NULL); + } + + item = &gritem->cache; + item->refcnt = 1; + item->d.gr = gr; + if (i == 0) { + /* Store by gid if it doesn't already exist. */ + item->k.gid = gr->gr_gid; + grcache = grcache_bygid; + } else { + /* Store by name, overwriting cached version. */ + gritem->cache.k.name = gr->gr_name; + grcache = grcache_byname; + } + getauthregistry(NULL, item->registry); + switch (rbinsert(grcache, item, &node)) { + case 1: + /* Already exists. */ + item = node->data; + if (item->d.gr == NULL) { + /* Negative cache entry, replace with ours. */ + sudo_gr_delref_item(item); + item = node->data = &gritem->cache; + } else { + /* Good entry, discard our fake one. */ + free(gritem); + } + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group %s"), group); + item->refcnt = 0; + break; + } + } + if (item->d.gr != NULL) + item->refcnt++; + debug_return_ptr(item->d.gr); +} + +void +sudo_gidlist_addref(struct gid_list *gidlist) +{ + debug_decl(sudo_gidlist_addref, SUDOERS_DEBUG_NSS) + ptr_to_item(gidlist)->refcnt++; + debug_return; +} + +static void +sudo_gidlist_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_gidlist_delref_item, SUDOERS_DEBUG_NSS) + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_gidlist_delref(struct gid_list *gidlist) +{ + debug_decl(sudo_gidlist_delref, SUDOERS_DEBUG_NSS) + sudo_gidlist_delref_item(ptr_to_item(gidlist)); + debug_return; +} + +void +sudo_grlist_addref(struct group_list *grlist) +{ + debug_decl(sudo_grlist_addref, SUDOERS_DEBUG_NSS) + ptr_to_item(grlist)->refcnt++; + debug_return; +} + +static void +sudo_grlist_delref_item(void *v) +{ + struct cache_item *item = v; + debug_decl(sudo_grlist_delref_item, SUDOERS_DEBUG_NSS) + + if (--item->refcnt == 0) + free(item); + + debug_return; +} + +void +sudo_grlist_delref(struct group_list *grlist) +{ + debug_decl(sudo_grlist_delref, SUDOERS_DEBUG_NSS) + sudo_grlist_delref_item(ptr_to_item(grlist)); + debug_return; +} + +void +sudo_freegrcache(void) +{ + debug_decl(sudo_freegrcache, SUDOERS_DEBUG_NSS) + + if (grcache_bygid != NULL) { + rbdestroy(grcache_bygid, sudo_gr_delref_item); + grcache_bygid = NULL; + } + if (grcache_byname != NULL) { + rbdestroy(grcache_byname, sudo_gr_delref_item); + grcache_byname = NULL; + } + if (grlist_cache != NULL) { + rbdestroy(grlist_cache, sudo_grlist_delref_item); + grlist_cache = NULL; + } + if (gidlist_cache != NULL) { + rbdestroy(gidlist_cache, sudo_gidlist_delref_item); + gidlist_cache = NULL; + } + + debug_return; +} + +struct group_list * +sudo_get_grlist(const struct passwd *pw) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_get_grlist, SUDOERS_DEBUG_NSS) + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: looking up group names for %s", + __func__, pw->pw_name); + + if (grlist_cache == NULL) { + grlist_cache = rbcreate(cmp_pwnam); + if (grlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = pw->pw_name; + getauthregistry(pw->pw_name, key.registry); + if ((node = rbfind(grlist_cache, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_grlist_item(pw, NULL); + if (item == NULL) { + /* Out of memory? */ + debug_return_ptr(NULL); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grlist_cache, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + item->refcnt = 0; + break; + } + if (item->d.grlist != NULL) { + int i; + for (i = 0; i < item->d.grlist->ngroups; i++) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s is a member of group %s", __func__, + pw->pw_name, item->d.grlist->groups[i]); + } + } +done: + if (item->d.grlist != NULL) + item->refcnt++; + debug_return_ptr(item->d.grlist); +} + +int +sudo_set_grlist(struct passwd *pw, char * const *groups) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_set_grlist, SUDOERS_DEBUG_NSS) + + if (grlist_cache == NULL) { + grlist_cache = rbcreate(cmp_pwnam); + if (grlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + + /* + * Cache group db entry if it doesn't already exist + */ + key.k.name = pw->pw_name; + getauthregistry(NULL, key.registry); + if ((node = rbfind(grlist_cache, &key)) == NULL) { + if ((item = make_grlist_item(pw, groups)) == NULL) { + sudo_warnx(U_("unable to parse groups for %s"), pw->pw_name); + debug_return_int(-1); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(grlist_cache, item, NULL)) { + case 1: + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + sudo_grlist_delref_item(item); + break; + case -1: + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + sudo_grlist_delref_item(item); + debug_return_int(-1); + } + } + debug_return_int(0); +} + +struct gid_list * +sudo_get_gidlist(const struct passwd *pw, unsigned int type) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_get_gidlist, SUDOERS_DEBUG_NSS) + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: looking up group-IDs for %s", + __func__, pw->pw_name); + + if (gidlist_cache == NULL) { + gidlist_cache = rbcreate(cmp_gidlist); + if (gidlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_ptr(NULL); + } + } + + key.k.name = pw->pw_name; + key.type = type; + getauthregistry(pw->pw_name, key.registry); + if ((node = rbfind(gidlist_cache, &key)) != NULL) { + item = node->data; + goto done; + } + /* + * Cache group db entry if it exists or a negative response if not. + */ + item = make_gidlist_item(pw, NULL, type); + if (item == NULL) { + /* Out of memory? */ + debug_return_ptr(NULL); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(gidlist_cache, item, NULL)) { + case 1: + /* should not happen */ + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + item->refcnt = 0; + break; + case -1: + /* can't cache item, just return it */ + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + item->refcnt = 0; + break; + } + if (item->d.gidlist != NULL) { + int i; + for (i = 0; i < item->d.gidlist->ngids; i++) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s: user %s has supplementary gid %u", __func__, + pw->pw_name, (unsigned int)item->d.gidlist->gids[i]); + } + } +done: + if (item->d.gidlist != NULL) + item->refcnt++; + debug_return_ptr(item->d.gidlist); +} + +int +sudo_set_gidlist(struct passwd *pw, char * const *gids, unsigned int type) +{ + struct cache_item key, *item; + struct rbnode *node; + debug_decl(sudo_set_gidlist, SUDOERS_DEBUG_NSS) + + if (gidlist_cache == NULL) { + gidlist_cache = rbcreate(cmp_gidlist); + if (gidlist_cache == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + } + + /* + * Cache group db entry if it doesn't already exist + */ + key.k.name = pw->pw_name; + key.type = type; + getauthregistry(NULL, key.registry); + if ((node = rbfind(gidlist_cache, &key)) == NULL) { + if ((item = make_gidlist_item(pw, gids, type)) == NULL) { + sudo_warnx(U_("unable to parse gids for %s"), pw->pw_name); + debug_return_int(-1); + } + strlcpy(item->registry, key.registry, sizeof(item->registry)); + switch (rbinsert(gidlist_cache, item, NULL)) { + case 1: + sudo_warnx(U_("unable to cache group list for %s, already exists"), + pw->pw_name); + sudo_gidlist_delref_item(item); + break; + case -1: + sudo_warn(U_("unable to cache group list for %s"), pw->pw_name); + sudo_gidlist_delref_item(item); + debug_return_int(-1); + } + } + debug_return_int(0); +} + +bool +user_in_group(const struct passwd *pw, const char *group) +{ + struct group_list *grlist = NULL; + struct gid_list *gidlist = NULL; + struct group *grp = NULL; + bool matched = false; + int i; + debug_decl(user_in_group, SUDOERS_DEBUG_NSS) + + /* + * If it could be a sudo-style group-ID check gids first. + */ + if (group[0] == '#') { + const char *errstr; + gid_t gid = (gid_t) sudo_strtoid(group + 1, &errstr); + if (errstr != NULL) { + sudo_debug_printf(SUDO_DEBUG_DIAG|SUDO_DEBUG_LINENO, + "gid %s %s", group, errstr); + } else { + if (gid == pw->pw_gid) { + matched = true; + goto done; + } + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (gid == gidlist->gids[i]) { + matched = true; + goto done; + } + } + } + } + } + + /* + * Next match the group name. By default, sudoers resolves all the user's + * group-IDs to names and matches by name. If match_group_by_gid is + * set, each group is sudoers is resolved and matching is by group-ID. + */ + if (def_match_group_by_gid) { + gid_t gid; + + /* Look up the ID of the group in sudoers. */ + if ((grp = sudo_getgrnam(group)) == NULL) + goto done; + gid = grp->gr_gid; + + /* Check against user's primary (passwd file) group-ID. */ + if (gid == pw->pw_gid) { + matched = true; + goto done; + } + + /* Check the supplementary group vector. */ + if (gidlist == NULL) { + if ((gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY)) != NULL) { + for (i = 0; i < gidlist->ngids; i++) { + if (gid == gidlist->gids[i]) { + matched = true; + goto done; + } + } + } + } + } else if ((grlist = sudo_get_grlist(pw)) != NULL) { + int (*compare)(const char *, const char *); + if (def_case_insensitive_group) + compare = strcasecmp; + else + compare = strcmp; + + /* Check the supplementary group vector. */ + for (i = 0; i < grlist->ngroups; i++) { + if (compare(group, grlist->groups[i]) == 0) { + matched = true; + goto done; + } + } + + /* Check against user's primary (passwd file) group. */ + if ((grp = sudo_getgrgid(pw->pw_gid)) != NULL) { + if (compare(group, grp->gr_name) == 0) { + matched = true; + goto done; + } + } + } + +done: + if (grp != NULL) + sudo_gr_delref(grp); + if (grlist != NULL) + sudo_grlist_delref(grlist); + if (gidlist != NULL) + sudo_gidlist_delref(gidlist); + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: user %s %sin group %s", + __func__, pw->pw_name, matched ? "" : "NOT ", group); + debug_return_bool(matched); +} diff --git a/utsudo-0.0.2/plugins/sudoers/pwutil.h b/utsudo-0.0.2/plugins/sudoers/pwutil.h new file mode 100644 index 0000000..e5d7f22 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/pwutil.h @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2013, 2015-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_PWUTIL_H +#define SUDOERS_PWUTIL_H + +#define ptr_to_item(p) ((struct cache_item *)((char *)p - offsetof(struct cache_item_##p, p))) + +/* + * Generic cache element. + */ +struct cache_item { + unsigned int refcnt; + unsigned int type; /* only used for gidlist */ + char registry[16]; /* AIX-specific, empty otherwise */ + /* key */ + union { + uid_t uid; + gid_t gid; + char *name; + } k; + /* datum */ + union { + struct passwd *pw; + struct group *gr; + struct group_list *grlist; + struct gid_list *gidlist; + } d; +}; + +/* + * Container structs to simpify size and offset calculations and guarantee + * proper aligment of struct passwd, group, gid_list and group_list. + */ +struct cache_item_pw { + struct cache_item cache; + struct passwd pw; +}; + +struct cache_item_gr { + struct cache_item cache; + struct group gr; +}; + +struct cache_item_grlist { + struct cache_item cache; + struct group_list grlist; + /* actually bigger */ +}; + +struct cache_item_gidlist { + struct cache_item cache; + struct gid_list gidlist; + /* actually bigger */ +}; + +struct cache_item *sudo_make_gritem(gid_t gid, const char *group); +struct cache_item *sudo_make_grlist_item(const struct passwd *pw, char * const *groups); +struct cache_item *sudo_make_gidlist_item(const struct passwd *pw, char * const *gids, unsigned int type); +struct cache_item *sudo_make_pwitem(uid_t uid, const char *user); + +#endif /* SUDOERS_PWUTIL_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/pwutil_impl.c b/utsudo-0.0.2/plugins/sudoers/pwutil_impl.c new file mode 100644 index 0000000..9d56e73 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/pwutil_impl.c @@ -0,0 +1,417 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "pwutil.h" + +#ifndef LOGIN_NAME_MAX +# ifdef _POSIX_LOGIN_NAME_MAX +# define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX +# else +# define LOGIN_NAME_MAX 9 +# endif +#endif /* LOGIN_NAME_MAX */ + +#define FIELD_SIZE(src, name, size) \ +do { \ + if (src->name) { \ + size = strlen(src->name) + 1; \ + total += size; \ + } \ +} while (0) + +#define FIELD_COPY(src, dst, name, size) \ +do { \ + if (src->name) { \ + memcpy(cp, src->name, size); \ + dst->name = cp; \ + cp += size; \ + } \ +} while (0) + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * uid is the key. Fills in datum from struct password. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +sudo_make_pwitem(uid_t uid, const char *name) +{ + char *cp; + const char *pw_shell; + size_t nsize, psize, csize, gsize, dsize, ssize, total; + struct cache_item_pw *pwitem; + struct passwd *pw, *newpw; + debug_decl(sudo_make_pwitem, SUDOERS_DEBUG_NSS) + + /* Look up by name or uid. */ + pw = name ? getpwnam(name) : getpwuid(uid); + if (pw == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* If shell field is empty, expand to _PATH_BSHELL. */ + pw_shell = (pw->pw_shell == NULL || pw->pw_shell[0] == '\0') + ? _PATH_BSHELL : pw->pw_shell; + + /* Allocate in one big chunk for easy freeing. */ + nsize = psize = csize = gsize = dsize = ssize = 0; + total = sizeof(*pwitem); + FIELD_SIZE(pw, pw_name, nsize); + FIELD_SIZE(pw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_SIZE(pw, pw_class, csize); +#endif + FIELD_SIZE(pw, pw_gecos, gsize); + FIELD_SIZE(pw, pw_dir, dsize); + /* Treat shell specially since we expand "" -> _PATH_BSHELL */ + ssize = strlen(pw_shell) + 1; + total += ssize; + if (name != NULL) + total += strlen(name) + 1; + + /* Allocate space for struct item, struct passwd and the strings. */ + if ((pwitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + newpw = &pwitem->pw; + + /* + * Copy in passwd contents and make strings relative to space + * at the end of the struct. + */ + memcpy(newpw, pw, sizeof(*pw)); + cp = (char *)(pwitem + 1); + FIELD_COPY(pw, newpw, pw_name, nsize); + FIELD_COPY(pw, newpw, pw_passwd, psize); +#ifdef HAVE_LOGIN_CAP_H + FIELD_COPY(pw, newpw, pw_class, csize); +#endif + FIELD_COPY(pw, newpw, pw_gecos, gsize); + FIELD_COPY(pw, newpw, pw_dir, dsize); + /* Treat shell specially since we expand "" -> _PATH_BSHELL */ + memcpy(cp, pw_shell, ssize); + newpw->pw_shell = cp; + cp += ssize; + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + pwitem->cache.k.name = cp; + } else { + pwitem->cache.k.uid = pw->pw_uid; + } + pwitem->cache.d.pw = newpw; + pwitem->cache.refcnt = 1; + + debug_return_ptr(&pwitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. If name is non-NULL it is used as the key, else the + * gid is the key. Fills in datum from struct group. + * Returns NULL on calloc error or unknown name/id, setting errno + * to ENOMEM or ENOENT respectively. + */ +struct cache_item * +sudo_make_gritem(gid_t gid, const char *name) +{ + char *cp; + size_t nsize, psize, nmem, total, len; + struct cache_item_gr *gritem; + struct group *gr, *newgr; + debug_decl(sudo_make_gritem, SUDOERS_DEBUG_NSS) + + /* Look up by name or gid. */ + gr = name ? getgrnam(name) : getgrgid(gid); + if (gr == NULL) { + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + nsize = psize = nmem = 0; + total = sizeof(*gritem); + FIELD_SIZE(gr, gr_name, nsize); + FIELD_SIZE(gr, gr_passwd, psize); + if (gr->gr_mem) { + for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) + total += strlen(gr->gr_mem[nmem]) + 1; + nmem++; + total += sizeof(char *) * nmem; + } + if (name != NULL) + total += strlen(name) + 1; + + if ((gritem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + /* + * Copy in group contents and make strings relative to space + * at the end of the buffer. Note that gr_mem must come + * immediately after struct group to guarantee proper alignment. + */ + newgr = &gritem->gr; + memcpy(newgr, gr, sizeof(*gr)); + cp = (char *)(gritem + 1); + if (gr->gr_mem) { + newgr->gr_mem = (char **)cp; + cp += sizeof(char *) * nmem; + for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) { + len = strlen(gr->gr_mem[nmem]) + 1; + memcpy(cp, gr->gr_mem[nmem], len); + newgr->gr_mem[nmem] = cp; + cp += len; + } + newgr->gr_mem[nmem] = NULL; + } + FIELD_COPY(gr, newgr, gr_passwd, psize); + FIELD_COPY(gr, newgr, gr_name, nsize); + + /* Set key and datum. */ + if (name != NULL) { + memcpy(cp, name, strlen(name) + 1); + gritem->cache.k.name = cp; + } else { + gritem->cache.k.gid = gr->gr_gid; + } + gritem->cache.d.gr = newgr; + gritem->cache.refcnt = 1; + + debug_return_ptr(&gritem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in datum from user_gids or from sudo_getgrouplist2(3). + */ +struct cache_item * +sudo_make_gidlist_item(const struct passwd *pw, char * const *unused1, + unsigned int type) +{ + char *cp; + size_t nsize, total; + struct cache_item_gidlist *glitem; + struct gid_list *gidlist; + GETGROUPS_T *gids; + int i, ngids; + debug_decl(sudo_make_gidlist_item, SUDOERS_DEBUG_NSS) + + /* Don't use user_gids if the entry type says we must query the db. */ + if (type != ENTRY_TYPE_QUERIED && pw == sudo_user.pw && sudo_user.gids != NULL) { + gids = user_gids; + ngids = user_ngids; + user_gids = NULL; + user_ngids = 0; + type = ENTRY_TYPE_FRONTEND; + } else { + type = ENTRY_TYPE_QUERIED; + if (sudo_user.max_groups > 0) { + ngids = sudo_user.max_groups; + gids = reallocarray(NULL, ngids, sizeof(GETGROUPS_T)); + if (gids == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + (void)sudo_getgrouplist2(pw->pw_name, pw->pw_gid, &gids, &ngids); + } else { + gids = NULL; + if (sudo_getgrouplist2(pw->pw_name, pw->pw_gid, &gids, &ngids) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + } + } + if (ngids <= 0) { + free(gids); + errno = ENOENT; + debug_return_ptr(NULL); + } + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*glitem) + nsize; + total += sizeof(gid_t *) * ngids; + + if ((glitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + free(gids); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + gidlist = &glitem->gidlist; + cp = (char *)(glitem + 1); + gidlist->gids = (gid_t *)cp; + cp += sizeof(gid_t) * ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + glitem->cache.k.name = cp; + glitem->cache.d.gidlist = gidlist; + glitem->cache.refcnt = 1; + glitem->cache.type = type; + + /* + * Store group IDs. + */ + for (i = 0; i < ngids; i++) + gidlist->gids[i] = gids[i]; + gidlist->ngids = ngids; + free(gids); + + debug_return_ptr(&glitem->cache); +} + +/* + * Dynamically allocate space for a struct item plus the key and data + * elements. Fills in group names from a call to sudo_get_gidlist(). + */ +struct cache_item * +sudo_make_grlist_item(const struct passwd *pw, char * const *unused1) +{ + char *cp; + size_t nsize, ngroups, total, len; + struct cache_item_grlist *grlitem; + struct group_list *grlist; + struct gid_list *gidlist; + struct group *grp = NULL; + int i, groupname_len; + debug_decl(sudo_make_grlist_item, SUDOERS_DEBUG_NSS) + + gidlist = sudo_get_gidlist(pw, ENTRY_TYPE_ANY); + if (gidlist == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "no gid list for use %s", pw->pw_name); + errno = ENOENT; + debug_return_ptr(NULL); + } + +#ifdef _SC_LOGIN_NAME_MAX + groupname_len = MAX((int)sysconf(_SC_LOGIN_NAME_MAX), 32); +#else + groupname_len = MAX(LOGIN_NAME_MAX, 32); +#endif + + /* Allocate in one big chunk for easy freeing. */ + nsize = strlen(pw->pw_name) + 1; + total = sizeof(*grlitem) + nsize; + total += sizeof(char *) * gidlist->ngids; + total += groupname_len * gidlist->ngids; + +again: + if ((grlitem = calloc(1, total)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + sudo_gidlist_delref(gidlist); + debug_return_ptr(NULL); + } + + /* + * Copy in group list and make pointers relative to space + * at the end of the buffer. Note that the groups array must come + * immediately after struct group to guarantee proper alignment. + */ + grlist = &grlitem->grlist; + cp = (char *)(grlitem + 1); + grlist->groups = (char **)cp; + cp += sizeof(char *) * gidlist->ngids; + + /* Set key and datum. */ + memcpy(cp, pw->pw_name, nsize); + grlitem->cache.k.name = cp; + grlitem->cache.d.grlist = grlist; + grlitem->cache.refcnt = 1; + cp += nsize; + + /* + * Resolve and store group names by ID. + */ +#ifdef HAVE_SETAUTHDB + if (grp == NULL) + aix_setauthdb((char *) pw->pw_name, NULL); +#endif + ngroups = 0; + for (i = 0; i < gidlist->ngids; i++) { + if ((grp = sudo_getgrgid(gidlist->gids[i])) != NULL) { + len = strlen(grp->gr_name) + 1; + if (cp - (char *)grlitem + len > total) { + total += len + groupname_len; + free(grlitem); + sudo_gr_delref(grp); + goto again; + } + memcpy(cp, grp->gr_name, len); + grlist->groups[ngroups++] = cp; + cp += len; + sudo_gr_delref(grp); + } + } + grlist->ngroups = ngroups; + sudo_gidlist_delref(gidlist); + +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + + debug_return_ptr(&grlitem->cache); +} diff --git a/utsudo-0.0.2/plugins/sudoers/rcstr.c b/utsudo-0.0.2/plugins/sudoers/rcstr.c new file mode 100644 index 0000000..96b12b5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/rcstr.c @@ -0,0 +1,113 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2016-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include "sudoers.h" + +/* Trivial reference-counted strings. */ +struct rcstr { + int refcnt; + char str[1]; /* actually bigger */ +}; + +/* + * Allocate a reference-counted string and copy src to it. + * Returns the newly-created string with a refcnt of 1. + */ +char * +rcstr_dup(const char *src) +{ + size_t len = strlen(src); + char *dst; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL) + + dst = rcstr_alloc(len); + memcpy(dst, src, len); + dst[len] = '\0'; + debug_return_ptr(dst); +} + +char * +rcstr_alloc(size_t len) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL) + + /* Note: sizeof(struct rcstr) includes space for the NUL */ + rcs = malloc(sizeof(struct rcstr) + len); + if (rcs == NULL) + return NULL; + + rcs->refcnt = 1; + rcs->str[0] = '\0'; + /* cppcheck-suppress memleak */ + debug_return_ptr(rcs->str); +} + +char * +rcstr_addref(const char *s) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL) + + if (s == NULL) + debug_return_ptr(NULL); + + rcs = __containerof((const void *)s, struct rcstr, str); + rcs->refcnt++; + debug_return_ptr(rcs->str); +} + +void +rcstr_delref(const char *s) +{ + struct rcstr *rcs; + debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL) + + if (s != NULL) { + rcs = __containerof((const void *)s, struct rcstr, str); + if (--rcs->refcnt == 0) { + rcs->str[0] = '\0'; + free(rcs); + } + } + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/redblack.c b/utsudo-0.0.2/plugins/sudoers/redblack.c new file mode 100644 index 0000000..f43d98a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/redblack.c @@ -0,0 +1,481 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2007, 2009-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Adapted from the following code written by Emin Martinian: + * http://web.mit.edu/~emin/www/source_code/red_black_tree/index.html + * + * Copyright (c) 2001 Emin Martinian + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that neither the name of Emin + * Martinian nor the names of any contributors are be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include + +#include +#include + +#include "sudoers.h" +#include "redblack.h" + +static void rbrepair(struct rbtree *, struct rbnode *); +static void rotate_left(struct rbtree *, struct rbnode *); +static void rotate_right(struct rbtree *, struct rbnode *); +static void rbdestroy_int(struct rbtree *, struct rbnode *, void (*)(void *)); + +/* + * Red-Black tree, see http://en.wikipedia.org/wiki/Red-black_tree + * + * A red-black tree is a binary search tree where each node has a color + * attribute, the value of which is either red or black. Essentially, it + * is just a convenient way to express a 2-3-4 binary search tree where + * the color indicates whether the node is part of a 3-node or a 4-node. + * In addition to the ordinary requirements imposed on binary search + * trees, we make the following additional requirements of any valid + * red-black tree: + * 1) Every node is either red or black. + * 2) The root is black. + * 3) All leaves are black. + * 4) Both children of each red node are black. + * 5) The paths from each leaf up to the root each contain the same + * number of black nodes. + */ + +/* + * Create a red black tree struct using the specified compare routine. + * Allocates and returns the initialized (empty) tree or NULL if + * memory cannot be allocated. + */ +struct rbtree * +rbcreate(int (*compar)(const void *, const void*)) +{ + struct rbtree *tree; + debug_decl(rbcreate, SUDOERS_DEBUG_RBTREE) + + if ((tree = malloc(sizeof(*tree))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_ptr(NULL); + } + + tree->compar = compar; + + /* + * We use a self-referencing sentinel node called nil to simplify the + * code by avoiding the need to check for NULL pointers. + */ + tree->nil.left = tree->nil.right = tree->nil.parent = &tree->nil; + tree->nil.color = black; + tree->nil.data = NULL; + + /* + * Similarly, the fake root node keeps us from having to worry + * about splitting the root. + */ + tree->root.left = tree->root.right = tree->root.parent = &tree->nil; + tree->root.color = black; + tree->root.data = NULL; + + debug_return_ptr(tree); +} + +/* + * Perform a left rotation starting at node. + */ +static void +rotate_left(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *child; + debug_decl(rotate_left, SUDOERS_DEBUG_RBTREE) + + child = node->right; + node->right = child->left; + + if (child->left != rbnil(tree)) + child->left->parent = node; + child->parent = node->parent; + + if (node == node->parent->left) + node->parent->left = child; + else + node->parent->right = child; + child->left = node; + node->parent = child; + + debug_return; +} + +/* + * Perform a right rotation starting at node. + */ +static void +rotate_right(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *child; + debug_decl(rotate_right, SUDOERS_DEBUG_RBTREE) + + child = node->left; + node->left = child->right; + + if (child->right != rbnil(tree)) + child->right->parent = node; + child->parent = node->parent; + + if (node == node->parent->left) + node->parent->left = child; + else + node->parent->right = child; + child->right = node; + node->parent = child; + + debug_return; +} + +/* + * Insert data pointer into a redblack tree. + * Returns a 0 on success, 1 if a node matching "data" already exists + * (filling in "existing" if not NULL), or -1 on malloc() failure. + */ +int +rbinsert(struct rbtree *tree, void *data, struct rbnode **existing) +{ + struct rbnode *node = rbfirst(tree); + struct rbnode *parent = rbroot(tree); + int res; + debug_decl(rbinsert, SUDOERS_DEBUG_RBTREE) + + /* Find correct insertion point. */ + while (node != rbnil(tree)) { + parent = node; + if ((res = tree->compar(data, node->data)) == 0) { + if (existing != NULL) + *existing = node; + debug_return_int(1); + } + node = res < 0 ? node->left : node->right; + } + + node = malloc(sizeof(*node)); + if (node == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_int(-1); + } + node->data = data; + node->left = node->right = rbnil(tree); + node->parent = parent; + if (parent == rbroot(tree) || tree->compar(data, parent->data) < 0) + parent->left = node; + else + parent->right = node; + node->color = red; + + /* + * If the parent node is black we are all set, if it is red we have + * the following possible cases to deal with. We iterate through + * the rest of the tree to make sure none of the required properties + * is violated. + * + * 1) The uncle is red. We repaint both the parent and uncle black + * and repaint the grandparent node red. + * + * 2) The uncle is black and the new node is the right child of its + * parent, and the parent in turn is the left child of its parent. + * We do a left rotation to switch the roles of the parent and + * child, relying on further iterations to fixup the old parent. + * + * 3) The uncle is black and the new node is the left child of its + * parent, and the parent in turn is the left child of its parent. + * We switch the colors of the parent and grandparent and perform + * a right rotation around the grandparent. This makes the former + * parent the parent of the new node and the former grandparent. + * + * Note that because we use a sentinel for the root node we never + * need to worry about replacing the root. + */ + while (node->parent->color == red) { + struct rbnode *uncle; + if (node->parent == node->parent->parent->left) { + uncle = node->parent->parent->right; + if (uncle->color == red) { + node->parent->color = black; + uncle->color = black; + node->parent->parent->color = red; + node = node->parent->parent; + } else /* if (uncle->color == black) */ { + if (node == node->parent->right) { + node = node->parent; + rotate_left(tree, node); + } + node->parent->color = black; + node->parent->parent->color = red; + rotate_right(tree, node->parent->parent); + } + } else { /* if (node->parent == node->parent->parent->right) */ + uncle = node->parent->parent->left; + if (uncle->color == red) { + node->parent->color = black; + uncle->color = black; + node->parent->parent->color = red; + node = node->parent->parent; + } else /* if (uncle->color == black) */ { + if (node == node->parent->left) { + node = node->parent; + rotate_right(tree, node); + } + node->parent->color = black; + node->parent->parent->color = red; + rotate_left(tree, node->parent->parent); + } + } + } + rbfirst(tree)->color = black; /* first node is always black */ + debug_return_int(0); +} + +/* + * Look for a node matching key in tree. + * Returns a pointer to the node if found, else NULL. + */ +struct rbnode * +rbfind(struct rbtree *tree, void *key) +{ + struct rbnode *node = rbfirst(tree); + int res; + debug_decl(rbfind, SUDOERS_DEBUG_RBTREE) + + while (node != rbnil(tree)) { + if ((res = tree->compar(key, node->data)) == 0) + debug_return_ptr(node); + node = res < 0 ? node->left : node->right; + } + debug_return_ptr(NULL); +} + +/* + * Call func() for each node, passing it the node data and a cookie; + * If func() returns non-zero for a node, the traversal stops and the + * error value is returned. Returns 0 on successful traversal. + */ +int +rbapply_node(struct rbtree *tree, struct rbnode *node, + int (*func)(void *, void *), void *cookie, enum rbtraversal order) +{ + int error; + debug_decl(rbapply_node, SUDOERS_DEBUG_RBTREE) + + if (node != rbnil(tree)) { + if (order == preorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + if ((error = rbapply_node(tree, node->left, func, cookie, order)) != 0) + debug_return_int(error); + if (order == inorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + if ((error = rbapply_node(tree, node->right, func, cookie, order)) != 0) + debug_return_int(error); + if (order == postorder) + if ((error = func(node->data, cookie)) != 0) + debug_return_int(error); + } + debug_return_int(0); +} + +/* + * Returns the successor of node, or nil if there is none. + */ +static struct rbnode * +rbsuccessor(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *succ; + debug_decl(rbsuccessor, SUDOERS_DEBUG_RBTREE) + + if ((succ = node->right) != rbnil(tree)) { + while (succ->left != rbnil(tree)) + succ = succ->left; + } else { + /* No right child, move up until we find it or hit the root */ + for (succ = node->parent; node == succ->right; succ = succ->parent) + node = succ; + if (succ == rbroot(tree)) + succ = rbnil(tree); + } + debug_return_ptr(succ); +} + +/* + * Recursive portion of rbdestroy(). + */ +static void +rbdestroy_int(struct rbtree *tree, struct rbnode *node, void (*destroy)(void *)) +{ + debug_decl(rbdestroy_int, SUDOERS_DEBUG_RBTREE) + if (node != rbnil(tree)) { + rbdestroy_int(tree, node->left, destroy); + rbdestroy_int(tree, node->right, destroy); + if (destroy != NULL) + destroy(node->data); + free(node); + } + debug_return; +} + +/* + * Destroy the specified tree, calling the destructor "destroy" + * for each node and then freeing the tree itself. + */ +void +rbdestroy(struct rbtree *tree, void (*destroy)(void *)) +{ + debug_decl(rbdestroy, SUDOERS_DEBUG_RBTREE) + rbdestroy_int(tree, rbfirst(tree), destroy); + free(tree); + debug_return; +} + +/* + * Delete node 'z' from the tree and return its data pointer. + */ +void *rbdelete(struct rbtree *tree, struct rbnode *z) +{ + struct rbnode *x, *y; + void *data = z->data; + debug_decl(rbdelete, SUDOERS_DEBUG_RBTREE) + + if (z->left == rbnil(tree) || z->right == rbnil(tree)) + y = z; + else + y = rbsuccessor(tree, z); + x = (y->left == rbnil(tree)) ? y->right : y->left; + + if ((x->parent = y->parent) == rbroot(tree)) { + rbfirst(tree) = x; + } else { + if (y == y->parent->left) + y->parent->left = x; + else + y->parent->right = x; + } + if (y->color == black) + rbrepair(tree, x); + if (y != z) { + y->left = z->left; + y->right = z->right; + y->parent = z->parent; + y->color = z->color; + z->left->parent = z->right->parent = y; + if (z == z->parent->left) + z->parent->left = y; + else + z->parent->right = y; + } + free(z); + + debug_return_ptr(data); +} + +/* + * Repair the tree after a node has been deleted by rotating and repainting + * colors to restore the 4 properties inherent in red-black trees. + */ +static void +rbrepair(struct rbtree *tree, struct rbnode *node) +{ + struct rbnode *sibling; + debug_decl(rbrepair, SUDOERS_DEBUG_RBTREE) + + while (node->color == black && node != rbfirst(tree)) { + if (node == node->parent->left) { + sibling = node->parent->right; + if (sibling->color == red) { + sibling->color = black; + node->parent->color = red; + rotate_left(tree, node->parent); + sibling = node->parent->right; + } + if (sibling->right->color == black && sibling->left->color == black) { + sibling->color = red; + node = node->parent; + } else { + if (sibling->right->color == black) { + sibling->left->color = black; + sibling->color = red; + rotate_right(tree, sibling); + sibling = node->parent->right; + } + sibling->color = node->parent->color; + node->parent->color = black; + sibling->right->color = black; + rotate_left(tree, node->parent); + node = rbfirst(tree); /* exit loop */ + } + } else { /* if (node == node->parent->right) */ + sibling = node->parent->left; + if (sibling->color == red) { + sibling->color = black; + node->parent->color = red; + rotate_right(tree, node->parent); + sibling = node->parent->left; + } + if (sibling->right->color == black && sibling->left->color == black) { + sibling->color = red; + node = node->parent; + } else { + if (sibling->left->color == black) { + sibling->right->color = black; + sibling->color = red; + rotate_left(tree, sibling); + sibling = node->parent->left; + } + sibling->color = node->parent->color; + node->parent->color = black; + sibling->left->color = black; + rotate_right(tree, node->parent); + node = rbfirst(tree); /* exit loop */ + } + } + } + node->color = black; + + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/redblack.h b/utsudo-0.0.2/plugins/sudoers/redblack.h new file mode 100644 index 0000000..300383d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/redblack.h @@ -0,0 +1,60 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004, 2007, 2010, 2013 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_REDBLACK_H +#define SUDOERS_REDBLACK_H + +enum rbcolor { + red, + black +}; + +enum rbtraversal { + preorder, + inorder, + postorder +}; + +struct rbnode { + struct rbnode *left, *right, *parent; + void *data; + enum rbcolor color; +}; + +struct rbtree { + int (*compar)(const void *, const void *); + struct rbnode root; + struct rbnode nil; +}; + +#define rbapply(t, f, c, o) rbapply_node((t), (t)->root.left, (f), (c), (o)) +#define rbisempty(t) ((t)->root.left == &(t)->nil && (t)->root.right == &(t)->nil) +#define rbfirst(t) ((t)->root.left) +#define rbroot(t) (&(t)->root) +#define rbnil(t) (&(t)->nil) + +void *rbdelete(struct rbtree *, struct rbnode *); +int rbapply_node(struct rbtree *, struct rbnode *, + int (*)(void *, void *), void *, enum rbtraversal); +struct rbnode *rbfind(struct rbtree *, void *); +int rbinsert(struct rbtree *, void *, struct rbnode **); +struct rbtree *rbcreate(int (*)(const void *, const void *)); +void rbdestroy(struct rbtree *, void (*)(void *)); + +#endif /* SUDOERS_REDBLACK_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/regress/check_symbols/check_symbols.c b/utsudo-0.0.2/plugins/sudoers/regress/check_symbols/check_symbols.c new file mode 100644 index 0000000..ccb2ad7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/check_symbols/check_symbols.c @@ -0,0 +1,105 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudo_compat.h" +#include "sudo_dso.h" +#include "sudo_util.h" +#include "sudo_fatal.h" + +__dso_public int main(int argc, char *argv[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s plugin.so symbols_file\n", getprogname()); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + void *handle, *sym; + const char *plugin_path; + const char *symbols_file; + char *cp, line[LINE_MAX]; + FILE *fp; + int ntests = 0, errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_symbols"); + + if (argc != 3) + usage(); + plugin_path = argv[1]; + symbols_file = argv[2]; + + handle = sudo_dso_load(plugin_path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + if (handle == NULL) { + const char *errstr = sudo_dso_strerror(); + sudo_fatalx_nodebug("unable to load %s: %s", plugin_path, + errstr ? errstr : "unknown error"); + } + + fp = fopen(symbols_file, "r"); + if (fp == NULL) + sudo_fatal_nodebug("unable to open %s", symbols_file); + + while (fgets(line, sizeof(line), fp) != NULL) { + ntests++; + if ((cp = strchr(line, '\n')) != NULL) + *cp = '\0'; + sym = sudo_dso_findsym(handle, line); + if (sym == NULL) { + const char *errstr = sudo_dso_strerror(); + printf("%s: test %d: unable to resolve symbol %s: %s\n", + getprogname(), ntests, line, errstr ? errstr : "unknown error"); + errors++; + } + } + + /* + * Make sure unexported symbols are not available. + */ + ntests++; + sym = sudo_dso_findsym(handle, "user_in_group"); + if (sym != NULL) { + printf("%s: test %d: able to resolve local symbol user_in_group\n", + getprogname(), ntests); + errors++; + } + + sudo_dso_unload(handle); + + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers new file mode 100644 index 0000000..6f66083 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers @@ -0,0 +1,126 @@ +# +# Sample /etc/sudoers file. +# +# This file MUST be edited with the 'visudo' command as root. +# +# See the sudoers man page for the details on how to write a sudoers file. + +## +# Override built-in defaults +## +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +## +# User alias specification +## +User_Alias FULLTIMERS = millert, mikef, dowdy +User_Alias PARTTIMERS = bostley, jwfox, crawl +User_Alias WEBMASTERS = will, wendy, wim + +## +# Runas alias specification +## +Runas_Alias OP = root, operator +Runas_Alias DB = oracle, sybase + +## +# Host alias specification +## +Host_Alias SPARC = bigtime, eclipse, moet, anchor:\ + SGI = grolsch, dandelion, black:\ + ALPHA = widget, thalamus, foobar:\ + HPPA = boa, nag, python +Host_Alias CUNETS = 128.138.0.0/255.255.0.0 +Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 +Host_Alias SERVERS = master, mail, www, ns +Host_Alias CDROM = orion, perseus, hercules + +## +# Cmnd alias specification +## +Cmnd_Alias DUMPS = /usr/sbin/dump, /usr/sbin/rdump, /usr/sbin/restore, \ + /usr/sbin/rrestore, /usr/bin/mt, \ + sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \ + /home/operator/bin/start_backups +Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/top +Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm +Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown +Cmnd_Alias HALT = /usr/sbin/halt +Cmnd_Alias REBOOT = /usr/sbin/reboot +Cmnd_Alias SHELLS = /sbin/sh, /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \ + /usr/local/bin/tcsh, /usr/bin/rsh, \ + /usr/local/bin/zsh +Cmnd_Alias SU = /usr/bin/su +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, \ + /usr/bin/chfn +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +## +# User specification +## + +# root and users in group wheel can run anything on any machine as any user +root ALL = (ALL) ALL +%wheel ALL = (ALL) ALL + +# full time sysadmins can run anything on any machine without a password +FULLTIMERS ALL = NOPASSWD: ALL + +# part time sysadmins may run anything but need a password +PARTTIMERS ALL = ALL + +# jack may run anything on machines in CSNETS +jack CSNETS = ALL + +# lisa may run any command on any host in CUNETS (a class B network) +lisa CUNETS = ALL + +# operator may run maintenance commands and anything in /usr/oper/bin/ +operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\ + sudoedit /etc/printcap, /usr/oper/bin/ + +# joe may su only to operator +joe ALL = /usr/bin/su operator + +# pete may change passwords for anyone but root on the hp snakes +pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd *root* + +# bob may run anything on the sparc and sgi machines as any user +# listed in the Runas_Alias "OP" (ie: root and operator) +bob SPARC = (OP) ALL : SGI = (OP) ALL + +# fred can run commands as oracle or sybase without a password +fred ALL = (DB) NOPASSWD: ALL + +# on the alphas, john may su to anyone but root and flags are not allowed +john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* + +# jen can run anything on all machines except the ones +# in the "SERVERS" Host_Alias +jen ALL, !SERVERS = ALL + +# jill can run any commands in the directory /usr/bin/, except for +# those in the SU and SHELLS aliases. +jill SERVERS = /usr/bin/, !SU, !SHELLS + +# steve can run any command in the directory /usr/local/op_commands/ +# as user operator. +steve CSNETS = (operator) /usr/local/op_commands/ + +# matt needs to be able to kill things on his workstation when +# they get hung. +matt valkyrie = KILL + +# users in the WEBMASTERS User_Alias (will, wendy, and wim) +# may run any command as user www (which owns the web pages) +# or simply su to www. +WEBMASTERS www = (www) ALL, (root) /usr/bin/su www + +# anyone can mount/unmount a cd-rom on the machines in the CDROM alias +ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\ + /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers.defs b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers.defs new file mode 100755 index 0000000..c6bfa93 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/sudoers.defs @@ -0,0 +1,19 @@ +Defaults syslog=auth +Defaults>ROOT !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +User_Alias FULLTIMERS = millert, mikef, dowdy +User_Alias PARTTIMERS = bostley, jwfox, crawl + +Host_Alias SERVERS = master, mail, www, ns +Host_Alias CDROM = orion, perseus, hercules + +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, \ + /usr/bin/chfn +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +Runas_Alias ROOT = root, toor +Runas_Alias OPERATOR = operator, backup diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.out.ok new file mode 100644 index 0000000..da3f555 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.out.ok @@ -0,0 +1,14 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults!PAGERS noexec + +Host_Alias CDROM = orion, perseus, hercules +User_Alias FULLTIMERS = millert, mikef, dowdy +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +FULLTIMERS ALL = NOPASSWD: ALL + +ALL CDROM = NOPASSWD: /sbin/umount /CDROM, /sbin/mount -o nosuid\,nodev\ + /dev/cd0a /CDROM diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.sh new file mode 100755 index 0000000..c1bd001 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test1.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test user and host filters +# + +./cvtsudoers -c "" -f sudoers -m user=millert,host=hercules $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.out.ok new file mode 100644 index 0000000..26a05d2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.out.ok @@ -0,0 +1 @@ +Defaults!PAGERS noexec diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.sh new file mode 100755 index 0000000..3ca1691 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test10.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test command defaults filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d command $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.out.ok new file mode 100644 index 0000000..5c4c4e8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.out.ok @@ -0,0 +1,7 @@ +Defaults!PAGERS noexec + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less +User_Alias PARTTIMERS = bostley, jwfox, crawl +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.sh new file mode 100755 index 0000000..7cbae9f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test11.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +./cvtsudoers -c "" -f sudoers -d command $TESTDIR/sudoers.defs diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.out.ok new file mode 100644 index 0000000..7f2b15e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.out.ok @@ -0,0 +1,8 @@ +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate + +Host_Alias CDROM = orion, perseus, hercules +User_Alias FULLTIMERS = millert, mikef, dowdy +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.sh new file mode 100755 index 0000000..3ac1f59 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test12.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +./cvtsudoers -c "" -f sudoers -d user $TESTDIR/sudoers.defs diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.out.ok new file mode 100644 index 0000000..791dcba --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.out.ok @@ -0,0 +1,7 @@ +Defaults@SERVERS log_year, logfile=/var/log/sudo.log + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Host_Alias SERVERS = master, mail, www, ns +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.sh new file mode 100755 index 0000000..4442426 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test13.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +./cvtsudoers -c "" -f sudoers -d host $TESTDIR/sudoers.defs diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.out.ok new file mode 100644 index 0000000..3f7710a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.out.ok @@ -0,0 +1,7 @@ +Defaults>ROOT !set_logname + +Host_Alias CDROM = orion, perseus, hercules +Runas_Alias OPERATOR = operator, backup +User_Alias PARTTIMERS = bostley, jwfox, crawl +Runas_Alias ROOT = root, toor +Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, /usr/bin/chfn diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.sh new file mode 100755 index 0000000..90637a7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test14.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Test that Aliases are removed when filtering by defaults type +# + +./cvtsudoers -c "" -f sudoers -d runas $TESTDIR/sudoers.defs diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.out.ok new file mode 100644 index 0000000..5177139 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.out.ok @@ -0,0 +1 @@ +user1 host1, host2, host3 = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.sh new file mode 100755 index 0000000..5e02f61 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test15.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test filters and pruning +# + +./cvtsudoers -c "" -f sudoers -p -m user=user1 <root !set_logname +Defaults:FULLTIMERS !lecture +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +User_Alias FULLTIMERS = millert, mikef, dowdy +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less +Host_Alias SERVERS = master, mail, www, ns + +FULLTIMERS ALL = NOPASSWD: ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test19.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test19.sh new file mode 100755 index 0000000..4669dd3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test19.sh @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Test filters and pruning; alias contents don't get pruned +# + +./cvtsudoers -c "" -f sudoers -p -m user=FULLTIMERS,host=SERVERS $TESTDIR/sudoers diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.out.ok new file mode 100644 index 0000000..d99e0e5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.out.ok @@ -0,0 +1,10 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:millert, mikef, dowdy !lecture +Defaults:millert !authenticate +Defaults!/usr/bin/more, /usr/bin/pg, /usr/bin/less noexec + +millert, mikef, dowdy ALL = NOPASSWD: ALL + +ALL orion, perseus, hercules = NOPASSWD: /sbin/umount /CDROM, /sbin/mount -o\ + nosuid\,nodev /dev/cd0a /CDROM diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.sh new file mode 100755 index 0000000..1c799f1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test2.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test user and host filters, expanding aliases +# + +./cvtsudoers -c "" -f sudoers -e -m user=millert,host=hercules $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.conf b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.conf new file mode 100644 index 0000000..b60725c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.conf @@ -0,0 +1,6 @@ +defaults = global +expand_aliases = yes +input_format = sudoers +match = user=user2 +output_format = sudoers +prune_matches = yes diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.out.ok new file mode 100644 index 0000000..79b420b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.out.ok @@ -0,0 +1 @@ +user2 ALL = /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.sh new file mode 100755 index 0000000..e909077 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test20.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# Test cvtsudoers.conf +# + +./cvtsudoers -c $TESTDIR/test20.conf < LDIF -> sudoers +# + +./cvtsudoers -c "" -b "ou=SUDOers,dc=sudo,dc=ws" $TESTDIR/test23.out.ok | \ + ./cvtsudoers -c "" -i LDIF -f sudoers | grep -v '^#' diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.out.ok new file mode 100644 index 0000000..0951767 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.out.ok @@ -0,0 +1,89 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: logfile=/var/log/sudo + +dn: cn=root,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: root +sudoUser: root +sudoHost: ALL +sudoRunAsUser: ALL +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=%wheel,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %wheel +sudoUser: %wheel +sudoHost: ALL +sudoRunAsUser: ALL +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=\+admins,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \+admins +sudoUser: +admins +sudoHost: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=jack,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: jack +sudoUser: jack +sudoHost: 128.138.204.0/24 +sudoHost: 128.138.242.0 +sudoHost: 128.138.243.0 +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=lisa,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: lisa +sudoUser: lisa +sudoHost: 128.138.0.0/255.255.0.0 +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=operator,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: operator +sudoUser: operator +sudoHost: ALL +sudoCommand: /usr/sbin/dump +sudoCommand: /usr/sbin/rdump +sudoCommand: /usr/sbin/restore +sudoCommand: /usr/sbin/rrestore +sudoCommand: /usr/bin/mt +sudoCommand: sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== /home/operator/bin/start_backups +sudoCommand: /usr/bin/kill +sudoCommand: /usr/bin/top +sudoCommand: /usr/sbin/shutdown +sudoCommand: /usr/sbin/halt +sudoCommand: /usr/sbin/reboot +sudoCommand: /usr/sbin/lpc +sudoCommand: /usr/bin/lprm +sudoCommand: sudoedit /etc/printcap +sudoCommand: /usr/oper/bin/ +sudoOrder: 6 + +dn: cn=joe,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: joe +sudoUser: joe +sudoHost: ALL +sudoCommand: /usr/bin/su operator +sudoOrder: 7 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.sh new file mode 100755 index 0000000..0399715 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test24.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# +# Test round-tripping of LDIF -> sudoers -> LDIF +# + +./cvtsudoers -c "" -i LDIF -f sudoers $TESTDIR/test24.out.ok | \ + ./cvtsudoers -c "" -b "ou=SUDOers,dc=sudo,dc=ws" diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.out.ok new file mode 100644 index 0000000..d404815 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.out.ok @@ -0,0 +1,31 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: log_output + +dn: cn=root,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: root +sudoUser: root +sudoHost: ALL +sudoRunAsUser: ALL +sudoRunAsGroup: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 10 + +dn: cn=%wheel,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %wheel +sudoUser: %wheel +sudoHost: +sudo-hosts +sudoRunAsUser: ALL +sudoRunAsGroup: ALL +sudoOption: !authenticate +sudoCommand: ALL +sudoOrder: 20 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.sh new file mode 100755 index 0000000..3ecb88e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test25.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Test LDIF base64 attribute parsing +# + +./cvtsudoers -c "" -i ldif -b "ou=SUDOers,dc=sudo,dc=ws" -I 10 -O 10 <root !set_logname +Defaults!PAGERS noexec + +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +%wheel ALL = (ALL) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test3.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test3.sh new file mode 100755 index 0000000..21d9e6c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test3.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test group and host filters +# + +./cvtsudoers -c "" -f sudoers -m group=wheel,host=blackhole $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.out.ok new file mode 100644 index 0000000..009a54e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.out.ok @@ -0,0 +1,26 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" }, + { "username": "user2" }, + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "command": "/path/to/cmda" }, + { + "command": "/path/to/cmdb", + "negated": true + }, + { "command": "/path/to/cmdc" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.sh new file mode 100755 index 0000000..20aa9ea --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test30.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Test alias expasion when converting to JSON. +# See https://bugzilla.sudo.ws/show_bug.cgi?id=853 +# + +./cvtsudoers -c "" -e -f json <root !set_logname +Defaults!/usr/bin/more, /usr/bin/pg, /usr/bin/less noexec + +%wheel ALL = (ALL) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test4.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test4.sh new file mode 100755 index 0000000..e5e13de --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test4.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test group and host filters, expanding aliases +# + +./cvtsudoers -c "" -f sudoers -e -m group=wheel,host=blackhole $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.out.ok new file mode 100644 index 0000000..d209fdf --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.out.ok @@ -0,0 +1,6 @@ +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.sh new file mode 100755 index 0000000..1e7cdcf --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test5.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test defaults type filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d all $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.out.ok new file mode 100644 index 0000000..5e65e61 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.out.ok @@ -0,0 +1 @@ +Defaults syslog=auth diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.sh new file mode 100755 index 0000000..cebb957 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test6.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test global defaults filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d global $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.out.ok new file mode 100644 index 0000000..381de43 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.out.ok @@ -0,0 +1,2 @@ +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.sh new file mode 100755 index 0000000..3ebdb69 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test7.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test user defaults filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d user $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.out.ok new file mode 100644 index 0000000..7079ee0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.out.ok @@ -0,0 +1 @@ +Defaults>root !set_logname diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.sh new file mode 100755 index 0000000..109c219 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test8.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test runas defaults filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d runas $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.out.ok new file mode 100644 index 0000000..d2a39c4 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.out.ok @@ -0,0 +1 @@ +Defaults@SERVERS log_year, logfile=/var/log/sudo.log diff --git a/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.sh b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.sh new file mode 100755 index 0000000..18b4c51 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/cvtsudoers/test9.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Test host defaults filtering +# + +./cvtsudoers -c "" -f sudoers -s aliases,privileges -d host $TESTDIR/sudoers + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/env_match/check_env_pattern.c b/utsudo-0.0.2/plugins/sudoers/regress/env_match/check_env_pattern.c new file mode 100644 index 0000000..eece41e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/env_match/check_env_pattern.c @@ -0,0 +1,84 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include /* for sudo_compat.h */ +#include /* for sudo_compat.h */ + +#include "sudoers.h" + +__dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + FILE *fp = stdin; + char pattern[1024], string[1024]; + int errors = 0, tests = 0, got, want; + + initprogname(argc > 0 ? argv[0] : "check_env_pattern"); + + if (argc > 1) { + if ((fp = fopen(argv[1], "r")) == NULL) { + perror(argv[1]); + exit(1); + } + } + + /* + * Read in test file, which is formatted thusly: + * + * pattern string 1/0 + * + */ + for (;;) { + bool full_match = false; + + got = fscanf(fp, "%s %s %d\n", pattern, string, &want); + if (got == EOF) + break; + if (got == 3) { + got = matches_env_pattern(pattern, string, &full_match); + if (full_match) + got++; + if (got != want) { + fprintf(stderr, + "%s: %s %s: want %d, got %d\n", + getprogname(), pattern, string, want, got); + errors++; + } + tests++; + } + } + if (tests != 0) { + printf("%s: %d test%s run, %d errors, %d%% success rate\n", + getprogname(), tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/env_match/data b/utsudo-0.0.2/plugins/sudoers/regress/env_match/data new file mode 100644 index 0000000..ea28b1b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/env_match/data @@ -0,0 +1,22 @@ +foo=(){false;} foo=(){false;} 2 +foo foo=(){false;} 1 +foo= foo=(){false;} 0 +foo=* foo=(){false;} 1 +foo=(* foo=(){false;} 2 +foo=()* foo=(){false;} 2 +foo=*()* foo=(){false;} 2 +foo() foo()=a 1 +foo*() foo()=b 1 +foo*()* foo()= 1 +foo()* foo()= 1 +foo* foo()= 1 +fo*o*() foo()= 1 +fo*o*() fooo()== 1 +fo*o*() foooo()= 1 +fo*o*() foooo 0 +MYPATH=*:/mydir:* MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 2 +MYPATH=*:/mydir:** MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 2 +MYPATH=*:/mdir:* MYPATH=/dir1/subdir1:/mydir:/dir2:/dir3/subdir2 0 +a*a*a*a*a*a* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=b 1 +a*a*a*a*a*a*=b* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=b 2 +a*a*a*a*a*a*=* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=c 1 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/check_iolog_path.c b/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/check_iolog_path.c new file mode 100644 index 0000000..817f9ac --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/check_iolog_path.c @@ -0,0 +1,217 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" +#include "def_data.c" + +struct sudo_user sudo_user; +struct passwd *list_pw; + +static char sessid[7]; + +__dso_public int main(int argc, char *argv[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s datafile\n", getprogname()); + exit(1); +} + +static int +do_check(char *dir_in, char *file_in, char *tdir_out, char *tfile_out) +{ + char *path, *slash; + char dir_out[4096], file_out[4096]; + struct tm *timeptr; + time_t now; + int error = 0; + + /* + * Expand any strftime(3) escapes + * XXX - want to pass timeptr to expand_iolog_path + */ + time(&now); + timeptr = localtime(&now); + if (timeptr == NULL) + sudo_fatalx("localtime returned NULL"); + strftime(dir_out, sizeof(dir_out), tdir_out, timeptr); + strftime(file_out, sizeof(file_out), tfile_out, timeptr); + + path = expand_iolog_path(NULL, dir_in, file_in, &slash); + if (path == NULL) + sudo_fatalx("unable to expand I/O log path"); + *slash = '\0'; + if (strcmp(path, dir_out) != 0) { + sudo_warnx("%s: expected %s, got %s", dir_in, dir_out, path); + error = 1; + } + if (strcmp(slash + 1, file_out) != 0) { + sudo_warnx("%s: expected %s, got %s", file_in, file_out, slash + 1); + error = 1; + } + free(path); + + return error; +} + +#define MAX_STATE 12 + +int +main(int argc, char *argv[]) +{ + struct passwd pw, rpw; + size_t len; + FILE *fp; + char line[2048]; + char *file_in = NULL, *file_out = NULL; + char *dir_in = NULL, *dir_out = NULL; + const char *errstr; + int state = 0; + int errors = 0; + int tests = 0; + + initprogname(argc > 0 ? argv[0] : "check_iolog_path"); + + if (argc != 2) + usage(); + + fp = fopen(argv[1], "r"); + if (fp == NULL) + sudo_fatalx("unable to open %s", argv[1]); + + memset(&pw, 0, sizeof(pw)); + memset(&rpw, 0, sizeof(rpw)); + sudo_user.pw = &pw; + sudo_user._runas_pw = &rpw; + + /* + * Input consists of 12 lines: + * sequence number + * user name + * user gid + * runas user name + * runas gid + * hostname [short form] + * command + * dir [with escapes] + * file [with escapes] + * expanded dir + * expanded file + * empty line + */ + while (fgets(line, sizeof(line), fp) != NULL) { + len = strcspn(line, "\n"); + line[len] = '\0'; + + switch (state) { + case 0: + strlcpy(sessid, line, sizeof(sessid)); + break; + case 1: + if (user_name != NULL) + free(user_name); + user_name = strdup(line); + break; + case 2: + user_gid = (gid_t)sudo_strtoid(line, &errstr); + if (errstr != NULL) + sudo_fatalx("group ID %s: %s", line, errstr); + break; + case 3: + if (runas_pw->pw_name != NULL) + free(runas_pw->pw_name); + runas_pw->pw_name = strdup(line); + break; + case 4: + runas_pw->pw_gid = (gid_t)sudo_strtoid(line, &errstr); + if (errstr != NULL) + sudo_fatalx("group ID %s: %s", line, errstr); + break; + case 5: + if (user_shost != NULL) + free(user_shost); + user_shost = strdup(line); + break; + case 6: + if (user_base != NULL) + free(user_base); + user_base = strdup(line); + break; + case 7: + if (dir_in != NULL) + free(dir_in); + dir_in = strdup(line); + break; + case 8: + if (file_in != NULL) + free(file_in); + file_in = strdup(line); + break; + case 9: + if (dir_out != NULL) + free(dir_out); + dir_out = strdup(line); + break; + case 10: + if (file_out != NULL) + free(file_out); + file_out = strdup(line); + break; + case 11: + errors += do_check(dir_in, file_in, dir_out, file_out); + tests++; + break; + default: + sudo_fatalx("internal error, invalid state %d", state); + } + state = (state + 1) % MAX_STATE; + } + + if (tests != 0) { + printf("iolog_path: %d test%s run, %d errors, %d%% success rate\n", + tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + + exit(errors); +} + +bool +io_nextid(char *iolog_dir, char *fallback, char id[7]) +{ + memcpy(id, sessid, sizeof(sessid)); + return true; +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/data b/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/data new file mode 100644 index 0000000..dcc3942 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/iolog_path/data @@ -0,0 +1,96 @@ +000001 +nobody +1 +root +0 +somehost +id +/var/log/sudo-io +%%{bogus} +/var/log/sudo-io +%%{bogus} + +000001 +nobody +1 +root +0 +somehost +id +/var/log/sudo-io +%%{seq} +/var/log/sudo-io +%%{seq} + +000001 +nobody +1 +root +0 +somehost +id +/var/log/sudo-io +%{seq} +/var/log/sudo-io +00/00/01 + +000001 +nobody +1 +root +0 +somehost +id +/var/log/sudo-io/%{user} +%{seq} +/var/log/sudo-io/nobody +00/00/01 + +000001 +nobody +1 +root +0 +somehost +su +/var/log/sudo-io/%{user}/%{runas_user} +%{command}_%Y%m%s_%H%M +/var/log/sudo-io/nobody/root +su_%Y%m%s_%H%M + +000001 +nobody +1 +root +0 +somehost +su +/var/log/sudo-io/ +/%{user}/%{runas_user}/%{command}_%Y%m%s_%H%M +/var/log/sudo-io +nobody/root/su_%Y%m%s_%H%M + +000001 +nobody +1 +root +0 +somehost +su +/var/log/sudo-io/%d%m%Y +%{user}/%{runas_user}/%{command} +/var/log/sudo-io/%d%m%Y +nobody/root/su + +000001 +nobody +1 +root +0 +somehost +su +//////// +%{user}/%{runas_user}/%{command} +/ +nobody/root/su + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c b/utsudo-0.0.2/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c new file mode 100644 index 0000000..d352360 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/iolog_plugin/check_iolog_plugin.c @@ -0,0 +1,414 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" +#include "def_data.c" /* for iolog_path.c */ +#include "sudo_plugin.h" +#include "iolog.h" + +extern struct io_plugin sudoers_io; + +struct sudo_user sudo_user; +struct passwd *list_pw; +sudo_printf_t sudo_printf; +sudo_conv_t sudo_conv; + +__dso_public int main(int argc, char *argv[], char *envp[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s pathname\n", getprogname()); + exit(1); +} + +static int +sudo_printf_int(int msg_type, const char *fmt, ...) +{ + va_list ap; + int len; + + switch (msg_type) { + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(stdout, fmt, ap); + va_end(ap); + break; + case SUDO_CONV_ERROR_MSG: + va_start(ap, fmt); + len = vfprintf(stderr, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + return len; +} + +bool +validate_iolog_info(const char *logfile) +{ + time_t now; + struct log_info *info; + + time(&now); + + /* Parse log file. */ + if ((info = parse_logfile(logfile)) == NULL) + return false; + + if (strcmp(info->cwd, "/") != 0) { + sudo_warnx("bad cwd: want \"/\", got \"%s\"", info->cwd); + return false; + } + + if (strcmp(info->user, "nobody") != 0) { + sudo_warnx("bad user: want \"nobody\" got \"%s\"", info->user); + return false; + } + + if (strcmp(info->runas_user, "root") != 0) { + sudo_warnx("bad runas_user: want \"root\" got \"%s\"", info->runas_user); + return false; + } + + if (info->runas_group != NULL) { + sudo_warnx("bad runas_group: want \"\" got \"%s\"", info->runas_user); + return false; + } + + if (strcmp(info->tty, "/dev/console") != 0) { + sudo_warnx("bad tty: want \"/dev/console\" got \"%s\"", info->tty); + return false; + } + + if (strcmp(info->cmd, "/usr/bin/id") != 0) { + sudo_warnx("bad command: want \"/usr/bin/id\" got \"%s\"", info->cmd); + return false; + } + + if (info->rows != 24) { + sudo_warnx("bad rows: want 24 got %d", info->rows); + return false; + } + + if (info->cols != 80) { + sudo_warnx("bad cols: want 80 got %d", info->cols); + return false; + } + + if (info->tstamp < now - 10 || info->tstamp > now + 10) { + sudo_warnx("bad tstamp: want %lld got %lld", (long long)now, + (long long)info->tstamp); + return false; + } + + free_log_info(info); + + return true; +} + +bool +validate_timing(FILE *fp, int recno, int type, unsigned int p1, unsigned int p2) +{ + struct timing_closure timing; + char buf[LINE_MAX]; + struct timespec delay; + + if (!fgets(buf, sizeof(buf), fp)) { + sudo_warn("unable to read timing file"); + return false; + } + buf[strcspn(buf, "\n")] = '\0'; + if (!parse_timing(buf, &delay, &timing)) { + sudo_warnx("invalid timing file line: %s", buf); + return false; + } + if (timing.event != type) { + sudo_warnx("record %d: want type %d, got type %d", recno, type, + timing.event); + return false; + } + if (type == IO_EVENT_WINSIZE) { + if (timing.u.winsize.rows != (int)p1) { + sudo_warnx("record %d: want %u rows, got %u", recno, p1, + timing.u.winsize.rows); + return false; + } + if (timing.u.winsize.cols != (int)p2) { + sudo_warnx("record %d: want %u cols, got %u", recno, p2, + timing.u.winsize.cols); + return false; + } + } else { + if (timing.u.nbytes != p1) { + sudo_warnx("record %d: want len %u, got type %zu", recno, p1, + timing.u.nbytes); + return false; + } + } + if (delay.tv_sec != 0 || delay.tv_nsec > 10000000) { + sudo_warnx("record %d: got excessive delay %lld.%09ld", recno, + (long long)delay.tv_sec, delay.tv_nsec); + return false; + } + + return true; +} + + +/* + * Test sudoers I/O log plugin endpoints. + */ +void +test_endpoints(int *ntests, int *nerrors, const char *iolog_dir, char *envp[]) +{ + int rc, cmnd_argc = 1; + char buf[1024], iolog_path[PATH_MAX]; + char runas_gid[64], runas_uid[64]; + FILE *fp; + char *cmnd_argv[] = { + "/usr/bin/id", + NULL + }; + char *user_info[] = { + "cols=80", + "lines=24", + "cwd=/", + "tty=/dev/console", + "user=nobody", + NULL + }; + char *command_info[] = { + "command=/usr/bin/id", + iolog_path, + "iolog_stdin=true", + "iolog_stdout=true", + "iolog_stderr=true", + "iolog_ttyin=true", + "iolog_ttyout=true", + "iolog_compress=false", + "iolog_mode=0644", + runas_gid, + runas_uid, + NULL + }; + char *settings[] = { + NULL + }; + const char output[] = "uid=0(root) gid=0(wheel)\r\n"; + + /* Set runas uid/gid to root. */ + snprintf(runas_uid, sizeof(runas_uid), "runas_uid=%u", + (unsigned int)runas_pw->pw_uid); + snprintf(runas_gid, sizeof(runas_gid), "runas_gid=%u", + (unsigned int)runas_pw->pw_gid); + + /* Set path to the iolog directory the user passed in. */ + snprintf(iolog_path, sizeof(iolog_path), "iolog_path=%s", iolog_dir); + + /* Test open endpoint. */ + rc = sudoers_io.open(SUDO_API_VERSION, NULL, sudo_printf_int, settings, + user_info, command_info, cmnd_argc, cmnd_argv, envp, NULL); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O log open endpoint failed"); + (*nerrors)++; + return; + } + + /* Validate I/O log info file. */ + (*ntests)++; + snprintf(iolog_path, sizeof(iolog_path), "%s/log", iolog_dir); + if (!validate_iolog_info(iolog_path)) + (*nerrors)++; + + /* Test log_ttyout endpoint. */ + rc = sudoers_io.log_ttyout(output, strlen(output)); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O log_ttyout endpoint failed"); + (*nerrors)++; + return; + } + + /* Test change_winsize endpoint (twice). */ + rc = sudoers_io.change_winsize(32, 128); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O change_winsize endpoint failed"); + (*nerrors)++; + return; + } + rc = sudoers_io.change_winsize(24, 80); + (*ntests)++; + if (rc != 1) { + sudo_warnx("I/O change_winsize endpoint failed"); + (*nerrors)++; + return; + } + + /* Close the plugin. */ + sudoers_io.close(0, 0); + + /* Validate the timing file. */ + snprintf(iolog_path, sizeof(iolog_path), "%s/timing", iolog_dir); + (*ntests)++; + if ((fp = fopen(iolog_path, "r")) == NULL) { + sudo_warn("unable to open %s", iolog_path); + (*nerrors)++; + return; + } + + /* Line 1: output of id command. */ + if (!validate_timing(fp, 1, IO_EVENT_TTYOUT, strlen(output), 0)) { + (*nerrors)++; + return; + } + + /* Line 2: window size change. */ + if (!validate_timing(fp, 2, IO_EVENT_WINSIZE, 32, 128)) { + (*nerrors)++; + return; + } + + /* Line 3: window size change. */ + if (!validate_timing(fp, 3, IO_EVENT_WINSIZE, 24, 80)) { + (*nerrors)++; + return; + } + + /* Validate ttyout log file. */ + snprintf(iolog_path, sizeof(iolog_path), "%s/ttyout", iolog_dir); + (*ntests)++; + fclose(fp); + if ((fp = fopen(iolog_path, "r")) == NULL) { + sudo_warn("unable to open %s", iolog_path); + (*nerrors)++; + return; + } + if (!fgets(buf, sizeof(buf), fp)) { + sudo_warn("unable to read %s", iolog_path); + (*nerrors)++; + return; + } + if (strcmp(buf, output) != 0) { + sudo_warnx("ttylog mismatch: want \"%s\", got \"%s\"", output, buf); + (*nerrors)++; + return; + } +} + +int +main(int argc, char *argv[], char *envp[]) +{ + struct passwd pw, rpw, *tpw; + int tests = 0, errors = 0; + const char *iolog_dir; + + initprogname(argc > 0 ? argv[0] : "check_iolog_plugin"); + + if (argc != 2) + usage(); + iolog_dir = argv[1]; + + /* Bare minimum to link. */ + memset(&pw, 0, sizeof(pw)); + memset(&rpw, 0, sizeof(rpw)); + if ((tpw = getpwuid(0)) == NULL) { + if ((tpw = getpwnam("root")) == NULL) + sudo_fatalx("unable to look up uid 0 or root"); + } + rpw.pw_uid = tpw->pw_uid; + rpw.pw_gid = tpw->pw_gid; + sudo_user.pw = &pw; + sudo_user._runas_pw = &rpw; + + /* Set iolog uid/gid to invoking user. */ + iolog_uid = geteuid(); + iolog_gid = getegid(); + + test_endpoints(&tests, &errors, iolog_dir, envp); + + if (tests != 0) { + printf("check_iolog_plugin: %d test%s run, %d errors, %d%% success rate\n", + tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + + exit(errors); +} + +/* Stub functions */ + +bool +set_perms(int perm) +{ + return true; +} + +bool +restore_perms(void) +{ + return true; +} + +bool +log_warning(int flags, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_vwarn_nodebug(fmt, ap); + va_end(ap); + + return true; +} + +bool +log_warningx(int flags, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_vwarnx_nodebug(fmt, ap); + va_end(ap); + + return true; +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/iolog_util/check_iolog_util.c b/utsudo-0.0.2/plugins/sudoers/regress/iolog_util/check_iolog_util.c new file mode 100644 index 0000000..64976c5 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/iolog_util/check_iolog_util.c @@ -0,0 +1,153 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" +#include "sudo_fatal.h" +#include "iolog.h" + +__dso_public int main(int argc, char *argv[]); + +static struct parse_delay_test { + const char *input; + const char *next_field; + struct timespec expected_delay; +} parse_delay_tests[] = { + { "10.99999999999 X", "X", { 10, 999999999 } }, /* clamp to nsec */ + { "10.999999999 X", "X", { 10, 999999999 } }, /* nsec */ + { "10.999999 X", "X", { 10, 999999000 } }, /* usec -> nsec */ + { "10.000999999 X", "X", { 10, 999999 } }, + { "10.9 X", "X", { 10, 900000000 } }, + { "10.0 X", "X", { 10, 0 } } +}; + +/* + * Test parse_delay() + */ +void +test_parse_delay(int *ntests, int *nerrors) +{ + unsigned int i; + + for (i = 0; i < nitems(parse_delay_tests); i++) { + struct timespec delay; + struct parse_delay_test *test = &parse_delay_tests[i]; + char *cp = parse_delay(test->input, &delay, "."); + if (cp == NULL) { + sudo_warnx("%s:%u failed to parse delay: %s", __func__, + i, test->input); + (*nerrors)++; + continue; + } + if (strcmp(cp, test->next_field) != 0) { + sudo_warnx("%s:%u next field (want \"%s\", got \"%s\"", __func__, + i, test->next_field, cp); + (*nerrors)++; + continue; + } + if (delay.tv_sec != test->expected_delay.tv_sec) { + sudo_warnx("%s:%u wrong seconds (want %lld, got %lld)", __func__, + i, (long long)test->expected_delay.tv_sec, + (long long)delay.tv_sec); + (*nerrors)++; + continue; + } + if (delay.tv_nsec != test->expected_delay.tv_nsec) { + sudo_warnx("%s:%u wrong nanoseconds (want %ld, got %ld)", __func__, + i, test->expected_delay.tv_nsec, delay.tv_nsec); + (*nerrors)++; + continue; + } + } + (*ntests) += i; +} + +static struct adjust_delay_test { + struct timespec in_delay; + struct timespec out_delay; + struct timespec max_delay; + double scale_factor; +} adjust_delay_tests[] = { + { { 10, 300 }, { 10, 300 }, { 0, 0 }, 1.0 }, + { { 10, 300 }, { 5, 150 }, { 0, 0 }, 2.0 }, + { { 5, 300 }, { 2, 500000150 }, { 0, 0 }, 2.0 }, + { { 0, 1000000 }, { 0, 333333 }, { 0, 0 }, 3 }, + { { 10, 1000000 }, { 3, 333666666 }, { 0, 0 }, 3 }, + { { 5, 150 }, { 10, 300 }, { 0, 0 }, 0.5 }, + { { 5, 500000000 }, { 11, 0 }, { 0, 0 }, 0.5 }, + { { 5, 150 }, { 5, 0 }, { 5, 0 }, 0.5 } +}; + +/* + * Test adjust_delay() + */ +void +test_adjust_delay(int *ntests, int *nerrors) +{ + unsigned int i; + + for (i = 0; i < nitems(adjust_delay_tests); i++) { + struct adjust_delay_test *test = &adjust_delay_tests[i]; + + adjust_delay(&test->in_delay, sudo_timespecisset(&test->max_delay) ? + &test->max_delay : NULL, test->scale_factor); + if (!sudo_timespeccmp(&test->in_delay, &test->out_delay, ==)) { + sudo_warnx("%s:%u want {%lld, %ld}, got {%lld, %ld}", __func__, i, + (long long)test->out_delay.tv_sec, test->out_delay.tv_nsec, + (long long)test->in_delay.tv_sec, test->in_delay.tv_nsec); + (*nerrors)++; + } + } + (*ntests) += i; +} + +int +main(int argc, char *argv[]) +{ + int tests = 0, errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_iolog_util"); + + test_parse_delay(&tests, &errors); + + test_adjust_delay(&tests, &errors); + + if (tests != 0) { + printf("check_iolog_util: %d test%s run, %d errors, %d%% success rate\n", + tests, tests == 1 ? "" : "s", errors, + (tests - errors) * 100 / tests); + } + + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.c b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.c new file mode 100644 index 0000000..a1988f2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.c @@ -0,0 +1,110 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +extern void writeln_wrap(FILE *fp, char *line, size_t len, size_t maxlen); + +__dso_public int main(int argc, char *argv[]); + +static void +usage(void) +{ + fprintf(stderr, "usage: %s inputfile\n", getprogname()); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + size_t len; + FILE *fp; + char *line, lines[2][2048]; + int lineno = 0; + int which = 0; + + initprogname(argc > 0 ? argv[0] : "check_wrap"); + + if (argc != 2) + usage(); + + fp = fopen(argv[1], "r"); + if (fp == NULL) + sudo_fatalx("unable to open %s", argv[1]); + + /* + * Each test record consists of a log entry on one line and a list of + * line lengths to test it with on the next. E.g. + * + * Jun 30 14:49:51 : millert : TTY=ttypn ; PWD=/usr/src/local/millert/hg/sudo/trunk/plugins/sudoers ; USER=root ; TSID=0004LD ; COMMAND=/usr/local/sbin/visudo + * 60-80,40 + */ + while ((line = fgets(lines[which], sizeof(lines[which]), fp)) != NULL) { + char *cp, *last; + + len = strcspn(line, "\n"); + line[len] = '\0'; + + /* If we read the 2nd line, parse list of line lengths and check. */ + if (which) { + lineno++; + for (cp = strtok_r(lines[1], ",", &last); cp != NULL; cp = strtok_r(NULL, ",", &last)) { + char *dash; + size_t maxlen; + + /* May be either a number or a range. */ + dash = strchr(cp, '-'); + if (dash != NULL) { + *dash = '\0'; + len = sudo_strtonum(cp, 1, INT_MAX, NULL); + maxlen = sudo_strtonum(dash + 1, 1, INT_MAX, NULL); + } else { + len = maxlen = sudo_strtonum(cp, 1, INT_MAX, NULL); + } + if (len == 0 || maxlen == 0) + sudo_fatalx("%s: invalid length on line %d\n", argv[1], lineno); + while (len <= maxlen) { + printf("# word wrap at %d characters\n", (int)len); + writeln_wrap(stdout, lines[0], strlen(lines[0]), len); + len++; + } + } + } + which = !which; + } + + exit(0); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.in b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.in new file mode 100644 index 0000000..a2d1f08 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.in @@ -0,0 +1,4 @@ +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list users +60-80,120,140 +Jun 26 18:00:06 : millert : TTY=ttypm ; PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +60-80,120,140 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.out.ok new file mode 100644 index 0000000..4842443 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/logging/check_wrap.out.ok @@ -0,0 +1,175 @@ +# word wrap at 60 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 + ; PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 61 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 + ; PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 62 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 63 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 64 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 65 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 66 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 67 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool + list users +# word wrap at 68 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool + list users +# word wrap at 69 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool + list users +# word wrap at 70 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool + list users +# word wrap at 71 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool + list users +# word wrap at 72 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 73 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 74 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 75 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 76 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 77 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list + users +# word wrap at 78 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list users +# word wrap at 79 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list users +# word wrap at 80 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; + PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list users +# word wrap at 120 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; PWD=/home/tu2sp3-a ; USER=root ; + COMMAND=/opt/quest/bin/vastool list users +# word wrap at 140 characters +Jul 11 11:30:17 : tu2sp3-a : command not allowed ; TTY=pts/1 ; PWD=/home/tu2sp3-a ; USER=root ; COMMAND=/opt/quest/bin/vastool list users +# word wrap at 60 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 61 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 62 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 63 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 64 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 65 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 66 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 67 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 68 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 69 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; + TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 70 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT + ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 71 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT + ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 72 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 73 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 74 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 75 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 76 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 77 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 78 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 79 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; + PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 80 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; PWD=/usr/src/local/millert/hg/sudo/build + ; USER=root ; TSID=0004KT ; COMMAND=/bin/rm /root/.bash_profile +# word wrap at 120 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; + COMMAND=/bin/rm /root/.bash_profile +# word wrap at 140 characters +Jun 26 18:00:06 : millert : TTY=ttypm ; PWD=/usr/src/local/millert/hg/sudo/build ; USER=root ; TSID=0004KT ; COMMAND=/bin/rm + /root/.bash_profile diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.c new file mode 100644 index 0000000..2a7b0f3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.c @@ -0,0 +1,147 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudoers.h" +#include "interfaces.h" + +__dso_public int main(int argc, char *argv[]); + +static int +check_addr(char *input) +{ + int expected, matched; + const char *errstr; + size_t len; + char *cp; + + while (isspace((unsigned char)*input)) + input++; + + /* input: "addr[/mask] 1/0" */ + len = strcspn(input, " \t"); + cp = input + len; + while (isspace((unsigned char)*cp)) + cp++; + expected = sudo_strtonum(cp, 0, 1, &errstr); + if (errstr != NULL) + sudo_fatalx("expecting 0 or 1, got %s", cp); + input[len] = '\0'; + + matched = addr_matches(input); + if (matched != expected) { + sudo_warnx("%s %smatched: FAIL", input, matched ? "" : "not "); + return 1; + } + return 0; +} + +static void +usage(void) +{ + fprintf(stderr, "usage: %s datafile\n", getprogname()); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int ntests = 0, errors = 0; + char *cp, line[2048]; + size_t len; + FILE *fp; + + initprogname(argc > 0 ? argv[0] : "check_addr"); + + if (argc != 2) + usage(); + + fp = fopen(argv[1], "r"); + if (fp == NULL) + sudo_fatalx("unable to open %s", argv[1]); + + /* + * Input is in the following format. There are two types of + * lines: interfaces, which sets the address and mask of the + * locally connected ethernet interfaces for the lines that + * follow and, address lines that include and address (with + * optional netmask) to match, followed by expected match status + * (1 or 0). E.g. + * + * interfaces: addr1/mask addr2/mask ... + * address: addr[/mask] 1/0 + * address: addr[/mask] 1/0 + * interfaces: addr3/mask addr4/mask ... + * address: addr[/mask] 1/0 + */ + + while (fgets(line, sizeof(line), fp) != NULL) { + len = strcspn(line, "\n"); + line[len] = '\0'; + + /* Ignore comments */ + if ((cp = strchr(line, '#')) != NULL) + *cp = '\0'; + + /* Skip blank lines. */ + if (line[0] == '\0') + continue; + + if (strncmp(line, "interfaces:", sizeof("interfaces:") - 1) == 0) { + if (!set_interfaces(line + sizeof("interfaces:") - 1)) { + sudo_warn("unable to parse interfaces list"); + errors++; + } + } else if (strncmp(line, "address:", sizeof("address:") - 1) == 0) { + errors += check_addr(line + sizeof("address:") - 1); + ntests++; + } else { + sudo_warnx("unexpected data line: %s\n", line); + continue; + } + } + + if (ntests != 0) { + printf("check_addr: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + } + + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.in b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.in new file mode 100644 index 0000000..a3c8612 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_addr.in @@ -0,0 +1,13 @@ +# +interfaces: 10.5.54.73/255.255.240.0 +address: 10.5.48.0 1 +address: 10.5.54.0/20 1 +# +interfaces: 128.138.243.151/255.255.255.0 128.138.241.53/255.255.255.0 +address: 128.138.243.0 1 +address: 128.138.243.0/24 1 +address: 128.138.241.0 1 +address: 128.138.241.0/24 1 +address: 128.138.242.0/24 0 +address: 128.138.0.0 0 +address: 128.138.0.0/16 1 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_base64.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_base64.c new file mode 100644 index 0000000..6c70c98 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_base64.c @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" + +/* From parse.h */ +extern size_t base64_decode(const char *str, unsigned char *dst, size_t dsize); +extern size_t base64_encode(const unsigned char *in, size_t in_len, char *out, size_t out_len); + +__dso_public int main(int argc, char *argv[]); + +static unsigned char bstring1[] = { 0xea, 0xb8, 0xa2, 0x71, 0xef, 0x67, 0xc1, 0xcd, 0x0d, 0xd9, 0xa6, 0xaa, 0xa8, 0x24, 0x77, 0x2a, 0xfc, 0x6f, 0x76, 0x37, 0x1b, 0xed, 0x9e, 0x1a, 0x90, 0x5f, 0xcf, 0xbc, 0x00 }; + +struct base64_test { + const char *ascii; + const char *encoded; +} test_strings[] = { + { + (char *)bstring1, + "6riice9nwc0N2aaqqCR3Kvxvdjcb7Z4akF/PvA==" + }, + { + "any carnal pleasure.", + "YW55IGNhcm5hbCBwbGVhc3VyZS4=" + }, + { + "any carnal pleasure", + "YW55IGNhcm5hbCBwbGVhc3VyZQ==" + }, + { + "any carnal pleasur", + "YW55IGNhcm5hbCBwbGVhc3Vy" + }, + { + "any carnal pleasu", + "YW55IGNhcm5hbCBwbGVhc3U=" + }, + { + "any carnal pleas", + "YW55IGNhcm5hbCBwbGVhcw==" + } +}; + +int +main(int argc, char *argv[]) +{ + int ntests = nitems(test_strings); + int i, errors = 0; + unsigned char buf[64]; + size_t len; + + initprogname(argc > 0 ? argv[0] : "check_base64"); + + for (i = 0; i < ntests; i++) { + /* Test decode. */ + len = base64_decode(test_strings[i].encoded, buf, sizeof(buf)); + if (len == (size_t)-1) { + fprintf(stderr, "check_base64: failed to decode %s\n", + test_strings[i].encoded); + errors++; + } else { + buf[len] = '\0'; + if (strcmp(test_strings[i].ascii, (char *)buf) != 0) { + fprintf(stderr, "check_base64: expected %s, got %s\n", + test_strings[i].ascii, buf); + errors++; + } + } + + /* Test encode. */ + len = base64_encode((unsigned char *)test_strings[i].ascii, + strlen(test_strings[i].ascii), (char *)buf, sizeof(buf)); + if (len == (size_t)-1) { + fprintf(stderr, "check_base64: failed to encode %s\n", + test_strings[i].ascii); + errors++; + } else { + if (strcmp(test_strings[i].encoded, (char *)buf) != 0) { + fprintf(stderr, "check_base64: expected %s, got %s\n", + test_strings[i].encoded, buf); + errors++; + } + } + } + ntests *= 2; /* we test in both directions */ + + printf("check_base64: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.c new file mode 100644 index 0000000..c24c78d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.c @@ -0,0 +1,142 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_queue.h" +#include "sudo_digest.h" +#include "sudo_util.h" +#include "parse.h" + +__dso_public int main(int argc, char *argv[]); + +#define NUM_TESTS 8 +static const char *test_strings[NUM_TESTS] = { + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789" + "012345678901234567890", +}; + +static unsigned char * +check_digest(int digest_type, const char *buf, size_t buflen, size_t *digest_len) +{ + char tfile[] = "digest.XXXXXX"; + unsigned char *digest = NULL; + int tfd; + + /* Write test data to temporary file. */ + tfd = mkstemp(tfile); + if (tfd == -1) { + sudo_warn_nodebug("mkstemp"); + goto done; + } + if ((size_t)write(tfd, buf, buflen) != buflen) { + sudo_warn_nodebug("write"); + goto done; + } + lseek(tfd, 0, SEEK_SET); + + /* Get file digest. */ + digest = sudo_filedigest(tfd, tfile, digest_type, digest_len); + if (digest == NULL) { + /* Warning (if any) printed by sudo_filedigest() */ + goto done; + } +done: + if (tfd != -1) { + close(tfd); + unlink(tfile); + } + return digest; +} + +int +main(int argc, char *argv[]) +{ + static const char hex[] = "0123456789abcdef"; + char buf[1000 * 1000]; + unsigned char *digest; + unsigned int i, j; + size_t digest_len; + int digest_type; + + initprogname(argc > 0 ? argv[0] : "check_digest"); + + for (digest_type = 0; digest_type < SUDO_DIGEST_INVALID; digest_type++) { + for (i = 0; i < NUM_TESTS; i++) { + digest = check_digest(digest_type, test_strings[i], + strlen(test_strings[i]), &digest_len); + if (digest != NULL) { + printf("%s (\"%s\") = ", digest_type_to_name(digest_type), + test_strings[i]); + for (j = 0; j < digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + free(digest); + } + } + + /* Simulate a string of a million 'a' characters. */ + memset(buf, 'a', sizeof(buf)); + digest = check_digest(digest_type, buf, sizeof(buf), &digest_len); + if (digest != NULL) { + printf("%s (one million 'a' characters) = ", + digest_type_to_name(digest_type)); + for (j = 0; j < digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + free(digest); + } + } + + return 0; +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.out.ok new file mode 100644 index 0000000..a353664 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_digest.out.ok @@ -0,0 +1,36 @@ +sha224 ("") = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f +sha224 ("a") = abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5 +sha224 ("abc") = 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 +sha224 ("message digest") = 2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb +sha224 ("abcdefghijklmnopqrstuvwxyz") = 45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2 +sha224 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525 +sha224 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9 +sha224 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e +sha224 (one million 'a' characters) = 20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67 +sha256 ("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +sha256 ("a") = ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb +sha256 ("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad +sha256 ("message digest") = f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650 +sha256 ("abcdefghijklmnopqrstuvwxyz") = 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 +sha256 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1 +sha256 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0 +sha256 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e +sha256 (one million 'a' characters) = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 +sha384 ("") = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b +sha384 ("a") = 54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31 +sha384 ("abc") = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 +sha384 ("message digest") = 473ed35167ec1f5d8e550368a3db39be54639f828868e9454c239fc8b52e3c61dbd0d8b4de1390c256dcbb5d5fd99cd5 +sha384 ("abcdefghijklmnopqrstuvwxyz") = feb67349df3db6f5924815d6c3dc133f091809213731fe5c7b5f4999e463479ff2877f5f2936fa63bb43784b12f3ebb4 +sha384 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b +sha384 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1761336e3f7cbfe51deb137f026f89e01a448e3b1fafa64039c1464ee8732f11a5341a6f41e0c202294736ed64db1a84 +sha384 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b12932b0627d1c060942f5447764155655bd4da0c9afa6dd9b9ef53129af1b8fb0195996d2de9ca0df9d821ffee67026 +sha384 (one million 'a' characters) = 9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985 +sha512 ("") = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +sha512 ("a") = 1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75 +sha512 ("abc") = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f +sha512 ("message digest") = 107dbf389d9e9f71a3a95f6c055b9251bc5268c2be16d6c13492ea45b0199f3309e16455ab1e96118e8a905d5597b72038ddb372a89826046de66687bb420e7c +sha512 ("abcdefghijklmnopqrstuvwxyz") = 4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1 +sha512 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445 +sha512 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1e07be23c26a86ea37ea810c8ec7809352515a970e9253c26f536cfc7a9996c45c8370583e0a78fa4a90041d71a4ceab7423f19c71b9d5a3e01249f0bebd5894 +sha512 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 72ec1ef1124a45b047e8b7c75a932195135bb61de24ec0d1914042246e0aec3a2354e093d76f3048b456764346900cb130d2a4fd5dd16abb5e30bcb850dee843 +sha512 (one million 'a' characters) = e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_fill.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_fill.c new file mode 100644 index 0000000..e254c1c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_fill.c @@ -0,0 +1,196 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_queue.h" +#include "parse.h" +#include "toke.h" +#include "sudo_plugin.h" +#include "sudo_util.h" +#include + +__dso_public int main(int argc, char *argv[]); + +/* + * TODO: test realloc + */ + +YYSTYPE sudoerslval; + +struct fill_test { + const char *input; + const char *output; + int len; + int addspace; +}; + +/* + * In "normal" fill, anything can be escaped and hex chars are expanded. + */ +static struct fill_test txt_data[] = { + { "Embedded\\x20Space", "Embedded Space", 0 }, + { "\\x20Leading", " Leading", 0 }, + { "Trailing\\x20", "Trailing ", 0 }, + { "Multiple\\x20\\x20Spaces", "Multiple Spaces", 0 }, + { "Hexparse\\x200Check", "Hexparse 0Check", 0 }, + { "Escaped\\\\Escape", "Escaped\\Escape", 0 }, + { "LongGroupName", "LongGrou", 8 } +}; + +/* + * The only escaped chars in a command should be [,:= \t#] + * The rest are done by glob() or fnmatch(). + */ +static struct fill_test cmd_data[] = { + { "foo\\,bar", "foo,bar", 0 }, + { "this\\:that", "this:that", 0 }, + { "foo\\=bar", "foo=bar", 0 }, + { "tab\\\tstop", "tab\tstop", 0 }, + { "not a \\#comment", "not a #comment", 0 } +}; + +/* + * No escaped characters in command line args. + * Arguments get appended. + */ +static struct fill_test args_data[] = { + { "/", "/", 0, 0 }, + { "-type", "/ -type", 0, 1 }, + { "f", "/ -type f", 0, 1 }, + { "-exec", "/ -type f -exec", 0, 1 }, + { "ls", "/ -type f -exec ls", 0, 1 }, + { "{}", "/ -type f -exec ls {}", 0, 1 } +}; + +static int +check_fill(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + if (sudoerslval.string != NULL) { + free(sudoerslval.string); + sudoerslval.string = NULL; + } + if (!fill(input, len)) + return -1; + *resultp = sudoerslval.string; + return !strcmp(sudoerslval.string, expect); +} + +static int +check_fill_cmnd(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + if (sudoerslval.command.cmnd != NULL) { + free(sudoerslval.command.cmnd); + sudoerslval.command.cmnd = NULL; + } + if (!fill_cmnd(input, len)) + return -1; + *resultp = sudoerslval.command.cmnd; + return !strcmp(sudoerslval.command.cmnd, expect); +} + +static int +check_fill_args(const char *input, int len, int addspace, const char *expect, char **resultp) +{ + /* Must not free old sudoerslval.command.args as gets appended to. */ + if (!fill_args(input, len, addspace)) + return -1; + *resultp = sudoerslval.command.args; + return !strcmp(sudoerslval.command.args, expect); +} + +static int +do_tests(int (*checker)(const char *, int, int, const char *, char **), + struct fill_test *data, size_t ntests) +{ + int len, errors = 0; + unsigned int i; + char *result; + + for (i = 0; i < ntests; i++) { + if (data[i].len == 0) + len = strlen(data[i].input); + else + len = data[i].len; + + switch ((*checker)(data[i].input, len, data[i].addspace, data[i].output, &result)) { + case 0: + /* no match */ + fprintf(stderr, "Failed parsing %.*s: expected [%s], got [%s]\n", + (int)data[i].len, data[i].input, data[i].output, result); + errors++; + break; + case 1: + /* match */ + break; + default: + /* error */ + fprintf(stderr, "Failed parsing %.*s: fill function failure\n", + (int)data[i].len, data[i].input); + errors++; + break; + } + } + + return errors; +} + +int +main(int argc, char *argv[]) +{ + int ntests, errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_fill"); + + errors += do_tests(check_fill, txt_data, nitems(txt_data)); + errors += do_tests(check_fill_cmnd, cmd_data, nitems(cmd_data)); + errors += do_tests(check_fill_args, args_data, nitems(args_data)); + + ntests = nitems(txt_data) + nitems(cmd_data) + nitems(args_data); + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} + +/* STUB */ +void +sudoerserror(const char *s) +{ + return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_gentime.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_gentime.c new file mode 100644 index 0000000..ba840bc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_gentime.c @@ -0,0 +1,89 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" +#include "sudoers_debug.h" +#include "parse.h" + +__dso_public int main(int argc, char *argv[]); + +const struct gentime_test { + char *gentime; + time_t unixtime; +} tests[] = { + { "199412161032ZZ", -1 }, + { "199412161032Z", 787573920 }, + { "199412160532-0500", 787573920 }, + { "199412160532-05000", -1 }, + { "199412160532", 787573920 }, /* local time is EST */ + { "20170214083000-0500", 1487079000 }, + { "201702140830-0500", 1487079000 }, + { "201702140830", 1487079000 }, /* local time is EST */ + { "201702140830.3-0500", 1487079018 }, + { "201702140830,3-0500", 1487079018 }, + { "20170214083000.5Z", 1487061000 }, + { "20170214083000,5Z", 1487061000 }, + { "201702142359.4Z", 1487116764 }, + { "201702142359,4Z", 1487116764 }, + { "2017021408.5Z", 1487061000 }, + { "2017021408,5Z", 1487061000 }, + { "20170214Z", -1 }, +}; + +int +main(int argc, char *argv[]) +{ + const int ntests = nitems(tests); + int i, errors = 0; + time_t result; + + initprogname(argc > 0 ? argv[0] : "check_gentime"); + + /* Do local time tests in Eastern Standard Time. */ + putenv("TZ=EST5EST5"); + tzset(); + + for (i = 0; i < ntests; i++) { + result = parse_gentime(tests[i].gentime); + if (result != tests[i].unixtime) { + fprintf(stderr, "check_gentime[%d]: %s: expected %lld, got %lld\n", + i, tests[i].gentime, + (long long)tests[i].unixtime, (long long)result); + errors++; + } + } + printf("check_gentime: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/parser/check_hexchar.c b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_hexchar.c new file mode 100644 index 0000000..6722f5e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/parser/check_hexchar.c @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif + +#define SUDO_ERROR_WRAP 0 + +#include "sudo_compat.h" +#include "sudo_util.h" + +int hexchar(const char *s); + +__dso_public int main(int argc, char *argv[]); + +struct hexchar_test { + char hex[3]; + int value; +}; + +int +main(int argc, char *argv[]) +{ + struct hexchar_test *test_data; + int i, ntests, result, errors = 0; + static const char xdigs_lower[] = "0123456789abcdef"; + static const char xdigs_upper[] = "0123456789ABCDEF"; + + initprogname(argc > 0 ? argv[0] : "check_hexchar"); + + /* Build up test data. */ + ntests = 256 + 256 + 3; + test_data = calloc(sizeof(*test_data), ntests); + for (i = 0; i < 256; i++) { + /* lower case */ + test_data[i].value = i; + test_data[i].hex[1] = xdigs_lower[ (i & 0x0f)]; + test_data[i].hex[0] = xdigs_lower[((i & 0xf0) >> 4)]; + /* upper case */ + test_data[i + 256].value = i; + test_data[i + 256].hex[1] = xdigs_upper[ (i & 0x0f)]; + test_data[i + 256].hex[0] = xdigs_upper[((i & 0xf0) >> 4)]; + } + /* Also test invalid data */ + test_data[ntests - 3].hex[0] = '\0'; + test_data[ntests - 3].value = -1; + strlcpy(test_data[ntests - 2].hex, "AG", sizeof(test_data[ntests - 2].hex)); + test_data[ntests - 2].value = -1; + strlcpy(test_data[ntests - 1].hex, "-1", sizeof(test_data[ntests - 1].hex)); + test_data[ntests - 1].value = -1; + + for (i = 0; i < ntests; i++) { + result = hexchar(test_data[i].hex); + if (result != test_data[i].value) { + fprintf(stderr, "check_hexchar: expected %d, got %d\n", + test_data[i].value, result); + errors++; + } + } + printf("check_hexchar: %d tests run, %d errors, %d%% success rate\n", + ntests, errors, (ntests - errors) * 100 / ntests); + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/starttime/check_starttime.c b/utsudo-0.0.2/plugins/sudoers/regress/starttime/check_starttime.c new file mode 100644 index 0000000..0ea8d92 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/starttime/check_starttime.c @@ -0,0 +1,119 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_util.h" +#include "sudo_fatal.h" +#include "check.h" + +__dso_public int main(int argc, char *argv[]); + +#ifdef __linux__ +static int +get_now(struct timespec *now) +{ + const char *errstr; + char buf[1024]; + time_t seconds; + int ret = -1; + FILE *fp; + + /* Linux process start time is relative to boot time. */ + fp = fopen("/proc/stat", "r"); + if (fp != NULL) { + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (strncmp(buf, "btime ", 6) != 0) + continue; + buf[strcspn(buf, "\n")] = '\0'; + + /* Boot time is in seconds since the epoch. */ + seconds = sudo_strtonum(buf + 6, 0, TIME_T_MAX, &errstr); + if (errstr != NULL) + return -1; + + /* Instead of the real time, "now" is relative to boot time. */ + if (sudo_gettime_real(now) == -1) + return -1; + now->tv_sec -= seconds; + ret = 0; + break; + } + fclose(fp); + } + return ret; +} +#else +static int +get_now(struct timespec *now) +{ + /* Process start time is relative to wall clock time. */ + return sudo_gettime_real(now); +} +#endif + +int +main(int argc, char *argv[]) +{ + int ntests = 0, errors = 0; + struct timespec now, then, delta; + pid_t pids[2]; + int i; + + initprogname(argc > 0 ? argv[0] : "check_starttime"); + + if (get_now(&now) == -1) + sudo_fatal_nodebug("unable to get current time"); + + pids[0] = getpid(); + pids[1] = getppid(); + + for (i = 0; i < 2; i++) { + ntests++; + if (get_starttime(pids[i], &then) == -1) { + printf("%s: test %d: unable to get start time for pid %d\n", + getprogname(), ntests, (int)pids[i]); + errors++; + } + if (i != 0) + continue; + + /* Verify our own process start time, allowing for some drift. */ + ntests++; + sudo_timespecsub(&then, &now, &delta); + if (delta.tv_sec > 30 || delta.tv_sec < -30) { + printf("%s: test %d: unexpected start time for pid %d: %s", + getprogname(), ntests, (int)pids[i], ctime(&then.tv_sec)); + errors++; + } + } + + printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(), + ntests, errors, (ntests - errors) * 100 / ntests); + + exit(errors); +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.in new file mode 100644 index 0000000..d87c872 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.in @@ -0,0 +1,12 @@ +# +# Verify that all command tags are parsed OK. +# See https://bugzilla.sudo.ws/show_bug.cgi?id=437 +# +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su -:\ + ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id +user2 ALL = NOPASSWD: NOEXEC: SETENV: /usr/bin/vi:\ + ALL = PASSWD: EXEC: NOSETENV: /usr/bin/echo +user3 ALL = MAIL: /bin/sh:\ + ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd:\ + ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.json.ok new file mode 100644 index 0000000..9523e4a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.json.ok @@ -0,0 +1,154 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "log_input": true }, + { "log_output": true } + ], + "Commands": [ + { "command": "/usr/bin/su -" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "log_input": false }, + { "log_output": false } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "authenticate": false }, + { "noexec": true }, + { "setenv": true } + ], + "Commands": [ + { "command": "/usr/bin/vi" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "authenticate": true }, + { "noexec": false }, + { "setenv": false } + ], + "Commands": [ + { "command": "/usr/bin/echo" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "send_mail": true } + ], + "Commands": [ + { "command": "/bin/sh" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "send_mail": false } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": true } + ], + "Commands": [ + { "command": "sudoedit /etc/motd" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "sudoedit_follow": false } + ], + "Commands": [ + { "command": "sudoedit /home/*/*" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif.ok new file mode 100644 index 0000000..7f3fcfc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif.ok @@ -0,0 +1,88 @@ +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoOption: log_input +sudoOption: log_output +sudoCommand: /usr/bin/su - +sudoOrder: 1 + +dn: cn=user1_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1_1 +sudoUser: user1 +sudoHost: ALL +sudoOption: !log_input +sudoOption: !log_output +sudoCommand: /usr/bin/id +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoOption: !authenticate +sudoOption: noexec +sudoOption: setenv +sudoCommand: /usr/bin/vi +sudoOrder: 3 + +dn: cn=user2_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2_1 +sudoUser: user2 +sudoHost: ALL +sudoOption: authenticate +sudoOption: !noexec +sudoOption: !setenv +sudoCommand: /usr/bin/echo +sudoOrder: 4 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoOption: mail_all_cmnds +sudoCommand: /bin/sh +sudoOrder: 5 + +dn: cn=user3_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3_1 +sudoUser: user3 +sudoHost: ALL +sudoOption: !mail_all_cmnds +sudoOption: !mail_always +sudoOption: !mail_no_perms +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoOption: sudoedit_follow +sudoCommand: sudoedit /etc/motd +sudoOrder: 7 + +dn: cn=user4_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4_1 +sudoUser: user4 +sudoHost: ALL +sudoOption: !sudoedit_follow +sudoCommand: sudoedit /home/*/* +sudoOrder: 8 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok new file mode 100644 index 0000000..126fe91 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.ldif2sudo.ok @@ -0,0 +1,13 @@ +# sudoRole user1, user1_1 +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su -, NOLOG_INPUT: NOLOG_OUTPUT:\ + /usr/bin/id + +# sudoRole user2, user2_1 +user2 ALL = SETENV: NOEXEC: NOPASSWD: /usr/bin/vi, NOSETENV: EXEC: PASSWD:\ + /usr/bin/echo + +# sudoRole user3, user3_1 +user3 ALL = MAIL: /bin/sh, NOMAIL: /usr/bin/id + +# sudoRole user4, user4_1 +user4 ALL = FOLLOW: sudoedit /etc/motd, NOFOLLOW: sudoedit /home/*/* diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.out.ok new file mode 100644 index 0000000..8693cea --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.out.ok @@ -0,0 +1,6 @@ +Parses OK. + +user1 ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su - : ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id +user2 ALL = SETENV: NOEXEC: NOPASSWD: /usr/bin/vi : ALL = NOSETENV: EXEC: PASSWD: /usr/bin/echo +user3 ALL = MAIL: /bin/sh : ALL = NOMAIL: /usr/bin/id +user4 ALL = FOLLOW: sudoedit /etc/motd : ALL = NOFOLLOW: sudoedit /home/*/* diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.toke.ok new file mode 100644 index 0000000..79945dc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test1.toke.ok @@ -0,0 +1,8 @@ +# +# +# +# +WORD(5) ALL = LOG_INPUT LOG_OUTPUT COMMAND ARG : ALL = NOLOG_INPUT NOLOG_OUTPUT COMMAND +WORD(5) ALL = NOPASSWD NOEXEC SETENV COMMAND : ALL = PASSWD EXEC NOSETENV COMMAND +WORD(5) ALL = MAIL COMMAND : ALL = NOMAIL COMMAND +WORD(5) ALL = FOLLOW COMMAND ARG : ALL = NOFOLLOW COMMAND ARG diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.in new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.in @@ -0,0 +1 @@ + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.json.ok new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.json.ok @@ -0,0 +1,2 @@ +{ +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.out.ok new file mode 100644 index 0000000..40c742d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.out.ok @@ -0,0 +1,2 @@ +Parses OK. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.toke.ok new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test10.toke.ok @@ -0,0 +1 @@ + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.in new file mode 100644 index 0000000..5ffba7b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.in @@ -0,0 +1 @@ +bogus diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.out.ok new file mode 100644 index 0000000..9b2e9d6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.out.ok @@ -0,0 +1,2 @@ +Parse error in sudoers near line 1. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.toke.ok new file mode 100644 index 0000000..d57d6c3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test11.toke.ok @@ -0,0 +1,2 @@ +WORD(5) +<*> \ No newline at end of file diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.in new file mode 100644 index 0000000..23bda4a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.in @@ -0,0 +1 @@ +user ALL = (ALL) diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.out.ok new file mode 100644 index 0000000..9b2e9d6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.out.ok @@ -0,0 +1,2 @@ +Parse error in sudoers near line 1. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.toke.ok new file mode 100644 index 0000000..a1995f0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test12.toke.ok @@ -0,0 +1,2 @@ +WORD(5) ALL = ( ALL ) +<*> \ No newline at end of file diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.in new file mode 100644 index 0000000..b8002bc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.in @@ -0,0 +1 @@ +user ALL = (ALL) \ No newline at end of file diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.out.ok new file mode 100644 index 0000000..9b2e9d6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.out.ok @@ -0,0 +1,2 @@ +Parse error in sudoers near line 1. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.toke.ok new file mode 100644 index 0000000..e189ffd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test13.toke.ok @@ -0,0 +1 @@ +WORD(5) ALL = ( ALL ) <*> \ No newline at end of file diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.in new file mode 100644 index 0000000..05fafda --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.in @@ -0,0 +1,4 @@ +Cmnd_Alias LS = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1 /bin/ls +Cmnd_Alias SH = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM= /bin/sh + +millert ALL = LS, SH, sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.json.ok new file mode 100644 index 0000000..46f8b21 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.json.ok @@ -0,0 +1,38 @@ +{ + "Command_Aliases": { + "LS": [ + { + "command": "/bin/ls", + "sha224": "d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1" + } + ], + "SH": [ + { + "command": "/bin/sh", + "sha256": "hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM=" + } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "millert" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "cmndalias": "LS" }, + { "cmndalias": "SH" }, + { + "command": "/bin/kill", + "sha512": "srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw" + } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif.ok new file mode 100644 index 0000000..abb4886 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif.ok @@ -0,0 +1,11 @@ +dn: cn=millert,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: millert +sudoUser: millert +sudoHost: ALL +sudoCommand: sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1 /bin/ls +sudoCommand: sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM= /bin/sh +sudoCommand: sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill +sudoOrder: 1 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok new file mode 100644 index 0000000..6bc0156 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.ldif2sudo.ok @@ -0,0 +1,5 @@ +# sudoRole millert +millert ALL = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1\ + /bin/ls, sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM= /bin/sh,\ + sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw\ + /bin/kill diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.out.ok new file mode 100644 index 0000000..bfcb661 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.out.ok @@ -0,0 +1,6 @@ +Parses OK. + +Cmnd_Alias LS = sha224:d06a2617c98d377c250edd470fd5e576327748d82915d6e33b5f8db1 /bin/ls +Cmnd_Alias SH = sha256:hOtoe/iK6SlGg7w4BfZBBdSsXjUmTJ5+ts51yjh7vkM= /bin/sh + +millert ALL = LS, SH, sha512:srzYEQ2aqzm+it3f74opTMkIImZRLxBARVpb0g9RSouJYdLt7DTRMEY4Ry9NyaOiDoUIplpNjqYH0JMYPVdFnw /bin/kill diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.toke.ok new file mode 100644 index 0000000..7cb5aea --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test14.toke.ok @@ -0,0 +1,4 @@ +CMNDALIAS ALIAS = SHA224_TOK : DIGEST COMMAND +CMNDALIAS ALIAS = SHA256_TOK : DIGEST COMMAND + +WORD(5) ALL = ALIAS , ALIAS , SHA512_TOK : DIGEST COMMAND diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.in new file mode 100644 index 0000000..11bcb13 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.in @@ -0,0 +1,2 @@ +# Test parsing of sudoedit rule +user ALL = sudoedit /etc/motd diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.json.ok new file mode 100644 index 0000000..ff1795a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.json.ok @@ -0,0 +1,19 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "command": "sudoedit /etc/motd" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif.ok new file mode 100644 index 0000000..ac35ba0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif.ok @@ -0,0 +1,9 @@ +dn: cn=user,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user +sudoUser: user +sudoHost: ALL +sudoCommand: sudoedit /etc/motd +sudoOrder: 1 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok new file mode 100644 index 0000000..775d59e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.ldif2sudo.ok @@ -0,0 +1,2 @@ +# sudoRole user +user ALL = sudoedit /etc/motd diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.out.ok new file mode 100644 index 0000000..fb43c8c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.out.ok @@ -0,0 +1,3 @@ +Parses OK. + +user ALL = sudoedit /etc/motd diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.toke.ok new file mode 100644 index 0000000..c26de2e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test15.toke.ok @@ -0,0 +1,2 @@ +# +WORD(5) ALL = COMMAND ARG diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.in new file mode 100644 index 0000000..d2a79ea --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.in @@ -0,0 +1,3 @@ +# Test parsing of sudoedit rule in a Cmnd_Alias +Cmnd_Alias EDIT = sudoedit /etc/motd +user ALL = EDIT diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.json.ok new file mode 100644 index 0000000..7c42654 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.json.ok @@ -0,0 +1,24 @@ +{ + "Command_Aliases": { + "EDIT": [ + { "command": "sudoedit /etc/motd" } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "user" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Commands": [ + { "cmndalias": "EDIT" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif.ok new file mode 100644 index 0000000..ac35ba0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif.ok @@ -0,0 +1,9 @@ +dn: cn=user,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user +sudoUser: user +sudoHost: ALL +sudoCommand: sudoedit /etc/motd +sudoOrder: 1 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok new file mode 100644 index 0000000..775d59e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.ldif2sudo.ok @@ -0,0 +1,2 @@ +# sudoRole user +user ALL = sudoedit /etc/motd diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.out.ok new file mode 100644 index 0000000..f541242 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.out.ok @@ -0,0 +1,5 @@ +Parses OK. + +Cmnd_Alias EDIT = sudoedit /etc/motd + +user ALL = EDIT diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.toke.ok new file mode 100644 index 0000000..9b8c41b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test16.toke.ok @@ -0,0 +1,3 @@ +# +CMNDALIAS ALIAS = COMMAND ARG +WORD(5) ALL = ALIAS diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.in new file mode 100644 index 0000000..37d066c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.in @@ -0,0 +1,13 @@ +# Test parsing of command_timeout and TIMEOUT syntax +Defaults command_timeout=2d8h10m59s +user0 ALL = TIMEOUT=7D4H10M30S /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10m30s /usr/bin/id +user2 ALL = TIMEOUT=4h10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30s /usr/bin/id +user4 ALL = TIMEOUT=14d /usr/bin/id +user5 ALL = TIMEOUT=5m /usr/bin/id +user6 ALL = TIMEOUT=30s /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=7d4h10m30s /usr/bin/id, TIMEOUT=4h10m30s /usr/bin/id, \ + TIMEOUT=10m30s /usr/bin/id, TIMEOUT=14d /usr/bin/id, \ + TIMEOUT=5m /usr/bin/id, TIMEOUT=30s /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.json.ok new file mode 100644 index 0000000..2f39a37 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.json.ok @@ -0,0 +1,180 @@ +{ + "Defaults": [ + { + "Options": [ + { "command_timeout": "2d8h10m59s" } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/who" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 15030 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 630 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 1209600 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user5" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 300 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user6" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 30 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user7" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 45 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user8" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif.ok new file mode 100644 index 0000000..bdc784c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif.ok @@ -0,0 +1,104 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: command_timeout=2d8h10m59s + +dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user0 +sudoUser: user0 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/who +sudoCommand: /bin/ls +sudoOrder: 1 + +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoOption: command_timeout=15030 +sudoCommand: /usr/bin/id +sudoOrder: 3 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoOption: command_timeout=630 +sudoCommand: /usr/bin/id +sudoOrder: 4 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoOption: command_timeout=1209600 +sudoCommand: /usr/bin/id +sudoOrder: 5 + +dn: cn=user5,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user5 +sudoUser: user5 +sudoHost: ALL +sudoOption: command_timeout=300 +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user6,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user6 +sudoUser: user6 +sudoHost: ALL +sudoOption: command_timeout=30 +sudoCommand: /usr/bin/id +sudoOrder: 7 + +dn: cn=user7,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user7 +sudoUser: user7 +sudoHost: ALL +sudoOption: command_timeout=45 +sudoCommand: /usr/bin/id +sudoOrder: 8 + +dn: cn=user8,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user8 +sudoUser: user8 +sudoHost: ALL +sudoOption: command_timeout=619830 +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoCommand: /usr/bin/id +sudoOrder: 9 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok new file mode 100644 index 0000000..608f52f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.ldif2sudo.ok @@ -0,0 +1,29 @@ +Defaults command_timeout=2d8h10m59s + +# sudoRole user0 +user0 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/who, /bin/ls + +# sudoRole user1 +user1 ALL = TIMEOUT=619830 /usr/bin/id + +# sudoRole user2 +user2 ALL = TIMEOUT=15030 /usr/bin/id + +# sudoRole user3 +user3 ALL = TIMEOUT=630 /usr/bin/id + +# sudoRole user4 +user4 ALL = TIMEOUT=1209600 /usr/bin/id + +# sudoRole user5 +user5 ALL = TIMEOUT=300 /usr/bin/id + +# sudoRole user6 +user6 ALL = TIMEOUT=30 /usr/bin/id + +# sudoRole user7 +user7 ALL = TIMEOUT=45 /usr/bin/id + +# sudoRole user8 +user8 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/id, /usr/bin/id, /usr/bin/id,\ + /usr/bin/id, /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.out.ok new file mode 100644 index 0000000..4a2c26d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.out.ok @@ -0,0 +1,13 @@ +Parses OK. + +Defaults command_timeout=2d8h10m59s + +user0 ALL = TIMEOUT=619830 /usr/bin/id, /usr/bin/who, /bin/ls +user1 ALL = TIMEOUT=619830 /usr/bin/id +user2 ALL = TIMEOUT=15030 /usr/bin/id +user3 ALL = TIMEOUT=630 /usr/bin/id +user4 ALL = TIMEOUT=1209600 /usr/bin/id +user5 ALL = TIMEOUT=300 /usr/bin/id +user6 ALL = TIMEOUT=30 /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=15030 /usr/bin/id, TIMEOUT=630 /usr/bin/id, TIMEOUT=1209600 /usr/bin/id, TIMEOUT=300 /usr/bin/id, TIMEOUT=30 /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.toke.ok new file mode 100644 index 0000000..17bb5fb --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test17.toke.ok @@ -0,0 +1,11 @@ +# +DEFAULTS DEFVAR = WORD(2) +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.in new file mode 100644 index 0000000..8d94ec7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.in @@ -0,0 +1,8 @@ +# Test command_timeout and TIMEOUT syntax errors +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f +user0 ALL = TIMEOUT=7dd4h10m30s /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10mm30s /usr/bin/id +user2 ALL = TIMEOUT=4hg10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30ss /usr/bin/id +user4 ALL = TIMEOUT=14g /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.out.ok new file mode 100644 index 0000000..ace1ca6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.out.ok @@ -0,0 +1,4 @@ +Parse error in sudoers near line 4 (problem with defaults entries). + +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.toke.ok new file mode 100644 index 0000000..05fbaef --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test18.toke.ok @@ -0,0 +1,10 @@ +# +DEFAULTS DEFVAR = WORD(2) +DEFAULTS_USER WORD(5) DEFVAR = WORD(2) +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +testsudoers: sudoers:2 value "2d8h10m59ss" is invalid for option "command_timeout" +testsudoers: sudoers:3 value "15f" is invalid for option "command_timeout" diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.in new file mode 100644 index 0000000..5f637a7 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.in @@ -0,0 +1,12 @@ +# Test parsing of NOTBEFORE and NOTAFTER syntax +# Local time zone parsing is checked in visudo/test10.sh +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, /bin/ls +user1 ALL = NOTBEFORE=201702140830Z /usr/bin/id, NOTAFTER=20170301083000Z /bin/ls +user2 ALL = NOTBEFORE=201702140830.3Z /usr/bin/id +user3 ALL = NOTBEFORE=2017021408Z /usr/bin/id +user4 ALL = NOTBEFORE=2017021408.4Z /usr/bin/id +user5 ALL = NOTBEFORE=20170214083000.5Z /usr/bin/id +user6 ALL = NOTBEFORE=20170214083000\,5Z /usr/bin/id +user7 ALL = NOTBEFORE=20170214033000-0500 /usr/bin/id +user8 ALL = NOTBEFORE=20170214033000.0-0500 /usr/bin/id +user9 ALL = NOTBEFORE=20170214033000\,0-0500 /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.json.ok new file mode 100644 index 0000000..c9a1bfd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.json.ok @@ -0,0 +1,187 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" }, + { "notafter": "20170301083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083018Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214080000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214082400Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user5" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user6" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user7" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user8" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user9" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "notbefore": "20170214083000Z" } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif.ok new file mode 100644 index 0000000..362aa9e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif.ok @@ -0,0 +1,103 @@ +dn: cn=user0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user0 +sudoUser: user0 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoNotAfter: 20170301083000Z +sudoCommand: /usr/bin/id +sudoCommand: /bin/ls +sudoOrder: 1 + +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoCommand: /bin/ls +sudoOrder: 2 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoNotBefore: 20170214083018Z +sudoCommand: /usr/bin/id +sudoOrder: 3 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoNotBefore: 20170214080000Z +sudoCommand: /usr/bin/id +sudoOrder: 4 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoNotBefore: 20170214082400Z +sudoCommand: /usr/bin/id +sudoOrder: 5 + +dn: cn=user5,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user5 +sudoUser: user5 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 6 + +dn: cn=user6,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user6 +sudoUser: user6 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 7 + +dn: cn=user7,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user7 +sudoUser: user7 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 8 + +dn: cn=user8,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user8 +sudoUser: user8 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 9 + +dn: cn=user9,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user9 +sudoUser: user9 +sudoHost: ALL +sudoNotBefore: 20170214083000Z +sudoCommand: /usr/bin/id +sudoOrder: 10 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok new file mode 100644 index 0000000..1aef1bc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.ldif2sudo.ok @@ -0,0 +1,30 @@ +# sudoRole user0 +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id,\ + /bin/ls + +# sudoRole user1 +user1 ALL = NOTBEFORE=20170214083000Z /usr/bin/id, /bin/ls + +# sudoRole user2 +user2 ALL = NOTBEFORE=20170214083018Z /usr/bin/id + +# sudoRole user3 +user3 ALL = NOTBEFORE=20170214080000Z /usr/bin/id + +# sudoRole user4 +user4 ALL = NOTBEFORE=20170214082400Z /usr/bin/id + +# sudoRole user5 +user5 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user6 +user6 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user7 +user7 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user8 +user8 ALL = NOTBEFORE=20170214083000Z /usr/bin/id + +# sudoRole user9 +user9 ALL = NOTBEFORE=20170214083000Z /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.out.ok new file mode 100644 index 0000000..8d7974e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.out.ok @@ -0,0 +1,12 @@ +Parses OK. + +user0 ALL = NOTBEFORE=20170214083000Z NOTAFTER=20170301083000Z /usr/bin/id, /bin/ls +user1 ALL = NOTBEFORE=20170214083000Z /usr/bin/id, NOTAFTER=20170301083000Z /bin/ls +user2 ALL = NOTBEFORE=20170214083018Z /usr/bin/id +user3 ALL = NOTBEFORE=20170214080000Z /usr/bin/id +user4 ALL = NOTBEFORE=20170214082400Z /usr/bin/id +user5 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user6 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user7 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user8 ALL = NOTBEFORE=20170214083000Z /usr/bin/id +user9 ALL = NOTBEFORE=20170214083000Z /usr/bin/id diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.toke.ok new file mode 100644 index 0000000..45c5d27 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test19.toke.ok @@ -0,0 +1,12 @@ +# +# +WORD(5) ALL = NOTBEFORE = WORD(5) NOTAFTER = WORD(5) COMMAND , COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND , NOTAFTER = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND +WORD(5) ALL = NOTBEFORE = WORD(5) COMMAND diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.in new file mode 100644 index 0000000..cfdfaa3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.in @@ -0,0 +1,60 @@ +# Check quoted user name in User_Alias +User_Alias UA1 = "foo" +User_Alias UA2 = "foo.bar" +User_Alias UA3 = "foo\"" +User_Alias UA4 = "foo:bar" +User_Alias UA5 = "foo:bar\"" + +# Check quoted group name in User_Alias +User_Alias UA6 = "%baz" +User_Alias UA7 = "%baz.biz" + +# Check quoted non-Unix group name in User_Alias +User_Alias UA8 = "%:C/non UNIX 0 c" +User_Alias UA9 = "%:C/non\'UNIX\'1 c" +User_Alias UA10 = "%:C/non\"UNIX\"0 c" +User_Alias UA11 = "%:C/non_UNIX_0 c" +User_Alias UA12 = "%:C/non\'UNIX_3 c" + +# Check quoted user name in Runas_Alias +Runas_Alias RA1 = "foo" +Runas_Alias RA2 = "foo\"" +Runas_Alias RA3 = "foo:bar" +Runas_Alias RA4 = "foo:bar\"" + +# Check quoted host name in Defaults +Defaults@"somehost" set_home +Defaults@"quoted\"" set_home + +# Check quoted user name in Defaults +Defaults:"you" set_home +Defaults:"us\"" set_home +Defaults:"%them" set_home +Defaults:"%: non UNIX 0 c" set_home +Defaults:"+net" set_home + +# Check quoted runas name in Defaults +Defaults>"someone" set_home +Defaults>"some one" set_home + +# Check quoted command in Defaults +# XXX - not currently supported +#Defaults!"/bin/ls -l" set_home +#Defaults!"/bin/ls -l \"foo\"" set_home + +# Check quoted user, runas and host name in Cmnd_Spec +"foo" "hosta" = ("root") ALL +"foo.bar" "hostb" = ("root") ALL +"foo\"" "hostc" = ("root") ALL +"foo:bar" "hostd" = ("root") ALL +"foo:bar\"" "hoste" = ("root") ALL + +# Check quoted group/netgroup name in Cmnd_Spec +"%baz" "hosta" = ("root") ALL +"%baz.biz" "hostb" = ("root") ALL +"%:C/non UNIX 0 c" "hostc" = ("root") ALL +"%:C/non\'UNIX\'1 c" "hostd" = ("root") ALL +"%:C/non\"UNIX\"0 c" "hoste" = ("root") ALL +"%:C/non_UNIX_0 c" "hostf" = ("root") ALL +"%:C/non\'UNIX_3 c" "hostg" = ("root") ALL +"+netgr" "hosth" = ("root") ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.json.ok new file mode 100644 index 0000000..769c3fd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.json.ok @@ -0,0 +1,403 @@ +{ + "Defaults": [ + { + "Binding": [ + { "hostname": "somehost" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "hostname": "quoted\"" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "you" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "us\"" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "usergroup": "them" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "nonunixgroup": " non UNIX 0 c" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "netgroup": "net" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "someone" } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "username": "some one" } + ], + "Options": [ + { "set_home": true } + ] + } + ], + "User_Aliases": { + "UA1": [ + { "username": "foo" } + ], + "UA10": [ + { "nonunixgroup": "C/non\"UNIX\"0 c" } + ], + "UA11": [ + { "nonunixgroup": "C/non_UNIX_0 c" } + ], + "UA12": [ + { "nonunixgroup": "C/non\\'UNIX_3 c" } + ], + "UA2": [ + { "username": "foo.bar" } + ], + "UA3": [ + { "username": "foo\"" } + ], + "UA4": [ + { "username": "foo:bar" } + ], + "UA5": [ + { "username": "foo:bar\"" } + ], + "UA6": [ + { "usergroup": "baz" } + ], + "UA7": [ + { "usergroup": "baz.biz" } + ], + "UA8": [ + { "nonunixgroup": "C/non UNIX 0 c" } + ], + "UA9": [ + { "nonunixgroup": "C/non\\'UNIX\\'1 c" } + ] + }, + "Runas_Aliases": { + "RA1": [ + { "username": "foo" } + ], + "RA2": [ + { "username": "foo\"" } + ], + "RA3": [ + { "username": "foo:bar" } + ], + "RA4": [ + { "username": "foo:bar\"" } + ] + }, + "User_Specs": [ + { + "User_List": [ + { "username": "foo" } + ], + "Host_List": [ + { "hostname": "hosta" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo.bar" } + ], + "Host_List": [ + { "hostname": "hostb" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo\"" } + ], + "Host_List": [ + { "hostname": "hostc" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo:bar" } + ], + "Host_List": [ + { "hostname": "hostd" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "foo:bar\"" } + ], + "Host_List": [ + { "hostname": "hoste" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergroup": "baz" } + ], + "Host_List": [ + { "hostname": "hosta" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergroup": "baz.biz" } + ], + "Host_List": [ + { "hostname": "hostb" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non UNIX 0 c" } + ], + "Host_List": [ + { "hostname": "hostc" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\\'UNIX\\'1 c" } + ], + "Host_List": [ + { "hostname": "hostd" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\"UNIX\"0 c" } + ], + "Host_List": [ + { "hostname": "hoste" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non_UNIX_0 c" } + ], + "Host_List": [ + { "hostname": "hostf" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "nonunixgroup": "C/non\\'UNIX_3 c" } + ], + "Host_List": [ + { "hostname": "hostg" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "netgroup": "netgr" } + ], + "Host_List": [ + { "hostname": "hosth" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "root" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif.ok new file mode 100644 index 0000000..a9e7df9 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif.ok @@ -0,0 +1,157 @@ +# Unable to translate stdin:26 +# Defaults@somehost set_home + +# Unable to translate stdin:27 +# Defaults@quoted\" set_home + +# Unable to translate stdin:30 +# Defaults:you set_home + +# Unable to translate stdin:31 +# Defaults:us\" set_home + +# Unable to translate stdin:32 +# Defaults:%them set_home + +# Unable to translate stdin:33 +# Defaults:"%: non UNIX 0 c" set_home + +# Unable to translate stdin:34 +# Defaults:+net set_home + +# Unable to translate stdin:37 +# Defaults>someone set_home + +# Unable to translate stdin:38 +# Defaults>"some one" set_home + +dn: cn=foo,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo +sudoUser: foo +sudoHost: hosta +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=foo.bar,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo.bar +sudoUser: foo.bar +sudoHost: hostb +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=foo\",ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo\" +sudoUser: foo" +sudoHost: hostc +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=foo:bar,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo:bar +sudoUser: foo:bar +sudoHost: hostd +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=foo:bar\",ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: foo:bar\" +sudoUser: foo:bar" +sudoHost: hoste +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=%baz,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %baz +sudoUser: %baz +sudoHost: hosta +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 6 + +dn: cn=%baz.biz,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %baz.biz +sudoUser: %baz.biz +sudoHost: hostb +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 7 + +dn: cn=%:C/non UNIX 0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non UNIX 0 c +sudoUser: %:C/non UNIX 0 c +sudoHost: hostc +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 8 + +dn: cn=%:C/non\\'UNIX\\'1 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\\'UNIX\\'1 c +sudoUser: %:C/non\'UNIX\'1 c +sudoHost: hostd +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 9 + +dn: cn=%:C/non\"UNIX\"0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\"UNIX\"0 c +sudoUser: %:C/non"UNIX"0 c +sudoHost: hoste +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 10 + +dn: cn=%:C/non_UNIX_0 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non_UNIX_0 c +sudoUser: %:C/non_UNIX_0 c +sudoHost: hostf +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 11 + +dn: cn=%:C/non\\'UNIX_3 c,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %:C/non\\'UNIX_3 c +sudoUser: %:C/non\'UNIX_3 c +sudoHost: hostg +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 12 + +dn: cn=\+netgr,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \+netgr +sudoUser: +netgr +sudoHost: hosth +sudoRunAsUser: root +sudoCommand: ALL +sudoOrder: 13 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok new file mode 100644 index 0000000..7039523 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.ldif2sudo.ok @@ -0,0 +1,38 @@ +# sudoRole foo +foo hosta = (root) ALL + +# sudoRole foo.bar +foo.bar hostb = (root) ALL + +# sudoRole foo" +foo\" hostc = (root) ALL + +# sudoRole foo:bar +foo\:bar hostd = (root) ALL + +# sudoRole foo:bar" +foo\:bar\" hoste = (root) ALL + +# sudoRole %baz +%baz hosta = (root) ALL + +# sudoRole %baz.biz +%baz.biz hostb = (root) ALL + +# sudoRole %:C/non UNIX 0 c +"%:C/non UNIX 0 c" hostc = (root) ALL + +# sudoRole %:C/non\'UNIX\'1 c +"%:C/non\'UNIX\'1 c" hostd = (root) ALL + +# sudoRole %:C/non"UNIX"0 c +"%:C/non\"UNIX\"0 c" hoste = (root) ALL + +# sudoRole %:C/non_UNIX_0 c +"%:C/non_UNIX_0 c" hostf = (root) ALL + +# sudoRole %:C/non\'UNIX_3 c +"%:C/non\'UNIX_3 c" hostg = (root) ALL + +# sudoRole +netgr ++netgr hosth = (root) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.out.ok new file mode 100644 index 0000000..be5e8f3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.out.ok @@ -0,0 +1,42 @@ +Parses OK. + +Defaults@somehost set_home +Defaults@quoted\" set_home +Defaults:you set_home +Defaults:us\" set_home +Defaults:%them set_home +Defaults:"%: non UNIX 0 c" set_home +Defaults:+net set_home +Defaults>someone set_home +Defaults>"some one" set_home + +Runas_Alias RA1 = foo +Runas_Alias RA2 = foo\" +Runas_Alias RA3 = foo\:bar +Runas_Alias RA4 = foo\:bar\" +User_Alias UA1 = foo +User_Alias UA10 = "%:C/non\"UNIX\"0 c" +User_Alias UA11 = "%:C/non_UNIX_0 c" +User_Alias UA12 = "%:C/non\'UNIX_3 c" +User_Alias UA2 = foo.bar +User_Alias UA3 = foo\" +User_Alias UA4 = foo\:bar +User_Alias UA5 = foo\:bar\" +User_Alias UA6 = %baz +User_Alias UA7 = %baz.biz +User_Alias UA8 = "%:C/non UNIX 0 c" +User_Alias UA9 = "%:C/non\'UNIX\'1 c" + +foo hosta = (root) ALL +foo.bar hostb = (root) ALL +foo\" hostc = (root) ALL +foo\:bar hostd = (root) ALL +foo\:bar\" hoste = (root) ALL +%baz hosta = (root) ALL +%baz.biz hostb = (root) ALL +"%:C/non UNIX 0 c" hostc = (root) ALL +"%:C/non\'UNIX\'1 c" hostd = (root) ALL +"%:C/non\"UNIX\"0 c" hoste = (root) ALL +"%:C/non_UNIX_0 c" hostf = (root) ALL +"%:C/non\'UNIX_3 c" hostg = (root) ALL ++netgr hosth = (root) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.toke.ok new file mode 100644 index 0000000..63e1648 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test2.toke.ok @@ -0,0 +1,60 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) + +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP + +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY BACKSLASH STRBODY BACKSLASH STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR USERGROUP +USERALIAS ALIAS = BEGINSTR STRBODY BACKSLASH STRBODY ENDSTR USERGROUP + +# +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +RUNASALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) + +# +DEFAULTS_HOST BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_HOST BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR USERGROUP DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR USERGROUP DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR NETGROUP DEFVAR + +# +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +# +# +# + +# +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL + +# +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY BACKSLASH STRBODY BACKSLASH STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY BACKSLASH STRBODY ENDSTR USERGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL +BEGINSTR STRBODY ENDSTR NETGROUP BEGINSTR STRBODY ENDSTR WORD(4) = ( BEGINSTR STRBODY ENDSTR WORD(4) ) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.in new file mode 100644 index 0000000..c24f88a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.in @@ -0,0 +1,26 @@ +# Test parsing of tuples +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always + +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always + +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always + +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.json.ok new file mode 100644 index 0000000..f2f1d55 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.json.ok @@ -0,0 +1,114 @@ +{ + "Defaults": [ + { + "Options": [ + { "lecture": true } + ] + }, + { + "Options": [ + { "lecture": false } + ] + }, + { + "Options": [ + { "lecture": "never" } + ] + }, + { + "Options": [ + { "lecture": "once" } + ] + }, + { + "Options": [ + { "lecture": "always" } + ] + }, + { + "Options": [ + { "listpw": true } + ] + }, + { + "Options": [ + { "listpw": false } + ] + }, + { + "Options": [ + { "listpw": "never" } + ] + }, + { + "Options": [ + { "listpw": "any" } + ] + }, + { + "Options": [ + { "listpw": "all" } + ] + }, + { + "Options": [ + { "listpw": "always" } + ] + }, + { + "Options": [ + { "verifypw": true } + ] + }, + { + "Options": [ + { "verifypw": false } + ] + }, + { + "Options": [ + { "verifypw": "never" } + ] + }, + { + "Options": [ + { "verifypw": "any" } + ] + }, + { + "Options": [ + { "verifypw": "all" } + ] + }, + { + "Options": [ + { "verifypw": "always" } + ] + }, + { + "Options": [ + { "fdexec": true } + ] + }, + { + "Options": [ + { "fdexec": false } + ] + }, + { + "Options": [ + { "fdexec": "never" } + ] + }, + { + "Options": [ + { "fdexec": "digest_only" } + ] + }, + { + "Options": [ + { "fdexec": "always" } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif.ok new file mode 100644 index 0000000..de01cde --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif.ok @@ -0,0 +1,28 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: lecture +sudoOption: !lecture +sudoOption: lecture=never +sudoOption: lecture=once +sudoOption: lecture=always +sudoOption: listpw +sudoOption: !listpw +sudoOption: listpw=never +sudoOption: listpw=any +sudoOption: listpw=all +sudoOption: listpw=always +sudoOption: verifypw +sudoOption: !verifypw +sudoOption: verifypw=never +sudoOption: verifypw=any +sudoOption: verifypw=all +sudoOption: verifypw=always +sudoOption: fdexec +sudoOption: !fdexec +sudoOption: fdexec=never +sudoOption: fdexec=digest_only +sudoOption: fdexec=always + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok new file mode 100644 index 0000000..e1c743c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.ldif2sudo.ok @@ -0,0 +1,22 @@ +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.out.ok new file mode 100644 index 0000000..882af0d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.out.ok @@ -0,0 +1,24 @@ +Parses OK. + +Defaults lecture +Defaults !lecture +Defaults lecture=never +Defaults lecture=once +Defaults lecture=always +Defaults listpw +Defaults !listpw +Defaults listpw=never +Defaults listpw=any +Defaults listpw=all +Defaults listpw=always +Defaults verifypw +Defaults !verifypw +Defaults verifypw=never +Defaults verifypw=any +Defaults verifypw=all +Defaults verifypw=always +Defaults fdexec +Defaults !fdexec +Defaults fdexec=never +Defaults fdexec=digest_only +Defaults fdexec=always diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.toke.ok new file mode 100644 index 0000000..1847149 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test20.toke.ok @@ -0,0 +1,26 @@ +# +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.in new file mode 100644 index 0000000..65416cf --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.in @@ -0,0 +1,36 @@ +# Test parsing of syslog settings +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 + +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none + +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.json.ok new file mode 100644 index 0000000..7896965 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.json.ok @@ -0,0 +1,169 @@ +{ + "Defaults": [ + { + "Options": [ + { "syslog": true } + ] + }, + { + "Options": [ + { "syslog": false } + ] + }, + { + "Options": [ + { "syslog": "auth" } + ] + }, + { + "Options": [ + { "syslog": "daemon" } + ] + }, + { + "Options": [ + { "syslog": "user" } + ] + }, + { + "Options": [ + { "syslog": "local0" } + ] + }, + { + "Options": [ + { "syslog": "local1" } + ] + }, + { + "Options": [ + { "syslog": "local2" } + ] + }, + { + "Options": [ + { "syslog": "local3" } + ] + }, + { + "Options": [ + { "syslog": "local4" } + ] + }, + { + "Options": [ + { "syslog": "local5" } + ] + }, + { + "Options": [ + { "syslog": "local6" } + ] + }, + { + "Options": [ + { "syslog": "local7" } + ] + }, + { + "Options": [ + { "syslog_goodpri": false } + ] + }, + { + "Options": [ + { "syslog_goodpri": "alert" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "crit" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "debug" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "emerg" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "err" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "info" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "notice" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "warning" } + ] + }, + { + "Options": [ + { "syslog_goodpri": "none" } + ] + }, + { + "Options": [ + { "syslog_badpri": false } + ] + }, + { + "Options": [ + { "syslog_badpri": "alert" } + ] + }, + { + "Options": [ + { "syslog_badpri": "crit" } + ] + }, + { + "Options": [ + { "syslog_badpri": "debug" } + ] + }, + { + "Options": [ + { "syslog_badpri": "emerg" } + ] + }, + { + "Options": [ + { "syslog_badpri": "err" } + ] + }, + { + "Options": [ + { "syslog_badpri": "info" } + ] + }, + { + "Options": [ + { "syslog_badpri": "notice" } + ] + }, + { + "Options": [ + { "syslog_badpri": "warning" } + ] + }, + { + "Options": [ + { "syslog_badpri": "none" } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif.ok new file mode 100644 index 0000000..b3bede8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif.ok @@ -0,0 +1,39 @@ +dn: cn=defaults,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: syslog +sudoOption: !syslog +sudoOption: syslog=auth +sudoOption: syslog=daemon +sudoOption: syslog=user +sudoOption: syslog=local0 +sudoOption: syslog=local1 +sudoOption: syslog=local2 +sudoOption: syslog=local3 +sudoOption: syslog=local4 +sudoOption: syslog=local5 +sudoOption: syslog=local6 +sudoOption: syslog=local7 +sudoOption: !syslog_goodpri +sudoOption: syslog_goodpri=alert +sudoOption: syslog_goodpri=crit +sudoOption: syslog_goodpri=debug +sudoOption: syslog_goodpri=emerg +sudoOption: syslog_goodpri=err +sudoOption: syslog_goodpri=info +sudoOption: syslog_goodpri=notice +sudoOption: syslog_goodpri=warning +sudoOption: syslog_goodpri=none +sudoOption: !syslog_badpri +sudoOption: syslog_badpri=alert +sudoOption: syslog_badpri=crit +sudoOption: syslog_badpri=debug +sudoOption: syslog_badpri=emerg +sudoOption: syslog_badpri=err +sudoOption: syslog_badpri=info +sudoOption: syslog_badpri=notice +sudoOption: syslog_badpri=warning +sudoOption: syslog_badpri=none + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok new file mode 100644 index 0000000..56e09ff --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.ldif2sudo.ok @@ -0,0 +1,33 @@ +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.out.ok new file mode 100644 index 0000000..630fa6b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.out.ok @@ -0,0 +1,35 @@ +Parses OK. + +Defaults syslog +Defaults !syslog +Defaults syslog=auth +Defaults syslog=daemon +Defaults syslog=user +Defaults syslog=local0 +Defaults syslog=local1 +Defaults syslog=local2 +Defaults syslog=local3 +Defaults syslog=local4 +Defaults syslog=local5 +Defaults syslog=local6 +Defaults syslog=local7 +Defaults !syslog_goodpri +Defaults syslog_goodpri=alert +Defaults syslog_goodpri=crit +Defaults syslog_goodpri=debug +Defaults syslog_goodpri=emerg +Defaults syslog_goodpri=err +Defaults syslog_goodpri=info +Defaults syslog_goodpri=notice +Defaults syslog_goodpri=warning +Defaults syslog_goodpri=none +Defaults !syslog_badpri +Defaults syslog_badpri=alert +Defaults syslog_badpri=crit +Defaults syslog_badpri=debug +Defaults syslog_badpri=emerg +Defaults syslog_badpri=err +Defaults syslog_badpri=info +Defaults syslog_badpri=notice +Defaults syslog_badpri=warning +Defaults syslog_badpri=none diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.toke.ok new file mode 100644 index 0000000..871584b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test21.toke.ok @@ -0,0 +1,36 @@ +# +DEFAULTS DEFVAR +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) + +DEFAULTS !DEFVAR +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) +DEFAULTS DEFVAR = WORD(2) diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.in new file mode 100644 index 0000000..ecf2fd9 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.in @@ -0,0 +1,6 @@ +# Test parsing of empty Runas_List + +user1 ALL = ( : ) ALL +user2 ALL = (:) ALL +user3 ALL = ( ) ALL +user4 ALL = () ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.json.ok new file mode 100644 index 0000000..22141a1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.json.ok @@ -0,0 +1,88 @@ +{ + "User_Specs": [ + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "username": "" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif.ok new file mode 100644 index 0000000..14c3df4 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif.ok @@ -0,0 +1,40 @@ +dn: cn=user1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user1 +sudoUser: user1 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=user2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user2 +sudoUser: user2 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=user3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user3 +sudoUser: user3 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=user4,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: user4 +sudoUser: user4 +sudoHost: ALL +sudoRunAsUser: +sudoCommand: ALL +sudoOrder: 4 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok new file mode 100644 index 0000000..e0c98e0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.ldif2sudo.ok @@ -0,0 +1,11 @@ +# sudoRole user1 +user1 ALL = () ALL + +# sudoRole user2 +user2 ALL = () ALL + +# sudoRole user3 +user3 ALL = () ALL + +# sudoRole user4 +user4 ALL = () ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.out.ok new file mode 100644 index 0000000..ab43a93 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.out.ok @@ -0,0 +1,6 @@ +Parses OK. + +user1 ALL = (root) ALL +user2 ALL = (root) ALL +user3 ALL = (root) ALL +user4 ALL = (root) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.sudo.ok new file mode 100644 index 0000000..879e1bd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.sudo.ok @@ -0,0 +1,7 @@ +user1 ALL = () ALL + +user2 ALL = () ALL + +user3 ALL = () ALL + +user4 ALL = () ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.toke.ok new file mode 100644 index 0000000..baf395b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test22.toke.ok @@ -0,0 +1,6 @@ +# + +WORD(5) ALL = ( : ) ALL +WORD(5) ALL = ( : ) ALL +WORD(5) ALL = ( ) ALL +WORD(5) ALL = ( ) ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.in new file mode 100644 index 0000000..82fcd83 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.in @@ -0,0 +1,6 @@ +# Test whitespace in User_List as part of a per-user Defaults entry +User_Alias FOO = foo, bar +Defaults:FOO env_reset +Defaults:foo,bar env_reset +Defaults:foo,\ bar env_reset +Defaults:foo, bar env_reset diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.json.ok new file mode 100644 index 0000000..fc69eb1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.json.ok @@ -0,0 +1,45 @@ +{ + "Defaults": [ + { + "Binding": [ + { "useralias": "FOO" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": "bar" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": " bar" } + ], + "Options": [ + { "env_reset": true } + ] + }, + { + "Binding": [ + { "username": "foo" }, + { "username": "bar" } + ], + "Options": [ + { "env_reset": true } + ] + } + ], + "User_Aliases": { + "FOO": [ + { "username": "foo" }, + { "username": "bar" } + ] + } +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif.ok new file mode 100644 index 0000000..0aa54be --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif.ok @@ -0,0 +1,12 @@ +# Unable to translate stdin:3 +# Defaults:foo, bar env_reset + +# Unable to translate stdin:4 +# Defaults:foo, bar env_reset + +# Unable to translate stdin:5 +# Defaults:foo, " bar" env_reset + +# Unable to translate stdin:6 +# Defaults:foo, bar env_reset + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.ldif2sudo.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.out.ok new file mode 100644 index 0000000..566aec1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.out.ok @@ -0,0 +1,8 @@ +Parses OK. + +Defaults:FOO env_reset +Defaults:foo, bar env_reset +Defaults:foo, " bar" env_reset +Defaults:foo, bar env_reset + +User_Alias FOO = foo, bar diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.toke.ok new file mode 100644 index 0000000..49f2e51 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test3.toke.ok @@ -0,0 +1,6 @@ +# +USERALIAS ALIAS = WORD(5) , WORD(5) +DEFAULTS_USER ALIAS DEFVAR +DEFAULTS_USER WORD(5) , WORD(5) DEFVAR +DEFAULTS_USER WORD(5) , WORD(5) DEFVAR +DEFAULTS_USER WORD(5) , WORD(5) DEFVAR diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.in new file mode 100644 index 0000000..b8df454 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.in @@ -0,0 +1,7 @@ +# Test line continuation with anchored matches +User_Alias FOO = foo \ +: BAR = bar + +# This used to pass for sudo < 1.8.1 (though it should not have) +User_Alias FOO = foo \ +User_Alias BAR = bar diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.out.ok new file mode 100644 index 0000000..3552d3b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.out.ok @@ -0,0 +1,4 @@ +Parse error in sudoers near line 7. + +User_Alias BAR = bar +User_Alias FOO = foo diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.toke.ok new file mode 100644 index 0000000..a225792 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test4.toke.ok @@ -0,0 +1,5 @@ +# +USERALIAS ALIAS = WORD(5) : ALIAS = WORD(5) + +# +USERALIAS ALIAS = WORD(5) ERROR <*> ALIAS = WORD(5) diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.in new file mode 100644 index 0000000..354f589 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.in @@ -0,0 +1,3 @@ +# Test empty string in User_Alias and Command_Spec +User_Alias FOO = "" +"" ALL = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.out.ok new file mode 100644 index 0000000..3cd2ec8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.out.ok @@ -0,0 +1,2 @@ +Parse error in sudoers near line 2. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.toke.ok new file mode 100644 index 0000000..9376455 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test5.toke.ok @@ -0,0 +1,3 @@ +# +USERALIAS ALIAS = BEGINSTR ENDSTR ERROR <*> +BEGINSTR ENDSTR ERROR <*> ALL = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.in new file mode 100644 index 0000000..e804571 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.in @@ -0,0 +1,15 @@ +# Check that uids work in per-user and per-runas Defaults +Defaults:#123 set_home +Defaults>#123 set_home +Defaults:"#123" set_home +Defaults>"#123" set_home + +# Check that uids work in a Command_Spec +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +"#0" ALL = ALL +"#0" ALL = ("#0" : "#0") ALL + +# Check that gids work in a Command_Spec +%#0 ALL = ALL +"%#0" ALL = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.json.ok new file mode 100644 index 0000000..be1f80f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.json.ok @@ -0,0 +1,158 @@ +{ + "Defaults": [ + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + }, + { + "Binding": [ + { "userid": 123 } + ], + "Options": [ + { "set_home": true } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "userid": 0 } + ], + "runasgroups": [ + { "usergroup": "#0" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "userid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "runasusers": [ + { "userid": 0 } + ], + "runasgroups": [ + { "usergroup": "#0" } + ], + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + }, + { + "User_List": [ + { "usergid": 0 } + ], + "Host_List": [ + { "hostname": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "setenv": true } + ], + "Commands": [ + { "command": "ALL" } + ] + } + ] + } + ] +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif.ok new file mode 100644 index 0000000..c4e11e4 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif.ok @@ -0,0 +1,70 @@ +# Unable to translate stdin:2 +# Defaults:#123 set_home + +# Unable to translate stdin:3 +# Defaults>#123 set_home + +# Unable to translate stdin:4 +# Defaults:#123 set_home + +# Unable to translate stdin:5 +# Defaults>#123 set_home + +dn: cn=\#0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0 +sudoUser: #0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 1 + +dn: cn=\#0_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_1 +sudoUser: #0 +sudoHost: ALL +sudoRunAsUser: #0 +sudoRunAsGroup: #0 +sudoCommand: ALL +sudoOrder: 2 + +dn: cn=\#0_2,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_2 +sudoUser: #0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 3 + +dn: cn=\#0_3,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: \#0_3 +sudoUser: #0 +sudoHost: ALL +sudoRunAsUser: #0 +sudoRunAsGroup: #0 +sudoCommand: ALL +sudoOrder: 4 + +dn: cn=%\#0,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %\#0 +sudoUser: %#0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 5 + +dn: cn=%\#0_1,ou=SUDOers,dc=sudo,dc=ws +objectClass: top +objectClass: sudoRole +cn: %\#0_1 +sudoUser: %#0 +sudoHost: ALL +sudoCommand: ALL +sudoOrder: 6 + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok new file mode 100644 index 0000000..bfe40bb --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.ldif2sudo.ok @@ -0,0 +1,5 @@ +# sudoRole #0, #0_1, #0_2, #0_3 +#0 ALL = ALL, (#0 : #0) ALL, ALL, (#0 : #0) ALL + +# sudoRole %#0, %#0_1 +%#0 ALL = ALL, ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.out.ok new file mode 100644 index 0000000..ccc1627 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.out.ok @@ -0,0 +1,13 @@ +Parses OK. + +Defaults:#123 set_home +Defaults>#123 set_home +Defaults:#123 set_home +Defaults>#123 set_home + +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +#0 ALL = ALL +#0 ALL = (#0 : #0) ALL +%#0 ALL = ALL +%#0 ALL = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.toke.ok new file mode 100644 index 0000000..a9c0522 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test6.toke.ok @@ -0,0 +1,15 @@ +# +DEFAULTS_USER WORD(5) DEFVAR +DEFAULTS_RUNAS WORD(5) DEFVAR +DEFAULTS_USER BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR +DEFAULTS_RUNAS BEGINSTR STRBODY ENDSTR WORD(4) DEFVAR + +# +WORD(5) ALL = ALL +WORD(5) ALL = ( WORD(5) : WORD(5) ) ALL +BEGINSTR STRBODY ENDSTR WORD(4) ALL = ALL +BEGINSTR STRBODY ENDSTR WORD(4) ALL = ( BEGINSTR STRBODY ENDSTR WORD(4) : BEGINSTR STRBODY ENDSTR WORD(4) ) ALL + +# +USERGROUP ALL = ALL +BEGINSTR STRBODY ENDSTR USERGROUP ALL = ALL diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.in new file mode 100644 index 0000000..7b241d0 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.in @@ -0,0 +1,7 @@ +# These should all be syntax errors +User_Alias FOO1 = "%" +User_Alias FOO2 = "%:" +User_Alias FOO3 = "+" +User_Alias FOO4 = % +User_Alias FOO5 = %: +User_Alias FOO6 = + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.out.ok new file mode 100644 index 0000000..3cd2ec8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.out.ok @@ -0,0 +1,2 @@ +Parse error in sudoers near line 2. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.toke.ok new file mode 100644 index 0000000..a5bf018 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test7.toke.ok @@ -0,0 +1,7 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR ERROR <*> +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR ERROR <*> +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR ERROR <*> +USERALIAS ALIAS = ERROR <*> +USERALIAS ALIAS = ERROR <*> +USERALIAS ALIAS = ERROR <*> diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.in new file mode 100644 index 0000000..d25e834 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.in @@ -0,0 +1,8 @@ +# Test quoted strings +User_Alias UA1 = "xy" +User_Alias UA2 = "x\ +y" +User_Alias UA3 = x\"y + +# A newline in the middle of a string is an error +User_Alias UA4 = "x diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.json.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.out.ok new file mode 100644 index 0000000..2ae8c6b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.out.ok @@ -0,0 +1,5 @@ +Parse error in sudoers near line 8. + +User_Alias UA1 = xy +User_Alias UA2 = xy +User_Alias UA3 = x\"y diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.toke.ok new file mode 100644 index 0000000..0f7e2a9 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test8.toke.ok @@ -0,0 +1,7 @@ +# +USERALIAS ALIAS = BEGINSTR STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = BEGINSTR STRBODY STRBODY ENDSTR WORD(4) +USERALIAS ALIAS = WORD(5) + +# +USERALIAS ALIAS = BEGINSTR STRBODY ERROR <*> ERROR \ No newline at end of file diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.in b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.in new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.json.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.json.ok new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.json.ok @@ -0,0 +1,2 @@ +{ +} diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.ldif.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.ldif.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.out.ok new file mode 100644 index 0000000..40c742d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.out.ok @@ -0,0 +1,2 @@ +Parses OK. + diff --git a/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.toke.ok b/utsudo-0.0.2/plugins/sudoers/regress/sudoers/test9.toke.ok new file mode 100644 index 0000000..e69de29 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/group b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/group new file mode 100644 index 0000000..e2202d6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/group @@ -0,0 +1,15 @@ +wheel:*:0:root +daemon:*:1:daemon +kmem:*:2:root +sys:*:3:root +tty:*:4:root +operator:*:5:root +bin:*:7: +wsrc:*:9: +users:*:10: +auth:*:11: +games:*:13: +staff:*:20:root +guest:*:31:root +nogroup:*:32766: +nobody:*:32767: diff --git a/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.out.ok new file mode 100644 index 0000000..f980873 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.out.ok @@ -0,0 +1,8 @@ +Parses OK. + +Entries for user root: + +ALL = ALL + host matched + +Command unmatched diff --git a/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.sh b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.sh new file mode 100755 index 0000000..fb99a91 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test1.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Test for NULL dereference with "sudo -g group" when the sudoers rule +# has no runas user or group listed. +# This is RedHat bug Bug 667103. +# + +exec 2>&1 +./testsudoers -g bin -P ${TESTDIR}/group root id <&1 +./testsudoers -U $MYUID -G $MYGID root id <"${parentdir}/test3.d/root" <<-EOF + root ALL = ALL + EOF + + MYUID=`\ls -lnd $TESTDIR/test3.d | awk '{print $3}'` + MYGID=`\ls -lnd $TESTDIR/test3.d | awk '{print $4}'` + exec 2>&1 + ./testsudoers -U $MYUID -G $MYGID root id <<-EOF + #includedir $TESTDIR/test3.d + EOF + exit 0 +fi + +echo "$0: unable to determine parent dir" 1>&2 +exit 1 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.out.ok new file mode 100644 index 0000000..6b27d71 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.out.ok @@ -0,0 +1,6 @@ +testsudoers: test2.inc should be owned by uid 1 +Parse error in sudoers near line 1. + +Entries for user root: + +Command unmatched diff --git a/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.sh b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.sh new file mode 100755 index 0000000..3eaaa1d --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/testsudoers/test4.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Test sudoers owner check +# + +# Avoid warnings about memory leaks when there is a syntax error +ASAN_OPTIONS=detect_leaks=0; export ASAN_OPTIONS + +exec 2>&1 +./testsudoers -U 1 root id <$TESTFILE <&1 + +# Test world writable +chmod 666 $TESTFILE +./testsudoers -U $MYUID -G $MYGID root id <&1 +./testsudoers root id <&1 +./testsudoers root id <root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec + +Defaults env_keep -= "HOME" +Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS" +Defaults env_keep += "MAIL PS1 PS2 QTDIR LANG LC_ADDRESS LC_CTYPE" + +User_Alias FULLTIMERS = millert, mikef, dowdy + +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less + +Host_Alias SERVERS = master, mail, www, ns +EOF + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.out.ok new file mode 100644 index 0000000..e5c355c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.out.ok @@ -0,0 +1 @@ +stdin: parsed OK diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.sh b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.sh new file mode 100755 index 0000000..9f30923 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test7.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Test sudoers_locale early Defaults +# + +LANG=C; export LANG +LC_NUMERIC=fr_FR.UTF-8; export LC_NUMERIC + +# First check that visudo supports non-C locales +# Note that older versions of sudo did not set the locale +# until sudoers was read so this check will fail on them. +./visudo -csf - >/dev/null 2>&1 <<-EOF + Defaults sudoers_locale = fr_FR.UTF-8 + Defaults passwd_timeout = "2,5" + EOF + +# Now make sure we can set passwd_timeout to a floating point value +# using a non-C locale. +if [ $? -eq 0 ]; then + ./visudo -csf - <<-EOF + Defaults passwd_timeout = "2,5" + Defaults sudoers_locale = fr_FR.UTF-8 + EOF +else + # No support for LC_NUMERIC? + echo "stdin: parsed OK" +fi + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.err.ok b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.err.ok new file mode 100644 index 0000000..e8a2b18 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.err.ok @@ -0,0 +1 @@ +visudo: stdin:1 value "2.5" is invalid for option "passwd_timeout" diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.out.ok new file mode 100644 index 0000000..16ebc45 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.out.ok @@ -0,0 +1 @@ +parse error in stdin near line 1 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.sh b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.sh new file mode 100755 index 0000000..6674a55 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test8.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Test sudoers_locale early Defaults +# + +LANG=C; export LANG +LC_NUMERIC=fr_FR.UTF-8; export LC_NUMERIC + +# First check that visudo supports non-C locales +# Note that older versions of sudo did not set the locale +# until sudoers was read so this check will fail on them. +./visudo -csf - >/dev/null 2>&1 <<-EOF + Defaults sudoers_locale = fr_FR.UTF-8 + Defaults passwd_timeout = "2,5" + EOF + +# Now make sure we can set passwd_timeout to a floating point value +# using a non-C locale. +if [ $? -eq 0 ]; then + ./visudo -csf - <<-EOF + Defaults passwd_timeout = "2.5" + Defaults sudoers_locale = fr_FR.UTF-8 + EOF +else + # No support for LC_NUMERIC? + echo "parse error in stdin near line 1" + echo 'visudo: stdin:1 value "2.5" is invalid for option "passwd_timeout"' 1>&2 +fi + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.out.ok b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.out.ok new file mode 100644 index 0000000..e5c355c --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.out.ok @@ -0,0 +1 @@ +stdin: parsed OK diff --git a/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.sh b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.sh new file mode 100755 index 0000000..d62fb88 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/regress/visudo/test9.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# +# Test IP and network address in host-based Defaults statements +# Bugzilla #766 +# + +./visudo -cf - <<-EOF + Defaults@127.0.0.1 !authenticate + Defaults@10.0.0.0/8 !always_set_home + EOF + +exit 0 diff --git a/utsudo-0.0.2/plugins/sudoers/set_perms.c b/utsudo-0.0.2/plugins/sudoers/set_perms.c new file mode 100644 index 0000000..528440f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/set_perms.c @@ -0,0 +1,1723 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1994-1996, 1998-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef _AIX +# include +#endif +#include +#include +#include + +#include "sudoers.h" + +/* + * Prototypes + */ +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) +static struct gid_list *runas_setgroups(void); +#endif + +/* + * We keep track of the current permisstions and use a stack to restore + * the old permissions. A depth of 16 is overkill. + */ +struct perm_state { + uid_t ruid; + uid_t euid; +#if defined(HAVE_SETRESUID) || defined(ID_SAVED) + uid_t suid; +#endif + gid_t rgid; + gid_t egid; +#if defined(HAVE_SETRESUID) || defined(ID_SAVED) + gid_t sgid; +#endif + struct gid_list *gidlist; +}; + +#define PERM_STACK_MAX 16 +static struct perm_state perm_stack[PERM_STACK_MAX]; +static int perm_stack_depth = 0; + +#undef ID +#define ID(x) (state->x == ostate->x ? (uid_t)-1 : state->x) +#undef OID +#define OID(x) (ostate->x == state->x ? (uid_t)-1 : ostate->x) + +bool +rewind_perms(void) +{ + debug_decl(rewind_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth != 0) { + while (perm_stack_depth > 1) { + if (!restore_perms()) + debug_return_bool(false); + } + sudo_gidlist_delref(perm_stack[0].gidlist); + } + + debug_return_bool(true); +} + +#if defined(HAVE_SETRESUID) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid || state->suid != ostate->suid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid || state->sgid != ostate->sgid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ +#ifdef HAVE_GETRESUID + if (getresuid(&state->ruid, &state->euid, &state->suid)) { + errstr = "PERM_INITIAL: getresuid"; + goto bad; + + } + if (getresgid(&state->rgid, &state->egid, &state->sgid)) { + errstr = "PERM_INITIAL: getresgid"; + goto bad; + } +#else + state->ruid = getuid(); + state->euid = geteuid(); + state->suid = state->euid; /* in case we are setuid */ + + state->rgid = getgid(); + state->egid = getegid(); + state->sgid = state->egid; /* in case we are setgid */ +#endif + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, suid: %d, rgid: %d, egid: %d, sgid: %d", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setresgid(%d, %d, %d)", + (int)ID(rgid), (int)ID(egid), (int)ID(sgid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + state->sgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setresgid(%d, %d, %d)", + (int)ID(rgid), (int)ID(egid), (int)ID(sgid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + state->suid = ostate->suid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assumes euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + + case PERM_IOLOG: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = iolog_gid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = iolog_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setresgid(ID(rgid), ID(egid), ID(sgid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setresgid(%d, %d, %d)", + (int)ID(rgid), (int)ID(egid), (int)ID(sgid)); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setresuid(ID(ruid), ID(euid), ID(suid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setresuid(%d, %d, %d)", + (int)ID(ruid), (int)ID(euid), (int)ID(suid)); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth < 2) { + sudo_warnx(U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid); + + /* XXX - more cases here where euid != ruid */ + if (OID(euid) == ROOT_UID) { + if (setresuid(-1, ROOT_UID, -1)) { + sudo_warn("setresuid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + -1, ROOT_UID, -1); + goto bad; + } + } + if (setresgid(OID(rgid), OID(egid), OID(sgid))) { + sudo_warn("setresgid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + if (setresuid(OID(ruid), OID(euid), OID(suid))) { + sudo_warn("setresuid() [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(_AIX) && defined(ID_SAVED) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid || state->suid != ostate->suid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid || state->sgid != ostate->sgid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuidx(ID_REAL); + state->euid = getuidx(ID_EFFECTIVE); + state->suid = getuidx(ID_SAVED); + state->rgid = getgidx(ID_REAL); + state->egid = getgidx(ID_EFFECTIVE); + state->sgid = getgidx(ID_SAVED); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, suid: %d, rgid: %d, egid: %d, sgid: %d", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setgidx(ID_EFFECTIVE, %d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (ostate->euid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE|ID_REAL, user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setuidx(ID_EFFECTIVE|ID_REAL, %d)", (int)user_uid); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + state->sgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + state->suid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + (int)user_uid); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, state->egid)) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + state->suid = ostate->suid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED && setuidx(ID_EFFECTIVE, state->euid)) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + state->sgid = ostate->sgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, sudoers_gid)) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED) { + if (ostate->ruid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE, state->euid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setuidx(ID_EFFECTIVE, %d)", (int)sudoers_uid); + goto bad; + } + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED) { + if (ostate->ruid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE, timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setuidx(ID_EFFECTIVE, %d)", + (int)timestamp_uid); + goto bad; + } + } + break; + + case PERM_IOLOG: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = iolog_gid; + state->sgid = ostate->sgid; + state->ruid = ROOT_UID; + state->euid = iolog_uid; + state->suid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: gid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid, + (int)state->rgid, (int)state->egid, (int)state->sgid); + if (GID_CHANGED && setgidx(ID_EFFECTIVE, iolog_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setgidx(ID_EFFECTIVE, %d)", (int)iolog_gid); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: uid: " + "[%d, %d, %d] -> [%d, %d, %d]", __func__, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid, + (int)state->ruid, (int)state->euid, (int)state->suid); + if (UID_CHANGED) { + if (ostate->ruid != ROOT_UID || ostate->suid != ROOT_UID) { + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + ROOT_UID); + goto bad; + } + } + if (setuidx(ID_EFFECTIVE, timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setuidx(ID_EFFECTIVE, %d)", + (int)timestamp_uid); + goto bad; + } + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth < 2) { + sudo_warnx(U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->ruid, (int)state->euid, (int)state->suid, + (int)ostate->ruid, (int)ostate->euid, (int)ostate->suid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d, %d] -> [%d, %d, %d]", + __func__, (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)ostate->rgid, (int)ostate->egid, (int)ostate->sgid); + + if (OID(ruid) != (uid_t)-1 || OID(euid) != (uid_t)-1 || OID(suid) != (uid_t)-1) { + if (OID(euid) == ROOT_UID) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: setuidx(ID_EFFECTIVE, %d)", + __func__, ROOT_UID); + if (setuidx(ID_EFFECTIVE, ROOT_UID)) { + sudo_warn("setuidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + -1, ROOT_UID, -1); + goto bad; + } + } + if (OID(ruid) == OID(euid) && OID(euid) == OID(suid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + __func__, (int)OID(ruid)); + if (setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, OID(ruid))) { + sudo_warn("setuidx(ID_EFFECTIVE|ID_REAL|ID_SAVED) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + } else if (OID(ruid) == (uid_t)-1 && OID(suid) == (uid_t)-1) { + /* May have already changed euid to ROOT_UID above. */ + if (OID(euid) != ROOT_UID) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE, %d)", __func__, OID(euid)); + if (setuidx(ID_EFFECTIVE, OID(euid))) { + sudo_warn("setuidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + } + } else if (OID(suid) == (uid_t)-1) { + /* Cannot set the real uid alone. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_REAL|ID_EFFECTIVE, %d)", __func__, OID(ruid)); + if (setuidx(ID_REAL|ID_EFFECTIVE, OID(ruid))) { + sudo_warn("setuidx(ID_REAL|ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->ruid, (int)state->euid, (int)state->suid, + (int)OID(ruid), (int)OID(euid), (int)OID(suid)); + goto bad; + } + /* Restore the effective euid if it doesn't match the ruid. */ + if (OID(euid) != OID(ruid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setuidx(ID_EFFECTIVE, %d)", __func__, ostate->euid); + if (setuidx(ID_EFFECTIVE, ostate->euid)) { + sudo_warn("setuidx(ID_EFFECTIVE, %d)", (int)ostate->euid); + goto bad; + } + } + } + } + if (OID(rgid) != (gid_t)-1 || OID(egid) != (gid_t)-1 || OID(sgid) != (gid_t)-1) { + if (OID(rgid) == OID(egid) && OID(egid) == OID(sgid)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, %d)", + __func__, (int)OID(rgid)); + if (setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED, OID(rgid))) { + sudo_warn("setgidx(ID_EFFECTIVE|ID_REAL|ID_SAVED) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } else if (OID(rgid) == (gid_t)-1 && OID(sgid) == (gid_t)-1) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: setgidx(ID_EFFECTIVE, %d)", + __func__, (int)OID(egid)); + if (setgidx(ID_EFFECTIVE, OID(egid))) { + sudo_warn("setgidx(ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } else if (OID(sgid) == (gid_t)-1) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: setgidx(ID_EFFECTIVE|ID_REAL, %d)", __func__, OID(rgid)); + if (setgidx(ID_REAL|ID_EFFECTIVE, OID(rgid))) { + sudo_warn("setgidx(ID_REAL|ID_EFFECTIVE) [%d, %d, %d] -> [%d, %d, %d]", + (int)state->rgid, (int)state->egid, (int)state->sgid, + (int)OID(rgid), (int)OID(egid), (int)OID(sgid)); + goto bad; + } + } + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(HAVE_SETREUID) + +#define UID_CHANGED (state->ruid != ostate->ruid || state->euid != ostate->euid) +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid) + +/* + * Set real and effective and saved uids and gids based on perm. + * We always retain a saved uid of 0 unless we are headed for an exec(). + * We only flip the effective gid since it only changes for PERM_SUDOERS. + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuid(); + state->euid = geteuid(); + state->rgid = getgid(); + state->egid = getegid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, rgid: %d, egid: %d", __func__, + (int)state->ruid, (int)state->euid, + (int)state->rgid, (int)state->egid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + /* + * setreuid(0, 0) may fail on some systems if euid is not already 0. + */ + if (ostate->euid != ROOT_UID) { + if (setreuid(-1, ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setreuid(-1, %d)", ROOT_UID); + goto bad; + } + } + if (ostate->ruid != ROOT_UID) { + if (setreuid(ROOT_UID, -1)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setreuid(%d, -1)", ROOT_UID); + goto bad; + } + } + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setregid(%d, %d)", (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->rgid = ostate->rgid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setregid(%d, %d)", (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = ROOT_UID; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setreuid(%d, %d)", (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setregid(%d, %d)", + (int)ID(rgid), (int)ID(egid)); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ROOT_UID; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + + case PERM_IOLOG: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = iolog_gid; + state->ruid = ROOT_UID; + state->euid = iolog_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setregid(ID(rgid), ID(egid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setregid(%d, %d)", + (int)ID(rgid), (int)ID(egid)); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (UID_CHANGED && setreuid(ID(ruid), ID(euid))) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setreuid(%d, %d)", + (int)ID(ruid), (int)ID(euid)); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth < 2) { + sudo_warnx(U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d] -> [%d, %d]", + __func__, (int)state->ruid, (int)state->euid, + (int)ostate->ruid, (int)ostate->euid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d] -> [%d, %d]", + __func__, (int)state->rgid, (int)state->egid, + (int)ostate->rgid, (int)ostate->egid); + + /* + * When changing euid to ROOT_UID, setreuid() may fail even if + * the ruid is ROOT_UID so call setuid() first. + */ + if (OID(euid) == ROOT_UID) { + /* setuid() may not set the saved ID unless the euid is ROOT_UID */ + if (ID(euid) != ROOT_UID) { + if (setreuid(-1, ROOT_UID) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "setreuid() [%d, %d] -> [-1, %d)", (int)state->ruid, + (int)state->euid, ROOT_UID); + } + } + if (setuid(ROOT_UID)) { + sudo_warn("setuid() [%d, %d] -> %d)", (int)state->ruid, + (int)state->euid, ROOT_UID); + goto bad; + } + } + if (setreuid(OID(ruid), OID(euid))) { + sudo_warn("setreuid() [%d, %d] -> [%d, %d]", (int)state->ruid, + (int)state->euid, (int)OID(ruid), (int)OID(euid)); + goto bad; + } + if (setregid(OID(rgid), OID(egid))) { + sudo_warn("setregid() [%d, %d] -> [%d, %d]", (int)state->rgid, + (int)state->egid, (int)OID(rgid), (int)OID(egid)); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#elif defined(HAVE_SETEUID) + +#define GID_CHANGED (state->rgid != ostate->rgid || state->egid != ostate->egid) + +/* + * Set real and effective uids and gids based on perm. + * We always retain a real or effective uid of ROOT_UID unless + * we are headed for an exec(). + * This version of set_perms() works fine with the "stay_setuid" option. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + /* + * Since we only have setuid() and seteuid() and semantics + * for these calls differ on various systems, we set + * real and effective uids to ROOT_UID initially to be safe. + */ + if (perm != PERM_INITIAL) { + if (ostate->euid != ROOT_UID && seteuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "set_perms: seteuid(%d)", ROOT_UID); + goto bad; + } + if (ostate->ruid != ROOT_UID && setuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "set_perms: setuid(%d)", ROOT_UID); + goto bad; + } + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = getuid(); + state->euid = geteuid(); + state->rgid = getgid(); + state->egid = getegid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, euid: %d, rgid: %d, egid: %d", __func__, + (int)state->ruid, (int)state->euid, + (int)state->rgid, (int)state->egid); + break; + + case PERM_ROOT: + /* We already set ruid/euid above. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, ROOT_UID, ROOT_UID); + state->ruid = ROOT_UID; + state->euid = ROOT_UID; + state->rgid = ostate->rgid; + state->egid = ROOT_GID; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, ROOT_GID, ROOT_GID); + if (GID_CHANGED && setegid(ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + + case PERM_USER: + state->egid = user_gid; + state->rgid = ostate->rgid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: setegid(%d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_USER: setgroups"; + goto bad; + } + } + state->ruid = ROOT_UID; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_USER: seteuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_FULL_USER: + /* headed for exec() */ + state->rgid = user_gid; + state->egid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setgid(user_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setgid(%d)", (int)user_gid); + goto bad; + } + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + state->euid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (setuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_RUNAS: + state->rgid = ostate->rgid; + state->egid = runas_gr ? runas_gr->gr_gid : runas_pw->pw_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(state->egid)) { + errstr = N_("unable to change to runas gid"); + goto bad; + } + state->gidlist = runas_setgroups(); + if (state->gidlist == NULL) { + errstr = N_("unable to set runas group vector"); + goto bad; + } + state->ruid = ostate->ruid; + state->euid = runas_pw ? runas_pw->pw_uid : user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_RUNAS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(state->euid)) { + errstr = N_("unable to change to runas uid"); + goto bad; + } + break; + + case PERM_SUDOERS: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + + /* assume euid == ROOT_UID, ruid == user */ + state->rgid = ostate->rgid; + state->egid = sudoers_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(sudoers_gid)) { + errstr = N_("unable to change to sudoers gid"); + goto bad; + } + + state->ruid = ROOT_UID; + /* + * If sudoers_uid == ROOT_UID and sudoers_mode is group readable + * we use a non-zero uid in order to avoid NFS lossage. + * Using uid 1 is a bit bogus but should work on all OS's. + */ + if (sudoers_uid == ROOT_UID && (sudoers_mode & S_IRGRP)) + state->euid = 1; + else + state->euid = sudoers_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_SUDOERS: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(state->euid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_SUDOERS: seteuid(%d)", (int)state->euid); + goto bad; + } + break; + + case PERM_TIMESTAMP: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = ostate->egid; + state->ruid = ROOT_UID; + state->euid = timestamp_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_TIMESTAMP: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_TIMESTAMP: seteuid(%d)", (int)timestamp_uid); + goto bad; + } + break; + + case PERM_IOLOG: + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + state->rgid = ostate->rgid; + state->egid = iolog_gid; + state->ruid = ROOT_UID; + state->euid = iolog_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: gid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->rgid, + (int)ostate->egid, (int)state->rgid, (int)state->egid); + if (GID_CHANGED && setegid(iolog_gid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: setegid(%d)", (int)iolog_gid); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_IOLOG: uid: " + "[%d, %d] -> [%d, %d]", __func__, (int)ostate->ruid, + (int)ostate->euid, (int)state->ruid, (int)state->euid); + if (seteuid(timestamp_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_IOLOG: seteuid(%d)", (int)timestamp_uid); + goto bad; + } + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +bool +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth < 2) { + sudo_warnx(U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d, %d] -> [%d, %d]", + __func__, (int)state->ruid, (int)state->euid, + (int)ostate->ruid, (int)ostate->euid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d, %d] -> [%d, %d]", + __func__, (int)state->rgid, (int)state->egid, + (int)ostate->rgid, (int)ostate->egid); + + /* + * Since we only have setuid() and seteuid() and semantics + * for these calls differ on various systems, we set + * real and effective uids to ROOT_UID initially to be safe. + */ + if (seteuid(ROOT_UID)) { + sudo_warnx("seteuid() [%d] -> [%d]", (int)state->euid, ROOT_UID); + goto bad; + } + if (setuid(ROOT_UID)) { + sudo_warnx("setuid() [%d, %d] -> [%d, %d]", (int)state->ruid, ROOT_UID, + ROOT_UID, ROOT_UID); + goto bad; + } + + if (OID(egid) != (gid_t)-1 && setegid(ostate->egid)) { + sudo_warn("setegid(%d)", (int)ostate->egid); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + if (OID(euid) != (uid_t)-1 && seteuid(ostate->euid)) { + sudo_warn("seteuid(%d)", (int)ostate->euid); + goto bad; + } + sudo_gidlist_delref(state->gidlist); + debug_return_bool(true); + +bad: + debug_return_bool(false); +} + +#else /* !HAVE_SETRESUID && !HAVE_SETREUID && !HAVE_SETEUID */ + +/* + * Set uids and gids based on perm via setuid() and setgid(). + * NOTE: does not support the "stay_setuid" or timestampowner options. + * Also, sudoers_uid and sudoers_gid are not used. + */ +bool +set_perms(int perm) +{ + struct perm_state *state, *ostate = NULL; + char errbuf[1024]; + const char *errstr = errbuf; + debug_decl(set_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth == PERM_STACK_MAX) { + errstr = N_("perm stack overflow"); + errno = EINVAL; + goto bad; + } + + state = &perm_stack[perm_stack_depth]; + if (perm != PERM_INITIAL) { + if (perm_stack_depth == 0) { + errstr = N_("perm stack underflow"); + errno = EINVAL; + goto bad; + } + ostate = &perm_stack[perm_stack_depth - 1]; + } + + switch (perm) { + case PERM_INITIAL: + /* Stash initial state */ + state->ruid = geteuid() == ROOT_UID ? ROOT_UID : getuid(); + state->rgid = getgid(); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_INITIAL: " + "ruid: %d, rgid: %d", __func__, (int)state->ruid, (int)state->rgid); + break; + + case PERM_ROOT: + state->ruid = ROOT_UID; + state->rgid = ROOT_GID; + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: uid: " + "[%d] -> [%d]", __func__, (int)ostate->ruid, (int)state->ruid); + if (setuid(ROOT_UID)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_ROOT: setuid(%d)", ROOT_UID); + goto bad; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_ROOT: gid: " + "[%d] -> [%d]", __func__, (int)ostate->rgid, (int)state->rgid); + if (setgid(ROOT_GID)) { + errstr = N_("unable to change to root gid"); + goto bad; + } + break; + + case PERM_FULL_USER: + state->rgid = user_gid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: gid: " + "[%d] -> [%d]", __func__, (int)ostate->rgid, (int)state->rgid); + (void) setgid(user_gid); + state->gidlist = user_gid_list; + sudo_gidlist_addref(state->gidlist); + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(state->gidlist->ngids, state->gidlist->gids)) { + errstr = "PERM_FULL_USER: setgroups"; + goto bad; + } + } + state->ruid = user_uid; + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: PERM_FULL_USER: uid: " + "[%d] -> [%d]", __func__, (int)ostate->ruid, (int)state->ruid); + if (setuid(user_uid)) { + (void)snprintf(errbuf, sizeof(errbuf), + "PERM_FULL_USER: setuid(%d)", (int)user_uid); + goto bad; + } + break; + + case PERM_USER: + case PERM_SUDOERS: + case PERM_RUNAS: + case PERM_TIMESTAMP: + case PERM_IOLOG: + /* Unsupported since we can't set euid. */ + state->ruid = ostate->ruid; + state->rgid = ostate->rgid; + state->gidlist = ostate->gidlist; + sudo_gidlist_addref(state->gidlist); + break; + } + + perm_stack_depth++; + debug_return_bool(true); +bad: + if (errno == EAGAIN) + sudo_warnx(U_("%s: %s"), U_(errstr), U_("too many processes")); + else + sudo_warn("%s", U_(errstr)); + debug_return_bool(false); +} + +boll +restore_perms(void) +{ + struct perm_state *state, *ostate; + debug_decl(restore_perms, SUDOERS_DEBUG_PERMS) + + if (perm_stack_depth < 2) { + sudo_warnx(U_("perm stack underflow")); + debug_return_bool(true); + } + + state = &perm_stack[perm_stack_depth - 1]; + ostate = &perm_stack[perm_stack_depth - 2]; + perm_stack_depth--; + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: uid: [%d] -> [%d]", + __func__, (int)state->ruid, (int)ostate->ruid); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: gid: [%d] -> [%d]", + __func__, (int)state->rgid, (int)ostate->rgid); + + if (OID(rgid) != (gid_t)-1 && setgid(ostate->rgid)) { + sudo_warn("setgid(%d)", (int)ostate->rgid); + goto bad; + } + if (state->gidlist != ostate->gidlist) { + if (sudo_setgroups(ostate->gidlist->ngids, ostate->gidlist->gids)) { + sudo_warn("setgroups()"); + goto bad; + } + } + sudo_gidlist_delref(state->gidlist); + if (OID(ruid) != (uid_t)-1 && setuid(ostate->ruid)) { + sudo_warn("setuid(%d)", (int)ostate->ruid); + goto bad; + } + debug_return_bool(true); + +bad: + debug_return_bool(false); +} +#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ + +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) +static struct gid_list * +runas_setgroups(void) +{ + struct gid_list *gidlist; + debug_decl(runas_setgroups, SUDOERS_DEBUG_PERMS) + + gidlist = runas_getgroups(); + if (gidlist != NULL && !def_preserve_groups) { + if (sudo_setgroups(gidlist->ngids, gidlist->gids) < 0) { + sudo_gidlist_delref(gidlist); + gidlist = NULL; + } + } + debug_return_ptr(gidlist); +} +#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ diff --git a/utsudo-0.0.2/plugins/sudoers/solaris_audit.c b/utsudo-0.0.2/plugins/sudoers/solaris_audit.c new file mode 100644 index 0000000..a019653 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/solaris_audit.c @@ -0,0 +1,136 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014, Oracle and/or its affiliates. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SOLARIS_AUDIT + +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "solaris_audit.h" + +static adt_session_data_t *ah; /* audit session handle */ +static adt_event_data_t *event; /* event to be generated */ +static char cwd[PATH_MAX]; +static char cmdpath[PATH_MAX]; + +static int +adt_sudo_common(int argc, char *argv[]) +{ + if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) { + log_warning(SLOG_NO_STDERR, "adt_start_session"); + return -1; + } + if ((event = adt_alloc_event(ah, ADT_sudo)) == NULL) { + log_warning(SLOG_NO_STDERR, "alloc_event"); + (void) adt_end_session(ah); + return -1; + } + if ((event->adt_sudo.cwdpath = getcwd(cwd, sizeof(cwd))) == NULL) { + log_warning(SLOG_NO_STDERR, _("unable to get current working directory")); + } + + /* get the real executable name */ + if (user_cmnd != NULL) { + if (strlcpy(cmdpath, (const char *)user_cmnd, + sizeof(cmdpath)) >= sizeof(cmdpath)) { + log_warningx(SLOG_NO_STDERR, + _("truncated audit path user_cmnd: %s"), + user_cmnd); + } + } else { + if (strlcpy(cmdpath, (const char *)argv[0], + sizeof(cmdpath)) >= sizeof(cmdpath)) { + log_warningx(SLOG_NO_STDERR, + _("truncated audit path argv[0]: %s"), + argv[0]); + } + } + + event->adt_sudo.cmdpath = cmdpath; + event->adt_sudo.argc = argc - 1; + event->adt_sudo.argv = &argv[1]; + event->adt_sudo.envp = env_get(); + + return 0; +} + + +/* + * Returns 0 on success or -1 on error. + */ +int +solaris_audit_success(int argc, char *argv[]) +{ + int rc = -1; + + if (adt_sudo_common(argc, argv) != 0) { + return -1; + } + if (adt_put_event(event, ADT_SUCCESS, ADT_SUCCESS) != 0) { + log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_SUCCESS)"); + } else { + rc = 0; + } + adt_free_event(event); + (void) adt_end_session(ah); + + return rc; +} + +/* + * Returns 0 on success or -1 on error. + */ +int +solaris_audit_failure(int argc, char *argv[], char const *const fmt, va_list ap) +{ + int rc = -1; + + if (adt_sudo_common(argc, argv) != 0) { + return -1; + } + if (vasprintf(&event->adt_sudo.errmsg, fmt, ap) == -1) { + log_warning(SLOG_NO_STDERR, + _("audit_failure message too long")); + } + if (adt_put_event(event, ADT_FAILURE, ADT_FAIL_VALUE_PROGRAM) != 0) { + log_warning(SLOG_NO_STDERR, "adt_put_event(ADT_FAILURE)"); + } else { + rc = 0; + } + free(event->adt_sudo.errmsg); + adt_free_event(event); + (void) adt_end_session(ah); + + return 0; +} + +#endif /* HAVE_SOLARIS_AUDIT */ diff --git a/utsudo-0.0.2/plugins/sudoers/solaris_audit.h b/utsudo-0.0.2/plugins/sudoers/solaris_audit.h new file mode 100644 index 0000000..39ab21e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/solaris_audit.h @@ -0,0 +1,25 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014, Oracle and/or its affiliates. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_SOLARIS_AUDIT_H +#define SUDOERS_SOLARIS_AUDIT_H + +int solaris_audit_success(int argc, char *argv[]); +int solaris_audit_failure(int argc, char *argv[], char const *const fmt, va_list); + +#endif /* SUDOERS_SOLARIS_AUDIT_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sssd.c b/utsudo-0.0.2/plugins/sudoers/sssd.c new file mode 100644 index 0000000..f859d03 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sssd.c @@ -0,0 +1,793 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2003-2018 Todd C. Miller + * Copyright (c) 2011 Daniel Kopecek + * + * This code is derived from software contributed by Aaron Spangler. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SSSD + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include +#include + +#include "sudoers.h" +#include "gram.h" +#include "sudo_lbuf.h" +#include "sudo_ldap.h" +#include "sudo_dso.h" + +/* SSSD <--> SUDO interface - do not change */ +struct sss_sudo_attr { + char *name; + char **values; + unsigned int num_values; +}; + +struct sss_sudo_rule { + unsigned int num_attrs; + struct sss_sudo_attr *attrs; +}; + +struct sss_sudo_result { + unsigned int num_rules; + struct sss_sudo_rule *rules; +}; + +typedef int (*sss_sudo_send_recv_t)(uid_t, const char*, const char*, + uint32_t*, struct sss_sudo_result**); + +typedef int (*sss_sudo_send_recv_defaults_t)(uid_t, const char*, uint32_t*, + char**, struct sss_sudo_result**); + +typedef void (*sss_sudo_free_result_t)(struct sss_sudo_result*); + +typedef int (*sss_sudo_get_values_t)(struct sss_sudo_rule*, const char*, + char***); + +typedef void (*sss_sudo_free_values_t)(char**); + +/* sudo_nss handle */ +struct sudo_sss_handle { + char *domainname; + char *ipa_host; + char *ipa_shost; + struct passwd *pw; + void *ssslib; + struct sudoers_parse_tree parse_tree; + sss_sudo_send_recv_t fn_send_recv; + sss_sudo_send_recv_defaults_t fn_send_recv_defaults; + sss_sudo_free_result_t fn_free_result; + sss_sudo_get_values_t fn_get_values; + sss_sudo_free_values_t fn_free_values; +}; + +static int +get_ipa_hostname(char **shostp, char **lhostp) +{ + size_t linesize = 0; + char *lhost = NULL; + char *shost = NULL; + char *line = NULL; + int ret = false; + ssize_t len; + FILE *fp; + debug_decl(get_ipa_hostname, SUDOERS_DEBUG_SSSD) + + fp = fopen(_PATH_SSSD_CONF, "r"); + if (fp != NULL) { + while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) { + char *cp = line; + + /* Trim trailing and leading spaces. */ + while (len > 0 && isspace((unsigned char)line[len - 1])) + line[--len] = '\0'; + while (isspace((unsigned char)*cp)) + cp++; + + /* + * Match ipa_hostname = foo + * Note: currently ignores the domain (XXX) + */ + if (strncmp(cp, "ipa_hostname", 12) == 0) { + cp += 12; + /* Trim " = " after "ipa_hostname" */ + while (isblank((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + while (isblank((unsigned char)*cp)) + cp++; + /* Ignore empty value */ + if (*cp == '\0') + continue; + lhost = strdup(cp); + if (lhost != NULL && (cp = strchr(lhost, '.')) != NULL) { + shost = strndup(lhost, (size_t)(cp - lhost)); + } else { + shost = lhost; + } + if (shost != NULL && lhost != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "ipa_hostname %s overrides %s", lhost, user_host); + *shostp = shost; + *lhostp = lhost; + ret = true; + } else { + sudo_warnx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + free(shost); + free(lhost); + ret = -1; + } + break; + } + } + fclose(fp); + free(line); + } + debug_return_int(ret); +} + +/* + * SSSD doesn't handle netgroups, we have to ensure they are correctly filtered + * in sudo. The rules may contain mixed sudoUser specification so we have to + * check not only for netgroup membership but also for user and group matches. + * Otherwise, a netgroup non-match could override a user/group match. + */ +static bool +sudo_sss_check_user(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule) +{ + const char *host = handle->ipa_host ? handle->ipa_host : user_runhost; + const char *shost = handle->ipa_shost ? handle->ipa_shost : user_srunhost; + char **val_array; + int i, ret = false; + debug_decl(sudo_sss_check_user, SUDOERS_DEBUG_SSSD); + + if (rule == NULL) + debug_return_bool(false); + + switch (handle->fn_get_values(rule, "sudoUser", &val_array)) { + case 0: + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "No result."); + debug_return_bool(false); + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, + "handle->fn_get_values(sudoUser): != 0"); + debug_return_bool(false); + } + + /* Walk through sudoUser values. */ + for (i = 0; val_array[i] != NULL && !ret; ++i) { + const char *val = val_array[i]; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "val[%d]=%s", i, val); + switch (*val) { + case '+': + /* Netgroup spec found, check membership. */ + if (netgr_matches(val, def_netgroup_tuple ? host : NULL, + def_netgroup_tuple ? shost : NULL, handle->pw->pw_name)) { + ret = true; + } + break; + case '%': + /* User group found, check membership. */ + if (usergr_matches(val, handle->pw->pw_name, handle->pw)) { + ret = true; + } + break; + default: + /* Not a netgroup or user group. */ + if (strcmp(val, "ALL") == 0 || + userpw_matches(val, handle->pw->pw_name, handle->pw)) { + ret = true; + } + break; + } + sudo_debug_printf(SUDO_DEBUG_DIAG, + "sssd/ldap sudoUser '%s' ... %s (%s)", val, + ret ? "MATCH!" : "not", handle->pw->pw_name); + } + handle->fn_free_values(val_array); + debug_return_bool(ret); +} + +static char * +val_array_iter(void **vp) +{ + char **val_array = *vp; + + *vp = val_array + 1; + + return *val_array; +} + +static bool +sss_to_sudoers(struct sudo_sss_handle *handle, + struct sss_sudo_result *sss_result) +{ + struct userspec *us; + struct member *m; + unsigned int i; + debug_decl(sss_to_sudoers, SUDOERS_DEBUG_SSSD) + + /* We only have a single userspec */ + if ((us = calloc(1, sizeof(*us))) == NULL) + goto oom; + TAILQ_INIT(&us->users); + TAILQ_INIT(&us->privileges); + STAILQ_INIT(&us->comments); + TAILQ_INSERT_TAIL(&handle->parse_tree.userspecs, us, entries); + + /* We only include rules where the user matches. */ + if ((m = calloc(1, sizeof(*m))) == NULL) + goto oom; + m->type = ALL; + TAILQ_INSERT_TAIL(&us->users, m, entries); + + /* + * Treat each sudoRole as a separate privilege. + * + * Sssd has already sorted the rules in descending order. + * The conversion to a sudoers parse tree requires that entries be + * in *ascending* order so we we iterate from last to first. + */ + for (i = sss_result->num_rules; i-- > 0; ) { + struct sss_sudo_rule *rule = sss_result->rules + i; + char **cmnds, **runasusers = NULL, **runasgroups = NULL; + char **opts = NULL, **notbefore = NULL, **notafter = NULL; + char **hosts = NULL, **cn_array = NULL, *cn = NULL; + struct privilege *priv = NULL; + + /* + * We don't know whether a rule was included due to a user/group + * match or because it contained a netgroup. + */ + if (!sudo_sss_check_user(handle, rule)) + continue; + + switch (handle->fn_get_values(rule, "sudoCommand", &cmnds)) { + case 0: + break; + case ENOENT: + /* Ignore sudoRole without sudoCommand. */ + continue; + default: + goto cleanup; + } + + /* Get the entry's dn for long format printing. */ + switch (handle->fn_get_values(rule, "cn", &cn_array)) { + case 0: + cn = cn_array[0]; + break; + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoHost */ + switch (handle->fn_get_values(rule, "sudoHost", &hosts)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoRunAsUser / sudoRunAs */ + switch (handle->fn_get_values(rule, "sudoRunAsUser", &runasusers)) { + case 0: + break; + case ENOENT: + switch (handle->fn_get_values(rule, "sudoRunAs", &runasusers)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + break; + default: + goto cleanup; + } + + /* Get sudoRunAsGroup */ + switch (handle->fn_get_values(rule, "sudoRunAsGroup", &runasgroups)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoNotBefore */ + switch (handle->fn_get_values(rule, "sudoNotBefore", ¬before)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Get sudoNotAfter */ + switch (handle->fn_get_values(rule, "sudoNotAfter", ¬after)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + /* Parse sudoOptions. */ + switch (handle->fn_get_values(rule, "sudoOption", &opts)) { + case 0: + case ENOENT: + break; + default: + goto cleanup; + } + + priv = sudo_ldap_role_to_priv(cn, hosts, runasusers, runasgroups, + cmnds, opts, notbefore ? notbefore[0] : NULL, + notafter ? notafter[0] : NULL, false, true, val_array_iter); + + cleanup: + if (cn_array != NULL) + handle->fn_free_values(cn_array); + if (cmnds != NULL) + handle->fn_free_values(cmnds); + if (hosts != NULL) + handle->fn_free_values(hosts); + if (runasusers != NULL) + handle->fn_free_values(runasusers); + if (runasgroups != NULL) + handle->fn_free_values(runasgroups); + if (opts != NULL) + handle->fn_free_values(opts); + if (notbefore != NULL) + handle->fn_free_values(notbefore); + if (notafter != NULL) + handle->fn_free_values(notafter); + + if (priv == NULL) + goto oom; + TAILQ_INSERT_TAIL(&us->privileges, priv, entries); + } + + debug_return_bool(true); + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_userspecs(&handle->parse_tree.userspecs); + debug_return_bool(false); +} + +static bool +sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule, struct defaults_list *defs) +{ + int i; + char *source = NULL; + bool ret = false; + char **val_array = NULL; + char **cn_array = NULL; + debug_decl(sudo_sss_parse_options, SUDOERS_DEBUG_SSSD); + + if (rule == NULL) + debug_return_bool(true); + + switch (handle->fn_get_values(rule, "sudoOption", &val_array)) { + case 0: + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "No result."); + debug_return_bool(true); + case ENOMEM: + goto oom; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "handle->fn_get_values(sudoOption): != 0"); + debug_return_bool(false); + } + + /* Use sudoRole in place of file name in defaults. */ + if (handle->fn_get_values(rule, "cn", &cn_array) == 0) { + if (cn_array[0] != NULL) { + char *cp; + if (asprintf(&cp, "sudoRole %s", cn_array[0]) == -1) + goto oom; + source = rcstr_dup(cp); + free(cp); + if (source == NULL) + goto oom; + } + handle->fn_free_values(cn_array); + cn_array = NULL; + } + if (source == NULL) { + if ((source = rcstr_dup("sudoRole UNKNOWN")) == NULL) + goto oom; + } + + /* Walk through options, appending to defs. */ + for (i = 0; val_array[i] != NULL; i++) { + char *var, *val; + int op; + + op = sudo_ldap_parse_option(val_array[i], &var, &val); + if (!sudo_ldap_add_default(var, val, op, source, defs)) + goto oom; + } + ret = true; + goto done; + +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + +done: + rcstr_delref(source); + handle->fn_free_values(val_array); + debug_return_bool(ret); +} + +static struct sss_sudo_result * +sudo_sss_result_get(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + uint32_t sss_error = 0, rc; + debug_decl(sudo_sss_result_get, SUDOERS_DEBUG_SSSD); + + sudo_debug_printf(SUDO_DEBUG_DIAG, " username=%s", pw->pw_name); + sudo_debug_printf(SUDO_DEBUG_DIAG, "domainname=%s", + handle->domainname ? handle->domainname : "NULL"); + + rc = handle->fn_send_recv(pw->pw_uid, pw->pw_name, + handle->domainname, &sss_error, &sss_result); + switch (rc) { + case 0: + switch (sss_error) { + case 0: + if (sss_result != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "Received %u rule(s)", + sss_result->num_rules); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "Internal error: sss_result == NULL && sss_error == 0"); + debug_return_ptr(NULL); + } + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, "The user was not found in SSSD."); + debug_return_ptr(NULL); + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "sss_error=%u\n", sss_error); + debug_return_ptr(NULL); + } + break; + case ENOMEM: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + /* FALLTHROUGH */ + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "handle->fn_send_recv: rc=%d", rc); + debug_return_ptr(NULL); + } + + debug_return_ptr(sss_result); +} + +/* sudo_nss implementation */ +static int +sudo_sss_close(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + debug_decl(sudo_sss_close, SUDOERS_DEBUG_SSSD); + + if (handle != NULL) { + sudo_dso_unload(handle->ssslib); + if (handle->pw != NULL) + sudo_pw_delref(handle->pw); + free(handle->ipa_host); + if (handle->ipa_host != handle->ipa_shost) + free(handle->ipa_shost); + free_parse_tree(&handle->parse_tree); + free(handle); + nss->handle = NULL; + } + debug_return_int(0); +} + +static int +sudo_sss_open(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle; + static const char path[] = _PATH_SSSD_LIB"/libsss_sudo.so"; + debug_decl(sudo_sss_open, SUDOERS_DEBUG_SSSD); + + if (nss->handle != NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with non-NULL handle %p", __func__, nss->handle); + sudo_sss_close(nss); + } + + /* Create a handle container. */ + handle = calloc(1, sizeof(struct sudo_sss_handle)); + if (handle == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(ENOMEM); + } + + /* Load symbols */ + handle->ssslib = sudo_dso_load(path, SUDO_DSO_LAZY); + if (handle->ssslib == NULL) { + const char *errstr = sudo_dso_strerror(); + sudo_warnx(U_("unable to load %s: %s"), path, + errstr ? errstr : "unknown error"); + sudo_warnx(U_("unable to initialize SSS source. Is SSSD installed on your machine?")); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_send_recv = + sudo_dso_findsym(handle->ssslib, "sss_sudo_send_recv"); + if (handle->fn_send_recv == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_send_recv"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_send_recv_defaults = + sudo_dso_findsym(handle->ssslib, "sss_sudo_send_recv_defaults"); + if (handle->fn_send_recv_defaults == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_send_recv_defaults"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_free_result = + sudo_dso_findsym(handle->ssslib, "sss_sudo_free_result"); + if (handle->fn_free_result == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_free_result"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_get_values = + sudo_dso_findsym(handle->ssslib, "sss_sudo_get_values"); + if (handle->fn_get_values == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_get_values"); + free(handle); + debug_return_int(EFAULT); + } + + handle->fn_free_values = + sudo_dso_findsym(handle->ssslib, "sss_sudo_free_values"); + if (handle->fn_free_values == NULL) { + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), path, + "sss_sudo_free_values"); + free(handle); + debug_return_int(EFAULT); + } + + /* + * If runhost is the same as the local host, check for ipa_hostname + * in sssd.conf and use it in preference to user_runhost. + */ + if (strcasecmp(user_runhost, user_host) == 0) { + if (get_ipa_hostname(&handle->ipa_shost, &handle->ipa_host) == -1) { + free(handle); + debug_return_int(ENOMEM); + } + } + + /* The "parse tree" contains userspecs, defaults, aliases and hostnames. */ + init_parse_tree(&handle->parse_tree, handle->ipa_host, handle->ipa_shost); + nss->handle = handle; + + sudo_debug_printf(SUDO_DEBUG_DEBUG, "handle=%p", handle); + + debug_return_int(0); +} + +/* + * Perform query for user and host and convert to sudoers parse tree. + */ +static int +sudo_sss_query(struct sudo_nss *nss, struct passwd *pw) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + int ret = 0; + debug_decl(sudo_sss_query, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if it matches pw. */ + if (handle->pw != NULL) { + if (pw == handle->pw) + goto done; + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + + /* Free old userspecs, if any. */ + free_userspecs(&handle->parse_tree.userspecs); + + /* Fetch list of sudoRole entries that match user and host. */ + sss_result = sudo_sss_result_get(nss, pw); + + sudo_debug_printf(SUDO_DEBUG_DIAG, + "searching SSSD/LDAP for sudoers entries for user %s, host %s", + pw->pw_name, user_runhost); + + /* Stash a ref to the passwd struct in the handle. */ + sudo_pw_addref(pw); + handle->pw = pw; + + /* Convert to sudoers parse tree if the user was found. */ + if (sss_result != NULL) { + if (!sss_to_sudoers(handle, sss_result)) { + ret = -1; + goto done; + } + } + +done: + /* Cleanup */ + handle->fn_free_result(sss_result); + if (ret == -1) { + free_userspecs(&handle->parse_tree.userspecs); + if (handle->pw != NULL) { + sudo_pw_delref(handle->pw); + handle->pw = NULL; + } + } + + sudo_debug_printf(SUDO_DEBUG_DIAG, "Done with LDAP searches"); + + debug_return_int(ret); +} + +/* + * Return the initialized (but empty) sudoers parse tree. + * The contents will be populated by the getdefs() and query() functions. + */ +static struct sudoers_parse_tree * +sudo_sss_parse(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + debug_decl(sudo_sss_parse, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_ptr(NULL); + } + + debug_return_ptr(&handle->parse_tree); +} + +static int +sudo_sss_getdefs(struct sudo_nss *nss) +{ + struct sudo_sss_handle *handle = nss->handle; + struct sss_sudo_result *sss_result = NULL; + static bool cached; + uint32_t sss_error; + unsigned int i; + int rc; + debug_decl(sudo_sss_getdefs, SUDOERS_DEBUG_SSSD); + + if (handle == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: called with NULL handle", __func__); + debug_return_int(-1); + } + + /* Use cached result if present. */ + if (cached) + debug_return_int(0); + + sudo_debug_printf(SUDO_DEBUG_DIAG, "Looking for cn=defaults"); + + /* NOTE: these are global defaults, user-ID and name are not used. */ + rc = handle->fn_send_recv_defaults(sudo_user.pw->pw_uid, + sudo_user.pw->pw_name, &sss_error, &handle->domainname, &sss_result); + switch (rc) { + case 0: + break; + case ENOMEM: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + /* FALLTHROUGH */ + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, + "handle->fn_send_recv_defaults: rc=%d, sss_error=%u", rc, sss_error); + debug_return_int(-1); + } + + switch (sss_error) { + case 0: + /* Success */ + for (i = 0; i < sss_result->num_rules; ++i) { + struct sss_sudo_rule *sss_rule = sss_result->rules + i; + sudo_debug_printf(SUDO_DEBUG_DIAG, + "Parsing cn=defaults, %d/%d", i, sss_result->num_rules); + if (!sudo_sss_parse_options(handle, sss_rule, + &handle->parse_tree.defaults)) + goto bad; + } + break; + case ENOENT: + sudo_debug_printf(SUDO_DEBUG_INFO, + "No global defaults entry found in SSSD."); + break; + default: + sudo_debug_printf(SUDO_DEBUG_ERROR, "sss_error=%u\n", sss_error); + goto bad; + } + handle->fn_free_result(sss_result); + cached = true; + debug_return_int(0); + +bad: + handle->fn_free_result(sss_result); + debug_return_int(-1); +} + +/* sudo_nss implementation */ +struct sudo_nss sudo_nss_sss = { + { NULL, NULL }, + sudo_sss_open, + sudo_sss_close, + sudo_sss_parse, + sudo_sss_query, + sudo_sss_getdefs +}; + +#endif /* HAVE_SSSD */ diff --git a/utsudo-0.0.2/plugins/sudoers/starttime.c b/utsudo-0.0.2/plugins/sudoers/starttime.c new file mode 100644 index 0000000..c4f1d19 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/starttime.c @@ -0,0 +1,311 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +/* Large files not supported by procfs.h on Solaris. */ +#if defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +# undef _FILE_OFFSET_BITS +# undef _LARGE_FILES +#endif + +#include +#include +#if defined(HAVE_KINFO_PROC_44BSD) || defined (HAVE_KINFO_PROC_OPENBSD) || defined(HAVE_KINFO_PROC2_NETBSD2) +# include +#elif defined(HAVE_KINFO_PROC_FREEBSD) +# include +# include +# include +#endif +#if defined(HAVE_PROCFS_H) +# include +#elif defined(HAVE_SYS_PROCFS_H) +# include +#endif +#ifdef HAVE_PSTAT_GETPROC +# include +#endif + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +/* + * Arguments for sysctl(2) when reading the process start time. + */ +#if defined(HAVE_KINFO_PROC2_NETBSD) +# define SUDO_KERN_PROC KERN_PROC2 +# define sudo_kinfo_proc kinfo_proc2 +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_OPENBSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_FREEBSD) || defined(HAVE_KINFO_PROC_44BSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_namelen 4 +#endif + +/* + * Store start time of the specified process in starttime. + */ + +#if defined(sudo_kinfo_proc) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct sudo_kinfo_proc *ki_proc = NULL; + size_t size = sizeof(*ki_proc); + int mib[6], rc; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL) + + /* + * Lookup start time for pid via sysctl. + */ + mib[0] = CTL_KERN; + mib[1] = SUDO_KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = (int)pid; + mib[4] = sizeof(*ki_proc); + mib[5] = 1; + do { + struct sudo_kinfo_proc *kp; + + size += size / 10; + if ((kp = realloc(ki_proc, size)) == NULL) { + rc = -1; + break; /* really out of memory. */ + } + ki_proc = kp; + rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); + } while (rc == -1 && errno == ENOMEM); + if (rc != -1) { +#if defined(HAVE_KINFO_PROC_FREEBSD) + /* FreeBSD and Dragonfly */ + TIMEVAL_TO_TIMESPEC(&ki_proc->ki_start, starttime); +#elif defined(HAVE_KINFO_PROC_44BSD) + /* 4.4BSD and macOS */ + TIMEVAL_TO_TIMESPEC(&ki_proc->kp_proc.p_starttime, starttime); +#else + /* NetBSD and OpenBSD */ + starttime->tv_sec = ki_proc->p_ustart_sec; + starttime->tv_nsec = ki_proc->p_ustart_usec * 1000; +#endif + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, + (int)pid, (long long)starttime->tv_sec, (long)starttime->tv_nsec); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via KERN_PROC", (int)pid); + } + free(ki_proc); + + debug_return_int(rc == -1 ? -1 : 0); +} +#elif defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct psinfo psinfo; + char path[PATH_MAX]; + ssize_t nread; + int fd, ret = -1; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL) + + /* Determine the start time from pr_start in /proc/pid/psinfo. */ + (void)snprintf(path, sizeof(path), "/proc/%u/psinfo", (unsigned int)pid); + if ((fd = open(path, O_RDONLY, 0)) != -1) { + nread = read(fd, &psinfo, sizeof(psinfo)); + close(fd); + if (nread == (ssize_t)sizeof(psinfo)) { + starttime->tv_sec = psinfo.pr_start.tv_sec; + starttime->tv_nsec = psinfo.pr_start.tv_nsec; + ret = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, (int)pid, + (long long)starttime->tv_sec, (long)starttime->tv_nsec); + } + } + + if (ret == -1) + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via %s", (int)pid, path); + debug_return_int(ret); +} +#elif defined(__linux__) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + char path[PATH_MAX]; + char *cp, buf[1024]; + ssize_t nread; + int ret = -1; + int fd = -1; + long tps; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL) + + /* + * Start time is in ticks per second on Linux. + */ + tps = sysconf(_SC_CLK_TCK); + if (tps == -1) + goto done; + + /* + * Determine the start time from 22nd field in /proc/pid/stat. + * Ignore /proc/self/stat if it contains embedded NUL bytes. + * XXX - refactor common code with ttyname.c? + */ + (void)snprintf(path, sizeof(path), "/proc/%u/stat", (unsigned int)pid); + if ((fd = open(path, O_RDONLY | O_NOFOLLOW)) != -1) { + cp = buf; + while ((nread = read(fd, cp, buf + sizeof(buf) - cp)) != 0) { + if (nread == -1) { + if (errno == EAGAIN || errno == EINTR) + continue; + break; + } + cp += nread; + if (cp >= buf + sizeof(buf)) + break; + } + if (nread == 0 && memchr(buf, '\0', cp - buf) == NULL) { + /* + * Field 22 is the start time (%ull). + * Since the process name at field 2 "(comm)" may include + * whitespace (including newlines), start at the last ')' found. + */ + *cp = '\0'; + cp = strrchr(buf, ')'); + if (cp != NULL) { + char *ep = cp; + int field = 1; + + while (*++ep != '\0') { + if (*ep == ' ') { + if (++field == 22) { + unsigned long long ullval; + + /* Must start with a digit (not negative). */ + if (!isdigit((unsigned char)*cp)) { + errno = EINVAL; + goto done; + } + + /* starttime is %ul in 2.4 and %ull in >= 2.6 */ + errno = 0; + ullval = strtoull(cp, &ep, 10); + if (ep == cp || *ep != ' ') { + errno = EINVAL; + goto done; + } + if (errno == ERANGE && ullval == ULLONG_MAX) + goto done; + + /* Convert from ticks to timespec */ + starttime->tv_sec = ullval / tps; + starttime->tv_nsec = + (ullval % tps) * (1000000000 / tps); + ret = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", + __func__, (int)pid, + (long long)starttime->tv_sec, + (long)starttime->tv_nsec); + + goto done; + } + cp = ep + 1; + } + } + } + } + } + errno = ENOENT; + +done: + if (fd != -1) + close(fd); + if (ret == -1) + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via %s", (int)pid, path); + + debug_return_int(ret); +} +#elif defined(HAVE_PSTAT_GETPROC) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + struct pst_status pstat; + int rc; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL) + + /* + * Determine the start time from pst_start in struct pst_status. + * EOVERFLOW is not a fatal error for the fields we use. + * See the "EOVERFLOW Error" section of pstat_getvminfo(3). + */ + rc = pstat_getproc(&pstat, sizeof(pstat), 0, pid); + if (rc != -1 || errno == EOVERFLOW) { + starttime->tv_sec = pstat.pst_start; + starttime->tv_nsec = 0; + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: start time for %d: { %lld, %ld }", __func__, + (int)pid, (long long)starttime->tv_sec, (long)starttime->tv_nsec); + + debug_return_int(0); + } + + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via pstat_getproc", (int)pid); + debug_return_int(-1); +} +#else +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL) + + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "process start time not supported by sudo on this system"); + debug_return_int(-1); +} +#endif diff --git a/utsudo-0.0.2/plugins/sudoers/strlist.c b/utsudo-0.0.2/plugins/sudoers/strlist.c new file mode 100644 index 0000000..69ad7be --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/strlist.c @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include "sudo_compat.h" +#include "sudo_queue.h" +#include "sudo_util.h" +#include "sudoers_debug.h" +#include "strlist.h" + +struct sudoers_string * +sudoers_string_alloc(const char *s) +{ + struct sudoers_string *cs; + debug_decl(sudoers_string_alloc, SUDOERS_DEBUG_UTIL) + + if ((cs = malloc(sizeof(*cs))) != NULL) { + if ((cs->str = strdup(s)) == NULL) { + free(cs); + cs = NULL; + } + } + + debug_return_ptr(cs); +} + +void +sudoers_string_free(struct sudoers_string *cs) +{ + if (cs != NULL) { + free(cs->str); + free(cs); + } +} + +struct sudoers_str_list * +str_list_alloc(void) +{ + struct sudoers_str_list *strlist; + debug_decl(str_list_alloc, SUDOERS_DEBUG_UTIL) + + strlist = malloc(sizeof(*strlist)); + if (strlist != NULL) { + STAILQ_INIT(strlist); + strlist->refcnt = 1; + } + + debug_return_ptr(strlist); +} + +void +str_list_free(void *v) +{ + struct sudoers_str_list *strlist = v; + struct sudoers_string *first; + debug_decl(str_list_free, SUDOERS_DEBUG_UTIL) + + if (strlist != NULL) { + if (--strlist->refcnt == 0) { + while ((first = STAILQ_FIRST(strlist)) != NULL) { + STAILQ_REMOVE_HEAD(strlist, entries); + sudoers_string_free(first); + } + free(strlist); + } + } + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/strlist.h b/utsudo-0.0.2/plugins/sudoers/strlist.h new file mode 100644 index 0000000..022f52b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/strlist.h @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_STRLIST_H +#define SUDOERS_STRLIST_H + +/* + * Simple string list with optional reference count. + */ +struct sudoers_string { + STAILQ_ENTRY(sudoers_string) entries; + char *str; +}; +struct sudoers_str_list { + struct sudoers_string *stqh_first; + struct sudoers_string **stqh_last; + unsigned int refcnt; +}; + +struct sudoers_str_list *str_list_alloc(void); +void str_list_free(void *v); +struct sudoers_string *sudoers_string_alloc(const char *s); +void sudoers_string_free(struct sudoers_string *ls); + +#endif /* SUDOERS_STRLIST_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/stubs.c b/utsudo-0.0.2/plugins/sudoers/stubs.c new file mode 100644 index 0000000..caf15c3 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/stubs.c @@ -0,0 +1,117 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Stub versions of functions needed by the parser. + * Required to link cvtsudoers and visudo. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ + +#include +#include + +#include "sudoers.h" +#include "interfaces.h" + +/* STUB */ +bool +init_envtables(void) +{ + return true; +} + +/* STUB */ +bool +user_is_exempt(void) +{ + return false; +} + +/* STUB */ +void +sudo_setspent(void) +{ + return; +} + +/* STUB */ +void +sudo_endspent(void) +{ + return; +} + +/* STUB */ +int +group_plugin_query(const char *user, const char *group, const struct passwd *pw) +{ + return false; +} + +/* STUB */ +struct interface_list * +get_interfaces(void) +{ + static struct interface_list dummy = SLIST_HEAD_INITIALIZER(interfaces); + return &dummy; +} + +/* + * Look up the hostname and set user_host and user_shost. + */ +void +get_hostname(void) +{ + char *cp; + debug_decl(get_hostname, SUDOERS_DEBUG_UTIL) + + if ((user_host = sudo_gethostname()) != NULL) { + if ((cp = strchr(user_host, '.'))) { + *cp = '\0'; + if ((user_shost = strdup(user_host)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *cp = '.'; + } else { + user_shost = user_host; + } + } else { + user_host = user_shost = strdup("localhost"); + if (user_host == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + user_runhost = user_host; + user_srunhost = user_shost; + + debug_return; +} diff --git a/utsudo-0.0.2/plugins/sudoers/sudo_ldap.h b/utsudo-0.0.2/plugins/sudoers/sudo_ldap.h new file mode 100644 index 0000000..a2162bc --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudo_ldap.h @@ -0,0 +1,32 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LDAP_H +#define SUDOERS_LDAP_H + +/* Iterators used by sudo_ldap_role_to_priv() to handle bervar ** or char ** */ +typedef char * (*sudo_ldap_iter_t)(void **); + +/* ldap_util.c */ +bool sudo_ldap_is_negated(char **valp); +bool sudo_ldap_add_default(const char *var, const char *val, int op, char *source, struct defaults_list *defs); +int sudo_ldap_parse_option(char *optstr, char **varp, char **valp); +struct privilege *sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers, void *runasgroups, void *cmnds, void *opts, const char *notbefore, const char *notafter, bool warnings, bool store_options, sudo_ldap_iter_t iter); +struct command_digest *sudo_ldap_extract_digest(char **cmnd, struct command_digest *digest); + +#endif /* SUDOERS_LDAP_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudo_ldap_conf.h b/utsudo-0.0.2/plugins/sudoers/sudo_ldap_conf.h new file mode 100644 index 0000000..d0b4fd6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudo_ldap_conf.h @@ -0,0 +1,131 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_LDAP_CONF_H +#define SUDOERS_LDAP_CONF_H + +/* Macros for checking strlcpy/strlcat/sudo_ldap_value_cat return value. */ +#define CHECK_STRLCPY(d, s, l) do { \ + if (strlcpy((d), (s), (l)) >= (l)) \ + goto overflow; \ +} while (0) +#define CHECK_STRLCAT(d, s, l) do { \ + if (strlcat((d), (s), (l)) >= (l)) \ + goto overflow; \ +} while (0) +#define CHECK_LDAP_VCAT(d, s, l) do { \ + if (sudo_ldap_value_cat((d), (s), (l)) >= (l)) \ + goto overflow; \ +} while (0) + +#if defined(__GNUC__) && __GNUC__ == 2 +# define DPRINTF1(fmt...) do { \ + sudo_debug_printf(SUDO_DEBUG_DIAG, fmt); \ + if (ldap_conf.debug >= 1) \ + sudo_warnx_nodebug(fmt); \ +} while (0) +# define DPRINTF2(fmt...) do { \ + sudo_debug_printf(SUDO_DEBUG_INFO, fmt); \ + if (ldap_conf.debug >= 2) \ + sudo_warnx_nodebug(fmt); \ +} while (0) +#else +# define DPRINTF1(...) do { \ + sudo_debug_printf(SUDO_DEBUG_DIAG, __VA_ARGS__); \ + if (ldap_conf.debug >= 1) \ + sudo_warnx_nodebug(__VA_ARGS__); \ +} while (0) +# define DPRINTF2(...) do { \ + sudo_debug_printf(SUDO_DEBUG_INFO, __VA_ARGS__); \ + if (ldap_conf.debug >= 2) \ + sudo_warnx_nodebug(__VA_ARGS__); \ +} while (0) +#endif + +#define CONF_BOOL 0 +#define CONF_INT 1 +#define CONF_STR 2 +#define CONF_LIST_STR 4 +#define CONF_DEREF_VAL 5 +#define CONF_REQCERT_VAL 6 + +#define SUDO_LDAP_CLEAR 0 +#define SUDO_LDAP_SSL 1 +#define SUDO_LDAP_STARTTLS 2 + +struct ldap_config_table { + const char *conf_str; /* config file string */ + int type; /* CONF_BOOL, CONF_INT, CONF_STR */ + int opt_val; /* LDAP_OPT_* (or -1 for sudo internal) */ + void *valp; /* pointer into ldap_conf */ +}; + +struct ldap_config_str { + STAILQ_ENTRY(ldap_config_str) entries; + char val[1]; +}; +STAILQ_HEAD(ldap_config_str_list, ldap_config_str); + +/* LDAP configuration structure */ +struct ldap_config { + int port; + int version; + int debug; + int ldap_debug; + int tls_checkpeer; + int tls_reqcert; + int timelimit; + int timeout; + int bind_timelimit; + int use_sasl; + int rootuse_sasl; + int ssl_mode; + int timed; + int deref; + char *host; + struct ldap_config_str_list uri; + char *binddn; + char *bindpw; + char *rootbinddn; + struct ldap_config_str_list base; + struct ldap_config_str_list netgroup_base; + char *search_filter; + char *netgroup_search_filter; + char *ssl; + char *tls_cacertfile; + char *tls_cacertdir; + char *tls_random_file; + char *tls_cipher_suite; + char *tls_certfile; + char *tls_keyfile; + char *tls_keypw; + char *sasl_mech; + char *sasl_auth_id; + char *rootsasl_auth_id; + char *sasl_secprops; + char *krb5_ccname; +}; + +extern struct ldap_config ldap_conf; + +const char *sudo_krb5_ccname_path(const char *old_ccname); +bool sudo_ldap_read_config(void); +int sudo_ldap_set_options_global(void); +int sudo_ldap_set_options_conn(LDAP *ld); + +#endif /* SUDOERS_LDAP_CONF_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudo_nss.c b/utsudo-0.0.2/plugins/sudoers/sudo_nss.c new file mode 100644 index 0000000..a6f5920 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudo_nss.c @@ -0,0 +1,272 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "sudoers.h" + +extern struct sudo_nss sudo_nss_file; +#ifdef HAVE_LDAP +extern struct sudo_nss sudo_nss_ldap; +#endif +#ifdef HAVE_SSSD +extern struct sudo_nss sudo_nss_sss; +#endif + +/* Make sure we have not already inserted the nss entry. */ +#define SUDO_NSS_CHECK_UNUSED(nss, tag) \ + if (nss.entries.tqe_next != NULL || nss.entries.tqe_prev != NULL) { \ + sudo_warnx("internal error: nsswitch entry \"%s\" already in use", \ + tag); \ + continue; \ + } + +#if (defined(HAVE_LDAP) || defined(HAVE_SSSD)) && defined(_PATH_NSSWITCH_CONF) +/* + * Read in /etc/nsswitch.conf + * Returns a tail queue of matches. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + FILE *fp; + char *line = NULL; + size_t linesize = 0; +#ifdef HAVE_SSSD + bool saw_sss = false; +#endif +#ifdef HAVE_LDAP + bool saw_ldap = false; +#endif + bool saw_files = false; + bool got_match = false; + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS) + + if ((fp = fopen(_PATH_NSSWITCH_CONF, "r")) == NULL) + goto nomatch; + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + char *cp, *last; + + /* Skip blank or comment lines */ + if (*line == '\0') + continue; + + /* Look for a line starting with "sudoers:" */ + if (strncasecmp(line, "sudoers:", 8) != 0) + continue; + + /* Parse line */ + for ((cp = strtok_r(line + 8, " \t", &last)); cp != NULL; (cp = strtok_r(NULL, " \t", &last))) { + if (strcasecmp(cp, "files") == 0 && !saw_files) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_file, "files"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + got_match = saw_files = true; +#ifdef HAVE_LDAP + } else if (strcasecmp(cp, "ldap") == 0 && !saw_ldap) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_ldap, "ldap"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); + got_match = saw_ldap = true; +#endif +#ifdef HAVE_SSSD + } else if (strcasecmp(cp, "sss") == 0 && !saw_sss) { + SUDO_NSS_CHECK_UNUSED(sudo_nss_sss, "sss"); + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); + got_match = saw_sss = true; +#endif + } else if (strcasecmp(cp, "[NOTFOUND=return]") == 0 && got_match) { + /* NOTFOUND affects the most recent entry */ + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_notfound = true; + got_match = false; + } else if (strcasecmp(cp, "[SUCCESS=return]") == 0 && got_match) { + /* SUCCESS affects the most recent entry */ + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_found = true; + got_match = false; + } else + got_match = false; + } + /* Only parse the first "sudoers:" line */ + break; + } + free(line); + fclose(fp); + +nomatch: + /* Default to files only if no matches */ + if (TAILQ_EMPTY(&snl)) + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +#else /* (HAVE_LDAP || HAVE_SSSD) && _PATH_NSSWITCH_CONF */ + +# if (defined(HAVE_LDAP) || defined(HAVE_SSSD)) && defined(_PATH_NETSVC_CONF) + +/* + * Read in /etc/netsvc.conf (like nsswitch.conf on AIX) + * Returns a tail queue of matches. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + FILE *fp; + char *cp, *ep, *last, *line = NULL; + size_t linesize = 0; +#ifdef HAVE_SSSD + bool saw_sss = false; +#endif + bool saw_files = false; + bool saw_ldap = false; + bool got_match = false; + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS) + + if ((fp = fopen(_PATH_NETSVC_CONF, "r")) == NULL) + goto nomatch; + + while (sudo_parseln(&line, &linesize, NULL, fp, 0) != -1) { + /* Skip blank or comment lines */ + if (*(cp = line) == '\0') + continue; + + /* Look for a line starting with "sudoers = " */ + if (strncasecmp(cp, "sudoers", 7) != 0) + continue; + cp += 7; + while (isspace((unsigned char)*cp)) + cp++; + if (*cp++ != '=') + continue; + + /* Parse line */ + for ((cp = strtok_r(cp, ",", &last)); cp != NULL; (cp = strtok_r(NULL, ",", &last))) { + /* Trim leading whitespace. */ + while (isspace((unsigned char)*cp)) + cp++; + + if (!saw_files && strncasecmp(cp, "files", 5) == 0 && + (isspace((unsigned char)cp[5]) || cp[5] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + got_match = saw_files = true; + ep = &cp[5]; +#ifdef HAVE_LDAP + } else if (!saw_ldap && strncasecmp(cp, "ldap", 4) == 0 && + (isspace((unsigned char)cp[4]) || cp[4] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); + got_match = saw_ldap = true; + ep = &cp[4]; +#endif +#ifdef HAVE_SSSD + } else if (!saw_sss && strncasecmp(cp, "sss", 3) == 0 && + (isspace((unsigned char)cp[3]) || cp[3] == '\0')) { + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); + got_match = saw_sss = true; + ep = &cp[3]; +#endif + } else { + got_match = false; + } + + /* check for = auth qualifier */ + if (got_match && *ep) { + cp = ep; + while (isspace((unsigned char)*cp) || *cp == '=') + cp++; + if (strncasecmp(cp, "auth", 4) == 0 && + (isspace((unsigned char)cp[4]) || cp[4] == '\0')) { + TAILQ_LAST(&snl, sudo_nss_list)->ret_if_found = true; + } + } + } + /* Only parse the first "sudoers" line */ + break; + } + fclose(fp); + +nomatch: + /* Default to files only if no matches */ + if (TAILQ_EMPTY(&snl)) + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +# else /* !_PATH_NETSVC_CONF && !_PATH_NSSWITCH_CONF */ + +/* + * Non-nsswitch.conf version with hard-coded order. + */ +struct sudo_nss_list * +sudo_read_nss(void) +{ + static struct sudo_nss_list snl = TAILQ_HEAD_INITIALIZER(snl); + debug_decl(sudo_read_nss, SUDOERS_DEBUG_NSS) + +# ifdef HAVE_SSSD + TAILQ_INSERT_TAIL(&snl, &sudo_nss_sss, entries); +# endif +# ifdef HAVE_LDAP + TAILQ_INSERT_TAIL(&snl, &sudo_nss_ldap, entries); +# endif + TAILQ_INSERT_TAIL(&snl, &sudo_nss_file, entries); + + debug_return_ptr(&snl); +} + +# endif /* !HAVE_LDAP || !_PATH_NETSVC_CONF */ + +#endif /* HAVE_LDAP && _PATH_NSSWITCH_CONF */ + +bool +sudo_nss_can_continue(struct sudo_nss *nss, int match) +{ + debug_decl(sudo_nss_should_continue, SUDOERS_DEBUG_NSS) + + /* Handle [NOTFOUND=return] */ + if (nss->ret_if_notfound && match == UNSPEC) + debug_return_bool(false); + + /* Handle [SUCCESS=return] */ + if (nss->ret_if_found && match != UNSPEC) + debug_return_bool(false); + + debug_return_bool(true); +} diff --git a/utsudo-0.0.2/plugins/sudoers/sudo_nss.h b/utsudo-0.0.2/plugins/sudoers/sudo_nss.h new file mode 100644 index 0000000..bb0c49a --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudo_nss.h @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007-2011, 2013-2015, 2017-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_NSS_H +#define SUDOERS_NSS_H + +struct passwd; +struct userspec_list; +struct defaults_list; + +/* XXX - parse_tree, ret_if_found and ret_if_notfound should be private */ +struct sudo_nss { + TAILQ_ENTRY(sudo_nss) entries; + int (*open)(struct sudo_nss *nss); + int (*close)(struct sudo_nss *nss); + struct sudoers_parse_tree *(*parse)(struct sudo_nss *nss); + int (*query)(struct sudo_nss *nss, struct passwd *pw); + int (*getdefs)(struct sudo_nss *nss); + void *handle; + struct sudoers_parse_tree *parse_tree; + bool ret_if_found; + bool ret_if_notfound; +}; + +TAILQ_HEAD(sudo_nss_list, sudo_nss); + +struct sudo_nss_list *sudo_read_nss(void); +bool sudo_nss_can_continue(struct sudo_nss *nss, int match); + +#endif /* SUDOERS_NSS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudo_printf.c b/utsudo-0.0.2/plugins/sudoers/sudo_printf.c new file mode 100644 index 0000000..fd21e4b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudo_printf.c @@ -0,0 +1,71 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2012 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_plugin.h" +#include "sudo_debug.h" +#include "pathnames.h" + +static int +sudo_printf_int(int msg_type, const char *fmt, ...) +{ + FILE *fp = stdout; + FILE *ttyfp = NULL; + va_list ap; + int len; + + if (ISSET(msg_type, SUDO_CONV_PREFER_TTY)) { + /* Try writing to /dev/tty first. */ + ttyfp = fopen(_PATH_TTY, "w"); + } + + switch (msg_type & 0xff) { + case SUDO_CONV_ERROR_MSG: + fp = stderr; + /* FALLTHROUGH */ + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(ttyfp ? ttyfp : fp, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + if (ttyfp != NULL) + fclose(ttyfp); + + return len; +} + +sudo_printf_t sudo_printf = sudo_printf_int; diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers.c b/utsudo-0.0.2/plugins/sudoers/sudoers.c new file mode 100644 index 0000000..c1b4ecd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers.c @@ -0,0 +1,1383 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LOGIN_CAP_H +# include +# ifndef LOGIN_DEFROOTCLASS +# define LOGIN_DEFROOTCLASS "daemon" +# endif +# ifndef LOGIN_SETENV +# define LOGIN_SETENV 0 +# endif +#endif +#ifdef HAVE_SELINUX +# include +#endif +#include + +#include "sudoers.h" +#include "parse.h" +#include "auth/sudo_auth.h" + +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + +/* + * Prototypes + */ +static bool cb_fqdn(const union sudo_defs_val *); +static bool cb_runas_default(const union sudo_defs_val *); +static bool cb_tty_tickets(const union sudo_defs_val *); +static bool cb_umask(const union sudo_defs_val *); +static int set_cmnd(void); +static int create_admin_success_flag(void); +static bool init_vars(char * const *); +static bool set_loginclass(struct passwd *); +static bool set_runasgr(const char *, bool); +static bool set_runaspw(const char *, bool); +static bool tty_present(void); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +uid_t timestamp_uid; +gid_t timestamp_gid; +#ifdef HAVE_BSD_AUTH_H +char *login_style; +#endif /* HAVE_BSD_AUTH_H */ +bool force_umask; +int sudo_mode; + +static char *prev_user; +static char *runas_user; +static char *runas_group; +static struct sudo_nss_list *snl; +static bool unknown_runas_uid; +static bool unknown_runas_gid; + +#ifdef __linux__ +static struct rlimit nproclimit; +#endif + +/* XXX - must be extern for audit bits of sudo_auth.c */ +int NewArgc; +char **NewArgv; + +/* + * Unlimit the number of processes since Linux's setuid() will + * apply resource limits when changing uid and return EAGAIN if + * nproc would be exceeded by the uid switch. + */ +static void +unlimit_nproc(void) +{ +#ifdef __linux__ + struct rlimit rl; + debug_decl(unlimit_nproc, SUDOERS_DEBUG_UTIL) + + if (getrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("getrlimit"); + rl.rlim_cur = rl.rlim_max = RLIM_INFINITY; + if (setrlimit(RLIMIT_NPROC, &rl) != 0) { + rl.rlim_cur = rl.rlim_max = nproclimit.rlim_max; + if (setrlimit(RLIMIT_NPROC, &rl) != 0) + sudo_warn("setrlimit"); + } + debug_return; +#endif /* __linux__ */ +} + +/* + * Restore saved value of RLIMIT_NPROC. + */ +static void +restore_nproc(void) +{ +#ifdef __linux__ + debug_decl(restore_nproc, SUDOERS_DEBUG_UTIL) + + if (setrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("setrlimit"); + + debug_return; +#endif /* __linux__ */ +} + +int +sudoers_policy_init(void *info, char * const envp[]) +{ + struct sudo_nss *nss, *nss_next; + int oldlocale, sources = 0; + int ret = -1; + debug_decl(sudoers_policy_init, SUDOERS_DEBUG_PLUGIN) + + bindtextdomain("sudoers", LOCALEDIR); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(sudoers_cleanup); + + /* Initialize environment functions (including replacements). */ + if (!env_init(envp)) + debug_return_int(-1); + + /* Setup defaults data structures. */ + if (!init_defaults()) { + sudo_warnx(U_("unable to initialize sudoers default values")); + debug_return_int(-1); + } + + /* Parse info from front-end. */ + sudo_mode = sudoers_policy_deserialize_info(info, &runas_user, &runas_group); + if (ISSET(sudo_mode, MODE_ERROR)) + debug_return_int(-1); + + if (!init_vars(envp)) + debug_return_int(-1); + + /* Parse nsswitch.conf for sudoers order. */ + snl = sudo_read_nss(); + + /* LDAP or NSS may modify the euid so we need to be root for the open. */ + if (!set_perms(PERM_ROOT)) + debug_return_int(-1); + + /* + * Open and parse sudoers, set global defaults. + * Uses the C locale unless another is specified in sudoers. + */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + init_parser(sudoers_file, false); + TAILQ_FOREACH_SAFE(nss, snl, entries, nss_next) { + if (nss->open(nss) == -1 || (nss->parse_tree = nss->parse(nss)) == NULL) { + TAILQ_REMOVE(snl, nss, entries); + continue; + } + + sources++; + if (nss->getdefs(nss) == -1 || !update_defaults(nss->parse_tree, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER|SETDEF_RUNAS, false)) { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("problem with defaults entries")); + } + } + if (sources == 0) { + sudo_warnx(U_("no valid sudoers sources found, quitting")); + goto cleanup; + } + + /* Set login class if applicable (after sudoers is parsed). */ + if (set_loginclass(runas_pw ? runas_pw : sudo_user.pw)) + ret = true; + + if (!def_match_group_by_gid || !def_legacy_group_processing) { + def_match_group_by_gid = false; + def_legacy_group_processing = false; + } + + /* + * Emulate cmnd_no_wait option by disabling PAM session, PTY allocation + * and I/O logging. This will cause sudo to execute the given command + * directly instead of forking a separate process for it. + */ + if (def_cmnd_no_wait) { + def_pam_setcred = false; + def_pam_session = false; + def_use_pty = false; + def_log_input = false; + def_log_output = false; + } + +cleanup: + if (!restore_perms()) + ret = -1; + + /* Restore user's locale. */ + sudo_warn_set_locale_func(NULL); + sudoers_setlocale(oldlocale, NULL); + + debug_return_int(ret); +} + +int +sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], + bool verbose, void *closure) +{ + char **edit_argv = NULL; + char *iolog_path = NULL; + mode_t cmnd_umask = ACCESSPERMS; + struct sudo_nss *nss; + int cmnd_status = -1, oldlocale, validated; + int ret = -1; + debug_decl(sudoers_policy_main, SUDOERS_DEBUG_PLUGIN) + + sudo_warn_set_locale_func(sudoers_warn_setlocale); + + unlimit_nproc(); + + /* Is root even allowed to run sudo? */ + if (user_uid == 0 && !def_root_sudo) { + /* Not an audit event. */ + sudo_warnx(U_("sudoers specifies that root is not allowed to sudo")); + goto bad; + } + + if (!set_perms(PERM_INITIAL)) + goto bad; + + /* Environment variables specified on the command line. */ + if (env_add != NULL && env_add[0] != NULL) + sudo_user.env_vars = env_add; + + /* + * Make a local copy of argc/argv, with special handling + * for pseudo-commands and the '-i' option. + */ + if (argc == 0) { + NewArgc = 1; + NewArgv = reallocarray(NULL, NewArgc + 1, sizeof(char *)); + if (NewArgv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + NewArgv[0] = user_cmnd; + NewArgv[1] = NULL; + } else { + /* Must leave an extra slot before NewArgv for bash's --login */ + NewArgc = argc; + NewArgv = reallocarray(NULL, NewArgc + 2, sizeof(char *)); + if (NewArgv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + NewArgv++; /* reserve an extra slot for --login */ + memcpy(NewArgv, argv, argc * sizeof(char *)); + NewArgv[NewArgc] = NULL; + if (ISSET(sudo_mode, MODE_LOGIN_SHELL) && runas_pw != NULL) { + NewArgv[0] = strdup(runas_pw->pw_shell); + if (NewArgv[0] == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free(NewArgv); + goto done; + } + } + } + + /* If given the -P option, set the "preserve_groups" flag. */ + if (ISSET(sudo_mode, MODE_PRESERVE_GROUPS)) + def_preserve_groups = true; + + /* Find command in path and apply per-command Defaults. */ + cmnd_status = set_cmnd(); + if (cmnd_status == NOT_FOUND_ERROR) + goto done; + + /* Check for -C overriding def_closefrom. */ + if (user_closefrom >= 0 && user_closefrom != def_closefrom) { + if (!def_closefrom_override) { + /* XXX - audit? */ + sudo_warnx(U_("you are not permitted to use the -C option")); + goto bad; + } + def_closefrom = user_closefrom; + } + + /* + * Check sudoers sources, using the locale specified in sudoers. + */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + validated = sudoers_lookup(snl, sudo_user.pw, FLAG_NO_USER | FLAG_NO_HOST, + pwflag); + if (ISSET(validated, VALIDATE_ERROR)) { + /* The lookup function should have printed an error. */ + goto done; + } + + /* Restore user's locale. */ + sudoers_setlocale(oldlocale, NULL); + + if (safe_cmnd == NULL) { + if ((safe_cmnd = strdup(user_cmnd)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + } + + /* Defer uid/gid checks until after defaults have been updated. */ + if (unknown_runas_uid && !def_runas_allow_unknown_id) { + audit_failure(NewArgc, NewArgv, N_("unknown user: %s"), + runas_pw->pw_name); + sudo_warnx(U_("unknown user: %s"), runas_pw->pw_name); + goto done; + } + if (runas_gr != NULL) { + if (unknown_runas_gid && !def_runas_allow_unknown_id) { + audit_failure(NewArgc, NewArgv, N_("unknown group: %s"), + runas_gr->gr_name); + sudo_warnx(U_("unknown group: %s"), runas_gr->gr_name); + goto done; + } + } + + /* + * Look up the timestamp dir owner if one is specified. + */ + if (def_timestampowner) { + struct passwd *pw = NULL; + + if (*def_timestampowner == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(def_timestampowner + 1, &errstr); + if (errstr == NULL) + pw = sudo_getpwuid(uid); + } + if (pw == NULL) + pw = sudo_getpwnam(def_timestampowner); + if (pw != NULL) { + timestamp_uid = pw->pw_uid; + timestamp_gid = pw->pw_gid; + sudo_pw_delref(pw); + } else { + log_warningx(SLOG_SEND_MAIL, + N_("timestamp owner (%s): No such user"), def_timestampowner); + timestamp_uid = ROOT_UID; + timestamp_gid = ROOT_GID; + } + } + + /* If no command line args and "shell_noargs" is not set, error out. */ + if (ISSET(sudo_mode, MODE_IMPLIED_SHELL) && !def_shell_noargs) { + /* Not an audit event. */ + ret = -2; /* usage error */ + goto done; + } + + /* Bail if a tty is required and we don't have one. */ + if (def_requiretty && !tty_present()) { + audit_failure(NewArgc, NewArgv, N_("no tty")); + sudo_warnx(U_("sorry, you must have a tty to run sudo")); + goto bad; + } + + /* Check runas user's shell. */ + if (!check_user_shell(runas_pw)) { + log_warningx(SLOG_RAW_MSG, N_("invalid shell for user %s: %s"), + runas_pw->pw_name, runas_pw->pw_shell); + goto bad; + } + + /* + * We don't reset the environment for sudoedit or if the user + * specified the -E command line flag and they have setenv privs. + */ + if (ISSET(sudo_mode, MODE_EDIT) || + (ISSET(sudo_mode, MODE_PRESERVE_ENV) && def_setenv)) + def_env_reset = false; + + /* Build a new environment that avoids any nasty bits. */ + if (!rebuild_env()) + goto bad; + + /* Require a password if sudoers says so. */ + switch (check_user(validated, sudo_mode)) { + case true: + /* user authenticated successfully. */ + break; + case false: + /* Note: log_denial() calls audit for us. */ + if (!ISSET(validated, VALIDATE_SUCCESS)) { + /* Only display a denial message if no password was read. */ + if (!log_denial(validated, def_passwd_tries <= 0)) + goto done; + } + goto bad; + default: + /* some other error, ret is -1. */ + goto done; + } + + /* If run as root with SUDO_USER set, set sudo_user.pw to that user. */ + /* XXX - causes confusion when root is not listed in sudoers */ + if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT) && prev_user != NULL) { + if (user_uid == 0 && strcmp(prev_user, "root") != 0) { + struct passwd *pw; + + if ((pw = sudo_getpwnam(prev_user)) != NULL) { + if (sudo_user.pw != NULL) + sudo_pw_delref(sudo_user.pw); + sudo_user.pw = pw; + } + } + } + + /* If the user was not allowed to run the command we are done. */ + if (!ISSET(validated, VALIDATE_SUCCESS)) { + /* Note: log_failure() calls audit for us. */ + if (!log_failure(validated, cmnd_status)) + goto done; + goto bad; + } + + /* Create Ubuntu-style dot file to indicate sudo was successful. */ + if (create_admin_success_flag() == -1) + goto done; + + /* Finally tell the user if the command did not exist. */ + if (cmnd_status == NOT_FOUND_DOT) { + audit_failure(NewArgc, NewArgv, N_("command in current directory")); + sudo_warnx(U_("ignoring \"%s\" found in '.'\nUse \"sudo ./%s\" if this is the \"%s\" you wish to run."), user_cmnd, user_cmnd, user_cmnd); + goto bad; + } else if (cmnd_status == NOT_FOUND) { + if (ISSET(sudo_mode, MODE_CHECK)) { + audit_failure(NewArgc, NewArgv, N_("%s: command not found"), + NewArgv[0]); + sudo_warnx(U_("%s: command not found"), NewArgv[0]); + } else { + audit_failure(NewArgc, NewArgv, N_("%s: command not found"), + user_cmnd); + sudo_warnx(U_("%s: command not found"), user_cmnd); + } + goto bad; + } + + /* If user specified a timeout make sure sudoers allows it. */ + if (!def_user_command_timeouts && user_timeout > 0) { + /* XXX - audit/log? */ + sudo_warnx(U_("sorry, you are not allowed set a command timeout")); + goto bad; + } + + /* If user specified env vars make sure sudoers allows it. */ + if (ISSET(sudo_mode, MODE_RUN) && !def_setenv) { + if (ISSET(sudo_mode, MODE_PRESERVE_ENV)) { + /* XXX - audit/log? */ + sudo_warnx(U_("sorry, you are not allowed to preserve the environment")); + goto bad; + } else { + if (!validate_env_vars(sudo_user.env_vars)) + goto bad; + } + } + + if (ISSET(sudo_mode, (MODE_RUN | MODE_EDIT))) { + if ((def_log_input || def_log_output) && def_iolog_file && def_iolog_dir) { + const char prefix[] = "iolog_path="; + iolog_path = expand_iolog_path(prefix, def_iolog_dir, + def_iolog_file, &sudo_user.iolog_file); + if (iolog_path == NULL) { + if (!def_ignore_iolog_errors) + goto done; + /* Unable to expand I/O log path, disable I/O logging. */ + def_log_input = false; + def_log_output = false; + } else { + sudo_user.iolog_file++; + } + } + } + + if (!log_allowed(validated) && !def_ignore_logfile_errors) + goto bad; + + switch (sudo_mode & MODE_MASK) { + case MODE_CHECK: + ret = display_cmnd(snl, list_pw ? list_pw : sudo_user.pw); + break; + case MODE_LIST: + ret = display_privs(snl, list_pw ? list_pw : sudo_user.pw, verbose); + break; + case MODE_VALIDATE: + /* Nothing to do. */ + ret = true; + break; + case MODE_RUN: + case MODE_EDIT: + /* ret set by sudoers_policy_exec_setup() below. */ + break; + default: + /* Should not happen. */ + sudo_warnx("internal error, unexpected sudo mode 0x%x", sudo_mode); + goto done; + } + + /* Cleanup sudoers sources */ + TAILQ_FOREACH(nss, snl, entries) { + nss->close(nss); + } + if (def_group_plugin) + group_plugin_unload(); + init_parser(NULL, false); + + if (ISSET(sudo_mode, (MODE_VALIDATE|MODE_CHECK|MODE_LIST))) { + /* ret already set appropriately */ + goto done; + } + + /* + * Set umask based on sudoers. + * If user's umask is more restrictive, OR in those bits too + * unless umask_override is set. + */ + if (def_umask != ACCESSPERMS) { + cmnd_umask = def_umask; + if (!def_umask_override) + cmnd_umask |= user_umask; + } + + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) { + char *p; + + /* Convert /bin/sh -> -sh so shell knows it is a login shell */ + if ((p = strrchr(NewArgv[0], '/')) == NULL) + p = NewArgv[0]; + *p = '-'; + NewArgv[0] = p; + + /* + * Newer versions of bash require the --login option to be used + * in conjunction with the -c option even if the shell name starts + * with a '-'. Unfortunately, bash 1.x uses -login, not --login + * so this will cause an error for that. + */ + if (NewArgc > 1 && strcmp(NewArgv[0], "-bash") == 0 && + strcmp(NewArgv[1], "-c") == 0) { + /* Use the extra slot before NewArgv so we can store --login. */ + NewArgv--; + NewArgc++; + NewArgv[0] = NewArgv[1]; + NewArgv[1] = "--login"; + } + +#if defined(_AIX) || (defined(__linux__) && !defined(HAVE_PAM)) + /* Insert system-wide environment variables. */ + if (!read_env_file(_PATH_ENVIRONMENT, true, false)) + sudo_warn("%s", _PATH_ENVIRONMENT); +#endif +#ifdef HAVE_LOGIN_CAP_H + /* Set environment based on login class. */ + if (login_class) { + login_cap_t *lc = login_getclass(login_class); + if (lc != NULL) { + setusercontext(lc, runas_pw, runas_pw->pw_uid, LOGIN_SETPATH|LOGIN_SETENV); + login_close(lc); + } + } +#endif /* HAVE_LOGIN_CAP_H */ + } + + /* Insert system-wide environment variables. */ + if (def_restricted_env_file) { + if (!read_env_file(def_restricted_env_file, false, true)) + sudo_warn("%s", def_restricted_env_file); + } + if (def_env_file) { + if (!read_env_file(def_env_file, false, false)) + sudo_warn("%s", def_env_file); + } + + /* Insert user-specified environment variables. */ + if (!insert_env_vars(sudo_user.env_vars)) + goto done; + + /* Note: must call audit before uid change. */ + if (ISSET(sudo_mode, MODE_EDIT)) { + int edit_argc; + const char *env_editor; + + free(safe_cmnd); + safe_cmnd = find_editor(NewArgc - 1, NewArgv + 1, &edit_argc, + &edit_argv, NULL, &env_editor, false); + if (safe_cmnd == NULL) { + if (errno != ENOENT) + goto done; + audit_failure(NewArgc, NewArgv, N_("%s: command not found"), + env_editor ? env_editor : def_editor); + sudo_warnx(U_("%s: command not found"), + env_editor ? env_editor : def_editor); + goto bad; + } + if (audit_success(edit_argc, edit_argv) != 0 && !def_ignore_audit_errors) + goto done; + + /* We want to run the editor with the unmodified environment. */ + env_swap_old(); + } else { + if (audit_success(NewArgc, NewArgv) != 0 && !def_ignore_audit_errors) + goto done; + } + + /* Setup execution environment to pass back to front-end. */ + ret = sudoers_policy_exec_setup(edit_argv ? edit_argv : NewArgv, + env_get(), cmnd_umask, iolog_path, closure); + + /* Zero out stashed copy of environment, it is owned by the front-end. */ + (void)env_init(NULL); + + goto done; + +bad: + ret = false; + +done: + if (!rewind_perms()) + ret = -1; + + restore_nproc(); + + /* Destroy the password and group caches and free the contents. */ + sudo_freepwcache(); + sudo_freegrcache(); + + sudo_warn_set_locale_func(NULL); + + debug_return_int(ret); +} + +/* + * Initialize timezone and fill in sudo_user struct. + */ +static bool +init_vars(char * const envp[]) +{ + char * const * ep; + bool unknown_user = false; + debug_decl(init_vars, SUDOERS_DEBUG_PLUGIN) + + if (!sudoers_initlocale(setlocale(LC_ALL, NULL), def_sudoers_locale)) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0 && (s)[sizeof(v) - 1] != '\0') + + for (ep = envp; *ep; ep++) { + switch (**ep) { + case 'K': + if (MATCHES(*ep, "KRB5CCNAME=")) + user_ccname = *ep + sizeof("KRB5CCNAME=") - 1; + break; + case 'P': + if (MATCHES(*ep, "PATH=")) + user_path = *ep + sizeof("PATH=") - 1; + break; + case 'S': + if (MATCHES(*ep, "SUDO_PROMPT=")) { + /* Don't override "sudo -p prompt" */ + if (user_prompt == NULL) + user_prompt = *ep + sizeof("SUDO_PROMPT=") - 1; + break; + } + if (MATCHES(*ep, "SUDO_USER=")) + prev_user = *ep + sizeof("SUDO_USER=") - 1; + break; + } + } +#undef MATCHES + + /* + * Get a local copy of the user's passwd struct and group list if we + * don't already have them. + */ + if (sudo_user.pw == NULL) { + if ((sudo_user.pw = sudo_getpwnam(user_name)) == NULL) { + /* + * It is not unusual for users to place "sudo -k" in a .logout + * file which can cause sudo to be run during reboot after the + * YP/NIS/NIS+/LDAP/etc daemon has died. + */ + if (sudo_mode == MODE_KILL || sudo_mode == MODE_INVALIDATE) { + sudo_warnx(U_("unknown uid: %u"), (unsigned int) user_uid); + debug_return_bool(false); + } + + /* Need to make a fake struct passwd for the call to log_warningx(). */ + sudo_user.pw = sudo_mkpwent(user_name, user_uid, user_gid, NULL, NULL); + unknown_user = true; + } + } + if (user_gid_list == NULL) + user_gid_list = sudo_get_gidlist(sudo_user.pw, ENTRY_TYPE_ANY); + + /* Store initialize permissions so we can restore them later. */ + if (!set_perms(PERM_INITIAL)) + debug_return_bool(false); + + /* Set fqdn callback. */ + sudo_defs_table[I_FQDN].callback = cb_fqdn; + + /* Set group_plugin callback. */ + sudo_defs_table[I_GROUP_PLUGIN].callback = cb_group_plugin; + + /* Set runas callback. */ + sudo_defs_table[I_RUNAS_DEFAULT].callback = cb_runas_default; + + /* Set locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Set maxseq callback. */ + sudo_defs_table[I_MAXSEQ].callback = cb_maxseq; + + /* Set iolog_user callback. */ + sudo_defs_table[I_IOLOG_USER].callback = cb_iolog_user; + + /* Set iolog_group callback. */ + sudo_defs_table[I_IOLOG_GROUP].callback = cb_iolog_group; + + /* Set iolog_mode callback. */ + sudo_defs_table[I_IOLOG_MODE].callback = cb_iolog_mode; + + /* Set tty_tickets callback. */ + sudo_defs_table[I_TTY_TICKETS].callback = cb_tty_tickets; + + /* Set umask callback. */ + sudo_defs_table[I_UMASK].callback = cb_umask; + + /* It is now safe to use log_warningx() and set_perms() */ + if (unknown_user) { + log_warningx(SLOG_SEND_MAIL, N_("unknown uid: %u"), + (unsigned int) user_uid); + debug_return_bool(false); + } + + /* + * Set runas passwd/group entries based on command line or sudoers. + * Note that if runas_group was specified without runas_user we + * run the command as the invoking user. + */ + if (runas_group != NULL) { + if (!set_runasgr(runas_group, false)) + debug_return_bool(false); + if (!set_runaspw(runas_user ? runas_user : user_name, false)) + debug_return_bool(false); + } else { + if (!set_runaspw(runas_user ? runas_user : def_runas_default, false)) + debug_return_bool(false); + } + + debug_return_bool(true); +} + +/* + * Fill in user_cmnd, user_args, user_base and user_stat variables + * and apply any command-specific defaults entries. + */ +static int +set_cmnd(void) +{ + struct sudo_nss *nss; + char *path = user_path; + int ret = FOUND; + debug_decl(set_cmnd, SUDOERS_DEBUG_PLUGIN) + + /* Allocate user_stat for find_path() and match functions. */ + user_stat = calloc(1, sizeof(struct stat)); + if (user_stat == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(NOT_FOUND_ERROR); + } + + /* Default value for cmnd, overridden below. */ + if (user_cmnd == NULL) + user_cmnd = NewArgv[0]; + + if (ISSET(sudo_mode, MODE_RUN|MODE_EDIT|MODE_CHECK)) { + if (!ISSET(sudo_mode, MODE_EDIT)) { + if (def_secure_path && !user_is_exempt()) + path = def_secure_path; + if (!set_perms(PERM_RUNAS)) + debug_return_int(-1); + ret = find_path(NewArgv[0], &user_cmnd, user_stat, path, + def_ignore_dot, NULL); + if (!restore_perms()) + debug_return_int(-1); + if (ret == NOT_FOUND) { + /* Failed as root, try as invoking user. */ + if (!set_perms(PERM_USER)) + debug_return_int(-1); + ret = find_path(NewArgv[0], &user_cmnd, user_stat, path, + def_ignore_dot, NULL); + if (!restore_perms()) + debug_return_int(-1); + } + if (ret == NOT_FOUND_ERROR) { + if (errno == ENAMETOOLONG) + audit_failure(NewArgc, NewArgv, N_("command too long")); + log_warning(0, "%s", NewArgv[0]); + debug_return_int(ret); + } + } + + /* set user_args */ + if (NewArgc > 1) { + char *to, *from, **av; + size_t size, n; + + /* Alloc and build up user_args. */ + for (size = 0, av = NewArgv + 1; *av; av++) + size += strlen(*av) + 1; + if (size == 0 || (user_args = malloc(size)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL) && + ISSET(sudo_mode, MODE_RUN)) { + /* + * When running a command via a shell, the sudo front-end + * escapes potential meta chars. We unescape non-spaces + * for sudoers matching and logging purposes. + */ + for (to = user_args, av = NewArgv + 1; (from = *av); av++) { + while (*from) { + if (from[0] == '\\' && from[1] != '\0' && + !isspace((unsigned char)from[1])) { + from++; + } + if (size - (to - user_args) < 1) { + sudo_warnx(U_("internal error, %s overflow"), + __func__); + debug_return_int(NOT_FOUND_ERROR); + } + *to++ = *from++; + } + if (size - (to - user_args) < 1) { + sudo_warnx(U_("internal error, %s overflow"), + __func__); + debug_return_int(NOT_FOUND_ERROR); + } + *to++ = ' '; + } + *--to = '\0'; + } else { + for (to = user_args, av = NewArgv + 1; *av; av++) { + n = strlcpy(to, *av, size - (to - user_args)); + if (n >= size - (to - user_args)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + debug_return_int(-1); + } + to += n; + *to++ = ' '; + } + *--to = '\0'; + } + } + } + + if ((user_base = strrchr(user_cmnd, '/')) != NULL) + user_base++; + else + user_base = user_cmnd; + + TAILQ_FOREACH(nss, snl, entries) { + if (!update_defaults(nss->parse_tree, NULL, SETDEF_CMND, false)) { + log_warningx(SLOG_SEND_MAIL|SLOG_NO_STDERR, + N_("problem with defaults entries")); + } + } + + debug_return_int(ret); +} + +/* + * Open sudoers and sanity check mode/owner/type. + * Returns a handle to the sudoers file or NULL on error. + */ +FILE * +open_sudoers(const char *sudoers, bool doedit, bool *keepopen) +{ + struct stat sb; + FILE *fp = NULL; + bool perm_root = false; + debug_decl(open_sudoers, SUDOERS_DEBUG_PLUGIN) + + if (!set_perms(PERM_SUDOERS)) + debug_return_ptr(NULL); + +again: + switch (sudo_secure_file(sudoers, sudoers_uid, sudoers_gid, &sb)) { + case SUDO_PATH_SECURE: + /* + * If we are expecting sudoers to be group readable by + * SUDOERS_GID but it is not, we must open the file as root, + * not uid 1. + */ + if (sudoers_uid == ROOT_UID && ISSET(sudoers_mode, S_IRGRP)) { + if (!ISSET(sb.st_mode, S_IRGRP) || sb.st_gid != SUDOERS_GID) { + if (!perm_root) { + if (!restore_perms() || !set_perms(PERM_ROOT)) + debug_return_ptr(NULL); + } + } + } + /* + * Open sudoers and make sure we can read it so we can present + * the user with a reasonable error message (unlike the lexer). + */ + if ((fp = fopen(sudoers, "r")) == NULL) { + log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), sudoers); + } else { + if (sb.st_size != 0 && fgetc(fp) == EOF) { + log_warning(SLOG_SEND_MAIL, + N_("unable to read %s"), sudoers); + fclose(fp); + fp = NULL; + } else { + /* Rewind fp and set close on exec flag. */ + rewind(fp); + (void) fcntl(fileno(fp), F_SETFD, 1); + } + } + break; + case SUDO_PATH_MISSING: + /* + * If we tried to stat() sudoers as non-root but got EACCES, + * try again as root. + */ + if (errno == EACCES && geteuid() != ROOT_UID) { + int serrno = errno; + if (restore_perms()) { + if (!set_perms(PERM_ROOT)) + debug_return_ptr(NULL); + perm_root = true; + goto again; + } + errno = serrno; + } + log_warning(SLOG_SEND_MAIL, N_("unable to stat %s"), sudoers); + break; + case SUDO_PATH_BAD_TYPE: + log_warningx(SLOG_SEND_MAIL, + N_("%s is not a regular file"), sudoers); + break; + case SUDO_PATH_WRONG_OWNER: + log_warningx(SLOG_SEND_MAIL, + N_("%s is owned by uid %u, should be %u"), sudoers, + (unsigned int) sb.st_uid, (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + log_warningx(SLOG_SEND_MAIL, N_("%s is world writable"), sudoers); + break; + case SUDO_PATH_GROUP_WRITABLE: + log_warningx(SLOG_SEND_MAIL, + N_("%s is owned by gid %u, should be %u"), sudoers, + (unsigned int) sb.st_gid, (unsigned int) sudoers_gid); + break; + default: + /* NOTREACHED */ + break; + } + + if (!restore_perms()) { + /* unable to change back to root */ + if (fp != NULL) { + fclose(fp); + fp = NULL; + } + } + + debug_return_ptr(fp); +} + +#ifdef HAVE_LOGIN_CAP_H +static bool +set_loginclass(struct passwd *pw) +{ + const int errflags = SLOG_RAW_MSG; + login_cap_t *lc; + bool ret = true; + debug_decl(set_loginclass, SUDOERS_DEBUG_PLUGIN) + + if (!def_use_loginclass) + goto done; + + if (login_class && strcmp(login_class, "-") != 0) { + if (user_uid != 0 && pw->pw_uid != 0) { + sudo_warnx(U_("only root can use \"-c %s\""), login_class); + ret = false; + goto done; + } + } else { + login_class = pw->pw_class; + if (!login_class || !*login_class) + login_class = + (pw->pw_uid == 0) ? LOGIN_DEFROOTCLASS : LOGIN_DEFCLASS; + } + + /* Make sure specified login class is valid. */ + lc = login_getclass(login_class); + if (!lc || !lc->lc_class || strcmp(lc->lc_class, login_class) != 0) { + /* + * Don't make it an error if the user didn't specify the login + * class themselves. We do this because if login.conf gets + * corrupted we want the admin to be able to use sudo to fix it. + */ + log_warningx(errflags, N_("unknown login class: %s"), login_class); + def_use_loginclass = false; + if (login_class) + ret = false; + } + login_close(lc); +done: + debug_return_bool(ret); +} +#else +static bool +set_loginclass(struct passwd *pw) +{ + return true; +} +#endif /* HAVE_LOGIN_CAP_H */ + +#ifndef AI_FQDN +# define AI_FQDN AI_CANONNAME +#endif + +/* + * Look up the fully qualified domain name of host. + * Use AI_FQDN if available since "canonical" is not always the same as fqdn. + * Returns true on success, setting longp and shortp. + * Returns false on failure, longp and shortp are unchanged. + */ +static int +resolve_host(const char *host, char **longp, char **shortp) +{ + struct addrinfo *res0, hint; + char *cp, *lname, *sname; + int ret; + debug_decl(resolve_host, SUDOERS_DEBUG_PLUGIN) + + memset(&hint, 0, sizeof(hint)); + hint.ai_family = PF_UNSPEC; + hint.ai_flags = AI_FQDN; + + if ((ret = getaddrinfo(host, NULL, &hint, &res0)) != 0) + debug_return_int(ret); + if ((lname = strdup(res0->ai_canonname)) == NULL) { + freeaddrinfo(res0); + debug_return_int(EAI_MEMORY); + } + if ((cp = strchr(lname, '.')) != NULL) { + sname = strndup(lname, (size_t)(cp - lname)); + if (sname == NULL) { + free(lname); + freeaddrinfo(res0); + debug_return_int(EAI_MEMORY); + } + } else { + sname = lname; + } + freeaddrinfo(res0); + *longp = lname; + *shortp = sname; + + debug_return_int(0); +} + +/* + * Look up the fully qualified domain name of user_host and user_runhost. + * Sets user_host, user_shost, user_runhost and user_srunhost. + */ +static bool +cb_fqdn(const union sudo_defs_val *sd_un) +{ + bool remote; + char *lhost, *shost; + debug_decl(cb_fqdn, SUDOERS_DEBUG_PLUGIN) + + /* Nothing to do if fqdn flag is disabled. */ + if (sd_un != NULL && !sd_un->flag) + debug_return_bool(true); + + /* If the -h flag was given we need to resolve both host and runhost. */ + remote = strcmp(user_runhost, user_host) != 0; + + /* First resolve user_host, setting user_host and user_shost. */ + if (resolve_host(user_host, &lhost, &shost) != 0) { + int rc = resolve_host(user_runhost, &lhost, &shost); + if (rc != 0) { + gai_log_warning(SLOG_SEND_MAIL|SLOG_RAW_MSG, rc, + N_("unable to resolve host %s"), user_host); + debug_return_bool(false); + } + } + if (user_shost != user_host) + free(user_shost); + free(user_host); + user_host = lhost; + user_shost = shost; + + /* Next resolve user_runhost, setting user_runhost and user_srunhost. */ + lhost = shost = NULL; + if (remote) { + if (!resolve_host(user_runhost, &lhost, &shost)) { + sudo_warnx(U_("unable to resolve host %s"), user_runhost); + } + } else { + /* Not remote, just use user_host. */ + if ((lhost = strdup(user_host)) != NULL) { + if (user_shost != user_host) + shost = strdup(user_shost); + else + shost = lhost; + } + if (lhost == NULL || shost == NULL) { + free(lhost); + if (lhost != shost) + free(shost); + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + } + if (lhost != NULL && shost != NULL) { + if (user_srunhost != user_runhost) + free(user_srunhost); + free(user_runhost); + user_runhost = lhost; + user_srunhost = shost; + } + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "host %s, shost %s, runhost %s, srunhost %s", + user_host, user_shost, user_runhost, user_srunhost); + debug_return_bool(true); +} + +/* + * Get passwd entry for the user we are going to run commands as + * and store it in runas_pw. By default, commands run as "root". + */ +static bool +set_runaspw(const char *user, bool quiet) +{ + struct passwd *pw = NULL; + debug_decl(set_runaspw, SUDOERS_DEBUG_PLUGIN) + + unknown_runas_uid = false; + if (*user == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(user + 1, &errstr); + if (errstr == NULL) { + if ((pw = sudo_getpwuid(uid)) == NULL) { + unknown_runas_uid = true; + pw = sudo_fakepwnam(user, user_gid); + } + } + } + if (pw == NULL) { + if ((pw = sudo_getpwnam(user)) == NULL) { + if (!quiet) + log_warningx(SLOG_RAW_MSG, N_("unknown user: %s"), user); + debug_return_bool(false); + } + } + if (runas_pw != NULL) + sudo_pw_delref(runas_pw); + runas_pw = pw; + debug_return_bool(true); +} + +/* + * Get group entry for the group we are going to run commands as + * and store it in runas_gr. + */ +static bool +set_runasgr(const char *group, bool quiet) +{ + struct group *gr = NULL; + debug_decl(set_runasgr, SUDOERS_DEBUG_PLUGIN) + + unknown_runas_gid = false; + if (*group == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) { + if ((gr = sudo_getgrgid(gid)) == NULL) { + unknown_runas_gid = true; + gr = sudo_fakegrnam(group); + } + } + } + if (gr == NULL) { + if ((gr = sudo_getgrnam(group)) == NULL) { + if (!quiet) + log_warningx(SLOG_RAW_MSG, N_("unknown group: %s"), group); + debug_return_bool(false); + } + } + if (runas_gr != NULL) + sudo_gr_delref(runas_gr); + runas_gr = gr; + debug_return_bool(true); +} + +/* + * Callback for runas_default sudoers setting. + */ +static bool +cb_runas_default(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_runas_default, SUDOERS_DEBUG_PLUGIN) + + /* Only reset runaspw if user didn't specify one. */ + if (!runas_user && !runas_group) + debug_return_bool(set_runaspw(sd_un->str, true)); + debug_return_bool(true); +} + +/* + * Callback for tty_tickets sudoers setting. + */ +static bool +cb_tty_tickets(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_tty_tickets, SUDOERS_DEBUG_PLUGIN) + + /* Convert tty_tickets -> timestamp_type */ + if (sd_un->flag) + def_timestamp_type = tty; + else + def_timestamp_type = global; + debug_return_bool(true); +} + +/* + * Callback for umask sudoers setting. + */ +static bool +cb_umask(const union sudo_defs_val *sd_un) +{ + debug_decl(cb_umask, SUDOERS_DEBUG_PLUGIN) + + /* Force umask if explicitly set in sudoers. */ + force_umask = sd_un->mode != ACCESSPERMS; + + debug_return_bool(true); +} + +/* + * Cleanup hook for sudo_fatal()/sudo_fatalx() + */ +void +sudoers_cleanup(void) +{ + struct sudo_nss *nss; + debug_decl(sudoers_cleanup, SUDOERS_DEBUG_PLUGIN) + + if (snl != NULL) { + TAILQ_FOREACH(nss, snl, entries) { + nss->close(nss); + } + } + if (def_group_plugin) + group_plugin_unload(); + sudo_freepwcache(); + sudo_freegrcache(); + + debug_return; +} + +#ifdef USE_ADMIN_FLAG +static int +create_admin_success_flag(void) +{ + char flagfile[PATH_MAX]; + int len, ret = -1; + debug_decl(create_admin_success_flag, SUDOERS_DEBUG_PLUGIN) + + /* Check whether the user is in the sudo or admin group. */ + if (!user_in_group(sudo_user.pw, "sudo") && + !user_in_group(sudo_user.pw, "admin")) + debug_return_int(true); + + /* Build path to flag file. */ + len = snprintf(flagfile, sizeof(flagfile), "%s/.sudo_as_admin_successful", + user_dir); + if (len < 0 || len >= ssizeof(flagfile)) + debug_return_int(false); + + /* Create admin flag file if it doesn't already exist. */ + if (set_perms(PERM_USER)) { + int fd = open(flagfile, O_CREAT|O_WRONLY|O_NONBLOCK|O_EXCL, 0644); + ret = fd != -1 || errno == EEXIST; + if (fd != -1) + close(fd); + if (!restore_perms()) + ret = -1; + } + debug_return_int(ret); +} +#else /* !USE_ADMIN_FLAG */ +static int +create_admin_success_flag(void) +{ + /* STUB */ + return true; +} +#endif /* USE_ADMIN_FLAG */ + +static bool +tty_present(void) +{ + debug_decl(tty_present, SUDOERS_DEBUG_PLUGIN) + + if (user_ttypath == NULL) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd == -1) + debug_return_bool(false); + close(fd); + } + debug_return_bool(true); +} diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers.exp b/utsudo-0.0.2/plugins/sudoers/sudoers.exp new file mode 100644 index 0000000..d52ef1e --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers.exp @@ -0,0 +1,6 @@ +sudoers_policy +sudoers_io +sudo_getgrgid +sudo_getgrnam +sudo_gr_addref +sudo_gr_delref diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers.h b/utsudo-0.0.2/plugins/sudoers/sudoers.h new file mode 100644 index 0000000..4cbf6f6 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers.h @@ -0,0 +1,445 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2005, 2007-2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDOERS_SUDOERS_H +#define SUDOERS_SUDOERS_H + +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#define DEFAULT_TEXT_DOMAIN "sudoers" +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_queue.h" +#include "defaults.h" +#include "logging.h" +#include "parse.h" +#include "sudo_nss.h" +#include "sudo_plugin.h" +#include "sudo_conf.h" +#include "sudo_util.h" +#include "sudoers_debug.h" + +/* + * Supplementary group IDs for a user. + */ +struct gid_list { + int ngids; + GETGROUPS_T *gids; +}; + +/* + * Supplementary group names for a user. + */ +struct group_list { + int ngroups; + char **groups; +}; + +/* + * Info pertaining to the invoking user. + */ +struct sudo_user { + struct passwd *pw; + struct passwd *_runas_pw; + struct group *_runas_gr; + struct stat *cmnd_stat; + char *name; + char *path; + char *tty; + char *ttypath; + char *host; + char *shost; + char *runhost; + char *srunhost; + char *prompt; + char *cmnd; + char *cmnd_args; + char *cmnd_base; + char *cmnd_safe; + char *class_name; + char *krb5_ccname; + struct gid_list *gid_list; + char * const * env_vars; +#ifdef HAVE_SELINUX + char *role; + char *type; +#endif +#ifdef HAVE_PRIV_SET + char *privs; + char *limitprivs; +#endif + const char *cwd; + char *iolog_file; + GETGROUPS_T *gids; + int execfd; + int ngids; + int closefrom; + int lines; + int cols; + int flags; + int max_groups; + int timeout; + mode_t umask; + uid_t uid; + uid_t gid; + pid_t sid; +}; + +/* + * sudo_get_gidlist() type values + */ +#define ENTRY_TYPE_ANY 0x00 +#define ENTRY_TYPE_QUERIED 0x01 +#define ENTRY_TYPE_FRONTEND 0x02 + +/* + * sudo_user flag values + */ +#define RUNAS_USER_SPECIFIED 0x01 +#define RUNAS_GROUP_SPECIFIED 0x02 + +/* + * Return values for sudoers_lookup(), also used as arguments for log_auth() + * Note: cannot use '0' as a value here. + */ +#define VALIDATE_ERROR 0x001 +#define VALIDATE_SUCCESS 0x002 +#define VALIDATE_FAILURE 0x004 +#define FLAG_CHECK_USER 0x010 +#define FLAG_NO_USER 0x020 +#define FLAG_NO_HOST 0x040 +#define FLAG_NO_CHECK 0x080 +#define FLAG_NON_INTERACTIVE 0x100 +#define FLAG_BAD_PASSWORD 0x200 + +/* + * find_path()/set_cmnd() return values + */ +#define FOUND 0 +#define NOT_FOUND 1 +#define NOT_FOUND_DOT 2 +#define NOT_FOUND_ERROR 3 +#define NOT_FOUND_PATH 4 + +/* + * Various modes sudo can be in (based on arguments) in hex + */ +#define MODE_RUN 0x00000001 +#define MODE_EDIT 0x00000002 +#define MODE_VALIDATE 0x00000004 +#define MODE_INVALIDATE 0x00000008 +#define MODE_KILL 0x00000010 +#define MODE_VERSION 0x00000020 +#define MODE_HELP 0x00000040 +#define MODE_LIST 0x00000080 +#define MODE_CHECK 0x00000100 +#define MODE_ERROR 0x00000200 +#define MODE_MASK 0x0000ffff + +/* Mode flags */ +#define MODE_BACKGROUND 0x00010000 /* XXX - unused */ +#define MODE_SHELL 0x00020000 +#define MODE_LOGIN_SHELL 0x00040000 +#define MODE_IMPLIED_SHELL 0x00080000 +#define MODE_RESET_HOME 0x00100000 +#define MODE_PRESERVE_GROUPS 0x00200000 +#define MODE_PRESERVE_ENV 0x00400000 +#define MODE_NONINTERACTIVE 0x00800000 +#define MODE_IGNORE_TICKET 0x01000000 + +/* + * Used with set_perms() + */ +#define PERM_INITIAL 0x00 +#define PERM_ROOT 0x01 +#define PERM_USER 0x02 +#define PERM_FULL_USER 0x03 +#define PERM_SUDOERS 0x04 +#define PERM_RUNAS 0x05 +#define PERM_TIMESTAMP 0x06 +#define PERM_IOLOG 0x07 + +/* + * Shortcuts for sudo_user contents. + */ +#define sudo_user_name (sudo_user.pw->pw_name) +#define user_name (sudo_user.name) +#define user_uid (sudo_user.uid) +#define user_gid (sudo_user.gid) +#define user_sid (sudo_user.sid) +#define user_umask (sudo_user.umask) +#define user_passwd (sudo_user.pw->pw_passwd) +#define user_dir (sudo_user.pw->pw_dir) +#define user_gids (sudo_user.gids) +#define user_ngids (sudo_user.ngids) +#define user_gid_list (sudo_user.gid_list) +#define user_tty (sudo_user.tty) +#define user_ttypath (sudo_user.ttypath) +#define user_cwd (sudo_user.cwd) +#define user_cmnd (sudo_user.cmnd) +#define user_args (sudo_user.cmnd_args) +#define user_base (sudo_user.cmnd_base) +#define user_stat (sudo_user.cmnd_stat) +#define user_path (sudo_user.path) +#define user_prompt (sudo_user.prompt) +#define user_host (sudo_user.host) +#define user_shost (sudo_user.shost) +#define user_runhost (sudo_user.runhost) +#define user_srunhost (sudo_user.srunhost) +#define user_ccname (sudo_user.krb5_ccname) +#define safe_cmnd (sudo_user.cmnd_safe) +#define cmnd_fd (sudo_user.execfd) +#define login_class (sudo_user.class_name) +#define runas_pw (sudo_user._runas_pw) +#define runas_gr (sudo_user._runas_gr) +#define user_role (sudo_user.role) +#define user_type (sudo_user.type) +#define user_closefrom (sudo_user.closefrom) +#define runas_privs (sudo_user.privs) +#define runas_limitprivs (sudo_user.limitprivs) +#define user_timeout (sudo_user.timeout) + +/* Default sudoers uid/gid/mode if not set by the Makefile. */ +#ifndef SUDOERS_UID +# define SUDOERS_UID 0 +#endif +#ifndef SUDOERS_GID +# define SUDOERS_GID 0 +#endif +#ifndef SUDOERS_MODE +# define SUDOERS_MODE 0600 +#endif + +#ifdef __TANDEM +# define ROOT_UID 65535 +#else +# define ROOT_UID 0 +#endif +#define ROOT_GID 0 + +struct sudo_lbuf; +struct passwd; +struct stat; +struct timespec; + +/* + * Function prototypes + */ +#define YY_DECL int sudoerslex(void) + +/* goodpath.c */ +bool sudo_goodpath(const char *path, struct stat *sbp); + +/* findpath.c */ +int find_path(const char *infile, char **outfile, struct stat *sbp, + const char *path, int ignore_dot, char * const *whitelist); + +/* check.c */ +int check_user(int validate, int mode); +bool check_user_shell(const struct passwd *pw); +bool user_is_exempt(void); + +/* prompt.c */ +char *expand_prompt(const char *old_prompt, const char *auth_user); + +/* timestamp.c */ +int timestamp_remove(bool unlinkit); + +/* sudo_auth.c */ +bool sudo_auth_needs_end_session(void); +int verify_user(struct passwd *pw, char *prompt, int validated, struct sudo_conv_callback *callback); +int sudo_auth_begin_session(struct passwd *pw, char **user_env[]); +int sudo_auth_end_session(struct passwd *pw); +int sudo_auth_init(struct passwd *pw); +int sudo_auth_approval(struct passwd *pw, int validated, bool exempt); +int sudo_auth_cleanup(struct passwd *pw); + +/* set_perms.c */ +bool rewind_perms(void); +bool set_perms(int); +bool restore_perms(void); +int pam_prep_user(struct passwd *); + +/* gram.y */ +int sudoersparse(void); +extern char *login_style; +extern char *errorfile; +extern int errorlineno; +extern bool parse_error; +extern bool sudoers_warnings; + +/* toke.l */ +YY_DECL; +extern FILE *sudoersin; +extern const char *sudoers_file; +extern char *sudoers; +extern mode_t sudoers_mode; +extern uid_t sudoers_uid; +extern gid_t sudoers_gid; +extern int sudolineno; +extern int last_token; + +/* defaults.c */ +void dump_defaults(void); +void dump_auth_methods(void); + +/* getspwuid.c */ +char *sudo_getepw(const struct passwd *); + +/* pwutil.c */ +typedef struct cache_item * (*sudo_make_pwitem_t)(uid_t uid, const char *user); +typedef struct cache_item * (*sudo_make_gritem_t)(gid_t gid, const char *group); +typedef struct cache_item * (*sudo_make_gidlist_item_t)(const struct passwd *pw, char * const *gids, unsigned int type); +typedef struct cache_item * (*sudo_make_grlist_item_t)(const struct passwd *pw, char * const *groups); +__dso_public struct group *sudo_getgrgid(gid_t); +__dso_public struct group *sudo_getgrnam(const char *); +__dso_public void sudo_gr_addref(struct group *); +__dso_public void sudo_gr_delref(struct group *); +bool user_in_group(const struct passwd *, const char *); +struct group *sudo_fakegrnam(const char *); +struct gid_list *sudo_get_gidlist(const struct passwd *pw, unsigned int type); +struct group_list *sudo_get_grlist(const struct passwd *pw); +struct passwd *sudo_fakepwnam(const char *, gid_t); +struct passwd *sudo_mkpwent(const char *user, uid_t uid, gid_t gid, const char *home, const char *shell); +struct passwd *sudo_getpwnam(const char *); +struct passwd *sudo_getpwuid(uid_t); +void sudo_endspent(void); +void sudo_freegrcache(void); +void sudo_freepwcache(void); +void sudo_gidlist_addref(struct gid_list *); +void sudo_gidlist_delref(struct gid_list *); +void sudo_grlist_addref(struct group_list *); +void sudo_grlist_delref(struct group_list *); +void sudo_pw_addref(struct passwd *); +void sudo_pw_delref(struct passwd *); +int sudo_set_gidlist(struct passwd *pw, char * const *gids, unsigned int type); +int sudo_set_grlist(struct passwd *pw, char * const *groups); +void sudo_pwutil_set_backend(sudo_make_pwitem_t, sudo_make_gritem_t, sudo_make_gidlist_item_t, sudo_make_grlist_item_t); +void sudo_setspent(void); + +/* timestr.c */ +char *get_timestr(time_t, int); + +/* boottime.c */ +bool get_boottime(struct timespec *); + +/* iolog.c */ +bool io_nextid(char *iolog_dir, char *iolog_dir_fallback, char sessid[7]); +bool cb_maxseq(const union sudo_defs_val *sd_un); +bool cb_iolog_user(const union sudo_defs_val *sd_un); +bool cb_iolog_group(const union sudo_defs_val *sd_un); +bool cb_iolog_mode(const union sudo_defs_val *sd_un); +extern uid_t iolog_uid; +extern gid_t iolog_gid; + +/* iolog_path.c */ +char *expand_iolog_path(const char *prefix, const char *dir, const char *file, + char **slashp); + +/* env.c */ +char **env_get(void); +bool env_merge(char * const envp[]); +bool env_swap_old(void); +bool env_init(char * const envp[]); +bool init_envtables(void); +bool insert_env_vars(char * const envp[]); +bool read_env_file(const char *path, bool overwrite, bool restricted); +bool rebuild_env(void); +bool validate_env_vars(char * const envp[]); +int sudo_setenv(const char *var, const char *val, int overwrite); +int sudo_unsetenv(const char *var); +char *sudo_getenv(const char *name); +int sudoers_hook_getenv(const char *name, char **value, void *closure); +int sudoers_hook_putenv(char *string, void *closure); +int sudoers_hook_setenv(const char *name, const char *value, int overwrite, void *closure); +int sudoers_hook_unsetenv(const char *name, void *closure); +void register_env_file(void * (*ef_open)(const char *), void (*ef_close)(void *), char * (*ef_next)(void *, int *), bool system); + +/* env_pattern.c */ +bool matches_env_pattern(const char *pattern, const char *var, bool *full_match); + +/* sudoers.c */ +FILE *open_sudoers(const char *, bool, bool *); +int sudoers_policy_init(void *info, char * const envp[]); +int sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], bool verbose, void *closure); +void sudoers_cleanup(void); +extern struct sudo_user sudo_user; +extern struct passwd *list_pw; +extern bool force_umask; +extern int sudo_mode; +extern uid_t timestamp_uid; +extern gid_t timestamp_gid; +extern sudo_conv_t sudo_conv; +extern sudo_printf_t sudo_printf; + +/* sudoers_debug.c */ +bool sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, const char *entry); +bool sudoers_debug_register(const char *plugin_path, struct sudo_conf_debug_file_list *debug_files); +void sudoers_debug_deregister(void); + +/* policy.c */ +int sudoers_policy_deserialize_info(void *v, char **runas_user, char **runas_group); +int sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask, char *iolog_path, void *v); +extern const char *path_ldap_conf; +extern const char *path_ldap_secret; + +/* group_plugin.c */ +int group_plugin_load(char *plugin_info); +void group_plugin_unload(void); +int group_plugin_query(const char *user, const char *group, + const struct passwd *pwd); +bool cb_group_plugin(const union sudo_defs_val *sd_un); +extern const char *path_plugin_dir; + +/* editor.c */ +char *find_editor(int nfiles, char **files, int *argc_out, char ***argv_out, + char * const *whitelist, const char **env_editor, bool env_error); + +/* mkdir_parents.c */ +bool sudo_mkdir_parents(char *path, uid_t uid, gid_t gid, mode_t mode, bool quiet); + +/* gc.c */ +enum sudoers_gc_types { + GC_UNKNOWN, + GC_VECTOR, + GC_PTR +}; +bool sudoers_gc_add(enum sudoers_gc_types type, void *ptr); +bool sudoers_gc_remove(enum sudoers_gc_types type, void *ptr); +void sudoers_gc_init(void); + +/* rcstr.c */ +char *rcstr_dup(const char *src); +char *rcstr_alloc(size_t len); +char *rcstr_addref(const char *s); +void rcstr_delref(const char *s); + +#endif /* SUDOERS_SUDOERS_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers.in b/utsudo-0.0.2/plugins/sudoers/sudoers.in new file mode 100644 index 0000000..6216dfd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers.in @@ -0,0 +1,97 @@ +## sudoers file. +## +## This file MUST be edited with the 'visudo' command as root. +## Failure to use 'visudo' may result in syntax or file permission errors +## that prevent sudo from running. +## +## See the sudoers man page for the details on how to write a sudoers file. +## + +## +## Host alias specification +## +## Groups of machines. These may include host names (optionally with wildcards), +## IP addresses, network numbers or netgroups. +# Host_Alias WEBSERVERS = www1, www2, www3 + +## +## User alias specification +## +## Groups of users. These may consist of user names, uids, Unix groups, +## or netgroups. +# User_Alias ADMINS = millert, dowdy, mikef + +## +## Cmnd alias specification +## +## Groups of commands. Often used to group related commands together. +# Cmnd_Alias PROCESSES = /usr/bin/nice, /bin/kill, /usr/bin/renice, \ +# /usr/bin/pkill, /usr/bin/top +# Cmnd_Alias REBOOT = /sbin/halt, /sbin/reboot, /sbin/poweroff + +## +## Defaults specification +## +## You may wish to keep some of the following environment variables +## when running commands via sudo. +## +## Locale settings +# Defaults env_keep += "LANG LANGUAGE LINGUAS LC_* _XKB_CHARSET" +## +## Run X applications through sudo; HOME is used to find the +## .Xauthority file. Note that other programs use HOME to find +## configuration files and this may lead to privilege escalation! +# Defaults env_keep += "HOME" +## +## X11 resource path settings +# Defaults env_keep += "XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH" +## +## Desktop path settings +# Defaults env_keep += "QTDIR KDEDIR" +## +## Allow sudo-run commands to inherit the callers' ConsoleKit session +# Defaults env_keep += "XDG_SESSION_COOKIE" +## +## Uncomment to enable special input methods. Care should be taken as +## this may allow users to subvert the command being run via sudo. +# Defaults env_keep += "XMODIFIERS GTK_IM_MODULE QT_IM_MODULE QT_IM_SWITCHER" +## +## Uncomment to use a hard-coded PATH instead of the user's to find commands +# Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +## +## Uncomment to send mail if the user does not enter the correct password. +# Defaults mail_badpass +## +## Uncomment to enable logging of a command's output, except for +## sudoreplay and reboot. Use sudoreplay to play back logged sessions. +# Defaults log_output +# Defaults!/usr/bin/sudoreplay !log_output +# Defaults!/usr/local/bin/sudoreplay !log_output +# Defaults!REBOOT !log_output + +## +## Runas alias specification +## + +## +## User privilege specification +## +root ALL=(ALL) ALL + +## Uncomment to allow members of group wheel to execute any command +# %wheel ALL=(ALL) ALL + +## Same thing without a password +# %wheel ALL=(ALL) NOPASSWD: ALL + +## Uncomment to allow members of group sudo to execute any command +# %sudo ALL=(ALL) ALL + +## Uncomment to allow any user to run sudo if they know the password +## of the user they are running the command as (root by default). +# Defaults targetpw # Ask for the password of the target user +# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw' + +## Read drop-in files from @sysconfdir@/sudoers.d +## (the '#' here does not indicate a comment) +#includedir @sysconfdir@/sudoers.d diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers_debug.c b/utsudo-0.0.2/plugins/sudoers/sudoers_debug.c new file mode 100644 index 0000000..86ec413 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers_debug.c @@ -0,0 +1,164 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" + +static int sudoers_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + +static const char *const sudoers_subsystem_names[] = { + "alias", + "audit", + "auth", + "defaults", + "env", + "event", + "ldap", + "logging", + "main", + "match", + "netif", + "nss", + "parser", + "perms", + "plugin", + "rbtree", + "sssd", + "util", + NULL +}; + +#define NUM_SUBSYSTEMS (nitems(sudoers_subsystem_names) - 1) + +/* Subsystem IDs assigned at registration time. */ +unsigned int sudoers_subsystem_ids[NUM_SUBSYSTEMS]; + +/* + * Parse the "filename flags,..." debug_flags entry and insert a new + * sudo_debug_file struct into debug_files. + */ +bool +sudoers_debug_parse_flags(struct sudo_conf_debug_file_list *debug_files, + const char *entry) +{ + struct sudo_debug_file *debug_file; + const char *filename, *flags; + size_t namelen; + + /* Already initialized? */ + if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) + return true; + + /* Only process new-style debug flags: filename flags,... */ + filename = entry; + if (*filename != '/' || (flags = strpbrk(filename, " \t")) == NULL) + return true; + namelen = (size_t)(flags - filename); + while (isblank((unsigned char)*flags)) + flags++; + if (*flags != '\0') { + if ((debug_file = calloc(1, sizeof(*debug_file))) == NULL) + goto oom; + if ((debug_file->debug_file = strndup(filename, namelen)) == NULL) + goto oom; + if ((debug_file->debug_flags = strdup(flags)) == NULL) + goto oom; + TAILQ_INSERT_TAIL(debug_files, debug_file, entries); + } + return true; +oom: + if (debug_file != NULL) { + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + sudo_warnx_nodebug(U_("%s: %s"), "sudoers_debug_parse_flags", + U_("unable to allocate memory")); + return false; +} + +/* + * Register the specified debug files and program with the + * debug subsystem, freeing the debug list when done. + * Sets the active debug instance as a side effect. + */ +bool +sudoers_debug_register(const char *program, + struct sudo_conf_debug_file_list *debug_files) +{ + struct sudo_debug_file *debug_file, *debug_next; + + /* Already initialized? */ + if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) { + sudo_debug_set_active_instance(sudoers_debug_instance); + } + + /* Setup debugging if indicated. */ + if (debug_files != NULL && !TAILQ_EMPTY(debug_files)) { + if (program != NULL) { + sudoers_debug_instance = sudo_debug_register(program, + sudoers_subsystem_names, sudoers_subsystem_ids, debug_files); + if (sudoers_debug_instance == SUDO_DEBUG_INSTANCE_ERROR) + return false; + } + TAILQ_FOREACH_SAFE(debug_file, debug_files, entries, debug_next) { + TAILQ_REMOVE(debug_files, debug_file, entries); + free(debug_file->debug_file); + free(debug_file->debug_flags); + free(debug_file); + } + } + return true; +} + +/* + * Deregister sudoers_debug_instance if it is registered. + */ +void +sudoers_debug_deregister(void) +{ + debug_decl(sudoers_debug_deregister, SUDOERS_DEBUG_PLUGIN) + if (sudoers_debug_instance != SUDO_DEBUG_INSTANCE_INITIALIZER) { + sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys); + sudo_debug_deregister(sudoers_debug_instance); + sudoers_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + } +} diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers_debug.h b/utsudo-0.0.2/plugins/sudoers/sudoers_debug.h new file mode 100644 index 0000000..a3119fe --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers_debug.h @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_DEBUG_H +#define SUDOERS_DEBUG_H + +#include "sudo_debug.h" + +/* + * Sudoers debug subsystems. + * Note that sudoers_subsystem_ids[] is filled in at debug registration time. + */ +extern unsigned int sudoers_subsystem_ids[]; +#define SUDOERS_DEBUG_ALIAS (sudoers_subsystem_ids[ 0]) /* sudoers alias functions */ +#define SUDOERS_DEBUG_AUDIT (sudoers_subsystem_ids[ 1]) /* audit */ +#define SUDOERS_DEBUG_AUTH (sudoers_subsystem_ids[ 2]) /* authentication functions */ +#define SUDOERS_DEBUG_DEFAULTS (sudoers_subsystem_ids[ 3]) /* sudoers defaults settings */ +#define SUDOERS_DEBUG_ENV (sudoers_subsystem_ids[ 4]) /* environment handling */ +#define SUDOERS_DEBUG_EVENT (sudoers_subsystem_ids[ 5]) /* event handling */ +#define SUDOERS_DEBUG_LDAP (sudoers_subsystem_ids[ 6]) /* sudoers LDAP */ +#define SUDOERS_DEBUG_LOGGING (sudoers_subsystem_ids[ 7]) /* logging functions */ +#define SUDOERS_DEBUG_MAIN (sudoers_subsystem_ids[ 8]) /* main() */ +#define SUDOERS_DEBUG_MATCH (sudoers_subsystem_ids[ 9]) /* sudoers matching */ +#define SUDOERS_DEBUG_NETIF (sudoers_subsystem_ids[10]) /* network interface functions */ +#define SUDOERS_DEBUG_NSS (sudoers_subsystem_ids[11]) /* network service switch */ +#define SUDOERS_DEBUG_PARSER (sudoers_subsystem_ids[12]) /* sudoers parser */ +#define SUDOERS_DEBUG_PERMS (sudoers_subsystem_ids[13]) /* uid/gid swapping functions */ +#define SUDOERS_DEBUG_PLUGIN (sudoers_subsystem_ids[14]) /* main plugin functions */ +#define SUDOERS_DEBUG_RBTREE (sudoers_subsystem_ids[15]) /* red-black tree functions */ +#define SUDOERS_DEBUG_SSSD (sudoers_subsystem_ids[16]) /* sudoers SSSD */ +#define SUDOERS_DEBUG_UTIL (sudoers_subsystem_ids[17]) /* utility functions */ + +#endif /* SUDOERS_DEBUG_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudoers_version.h b/utsudo-0.0.2/plugins/sudoers/sudoers_version.h new file mode 100644 index 0000000..c548c77 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoers_version.h @@ -0,0 +1,77 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013, 2015, 2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Major sudoers grammar changes are documented here. + * Note that minor changes such as added Defaults options are not listed here. + * + * 1 sudo 1.1 + * 2 sudo 1.3, adds support specifying a directory instead of a command. + * 3 sudo 1.3.2, new parser, Aliases have to be upper case + * 4 sudo 1.3.2, adds User_Alias + * 5 sudo 1.3.4, netgroup support + * 6 sudo 1.3.5, support for escaping special chars + * 7 sudo 1.3.7, unix group support + * 8 sudo 1.4.1, wildcard support + * 9 sudo 1.4.2, double quote support in sudoers command line args + * 10 sudo 1.4.3, added NOPASSWD tag + * 11 sudo 1.4.3, added Runas_Spec + * 12 sudo 1.4.3, wildcards may be used in the pathname + * 13 sudo 1.4.3, command args of "" means no args allowed + * 14 sudo 1.4.4, '(' in command args no longer are a syntax error. + * 15 sudo 1.4.4, '!command' works in the presence of runas user or NOPASSWD. + * 16 sudo 1.4.4, all-caps user and host names are now handled properly. + * 17 sudo 1.5.0, usernames may now begin with a digit + * 18 sudo 1.5.3, adds Runas_Alias + * 19 sudo 1.5.7, %group may be used in a Runas_List + * 20 sudo 1.6.0, The runas user and NOPASSWD tags are now persistent across entries in a command list. A PASSWD tag has been added to reverse NOPASSWD + * 21 sudo 1.6.0, The '!' operator can be used in a Runas_Spec or an *_Alias + * 22 sudo 1.6.0, a list of hosts may be used in a Host_Spec + * 23 sudo 1.6.0, a list of users may be used in a User_Spec + * 24 sudo 1.6.0, It is now possible to escape "special" characters in usernames, hostnames, etc with a backslash. + * 25 sudo 1.6.0, Added Defaults run-time settings in sudoers. + * 26 sudo 1.6.0, relaxed the regexp for matching user, host, group names. + * 27 sudo 1.6.1, #uid is now allowed in a Runas_Alias. + * 28 sudo 1.6.2, Wildcards are now allowed in hostnames. + * 29 sudo 1.6.3p7, escaped special characters may be included in pathnames. + * 30 sudo 1.6.8, added NOEXEC and EXEC tags. + * 31 sudo 1.6.9, added SETENV and NOSETENV tags. + * 32 sudo 1.6.9p4, support for IPv6 address matching. + * 33 sudo 1.7.0, #include support. + * 34 sudo 1.7.0, Runas_Group support. + * 35 sudo 1.7.0, uid may now be used anywhere a username is valid. + * 36 sudo 1.7.2, #includedir support. + * 37 sudo 1.7.4, per-command Defaults support. + * 38 sudo 1.7.4, added LOG_INPUT/LOG_OUTPUT and NOLOG_INPUT/NOLOG_OUTPUT tags + * 39 sudo 1.7.6/1.8.1, White space is now permitted within a User_List in a per-user Defaults definition. + * 40 sudo 1.7.6/1.8.1, A group ID is now allowed in a User_List or Runas_List. + * 41 sudo 1.7.6/1.8.4, Support for relative paths in #include and #includedir + * 42 sudo 1.8.6, Support for empty Runas_List (with or without a colon) to mean the invoking user. Support for Solaris Privilege Sets (PRIVS= and LIMITPRIVS=). + * 43 sudo 1.8.7, Support for specifying a digest along with the command. + * 44 sudo 1.8.13, added MAIL/NOMAIL tags. + * 45 sudo 1.8.15, added FOLLOW/NOFOLLOW tags as well as sudoedit_follow and sudoedit_checkdir Defaults. + * 46 sudo 1.8.20, added TIMEOUT, NOTBEFORE and NOTAFTER options. + */ + +#ifndef SUDOERS_VERSION_H +#define SUDOERS_VERSION_H + +#define SUDOERS_GRAMMAR_VERSION 46 + +#endif /* SUDOERS_VERSION_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/sudoreplay.c b/utsudo-0.0.2/plugins/sudoers/sudoreplay.c new file mode 100644 index 0000000..5c2e0d2 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/sudoreplay.c @@ -0,0 +1,1647 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include + +#include + +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "logging.h" +#include "iolog.h" +#include "iolog_files.h" +#include "sudo_queue.h" +#include "sudo_plugin.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_event.h" +#include "sudo_util.h" + +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +struct replay_closure { + struct sudo_event_base *evbase; + struct sudo_event *delay_ev; + struct sudo_event *keyboard_ev; + struct sudo_event *output_ev; + struct sudo_event *sighup_ev; + struct sudo_event *sigint_ev; + struct sudo_event *sigquit_ev; + struct sudo_event *sigterm_ev; + struct sudo_event *sigtstp_ev; + struct timing_closure timing; + bool interactive; + bool suspend_wait; + struct io_buffer { + unsigned int len; /* buffer length (how much produced) */ + unsigned int off; /* write position (how much already consumed) */ + unsigned int toread; /* how much remains to be read */ + int lastc; /* last char written */ + char buf[64 * 1024]; + } iobuf; +}; + +/* + * Handle expressions like: + * ( user millert or user root ) and tty console and command /bin/sh + */ +STAILQ_HEAD(search_node_list, search_node); +struct search_node { + STAILQ_ENTRY(search_node) entries; +#define ST_EXPR 1 +#define ST_TTY 2 +#define ST_USER 3 +#define ST_PATTERN 4 +#define ST_RUNASUSER 5 +#define ST_RUNASGROUP 6 +#define ST_FROMDATE 7 +#define ST_TODATE 8 +#define ST_CWD 9 + char type; + bool negated; + bool or; + union { + regex_t cmdre; + time_t tstamp; + char *cwd; + char *tty; + char *user; + char *runas_group; + char *runas_user; + struct search_node_list expr; + void *ptr; + } u; +}; + +static struct search_node_list search_expr = STAILQ_HEAD_INITIALIZER(search_expr); + +static double speed_factor = 1.0; + +static const char *session_dir = _PATH_SUDO_IO_LOGDIR; + +static bool terminal_can_resize, terminal_was_resized; + +static int terminal_rows, terminal_cols; + +static int ttyfd = -1; + +static const char short_opts[] = "d:f:hlm:nRSs:V"; +static struct option long_opts[] = { + { "directory", required_argument, NULL, 'd' }, + { "filter", required_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "list", no_argument, NULL, 'l' }, + { "max-wait", required_argument, NULL, 'm' }, + { "non-interactive", no_argument, NULL, 'n' }, + { "no-resize", no_argument, NULL, 'R' }, + { "suspend-wait", no_argument, NULL, 'S' }, + { "speed", required_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +/* XXX move to separate header? (currently in sudoers.h) */ +extern char *get_timestr(time_t, int); +extern time_t get_date(char *); + +static int list_sessions(int, char **, const char *, const char *, const char *); +static int open_io_fd(char *path, int len, struct io_log_file *iol); +static int parse_expr(struct search_node_list *, char **, bool); +static void read_keyboard(int fd, int what, void *v); +static void help(void) __attribute__((__noreturn__)); +static int replay_session(struct timespec *max_wait, const char *decimal, bool interactive, bool suspend_wait); +static void sudoreplay_cleanup(void); +static void usage(int); +static void write_output(int fd, int what, void *v); +static void restore_terminal_size(void); +static void setup_terminal(struct log_info *li, bool interactive, bool resize); + +#define VALID_ID(s) (isalnum((unsigned char)(s)[0]) && \ + isalnum((unsigned char)(s)[1]) && isalnum((unsigned char)(s)[2]) && \ + isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \ + isalnum((unsigned char)(s)[5]) && (s)[6] == '\0') + +#define IS_IDLOG(s) ( \ + isalnum((unsigned char)(s)[0]) && isalnum((unsigned char)(s)[1]) && \ + (s)[2] == '/' && \ + isalnum((unsigned char)(s)[3]) && isalnum((unsigned char)(s)[4]) && \ + (s)[5] == '/' && \ + isalnum((unsigned char)(s)[6]) && isalnum((unsigned char)(s)[7]) && \ + (s)[8] == '/' && (s)[9] == 'l' && (s)[10] == 'o' && (s)[11] == 'g' && \ + (s)[12] == '\0') + +__dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + int ch, i, plen, exitcode = 0; + bool def_filter = true, listonly = false; + bool interactive = true, suspend_wait = false, resize = true; + const char *decimal, *id, *user = NULL, *pattern = NULL, *tty = NULL; + char *cp, *ep, path[PATH_MAX]; + struct log_info *li; + struct timespec max_delay_storage, *max_delay = NULL; + double dval; + debug_decl(main, SUDO_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "sudoreplay"); + setlocale(LC_ALL, ""); + decimal = localeconv()->decimal_point; + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have sudoreplay domain */ + textdomain("sudoers"); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(sudoreplay_cleanup); + + /* Read sudo.conf and initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudo_debug_register(getprogname(), NULL, NULL, + sudo_conf_debug_files(getprogname())); + + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'd': + session_dir = optarg; + break; + case 'f': + /* Set the replay filter. */ + def_filter = false; + for (cp = strtok_r(optarg, ",", &ep); cp; cp = strtok_r(NULL, ",", &ep)) { + if (strcmp(cp, "stdin") == 0) + io_log_files[IOFD_STDIN].enabled = true; + else if (strcmp(cp, "stdout") == 0) + io_log_files[IOFD_STDOUT].enabled = true; + else if (strcmp(cp, "stderr") == 0) + io_log_files[IOFD_STDERR].enabled = true; + else if (strcmp(cp, "ttyin") == 0) + io_log_files[IOFD_TTYIN].enabled = true; + else if (strcmp(cp, "ttyout") == 0) + io_log_files[IOFD_TTYOUT].enabled = true; + else + sudo_fatalx(U_("invalid filter option: %s"), optarg); + } + break; + case 'h': + help(); + /* NOTREACHED */ + case 'l': + listonly = true; + break; + case 'm': + errno = 0; + dval = strtod(optarg, &ep); + if (*ep != '\0' || errno != 0) + sudo_fatalx(U_("invalid max wait: %s"), optarg); + if (dval <= 0.0) { + sudo_timespecclear(&max_delay_storage); + } else { + max_delay_storage.tv_sec = dval; + max_delay_storage.tv_nsec = + (dval - max_delay_storage.tv_sec) * 1000000000.0; + } + max_delay = &max_delay_storage; + break; + case 'n': + interactive = false; + break; + case 'R': + resize = false; + break; + case 'S': + suspend_wait = true; + break; + case 's': + errno = 0; + speed_factor = strtod(optarg, &ep); + if (*ep != '\0' || errno != 0) + sudo_fatalx(U_("invalid speed factor: %s"), optarg); + break; + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), PACKAGE_VERSION); + goto done; + default: + usage(1); + /* NOTREACHED */ + } + + } + argc -= optind; + argv += optind; + + if (listonly) { + exitcode = list_sessions(argc, argv, pattern, user, tty); + goto done; + } + + if (argc != 1) + usage(1); + + /* By default we replay stdout, stderr and ttyout. */ + if (def_filter) { + io_log_files[IOFD_STDOUT].enabled = true; + io_log_files[IOFD_STDERR].enabled = true; + io_log_files[IOFD_TTYOUT].enabled = true; + } + + /* 6 digit ID in base 36, e.g. 01G712AB or free-form name */ + id = argv[0]; + if (VALID_ID(id)) { + plen = snprintf(path, sizeof(path), "%s/%.2s/%.2s/%.2s/timing", + session_dir, id, &id[2], &id[4]); + if (plen < 0 || plen >= ssizeof(path)) + sudo_fatalx(U_("%s/%.2s/%.2s/%.2s/timing: %s"), session_dir, + id, &id[2], &id[4], strerror(ENAMETOOLONG)); + } else if (id[0] == '/') { + plen = snprintf(path, sizeof(path), "%s/timing", id); + if (plen < 0 || plen >= ssizeof(path)) + sudo_fatalx(U_("%s/timing: %s"), id, strerror(ENAMETOOLONG)); + } else { + plen = snprintf(path, sizeof(path), "%s/%s/timing", session_dir, id); + if (plen < 0 || plen >= ssizeof(path)) + sudo_fatalx(U_("%s/%s/timing: %s"), session_dir, id, + strerror(ENAMETOOLONG)); + } + plen -= 7; + + /* Open files for replay, applying replay filter for the -f flag. */ + for (i = 0; i < IOFD_MAX; i++) { + if (open_io_fd(path, plen, &io_log_files[i]) == -1) + sudo_fatal(U_("unable to open %s"), path); + } + + /* Parse log file. */ + path[plen] = '\0'; + strlcat(path, "/log", sizeof(path)); + if ((li = parse_logfile(path)) == NULL) + exit(1); + printf(_("Replaying sudo session: %s"), li->cmd); + + /* Setup terminal if appropriate. */ + if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO)) + interactive = false; + setup_terminal(li, interactive, resize); + putchar('\r'); + putchar('\n'); + + /* Done with parsed log file. */ + free_log_info(li); + li = NULL; + + /* Replay session corresponding to io_log_files[]. */ + exitcode = replay_session(max_delay, decimal, interactive, suspend_wait); + + restore_terminal_size(); + sudo_term_restore(ttyfd, true); +done: + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); +} + +/* + * Call gzread() or fread() for the I/O log file in question. + * Return 0 for EOF or -1 on error. + */ +static ssize_t +io_log_read(union io_fd ifd, char *buf, size_t nbytes) +{ + ssize_t nread; + debug_decl(io_log_read, SUDO_DEBUG_UTIL) + + if (nbytes > INT_MAX) { + errno = EINVAL; + debug_return_ssize_t(-1); + } +#ifdef HAVE_ZLIB_H + nread = gzread(ifd.g, buf, nbytes); +#else + nread = (ssize_t)fread(buf, 1, nbytes, ifd.f); + if (nread == 0 && ferror(ifd.f)) + nread = -1; +#endif + debug_return_ssize_t(nread); +} + +static int +io_log_eof(union io_fd ifd) +{ + int ret; + debug_decl(io_log_eof, SUDO_DEBUG_UTIL) + +#ifdef HAVE_ZLIB_H + ret = gzeof(ifd.g); +#else + ret = feof(ifd.f); +#endif + debug_return_int(ret); +} + +static char * +io_log_gets(union io_fd ifd, char *buf, size_t nbytes) +{ + char *str; + debug_decl(io_log_gets, SUDO_DEBUG_UTIL) + +#ifdef HAVE_ZLIB_H + str = gzgets(ifd.g, buf, nbytes); +#else + str = fgets(buf, nbytes, ifd.f); +#endif + debug_return_str(str); +} + +/* + * List of terminals that support xterm-like resizing. + * This is not an exhaustive list. + * For a list of VT100 style escape codes, see: + * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#VT100%20Mode + */ +struct term_names { + const char *name; + unsigned int len; +} compatible_terms[] = { + { "Eterm", 5 }, + { "aterm", 5 }, + { "dtterm", 6 }, + { "gnome", 5 }, + { "konsole", 7 }, + { "kvt\0", 4 }, + { "mlterm", 6 }, + { "rxvt", 4 }, + { "xterm", 5 }, + { NULL, 0 } +}; + +struct getsize_closure { + int nums[2]; + int nums_depth; + int nums_maxdepth; + int state; + const char *cp; + struct sudo_event *ev; + struct timespec timeout; +}; + +/* getsize states */ +#define INITIAL 0x00 +#define NEW_NUMBER 0x01 +#define NUMBER 0x02 +#define GOTSIZE 0x04 +#define READCHAR 0x10 + +/* + * Callback for reading the terminal size response. + * We use an event for this to support timeouts. + */ +static void +getsize_cb(int fd, int what, void *v) +{ + struct getsize_closure *gc = v; + unsigned char ch = '\0'; + debug_decl(getsize_cb, SUDO_DEBUG_UTIL) + + for (;;) { + if (gc->cp[0] == '\0') { + gc->state = GOTSIZE; + goto done; + } + if (ISSET(gc->state, READCHAR)) { + ssize_t nread = read(ttyfd, &ch, 1); + switch (nread) { + case -1: + if (errno == EAGAIN) + goto another; + /* FALLTHROUGH */ + case 0: + goto done; + default: + CLR(gc->state, READCHAR); + break; + } + } + switch (gc->state) { + case INITIAL: + if (ch == 0233 && gc->cp[0] == '\033') { + /* meta escape, equivalent to ESC[ */ + ch = '['; + gc->cp++; + } + if (gc->cp[0] == '%' && gc->cp[1] == 'd') { + gc->state = NEW_NUMBER; + continue; + } + if (gc->cp[0] != ch) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "got %d, expected %d", ch, gc->cp[0]); + goto done; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "got %d", ch); + SET(gc->state, READCHAR); + gc->cp++; + break; + case NEW_NUMBER: + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "parsing number"); + if (!isdigit(ch)) + goto done; + gc->cp += 2; + if (gc->nums_depth > gc->nums_maxdepth) + goto done; + gc->nums[gc->nums_depth] = 0; + gc->state = NUMBER; + /* FALLTHROUGH */ + case NUMBER: + if (!isdigit(ch)) { + /* done with number, reparse ch */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "number %d (ch %d)", gc->nums[gc->nums_depth], ch); + gc->nums_depth++; + gc->state = INITIAL; + continue; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "got %d", ch); + if (gc->nums[gc->nums_depth] > INT_MAX / 10) + goto done; + gc->nums[gc->nums_depth] *= 10; + gc->nums[gc->nums_depth] += (ch - '0'); + SET(gc->state, READCHAR); + break; + } + } + +another: + if (sudo_ev_add(NULL, gc->ev, &gc->timeout, false) == -1) + sudo_fatal(U_("unable to add event to queue")); +done: + debug_return; +} + + +/* + * Get the terminal size using vt100 terminal escapes. + */ +static bool +xterm_get_size(int *new_rows, int *new_cols) +{ + struct sudo_event_base *evbase; + struct getsize_closure gc; + const char getsize_request[] = "\0337\033[r\033[999;999H\033[6n"; + const char getsize_response[] = "\033[%d;%dR"; + bool ret = false; + debug_decl(xterm_get_size, SUDO_DEBUG_UTIL) + + /* request the terminal's size */ + if (write(ttyfd, getsize_request, strlen(getsize_request)) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "%s: error writing xterm size request", __func__); + goto done; + } + + /* + * Callback info for reading back the size with a 10 second timeout. + * We expect two numbers (rows and cols). + */ + gc.state = INITIAL|READCHAR; + gc.nums_depth = 0; + gc.nums_maxdepth = 1; + gc.cp = getsize_response; + gc.timeout.tv_sec = 10; + gc.timeout.tv_nsec = 0; + + /* Setup an event for reading the terminal size */ + evbase = sudo_ev_base_alloc(); + if (evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + gc.ev = sudo_ev_alloc(ttyfd, SUDO_EV_READ, getsize_cb, &gc); + if (gc.ev == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Read back terminal size response */ + if (sudo_ev_add(evbase, gc.ev, &gc.timeout, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + sudo_ev_dispatch(evbase); + + if (gc.state == GOTSIZE) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "terminal size %d x %x", gc.nums[0], gc.nums[1]); + *new_rows = gc.nums[0]; + *new_cols = gc.nums[1]; + ret = true; + } + + sudo_ev_base_free(evbase); + sudo_ev_free(gc.ev); + +done: + debug_return_bool(ret); +} + +/* + * Set the size of the text area to rows and cols. + * Depending on the terminal implementation, the window itself may + * or may not shrink to a smaller size. + */ +static bool +xterm_set_size(int rows, int cols) +{ + const char setsize_fmt[] = "\033[8;%d;%dt"; + int len, new_rows, new_cols; + bool ret = false; + char buf[1024]; + debug_decl(xterm_set_size, SUDO_DEBUG_UTIL) + + /* XXX - save cursor and position restore after resizing */ + len = snprintf(buf, sizeof(buf), setsize_fmt, rows, cols); + if (len < 0 || len >= ssizeof(buf)) { + /* not possible due to size of buf */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: internal error, buffer too small?", __func__); + goto done; + } + if (write(ttyfd, buf, strlen(buf)) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "%s: error writing xterm resize request", __func__); + goto done; + } + /* XXX - keyboard input will interfere with this */ + if (!xterm_get_size(&new_rows, &new_cols)) + goto done; + if (rows == new_rows && cols == new_cols) + ret = true; + +done: + debug_return_bool(ret); +} + +static void +setup_terminal(struct log_info *li, bool interactive, bool resize) +{ + const char *term; + debug_decl(check_terminal, SUDO_DEBUG_UTIL) + + fflush(stdout); + + /* Open fd for /dev/tty and set to raw mode. */ + if (interactive) { + ttyfd = open(_PATH_TTY, O_RDWR); + while (!sudo_term_raw(ttyfd, 1)) { + if (errno != EINTR) + sudo_fatal(U_("unable to set tty to raw mode")); + kill(getpid(), SIGTTOU); + } + } + + /* Find terminal size if the session has size info. */ + if (li->rows == 0 && li->cols == 0) { + /* no tty size info, hope for the best... */ + debug_return; + } + + if (resize && ttyfd != -1) { + term = getenv("TERM"); + if (term != NULL && *term != '\0') { + struct term_names *tn; + + for (tn = compatible_terms; tn->name != NULL; tn++) { + if (strncmp(term, tn->name, tn->len) == 0) { + /* xterm-like terminals can resize themselves. */ + if (xterm_get_size(&terminal_rows, &terminal_cols)) + terminal_can_resize = true; + break; + } + } + } + } + + if (!terminal_can_resize) { + /* either not xterm or not interactive */ + sudo_get_ttysize(&terminal_rows, &terminal_cols); + } + + if (li->rows == terminal_rows && li->cols == terminal_cols) { + /* nothing to change */ + debug_return; + } + + if (terminal_can_resize) { + /* session terminal size is different, try to resize ours */ + if (xterm_set_size(li->rows, li->cols)) { + /* success */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "resized terminal to %d x %x", li->rows, li->cols); + terminal_was_resized = true; + debug_return; + } + /* resize failed, don't try again */ + terminal_can_resize = false; + } + + if (li->rows > terminal_rows || li->cols > terminal_cols) { + fputs(_("Warning: your terminal is too small to properly replay the log.\n"), stdout); + printf(_("Log geometry is %d x %d, your terminal's geometry is %d x %d."), li->rows, li->cols, terminal_rows, terminal_cols); + } + debug_return; +} + +static void +resize_terminal(int rows, int cols) +{ + debug_decl(resize_terminal, SUDO_DEBUG_UTIL) + + if (terminal_can_resize) { + if (xterm_set_size(rows, cols)) + terminal_was_resized = true; + else + terminal_can_resize = false; + } + + debug_return; +} + +static void +restore_terminal_size(void) +{ + debug_decl(restore_terminal, SUDO_DEBUG_UTIL) + + if (terminal_was_resized) { + /* We are still in raw mode, hence the carriage return. */ + putchar('\r'); + fputs(U_("Replay finished, press any key to restore the terminal."), + stdout); + fflush(stdout); + (void)getchar(); + xterm_set_size(terminal_rows, terminal_cols); + putchar('\r'); + putchar('\n'); + } + + debug_return; +} + +/* + * Read the next record from the timing file and schedule a delay + * event with the specified timeout. + * Return 0 on success, 1 on EOF and -1 on error. + */ +static int +read_timing_record(struct replay_closure *closure) +{ + struct timespec timeout; + char buf[LINE_MAX]; + debug_decl(read_timing_record, SUDO_DEBUG_UTIL) + + /* Read next record from timing file. */ + if (io_log_gets(io_log_files[IOFD_TIMING].fd, buf, sizeof(buf)) == NULL) { + /* EOF or error reading timing file, we are done. */ + debug_return_int(io_log_eof(io_log_files[IOFD_TIMING].fd) ? 1 : -1); + } + + /* Parse timing file record. */ + buf[strcspn(buf, "\n")] = '\0'; + if (!parse_timing(buf, &timeout, &closure->timing)) + sudo_fatalx(U_("invalid timing file line: %s"), buf); + + /* Record number bytes to read. */ + /* XXX - remove timing->nbytes? */ + if (closure->timing.event != IO_EVENT_WINSIZE && + closure->timing.event != IO_EVENT_SUSPEND) { + closure->iobuf.len = 0; + closure->iobuf.off = 0; + closure->iobuf.lastc = '\0'; + closure->iobuf.toread = closure->timing.u.nbytes; + } + + /* Adjust delay using speed factor and max_delay. */ + adjust_delay(&timeout, closure->timing.max_delay, speed_factor); + + /* Schedule the delay event. */ + if (sudo_ev_add(closure->evbase, closure->delay_ev, &timeout, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + debug_return_int(0); +} + +/* + * Read next timing record. + * Exits the event loop on EOF, breaks out on error. + */ +static void +next_timing_record(struct replay_closure *closure) +{ + debug_decl(next_timing_record, SUDO_DEBUG_UTIL) + +again: + switch (read_timing_record(closure)) { + case 0: + /* success */ + if (closure->timing.event == IO_EVENT_SUSPEND && + closure->timing.u.signo == SIGCONT && !closure->suspend_wait) { + /* Ignore time spent suspended. */ + goto again; + } + break; + case 1: + /* EOF */ + sudo_ev_loopexit(closure->evbase); + break; + default: + /* error */ + sudo_ev_loopbreak(closure->evbase); + break; + } + debug_return; +} + +static bool +fill_iobuf(struct replay_closure *closure) +{ + const size_t space = sizeof(closure->iobuf.buf) - closure->iobuf.len; + const struct timing_closure *timing = &closure->timing; + debug_decl(fill_iobuf, SUDO_DEBUG_UTIL) + + if (closure->iobuf.toread != 0 && space != 0) { + const size_t len = + closure->iobuf.toread < space ? closure->iobuf.toread : space; + ssize_t nread = io_log_read(timing->fd, + closure->iobuf.buf + closure->iobuf.off, len); + if (nread <= 0) { + if (nread == 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: premature EOF, expected %u bytes", + io_log_files[timing->event].suffix, closure->iobuf.toread); + } else { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "%s: read error", io_log_files[timing->event].suffix); + } + sudo_warnx(U_("unable to read %s"), + io_log_files[timing->event].suffix); + debug_return_bool(false); + } + closure->iobuf.toread -= nread; + closure->iobuf.len += nread; + } + + debug_return_bool(true); +} + +/* + * Called when the inter-record delay has expired. + * Depending on the record type, either reads the next + * record or changes window size. + */ +static void +delay_cb(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + struct timing_closure *timing = &closure->timing; + debug_decl(delay_cb, SUDO_DEBUG_UTIL) + + switch (timing->event) { + case IO_EVENT_WINSIZE: + resize_terminal(timing->u.winsize.rows, timing->u.winsize.cols); + break; + case IO_EVENT_STDIN: + if (io_log_files[IOFD_STDIN].enabled) + timing->fd = io_log_files[IOFD_STDIN].fd; + break; + case IO_EVENT_STDOUT: + if (io_log_files[IOFD_STDOUT].enabled) + timing->fd = io_log_files[IOFD_STDOUT].fd; + break; + case IO_EVENT_STDERR: + if (io_log_files[IOFD_STDERR].enabled) + timing->fd = io_log_files[IOFD_STDERR].fd; + break; + case IO_EVENT_TTYIN: + if (io_log_files[IOFD_TTYIN].enabled) + timing->fd = io_log_files[IOFD_TTYIN].fd; + break; + case IO_EVENT_TTYOUT: + if (io_log_files[IOFD_TTYOUT].enabled) + timing->fd = io_log_files[IOFD_TTYOUT].fd; + break; + } + + if (timing->fd.v != NULL) { + /* If the stream is open, enable the write event. */ + if (sudo_ev_add(closure->evbase, closure->output_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } else { + /* Not replaying, get the next timing record and continue. */ + next_timing_record(closure); + } + + debug_return; +} + +static void +replay_closure_free(struct replay_closure *closure) +{ + /* + * Free events and event base, then the closure itself. + */ + sudo_ev_free(closure->delay_ev); + sudo_ev_free(closure->keyboard_ev); + sudo_ev_free(closure->output_ev); + sudo_ev_free(closure->sighup_ev); + sudo_ev_free(closure->sigint_ev); + sudo_ev_free(closure->sigquit_ev); + sudo_ev_free(closure->sigterm_ev); + sudo_ev_free(closure->sigtstp_ev); + sudo_ev_base_free(closure->evbase); + free(closure); +} + +static void +signal_cb(int signo, int what, void *v) +{ + struct replay_closure *closure = v; + debug_decl(signal_cb, SUDO_DEBUG_UTIL) + + switch (signo) { + case SIGHUP: + case SIGINT: + case SIGQUIT: + case SIGTERM: + /* Free the event base and restore signal handlers. */ + replay_closure_free(closure); + + /* Restore the terminal and die. */ + sudoreplay_cleanup(); + kill(getpid(), signo); + break; + case SIGTSTP: + /* Ignore ^Z since we have no way to restore the screen. */ + break; + } + + debug_return; +} + +static struct replay_closure * +replay_closure_alloc(struct timespec *max_delay, const char *decimal, + bool interactive, bool suspend_wait) +{ + struct replay_closure *closure; + debug_decl(replay_closure_alloc, SUDO_DEBUG_UTIL) + + if ((closure = calloc(1, sizeof(*closure))) == NULL) + debug_return_ptr(NULL); + + closure->interactive = interactive; + closure->suspend_wait = suspend_wait; + closure->timing.max_delay = max_delay; + closure->timing.decimal = decimal; + + /* + * Setup event base and delay, input and output events. + * If interactive, take input from and write to /dev/tty. + * If not interactive there is no input event. + */ + closure->evbase = sudo_ev_base_alloc(); + if (closure->evbase == NULL) + goto bad; + closure->delay_ev = sudo_ev_alloc(-1, SUDO_EV_TIMEOUT, delay_cb, closure); + if (closure->delay_ev == NULL) + goto bad; + if (interactive) { + closure->keyboard_ev = sudo_ev_alloc(ttyfd, SUDO_EV_READ|SUDO_EV_PERSIST, + read_keyboard, closure); + if (closure->keyboard_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->keyboard_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + closure->output_ev = sudo_ev_alloc(interactive ? ttyfd : STDOUT_FILENO, + SUDO_EV_WRITE, write_output, closure); + if (closure->output_ev == NULL) + goto bad; + + /* + * Setup signal events, we need to restore the terminal if killed. + */ + closure->sighup_ev = sudo_ev_alloc(SIGHUP, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sighup_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sighup_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + closure->sigint_ev = sudo_ev_alloc(SIGINT, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigint_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigint_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + closure->sigquit_ev = sudo_ev_alloc(SIGQUIT, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigquit_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigquit_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + closure->sigterm_ev = sudo_ev_alloc(SIGTERM, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigterm_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigterm_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + closure->sigtstp_ev = sudo_ev_alloc(SIGTSTP, SUDO_EV_SIGNAL, signal_cb, + closure); + if (closure->sigtstp_ev == NULL) + goto bad; + if (sudo_ev_add(closure->evbase, closure->sigtstp_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + debug_return_ptr(closure); +bad: + replay_closure_free(closure); + debug_return_ptr(NULL); +} + +static int +replay_session(struct timespec *max_delay, const char *decimal, + bool interactive, bool suspend_wait) +{ + struct replay_closure *closure; + int ret = 0; + debug_decl(replay_session, SUDO_DEBUG_UTIL) + + /* Allocate the delay closure and read the first timing record. */ + closure = replay_closure_alloc(max_delay, decimal, interactive, + suspend_wait); + if (read_timing_record(closure) != 0) { + ret = 1; + goto done; + } + + /* Run event loop. */ + sudo_ev_dispatch(closure->evbase); + if (sudo_ev_got_break(closure->evbase)) + ret = 1; + +done: + /* Clean up and return. */ + replay_closure_free(closure); + debug_return_int(ret); +} + +static int +open_io_fd(char *path, int len, struct io_log_file *iol) +{ + debug_decl(open_io_fd, SUDO_DEBUG_UTIL) + + if (!iol->enabled) + debug_return_int(0); + + path[len] = '\0'; + strlcat(path, iol->suffix, PATH_MAX); +#ifdef HAVE_ZLIB_H + iol->fd.g = gzopen(path, "r"); +#else + iol->fd.f = fopen(path, "r"); +#endif + if (iol->fd.v == NULL) { + iol->enabled = false; + debug_return_int(-1); + } + debug_return_int(0); +} + +/* + * Write the I/O buffer. + */ +static void +write_output(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + const struct timing_closure *timing = &closure->timing; + struct io_buffer *iobuf = &closure->iobuf; + unsigned iovcnt = 1; + struct iovec iov[2]; + bool added_cr = false; + size_t nbytes, nwritten; + debug_decl(write_output, SUDO_DEBUG_UTIL) + + /* Refill iobuf if there is more to read and buf is empty. */ + if (!fill_iobuf(closure)) { + sudo_ev_loopbreak(closure->evbase); + debug_return; + } + + nbytes = iobuf->len - iobuf->off; + iov[0].iov_base = iobuf->buf + iobuf->off; + iov[0].iov_len = nbytes; + + if (closure->interactive && + (timing->event == IO_EVENT_STDOUT || timing->event == IO_EVENT_STDERR)) { + char *nl; + + /* + * We may need to insert a carriage return before the newline. + * Note that the carriage return may have already been written. + */ + nl = memchr(iov[0].iov_base, '\n', iov[0].iov_len); + if (nl != NULL) { + size_t len = (size_t)(nl - (char *)iov[0].iov_base); + if ((nl == iov[0].iov_base && iobuf->lastc != '\r') || + (nl != iov[0].iov_base && nl[-1] != '\r')) { + iov[0].iov_len = len; + iov[1].iov_base = "\r\n"; + iov[1].iov_len = 2; + iovcnt = 2; + nbytes = iov[0].iov_len + iov[1].iov_len; + added_cr = true; + } + } + } + + nwritten = writev(fd, iov, iovcnt); + switch ((ssize_t)nwritten) { + case -1: + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to write to %s"), "stdout"); + break; + case 0: + /* Should not happen. */ + break; + default: + if (added_cr && nwritten >= nbytes - 1) { + /* The last char written was either '\r' or '\n'. */ + iobuf->lastc = nwritten == nbytes ? '\n' : '\r'; + } else { + /* Stash the last char written. */ + iobuf->lastc = *((char *)iov[0].iov_base + nwritten); + } + if (added_cr) { + /* Subtract one for the carriage return we added above. */ + nwritten--; + } + iobuf->off += nwritten; + break; + } + + if (iobuf->off == iobuf->len) { + /* Write complete, go to next timing entry if possible. */ + switch (read_timing_record(closure)) { + case 0: + /* success */ + break; + case 1: + /* EOF */ + sudo_ev_loopexit(closure->evbase); + break; + default: + /* error */ + sudo_ev_loopbreak(closure->evbase); + break; + } + } else { + /* Reschedule event to write remainder. */ + if (sudo_ev_add(NULL, closure->output_ev, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + debug_return; +} + +/* + * Build expression list from search args + */ +static int +parse_expr(struct search_node_list *head, char *argv[], bool sub_expr) +{ + bool or = false, not = false; + struct search_node *sn; + char type, **av; + debug_decl(parse_expr, SUDO_DEBUG_UTIL) + + for (av = argv; *av != NULL; av++) { + switch (av[0][0]) { + case 'a': /* and (ignore) */ + if (strncmp(*av, "and", strlen(*av)) != 0) + goto bad; + continue; + case 'o': /* or */ + if (strncmp(*av, "or", strlen(*av)) != 0) + goto bad; + or = true; + continue; + case '!': /* negate */ + if (av[0][1] != '\0') + goto bad; + not = true; + continue; + case 'c': /* cwd or command */ + if (av[0][1] == '\0') + sudo_fatalx(U_("ambiguous expression \"%s\""), *av); + if (strncmp(*av, "cwd", strlen(*av)) == 0) + type = ST_CWD; + else if (strncmp(*av, "command", strlen(*av)) == 0) + type = ST_PATTERN; + else + goto bad; + break; + case 'f': /* from date */ + if (strncmp(*av, "fromdate", strlen(*av)) != 0) + goto bad; + type = ST_FROMDATE; + break; + case 'g': /* runas group */ + if (strncmp(*av, "group", strlen(*av)) != 0) + goto bad; + type = ST_RUNASGROUP; + break; + case 'r': /* runas user */ + if (strncmp(*av, "runas", strlen(*av)) != 0) + goto bad; + type = ST_RUNASUSER; + break; + case 't': /* tty or to date */ + if (av[0][1] == '\0') + sudo_fatalx(U_("ambiguous expression \"%s\""), *av); + if (strncmp(*av, "todate", strlen(*av)) == 0) + type = ST_TODATE; + else if (strncmp(*av, "tty", strlen(*av)) == 0) + type = ST_TTY; + else + goto bad; + break; + case 'u': /* user */ + if (strncmp(*av, "user", strlen(*av)) != 0) + goto bad; + type = ST_USER; + break; + case '(': /* start sub-expression */ + if (av[0][1] != '\0') + goto bad; + type = ST_EXPR; + break; + case ')': /* end sub-expression */ + if (av[0][1] != '\0') + goto bad; + if (!sub_expr) + sudo_fatalx(U_("unmatched ')' in expression")); + debug_return_int(av - argv + 1); + default: + bad: + sudo_fatalx(U_("unknown search term \"%s\""), *av); + /* NOTREACHED */ + } + + /* Allocate new search node */ + if ((sn = calloc(1, sizeof(*sn))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sn->type = type; + sn->or = or; + sn->negated = not; + if (type == ST_EXPR) { + STAILQ_INIT(&sn->u.expr); + av += parse_expr(&sn->u.expr, av + 1, true); + } else { + if (*(++av) == NULL) + sudo_fatalx(U_("%s requires an argument"), av[-1]); + if (type == ST_PATTERN) { + if (regcomp(&sn->u.cmdre, *av, REG_EXTENDED|REG_NOSUB) != 0) + sudo_fatalx(U_("invalid regular expression: %s"), *av); + } else if (type == ST_TODATE || type == ST_FROMDATE) { + sn->u.tstamp = get_date(*av); + if (sn->u.tstamp == -1) + sudo_fatalx(U_("could not parse date \"%s\""), *av); + } else { + sn->u.ptr = *av; + } + } + not = or = false; /* reset state */ + STAILQ_INSERT_TAIL(head, sn, entries); + } + if (sub_expr) + sudo_fatalx(U_("unmatched '(' in expression")); + if (or) + sudo_fatalx(U_("illegal trailing \"or\"")); + if (not) + sudo_fatalx(U_("illegal trailing \"!\"")); + + debug_return_int(av - argv); +} + +static bool +match_expr(struct search_node_list *head, struct log_info *log, bool last_match) +{ + struct search_node *sn; + bool res = false, matched = last_match; + int rc; + debug_decl(match_expr, SUDO_DEBUG_UTIL) + + STAILQ_FOREACH(sn, head, entries) { + switch (sn->type) { + case ST_EXPR: + res = match_expr(&sn->u.expr, log, matched); + break; + case ST_CWD: + res = strcmp(sn->u.cwd, log->cwd) == 0; + break; + case ST_TTY: + res = strcmp(sn->u.tty, log->tty) == 0; + break; + case ST_RUNASGROUP: + if (log->runas_group != NULL) + res = strcmp(sn->u.runas_group, log->runas_group) == 0; + break; + case ST_RUNASUSER: + res = strcmp(sn->u.runas_user, log->runas_user) == 0; + break; + case ST_USER: + res = strcmp(sn->u.user, log->user) == 0; + break; + case ST_PATTERN: + rc = regexec(&sn->u.cmdre, log->cmd, 0, NULL, 0); + if (rc && rc != REG_NOMATCH) { + char buf[BUFSIZ]; + regerror(rc, &sn->u.cmdre, buf, sizeof(buf)); + sudo_fatalx("%s", buf); + } + res = rc == REG_NOMATCH ? 0 : 1; + break; + case ST_FROMDATE: + res = log->tstamp >= sn->u.tstamp; + break; + case ST_TODATE: + res = log->tstamp <= sn->u.tstamp; + break; + default: + sudo_fatalx(U_("unknown search type %d"), sn->type); + /* NOTREACHED */ + } + if (sn->negated) + res = !res; + matched = sn->or ? (res || last_match) : (res && last_match); + last_match = matched; + } + debug_return_bool(matched); +} + +static int +list_session(char *logfile, regex_t *re, const char *user, const char *tty) +{ + char idbuf[7], *idstr, *cp; + const char *timestr; + struct log_info *li; + int ret = -1; + debug_decl(list_session, SUDO_DEBUG_UTIL) + + if ((li = parse_logfile(logfile)) == NULL) + goto done; + + /* Match on search expression if there is one. */ + if (!STAILQ_EMPTY(&search_expr) && !match_expr(&search_expr, li, true)) + goto done; + + /* Convert from /var/log/sudo-sessions/00/00/01/log to 000001 */ + cp = logfile + strlen(session_dir) + 1; + if (IS_IDLOG(cp)) { + idbuf[0] = cp[0]; + idbuf[1] = cp[1]; + idbuf[2] = cp[3]; + idbuf[3] = cp[4]; + idbuf[4] = cp[6]; + idbuf[5] = cp[7]; + idbuf[6] = '\0'; + idstr = idbuf; + } else { + /* Not an id, just use the iolog_file portion. */ + cp[strlen(cp) - 4] = '\0'; + idstr = cp; + } + /* XXX - print rows + cols? */ + timestr = get_timestr(li->tstamp, 1); + printf("%s : %s : TTY=%s ; CWD=%s ; USER=%s ; ", + timestr ? timestr : "invalid date", + li->user, li->tty, li->cwd, li->runas_user); + if (li->runas_group) + printf("GROUP=%s ; ", li->runas_group); + printf("TSID=%s ; COMMAND=%s\n", idstr, li->cmd); + + ret = 0; + +done: + free_log_info(li); + debug_return_int(ret); +} + +static int +session_compare(const void *v1, const void *v2) +{ + const char *s1 = *(const char **)v1; + const char *s2 = *(const char **)v2; + return strcmp(s1, s2); +} + +/* XXX - always returns 0, calls sudo_fatal() on failure */ +static int +find_sessions(const char *dir, regex_t *re, const char *user, const char *tty) +{ + DIR *d; + struct dirent *dp; + struct stat sb; + size_t sdlen, sessions_len = 0, sessions_size = 0; + unsigned int i; + int len; + char pathbuf[PATH_MAX], **sessions = NULL; +#ifdef HAVE_STRUCT_DIRENT_D_TYPE + bool checked_type = true; +#else + const bool checked_type = false; +#endif + debug_decl(find_sessions, SUDO_DEBUG_UTIL) + + d = opendir(dir); + if (d == NULL) + sudo_fatal(U_("unable to open %s"), dir); + + /* XXX - would be faster to use openat() and relative names */ + sdlen = strlcpy(pathbuf, dir, sizeof(pathbuf)); + if (sdlen + 1 >= sizeof(pathbuf)) { + errno = ENAMETOOLONG; + sudo_fatal("%s/", dir); + } + pathbuf[sdlen++] = '/'; + pathbuf[sdlen] = '\0'; + + /* Store potential session dirs for sorting. */ + while ((dp = readdir(d)) != NULL) { + /* Skip "." and ".." */ + if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || + (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) + continue; +#ifdef HAVE_STRUCT_DIRENT_D_TYPE + if (checked_type) { + if (dp->d_type != DT_DIR) { + /* Not all file systems support d_type. */ + if (dp->d_type != DT_UNKNOWN) + continue; + checked_type = false; + } + } +#endif + + /* Add name to session list. */ + if (sessions_len + 1 > sessions_size) { + if (sessions_size == 0) + sessions_size = 36 * 36 / 2; + sessions = reallocarray(sessions, sessions_size, 2 * sizeof(char *)); + if (sessions == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sessions_size *= 2; + } + if ((sessions[sessions_len] = strdup(dp->d_name)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sessions_len++; + } + closedir(d); + + /* Sort and list the sessions. */ + if (sessions != NULL) { + qsort(sessions, sessions_len, sizeof(char *), session_compare); + for (i = 0; i < sessions_len; i++) { + len = snprintf(&pathbuf[sdlen], sizeof(pathbuf) - sdlen, + "%s/log", sessions[i]); + if (len < 0 || (size_t)len >= sizeof(pathbuf) - sdlen) { + errno = ENAMETOOLONG; + sudo_fatal("%s/%s/log", dir, sessions[i]); + } + free(sessions[i]); + + /* Check for dir with a log file. */ + if (lstat(pathbuf, &sb) == 0 && S_ISREG(sb.st_mode)) { + list_session(pathbuf, re, user, tty); + } else { + /* Strip off "/log" and recurse if a dir. */ + pathbuf[sdlen + len - 4] = '\0'; + if (checked_type || + (lstat(pathbuf, &sb) == 0 && S_ISDIR(sb.st_mode))) + find_sessions(pathbuf, re, user, tty); + } + } + free(sessions); + } + + debug_return_int(0); +} + +/* XXX - always returns 0, calls sudo_fatal() on failure */ +static int +list_sessions(int argc, char **argv, const char *pattern, const char *user, + const char *tty) +{ + regex_t rebuf, *re = NULL; + debug_decl(list_sessions, SUDO_DEBUG_UTIL) + + /* Parse search expression if present */ + parse_expr(&search_expr, argv, false); + + /* optional regex */ + if (pattern) { + re = &rebuf; + if (regcomp(re, pattern, REG_EXTENDED|REG_NOSUB) != 0) + sudo_fatalx(U_("invalid regular expression: %s"), pattern); + } + + debug_return_int(find_sessions(session_dir, re, user, tty)); +} + +/* + * Check keyboard for ' ', '<', '>', return + * pause, slow, fast, next + */ +static void +read_keyboard(int fd, int what, void *v) +{ + struct replay_closure *closure = v; + static bool paused = false; + struct timespec ts; + ssize_t nread; + char ch; + debug_decl(read_keyboard, SUDO_DEBUG_UTIL) + + nread = read(fd, &ch, 1); + switch (nread) { + case -1: + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to read %s"), "stdin"); + break; + case 0: + /* Ignore EOF. */ + break; + default: + if (paused) { + /* Any key will unpause, run the delay callback directly. */ + paused = false; + delay_cb(-1, SUDO_EV_TIMEOUT, closure); + debug_return; + } + switch (ch) { + case ' ': + paused = true; + /* Disable the delay event until we unpause. */ + sudo_ev_del(closure->evbase, closure->delay_ev); + break; + case '<': + speed_factor /= 2; + sudo_ev_get_timeleft(closure->delay_ev, &ts); + if (sudo_timespecisset(&ts)) { + /* Double remaining timeout. */ + ts.tv_sec *= 2; + ts.tv_nsec *= 2; + if (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000; + } + if (sudo_ev_add(NULL, closure->delay_ev, &ts, false) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "failed to double remaining delay timeout"); + } + } + break; + case '>': + speed_factor *= 2; + sudo_ev_get_timeleft(closure->delay_ev, &ts); + if (sudo_timespecisset(&ts)) { + /* Halve remaining timeout. */ + if (ts.tv_sec & 1) + ts.tv_nsec += 500000000; + ts.tv_sec /= 2; + ts.tv_nsec /= 2; + if (sudo_ev_add(NULL, closure->delay_ev, &ts, false) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "failed to halve remaining delay timeout"); + } + } + break; + case '\r': + case '\n': + /* Cancel existing delay, run callback directly. */ + sudo_ev_del(closure->evbase, closure->delay_ev); + delay_cb(-1, SUDO_EV_TIMEOUT, closure); + break; + default: + /* Unknown key, nothing to do. */ + break; + } + break; + } + debug_return; +} + +static void +usage(int fatal) +{ + fprintf(fatal ? stderr : stdout, + _("usage: %s [-hnRS] [-d dir] [-m num] [-s num] ID\n"), + getprogname()); + fprintf(fatal ? stderr : stdout, + _("usage: %s [-h] [-d dir] -l [search expression]\n"), + getprogname()); + if (fatal) + exit(1); +} + +static void +help(void) +{ + (void) printf(_("%s - replay sudo session logs\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -d, --directory=dir specify directory for session logs\n" + " -f, --filter=filter specify which I/O type(s) to display\n" + " -h, --help display help message and exit\n" + " -l, --list list available session IDs, with optional expression\n" + " -m, --max-wait=num max number of seconds to wait between events\n" + " -n, --non-interactive no prompts, session is sent to the standard output\n" + " -R, --no-resize do not attempt to re-size the terminal\n" + " -S, --suspend-wait wait while the command was suspended\n" + " -s, --speed=num speed up or slow down output\n" + " -V, --version display version information and exit")); + exit(0); +} + +/* + * Cleanup hook for sudo_fatal()/sudo_fatalx() + */ +static void +sudoreplay_cleanup(void) +{ + restore_terminal_size(); + sudo_term_restore(ttyfd, false); +} diff --git a/utsudo-0.0.2/plugins/sudoers/testsudoers.c b/utsudo-0.0.2/plugins/sudoers/testsudoers.c new file mode 100644 index 0000000..5ff0760 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/testsudoers.c @@ -0,0 +1,610 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_NETGROUP_H +# include +#endif /* HAVE_NETGROUP_H */ +#include +#include +#include +#include +#include + +#include "tsgetgrpw.h" +#include "sudoers.h" +#include "interfaces.h" +#include "sudo_conf.h" +#include "sudo_lbuf.h" +#include + +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +enum sudoers_formats { + format_ldif, + format_sudoers +}; + +/* + * Function Prototypes + */ +static void dump_sudoers(struct sudo_lbuf *lbuf); +static void usage(void) __attribute__((__noreturn__)); +static void set_runaspw(const char *); +static void set_runasgr(const char *); +static bool cb_runas_default(const union sudo_defs_val *); +static int testsudoers_error(const char *msg); +static int testsudoers_output(const char *buf); + +/* tsgetgrpw.c */ +extern void setgrfile(const char *); +extern void setgrent(void); +extern void endgrent(void); +extern struct group *getgrent(void); +extern struct group *getgrnam(const char *); +extern struct group *getgrgid(gid_t); +extern void setpwfile(const char *); +extern void setpwent(void); +extern void endpwent(void); +extern struct passwd *getpwent(void); +extern struct passwd *getpwnam(const char *); +extern struct passwd *getpwuid(uid_t); + +/* gram.y */ +extern int (*trace_print)(const char *msg); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +static char *runas_group, *runas_user; + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) +extern char *malloc_options; +#endif +#if YYDEBUG +extern int sudoersdebug; +#endif + +__dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + enum sudoers_formats input_format = format_sudoers; + struct cmndspec *cs; + struct privilege *priv; + struct userspec *us; + char *p, *grfile, *pwfile; + const char *errstr; + int match, host_match, runas_match, cmnd_match; + int ch, dflag, exitcode = EXIT_FAILURE; + struct sudo_lbuf lbuf; + debug_decl(main, SUDOERS_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + malloc_options = "S"; +#endif +#if YYDEBUG + sudoersdebug = 1; +#endif + + initprogname(argc > 0 ? argv[0] : "testsudoers"); + + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have own domain */ + textdomain("sudoers"); + + /* No word wrap on output. */ + sudo_lbuf_init(&lbuf, testsudoers_output, 0, NULL, 0); + + /* Initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + goto done; + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + goto done; + + dflag = 0; + grfile = pwfile = NULL; + while ((ch = getopt(argc, argv, "dg:G:h:i:P:p:tu:U:")) != -1) { + switch (ch) { + case 'd': + dflag = 1; + break; + case 'G': + sudoers_gid = (gid_t)sudo_strtoid(optarg, &errstr); + if (errstr != NULL) + sudo_fatalx("group-ID %s: %s", optarg, errstr); + break; + case 'g': + runas_group = optarg; + SET(sudo_user.flags, RUNAS_GROUP_SPECIFIED); + break; + case 'h': + user_host = optarg; + break; + case 'i': + if (strcasecmp(optarg, "ldif") == 0) { + input_format = format_ldif; + } else if (strcasecmp(optarg, "sudoers") == 0) { + input_format = format_sudoers; + } else { + sudo_warnx(U_("unsupported input format %s"), optarg); + usage(); + } + break; + case 'p': + pwfile = optarg; + break; + case 'P': + grfile = optarg; + break; + case 't': + trace_print = testsudoers_error; + break; + case 'U': + sudoers_uid = (uid_t)sudo_strtoid(optarg, &errstr); + if (errstr != NULL) + sudo_fatalx("user-ID %s: %s", optarg, errstr); + break; + case 'u': + runas_user = optarg; + SET(sudo_user.flags, RUNAS_USER_SPECIFIED); + break; + default: + usage(); + break; + } + } + argc -= optind; + argv += optind; + + /* Set group/passwd file and init the cache. */ + if (grfile) + setgrfile(grfile); + if (pwfile) + setpwfile(pwfile); + + if (argc < 2) { + if (!dflag) + usage(); + user_name = argc ? *argv++ : "root"; + user_cmnd = user_base = "true"; + argc = 0; + } else { + user_name = *argv++; + user_cmnd = *argv++; + if ((p = strrchr(user_cmnd, '/')) != NULL) + user_base = p + 1; + else + user_base = user_cmnd; + argc -= 2; + } + if ((sudo_user.pw = sudo_getpwnam(user_name)) == NULL) + sudo_fatalx(U_("unknown user: %s"), user_name); + + if (user_host == NULL) { + if ((user_host = sudo_gethostname()) == NULL) + sudo_fatal("gethostname"); + } + if ((p = strchr(user_host, '.'))) { + *p = '\0'; + if ((user_shost = strdup(user_host)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + *p = '.'; + } else { + user_shost = user_host; + } + user_runhost = user_host; + user_srunhost = user_shost; + + /* Fill in user_args from argv. */ + if (argc > 0) { + char *to, **from; + size_t size, n; + + for (size = 0, from = argv; *from; from++) + size += strlen(*from) + 1; + + if ((user_args = malloc(size)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + for (to = user_args, from = argv; *from; from++) { + n = strlcpy(to, *from, size - (to - user_args)); + if (n >= size - (to - user_args)) + sudo_fatalx(U_("internal error, %s overflow"), getprogname()); + to += n; + *to++ = ' '; + } + *--to = '\0'; + } + + /* Initialize default values. */ + if (!init_defaults()) + sudo_fatalx(U_("unable to initialize sudoers default values")); + + /* Set group_plugin callback. */ + sudo_defs_table[I_GROUP_PLUGIN].callback = cb_group_plugin; + + /* Set runas callback. */ + sudo_defs_table[I_RUNAS_DEFAULT].callback = cb_runas_default; + + /* Set locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Load ip addr/mask for each interface. */ + if (get_net_ifs(&p) > 0) { + if (!set_interfaces(p)) + sudo_fatal(U_("unable to parse network address list")); + } + + /* Allocate space for data structures in the parser. */ + init_parser("sudoers", false); + + /* + * Set runas passwd/group entries based on command line or sudoers. + * Note that if runas_group was specified without runas_user we + * run the command as the invoking user. + */ + if (runas_group != NULL) { + set_runasgr(runas_group); + set_runaspw(runas_user ? runas_user : user_name); + } else + set_runaspw(runas_user ? runas_user : def_runas_default); + + /* Parse the policy file. */ + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, NULL); + switch (input_format) { + case format_ldif: + if (!sudoers_parse_ldif(&parsed_policy, stdin, NULL, true)) + (void) printf("Parse error in LDIF"); + else + (void) fputs("Parses OK", stdout); + break; + case format_sudoers: + if (sudoersparse() != 0 || parse_error) { + parse_error = true; + if (errorlineno != -1) + (void) printf("Parse error in %s near line %d", + errorfile, errorlineno); + else + (void) printf("Parse error in %s", errorfile); + } else { + (void) fputs("Parses OK", stdout); + } + break; + default: + sudo_fatalx("error: unhandled input %d", input_format); + } + + if (!update_defaults(&parsed_policy, NULL, SETDEF_ALL, false)) + (void) fputs(" (problem with defaults entries)", stdout); + puts("."); + + if (dflag) { + (void) putchar('\n'); + dump_sudoers(&lbuf); + if (argc < 2) { + exitcode = parse_error ? 1 : 0; + goto done; + } + } + + /* This loop must match the one in sudo_file_lookup() */ + printf("\nEntries for user %s:\n", user_name); + match = UNSPEC; + TAILQ_FOREACH_REVERSE(us, &parsed_policy.userspecs, userspec_list, entries) { + if (userlist_matches(&parsed_policy, sudo_user.pw, &us->users) != ALLOW) + continue; + TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) { + sudo_lbuf_append(&lbuf, "\n"); + sudoers_format_privilege(&lbuf, &parsed_policy, priv, false); + sudo_lbuf_print(&lbuf); + host_match = hostlist_matches(&parsed_policy, sudo_user.pw, + &priv->hostlist); + if (host_match == ALLOW) { + puts("\thost matched"); + TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) { + runas_match = runaslist_matches(&parsed_policy, + cs->runasuserlist, cs->runasgrouplist, NULL, NULL); + if (runas_match == ALLOW) { + puts("\trunas matched"); + cmnd_match = cmnd_matches(&parsed_policy, cs->cmnd); + if (cmnd_match != UNSPEC) + match = cmnd_match; + printf("\tcmnd %s\n", match == ALLOW ? "allowed" : + match == DENY ? "denied" : "unmatched"); + } + } + } else + puts(U_("\thost unmatched")); + } + } + puts(match == ALLOW ? U_("\nCommand allowed") : + match == DENY ? U_("\nCommand denied") : U_("\nCommand unmatched")); + + /* + * Exit codes: + * 0 - parsed OK and command matched. + * 1 - parse error + * 2 - command not matched + * 3 - command denied + */ + exitcode = parse_error ? 1 : (match == ALLOW ? 0 : match + 3); +done: + sudo_lbuf_destroy(&lbuf); + sudo_freepwcache(); + sudo_freegrcache(); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); +} + +static void +set_runaspw(const char *user) +{ + struct passwd *pw = NULL; + debug_decl(set_runaspw, SUDOERS_DEBUG_UTIL) + + if (*user == '#') { + const char *errstr; + uid_t uid = sudo_strtoid(user + 1, &errstr); + if (errstr == NULL) { + if ((pw = sudo_getpwuid(uid)) == NULL) + pw = sudo_fakepwnam(user, user_gid); + } + } + if (pw == NULL) { + if ((pw = sudo_getpwnam(user)) == NULL) + sudo_fatalx(U_("unknown user: %s"), user); + } + if (runas_pw != NULL) + sudo_pw_delref(runas_pw); + runas_pw = pw; + debug_return; +} + +static void +set_runasgr(const char *group) +{ + struct group *gr = NULL; + debug_decl(set_runasgr, SUDOERS_DEBUG_UTIL) + + if (*group == '#') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) { + if ((gr = sudo_getgrgid(gid)) == NULL) + gr = sudo_fakegrnam(group); + } + } + if (gr == NULL) { + if ((gr = sudo_getgrnam(group)) == NULL) + sudo_fatalx(U_("unknown group: %s"), group); + } + if (runas_gr != NULL) + sudo_gr_delref(runas_gr); + runas_gr = gr; + debug_return; +} + +/* + * Callback for runas_default sudoers setting. + */ +static bool +cb_runas_default(const union sudo_defs_val *sd_un) +{ + /* Only reset runaspw if user didn't specify one. */ + if (!runas_user && !runas_group) + set_runaspw(sd_un->str); + return true; +} + +void +sudo_setspent(void) +{ + return; +} + +void +sudo_endspent(void) +{ + return; +} + +FILE * +open_sudoers(const char *sudoers, bool doedit, bool *keepopen) +{ + struct stat sb; + FILE *fp = NULL; + char *sudoers_base; + debug_decl(open_sudoers, SUDOERS_DEBUG_UTIL) + + sudoers_base = strrchr(sudoers, '/'); + if (sudoers_base != NULL) + sudoers_base++; + + switch (sudo_secure_file(sudoers, sudoers_uid, sudoers_gid, &sb)) { + case SUDO_PATH_SECURE: + fp = fopen(sudoers, "r"); + break; + case SUDO_PATH_MISSING: + sudo_warn("unable to stat %s", sudoers_base); + break; + case SUDO_PATH_BAD_TYPE: + sudo_warnx("%s is not a regular file", sudoers_base); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx("%s should be owned by uid %u", + sudoers_base, (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx("%s is world writable", sudoers_base); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx("%s should be owned by gid %u", + sudoers_base, (unsigned int) sudoers_gid); + break; + default: + /* NOTREACHED */ + break; + } + + debug_return_ptr(fp); +} + +bool +init_envtables(void) +{ + return(true); +} + +bool +set_perms(int perm) +{ + return true; +} + +bool +restore_perms(void) +{ + return true; +} + +static bool +print_defaults(struct sudo_lbuf *lbuf) +{ + struct defaults *def, *next; + debug_decl(print_defaults, SUDOERS_DEBUG_UTIL) + + TAILQ_FOREACH_SAFE(def, &parsed_policy.defaults, entries, next) + sudoers_format_default_line(lbuf, &parsed_policy, def, &next, false); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static int +print_alias(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + struct sudo_lbuf *lbuf = v; + struct member *m; + debug_decl(print_alias, SUDOERS_DEBUG_UTIL) + + sudo_lbuf_append(lbuf, "%s %s = ", alias_type_to_string(a->type), + a->name); + TAILQ_FOREACH(m, &a->members, entries) { + if (m != TAILQ_FIRST(&a->members)) + sudo_lbuf_append(lbuf, ", "); + sudoers_format_member(lbuf, parse_tree, m, NULL, UNSPEC); + } + sudo_lbuf_append(lbuf, "\n"); + + debug_return_int(sudo_lbuf_error(lbuf) ? -1 : 0); +} + +static bool +print_aliases(struct sudo_lbuf *lbuf) +{ + debug_decl(print_aliases, SUDOERS_DEBUG_UTIL) + + alias_apply(&parsed_policy, print_alias, lbuf); + + debug_return_bool(!sudo_lbuf_error(lbuf)); +} + +static void +dump_sudoers(struct sudo_lbuf *lbuf) +{ + debug_decl(dump_sudoers, SUDOERS_DEBUG_UTIL) + + /* Print Defaults */ + if (!print_defaults(lbuf)) + goto done; + if (lbuf->len > 0) { + sudo_lbuf_print(lbuf); + sudo_lbuf_append(lbuf, "\n"); + } + + /* Print Aliases */ + if (!print_aliases(lbuf)) + goto done; + if (lbuf->len > 1) { + sudo_lbuf_print(lbuf); + sudo_lbuf_append(lbuf, "\n"); + } + + /* Print User_Specs */ + if (!sudoers_format_userspecs(lbuf, &parsed_policy, NULL, false, true)) + goto done; + if (lbuf->len > 1) { + sudo_lbuf_print(lbuf); + } + +done: + if (sudo_lbuf_error(lbuf)) { + if (errno == ENOMEM) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + + debug_return; +} + +static int +testsudoers_output(const char *buf) +{ + return fputs(buf, stdout); +} + +static int +testsudoers_error(const char *buf) +{ + return fputs(buf, stderr); +} + +static void +usage(void) +{ + (void) fprintf(stderr, "usage: %s [-dt] [-G sudoers_gid] [-g group] [-h host] [-i input_format] [-P grfile] [-p pwfile] [-U sudoers_uid] [-u user] [args]\n", getprogname()); + exit(1); +} diff --git a/utsudo-0.0.2/plugins/sudoers/timeout.c b/utsudo-0.0.2/plugins/sudoers/timeout.c new file mode 100644 index 0000000..71796ca --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/timeout.c @@ -0,0 +1,116 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Parse a command timeout in sudoers in the format 1d2h3m4s + * (days, hours, minutes, seconds) or a number of seconds with no suffix. + * Returns the number of seconds or -1 on error. + */ +int +parse_timeout(const char *timestr) +{ + debug_decl(parse_timeout, SUDOERS_DEBUG_PARSER) + const char suffixes[] = "dhms"; + const char *cp = timestr; + int timeout = 0; + int idx = 0; + + do { + char *ep; + char ch; + long l; + + /* Parse number, must be present and positive. */ + errno = 0; + l = strtol(cp, &ep, 10); + if (ep == cp) { + /* missing timeout */ + errno = EINVAL; + debug_return_int(-1); + } + if (errno == ERANGE || l < 0 || l > INT_MAX) + goto overflow; + + /* Find a matching suffix or return an error. */ + if (*ep != '\0') { + ch = tolower((unsigned char)*ep++); + while (suffixes[idx] != ch) { + if (suffixes[idx] == '\0') { + /* parse error */ + errno = EINVAL; + debug_return_int(-1); + } + idx++; + } + + /* Apply suffix. */ + switch (ch) { + case 'd': + if (l > INT_MAX / (24 * 60 * 60)) + goto overflow; + l *= 24 * 60 * 60; + break; + case 'h': + if (l > INT_MAX / (60 * 60)) + goto overflow; + l *= 60 * 60; + break; + case 'm': + if (l > INT_MAX / 60) + goto overflow; + l *= 60; + break; + } + if (l > INT_MAX - timeout) + goto overflow; + } + cp = ep; + + timeout += l; + } while (*cp != '\0'); + + debug_return_int(timeout); +overflow: + errno = ERANGE; + debug_return_int(-1); +} diff --git a/utsudo-0.0.2/plugins/sudoers/timestamp.c b/utsudo-0.0.2/plugins/sudoers/timestamp.c new file mode 100644 index 0000000..515eadd --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/timestamp.c @@ -0,0 +1,1077 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2014-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +#define TIMESTAMP_OPEN_ERROR -1 +#define TIMESTAMP_PERM_ERROR -2 + +/* + * Each user has a single time stamp file that contains multiple records. + * Records are locked to ensure that changes are serialized. + * + * The first record is of type TS_LOCKEXCL and is used to gain exclusive + * access to create new records. This is a short-term lock and sudo + * should not sleep while holding it (or the user will not be able to sudo). + * The TS_LOCKEXCL entry must be unlocked before locking the actual record. + */ + +struct ts_cookie { + char *fname; + int fd; + pid_t sid; + bool locked; + off_t pos; + struct timestamp_entry key; +}; + +/* + * Returns true if entry matches key, else false. + * We don't match on the sid or actual time stamp. + */ +static bool +ts_match_record(struct timestamp_entry *key, struct timestamp_entry *entry, + unsigned int recno) +{ + debug_decl(ts_match_record, SUDOERS_DEBUG_AUTH) + + if (entry->version != key->version) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record version mismatch (want %u, got %u)", __func__, recno, + key->version, entry->version); + debug_return_bool(false); + } + if (!ISSET(key->flags, TS_ANYUID) && entry->auth_uid != key->auth_uid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record uid mismatch (want %u, got %u)", __func__, recno, + (unsigned int)key->auth_uid, (unsigned int)entry->auth_uid); + debug_return_bool(false); + } + if (entry->type != key->type) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record type mismatch (want %u, got %u)", __func__, recno, + key->type, entry->type); + debug_return_bool(false); + } + switch (entry->type) { + case TS_GLOBAL: + /* no ppid or tty to match */ + break; + case TS_PPID: + /* verify parent pid */ + if (entry->u.ppid != key->u.ppid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record ppid mismatch (want %d, got %d)", __func__, recno, + (int)key->u.ppid, (int)entry->u.ppid); + debug_return_bool(false); + } + if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u ppid start time mismatch", __func__, recno); + debug_return_bool(false); + } + break; + case TS_TTY: + if (entry->u.ttydev != key->u.ttydev) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u record tty mismatch (want 0x%x, got 0x%x)", __func__, + recno, (unsigned int)key->u.ttydev, (unsigned int)entry->u.ttydev); + debug_return_bool(false); + } + if (sudo_timespeccmp(&entry->start_time, &key->start_time, !=)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "%s:%u session leader start time mismatch", __func__, recno); + debug_return_bool(false); + } + break; + default: + /* unknown record type, ignore it */ + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "%s:%u unknown time stamp record type %d", __func__, recno, + entry->type); + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Searches the time stamp file descriptor for a record that matches key. + * On success, fills in entry with the matching record and returns true. + * On failure, returns false. + * + * Note that records are searched starting at the current file offset, + * which may not be the beginning of the file. + */ +static bool +ts_find_record(int fd, struct timestamp_entry *key, struct timestamp_entry *entry) +{ + struct timestamp_entry cur; + unsigned int recno = 0; + debug_decl(ts_find_record, SUDOERS_DEBUG_AUTH) + + /* + * Find a matching record (does not match sid or time stamp value). + */ + while (read(fd, &cur, sizeof(cur)) == sizeof(cur)) { + recno++; + if (cur.size != sizeof(cur)) { + /* wrong size, seek to start of next record */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "wrong sized record, got %hu, expected %zu", + cur.size, sizeof(cur)); + if (lseek(fd, (off_t)cur.size - (off_t)sizeof(cur), SEEK_CUR) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek forward %d", + (int)cur.size - (int)sizeof(cur)); + break; + } + if (cur.size == 0) + break; /* size must be non-zero */ + continue; + } + if (ts_match_record(key, &cur, recno)) { + memcpy(entry, &cur, sizeof(struct timestamp_entry)); + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Create a directory and any missing parent directories with the + * specified mode. + * Returns true on success. + * Returns false on failure and displays a warning to stderr. + */ +static bool +ts_mkdirs(char *path, uid_t owner, gid_t group, mode_t mode, + mode_t parent_mode, bool quiet) +{ + bool ret; + mode_t omask; + debug_decl(ts_mkdirs, SUDOERS_DEBUG_AUTH) + + /* umask must not be more restrictive than the file modes. */ + omask = umask(ACCESSPERMS & ~(mode|parent_mode)); + ret = sudo_mkdir_parents(path, owner, group, parent_mode, quiet); + if (ret) { + /* Create final path component. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "mkdir %s, mode 0%o, uid %d, gid %d", path, (unsigned int)mode, + (int)owner, (int)group); + if (mkdir(path, mode) != 0 && errno != EEXIST) { + if (!quiet) + sudo_warn(U_("unable to mkdir %s"), path); + ret = false; + } else { + if (chown(path, owner, group) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)owner, (int)group, path); + } + } + } + umask(omask); + debug_return_bool(ret); +} + +/* + * Check that path is owned by timestamp_uid and not writable by + * group or other. If path is missing and make_it is true, create + * the directory and its parent dirs. + * Returns true on success or false on failure, setting errno. + */ +static bool +ts_secure_dir(char *path, bool make_it, bool quiet) +{ + struct stat sb; + bool ret = false; + debug_decl(ts_secure_dir, SUDOERS_DEBUG_AUTH) + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "checking %s", path); + switch (sudo_secure_dir(path, timestamp_uid, -1, &sb)) { + case SUDO_PATH_SECURE: + ret = true; + break; + case SUDO_PATH_MISSING: + if (make_it && ts_mkdirs(path, timestamp_uid, timestamp_gid, S_IRWXU, + S_IRWXU|S_IXGRP|S_IXOTH, quiet)) { + ret = true; + break; + } + errno = ENOENT; + break; + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + if (!quiet) + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + if (!quiet) { + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) timestamp_uid); + } + errno = EACCES; + break; + case SUDO_PATH_GROUP_WRITABLE: + if (!quiet) + sudo_warnx(U_("%s is group writable"), path); + errno = EACCES; + break; + } + debug_return_bool(ret); +} + +/* + * Open the specified timestamp or lecture file and set the + * close on exec flag. + * Returns open file descriptor on success. + * Returns TIMESTAMP_OPEN_ERROR or TIMESTAMP_PERM_ERROR on error. + */ +static int +ts_open(const char *path, int flags) +{ + bool uid_changed = false; + int fd; + debug_decl(ts_open, SUDOERS_DEBUG_AUTH) + + if (timestamp_uid != 0) + uid_changed = set_perms(PERM_TIMESTAMP); + fd = open(path, flags, S_IRUSR|S_IWUSR); + if (uid_changed && !restore_perms()) { + /* Unable to restore permissions, should not happen. */ + if (fd != -1) { + int serrno = errno; + close(fd); + errno = serrno; + fd = TIMESTAMP_PERM_ERROR; + } + } + if (fd >= 0) + (void)fcntl(fd, F_SETFD, FD_CLOEXEC); + + debug_return_int(fd); +} + +static ssize_t +ts_write(int fd, const char *fname, struct timestamp_entry *entry, off_t offset) +{ + ssize_t nwritten; + off_t old_eof; + debug_decl(ts_write, SUDOERS_DEBUG_AUTH) + + if (offset == -1) { + old_eof = lseek(fd, 0, SEEK_CUR); + nwritten = write(fd, entry, entry->size); + } else { + old_eof = offset; +#ifdef HAVE_PWRITE + nwritten = pwrite(fd, entry, entry->size, offset); +#else + if (lseek(fd, offset, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)offset); + nwritten = -1; + } else { + nwritten = write(fd, entry, entry->size); + } +#endif + } + if ((size_t)nwritten != entry->size) { + if (nwritten == -1) { + log_warning(SLOG_SEND_MAIL, + N_("unable to write to %s"), fname); + } else { + log_warningx(SLOG_SEND_MAIL, + N_("unable to write to %s"), fname); + } + + /* Truncate on partial write to be safe (assumes end of file). */ + if (nwritten > 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "short write, truncating partial time stamp record"); + if (ftruncate(fd, old_eof) != 0) { + sudo_warn(U_("unable to truncate time stamp file to %lld bytes"), + (long long)old_eof); + } + } + debug_return_ssize_t(-1); + } + debug_return_ssize_t(nwritten); +} + +/* + * Full in struct timestamp_entry with the specified flags + * based on auth user pw. Does not set the time stamp. + */ +static void +ts_init_key(struct timestamp_entry *entry, struct passwd *pw, int flags, + enum def_tuple ticket_type) +{ + struct stat sb; + debug_decl(ts_init_key, SUDOERS_DEBUG_AUTH) + + memset(entry, 0, sizeof(*entry)); + entry->version = TS_VERSION; + entry->size = sizeof(*entry); + entry->flags = flags; + if (pw != NULL) { + entry->auth_uid = pw->pw_uid; + } else { + entry->flags |= TS_ANYUID; + } + entry->sid = user_sid; + switch (ticket_type) { + default: + /* Unknown time stamp ticket type, treat as tty (should not happen). */ + sudo_warnx("unknown time stamp ticket type %d", ticket_type); + /* FALLTHROUGH */ + case tty: + if (user_ttypath != NULL && stat(user_ttypath, &sb) == 0) { + /* tty-based time stamp */ + entry->type = TS_TTY; + entry->u.ttydev = sb.st_rdev; + if (entry->sid != -1) + get_starttime(entry->sid, &entry->start_time); + break; + } + /* FALLTHROUGH */ + case kernel: + case ppid: + /* ppid-based time stamp */ + entry->type = TS_PPID; + entry->u.ppid = getppid(); + get_starttime(entry->u.ppid, &entry->start_time); + break; + case global: + /* global time stamp */ + entry->type = TS_GLOBAL; + break; + } + + debug_return; +} + +static void +ts_init_key_nonglobal(struct timestamp_entry *entry, struct passwd *pw, int flags) +{ + /* + * Even if the timestamp type is global or kernel we still want to do + * per-tty or per-ppid locking so sudo works predictably in a pipeline. + */ + ts_init_key(entry, pw, flags, + def_timestamp_type == ppid ? ppid : tty); +} + +/* + * Open the user's time stamp file. + * Returns a cookie or NULL on error, does not lock the file. + */ +void * +timestamp_open(const char *user, pid_t sid) +{ + struct ts_cookie *cookie; + char *fname = NULL; + int tries, fd = -1; + debug_decl(timestamp_open, SUDOERS_DEBUG_AUTH) + + /* Zero timeout means don't use the time stamp file. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + errno = ENOENT; + goto bad; + } + + /* Sanity check timestamp dir and create if missing. */ + if (!ts_secure_dir(def_timestampdir, true, false)) + goto bad; + + /* Open time stamp file. */ + if (asprintf(&fname, "%s/%s", def_timestampdir, user) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + for (tries = 1; ; tries++) { + struct stat sb; + + fd = ts_open(fname, O_RDWR|O_CREAT); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + log_warning(SLOG_SEND_MAIL, N_("unable to open %s"), fname); + goto bad; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + goto bad; + } + + /* Remove time stamp file if its mtime predates boot time. */ + if (tries == 1 && fstat(fd, &sb) == 0) { + struct timespec boottime, mtime, now; + + if (sudo_gettime_real(&now) == 0 && get_boottime(&boottime)) { + /* Ignore a boot time that is in the future. */ + if (sudo_timespeccmp(&now, &boottime, <)) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "ignoring boot time that is in the future"); + } else { + mtim_get(&sb, mtime); + if (sudo_timespeccmp(&mtime, &boottime, <)) { + /* Time stamp file too old, remove it. */ + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "removing time stamp file that predates boot time"); + close(fd); + unlink(fname); + continue; + } + } + } + } + break; + } + + /* Allocate and fill in cookie to store state. */ + cookie = malloc(sizeof(*cookie)); + if (cookie == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + cookie->fd = fd; + cookie->fname = fname; + cookie->sid = sid; + cookie->pos = -1; + + debug_return_ptr(cookie); +bad: + if (fd != -1) + close(fd); + free(fname); + debug_return_ptr(NULL); +} + +static volatile sig_atomic_t got_signal; + +static void +timestamp_handler(int s) +{ + got_signal = s; +} + +/* + * Wrapper for sudo_lock_region() that is interruptible. + */ +static bool +timestamp_lock_record(int fd, off_t pos, off_t len) +{ + struct sigaction sa, saveint, savequit; + sigset_t mask, omask; + bool ret; + debug_decl(timestamp_lock_record, SUDOERS_DEBUG_AUTH) + + if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)pos); + debug_return_bool(false); + } + + /* Allow SIGINT and SIGQUIT to interrupt a lock. */ + got_signal = 0; + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; /* don't restart system calls */ + sa.sa_handler = timestamp_handler; + (void) sigaction(SIGINT, &sa, &saveint); + (void) sigaction(SIGQUIT, &sa, &savequit); + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + (void) sigprocmask(SIG_UNBLOCK, &mask, &omask); + + ret = sudo_lock_region(fd, SUDO_LOCK, len); + if (!ret) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "failed to lock fd %d [%lld, %lld]", fd, + (long long)pos, (long long)len); + } + + /* Restore the old mask (SIGINT and SIGQUIT blocked) and handlers. */ + (void) sigprocmask(SIG_SETMASK, &omask, NULL); + (void) sigaction(SIGINT, &saveint, NULL); + (void) sigaction(SIGQUIT, &savequit, NULL); + + /* Re-deliver the signal that interrupted the lock, if any. */ + if (!ret && got_signal) + kill(getpid(), got_signal); + + debug_return_bool(ret); +} + +static bool +timestamp_unlock_record(int fd, off_t pos, off_t len) +{ + debug_decl(timestamp_unlock_record, SUDOERS_DEBUG_AUTH) + + if (pos >= 0 && lseek(fd, pos, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)pos); + debug_return_bool(false); + } + debug_return_bool(sudo_lock_region(fd, SUDO_UNLOCK, len)); +} + +/* + * Seek to the record's position and read it, locking as needed. + */ +static ssize_t +ts_read(struct ts_cookie *cookie, struct timestamp_entry *entry) +{ + ssize_t nread = -1; + bool should_unlock = false; + debug_decl(ts_read, SUDOERS_DEBUG_AUTH) + + /* If the record is not already locked, lock it now. */ + if (!cookie->locked) { + if (!timestamp_lock_record(cookie->fd, cookie->pos, sizeof(*entry))) + goto done; + should_unlock = true; + } + + /* Seek to the record position and read it. */ +#ifdef HAVE_PREAD + nread = pread(cookie->fd, entry, sizeof(*entry), cookie->pos); +#else + if (lseek(cookie->fd, cookie->pos, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)cookie->pos); + goto done; + } + nread = read(cookie->fd, entry, sizeof(*entry)); +#endif + if (nread != sizeof(*entry)) { + /* short read, should not happen */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "short read (%zd vs %zu), truncated time stamp file?", + nread, sizeof(*entry)); + goto done; + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "read %zd byte record at %lld", nread, (long long)cookie->pos); + +done: + /* If the record was not locked initially, unlock it. */ + if (should_unlock) + timestamp_unlock_record(cookie->fd, cookie->pos, sizeof(*entry)); + + debug_return_ssize_t(nread); +} + +/* + * Lock a record in the time stamp file for exclusive access. + * If the record does not exist, it is created (as disabled). + */ +bool +timestamp_lock(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + struct timestamp_entry entry; + off_t lock_pos; + ssize_t nread; + debug_decl(timestamp_lock, SUDOERS_DEBUG_AUTH) + + if (cookie == NULL) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "called with a NULL cookie!"); + debug_return_bool(false); + } + + /* + * Take a lock on the "write" record (the first record in the file). + * This will let us seek for the record or extend as needed + * without colliding with anyone else. + */ + if (!timestamp_lock_record(cookie->fd, 0, sizeof(struct timestamp_entry))) + debug_return_bool(false); + + /* Make sure the first record is of type TS_LOCKEXCL. */ + memset(&entry, 0, sizeof(entry)); + nread = read(cookie->fd, &entry, sizeof(entry)); + if (nread == 0) { + /* New file, add TS_LOCKEXCL record. */ + entry.version = TS_VERSION; + entry.size = sizeof(entry); + entry.type = TS_LOCKEXCL; + if (ts_write(cookie->fd, cookie->fname, &entry, -1) == -1) + debug_return_bool(false); + } else if (entry.type != TS_LOCKEXCL) { + /* Old sudo record, convert it to TS_LOCKEXCL. */ + entry.type = TS_LOCKEXCL; + memset((char *)&entry + offsetof(struct timestamp_entry, flags), 0, + nread - offsetof(struct timestamp_entry, flags)); + if (ts_write(cookie->fd, cookie->fname, &entry, 0) == -1) + debug_return_bool(false); + } + if (entry.size != sizeof(entry)) { + /* Reset position if the lock record has an unexpected size. */ + if (lseek(cookie->fd, entry.size, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to seek to %lld", (long long)entry.size); + debug_return_bool(false); + } + } + + /* Search for a tty/ppid-based record or append a new one. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "searching for %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + ts_init_key_nonglobal(&cookie->key, pw, TS_DISABLED); + if (ts_find_record(cookie->fd, &cookie->key, &entry)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found existing %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + lock_pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "appending new %s time stamp record", + def_timestamp_type == ppid ? "ppid" : "tty"); + lock_pos = lseek(cookie->fd, 0, SEEK_CUR); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) + debug_return_bool(false); + } + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "%s time stamp position is %lld", + def_timestamp_type == ppid ? "ppid" : "tty", (long long)lock_pos); + + if (def_timestamp_type == global) { + /* + * For global tickets we use a separate record lock that we + * cannot hold long-term since it is shared between all ttys. + */ + cookie->locked = false; + cookie->key.type = TS_GLOBAL; /* find a global record */ + + if (lseek(cookie->fd, 0, SEEK_SET) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "unable to rewind fd"); + debug_return_bool(false); + } + if (ts_find_record(cookie->fd, &cookie->key, &entry)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "found existing global record"); + cookie->pos = lseek(cookie->fd, 0, SEEK_CUR) - (off_t)entry.size; + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "appending new global record"); + cookie->pos = lseek(cookie->fd, 0, SEEK_CUR); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, -1) == -1) + debug_return_bool(false); + } + } else { + /* For tty/ppid tickets the tty lock is the same as the record lock. */ + cookie->pos = lock_pos; + cookie->locked = true; + } + + /* Unlock the TS_LOCKEXCL record. */ + timestamp_unlock_record(cookie->fd, 0, sizeof(struct timestamp_entry)); + + /* Lock the per-tty record (may sleep). */ + if (!timestamp_lock_record(cookie->fd, lock_pos, sizeof(struct timestamp_entry))) + debug_return_bool(false); + + debug_return_bool(true); +} + +void +timestamp_close(void *vcookie) +{ + struct ts_cookie *cookie = vcookie; + debug_decl(timestamp_close, SUDOERS_DEBUG_AUTH) + + if (cookie != NULL) { + close(cookie->fd); + free(cookie->fname); + free(cookie); + } + + debug_return; +} + +/* + * Check the time stamp file and directory and return their status. + * Called with the file position before the locked record to read. + * Returns one of TS_CURRENT, TS_OLD, TS_MISSING, TS_ERROR, TS_FATAL. + * Fills in fdp with an open file descriptor positioned at the + * appropriate (and locked) record. + */ +int +timestamp_status(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + struct timestamp_entry entry; + struct timespec diff, now; + int status = TS_ERROR; /* assume the worst */ + ssize_t nread; + debug_decl(timestamp_status, SUDOERS_DEBUG_AUTH) + + /* Zero timeout means don't use time stamp files. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "timestamps disabled"); + status = TS_OLD; + goto done; + } + if (cookie == NULL || cookie->pos < 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "NULL cookie or invalid position"); + status = TS_OLD; + goto done; + } + +#ifdef TIOCCHKVERAUTH + if (def_timestamp_type == kernel) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + if (ioctl(fd, TIOCCHKVERAUTH) == 0) + status = TS_CURRENT; + else + status = TS_OLD; + close(fd); + goto done; + } + } +#endif + + /* Read the record at the correct position. */ + if ((nread = ts_read(cookie, &entry)) != sizeof(entry)) + goto done; + + /* Make sure what we read matched the expected record. */ + if (entry.version != TS_VERSION || entry.size != nread) { + /* do something else? */ + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "invalid time stamp file @ %lld", (long long)cookie->pos); + status = TS_OLD; + goto done; + } + + if (ISSET(entry.flags, TS_DISABLED)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record disabled"); + status = TS_OLD; /* disabled via sudo -k */ + goto done; + } + + if (entry.type != TS_GLOBAL && entry.sid != cookie->sid) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record sid mismatch"); + status = TS_OLD; /* belongs to different session */ + goto done; + } + + /* Negative timeouts only expire manually (sudo -k). */ + sudo_timespecclear(&diff); + if (sudo_timespeccmp(&def_timestamp_timeout, &diff, <)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "time stamp record does not expire"); + status = TS_CURRENT; + goto done; + } + + /* Compare stored time stamp with current time. */ + if (sudo_gettime_mono(&now) == -1) { + log_warning(0, N_("unable to read the clock")); + status = TS_ERROR; + goto done; + } + sudo_timespecsub(&now, &entry.ts, &diff); + if (sudo_timespeccmp(&diff, &def_timestamp_timeout, <)) { + status = TS_CURRENT; +#if defined(CLOCK_MONOTONIC) || defined(__MACH__) + /* A monotonic clock should never run backwards. */ + if (diff.tv_sec < 0) { + log_warningx(SLOG_SEND_MAIL, + N_("ignoring time stamp from the future")); + status = TS_OLD; + SET(entry.flags, TS_DISABLED); + (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); + } +#else + /* + * Check for bogus (future) time in the stampfile. + * If diff / 2 > timeout, someone has been fooling with the clock. + */ + sudo_timespecsub(&entry.ts, &now, &diff); + diff.tv_nsec /= 2; + if (diff.tv_sec & 1) + diff.tv_nsec += 500000000; + diff.tv_sec /= 2; + while (diff.tv_nsec >= 1000000000) { + diff.tv_sec++; + diff.tv_nsec -= 1000000000; + } + + if (sudo_timespeccmp(&diff, &def_timestamp_timeout, >)) { + time_t tv_sec = (time_t)entry.ts.tv_sec; + log_warningx(SLOG_SEND_MAIL, + N_("time stamp too far in the future: %20.20s"), + 4 + ctime(&tv_sec)); + status = TS_OLD; + SET(entry.flags, TS_DISABLED); + (void)ts_write(cookie->fd, cookie->fname, &entry, cookie->pos); + } +#endif /* CLOCK_MONOTONIC */ + } else { + status = TS_OLD; + } + +done: + debug_return_int(status); +} + +/* + * Update the time on the time stamp file/dir or create it if necessary. + * Returns true on success, false on failure or -1 on setuid failure. + */ +bool +timestamp_update(void *vcookie, struct passwd *pw) +{ + struct ts_cookie *cookie = vcookie; + int ret = false; + debug_decl(timestamp_update, SUDOERS_DEBUG_AUTH) + + /* Zero timeout means don't use time stamp files. */ + if (!sudo_timespecisset(&def_timestamp_timeout)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "timestamps disabled"); + goto done; + } + if (cookie == NULL || cookie->pos < 0) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "NULL cookie or invalid position"); + goto done; + } + +#ifdef TIOCSETVERAUTH + if (def_timestamp_type == kernel) { + int fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + int secs = def_timestamp_timeout.tv_sec; + if (secs > 0) { + if (secs > 3600) + secs = 3600; /* OpenBSD limitation */ + if (ioctl(fd, TIOCSETVERAUTH, &secs) != 0) + sudo_warn("TIOCSETVERAUTH"); + } + close(fd); + goto done; + } + } +#endif + + /* Update timestamp in key and enable it. */ + CLR(cookie->key.flags, TS_DISABLED); + if (sudo_gettime_mono(&cookie->key.ts) == -1) { + log_warning(0, N_("unable to read the clock")); + goto done; + } + + /* Write out the locked record. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "writing %zu byte record at %lld", sizeof(cookie->key), + (long long)cookie->pos); + if (ts_write(cookie->fd, cookie->fname, &cookie->key, cookie->pos) != -1) + ret = true; + +done: + debug_return_int(ret); +} + +/* + * Remove the timestamp entry or file if unlink_it is set. + * Returns true on success, false on failure or -1 on setuid failure. + * A missing timestamp entry is not considered an error. + */ +int +timestamp_remove(bool unlink_it) +{ + struct timestamp_entry key, entry; + int fd = -1, ret = true; + char *fname = NULL; + debug_decl(timestamp_remove, SUDOERS_DEBUG_AUTH) + +#ifdef TIOCCLRVERAUTH + if (def_timestamp_type == kernel) { + fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + ioctl(fd, TIOCCLRVERAUTH); + goto done; + } + } +#endif + + if (asprintf(&fname, "%s/%s", def_timestampdir, user_name) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + ret = -1; + goto done; + } + + /* For "sudo -K" simply unlink the time stamp file. */ + if (unlink_it) { + ret = unlink(fname) ? -1 : true; + goto done; + } + + /* Open time stamp file and lock it for exclusive access. */ + fd = ts_open(fname, O_RDWR); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + if (errno != ENOENT) + ret = false; + goto done; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + ret = -1; + goto done; + } + /* Lock first record to gain exclusive access. */ + if (!timestamp_lock_record(fd, -1, sizeof(struct timestamp_entry))) { + sudo_warn(U_("unable to lock time stamp file %s"), fname); + ret = -1; + goto done; + } + + /* + * Find matching entries and invalidate them. + */ + ts_init_key(&key, NULL, 0, def_timestamp_type); + while (ts_find_record(fd, &key, &entry)) { + /* Back up and disable the entry. */ + if (!ISSET(entry.flags, TS_DISABLED)) { + SET(entry.flags, TS_DISABLED); + if (lseek(fd, 0 - (off_t)sizeof(entry), SEEK_CUR) != -1) { + if (ts_write(fd, fname, &entry, -1) == -1) + ret = false; + } + } + } + +done: + if (fd != -1) + close(fd); + free(fname); + debug_return_int(ret); +} + +/* + * Returns true if the user has already been lectured. + */ +bool +already_lectured(int unused) +{ + char status_file[PATH_MAX]; + struct stat sb; + int len; + debug_decl(already_lectured, SUDOERS_DEBUG_AUTH) + + if (ts_secure_dir(def_lecture_status_dir, false, true)) { + len = snprintf(status_file, sizeof(status_file), "%s/%s", + def_lecture_status_dir, user_name); + if (len > 0 && len < ssizeof(status_file)) { + debug_return_bool(stat(status_file, &sb) == 0); + } + log_warningx(SLOG_SEND_MAIL, N_("lecture status path too long: %s/%s"), + def_lecture_status_dir, user_name); + } + debug_return_bool(false); +} + +/* + * Create the lecture status file. + * Returns true on success, false on failure or -1 on setuid failure. + */ +int +set_lectured(void) +{ + char lecture_status[PATH_MAX]; + int len, fd, ret = false; + debug_decl(set_lectured, SUDOERS_DEBUG_AUTH) + + len = snprintf(lecture_status, sizeof(lecture_status), "%s/%s", + def_lecture_status_dir, user_name); + if (len < 0 || len >= ssizeof(lecture_status)) { + log_warningx(SLOG_SEND_MAIL, N_("lecture status path too long: %s/%s"), + def_lecture_status_dir, user_name); + goto done; + } + + /* Sanity check lecture dir and create if missing. */ + if (!ts_secure_dir(def_lecture_status_dir, true, false)) + goto done; + + /* Create lecture file. */ + fd = ts_open(lecture_status, O_WRONLY|O_CREAT|O_EXCL); + switch (fd) { + case TIMESTAMP_OPEN_ERROR: + /* Failed to open, not a fatal error. */ + break; + case TIMESTAMP_PERM_ERROR: + /* Already logged set_perms/restore_perms error. */ + ret = -1; + break; + default: + /* Success. */ + close(fd); + ret = true; + break; + } + +done: + debug_return_int(ret); +} diff --git a/utsudo-0.0.2/plugins/sudoers/timestr.c b/utsudo-0.0.2/plugins/sudoers/timestr.c new file mode 100644 index 0000000..86de364 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/timestr.c @@ -0,0 +1,53 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999, 2009-2011, 2013-2015, 2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_debug.h" +#include "parse.h" + +/* + * Return a static buffer with the current date + time. + */ +char * +get_timestr(time_t tstamp, int log_year) +{ + static char buf[128]; + struct tm *timeptr; + + if ((timeptr = localtime(&tstamp)) != NULL) { + /* strftime() does not guarantee to NUL-terminate so we must check. */ + buf[sizeof(buf) - 1] = '\0'; + if (strftime(buf, sizeof(buf), log_year ? "%h %e %T %Y" : "%h %e %T", + timeptr) != 0 && buf[sizeof(buf) - 1] == '\0') + return buf; + } + return NULL; +} diff --git a/utsudo-0.0.2/plugins/sudoers/toke.c b/utsudo-0.0.2/plugins/sudoers/toke.c new file mode 100644 index 0000000..f7425a1 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/toke.c @@ -0,0 +1,4809 @@ +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#line 3 "toke.c" + +#define YY_INT_ALIGNED short int + +/* $OpenBSD: flex.skl,v 1.16 2017/05/02 19:16:19 millert Exp $ */ + +/* A lexical scanner generated by flex */ + +#define yy_create_buffer sudoers_create_buffer +#define yy_delete_buffer sudoers_delete_buffer +#define yy_flex_debug sudoers_flex_debug +#define yy_init_buffer sudoers_init_buffer +#define yy_flush_buffer sudoers_flush_buffer +#define yy_load_buffer_state sudoers_load_buffer_state +#define yy_switch_to_buffer sudoers_switch_to_buffer +#define yyin sudoersin +#define yyleng sudoersleng +#define yylex sudoerslex +#define yylineno sudoerslineno +#define yyout sudoersout +#define yyrestart sudoersrestart +#define yytext sudoerstext +#define yywrap sudoerswrap +#define yyalloc sudoersalloc +#define yyrealloc sudoersrealloc +#define yyfree sudoersfree + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 39 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* $OpenBSD: flexint.h,v 1.1 2015/11/19 19:43:40 tedu Exp $ */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE sudoersrestart(sudoersin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern yy_size_t sudoersleng; + +extern FILE *sudoersin, *sudoersout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sudoerstext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up sudoerstext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via sudoersrestart()), so that the user can continue scanning by + * just pointing sudoersin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when sudoerstext is formed. */ +static char yy_hold_char; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t sudoersleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow sudoerswrap()'s to do buffer switches + * instead of setting up a fresh sudoersin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void sudoersrestart (FILE *input_file ); +void sudoers_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE sudoers_create_buffer (FILE *file,int size ); +void sudoers_delete_buffer (YY_BUFFER_STATE b ); +void sudoers_flush_buffer (YY_BUFFER_STATE b ); +void sudoerspush_buffer_state (YY_BUFFER_STATE new_buffer ); +void sudoerspop_buffer_state (void ); + +static void sudoersensure_buffer_stack (void ); +static void sudoers_load_buffer_state (void ); +static void sudoers_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER sudoers_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE sudoers_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE sudoers_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE sudoers_scan_bytes (yyconst char *bytes,yy_size_t len ); + +void *sudoersalloc (yy_size_t ); +void *sudoersrealloc (void *,yy_size_t ); +void sudoersfree (void * ); + +#define yy_new_buffer sudoers_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + sudoersensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + sudoersensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define sudoerswrap() 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *sudoersin = (FILE *) 0, *sudoersout = (FILE *) 0; + +typedef int yy_state_type; + +extern int sudoerslineno; + +int sudoerslineno = 1; + +extern char *sudoerstext; +#define yytext_ptr sudoerstext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up sudoerstext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + sudoersleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 74 +#define YY_END_OF_BUFFER 75 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[896] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 75, 62, 70, 69, 73, 68, + 61, 72, 38, 63, 64, 38, 65, 62, 62, 62, + 62, 67, 66, 73, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 73, 62, 62, 70, + 72, 53, 53, 53, 53, 53, 2, 73, 1, 62, + 53, 53, 53, 62, 17, 16, 16, 17, 16, 16, + 73, 72, 73, 3, 9, 8, 9, 4, 9, 5, + 73, 13, 13, 13, 11, 12, 73, 19, 19, 18, + 18, 18, 19, 18, 18, 18, 18, 19, 19, 19, + + 19, 19, 19, 18, 19, 19, 62, 0, 70, 69, + 68, 72, 72, 0, 0, 62, 40, 0, 38, 0, + 39, 0, 60, 60, 0, 62, 62, 0, 62, 62, + 62, 62, 0, 43, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, + 71, 62, 62, 62, 62, 70, 0, 0, 0, 0, + 0, 72, 62, 62, 62, 62, 62, 2, 1, 0, + 1, 54, 54, 0, 53, 62, 17, 17, 15, 0, + 14, 15, 0, 3, 9, 0, 6, 7, 9, 9, + 13, 0, 13, 13, 0, 10, 0, 40, 0, 0, + + 39, 19, 19, 0, 19, 0, 0, 18, 18, 18, + 18, 18, 18, 19, 19, 53, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 72, 72, 72, 0, 40, + 62, 62, 62, 62, 62, 0, 0, 43, 43, 53, + 45, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 62, + 62, 0, 0, 0, 0, 0, 72, 62, 62, 62, + 62, 62, 0, 62, 10, 0, 0, 0, 18, 18, + 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 72, 72, 72, 62, + + 62, 62, 62, 62, 62, 0, 44, 44, 44, 0, + 0, 43, 43, 43, 43, 43, 43, 43, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 49, 53, 53, 50, 62, 62, + 62, 62, 0, 0, 0, 0, 0, 72, 62, 62, + 62, 62, 0, 0, 0, 0, 0, 18, 18, 19, + 19, 53, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 62, 62, 62, 0, 0, + 44, 44, 44, 0, 43, 43, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 0, 27, + + 53, 53, 53, 53, 0, 34, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 51, 53, 53, 62, 62, + 62, 62, 62, 0, 0, 0, 72, 62, 62, 62, + 0, 0, 0, 18, 18, 19, 53, 53, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 62, 62, 62, 62, 62, 0, 44, 0, 43, + 43, 43, 0, 0, 0, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 55, 56, 57, 58, 62, 0, 0, + + 72, 62, 62, 62, 0, 0, 0, 0, 0, 19, + 53, 53, 19, 19, 53, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 41, 41, 41, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, + 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 0, 36, 53, 53, + 53, 0, 26, 53, 53, 53, 0, 35, 53, 53, + 53, 53, 0, 25, 0, 28, 46, 62, 0, 0, + 72, 62, 62, 62, 41, 41, 41, 53, 53, 19, + 53, 53, 19, 19, 19, 62, 41, 41, 41, 41, + + 0, 43, 0, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 0, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 53, 53, 53, 53, 53, 53, 53, 53, 48, 53, + 59, 0, 0, 72, 62, 22, 54, 0, 41, 41, + 41, 41, 53, 53, 19, 53, 53, 19, 19, 19, + 42, 42, 42, 42, 43, 0, 0, 0, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 0, 0, 0, 0, 0, 43, 43, 43, 43, + 43, 43, 43, 43, 53, 53, 53, 0, 37, 53, + + 53, 0, 24, 0, 29, 47, 0, 22, 72, 72, + 62, 0, 62, 42, 42, 42, 42, 53, 53, 53, + 53, 62, 62, 42, 42, 42, 42, 0, 0, 0, + 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 52, 0, 32, 53, 53, 53, 0, 72, + 72, 20, 72, 72, 23, 22, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 42, 42, 42, 42, 53, + 53, 53, 62, 62, 62, 0, 0, 0, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + + 43, 43, 43, 43, 43, 43, 0, 30, 53, 53, + 23, 20, 72, 0, 22, 0, 0, 0, 53, 53, + 62, 62, 62, 62, 62, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 0, 33, + 53, 72, 0, 0, 0, 0, 0, 53, 62, 62, + 62, 43, 43, 43, 43, 43, 43, 0, 31, 72, + 72, 21, 72, 0, 0, 0, 62, 62, 62, 62, + 62, 43, 43, 43, 43, 43, 21, 0, 0, 0, + 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 0 + + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 5, 6, 7, 8, 1, 9, 1, 1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 1, 1, + 29, 30, 12, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, + 41, 47, 48, 49, 50, 51, 52, 53, 54, 41, + 12, 55, 12, 1, 56, 1, 57, 58, 59, 60, + + 61, 62, 63, 64, 65, 63, 63, 66, 67, 68, + 69, 63, 63, 70, 71, 72, 73, 63, 63, 63, + 63, 63, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[74] = + { 0, + 1, 2, 3, 3, 2, 4, 5, 6, 1, 7, + 7, 1, 8, 9, 10, 11, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 14, 15, 7, + 1, 16, 16, 16, 16, 16, 16, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 18, 19, 20, 20, 20, 20, + 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21 + } ; + +static yyconst flex_int16_t yy_base[1020] = + { 0, + 0, 72, 121, 191, 81, 88, 261, 333, 405, 459, + 142, 148, 514, 0, 4774, 4718, 73, 6207, 4769, 4765, + 6207, 585, 73, 6207, 6207, 4715, 6207, 151, 597, 153, + 164, 4741, 6207, 6207, 659, 4726, 46, 34, 715, 58, + 4724, 4710, 50, 4709, 4717, 60, 776, 791, 57, 189, + 816, 66, 63, 4683, 59, 4680, 113, 4735, 129, 204, + 4704, 4703, 4715, 134, 0, 6207, 4743, 4739, 6207, 0, + 880, 933, 137, 0, 4689, 6207, 135, 6207, 140, 6207, + 214, 4688, 154, 194, 6207, 239, 193, 259, 960, 1004, + 258, 232, 1062, 1112, 4700, 160, 180, 1168, 4696, 4708, + + 4694, 4706, 4701, 1215, 0, 156, 4681, 1239, 225, 6207, + 4729, 228, 6207, 4731, 273, 283, 4678, 4717, 332, 1266, + 4676, 1293, 415, 4675, 1322, 1335, 1375, 4681, 4681, 324, + 343, 334, 4657, 228, 1437, 1493, 4631, 4625, 4607, 4594, + 4587, 4573, 335, 4553, 4549, 4535, 4516, 4514, 4510, 371, + 6207, 157, 425, 215, 65, 442, 4488, 4493, 4484, 4479, + 4480, 355, 218, 369, 133, 369, 325, 434, 256, 431, + 377, 584, 4495, 1554, 448, 378, 0, 4543, 412, 4545, + 6207, 6207, 479, 0, 4492, 633, 6207, 6207, 4491, 438, + 4490, 4537, 591, 440, 505, 430, 4540, 736, 737, 659, + + 4487, 843, 0, 1581, 1611, 794, 842, 1650, 4525, 892, + 902, 740, 1700, 1756, 4498, 0, 4503, 4490, 4493, 4490, + 752, 4481, 4469, 4448, 4433, 308, 465, 475, 920, 959, + 1803, 974, 748, 1843, 4465, 4441, 1888, 454, 1934, 1979, + 0, 4423, 4410, 4411, 4394, 4407, 4395, 4402, 4401, 4413, + 4412, 4407, 454, 4394, 4390, 4404, 4402, 4401, 4398, 825, + 573, 4357, 4362, 4352, 4354, 4360, 594, 588, 4363, 572, + 232, 581, 1098, 778, 597, 4403, 4402, 2026, 2036, 4401, + 2081, 0, 4382, 4373, 4358, 4371, 4358, 4365, 4362, 4326, + 4325, 4320, 4294, 4303, 733, 4269, 6207, 508, 646, 2126, + + 730, 0, 0, 800, 773, 4308, 4307, 2164, 831, 4306, + 4305, 609, 984, 2177, 1193, 882, 2223, 2270, 4304, 851, + 4286, 4281, 830, 960, 4271, 4257, 4260, 4257, 4248, 4246, + 4257, 4246, 4229, 4226, 0, 4229, 4227, 0, 834, 111, + 774, 606, 4211, 4197, 4181, 4195, 4159, 946, 821, 1193, + 404, 742, 1236, 4212, 4211, 4199, 1095, 2280, 2325, 1100, + 4157, 833, 1204, 4163, 4156, 4159, 4156, 4147, 4145, 4141, + 4118, 867, 4133, 4139, 4096, 2372, 2384, 2396, 4128, 4127, + 2406, 4127, 4125, 4084, 4060, 804, 1263, 879, 1290, 1076, + 2419, 0, 1321, 2466, 1345, 1355, 2512, 2559, 1377, 6207, + + 4028, 4033, 4034, 4027, 1378, 6207, 4031, 4022, 4007, 4020, + 4007, 4018, 4004, 3998, 3993, 0, 3959, 3959, 875, 202, + 909, 851, 908, 3952, 3923, 3912, 1219, 1220, 1142, 958, + 3955, 3952, 2571, 2581, 2626, 3915, 3922, 3915, 3930, 3921, + 3906, 3889, 3863, 3851, 3851, 3821, 3849, 3846, 3846, 3839, + 3753, 2671, 877, 2711, 2723, 1515, 3770, 3767, 3766, 3746, + 2733, 1274, 3750, 3746, 2780, 1303, 1318, 1397, 1397, 1411, + 2792, 0, 1580, 2839, 1521, 1366, 2885, 2932, 2959, 1588, + 1602, 1629, 1438, 1634, 1653, 1439, 1792, 1686, 1623, 1803, + 1687, 1804, 1805, 3701, 3694, 3684, 3664, 1036, 3670, 3627, + + 1139, 1326, 1152, 1467, 1553, 3640, 3632, 3631, 1681, 1832, + 3585, 3553, 1844, 3532, 974, 1845, 3512, 3507, 1869, 1889, + 0, 0, 0, 0, 3483, 3016, 1863, 1780, 3456, 3426, + 3402, 1908, 3056, 1954, 1820, 3101, 3148, 1999, 3398, 3340, + 3321, 1920, 1414, 1577, 1616, 1621, 2056, 1636, 3160, 0, + 2103, 3207, 2136, 1964, 3253, 3300, 1890, 6207, 3327, 1517, + 1279, 1891, 6207, 1253, 1407, 1574, 2082, 6207, 1610, 1603, + 1566, 1616, 2083, 6207, 2084, 6207, 3277, 1494, 3243, 3236, + 1106, 1564, 1374, 1732, 3266, 3245, 3384, 3166, 3163, 3399, + 3164, 3140, 1760, 882, 3093, 3455, 1882, 3494, 0, 2003, + + 3103, 3084, 2146, 1290, 2197, 1553, 3534, 0, 2245, 3547, + 2300, 2114, 3592, 3639, 3095, 3090, 3651, 1677, 1678, 2015, + 2259, 3088, 2337, 3663, 0, 2350, 3710, 2439, 2156, 3757, + 3784, 1296, 923, 2226, 1614, 1802, 2328, 2467, 3036, 1228, + 3031, 3005, 2992, 2502, 1800, 2626, 3000, 2490, 2971, 2956, + 2952, 2533, 2916, 2899, 3856, 2886, 2882, 2224, 2225, 0, + 3914, 2601, 2646, 1945, 2866, 2871, 2863, 3954, 2850, 2246, + 2347, 2841, 2348, 3966, 0, 2683, 3979, 2694, 2545, 4024, + 4071, 2753, 2828, 2807, 2781, 2765, 1768, 1828, 2805, 1018, + 1043, 4083, 0, 2818, 2079, 2468, 1939, 2306, 6207, 1057, + + 2285, 2327, 6207, 2469, 6207, 2738, 2725, 2603, 2267, 2063, + 1625, 2840, 2875, 2747, 2659, 4095, 2541, 2672, 2886, 2887, + 2888, 4105, 1508, 4145, 0, 2683, 1700, 3026, 2639, 2620, + 2594, 3038, 2530, 2514, 2361, 2385, 3076, 2560, 4185, 0, + 3123, 4198, 3180, 2905, 4243, 4290, 2504, 2458, 4301, 2815, + 2311, 1630, 4328, 2934, 6207, 2961, 2229, 2183, 2154, 1832, + 2720, 6207, 2005, 2608, 2125, 2054, 3102, 2878, 2224, 2050, + 4398, 1980, 4425, 3227, 1994, 1973, 1928, 3046, 1882, 3208, + 3209, 3210, 4440, 4452, 4464, 1836, 1795, 4476, 1758, 1703, + 2712, 2913, 3273, 3057, 4488, 0, 3467, 4501, 3478, 3283, + + 4548, 1673, 1644, 1598, 3312, 1506, 3254, 6207, 3279, 1399, + 6207, 6207, 3145, 3504, 3514, 1410, 1388, 4560, 3593, 3594, + 4572, 2074, 4584, 4596, 3685, 3567, 1332, 1262, 1249, 3614, + 1223, 1170, 3124, 1063, 971, 4608, 0, 3129, 3595, 6207, + 3640, 3489, 3691, 875, 814, 739, 3732, 3736, 4620, 4632, + 4644, 3924, 3934, 3999, 617, 0, 585, 3758, 6207, 2030, + 3504, 6207, 2088, 576, 497, 4656, 4668, 2319, 4680, 4692, + 4011, 6207, 4049, 4115, 3524, 6207, 6207, 4125, 467, 297, + 231, 3844, 4702, 4740, 4778, 4155, 4165, 4218, 58, 4816, + 4228, 6207, 4266, 3769, 6207, 4871, 4892, 4913, 4934, 4955, + + 4976, 4997, 5018, 5039, 5048, 2666, 5068, 5089, 2187, 5110, + 5131, 5152, 5173, 5194, 5215, 5236, 5257, 5278, 2957, 5299, + 5320, 5341, 5350, 5358, 5367, 5387, 5408, 5429, 2429, 5450, + 5471, 5492, 5513, 5534, 5543, 5562, 5571, 5580, 2509, 2530, + 5588, 5596, 5604, 5613, 5621, 5628, 5636, 5644, 5653, 5663, + 2624, 2669, 5671, 5679, 5687, 2751, 2857, 5696, 5706, 5726, + 2927, 5735, 5743, 3119, 5752, 5762, 5782, 2297, 2368, 5791, + 5803, 5812, 5822, 3178, 3244, 5831, 5841, 5850, 5870, 2455, + 5879, 5891, 3250, 3344, 5900, 5910, 5918, 3402, 5927, 5937, + 5957, 5978, 5999, 3416, 3565, 6019, 3590, 6026, 6036, 2617, + + 2818, 6045, 6065, 6086, 6107, 3328, 6128, 3627, 3628, 6137, + 6147, 3633, 3681, 6155, 6165, 6185, 3745, 3746, 3801 + } ; + +static yyconst flex_int16_t yy_def[1020] = + { 0, + 895, 1, 1, 1, 896, 896, 897, 897, 898, 898, + 899, 899, 895, 13, 895, 900, 895, 895, 895, 895, + 895, 901, 902, 895, 895, 903, 895, 904, 900, 29, + 29, 905, 895, 895, 895, 35, 35, 35, 35, 39, + 39, 39, 39, 39, 39, 39, 900, 29, 900, 895, + 901, 35, 35, 39, 39, 39, 895, 906, 895, 907, + 39, 39, 39, 900, 908, 895, 895, 908, 895, 908, + 895, 901, 895, 909, 910, 895, 910, 895, 910, 895, + 911, 912, 912, 912, 895, 895, 913, 914, 915, 895, + 90, 90, 90, 895, 94, 94, 94, 94, 98, 98, + + 98, 98, 98, 90, 93, 93, 900, 900, 895, 895, + 895, 916, 895, 895, 917, 895, 918, 919, 913, 918, + 920, 920, 921, 922, 900, 900, 900, 923, 127, 127, + 127, 127, 924, 925, 895, 135, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 895, + 895, 900, 900, 900, 900, 895, 895, 895, 895, 895, + 895, 916, 900, 127, 900, 900, 900, 895, 895, 895, + 895, 926, 927, 900, 136, 900, 928, 928, 895, 895, + 895, 895, 917, 929, 930, 930, 895, 895, 930, 930, + 931, 895, 931, 931, 895, 895, 895, 913, 913, 913, + + 932, 933, 93, 932, 934, 895, 895, 90, 208, 208, + 208, 208, 895, 213, 214, 935, 214, 214, 214, 214, + 214, 214, 214, 93, 93, 916, 916, 936, 895, 895, + 900, 231, 231, 127, 234, 937, 895, 938, 895, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 900, + 900, 895, 895, 895, 895, 895, 916, 900, 234, 900, + 900, 900, 895, 900, 895, 939, 940, 895, 93, 279, + 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 93, 93, 895, 936, 936, 900, + + 900, 231, 231, 231, 900, 941, 942, 942, 308, 943, + 942, 944, 239, 895, 314, 314, 895, 314, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 900, 900, + 900, 900, 895, 895, 895, 895, 895, 916, 900, 900, + 900, 900, 895, 895, 939, 939, 895, 279, 213, 214, + 214, 945, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 93, 93, 93, 93, 231, 231, 231, 895, 946, + 946, 381, 946, 947, 948, 949, 895, 950, 317, 950, + 895, 391, 950, 895, 394, 394, 895, 394, 895, 895, + + 136, 136, 136, 136, 895, 895, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 900, 900, + 900, 900, 900, 895, 895, 895, 916, 900, 900, 900, + 951, 952, 895, 93, 214, 214, 945, 945, 214, 214, + 214, 214, 214, 214, 214, 214, 93, 93, 93, 93, + 93, 900, 900, 231, 231, 900, 953, 953, 954, 955, + 895, 895, 956, 957, 895, 958, 958, 959, 397, 959, + 895, 471, 959, 895, 474, 474, 895, 474, 895, 479, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 900, 900, 900, 900, 900, 895, 895, + + 960, 900, 900, 900, 895, 895, 961, 961, 895, 214, + 945, 945, 214, 214, 945, 214, 214, 214, 214, 214, + 93, 93, 93, 93, 93, 900, 526, 526, 895, 962, + 963, 461, 895, 533, 533, 895, 533, 895, 895, 964, + 964, 895, 895, 965, 965, 966, 477, 966, 895, 549, + 966, 895, 552, 552, 895, 552, 895, 895, 895, 559, + 559, 895, 895, 559, 559, 559, 895, 895, 559, 559, + 559, 559, 895, 895, 895, 895, 559, 900, 895, 895, + 967, 900, 900, 900, 968, 969, 895, 970, 970, 895, + 970, 970, 590, 590, 971, 900, 900, 900, 598, 598, + + 895, 972, 895, 973, 536, 973, 973, 607, 973, 895, + 610, 610, 895, 610, 974, 975, 895, 895, 976, 976, + 977, 978, 977, 895, 624, 977, 895, 627, 627, 627, + 895, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 900, 895, 895, 979, 900, 900, 900, 895, 895, 980, + 980, 895, 981, 981, 895, 981, 981, 655, 655, 982, + 900, 661, 661, 661, 895, 983, 984, 895, 985, 985, + 986, 987, 986, 986, 674, 986, 895, 677, 677, 895, + 677, 895, 895, 988, 988, 895, 895, 989, 989, 990, + 990, 990, 692, 990, 631, 631, 631, 895, 895, 631, + + 631, 895, 895, 895, 895, 631, 895, 895, 991, 979, + 900, 992, 993, 994, 995, 895, 994, 996, 996, 996, + 996, 900, 900, 900, 724, 724, 900, 895, 895, 997, + 997, 895, 895, 998, 998, 999, 680, 999, 999, 739, + 999, 895, 742, 742, 895, 742, 1000, 1001, 895, 895, + 1002, 1002, 895, 895, 895, 753, 753, 753, 895, 1003, + 1003, 895, 1003, 1004, 900, 1005, 1005, 1005, 1005, 1006, + 1005, 1007, 1007, 895, 895, 994, 994, 895, 895, 996, + 996, 996, 724, 724, 724, 1008, 1009, 895, 895, 1010, + 1010, 1011, 745, 1011, 1011, 795, 1011, 895, 798, 798, + + 798, 895, 1000, 1000, 895, 895, 895, 895, 753, 753, + 895, 895, 1004, 895, 895, 1012, 1013, 895, 996, 996, + 724, 900, 724, 724, 900, 895, 895, 1008, 1008, 895, + 895, 1014, 1014, 1015, 1015, 1015, 836, 836, 895, 895, + 753, 1016, 895, 895, 1012, 1012, 895, 996, 724, 724, + 724, 895, 895, 895, 895, 1017, 1017, 895, 895, 1016, + 1016, 895, 1016, 1018, 1019, 895, 724, 900, 724, 724, + 900, 895, 895, 895, 895, 895, 895, 895, 895, 1018, + 1018, 895, 900, 900, 900, 895, 895, 895, 900, 900, + 900, 895, 895, 895, 0, 895, 895, 895, 895, 895, + + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895 + } ; + +static yyconst flex_int16_t yy_nxt[6281] = + { 0, + 16, 17, 18, 19, 17, 20, 21, 22, 23, 24, + 25, 16, 26, 27, 16, 16, 28, 29, 30, 31, + 29, 29, 29, 29, 29, 29, 29, 32, 33, 34, + 16, 35, 36, 36, 36, 37, 38, 39, 39, 39, + 39, 40, 41, 42, 39, 43, 44, 45, 46, 39, + 39, 39, 39, 39, 47, 16, 48, 48, 48, 48, + 48, 48, 16, 16, 16, 16, 16, 16, 16, 16, + 49, 16, 16, 50, 109, 136, 50, 109, 139, 51, + 118, 144, 17, 66, 67, 17, 68, 136, 69, 17, + 66, 67, 17, 68, 69, 69, 145, 140, 138, 148, + + 119, 69, 141, 146, 136, 52, 53, 136, 69, 70, + 54, 108, 108, 149, 168, 69, 70, 168, 55, 108, + 154, 56, 57, 164, 261, 57, 169, 120, 58, 155, + 171, 166, 163, 171, 59, 71, 421, 60, 150, 151, + 180, 150, 71, 83, 18, 19, 83, 84, 85, 83, + 18, 19, 83, 84, 85, 193, 124, 124, 193, 151, + 124, 124, 61, 187, 62, 108, 63, 39, 188, 39, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 124, 131, 131, 131, 131, 131, 132, 108, 108, 186, + 156, 64, 57, 156, 186, 57, 86, 154, 58, 194, + + 118, 214, 86, 270, 59, 125, 176, 60, 192, 173, + 173, 108, 217, 173, 173, 190, 151, 180, 190, 224, + 199, 214, 157, 158, 218, 495, 109, 159, 225, 109, + 113, 227, 61, 173, 62, 160, 63, 39, 161, 39, + 195, 196, 197, 195, 237, 191, 878, 200, 192, 211, + 211, 211, 211, 211, 212, 239, 108, 171, 174, 201, + 171, 64, 17, 18, 19, 17, 20, 201, 72, 108, + 201, 260, 108, 201, 201, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 268, 108, 203, 351, 201, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 113, 227, 878, 204, 201, 73, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 17, 18, 19, 17, 20, 118, + 72, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 113, 227, 895, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 247, 248, 150, 151, 180, 150, 249, 250, 171, 108, + 251, 171, 252, 253, 107, 272, 200, 73, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 74, 74, 17, 18, 19, 17, + 20, 76, 72, 150, 151, 180, 150, 77, 78, 79, + 124, 124, 267, 108, 124, 124, 150, 151, 180, 150, + 269, 275, 108, 80, 275, 168, 271, 274, 168, 150, + 151, 180, 150, 156, 124, 194, 156, 169, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 108, 81, + 17, 18, 19, 17, 20, 76, 72, 297, 227, 125, + 237, 77, 78, 79, 349, 157, 158, 113, 299, 108, + 159, 313, 878, 247, 248, 331, 332, 80, 160, 249, + 250, 161, 186, 251, 192, 252, 895, 895, 895, 895, + + 895, 895, 895, 895, 895, 895, 195, 196, 197, 195, + 113, 299, 878, 81, 34, 17, 18, 19, 17, 20, + 34, 34, 87, 24, 25, 34, 88, 27, 34, 34, + 89, 90, 91, 92, 90, 90, 90, 90, 90, 90, + 90, 32, 93, 34, 34, 94, 95, 95, 95, 96, + 97, 98, 98, 98, 98, 99, 100, 101, 98, 102, + 98, 103, 98, 98, 98, 98, 98, 98, 73, 34, + 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, + 105, 105, 105, 105, 106, 105, 105, 113, 114, 173, + 173, 878, 193, 173, 173, 193, 113, 227, 275, 115, + + 603, 275, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 126, 173, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 128, 237, 108, 108, 129, 129, + 129, 129, 129, 129, 185, 108, 313, 185, 174, 185, + 185, 342, 108, 349, 793, 192, 185, 349, 297, 299, + 349, 108, 348, 129, 129, 129, 129, 129, 129, 107, + 108, 185, 198, 198, 198, 198, 423, 107, 198, 198, + 107, 107, 198, 107, 107, 107, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 128, 198, 198, 107, + 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, + + 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 108, 136, 129, 129, 129, 129, 129, + 129, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 895, 895, 118, 300, 136, 136, 136, 136, + 136, 136, 372, 373, 843, 374, 136, 280, 280, 280, + 280, 280, 280, 895, 895, 303, 303, 303, 303, 303, + 304, 107, 107, 107, 107, 107, 107, 150, 151, 152, + 153, 107, 107, 107, 108, 107, 107, 287, 288, 107, + 200, 200, 422, 289, 290, 124, 108, 291, 124, 292, + + 128, 124, 430, 107, 107, 107, 107, 124, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 113, 114, + 237, 124, 124, 107, 107, 107, 107, 108, 108, 843, + 115, 313, 108, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 201, 339, 340, 352, 341, 383, 383, + 383, 201, 399, 419, 201, 399, 420, 201, 201, 276, + 277, 278, 276, 276, 276, 276, 276, 276, 276, 403, + 497, 203, 437, 201, 404, 108, 428, 438, 400, 108, + 162, 179, 151, 180, 179, 181, 447, 182, 108, 448, + 843, 181, 452, 182, 387, 237, 494, 204, 201, 392, + + 392, 392, 392, 392, 393, 108, 389, 182, 182, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 108, + 496, 108, 659, 214, 182, 113, 114, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 183, 113, 227, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 124, 405, 108, 108, 405, 124, 124, 498, 124, 124, + 124, 124, 697, 136, 124, 124, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 895, 406, 203, 124, + 124, 302, 302, 302, 302, 302, 302, 302, 302, 302, + + 302, 318, 318, 318, 318, 318, 318, 318, 318, 318, + 318, 427, 108, 591, 206, 124, 203, 504, 592, 207, + 203, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 128, 203, 387, 237, 209, 209, 209, 209, 209, + 209, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 895, 237, + 209, 209, 209, 209, 209, 209, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 895, 603, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 895, + 108, 895, 237, 203, 203, 203, 203, 203, 203, 173, + + 578, 399, 173, 389, 399, 173, 757, 136, 113, 227, + 353, 173, 354, 354, 354, 354, 354, 354, 203, 203, + 203, 203, 203, 203, 203, 173, 173, 400, 203, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 128, + 203, 113, 227, 213, 213, 213, 213, 213, 213, 214, + 214, 214, 214, 215, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 644, 216, 209, 209, + 209, 209, 209, 209, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 895, 108, 793, 581, 214, + + 214, 214, 214, 214, 214, 405, 108, 503, 405, 214, + 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, + 128, 113, 227, 583, 203, 203, 203, 203, 203, 203, + 895, 406, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 107, 107, 107, 107, 107, 108, 107, 107, + 737, 502, 107, 431, 432, 433, 431, 431, 431, 431, + 431, 431, 431, 706, 826, 429, 107, 107, 107, 117, + 117, 117, 117, 117, 108, 117, 117, 826, 136, 117, + 463, 464, 465, 463, 463, 463, 463, 463, 463, 463, + 237, 501, 136, 117, 117, 117, 121, 121, 121, 121, + + 121, 313, 121, 121, 634, 603, 121, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 605, 136, 237, + 121, 121, 121, 124, 633, 107, 123, 107, 107, 123, + 389, 107, 107, 387, 237, 123, 387, 237, 467, 467, + 467, 467, 467, 467, 696, 389, 136, 826, 389, 123, + 123, 107, 231, 232, 233, 231, 231, 231, 231, 231, + 231, 231, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 472, 472, 472, 472, 472, 473, 399, 405, + 108, 399, 405, 550, 550, 550, 550, 550, 551, 108, + 126, 582, 234, 234, 234, 234, 234, 234, 234, 234, + + 234, 234, 128, 843, 400, 406, 234, 234, 234, 234, + 234, 234, 387, 237, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 469, 843, 895, 237, 108, 108, + 237, 234, 234, 234, 234, 234, 234, 107, 469, 562, + 567, 389, 562, 567, 646, 107, 136, 841, 107, 107, + 635, 107, 107, 107, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 128, 563, 568, 107, 240, 240, + 240, 240, 240, 240, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 108, 136, 234, 234, 234, 234, 234, 234, 107, + + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 895, 108, 237, 722, 136, 136, 136, 136, 136, 136, + 452, 584, 453, 453, 453, 453, 453, 453, 549, 549, + 549, 549, 549, 549, 549, 549, 549, 549, 108, 107, + 107, 107, 107, 107, 107, 173, 136, 107, 172, 107, + 107, 172, 108, 107, 107, 641, 632, 172, 895, 108, + 585, 586, 587, 585, 585, 585, 585, 585, 585, 585, + 605, 172, 172, 107, 201, 201, 201, 201, 201, 895, + 201, 201, 895, 237, 201, 387, 237, 545, 545, 545, + + 545, 545, 545, 895, 469, 136, 895, 469, 201, 201, + 201, 124, 639, 136, 237, 895, 124, 124, 108, 124, + 124, 124, 124, 636, 895, 124, 124, 895, 645, 895, + 895, 387, 237, 895, 559, 895, 387, 237, 895, 203, + 124, 124, 136, 469, 637, 387, 237, 560, 547, 136, + 895, 895, 237, 638, 895, 136, 895, 895, 571, 700, + 237, 895, 640, 547, 136, 206, 124, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 561, 564, 108, + 895, 279, 279, 279, 279, 279, 279, 895, 573, 237, + 895, 573, 565, 237, 237, 765, 505, 566, 506, 506, + + 506, 506, 506, 506, 469, 547, 279, 279, 279, 279, + 279, 279, 203, 895, 574, 722, 203, 281, 281, 281, + 281, 281, 281, 281, 281, 281, 281, 128, 203, 570, + 737, 281, 281, 281, 281, 281, 281, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 108, 216, 279, 279, 279, 279, + 279, 279, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 895, 237, 672, 108, 214, 214, 214, + 214, 214, 214, 895, 658, 547, 895, 599, 599, 599, + + 599, 599, 600, 647, 895, 575, 895, 895, 575, 895, + 826, 214, 203, 203, 203, 203, 203, 203, 300, 895, + 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 895, 576, 895, 557, 762, 763, 557, 608, 608, 608, + 608, 608, 609, 569, 237, 562, 567, 572, 562, 567, + 701, 826, 136, 577, 108, 622, 711, 108, 107, 558, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 573, 563, 568, 573, 305, 305, 305, 305, 305, 305, + 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, + 575, 557, 562, 575, 557, 562, 574, 774, 596, 305, + + 305, 305, 305, 305, 305, 307, 308, 309, 309, 309, + 309, 309, 309, 309, 309, 310, 576, 558, 563, 311, + 311, 311, 311, 311, 311, 537, 537, 537, 537, 537, + 537, 537, 537, 537, 537, 538, 108, 539, 539, 539, + 539, 539, 539, 774, 311, 311, 311, 311, 311, 311, + 237, 314, 315, 316, 314, 314, 314, 314, 314, 314, + 314, 317, 727, 727, 727, 318, 318, 318, 318, 318, + 318, 607, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 625, 625, 625, 625, 625, 626, 756, 774, 136, + 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, + + 319, 319, 319, 319, 319, 319, 128, 812, 763, 774, + 319, 319, 319, 319, 319, 319, 615, 616, 617, 615, + 615, 615, 615, 615, 615, 615, 107, 107, 107, 107, + 387, 237, 862, 863, 773, 305, 305, 305, 305, 305, + 305, 353, 547, 356, 356, 356, 356, 356, 357, 354, + 354, 354, 354, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 128, 814, 113, 227, 358, 358, 358, + 358, 358, 358, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 556, 567, 573, 575, 567, 573, 575, 821, + 877, 863, 358, 358, 358, 358, 358, 358, 359, 359, + + 359, 359, 359, 359, 359, 359, 359, 359, 771, 568, + 574, 576, 359, 359, 359, 359, 359, 359, 387, 237, + 620, 620, 620, 620, 620, 620, 753, 764, 108, 136, + 547, 675, 675, 675, 675, 675, 676, 358, 358, 358, + 358, 358, 358, 376, 377, 378, 376, 376, 376, 376, + 376, 376, 376, 624, 624, 624, 624, 624, 624, 624, + 624, 624, 624, 666, 667, 668, 666, 666, 666, 666, + 666, 666, 666, 693, 693, 693, 693, 693, 694, 108, + 108, 381, 381, 382, 383, 383, 383, 383, 383, 383, + 383, 310, 387, 237, 388, 388, 388, 388, 388, 388, + + 388, 388, 388, 388, 389, 184, 184, 184, 390, 390, + 390, 390, 390, 390, 614, 614, 614, 614, 614, 614, + 614, 614, 614, 614, 811, 702, 704, 698, 702, 704, + 698, 770, 810, 390, 390, 390, 390, 390, 390, 237, + 394, 395, 396, 394, 394, 394, 394, 394, 394, 394, + 397, 703, 705, 699, 398, 398, 398, 398, 398, 398, + 603, 603, 670, 670, 670, 670, 670, 670, 761, 762, + 763, 761, 605, 605, 387, 237, 136, 809, 771, 398, + 398, 398, 398, 398, 398, 895, 622, 390, 390, 390, + 390, 390, 390, 390, 390, 390, 390, 434, 434, 434, + + 434, 434, 434, 434, 434, 434, 434, 698, 649, 649, + 698, 434, 434, 434, 434, 434, 434, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 237, 702, 702, + 758, 702, 702, 699, 867, 136, 434, 434, 434, 434, + 434, 434, 435, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 895, 237, 703, 703, 435, 435, 435, 435, + 435, 435, 603, 895, 622, 387, 237, 689, 689, 689, + 689, 689, 689, 108, 672, 672, 603, 622, 136, 650, + 650, 434, 434, 434, 434, 434, 434, 452, 672, 453, + 453, 453, 453, 453, 453, 453, 453, 453, 453, 452, + + 603, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 452, 737, 455, 455, 455, 455, 455, 456, 453, + 453, 453, 453, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 310, 387, 237, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 389, 184, 184, 184, + 466, 466, 466, 466, 466, 466, 692, 692, 692, 692, + 692, 692, 692, 692, 692, 692, 649, 649, 704, 754, + 704, 704, 754, 704, 237, 466, 466, 466, 466, 466, + 466, 387, 237, 468, 468, 468, 468, 468, 468, 468, + 468, 468, 468, 469, 705, 755, 705, 470, 470, 470, + + 470, 470, 470, 709, 113, 227, 709, 714, 715, 716, + 717, 714, 714, 714, 714, 714, 714, 136, 136, 354, + 237, 354, 470, 470, 470, 470, 470, 470, 237, 474, + 475, 476, 474, 474, 474, 474, 474, 474, 474, 477, + 355, 672, 355, 478, 478, 478, 478, 478, 478, 648, + 649, 649, 649, 649, 649, 649, 774, 605, 779, 779, + 779, 710, 740, 740, 740, 740, 740, 741, 478, 478, + 478, 478, 478, 478, 895, 895, 470, 470, 470, 470, + 470, 470, 470, 470, 470, 470, 505, 737, 508, 508, + 508, 508, 508, 509, 506, 506, 506, 506, 434, 434, + + 434, 434, 434, 434, 434, 434, 434, 434, 712, 728, + 113, 227, 434, 434, 434, 434, 434, 434, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 802, 802, + 712, 712, 712, 712, 506, 728, 506, 434, 434, 434, + 434, 434, 434, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 712, 728, 712, 713, 435, 435, 435, + 435, 435, 435, 725, 725, 725, 725, 725, 726, 727, + 727, 727, 727, 754, 774, 116, 754, 813, 116, 507, + 108, 507, 434, 434, 434, 434, 434, 434, 526, 527, + 528, 526, 526, 526, 526, 526, 526, 526, 603, 755, + + 735, 735, 735, 735, 735, 735, 107, 107, 107, 107, + 672, 739, 739, 739, 739, 739, 739, 739, 739, 739, + 739, 761, 762, 763, 761, 108, 452, 603, 453, 453, + 453, 453, 453, 453, 453, 453, 453, 453, 452, 737, + 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 533, 534, 535, 533, 533, 533, 533, 533, 533, 533, + 536, 539, 774, 539, 537, 537, 537, 537, 537, 537, + 747, 748, 749, 747, 747, 747, 747, 747, 747, 747, + 682, 759, 683, 683, 683, 683, 683, 683, 136, 537, + 537, 537, 537, 537, 537, 538, 682, 541, 541, 541, + + 541, 541, 542, 539, 539, 539, 539, 387, 237, 545, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 469, + 387, 237, 682, 544, 544, 544, 544, 544, 544, 803, + 803, 237, 622, 387, 237, 752, 752, 752, 752, 752, + 752, 767, 622, 682, 767, 768, 769, 770, 544, 544, + 544, 544, 544, 544, 387, 237, 546, 546, 546, 546, + 546, 546, 546, 546, 546, 546, 547, 540, 680, 540, + 548, 548, 548, 548, 548, 548, 767, 605, 728, 767, + 768, 769, 770, 768, 769, 770, 728, 895, 895, 895, + 895, 895, 895, 532, 771, 548, 548, 548, 548, 548, + + 548, 237, 552, 553, 554, 552, 552, 552, 552, 552, + 552, 552, 555, 895, 895, 895, 556, 556, 556, 556, + 556, 556, 796, 796, 796, 796, 796, 797, 603, 773, + 721, 720, 771, 782, 780, 754, 781, 506, 754, 506, + 793, 556, 556, 556, 556, 556, 556, 895, 719, 548, + 548, 548, 548, 548, 548, 548, 548, 548, 548, 107, + 557, 755, 807, 557, 718, 807, 230, 107, 648, 230, + 107, 107, 648, 107, 107, 107, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 558, 648, 808, 107, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 108, 136, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 596, 597, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 786, 787, 788, 786, 786, 786, 786, + 786, 786, 786, 728, 108, 729, 729, 729, 729, 729, + 729, 774, 708, 775, 775, 775, 775, 775, 775, 707, + 108, 603, 895, 604, 604, 604, 604, 604, 604, 604, + 604, 604, 604, 605, 793, 108, 136, 606, 606, 606, + 606, 606, 606, 746, 746, 746, 746, 746, 746, 746, + + 746, 746, 746, 767, 237, 682, 767, 768, 769, 770, + 682, 532, 606, 606, 606, 606, 606, 606, 610, 611, + 612, 610, 610, 610, 610, 610, 610, 610, 613, 539, + 385, 539, 614, 614, 614, 614, 614, 614, 603, 603, + 791, 791, 791, 791, 791, 791, 842, 113, 227, 842, + 737, 793, 856, 856, 856, 856, 771, 614, 614, 614, + 614, 614, 614, 895, 660, 606, 606, 606, 606, 606, + 606, 606, 606, 606, 606, 387, 237, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 547, 683, 657, + 683, 619, 619, 619, 619, 619, 619, 795, 795, 795, + + 795, 795, 795, 795, 795, 795, 795, 656, 654, 807, + 895, 895, 807, 895, 895, 653, 619, 619, 619, 619, + 619, 619, 387, 237, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 622, 808, 895, 895, 623, 623, + 623, 623, 623, 623, 816, 817, 818, 816, 816, 816, + 816, 816, 816, 816, 684, 807, 684, 819, 807, 820, + 729, 648, 729, 623, 623, 623, 623, 623, 623, 237, + 627, 628, 629, 627, 627, 627, 627, 627, 627, 627, + 839, 808, 648, 839, 630, 630, 630, 630, 630, 630, + 801, 801, 801, 801, 801, 801, 801, 801, 801, 801, + + 837, 837, 837, 837, 837, 838, 840, 643, 642, 630, + 630, 630, 630, 630, 630, 895, 136, 623, 623, 623, + 623, 623, 623, 623, 623, 623, 623, 107, 237, 802, + 802, 802, 802, 802, 802, 107, 538, 815, 107, 107, + 815, 107, 107, 107, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 730, 538, 730, 107, 136, 136, + 136, 136, 136, 136, 136, 136, 631, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 108, 136, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + + 648, 651, 651, 651, 651, 651, 652, 649, 649, 649, + 649, 203, 683, 538, 683, 203, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 775, 203, 775, 532, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 655, 214, 214, 385, 216, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 661, 662, 663, 664, 661, 661, 661, 661, + 661, 661, 603, 310, 833, 833, 833, 833, 833, 833, + 861, 862, 863, 861, 793, 836, 836, 836, 836, 836, + + 836, 836, 836, 836, 836, 861, 862, 863, 861, 108, + 596, 597, 597, 597, 597, 597, 597, 597, 597, 597, + 597, 815, 815, 815, 815, 815, 815, 815, 815, 815, + 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, + 815, 872, 872, 872, 872, 872, 872, 595, 108, 603, + 594, 670, 670, 670, 670, 670, 670, 670, 670, 670, + 670, 605, 603, 593, 671, 671, 671, 671, 671, 671, + 671, 671, 671, 671, 672, 776, 590, 776, 673, 673, + 673, 673, 673, 673, 852, 853, 854, 852, 852, 852, + 852, 852, 852, 852, 839, 895, 839, 839, 895, 839, + + 729, 589, 729, 673, 673, 673, 673, 673, 673, 677, + 678, 679, 677, 677, 677, 677, 677, 677, 677, 680, + 840, 895, 840, 681, 681, 681, 681, 681, 681, 826, + 588, 827, 827, 827, 827, 827, 827, 827, 828, 827, + 828, 858, 848, 844, 858, 844, 505, 505, 681, 681, + 681, 681, 681, 681, 895, 505, 673, 673, 673, 673, + 673, 673, 673, 673, 673, 673, 682, 859, 685, 685, + 685, 685, 685, 686, 683, 683, 683, 683, 387, 237, + 689, 689, 689, 689, 689, 689, 689, 689, 689, 689, + 622, 845, 580, 845, 688, 688, 688, 688, 688, 688, + + 821, 579, 822, 822, 822, 822, 822, 822, 864, 865, + 866, 864, 864, 864, 864, 864, 864, 864, 108, 688, + 688, 688, 688, 688, 688, 387, 237, 690, 690, 690, + 690, 690, 690, 690, 690, 690, 690, 858, 108, 108, + 858, 691, 691, 691, 691, 691, 691, 843, 108, 844, + 844, 844, 844, 844, 844, 108, 879, 876, 879, 858, + 876, 538, 858, 859, 876, 538, 691, 691, 691, 691, + 691, 691, 895, 532, 691, 691, 691, 691, 691, 691, + 691, 691, 691, 691, 107, 859, 892, 892, 892, 892, + 892, 892, 107, 385, 310, 107, 107, 310, 107, 107, + + 107, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 880, 525, 880, 107, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 695, 136, 136, 136, 108, 136, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 698, 524, 878, + 698, 879, 879, 879, 879, 879, 879, 523, 203, 522, + 521, 520, 203, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 699, 203, 519, 518, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 517, 216, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 722, + 516, 723, 723, 723, 723, 723, 723, 723, 723, 723, + 723, 872, 872, 872, 872, 872, 872, 872, 872, 872, + 872, 873, 873, 873, 873, 873, 873, 873, 873, 873, + 873, 515, 514, 513, 512, 511, 510, 505, 108, 728, + 505, 731, 731, 731, 731, 731, 732, 729, 729, 729, + 729, 603, 424, 735, 735, 735, 735, 735, 735, 735, + 735, 735, 735, 672, 603, 500, 736, 736, 736, 736, + + 736, 736, 736, 736, 736, 736, 737, 499, 493, 492, + 738, 738, 738, 738, 738, 738, 874, 874, 874, 874, + 874, 875, 872, 872, 872, 872, 867, 491, 868, 868, + 868, 868, 868, 868, 490, 738, 738, 738, 738, 738, + 738, 742, 743, 744, 742, 742, 742, 742, 742, 742, + 742, 745, 489, 488, 487, 746, 746, 746, 746, 746, + 746, 486, 485, 484, 483, 108, 872, 872, 872, 872, + 872, 872, 872, 872, 872, 872, 482, 481, 480, 479, + 746, 746, 746, 746, 746, 746, 895, 461, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 738, 387, 237, + + 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, + 774, 385, 777, 777, 777, 777, 777, 778, 779, 779, + 779, 779, 783, 784, 785, 783, 783, 783, 783, 783, + 783, 783, 872, 872, 872, 872, 872, 872, 872, 872, + 872, 872, 886, 887, 888, 886, 886, 886, 886, 886, + 886, 886, 310, 457, 310, 134, 451, 450, 449, 108, + 722, 446, 723, 723, 723, 723, 723, 723, 723, 723, + 723, 723, 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 886, 886, 886, 886, 886, 886, 886, 886, + 886, 886, 445, 444, 443, 442, 441, 440, 439, 108, + + 603, 436, 791, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 737, 603, 353, 792, 792, 792, 792, 792, + 792, 792, 792, 792, 792, 793, 353, 353, 424, 794, + 794, 794, 794, 794, 794, 893, 893, 893, 893, 893, + 894, 892, 892, 892, 892, 889, 889, 889, 889, 889, + 889, 426, 424, 425, 794, 794, 794, 794, 794, 794, + 798, 799, 800, 798, 798, 798, 798, 798, 798, 798, + 424, 418, 417, 416, 801, 801, 801, 801, 801, 801, + 415, 414, 108, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 413, 412, 411, 410, 409, 408, 801, + + 801, 801, 801, 801, 801, 895, 407, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 237, 804, 804, + 804, 804, 804, 805, 802, 802, 802, 802, 107, 402, + 401, 128, 310, 385, 310, 134, 107, 375, 371, 107, + 107, 370, 107, 107, 107, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 369, 368, 367, 107, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 108, 136, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + + 107, 766, 766, 766, 766, 766, 366, 766, 766, 365, + 364, 766, 363, 362, 361, 360, 207, 353, 353, 350, + 347, 346, 345, 344, 343, 766, 766, 766, 772, 772, + 772, 772, 772, 338, 772, 772, 337, 336, 772, 335, + 334, 333, 330, 329, 328, 327, 326, 325, 324, 323, + 322, 321, 772, 772, 772, 821, 320, 822, 822, 822, + 822, 822, 822, 822, 822, 822, 822, 821, 134, 823, + 823, 823, 823, 823, 823, 823, 823, 823, 823, 821, + 126, 824, 824, 824, 824, 824, 825, 822, 822, 822, + 822, 826, 296, 829, 829, 829, 829, 829, 830, 827, + + 827, 827, 827, 603, 295, 833, 833, 833, 833, 833, + 833, 833, 833, 833, 833, 793, 603, 294, 834, 834, + 834, 834, 834, 834, 834, 834, 834, 834, 293, 286, + 285, 284, 835, 835, 835, 835, 835, 835, 283, 282, + 895, 204, 196, 191, 192, 186, 186, 151, 178, 273, + 266, 265, 264, 263, 262, 259, 258, 835, 835, 835, + 835, 835, 835, 895, 257, 835, 835, 835, 835, 835, + 835, 835, 835, 835, 835, 843, 256, 846, 846, 846, + 846, 846, 847, 844, 844, 844, 844, 107, 255, 849, + 850, 851, 849, 849, 849, 849, 849, 849, 849, 821, + + 254, 822, 822, 822, 822, 822, 822, 822, 822, 822, + 822, 821, 246, 822, 822, 822, 822, 822, 822, 822, + 822, 822, 822, 603, 245, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 867, 244, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 867, 243, 869, + 869, 869, 869, 869, 869, 869, 869, 869, 869, 867, + 242, 870, 870, 870, 870, 870, 871, 868, 868, 868, + 868, 878, 241, 881, 881, 881, 881, 881, 882, 879, + 879, 879, 879, 107, 134, 883, 884, 885, 883, 883, + 883, 883, 883, 883, 883, 867, 107, 868, 868, 868, + + 868, 868, 868, 868, 868, 868, 868, 867, 134, 868, + 868, 868, 868, 868, 868, 868, 868, 868, 868, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 206, + 122, 229, 120, 113, 111, 108, 223, 222, 221, 220, + 219, 214, 192, 186, 178, 110, 144, 175, 141, 170, + 167, 165, 147, 146, 143, 142, 108, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 136, 134, 122, + 111, 110, 108, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 108, 890, 890, 890, 890, 890, + + 891, 889, 889, 889, 889, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 108, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 108, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 34, 34, 34, 34, 34, 34, 34, 34, + + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 107, 895, 895, 895, 895, + 895, 895, 107, 895, 107, 107, 107, 107, 895, 895, + 107, 107, 107, 107, 107, 107, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 117, 895, 895, + + 895, 895, 117, 895, 117, 895, 117, 117, 117, 117, + 117, 895, 117, 117, 117, 117, 117, 117, 121, 895, + 895, 895, 895, 895, 895, 121, 895, 121, 121, 121, + 121, 895, 895, 121, 121, 121, 121, 121, 121, 123, + 895, 895, 123, 123, 895, 123, 123, 895, 123, 123, + 123, 123, 895, 895, 123, 123, 123, 123, 123, 123, + 133, 133, 895, 133, 895, 895, 895, 133, 172, 895, + 895, 172, 172, 895, 172, 172, 895, 172, 172, 172, + 172, 895, 895, 172, 172, 172, 172, 172, 172, 177, + 895, 895, 177, 177, 895, 177, 177, 895, 177, 177, + + 177, 177, 895, 177, 177, 177, 895, 177, 177, 177, + 185, 895, 895, 185, 895, 895, 185, 185, 895, 185, + 185, 185, 185, 185, 895, 185, 185, 185, 185, 185, + 185, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 191, 191, 895, 191, 895, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 198, 895, 895, 895, 895, 198, 895, + 198, 895, 198, 198, 198, 198, 198, 895, 198, 198, + 198, 198, 198, 198, 202, 895, 895, 895, 895, 895, + + 895, 202, 895, 202, 202, 202, 202, 895, 202, 202, + 202, 202, 202, 202, 202, 205, 895, 895, 205, 205, + 895, 205, 205, 895, 205, 205, 205, 205, 895, 205, + 205, 205, 205, 205, 205, 205, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 228, 228, 895, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 117, 895, + 895, 895, 895, 895, 895, 117, 895, 117, 117, 117, + 117, 895, 895, 117, 117, 117, 117, 117, 117, 121, + + 895, 895, 895, 895, 895, 895, 121, 895, 121, 121, + 121, 121, 895, 895, 121, 121, 121, 121, 121, 121, + 123, 895, 895, 123, 123, 895, 123, 123, 895, 123, + 123, 123, 123, 895, 895, 123, 123, 123, 123, 123, + 123, 124, 895, 895, 124, 124, 895, 124, 124, 895, + 124, 124, 124, 124, 895, 895, 124, 124, 124, 124, + 124, 124, 133, 133, 895, 133, 895, 895, 895, 133, + 236, 236, 895, 236, 895, 895, 895, 236, 238, 238, + 238, 895, 238, 895, 895, 895, 238, 172, 895, 895, + 172, 172, 895, 172, 172, 895, 172, 172, 172, 172, + + 895, 895, 172, 172, 172, 172, 172, 172, 173, 895, + 895, 173, 173, 895, 173, 173, 895, 173, 173, 173, + 173, 895, 895, 173, 173, 173, 173, 173, 173, 177, + 895, 895, 177, 177, 895, 177, 177, 895, 177, 177, + 177, 177, 895, 177, 177, 177, 895, 177, 177, 177, + 185, 895, 895, 185, 895, 895, 185, 185, 895, 185, + 185, 185, 185, 185, 895, 185, 185, 185, 185, 185, + 185, 191, 191, 895, 191, 895, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 201, 895, 895, 895, 895, 895, 895, 201, + + 895, 201, 201, 201, 201, 895, 895, 201, 201, 201, + 201, 201, 201, 202, 895, 895, 895, 895, 895, 895, + 202, 895, 202, 202, 202, 202, 895, 202, 202, 202, + 202, 202, 202, 202, 205, 895, 895, 205, 205, 895, + 205, 205, 895, 205, 205, 205, 205, 895, 205, 205, + 205, 205, 205, 205, 205, 216, 895, 895, 216, 216, + 895, 216, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 298, 298, 306, 306, 895, 306, 895, 895, 895, + 306, 312, 312, 312, 895, 312, 895, 895, 895, 312, + + 379, 379, 895, 379, 895, 895, 895, 379, 380, 380, + 895, 380, 895, 895, 895, 380, 384, 384, 895, 384, + 895, 895, 895, 384, 386, 386, 386, 895, 386, 895, + 895, 895, 386, 216, 895, 895, 216, 216, 895, 216, + 457, 457, 895, 457, 895, 895, 895, 457, 459, 459, + 895, 459, 895, 895, 895, 459, 460, 460, 895, 460, + 895, 895, 895, 460, 462, 462, 462, 895, 462, 895, + 895, 895, 462, 466, 466, 466, 466, 895, 466, 895, + 895, 895, 466, 529, 529, 895, 529, 895, 895, 895, + 529, 530, 530, 895, 530, 895, 895, 895, 530, 531, + + 531, 895, 531, 895, 895, 895, 531, 543, 543, 543, + 895, 543, 895, 895, 895, 543, 544, 544, 544, 544, + 895, 544, 895, 895, 895, 544, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 601, 601, 895, + 601, 895, 895, 895, 601, 602, 602, 895, 602, 895, + 895, 895, 602, 618, 618, 618, 895, 618, 895, 895, + 895, 618, 619, 619, 619, 619, 895, 619, 895, 895, + 895, 619, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + + 226, 226, 226, 216, 895, 895, 216, 216, 895, 216, + 203, 895, 895, 895, 203, 203, 895, 203, 203, 203, + 895, 895, 203, 203, 665, 665, 895, 665, 895, 895, + 895, 665, 669, 895, 669, 669, 895, 669, 895, 895, + 895, 669, 687, 687, 687, 895, 687, 895, 895, 895, + 687, 688, 688, 688, 688, 895, 688, 895, 895, 895, + 688, 630, 630, 895, 895, 630, 895, 895, 895, 630, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 216, 895, 895, 216, 216, 895, 216, 203, 895, + + 895, 895, 203, 203, 895, 203, 203, 203, 895, 895, + 203, 203, 733, 733, 895, 733, 895, 895, 895, 733, + 734, 895, 734, 734, 895, 734, 895, 895, 895, 734, + 681, 681, 895, 681, 895, 895, 895, 681, 750, 750, + 750, 895, 750, 895, 895, 895, 750, 751, 751, 751, + 895, 895, 751, 895, 895, 895, 751, 760, 760, 760, + 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, + 760, 760, 760, 760, 760, 760, 760, 760, 766, 766, + 895, 766, 766, 766, 895, 766, 895, 766, 766, 766, + 766, 895, 895, 766, 766, 766, 766, 766, 766, 772, + + 772, 895, 772, 772, 772, 895, 772, 895, 772, 772, + 772, 772, 895, 895, 772, 772, 772, 772, 772, 772, + 216, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 216, 216, 895, 216, 216, 895, 216, 789, 789, + 895, 789, 895, 895, 895, 789, 790, 895, 790, 790, + 895, 790, 895, 895, 895, 790, 806, 806, 895, 895, + 806, 895, 895, 895, 806, 760, 760, 760, 760, 760, + 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, + 760, 760, 760, 760, 760, 760, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + + 226, 226, 226, 226, 226, 226, 226, 766, 895, 895, + 895, 895, 895, 895, 766, 895, 766, 766, 766, 766, + 895, 895, 766, 766, 766, 766, 766, 766, 772, 895, + 895, 895, 895, 895, 895, 772, 895, 772, 772, 772, + 772, 895, 895, 772, 772, 772, 772, 772, 772, 831, + 831, 895, 831, 895, 895, 895, 831, 832, 895, 832, + 832, 895, 832, 895, 895, 895, 832, 855, 855, 895, + 855, 895, 895, 895, 855, 856, 895, 856, 895, 895, + 856, 895, 895, 895, 856, 860, 860, 860, 860, 860, + 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, + + 860, 860, 860, 860, 860, 860, 15, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895 + } ; + +static yyconst flex_int16_t yy_chk[6281] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 17, 38, 2, 17, 38, 2, + 23, 43, 5, 5, 5, 5, 5, 37, 5, 6, + 6, 6, 6, 6, 5, 6, 43, 40, 37, 46, + + 23, 6, 40, 55, 53, 2, 2, 52, 5, 5, + 2, 49, 889, 46, 57, 6, 6, 57, 2, 155, + 49, 2, 3, 53, 155, 3, 57, 23, 3, 49, + 59, 55, 52, 59, 3, 5, 340, 3, 73, 73, + 73, 73, 6, 11, 11, 11, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 83, 28, 28, 83, 152, + 28, 28, 3, 77, 3, 340, 3, 3, 79, 3, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 28, 31, 31, 31, 31, 31, 31, 165, 64, 77, + 50, 3, 4, 50, 79, 4, 11, 64, 4, 84, + + 87, 96, 12, 165, 4, 28, 64, 4, 83, 60, + 60, 152, 96, 60, 60, 81, 81, 81, 81, 106, + 87, 97, 50, 50, 97, 420, 109, 50, 106, 109, + 112, 112, 4, 60, 4, 50, 4, 4, 50, 4, + 86, 86, 86, 86, 134, 86, 881, 87, 84, 92, + 92, 92, 92, 92, 92, 134, 420, 169, 60, 88, + 169, 4, 7, 7, 7, 7, 7, 88, 7, 154, + 88, 154, 163, 88, 88, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 163, 271, 88, 271, 88, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 226, 226, 880, 88, 88, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 8, 8, 8, 8, 8, 119, + 8, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 132, 132, 132, 132, 132, 132, 162, 162, 119, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 143, 143, 150, 150, 150, 150, 143, 143, 171, 167, + 143, 171, 143, 143, 164, 167, 119, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + + 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 179, 179, 179, 179, 9, 9, 9, + 123, 123, 162, 166, 123, 123, 153, 153, 153, 153, + 164, 196, 176, 9, 196, 168, 166, 176, 168, 190, + 190, 190, 190, 156, 123, 194, 156, 168, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 351, 9, + 10, 10, 10, 10, 10, 10, 10, 227, 227, 123, + 238, 10, 10, 10, 351, 156, 156, 228, 228, 153, + 156, 238, 879, 175, 175, 253, 253, 10, 156, 175, + 175, 156, 190, 175, 194, 175, 183, 183, 183, 183, + + 183, 183, 183, 183, 183, 183, 195, 195, 195, 195, + 298, 298, 865, 10, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 22, 22, 172, + 172, 864, 193, 172, 172, 193, 267, 267, 275, 22, + + 857, 275, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 29, 172, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 312, 270, 261, 29, 29, + 29, 29, 29, 29, 186, 272, 312, 186, 172, 186, + 186, 261, 268, 270, 855, 193, 186, 268, 299, 299, + 272, 29, 267, 29, 29, 29, 29, 29, 29, 35, + 342, 186, 200, 200, 200, 200, 342, 35, 200, 200, + 35, 35, 200, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 200, 200, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 198, 199, 301, 39, 39, 39, 39, + 39, 39, 295, 295, 846, 295, 39, 212, 212, 212, + 212, 212, 212, 198, 199, 233, 233, 233, 233, 233, + 233, 39, 39, 39, 39, 39, 39, 47, 47, 47, + 47, 47, 47, 47, 301, 47, 47, 221, 221, 47, + 198, 199, 341, 221, 221, 206, 352, 221, 206, 221, + + 305, 206, 352, 47, 47, 47, 48, 206, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 51, 51, + 386, 206, 206, 304, 304, 304, 304, 305, 341, 845, + 51, 386, 274, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 202, 260, 260, 274, 260, 309, 309, + 309, 202, 320, 339, 202, 320, 339, 202, 202, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 323, + 422, 202, 362, 202, 323, 349, 349, 362, 320, 260, + 51, 71, 71, 71, 71, 71, 372, 71, 339, 372, + 844, 71, 453, 71, 388, 388, 419, 202, 202, 316, + + 316, 316, 316, 316, 316, 422, 388, 71, 71, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 419, + 421, 453, 594, 594, 71, 72, 72, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 72, 348, 348, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 89, 324, 423, 421, 324, 89, 89, 423, 89, 89, + 89, 89, 633, 633, 89, 89, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 835, 324, 89, 89, + 89, 232, 232, 232, 232, 232, 232, 232, 232, 232, + + 232, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 348, 430, 515, 89, 89, 90, 430, 515, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 690, 690, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 691, 691, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 93, 834, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 498, 390, 390, 93, 93, 93, 93, 93, 93, 273, + + 498, 360, 273, 390, 360, 273, 700, 700, 581, 581, + 357, 273, 357, 357, 357, 357, 357, 357, 93, 93, + 93, 93, 93, 93, 94, 273, 273, 360, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 501, 501, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 581, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 429, 832, 501, 98, + + 98, 98, 98, 98, 98, 363, 503, 429, 363, 98, + 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, + 350, 427, 427, 503, 98, 98, 98, 98, 98, 98, + 104, 363, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 108, 108, 108, 108, 108, 350, 108, 108, + 831, 428, 108, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 640, 829, 350, 108, 108, 108, 120, + 120, 120, 120, 120, 428, 120, 120, 828, 640, 120, + 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, + 462, 427, 564, 120, 120, 120, 122, 122, 122, 122, + + 122, 462, 122, 122, 564, 604, 122, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 604, 561, 466, + 122, 122, 122, 125, 561, 125, 125, 125, 125, 125, + 466, 125, 125, 467, 467, 125, 393, 393, 393, 393, + 393, 393, 393, 393, 632, 467, 632, 827, 393, 125, + 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 396, 396, 396, 396, 396, 396, 399, 405, + 502, 399, 405, 476, 476, 476, 476, 476, 476, 126, + 127, 502, 127, 127, 127, 127, 127, 127, 127, 127, + + 127, 127, 127, 817, 399, 405, 127, 127, 127, 127, + 127, 127, 468, 468, 469, 469, 469, 469, 469, 469, + 469, 469, 469, 469, 468, 816, 470, 470, 583, 127, + 543, 127, 127, 127, 127, 127, 127, 135, 470, 483, + 486, 543, 483, 486, 583, 135, 565, 810, 135, 135, + 565, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 483, 486, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 504, 806, 723, 136, 136, 136, 136, 136, 136, + 456, 504, 456, 456, 456, 456, 456, 456, 475, 475, + 475, 475, 475, 475, 475, 475, 475, 475, 578, 136, + 136, 136, 136, 136, 136, 174, 560, 174, 174, 174, + 174, 174, 723, 174, 174, 578, 560, 174, 606, 456, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, + 606, 174, 174, 174, 204, 204, 204, 204, 204, 480, + 204, 204, 480, 544, 204, 473, 473, 473, 473, 473, + + 473, 473, 473, 481, 544, 571, 481, 473, 204, 204, + 204, 205, 571, 566, 804, 480, 205, 205, 582, 205, + 205, 205, 205, 566, 489, 205, 205, 489, 582, 481, + 482, 545, 545, 482, 480, 484, 546, 546, 484, 205, + 205, 205, 570, 545, 569, 752, 752, 481, 546, 569, + 489, 548, 548, 570, 485, 572, 482, 485, 489, 635, + 803, 484, 572, 548, 635, 205, 205, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 482, 484, 711, + 485, 208, 208, 208, 208, 208, 208, 488, 491, 802, + 488, 491, 485, 618, 619, 711, 509, 485, 509, 509, + + 509, 509, 509, 509, 618, 619, 208, 208, 208, 208, + 208, 208, 213, 488, 491, 727, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 488, + 790, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 727, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 687, 789, 584, 214, 214, 214, + 214, 214, 214, 487, 593, 687, 487, 528, 528, 528, + + 528, 528, 528, 584, 490, 492, 493, 490, 492, 493, + 787, 593, 214, 214, 214, 214, 214, 214, 231, 487, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 490, 492, 493, 510, 760, 760, 510, 535, 535, 535, + 535, 535, 535, 487, 688, 513, 516, 490, 513, 516, + 636, 786, 636, 493, 645, 688, 645, 231, 234, 510, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 519, 513, 516, 519, 234, 234, 234, 234, 234, 234, + 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, + 520, 557, 562, 520, 557, 562, 519, 779, 597, 234, + + 234, 234, 234, 234, 234, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 520, 557, 562, 237, + 237, 237, 237, 237, 237, 532, 532, 532, 532, 532, + 532, 532, 532, 532, 532, 542, 597, 542, 542, 542, + 542, 542, 542, 777, 237, 237, 237, 237, 237, 237, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 664, 664, 664, 239, 239, 239, 239, 239, + 239, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 554, 554, 554, 554, 554, 554, 697, 776, 697, + 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, + + 240, 240, 240, 240, 240, 240, 240, 763, 763, 775, + 240, 240, 240, 240, 240, 240, 538, 538, 538, 538, + 538, 538, 538, 538, 538, 538, 600, 600, 600, 600, + 620, 620, 860, 860, 772, 240, 240, 240, 240, 240, + 240, 278, 620, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 770, 710, 710, 279, 279, 279, + 279, 279, 279, 547, 547, 547, 547, 547, 547, 547, + 547, 547, 547, 567, 573, 575, 567, 573, 575, 822, + 863, 863, 279, 279, 279, 279, 279, 279, 281, 281, + + 281, 281, 281, 281, 281, 281, 281, 281, 766, 567, + 573, 575, 281, 281, 281, 281, 281, 281, 551, 551, + 551, 551, 551, 551, 551, 551, 695, 710, 822, 695, + 551, 612, 612, 612, 612, 612, 612, 281, 281, 281, + 281, 281, 281, 300, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 629, 629, 629, 629, 629, 629, 765, + 300, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 314, 314, 314, 314, 314, 314, 314, 314, + + 314, 314, 314, 314, 314, 909, 909, 909, 314, 314, + 314, 314, 314, 314, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 759, 658, 659, 634, 658, 659, + 634, 769, 758, 314, 314, 314, 314, 314, 314, 317, + 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, + 317, 658, 659, 634, 317, 317, 317, 317, 317, 317, + 609, 670, 609, 609, 609, 609, 609, 609, 709, 709, + 709, 709, 609, 670, 621, 621, 634, 757, 769, 317, + 317, 317, 317, 317, 317, 318, 621, 318, 318, 318, + 318, 318, 318, 318, 318, 318, 318, 358, 358, 358, + + 358, 358, 358, 358, 358, 358, 358, 698, 968, 968, + 698, 358, 358, 358, 358, 358, 358, 611, 611, 611, + 611, 611, 611, 611, 611, 611, 611, 751, 702, 637, + 701, 702, 637, 698, 868, 701, 358, 358, 358, 358, + 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 623, 623, 702, 637, 359, 359, 359, 359, + 359, 359, 671, 673, 623, 626, 626, 626, 626, 626, + 626, 626, 626, 868, 671, 673, 735, 626, 637, 969, + 969, 359, 359, 359, 359, 359, 359, 376, 735, 376, + 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, + + 736, 377, 377, 377, 377, 377, 377, 377, 377, 377, + 377, 378, 736, 378, 378, 378, 378, 378, 378, 378, + 378, 378, 378, 381, 381, 381, 381, 381, 381, 381, + 381, 381, 381, 381, 391, 391, 391, 391, 391, 391, + 391, 391, 391, 391, 391, 391, 391, 929, 929, 929, + 391, 391, 391, 391, 391, 391, 628, 628, 628, 628, + 628, 628, 628, 628, 628, 628, 980, 980, 638, 696, + 704, 638, 696, 704, 748, 391, 391, 391, 391, 391, + 391, 394, 394, 394, 394, 394, 394, 394, 394, 394, + 394, 394, 394, 394, 638, 696, 704, 394, 394, 394, + + 394, 394, 394, 644, 644, 644, 644, 648, 648, 648, + 648, 648, 648, 648, 648, 648, 648, 638, 696, 939, + 747, 939, 394, 394, 394, 394, 394, 394, 397, 397, + 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, + 940, 734, 940, 397, 397, 397, 397, 397, 397, 652, + 652, 652, 652, 652, 652, 652, 717, 733, 717, 717, + 717, 644, 679, 679, 679, 679, 679, 679, 397, 397, + 397, 397, 397, 397, 398, 738, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 433, 738, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, 434, 434, + + 434, 434, 434, 434, 434, 434, 434, 434, 708, 731, + 764, 764, 434, 434, 434, 434, 434, 434, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 1000, 1000, + 708, 646, 708, 708, 951, 730, 951, 434, 434, 434, + 434, 434, 434, 435, 435, 435, 435, 435, 435, 435, + 435, 435, 435, 646, 729, 646, 646, 435, 435, 435, + 435, 435, 435, 663, 663, 663, 663, 663, 663, 663, + 663, 663, 663, 718, 715, 906, 718, 764, 906, 952, + 646, 952, 435, 435, 435, 435, 435, 435, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 452, 676, 718, + + 676, 676, 676, 676, 676, 676, 726, 726, 726, 726, + 676, 678, 678, 678, 678, 678, 678, 678, 678, 678, + 678, 761, 761, 761, 761, 452, 454, 791, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 455, 791, + 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, + 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, + 461, 956, 714, 956, 461, 461, 461, 461, 461, 461, + 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, + 686, 707, 686, 686, 686, 686, 686, 686, 706, 461, + 461, 461, 461, 461, 461, 465, 685, 465, 465, 465, + + 465, 465, 465, 465, 465, 465, 465, 471, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 689, 689, 684, 471, 471, 471, 471, 471, 471, 1001, + 1001, 750, 689, 694, 694, 694, 694, 694, 694, 694, + 694, 712, 750, 683, 712, 712, 712, 712, 471, 471, + 471, 471, 471, 471, 474, 474, 474, 474, 474, 474, + 474, 474, 474, 474, 474, 474, 474, 957, 672, 957, + 474, 474, 474, 474, 474, 474, 713, 669, 667, 713, + 713, 713, 713, 768, 768, 768, 666, 719, 720, 721, + 719, 720, 721, 665, 712, 474, 474, 474, 474, 474, + + 474, 477, 477, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 477, 719, 720, 721, 477, 477, 477, 477, + 477, 477, 744, 744, 744, 744, 744, 744, 792, 713, + 657, 656, 768, 721, 719, 754, 720, 961, 754, 961, + 792, 477, 477, 477, 477, 477, 477, 478, 654, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 479, + 479, 754, 756, 479, 653, 756, 919, 479, 651, 919, + 479, 479, 650, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, 479, 649, 756, 479, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 728, 728, 728, 728, 728, 728, 728, + 728, 728, 728, 732, 647, 732, 732, 732, 732, 732, + 732, 778, 643, 778, 778, 778, 778, 778, 778, 642, + 526, 533, 794, 533, 533, 533, 533, 533, 533, 533, + 533, 533, 533, 533, 794, 641, 639, 533, 533, 533, + 533, 533, 533, 737, 737, 737, 737, 737, 737, 737, + + 737, 737, 737, 767, 622, 616, 767, 767, 767, 767, + 615, 602, 533, 533, 533, 533, 533, 533, 536, 536, + 536, 536, 536, 536, 536, 536, 536, 536, 536, 964, + 601, 964, 536, 536, 536, 536, 536, 536, 741, 833, + 741, 741, 741, 741, 741, 741, 813, 813, 813, 813, + 741, 833, 838, 838, 838, 838, 767, 536, 536, 536, + 536, 536, 536, 537, 595, 537, 537, 537, 537, 537, + 537, 537, 537, 537, 537, 549, 549, 549, 549, 549, + 549, 549, 549, 549, 549, 549, 549, 549, 974, 592, + 974, 549, 549, 549, 549, 549, 549, 743, 743, 743, + + 743, 743, 743, 743, 743, 743, 743, 591, 589, 780, + 781, 782, 780, 781, 782, 588, 549, 549, 549, 549, + 549, 549, 552, 552, 552, 552, 552, 552, 552, 552, + 552, 552, 552, 552, 552, 780, 781, 782, 552, 552, + 552, 552, 552, 552, 774, 774, 774, 774, 774, 774, + 774, 774, 774, 774, 975, 807, 975, 781, 807, 782, + 983, 586, 983, 552, 552, 552, 552, 552, 552, 555, + 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 809, 807, 585, 809, 555, 555, 555, 555, 555, 555, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + + 800, 800, 800, 800, 800, 800, 809, 580, 579, 555, + 555, 555, 555, 555, 555, 556, 577, 556, 556, 556, + 556, 556, 556, 556, 556, 556, 556, 559, 805, 805, + 805, 805, 805, 805, 805, 559, 541, 1006, 559, 559, + 1006, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 984, 540, 984, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + + 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, + 587, 590, 988, 539, 988, 590, 590, 590, 590, 590, + 590, 590, 590, 590, 590, 590, 994, 590, 994, 531, + 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 590, 530, 590, 590, 590, 590, 590, 590, + 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 596, 596, 596, 596, 596, 596, 596, 596, + 596, 596, 797, 529, 797, 797, 797, 797, 797, 797, + 842, 842, 842, 842, 797, 799, 799, 799, 799, 799, + + 799, 799, 799, 799, 799, 861, 861, 861, 861, 596, + 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, + 598, 814, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 815, 815, 815, 815, 815, 815, 815, 815, 815, + 815, 875, 875, 875, 875, 875, 875, 525, 598, 607, + 518, 607, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 607, 610, 517, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 995, 514, 995, 610, 610, + 610, 610, 610, 610, 826, 826, 826, 826, 826, 826, + 826, 826, 826, 826, 819, 820, 839, 819, 820, 839, + + 997, 512, 997, 610, 610, 610, 610, 610, 610, 613, + 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, + 819, 820, 839, 613, 613, 613, 613, 613, 613, 830, + 511, 830, 830, 830, 830, 830, 830, 1008, 1009, 1008, + 1009, 841, 820, 1012, 841, 1012, 508, 507, 613, 613, + 613, 613, 613, 613, 614, 506, 614, 614, 614, 614, + 614, 614, 614, 614, 614, 614, 617, 841, 617, 617, + 617, 617, 617, 617, 617, 617, 617, 617, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + 624, 1013, 500, 1013, 624, 624, 624, 624, 624, 624, + + 825, 499, 825, 825, 825, 825, 825, 825, 843, 843, + 843, 843, 843, 843, 843, 843, 843, 843, 497, 624, + 624, 624, 624, 624, 624, 627, 627, 627, 627, 627, + 627, 627, 627, 627, 627, 627, 627, 848, 496, 825, + 848, 627, 627, 627, 627, 627, 627, 847, 495, 847, + 847, 847, 847, 847, 847, 494, 1018, 1017, 1018, 858, + 1017, 464, 858, 848, 1017, 463, 627, 627, 627, 627, + 627, 627, 630, 460, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 631, 858, 894, 894, 894, 894, + 894, 894, 631, 459, 458, 631, 631, 457, 631, 631, + + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 1019, 451, 1019, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 655, 450, 882, + 655, 882, 882, 882, 882, 882, 882, 449, 655, 448, + 447, 446, 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 445, 444, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, + + 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, + 443, 655, 655, 655, 655, 655, 655, 655, 655, 655, + 655, 655, 655, 655, 655, 655, 655, 655, 655, 661, + 442, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 852, 852, 852, 852, 852, 852, 852, 852, 852, + 852, 853, 853, 853, 853, 853, 853, 853, 853, 853, + 853, 441, 440, 439, 438, 437, 436, 432, 661, 668, + 431, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 674, 426, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 677, 425, 677, 677, 677, 677, + + 677, 677, 677, 677, 677, 677, 677, 424, 418, 417, + 677, 677, 677, 677, 677, 677, 854, 854, 854, 854, + 854, 854, 854, 854, 854, 854, 871, 415, 871, 871, + 871, 871, 871, 871, 414, 677, 677, 677, 677, 677, + 677, 680, 680, 680, 680, 680, 680, 680, 680, 680, + 680, 680, 413, 412, 411, 680, 680, 680, 680, 680, + 680, 410, 409, 408, 407, 871, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 404, 403, 402, 401, + 680, 680, 680, 680, 680, 680, 681, 385, 681, 681, + 681, 681, 681, 681, 681, 681, 681, 681, 692, 692, + + 692, 692, 692, 692, 692, 692, 692, 692, 692, 692, + 716, 384, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 722, 722, 722, 722, 722, 722, 722, 722, + 722, 722, 874, 874, 874, 874, 874, 874, 874, 874, + 874, 874, 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 383, 382, 380, 379, 375, 374, 373, 722, + 724, 371, 724, 724, 724, 724, 724, 724, 724, 724, + 724, 724, 886, 886, 886, 886, 886, 886, 886, 886, + 886, 886, 887, 887, 887, 887, 887, 887, 887, 887, + 887, 887, 370, 369, 368, 367, 366, 365, 364, 724, + + 739, 361, 739, 739, 739, 739, 739, 739, 739, 739, + 739, 739, 739, 742, 356, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 355, 354, 347, 742, + 742, 742, 742, 742, 742, 888, 888, 888, 888, 888, + 888, 888, 888, 888, 888, 891, 891, 891, 891, 891, + 891, 346, 345, 344, 742, 742, 742, 742, 742, 742, + 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, + 343, 337, 336, 334, 745, 745, 745, 745, 745, 745, + 333, 332, 891, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 331, 330, 329, 328, 327, 326, 745, + + 745, 745, 745, 745, 745, 746, 325, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 749, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, 753, 322, + 321, 319, 311, 310, 307, 306, 753, 296, 294, 753, + 753, 293, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 753, 753, 292, 291, 290, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + + 753, 771, 771, 771, 771, 771, 289, 771, 771, 288, + 287, 771, 286, 285, 284, 283, 280, 277, 276, 269, + 266, 265, 264, 263, 262, 771, 771, 771, 773, 773, + 773, 773, 773, 259, 773, 773, 258, 257, 773, 256, + 255, 254, 252, 251, 250, 249, 248, 247, 246, 245, + 244, 243, 773, 773, 773, 783, 242, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 784, 236, 784, + 784, 784, 784, 784, 784, 784, 784, 784, 784, 785, + 235, 785, 785, 785, 785, 785, 785, 785, 785, 785, + 785, 788, 225, 788, 788, 788, 788, 788, 788, 788, + + 788, 788, 788, 795, 224, 795, 795, 795, 795, 795, + 795, 795, 795, 795, 795, 795, 798, 223, 798, 798, + 798, 798, 798, 798, 798, 798, 798, 798, 222, 220, + 219, 218, 798, 798, 798, 798, 798, 798, 217, 215, + 209, 201, 197, 192, 191, 189, 185, 180, 178, 173, + 161, 160, 159, 158, 157, 149, 148, 798, 798, 798, + 798, 798, 798, 801, 147, 801, 801, 801, 801, 801, + 801, 801, 801, 801, 801, 818, 146, 818, 818, 818, + 818, 818, 818, 818, 818, 818, 818, 821, 145, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 823, + + 144, 823, 823, 823, 823, 823, 823, 823, 823, 823, + 823, 824, 142, 824, 824, 824, 824, 824, 824, 824, + 824, 824, 824, 836, 141, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 849, 140, 849, 849, 849, + 849, 849, 849, 849, 849, 849, 849, 850, 139, 850, + 850, 850, 850, 850, 850, 850, 850, 850, 850, 851, + 138, 851, 851, 851, 851, 851, 851, 851, 851, 851, + 851, 866, 137, 866, 866, 866, 866, 866, 866, 866, + 866, 866, 866, 867, 133, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 869, 129, 869, 869, 869, + + 869, 869, 869, 869, 869, 869, 869, 870, 128, 870, + 870, 870, 870, 870, 870, 870, 870, 870, 870, 883, + 883, 883, 883, 883, 883, 883, 883, 883, 883, 124, + 121, 118, 117, 114, 111, 107, 103, 102, 101, 100, + 99, 95, 82, 75, 68, 67, 63, 62, 61, 58, + 56, 54, 45, 44, 42, 41, 883, 884, 884, 884, + 884, 884, 884, 884, 884, 884, 884, 36, 32, 26, + 20, 19, 16, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 884, 885, 885, 885, 885, 885, + + 885, 885, 885, 885, 885, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 885, 890, 890, 890, 890, 890, 890, 890, + 890, 890, 890, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 890, 896, 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 897, 897, 897, 897, 897, 897, 897, 897, + + 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 898, 898, 898, 898, 898, 898, 898, + 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, + 898, 898, 898, 898, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 899, 900, 0, 0, 0, 0, + 0, 0, 900, 0, 900, 900, 900, 900, 0, 0, + 900, 900, 900, 900, 900, 900, 901, 901, 901, 901, + 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, + 901, 901, 901, 901, 901, 901, 901, 902, 0, 0, + + 0, 0, 902, 0, 902, 0, 902, 902, 902, 902, + 902, 0, 902, 902, 902, 902, 902, 902, 903, 0, + 0, 0, 0, 0, 0, 903, 0, 903, 903, 903, + 903, 0, 0, 903, 903, 903, 903, 903, 903, 904, + 0, 0, 904, 904, 0, 904, 904, 0, 904, 904, + 904, 904, 0, 0, 904, 904, 904, 904, 904, 904, + 905, 905, 0, 905, 0, 0, 0, 905, 907, 0, + 0, 907, 907, 0, 907, 907, 0, 907, 907, 907, + 907, 0, 0, 907, 907, 907, 907, 907, 907, 908, + 0, 0, 908, 908, 0, 908, 908, 0, 908, 908, + + 908, 908, 0, 908, 908, 908, 0, 908, 908, 908, + 910, 0, 0, 910, 0, 0, 910, 910, 0, 910, + 910, 910, 910, 910, 0, 910, 910, 910, 910, 910, + 910, 911, 911, 911, 911, 911, 911, 911, 911, 911, + 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, + 911, 911, 912, 912, 0, 912, 0, 912, 912, 912, + 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, + 912, 912, 912, 913, 0, 0, 0, 0, 913, 0, + 913, 0, 913, 913, 913, 913, 913, 0, 913, 913, + 913, 913, 913, 913, 914, 0, 0, 0, 0, 0, + + 0, 914, 0, 914, 914, 914, 914, 0, 914, 914, + 914, 914, 914, 914, 914, 915, 0, 0, 915, 915, + 0, 915, 915, 0, 915, 915, 915, 915, 0, 915, + 915, 915, 915, 915, 915, 915, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 917, 917, 0, + 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, + 917, 917, 917, 917, 917, 917, 917, 917, 918, 0, + 0, 0, 0, 0, 0, 918, 0, 918, 918, 918, + 918, 0, 0, 918, 918, 918, 918, 918, 918, 920, + + 0, 0, 0, 0, 0, 0, 920, 0, 920, 920, + 920, 920, 0, 0, 920, 920, 920, 920, 920, 920, + 921, 0, 0, 921, 921, 0, 921, 921, 0, 921, + 921, 921, 921, 0, 0, 921, 921, 921, 921, 921, + 921, 922, 0, 0, 922, 922, 0, 922, 922, 0, + 922, 922, 922, 922, 0, 0, 922, 922, 922, 922, + 922, 922, 923, 923, 0, 923, 0, 0, 0, 923, + 924, 924, 0, 924, 0, 0, 0, 924, 925, 925, + 925, 0, 925, 0, 0, 0, 925, 926, 0, 0, + 926, 926, 0, 926, 926, 0, 926, 926, 926, 926, + + 0, 0, 926, 926, 926, 926, 926, 926, 927, 0, + 0, 927, 927, 0, 927, 927, 0, 927, 927, 927, + 927, 0, 0, 927, 927, 927, 927, 927, 927, 928, + 0, 0, 928, 928, 0, 928, 928, 0, 928, 928, + 928, 928, 0, 928, 928, 928, 0, 928, 928, 928, + 930, 0, 0, 930, 0, 0, 930, 930, 0, 930, + 930, 930, 930, 930, 0, 930, 930, 930, 930, 930, + 930, 931, 931, 0, 931, 0, 931, 931, 931, 931, + 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, + 931, 931, 932, 0, 0, 0, 0, 0, 0, 932, + + 0, 932, 932, 932, 932, 0, 0, 932, 932, 932, + 932, 932, 932, 933, 0, 0, 0, 0, 0, 0, + 933, 0, 933, 933, 933, 933, 0, 933, 933, 933, + 933, 933, 933, 933, 934, 0, 0, 934, 934, 0, + 934, 934, 0, 934, 934, 934, 934, 0, 934, 934, + 934, 934, 934, 934, 934, 935, 0, 0, 935, 935, + 0, 935, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 937, 937, 0, 937, 0, 0, 0, + 937, 938, 938, 938, 0, 938, 0, 0, 0, 938, + + 941, 941, 0, 941, 0, 0, 0, 941, 942, 942, + 0, 942, 0, 0, 0, 942, 943, 943, 0, 943, + 0, 0, 0, 943, 944, 944, 944, 0, 944, 0, + 0, 0, 944, 945, 0, 0, 945, 945, 0, 945, + 946, 946, 0, 946, 0, 0, 0, 946, 947, 947, + 0, 947, 0, 0, 0, 947, 948, 948, 0, 948, + 0, 0, 0, 948, 949, 949, 949, 0, 949, 0, + 0, 0, 949, 950, 950, 950, 950, 0, 950, 0, + 0, 0, 950, 953, 953, 0, 953, 0, 0, 0, + 953, 954, 954, 0, 954, 0, 0, 0, 954, 955, + + 955, 0, 955, 0, 0, 0, 955, 958, 958, 958, + 0, 958, 0, 0, 0, 958, 959, 959, 959, 959, + 0, 959, 0, 0, 0, 959, 960, 960, 960, 960, + 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, + 960, 960, 960, 960, 960, 960, 960, 962, 962, 0, + 962, 0, 0, 0, 962, 963, 963, 0, 963, 0, + 0, 0, 963, 965, 965, 965, 0, 965, 0, 0, + 0, 965, 966, 966, 966, 966, 0, 966, 0, 0, + 0, 966, 967, 967, 967, 967, 967, 967, 967, 967, + 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, + + 967, 967, 967, 970, 0, 0, 970, 970, 0, 970, + 971, 0, 0, 0, 971, 971, 0, 971, 971, 971, + 0, 0, 971, 971, 972, 972, 0, 972, 0, 0, + 0, 972, 973, 0, 973, 973, 0, 973, 0, 0, + 0, 973, 976, 976, 976, 0, 976, 0, 0, 0, + 976, 977, 977, 977, 977, 0, 977, 0, 0, 0, + 977, 978, 978, 0, 0, 978, 0, 0, 0, 978, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, + 979, 981, 0, 0, 981, 981, 0, 981, 982, 0, + + 0, 0, 982, 982, 0, 982, 982, 982, 0, 0, + 982, 982, 985, 985, 0, 985, 0, 0, 0, 985, + 986, 0, 986, 986, 0, 986, 0, 0, 0, 986, + 987, 987, 0, 987, 0, 0, 0, 987, 989, 989, + 989, 0, 989, 0, 0, 0, 989, 990, 990, 990, + 0, 0, 990, 0, 0, 0, 990, 991, 991, 991, + 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, + 991, 991, 991, 991, 991, 991, 991, 991, 992, 992, + 0, 992, 992, 992, 0, 992, 0, 992, 992, 992, + 992, 0, 0, 992, 992, 992, 992, 992, 992, 993, + + 993, 0, 993, 993, 993, 0, 993, 0, 993, 993, + 993, 993, 0, 0, 993, 993, 993, 993, 993, 993, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 996, 996, 0, 996, 996, 0, 996, 998, 998, + 0, 998, 0, 0, 0, 998, 999, 0, 999, 999, + 0, 999, 0, 0, 0, 999, 1002, 1002, 0, 0, + 1002, 0, 0, 0, 1002, 1003, 1003, 1003, 1003, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, 1004, 1004, 1004, 1004, + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, + + 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1005, 0, 0, + 0, 0, 0, 0, 1005, 0, 1005, 1005, 1005, 1005, + 0, 0, 1005, 1005, 1005, 1005, 1005, 1005, 1007, 0, + 0, 0, 0, 0, 0, 1007, 0, 1007, 1007, 1007, + 1007, 0, 0, 1007, 1007, 1007, 1007, 1007, 1007, 1010, + 1010, 0, 1010, 0, 0, 0, 1010, 1011, 0, 1011, + 1011, 0, 1011, 0, 0, 0, 1011, 1014, 1014, 0, + 1014, 0, 0, 0, 1014, 1015, 0, 1015, 0, 0, + 1015, 0, 0, 0, 1015, 1016, 1016, 1016, 1016, 1016, + 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, + + 1016, 1016, 1016, 1016, 1016, 1016, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, + 895, 895, 895, 895, 895, 895, 895, 895, 895, 895 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int sudoers_flex_debug; +int sudoers_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *sudoerstext; +#line 1 "toke.l" +#line 2 "toke.l" +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include "sudoers.h" +#include "toke.h" +#include +#include "sudo_digest.h" +#include "sudo_lbuf.h" + +#if defined(HAVE_STRUCT_DIRENT_D_NAMLEN) && HAVE_STRUCT_DIRENT_D_NAMLEN +# define NAMLEN(dirent) (dirent)->d_namlen +#else +# define NAMLEN(dirent) strlen((dirent)->d_name) +#endif + +int sudolineno; /* current sudoers line number. */ +int last_token; /* last token that was parsed. */ +char *sudoers; /* sudoers file being parsed. */ + +/* Default sudoers path, mode and owner (may be set via sudo.conf) */ +const char *sudoers_file = _PATH_SUDOERS; +mode_t sudoers_mode = SUDOERS_MODE; +uid_t sudoers_uid = SUDOERS_UID; +gid_t sudoers_gid = SUDOERS_GID; + +static bool continued, sawspace; +static int prev_state; +static int digest_type = -1; + +static bool push_include_int(char *, bool); +static bool pop_include(void); +static char *parse_include_int(const char *, bool); + +int (*trace_print)(const char *msg) = sudoers_trace_print; + +#define LEXRETURN(n) do { \ + last_token = (n); \ + return (n); \ +} while (0) + +#define ECHO ignore_result(fwrite(sudoerstext, sudoersleng, 1, sudoersout)) + +#define parse_include(_p) (parse_include_int((_p), false)) +#define parse_includedir(_p) (parse_include_int((_p), true)) +#define push_include(_p) (push_include_int((_p), false)) +#define push_includedir(_p) (push_include_int((_p), true)) +#define YY_NO_INPUT 1 + + + + + + +#line 2277 "toke.c" + +#define INITIAL 0 +#define GOTDEFS 1 +#define GOTCMND 2 +#define STARTDEFS 3 +#define INDEFS 4 +#define INSTR 5 +#define WANTDIGEST 6 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int sudoerslex_destroy (void ); + +int sudoersget_debug (void ); + +void sudoersset_debug (int debug_flag ); + +YY_EXTRA_TYPE sudoersget_extra (void ); + +void sudoersset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *sudoersget_in (void ); + +void sudoersset_in (FILE * in_str ); + +FILE *sudoersget_out (void ); + +void sudoersset_out (FILE * out_str ); + +yy_size_t sudoersget_leng (void ); + +char *sudoersget_text (void ); + +int sudoersget_lineno (void ); + +void sudoersset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int sudoerswrap (void ); +#else +extern int sudoerswrap (void ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( sudoerstext, sudoersleng, 1, sudoersout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( sudoersin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( sudoersin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, sudoersin))==0 && ferror(sudoersin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(sudoersin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int sudoerslex (void); + +#define YY_DECL int sudoerslex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after sudoerstext and sudoersleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( sudoersleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (sudoerstext[sudoersleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! sudoersin ) + sudoersin = stdin; + + if ( ! sudoersout ) + sudoersout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + sudoersensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); + } + + sudoers_load_buffer_state( ); + } + + { +#line 115 "toke.l" + +#line 2495 "toke.c" + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of sudoerstext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 896 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 6207 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 116 "toke.l" +{ + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + YY_BREAK +case 2: +YY_RULE_SETUP +#line 121 "toke.l" +BEGIN STARTDEFS; + YY_BREAK +case 3: +YY_RULE_SETUP +#line 123 "toke.l" +{ + BEGIN INDEFS; + LEXTRACE("DEFVAR "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(DEFVAR); + } + YY_BREAK + +case 4: +YY_RULE_SETUP +#line 132 "toke.l" +{ + BEGIN STARTDEFS; + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + YY_BREAK +case 5: +YY_RULE_SETUP +#line 138 "toke.l" +{ + LEXTRACE("= "); + LEXRETURN('='); + } /* return '=' */ + YY_BREAK +case 6: +YY_RULE_SETUP +#line 143 "toke.l" +{ + LEXTRACE("+= "); + LEXRETURN('+'); + } /* return '+' */ + YY_BREAK +case 7: +YY_RULE_SETUP +#line 148 "toke.l" +{ + LEXTRACE("-= "); + LEXRETURN('-'); + } /* return '-' */ + YY_BREAK +case 8: +YY_RULE_SETUP +#line 153 "toke.l" +{ + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 160 "toke.l" +{ + LEXTRACE("WORD(2) "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(WORD); + } + YY_BREAK + + +case 10: +/* rule 10 can match eol */ +YY_RULE_SETUP +#line 169 "toke.l" +{ + /* Line continuation char followed by newline. */ + sudolineno++; + continued = true; + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 175 "toke.l" +{ + LEXTRACE("ENDSTR "); + BEGIN prev_state; + + if (sudoerslval.string == NULL) { + LEXTRACE("ERROR "); /* empty string */ + LEXRETURN(ERROR); + } + if (prev_state == INITIAL || prev_state == GOTDEFS) { + switch (sudoerslval.string[0]) { + case '%': + if (sudoerslval.string[1] == '\0' || + (sudoerslval.string[1] == ':' && + sudoerslval.string[2] == '\0')) { + LEXTRACE("ERROR "); /* empty group */ + LEXRETURN(ERROR); + } + LEXTRACE("USERGROUP "); + LEXRETURN(USERGROUP); + case '+': + if (sudoerslval.string[1] == '\0') { + LEXTRACE("ERROR "); /* empty netgroup */ + LEXRETURN(ERROR); + } + LEXTRACE("NETGROUP "); + LEXRETURN(NETGROUP); + } + } + LEXTRACE("WORD(4) "); + LEXRETURN(WORD); + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 207 "toke.l" +{ + LEXTRACE("BACKSLASH "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 213 "toke.l" +{ + LEXTRACE("STRBODY "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + YY_BREAK + + +case 14: +YY_RULE_SETUP +#line 221 "toke.l" +{ + /* quoted fnmatch glob char, pass verbatim */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext, 2, sawspace)) + yyterminate(); + sawspace = false; + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 229 "toke.l" +{ + /* quoted sudoers special char, strip backslash */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext + 1, 1, sawspace)) + yyterminate(); + sawspace = false; + } + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 237 "toke.l" +{ + BEGIN INITIAL; + yyless(0); + LEXRETURN(COMMAND); + } /* end of command line args */ + YY_BREAK +case 17: +YY_RULE_SETUP +#line 243 "toke.l" +{ + LEXTRACE("ARG "); + if (!fill_args(sudoerstext, sudoersleng, sawspace)) + yyterminate(); + sawspace = false; + } /* a command line arg */ + YY_BREAK + +case 18: +YY_RULE_SETUP +#line 251 "toke.l" +{ + /* Only return DIGEST if the length is correct. */ + yy_size_t digest_len = + sudo_digest_getlen(digest_type); + if ((yy_size_t)sudoersleng == digest_len * 2) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + LEXRETURN(DIGEST); + } + BEGIN INITIAL; + yyless(sudoersleng); + } /* hex digest */ + YY_BREAK +case 19: +YY_RULE_SETUP +#line 266 "toke.l" +{ + /* Only return DIGEST if the length is correct. */ + yy_size_t len, digest_len = + sudo_digest_getlen(digest_type); + if (sudoerstext[sudoersleng - 1] == '=') { + /* use padding */ + len = 4 * ((digest_len + 2) / 3); + } else { + /* no padding */ + len = (4 * digest_len + 2) / 3; + } + if ((yy_size_t)sudoersleng == len) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + LEXRETURN(DIGEST); + } + BEGIN INITIAL; + yyless(sudoersleng); + } /* base64 digest */ + YY_BREAK +case 20: +/* rule 20 can match eol */ +YY_RULE_SETUP +#line 288 "toke.l" +{ + char *path; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + if ((path = parse_include(sudoerstext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDE\n"); + + /* Push current buffer and switch to include file */ + if (!push_include(path)) + yyterminate(); + } + YY_BREAK +case 21: +/* rule 21 can match eol */ +YY_RULE_SETUP +#line 306 "toke.l" +{ + char *path; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + if ((path = parse_includedir(sudoerstext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDEDIR\n"); + + /* + * Push current buffer and switch to include file, + * ignoring missing or empty directories. + */ + if (!push_includedir(path)) + yyterminate(); + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 327 "toke.l" +{ + char deftype; + int n; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + n += sizeof("Defaults") - 1; + if ((deftype = sudoerstext[n++]) != '\0') { + while (isblank((unsigned char)sudoerstext[n])) + n++; + } + BEGIN GOTDEFS; + switch (deftype) { + case ':': + yyless(n); + LEXTRACE("DEFAULTS_USER "); + LEXRETURN(DEFAULTS_USER); + case '>': + yyless(n); + LEXTRACE("DEFAULTS_RUNAS "); + LEXRETURN(DEFAULTS_RUNAS); + case '@': + yyless(n); + LEXTRACE("DEFAULTS_HOST "); + LEXRETURN(DEFAULTS_HOST); + case '!': + yyless(n); + LEXTRACE("DEFAULTS_CMND "); + LEXRETURN(DEFAULTS_CMND); + default: + LEXTRACE("DEFAULTS "); + LEXRETURN(DEFAULTS); + } + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 367 "toke.l" +{ + int n; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + switch (sudoerstext[n]) { + case 'H': + LEXTRACE("HOSTALIAS "); + LEXRETURN(HOSTALIAS); + case 'C': + LEXTRACE("CMNDALIAS "); + LEXRETURN(CMNDALIAS); + case 'U': + LEXTRACE("USERALIAS "); + LEXRETURN(USERALIAS); + case 'R': + LEXTRACE("RUNASALIAS "); + LEXRETURN(RUNASALIAS); + } + } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 393 "toke.l" +{ + /* cmnd does not require passwd for this user */ + LEXTRACE("NOPASSWD "); + LEXRETURN(NOPASSWD); + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 399 "toke.l" +{ + /* cmnd requires passwd for this user */ + LEXTRACE("PASSWD "); + LEXRETURN(PASSWD); + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 405 "toke.l" +{ + LEXTRACE("NOEXEC "); + LEXRETURN(NOEXEC); + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 410 "toke.l" +{ + LEXTRACE("EXEC "); + LEXRETURN(EXEC); + } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 415 "toke.l" +{ + LEXTRACE("SETENV "); + LEXRETURN(SETENV); + } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 420 "toke.l" +{ + LEXTRACE("NOSETENV "); + LEXRETURN(NOSETENV); + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 425 "toke.l" +{ + LEXTRACE("LOG_OUTPUT "); + LEXRETURN(LOG_OUTPUT); + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 430 "toke.l" +{ + LEXTRACE("NOLOG_OUTPUT "); + LEXRETURN(NOLOG_OUTPUT); + } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 435 "toke.l" +{ + LEXTRACE("LOG_INPUT "); + LEXRETURN(LOG_INPUT); + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 440 "toke.l" +{ + LEXTRACE("NOLOG_INPUT "); + LEXRETURN(NOLOG_INPUT); + } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 445 "toke.l" +{ + LEXTRACE("MAIL "); + LEXRETURN(MAIL); + } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 450 "toke.l" +{ + LEXTRACE("NOMAIL "); + LEXRETURN(NOMAIL); + } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 455 "toke.l" +{ + LEXTRACE("FOLLOW "); + LEXRETURN(FOLLOWLNK); + } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 460 "toke.l" +{ + LEXTRACE("NOFOLLOW "); + LEXRETURN(NOFOLLOWLNK); + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 465 "toke.l" +{ + /* empty group or netgroup */ + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 471 "toke.l" +{ + /* netgroup */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NETGROUP "); + LEXRETURN(NETGROUP); + } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 479 "toke.l" +{ + /* group */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("USERGROUP "); + LEXRETURN(USERGROUP); + } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 487 "toke.l" +{ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 494 "toke.l" +{ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 501 "toke.l" +{ + if (!ipv6_valid(sudoerstext)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 512 "toke.l" +{ + if (!ipv6_valid(sudoerstext)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 523 "toke.l" +{ + LEXTRACE("ALL "); + LEXRETURN(ALL); + + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 529 "toke.l" +{ + LEXTRACE("CMND_TIMEOUT "); + LEXRETURN(CMND_TIMEOUT); + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 534 "toke.l" +{ + LEXTRACE("NOTBEFORE "); + LEXRETURN(NOTBEFORE); + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 539 "toke.l" +{ + LEXTRACE("NOTAFTER "); + LEXRETURN(NOTAFTER); + } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 544 "toke.l" +{ +#ifdef HAVE_SELINUX + LEXTRACE("ROLE "); + LEXRETURN(ROLE); +#else + goto got_alias; +#endif + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 553 "toke.l" +{ +#ifdef HAVE_SELINUX + LEXTRACE("TYPE "); + LEXRETURN(TYPE); +#else + goto got_alias; +#endif + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 561 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + LEXRETURN(PRIVS); +#else + goto got_alias; +#endif + } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 570 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + LEXRETURN(LIMITPRIVS); +#else + goto got_alias; +#endif + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 579 "toke.l" +{ + got_alias: + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("ALIAS "); + LEXRETURN(ALIAS); + } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 587 "toke.l" +{ + /* XXX - no way to specify digest for command */ + /* no command args allowed for Defaults!/path */ + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("COMMAND "); + LEXRETURN(COMMAND); + } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 596 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA224; + BEGIN WANTDIGEST; + LEXTRACE("SHA224_TOK "); + LEXRETURN(SHA224_TOK); + } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 603 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA256; + BEGIN WANTDIGEST; + LEXTRACE("SHA256_TOK "); + LEXRETURN(SHA256_TOK); + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 610 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA384; + BEGIN WANTDIGEST; + LEXTRACE("SHA384_TOK "); + LEXRETURN(SHA384_TOK); + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 617 "toke.l" +{ + digest_type = SUDO_DIGEST_SHA512; + BEGIN WANTDIGEST; + LEXTRACE("SHA512_TOK "); + LEXRETURN(SHA512_TOK); + } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 624 "toke.l" +{ + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* sudo -e */ + YY_BREAK +case 60: +YY_RULE_SETUP +#line 631 "toke.l" +{ + /* directories can't have args... */ + if (sudoerstext[sudoersleng - 1] == '/') { + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(COMMAND); + } else { + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } + } /* a pathname */ + YY_BREAK +case 61: +YY_RULE_SETUP +#line 646 "toke.l" +{ + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 653 "toke.l" +{ + /* a word */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(5) "); + LEXRETURN(WORD); + } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 661 "toke.l" +{ + LEXTRACE("( "); + LEXRETURN('('); + } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 666 "toke.l" +{ + LEXTRACE(") "); + LEXRETURN(')'); + } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 671 "toke.l" +{ + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + YY_BREAK +case 66: +YY_RULE_SETUP +#line 676 "toke.l" +{ + LEXTRACE("= "); + LEXRETURN('='); + } /* return '=' */ + YY_BREAK +case 67: +YY_RULE_SETUP +#line 681 "toke.l" +{ + LEXTRACE(": "); + LEXRETURN(':'); + } /* return ':' */ + YY_BREAK +case 68: +YY_RULE_SETUP +#line 686 "toke.l" +{ + if (sudoersleng & 1) { + LEXTRACE("!"); + LEXRETURN('!'); /* return '!' */ + } + } + YY_BREAK +case 69: +/* rule 69 can match eol */ +YY_RULE_SETUP +#line 693 "toke.l" +{ + if (YY_START == INSTR) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); /* line break in string */ + } + BEGIN INITIAL; + sudolineno++; + continued = false; + LEXTRACE("\n"); + LEXRETURN(COMMENT); + } /* return newline */ + YY_BREAK +case 70: +YY_RULE_SETUP +#line 705 "toke.l" +{ /* throw away space/tabs */ + sawspace = true; /* but remember for fill_args */ + } + YY_BREAK +case 71: +/* rule 71 can match eol */ +YY_RULE_SETUP +#line 709 "toke.l" +{ + sawspace = true; /* remember for fill_args */ + sudolineno++; + continued = true; + } /* throw away EOL after \ */ + YY_BREAK +case 72: +/* rule 72 can match eol */ +YY_RULE_SETUP +#line 715 "toke.l" +{ + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(sudoersin)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + LEXTRACE("#\n"); + LEXRETURN(COMMENT); + } /* comment, not uid/gid */ + YY_BREAK +case 73: +YY_RULE_SETUP +#line 729 "toke.l" +{ + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } /* parse error */ + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(GOTDEFS): +case YY_STATE_EOF(GOTCMND): +case YY_STATE_EOF(STARTDEFS): +case YY_STATE_EOF(INDEFS): +case YY_STATE_EOF(INSTR): +case YY_STATE_EOF(WANTDIGEST): +#line 734 "toke.l" +{ + if (YY_START != INITIAL) { + BEGIN INITIAL; + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!pop_include()) + yyterminate(); + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 744 "toke.l" +ECHO; + YY_BREAK +#line 3421 "toke.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed sudoersin at a new source and called + * sudoerslex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = sudoersin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( sudoerswrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * sudoerstext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of sudoerslex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + yy_size_t new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + sudoersrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + sudoersrestart(sudoersin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) sudoersrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 896 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 896 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 895); + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + sudoersrestart(sudoersin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( sudoerswrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve sudoerstext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void sudoersrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + sudoersensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sudoers_create_buffer(sudoersin,YY_BUF_SIZE ); + } + + sudoers_init_buffer(YY_CURRENT_BUFFER,input_file ); + sudoers_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void sudoers_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * sudoerspop_buffer_state(); + * sudoerspush_buffer_state(new_buffer); + */ + sudoersensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + sudoers_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (sudoerswrap()) processing, but the only time this flag + * is looked at is after sudoerswrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void sudoers_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + sudoersin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE sudoers_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) sudoersalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) sudoersalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + sudoers_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with sudoers_create_buffer() + * + */ + void sudoers_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + sudoersfree((void *) b->yy_ch_buf ); + + sudoersfree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a sudoersrestart() or at EOF. + */ + static void sudoers_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + sudoers_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then sudoers_init_buffer was _probably_ + * called from sudoersrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void sudoers_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + sudoers_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void sudoerspush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + sudoersensure_buffer_stack(); + + /* This block is copied from sudoers_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from sudoers_switch_to_buffer. */ + sudoers_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void sudoerspop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + sudoers_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + sudoers_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void sudoersensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)sudoersalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sudoersensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)sudoersrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sudoersensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sudoers_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) sudoersalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + sudoers_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to sudoerslex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * sudoers_scan_bytes() instead. + */ +YY_BUFFER_STATE sudoers_scan_string (yyconst char * yystr ) +{ + + return sudoers_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to sudoerslex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sudoers_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) sudoersalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in sudoers_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = sudoers_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in sudoers_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sudoerstext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + sudoerstext[sudoersleng] = (yy_hold_char); \ + (yy_c_buf_p) = sudoerstext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + sudoersleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int sudoersget_lineno (void) +{ + + return sudoerslineno; +} + +/** Get the input stream. + * + */ +FILE *sudoersget_in (void) +{ + return sudoersin; +} + +/** Get the output stream. + * + */ +FILE *sudoersget_out (void) +{ + return sudoersout; +} + +/** Get the length of the current token. + * + */ +yy_size_t sudoersget_leng (void) +{ + return sudoersleng; +} + +/** Get the current token. + * + */ + +char *sudoersget_text (void) +{ + return sudoerstext; +} + +/** Set the current line number. + * @param line_number + * + */ +void sudoersset_lineno (int line_number ) +{ + + sudoerslineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see sudoers_switch_to_buffer + */ +void sudoersset_in (FILE * in_str ) +{ + sudoersin = in_str ; +} + +void sudoersset_out (FILE * out_str ) +{ + sudoersout = out_str ; +} + +int sudoersget_debug (void) +{ + return sudoers_flex_debug; +} + +void sudoersset_debug (int bdebug ) +{ + sudoers_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from sudoerslex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + sudoersin = stdin; + sudoersout = stdout; +#else + sudoersin = (FILE *) 0; + sudoersout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * sudoerslex_init() + */ + return 0; +} + +/* sudoerslex_destroy is for both reentrant and non-reentrant scanners. */ +int sudoerslex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + sudoers_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + sudoerspop_buffer_state(); + } + + /* Destroy the stack itself. */ + sudoersfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * sudoerslex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *sudoersalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *sudoersrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void sudoersfree (void * ptr ) +{ + free( (char *) ptr ); /* see sudoersrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 744 "toke.l" + + +struct path_list { + SLIST_ENTRY(path_list) entries; + char *path; +}; + +SLIST_HEAD(path_list_head, path_list); + +struct include_stack { + YY_BUFFER_STATE bs; + char *path; + struct path_list_head more; /* more files in case of includedir */ + int lineno; + bool keepopen; +}; + +/* + * Compare two struct path_list structs in reverse order. + */ +static int +pl_compare(const void *v1, const void *v2) +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return strcmp((*p2)->path, (*p1)->path); +} + +/* + * Open dirpath and fill in pathsp with an array of regular files + * that do not end in '~' or contain a '.'. + * Returns the number of files or -1 on error. + * If zero files are found, NULL is stored in pathsp. + */ +static int +read_dir_files(const char *dirpath, struct path_list ***pathsp) +{ + DIR *dir; + int i, count = 0; + int max_paths = 32; + struct dirent *dent; + struct path_list **paths = NULL; + debug_decl(read_dir_files, SUDOERS_DEBUG_PARSER) + + dir = opendir(dirpath); + if (dir == NULL) { + if (errno == ENOENT) + goto done; + sudo_warn("%s", dirpath); + goto bad; + } + paths = reallocarray(NULL, max_paths, sizeof(*paths)); + if (paths == NULL) + goto oom; + while ((dent = readdir(dir)) != NULL) { + struct path_list *pl; + struct stat sb; + size_t len; + char *path; + + /* Ignore files that end in '~' or have a '.' in them. */ + if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~' + || strchr(dent->d_name, '.') != NULL) { + continue; + } + len = strlen(dirpath) + 1 + NAMLEN(dent); + if ((path = rcstr_alloc(len)) == NULL) + goto oom; + (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + rcstr_delref(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) { + rcstr_delref(path); + goto oom; + } + pl->path = path; + if (count >= max_paths) { + struct path_list **tmp; + max_paths <<= 1; + tmp = reallocarray(paths, max_paths, sizeof(*paths)); + if (tmp == NULL) { + rcstr_delref(path); + free(pl); + goto oom; + } + paths = tmp; + } + paths[count++] = pl; + } + closedir(dir); + if (count == 0) { + free(paths); + paths = NULL; + } +done: + *pathsp = paths; + debug_return_int(count); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + sudoerserror(NULL); + if (dir != NULL) + closedir(dir); + for (i = 0; i < count; i++) { + rcstr_delref(paths[i]->path); + free(paths[i]); + } + free(paths); + debug_return_int(-1); +} + +/* + * Push a list of all files in dirpath onto stack. + * Returns the number of files or -1 on error. + */ +static int +switch_dir(struct include_stack *stack, char *dirpath) +{ + struct path_list **paths = NULL; + int count, i; + debug_decl(switch_dir, SUDOERS_DEBUG_PARSER) + + count = read_dir_files(dirpath, &paths); + if (count > 0) { + /* Sort the list as an array in reverse order. */ + qsort(paths, count, sizeof(*paths), pl_compare); + + /* Build up the list in sorted order. */ + for (i = 0; i < count; i++) { + SLIST_INSERT_HEAD(&stack->more, paths[i], entries); + } + free(paths); + } + + debug_return_int(count); +} + +#define MAX_SUDOERS_DEPTH 128 +#define SUDOERS_STACK_INCREMENT 16 + +static size_t istacksize, idepth; +static struct include_stack *istack; +static bool keepopen; + +void +init_lexer(void) +{ + struct path_list *pl; + debug_decl(init_lexer, SUDOERS_DEBUG_PARSER) + + while (idepth) { + idepth--; + while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + rcstr_delref(pl->path); + free(pl); + } + rcstr_delref(istack[idepth].path); + if (idepth && !istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + sudoers_delete_buffer(istack[idepth].bs); + } + free(istack); + istack = NULL; + istacksize = idepth = 0; + sudolineno = 1; + keepopen = false; + sawspace = false; + continued = false; + digest_type = -1; + prev_state = INITIAL; + + debug_return; +} + +/* + * Open an include file (or file from a directory), push the old + * sudoers file buffer and switch to the new one. + * A missing or insecure include dir is simply ignored. + * Returns false on error, else true. + */ +static bool +push_include_int(char *path, bool isdir) +{ + struct path_list *pl; + FILE *fp; + debug_decl(push_include_int, SUDOERS_DEBUG_PARSER) + + /* push current state onto stack */ + if (idepth >= istacksize) { + struct include_stack *new_istack; + + if (idepth > MAX_SUDOERS_DEPTH) { + sudoerserror(N_("too many levels of includes")); + debug_return_bool(false); + } + istacksize += SUDOERS_STACK_INCREMENT; + new_istack = reallocarray(istack, istacksize, sizeof(*istack)); + if (new_istack == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + istack = new_istack; + } + SLIST_INIT(&istack[idepth].more); + if (isdir) { + struct stat sb; + int count, status; + + status = sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb); + if (status != SUDO_PATH_SECURE) { + if (sudoers_warnings) { + switch (status) { + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx(U_("%s is world writable"), path); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx(U_("%s is owned by gid %u, should be %u"), + path, (unsigned int) sb.st_gid, + (unsigned int) sudoers_gid); + break; + default: + break; + } + } + /* A missing or insecure include dir is not a fatal error. */ + debug_return_bool(true); + } + count = switch_dir(&istack[idepth], path); + if (count <= 0) { + /* switch_dir() called sudoerserror() for us */ + rcstr_delref(path); + debug_return_bool(count ? false : true); + } + + /* Parse the first dir entry we can open, leave the rest for later. */ + do { + rcstr_delref(path); + if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { + /* Unable to open any files in include dir, not an error. */ + debug_return_bool(true); + } + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + path = pl->path; + free(pl); + } while ((fp = open_sudoers(path, false, &keepopen)) == NULL); + } else { + if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { + /* The error was already printed by open_sudoers() */ + sudoerserror(NULL); + debug_return_bool(false); + } + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path (and its ref) */ + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + + debug_return_bool(true); +} + +/* + * Restore the previous sudoers file and buffer, or, in the case + * of an includedir, switch to the next file in the dir. + * Returns false if there is nothing to pop, else true. + */ +static bool +pop_include(void) +{ + struct path_list *pl; + FILE *fp; + debug_decl(pop_include, SUDOERS_DEBUG_PARSER) + + if (idepth == 0 || YY_CURRENT_BUFFER == NULL) + debug_return_bool(false); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + sudoers_delete_buffer(YY_CURRENT_BUFFER); + /* If we are in an include dir, move to the next file. */ + while ((pl = SLIST_FIRST(&istack[idepth - 1].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth - 1].more, entries); + fp = open_sudoers(pl->path, false, &keepopen); + if (fp != NULL) { + rcstr_delref(sudoers); + sudoers = pl->path; + sudolineno = 1; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + free(pl); + break; + } + /* Unable to open path in include dir, go to next one. */ + rcstr_delref(pl->path); + free(pl); + } + /* If no path list, just pop the last dir on the stack. */ + if (pl == NULL) { + idepth--; + sudoers_switch_to_buffer(istack[idepth].bs); + rcstr_delref(sudoers); + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; + keepopen = istack[idepth].keepopen; + } + debug_return_bool(true); +} + +static char * +parse_include_int(const char *base, bool isdir) +{ + const char *cp, *ep; + char *path, *pp; + int dirlen = 0, len = 0, subst = 0; + size_t shost_len = 0; + debug_decl(parse_include, SUDOERS_DEBUG_PARSER) + + /* Pull out path from #include line. */ + cp = base + (isdir ? sizeof("#includedir") : sizeof("#include")); + while (isblank((unsigned char) *cp)) + cp++; + ep = cp; + while (*ep != '\0' && !isspace((unsigned char) *ep)) { + if (ep[0] == '%' && ep[1] == 'h') { + shost_len = strlen(user_shost); + len += shost_len - 2; + subst = 1; + } + ep++; + } + + /* Relative paths are located in the same dir as the sudoers file. */ + if (*cp != '/') { + char *dirend = strrchr(sudoers, '/'); + if (dirend != NULL) + dirlen = (int)(dirend - sudoers) + 1; + } + + /* Make a copy of the fully-qualified path and return it. */ + len += (int)(ep - cp); + path = pp = rcstr_alloc(len + dirlen); + if (path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_str(NULL); + } + if (dirlen) { + memcpy(path, sudoers, dirlen); + pp += dirlen; + } + if (subst) { + /* substitute for %h */ + while (cp < ep) { + if (cp[0] == '%' && cp[1] == 'h') { + memcpy(pp, user_shost, shost_len); + pp += shost_len; + cp += 2; + continue; + } + *pp++ = *cp++; + } + *pp = '\0'; + } else { + memcpy(pp, cp, len); + pp[len] = '\0'; + } + + /* Push any excess characters (e.g. comment, newline) back to the lexer */ + if (*ep != '\0') + yyless((int)(ep - base)); + + debug_return_str(path); +} + +#ifdef TRACELEXER +int +sudoers_trace_print(const char *msg) +{ + return fputs(msg, stderr); +} +#else +int +sudoers_trace_print(const char *msg) +{ + static bool initialized; + static struct sudo_lbuf lbuf; + + if (!initialized) { + initialized = true; + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0); + } + + sudo_lbuf_append(&lbuf, "%s", msg); + /* XXX - assumes a final newline */ + if (strchr(msg, '\n') != NULL) + { + sudo_debug_printf2(NULL, NULL, 0, SUDOERS_DEBUG_PARSER|SUDO_DEBUG_DEBUG, + "%s:%d %s", sudoers, sudolineno, lbuf.buf); + lbuf.len = 0; + } + return 0; +} +#endif /* TRACELEXER */ + diff --git a/utsudo-0.0.2/plugins/sudoers/toke.h b/utsudo-0.0.2/plugins/sudoers/toke.h new file mode 100644 index 0000000..5756979 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/toke.h @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2013, 2015-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDOERS_TOKE_H +#define SUDOERS_TOKE_H + +bool append(const char *, size_t); +bool fill_args(const char *, size_t, int); +bool fill_cmnd(const char *, size_t); +bool fill_txt(const char *, size_t, size_t); +bool ipv6_valid(const char *s); +int sudoers_trace_print(const char *msg); +void sudoerserror(const char *); + +#ifndef FLEX_SCANNER +extern int (*trace_print)(const char *msg); +#endif + +#define fill(a, b) fill_txt(a, b, 0) + +#define LEXTRACE(msg) do { \ + if (trace_print != NULL) \ + (*trace_print)(msg); \ +} while (0); + +#endif /* SUDOERS_TOKE_H */ diff --git a/utsudo-0.0.2/plugins/sudoers/toke.l b/utsudo-0.0.2/plugins/sudoers/toke.l new file mode 100644 index 0000000..1fb7eb8 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/toke.l @@ -0,0 +1,1163 @@ +%{ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif +#include +#include +#include +#include +#include "sudoers.h" +#include "toke.h" +#include +#include "sudo_digest.h" +#include "sudo_lbuf.h" + +#if defined(HAVE_STRUCT_DIRENT_D_NAMLEN) && HAVE_STRUCT_DIRENT_D_NAMLEN +# define NAMLEN(dirent) (dirent)->d_namlen +#else +# define NAMLEN(dirent) strlen((dirent)->d_name) +#endif + +int sudolineno; /* current sudoers line number. */ +int last_token; /* last token that was parsed. */ +char *sudoers; /* sudoers file being parsed. */ + +/* Default sudoers path, mode and owner (may be set via sudo.conf) */ +const char *sudoers_file = _PATH_SUDOERS; +mode_t sudoers_mode = SUDOERS_MODE; +uid_t sudoers_uid = SUDOERS_UID; +gid_t sudoers_gid = SUDOERS_GID; + +static bool continued, sawspace; +static int prev_state; +static int digest_type = -1; + +static bool push_include_int(char *, bool); +static bool pop_include(void); +static char *parse_include_int(const char *, bool); + +int (*trace_print)(const char *msg) = sudoers_trace_print; + +#define LEXRETURN(n) do { \ + last_token = (n); \ + return (n); \ +} while (0) + +#define ECHO ignore_result(fwrite(sudoerstext, sudoersleng, 1, sudoersout)) + +#define parse_include(_p) (parse_include_int((_p), false)) +#define parse_includedir(_p) (parse_include_int((_p), true)) +#define push_include(_p) (push_include_int((_p), false)) +#define push_includedir(_p) (push_include_int((_p), true)) +%} + +HEX16 [0-9A-Fa-f]{1,4} +OCTET (1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]) +IPV4ADDR {OCTET}(\.{OCTET}){3} +IPV6ADDR ({HEX16}?:){2,7}{HEX16}?|({HEX16}?:){2,6}:{IPV4ADDR} + +HOSTNAME [[:alnum:]_-]+ +WORD ([^#>!=:,\(\) \t\r\n\\\"]|\\[^\t\n])+ +ID #-?[0-9]+ +PATH \/(\\[\,:= \t#]|[^\,:=\\ \t\r\n#])+ +ENVAR ([^#!=, \t\r\n\\\"]|\\[^\r\n])([^#=, \t\r\n\\\"]|\\[^\r\n])* +DEFVAR [a-z_]+ + +%option noinput +%option nounput +%option noyywrap +%option prefix="sudoers" + +%s GOTDEFS +%x GOTCMND +%x STARTDEFS +%x INDEFS +%x INSTR +%s WANTDIGEST + +%% +[[:blank:]]*,[[:blank:]]* { + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + +[[:blank:]]+ BEGIN STARTDEFS; + +{DEFVAR} { + BEGIN INDEFS; + LEXTRACE("DEFVAR "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(DEFVAR); + } + +{ + , { + BEGIN STARTDEFS; + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + + = { + LEXTRACE("= "); + LEXRETURN('='); + } /* return '=' */ + + \+= { + LEXTRACE("+= "); + LEXRETURN('+'); + } /* return '+' */ + + -= { + LEXTRACE("-= "); + LEXRETURN('-'); + } /* return '-' */ + + \" { + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + + {ENVAR} { + LEXTRACE("WORD(2) "); + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(WORD); + } +} + +{ + \\[[:blank:]]*\r?\n[[:blank:]]* { + /* Line continuation char followed by newline. */ + sudolineno++; + continued = true; + } + + \" { + LEXTRACE("ENDSTR "); + BEGIN prev_state; + + if (sudoerslval.string == NULL) { + LEXTRACE("ERROR "); /* empty string */ + LEXRETURN(ERROR); + } + if (prev_state == INITIAL || prev_state == GOTDEFS) { + switch (sudoerslval.string[0]) { + case '%': + if (sudoerslval.string[1] == '\0' || + (sudoerslval.string[1] == ':' && + sudoerslval.string[2] == '\0')) { + LEXTRACE("ERROR "); /* empty group */ + LEXRETURN(ERROR); + } + LEXTRACE("USERGROUP "); + LEXRETURN(USERGROUP); + case '+': + if (sudoerslval.string[1] == '\0') { + LEXTRACE("ERROR "); /* empty netgroup */ + LEXRETURN(ERROR); + } + LEXTRACE("NETGROUP "); + LEXRETURN(NETGROUP); + } + } + LEXTRACE("WORD(4) "); + LEXRETURN(WORD); + } + + \\ { + LEXTRACE("BACKSLASH "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } + + ([^\"\r\n\\]|\\\")+ { + LEXTRACE("STRBODY "); + if (!append(sudoerstext, sudoersleng)) + yyterminate(); + } +} + +{ + \\[\*\?\[\]\!] { + /* quoted fnmatch glob char, pass verbatim */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext, 2, sawspace)) + yyterminate(); + sawspace = false; + } + + \\[:\\,= \t#] { + /* quoted sudoers special char, strip backslash */ + LEXTRACE("QUOTEDCHAR "); + if (!fill_args(sudoerstext + 1, 1, sawspace)) + yyterminate(); + sawspace = false; + } + + [#:\,=\r\n] { + BEGIN INITIAL; + yyless(0); + LEXRETURN(COMMAND); + } /* end of command line args */ + + [^#\\:, \t\r\n]+ { + LEXTRACE("ARG "); + if (!fill_args(sudoerstext, sudoersleng, sawspace)) + yyterminate(); + sawspace = false; + } /* a command line arg */ +} + +[[:xdigit:]]+ { + /* Only return DIGEST if the length is correct. */ + yy_size_t digest_len = + sudo_digest_getlen(digest_type); + if ((yy_size_t)sudoersleng == digest_len * 2) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + LEXRETURN(DIGEST); + } + BEGIN INITIAL; + yyless(sudoersleng); + } /* hex digest */ + +[A-Za-z0-9\+/=]+ { + /* Only return DIGEST if the length is correct. */ + yy_size_t len, digest_len = + sudo_digest_getlen(digest_type); + if (sudoerstext[sudoersleng - 1] == '=') { + /* use padding */ + len = 4 * ((digest_len + 2) / 3); + } else { + /* no padding */ + len = (4 * digest_len + 2) / 3; + } + if ((yy_size_t)sudoersleng == len) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + BEGIN INITIAL; + LEXTRACE("DIGEST "); + LEXRETURN(DIGEST); + } + BEGIN INITIAL; + yyless(sudoersleng); + } /* base64 digest */ + +^#include[[:blank:]]+.*\r?\n { + char *path; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + if ((path = parse_include(sudoerstext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDE\n"); + + /* Push current buffer and switch to include file */ + if (!push_include(path)) + yyterminate(); + } + +^#includedir[[:blank:]]+.*\r?\n { + char *path; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + if ((path = parse_includedir(sudoerstext)) == NULL) + yyterminate(); + + LEXTRACE("INCLUDEDIR\n"); + + /* + * Push current buffer and switch to include file, + * ignoring missing or empty directories. + */ + if (!push_includedir(path)) + yyterminate(); + } + +^[[:blank:]]*Defaults([:@>\!][[:blank:]]*\!*\"?({ID}|{WORD}))? { + char deftype; + int n; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + n += sizeof("Defaults") - 1; + if ((deftype = sudoerstext[n++]) != '\0') { + while (isblank((unsigned char)sudoerstext[n])) + n++; + } + BEGIN GOTDEFS; + switch (deftype) { + case ':': + yyless(n); + LEXTRACE("DEFAULTS_USER "); + LEXRETURN(DEFAULTS_USER); + case '>': + yyless(n); + LEXTRACE("DEFAULTS_RUNAS "); + LEXRETURN(DEFAULTS_RUNAS); + case '@': + yyless(n); + LEXTRACE("DEFAULTS_HOST "); + LEXRETURN(DEFAULTS_HOST); + case '!': + yyless(n); + LEXTRACE("DEFAULTS_CMND "); + LEXRETURN(DEFAULTS_CMND); + default: + LEXTRACE("DEFAULTS "); + LEXRETURN(DEFAULTS); + } + } + +^[[:blank:]]*(Host|Cmnd|User|Runas)_Alias { + int n; + + if (continued) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + + for (n = 0; isblank((unsigned char)sudoerstext[n]); n++) + continue; + switch (sudoerstext[n]) { + case 'H': + LEXTRACE("HOSTALIAS "); + LEXRETURN(HOSTALIAS); + case 'C': + LEXTRACE("CMNDALIAS "); + LEXRETURN(CMNDALIAS); + case 'U': + LEXTRACE("USERALIAS "); + LEXRETURN(USERALIAS); + case 'R': + LEXTRACE("RUNASALIAS "); + LEXRETURN(RUNASALIAS); + } + } + +NOPASSWD[[:blank:]]*: { + /* cmnd does not require passwd for this user */ + LEXTRACE("NOPASSWD "); + LEXRETURN(NOPASSWD); + } + +PASSWD[[:blank:]]*: { + /* cmnd requires passwd for this user */ + LEXTRACE("PASSWD "); + LEXRETURN(PASSWD); + } + +NOEXEC[[:blank:]]*: { + LEXTRACE("NOEXEC "); + LEXRETURN(NOEXEC); + } + +EXEC[[:blank:]]*: { + LEXTRACE("EXEC "); + LEXRETURN(EXEC); + } + +SETENV[[:blank:]]*: { + LEXTRACE("SETENV "); + LEXRETURN(SETENV); + } + +NOSETENV[[:blank:]]*: { + LEXTRACE("NOSETENV "); + LEXRETURN(NOSETENV); + } + +LOG_OUTPUT[[:blank:]]*: { + LEXTRACE("LOG_OUTPUT "); + LEXRETURN(LOG_OUTPUT); + } + +NOLOG_OUTPUT[[:blank:]]*: { + LEXTRACE("NOLOG_OUTPUT "); + LEXRETURN(NOLOG_OUTPUT); + } + +LOG_INPUT[[:blank:]]*: { + LEXTRACE("LOG_INPUT "); + LEXRETURN(LOG_INPUT); + } + +NOLOG_INPUT[[:blank:]]*: { + LEXTRACE("NOLOG_INPUT "); + LEXRETURN(NOLOG_INPUT); + } + +MAIL[[:blank:]]*: { + LEXTRACE("MAIL "); + LEXRETURN(MAIL); + } + +NOMAIL[[:blank:]]*: { + LEXTRACE("NOMAIL "); + LEXRETURN(NOMAIL); + } + +FOLLOW[[:blank:]]*: { + LEXTRACE("FOLLOW "); + LEXRETURN(FOLLOWLNK); + } + +NOFOLLOW[[:blank:]]*: { + LEXTRACE("NOFOLLOW "); + LEXRETURN(NOFOLLOWLNK); + } + +(\+|\%|\%:) { + /* empty group or netgroup */ + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + +\+{WORD} { + /* netgroup */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NETGROUP "); + LEXRETURN(NETGROUP); + } + +\%:?({WORD}|{ID}) { + /* group */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("USERGROUP "); + LEXRETURN(USERGROUP); + } + +{IPV4ADDR}(\/{IPV4ADDR})? { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + +{IPV4ADDR}\/([12]?[0-9]|3[0-2]) { + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + +{IPV6ADDR}(\/{IPV6ADDR})? { + if (!ipv6_valid(sudoerstext)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + +{IPV6ADDR}\/([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8]) { + if (!ipv6_valid(sudoerstext)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("NTWKADDR "); + LEXRETURN(NTWKADDR); + } + +ALL { + LEXTRACE("ALL "); + LEXRETURN(ALL); + + } + +TIMEOUT { + LEXTRACE("CMND_TIMEOUT "); + LEXRETURN(CMND_TIMEOUT); + } + +NOTBEFORE { + LEXTRACE("NOTBEFORE "); + LEXRETURN(NOTBEFORE); + } + +NOTAFTER { + LEXTRACE("NOTAFTER "); + LEXRETURN(NOTAFTER); + } + +ROLE { +#ifdef HAVE_SELINUX + LEXTRACE("ROLE "); + LEXRETURN(ROLE); +#else + goto got_alias; +#endif + } + +TYPE { +#ifdef HAVE_SELINUX + LEXTRACE("TYPE "); + LEXRETURN(TYPE); +#else + goto got_alias; +#endif + } +PRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + LEXRETURN(PRIVS); +#else + goto got_alias; +#endif + } + +LIMITPRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + LEXRETURN(LIMITPRIVS); +#else + goto got_alias; +#endif + } + +[[:upper:]][[:upper:][:digit:]_]* { + got_alias: + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("ALIAS "); + LEXRETURN(ALIAS); + } + +({PATH}|sudoedit) { + /* XXX - no way to specify digest for command */ + /* no command args allowed for Defaults!/path */ + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("COMMAND "); + LEXRETURN(COMMAND); + } + +sha224 { + digest_type = SUDO_DIGEST_SHA224; + BEGIN WANTDIGEST; + LEXTRACE("SHA224_TOK "); + LEXRETURN(SHA224_TOK); + } + +sha256 { + digest_type = SUDO_DIGEST_SHA256; + BEGIN WANTDIGEST; + LEXTRACE("SHA256_TOK "); + LEXRETURN(SHA256_TOK); + } + +sha384 { + digest_type = SUDO_DIGEST_SHA384; + BEGIN WANTDIGEST; + LEXTRACE("SHA384_TOK "); + LEXRETURN(SHA384_TOK); + } + +sha512 { + digest_type = SUDO_DIGEST_SHA512; + BEGIN WANTDIGEST; + LEXTRACE("SHA512_TOK "); + LEXRETURN(SHA512_TOK); + } + +sudoedit { + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } /* sudo -e */ + +{PATH} { + /* directories can't have args... */ + if (sudoerstext[sudoersleng - 1] == '/') { + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + LEXRETURN(COMMAND); + } else { + BEGIN GOTCMND; + LEXTRACE("COMMAND "); + if (!fill_cmnd(sudoerstext, sudoersleng)) + yyterminate(); + } + } /* a pathname */ + +\" { + LEXTRACE("BEGINSTR "); + sudoerslval.string = NULL; + prev_state = YY_START; + BEGIN INSTR; + } + +({ID}|{WORD}) { + /* a word */ + if (!fill(sudoerstext, sudoersleng)) + yyterminate(); + LEXTRACE("WORD(5) "); + LEXRETURN(WORD); + } + +\( { + LEXTRACE("( "); + LEXRETURN('('); + } + +\) { + LEXTRACE(") "); + LEXRETURN(')'); + } + +, { + LEXTRACE(", "); + LEXRETURN(','); + } /* return ',' */ + += { + LEXTRACE("= "); + LEXRETURN('='); + } /* return '=' */ + +: { + LEXTRACE(": "); + LEXRETURN(':'); + } /* return ':' */ + +<*>!+ { + if (sudoersleng & 1) { + LEXTRACE("!"); + LEXRETURN('!'); /* return '!' */ + } + } + +<*>\r?\n { + if (YY_START == INSTR) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); /* line break in string */ + } + BEGIN INITIAL; + sudolineno++; + continued = false; + LEXTRACE("\n"); + LEXRETURN(COMMENT); + } /* return newline */ + +<*>[[:blank:]]+ { /* throw away space/tabs */ + sawspace = true; /* but remember for fill_args */ + } + +<*>\\[[:blank:]]*\r?\n { + sawspace = true; /* remember for fill_args */ + sudolineno++; + continued = true; + } /* throw away EOL after \ */ + +#(-[^\r\n0-9].*|[^\r\n0-9-].*)?(\r\n|\n)? { + if (sudoerstext[sudoersleng - 1] == '\n') { + /* comment ending in a newline */ + BEGIN INITIAL; + sudolineno++; + continued = false; + } else if (!feof(yyin)) { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + LEXTRACE("#\n"); + LEXRETURN(COMMENT); + } /* comment, not uid/gid */ + +<*>. { + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } /* parse error */ + +<*><> { + if (YY_START != INITIAL) { + BEGIN INITIAL; + LEXTRACE("ERROR "); + LEXRETURN(ERROR); + } + if (!pop_include()) + yyterminate(); + } + +%% +struct path_list { + SLIST_ENTRY(path_list) entries; + char *path; +}; + +SLIST_HEAD(path_list_head, path_list); + +struct include_stack { + YY_BUFFER_STATE bs; + char *path; + struct path_list_head more; /* more files in case of includedir */ + int lineno; + bool keepopen; +}; + +/* + * Compare two struct path_list structs in reverse order. + */ +static int +pl_compare(const void *v1, const void *v2) +{ + const struct path_list * const *p1 = v1; + const struct path_list * const *p2 = v2; + + return strcmp((*p2)->path, (*p1)->path); +} + +/* + * Open dirpath and fill in pathsp with an array of regular files + * that do not end in '~' or contain a '.'. + * Returns the number of files or -1 on error. + * If zero files are found, NULL is stored in pathsp. + */ +static int +read_dir_files(const char *dirpath, struct path_list ***pathsp) +{ + DIR *dir; + int i, count = 0; + int max_paths = 32; + struct dirent *dent; + struct path_list **paths = NULL; + debug_decl(read_dir_files, SUDOERS_DEBUG_PARSER) + + dir = opendir(dirpath); + if (dir == NULL) { + if (errno == ENOENT) + goto done; + sudo_warn("%s", dirpath); + goto bad; + } + paths = reallocarray(NULL, max_paths, sizeof(*paths)); + if (paths == NULL) + goto oom; + while ((dent = readdir(dir)) != NULL) { + struct path_list *pl; + struct stat sb; + size_t len; + char *path; + + /* Ignore files that end in '~' or have a '.' in them. */ + if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~' + || strchr(dent->d_name, '.') != NULL) { + continue; + } + len = strlen(dirpath) + 1 + NAMLEN(dent); + if ((path = rcstr_alloc(len)) == NULL) + goto oom; + (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); + if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { + rcstr_delref(path); + continue; + } + pl = malloc(sizeof(*pl)); + if (pl == NULL) { + rcstr_delref(path); + goto oom; + } + pl->path = path; + if (count >= max_paths) { + struct path_list **tmp; + max_paths <<= 1; + tmp = reallocarray(paths, max_paths, sizeof(*paths)); + if (tmp == NULL) { + rcstr_delref(path); + free(pl); + goto oom; + } + paths = tmp; + } + paths[count++] = pl; + } + closedir(dir); + if (count == 0) { + free(paths); + paths = NULL; + } +done: + *pathsp = paths; + debug_return_int(count); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + sudoerserror(NULL); + if (dir != NULL) + closedir(dir); + for (i = 0; i < count; i++) { + rcstr_delref(paths[i]->path); + free(paths[i]); + } + free(paths); + debug_return_int(-1); +} + +/* + * Push a list of all files in dirpath onto stack. + * Returns the number of files or -1 on error. + */ +static int +switch_dir(struct include_stack *stack, char *dirpath) +{ + struct path_list **paths = NULL; + int count, i; + debug_decl(switch_dir, SUDOERS_DEBUG_PARSER) + + count = read_dir_files(dirpath, &paths); + if (count > 0) { + /* Sort the list as an array in reverse order. */ + qsort(paths, count, sizeof(*paths), pl_compare); + + /* Build up the list in sorted order. */ + for (i = 0; i < count; i++) { + SLIST_INSERT_HEAD(&stack->more, paths[i], entries); + } + free(paths); + } + + debug_return_int(count); +} + +#define MAX_SUDOERS_DEPTH 128 +#define SUDOERS_STACK_INCREMENT 16 + +static size_t istacksize, idepth; +static struct include_stack *istack; +static bool keepopen; + +void +init_lexer(void) +{ + struct path_list *pl; + debug_decl(init_lexer, SUDOERS_DEBUG_PARSER) + + while (idepth) { + idepth--; + while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + rcstr_delref(pl->path); + free(pl); + } + rcstr_delref(istack[idepth].path); + if (idepth && !istack[idepth].keepopen) + fclose(istack[idepth].bs->yy_input_file); + sudoers_delete_buffer(istack[idepth].bs); + } + free(istack); + istack = NULL; + istacksize = idepth = 0; + sudolineno = 1; + keepopen = false; + sawspace = false; + continued = false; + digest_type = -1; + prev_state = INITIAL; + + debug_return; +} + +/* + * Open an include file (or file from a directory), push the old + * sudoers file buffer and switch to the new one. + * A missing or insecure include dir is simply ignored. + * Returns false on error, else true. + */ +static bool +push_include_int(char *path, bool isdir) +{ + struct path_list *pl; + FILE *fp; + debug_decl(push_include_int, SUDOERS_DEBUG_PARSER) + + /* push current state onto stack */ + if (idepth >= istacksize) { + struct include_stack *new_istack; + + if (idepth > MAX_SUDOERS_DEPTH) { + sudoerserror(N_("too many levels of includes")); + debug_return_bool(false); + } + istacksize += SUDOERS_STACK_INCREMENT; + new_istack = reallocarray(istack, istacksize, sizeof(*istack)); + if (new_istack == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + istack = new_istack; + } + SLIST_INIT(&istack[idepth].more); + if (isdir) { + struct stat sb; + int count, status; + + status = sudo_secure_dir(path, sudoers_uid, sudoers_gid, &sb); + if (status != SUDO_PATH_SECURE) { + if (sudoers_warnings) { + switch (status) { + case SUDO_PATH_BAD_TYPE: + errno = ENOTDIR; + sudo_warn("%s", path); + break; + case SUDO_PATH_WRONG_OWNER: + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + path, (unsigned int) sb.st_uid, + (unsigned int) sudoers_uid); + break; + case SUDO_PATH_WORLD_WRITABLE: + sudo_warnx(U_("%s is world writable"), path); + break; + case SUDO_PATH_GROUP_WRITABLE: + sudo_warnx(U_("%s is owned by gid %u, should be %u"), + path, (unsigned int) sb.st_gid, + (unsigned int) sudoers_gid); + break; + default: + break; + } + } + /* A missing or insecure include dir is not a fatal error. */ + debug_return_bool(true); + } + count = switch_dir(&istack[idepth], path); + if (count <= 0) { + /* switch_dir() called sudoerserror() for us */ + rcstr_delref(path); + debug_return_bool(count ? false : true); + } + + /* Parse the first dir entry we can open, leave the rest for later. */ + do { + rcstr_delref(path); + if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { + /* Unable to open any files in include dir, not an error. */ + debug_return_bool(true); + } + SLIST_REMOVE_HEAD(&istack[idepth].more, entries); + path = pl->path; + free(pl); + } while ((fp = open_sudoers(path, false, &keepopen)) == NULL); + } else { + if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { + /* The error was already printed by open_sudoers() */ + sudoerserror(NULL); + debug_return_bool(false); + } + } + /* Push the old (current) file and open the new one. */ + istack[idepth].path = sudoers; /* push old path (and its ref) */ + istack[idepth].bs = YY_CURRENT_BUFFER; + istack[idepth].lineno = sudolineno; + istack[idepth].keepopen = keepopen; + idepth++; + sudolineno = 1; + sudoers = path; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + + debug_return_bool(true); +} + +/* + * Restore the previous sudoers file and buffer, or, in the case + * of an includedir, switch to the next file in the dir. + * Returns false if there is nothing to pop, else true. + */ +static bool +pop_include(void) +{ + struct path_list *pl; + FILE *fp; + debug_decl(pop_include, SUDOERS_DEBUG_PARSER) + + if (idepth == 0 || YY_CURRENT_BUFFER == NULL) + debug_return_bool(false); + + if (!keepopen) + fclose(YY_CURRENT_BUFFER->yy_input_file); + sudoers_delete_buffer(YY_CURRENT_BUFFER); + /* If we are in an include dir, move to the next file. */ + while ((pl = SLIST_FIRST(&istack[idepth - 1].more)) != NULL) { + SLIST_REMOVE_HEAD(&istack[idepth - 1].more, entries); + fp = open_sudoers(pl->path, false, &keepopen); + if (fp != NULL) { + rcstr_delref(sudoers); + sudoers = pl->path; + sudolineno = 1; + sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); + free(pl); + break; + } + /* Unable to open path in include dir, go to next one. */ + rcstr_delref(pl->path); + free(pl); + } + /* If no path list, just pop the last dir on the stack. */ + if (pl == NULL) { + idepth--; + sudoers_switch_to_buffer(istack[idepth].bs); + rcstr_delref(sudoers); + sudoers = istack[idepth].path; + sudolineno = istack[idepth].lineno; + keepopen = istack[idepth].keepopen; + } + debug_return_bool(true); +} + +static char * +parse_include_int(const char *base, bool isdir) +{ + const char *cp, *ep; + char *path, *pp; + int dirlen = 0, len = 0, subst = 0; + size_t shost_len = 0; + debug_decl(parse_include, SUDOERS_DEBUG_PARSER) + + /* Pull out path from #include line. */ + cp = base + (isdir ? sizeof("#includedir") : sizeof("#include")); + while (isblank((unsigned char) *cp)) + cp++; + ep = cp; + while (*ep != '\0' && !isspace((unsigned char) *ep)) { + if (ep[0] == '%' && ep[1] == 'h') { + shost_len = strlen(user_shost); + len += shost_len - 2; + subst = 1; + } + ep++; + } + + /* Relative paths are located in the same dir as the sudoers file. */ + if (*cp != '/') { + char *dirend = strrchr(sudoers, '/'); + if (dirend != NULL) + dirlen = (int)(dirend - sudoers) + 1; + } + + /* Make a copy of the fully-qualified path and return it. */ + len += (int)(ep - cp); + path = pp = rcstr_alloc(len + dirlen); + if (path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_str(NULL); + } + if (dirlen) { + memcpy(path, sudoers, dirlen); + pp += dirlen; + } + if (subst) { + /* substitute for %h */ + while (cp < ep) { + if (cp[0] == '%' && cp[1] == 'h') { + memcpy(pp, user_shost, shost_len); + pp += shost_len; + cp += 2; + continue; + } + *pp++ = *cp++; + } + *pp = '\0'; + } else { + memcpy(pp, cp, len); + pp[len] = '\0'; + } + + /* Push any excess characters (e.g. comment, newline) back to the lexer */ + if (*ep != '\0') + yyless((int)(ep - base)); + + debug_return_str(path); +} + +#ifdef TRACELEXER +int +sudoers_trace_print(const char *msg) +{ + return fputs(msg, stderr); +} +#else +int +sudoers_trace_print(const char *msg) +{ + static bool initialized; + static struct sudo_lbuf lbuf; + + if (!initialized) { + initialized = true; + sudo_lbuf_init(&lbuf, NULL, 0, NULL, 0); + } + + sudo_lbuf_append(&lbuf, "%s", msg); + /* XXX - assumes a final newline */ + if (strchr(msg, '\n') != NULL) + { + sudo_debug_printf2(NULL, NULL, 0, SUDOERS_DEBUG_PARSER|SUDO_DEBUG_DEBUG, + "%s:%d %s", sudoers, sudolineno, lbuf.buf); + lbuf.len = 0; + } + return 0; +} +#endif /* TRACELEXER */ diff --git a/utsudo-0.0.2/plugins/sudoers/toke_util.c b/utsudo-0.0.2/plugins/sudoers/toke_util.c new file mode 100644 index 0000000..c736038 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/toke_util.c @@ -0,0 +1,195 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "sudoers.h" +#include "toke.h" +#include + +static unsigned int arg_len = 0; +static unsigned int arg_size = 0; + +bool +fill_txt(const char *src, size_t len, size_t olen) +{ + char *dst; + int h; + debug_decl(fill_txt, SUDOERS_DEBUG_PARSER) + + dst = olen ? realloc(sudoerslval.string, olen + len + 1) : malloc(len + 1); + if (dst == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + sudoerslval.string = dst; + + /* Copy the string and collapse any escaped characters. */ + dst += olen; + while (len--) { + if (*src == '\\' && len) { + if (src[1] == 'x' && len >= 3 && (h = hexchar(src + 2)) != -1) { + *dst++ = h; + src += 4; + len -= 3; + } else { + src++; + len--; + *dst++ = *src++; + } + } else { + *dst++ = *src++; + } + } + *dst = '\0'; + debug_return_bool(true); +} + +bool +append(const char *src, size_t len) +{ + int olen = 0; + debug_decl(append, SUDOERS_DEBUG_PARSER) + + if (sudoerslval.string != NULL) + olen = strlen(sudoerslval.string); + + debug_return_bool(fill_txt(src, len, olen)); +} + +#define SPECIAL(c) \ + ((c) == ',' || (c) == ':' || (c) == '=' || (c) == ' ' || (c) == '\t' || (c) == '#') + +bool +fill_cmnd(const char *src, size_t len) +{ + char *dst; + size_t i; + debug_decl(fill_cmnd, SUDOERS_DEBUG_PARSER) + + arg_len = arg_size = 0; + + dst = sudoerslval.command.cmnd = malloc(len + 1); + if (dst == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudoerserror(NULL); + debug_return_bool(false); + } + sudoerslval.command.args = NULL; + + /* Copy the string and collapse any escaped sudo-specific characters. */ + for (i = 0; i < len; i++) { + if (src[i] == '\\' && i != len - 1 && SPECIAL(src[i + 1])) + *dst++ = src[++i]; + else + *dst++ = src[i]; + } + *dst = '\0'; + + debug_return_bool(true); +} + +bool +fill_args(const char *s, size_t len, int addspace) +{ + unsigned int new_len; + char *p; + debug_decl(fill_args, SUDOERS_DEBUG_PARSER) + + if (arg_size == 0) { + addspace = 0; + new_len = len; + } else + new_len = arg_len + len + addspace; + + if (new_len >= arg_size) { + /* Allocate in increments of 128 bytes to avoid excessive realloc(). */ + arg_size = (new_len + 1 + 127) & ~127; + + p = realloc(sudoerslval.command.args, arg_size); + if (p == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } else + sudoerslval.command.args = p; + } + + /* Efficiently append the arg (with a leading space if needed). */ + p = sudoerslval.command.args + arg_len; + if (addspace) + *p++ = ' '; + len = arg_size - (p - sudoerslval.command.args); + if (strlcpy(p, s, len) >= len) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto bad; + } + arg_len = new_len; + debug_return_bool(true); +bad: + sudoerserror(NULL); + free(sudoerslval.command.args); + sudoerslval.command.args = NULL; + arg_len = arg_size = 0; + debug_return_bool(false); +} + +/* + * Check to make sure an IPv6 address does not contain multiple instances + * of the string "::". Assumes strlen(s) >= 1. + * Returns true if address is valid else false. + */ +bool +ipv6_valid(const char *s) +{ + int nmatch = 0; + debug_decl(ipv6_valid, SUDOERS_DEBUG_PARSER) + + for (; *s != '\0'; s++) { + if (s[0] == ':' && s[1] == ':') { + if (++nmatch > 1) + break; + } + if (s[0] == '/') + nmatch = 0; /* reset if we hit netmask */ + } + + debug_return_bool(nmatch <= 1); +} diff --git a/utsudo-0.0.2/plugins/sudoers/tsdump.c b/utsudo-0.0.2/plugins/sudoers/tsdump.c new file mode 100644 index 0000000..c103a3f --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/tsdump.c @@ -0,0 +1,318 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2018-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "check.h" + +struct timestamp_entry_common { + unsigned short version; /* version number */ + unsigned short size; /* entry size */ + unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */ + unsigned short flags; /* TS_DISABLED, TS_ANYUID */ +}; + +union timestamp_entry_storage { + struct timestamp_entry_common common; + struct timestamp_entry_v1 v1; + struct timestamp_entry v2; +}; + +__dso_public int main(int argc, char *argv[]); + +static void usage(void) __attribute__((__noreturn__)); +static void dump_entry(struct timestamp_entry *entry, off_t pos); +static bool valid_entry(union timestamp_entry_storage *u, off_t pos); +static bool convert_entry(union timestamp_entry_storage *record, struct timespec *off); + +/* + * tsdump: a simple utility to dump the contents of a time stamp file. + * Unlock sudo, does not perform any locking of the time stamp file. + */ + +int +main(int argc, char *argv[]) +{ + int ch, fd; + const char *user = NULL; + char *fname = NULL; + union timestamp_entry_storage cur; + struct timespec now, timediff; + debug_decl(main, SUDOERS_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + malloc_options = "S"; +#endif + + initprogname(argc > 0 ? argv[0] : "tsdump"); + + bindtextdomain("sudoers", LOCALEDIR); + textdomain("sudoers"); + + /* Initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname())); + + while ((ch = getopt(argc, argv, "f:u:")) != -1) { + switch (ch) { + case 'f': + fname = optarg; + break; + case 'u': + user = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (fname != NULL && user != NULL) { + sudo_warnx("the -f and -u flags are mutually exclusive"); + usage(); + } + + /* Calculate the difference between real time and mono time. */ + if (sudo_gettime_real(&now) == -1) + sudo_fatal("unable to get current time"); + if (sudo_gettime_mono(&timediff) == -1) + sudo_fatal("unable to read the clock"); + sudo_timespecsub(&now, &timediff, &timediff); + + if (fname == NULL) { + struct passwd *pw; + + if (user == NULL) { + if ((pw = getpwuid(geteuid())) == NULL) + sudo_fatalx(U_("unknown uid: %u"), (unsigned int)geteuid()); + user = pw->pw_name; + } + if (asprintf(&fname, "%s/%s", _PATH_SUDO_TIMEDIR, user) == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + + fd = open(fname, O_RDONLY); + if (fd == -1) + sudo_fatal(U_("unable to open %s"), fname); + + for (;;) { + off_t pos = lseek(fd, 0, SEEK_CUR); + ssize_t nread; + bool valid; + + if ((nread = read(fd, &cur, sizeof(cur))) == 0) + break; + if (nread == -1) + sudo_fatal(U_("unable to read %s"), fname); + + valid = valid_entry(&cur, pos); + if (cur.common.size != 0 && cur.common.size != sizeof(cur)) { + off_t offset = (off_t)cur.common.size - (off_t)sizeof(cur); + if (lseek(fd, offset, SEEK_CUR) == -1) + sudo_fatal("unable to seek %d bytes", (int)offset); + } + if (valid) { + /* Convert entry to latest version as needed. */ + if (!convert_entry(&cur, &timediff)) + continue; + dump_entry(&cur.v2, pos); + } + } + + return 0; +} + +static bool +valid_entry(union timestamp_entry_storage *u, off_t pos) +{ + struct timestamp_entry *entry = (struct timestamp_entry *)u; + debug_decl(valid_entry, SUDOERS_DEBUG_UTIL) + + switch (entry->version) { + case 1: + if (entry->size != sizeof(struct timestamp_entry_v1)) { + printf("wrong sized v1 record @ %lld, got %hu, expected %zu\n", + (long long)pos, entry->size, sizeof(struct timestamp_entry_v1)); + debug_return_bool(false); + } + break; + case 2: + if (entry->size != sizeof(struct timestamp_entry)) { + printf("wrong sized v2 record @ %lld, got %hu, expected %zu\n", + (long long)pos, entry->size, sizeof(struct timestamp_entry)); + debug_return_bool(false); + } + break; + default: + printf("unknown time stamp entry version %d @ %lld\n", + (int)entry->version, (long long)pos); + debug_return_bool(false); + break; + } + debug_return_bool(true); +} + +static char * +type2string(int type) +{ + static char name[64]; + debug_decl(type2string, SUDOERS_DEBUG_UTIL) + + switch (type) { + case TS_LOCKEXCL: + debug_return_str("TS_LOCKEXCL"); + case TS_GLOBAL: + debug_return_str("TS_GLOBAL"); + case TS_TTY: + debug_return_str("TS_TTY"); + case TS_PPID: + debug_return_str("TS_PPID"); + } + (void)snprintf(name, sizeof(name), "UNKNOWN (0x%x)", type); + debug_return_str(name); +} + +static void +print_flags(int flags) +{ + bool first = true; + debug_decl(print_flags, SUDOERS_DEBUG_UTIL) + + printf("flags: "); + if (ISSET(flags, TS_DISABLED)) { + printf("%sTS_DISABLED", first ? "" : ", "); + CLR(flags, TS_DISABLED); + first = false; + } + if (ISSET(flags, TS_ANYUID)) { + /* TS_ANYUID should never appear on disk. */ + printf("%sTS_ANYUID", first ? "" : ", "); + CLR(flags, TS_ANYUID); + first = false; + } + if (flags != 0) + printf("%s0x%x", first ? "" : ", ", flags); + putchar('\n'); + + debug_return; +} + +/* + * Convert an older entry to current. + * Also adjusts time stamps on Linux to be wallclock time. + */ +static bool +convert_entry(union timestamp_entry_storage *record, struct timespec *off) +{ + union timestamp_entry_storage orig; + debug_decl(convert_entry, SUDOERS_DEBUG_UTIL) + + if (record->common.version != TS_VERSION) { + if (record->common.version != 1) { + sudo_warnx("unexpected record version %hu", record->common.version); + debug_return_bool(false); + } + + /* The first four fields are the same regardless of version. */ + memcpy(&orig, record, sizeof(union timestamp_entry_storage)); + record->v2.auth_uid = orig.v1.auth_uid; + record->v2.sid = orig.v1.sid; + sudo_timespecclear(&record->v2.start_time); + record->v2.ts = orig.v1.ts; + if (record->common.type == TS_TTY) + record->v2.u.ttydev = orig.v1.u.ttydev; + else if (record->common.type == TS_PPID) + record->v2.u.ppid = orig.v1.u.ppid; + else + memset(&record->v2.u, 0, sizeof(record->v2.u)); + } + + /* On Linux, start time is relative to boot time, adjust to real time. */ +#ifdef __linux__ + if (sudo_timespecisset(&record->v2.start_time)) + sudo_timespecadd(&record->v2.start_time, off, &record->v2.start_time); +#endif + + /* Adjust time stamp from mono time to real time. */ + if (sudo_timespecisset(&record->v2.ts)) + sudo_timespecadd(&record->v2.ts, off, &record->v2.ts); + + debug_return_bool(true); +} + +static void +dump_entry(struct timestamp_entry *entry, off_t pos) +{ + debug_decl(dump_entry, SUDOERS_DEBUG_UTIL) + + printf("position: %lld\n", (long long)pos); + printf("version: %hu\n", entry->version); + printf("size: %hu\n", entry->size); + printf("type: %s\n", type2string(entry->type)); + print_flags(entry->flags); + printf("auth uid: %d\n", (int)entry->auth_uid); + printf("session ID: %d\n", (int)entry->sid); + if (sudo_timespecisset(&entry->start_time)) + printf("start time: %s", ctime(&entry->start_time.tv_sec)); + if (sudo_timespecisset(&entry->ts)) + printf("time stamp: %s", ctime(&entry->ts.tv_sec)); + if (entry->type == TS_TTY) { + char tty[PATH_MAX]; + if (sudo_ttyname_dev(entry->u.ttydev, tty, sizeof(tty)) == NULL) + printf("terminal: %d\n", (int)entry->u.ttydev); + else + printf("terminal: %s\n", tty); + } else if (entry->type == TS_PPID) { + printf("parent pid: %d\n", (int)entry->u.ppid); + } + printf("\n"); + + debug_return; +} + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [-f timestamp_file] | [-u username]\n", + getprogname()); + exit(1); +} diff --git a/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.c b/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.c new file mode 100644 index 0000000..b416755 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.c @@ -0,0 +1,415 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2005, 2008, 2010-2015 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines + * for use by testsudoers in the sudo test harness. + * We need our own since many platforms don't provide set{pw,gr}file(). + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "tsgetgrpw.h" +#include "sudoers.h" + +#undef GRMEM_MAX +#define GRMEM_MAX 200 + +#ifndef UID_MAX +# define UID_MAX 0xffffffffU +#endif + +#ifndef GID_MAX +# define GID_MAX UID_MAX +#endif + +static FILE *pwf; +static const char *pwfile = "/etc/passwd"; +static int pw_stayopen; + +static FILE *grf; +static const char *grfile = "/etc/group"; +static int gr_stayopen; + +void setgrfile(const char *); +void setgrent(void); +void endgrent(void); +struct group *getgrent(void); +struct group *getgrnam(const char *); +struct group *getgrgid(gid_t); + +void setpwfile(const char *); +void setpwent(void); +void endpwent(void); +struct passwd *getpwent(void); +struct passwd *getpwnam(const char *); +struct passwd *getpwuid(uid_t); + +void +setpwfile(const char *file) +{ + pwfile = file; + if (pwf != NULL) + endpwent(); +} + +void +setpwent(void) +{ + if (pwf == NULL) { + pwf = fopen(pwfile, "r"); + if (pwf != NULL) + (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC); + } else { + rewind(pwf); + } + pw_stayopen = 1; +} + +void +endpwent(void) +{ + if (pwf != NULL) { + fclose(pwf); + pwf = NULL; + } + pw_stayopen = 0; +} + +struct passwd * +getpwent(void) +{ + static struct passwd pw; + static char pwbuf[LINE_MAX]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + +next_entry: + if ((colon = fgets(pwbuf, sizeof(pwbuf), pwf)) == NULL) + return NULL; + + memset(&pw, 0, sizeof(pw)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + pw.pw_uid = (uid_t)id; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + pw.pw_gid = (gid_t)id; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_gecos = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + pw.pw_dir = cp; + pw.pw_shell = colon; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + return &pw; +} + +struct passwd * +getpwnam(const char *name) +{ + struct passwd *pw; + + if (pwf == NULL) { + if ((pwf = fopen(pwfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC); + } else { + rewind(pwf); + } + while ((pw = getpwent()) != NULL) { + if (strcmp(pw->pw_name, name) == 0) + break; + } + if (!pw_stayopen) { + fclose(pwf); + pwf = NULL; + } + return pw; +} + +struct passwd * +getpwuid(uid_t uid) +{ + struct passwd *pw; + + if (pwf == NULL) { + if ((pwf = fopen(pwfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(pwf), F_SETFD, FD_CLOEXEC); + } else { + rewind(pwf); + } + while ((pw = getpwent()) != NULL) { + if (pw->pw_uid == uid) + break; + } + if (!pw_stayopen) { + fclose(pwf); + pwf = NULL; + } + return pw; +} + +void +setgrfile(const char *file) +{ + grfile = file; + if (grf != NULL) + endgrent(); +} + +void +setgrent(void) +{ + if (grf == NULL) { + grf = fopen(grfile, "r"); + if (grf != NULL) + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + gr_stayopen = 1; +} + +void +endgrent(void) +{ + if (grf != NULL) { + fclose(grf); + grf = NULL; + } + gr_stayopen = 0; +} + +struct group * +getgrent(void) +{ + static struct group gr; + static char grbuf[LINE_MAX], *gr_mem[GRMEM_MAX+1]; + size_t len; + id_t id; + char *cp, *colon; + const char *errstr; + int n; + +next_entry: + if ((colon = fgets(grbuf, sizeof(grbuf), grf)) == NULL) + return NULL; + + memset(&gr, 0, sizeof(gr)); + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_name = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + gr.gr_passwd = cp; + if ((colon = strchr(cp = colon, ':')) == NULL) + goto next_entry; + *colon++ = '\0'; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + goto next_entry; + gr.gr_gid = (gid_t)id; + len = strlen(colon); + if (len > 0 && colon[len - 1] == '\n') + colon[len - 1] = '\0'; + if (*colon != '\0') { + char *last; + + gr.gr_mem = gr_mem; + cp = strtok_r(colon, ",", &last); + for (n = 0; cp != NULL && n < GRMEM_MAX; n++) { + gr.gr_mem[n] = cp; + cp = strtok_r(NULL, ",", &last); + } + gr.gr_mem[n++] = NULL; + } else + gr.gr_mem = NULL; + return &gr; +} + +struct group * +getgrnam(const char *name) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + while ((gr = getgrent()) != NULL) { + if (strcmp(gr->gr_name, name) == 0) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +struct group * +getgrgid(gid_t gid) +{ + struct group *gr; + + if (grf == NULL) { + if ((grf = fopen(grfile, "r")) == NULL) + return NULL; + (void)fcntl(fileno(grf), F_SETFD, FD_CLOEXEC); + } else { + rewind(grf); + } + while ((gr = getgrent()) != NULL) { + if (gr->gr_gid == gid) + break; + } + if (!gr_stayopen) { + fclose(grf); + grf = NULL; + } + return gr; +} + +/* + * Copied from getgrouplist.c + */ +int +sudo_getgrouplist2_v1(const char *name, GETGROUPS_T basegid, + GETGROUPS_T **groupsp, int *ngroupsp) +{ + GETGROUPS_T *groups = *groupsp; + int grpsize = *ngroupsp; + int i, ngroups = 1; + int ret = -1; + struct group *grp; + + if (groups == NULL) { + /* Dynamically-sized group vector. */ + grpsize = (int)sysconf(_SC_NGROUPS_MAX); + if (grpsize < 0) + grpsize = NGROUPS_MAX; + groups = reallocarray(NULL, grpsize, 4 * sizeof(*groups)); + if (groups == NULL) + return -1; + grpsize <<= 2; + } else { + /* Static group vector. */ + if (grpsize < 1) + return -1; + } + + /* We support BSD semantics where the first element is the base gid */ + groups[0] = basegid; + + setgrent(); + while ((grp = getgrent()) != NULL) { + if (grp->gr_gid == basegid || grp->gr_mem == NULL) + continue; + + for (i = 0; grp->gr_mem[i] != NULL; i++) { + if (strcmp(name, grp->gr_mem[i]) == 0) + break; + } + if (grp->gr_mem[i] == NULL) + continue; /* user not found */ + + /* Only add if it is not the same as an existing gid */ + for (i = 0; i < ngroups; i++) { + if (grp->gr_gid == groups[i]) + break; + } + if (i == ngroups) { + if (ngroups == grpsize) { + GETGROUPS_T *tmp; + + if (*groupsp != NULL) { + /* Static group vector. */ + goto done; + } + tmp = reallocarray(groups, grpsize, 2 * sizeof(*groups)); + if (tmp == NULL) { + free(groups); + groups = NULL; + ngroups = 0; + goto done; + } + groups = tmp; + grpsize <<= 1; + } + groups[ngroups++] = grp->gr_gid; + } + } + ret = 0; + +done: + endgrent(); + *groupsp = groups; + *ngroupsp = ngroups; + + return ret; +} diff --git a/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.h b/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.h new file mode 100644 index 0000000..a2d6e10 --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/tsgetgrpw.h @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Trivial replacements for the libc get{gr,pw}{uid,nam}() routines + * for use by testsudoers in the sudo test harness. + * We need our own since many platforms don't provide set{pw,gr}file(). + */ + +#include + +/* + * Define away the system prototypes so we don't have any conflicts. + */ + +#define setgrfile sys_setgrfile +#define setgrent sys_setgrent +#define endgrent sys_endgrent +#define getgrent sys_getgrent +#define getgrnam sys_getgrnam +#define getgrgid sys_getgrgid + +#define setpwfile sys_setpwfile +#define setpwent sys_setpwent +#define endpwent sys_endpwent +#define getpwent sys_getpwent +#define getpwnam sys_getpwnam +#define getpwuid sys_getpwuid + +#include +#include + +#undef setgrfile +#undef setgrent +#undef endgrent +#undef getgrent +#undef getgrnam +#undef getgrgid + +void setgrfile(const char *); +void setgrent(void); +void endgrent(void); +struct group *getgrent(void); +struct group *getgrnam(const char *); +struct group *getgrgid(gid_t); + +#undef setpwfile +#undef setpwent +#undef endpwent +#undef getpwent +#undef getpwnam +#undef getpwuid + +void setpwfile(const char *); +void setpwent(void); +void endpwent(void); +struct passwd *getpwent(void); +struct passwd *getpwnam(const char *); +struct passwd *getpwuid(uid_t); diff --git a/utsudo-0.0.2/plugins/sudoers/visudo.c b/utsudo-0.0.2/plugins/sudoers/visudo.c new file mode 100644 index 0000000..80d5f0b --- /dev/null +++ b/utsudo-0.0.2/plugins/sudoers/visudo.c @@ -0,0 +1,1302 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Lock the sudoers file for safe editing (ala vipw) and check for parse errors. + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#ifndef __TANDEM +# include +#endif +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudoers.h" +#include "interfaces.h" +#include "redblack.h" +#include "sudoers_version.h" +#include "sudo_conf.h" +#include + +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +struct sudoersfile { + TAILQ_ENTRY(sudoersfile) entries; + char *path; + char *tpath; + bool modified; + bool doedit; + int fd; +}; +TAILQ_HEAD(sudoersfile_list, sudoersfile); + +/* + * Function prototypes + */ +static void quit(int); +static int whatnow(void); +static int check_aliases(bool strict, bool quiet); +static char *get_editor(int *editor_argc, char ***editor_argv); +static bool check_syntax(const char *, bool, bool, bool); +static bool edit_sudoers(struct sudoersfile *, char *, int, char **, int); +static bool install_sudoers(struct sudoersfile *, bool); +static int print_unused(struct sudoers_parse_tree *, struct alias *, void *); +static bool reparse_sudoers(char *, int, char **, bool, bool); +static int run_command(char *, char **); +static void parse_sudoers_options(void); +static void setup_signals(void); +static void help(void) __attribute__((__noreturn__)); +static void usage(int); +static void visudo_cleanup(void); + +extern void get_hostname(void); +extern void sudoersrestart(FILE *); + +/* + * Globals + */ +struct sudo_user sudo_user; +struct passwd *list_pw; +static struct sudoersfile_list sudoerslist = TAILQ_HEAD_INITIALIZER(sudoerslist); +static bool checkonly; +static const char short_opts[] = "cf:hqsVx:"; +static struct option long_opts[] = { + { "check", no_argument, NULL, 'c' }, + { "export", required_argument, NULL, 'x' }, + { "file", required_argument, NULL, 'f' }, + { "help", no_argument, NULL, 'h' }, + { "quiet", no_argument, NULL, 'q' }, + { "strict", no_argument, NULL, 's' }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, '\0' }, +}; + +__dso_public int main(int argc, char *argv[]); + +int +main(int argc, char *argv[]) +{ + struct sudoersfile *sp; + char *editor, **editor_argv; + const char *export_path = NULL; + int ch, oldlocale, editor_argc, exitcode = 0; + bool quiet, strict, fflag; + debug_decl(main, SUDOERS_DEBUG_MAIN) + +#if defined(SUDO_DEVEL) && defined(__OpenBSD__) + { + extern char *malloc_options; + malloc_options = "S"; + } +#endif + + initprogname(argc > 0 ? argv[0] : "visudo"); + if (!sudoers_initlocale(setlocale(LC_ALL, ""), def_sudoers_locale)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_warn_set_locale_func(sudoers_warn_setlocale); + bindtextdomain("sudoers", LOCALEDIR); /* XXX - should have visudo domain */ + textdomain("sudoers"); + + if (argc < 1) + usage(1); + + /* Register fatal/fatalx callback. */ + sudo_fatal_callback_register(visudo_cleanup); + + /* Set sudoers locale callback. */ + sudo_defs_table[I_SUDOERS_LOCALE].callback = sudoers_locale_callback; + + /* Read debug and plugin sections of sudo.conf. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG|SUDO_CONF_PLUGINS) == -1) + exit(EXIT_FAILURE); + + /* Initialize the debug subsystem. */ + if (!sudoers_debug_register(getprogname(), sudo_conf_debug_files(getprogname()))) + exit(EXIT_FAILURE); + + /* Parse sudoers plugin options, if any. */ + parse_sudoers_options(); + + /* + * Arg handling. + */ + checkonly = fflag = quiet = strict = false; + while ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'V': + (void) printf(_("%s version %s\n"), getprogname(), + PACKAGE_VERSION); + (void) printf(_("%s grammar version %d\n"), getprogname(), + SUDOERS_GRAMMAR_VERSION); + goto done; + case 'c': + checkonly = true; /* check mode */ + break; + case 'f': + sudoers_file = optarg; /* sudoers file path */ + fflag = true; + break; + case 'h': + help(); + break; + case 's': + strict = true; /* strict mode */ + break; + case 'q': + quiet = true; /* quiet mode */ + break; + case 'x': + export_path = optarg; + break; + default: + usage(1); + } + } + argc -= optind; + argv += optind; + + /* Check for optional sudoers file argument. */ + switch (argc) { + case 0: + break; + case 1: + /* Only accept sudoers file if no -f was specified. */ + if (!fflag) { + sudoers_file = *argv; + fflag = true; + } + break; + default: + usage(1); + } + + if (export_path != NULL) { + /* Backwards compatibility for the time being. */ + sudo_warnx(U_("the -x option will be removed in a future release")); + sudo_warnx(U_("please consider using the cvtsudoers utility instead")); + execlp("cvtsudoers", "cvtsudoers", "-f", "json", "-o", export_path, + sudoers_file, (char *)0); + sudo_fatal(U_("unable to execute %s"), "cvtsudoers"); + } + + /* Mock up a fake sudo_user struct. */ + user_cmnd = user_base = ""; + if (geteuid() == 0) { + const char *user = getenv("SUDO_USER"); + if (user != NULL && *user != '\0') + sudo_user.pw = sudo_getpwnam(user); + } + if (sudo_user.pw == NULL) { + if ((sudo_user.pw = sudo_getpwuid(getuid())) == NULL) + sudo_fatalx(U_("you do not exist in the %s database"), "passwd"); + } + get_hostname(); + + /* Setup defaults data structures. */ + if (!init_defaults()) + sudo_fatalx(U_("unable to initialize sudoers default values")); + + if (checkonly) { + exitcode = check_syntax(sudoers_file, quiet, strict, fflag) ? 0 : 1; + goto done; + } + + /* + * Parse the existing sudoers file(s) to highlight any existing + * errors and to pull in editor and env_editor conf values. + */ + if ((sudoersin = open_sudoers(sudoers_file, true, NULL)) == NULL) + exit(1); + init_parser(sudoers_file, quiet); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + (void) sudoersparse(); + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, quiet); + sudoers_setlocale(oldlocale, NULL); + + editor = get_editor(&editor_argc, &editor_argv); + + /* Install signal handlers to clean up temp files if we are killed. */ + setup_signals(); + + /* Edit the sudoers file(s) */ + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (!sp->doedit) + continue; + if (sp != TAILQ_FIRST(&sudoerslist)) { + printf(_("press return to edit %s: "), sp->path); + while ((ch = getchar()) != EOF && ch != '\n') + continue; + } + edit_sudoers(sp, editor, editor_argc, editor_argv, -1); + } + + /* + * Check edited files for a parse error, re-edit any that fail + * and install the edited files as needed. + */ + if (reparse_sudoers(editor, editor_argc, editor_argv, strict, quiet)) { + TAILQ_FOREACH(sp, &sudoerslist, entries) { + (void) install_sudoers(sp, fflag); + } + } + free(editor); + +done: + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); + exit(exitcode); +} + +static char * +get_editor(int *editor_argc, char ***editor_argv) +{ + char *editor_path = NULL, **whitelist = NULL; + const char *env_editor; + static char *files[] = { "+1", "sudoers" }; + unsigned int whitelist_len = 0; + debug_decl(get_editor, SUDOERS_DEBUG_UTIL) + + /* Build up editor whitelist from def_editor unless env_editor is set. */ + if (!def_env_editor) { + const char *cp, *ep; + const char *def_editor_end = def_editor + strlen(def_editor); + + /* Count number of entries in whitelist and split into a list. */ + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + whitelist_len++; + } + whitelist = reallocarray(NULL, whitelist_len + 1, sizeof(char *)); + if (whitelist == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + whitelist_len = 0; + for (cp = sudo_strsplit(def_editor, def_editor_end, ":", &ep); + cp != NULL; cp = sudo_strsplit(NULL, def_editor_end, ":", &ep)) { + whitelist[whitelist_len] = strndup(cp, (size_t)(ep - cp)); + if (whitelist[whitelist_len] == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + whitelist_len++; + } + whitelist[whitelist_len] = NULL; + } + + editor_path = find_editor(2, files, editor_argc, editor_argv, whitelist, + &env_editor, true); + if (editor_path == NULL) { + if (def_env_editor && env_editor != NULL) { + /* We are honoring $EDITOR so this is a fatal error. */ + sudo_fatalx(U_("specified editor (%s) doesn't exist"), env_editor); + } + sudo_fatalx(U_("no editor found (editor path = %s)"), def_editor); + } + + if (whitelist != NULL) { + while (whitelist_len--) + free(whitelist[whitelist_len]); + free(whitelist); + } + + debug_return_str(editor_path); +} + +/* + * List of editors that support the "+lineno" command line syntax. + * If an entry starts with '*' the tail end of the string is matched. + * No other wild cards are supported. + */ +static char *lineno_editors[] = { + "ex", + "nex", + "vi", + "nvi", + "vim", + "elvis", + "*macs", + "mg", + "vile", + "jove", + "pico", + "nano", + "ee", + "joe", + "zile", + NULL +}; + +/* + * Check whether or not the specified editor matched lineno_editors[]. + * Returns true if yes, false if no. + */ +static bool +editor_supports_plus(const char *editor) +{ + const char *editor_base = strrchr(editor, '/'); + const char *cp; + char **av; + debug_decl(editor_supports_plus, SUDOERS_DEBUG_UTIL) + + if (editor_base != NULL) + editor_base++; + else + editor_base = editor; + if (*editor_base == 'r') + editor_base++; + + for (av = lineno_editors; (cp = *av) != NULL; av++) { + /* We only handle a leading '*' wildcard. */ + if (*cp == '*') { + size_t blen = strlen(editor_base); + size_t clen = strlen(++cp); + if (blen >= clen) { + if (strcmp(cp, editor_base + blen - clen) == 0) + break; + } + } else if (strcmp(cp, editor_base) == 0) + break; + } + debug_return_bool(cp != NULL); +} + +/* + * Edit each sudoers file. + * Returns true on success, else false. + */ +static bool +edit_sudoers(struct sudoersfile *sp, char *editor, int editor_argc, + char **editor_argv, int lineno) +{ + int tfd; /* sudoers temp file descriptor */ + bool modified; /* was the file modified? */ + int ac; /* argument count */ + char linestr[64]; /* string version of lineno */ + struct timespec ts, times[2]; /* time before and after edit */ + struct timespec orig_mtim; /* starting mtime of sudoers file */ + off_t orig_size; /* starting size of sudoers file */ + struct stat sb; /* stat buffer */ + bool ret = false; /* return value */ + debug_decl(edit_sudoers, SUDOERS_DEBUG_UTIL) + + if (fstat(sp->fd, &sb) == -1) + sudo_fatal(U_("unable to stat %s"), sp->path); + orig_size = sb.st_size; + mtim_get(&sb, orig_mtim); + + /* Create the temp file if needed and set timestamp. */ + if (sp->tpath == NULL) { + if (asprintf(&sp->tpath, "%s.tmp", sp->path) == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + tfd = open(sp->tpath, O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU|S_IRUSR); + if (tfd < 0) + sudo_fatal("%s", sp->tpath); + + /* Copy sp->path -> sp->tpath and reset the mtime. */ + if (orig_size != 0) { + char buf[4096], lastch = '\0'; + ssize_t nread; + + (void) lseek(sp->fd, (off_t)0, SEEK_SET); + while ((nread = read(sp->fd, buf, sizeof(buf))) > 0) { + if (write(tfd, buf, nread) != nread) + sudo_fatal(U_("write error")); + lastch = buf[nread - 1]; + } + + /* Add missing newline at EOF if needed. */ + if (lastch != '\n') { + lastch = '\n'; + if (write(tfd, &lastch, 1) != 1) + sudo_fatal(U_("write error")); + } + } + (void) close(tfd); + } + times[0].tv_sec = times[1].tv_sec = orig_mtim.tv_sec; + times[0].tv_nsec = times[1].tv_nsec = orig_mtim.tv_nsec; + (void) utimensat(AT_FDCWD, sp->tpath, times, 0); + + /* Disable +lineno if editor doesn't support it. */ + if (lineno > 0 && !editor_supports_plus(editor)) + lineno = -1; + + /* + * The last 3 slots in the editor argv are: "-- +1 sudoers" + * Replace those placeholders with the real values. + */ + ac = editor_argc - 3; + if (lineno > 0) { + (void)snprintf(linestr, sizeof(linestr), "+%d", lineno); + editor_argv[ac++] = linestr; + } + editor_argv[ac++] = "--"; + editor_argv[ac++] = sp->tpath; + editor_argv[ac++] = NULL; + + /* + * Do the edit: + * We cannot check the editor's exit value against 0 since + * XPG4 specifies that vi's exit value is a function of the + * number of errors during editing (?!?!). + */ + if (sudo_gettime_real(×[0]) == -1) { + sudo_warn(U_("unable to read the clock")); + goto done; + } + + if (run_command(editor, editor_argv) != -1) { + if (sudo_gettime_real(×[1]) == -1) { + sudo_warn(U_("unable to read the clock")); + goto done; + } + /* + * Sanity checks. + */ + if (stat(sp->tpath, &sb) < 0) { + sudo_warnx(U_("unable to stat temporary file (%s), %s unchanged"), + sp->tpath, sp->path); + goto done; + } + if (sb.st_size == 0 && orig_size != 0) { + /* Avoid accidental zeroing of main sudoers file. */ + if (sp == TAILQ_FIRST(&sudoerslist)) { + sudo_warnx(U_("zero length temporary file (%s), %s unchanged"), + sp->tpath, sp->path); + goto done; + } + } + } else { + sudo_warnx(U_("editor (%s) failed, %s unchanged"), editor, sp->path); + goto done; + } + + /* Set modified bit if the user changed the file. */ + modified = true; + mtim_get(&sb, ts); + if (orig_size == sb.st_size && sudo_timespeccmp(&orig_mtim, &ts, ==)) { + /* + * If mtime and size match but the user spent no measurable + * time in the editor we can't tell if the file was changed. + */ + if (sudo_timespeccmp(×[0], ×[1], !=)) + modified = false; + } + + /* + * If modified in this edit session, mark as modified. + */ + if (modified) + sp->modified = modified; + else + sudo_warnx(U_("%s unchanged"), sp->tpath); + + ret = true; +done: + debug_return_bool(ret); +} + +/* + * Check Defaults and Alias entries. + * Sets parse_error on error and errorfile/errorlineno if possible. + */ +static void +check_defaults_and_aliases(bool strict, bool quiet) +{ + debug_decl(check_defaults_and_aliases, SUDOERS_DEBUG_UTIL) + + if (!check_defaults(&parsed_policy, quiet)) { + struct defaults *d; + rcstr_delref(errorfile); + errorfile = NULL; + errorlineno = -1; + /* XXX - should edit all files with errors */ + TAILQ_FOREACH(d, &parsed_policy.defaults, entries) { + if (d->error) { + /* Defaults parse error, set errorfile/errorlineno. */ + errorfile = rcstr_addref(d->file); + errorlineno = d->lineno; + break; + } + } + parse_error = true; + } else if (check_aliases(strict, quiet) != 0) { + rcstr_delref(errorfile); + errorfile = NULL; /* don't know which file */ + errorlineno = -1; + parse_error = true; + } + debug_return; +} + +/* + * Parse sudoers after editing and re-edit any ones that caused a parse error. + */ +static bool +reparse_sudoers(char *editor, int editor_argc, char **editor_argv, + bool strict, bool quiet) +{ + struct sudoersfile *sp, *last; + FILE *fp; + int ch, oldlocale; + debug_decl(reparse_sudoers, SUDOERS_DEBUG_UTIL) + + /* + * Parse the edited sudoers files and do sanity checking + */ + while ((sp = TAILQ_FIRST(&sudoerslist)) != NULL) { + last = TAILQ_LAST(&sudoerslist, sudoersfile_list); + fp = fopen(sp->tpath, "r+"); + if (fp == NULL) + sudo_fatalx(U_("unable to re-open temporary file (%s), %s unchanged."), + sp->tpath, sp->path); + + /* Clean slate for each parse */ + if (!init_defaults()) + sudo_fatalx(U_("unable to initialize sudoers default values")); + init_parser(sp->path, quiet); + + /* Parse the sudoers temp file(s) */ + sudoersrestart(fp); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + if (sudoersparse() && !parse_error) { + sudo_warnx(U_("unabled to parse temporary file (%s), unknown error"), + sp->tpath); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(sp->path)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + fclose(sudoersin); + if (!parse_error) { + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true); + check_defaults_and_aliases(strict, quiet); + } + sudoers_setlocale(oldlocale, NULL); + + /* + * Got an error, prompt the user for what to do now. + */ + if (parse_error) { + switch (whatnow()) { + case 'Q': + parse_error = false; /* ignore parse error */ + break; + case 'x': + visudo_cleanup(); /* discard changes */ + debug_return_bool(false); + case 'e': + default: + /* Edit file with the parse error */ + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (errorfile == NULL || strcmp(sp->path, errorfile) == 0) { + edit_sudoers(sp, editor, editor_argc, editor_argv, + errorlineno); + if (errorfile != NULL) + break; + } + } + if (errorfile != NULL && sp == NULL) { + sudo_fatalx(U_("internal error, unable to find %s in list!"), + sudoers); + } + break; + } + } + + /* If any new #include directives were added, edit them too. */ + if ((sp = TAILQ_NEXT(last, entries)) != NULL) { + bool modified = false; + do { + printf(_("press return to edit %s: "), sp->path); + while ((ch = getchar()) != EOF && ch != '\n') + continue; + edit_sudoers(sp, editor, editor_argc, editor_argv, -1); + if (sp->modified) + modified = true; + } while ((sp = TAILQ_NEXT(sp, entries)) != NULL); + + /* Reparse sudoers if newly added includes were modified. */ + if (modified) + continue; + } + + /* If all sudoers files parsed OK we are done. */ + if (!parse_error) + break; + } + + debug_return_bool(true); +} + +/* + * Set the owner and mode on a sudoers temp file and + * move it into place. Returns true on success, else false. + */ +static bool +install_sudoers(struct sudoersfile *sp, bool oldperms) +{ + struct stat sb; + bool ret = false; + debug_decl(install_sudoers, SUDOERS_DEBUG_UTIL) + + if (sp->tpath == NULL) + goto done; + + if (!sp->modified) { + /* + * No changes but fix owner/mode if needed. + */ + (void) unlink(sp->tpath); + if (!oldperms && fstat(sp->fd, &sb) != -1) { + if (sb.st_uid != sudoers_uid || sb.st_gid != sudoers_gid) { + if (chown(sp->path, sudoers_uid, sudoers_gid) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chown %d:%d %s", __func__, + (int)sudoers_uid, (int)sudoers_gid, sp->path); + } + } + if ((sb.st_mode & ACCESSPERMS) != sudoers_mode) { + if (chmod(sp->path, sudoers_mode) != 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to chmod 0%o %s", __func__, + (int)sudoers_mode, sp->path); + } + } + } + ret = true; + goto done; + } + + /* + * Change mode and ownership of temp file so when + * we move it to sp->path things are kosher. + */ + if (oldperms) { + /* Use perms of the existing file. */ + if (fstat(sp->fd, &sb) == -1) + sudo_fatal(U_("unable to stat %s"), sp->path); + if (chown(sp->tpath, sb.st_uid, sb.st_gid) != 0) { + sudo_warn(U_("unable to set (uid, gid) of %s to (%u, %u)"), + sp->tpath, (unsigned int)sb.st_uid, (unsigned int)sb.st_gid); + } + if (chmod(sp->tpath, sb.st_mode & ACCESSPERMS) != 0) { + sudo_warn(U_("unable to change mode of %s to 0%o"), sp->tpath, + (unsigned int)(sb.st_mode & ACCESSPERMS)); + } + } else { + if (chown(sp->tpath, sudoers_uid, sudoers_gid) != 0) { + sudo_warn(U_("unable to set (uid, gid) of %s to (%u, %u)"), + sp->tpath, (unsigned int)sudoers_uid, + (unsigned int)sudoers_gid); + goto done; + } + if (chmod(sp->tpath, sudoers_mode) != 0) { + sudo_warn(U_("unable to change mode of %s to 0%o"), sp->tpath, + (unsigned int)sudoers_mode); + goto done; + } + } + + /* + * Now that sp->tpath is sane (parses ok) it needs to be + * rename(2)'d to sp->path. If the rename(2) fails we try using + * mv(1) in case sp->tpath and sp->path are on different file systems. + */ + if (rename(sp->tpath, sp->path) == 0) { + free(sp->tpath); + sp->tpath = NULL; + } else { + if (errno == EXDEV) { + char *av[4]; + sudo_warnx(U_("%s and %s not on the same file system, using mv to rename"), + sp->tpath, sp->path); + + /* Build up argument vector for the command */ + if ((av[0] = strrchr(_PATH_MV, '/')) != NULL) + av[0]++; + else + av[0] = _PATH_MV; + av[1] = sp->tpath; + av[2] = sp->path; + av[3] = NULL; + + /* And run it... */ + if (run_command(_PATH_MV, av)) { + sudo_warnx(U_("command failed: '%s %s %s', %s unchanged"), + _PATH_MV, sp->tpath, sp->path, sp->path); + (void) unlink(sp->tpath); + free(sp->tpath); + sp->tpath = NULL; + goto done; + } + free(sp->tpath); + sp->tpath = NULL; + } else { + sudo_warn(U_("error renaming %s, %s unchanged"), sp->tpath, sp->path); + (void) unlink(sp->tpath); + goto done; + } + } + ret = true; +done: + debug_return_bool(ret); +} + +/* + * Assuming a parse error occurred, prompt the user for what they want + * to do now. Returns the first letter of their choice. + */ +static int +whatnow(void) +{ + int choice, c; + debug_decl(whatnow, SUDOERS_DEBUG_UTIL) + + for (;;) { + (void) fputs(_("What now? "), stdout); + choice = getchar(); + for (c = choice; c != '\n' && c != EOF;) + c = getchar(); + + switch (choice) { + case EOF: + choice = 'x'; + /* FALLTHROUGH */ + case 'e': + case 'x': + case 'Q': + debug_return_int(choice); + default: + (void) puts(_("Options are:\n" + " (e)dit sudoers file again\n" + " e(x)it without saving changes to sudoers file\n" + " (Q)uit and save changes to sudoers file (DANGER!)\n")); + } + } +} + +/* + * Install signal handlers for visudo. + */ +static void +setup_signals(void) +{ + struct sigaction sa; + debug_decl(setup_signals, SUDOERS_DEBUG_UTIL) + + /* + * Setup signal handlers to cleanup nicely. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = quit; + (void) sigaction(SIGTERM, &sa, NULL); + (void) sigaction(SIGHUP, &sa, NULL); + (void) sigaction(SIGINT, &sa, NULL); + (void) sigaction(SIGQUIT, &sa, NULL); + + debug_return; +} + +static int +run_command(char *path, char **argv) +{ + int status; + pid_t pid, rv; + debug_decl(run_command, SUDOERS_DEBUG_UTIL) + + switch (pid = sudo_debug_fork()) { + case -1: + sudo_fatal(U_("unable to execute %s"), path); + break; /* NOTREACHED */ + case 0: + closefrom(STDERR_FILENO + 1); + execv(path, argv); + sudo_warn(U_("unable to run %s"), path); + _exit(127); + break; /* NOTREACHED */ + } + + for (;;) { + rv = waitpid(pid, &status, 0); + if (rv == -1 && errno != EINTR) + break; + if (rv != -1 && !WIFSTOPPED(status)) + break; + } + + if (rv != -1) + rv = WIFEXITED(status) ? WEXITSTATUS(status) : -1; + debug_return_int(rv); +} + +static bool +check_owner(const char *path, bool quiet) +{ + struct stat sb; + bool ok = true; + debug_decl(check_owner, SUDOERS_DEBUG_UTIL) + + if (stat(path, &sb) == 0) { + if (sb.st_uid != sudoers_uid || sb.st_gid != sudoers_gid) { + ok = false; + if (!quiet) { + fprintf(stderr, + _("%s: wrong owner (uid, gid) should be (%u, %u)\n"), + path, (unsigned int)sudoers_uid, (unsigned int)sudoers_gid); + } + } + if ((sb.st_mode & ALLPERMS) != sudoers_mode) { + ok = false; + if (!quiet) { + fprintf(stderr, _("%s: bad permissions, should be mode 0%o\n"), + path, (unsigned int)sudoers_mode); + } + } + } + debug_return_bool(ok); +} + +static bool +check_syntax(const char *sudoers_file, bool quiet, bool strict, bool oldperms) +{ + bool ok = false; + int oldlocale; + debug_decl(check_syntax, SUDOERS_DEBUG_UTIL) + + if (strcmp(sudoers_file, "-") == 0) { + sudoersin = stdin; + sudoers_file = "stdin"; + } else if ((sudoersin = fopen(sudoers_file, "r")) == NULL) { + if (!quiet) + sudo_warn(U_("unable to open %s"), sudoers_file); + goto done; + } + if (!init_defaults()) + sudo_fatalx(U_("unable to initialize sudoers default values")); + init_parser(sudoers_file, quiet); + sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale); + if (sudoersparse() && !parse_error) { + if (!quiet) + sudo_warnx(U_("failed to parse %s file, unknown error"), sudoers_file); + parse_error = true; + rcstr_delref(errorfile); + if ((errorfile = rcstr_dup(sudoers_file)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + } + if (!parse_error) { + (void) update_defaults(&parsed_policy, NULL, + SETDEF_GENERIC|SETDEF_HOST|SETDEF_USER, true); + check_defaults_and_aliases(strict, quiet); + } + sudoers_setlocale(oldlocale, NULL); + ok = !parse_error; + + if (parse_error) { + if (!quiet) { + if (errorlineno != -1) + (void) printf(_("parse error in %s near line %d\n"), + errorfile, errorlineno); + else if (errorfile != NULL) + (void) printf(_("parse error in %s\n"), errorfile); + } + } else { + struct sudoersfile *sp; + + /* Parsed OK, check mode and owner. */ + if (oldperms || check_owner(sudoers_file, quiet)) { + if (!quiet) + (void) printf(_("%s: parsed OK\n"), sudoers_file); + } else { + ok = false; + } + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (oldperms || check_owner(sp->path, quiet)) { + if (!quiet) + (void) printf(_("%s: parsed OK\n"), sp->path); + } else { + ok = false; + } + } + } + +done: + debug_return_bool(ok); +} + +static bool +lock_sudoers(struct sudoersfile *entry) +{ + int ch; + debug_decl(lock_sudoers, SUDOERS_DEBUG_UTIL) + + if (!sudo_lock_file(entry->fd, SUDO_TLOCK)) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + sudo_warnx(U_("%s busy, try again later"), entry->path); + debug_return_bool(false); + } + sudo_warn(U_("unable to lock %s"), entry->path); + (void) fputs(_("Edit anyway? [y/N]"), stdout); + ch = getchar(); + if (tolower(ch) != 'y') + debug_return_bool(false); + } + debug_return_bool(true); +} + +/* + * Used to open (and lock) the initial sudoers file and to also open + * any subsequent files #included via a callback from the parser. + */ +FILE * +open_sudoers(const char *path, bool doedit, bool *keepopen) +{ + struct sudoersfile *entry; + FILE *fp; + int open_flags; + debug_decl(open_sudoers, SUDOERS_DEBUG_UTIL) + + if (checkonly) + open_flags = O_RDONLY; + else + open_flags = O_RDWR | O_CREAT; + + /* Check for existing entry */ + TAILQ_FOREACH(entry, &sudoerslist, entries) { + if (strcmp(path, entry->path) == 0) + break; + } + if (entry == NULL) { + entry = calloc(1, sizeof(*entry)); + if (entry == NULL || (entry->path = strdup(path)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + /* entry->tpath = NULL; */ + /* entry->modified = false; */ + entry->doedit = doedit; + entry->fd = open(entry->path, open_flags, sudoers_mode); + if (entry->fd == -1) { + sudo_warn("%s", entry->path); + free(entry); + debug_return_ptr(NULL); + } + if (!checkonly && !lock_sudoers(entry)) + debug_return_ptr(NULL); + if ((fp = fdopen(entry->fd, "r")) == NULL) + sudo_fatal("%s", entry->path); + TAILQ_INSERT_TAIL(&sudoerslist, entry, entries); + } else { + /* Already exists, open .tmp version if there is one. */ + if (entry->tpath != NULL) { + if ((fp = fopen(entry->tpath, "r")) == NULL) + sudo_fatal("%s", entry->tpath); + } else { + if ((fp = fdopen(entry->fd, "r")) == NULL) + sudo_fatal("%s", entry->path); + rewind(fp); + } + } + if (keepopen != NULL) + *keepopen = true; + debug_return_ptr(fp); +} + +static int +check_alias(char *name, int type, char *file, int lineno, bool strict, bool quiet) +{ + struct member *m; + struct alias *a; + int errors = 0; + debug_decl(check_alias, SUDOERS_DEBUG_ALIAS) + + if ((a = alias_get(&parsed_policy, name, type)) != NULL) { + /* check alias contents */ + TAILQ_FOREACH(m, &a->members, entries) { + if (m->type != ALIAS) + continue; + errors += check_alias(m->name, type, a->file, a->lineno, strict, quiet); + } + alias_put(a); + } else { + if (!quiet) { + if (errno == ELOOP) { + fprintf(stderr, strict ? + U_("Error: %s:%d cycle in %s \"%s\"") : + U_("Warning: %s:%d cycle in %s \"%s\""), + file, lineno, alias_type_to_string(type), name); + } else { + fprintf(stderr, strict ? + U_("Error: %s:%d %s \"%s\" referenced but not defined") : + U_("Warning: %s:%d %s \"%s\" referenced but not defined"), + file, lineno, alias_type_to_string(type), name); + } + fputc('\n', stderr); + if (strict && errorfile == NULL) { + errorfile = rcstr_addref(file); + errorlineno = lineno; + } + } + errors++; + } + + debug_return_int(errors); +} + +/* + * Iterate through the sudoers datastructures looking for undefined + * aliases or unused aliases. + */ +static int +check_aliases(bool strict, bool quiet) +{ + struct rbtree *used_aliases; + struct cmndspec *cs; + struct member *m; + struct privilege *priv; + struct userspec *us; + int errors = 0; + debug_decl(check_aliases, SUDOERS_DEBUG_ALIAS) + + used_aliases = alloc_aliases(); + if (used_aliases == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + + /* Forward check. */ + TAILQ_FOREACH(us, &parsed_policy.userspecs, entries) { + TAILQ_FOREACH(m, &us->users, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, USERALIAS, + us->file, us->lineno, strict, quiet); + } + } + TAILQ_FOREACH(priv, &us->privileges, entries) { + TAILQ_FOREACH(m, &priv->hostlist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, HOSTALIAS, + us->file, us->lineno, strict, quiet); + } + } + TAILQ_FOREACH(cs, &priv->cmndlist, entries) { + if (cs->runasuserlist != NULL) { + TAILQ_FOREACH(m, cs->runasuserlist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, RUNASALIAS, + us->file, us->lineno, strict, quiet); + } + } + } + if (cs->runasgrouplist != NULL) { + TAILQ_FOREACH(m, cs->runasgrouplist, entries) { + if (m->type == ALIAS) { + errors += check_alias(m->name, RUNASALIAS, + us->file, us->lineno, strict, quiet); + } + } + } + if ((m = cs->cmnd)->type == ALIAS) { + errors += check_alias(m->name, CMNDALIAS, + us->file, us->lineno, strict, quiet); + } + } + } + } + + /* Reverse check (destructive) */ + if (!alias_find_used(&parsed_policy, used_aliases)) + errors++; + free_aliases(used_aliases); + + /* If all aliases were referenced we will have an empty tree. */ + if (!no_aliases(&parsed_policy) && !quiet) + alias_apply(&parsed_policy, print_unused, NULL); + + debug_return_int(strict ? errors : 0); +} + +static int +print_unused(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v) +{ + fprintf(stderr, U_("Warning: %s:%d unused %s \"%s\""), + a->file, a->lineno, alias_type_to_string(a->type), a->name); + fputc('\n', stderr); + return 0; +} + +static void +parse_sudoers_options(void) +{ + struct plugin_info_list *plugins; + debug_decl(parse_sudoers_options, SUDOERS_DEBUG_UTIL) + + plugins = sudo_conf_plugins(); + if (plugins) { + struct plugin_info *info; + + TAILQ_FOREACH(info, plugins, entries) { + if (strcmp(info->symbol_name, "sudoers_policy") == 0) + break; + } + if (info != NULL && info->options != NULL) { + char * const *cur; + +#define MATCHES(s, v) \ + (strncmp((s), (v), sizeof(v) - 1) == 0 && (s)[sizeof(v) - 1] != '\0') + + for (cur = info->options; *cur != NULL; cur++) { + const char *errstr, *p; + id_t id; + + if (MATCHES(*cur, "sudoers_file=")) { + sudoers_file = *cur + sizeof("sudoers_file=") - 1; + continue; + } + if (MATCHES(*cur, "sudoers_uid=")) { + p = *cur + sizeof("sudoers_uid=") - 1; + id = sudo_strtoid(p, &errstr); + if (errstr == NULL) + sudoers_uid = (uid_t) id; + continue; + } + if (MATCHES(*cur, "sudoers_gid=")) { + p = *cur + sizeof("sudoers_gid=") - 1; + id = sudo_strtoid(p, &errstr); + if (errstr == NULL) + sudoers_gid = (gid_t) id; + continue; + } + if (MATCHES(*cur, "sudoers_mode=")) { + p = *cur + sizeof("sudoers_mode=") - 1; + id = (id_t) sudo_strtomode(p, &errstr); + if (errstr == NULL) + sudoers_mode = (mode_t) id; + continue; + } + } +#undef MATCHES + } + } + debug_return; +} + +/* + * Unlink any sudoers temp files that remain. + */ +static void +visudo_cleanup(void) +{ + struct sudoersfile *sp; + + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (sp->tpath != NULL) + (void) unlink(sp->tpath); + } +} + +/* + * Unlink sudoers temp files (if any) and exit. + */ +static void +quit(int signo) +{ + struct sudoersfile *sp; + struct iovec iov[4]; + + TAILQ_FOREACH(sp, &sudoerslist, entries) { + if (sp->tpath != NULL) + (void) unlink(sp->tpath); + } + +#define emsg " exiting due to signal: " + iov[0].iov_base = (char *)getprogname(); + iov[0].iov_len = strlen(iov[0].iov_base); + iov[1].iov_base = emsg; + iov[1].iov_len = sizeof(emsg) - 1; + iov[2].iov_base = strsignal(signo); + iov[2].iov_len = strlen(iov[2].iov_base); + iov[3].iov_base = "\n"; + iov[3].iov_len = 1; + ignore_result(writev(STDERR_FILENO, iov, 4)); + _exit(signo); +} + +static void +usage(int fatal) +{ + (void) fprintf(fatal ? stderr : stdout, + "usage: %s [-chqsV] [[-f] sudoers ]\n", getprogname()); + if (fatal) + exit(1); +} + +static void +help(void) +{ + (void) printf(_("%s - safely edit the sudoers file\n\n"), getprogname()); + usage(0); + (void) puts(_("\nOptions:\n" + " -c, --check check-only mode\n" + " -f, --file=sudoers specify sudoers file location\n" + " -h, --help display help message and exit\n" + " -q, --quiet less verbose (quiet) syntax error messages\n" + " -s, --strict strict syntax checking\n" + " -V, --version display version information and exit\n")); + exit(0); +} diff --git a/utsudo-0.0.2/plugins/system_group/Makefile.in b/utsudo-0.0.2/plugins/system_group/Makefile.in new file mode 100644 index 0000000..b5e41f0 --- /dev/null +++ b/utsudo-0.0.2/plugins/system_group/Makefile.in @@ -0,0 +1,211 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2011-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +incdir = $(top_srcdir)/include +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ +AWK = @AWK@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libutsudo_util.la +LIBS = $(LT_LIBS) + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(top_srcdir) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ @LT_LDEXPORTS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ +plugindir = @plugindir@ + +# File mode and map file to use for shared libraries/objects +shlib_enable = @SHLIB_ENABLE@ +shlib_mode = @SHLIB_MODE@ +shlib_exp = $(srcdir)/system_group.exp +shlib_map = system_group.map +shlib_opt = system_group.opt + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +OBJS = system_group.lo + +IOBJS = system_group.i + +POBJS = system_group.plog + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: system_group.la + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) plugins/system_group/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/system_group/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file plugins/system_group/Makefile + +.SUFFIXES: .c .h .i .lo .plog + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +$(shlib_map): $(shlib_exp) + @$(AWK) 'BEGIN { print "{\n\tglobal:" } { print "\t\t"$$0";" } END { print "\tlocal:\n\t\t*;\n};" }' $(shlib_exp) > $@ + +$(shlib_opt): $(shlib_exp) + @$(SED) 's/^/+e /' $(shlib_exp) > $@ + +system_group.la: $(OBJS) $(LT_LIBS) @LT_LDDEP@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(ASAN_LDFLAGS) $(SSP_LDFLAGS) $(LT_LDFLAGS) -o $@ $(OBJS) $(LIBS) -module -avoid-version -rpath $(plugindir) -shrext .so + +pre-install: + +install: install-plugin + +install-dirs: + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(plugindir) + +install-binaries: + +install-includes: + +install-doc: + +install-plugin: install-dirs system_group.la + if [ X"$(shlib_enable)" = X"yes" ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) system_group.la $(DESTDIR)$(plugindir); \ + fi + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(plugindir)/system_group.la + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(plugindir)/system_group.so$(INSTALL_BACKUP) + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I$(top_srcdir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f *.lo *.o *.la *.a *.i *.plog \ + stamp-* core *.core core.* + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs $(shlib_map) $(shlib_opt) + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# Autogenerated dependencies, do not modify +system_group.lo: $(srcdir)/system_group.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/system_group.c +system_group.i: $(srcdir)/system_group.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +system_group.plog: system_group.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/system_group.c --i-file $< --output-file $@ diff --git a/utsudo-0.0.2/plugins/system_group/system_group.c b/utsudo-0.0.2/plugins/system_group/system_group.c new file mode 100644 index 0000000..c010ff8 --- /dev/null +++ b/utsudo-0.0.2/plugins/system_group/system_group.c @@ -0,0 +1,159 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_dso.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +/* + * Sudoers group plugin that does group name-based lookups using the system + * group database functions, similar to how sudo behaved prior to 1.7.3. + * This can be used on systems where lookups by group ID are problematic. + */ + +static sudo_printf_t sudo_log; + +typedef struct group * (*sysgroup_getgrnam_t)(const char *); +typedef struct group * (*sysgroup_getgrgid_t)(gid_t); +typedef void (*sysgroup_gr_delref_t)(struct group *); + +static sysgroup_getgrnam_t sysgroup_getgrnam; +static sysgroup_getgrgid_t sysgroup_getgrgid; +static sysgroup_gr_delref_t sysgroup_gr_delref; +static bool need_setent; + +static int +sysgroup_init(int version, sudo_printf_t sudo_printf, char *const argv[]) +{ + void *handle; + + sudo_log = sudo_printf; + + if (SUDO_API_VERSION_GET_MAJOR(version) != GROUP_API_VERSION_MAJOR) { + sudo_log(SUDO_CONV_ERROR_MSG, + "sysgroup_group: incompatible major version %d, expected %d\n", + SUDO_API_VERSION_GET_MAJOR(version), + GROUP_API_VERSION_MAJOR); + return -1; + } + + /* Share group cache with sudo if possible. */ + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrnam"); + if (handle != NULL) { + sysgroup_getgrnam = (sysgroup_getgrnam_t)handle; + } else { + sysgroup_getgrnam = (sysgroup_getgrnam_t)getgrnam; + need_setent = true; + } + + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrgid"); + if (handle != NULL) { + sysgroup_getgrgid = (sysgroup_getgrgid_t)handle; + } else { + sysgroup_getgrgid = (sysgroup_getgrgid_t)getgrgid; + need_setent = true; + } + + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_gr_delref"); + if (handle != NULL) + sysgroup_gr_delref = (sysgroup_gr_delref_t)handle; + + if (need_setent) + setgrent(); + + return true; +} + +static void +sysgroup_cleanup(void) +{ + if (need_setent) + endgrent(); +} + +/* + * Returns true if "user" is a member of "group", else false. + */ +static int +sysgroup_query(const char *user, const char *group, const struct passwd *pwd) +{ + char **member; + struct group *grp; + + grp = sysgroup_getgrnam(group); + if (grp == NULL && group[0] == '#' && group[1] != '\0') { + const char *errstr; + gid_t gid = sudo_strtoid(group + 1, &errstr); + if (errstr == NULL) + grp = sysgroup_getgrgid(gid); + } + if (grp != NULL) { + if (grp->gr_mem != NULL) { + for (member = grp->gr_mem; *member != NULL; member++) { + if (strcasecmp(user, *member) == 0) { + if (sysgroup_gr_delref) + sysgroup_gr_delref(grp); + return true; + } + } + } + if (sysgroup_gr_delref) + sysgroup_gr_delref(grp); + } + + return false; +} + +__dso_public struct sudoers_group_plugin group_plugin = { + GROUP_API_VERSION, + sysgroup_init, + sysgroup_cleanup, + sysgroup_query +}; diff --git a/utsudo-0.0.2/plugins/system_group/system_group.exp b/utsudo-0.0.2/plugins/system_group/system_group.exp new file mode 100644 index 0000000..a859d6c --- /dev/null +++ b/utsudo-0.0.2/plugins/system_group/system_group.exp @@ -0,0 +1 @@ +group_plugin diff --git a/utsudo-0.0.2/po/README b/utsudo-0.0.2/po/README new file mode 100644 index 0000000..ff9b845 --- /dev/null +++ b/utsudo-0.0.2/po/README @@ -0,0 +1,14 @@ +NLS Translations for sudo are coordinated through the Translation +Project, at http://translationproject.org/ + +If you would like to contribute a translation for sudo, please join +a translation team at the Translation Project instead of contributing +a po file directly. This will avoid duplicated work if there is +already a translation in progress. If you would like to become a +member of a translation team, please follow the instructions at +http://translationproject.org/html/translators.html + +The messages in sudo are split into two domains: sudo and sudoers. +The former is used by the sudo front-end and utility functions. +The latter is used by the sudoers policy and I/O logging plug-ins +as well as the sudoers-specific commands visudo and sudoreplay. diff --git a/utsudo-0.0.2/po/ast.mo b/utsudo-0.0.2/po/ast.mo new file mode 100644 index 0000000000000000000000000000000000000000..c5b6c74745accff00e2ab0d40be57a55c4774b9c GIT binary patch literal 19623 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 F{XegHyIlYP literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/ast.po b/utsudo-0.0.2/po/ast.po new file mode 100644 index 0000000..88ccbe6 --- /dev/null +++ b/utsudo-0.0.2/po/ast.po @@ -0,0 +1,928 @@ +# Asturian translation for sudo +# Portable object template file for sudo +# This file is put in the public domain. +# +# Todd C. Miller , 2011-2016. +# enolp , 2018. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-08 21:35+0100\n" +"Last-Translator: enolp \n" +"Language-Team: Asturian \n" +"Language: ast\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 2.0\n" + +#: lib/util/aix.c:90 lib/util/aix.c:177 +msgid "unable to open userdb" +msgstr "nun pue abrise userdb" + +#: lib/util/aix.c:232 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "nun pue cambiase al rexistru «%s» de %s" + +#: lib/util/aix.c:257 +msgid "unable to restore registry" +msgstr "nun pue restaurase'l rexistru" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/gidlist.c:79 +#: lib/util/sudo_conf.c:191 lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 +#: lib/util/sudo_conf.c:558 src/conversation.c:82 src/exec_common.c:112 +#: src/exec_common.c:128 src/exec_common.c:137 src/exec_monitor.c:210 +#: src/exec_monitor.c:465 src/exec_monitor.c:471 src/exec_monitor.c:479 +#: src/exec_monitor.c:487 src/exec_monitor.c:494 src/exec_monitor.c:501 +#: src/exec_monitor.c:508 src/exec_monitor.c:515 src/exec_monitor.c:522 +#: src/exec_monitor.c:529 src/exec_monitor.c:536 src/exec_nopty.c:212 +#: src/exec_nopty.c:218 src/exec_nopty.c:227 src/exec_nopty.c:234 +#: src/exec_nopty.c:241 src/exec_nopty.c:248 src/exec_nopty.c:255 +#: src/exec_nopty.c:262 src/exec_nopty.c:269 src/exec_nopty.c:276 +#: src/exec_nopty.c:283 src/exec_nopty.c:290 src/exec_nopty.c:297 +#: src/exec_nopty.c:305 src/exec_nopty.c:467 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:994 +#: src/exec_pty.c:1157 src/exec_pty.c:1163 src/exec_pty.c:1172 +#: src/exec_pty.c:1179 src/exec_pty.c:1186 src/exec_pty.c:1193 +#: src/exec_pty.c:1200 src/exec_pty.c:1207 src/exec_pty.c:1214 +#: src/exec_pty.c:1221 src/exec_pty.c:1228 src/exec_pty.c:1235 +#: src/exec_pty.c:1243 src/exec_pty.c:1661 src/load_plugins.c:57 +#: src/load_plugins.c:70 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:203 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:676 src/sudo.c:686 src/sudo.c:706 src/sudo.c:725 +#: src/sudo.c:734 src/sudo.c:743 src/sudo.c:760 src/sudo.c:801 src/sudo.c:811 +#: src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 src/sudo.c:1266 +#: src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 src/sudo_edit.c:886 +#: src/sudo_edit.c:1000 src/sudo_edit.c:1020 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/sudo_conf.c:192 +#: lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 lib/util/sudo_conf.c:558 +#: src/conversation.c:83 src/exec_common.c:112 src/exec_common.c:129 +#: src/exec_common.c:138 src/exec_monitor.c:465 src/exec_monitor.c:471 +#: src/exec_monitor.c:479 src/exec_monitor.c:487 src/exec_monitor.c:494 +#: src/exec_monitor.c:501 src/exec_monitor.c:508 src/exec_monitor.c:515 +#: src/exec_monitor.c:522 src/exec_monitor.c:529 src/exec_monitor.c:536 +#: src/exec_nopty.c:212 src/exec_nopty.c:218 src/exec_nopty.c:227 +#: src/exec_nopty.c:234 src/exec_nopty.c:241 src/exec_nopty.c:248 +#: src/exec_nopty.c:255 src/exec_nopty.c:262 src/exec_nopty.c:269 +#: src/exec_nopty.c:276 src/exec_nopty.c:283 src/exec_nopty.c:290 +#: src/exec_nopty.c:297 src/exec_nopty.c:305 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:1157 +#: src/exec_pty.c:1163 src/exec_pty.c:1172 src/exec_pty.c:1179 +#: src/exec_pty.c:1186 src/exec_pty.c:1193 src/exec_pty.c:1200 +#: src/exec_pty.c:1207 src/exec_pty.c:1214 src/exec_pty.c:1221 +#: src/exec_pty.c:1228 src/exec_pty.c:1235 src/exec_pty.c:1243 +#: src/exec_pty.c:1661 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:204 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 +#: src/sudo.c:1266 src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 +#: src/sudo_edit.c:886 src/sudo_edit.c:1000 src/sudo_edit.c:1020 +msgid "unable to allocate memory" +msgstr "nun pue allugase memoria" + +#: lib/util/strsignal.c:53 +msgid "Unknown signal" +msgstr "Señal desconocida" + +#: lib/util/strtoid.c:82 lib/util/strtoid.c:129 lib/util/strtoid.c:157 +#: lib/util/strtomode.c:54 lib/util/strtonum.c:63 lib/util/strtonum.c:181 +msgid "invalid value" +msgstr "valor non válidu" + +#: lib/util/strtoid.c:89 lib/util/strtoid.c:136 lib/util/strtoid.c:164 +#: lib/util/strtomode.c:60 lib/util/strtonum.c:66 lib/util/strtonum.c:193 +msgid "value too large" +msgstr "el valor ye pergrande" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:142 lib/util/strtomode.c:60 +#: lib/util/strtonum.c:66 lib/util/strtonum.c:187 +msgid "value too small" +msgstr "el valor ye perpequeñu" + +#: lib/util/sudo_conf.c:210 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valor non válidu de Path «%s» en %s, llinia %u" + +#: lib/util/sudo_conf.c:376 lib/util/sudo_conf.c:429 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valor non válidu pa %s «%s» en %s, llinia %u" + +#: lib/util/sudo_conf.c:397 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nun se sofita la fonte de grupos «%s» en %s, llinia %u" + +#: lib/util/sudo_conf.c:413 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "grupos máximos non válidos «%s» en %s, llinia %u" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "unable to stat %s" +msgstr "nun pue facese stat a %s" + +#: lib/util/sudo_conf.c:577 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nun ye un ficheru regular" + +#: lib/util/sudo_conf.c:580 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ye propiedá del UID %u, debería ser %u" + +#: lib/util/sudo_conf.c:584 +#, c-format +msgid "%s is world writable" +msgstr "%s ye escribible por tol mundu" + +#: lib/util/sudo_conf.c:587 +#, c-format +msgid "%s is group writable" +msgstr "%s ye escribible pol grupu" + +#: lib/util/sudo_conf.c:597 src/selinux.c:213 src/selinux.c:230 src/sudo.c:360 +#, c-format +msgid "unable to open %s" +msgstr "nun pue abrise %s" + +#: src/exec.c:165 +#, c-format +msgid "unknown login class %s" +msgstr "desconozse la clas d'aniciu de sesión %s" + +#: src/exec.c:178 +msgid "unable to set user context" +msgstr "nun pue afitase'l contestu d'usuariu" + +#: src/exec.c:194 +msgid "unable to set process priority" +msgstr "nun pue afitase la prioridá del procesu" + +#: src/exec.c:202 +#, c-format +msgid "unable to change root to %s" +msgstr "nun pue camudase root a %s" + +#: src/exec.c:215 src/exec.c:221 src/exec.c:228 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "nun pue camudase al UID de runas (%u, %u)" + +#: src/exec.c:246 +#, c-format +msgid "unable to change directory to %s" +msgstr "nun pue camudase al direutoriu %s" + +#: src/exec.c:345 src/exec_monitor.c:574 src/exec_monitor.c:576 +#: src/exec_nopty.c:525 src/exec_pty.c:522 src/exec_pty.c:1329 +#: src/exec_pty.c:1331 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "nun pue afitase'l remanador pa la señal %d" + +#: src/exec_common.c:171 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "nun pue desaniciase PRIV_PROC_EXEC de PRIV_LIMIT" + +#: src/exec_monitor.c:364 +msgid "error reading from socketpair" +msgstr "fallu na llectura del socketpair" + +#: src/exec_monitor.c:381 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "nun s'esperaba la triba de rempuesta en backchannel: %d" + +#: src/exec_monitor.c:473 src/exec_monitor.c:481 src/exec_monitor.c:489 +#: src/exec_monitor.c:496 src/exec_monitor.c:503 src/exec_monitor.c:510 +#: src/exec_monitor.c:517 src/exec_monitor.c:524 src/exec_monitor.c:531 +#: src/exec_monitor.c:538 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:644 +#: src/exec_pty.c:649 src/exec_pty.c:746 src/exec_pty.c:753 src/exec_pty.c:850 +#: src/exec_pty.c:1165 src/exec_pty.c:1174 src/exec_pty.c:1181 +#: src/exec_pty.c:1188 src/exec_pty.c:1195 src/exec_pty.c:1202 +#: src/exec_pty.c:1209 src/exec_pty.c:1216 src/exec_pty.c:1223 +#: src/exec_pty.c:1230 src/exec_pty.c:1237 src/exec_pty.c:1614 +#: src/exec_pty.c:1624 src/exec_pty.c:1669 src/exec_pty.c:1676 +#: src/exec_pty.c:1703 +msgid "unable to add event to queue" +msgstr "nun pue amestase l'eventu a la cola" + +#: src/exec_monitor.c:592 +msgid "unable to set controlling tty" +msgstr "nun pue afitase la TTY controladora" + +#: src/exec_monitor.c:600 src/exec_nopty.c:364 src/exec_pty.c:1408 +#: src/exec_pty.c:1429 src/exec_pty.c:1449 src/tgetpass.c:292 +msgid "unable to create pipe" +msgstr "nun pue crease la tubería" + +#: src/exec_monitor.c:608 +msgid "unable to receive message from parent" +msgstr "nun pue recibise'l mensaxe del pá" + +#: src/exec_monitor.c:614 src/exec_nopty.c:382 src/exec_pty.c:1487 +#: src/tgetpass.c:296 +msgid "unable to fork" +msgstr "nun pue biforcase" + +#: src/exec_monitor.c:628 src/sesh.c:125 src/sudo.c:1130 +#, c-format +msgid "unable to execute %s" +msgstr "nun pue executase %s" + +#: src/exec_monitor.c:711 src/exec_nopty.c:435 +msgid "unable to restore tty label" +msgstr "nun pue restaurase la etiqueta de TTY" + +#: src/exec_nopty.c:358 src/exec_pty.c:1338 +msgid "policy plugin failed session initialization" +msgstr "el complementu de polítiques falló l'aniciu de la sesión" + +#: src/exec_nopty.c:424 src/exec_pty.c:1574 +msgid "error in event loop" +msgstr "fallu nel bucle d'eventos" + +#: src/exec_nopty.c:533 src/exec_pty.c:557 src/signal.c:110 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "nun pue restaurase'l remanador pa la señal %d" + +#: src/exec_pty.c:156 +msgid "unable to allocate pty" +msgstr "nun pue allguase la PTY" + +#: src/exec_pty.c:1318 +msgid "unable to create sockets" +msgstr "nun puen crease ralures" + +#: src/exec_pty.c:1531 +msgid "unable to send message to monitor process" +msgstr "nun pue unviase'l mensaxe pa supervisar el procesu" + +#: src/load_plugins.c:55 src/load_plugins.c:68 src/load_plugins.c:90 +#: src/load_plugins.c:120 src/load_plugins.c:128 src/load_plugins.c:134 +#: src/load_plugins.c:175 src/load_plugins.c:183 src/load_plugins.c:190 +#: src/load_plugins.c:196 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "fallu en %s, llinia %d mentanto se cargaba'l complementu «%s»" + +#: src/load_plugins.c:92 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:130 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ser propiedá del UID %d" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s namái ha editalu'l dueñu" + +#: src/load_plugins.c:177 +#, c-format +msgid "unable to load %s: %s" +msgstr "nun pue cargase %s: %s" + +#: src/load_plugins.c:185 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nun pue alcontrase'l símbolu «%s» en %s" + +#: src/load_plugins.c:192 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "desconozse la triba de política %d alcontrada en %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "la versión mayor %d (esperábase la %d) del complementu que s'alcontró en %s ye incompatible" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "inorando'l complementu de polítiques «%s» en %s, llinia %d" + +#: src/load_plugins.c:209 +msgid "only a single policy plugin may be specified" +msgstr "namái podría especificase un complementu de polítiques" + +#: src/load_plugins.c:212 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "inorando'l complementu de polítiques duplicáu «%s» en %s, llinia %d" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "inorando'l complementu d'E/S duplicáu «%s» en %s, llinia %d" + +#: src/load_plugins.c:347 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "el complementu de polítiques %s nun inclúi un métodu check_policy" + +#: src/net_ifs.c:180 src/net_ifs.c:197 src/net_ifs.c:342 src/sudo.c:470 +#, c-format +msgid "internal error, %s overflow" +msgstr "fallu internu, sobrecarga de %s" + +#: src/parse_args.c:224 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nome non válidu de variable d'entornu: %s" + +#: src/parse_args.c:320 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "l'argumentu pa -C ha ser un númberu mayor o iguar que 3" + +#: src/parse_args.c:505 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "nun podríes especificar les opciones «-i» y «-s»" + +#: src/parse_args.c:509 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "nun podríes especificar les opciones «-i» y «-E»" + +#: src/parse_args.c:519 +msgid "the `-E' option is not valid in edit mode" +msgstr "la opción «-E» nun ye válida nel mou edición" + +#: src/parse_args.c:521 +msgid "you may not specify environment variables in edit mode" +msgstr "nun podríes especificar les variables d'entornu nel mou edición" + +#: src/parse_args.c:529 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "la opción «-U» namái podría usase xunto cola opción «-l»" + +#: src/parse_args.c:533 +msgid "the `-A' and `-S' options may not be used together" +msgstr "les opciones «-A» y «-S» nun podríen usase xuntes" + +#: src/parse_args.c:609 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit nun se sofita nesta plataforma" + +#: src/parse_args.c:682 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Namái podría especificase una de les opciones -e, -h, -i, -K, -l, -s, -v ó -V" + +#: src/parse_args.c:696 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita ficheros como otru usuariu\n" +"\n" + +#: src/parse_args.c:698 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - executa un comandu como otru usuariu\n" +"\n" + +#: src/parse_args.c:703 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opciones:\n" + +#: src/parse_args.c:705 +msgid "use a helper program for password prompting" +msgstr "usa un programa auxiliar pa la introducción de contraseñes" + +#: src/parse_args.c:708 +msgid "use specified BSD authentication type" +msgstr "usa la triba d'autenticación BSD especificada" + +#: src/parse_args.c:711 +msgid "run command in the background" +msgstr "executa'l comandu en segundu planu" + +#: src/parse_args.c:713 +msgid "close all file descriptors >= num" +msgstr "zarra tolos descriptores de ficheru >= num" + +#: src/parse_args.c:716 +msgid "run command with the specified BSD login class" +msgstr "executa'l comandu cola clas d'aniciu de sesión BSD especificada" + +#: src/parse_args.c:719 +msgid "preserve user environment when running command" +msgstr "caltién l'entornu del usuariu al executar el comandu" + +#: src/parse_args.c:721 +msgid "preserve specific environment variables" +msgstr "caltién variables d'entornu específiques" + +#: src/parse_args.c:723 +msgid "edit files instead of running a command" +msgstr "edita ficheros en cuentes d'executar un comandu" + +#: src/parse_args.c:725 +msgid "run command as the specified group name or ID" +msgstr "executa'l comandu como nome o ID de grupu especificaos" + +#: src/parse_args.c:727 +msgid "set HOME variable to target user's home dir" +msgstr "afita la variable HOME al direutoriu d'aniciu del usuariu de destín" + +#: src/parse_args.c:729 +msgid "display help message and exit" +msgstr "amuesa esti mensaxe d'ayuda y cola" + +#: src/parse_args.c:731 +msgid "run command on host (if supported by plugin)" +msgstr "executa'l comandu nel agospiu (si lo sofita'l complementu)" + +#: src/parse_args.c:733 +msgid "run login shell as the target user; a command may also be specified" +msgstr "executa la shell d'aniciu de sesión como l'usuariu de destín. Tamién podría especificase un comandu" + +#: src/parse_args.c:735 +msgid "remove timestamp file completely" +msgstr "desanicia dafechu'l ficheru de marques de tiempu" + +#: src/parse_args.c:737 +msgid "invalidate timestamp file" +msgstr "invalida'l ficheru de marques de tiempu" + +#: src/parse_args.c:739 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "llista los privilexos del usuariu o comprueba un comandu específicu, úsalu dos vegaes pa un formatu más llargu" + +#: src/parse_args.c:741 +msgid "non-interactive mode, no prompts are used" +msgstr "mou non interactivu, nun va entrugase nada" + +#: src/parse_args.c:743 +msgid "preserve group vector instead of setting to target's" +msgstr "caltién el vector de grupos en cuentes d'afitar el del destín" + +#: src/parse_args.c:745 +msgid "use the specified password prompt" +msgstr "usa la contraseña que s'especificare" + +#: src/parse_args.c:748 +msgid "create SELinux security context with specified role" +msgstr "crea'l contestu de seguranza de SELinux con rol especificáu" + +#: src/parse_args.c:751 +msgid "read password from standard input" +msgstr "llee la contraseña de magar la entrada estándar" + +#: src/parse_args.c:753 +msgid "run shell as the target user; a command may also be specified" +msgstr "executa la shell como l'usuariu de destín, tamién podría especificase un comandu" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified type" +msgstr "crea'l contestu de seguranza de SELinux cola triba especificada" + +#: src/parse_args.c:759 +msgid "terminate command after the specified time limit" +msgstr "termina'l comandu tres la llende de tiempu especificada" + +#: src/parse_args.c:761 +msgid "in list mode, display privileges for user" +msgstr "nel mou llista, amuesa los privilexos del usuariu" + +#: src/parse_args.c:763 +msgid "run command (or edit file) as specified user name or ID" +msgstr "executa'l comandu (o edita'l ficheru) como nome o ID d'usuariu especificaos" + +#: src/parse_args.c:765 +msgid "display version information and exit" +msgstr "amuesa la información de la versión y cola" + +#: src/parse_args.c:767 +msgid "update user's timestamp without running a command" +msgstr "anueva la marca de tiempu del usuariu ensin executar un comandu" + +#: src/parse_args.c:769 +msgid "stop processing command line arguments" +msgstr "dexa de procesar los argumentos de la llinia de comandos" + +#: src/selinux.c:83 +msgid "unable to open audit system" +msgstr "nun pue abrise'l sistema d'auditoría" + +#: src/selinux.c:93 +msgid "unable to send audit message" +msgstr "nun pue unviase'l mensaxe d'auditoría" + +#: src/selinux.c:121 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "nun pue facese fgetfilecon a %s" + +#: src/selinux.c:126 +#, c-format +msgid "%s changed labels" +msgstr "%s camudó les etiquetes" + +#: src/selinux.c:131 +#, c-format +msgid "unable to restore context for %s" +msgstr "nun pue restaurase'l contestu pa %s" + +#: src/selinux.c:172 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "nun pue abrise %s, nun va reetiquetase la TTY" + +#: src/selinux.c:176 src/selinux.c:217 src/selinux.c:234 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s nun ye un preséu de caráuteres, nun va reetiquetase la TTY" + +#: src/selinux.c:185 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nun pue consiguise'l contestu actual de la TTY, nun va reetiquetase la TTY" + +#: src/selinux.c:192 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "desconozse la clas de seguranza «chr_file», nun va reetiquetase la TTY" + +#: src/selinux.c:197 +msgid "unable to get new tty context, not relabeling tty" +msgstr "nun pue consiguise'l contestu nuevu de la TTY, nun va reetiquetase la TTY" + +#: src/selinux.c:204 +msgid "unable to set new tty context" +msgstr "nun pue afitase un contestu nuevu de TTY" + +#: src/selinux.c:278 +#, c-format +msgid "you must specify a role for type %s" +msgstr "has especificar un rol pa la triba %s" + +#: src/selinux.c:284 +#, c-format +msgid "unable to get default type for role %s" +msgstr "nun pue consiguise la triba predeterminada del rol %s" + +#: src/selinux.c:302 +#, c-format +msgid "failed to set new role %s" +msgstr "fallu al afitar el rol nuevu %s" + +#: src/selinux.c:306 +#, c-format +msgid "failed to set new type %s" +msgstr "fallu al afitar la triba nueva %s" + +#: src/selinux.c:318 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nun ta nun contestu válidu" + +#: src/selinux.c:353 +msgid "failed to get old_context" +msgstr "fallu al consiguir old_context" + +#: src/selinux.c:359 +msgid "unable to determine enforcing mode." +msgstr "nun pue determinase'l mou obligatoriu." + +#: src/selinux.c:376 +#, c-format +msgid "unable to set tty context to %s" +msgstr "nun pue afitase'l contestu de TTY a %s" + +#: src/selinux.c:415 +#, c-format +msgid "unable to set exec context to %s" +msgstr "nun pue afitase'l contestu d'execución a %s" + +#: src/selinux.c:422 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "nun pue afitase'l contestu de creación de claves a %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "rique polo menos un argumentu" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "el númberu del descriptor de ficheru nun ye válidu: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "nun pue executase %s como una shell d'aniciu de sesión" + +#: src/signal.c:88 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "nun pue guardase'l remanador pa la señal %d" + +#: src/solaris.c:81 +msgid "resource control limit has been reached" +msgstr "algamóse la llende del control de recursos" + +#: src/solaris.c:84 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "l'usuariu «%s» nun ye miembru del proyeutu «%s»" + +#: src/solaris.c:88 +msgid "the invoking task is final" +msgstr "la xera qu'invoca ye final" + +#: src/solaris.c:91 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nun pudo xunise al proyeutu «%s»" + +#: src/solaris.c:96 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nun hai dengún conxuntu de recursos qu'aceute los arreyos predeterminaos del proyeutu «%s»" + +#: src/solaris.c:100 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "el conxuntu de recursos especificáu nun esiste pal proyeutu «%s»" + +#: src/solaris.c:104 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "nun pue arreyase al conxuntu predetermináu de recursos del proyeutu «%s»" + +#: src/solaris.c:110 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject falló pal proyeutu «%s»" + +#: src/solaris.c:112 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "alvertencia, falló l'asignación del control de recursos pal proyeutu «%s»" + +#: src/sudo.c:201 +#, c-format +msgid "Sudo version %s\n" +msgstr "Versión %s de Sudo\n" + +#: src/sudo.c:203 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opciones de configuración: %s\n" + +#: src/sudo.c:211 +msgid "fatal error, unable to load plugins" +msgstr "fallu fatal, nun puen cargase los complementos" + +#: src/sudo.c:219 +msgid "unable to initialize policy plugin" +msgstr "nun pue aniciase'l complementu de polítiques" + +#: src/sudo.c:263 +msgid "plugin did not return a command to execute" +msgstr "el complementu nun devolvió un comandu a executar" + +#: src/sudo.c:279 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "fallu aniciando'l complementu d'E/S %s" + +#: src/sudo.c:302 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "nun s'esperaba'l mou de sudo 0x%x" + +#: src/sudo.c:535 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nun esistes na base de datos %s" + +#: src/sudo.c:592 +msgid "unable to determine tty" +msgstr "nun pue determinase la tty" + +#: src/sudo.c:880 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s ha ser propiedá del UID %d y tener afitáu'l bit setuid" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "l'UID efeutivu nun ye %d, ¿ta %s nun sistema de ficheros cola opción «nosuid» afitada o nun sistema de ficheros NFS ensin privilexos root?" + +#: src/sudo.c:889 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "l'UID efeutivu nun ye %d, ¿ta sudo instaláu como setuid root?" + +#: src/sudo.c:942 +msgid "unable to set supplementary group IDs" +msgstr "nun pudierons afitase les IDs de grupu suplementaries" + +#: src/sudo.c:949 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "nun pue afitase'l GID efeutivu al GID de runas %u" + +#: src/sudo.c:955 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "nun pue afitase'l GID al GID de runas %u" + +#: src/sudo.c:1012 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "nun s'esperaba la condición de terminación del fíu: %d" + +#: src/sudo.c:1158 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "al complementu de polítiques %s fálta-y el métodu «check_policy»" + +#: src/sudo.c:1176 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "el complementu de polítiques %s nun sofita'l llistar privilexos" + +#: src/sudo.c:1193 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "el complementu de polítiques %s nun sofita la opción -v" + +#: src/sudo.c:1208 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "el complementu de polítiques %s nun sofita les opciones -k/-K" + +#: src/sudo_edit.c:219 +msgid "no writable temporary directory found" +msgstr "nun s'alcontró dengún direutoriu temporal escribible" + +#: src/sudo_edit.c:286 src/sudo_edit.c:375 +msgid "unable to restore current working directory" +msgstr "nun pue restaurase'l direutoriu actual de trabayu" + +#: src/sudo_edit.c:592 src/sudo_edit.c:704 +#, c-format +msgid "%s: not a regular file" +msgstr "%s nun ye un ficheru regular" + +#: src/sudo_edit.c:599 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: nun se permite la edición d'enllaces simbólicos" + +#: src/sudo_edit.c:602 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: nun se permite la edición de ficheros nun direutoriu escribible" + +#: src/sudo_edit.c:635 src/sudo_edit.c:742 +#, c-format +msgid "%s: short write" +msgstr "%s: escritura breve" + +#: src/sudo_edit.c:705 +#, c-format +msgid "%s left unmodified" +msgstr "%s quedó ensin modificar" + +#: src/sudo_edit.c:718 src/sudo_edit.c:903 +#, c-format +msgid "%s unchanged" +msgstr "%s nun camudó" + +#: src/sudo_edit.c:731 src/sudo_edit.c:753 +#, c-format +msgid "unable to write to %s" +msgstr "nun pue escribise en %s" + +#: src/sudo_edit.c:732 src/sudo_edit.c:751 src/sudo_edit.c:754 +#: src/sudo_edit.c:928 src/sudo_edit.c:932 +#, c-format +msgid "contents of edit session left in %s" +msgstr "el conteníu de la sesión d'edición quedó en %s" + +#: src/sudo_edit.c:750 +msgid "unable to read temporary file" +msgstr "nun pue lleese'l ficheru temporal" + +#: src/sudo_edit.c:833 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: fallu internu: númberu estrañu de caminos" + +#: src/sudo_edit.c:835 +msgid "sesh: unable to create temporary files" +msgstr "sesh: nun puen crease ficheros temporales" + +#: src/sudo_edit.c:837 src/sudo_edit.c:935 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: desconozse'l fallu %d" + +#: src/sudo_edit.c:927 +msgid "unable to copy temporary files back to their original location" +msgstr "nun puen copiase los ficheros temporales al so allugamientu orixinal" + +#: src/sudo_edit.c:931 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "nun puen copiase dalgunos ficheros temporales al so allugamientu orixinal" + +#: src/sudo_edit.c:976 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "nun pue camudase l'UID a root (%u)" + +#: src/sudo_edit.c:993 +msgid "plugin error: missing file list for sudoedit" +msgstr "fallu del complementu: falta la llista de ficheros de sudoedit" + +#: src/sudo_edit.c:1034 src/sudo_edit.c:1047 +msgid "unable to read the clock" +msgstr "nun pue lleese'l reló" + +#: src/tgetpass.c:101 +msgid "timed out reading password" +msgstr "escosó'l tiempu d'espera de la llectura de la contraseña" + +#: src/tgetpass.c:104 +msgid "no password was provided" +msgstr "nun s'apurrió denguna contraseña" + +#: src/tgetpass.c:107 +msgid "unable to read password" +msgstr "nun pue lleese la contraseña" + +#: src/tgetpass.c:141 +msgid "no tty present and no askpass program specified" +msgstr "nun hai denguna TTY presente nin s'especificó dengún programa askpass" + +#: src/tgetpass.c:150 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nun s'especificó dengún programa askpass, tenta d'afitar SUDO_ASKPASS" + +#: src/tgetpass.c:307 +#, c-format +msgid "unable to set gid to %u" +msgstr "nun pue afitase'l GID a %u" + +#: src/tgetpass.c:311 +#, c-format +msgid "unable to set uid to %u" +msgstr "nun pue afitase l'UID a %u" + +#: src/tgetpass.c:316 +#, c-format +msgid "unable to run %s" +msgstr "nun pue executase %s" + +#: src/utmp.c:271 +msgid "unable to save stdin" +msgstr "nun pue guardase stdin" + +#: src/utmp.c:273 +msgid "unable to dup2 stdin" +msgstr "nun pue facese dup2 a stdin" + +#: src/utmp.c:276 +msgid "unable to restore stdin" +msgstr "nun pue resaturase stdin" diff --git a/utsudo-0.0.2/po/ca.mo b/utsudo-0.0.2/po/ca.mo new file mode 100644 index 0000000000000000000000000000000000000000..9fa8d255baf0cd79515769190b6d706b3113895d GIT binary patch literal 19142 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/ca.po b/utsudo-0.0.2/po/ca.po new file mode 100644 index 0000000..ac92101 --- /dev/null +++ b/utsudo-0.0.2/po/ca.po @@ -0,0 +1,896 @@ +# translation of sudo to Catalan +# This file is put in the public domain. +# Walter Garcia-Fontes , 2016. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.19b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2016-11-21 17:45-0700\n" +"PO-Revision-Date: 2016-12-29 15:48+0100\n" +"Last-Translator: Walter Garcia-Fontes \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "no s'ha pogut obrir userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "no s'ha pogut passar al registre \"%s\" per a %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "no s'ha pogut restaurar el registre" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:184 lib/util/sudo_conf.c:270 lib/util/sudo_conf.c:347 +#: lib/util/sudo_conf.c:545 src/conversation.c:75 src/exec.c:867 +#: src/exec_common.c:107 src/exec_common.c:123 src/exec_common.c:132 +#: src/exec_pty.c:692 src/exec_pty.c:700 src/exec_pty.c:1163 +#: src/load_plugins.c:52 src/load_plugins.c:65 src/load_plugins.c:215 +#: src/load_plugins.c:238 src/load_plugins.c:303 src/load_plugins.c:318 +#: src/parse_args.c:180 src/parse_args.c:202 src/parse_args.c:370 +#: src/parse_args.c:466 src/parse_args.c:488 src/preserve_fds.c:47 +#: src/preserve_fds.c:130 src/selinux.c:83 src/selinux.c:292 src/selinux.c:415 +#: src/selinux.c:424 src/sesh.c:115 src/sudo.c:397 src/sudo.c:416 +#: src/sudo.c:480 src/sudo.c:602 src/sudo.c:662 src/sudo.c:672 src/sudo.c:692 +#: src/sudo.c:711 src/sudo.c:720 src/sudo.c:729 src/sudo.c:746 src/sudo.c:787 +#: src/sudo.c:797 src/sudo.c:817 src/sudo.c:1238 src/sudo.c:1259 +#: src/sudo.c:1433 src/sudo.c:1527 src/sudo_edit.c:151 src/sudo_edit.c:775 +#: src/sudo_edit.c:872 src/sudo_edit.c:985 src/sudo_edit.c:1005 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:185 +#: lib/util/sudo_conf.c:270 lib/util/sudo_conf.c:347 lib/util/sudo_conf.c:545 +#: src/conversation.c:76 src/exec.c:867 src/exec_common.c:107 +#: src/exec_common.c:124 src/exec_common.c:133 src/exec_pty.c:692 +#: src/exec_pty.c:700 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:488 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:83 src/selinux.c:292 src/selinux.c:415 src/selinux.c:424 +#: src/sesh.c:115 src/sudo.c:397 src/sudo.c:416 src/sudo.c:480 src/sudo.c:602 +#: src/sudo.c:817 src/sudo.c:1238 src/sudo.c:1259 src/sudo.c:1433 +#: src/sudo.c:1527 src/sudo_edit.c:151 src/sudo_edit.c:775 src/sudo_edit.c:872 +#: src/sudo_edit.c:985 src/sudo_edit.c:1005 +msgid "unable to allocate memory" +msgstr "no s'ha pogut assignar memòria" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Senyal desconegut" + +#: lib/util/strtoid.c:76 lib/util/strtoid.c:104 lib/util/strtomode.c:49 +#: lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "valor no vàlid" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "valor massa gran" + +#: lib/util/strtoid.c:89 lib/util/strtomode.c:55 lib/util/strtonum.c:61 +#: lib/util/strtonum.c:182 +msgid "value too small" +msgstr "valor massa petit" + +#: lib/util/sudo_conf.c:203 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valor Path no vàlid «%s» a %s, línia %u" + +#: lib/util/sudo_conf.c:369 lib/util/sudo_conf.c:422 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valor no vàlid per a %s «%s» a %s, línia %u" + +#: lib/util/sudo_conf.c:390 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "font de grup no suportat «%s» a %s, línia %u" + +#: lib/util/sudo_conf.c:406 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "grups «%s» max no vàlids a %s, línia %u" + +#: lib/util/sudo_conf.c:561 +#, c-format +msgid "unable to stat %s" +msgstr "no es pot obrir %s" + +#: lib/util/sudo_conf.c:564 +#, c-format +msgid "%s is not a regular file" +msgstr "%s no és un fitxer regular" + +#: lib/util/sudo_conf.c:567 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s és propietat de l'uid %u, hauria de ser %u" + +#: lib/util/sudo_conf.c:571 +#, c-format +msgid "%s is world writable" +msgstr "%s és escrivible per tothom" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "%s is group writable" +msgstr "%s és escrivible pel grup" + +#: lib/util/sudo_conf.c:584 src/selinux.c:201 src/selinux.c:213 src/sudo.c:366 +#, c-format +msgid "unable to open %s" +msgstr "no s'ha pogut obrir %s" + +#: src/exec.c:115 src/exec.c:117 src/exec.c:122 src/exec.c:408 src/exec.c:410 +#: src/exec.c:412 src/exec.c:414 src/exec.c:416 src/exec.c:418 src/exec.c:421 +#: src/exec.c:437 src/exec.c:439 src/exec.c:600 src/exec.c:794 +#: src/exec_pty.c:464 src/exec_pty.c:730 src/exec_pty.c:800 src/exec_pty.c:802 +#: src/exec_pty.c:814 src/exec_pty.c:816 src/exec_pty.c:1347 +#: src/exec_pty.c:1349 src/exec_pty.c:1354 src/exec_pty.c:1356 +#: src/exec_pty.c:1370 src/exec_pty.c:1381 src/exec_pty.c:1383 +#: src/exec_pty.c:1385 src/exec_pty.c:1387 src/exec_pty.c:1389 +#: src/exec_pty.c:1391 src/exec_pty.c:1393 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "no es pot establir el gestor per al senyal %d" + +#: src/exec.c:127 src/exec_pty.c:846 src/exec_pty.c:1431 src/tgetpass.c:250 +msgid "unable to fork" +msgstr "no s'ha pogut bifurcar" + +#: src/exec.c:303 src/exec.c:311 src/exec.c:872 src/exec_pty.c:585 +#: src/exec_pty.c:590 src/exec_pty.c:660 src/exec_pty.c:667 src/exec_pty.c:954 +#: src/exec_pty.c:964 src/exec_pty.c:1009 src/exec_pty.c:1016 +#: src/exec_pty.c:1041 src/exec_pty.c:1496 src/exec_pty.c:1503 +#: src/exec_pty.c:1510 +msgid "unable to add event to queue" +msgstr "no s'ha pogut afegir un esdeveniment a la cua" + +#: src/exec.c:391 +msgid "unable to create sockets" +msgstr "no s'ha pogut crear el sòcol" + +#: src/exec.c:446 +msgid "policy plugin failed session initialization" +msgstr "el connector de política ha fallat la inicialització de la sessió" + +#: src/exec.c:491 +msgid "error in event loop" +msgstr "error al bucle d'esdeveniment" + +#: src/exec.c:509 +msgid "unable to restore tty label" +msgstr "no s'ha pogut restaurar l'etiqueta tty" + +#: src/exec.c:608 src/exec_pty.c:496 src/signal.c:87 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "no s'ha pogut restaurar el gestor per al senyal %d" + +#: src/exec.c:726 src/exec_pty.c:1236 +msgid "error reading from signal pipe" +msgstr "error en llegir del conducte del senyal" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "no s'ha pogut remoure PRIV_PROC_EXEC de PRIV_LIMIT" + +#: src/exec_pty.c:188 +msgid "unable to allocate pty" +msgstr "no s'ha pogut assignar pty" + +#: src/exec_pty.c:774 src/exec_pty.c:783 src/exec_pty.c:791 +#: src/exec_pty.c:1339 src/exec_pty.c:1428 src/signal.c:129 src/tgetpass.c:246 +msgid "unable to create pipe" +msgstr "no s'ha pogut crear un conducte" + +#: src/exec_pty.c:1269 +msgid "error reading from pipe" +msgstr "error en llegir del conducte" + +#: src/exec_pty.c:1296 +msgid "error reading from socketpair" +msgstr "error en llegir del parell de sòcols" + +#: src/exec_pty.c:1305 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipus de resposta inesperada al canal posterior: %d" + +#: src/exec_pty.c:1407 +msgid "unable to set controlling tty" +msgstr "no s'ha pogut configurar la tty controladora" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "error a %s, línia %d quan s'estava carregant el connector «%s»" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s ha de ser propietat de l'uid %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s ha de ser escrivible únicament pel propietari" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "no s'ha pogut carregar %s: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "no s'ha pogut trobar el símbol «%s» a %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "s'ha trobat un tipus desconegut de política %d a %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "s'ha trobat una versió major %d incompatible de connector (s'esperava %d) a %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "s'ignorarà el connector de política «%s» a %s, línia %d" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "sols es pot especificar un únic connector de política" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "s'ignorarà el connector entrada/sortida duplicat «%s» a %s, línia %d" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "s'ignorarà el connector entrada/sortida duplica «%s» a %s, línia %d" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "el connector de política %s no inclou un mètode check_policy" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:475 +#, c-format +msgid "internal error, %s overflow" +msgstr "error intern, sobreeiximent de %s" + +#: src/parse_args.c:239 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "l'argument per a -C ha de ser un número més gran o igual a 3" + +#: src/parse_args.c:406 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "no podeu especificar a l'hora les opcions `-i' i `-s'" + +#: src/parse_args.c:410 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "no podeu especificar a l'hora les opcons `-i' i `-E'" + +#: src/parse_args.c:420 +msgid "the `-E' option is not valid in edit mode" +msgstr "l'opció `-E' no és vàlida al mode editar" + +#: src/parse_args.c:422 +msgid "you may not specify environment variables in edit mode" +msgstr "no podeu especificar variables d'entorn al mode editar" + +#: src/parse_args.c:430 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "l'opció `-U' sols es pot usar amb l'opció `-l'" + +#: src/parse_args.c:434 +msgid "the `-A' and `-S' options may not be used together" +msgstr "no es poden usar a l'hora les opcions `-A' i `-S'" + +#: src/parse_args.c:510 +msgid "sudoedit is not supported on this platform" +msgstr "aquesta plataforma no dóna suport a sudoedit" + +#: src/parse_args.c:583 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Sols es pot especificar una de les opcions -e, -h, -i, -K, -l, -s, -v o -V" + +#: src/parse_args.c:597 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita fitxers com un altre usuari\n" +"\n" + +#: src/parse_args.c:599 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - executa una ordre com un altre usuari\n" +"\n" + +#: src/parse_args.c:604 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opcions:\n" + +#: src/parse_args.c:606 +msgid "use a helper program for password prompting" +msgstr "usa un programa auxiliar per a la pregunta de la contrasenya" + +#: src/parse_args.c:609 +msgid "use specified BSD authentication type" +msgstr "usa el tipus d'autenticació BSD especificat" + +#: src/parse_args.c:612 +msgid "run command in the background" +msgstr "executa l'ordre en el segon pla" + +#: src/parse_args.c:614 +msgid "close all file descriptors >= num" +msgstr "tanca tots els descriptors de fitxer >= num" + +#: src/parse_args.c:617 +msgid "run command with the specified BSD login class" +msgstr "executa l'ordre amb la classe d'inici de sesssió BSD especificada" + +#: src/parse_args.c:620 +msgid "preserve user environment when running command" +msgstr "preserva l'entorn de l'usuari quan s'executi l'ordre" + +#: src/parse_args.c:622 +msgid "edit files instead of running a command" +msgstr "edita els fitxers en comptes d'executar una ordre" + +#: src/parse_args.c:624 +msgid "run command as the specified group name or ID" +msgstr "executa l'ordre com el nom o ID especificats de grup" + +#: src/parse_args.c:626 +msgid "set HOME variable to target user's home dir" +msgstr "estableix la variable HOME per apuntar al directori de l'usuari" + +#: src/parse_args.c:628 +msgid "display help message and exit" +msgstr "mostra el missatge d'ajuda i surt" + +#: src/parse_args.c:630 +msgid "run command on host (if supported by plugin)" +msgstr "executa l'ordre a l'amfitrió (si està suportat pel connector)" + +#: src/parse_args.c:632 +msgid "run login shell as the target user; a command may also be specified" +msgstr "executa l'intèrpret d'ordres de l'inici de sessió com a usuari de destinació; també es pot especificar una ordre" + +#: src/parse_args.c:634 +msgid "remove timestamp file completely" +msgstr "suprimeix completament el fitxer de marca de temps" + +#: src/parse_args.c:636 +msgid "invalidate timestamp file" +msgstr "fitxer de marca de temps no vàlid" + +#: src/parse_args.c:638 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "fes una llista dels privilegis de l'usuari o verifica una ordre específica; usueu-lo dues vegades per a formats més llargs" + +#: src/parse_args.c:640 +msgid "non-interactive mode, no prompts are used" +msgstr "mode no interactiu, no es preguntarà res" + +#: src/parse_args.c:642 +msgid "preserve group vector instead of setting to target's" +msgstr "preserva el vector de grup en comptes d'establir-lo d'acord amb la destinació" + +#: src/parse_args.c:644 +msgid "use the specified password prompt" +msgstr "usa la pregunta específica de contrasenya" + +#: src/parse_args.c:647 +msgid "create SELinux security context with specified role" +msgstr "crea un context de seguretat SELinux amb el rol especificat" + +#: src/parse_args.c:650 +msgid "read password from standard input" +msgstr "llegeix la contrasenya des de l'entrada estàndard" + +#: src/parse_args.c:652 +msgid "run shell as the target user; a command may also be specified" +msgstr "executa l'intèrpret d'ordres com a usuari de destinació; també es pot especificar una ordre" + +#: src/parse_args.c:655 +msgid "create SELinux security context with specified type" +msgstr "crea el context de seguretat SELinux amb el tipus especificat" + +#: src/parse_args.c:658 +msgid "in list mode, display privileges for user" +msgstr "en mode llista, mostra els privilegis per a l'usuari" + +#: src/parse_args.c:660 +msgid "run command (or edit file) as specified user name or ID" +msgstr "executa l'ordre (o edita el fitxer) com el nom o ID especificats d'usuari" + +#: src/parse_args.c:662 +msgid "display version information and exit" +msgstr "mostra la informació de versió i surt" + +#: src/parse_args.c:664 +msgid "update user's timestamp without running a command" +msgstr "actualitza la marca de temps de l'usuari sense executar una ordre" + +#: src/parse_args.c:666 +msgid "stop processing command line arguments" +msgstr "deixa de processar els arguments de línia d'ordres" + +#: src/selinux.c:77 +msgid "unable to open audit system" +msgstr "no s'ha pogut obrir el sistema d'auditoria" + +#: src/selinux.c:87 +msgid "unable to send audit message" +msgstr "no s'ha pogut enviar el missatge d'auditoria" + +#: src/selinux.c:115 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "no s'ha pogut fgetfilecon %s" + +#: src/selinux.c:120 +#, c-format +msgid "%s changed labels" +msgstr "%s ha canviat les etiquetes" + +#: src/selinux.c:125 +#, c-format +msgid "unable to restore context for %s" +msgstr "no s'ha pogut restaurar el context per a %s" + +#: src/selinux.c:165 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "no s'ha pogut obrir %s, no es canviaran les etiquetes per a la tty" + +#: src/selinux.c:173 +msgid "unable to get current tty context, not relabeling tty" +msgstr "no s'ha pogut obtenir el context tty actual, no es canviaran les etiquetes per a la tty" + +#: src/selinux.c:180 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe de seguretat «char_file» desconeguda, no es canviaran les etiquetes de la tty" + +#: src/selinux.c:185 +msgid "unable to get new tty context, not relabeling tty" +msgstr "no s'ha pogut obtenir el nou context tty, no es canviaran les etiquetes tty" + +#: src/selinux.c:192 +msgid "unable to set new tty context" +msgstr "no s'ha pogut establir el nou context tty" + +#: src/selinux.c:256 +#, c-format +msgid "you must specify a role for type %s" +msgstr "heu d'especificar un rol per al tipus %s" + +#: src/selinux.c:262 +#, c-format +msgid "unable to get default type for role %s" +msgstr "no s'ha pogut obtenir un tipus predeterminat per al rol %s" + +#: src/selinux.c:280 +#, c-format +msgid "failed to set new role %s" +msgstr "no s'ha pogut establir el nou rol %s" + +#: src/selinux.c:284 +#, c-format +msgid "failed to set new type %s" +msgstr "no s'ha pogut establir el nou tipus %s" + +#: src/selinux.c:296 +#, c-format +msgid "%s is not a valid context" +msgstr "%s no és un context vàlid" + +#: src/selinux.c:331 +msgid "failed to get old_context" +msgstr "no s'ha pogut obtenir old_context" + +#: src/selinux.c:337 +msgid "unable to determine enforcing mode." +msgstr "no s'ha pogut determinar el mode de fer complir" + +#: src/selinux.c:354 +#, c-format +msgid "unable to set tty context to %s" +msgstr "no s'ha pogut establir el context tty a %s" + +#: src/selinux.c:393 +#, c-format +msgid "unable to set exec context to %s" +msgstr "no s'ha pogut establir el context exec a %s" + +#: src/selinux.c:400 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "no s'ha pogut establir el context de creació de clau a %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "es requereix almenys un argument" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "número no vàlid de descriptor de fitxer: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "no s'ha pogut executar %s com a intèrpret d'ordres d'inici de sessió" + +#: src/sesh.c:125 src/sudo.c:1297 +#, c-format +msgid "unable to execute %s" +msgstr "no s'ha pogut executar %s" + +#: src/signal.c:69 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "no s'ha pogut desar el gestorper al senyal %d" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "s'ha assolit el límit de control de recursos" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "l'usuari \"%s\" no és un membre del projecte \"%s\"" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "la tasca invocant és final" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "no es pot fer la incorporació al projecte \"%s\"" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "no hi ha vinculacions predeterminades d'acceptació de conjunt de recursos per al projecte \"%s\"" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "no existeix el conjunt de recursos especifica per al projecte \"%s\"" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "no s'ha pogut vincular al conjunt de recursos predeterminats per al projecte \"%s\"" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "ha fallat setproject per al projecte \"%s\"" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "advertiment, l'assignació de control de recursos ha fallat per al projecte \"%s\"" + +#: src/sudo.c:212 +#, c-format +msgid "Sudo version %s\n" +msgstr "Versió de sudo %s\n" + +#: src/sudo.c:214 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opcions de configuració: %s\n" + +#: src/sudo.c:222 +msgid "fatal error, unable to load plugins" +msgstr "error fatal, no s'han pogut carregar els connectors" + +#: src/sudo.c:230 +msgid "unable to initialize policy plugin" +msgstr "no s'ha pogut inicialitzar el connector de polítiques" + +#: src/sudo.c:274 +msgid "plugin did not return a command to execute" +msgstr "el connector no ha retornat una ordre a executar" + +#: src/sudo.c:290 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "no se pogut iniciliatzar el connector %s entrada/sortida" + +#: src/sudo.c:316 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "mode 0x%x inesperat de sudo" + +#: src/sudo.c:460 +msgid "unable to get group vector" +msgstr "no s'ha pogut obtenir el vector de grup" + +#: src/sudo.c:522 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "uid %u desconegut: qui sou?" + +#: src/sudo.c:578 +msgid "unable to determine tty" +msgstr "no s'ha pogut determinar la tty" + +#: src/sudo.c:866 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s ha de ser propietat de l'uid %d i tenir el bit setuid establert" + +#: src/sudo.c:869 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "" +"l'uid efectiu no és %d, és %s a un sistema de fitxers amb l'opció\n" +"'nosuid' establarta o un sistema de fitxers NFS sense d'usuari primari? " + +#: src/sudo.c:875 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "l'uid efectiu no és %d, és el sudo instal·lat com a setuid root?" + +#: src/sudo.c:956 +msgid "unable to set supplementary group IDs" +msgstr "no s'han pogut establir els IDs de grup suplementaris" + +#: src/sudo.c:963 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "no s'ha pogut establir el gid efectiu per a runas gid %u" + +#: src/sudo.c:969 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "no s'ha pogut establir el gid a runas gid %u" + +#: src/sudo.c:1040 +#, c-format +msgid "unknown login class %s" +msgstr "classe d'inici de sessió %s desconeguda" + +#: src/sudo.c:1053 +msgid "unable to set user context" +msgstr "no s'ha pogut establir el context d'usuari" + +#: src/sudo.c:1069 +msgid "unable to set process priority" +msgstr "no s'ha pogut establir la prioritat del procés" + +#: src/sudo.c:1077 +#, c-format +msgid "unable to change root to %s" +msgstr "no s'ha pogut canviar l'usuari primari a %s" + +#: src/sudo.c:1090 src/sudo.c:1096 src/sudo.c:1103 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "no s'ha pogut canviar a runas uid (%u, %u)" + +#: src/sudo.c:1121 +#, c-format +msgid "unable to change directory to %s" +msgstr "no s'ha pogut canviar el directori a %s" + +#: src/sudo.c:1179 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condició de terminació del fill inesperada: %d" + +#: src/sudo.c:1325 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "no hi ha el mètode `check_policy' al connector de polítiques %s" + +#: src/sudo.c:1343 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "el connector de política %s no dóna suport a llistar privilegis" + +#: src/sudo.c:1360 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "el connector de polítiques %s no dóna suport a l'opció -v" + +#: src/sudo.c:1375 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "el connector de polítiques %s no dóna suport a les opcions -k/-K" + +#: src/sudo_edit.c:181 src/sudo_edit.c:270 +msgid "unable to restore current working directory" +msgstr "no s'ha pogut restaurar el directori actual de treball" + +#: src/sudo_edit.c:577 src/sudo_edit.c:689 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: no és un fitxer regular" + +#: src/sudo_edit.c:584 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: no es permet l'edició de enllaços simbòlics" + +#: src/sudo_edit.c:587 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: no es permet l'edició de fitxers a un directori amb permís d'escriptura" + +#: src/sudo_edit.c:620 src/sudo_edit.c:728 +#, c-format +msgid "%s: short write" +msgstr "%s: escriptura breu" + +#: src/sudo_edit.c:690 +#, c-format +msgid "%s left unmodified" +msgstr "%s s'ha deixat sense modificar" + +#: src/sudo_edit.c:703 src/sudo_edit.c:889 +#, c-format +msgid "%s unchanged" +msgstr "%s sense canviar" + +#: src/sudo_edit.c:717 src/sudo_edit.c:739 +#, c-format +msgid "unable to write to %s" +msgstr "no s'ha pogut escriure a %s" + +#: src/sudo_edit.c:718 src/sudo_edit.c:737 src/sudo_edit.c:740 +#: src/sudo_edit.c:914 src/sudo_edit.c:918 +#, c-format +msgid "contents of edit session left in %s" +msgstr "els continguts de la sessió d'edició s'han deixat a %s" + +#: src/sudo_edit.c:736 +msgid "unable to read temporary file" +msgstr "no s'ha pogut llegir el fitxer temporal" + +#: src/sudo_edit.c:819 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: error intern: nombre imparell de camins" + +#: src/sudo_edit.c:821 +msgid "sesh: unable to create temporary files" +msgstr "sesh: no es poden crear fitxers temporal" + +#: src/sudo_edit.c:823 src/sudo_edit.c:921 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: error desconegut %d" + +#: src/sudo_edit.c:913 +msgid "unable to copy temporary files back to their original location" +msgstr "no es poden copiar els fitxers temporals un altre cop a la seva ubicació original" + +#: src/sudo_edit.c:917 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "no es poden copiar alguns dels fitxers temporals un altre cop a la seva ubicació original" + +#: src/sudo_edit.c:961 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "no s'ha pogut canviar l'uid a l'usuari primari (%u)" + +#: src/sudo_edit.c:978 +msgid "plugin error: missing file list for sudoedit" +msgstr "error de connector: no hi ha la llista de fitxers per a sudoedit" + +#: src/sudo_edit.c:1019 src/sudo_edit.c:1032 +msgid "unable to read the clock" +msgstr "no es pot llegir el rellotge" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "no hi ha un tty present i no s'ha especificat un programa askpass" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "no s'ha especificat un programa askpass, proveu d'establir SUDO_ASKPASS" + +#: src/tgetpass.c:261 +#, c-format +msgid "unable to set gid to %u" +msgstr "no s'ha pogut establir el gid a %u" + +#: src/tgetpass.c:265 +#, c-format +msgid "unable to set uid to %u" +msgstr "no s'ha pogut establir el uid a %u" + +#: src/tgetpass.c:270 +#, c-format +msgid "unable to run %s" +msgstr "no s'ha pogut executar %s" + +#: src/utmp.c:268 +msgid "unable to save stdin" +msgstr "no s'ha pogut desar el stdin" + +#: src/utmp.c:270 +msgid "unable to dup2 stdin" +msgstr "no s'ha pogut fer dup2 stdin" + +#: src/utmp.c:273 +msgid "unable to restore stdin" +msgstr "no s'ha pogut restaurar stdin" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "error intern, s'han intentat assignar zero bytes" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "no s'ha pogut configurar la terminal en mode en brut" + +#~ msgid "unable to open socket" +#~ msgstr "no s'ha pogut obrir el sòcol" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "error intern, s'ha intentat emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "error intern, s'ha intentat ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "error intern, s'ha intentat erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "error intern, s'ha intentat erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "error intern, s'ha intentat erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: s'ha detectat un sobreeiximent" diff --git a/utsudo-0.0.2/po/cs.mo b/utsudo-0.0.2/po/cs.mo new file mode 100644 index 0000000000000000000000000000000000000000..4a9050776beba77c2e7d09565008d51892c18c28 GIT binary patch literal 19548 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, 2011-2013 +# Petr Pisar , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 11:51-0600\n" +"PO-Revision-Date: 2019-07-22 17:51+02:00\n" +"Last-Translator: Petr Pisar \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "nelze otevřít databázi uživatelů" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "nelze se přepnout do registru „%s“ pro %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "registr nelze obnovit" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:469 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:999 +#: src/exec_pty.c:1162 src/exec_pty.c:1168 src/exec_pty.c:1177 +#: src/exec_pty.c:1184 src/exec_pty.c:1191 src/exec_pty.c:1198 +#: src/exec_pty.c:1205 src/exec_pty.c:1212 src/exec_pty.c:1219 +#: src/exec_pty.c:1226 src/exec_pty.c:1233 src/exec_pty.c:1240 +#: src/exec_pty.c:1248 src/exec_pty.c:1665 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:206 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:678 src/sudo.c:688 src/sudo.c:708 src/sudo.c:727 +#: src/sudo.c:736 src/sudo.c:745 src/sudo.c:762 src/sudo.c:803 src/sudo.c:813 +#: src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 src/sudo.c:1268 +#: src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 src/sudo_edit.c:888 +#: src/sudo_edit.c:1002 src/sudo_edit.c:1022 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:1162 +#: src/exec_pty.c:1168 src/exec_pty.c:1177 src/exec_pty.c:1184 +#: src/exec_pty.c:1191 src/exec_pty.c:1198 src/exec_pty.c:1205 +#: src/exec_pty.c:1212 src/exec_pty.c:1219 src/exec_pty.c:1226 +#: src/exec_pty.c:1233 src/exec_pty.c:1240 src/exec_pty.c:1248 +#: src/exec_pty.c:1665 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:207 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 +#: src/sudo.c:1268 src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 +#: src/sudo_edit.c:888 src/sudo_edit.c:1002 src/sudo_edit.c:1022 +msgid "unable to allocate memory" +msgstr "nelze alokovat paměť" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Neznámý signál" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:56 lib/util/strtonum.c:65 lib/util/strtonum.c:183 +msgid "invalid value" +msgstr "neplatná hodnota" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:138 lib/util/strtoid.c:166 +#: lib/util/strtomode.c:62 lib/util/strtonum.c:68 lib/util/strtonum.c:195 +msgid "value too large" +msgstr "hodnota je příliš velká" + +#: lib/util/strtoid.c:93 lib/util/strtoid.c:144 lib/util/strtomode.c:62 +#: lib/util/strtonum.c:68 lib/util/strtonum.c:189 +msgid "value too small" +msgstr "hodnota je příliš malá" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "neplatná hodnota Path „%s“ v %s, řádek %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "neplatná hodnota pro %s „%s“ v %s, řádek %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nepodporovaný zdroj skupin „%s“ v %s, řádek %u" + +# This is about maximal GID. English text "max groups" is wrong. +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "neplatné maximum skupin „%s“ v %s, řádek %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "nelze získat údaje o %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s není obyčejný soubor" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastněn UID %u, avšak UID by mělo být %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s je zapisovatelný pro všechny" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s je zapisovatelný pro skupinu" + +#: lib/util/sudo_conf.c:599 src/selinux.c:215 src/selinux.c:232 src/sudo.c:362 +#, c-format +msgid "unable to open %s" +msgstr "%s nelze otevřít" + +#: src/exec.c:167 +#, c-format +msgid "unknown login class %s" +msgstr "neznámá přihlašovací třída %s" + +#: src/exec.c:180 +msgid "unable to set user context" +msgstr "nelze nastavit kontext uživatele" + +#: src/exec.c:196 +msgid "unable to set process priority" +msgstr "nelze nastavit prioritu procesu" + +#: src/exec.c:204 +#, c-format +msgid "unable to change root to %s" +msgstr "kořenový adresář nelze změnit na %s" + +#: src/exec.c:217 src/exec.c:223 src/exec.c:230 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "nelze změnit UID na (%u, %u)" + +#: src/exec.c:248 +#, c-format +msgid "unable to change directory to %s" +msgstr "pracovní adresář nelze změnit na %s" + +#: src/exec.c:347 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:527 src/exec_pty.c:527 src/exec_pty.c:1333 +#: src/exec_pty.c:1335 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "obsluhu pro signál %d nelze nastavit" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "z PRIV_LIMIT nelze odstranit PRIV_PROC_EXEC" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "chyba při čtení z dvojice socketů" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "neočekávaný druh odpovědi na zpětném kanálu: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:649 +#: src/exec_pty.c:654 src/exec_pty.c:751 src/exec_pty.c:758 src/exec_pty.c:855 +#: src/exec_pty.c:1170 src/exec_pty.c:1179 src/exec_pty.c:1186 +#: src/exec_pty.c:1193 src/exec_pty.c:1200 src/exec_pty.c:1207 +#: src/exec_pty.c:1214 src/exec_pty.c:1221 src/exec_pty.c:1228 +#: src/exec_pty.c:1235 src/exec_pty.c:1242 src/exec_pty.c:1618 +#: src/exec_pty.c:1628 src/exec_pty.c:1673 src/exec_pty.c:1680 +#: src/exec_pty.c:1707 +msgid "unable to add event to queue" +msgstr "událost nelze přidat do fronty" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "řídicí terminál nelze nastavit" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1412 +#: src/exec_pty.c:1433 src/exec_pty.c:1453 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "nelze vytvořit rouru" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "od rodiče nelze přijmout zprávu" + +#: src/exec_monitor.c:616 src/exec_nopty.c:384 src/exec_pty.c:1491 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "nelze vytvořit potomka" + +#: src/exec_monitor.c:630 src/sesh.c:127 src/sudo.c:1132 +#, c-format +msgid "unable to execute %s" +msgstr "%s nelze spustit" + +#: src/exec_monitor.c:713 src/exec_nopty.c:437 +msgid "unable to restore tty label" +msgstr "nelze obnovit značku TTY" + +#: src/exec_nopty.c:360 src/exec_pty.c:1342 +msgid "policy plugin failed session initialization" +msgstr "modul s politikami zrušil inicializaci relace" + +#: src/exec_nopty.c:426 src/exec_pty.c:1578 +msgid "error in event loop" +msgstr "chyba ve smyčce s událostmi" + +#: src/exec_nopty.c:535 src/exec_pty.c:562 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "nelze obnovit obsluhu signálu %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "nelze alokovat PTY" + +#: src/exec_pty.c:1322 +msgid "unable to create sockets" +msgstr "nelze vytvořit sockety" + +#: src/exec_pty.c:1535 +msgid "unable to send message to monitor process" +msgstr "dohlížejícímu procesu nelze odeslat zprávu" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "chyba v %s na řádku %d při zavádění modulu „%s“" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí být vlastněn UID %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s musí být zapisovatelný jen vlastníkem" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s nelze zavést: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "v %s nelze nalézt symbol „%s“" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "v %2$s nalezen neznámý druh politiky %1$d" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "neslučitelná hlavní verze modulu %d (očekáváno %d) nalezena v %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignoruje se modul politiky „%s“ v %s na řádku %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "lze zadat pouze jeden modul s politikou" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignoruje je opakovaný modul s politikou „%s“ v %s na řádku %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignoruje je opakovaný modul vstupu a výstupu „%s“ v %s na řádku %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "modul s politikou %s neobsahuje metodu check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:472 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnitřní chyba, přetečení v %s" + +#: src/parse_args.c:227 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "neplatný název proměnné prostředí: %s" + +#: src/parse_args.c:326 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argument u -C musí být číslo větší nebo rovno 3" + +#: src/parse_args.c:511 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "nesmíte zadávat přepínače „-i“ a „-s“ spolu" + +#: src/parse_args.c:515 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "nesmíte zadávat přepínače „-i“ a „-E“ spolu" + +#: src/parse_args.c:525 +msgid "the `-E' option is not valid in edit mode" +msgstr "přepínač „-E“ není platný v režimu úprav" + +#: src/parse_args.c:527 +msgid "you may not specify environment variables in edit mode" +msgstr "v režimu úprav nesmíte zadávat proměnné prostředí" + +#: src/parse_args.c:535 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "přepínač „-U“ smí být použit jen s přepínačem „-l“" + +#: src/parse_args.c:539 +msgid "the `-A' and `-S' options may not be used together" +msgstr "přepínače „-A“ a „-S“ smí nesmí být použity spolu" + +#: src/parse_args.c:615 +msgid "sudoedit is not supported on this platform" +msgstr "na této platformě není sudoedit podporován" + +#: src/parse_args.c:688 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Smí být zadán pouze jeden z přepínačů -e, -h, -i, -K, -l, -s, -v nebo -V" + +#: src/parse_args.c:702 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s – upraví soubory jako jiný uživatel\n" +"\n" + +#: src/parse_args.c:704 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s – vykoná příkaz jako jiný uživatel\n" +"\n" + +#: src/parse_args.c:709 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Přepínače:\n" + +#: src/parse_args.c:711 +msgid "use a helper program for password prompting" +msgstr "dotazuje se na heslo prostřednictvím pomocného programu" + +#: src/parse_args.c:714 +msgid "use specified BSD authentication type" +msgstr "použije zadaný druh BSD autentizace" + +#: src/parse_args.c:717 +msgid "run command in the background" +msgstr "spustí příkaz na pozadí" + +#: src/parse_args.c:719 +msgid "ring bell when prompting" +msgstr "při výzvě vydá zvukové znamení" + +#: src/parse_args.c:721 +msgid "close all file descriptors >= num" +msgstr "uzavře všechny deskriptory souboru >= číslu" + +#: src/parse_args.c:724 +msgid "run command with the specified BSD login class" +msgstr "spustí příkaz se zadanou přihlašovací třídou BSD" + +#: src/parse_args.c:727 +msgid "preserve user environment when running command" +msgstr "při spuštění příkazu zachová uživatelské prostředí" + +#: src/parse_args.c:729 +msgid "preserve specific environment variables" +msgstr "zachová určité proměnné prostředí" + +#: src/parse_args.c:731 +msgid "edit files instead of running a command" +msgstr "místo spuštění příkazu upraví soubory" + +#: src/parse_args.c:733 +msgid "run command as the specified group name or ID" +msgstr "spustí příkaz jako skupina určení názvem nebo ID" + +#: src/parse_args.c:735 +msgid "set HOME variable to target user's home dir" +msgstr "nastaví proměnnou HOME na domovský adresář uživatele" + +#: src/parse_args.c:737 +msgid "display help message and exit" +msgstr "zobrazí nápovědu a skončí" + +#: src/parse_args.c:739 +msgid "run command on host (if supported by plugin)" +msgstr "spustí příkaz na stroji (je-li podporováno modulem)" + +#: src/parse_args.c:741 +msgid "run login shell as the target user; a command may also be specified" +msgstr "spustí přihlašovací shell jako cílový uživatel; příkaz lze rovněž zadat" + +#: src/parse_args.c:743 +msgid "remove timestamp file completely" +msgstr "úplně odstraní soubor s časovými údaji" + +#: src/parse_args.c:745 +msgid "invalidate timestamp file" +msgstr "zneplatní soubor s časovými údaji" + +#: src/parse_args.c:747 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "vypíše oprávnění uživatele nebo zkontroluje určitý příkaz; pro delší výstup použijte dvakrát" + +#: src/parse_args.c:749 +msgid "non-interactive mode, no prompts are used" +msgstr "neinteraktivní režim, nepoužijí se žádné dotazy" + +#: src/parse_args.c:751 +msgid "preserve group vector instead of setting to target's" +msgstr "zachová vektor skupin namísto nastavení na skupiny cíle" + +#: src/parse_args.c:753 +msgid "use the specified password prompt" +msgstr "použije určený dotaz na heslo" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified role" +msgstr "vytvoří selinuxový bezpečnostní kontext se zadanou rolí" + +#: src/parse_args.c:759 +msgid "read password from standard input" +msgstr "načte heslo ze standardní vstupu" + +#: src/parse_args.c:761 +msgid "run shell as the target user; a command may also be specified" +msgstr "spustí shell jako cílový uživatel; příkaz lze rovněž zadat" + +#: src/parse_args.c:764 +msgid "create SELinux security context with specified type" +msgstr "vytvoří selinuxový bezpečnostní kontext se zadaným typem" + +#: src/parse_args.c:767 +msgid "terminate command after the specified time limit" +msgstr "po uplynutí zadaného času ukončí příkaz" + +#: src/parse_args.c:769 +msgid "in list mode, display privileges for user" +msgstr "v režimu výpisu zobrazí oprávnění uživatele" + +#: src/parse_args.c:771 +msgid "run command (or edit file) as specified user name or ID" +msgstr "spustí příkaz (nebo upraví soubor) jako uživatel určený jménem nebo ID" + +#: src/parse_args.c:773 +msgid "display version information and exit" +msgstr "zobrazí údaje o verzi a skončí" + +#: src/parse_args.c:775 +msgid "update user's timestamp without running a command" +msgstr "aktualizuje časové údaje uživatele bez spuštění příkazu" + +#: src/parse_args.c:777 +msgid "stop processing command line arguments" +msgstr "přestane zpracovávat argumenty příkazového řádku" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "nelze otevřít auditní systém" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "nelze odeslat auditní zprávu" + +#: src/selinux.c:123 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "nelze získat kontext souboru %s pomocí fgetfilecon" + +#: src/selinux.c:128 +#, c-format +msgid "%s changed labels" +msgstr "%s změnilo značky" + +#: src/selinux.c:133 +#, c-format +msgid "unable to restore context for %s" +msgstr "nelze obnovit kontext %s" + +#: src/selinux.c:174 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s nelze otevřít, TTY nebude značka přepsána" + +#: src/selinux.c:178 src/selinux.c:219 src/selinux.c:236 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s není znakové zařízení, TTY nebude značka přepsána" + +#: src/selinux.c:187 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nelze získat kontext současného TTY, TTY nebude značka přepsána" + +#: src/selinux.c:194 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "neznámá bezpečnostní třída „chr_file“, TTY nebude značka přepsána" + +#: src/selinux.c:199 +msgid "unable to get new tty context, not relabeling tty" +msgstr "nelze získat nový kontext TTY, TTY nebude značka přepsána" + +#: src/selinux.c:206 +msgid "unable to set new tty context" +msgstr "nelze nastavit nový kontext TTY" + +#: src/selinux.c:280 +#, c-format +msgid "you must specify a role for type %s" +msgstr "pro typ %s musíte zadat roli" + +#: src/selinux.c:286 +#, c-format +msgid "unable to get default type for role %s" +msgstr "výchozí typ pro roli %s nelze získat" + +#: src/selinux.c:304 +#, c-format +msgid "failed to set new role %s" +msgstr "nepodařilo se nastavit novou roli %s" + +#: src/selinux.c:308 +#, c-format +msgid "failed to set new type %s" +msgstr "nepodařilo se nastavit nový typ %s" + +#: src/selinux.c:320 +#, c-format +msgid "%s is not a valid context" +msgstr "%s není platný kontext" + +#: src/selinux.c:355 +msgid "failed to get old_context" +msgstr "nepodařilo se získat starý kontext" + +#: src/selinux.c:361 +msgid "unable to determine enforcing mode." +msgstr "nepodařilo se určit režim vynucování SELinuxu." + +#: src/selinux.c:378 +#, c-format +msgid "unable to set tty context to %s" +msgstr "nepodařilo se nastavit kontext TTY na %s" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set exec context to %s" +msgstr "nepodařilo se nastavit kontext pro spuštění na %s" + +#: src/selinux.c:424 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "nepodařilo se nastavit kontext pro vytváření klíčů na %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "je třeba alespoň jeden argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "neplatné číslo deskriptoru souboru: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s nelze spustit jako přihlašovací shell" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "obsluhu signálu %d nelze uložit" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "omezení z řízení zdrojů bylo dosaženo" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "uživatel „%s“ není členem projektu „%s“" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "volaná úloha je konečná" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nebylo možné se připojit k projektu „%s“" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "pro projekt „%s“ neexistuje žádná množina zdrojů přijímající výchozí vazbu" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "pro projekt „%s“ neexistuje zadaná množina zdrojů" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "u projektu „%s“ se nebylo možné navázat na výchozí množinu zdrojů" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "volání setproject selhalo u projektu „%s“" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "pozor, nepodařilo se přiřadit řízení zdrojů projektu „%s“" + +#: src/sudo.c:203 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo verze %s\n" + +#: src/sudo.c:205 +#, c-format +msgid "Configure options: %s\n" +msgstr "Přepínače configure: %s\n" + +#: src/sudo.c:213 +msgid "fatal error, unable to load plugins" +msgstr "nepřekonatelná chyba, moduly nelze zavést" + +#: src/sudo.c:221 +msgid "unable to initialize policy plugin" +msgstr "modul s politikami nelze inicializovat" + +#: src/sudo.c:265 +msgid "plugin did not return a command to execute" +msgstr "modul nevrátil příkaz k provedení" + +#: src/sudo.c:281 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "chyba při inicializaci vstupně-výstupního modulu %s" + +#: src/sudo.c:304 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "neočekávaný režim programu sudo 0x%x" + +#: src/sudo.c:537 +#, c-format +msgid "you do not exist in the %s database" +msgstr "neexistujete v databázi %s" + +#: src/sudo.c:594 +msgid "unable to determine tty" +msgstr "nelze určit terminál" + +#: src/sudo.c:882 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s musí být vlastněn UID %d a mít nastaven bit setuid" + +#: src/sudo.c:885 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "efektivní UID není %d, nalézá se %s na souborovém systému s nastavenou volbou „nosuid“ nebo na souborovém systému NFS bez práv roota?" + +#: src/sudo.c:891 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "efektivní UID není %d, je sudo nainstalované jako setuid vlastněné rootem?" + +#: src/sudo.c:944 +msgid "unable to set supplementary group IDs" +msgstr "nelze nastavit ID doplňkových skupin" + +#: src/sudo.c:951 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "efektivní GID nelze nastavit na %u" + +#: src/sudo.c:957 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "GID nelze nastavit na %u" + +#: src/sudo.c:1014 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "neočekávaný důvod ukončení potomka: %d" + +#: src/sudo.c:1160 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "modulu s politikami %s chybí metoda „check_policy“" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "modul s politikami %s nepodporuje získání seznamu oprávnění" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "modul s politikami %s nepodporuje přepínač -v" + +#: src/sudo.c:1210 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "modul s politikami %s nepodporuje přepínače -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "nenalezen žádný dočasný adresář, do kterého lze zapisovat" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "současný pracovní adresář nelze obnovit" + +#: src/sudo_edit.c:594 src/sudo_edit.c:706 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nejedná se o obyčejný soubor" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: úprava symbolických odkazů není dovolena" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: úprava souborů v adresáři, do kterého lze zapisovat, není dovolena" + +#: src/sudo_edit.c:637 src/sudo_edit.c:744 +#, c-format +msgid "%s: short write" +msgstr "%s: krátký zápis" + +#: src/sudo_edit.c:707 +#, c-format +msgid "%s left unmodified" +msgstr "%s ponechán nezměněn" + +#: src/sudo_edit.c:720 src/sudo_edit.c:905 +#, c-format +msgid "%s unchanged" +msgstr "%s nezměněn" + +#: src/sudo_edit.c:733 src/sudo_edit.c:755 +#, c-format +msgid "unable to write to %s" +msgstr "do %s nelze zapsat" + +#: src/sudo_edit.c:734 src/sudo_edit.c:753 src/sudo_edit.c:756 +#: src/sudo_edit.c:930 src/sudo_edit.c:934 +#, c-format +msgid "contents of edit session left in %s" +msgstr "obsah relace s úpravami ponechán v %s" + +#: src/sudo_edit.c:752 +msgid "unable to read temporary file" +msgstr "nelze přečíst dočasný soubor" + +#: src/sudo_edit.c:835 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: vnitřní chyba: lichý počet cest" + +#: src/sudo_edit.c:837 +msgid "sesh: unable to create temporary files" +msgstr "sesh: nelze vytvořit dočasné soubory" + +#: src/sudo_edit.c:839 src/sudo_edit.c:937 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: neznámá chyba %d" + +#: src/sudo_edit.c:929 +msgid "unable to copy temporary files back to their original location" +msgstr "dočasné soubory nelze zkopírovat zpět na jejich původní místo" + +#: src/sudo_edit.c:933 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "některé z dočasných souborů nelze zkopírovat zpět na jejich původní místo" + +#: src/sudo_edit.c:978 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "UID nelze změnit na roota (%u)" + +#: src/sudo_edit.c:995 +msgid "plugin error: missing file list for sudoedit" +msgstr "chyba modulu: programu sudoedit chybí seznam souborů" + +#: src/sudo_edit.c:1036 src/sudo_edit.c:1049 +msgid "unable to read the clock" +msgstr "nelze přečíst hodiny" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "při čtení hesla vypršel čas" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "žádné heslo nebylo poskytnuto" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "heslo nelze přečíst" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "po terminálu se vyžaduje načtení hesla; buď jej přečtěte ze standardního vstupu pomocí přepínače -S, nebo nastavte pomocný program askpass" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "program pro dotazování se na heslo nebyl zadán, zkuste nastavit SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "GID nelze nastavit na %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "UID nelze nastavit na %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "%s nelze spustit" + +#: src/utmp.c:287 +msgid "unable to save stdin" +msgstr "standardní vstup nelze uložit" + +#: src/utmp.c:289 +msgid "unable to dup2 stdin" +msgstr "standardní vstup nelze zduplikovat voláním dup2" + +#: src/utmp.c:292 +msgid "unable to restore stdin" +msgstr "standardní vstup nelze obnovit" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "chybí terminál a program pro dotazování se na heslo nebyl zadán" + +#~ msgid "unable to get group vector" +#~ msgstr "nelze získat vektor skupin" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "neznámé UID %u: kdo jsi?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "chyba při čtení ze signální roury" + +#~ msgid "error reading from pipe" +#~ msgstr "chyba při čtení z roury" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "terminál nelze přepnout do syrového režimu" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "vnitřní chyba, pokus alokovat nula bajtů" + +#~ msgid "unable to open socket" +#~ msgstr "nelze otevřít socket" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "vnitřní chyba, pokus o emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "vnitřní chyba, pokus o ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "vnitřní chyba, pokus o erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "vnitřní chyba, pokus o erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "vnitřní chyba, pokus o erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: zjištěno přetečení" + +#~ msgid "value out of range" +#~ msgstr "hodnota je mimo rozsah" + +#~ msgid "select failed" +#~ msgstr "volání select selhalo" diff --git a/utsudo-0.0.2/po/da.mo b/utsudo-0.0.2/po/da.mo new file mode 100644 index 0000000000000000000000000000000000000000..3cc335beda5c8033e536e66020cc5ed8f95cda00 GIT binary patch literal 18722 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, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +# audit -> overvågning +# overflow -> overløb +# +# projekt bruger konsekvent små bogstaver, og så i starten af sætninger, så +# dette er også valgt på dansk uanset at der er : som efterfølgende normalt +# ville have stort begyndelsesbogstav på dansk. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2019-03-08 23:06+0100\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:90 lib/util/aix.c:177 +msgid "unable to open userdb" +msgstr "kan ikke åbne userdb" + +#: lib/util/aix.c:232 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "kan ikke skifte til register »%s« for %s" + +#: lib/util/aix.c:257 +msgid "unable to restore registry" +msgstr "kan ikke gendanne register" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/gidlist.c:79 +#: lib/util/sudo_conf.c:191 lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 +#: lib/util/sudo_conf.c:558 src/conversation.c:82 src/exec_common.c:112 +#: src/exec_common.c:128 src/exec_common.c:137 src/exec_monitor.c:210 +#: src/exec_monitor.c:465 src/exec_monitor.c:471 src/exec_monitor.c:479 +#: src/exec_monitor.c:487 src/exec_monitor.c:494 src/exec_monitor.c:501 +#: src/exec_monitor.c:508 src/exec_monitor.c:515 src/exec_monitor.c:522 +#: src/exec_monitor.c:529 src/exec_monitor.c:536 src/exec_nopty.c:212 +#: src/exec_nopty.c:218 src/exec_nopty.c:227 src/exec_nopty.c:234 +#: src/exec_nopty.c:241 src/exec_nopty.c:248 src/exec_nopty.c:255 +#: src/exec_nopty.c:262 src/exec_nopty.c:269 src/exec_nopty.c:276 +#: src/exec_nopty.c:283 src/exec_nopty.c:290 src/exec_nopty.c:297 +#: src/exec_nopty.c:305 src/exec_nopty.c:467 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:994 +#: src/exec_pty.c:1157 src/exec_pty.c:1163 src/exec_pty.c:1172 +#: src/exec_pty.c:1179 src/exec_pty.c:1186 src/exec_pty.c:1193 +#: src/exec_pty.c:1200 src/exec_pty.c:1207 src/exec_pty.c:1214 +#: src/exec_pty.c:1221 src/exec_pty.c:1228 src/exec_pty.c:1235 +#: src/exec_pty.c:1243 src/exec_pty.c:1661 src/load_plugins.c:57 +#: src/load_plugins.c:70 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:203 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:676 src/sudo.c:686 src/sudo.c:706 src/sudo.c:725 +#: src/sudo.c:734 src/sudo.c:743 src/sudo.c:760 src/sudo.c:801 src/sudo.c:811 +#: src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 src/sudo.c:1266 +#: src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 src/sudo_edit.c:886 +#: src/sudo_edit.c:1000 src/sudo_edit.c:1020 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/sudo_conf.c:192 +#: lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 lib/util/sudo_conf.c:558 +#: src/conversation.c:83 src/exec_common.c:112 src/exec_common.c:129 +#: src/exec_common.c:138 src/exec_monitor.c:465 src/exec_monitor.c:471 +#: src/exec_monitor.c:479 src/exec_monitor.c:487 src/exec_monitor.c:494 +#: src/exec_monitor.c:501 src/exec_monitor.c:508 src/exec_monitor.c:515 +#: src/exec_monitor.c:522 src/exec_monitor.c:529 src/exec_monitor.c:536 +#: src/exec_nopty.c:212 src/exec_nopty.c:218 src/exec_nopty.c:227 +#: src/exec_nopty.c:234 src/exec_nopty.c:241 src/exec_nopty.c:248 +#: src/exec_nopty.c:255 src/exec_nopty.c:262 src/exec_nopty.c:269 +#: src/exec_nopty.c:276 src/exec_nopty.c:283 src/exec_nopty.c:290 +#: src/exec_nopty.c:297 src/exec_nopty.c:305 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:1157 +#: src/exec_pty.c:1163 src/exec_pty.c:1172 src/exec_pty.c:1179 +#: src/exec_pty.c:1186 src/exec_pty.c:1193 src/exec_pty.c:1200 +#: src/exec_pty.c:1207 src/exec_pty.c:1214 src/exec_pty.c:1221 +#: src/exec_pty.c:1228 src/exec_pty.c:1235 src/exec_pty.c:1243 +#: src/exec_pty.c:1661 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:204 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 +#: src/sudo.c:1266 src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 +#: src/sudo_edit.c:886 src/sudo_edit.c:1000 src/sudo_edit.c:1020 +msgid "unable to allocate memory" +msgstr "kan ikke allokere hukommelse" + +#: lib/util/strsignal.c:53 +msgid "Unknown signal" +msgstr "ukendt signal" + +#: lib/util/strtoid.c:82 lib/util/strtoid.c:129 lib/util/strtoid.c:157 +#: lib/util/strtomode.c:54 lib/util/strtonum.c:63 lib/util/strtonum.c:181 +msgid "invalid value" +msgstr "ugyldig værdi" + +#: lib/util/strtoid.c:89 lib/util/strtoid.c:136 lib/util/strtoid.c:164 +#: lib/util/strtomode.c:60 lib/util/strtonum.c:66 lib/util/strtonum.c:193 +msgid "value too large" +msgstr "værdi for stor" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:142 lib/util/strtomode.c:60 +#: lib/util/strtonum.c:66 lib/util/strtonum.c:187 +msgid "value too small" +msgstr "værdi for lille" + +#: lib/util/sudo_conf.c:210 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "ugyldig stiværdi »%s« i %s, linje %u" + +#: lib/util/sudo_conf.c:376 lib/util/sudo_conf.c:429 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "ugyldig værdi for %s »%s« i %s, linje %u" + +#: lib/util/sudo_conf.c:397 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "ikke understøttet gruppekilde »%s« i %s, linje %u" + +#: lib/util/sudo_conf.c:413 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "ugyldigt maks. for grupper »%s« i %s, linje %u" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "unable to stat %s" +msgstr "kan ikke køre stat %s" + +#: lib/util/sudo_conf.c:577 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikke en regulær fil" + +#: lib/util/sudo_conf.c:580 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s er ejet af uid %u, burde være %u" + +#: lib/util/sudo_conf.c:584 +#, c-format +msgid "%s is world writable" +msgstr "%s er skrivbar for alle" + +#: lib/util/sudo_conf.c:587 +#, c-format +msgid "%s is group writable" +msgstr "%s er skrivbar for gruppe" + +#: lib/util/sudo_conf.c:597 src/selinux.c:213 src/selinux.c:230 src/sudo.c:360 +#, c-format +msgid "unable to open %s" +msgstr "kan ikke åbne %s" + +#: src/exec.c:165 +#, c-format +msgid "unknown login class %s" +msgstr "ukendt logindklasse %s" + +#: src/exec.c:178 +msgid "unable to set user context" +msgstr "kan ikke angive brugerkontekst" + +#: src/exec.c:194 +msgid "unable to set process priority" +msgstr "kan ikke angive procesprioritet" + +#: src/exec.c:202 +#, c-format +msgid "unable to change root to %s" +msgstr "kan ikke ændre administrator (root) til %s" + +#: src/exec.c:215 src/exec.c:221 src/exec.c:228 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "kan ikke ændre til runas uid (%u, %u)" + +#: src/exec.c:246 +#, c-format +msgid "unable to change directory to %s" +msgstr "kan ikke ændre mappe til %s" + +#: src/exec.c:345 src/exec_monitor.c:574 src/exec_monitor.c:576 +#: src/exec_nopty.c:525 src/exec_pty.c:522 src/exec_pty.c:1329 +#: src/exec_pty.c:1331 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "kan ikke angive håndtering for signal %d" + +#: src/exec_common.c:171 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "kan ikke fjerne PRIV_PROC_EXEC fra PRIV_LIMIT" + +#: src/exec_monitor.c:364 +msgid "error reading from socketpair" +msgstr "fejl ved læsning fra socketpair" + +#: src/exec_monitor.c:381 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "uventet svartype på bagkanal (backchannel): %d" + +#: src/exec_monitor.c:473 src/exec_monitor.c:481 src/exec_monitor.c:489 +#: src/exec_monitor.c:496 src/exec_monitor.c:503 src/exec_monitor.c:510 +#: src/exec_monitor.c:517 src/exec_monitor.c:524 src/exec_monitor.c:531 +#: src/exec_monitor.c:538 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:644 +#: src/exec_pty.c:649 src/exec_pty.c:746 src/exec_pty.c:753 src/exec_pty.c:850 +#: src/exec_pty.c:1165 src/exec_pty.c:1174 src/exec_pty.c:1181 +#: src/exec_pty.c:1188 src/exec_pty.c:1195 src/exec_pty.c:1202 +#: src/exec_pty.c:1209 src/exec_pty.c:1216 src/exec_pty.c:1223 +#: src/exec_pty.c:1230 src/exec_pty.c:1237 src/exec_pty.c:1614 +#: src/exec_pty.c:1624 src/exec_pty.c:1669 src/exec_pty.c:1676 +#: src/exec_pty.c:1703 +msgid "unable to add event to queue" +msgstr "kan ikke tilføje hændelse til kø" + +#: src/exec_monitor.c:592 +msgid "unable to set controlling tty" +msgstr "kan ikke angive kontrollerende tty" + +#: src/exec_monitor.c:600 src/exec_nopty.c:364 src/exec_pty.c:1408 +#: src/exec_pty.c:1429 src/exec_pty.c:1449 src/tgetpass.c:292 +msgid "unable to create pipe" +msgstr "kan ikke oprette datakanal (pipe)" + +#: src/exec_monitor.c:608 +msgid "unable to receive message from parent" +msgstr "kan ikke modtage besked fra overproces" + +#: src/exec_monitor.c:614 src/exec_nopty.c:382 src/exec_pty.c:1487 +#: src/tgetpass.c:296 +msgid "unable to fork" +msgstr "kan ikke forgrene" + +#: src/exec_monitor.c:628 src/sesh.c:125 src/sudo.c:1130 +#, c-format +msgid "unable to execute %s" +msgstr "kan ikke køre %s" + +#: src/exec_monitor.c:711 src/exec_nopty.c:435 +msgid "unable to restore tty label" +msgstr "kan ikke gendanne tty-etiket" + +#: src/exec_nopty.c:358 src/exec_pty.c:1338 +msgid "policy plugin failed session initialization" +msgstr "udvidelsesmodul for politik mislykkedes i sessionsinitialisering" + +#: src/exec_nopty.c:424 src/exec_pty.c:1574 +msgid "error in event loop" +msgstr "fejl i hændelsesloop" + +#: src/exec_nopty.c:533 src/exec_pty.c:557 src/signal.c:110 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "kan ikke gendanne håndtering for signal %d" + +#: src/exec_pty.c:156 +msgid "unable to allocate pty" +msgstr "kan ikke allokere pty" + +#: src/exec_pty.c:1318 +msgid "unable to create sockets" +msgstr "kan ikke oprette sokler" + +#: src/exec_pty.c:1531 +msgid "unable to send message to monitor process" +msgstr "kan ikke sende besked til overvågningsproces" + +#: src/load_plugins.c:55 src/load_plugins.c:68 src/load_plugins.c:90 +#: src/load_plugins.c:120 src/load_plugins.c:128 src/load_plugins.c:134 +#: src/load_plugins.c:175 src/load_plugins.c:183 src/load_plugins.c:190 +#: src/load_plugins.c:196 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "fejl i %s, linje %d under indlæsning af udvidelsesmodulet »%s«" + +#: src/load_plugins.c:92 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:130 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s skal være ejet af uid %d" + +# engelsk fejl be dobbelt? +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s må kun være skrivbar for ejeren" + +#: src/load_plugins.c:177 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan ikke indlæse %s: %s" + +#: src/load_plugins.c:185 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kan ikke finde symbol »%s« i %s" + +#: src/load_plugins.c:192 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "ukendt politiktype %d fundet i %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "inkompatibelt udvidelsesmodul for hovedversion %d (forventede %d) fundet i %s" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignorerer politikudvidelsesmodul »%s« i %s, linje %d" + +#: src/load_plugins.c:209 +msgid "only a single policy plugin may be specified" +msgstr "kun et udvidelsesmodul for politik må være angivet" + +#: src/load_plugins.c:212 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignorerer duplikat politikudvidelsesmodul »%s« i %s, linje %d" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignorerer duplikat I/O-udvidelsesmodul »%s« i %s, linje %d" + +#: src/load_plugins.c:347 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "politikudvidelsesmodulet %s inkluderer ikke en metode for check_policy" + +#: src/net_ifs.c:180 src/net_ifs.c:197 src/net_ifs.c:342 src/sudo.c:470 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern fejl, %s-overløb" + +#: src/parse_args.c:224 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "ugyldigt miljøvariabelnavn: %s" + +#: src/parse_args.c:320 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argumentet for -C skal være et tal større end eller lig 3" + +#: src/parse_args.c:505 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "du kan ikke samtidig angive tilvalgene »-i« og »-s«" + +#: src/parse_args.c:509 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "du kan ikke samtidig angive tilvalgende »-i« og »-E«" + +#: src/parse_args.c:519 +msgid "the `-E' option is not valid in edit mode" +msgstr "tilvalget »-E« er ikke gyldigt i redigeringstilstand" + +#: src/parse_args.c:521 +msgid "you may not specify environment variables in edit mode" +msgstr "du må ikke angive miljøvariabler i redigeringstilstand" + +#: src/parse_args.c:529 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "tilvalget »-U« må kun bruges med tilvalget »-l«" + +#: src/parse_args.c:533 +msgid "the `-A' and `-S' options may not be used together" +msgstr "tilvalgene »-A« og »-S« må ikke bruges sammen" + +#: src/parse_args.c:609 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit er ikke understøttet på denne platform" + +#: src/parse_args.c:682 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Kun et af tilvalgene -e, -h, -i, -K, -l, -s, -v eller -V må angives" + +#: src/parse_args.c:696 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - rediger filer som en anden bruger\n" +"\n" + +#: src/parse_args.c:698 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - udfør en kommando som en anden bruger\n" +"\n" + +#: src/parse_args.c:703 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Tilvalg:\n" + +#: src/parse_args.c:705 +msgid "use a helper program for password prompting" +msgstr "brug et hjælpeprogram for indhentelse af adgangskode" + +#: src/parse_args.c:708 +msgid "use specified BSD authentication type" +msgstr "brug angivet BSD-godkendelsestype" + +#: src/parse_args.c:711 +msgid "run command in the background" +msgstr "kør kommando i baggrunden" + +#: src/parse_args.c:713 +msgid "close all file descriptors >= num" +msgstr "luk alle filbeskrivelser >= num" + +#: src/parse_args.c:716 +msgid "run command with the specified BSD login class" +msgstr "kør kommando med angivet BSD-logindklasse" + +#: src/parse_args.c:719 +msgid "preserve user environment when running command" +msgstr "bevar brugermiljø når kommando udføres" + +#: src/parse_args.c:721 +msgid "preserve specific environment variables" +msgstr "bevar specifikke miljøvariabler" + +#: src/parse_args.c:723 +msgid "edit files instead of running a command" +msgstr "rediger filer i stedet for at køre en kommando" + +#: src/parse_args.c:725 +msgid "run command as the specified group name or ID" +msgstr "udfør kommando som det angivne gruppenavn eller ID" + +#: src/parse_args.c:727 +msgid "set HOME variable to target user's home dir" +msgstr "angiv HOME-variabel til målbrugers hjemmemappe" + +#: src/parse_args.c:729 +msgid "display help message and exit" +msgstr "vis hjælpetekst og afslut" + +#: src/parse_args.c:731 +msgid "run command on host (if supported by plugin)" +msgstr "kør kommando på vært (hvis understøttet af udvidelsesmodul)" + +#: src/parse_args.c:733 +msgid "run login shell as the target user; a command may also be specified" +msgstr "kør en logindskal som målbrugeren; en kommando kan også angives" + +#: src/parse_args.c:735 +msgid "remove timestamp file completely" +msgstr "fjern tidsstempelfil fuldstændig" + +#: src/parse_args.c:737 +msgid "invalidate timestamp file" +msgstr "ugyldiggør tidsstempelfil" + +#: src/parse_args.c:739 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "vis brugers privilegier eller kontroller en specifik kommando; brug to gange for længere format" + +#: src/parse_args.c:741 +msgid "non-interactive mode, no prompts are used" +msgstr "ikkeinteraktiv tilstand, vil ikke spørge bruger" + +#: src/parse_args.c:743 +msgid "preserve group vector instead of setting to target's" +msgstr "bevar gruppevektor i stedet for at sætte til målets" + +#: src/parse_args.c:745 +msgid "use the specified password prompt" +msgstr "brug angivet logind for adgangskode" + +#: src/parse_args.c:748 +msgid "create SELinux security context with specified role" +msgstr "opret SELinux-sikkerhedskontekt med angivet rolle" + +#: src/parse_args.c:751 +msgid "read password from standard input" +msgstr "læs adgangskode fra standardinddata" + +#: src/parse_args.c:753 +msgid "run shell as the target user; a command may also be specified" +msgstr "kør skal som målbruger; en kommando kan også specificeres" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified type" +msgstr "opret SELinux-sikkerhedskontekt med angivet type" + +#: src/parse_args.c:759 +msgid "terminate command after the specified time limit" +msgstr "afslut kommando efter den angivne tidsbegrænsning" + +#: src/parse_args.c:761 +msgid "in list mode, display privileges for user" +msgstr "i vis-tilstand, vis privilegier for bruger" + +#: src/parse_args.c:763 +msgid "run command (or edit file) as specified user name or ID" +msgstr "kør kommando (eller rediger fil) som angivet brugernavn eller ID" + +#: src/parse_args.c:765 +msgid "display version information and exit" +msgstr "vis versionsinformation og afslut" + +#: src/parse_args.c:767 +msgid "update user's timestamp without running a command" +msgstr "opdater brugers tidsstempel uden at køre en kommando" + +#: src/parse_args.c:769 +msgid "stop processing command line arguments" +msgstr "stop behandling af parametre for kommandolinjen" + +#: src/selinux.c:83 +msgid "unable to open audit system" +msgstr "kan ikke åbne overvågningssystem" + +#: src/selinux.c:93 +msgid "unable to send audit message" +msgstr "kan ikke sende overvågningsbesked" + +#: src/selinux.c:121 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "kan ikke fgetfilecon %s" + +#: src/selinux.c:126 +#, c-format +msgid "%s changed labels" +msgstr "%s ændrede etiketter" + +#: src/selinux.c:131 +#, c-format +msgid "unable to restore context for %s" +msgstr "kan ikke gendanne kontekst for %s" + +#: src/selinux.c:172 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "kan ikke åbne %s, giver ikke ny etiket til tty" + +#: src/selinux.c:176 src/selinux.c:217 src/selinux.c:234 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s er ikke en tegnenhed, giver ikke ny etiket til tty" + +#: src/selinux.c:185 +msgid "unable to get current tty context, not relabeling tty" +msgstr "kan ikke indhente aktuel tty-kontekst, giver ikke ny etiket til tty" + +#: src/selinux.c:192 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "ukendt sikkerhedsklasse »chr_file«, giver ikke ny etiket til tty" + +#: src/selinux.c:197 +msgid "unable to get new tty context, not relabeling tty" +msgstr "kan ikke indhente ny tty-kontekst, giver ikke nyt etiket til tty" + +#: src/selinux.c:204 +msgid "unable to set new tty context" +msgstr "kan ikke angive ny tty-kontekst" + +#: src/selinux.c:278 +#, c-format +msgid "you must specify a role for type %s" +msgstr "du skal angive en rolle for type %s" + +#: src/selinux.c:284 +#, c-format +msgid "unable to get default type for role %s" +msgstr "kan ikke indhente standardtype for rolle %s" + +#: src/selinux.c:302 +#, c-format +msgid "failed to set new role %s" +msgstr "kunne ikke angive ny rolle %s" + +#: src/selinux.c:306 +#, c-format +msgid "failed to set new type %s" +msgstr "kunne ikke angive ny type %s" + +#: src/selinux.c:318 +#, c-format +msgid "%s is not a valid context" +msgstr "%s er ikke en gyldig kontekst" + +#: src/selinux.c:353 +msgid "failed to get old_context" +msgstr "kunne ikke indhente gammel_kontekst (old_context)" + +#: src/selinux.c:359 +msgid "unable to determine enforcing mode." +msgstr "kan ikke bestemme tilstanden gennemtving (enforcing)." + +#: src/selinux.c:376 +#, c-format +msgid "unable to set tty context to %s" +msgstr "kan ikke angive tty-kontekst for %s" + +#: src/selinux.c:415 +#, c-format +msgid "unable to set exec context to %s" +msgstr "kan ikke angive kørselskontekt til %s" + +# engelsk: mangler vist lidt info her tast eller nøgle. mon ikke det er nøgle +#: src/selinux.c:422 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "kan ikke angive nøgleoprettelseskontekst til %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "kræver mindst et argument" + +# eller antal? +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "ugyldigt filbeskrivelsesnummer: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "kan ikke køre %s som en indlogningsskal" + +#: src/signal.c:88 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "kan ikke gemme håndtering for signal %d" + +#: src/solaris.c:81 +msgid "resource control limit has been reached" +msgstr "grænse for ressourcekontrol er nået" + +#: src/solaris.c:84 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "bruger »%s« er ikke medlem af projektet »%s«" + +#: src/solaris.c:88 +msgid "the invoking task is final" +msgstr "start af opgave er færdig" + +#: src/solaris.c:91 +#, c-format +msgid "could not join project \"%s\"" +msgstr "kunne ikke slutte til projekt »%s«" + +#: src/solaris.c:96 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "ingen ressourcekø som accepterer standardbindinger findes for projekt »%s«" + +#: src/solaris.c:100 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "angivet ressourcekø findes ikke for projekt »%s«" + +#: src/solaris.c:104 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "kunne ikke binde til standardressourcekø for projekt »%s«" + +#: src/solaris.c:110 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject fejlede for projekt »%s«" + +#: src/solaris.c:112 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "advarsel, ressourcekontroltildeling fejlede for projekt »%s«" + +#: src/sudo.c:201 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo version %s\n" + +#: src/sudo.c:203 +#, c-format +msgid "Configure options: %s\n" +msgstr "Konfigurationsindstillinger: %s\n" + +#: src/sudo.c:211 +msgid "fatal error, unable to load plugins" +msgstr "fatal fejl, kan ikke indlæse udvidelsesmoduler" + +#: src/sudo.c:219 +msgid "unable to initialize policy plugin" +msgstr "kan ikke initialisere udvidelsesmodul for politik" + +#: src/sudo.c:263 +msgid "plugin did not return a command to execute" +msgstr "udvidelsesmodul returnerede ikke en kommando til afvikling" + +#: src/sudo.c:279 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "fejl under initialisering af I/O-udvidelsesmodulet %s" + +#: src/sudo.c:302 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "uventet sudo-tilstand 0x%x" + +#: src/sudo.c:535 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du findes ikke i %s-databasen" + +#: src/sudo.c:592 +msgid "unable to determine tty" +msgstr "kan ikke bestemme tty" + +#: src/sudo.c:880 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s skal være ejet af uid %d og have setuid bit angivet" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "effektiv uid er ikke %d, er %s på et filsystem med indstillingen »nosuid« angivet eller et NFS-filsytsem uden administratorprivilegier (root)?" + +#: src/sudo.c:889 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "effektiv uid er ikke %d, er sudo installeret setuid root?" + +#: src/sudo.c:942 +msgid "unable to set supplementary group IDs" +msgstr "kan ikke angive supplerende gruppe-id'er" + +#: src/sudo.c:949 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "kan ikke angive effektiv gid til runas gid %u" + +#: src/sudo.c:955 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "kan ikke angive gid til runas gid %u" + +#: src/sudo.c:1012 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "uventet underbetingelse for terminering: %d" + +#: src/sudo.c:1158 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "politikudvidelsesmodulet %s mangler i metoden »check_policy«" + +#: src/sudo.c:1176 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "politikudvidelsesmodul %s understøter ikke listning af privilegier" + +#: src/sudo.c:1193 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "politikudvidelsesmodul %s understøtter ikke tilvalget -v" + +#: src/sudo.c:1208 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "politikudvidelsesmodul %s understøtter ikke tilvalget -k/-K" + +#: src/sudo_edit.c:219 +msgid "no writable temporary directory found" +msgstr "ingen skrivbar midlertidig mappe fundet" + +#: src/sudo_edit.c:286 src/sudo_edit.c:375 +msgid "unable to restore current working directory" +msgstr "kan ikke gendanne nuværende arbejdsmappe" + +#: src/sudo_edit.c:592 src/sudo_edit.c:704 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: ikke en regulær fil" + +#: src/sudo_edit.c:599 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: redigering af symbolske henvisninger er ikke tilladt" + +#: src/sudo_edit.c:602 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: redigering af filer i en skrivbar mappe er ikke tilladt" + +#: src/sudo_edit.c:635 src/sudo_edit.c:742 +#, c-format +msgid "%s: short write" +msgstr "%s: kort skrivning" + +#: src/sudo_edit.c:705 +#, c-format +msgid "%s left unmodified" +msgstr "%s tilbage uændrede" + +#: src/sudo_edit.c:718 src/sudo_edit.c:903 +#, c-format +msgid "%s unchanged" +msgstr "%s uændrede" + +#: src/sudo_edit.c:731 src/sudo_edit.c:753 +#, c-format +msgid "unable to write to %s" +msgstr "kan ikke skrive til %s" + +#: src/sudo_edit.c:732 src/sudo_edit.c:751 src/sudo_edit.c:754 +#: src/sudo_edit.c:928 src/sudo_edit.c:932 +#, c-format +msgid "contents of edit session left in %s" +msgstr "indhold fra redigeringssession tilbage i %s" + +#: src/sudo_edit.c:750 +msgid "unable to read temporary file" +msgstr "kan ikke læse midlertidig fil" + +#: src/sudo_edit.c:833 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: intern fejl: forkert antal stier" + +#: src/sudo_edit.c:835 +msgid "sesh: unable to create temporary files" +msgstr "sesh: kan ikke oprette midlertidige filer" + +#: src/sudo_edit.c:837 src/sudo_edit.c:935 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: ukendt fejl %d" + +#: src/sudo_edit.c:927 +msgid "unable to copy temporary files back to their original location" +msgstr "kan ikke kopiere midlertidige filer tilbage til deres originale placering" + +#: src/sudo_edit.c:931 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "kan ikke kopiere nogle af de midlertidige filer tilbage til deres originale placering" + +#: src/sudo_edit.c:976 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "kan ikke ændre uid til root (%u)" + +#: src/sudo_edit.c:993 +msgid "plugin error: missing file list for sudoedit" +msgstr "fejl i udvidelsesmodul: mangler filliste for sudoedit" + +#: src/sudo_edit.c:1034 src/sudo_edit.c:1047 +msgid "unable to read the clock" +msgstr "kan ikke læse uret" + +#: src/tgetpass.c:101 +msgid "timed out reading password" +msgstr "fik tidsudløb under forsøg på at læse adgangskoden" + +#: src/tgetpass.c:104 +msgid "no password was provided" +msgstr "ingen adgangskode blev angivet" + +#: src/tgetpass.c:107 +msgid "unable to read password" +msgstr "kan ikke læse adgangskoden" + +#: src/tgetpass.c:141 +msgid "no tty present and no askpass program specified" +msgstr "ingen tty til stede og intet askpass-program angivet" + +#: src/tgetpass.c:150 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "intet askpass-program angivet, forsøg at angive SUDO_ASKPASS" + +#: src/tgetpass.c:307 +#, c-format +msgid "unable to set gid to %u" +msgstr "kan ikke angive gid til %u" + +#: src/tgetpass.c:311 +#, c-format +msgid "unable to set uid to %u" +msgstr "kan ikke angive uid til %u" + +#: src/tgetpass.c:316 +#, c-format +msgid "unable to run %s" +msgstr "kan ikke køre %s" + +#: src/utmp.c:271 +msgid "unable to save stdin" +msgstr "kan ikke gemme til stdin" + +#: src/utmp.c:273 +msgid "unable to dup2 stdin" +msgstr "kan ikke dup2 stdin" + +#: src/utmp.c:276 +msgid "unable to restore stdin" +msgstr "kan ikke gendanne stdin" + +#~ msgid "unable to get group vector" +#~ msgstr "kan ikke indhente gruppevektor" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "ukendt uid %u: hvem er du?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "fejl under læsning fra signaldatakanal" + +#~ msgid "error reading from pipe" +#~ msgstr "fejl ved læsning fra datakanal" diff --git a/utsudo-0.0.2/po/de.mo b/utsudo-0.0.2/po/de.mo new file mode 100644 index 0000000000000000000000000000000000000000..a6cd269d1e006bb73f9e0ebe246c9b795102bd4f GIT binary patch literal 21078 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, 2012, 2013, 2014. +# Mario Blättermann , 2012, 2014-2017, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-25 13:46+0200\n" +"Last-Translator: Mario Blättermann \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 19.08.2\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "Benutzerdatenbank konnte nicht geöffnet werden" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "Es konnte nicht zur Registrierungsdatenbank »%s« von %s gewechselt werden" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "Registrierungsdatenbank konnte nicht wiederhergestellt werden" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "Speicher konnte nicht zugewiesen werden" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Unbekanntes Signal" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "ungültiger Wert" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "Wert zu groß" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "Wert zu klein" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "Ungültiger Pfad-Wert »%s« in %s, Zeile %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "Ungültiger Wert für %s »%s« in %s, Zeile %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "Nicht unterstützte Gruppenquelle »%s« in %s, Zeile %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "Ungültige Maximalzahl an Gruppen »%s« in %s, Zeile %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "stat konnte nicht auf %s angewendet werden" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ist keine reguläre Datei" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s gehört Benutzer mit UID %u, sollte allerdings %u gehören" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s kann von allen verändert werden" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s kann von der Gruppe verändert werden" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "%s konnte nicht geöffnet werden" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "Unbekannte Anmeldungsklasse %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "Benutzerkontext konnte nicht gesetzt werden" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "Prozesspriorität konnte nicht gesetzt werden" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "Wurzelverzeichnis konnte nicht zu %s geändert werden" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "Es konnte nicht zu »runas«-GID gewechselt werden (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "In Verzeichnis »%s« konnte nicht gewechselt werden" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "Handler für Signal %d konnte nicht gesetzt werden" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "PRIV_PROC_EXEC konnte nicht von PRIV_LIMIT entfernt werden" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "Fehler beim Lesen des Socket-Paars" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "Unerwarteter Antworttyp auf Rückmeldungskanal: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "Ereignis konnte nicht zur Warteschlange hinzugefügt werden" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "Kontrollierendes TTY konnte nicht gesetzt werden" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "Weiterleitung konnte nicht erstellt werden" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "Die Nachricht konnte nicht empfangen werden" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "Es konnte nicht geforkt werden" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "TTY-Kennzeichnung konnte nicht wiederhergestellt werden" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "%s konnte nicht ausgeführt werden" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "Regelwerks-Plugin konnte Sitzung nicht initialisieren" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "Fehler in Ereignisschleife" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "Handler für Signal %d konnte nicht wiederhergestellt werden" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "PTY konnte nicht vergeben werden" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "Sockets konnten nicht hergestellt werden" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "Die Nachricht konnte nicht an den überwachenden Prozess verschickt werden" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "Fehler in %s, Zeile %d, während Plugin »%s« geladen wurde" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s muss Benutzer mit UID %d gehören" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s darf nur vom Besitzer beschreibbar sein" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "»%s« konnte nicht geladen werden: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "Symbol »%s« konnte in %s nicht gefunden werden" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "Unbekannter Regelwerktyp %d wurde in %s gefunden" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "Inkompatible Hauptversion %d des Regelwerks (%d erwartet) wurde in %s gefunden" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "Regelwerks-Plugin »%s« in %s, Zeile %d, wird ignoriert" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "Nur ein einziges Regelwerks-Plugin kann geladen werden" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "Doppelt vorhandenes Regelwerks-Plugin »%s« in %s, Zeile %d, wird ignoriert" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "Doppelt vorhandenes E/A-Plugin »%s« in %s, Zeile %d, wird ignoriert" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "Das Regelwerks-Plugin %s enthält keine check_policy-Methode" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "Interner Fehler: %s-Überlauf" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "Unzulässiger Name der Umgebungsvariable: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "Das Argument für -C muss eine Zahl größer oder gleich 3 sein" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "Die Optionen »-i« und »-s« können nicht gemeinsam benutzt werden" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "Die Optionen »-i« und »-E« können nicht gemeinsam benutzt werden" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "Die Option »-E« ist im Bearbeiten-Modus ungültig" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "Im Bearbeiten-Modus können keine Umgebungsvariablen gesetzt werden" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "Die »-U«-Option kann nur zusammen mit »-l« benutzt werden" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "Die Optionen »-A« und »-S« können nicht gemeinsam benutzt werden" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit ist auf dieser Plattform nicht verfügbar" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Nur eine der Optionen -e, -h, -i, -K, -l, -s, -v oder -V darf angegeben werden" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - Dateien als anderer Benutzer verändern\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - Einen Befehl als anderer Benutzer ausführen\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Optionen:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "Hilfsprogramm zum Eingeben des Passworts verwenden" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "Angegebenen BSD-Legitimierungstypen verwenden" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "Befehl im Hintergrund ausführen" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "Bei Eingabeaufforderung Systemklang abspielen" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "Alle Dateideskriptoren >= num schließen" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "Befehl unter angegebener Login-Klasse ausführen" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "Benutzerumgebung beim Starten des Befehls beibehalten" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "Spezifische Umgebungsvariablen beibehalten" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "Dateien bearbeiten, statt einen Befehl auszuführen" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "Befehl unter angegebenem Gruppennamen oder Gruppen-ID ausführen" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "HOME-Variable als Home-Verzeichnis des Zielbenutzers setzen" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "Hilfe ausgeben und beenden" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "Befehl auf entferntem System ausführen (falls vom Plugin unterstützt)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "Anmeldeshell als Zielbenutzer starten; es kann auch ein Befehl angegeben werden" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "Zeitstempeldateien komplett entfernen" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "Zeitstempeldatei ungültig machen" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "Benutzerrechte aufzählen oder einen bestimmten Befehl testen; für ein längeres Format zweimal angeben" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "Nicht-interaktiver Modus, es werden keine Eingabeaufforderungen verwendet" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "Gruppen-Vektor beibehalten, statt auf den des Zielbenutzers zu setzen" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "Angegebene Passwort-Eingabeaufforderung benutzen" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "SELinux-Sicherheitskontext mit angegebener Funktion erstellen" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "Passwort von der Standardeingabe lesen" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "Shell als Zielbenutzer ausführen; es kann auch ein Befehl angegeben werden" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "SELinux-Sicherheitskontext mit angegebenem Typ erstellen" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "Befehlausführung nach der angegebenen Zeitbegrenzung abbrechen" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "im Aufzählungsmodus, Rechte des Benutzers anzeigen" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "Befehl oder Datei unter angegebenem Benutzernamen oder Benutzer-ID ausführen bzw. ändern" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "Versionsinformation anzeigen und beenden" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "Den Zeitstempel des Benutzers erneuern, ohne einen Befehl auszuführen" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "Aufhören, die Befehlszeilenargumente zu verarbeiten" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "Das Audit-System konnte nicht geöffnet werden" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "Die Audit-Nachricht konnte nicht verschickt werden" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "»fgetfilecon« konnte nicht auf %s angewendet werden" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s änderte die Kennzeichnung" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "Der Kontext für %s konnte nicht wiederhergestellt werden" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s konnte nicht geöffnet werden, TTY wird nicht neu gekennzeichnet" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s ist kein zeichenorientiertes Gerät, TTY wird nicht neu gekennzeichnet." + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "" +"Aktueller TTY-Kontext konnte nicht festgestellt werden, TTY wird nicht neu\n" +"gekennzeichnet." + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "Unbekannte Sicherheitsklasse »chr_file«, TTY wird nicht neu gekennzeichnet." + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "" +"Neuer TTY-Kontext konnte nicht festgestellt werden, TTY wird nicht neu\n" +"gekennzeichnet." + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "Neuer TTY-Kontext konnte nicht festgestellt werden" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "Für den Typen %s muss eine Funktion angegeben werden" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "Standardtyp für Funktion %s konnte nicht ermittelt werden" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "»new_context« konnte nicht geholt werden" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "Neue Funktion %s konnte nicht festgelegt werden" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "Neuer Typ %s konnte nicht festgelegt werden" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s ist kein gültiger Kontext" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "»old_context« konnte nicht geholt werden" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "»Enforcing«-Modus konnte nicht bestimmt werden." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "TTY-Kontext konnte nicht auf %s gesetzt werden" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "Ausführungskontext konnte nicht auf »%s« gesetzt werden" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "Kontext der Schüsselerstellung konnte nicht auf %s festgelegt werden." + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "Benötigt mindestens ein Argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "Unzulässige Dateideskriptornummer: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s konnte nicht als Anmeldeshell ausgeführt werden" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "Handler für Signal %d konnte nicht gespeichert werden" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "Limit der Ressourcenkontrolle wurde erreicht" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "Benutzer »%s« ist kein Mitglied des Projekts »%s«" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "Der aufrufende Prozess ist fertig" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "Projekt »%s« konnte nicht beigetreten werden" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "Für Projekt »%s« gibt es keinen Ressourcen-Pool, der die Standardanbindungen unterstützt." + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "Den angegebenen Ressourcen-Pool gibt es für das Projekt »%s« nicht" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "Es konnte nicht zum Standard-Ressourcen-Pool für Projekt »%s« verbunden werden." + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "»setproject« schlug für Projekt »%s« fehl" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "Warnung: Ressourcenkontrolle von Projekt »%s« konnte nicht zugewiesen werden" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo-Version %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Optionen für »configure«: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "Schwerwiegender Fehler, Plugins konnten nicht geladen werden" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "Regelwerks-Plugin konnte nicht initialisiert werden" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "Plugin gab keinen auszuführenden Befehl zurück" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "E/A-Plugin %s konnte nicht initialisiert werden" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "Unerwarteter sudo-Modus 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "Sie sind in der %s-Datenbank nicht enthalten" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "TTY konnte nicht ermittelt werden" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s muss dem Benutzer mit UID %d gehören und das »setuid«-Bit gesetzt haben" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "Effektive UID ist nicht %d. Liegt %s auf einem Dateisystem mit gesetzter »nosuid«-Option oder auf einem NFS-Dateisystem ohne Root-Rechte?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "Effektive UID ist nicht %d. Wurde sudo mit »setuid root« installiert?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "Zusätzliche Gruppenkennungen konnten nicht gesetzt werden" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "Effektive GID konnte nicht auf »runas«-GID %u gesetzt werden" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "GID konnte nicht auf »runas«-GID %u gesetzt werden" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "Unerwartete Abbruchbedingung eines Unterprozesses: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "Dem Regelwerks-Plugin %s fehlt die »check_policy«-Methode" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "Regelwerks-Plugin %s unterstützt das Auflisten von Privilegien nicht" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "Regelwerks-Plugin %s unterstützt die Option -v nicht" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "Regelwerks-Plugin %s unterstützt die Optionen -k und -K nicht" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "Kein beschreibbares temporäres Verzeichnis gefunden" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "Aktueller Arbeitsordner konnte nicht wiederhergestellt werden" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: Keine reguläre Datei" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: Bearbeiten symbolischer Links ist nicht erlaubt" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: Bearbeiten von Dateien in einem beschreibbaren Ordner ist nicht erlaubt" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: Zu kurzer Schreibvorgang" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s blieb unverändert" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s unverändert" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "%s konnte nicht beschrieben werden" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "Bearbeitungssitzung wurden in %s gelassen" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "Temporäre Datei konnte nicht gelesen werden" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: interner Fehler: seltsame Anzahl an Pfaden" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: Temporäre Dateien konnten nicht angelegt werden" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: unbekannter Fehler %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "Temporäre Dateien konnten nicht an ihre ursprünglichen Orte zurück kopiert werden" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "Einige der temporären Dateien konnten nicht an ihre ursprünglichen Orte zurück kopiert werden" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "UID konnte nicht zu Root (%u) geändert werden" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "Plugin-Fehler: Fehlende Dateiliste für sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "Die Uhr konnte nicht gelesen werden" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "Zeitüberschreitung beim Lesen des Passworts" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "Es wurde kein Passwort angegeben" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "Passwort konnte nicht gelesen werden" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "Zum Lesen des Passworts ist ein Terminal erforderlich; verwenden Sie entweder die Option -S, um aus der Standardeingabe zu lesen oder richten Sie das Askpass-Hilfsprogramm ein" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "Kein »askpass«-Programm angegeben, es wird versucht, SUDO_ASKPASS zu setzen" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "GID konnte nicht als %u festgelegt werden" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "UID konnte nicht als %u festgelegt werden" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "%s konnte nicht ausgeführt werden" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "Standardeingabe konnte nicht gespeichert werden" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "dup2 konnte nicht auf die Standardeingabe angewendet werden" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "Standardeingabe konnte nicht wiederhergestellt werden" diff --git a/utsudo-0.0.2/po/eo.mo b/utsudo-0.0.2/po/eo.mo new file mode 100644 index 0000000000000000000000000000000000000000..aaab73c92d4405afe274da39673b4be1221bc6c1 GIT binary patch literal 19114 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, 2012, 2019. +# Felipe Castro , 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-26 17:39-0400\n" +"Last-Translator: Keith Bowes \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.7\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "ne eblas malfermi la uzanto-datumbazon" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "ne eblas ŝanĝiĝi al registrejo \"%s\" por %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "ne eblas restarigi registrejon" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "ne eblas generi memoron" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Nekonata signalo" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "nevalida valoro" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "valoro tro grandas" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "valoro tro malgrandas" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "nevalida voja valoro \"%s\" en %s, linio %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "nevalida valoro por %s \"%s\" en %s, linio %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nekomprenata grupa fonto \"%s\" en %s, linio %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "nevalidaj maksimumaj grupoj \"%s\" en %s, linio %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "ne eblas apliki stat al %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s estas ne regula dosiero" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s estas estrata de uid %u, devas esti %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s estas skribebla de ĉiuj" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s estas skribebla de la tuta grupo" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "ne eblas malfermi %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "nekonata ensaluta klaso %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "ne eblas elekti uzanto-kuntekston" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "ne eblas elekti procezan prioritaton" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "ne eblas ŝanĝi ĉefuzanton al %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "ne eblas ŝanĝi al plenumigkiela uid (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "ne eblas ŝanĝi dosierujon al %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "ne eblas difini traktilon por la signalo %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "ne eblas forigi PRIV_PROC_EXEC-on de PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "eraro dum legi la konektingan paron" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "neatendita respondotipo ĉe la postkanalo: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "ne eblas aldoni al la atendovico eventon" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "ne eblas elekti la regan tty-on" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "ne eblas krei tubon" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "ne eblas ricevi mesaĝon el supre" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "ne eblas forki" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "ne eblis reatingi tty-etikedon" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "ne eblas plenumigi: %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "konduta kromprogramo fiaskis dum seanca komenciĝo" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "eraro en la eventa iteracio" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "ne eblas restarigi traktilon por la signalo %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "ne eblis generi pty-on" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "ne eblas krei konektingojn" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "ne eblas sendi mesaĝon al observa procezo" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "eraro en %s, linio %d dum ŝargi kromprogramon \"%s\"" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s devas esti estrita de uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s estas skribebla nur de estro" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "maleblas ŝarĝi je %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "ne eblas trovi simbolon \"%s\" en %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "nekonata konduta tipo %d trovita en %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "malkongrua granda versio %d de kromprogramo (atendite %d) trovita en %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ni malatentas kondutan kromprogramon \"%s\" en %s, linio %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "nur unu konduta kromprogramo povas esti indikata" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ni malatentas duobligantan kondutan kromprogramon \"%s\" en %s, linio %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ni malatentas duobligitan eneligan kromprogramon \"%s\" en %s, linio %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "konduta kromprogramo %s ne inkluzivas la metodon check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "interna eraro, superfluo en %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "malvalida medivariabla nomo: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "la parametro de -C devas esti nombron almenaŭ 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "specifi kaj '-i' kaj '-s' vi ne rajtas" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "specifi kaj '-i' kaj '-E' vi ne rajtas" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "la parametro '-E' ne validas en redakta reĝimo" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "vi ne rajtas specifi medivariablojn en redakta reĝimo" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "la parametro '-U' nur povas esti uzata kun '-l'" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "'-A' kaj '-S' ne eblas uziĝi kune" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit ne estas havebla en ĉi tiu platformon" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Vi rajtas specifi nur unu el -e, -h, -i, -K, -l, -s, -v aŭ -V" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - redakti dosierojn kiel alia uzanto\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - plenumigi komandon kiel alia uzanto\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Parametroj:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "uzi helpoprogrogramon por pasvortilo" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "uzi specifitan BSD-konstatan tipon" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "plenumigi komandon fone" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "sonigi pepon kiam invitanta" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "fermi ĉiujn dosierpriskribilojn >= numeron" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "plenumigi komandon per specifita BSD-ensaluta klaso" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "konservi uzanto-medivariablojn dum plenumigi komandon" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "konservi specifajn medivariablojn" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "redakti dosierojn anstataŭ plenumigi komandon" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "plenumigi komandon kiel la specifitan grupnomon aŭ identigilon" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "valorizi medivariablon HOME je la hejma dosierujo de la cela uzanto" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "elmontri helpan mesaĝon kaj eliri" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "plenumigi komandon en gastiganto (se permesata de kromprogramo)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "plenumigi ensalutan ŝelon kiel celan uzanton; komando ankaŭ enmeteblas" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "tute forigi tempo-indikilan dosieron" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "eksvalidigi tempo-indikilan dosieron" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "listigi privilegiojn de la uzanto aŭ kontroli specifan komandon; uzu dufoje por pli longa formato" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "neinteraga reĝimo, ne demandos al uzanto" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "konservi grupan vektoron anstataŭ elekti celan" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "uzi specifitan pasvortilon" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "krei SELinux-sekurecan kuntekston kun specifita rolo" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "legi pasvorton el norma enigo" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "plenumigi ŝelon kiel cela uzanto; komando ankaŭ specifebla" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "krei SELinux-sekurecan kuntekston kun specifita rolo" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "finigi la komandon post la specifita tempolimo" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "en lista reĝimo elmontri privilegiojn por uzanto" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "plenumigi komandon (aŭ redakti dosieron) kiel specifita uzanto" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "elmontri eldonan informon kaj eliri" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "ĝisdatigi la tempo-indikilon de la uzanto, sed ne plenumigi komandon" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "ĉesigi procedi komandliniajn parametrojn" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "ne eblas malfermi aŭdan sistemon" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "ne eblas sendi aŭdan mesaĝon" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "ne eblas voki fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s ŝanĝis etikedojn" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "ne eblas restarigi kuntekston por %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "ne eblas malfermi %s, ne remarkanta tty-on" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s ne estas signo-aparato, ni ne remarkas tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "ne eblas akiri aktualan tty-kuntekston, ne remarkanta" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "nekonata sekurecan klason \"chr_file\", ni ne remarkas tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "ne eblas akiri novan tty-kuntekston, ni ne remarkas tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "ne eblas elekti novan tty-kuntekston" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "vi devas specifi rolon por tipon %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "ne eblas akiri aŭtomatan tipon por rolo %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "malsukcesis akiri novan kuntekston" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "malsukcesis elekti novan rolon %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "malsukcesis elekti novan tipon %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s ne estas valida kunteksto" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "malsukcesis akiri malnovan kuntekston" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "ne povas determini eldevigan reĝimon." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "ne eblas agordi tty-kuntekston al %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "ne eblas elekti exec-kuntekston al %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "ne eblas elekti kuntekston de kreo de ŝlosilo al %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "postulas almenaŭ unu parametron" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "malvalida dosierpriskribila numero: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "ne eblas lanĉi %s kiel ensalut-ŝelo" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "ne eblas konservi traktilon por la signalo %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "rimedo-rega limigo estis atingita" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "uzanto \"%s\" ne estas ano de projekto \"%s\"" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "la voka tasko estas nenuligebla" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "ne eblis aliĝi al projekto \"%s\"" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "neniu rimedujo akceptanta aŭtomatajn bindaĵojn ekzistas por projekto \"%s\"" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "specifita rimedujo ne ekzistas por projekto \"%s\"" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "ne eblis bindi al aprioran rimedujo por projekto \"%s\"" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject malsukcesis por projekto \"%s\"" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "averto, rimedo-rega asigno malsukcesis por projekto \"%s\"" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo: eldono %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Muntaj parametroj: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "ĉesiga eraro: ne eblas ŝargi kromprogramojn" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "ne eblas komenci konduktan kromprogramon" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "kromprogramo ne liveris komandon por plenumi" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "eraro dum komenci eneligan kromprogramon %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "neatendita sudo-reĝimon 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vi ne ekzistas en la datumbazo %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "ne eblas determini tty-on" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s devas esti posedata de uid %d kaj la setuid-bito devas esti markita" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "efektiva uid ne estas %d; ĉu %s estas en dosiersistemo kun la elekto 'nosuid' aŭ reta dosiersistemo sen ĉefuzanto-privilegioj?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "efektiva uid ne estas %d; ĉu sudo estas instalita kiel setuid-radiko?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "ne eblas elekti suplementajn grupajn identigilojn" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "ne eblas elekti efikan gid-on al plenumigkiela gid %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "ne eblas elekti gid-on kiel plenumigkielan gid-on %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "neatendita ido ekzekutiĝis laŭ la kondiĉo: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "konduta kromprogramo %s ne inkluzivas la metodon 'check_policy'" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "konduta kromprogramo %s ne komprenas listigon de privilegioj" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "konduta kromprogramo %s ne komprenas la parametron -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "konduta kromprogramo %s ne komprenas la parametrojn -k kaj -K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "neniu skribebla provizora dosierujo estis trovata" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "ne eblas restarigi nune kurantan dosierujon" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: ne regula dosiero" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: redakto de simbolaj ligoj ne estas permesata" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: redakto de dosieroj en skribebla dosierujo ne estas permesata" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: mallonga skribado" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s restas ne modifita" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s ne ŝanĝita" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "ne eblas skribi al %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "enhavo de redakta seanco restas en %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "ne eblas legi provizoran dosieron" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: interna eraro: malpara nombro da vojoj" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: ne eblas krei provizorajn dosierojn" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: nekonata eraro %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "ne eblas retrokopii provizorajn dosierojn al ilia originala loko" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "ne eblas retrokopii kelkajn el la provizoraj dosieroj al ilia originala loko" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "ne eblas ŝanĝi uid-on al ĉefuzanto (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "kromprograma eraro: malhavas dosieran liston por sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "ne eblas legi la horloĝon" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tro da tempo por kapti pasvorton" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "neniu pasvorto estis provizata" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "ne eblas legi pasvorton" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "terminalo estas postulata por legi la pasvorton; uzu la parametron -S por legi el norma enigo aŭ agordu helpanton askpass" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "neniu programo askpass indikita, provu difini SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "ne eblas elekti gid-on al %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "ne eblas elekti uid-on al %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "ne eblas plenumigi: %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "ne eblas konservi norman enigon" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "ne eblas dup2 el norma enigo" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "ne eblas restarigi norman enigon" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "neniu tty ĉeestas kaj neniu pasvorto-programo specifita" + +#~ msgid "unable to get group vector" +#~ msgstr "ne eblas elekti grupan vektoron" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "nekonata uid %u: kiu vi estas?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "eraro dum legi la signalan tubon" + +#~ msgid "error reading from pipe" +#~ msgstr "eraro dum legi el tubo" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "interna eraro, provo rezervi neniun bajton" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "ne eblas elekti nudan reĝimon ĉe la terminalo" + +#~ msgid "unable to open socket" +#~ msgstr "ne eblas malfermi konektingon" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "interna eraro, provis je emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "interna eraro, provis je ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "interna eraro, provis je erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "interna eraro, provis je erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "interna eraro, provis je erealloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: superfluo malkovrita" + +#~ msgid "value out of range" +#~ msgstr "valoro ne en permesata skalo" + +#~ msgid "select failed" +#~ msgstr "elekto malsukcesis" + +#~ msgid "list user's available commands\n" +#~ msgstr "listigi disponeblajn komandojn de uzanto\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "plenumigi ŝelon kiel cela uzanto\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "dum listigo, listigi privilegiojn de specifita uzanto\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "interna eraro, emalloc2() superfluo" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "interna eraro, erealloc3() superfluo" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: almenaŭ unu konduku devas esti specifita" + +#~ msgid "must be setuid root" +#~ msgstr "devas esti ĉefuzanto setuid" diff --git a/utsudo-0.0.2/po/es.mo b/utsudo-0.0.2/po/es.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f3fbe1f6fd353a7bd0e1280a2b2afe3de5f1b58 GIT binary patch literal 19418 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, 2012. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2019-02-25 18:22-0300\n" +"Last-Translator: Abel Sendón \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 2.0.6\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: lib/util/aix.c:90 lib/util/aix.c:177 +msgid "unable to open userdb" +msgstr "no se puede abrir userdb" + +#: lib/util/aix.c:232 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "no se puede cambiar al registro \"%s\" para %s" + +#: lib/util/aix.c:257 +msgid "unable to restore registry" +msgstr "no se puede restaurar el registro" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/gidlist.c:79 +#: lib/util/sudo_conf.c:191 lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 +#: lib/util/sudo_conf.c:558 src/conversation.c:82 src/exec_common.c:112 +#: src/exec_common.c:128 src/exec_common.c:137 src/exec_monitor.c:210 +#: src/exec_monitor.c:465 src/exec_monitor.c:471 src/exec_monitor.c:479 +#: src/exec_monitor.c:487 src/exec_monitor.c:494 src/exec_monitor.c:501 +#: src/exec_monitor.c:508 src/exec_monitor.c:515 src/exec_monitor.c:522 +#: src/exec_monitor.c:529 src/exec_monitor.c:536 src/exec_nopty.c:212 +#: src/exec_nopty.c:218 src/exec_nopty.c:227 src/exec_nopty.c:234 +#: src/exec_nopty.c:241 src/exec_nopty.c:248 src/exec_nopty.c:255 +#: src/exec_nopty.c:262 src/exec_nopty.c:269 src/exec_nopty.c:276 +#: src/exec_nopty.c:283 src/exec_nopty.c:290 src/exec_nopty.c:297 +#: src/exec_nopty.c:305 src/exec_nopty.c:467 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:994 +#: src/exec_pty.c:1157 src/exec_pty.c:1163 src/exec_pty.c:1172 +#: src/exec_pty.c:1179 src/exec_pty.c:1186 src/exec_pty.c:1193 +#: src/exec_pty.c:1200 src/exec_pty.c:1207 src/exec_pty.c:1214 +#: src/exec_pty.c:1221 src/exec_pty.c:1228 src/exec_pty.c:1235 +#: src/exec_pty.c:1243 src/exec_pty.c:1661 src/load_plugins.c:57 +#: src/load_plugins.c:70 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:203 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:676 src/sudo.c:686 src/sudo.c:706 src/sudo.c:725 +#: src/sudo.c:734 src/sudo.c:743 src/sudo.c:760 src/sudo.c:801 src/sudo.c:811 +#: src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 src/sudo.c:1266 +#: src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 src/sudo_edit.c:886 +#: src/sudo_edit.c:1000 src/sudo_edit.c:1020 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/sudo_conf.c:192 +#: lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 lib/util/sudo_conf.c:558 +#: src/conversation.c:83 src/exec_common.c:112 src/exec_common.c:129 +#: src/exec_common.c:138 src/exec_monitor.c:465 src/exec_monitor.c:471 +#: src/exec_monitor.c:479 src/exec_monitor.c:487 src/exec_monitor.c:494 +#: src/exec_monitor.c:501 src/exec_monitor.c:508 src/exec_monitor.c:515 +#: src/exec_monitor.c:522 src/exec_monitor.c:529 src/exec_monitor.c:536 +#: src/exec_nopty.c:212 src/exec_nopty.c:218 src/exec_nopty.c:227 +#: src/exec_nopty.c:234 src/exec_nopty.c:241 src/exec_nopty.c:248 +#: src/exec_nopty.c:255 src/exec_nopty.c:262 src/exec_nopty.c:269 +#: src/exec_nopty.c:276 src/exec_nopty.c:283 src/exec_nopty.c:290 +#: src/exec_nopty.c:297 src/exec_nopty.c:305 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:1157 +#: src/exec_pty.c:1163 src/exec_pty.c:1172 src/exec_pty.c:1179 +#: src/exec_pty.c:1186 src/exec_pty.c:1193 src/exec_pty.c:1200 +#: src/exec_pty.c:1207 src/exec_pty.c:1214 src/exec_pty.c:1221 +#: src/exec_pty.c:1228 src/exec_pty.c:1235 src/exec_pty.c:1243 +#: src/exec_pty.c:1661 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:204 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 +#: src/sudo.c:1266 src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 +#: src/sudo_edit.c:886 src/sudo_edit.c:1000 src/sudo_edit.c:1020 +msgid "unable to allocate memory" +msgstr "no se puede de asignar memoria" + +#: lib/util/strsignal.c:53 +msgid "Unknown signal" +msgstr "Señal desconocida" + +#: lib/util/strtoid.c:82 lib/util/strtoid.c:129 lib/util/strtoid.c:157 +#: lib/util/strtomode.c:54 lib/util/strtonum.c:63 lib/util/strtonum.c:181 +msgid "invalid value" +msgstr "valor inválido" + +#: lib/util/strtoid.c:89 lib/util/strtoid.c:136 lib/util/strtoid.c:164 +#: lib/util/strtomode.c:60 lib/util/strtonum.c:66 lib/util/strtonum.c:193 +msgid "value too large" +msgstr "valor muy grande" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:142 lib/util/strtomode.c:60 +#: lib/util/strtonum.c:66 lib/util/strtonum.c:187 +msgid "value too small" +msgstr "valor muy pequeño" + +#: lib/util/sudo_conf.c:210 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valor de ruta inválido \"%s\" en %s, línea %u" + +#: lib/util/sudo_conf.c:376 lib/util/sudo_conf.c:429 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valor inválido para %s \"%s\" en %s, línea %u" + +#: lib/util/sudo_conf.c:397 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "fuente de grupo no soportada \"%s\" en %s, línea %u" + +#: lib/util/sudo_conf.c:413 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "máximo de grupos inválido \"%s\" en %s, línea %u" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "unable to stat %s" +msgstr "no se puede stat en %s" + +#: lib/util/sudo_conf.c:577 +#, c-format +msgid "%s is not a regular file" +msgstr "%s no es un archivo regular" + +#: lib/util/sudo_conf.c:580 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s es adueñado por uid %u, sería %u" + +#: lib/util/sudo_conf.c:584 +#, c-format +msgid "%s is world writable" +msgstr "%s es escribible por todos" + +#: lib/util/sudo_conf.c:587 +#, c-format +msgid "%s is group writable" +msgstr "%s es escribible por el grupo" + +#: lib/util/sudo_conf.c:597 src/selinux.c:213 src/selinux.c:230 src/sudo.c:360 +#, c-format +msgid "unable to open %s" +msgstr "no se pudo abrir %s" + +#: src/exec.c:165 +#, c-format +msgid "unknown login class %s" +msgstr "clase de inicio de sesión desconocida %s" + +#: src/exec.c:178 +msgid "unable to set user context" +msgstr "no se puede establecer el contexto del usuario" + +#: src/exec.c:194 +msgid "unable to set process priority" +msgstr "no se puede establecer la prioridad de proceso" + +#: src/exec.c:202 +#, c-format +msgid "unable to change root to %s" +msgstr "no se puede cambiar de root a %s" + +#: src/exec.c:215 src/exec.c:221 src/exec.c:228 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "no se puede cambiar a runas uid (%u, %u)" + +#: src/exec.c:246 +#, c-format +msgid "unable to change directory to %s" +msgstr "no se puede cambiar al directorio %s" + +#: src/exec.c:345 src/exec_monitor.c:574 src/exec_monitor.c:576 +#: src/exec_nopty.c:525 src/exec_pty.c:522 src/exec_pty.c:1329 +#: src/exec_pty.c:1331 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "no se puede establecer el manejador para señal %d" + +#: src/exec_common.c:171 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "no se puede remover PRIV_PROC_EXEC desde PRIV_LIMIT" + +#: src/exec_monitor.c:364 +msgid "error reading from socketpair" +msgstr "error leyendo de socketpair" + +#: src/exec_monitor.c:381 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipo de respuesta inesperada en canales alternos %d" + +#: src/exec_monitor.c:473 src/exec_monitor.c:481 src/exec_monitor.c:489 +#: src/exec_monitor.c:496 src/exec_monitor.c:503 src/exec_monitor.c:510 +#: src/exec_monitor.c:517 src/exec_monitor.c:524 src/exec_monitor.c:531 +#: src/exec_monitor.c:538 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:644 +#: src/exec_pty.c:649 src/exec_pty.c:746 src/exec_pty.c:753 src/exec_pty.c:850 +#: src/exec_pty.c:1165 src/exec_pty.c:1174 src/exec_pty.c:1181 +#: src/exec_pty.c:1188 src/exec_pty.c:1195 src/exec_pty.c:1202 +#: src/exec_pty.c:1209 src/exec_pty.c:1216 src/exec_pty.c:1223 +#: src/exec_pty.c:1230 src/exec_pty.c:1237 src/exec_pty.c:1614 +#: src/exec_pty.c:1624 src/exec_pty.c:1669 src/exec_pty.c:1676 +#: src/exec_pty.c:1703 +msgid "unable to add event to queue" +msgstr "no se puede agregar evento a la cola" + +#: src/exec_monitor.c:592 +msgid "unable to set controlling tty" +msgstr "no se puede establecer el controlador tty" + +#: src/exec_monitor.c:600 src/exec_nopty.c:364 src/exec_pty.c:1408 +#: src/exec_pty.c:1429 src/exec_pty.c:1449 src/tgetpass.c:292 +msgid "unable to create pipe" +msgstr "no se puede crear tubería" + +#: src/exec_monitor.c:608 +msgid "unable to receive message from parent" +msgstr "no se puede recibir mensaje desde el padre" + +#: src/exec_monitor.c:614 src/exec_nopty.c:382 src/exec_pty.c:1487 +#: src/tgetpass.c:296 +msgid "unable to fork" +msgstr "no se puede bifurcar" + +#: src/exec_monitor.c:628 src/sesh.c:125 src/sudo.c:1130 +#, c-format +msgid "unable to execute %s" +msgstr "no se puede ejecutar %s" + +#: src/exec_monitor.c:711 src/exec_nopty.c:435 +msgid "unable to restore tty label" +msgstr "no se puede restaurar la etiqueta tty " + +#: src/exec_nopty.c:358 src/exec_pty.c:1338 +msgid "policy plugin failed session initialization" +msgstr "la política de plugin falló en la inicialización de sesión " + +#: src/exec_nopty.c:424 src/exec_pty.c:1574 +msgid "error in event loop" +msgstr "error en loop de evento" + +#: src/exec_nopty.c:533 src/exec_pty.c:557 src/signal.c:110 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "no se puede restaurar el manejador para señal %d" + +#: src/exec_pty.c:156 +msgid "unable to allocate pty" +msgstr "no se puede asignar pty" + +#: src/exec_pty.c:1318 +msgid "unable to create sockets" +msgstr "no se puede crear sockets" + +#: src/exec_pty.c:1531 +msgid "unable to send message to monitor process" +msgstr "no se puede enviar mensaje al monitor de procesos" + +#: src/load_plugins.c:55 src/load_plugins.c:68 src/load_plugins.c:90 +#: src/load_plugins.c:120 src/load_plugins.c:128 src/load_plugins.c:134 +#: src/load_plugins.c:175 src/load_plugins.c:183 src/load_plugins.c:190 +#: src/load_plugins.c:196 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "error en %s, línea %d mientras se carga el plugin \"%s\"" + +#: src/load_plugins.c:92 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:130 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s debe ser propiedad del uid %d" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s sólo tener permisos de escritura por el propietario" + +#: src/load_plugins.c:177 +#, c-format +msgid "unable to load %s: %s" +msgstr "no se puede cargar %s: %s" + +#: src/load_plugins.c:185 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "no se puede de encontrar el símbolo \"%s\" en %s" + +#: src/load_plugins.c:192 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "tipo de política desconocido %d encontrado en %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "incompatible la versión principal de la política de plugin %d (se esperaba %d) encontrada in %s" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "Ignorando política de plugin \"%s\" en %s, linea %d" + +#: src/load_plugins.c:209 +msgid "only a single policy plugin may be specified" +msgstr "sólo una política de plugin puede ser especificada" + +#: src/load_plugins.c:212 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "Ignorando política de plugin duplicada \"%s\" en %s, línea %d" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "Ignorando E/S de plugin duplicada \"%s\" en %s, linea %d" + +#: src/load_plugins.c:347 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "la política del plugin %s no incluye un método check_policy" + +#: src/net_ifs.c:180 src/net_ifs.c:197 src/net_ifs.c:342 src/sudo.c:470 +#, c-format +msgid "internal error, %s overflow" +msgstr "error interno: desbordamiento de %s" + +#: src/parse_args.c:224 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nombre de variable de entorno inválido: %s" + +#: src/parse_args.c:320 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "el argumento -C debe ser un número mayor o igual a 3" + +#: src/parse_args.c:505 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "no se deben especificar las opciones '-i' y '-s' simultáneamente" + +#: src/parse_args.c:509 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "no se deben especificar las opciones '-i' y '-E' simultáneamente" + +#: src/parse_args.c:519 +msgid "the `-E' option is not valid in edit mode" +msgstr "la opción '-E' no es válida en el modo edición" + +#: src/parse_args.c:521 +msgid "you may not specify environment variables in edit mode" +msgstr "no se debe especificar variables de entorno en el modo edición" + +#: src/parse_args.c:529 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "la opción '-U' sólo se puede usar con la opcion '-l'" + +#: src/parse_args.c:533 +msgid "the `-A' and `-S' options may not be used together" +msgstr "las opciones '-A' y '-S' no se pueden utilizar conjuntamente" + +#: src/parse_args.c:609 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit no está soportado en ésta plataforma" + +#: src/parse_args.c:682 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "puede ser especificada sólo una de las opciones -e, -h, -i, -K, -l, -s, -v o -V" + +#: src/parse_args.c:696 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita archivos como otro usuario\n" +"\n" + +#: src/parse_args.c:698 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - ejecuta un comando como otro usuario\n" +"\n" + +#: src/parse_args.c:703 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opciones:\n" + +#: src/parse_args.c:705 +msgid "use a helper program for password prompting" +msgstr "utiliza un programa auxiliar para la solicitud de contraseña" + +#: src/parse_args.c:708 +msgid "use specified BSD authentication type" +msgstr "utiliza tipo de autentificación especificado en BSD" + +#: src/parse_args.c:711 +msgid "run command in the background" +msgstr "ejecuta un comando en segundo plano" + +#: src/parse_args.c:713 +msgid "close all file descriptors >= num" +msgstr "cierra todos los descriptores de archivo >= num" + +#: src/parse_args.c:716 +msgid "run command with the specified BSD login class" +msgstr "ejecuta un comando con la clase especificada de inicio de sesión BSD" + +#: src/parse_args.c:719 +msgid "preserve user environment when running command" +msgstr "preserva entorno del usuario cuando está ejecutando un comando" + +#: src/parse_args.c:721 +msgid "preserve specific environment variables" +msgstr "preserva variables de entorno específicas" + +#: src/parse_args.c:723 +msgid "edit files instead of running a command" +msgstr "edita archivos en vez de ejecutar un comando" + +#: src/parse_args.c:725 +msgid "run command as the specified group name or ID" +msgstr "ejecuta un comando como el ID o grupo especificado" + +#: src/parse_args.c:727 +msgid "set HOME variable to target user's home dir" +msgstr "asigna la variable HOME al directorio de inicio del usuario" + +#: src/parse_args.c:729 +msgid "display help message and exit" +msgstr "muestra este mensaje de ayuda y sale" + +#: src/parse_args.c:731 +msgid "run command on host (if supported by plugin)" +msgstr "ejecuta comando en host (si está soportado por plugin)" + +#: src/parse_args.c:733 +msgid "run login shell as the target user; a command may also be specified" +msgstr "ejecuta un intérprete de comandos como un determinado usuario, un comando también puede ser especificado" + +#: src/parse_args.c:735 +msgid "remove timestamp file completely" +msgstr "remueve un archivo de marca completamente" + +#: src/parse_args.c:737 +msgid "invalidate timestamp file" +msgstr "archivo de marca inválido" + +#: src/parse_args.c:739 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "lista privilegios de usuario o chequea un comando especifico; usar dos veces para formato extenso" + +#: src/parse_args.c:741 +msgid "non-interactive mode, no prompts are used" +msgstr "modo no-interactivo, no se pedirá usuario" + +#: src/parse_args.c:743 +msgid "preserve group vector instead of setting to target's" +msgstr "preserva el vector de grupos en vez de establecer al objetivo" + +#: src/parse_args.c:745 +msgid "use the specified password prompt" +msgstr "usa la contraseña especificada" + +#: src/parse_args.c:748 +msgid "create SELinux security context with specified role" +msgstr "crea el contexto de seguridad SELinux con la regla especificada" + +#: src/parse_args.c:751 +msgid "read password from standard input" +msgstr "lee la contraseña desde la entrada estandar" + +#: src/parse_args.c:753 +msgid "run shell as the target user; a command may also be specified" +msgstr "ejecuta un intérprete de comandos como un determinado usuario, un comando también puede ser especificado" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified type" +msgstr "crea el contexto de seguridad SELinux con el tipo especificado" + +#: src/parse_args.c:759 +msgid "terminate command after the specified time limit" +msgstr "termina un comando luego de un límite de tiempo especificado" + +#: src/parse_args.c:761 +msgid "in list mode, display privileges for user" +msgstr "en modo lista, muestra los privilegios para el usuario" + +#: src/parse_args.c:763 +msgid "run command (or edit file) as specified user name or ID" +msgstr "ejecuta un comando (o edita un archivo) como un ID o usuario específico" + +#: src/parse_args.c:765 +msgid "display version information and exit" +msgstr "muestra la información de la versión y sale" + +#: src/parse_args.c:767 +msgid "update user's timestamp without running a command" +msgstr "actualiza la marca del usuario sin ejecutar un comando" + +#: src/parse_args.c:769 +msgid "stop processing command line arguments" +msgstr "detiene el proceso de argumentos de la línea de comandos" + +#: src/selinux.c:83 +msgid "unable to open audit system" +msgstr "no se puede de abrir el sistema de auditoría" + +#: src/selinux.c:93 +msgid "unable to send audit message" +msgstr "no se puede enviar mensaje de auditoría" + +#: src/selinux.c:121 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "no se puede fgetfilecon %s" + +#: src/selinux.c:126 +#, c-format +msgid "%s changed labels" +msgstr "%s etiquetas cambiadas" + +#: src/selinux.c:131 +#, c-format +msgid "unable to restore context for %s" +msgstr "no se puede restaurar el contexto para %s" + +#: src/selinux.c:172 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "no se puede abrir %s, no volver a etiquetar tty" + +#: src/selinux.c:176 src/selinux.c:217 src/selinux.c:234 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s no es un dispositivo de caracter, no se reetiqueta tty" + +#: src/selinux.c:185 +msgid "unable to get current tty context, not relabeling tty" +msgstr "no se puede obtener el actual contexto tty, no volver a etiquetar tty" + +#: src/selinux.c:192 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "clase de seguridad desconocida \"chr_file\", tty no reetiquetada" + +#: src/selinux.c:197 +msgid "unable to get new tty context, not relabeling tty" +msgstr "no se puede obtener el nuevo contexto tty, no volver a etiquetar tty" + +#: src/selinux.c:204 +msgid "unable to set new tty context" +msgstr "no se puede establecer nuevo contexto tty" + +#: src/selinux.c:278 +#, c-format +msgid "you must specify a role for type %s" +msgstr "se debe especificar una regla por tipo %s" + +#: src/selinux.c:284 +#, c-format +msgid "unable to get default type for role %s" +msgstr "no se puede obtener el tipo de regla predeterminada %s" + +#: src/selinux.c:302 +#, c-format +msgid "failed to set new role %s" +msgstr "falló al establecer nueva regla %s" + +#: src/selinux.c:306 +#, c-format +msgid "failed to set new type %s" +msgstr "falló al establecer nuevo tipo %s" + +#: src/selinux.c:318 +#, c-format +msgid "%s is not a valid context" +msgstr "%s no es un contexto válido" + +#: src/selinux.c:353 +msgid "failed to get old_context" +msgstr "falló al obtener old_context" + +#: src/selinux.c:359 +msgid "unable to determine enforcing mode." +msgstr "no se puede determinar el modo de forzado" + +#: src/selinux.c:376 +#, c-format +msgid "unable to set tty context to %s" +msgstr "no se puede establecer el contexto tty a %s" + +#: src/selinux.c:415 +#, c-format +msgid "unable to set exec context to %s" +msgstr "no se puede establecer el contexto de ejecución a %s" + +#: src/selinux.c:422 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "no se puede establecer la clave de creación de contexto a %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "requiere al menos un argumento" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "número de descriptor de archivo no válido: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "no se puede ejecutar %s como un login" + +#: src/signal.c:88 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "no se puede guardar el manejador para la señal %d" + +#: src/solaris.c:81 +msgid "resource control limit has been reached" +msgstr "el límite de control de recursos ha sido alcanzado" + +#: src/solaris.c:84 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "el usuario \"%s\" no es miembro del proyecto \"%s\"" + +#: src/solaris.c:88 +msgid "the invoking task is final" +msgstr "la tarea que invoca es definitiva" + +#: src/solaris.c:91 +#, c-format +msgid "could not join project \"%s\"" +msgstr "no podría unirse al proyecto \"%s\"" + +#: src/solaris.c:96 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "no hay fondo de recursos aceptando las asignaciones existentes para el proyecto \"%s\"" + +#: src/solaris.c:100 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "el fondo de recursos especificado no existe para el proyecto \"%s\"" + +#: src/solaris.c:104 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "no se podría enlazar al fondo de recursos predeterminado para el proyecto \"%s\" " + +#: src/solaris.c:110 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "configuración del proyecto fallida \"%s\" " + +#: src/solaris.c:112 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "aviso, el control de asignación de recursos falló para el proyecto \"%s\"" + +#: src/sudo.c:201 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versión %s\n" + +#: src/sudo.c:203 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opciones de configuración: %s\n" + +#: src/sudo.c:211 +msgid "fatal error, unable to load plugins" +msgstr "error fatal, no se puede cargar los plugins" + +#: src/sudo.c:219 +msgid "unable to initialize policy plugin" +msgstr "no se puede inicializar la política de plugin" + +#: src/sudo.c:263 +msgid "plugin did not return a command to execute" +msgstr "el plugin no devolvió un comando para ejecutar" + +#: src/sudo.c:279 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "error al inicializar los plugins de E/S %s" + +#: src/sudo.c:302 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "inesperado modo sudo 0x%x" + +#: src/sudo.c:535 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: src/sudo.c:592 +msgid "unable to determine tty" +msgstr "no se puede deterrminar tty" + +#: src/sudo.c:880 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s debe ser propiedad del uid %d y tener el bit setuid establecido" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "el uid no es %d, es %s en un sistema de archivos con la opción 'nosuid' establecida o un sistema de archivos NFS sin privilegios de root?" + +#: src/sudo.c:889 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "el uid efectivo no es %d, sudo está instalado con setuid root?" + +#: src/sudo.c:942 +msgid "unable to set supplementary group IDs" +msgstr "no se puede establecer el grupo suplementario de IDs" + +#: src/sudo.c:949 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "no se puede establecer el gid efectivo para ejecutar como gid %u" + +#: src/sudo.c:955 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "no se puede establecer el gid para ejecutar como gid %u" + +#: src/sudo.c:1012 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "inesperada terminación de condición hija: %d" + +#: src/sudo.c:1158 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "la política del plugin %s no incluye el método `check_policy' " + +#: src/sudo.c:1176 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "la política del plugin %s no soporta listado de privilegios" + +#: src/sudo.c:1193 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "la política del plugin %s no soporta la opción -v" + +#: src/sudo.c:1208 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "la política del plugin %s no soporta las opciones -k/-K" + +#: src/sudo_edit.c:219 +msgid "no writable temporary directory found" +msgstr "no se ha encontrado directorio temporal para escritura" + +#: src/sudo_edit.c:286 src/sudo_edit.c:375 +msgid "unable to restore current working directory" +msgstr "no se puede restaurar el actual directorio de trabajo" + +#: src/sudo_edit.c:592 src/sudo_edit.c:704 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: no es un archivo regular" + +#: src/sudo_edit.c:599 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: edición de enlaces simbólicos no está permitida" + +#: src/sudo_edit.c:602 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: no se permite la edición de archivos en un directorio con permisos de escritura" + +#: src/sudo_edit.c:635 src/sudo_edit.c:742 +#, c-format +msgid "%s: short write" +msgstr "%s: escritura corta" + +#: src/sudo_edit.c:705 +#, c-format +msgid "%s left unmodified" +msgstr "%s sin modificar" + +#: src/sudo_edit.c:718 src/sudo_edit.c:903 +#, c-format +msgid "%s unchanged" +msgstr "%s sin cambios" + +#: src/sudo_edit.c:731 src/sudo_edit.c:753 +#, c-format +msgid "unable to write to %s" +msgstr "no se puede escribir en %s" + +#: src/sudo_edit.c:732 src/sudo_edit.c:751 src/sudo_edit.c:754 +#: src/sudo_edit.c:928 src/sudo_edit.c:932 +#, c-format +msgid "contents of edit session left in %s" +msgstr "los contenidos de edición de sesión se dejan en %s" + +#: src/sudo_edit.c:750 +msgid "unable to read temporary file" +msgstr "no se puede leer el archivo temporal" + +#: src/sudo_edit.c:833 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: error interno: número de rutas impar" + +#: src/sudo_edit.c:835 +msgid "sesh: unable to create temporary files" +msgstr "sesh: no se puede crear archivos temporales" + +#: src/sudo_edit.c:837 src/sudo_edit.c:935 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: error desconocido %d" + +#: src/sudo_edit.c:927 +msgid "unable to copy temporary files back to their original location" +msgstr "no se puede copiar los archivos temporales nuevamente a su ubicación original" + +#: src/sudo_edit.c:931 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "no se puede copiar algunos de los archivos temporales nuevamente a su ubicación original" + +#: src/sudo_edit.c:976 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "no se puede cambiar uid a root (%u)" + +#: src/sudo_edit.c:993 +msgid "plugin error: missing file list for sudoedit" +msgstr "error de plugin: falta la lista de archivos para sudoedit" + +#: src/sudo_edit.c:1034 src/sudo_edit.c:1047 +msgid "unable to read the clock" +msgstr "no se leer el reloj" + +#: src/tgetpass.c:101 +msgid "timed out reading password" +msgstr "" + +#: src/tgetpass.c:104 +msgid "no password was provided" +msgstr "" + +#: src/tgetpass.c:107 +msgid "unable to read password" +msgstr "incapaz de leer la contraseña" + +#: src/tgetpass.c:141 +msgid "no tty present and no askpass program specified" +msgstr "sin tty presente y no hay programa askpass especificado" + +#: src/tgetpass.c:150 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "no hay programa askpass especificado, intente establecer SUDO_ASKPASS" + +#: src/tgetpass.c:307 +#, c-format +msgid "unable to set gid to %u" +msgstr "no se puede establecer el gid a %u" + +#: src/tgetpass.c:311 +#, c-format +msgid "unable to set uid to %u" +msgstr "no se puede establecer el uid a %u" + +#: src/tgetpass.c:316 +#, c-format +msgid "unable to run %s" +msgstr "no se puede ejecutar %s" + +#: src/utmp.c:271 +msgid "unable to save stdin" +msgstr "no se puede guardar stdin" + +#: src/utmp.c:273 +msgid "unable to dup2 stdin" +msgstr "no se puede hacer dup2 stdin" + +#: src/utmp.c:276 +msgid "unable to restore stdin" +msgstr "no se puede restaurar stdin" + +#~ msgid "unable to get group vector" +#~ msgstr "no se puede obtener el vector de grupo" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "uid desconocido %u: quién es usted?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "error al leer desde la tubería de la señal" + +#~ msgid "error reading from pipe" +#~ msgstr "error al leer de la tubería" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "no se puede establecer la terminal en modo directo" + +#~ msgid "internal error, tried to emalloc(0)" +#~ msgstr "error interno: trató emalloc(0)" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "error interno: trató emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "error interno: trató ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "error interno: trató erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "error interno: trató erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "error interno: trató erecalloc(0)" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s:%s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "select failed" +#~ msgstr "selección fallida" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: desbordamiento detectado" + +#~ msgid "unable to open socket" +#~ msgstr "no se puede de abrir socket" + +#~ msgid "list user's available commands\n" +#~ msgstr "lista los comandos del usuario disponibles\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "ejecuta un intérprete de comandos como un determinado usuario\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "cuando está listando, lista los privilegios del usuario especificado\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: debe ser especificada al menos una política de plugin" + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "error interno: desbordamiento en emalloc2()" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "error interno: desbordamiento de erealloc3()" + +#~ msgid "must be setuid root" +#~ msgstr "debe ser setuid root" + +#~ msgid "the argument to -D must be between 1 and 9 inclusive" +#~ msgstr "el argumento -D debe estar entre 1 y 9 inclusive" diff --git a/utsudo-0.0.2/po/eu.mo b/utsudo-0.0.2/po/eu.mo new file mode 100644 index 0000000000000000000000000000000000000000..e50c8ff3d31e320206a8b9d4fb0a76158626deb6 GIT binary patch literal 6771 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/eu.po b/utsudo-0.0.2/po/eu.po new file mode 100644 index 0000000..f36b0db --- /dev/null +++ b/utsudo-0.0.2/po/eu.po @@ -0,0 +1,742 @@ +# Basque translation of sudo. +# Copyright (C) 2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Mikel Olasagasti Uranga , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.2rc2\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2011-06-04 18:27-0400\n" +"PO-Revision-Date: 2011-06-06 18:28+0100\n" +"Last-Translator: Mikel Olasagasti Uranga \n" +"Language-Team: Basque \n" +"Language: eu\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"\n" + +#: src/error.c:82 src/error.c:86 +msgid ": " +msgstr ":" + +#: src/exec.c:125 src/exec_pty.c:573 src/exec_pty.c:880 src/tgetpass.c:224 +#, c-format +msgid "unable to fork" +msgstr "ezin da fork egin" + +#: src/exec.c:246 +#, c-format +msgid "unable to create sockets" +msgstr "ezin da socketik sortu" + +#: src/exec.c:253 src/exec_pty.c:526 src/exec_pty.c:534 src/exec_pty.c:541 +#: src/exec_pty.c:826 src/exec_pty.c:877 src/tgetpass.c:221 +#, c-format +msgid "unable to create pipe" +msgstr "ezin da pipe bat sortu" + +#: src/exec.c:319 src/exec_pty.c:944 src/exec_pty.c:1077 +#, c-format +msgid "select failed" +msgstr "select-ek huts egin du" + +#: src/exec.c:387 +#, c-format +msgid "unable to restore tty label" +msgstr "" + +#: src/exec_pty.c:136 +#, c-format +msgid "unable to allocate pty" +msgstr "" + +#: src/exec_pty.c:566 +#, c-format +msgid "unable to set terminal to raw mode" +msgstr "" + +#: src/exec_pty.c:858 +#, c-format +msgid "unable to set controlling tty" +msgstr "" + +#: src/exec_pty.c:952 +#, c-format +msgid "error reading from signal pipe" +msgstr "errorea seinale hoditik irakurtzean" + +#: src/exec_pty.c:971 +#, c-format +msgid "error reading from pipe" +msgstr "errorea hoditik irakurtzean" + +#: src/exec_pty.c:987 +#, c-format +msgid "error reading from socketpair" +msgstr "errorea socketpair-etik irakurtzean" + +#: src/exec_pty.c:991 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "espero ez zen erantzun moeta backchannel-ean: %d" + +#: src/load_plugins.c:154 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: src/load_plugins.c:160 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:170 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s-(r)en jabeak %d uid-a behar du" + +#: src/load_plugins.c:174 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s jabeak bakarrik idazteko moduan behar du" + +#: src/load_plugins.c:181 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "ezin da %s-(r)engan dlopen egin: %s" + +#: src/load_plugins.c:186 +#, c-format +msgid "%s: unable to find symbol %s" +msgstr "%s: ezin da %s sinboloa aurkitu" + +#: src/load_plugins.c:192 +#, c-format +msgid "%s: unknown policy type %d" +msgstr "%s: %d arau moeta ezezaguna" + +#: src/load_plugins.c:196 +#, c-format +msgid "%s: incompatible policy major version %d, expected %d" +msgstr "" + +#: src/load_plugins.c:203 +#, c-format +msgid "%s: only a single policy plugin may be loaded" +msgstr "" + +#: src/load_plugins.c:221 +#, c-format +msgid "%s: at least one policy plugin must be specified" +msgstr "" + +#: src/load_plugins.c:226 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "" + +#: src/net_ifs.c:155 src/net_ifs.c:164 src/net_ifs.c:176 src/net_ifs.c:185 +#: src/net_ifs.c:295 src/net_ifs.c:319 +#, c-format +msgid "load_interfaces: overflow detected" +msgstr "load_interfaces: overflow-a atzeman da" + +#: src/net_ifs.c:224 +#, c-format +msgid "unable to open socket" +msgstr "ezin da socket-a ireki" + +#: src/parse_args.c:180 +#, c-format +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "-C argumentuak 3 edo zenbaki altuagoa behar du" + +#: src/parse_args.c:192 +#, c-format +msgid "the argument to -D must be between 1 and 9 inclusive" +msgstr "-D argumentua 1 eta 9 bitartean behar du, biak barne" + +#: src/parse_args.c:273 +#, c-format +msgid "unknown user: %s" +msgstr "erabiltzaile ezezaguna: %s" + +#: src/parse_args.c:332 +#, c-format +msgid "you may not specify both the `-i' and `-s' options" +msgstr "ez zenituzke `-i' eta `-s' aukerak batera erabili behar" + +#: src/parse_args.c:336 +#, c-format +msgid "you may not specify both the `-i' and `-E' options" +msgstr "ez zenitzuke `-i' eta `-E' aukerak batera erabili behar" + +#: src/parse_args.c:346 +#, c-format +msgid "the `-E' option is not valid in edit mode" +msgstr "`-E' aukera ez da onartzen edizio moduan" + +#: src/parse_args.c:348 +#, c-format +msgid "you may not specify environment variables in edit mode" +msgstr "ez zenuke ingurune aldagairik zehaztu beharko edizio moduan" + +#: src/parse_args.c:356 +#, c-format +msgid "the `-U' option may only be used with the `-l' option" +msgstr "`-U' aukera `-l' aukerarekin erabili beharko zenuke soilik" + +#: src/parse_args.c:360 +#, c-format +msgid "the `-A' and `-S' options may not be used together" +msgstr "`-A' eta `-S' aukerak ez lirateke batera erabili beharko" + +#: src/parse_args.c:418 src/sudo.c:398 src/sudo.c:418 src/sudo.c:426 +#: src/sudo.c:436 common/alloc.c:85 common/alloc.c:105 common/alloc.c:123 +#: common/alloc.c:145 common/alloc.c:203 common/alloc.c:217 +#, c-format +msgid "unable to allocate memory" +msgstr "ezin da memoria esleitu" + +#: src/parse_args.c:431 +#, c-format +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit-ek ez du euskarririk plataforma hontan" + +#: src/parse_args.c:502 +#, c-format +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Soilik -e, -h, -i, -K, -l, -s, -v edo -V aukeretako bat definitu beharko litzateke" + +#: src/parse_args.c:515 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - editatu fitxategia beste erabiltzaile bat bezala\n" +"\n" + +#: src/parse_args.c:517 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - exekutatu komandu bat beste erabiltzaile bat bezala\n" +"\n" + +#: src/parse_args.c:522 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Aukerak:\n" + +#: src/parse_args.c:525 +msgid "use helper program for password prompting\n" +msgstr "" + +#: src/parse_args.c:528 +msgid "use specified BSD authentication type\n" +msgstr "" + +#: src/parse_args.c:530 +msgid "run command in the background\n" +msgstr "" + +#: src/parse_args.c:532 +msgid "close all file descriptors >= fd\n" +msgstr "" + +#: src/parse_args.c:535 +msgid "run command with specified login class\n" +msgstr "" + +#: src/parse_args.c:538 +msgid "preserve user environment when executing command\n" +msgstr "" + +#: src/parse_args.c:540 +msgid "edit files instead of running a command\n" +msgstr "" + +#: src/parse_args.c:542 +msgid "execute command as the specified group\n" +msgstr "" + +#: src/parse_args.c:544 +msgid "set HOME variable to target user's home dir.\n" +msgstr "" + +#: src/parse_args.c:546 +msgid "display help message and exit\n" +msgstr "laguntza mezua erakutsi eta irten\n" + +#: src/parse_args.c:548 +msgid "run a login shell as target user\n" +msgstr "abiarazi login shell bat helburua den erabiltzaile moduan\n" + +#: src/parse_args.c:550 +msgid "remove timestamp file completely\n" +msgstr "ezabatu guztiz data-zigilu fitxategia\n" + +#: src/parse_args.c:552 +msgid "invalidate timestamp file\n" +msgstr "baliogabetu data-zigilu fitxategia\n" + +#: src/parse_args.c:554 +msgid "list user's available commands\n" +msgstr "zerrendatu erabiltzaileak eskuragarri dituen komandoak\n" + +#: src/parse_args.c:556 +msgid "non-interactive mode, will not prompt user\n" +msgstr "" + +#: src/parse_args.c:558 +msgid "preserve group vector instead of setting to target's\n" +msgstr "" + +#: src/parse_args.c:560 +msgid "use specified password prompt\n" +msgstr "" + +#: src/parse_args.c:563 src/parse_args.c:571 +msgid "create SELinux security context with specified role\n" +msgstr "" + +#: src/parse_args.c:566 +msgid "read password from standard input\n" +msgstr "" + +#: src/parse_args.c:568 +msgid "run a shell as target user\n" +msgstr "" + +#: src/parse_args.c:574 +msgid "when listing, list specified user's privileges\n" +msgstr "" + +#: src/parse_args.c:576 +msgid "run command (or edit file) as specified user\n" +msgstr "" + +#: src/parse_args.c:578 +msgid "display version information and exit\n" +msgstr "" + +#: src/parse_args.c:580 +msgid "update user's timestamp without running a command\n" +msgstr "" + +#: src/parse_args.c:582 +msgid "stop processing command line arguments\n" +msgstr "" + +#: src/selinux.c:75 +#, c-format +msgid "unable to open audit system" +msgstr "" + +#: src/selinux.c:85 +#, c-format +msgid "unable to send audit message" +msgstr "" + +#: src/selinux.c:112 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "ezin da %s-(r)engan fgetfilecon egin" + +#: src/selinux.c:117 +#, c-format +msgid "%s changed labels" +msgstr "" + +#: src/selinux.c:122 +#, c-format +msgid "unable to restore context for %s" +msgstr "" + +#: src/selinux.c:161 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "" + +#: src/selinux.c:170 +#, c-format +msgid "unable to get current tty context, not relabeling tty" +msgstr "" + +#: src/selinux.c:177 +#, c-format +msgid "unable to get new tty context, not relabeling tty" +msgstr "" + +#: src/selinux.c:184 +#, c-format +msgid "unable to set new tty context" +msgstr "" + +#: src/selinux.c:194 src/selinux.c:207 src/sudo.c:330 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: src/selinux.c:249 +#, c-format +msgid "you must specify a role for type %s" +msgstr "" + +#: src/selinux.c:255 +#, c-format +msgid "unable to get default type for role %s" +msgstr "" + +#: src/selinux.c:273 +#, c-format +msgid "failed to set new role %s" +msgstr "" + +#: src/selinux.c:277 +#, c-format +msgid "failed to set new type %s" +msgstr "" + +#: src/selinux.c:286 +#, c-format +msgid "%s is not a valid context" +msgstr "" + +#: src/selinux.c:320 +#, c-format +msgid "failed to get old_context" +msgstr "" + +#: src/selinux.c:326 +#, c-format +msgid "unable to determine enforcing mode." +msgstr "" + +#: src/selinux.c:338 +#, c-format +msgid "unable to setup tty context for %s" +msgstr "" + +#: src/selinux.c:367 +#, c-format +msgid "unable to set exec context to %s" +msgstr "" + +#: src/selinux.c:374 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "" + +#: src/sesh.c:48 +msgid "requires at least one argument" +msgstr "gutxienez argumentu bat behar du" + +#: src/sesh.c:64 +#, c-format +msgid "unable to execute %s" +msgstr "ezin da %s exekutatu" + +#: src/sudo.c:192 +#, c-format +msgid "must be setuid root" +msgstr "root setuid-a behar du" + +#: src/sudo.c:210 +#, c-format +msgid "Sudo version %s\n" +msgstr "%s sudo bertsioa\n" + +#: src/sudo.c:212 +#, c-format +msgid "Configure options: %s\n" +msgstr "Konfigurazio aukerak: %s\n" + +#: src/sudo.c:217 +#, c-format +msgid "fatal error, unable to load plugins" +msgstr "errore larria, ezin dira gehigarriak gehitu" + +#: src/sudo.c:225 +#, c-format +msgid "unable to initialize policy plugin" +msgstr "" + +#: src/sudo.c:280 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "errorea %s I/O plugina abiaraztean" + +#: src/sudo.c:307 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "" + +#: src/sudo.c:356 +#, c-format +msgid "unable to get group vector" +msgstr "" + +#: src/sudo.c:394 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "" + +#: src/sudo.c:734 +#, c-format +msgid "resource control limit has been reached" +msgstr "" + +#: src/sudo.c:737 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "" + +#: src/sudo.c:741 +#, c-format +msgid "the invoking task is final" +msgstr "" + +#: src/sudo.c:744 +#, c-format +msgid "could not join project \"%s\"" +msgstr "ezin izan da \"%s\" proiektura batu" + +#: src/sudo.c:749 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "" + +#: src/sudo.c:753 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "" + +#: src/sudo.c:757 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "" + +#: src/sudo.c:763 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject-ek huts egin du \"%s\" proiektuarentzat" + +#: src/sudo.c:765 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "" + +#: src/sudo.c:791 +#, c-format +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "" + +#: src/sudo.c:895 +#, c-format +msgid "unknown login class %s" +msgstr "" + +#: src/sudo.c:902 src/sudo.c:905 +#, c-format +msgid "unable to set user context" +msgstr "" + +#: src/sudo.c:916 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "" + +#: src/sudo.c:921 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "" + +#: src/sudo.c:929 src/sudo.c:935 +#, c-format +msgid "unable to set supplementary group IDs" +msgstr "" + +#: src/sudo.c:943 +#, c-format +msgid "unable to set process priority" +msgstr "" + +#: src/sudo.c:951 +#, c-format +msgid "unable to change root to %s" +msgstr "" + +#: src/sudo.c:961 src/sudo.c:967 src/sudo.c:973 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "" + +#: src/sudo.c:987 +#, c-format +msgid "unable to change directory to %s" +msgstr "" + +#: src/sudo.c:1078 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "" + +#: src/sudo.c:1118 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "" + +#: src/sudo.c:1129 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "" + +#: src/sudo.c:1140 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "" + +#: src/sudo_edit.c:108 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "ezin da uid-a root-era aldatu (%u)" + +#: src/sudo_edit.c:140 +#, c-format +msgid "plugin error: missing file list for sudoedit" +msgstr "" + +#: src/sudo_edit.c:172 src/sudo_edit.c:280 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: ez da fitxategi normala" + +#: src/sudo_edit.c:206 src/sudo_edit.c:316 +#, c-format +msgid "%s: short write" +msgstr "" + +#: src/sudo_edit.c:281 +#, c-format +msgid "%s left unmodified" +msgstr "" + +#: src/sudo_edit.c:294 +#, c-format +msgid "%s unchanged" +msgstr "%s aldatugabea" + +#: src/sudo_edit.c:306 src/sudo_edit.c:327 +#, c-format +msgid "unable to write to %s" +msgstr "ezin da %s-(e)ra idatzi" + +#: src/sudo_edit.c:307 src/sudo_edit.c:325 src/sudo_edit.c:328 +#, c-format +msgid "contents of edit session left in %s" +msgstr "" + +#: src/sudo_edit.c:324 +#, c-format +msgid "unable to read temporary file" +msgstr "ezin da aldi baterako fitxategia irakurri" + +#: src/tgetpass.c:95 +#, c-format +msgid "no tty present and no askpass program specified" +msgstr "ez dago tty-rik eta askpass aplikazioa zehaztu gabe" + +#: src/tgetpass.c:104 +#, c-format +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "ez da askpass aplikaziorik zehaztu, saiatu SUDO_ASKPASS ezartzen" + +#: src/tgetpass.c:234 +#, c-format +msgid "unable to set gid to %u" +msgstr "ezin da %u gid-a ezarri" + +#: src/tgetpass.c:238 +#, c-format +msgid "unable to set uid to %u" +msgstr "ezin da %u uid-a ezarri" + +#: src/tgetpass.c:243 +#, c-format +msgid "unable to run %s" +msgstr "ezin da %s exekutatu" + +#: src/utmp.c:263 +#, c-format +msgid "unable to save stdin" +msgstr "ezin da stdin-era gorde" + +#: src/utmp.c:265 +#, c-format +msgid "unable to dup2 stdin" +msgstr "ezin da stdin-era dup2 egin" + +#: src/utmp.c:268 +#, c-format +msgid "unable to restore stdin" +msgstr "ezin da stdin-era leheneratu" + +#: common/aix.c:144 +#, c-format +msgid "unable to open userdb" +msgstr "ezin da userdb-a ireki" + +#: common/aix.c:147 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "ezin da \"%s\" erregistrora aldatu %s-(r)entzat" + +#: common/aix.c:161 +#, c-format +msgid "unable to restore registry" +msgstr "ezin da erregistroa leheneratu" + +#: common/alloc.c:82 +#, c-format +msgid "internal error, tried to emalloc(0)" +msgstr "barne errorea, emalloc(0) egiteko saiakera egon da" + +#: common/alloc.c:99 +#, c-format +msgid "internal error, tried to emalloc2(0)" +msgstr "barne errorea, emalloc2(0) egiteko saiakera egon da" + +#: common/alloc.c:101 +#, c-format +msgid "internal error, emalloc2() overflow" +msgstr "barne errorea, emalloc2() overflow-a" + +#: common/alloc.c:119 +#, c-format +msgid "internal error, tried to erealloc(0)" +msgstr "barne errorea, erealloc(0) egiteko saiakera egon da" + +#: common/alloc.c:138 +#, c-format +msgid "internal error, tried to erealloc3(0)" +msgstr "barne errorea, erealloc3(0) egiteko saiakera egon da" + +#: common/alloc.c:140 +#, c-format +msgid "internal error, erealloc3() overflow" +msgstr "barne errorea, erealloc3(0) overflow-a" + +#: compat/strsignal.c:47 +msgid "Unknown signal" +msgstr "Seinale ezezaguna" diff --git a/utsudo-0.0.2/po/fi.mo b/utsudo-0.0.2/po/fi.mo new file mode 100644 index 0000000000000000000000000000000000000000..81381db98a2e36b55bd4689225adf0784f795318 GIT binary patch literal 19829 zcmb`Od5|1eea9Ox29|&?u#JtOeXJ#6%~}VxfL?-ksj*=^jsa zuQVKqLree%0wJ7nY~mo|n2>-m(H}U)k)=YYN;pzQ6}S>&C@LwSDj`)dN0JKpeBXOL z(>*i0GQ?AQ`<Zbni2u=>IY( zdVUCQ1y6yPbHVGt&0y2v2f_3B{CA+}`~kQIJmn0}djq%y+yXuV&VWAz`RAR(CVg-Q z)cAd%_|S3qR)-IOqT^9;BlyqY%fZuL=y@*#cZ2J|JHac#dqL6p7sPXGq2cY_0z~tKJ z9&iJggPXvQf|~D}p!W52h?E?*f{^AN0hz*k56ITMPk>tQ%b*WF4nmUmw3pg-&I7gY zo#6H0Ja{GeFo-CE~tKQ0r}_M&mZac=Rnc<6;S&+ ziN!?cC7|?cH>mv|1-0J2AV-_{2-KV46n(t+x&f#v5sl8W&I!}F2`??<#A0Gj=-q%3Q`){BRo*n9E7FbG#@m67byB}2et2`pvK<=iXV@F(t|I%@Bb5& zT+f4)=O=zCWL9I6r?gsAxrC(nMpA9|^o(z5;ycYZsD0;VYSjGP~C_8u$ zD8Akg-UNOc)V`m=;nnjqKt$xN0kw}CK=JiWpy+!96#f6?@C6X3`S&_p1jX;SgMS4+ z3LXNFGTAKnO;CI|gHCMGYk<;+*MO39AB2_OF^7K-ijE(H*Mn==)D2({lzcu1ZUz4b zya~Jv<0tvw4eI#=pyvBFhzfYm!uag~XTa0I9=Hv>8`Qb@JeYw02wn&7W%E11_kvpg zTOeEVE`kZ-%Rx|d-vf%yzXY|u_ipfN@U!3*;LkzPc?Fx$JWHVV z^8kOu*T+EV>CZsP#1@8d0&ZFRqz@LF^)jIE?FKbZ z0m4e}4?wN^51{D$DJc5ZvbnRs+rd|X1*qp=0?!A30*XH`dZqoo1xjB&2m5( z;g9xn5lWL-WG5kJOqjlf8+28@YQ_22qPf*y%Cf?JOXOJ{|ajTvrum7 z!7k9~9jJZ}xbMH=zCRhEh@Oq0)-OP<_hC?UeFZ!R{BKb5J(EMCbuS0SuMQ}E_#~+L zzY9uEXYO_K2gT0}Tnl~})VzNSo&i4L@HsbFeLD}lmG5tJ_z4hFy_0Wrb{%{gpUW5Q z_1d&wquoi9ERN8`JH7sp_N%lH(*B6{4%+i*FQgryolWb}7HEG=yNLFiw4*e=e#3%y zw?l#U$?-AqvOb?qlT1EFLyX>U(ex7k5toTKZUz%tKzlCjA=uASlr_eq?lT6=E zyMtDJ-Ny&nv-@eUcMskJ{+WB<1fM~Zj(m#tPMTi7P77($-QS~~M0+po1vI^Wn>I&_ zXj8N;G`;#X>GeId7VRe5?X*9qjlQI>dOe-C&%DDPITZXp?MCnn`mojZ=h9QJ|E7f{SNI~nqF&Zmzj6NKQDK0-w5t?@1F@iNPCX^ zESRR9MthicF0J}{v-|KWPO=o_?51Uc$&qr~X`2qiuG;f7HzsSPgRN3QbI9KGMANX@= zrxPU2$sOlfL9!4w{Wv%r#+fFMGJm0$7G3{HFUo_%ap=Be4NcYxdcj=IV$ElOxnFEd-tUH9Gs?O#d~1bq*YB{oU;&P>jqqrc51y7h zj1o4{31kF@ohnu!O0ql*n&MWkND}GF;N*MZ{5)HaP+RG%Q?Tjgdc8$!HKmn9)@PQE z-J&#nO_F8|S>psPHJ9Xr#J_3xfw3WJ0pnBYZZBHGHZ6qNRjaO@NlQdIiom&d=SfpA zuGeEFBj@$fb}Rs=zQweDoCZy8up1W(bTASfbPt!pB&SQ-9ZbQg!`8fBL-t&{uN;Q{ z*g?q7OgG<4JARhVwZps{L_KdlU@@ar3)*(vJX9L1;S(_=36B^pkVcL_k*w_#cIlfH z*JCGSSf#Mqi=!y>I2&nCWHyT~hg@n{Az1qyVaTKrUD=0zxyw}tJ&CRfyvLMcTd@VD z$`0jgj+Wex7bWqjp)DY%6#uli%J<1Vopoe8BIV81Y z;C!4OVQT9u_6M9i-WH*ed7T%;fmdn%{d(Q zYF#?PQR@n`Ro62V4OX}G$>OkuaqbVulyLKibDsyDt~pAc;k1~!CaWAF9k{txIM?Qo zI%Nzs(EE{GLgUs4$)UamK zFe*T7Av9RtAuVSxF&vPGw0#@^B)KiM((apV8T`{Nl(9%%MEj0U>htifGP*p9P(rJs%x zXLpU$@{B6<5UmX^mrS(75gxd$QWud)9`rD|YqH^>f#Od(+?9ShJ$|*%kye-tJfai3 zCyVdvTo6k(eQWn~bTr^olyr-n9v#fj$N`nwbmK4&<31hkEC|_9Ok@@Ym`KG<&|S#x z@Yuy4av6jO$dzc0&@m$#6-8kHN1GnLdZ3JJ(XfF>U#D<=a9T}d@5_eC8tmCw8%IYI zjh08-ad?H^m|OKe9L%*PiKI>gp+GBTGi#%HwB4vA#+snn9*=dkg-s+>U;32?cH+|H zmFHskYr5Od8F5amO=*A?u-VnN%5l{B4dN_S#6H-&nd6rqjXJhwk!sbw%=&2)i(o9i zA|~8cEAwp6p=)+Q9RU$1Gr(G!xP8#g##$7{~Gf-r+Pi%TCMScYO z>RX1K?$C@G(82amm1-zEFf_*UjvL-APrEXjbBdO+Bc-J?5mc$3?A2MaG8i1n8V$%> zoPJ`{TzTN-DrJLD#@tziMOb|p$Ek_uIvAE- zf6|jKiSuwan@37pjG^p{5aP?R4kq4S;Td0JUpR7#`qwI*o-WpnPobyks>q#QwH|4g zAVF&DGQyF=V9baHBgLo(*CLKSTr-;`RjDqfss10sjdc8OMCMdsg8kM8?N#nHvC>l8 z5NCiE&q;97pP9kD=V32a{0}}m2c4r6uM@$$DU%MC_&6sW#C-? z{+svQdT9U6`*s}Kb=$5THaIZf-LU7zJqK$OVQYy>ove&0uI&%QZ96!@5^NX)GC0!{ zCd2kLV~ndLX-g$!N)!4~-62q{8Ip3jQOzyCmyAu7t~wpzN1bN#g((#}KW;p4Wk{y# z*NMn9okj^E6QBrbB)oFDCY^;Q;eVDX$tIHj~EPbysNs9GnXpYvmb zO28a79i3MjWjKzhQko`Y<5K=X*IwAAKxs@Jj8zCLH<^U-Xh&06lD+pg9GyPO6gF6^ zM5dNB`?br_Y^8>Lpi-77M-Hoi3Tyof=32c&viujUV7=_b;_Y-XOWBG{98=Lxi>n}J z7;IUgx%h5Uv7qQS6?sV*1dzjefkJOnZX2uh(Upi=MMcaA8f4Ob$zqW2@FgiVhs;yo zVW6qlJt*+xNv_(HBq5fVUW)04Jx8WekDl{$HVY2O5LHew!F9FpYO5o8O5sa6o;UoQ zbtnRQM}nSem+Oa7uQLjmB-uk#)LAKJhP{Ij(-KQnnwt?tCq$%C8Ica+%*=bTL$WfI zoIIqOah4?~s`J&r)vTmjiITFwx@w8WYF_5;x2$UHX*O=PwR6h$s*!G-**ddnZmhx!+Wb{7o|(W;RcGQ@2uy z&NGswyu8Zm6luF11RU$CBk^<;`AJ$Q$sKxI8&w z|4va*55#G7mDIQPTo@9kHaV%BOD%S8+{Tx!%yx?^0X7Qv#7EFiCrujNzyr-<$8%< zpKXjFx(-Gfn{Fz3b)v`n`0NDjWIzM;(|UtR0=|b>vm+y*0CGu}CfypAj9i4Nc5g*i zCzz`vBC>WU_NDsZq>)J$tRlf;NbJ=i^)}V?6U1AcaN>|vr8?`!{Z^k~$Er|~dDm#S z85&S(xUWmaTgB==a)9afiKOhWa<`ZVkuDdP(x@4bi=(E?#}qrnG1_|o)7G$83TFC) z1=hiE&j!q_L3JZu4E=TxvB`lVwu_|z<;u$o#*&v%gA+wIS(Ggwi}U5<{y>-7DJrU~ zIhOJWHQMb^x^I0Q+=0ZrU|^o2v{VL*3{z3`a8-DLfWsM-qcR;B&LVt2aB z$5I(gw8V>xw7hj}P^VrB8pA_UWkO$kP`Vz=*8j4@FerVF7X@H!KR$wFC6dN=u{|he z`Pg#W=wM!XJi%xgb7c5v>=V}-GGZ`ikp%)TCmM5Szhc(Jde$RNw{}ODl4;UbjEKj# zhh!i@#L`=Y&M-zLGK96>Uo`rT@V3p9Xn-=ZY>*w^HiP9k79l! zVQL@^N8a%?YKH}S8(j5^5^sDq_L$I8r*_9lQX8q@(+fS7@1OxQic^e=KX&61Ra-xwz1h_lJ0`d z{$;%gR)R@0r!BcO*^UYOb;q!cYe3c8LAM)lqF3O(H=GJ*3wNmf=kU5@-cvf6wGS&% zVuTaMX^vY)yd)m(1lKf*qE5vtg2@-N>5BA?@aVc3@1Y5vI*liWW&AT+qhL z$NPCdBGNEs5UY)<7&B?4X_SVdV%F%#(NdA-snw(Moa?@}Vcc7>h%qCUTy2L%eQ>{n zZItpYA1|j+5MnN9&BEm>CBK|~r>Y1(3F1sn-kKqeAW0xD5<s;VScqn2o#qhU@d&7{Z3faaS7nWeBFlxwNoIU*q@yWy!zCsvM9wJSPIUsK) z*fWk#EF#h<1%iWi2HR-utlw2YUf>nn70kdPl?U9LOot85ZIGe>pn4|gPjuqZg8+{3P1nsQT&{G)iuaaQ?LFMrckjBdx-~wYV0YCZii;T+ z%^AOEVi5U4^eDn|OZ80NvlO<;b4$xcpkP1q+W@2D_0VNFxD((H6^Ih|PB2h;Wu1ze zReBDzqM|JF>O^rASlp2$Y-vYn)?Yp@4aNcCuJ9uN|d-i*&nz}hxUv2puaBE&Lez;qS_@atBgCAPserLczb z8jf{=E)bbxt*eU-pEr@={jck z*rfI8%&qr`tH$=Eal23=sklz2(Gr1z*~@QPO585GMxW9%sXrW;5W%@Y!wk%Zk<(32 z$0#uO;e!CcPl>m%jhrET&M2SwCXWV5EUEB3rB`Z@3Z5xgnxAftd75hWH1^OHG6rnP z`_i(}^epBM2}&I|6>*oxh3!KpiH3fK%P&4kdtIg~m{SG!95v%ut-XJlZHG1{n;>(b(YEatw(HT;pA*ZTu{kB3=G(FNzXm{{jpuCW}d^yj|D zF4tM!w_0i`6I~ZL4hFGp4ZB6dSit1kl|_tSENO!k>Km(Xo4T3O3r9AOxK1y*M&yWE zl~tCiG1~0mku&)|YIrU9gQ-$qbC2Fo8bBTZI}~1lCOe zODfx*ln8LAKD+W$6A^@x6nkws%^c{UDi#Ehx)v{!HdBZzJDU)=jPZ@y|BXH@yqKd_2&+#t zxyOl_Yi`&ZwOSdJPhL(Jcg@2!>l2YlVBwV*t}tkDw9$YvM$lg(`V7}WCy#?-%g0ykR;Cp;&p(l= zIbrWgsMN4guWBZ>EsSu={PzyB4J**qI91!b@h|nUwNMyz3~1{0K!+6Fle z8f{H^nd6NqD^U;?)GWY0skiP}t(_UTR1Sqp5H)zzlTR36qJpB%o}oE&lbK4TDIOGA zMVoCz;Z5wm;!@s(Cr=60BSNk5LI0_11?8VeJ;G3$h|1bR3uxQe&QBJe9daIS}nliR9yd{{5+>(hR|SBt*j6*$y7QEtZ0wL+;!i?)kq#C1S<@(0IJFK)6J%DlOk*W zTDj`8{8x_3a}&1VT}>Jw^H^|;k)S7JRAZf$icvP>QrP^whtpYJ0gfc?ZBwzXJg+%+ zx7alQ`*l*GyE4pN$DyrU)YpFdgJxI*95u-z#&5>r_=J!Eu_G${I+%(CJ8je{F zm09CwOsiIv6~ix?0&PW-=ucT<9x4cT;)7h5OC4pD&>eIOSN&Bn$d-kzv*;&-PQ!AA zNu*UF(Uo43ltLpNEhil5JD4+Und=3&GE3t~T|wSv>n@3RddX9KrDtmFiXoy1qns7| zcg&IRx}@rnM-r&(SpI)%eVQ`omlr59Q-$CLy>?78)ojS5+|9L3b|WRb#-)rtF`0I` zNs0qy;A1zzc9}=l?!Vx)nHGE!(^l$ZnB literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/fi.po b/utsudo-0.0.2/po/fi.po new file mode 100644 index 0000000..8b19fd6 --- /dev/null +++ b/utsudo-0.0.2/po/fi.po @@ -0,0 +1,962 @@ +# Finnish messages for sudo. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# Jorma Karvonen , 2011-2017. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.21b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-08-03 10:04-0600\n" +"PO-Revision-Date: 2017-08-19 20:33+0300\n" +"Last-Translator: Jorma Karvonen \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.0.3\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "userdb-käyttäjätietokannan avaaminen epäonnistui" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "vaihtaminen registeröitymiseen \"%s\" käyttäjälle %s epäonnistui" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "rekisteröitymisen palauttaminen epäonnistui" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:186 lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 +#: lib/util/sudo_conf.c:553 src/conversation.c:75 src/exec_common.c:107 +#: src/exec_common.c:123 src/exec_common.c:132 src/exec_monitor.c:167 +#: src/exec_nopty.c:462 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/exec_pty.c:867 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:198 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:663 src/sudo.c:673 src/sudo.c:693 src/sudo.c:712 src/sudo.c:721 +#: src/sudo.c:730 src/sudo.c:747 src/sudo.c:788 src/sudo.c:798 src/sudo.c:818 +#: src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 src/sudo.c:1351 +#: src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:187 +#: lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 lib/util/sudo_conf.c:553 +#: src/conversation.c:76 src/exec_common.c:107 src/exec_common.c:124 +#: src/exec_common.c:133 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:199 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:818 src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 +#: src/sudo.c:1351 src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +msgid "unable to allocate memory" +msgstr "muistin varaaminen epäonnistui" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Tuntematon signaali" + +#: lib/util/strtoid.c:77 lib/util/strtoid.c:124 lib/util/strtoid.c:152 +#: lib/util/strtomode.c:49 lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "virheellinen arvo" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:55 lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "arvo on liian suuri" + +#: lib/util/strtoid.c:86 lib/util/strtoid.c:137 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:182 +msgid "value too small" +msgstr "arvo on liian pieni" + +#: lib/util/sudo_conf.c:205 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "virheellinen Path-muuttuja-arvo \"%s\" tiedostossa %s, rivi %u" + +#: lib/util/sudo_conf.c:371 lib/util/sudo_conf.c:424 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "virheellinen arvo kohteelle %s \"%s\" tiedostossa %s, rivi %u" + +#: lib/util/sudo_conf.c:392 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "tukematon ryhmälähde \"%s\" tiedostossa %s, rivi %u" + +#: lib/util/sudo_conf.c:408 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "virheellinen ryhmien \"%s\" enimmäismäärä tiedostossa %s, rivi %u" + +#: lib/util/sudo_conf.c:569 +#, c-format +msgid "unable to stat %s" +msgstr "käskyn stat %s suorittaminen epäonnistui" + +#: lib/util/sudo_conf.c:572 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ei ole tavallinen tiedosto" + +# ensimmäinen parametri on path +#: lib/util/sudo_conf.c:575 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "polun %s omistaja on %u, pitäisi olla %u" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is world writable" +msgstr "%s on yleiskirjoitettava" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is group writable" +msgstr "%s on ryhmäkirjoitettava" + +#: lib/util/sudo_conf.c:592 src/selinux.c:208 src/selinux.c:225 src/sudo.c:357 +#, c-format +msgid "unable to open %s" +msgstr "kohteen %s avaaminen epäonnistui" + +#: src/exec.c:160 +#, c-format +msgid "unknown login class %s" +msgstr "tuntematon kirjautumisluokka %s" + +#: src/exec.c:173 +msgid "unable to set user context" +msgstr "käyttäjäasiayhteyden asettaminen epäonnistui" + +#: src/exec.c:189 +msgid "unable to set process priority" +msgstr "prosessiprioriteetin asettaminen epäonnistui" + +#: src/exec.c:197 +#, c-format +msgid "unable to change root to %s" +msgstr "root-käyttäjän vaihtaminen käyttäjäksi %s epäonnistui" + +#: src/exec.c:210 src/exec.c:216 src/exec.c:223 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "ei kyetä vaihtamaan suoritettavaksi uid-käyttäjätunnisteeksi (%u, %u)" + +# parametrina on CWD- eli Change Working Directory- komennolla palautettava hakemisto +#: src/exec.c:241 +#, c-format +msgid "unable to change directory to %s" +msgstr "ei kyetä vaihtamaan hakemistoksi %s" + +#: src/exec.c:337 src/exec_monitor.c:526 src/exec_monitor.c:528 +#: src/exec_nopty.c:520 src/exec_pty.c:472 src/exec_pty.c:1184 +#: src/exec_pty.c:1186 src/signal.c:139 src/signal.c:153 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "käsittelijän asettaminen signaalille %d epäonnistui" + +# Solaris privileges, remove PRIV_PROC_EXEC post-execve. +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "kohteen PRIV_PROC_EXEC poistaminen kohteesta PRIV_LIMIT epäonnistui" + +#: src/exec_monitor.c:326 +msgid "error reading from socketpair" +msgstr "virhe luettaessa vastakeparista" + +#: src/exec_monitor.c:338 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "odottamaton vastaustyyppi paluukanavalla: %d" + +#: src/exec_monitor.c:423 src/exec_monitor.c:431 src/exec_monitor.c:439 +#: src/exec_monitor.c:446 src/exec_monitor.c:453 src/exec_monitor.c:460 +#: src/exec_monitor.c:467 src/exec_monitor.c:474 src/exec_monitor.c:481 +#: src/exec_monitor.c:488 src/exec_nopty.c:215 src/exec_nopty.c:224 +#: src/exec_nopty.c:231 src/exec_nopty.c:238 src/exec_nopty.c:245 +#: src/exec_nopty.c:252 src/exec_nopty.c:259 src/exec_nopty.c:266 +#: src/exec_nopty.c:273 src/exec_nopty.c:280 src/exec_nopty.c:287 +#: src/exec_nopty.c:294 src/exec_nopty.c:302 src/exec_pty.c:563 +#: src/exec_pty.c:568 src/exec_pty.c:635 src/exec_pty.c:642 src/exec_pty.c:743 +#: src/exec_pty.c:1029 src/exec_pty.c:1038 src/exec_pty.c:1045 +#: src/exec_pty.c:1052 src/exec_pty.c:1059 src/exec_pty.c:1066 +#: src/exec_pty.c:1073 src/exec_pty.c:1080 src/exec_pty.c:1087 +#: src/exec_pty.c:1094 src/exec_pty.c:1101 src/exec_pty.c:1446 +#: src/exec_pty.c:1456 src/exec_pty.c:1501 src/exec_pty.c:1508 +#: src/exec_pty.c:1533 +msgid "unable to add event to queue" +msgstr "tapahtuman lisääminen jonoon epäonnistui" + +# Istunnolla voi olla ohjaava tty. Istunnon yksi prosessiryhmä voi olla edustaprosessiryhmä ja toimia siten ohjaavana tty:nä, joka vastaanottaa tty-syötteen ja -signaalit. +#: src/exec_monitor.c:540 +msgid "unable to set controlling tty" +msgstr "ohjaavan tty:n asettaminen epäonnistui" + +#: src/exec_monitor.c:548 src/exec_nopty.c:359 src/exec_pty.c:1261 +#: src/exec_pty.c:1280 src/exec_pty.c:1298 src/tgetpass.c:246 +msgid "unable to create pipe" +msgstr "putken luominen epäonnistui" + +#: src/exec_monitor.c:553 src/exec_nopty.c:377 src/exec_pty.c:1335 +#: src/tgetpass.c:250 +msgid "unable to fork" +msgstr "fork-kutsu epäonnistui" + +#: src/exec_monitor.c:639 src/exec_nopty.c:430 +msgid "unable to restore tty label" +msgstr "tty-nimiön palauttaminen epäonnistui" + +#: src/exec_nopty.c:353 src/exec_pty.c:1193 +msgid "policy plugin failed session initialization" +msgstr "menettelytapalisäosa epäonnistui istunnon alustamisessa" + +#: src/exec_nopty.c:419 src/exec_pty.c:1404 +msgid "error in event loop" +msgstr "virhe tapahtumasilmukassa" + +#: src/exec_nopty.c:528 src/exec_pty.c:504 src/signal.c:101 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "käsittelijän palauttaminen signaalille %d epäonnistui" + +#: src/exec_pty.c:143 +msgid "unable to allocate pty" +msgstr "pty:n varaaminen epäonnistui" + +#: src/exec_pty.c:1173 +msgid "unable to create sockets" +msgstr "vastakkeiden luominen epäonnistui" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "virhe tiedostossa %s, rivi %d alustettaessa lisäosaa \"%s\"" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +# ensimmäinen parametri on path +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "polun %s omistajan on oltava uid %d" + +# parametri on path +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "polun %s on oltava vain omistajan kirjoitettava" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "kohteen %s lataaminen epäonnistui: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "symbolin \"%s\" löytäminen kohteesta %s epäonnistui" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "tuntematon menettelytapatyyppi %d löytyi kohteesta %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "yhteensopimaton lisäosan major-versio %d (odotettiin %d) löytyi kohteesta %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ohitetaan menettelytapalisäosa \"%s\" tiedostossa %s, rivi %d" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "vain yksi menettelytapalisäosa voidaan määritellä" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ohitetaan menettelytapalisäosan \"%s\" kaksoiskappale tiedostossa %s, rivi %d" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ohitetaan siirräntälisäosan \"%s\" kaksoiskappale tiedostossa %s, rivi %d" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "menettelytapalisäosa %s ei sisällä check_policy-metodia" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:476 +#, c-format +msgid "internal error, %s overflow" +msgstr "sisäinen virhe, %s-ylivuoto" + +#: src/parse_args.c:219 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "virheellinen ympäristömuuttujanimi: %s" + +#: src/parse_args.c:313 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "valitsimen -C argumentin on oltava vähintään 3" + +#: src/parse_args.c:480 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "sekä valitsimen ”-i” että valitsimen ”-s” määritteleminen ei ole sallittua" + +#: src/parse_args.c:484 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "sekä valitsimen ”-i” että valitsimen ”-E” määritteleminen ei ole sallittua" + +#: src/parse_args.c:494 +msgid "the `-E' option is not valid in edit mode" +msgstr "valitsin ”-E” ei ole kelvollinen muokkaustilassa" + +#: src/parse_args.c:496 +msgid "you may not specify environment variables in edit mode" +msgstr "ympäristömuuttujien määritteleminen muokkaustilassa ei ole sallittua" + +#: src/parse_args.c:504 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "valitsinta ”-U” voidaan käyttää vain valitsimen ”-l” kanssa" + +#: src/parse_args.c:508 +msgid "the `-A' and `-S' options may not be used together" +msgstr "valitsimia ”-A” ja ”-S” ei voi käyttää yhdessä" + +#: src/parse_args.c:584 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit ei ole tuettu tällä alustalla" + +#: src/parse_args.c:657 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Vain yksi valitsimista -e, -h, -i, -K, -l, -s, -v tai -V voidaan määritellä" + +#: src/parse_args.c:671 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - muokkaa tiedostoja toisena käyttäjänä\n" +"\n" + +#: src/parse_args.c:673 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - suorita komentoja toisena käyttäjänä\n" +"\n" + +#: src/parse_args.c:678 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Valitsimet:\n" + +#: src/parse_args.c:680 +msgid "use a helper program for password prompting" +msgstr "käytä apuohjelmaa salasanakyselyyn" + +#: src/parse_args.c:683 +msgid "use specified BSD authentication type" +msgstr "käytä määriteltyä BSD-todennustyyppiä" + +#: src/parse_args.c:686 +msgid "run command in the background" +msgstr "suorita komento taustalla" + +#: src/parse_args.c:688 +msgid "close all file descriptors >= num" +msgstr "sulje kaikki tiedostokuvaajat >= num" + +#: src/parse_args.c:691 +msgid "run command with the specified BSD login class" +msgstr "suorita komento määritellyllä BSD-kirjautumisluokalla" + +#: src/parse_args.c:694 +msgid "preserve user environment when running command" +msgstr "säilytä käyttäjäympäristö komentoa suoritettaessa" + +#: src/parse_args.c:696 +msgid "preserve specific environment variables" +msgstr "säilytä maaritellyt ympäristömuuttujat" + +#: src/parse_args.c:698 +msgid "edit files instead of running a command" +msgstr "muokkaa tiedostoja komennon suorittamisen sijasta" + +# tämä viittaa runas_group-määritelyyn +#: src/parse_args.c:700 +msgid "run command as the specified group name or ID" +msgstr "suorita komento määriteltynä ryhmänimenä tai tunnisteena" + +#: src/parse_args.c:702 +msgid "set HOME variable to target user's home dir" +msgstr "aseta HOME-muuttuja osoittamaan kohdekäyttäjän kotihakemistoon" + +#: src/parse_args.c:704 +msgid "display help message and exit" +msgstr "näytä opasteviesti ja poistu" + +#: src/parse_args.c:706 +msgid "run command on host (if supported by plugin)" +msgstr "suorita komento verkkokoneessa (jos lisäosa tukee)" + +#: src/parse_args.c:708 +msgid "run login shell as the target user; a command may also be specified" +msgstr "suorita kirjautumiskomentoikkuna kohdekäyttäjänä; komento voidaan myös määritellä" + +#: src/parse_args.c:710 +msgid "remove timestamp file completely" +msgstr "poista aikaleimatiedosto kokonaan" + +#: src/parse_args.c:712 +msgid "invalidate timestamp file" +msgstr "mitätöi aikaleimatiedosto" + +#: src/parse_args.c:714 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "luettele käyttäjä käyttöoikeudet ja tarkista määritelty komento; käytä kahdesti pitemmällä muodolla" + +#: src/parse_args.c:716 +msgid "non-interactive mode, no prompts are used" +msgstr "vuorovaikutteeton tila, ei kysy käyttäjältä" + +#: src/parse_args.c:718 +msgid "preserve group vector instead of setting to target's" +msgstr "säilytä ryhmävektori kohteen vektorin asettamisen sijasta" + +#: src/parse_args.c:720 +msgid "use the specified password prompt" +msgstr "käytä määriteltyä salasanakehotetta" + +#: src/parse_args.c:723 +msgid "create SELinux security context with specified role" +msgstr "luo SELinux-turva-asiayhteys määritellyllä roolilla" + +#: src/parse_args.c:726 +msgid "read password from standard input" +msgstr "lue salasana vakiosyötteestä" + +#: src/parse_args.c:728 +msgid "run shell as the target user; a command may also be specified" +msgstr "suorita komentotulkki kohdekäyttäjänä; myös komento voidaan määritellä" + +#: src/parse_args.c:731 +msgid "create SELinux security context with specified type" +msgstr "luo SELinux-turva-asiayhteys määritellyllä roolilla" + +#: src/parse_args.c:734 +msgid "terminate command after the specified time limit" +msgstr "päätä komento määrätyn aikarajan jälkeen" + +#: src/parse_args.c:736 +msgid "in list mode, display privileges for user" +msgstr "luettelotilassa, näytä käyttöoikeudet käyttäjälle" + +#: src/parse_args.c:738 +msgid "run command (or edit file) as specified user name or ID" +msgstr "suorita komento (tai muokkaa tiedostoa) määriteltynä käyttäjänimenä tai tunnisteena" + +#: src/parse_args.c:740 +msgid "display version information and exit" +msgstr "näytä versiotiedot ja poistu" + +#: src/parse_args.c:742 +msgid "update user's timestamp without running a command" +msgstr "päivitä käyttäjän aikaleima suorittamatta komentoa" + +#: src/parse_args.c:744 +msgid "stop processing command line arguments" +msgstr "lopeta komentoriviargumenttien käsittely" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "audit-järjestelmän avaaminen epäonnistui" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "audit-viestin lähettäminen epäonnistui" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "funktion fgetfilecon %s kutsuminen epäonnistui" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "%s muutti nimiöitä" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "asiayhteyden palauttaminen kohteelle %s epäonnistui" + +#: src/selinux.c:167 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "kohteen %s avaaminen epäonnistui, ei nimiöidä uudelleen tty:tä" + +#: src/selinux.c:171 src/selinux.c:212 src/selinux.c:229 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s ei ole merkkilaite, ei nimiöidä uudelleen tty:tä" + +#: src/selinux.c:180 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nykyisen tty-asiayhteyden hakeminen epäonnistui, ei nimiöidä uudelleen tty:tä" + +#: src/selinux.c:187 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "tuntematon turvaluokka \"chr_file\", ei nimiöidä uudelleen tty:tä" + +#: src/selinux.c:192 +msgid "unable to get new tty context, not relabeling tty" +msgstr "uuden tty-asiayhteyden hakeminen epäonnistui, ei nimiöidä uudelleen tty:tä" + +#: src/selinux.c:199 +msgid "unable to set new tty context" +msgstr "uuden tty-asiayhteyden asettaminen epäonnistui" + +#: src/selinux.c:273 +#, c-format +msgid "you must specify a role for type %s" +msgstr "tyypille %s on määriteltävä rooli" + +#: src/selinux.c:279 +#, c-format +msgid "unable to get default type for role %s" +msgstr "oletustyypin hakeminen roolille %s epäonnistui" + +#: src/selinux.c:297 +#, c-format +msgid "failed to set new role %s" +msgstr "uuden roolin %s asettaminen epäonnistui" + +#: src/selinux.c:301 +#, c-format +msgid "failed to set new type %s" +msgstr "uuden tyypin %s asettaminen epäonnistui" + +#: src/selinux.c:313 +#, c-format +msgid "%s is not a valid context" +msgstr "%s ei ole kelvollinen asiayhteys" + +#: src/selinux.c:348 +msgid "failed to get old_context" +msgstr "kohteen old_context hakeminen epäonnistui" + +#: src/selinux.c:354 +msgid "unable to determine enforcing mode." +msgstr "vahvistustilan määritteleminen epäonnistui." + +#: src/selinux.c:371 +#, c-format +msgid "unable to set tty context to %s" +msgstr "ei kyetä asettamaan tty-asiayhteydeksi %s" + +#: src/selinux.c:410 +#, c-format +msgid "unable to set exec context to %s" +msgstr "ei kyetä asettamaan suoritusasiayhteydeksi %s" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "ei kyetä asettamaan avaimenluontiasiayhteydeksi %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "vaatii vähintään yhden argumentin" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "virheellinen tiedostokuvaajanumero: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "salasanakyselyn %s suorittaminen komentorivi-ikkunassa epäonnistui" + +#: src/sesh.c:125 src/sudo.c:1117 +#, c-format +msgid "unable to execute %s" +msgstr "kohteen %s suorittaminen epäonnistui" + +#: src/signal.c:83 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "käsittelijän tallentaminen signaalille %d epäonnistui" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "resurssivalvontaraja saavutettu" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "käyttäjä \"%s\" ei ole hankkeen \"%s\" jäsen" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "kutsuttu tehtävä on final-tyyppinen" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "hankkeeseen \"%s\" liittyminen epäonnistui" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "hankkeelle \"%s\" ei ole oletusyhteydet hyväksyvää resurssivarantoa" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "hankkeelle \"%s\" ei ole määriteltyä resurssivarantoa" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "hankkeelle \"%s\" ei voitu sitoa oletusresurssivarantoa" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "funktio setproject hankkeelle \"%s\" epäonnistui" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "varoitus, hankkeen \"%s\" resurssiohjausosoitus epäonnistui" + +#: src/sudo.c:198 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo-versio %s\n" + +#: src/sudo.c:200 +#, c-format +msgid "Configure options: %s\n" +msgstr "Asetusvalitsimet: %s\n" + +#: src/sudo.c:208 +msgid "fatal error, unable to load plugins" +msgstr "vakava virhe, lisäosien lataaminen epäonnistui" + +#: src/sudo.c:216 +msgid "unable to initialize policy plugin" +msgstr "menettelytapalisäosan alustaminen epäonnistui" + +#: src/sudo.c:260 +msgid "plugin did not return a command to execute" +msgstr "lisäosa ei palauta suoritettavaa komentoa" + +#: src/sudo.c:276 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "virhe alustettaessa siirräntälisäosaa %s" + +#: src/sudo.c:299 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "odottamaton sudo-tila 0x%x" + +#: src/sudo.c:461 +msgid "unable to get group vector" +msgstr "ei kyetä hakemaan ryhmävektoria" + +#: src/sudo.c:523 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "tuntematon uid-käyttäjätunniste %u: kuka olet?" + +#: src/sudo.c:579 +msgid "unable to determine tty" +msgstr "tty:n määritteleminen epäonnistui" + +# ensimmäinen parametri on path +#: src/sudo.c:867 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "polun %s omistajan on oltava uid %d ja setuid-bitin on oltava asetettu" + +#: src/sudo.c:870 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "todellinen käyttäjätunniste ei ole %d, onko %s asetettu tiedostojärjestelmässä, jossa on ’nosuid’-valitsin vai onko tämä NFS-tiedostojärjestelmä ilman root-käyttöoikeuksia?" + +#: src/sudo.c:876 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "todellinen käyttäjätunniste ei ole %d, onko sudo asennettu setuid root -käyttöoikeuksilla?" + +#: src/sudo.c:929 +msgid "unable to set supplementary group IDs" +msgstr "lisäryhmätunnisteiden asettaminen epäonnistui" + +# tämän ymmärrän niin, että käyttöjärjestelmäydin luo tiedoston ja antaa tälle tavallaan tilapäisen effective gid-tunnisteen, joka vaihdetaan suorittamisen yhteydessä prosessin omistajan suoritettavaksi ryhmätunnisteeksi. +#: src/sudo.c:936 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "voimassaolevan gid-ryhmätunnisteen asettaminen suoritettavaksi gid-ryhmätunnisteeksi %u epäonnistui" + +#: src/sudo.c:942 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "gid-ryhmätunnisteen asettaminen suoritettavaksi gid-ryhmätunnisteeksi %u epäonnistui" + +#: src/sudo.c:999 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "lapsiprosessin odottamaton päättymisehto: %d" + +#: src/sudo.c:1145 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "menettelytapalisäosa %s ei sisällä ”check_policy”-metodia" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "menettelytapalisäosa %s ei tue luettelointikäyttöoikeuksia" + +#: src/sudo.c:1180 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "menettelytapalisäosa %s ei tue valitsinta -v" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "menettelytapalisäosa %s ei tue valitsimia -k/-K" + +#: src/sudo_edit.c:178 src/sudo_edit.c:267 +msgid "unable to restore current working directory" +msgstr "nykyisen työhakemiston palauttaminen epäonnistui" + +#: src/sudo_edit.c:574 src/sudo_edit.c:686 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: ei ole tavallinen tiedosto" + +#: src/sudo_edit.c:581 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: symbolisten linkkien muokkaus ei ole sallittua" + +#: src/sudo_edit.c:584 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: tiedostojen muokkaus kirjoitettavassa hakemistossa ei ole sallittua" + +#: src/sudo_edit.c:617 src/sudo_edit.c:724 +#, c-format +msgid "%s: short write" +msgstr "%s: lyhyt kirjoitus" + +#: src/sudo_edit.c:687 +#, c-format +msgid "%s left unmodified" +msgstr "%s jätetty muokkaamattomaksi" + +#: src/sudo_edit.c:700 src/sudo_edit.c:885 +#, c-format +msgid "%s unchanged" +msgstr "%s muuttamaton" + +#: src/sudo_edit.c:713 src/sudo_edit.c:735 +#, c-format +msgid "unable to write to %s" +msgstr "kohteeseen %s kirjoittaminen epäonnistui" + +#: src/sudo_edit.c:714 src/sudo_edit.c:733 src/sudo_edit.c:736 +#: src/sudo_edit.c:910 src/sudo_edit.c:914 +#, c-format +msgid "contents of edit session left in %s" +msgstr "muokkausistunnon sisältö jätetty kohteessa %s" + +#: src/sudo_edit.c:732 +msgid "unable to read temporary file" +msgstr "tilapäisen tiedoston lukeminen epäonnistui" + +#: src/sudo_edit.c:815 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: sisäinen virhe: polkujen pariton määrä" + +#: src/sudo_edit.c:817 +msgid "sesh: unable to create temporary files" +msgstr "sesh: tilapäisten tiedostojen luominen epäonnistui" + +#: src/sudo_edit.c:819 src/sudo_edit.c:917 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: tuntematon virhe %d" + +#: src/sudo_edit.c:909 +msgid "unable to copy temporary files back to their original location" +msgstr "tilapäisten tiedostojen kopioiminen takaisin niiden alkuperäiseen sijaintiin epäonnistui" + +#: src/sudo_edit.c:913 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "joidenkin tilapäisten tiedostojen kopioiminen takaisin niiden alkuperäiseen sijaintiin epäonnistui" + +#: src/sudo_edit.c:958 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "uid-käyttäjätunnisteen vaihtaminen root-tunnisteeksi (%u) epäonnistui" + +#: src/sudo_edit.c:975 +msgid "plugin error: missing file list for sudoedit" +msgstr "lisäosavirhe: puuttuu sudoedit-tiedostoluettelo" + +#: src/sudo_edit.c:1016 src/sudo_edit.c:1029 +msgid "unable to read the clock" +msgstr "kellon lukeminen epäonnistui" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "ei tty:tä käytettävissä eikä salasanan kyselyohjelmaa määriteltynä" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "salasanan kyselyohjelma ei ole määritelty, yritä asettaa SUDO_ASKPASS" + +#: src/tgetpass.c:261 +#, c-format +msgid "unable to set gid to %u" +msgstr "ei kyetä asettamaan gid-ryhmätunnisteeksi %u" + +#: src/tgetpass.c:265 +#, c-format +msgid "unable to set uid to %u" +msgstr "ei kyetä asettamaan uid-käyttäjätunnisteeksi %u" + +#: src/tgetpass.c:270 +#, c-format +msgid "unable to run %s" +msgstr "salasanakyselyn %s suorittaminen epäonnistui" + +#: src/utmp.c:268 +msgid "unable to save stdin" +msgstr "vakiosyötteeseen tallentaminen epäonnistui" + +#: src/utmp.c:270 +msgid "unable to dup2 stdin" +msgstr "funktion dup2 kutsuminen vakiosyötteellä epäonnistui" + +#: src/utmp.c:273 +msgid "unable to restore stdin" +msgstr "vakiosyötteen palauttaminen epäonnistui" + +#~ msgid "error reading from signal pipe" +#~ msgstr "virhe luettaessa signaaliputkesta" + +#~ msgid "error reading from pipe" +#~ msgstr "virhe luettaessa putkesta" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "sisäinen virhe, yritettiin varata nolla tavua" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "pääteikkunan asentaminen raakatilaan epäonnistui" + +#~ msgid "unable to open socket" +#~ msgstr "vastakkeen avaaminen epäonnistui" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "sisäinen virhe, yritettiin suorittaa emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "sisäinen virhe, yritettiin suorittaa ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "sisäinen virhe, yritettiin suorittaa erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "sisäinen virhe, yritettiin suorittaa erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "sisäinen virhe, yritettiin suorittaa erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: ylivuoto havaittu" + +#~ msgid "value out of range" +#~ msgstr "arvo lukualueen ulkopuolella" + +#~ msgid "select failed" +#~ msgstr "select-funktio epäonnistui" + +#~ msgid "list user's available commands\n" +#~ msgstr "luettele käyttäjän käytettävissä olevat komennot\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "suorita komentotulkki kohdekäyttäjänä\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "luetteloitaessa luettele määritellyn käyttäjän käyttöoikeudet\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "sisäinen virhe, emalloc2() -ylivuoto" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "sisäinen virhe, erealloc3() -ylivuoto" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: vähintään yksi menettelytapalisäosa on määriteltävä" + +#~ msgid "must be setuid root" +#~ msgstr "on oltava setuid root" + +#~ msgid "the argument to -D must be between 1 and 9 inclusive" +#~ msgstr "valitsimen -D argumentin on oltava alueella 1 - 9" diff --git a/utsudo-0.0.2/po/fr.mo b/utsudo-0.0.2/po/fr.mo new file mode 100644 index 0000000000000000000000000000000000000000..22f374d010df49cd9494e950618bee1150ee5490 GIT binary patch literal 20840 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, 2011-2013 +# Frédéric Marchal , 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 17:45+0200\n" +"Last-Translator: Frédéric Marchal \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n >= 2);\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "impossible d'ouvrir la base de données utilisateurs" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "impossible de basculer vers le registre « %s » pour %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "impossible de rétablir le registre" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "impossible d'allouer la mémoire" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Signal inconnu" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "valeur incorrecte" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "valeur trop grande" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "valeur trop petite" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valeur de chemin « %s » incorrecte dans %s, ligne %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valeur « %2$s » incorrecte pour %1$s dans %3$s, ligne %4$u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "source de groupe « %s » non supportée dans %s, ligne %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "groupes max « %s » incorrects dans %s, ligne %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "impossible d'évaluer par stat() %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s n'est pas un fichier régulier" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s est la propriété du uid %u alors que ça devrait être %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s peut être écrit par tout le monde" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s peut être écrit par le groupe" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "impossible d'ouvrir %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "classe de login %s inconnue" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "impossible de changer le contexte utilisateur" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "impossible de changer la priorité du processus" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "impossible de changer root en %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "impossible de changer vers runas uid (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "impossible de changer le répertoire vers %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "impossible de spécifier le gestionnaire pour le signal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "impossible de supprimer PRIV_PROC_EXEC de PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "erreur de lecture sur la paire de sockets" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "réponse inattendue sur le backchannel : %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "impossible d'ajouter l'événement à la queue" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "impossible de choisir le tty de contrôle" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "impossible de créer le tube" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "impossible de recevoir un message du parent" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "erreur de fork" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "impossible de rétablir l'étiquette du tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "impossible d'exécuter %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "le greffon de règles a échoué lors de l'initialisation de la session" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "erreur dans la boucle des événements" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "impossible de rétablir le gestionnaire pour le signal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "impossible d'allouer le pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "impossible de créer des sockets" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "impossible d'envoyer le message au processus de monitoring" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "erreur dans %s, ligne %d lors du chargement du greffon « %s »" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s doit être la propriété du uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "seul le propriétaire doit pouvoir écrire dans %s" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossible de charger %s : %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossible de trouver le symbole « %s » dans %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "type de règle %d inconnu dans %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "greffon à la version majeure %d incompatible (%d attendu) trouvé dans %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignore le greffon de règles « %s » dans %s, ligne %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "un seul greffon de règles peut être spécifié" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignore le greffon de règles en double « %s » dans %s, ligne %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignore le greffon E/S en double « %s » dans %s, ligne %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "le greffon de règles %s ne contient pas de méthode check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "erreur interne, débordement %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nom de variable d'environnement invalide: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "l'argument à -C doit être un nombre plus grand ou égal à 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "vous ne pouvez pas spécifier les options « -i » et « -s » en même temps" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "vous ne pouvez pas spécifier les options « -i » et « -E » en même temps" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "l'option « -E » n'est pas valable en mode édition" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "vous ne pouvez pas spécifier de variable d'environnement en mode édition" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "l'option « -U » ne peut être utilisée qu'avec l'option « -l »" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "les options « -A » et « -S » ne peuvent pas être utilisées ensemble" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit n'est pas pris en charge sur cette plate-forme" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Seule une des options -e, -h, -i, -K, -l, -s, -v ou -V peut être spécifiée" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s – édite les fichiers en tant qu'un autre utilisateur\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s – exécute une commande en tant qu'un autre utilisateur\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Options:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "utiliser un programme adjoint pour demander le mot de passe" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "utiliser le type d'authentification BSD spécifié" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "exécuter la commande en arrière-plan" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "émettre un signal sonore lors d'une demande" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "fermer tous les descripteurs de fichiers >= n°" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "exécuter la commande avec la classe de login BSD" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "préserver l'environnement de l'utilisateur en exécutant la commande" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "préserver les variables d'environnement spécifiques" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "éditer les fichiers au lieu d'exécuter une commande" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "exécuter la commande en tant que le nom ou ID de groupe spécifié" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "assigner à la variable HOME le répertoire personnel de l'utilisateur cible" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "afficher le message d'aide et terminer" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "exécuter la commande sur l'hôte (si supporté par le greffon)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "exécuter le shell de login comme l'utilisateur cible. Une commande peut aussi être spécifiée" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "supprime complètement le fichier d'horodatage" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "invalide le fichier d'horodatage" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "afficher les privilèges de l'utilisateur ou vérifie une commande spécifique. Utilisez deux fois pour une forme plus longue" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "mode non interactif, aucune invite utilisée" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "préserve le vecteur des groupes au lieu de le changer en celui de la cible" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "utiliser l'invite de mot de passe spécifié" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "créer le contexte de sécurité SELinux avec le rôle spécifié" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "lire le mot de passe depuis l'entrée standard" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "exécuter le shell en tant que l'utilisateur cible. Une commande peut aussi être spécifiée" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "créer le contexte de sécurité SELinux avec le type spécifié" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "terminer la commande après la limite de temps spécifiée" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "en mode liste, afficher les privilèges de l'utilisateur" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "exécuter la commande (ou éditer le fichier) sous le nom d'utilisateur ou le ID spécifié" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "afficher les informations de version et terminer" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "mettre à jour l'horodatage de l'utilisateur sans exécuter de commande" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "arrêter de traiter les arguments en ligne de commande" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "impossible d'ouvrir le système d'audit" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "impossible d'envoyer le message d'audit" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "impossible d'exécuter fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s à changé des étiquettes" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "impossible de rétablir le contexte de %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "impossible d'ouvrir %s, le tty n'est pas ré-étiqueté" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s n'est pas un périphérique caractères, le tty n'est pas ré-étiqueté" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "impossible d'obtenir le contexte actuel du tty, le tty n'est pas ré-étiqueté" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe de sécurité « chr_file » inconnue, le tty n'est pas ré-étiqueté" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "impossible d'obtenir le nouveau contexte du tty, le tty n'est pas ré-étiqueté" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "impossible de changer le nouveau contexte du tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "vous devez spécifier un rôle pour le type %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "impossible d'obtenir le type par défaut pour le rôle %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "échec de l'obtention du nouveau contexte" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "échec lors du changement du nouveau rôle %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "échec lors du changement du nouveau type %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s n'est pas un contexte valide" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "échec de l'obtention de l'ancien contexte" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "impossible de déterminer le mode de contrainte" + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "impossible de changer le contexte du tty en %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "impossible de changer le contexte exec en %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "impossible de changer le contexte de création de clé en %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "exige au moins un argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "numéro de descripteur de fichier invalide: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "impossible d'exécuter %s comme un shell de login" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "impossible de sauvegarder le gestionnaire du signal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "la limite de contrôle de la ressource a été atteinte" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "l'utilisateur « %s » n'est pas un membre du projet « %s »" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "la tâche appelante est « final »" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "impossible de joindre le projet « %s »" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "aucun pool de ressources acceptant les liaisons par défaut existe pour le projet « %s »" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "le pool de ressources spécifié n'existe pas pour le projet « %s »" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "impossible de se lier au pool de ressources par défaut du projet « %s »" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject a échoué pour le projet « %s »" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "attention, l'assignement du contrôle de ressources a échoue pour le projet « %s »" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo version %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Options de configuration : %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "erreur fatale, impossible de charger les greffons" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "impossible d'initialiser le greffon de règles" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "le greffon n'a pas retourné une commande à exécuter" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "erreur à l'initialisation du greffon E/S %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "mode sudo 0x%x inattendu" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vous n'existez pas dans la base de données %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "impossible de déterminer le tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s doit être la propriété du uid %d et avoir le bit setuid mis" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "le uid effectif n'est pas %d. Est-ce que %s est sur un système de fichiers avec l'option « nosuid » ou un système de fichiers NFS sans privilèges root ?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "le uid effectif n'est pas %d. Est-ce que sudo est installé setuid root ?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "impossible d'attribuer les ID de groupe supplémentaires" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "impossible de changer le gid effectif à runas gid %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "impossible de changer le gid à runas gid %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condition de fin de l'enfant inconnue: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "le greffon de règles %s n'a pas de méthode « check_policy »" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "le greffon de règles %s ne supporte pas les privilèges de listage" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "le greffon de règles %s ne supporte pas l'option -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "le greffon de règles %s ne supporte pas les options -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "aucun répertoire temporaire est disponible en écriture" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "impossible de rétablir le répertoire de travail actuel" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: pas un fichier régulier" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: l'édition de liens symboliques n'est pas permise" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: l'édition de fichiers dans un répertoire accessible en écriture n'est pas permis" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: écriture trop courte" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s laissé tel quel" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s non modifié" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "impossible d'écrire dans %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "contenu de la session d'édition laissé dans %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "impossible de lire le fichier temporaire" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: erreur interne: nombre impaire de chemins" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: impossible de créer des fichiers temporaires" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: erreur %d inconnue" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "impossible de copier les fichiers temporaires à leurs emplacements d'origine" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "impossible de copier quelques fichiers temporaires à leurs emplacements d'origine" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "impossible de changer le uid en root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "erreur de greffon : liste de fichiers manquantes pour sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "impossible de lire l'horloge" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "délai d'attente dépassé durant la lecture du mot de passe" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "aucun mot de passe fourni" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "impossible de lire le mot de passe" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "un terminal est requis pour lire le mot de passe; utilisez soit l'option -S pour lire depuis l'entrée standard ou configurez un outil askpass de demande de mot de passe" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "pas de programme askpass spécifié, essayez avec SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "impossible de changer le gid en %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "impossible de changer le uid en %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "impossible d'exécuter %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "impossible de sauvegarder stdin" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "impossible d'exécuter dup2 sur stdin" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "impossible de rétablir stdin" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "pas de tty présent et pas de programme askpass spécifié" + +#~ msgid "unable to get group vector" +#~ msgstr "impossible d'obtenir le vecteur de groupes" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "uid %u inconnu : qui êtes-vous ?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "erreur lors de la lecture du tube signal" + +#~ msgid "error reading from pipe" +#~ msgstr "erreur de lecture sur le tube" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "impossible de mettre le terminal en mode brut" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "erreur interne, a tenté d'allouer zéro octets" + +#~ msgid "unable to open socket" +#~ msgstr "impossible d'ouvrir la socket" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "erreur interne, emalloc2(0) a été tenté" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "erreur interne, ecalloc(0) a été tenté" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "erreur interne, erealloc(0) a été tenté" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "erreur interne, erealloc3(0) a été tenté" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "erreur interne, erecalloc(0) a été tenté" + +#~ msgid "value out of range" +#~ msgstr "valeur hors limites" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "select failed" +#~ msgstr "select a échoué" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: débordement détecté" diff --git a/utsudo-0.0.2/po/fur.mo b/utsudo-0.0.2/po/fur.mo new file mode 100644 index 0000000000000000000000000000000000000000..b3c222fab4c0898995161238106d86b84f7c0745 GIT binary patch literal 18335 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 JowOsv{|ot&FTnr+ literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/fur.po b/utsudo-0.0.2/po/fur.po new file mode 100644 index 0000000..8ceb326 --- /dev/null +++ b/utsudo-0.0.2/po/fur.po @@ -0,0 +1,873 @@ +# Friulian translations for sudo package +# This file is put in the public domain. +# Fabio Tomat , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.20b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-03-09 11:58-0700\n" +"PO-Revision-Date: 2017-06-24 14:55+0200\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "impussibil vierzi userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "impussibil passâ al regjistri \"%s\" par %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "impussibil ripristinâ il regjistri" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:184 lib/util/sudo_conf.c:270 lib/util/sudo_conf.c:347 +#: lib/util/sudo_conf.c:545 src/conversation.c:75 src/exec_common.c:107 +#: src/exec_common.c:123 src/exec_common.c:132 src/exec_monitor.c:214 +#: src/exec_nopty.c:326 src/exec_pty.c:623 src/exec_pty.c:631 +#: src/exec_pty.c:868 src/load_plugins.c:52 src/load_plugins.c:65 +#: src/load_plugins.c:215 src/load_plugins.c:238 src/load_plugins.c:303 +#: src/load_plugins.c:318 src/parse_args.c:183 src/parse_args.c:205 +#: src/parse_args.c:376 src/parse_args.c:472 src/parse_args.c:494 +#: src/preserve_fds.c:47 src/preserve_fds.c:130 src/selinux.c:83 +#: src/selinux.c:292 src/selinux.c:415 src/selinux.c:424 src/sesh.c:115 +#: src/sudo.c:398 src/sudo.c:423 src/sudo.c:488 src/sudo.c:610 src/sudo.c:670 +#: src/sudo.c:680 src/sudo.c:700 src/sudo.c:719 src/sudo.c:728 src/sudo.c:737 +#: src/sudo.c:754 src/sudo.c:795 src/sudo.c:805 src/sudo.c:825 src/sudo.c:1246 +#: src/sudo.c:1267 src/sudo.c:1441 src/sudo.c:1535 src/sudo_edit.c:151 +#: src/sudo_edit.c:775 src/sudo_edit.c:872 src/sudo_edit.c:985 +#: src/sudo_edit.c:1005 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:185 +#: lib/util/sudo_conf.c:270 lib/util/sudo_conf.c:347 lib/util/sudo_conf.c:545 +#: src/conversation.c:76 src/exec_common.c:107 src/exec_common.c:124 +#: src/exec_common.c:133 src/exec_pty.c:623 src/exec_pty.c:631 +#: src/exec_pty.c:868 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:183 +#: src/parse_args.c:205 src/parse_args.c:376 src/parse_args.c:472 +#: src/parse_args.c:494 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:83 src/selinux.c:292 src/selinux.c:415 src/selinux.c:424 +#: src/sesh.c:115 src/sudo.c:398 src/sudo.c:423 src/sudo.c:488 src/sudo.c:610 +#: src/sudo.c:825 src/sudo.c:1246 src/sudo.c:1267 src/sudo.c:1441 +#: src/sudo.c:1535 src/sudo_edit.c:151 src/sudo_edit.c:775 src/sudo_edit.c:872 +#: src/sudo_edit.c:985 src/sudo_edit.c:1005 +msgid "unable to allocate memory" +msgstr "impussibil assegnâ memorie" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Segnâl no cognossût" + +#: lib/util/strtoid.c:77 lib/util/strtoid.c:124 lib/util/strtoid.c:152 +#: lib/util/strtomode.c:49 lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "valôr no valit" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:55 lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "valôr masse grant" + +#: lib/util/strtoid.c:86 lib/util/strtoid.c:137 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:182 +msgid "value too small" +msgstr "valôr masse piçul" + +#: lib/util/sudo_conf.c:203 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "il valôr percors \"%s\" no valit in %s, rie %u" + +#: lib/util/sudo_conf.c:369 lib/util/sudo_conf.c:422 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valôr no valit par %s \"%s\" in %s, rie %u" + +#: lib/util/sudo_conf.c:390 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "sorzint di grup \"%s\" no supuartade in %s, rie %u" + +#: lib/util/sudo_conf.c:406 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "grups massims \"%s\" no valits in %s, rie %u" + +#: lib/util/sudo_conf.c:561 +#, c-format +msgid "unable to stat %s" +msgstr "impussibil eseguî stat su %s" + +#: lib/util/sudo_conf.c:564 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nol è un file regolâr" + +#: lib/util/sudo_conf.c:567 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s al è dal uid %u, al varès di jessi di %u" + +#: lib/util/sudo_conf.c:571 +#, c-format +msgid "%s is world writable" +msgstr "ducj a puedin scrivi su %s" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "%s is group writable" +msgstr "il grup al pues scrivi su %s" + +#: lib/util/sudo_conf.c:584 src/selinux.c:201 src/selinux.c:213 src/sudo.c:366 +#, c-format +msgid "unable to open %s" +msgstr "impussibil vierzi %s" + +#: src/exec.c:189 src/exec_monitor.c:504 src/exec_monitor.c:506 +#: src/exec_monitor.c:511 src/exec_monitor.c:513 src/exec_monitor.c:527 +#: src/exec_monitor.c:538 src/exec_monitor.c:540 src/exec_monitor.c:542 +#: src/exec_monitor.c:544 src/exec_monitor.c:546 src/exec_monitor.c:548 +#: src/exec_monitor.c:550 src/exec_nopty.c:191 src/exec_nopty.c:193 +#: src/exec_nopty.c:195 src/exec_nopty.c:197 src/exec_nopty.c:199 +#: src/exec_nopty.c:201 src/exec_nopty.c:203 src/exec_nopty.c:205 +#: src/exec_nopty.c:208 src/exec_nopty.c:222 src/exec_nopty.c:224 +#: src/exec_nopty.c:226 src/exec_nopty.c:384 src/exec_pty.c:427 +#: src/exec_pty.c:661 src/exec_pty.c:1196 src/exec_pty.c:1198 +#: src/exec_pty.c:1200 src/exec_pty.c:1202 src/exec_pty.c:1204 +#: src/exec_pty.c:1206 src/exec_pty.c:1208 src/exec_pty.c:1211 +#: src/exec_pty.c:1219 src/exec_pty.c:1221 src/exec_pty.c:1223 +#: src/exec_pty.c:1231 src/exec_pty.c:1233 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "impussibil stabilî il gjestôr pal segnâl %d" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "impussibil gjavâ PRIV_PROC_EXEC dal PRIV_LIMIT" + +#: src/exec_monitor.c:277 src/exec_nopty.c:455 src/exec_pty.c:1028 +msgid "error reading from signal pipe" +msgstr "erôr tal lei dal condot (pipe) dal segnâl" + +#: src/exec_monitor.c:363 +msgid "error reading from socketpair" +msgstr "erôr tal lei dal socketpair" + +#: src/exec_monitor.c:372 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "gjenar di rispueste inspietade sul backchannel: %d" + +#: src/exec_monitor.c:450 src/exec_monitor.c:458 src/exec_monitor.c:466 +#: src/exec_nopty.c:130 src/exec_nopty.c:138 src/exec_pty.c:516 +#: src/exec_pty.c:521 src/exec_pty.c:591 src/exec_pty.c:598 src/exec_pty.c:873 +#: src/exec_pty.c:1129 src/exec_pty.c:1137 src/exec_pty.c:1322 +#: src/exec_pty.c:1332 src/exec_pty.c:1377 src/exec_pty.c:1384 +#: src/exec_pty.c:1409 +msgid "unable to add event to queue" +msgstr "impussibil zontâ l'event ae code" + +#: src/exec_monitor.c:496 src/exec_monitor.c:570 src/exec_nopty.c:161 +#: src/exec_pty.c:705 src/exec_pty.c:714 src/exec_pty.c:722 src/signal.c:129 +#: src/tgetpass.c:246 +msgid "unable to create pipe" +msgstr "impussibil creâ il condot (pipe)" + +#: src/exec_monitor.c:562 +msgid "unable to set controlling tty" +msgstr "impussibil stabilî il tty di control" + +#: src/exec_monitor.c:573 src/exec_nopty.c:240 src/exec_pty.c:756 +#: src/tgetpass.c:250 +msgid "unable to fork" +msgstr "impussibil inglovâ (fâ il fork)" + +#: src/exec_monitor.c:654 src/exec_nopty.c:292 +msgid "unable to restore tty label" +msgstr "impussibil ripristinâ la etichete tty" + +#: src/exec_nopty.c:233 src/exec_pty.c:1240 +msgid "policy plugin failed session initialization" +msgstr "il plugin di politche nol è rivât a inizializâ la session" + +#: src/exec_nopty.c:281 src/exec_pty.c:1278 +msgid "error in event loop" +msgstr "erôr tal cicli dal event" + +#: src/exec_nopty.c:392 src/exec_pty.c:459 src/signal.c:87 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "impussibil ripristinâ il gjestôr pal segnâl %d" + +#: src/exec_pty.c:133 +msgid "unable to allocate pty" +msgstr "impussibil assegnâ pty" + +#: src/exec_pty.c:1179 +msgid "unable to create sockets" +msgstr "impussibil creâ sockets" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "erôr in %s, rie %d intant che si cjariave il plugin \"%s\"" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s al scugne jessi di proprietât dal uid %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s al scugne jessi scrivibil dome dal proprietari" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "impussibil cjariâ %s: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impussibil cjatâ il simbul \"%s\" in %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "gjenar di politiche %d no cognossude, cjatade in %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "numar principâl di version dal plugin %d no compatibil (si spietave %d) cjatât in %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "si ignore il plugin di politiche \"%s\" in %s, rie %d" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "dome un singul plugin di politiche al podarès jessi specificât" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "si ignore il plugin di politiche duplicât \"%s\" in %s, rie %d" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "si ignore il plugin I/O duplicât \"%s\" in %s, rie %d" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "il plugin di politiche %s nol inclût un metodi check_policy" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:483 +#, c-format +msgid "internal error, %s overflow" +msgstr "erôr interni, %s overflow (stranfât)" + +#: src/parse_args.c:242 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "l'argoment di -C al scugne jessi un numar plui grant o compagn a 3" + +#: src/parse_args.c:412 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "no si podarès specificâ dutis dôs lis opzions `-i' e `-s'" + +#: src/parse_args.c:416 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "no si podarès specificâ dutis dôs lis opzions `-i' e `-E'" + +#: src/parse_args.c:426 +msgid "the `-E' option is not valid in edit mode" +msgstr "la opzion `-E' no je valide in modalitât di modifiche" + +#: src/parse_args.c:428 +msgid "you may not specify environment variables in edit mode" +msgstr "no si podarès specificâ lis variabilis di ambient inte modalitât di modifiche" + +#: src/parse_args.c:436 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "la opzion `-U' e podarès jessi doprade dome cun la opzion `-l'" + +#: src/parse_args.c:440 +msgid "the `-A' and `-S' options may not be used together" +msgstr "lis opzions `-A' e `-S' no podaressin jessi dopradis adun" + +#: src/parse_args.c:516 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit nol è supuartât su cheste plateforme" + +#: src/parse_args.c:589 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Dome une des opzions -e, -h, -i, -K, -l, -s, -v o -V e podarès jessi specificade" + +#: src/parse_args.c:603 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - modifiche i file come altri utent\n" +"\n" + +#: src/parse_args.c:605 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - eseguìs un comant come altri utent\n" +"\n" + +#: src/parse_args.c:610 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opzions:\n" + +#: src/parse_args.c:612 +msgid "use a helper program for password prompting" +msgstr "Dopre un program di jutori par domandâ la password" + +#: src/parse_args.c:615 +msgid "use specified BSD authentication type" +msgstr "dopre il gjenar di autenticazion BSD specificât" + +#: src/parse_args.c:618 +msgid "run command in the background" +msgstr "eseguìs il comant in background" + +#: src/parse_args.c:620 +msgid "close all file descriptors >= num" +msgstr "siere ducj i descritôrs di file >= num" + +#: src/parse_args.c:623 +msgid "run command with the specified BSD login class" +msgstr "eseguìs il comant cun la classe di acès BSD specificade" + +#: src/parse_args.c:626 +msgid "preserve user environment when running command" +msgstr "preserve l'ambient utent cuant che si eseguìs un comant" + +#: src/parse_args.c:628 +msgid "edit files instead of running a command" +msgstr "modifiche i file invezit di eseguî un comant" + +#: src/parse_args.c:630 +msgid "run command as the specified group name or ID" +msgstr "eseguìs il comant come il ID o il non dal grup specificât" + +#: src/parse_args.c:632 +msgid "set HOME variable to target user's home dir" +msgstr "stabilìs la variabile HOME ae cartele home dal utent di destinazion" + +#: src/parse_args.c:634 +msgid "display help message and exit" +msgstr "mostre il messaç di jutori e jes" + +#: src/parse_args.c:636 +msgid "run command on host (if supported by plugin)" +msgstr "eseguìs il comant sul host (se supuartât dal plugin)" + +#: src/parse_args.c:638 +msgid "run login shell as the target user; a command may also be specified" +msgstr "eseguìs une shell di acès come utent di destinazion; si podarès ancje specificâ un comant" + +#: src/parse_args.c:640 +msgid "remove timestamp file completely" +msgstr "" + +#: src/parse_args.c:642 +msgid "invalidate timestamp file" +msgstr "" + +#: src/parse_args.c:644 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "liste i privileçs dal utent o verifiche un comant specific; doprâ dôs voltis pal formât plui lunc" + +#: src/parse_args.c:646 +msgid "non-interactive mode, no prompts are used" +msgstr "modalitât no interative, nissune richieste e ven presentade" + +#: src/parse_args.c:648 +msgid "preserve group vector instead of setting to target's" +msgstr "preserve il vetôr dal grup invezit di metilu a chel de destinazion" + +#: src/parse_args.c:650 +msgid "use the specified password prompt" +msgstr "dopre la richieste de password specificade" + +#: src/parse_args.c:653 +msgid "create SELinux security context with specified role" +msgstr "cree il contest di sigurece SELinux cul rûl specificât" + +#: src/parse_args.c:656 +msgid "read password from standard input" +msgstr "lei la passwrod dal standard input" + +#: src/parse_args.c:658 +msgid "run shell as the target user; a command may also be specified" +msgstr "eseguìs la shell come l'utent di destinazion; si podarès ancje specificâ un comant" + +#: src/parse_args.c:661 +msgid "create SELinux security context with specified type" +msgstr "cree il contest di sigurece SELinux cul gjenar specificât" + +#: src/parse_args.c:664 +msgid "terminate command after the specified time limit" +msgstr "termine il comant dopo il limit di timp specificât" + +#: src/parse_args.c:666 +msgid "in list mode, display privileges for user" +msgstr "in modalitât liste, mostre i privileçs dal utent" + +#: src/parse_args.c:668 +msgid "run command (or edit file) as specified user name or ID" +msgstr "eseguìs il comant (o modifiche il file) come non utent o ID specificât" + +#: src/parse_args.c:670 +msgid "display version information and exit" +msgstr "mostre informazions di version e jes" + +#: src/parse_args.c:672 +msgid "update user's timestamp without running a command" +msgstr "" + +#: src/parse_args.c:674 +msgid "stop processing command line arguments" +msgstr "ferme la elaborazion dai argoments a rie di comant" + +#: src/selinux.c:77 +msgid "unable to open audit system" +msgstr "impussibil vierzi il sisteme di audit" + +#: src/selinux.c:87 +msgid "unable to send audit message" +msgstr "impussibil inviâ il messaç di audit" + +#: src/selinux.c:115 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "impussibil eseguî fgetfilecon %s" + +#: src/selinux.c:120 +#, c-format +msgid "%s changed labels" +msgstr "%s al à modificâts lis etichetis" + +#: src/selinux.c:125 +#, c-format +msgid "unable to restore context for %s" +msgstr "impussibil ripristinâ il contest par %s" + +#: src/selinux.c:165 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "impussibil vierzi %s, no si torne a etichetâ tty" + +#: src/selinux.c:173 +msgid "unable to get current tty context, not relabeling tty" +msgstr "impussibil otignî il contest tty atuâl, no si torne a etichetâ tty" + +#: src/selinux.c:180 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe di sigurece \"chr_file\" no cognossude, no si torne a etichetâ tty" + +#: src/selinux.c:185 +msgid "unable to get new tty context, not relabeling tty" +msgstr "impussibil otignî il gnûf contest tty, no si torne a etichetâ tty" + +#: src/selinux.c:192 +msgid "unable to set new tty context" +msgstr "impussibil stabilî un gnûf contest tty" + +#: src/selinux.c:256 +#, c-format +msgid "you must specify a role for type %s" +msgstr "si scugne specificâ un rûl pal gjenar %s" + +#: src/selinux.c:262 +#, c-format +msgid "unable to get default type for role %s" +msgstr "impussibil otignî il gjenar predefinît pal rûl %s" + +#: src/selinux.c:280 +#, c-format +msgid "failed to set new role %s" +msgstr "no si è rivâts a stabilî il gnûf rûl %s" + +#: src/selinux.c:284 +#, c-format +msgid "failed to set new type %s" +msgstr "no si è rivâts a stabilî il gnûf gjenar %s" + +#: src/selinux.c:296 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nol è un contest valit" + +#: src/selinux.c:331 +msgid "failed to get old_context" +msgstr "no si è rivâts a otignî old_context" + +#: src/selinux.c:337 +msgid "unable to determine enforcing mode." +msgstr "" + +#: src/selinux.c:354 +#, c-format +msgid "unable to set tty context to %s" +msgstr "impussibil meti il contest di tty a %s" + +#: src/selinux.c:393 +#, c-format +msgid "unable to set exec context to %s" +msgstr "impussibil meti il contest di exec a %s" + +#: src/selinux.c:400 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "impussibil meti il contest de creazion de clâf a %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "al domande almancul un argoment" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "numar descritôr file no valit: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "impussibil eseguî %s come une shell di acès" + +#: src/sesh.c:125 src/sudo.c:1305 +#, c-format +msgid "unable to execute %s" +msgstr "impussibil eseguî %s" + +#: src/signal.c:69 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "impussibil salvâ il gjestôr pal segnâl %d" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "si è rivâts al limit di control de risorse" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "l'utent \"%s\" nol è un membri dal progjet \"%s\"" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "impussibil unîsi al progjet \"%s\"" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nissun font di risorsis pal progjet \"%s\" che al aceti i vincui predefinîts" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "il font di risorsis specificât nol esist pal progjet \"%s\"" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "impussibil vincolâ al font di risorsis predefinît pal progjet \"%s\"" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject al à falît pal progjet \"%s\"" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "avertiment, faliment de assegnazion dal control de risorse pal progjet \"%s\"" + +#: src/sudo.c:212 +#, c-format +msgid "Sudo version %s\n" +msgstr "Version di sudo: %s\n" + +#: src/sudo.c:214 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opzions di configurazion: %s\n" + +#: src/sudo.c:222 +msgid "fatal error, unable to load plugins" +msgstr "erôr fatâl, impussibil cjariâ i plugin" + +#: src/sudo.c:230 +msgid "unable to initialize policy plugin" +msgstr "impussibil inizializâ il plugin de politiche" + +#: src/sudo.c:274 +msgid "plugin did not return a command to execute" +msgstr "il plugin nol à tornât un comant di eseguî" + +#: src/sudo.c:290 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "erôr tal inizializâ il plugin I/O %s" + +#: src/sudo.c:316 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "modalitât 0x%x di sudo inspietade" + +#: src/sudo.c:468 +msgid "unable to get group vector" +msgstr "impussibil otignî il vetôr di grup" + +#: src/sudo.c:530 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "uid %u no cognossût: cui sêstu?" + +#: src/sudo.c:586 +msgid "unable to determine tty" +msgstr "impussibil determinâ tty" + +#: src/sudo.c:874 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s al scugne jessi di proprietât dal uid %d e vê stabilît il bit setuid" + +#: src/sudo.c:877 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "il uid efetîf nol è %d, %s isal suntun filesystem cun stabilide la opzion 'nosuid' o un filesystem NFS cence privileçs di root?" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "il uid efetîf nol è %d, sudo isal instalât cun setuid root?" + +#: src/sudo.c:964 +msgid "unable to set supplementary group IDs" +msgstr "impussibil stabilî il ID di grup suplementâr" + +#: src/sudo.c:971 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "impussibil stabilî il gid efetîf par eseguî come gid %u" + +#: src/sudo.c:977 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "impussibil stabilî il gid par eseguî come gid %u" + +#: src/sudo.c:1048 +#, c-format +msgid "unknown login class %s" +msgstr "classe di acès %s no cognossude" + +#: src/sudo.c:1061 +msgid "unable to set user context" +msgstr "impussibil stabilî il contest utent" + +#: src/sudo.c:1077 +msgid "unable to set process priority" +msgstr "impussibil stabilî la prioritât dal procès" + +#: src/sudo.c:1085 +#, c-format +msgid "unable to change root to %s" +msgstr "impussibil cambiâ root a %s" + +#: src/sudo.c:1098 src/sudo.c:1104 src/sudo.c:1111 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "impussibil passâ a un diviers uid (%u, %u)" + +#: src/sudo.c:1129 +#, c-format +msgid "unable to change directory to %s" +msgstr "impussibil passâ ae cartele a %s" + +#: src/sudo.c:1187 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condizion di jessude dal fi inspietade: %d" + +#: src/sudo.c:1333 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "il plugin di politiche %s al mancje dal metodi `check_policy'" + +#: src/sudo.c:1351 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "il plugin di politiche %s nol supuarte il listâ dai privileçs" + +#: src/sudo.c:1368 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "il plugin di politiche %s nol supuarte la opzion -v" + +#: src/sudo.c:1383 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "il plugin di politiche %s nol supuarte lis opzions -k/-K" + +#: src/sudo_edit.c:181 src/sudo_edit.c:270 +msgid "unable to restore current working directory" +msgstr "impussibil ripristinâ la cartele di lavôr atuâl" + +#: src/sudo_edit.c:577 src/sudo_edit.c:689 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nol è un file regolâr." + +#: src/sudo_edit.c:584 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: la modifiche dai colegaments simbolics no je permetude" + +#: src/sudo_edit.c:587 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: la modifiche dai file intune cartele cun acès in scriture no je permetude" + +#: src/sudo_edit.c:620 src/sudo_edit.c:728 +#, c-format +msgid "%s: short write" +msgstr "%s: scriture curte" + +#: src/sudo_edit.c:690 +#, c-format +msgid "%s left unmodified" +msgstr "%s lassât no modificât" + +#: src/sudo_edit.c:703 src/sudo_edit.c:889 +#, c-format +msgid "%s unchanged" +msgstr "%s no modificât" + +#: src/sudo_edit.c:717 src/sudo_edit.c:739 +#, c-format +msgid "unable to write to %s" +msgstr "impussibil scrivi su %s" + +#: src/sudo_edit.c:718 src/sudo_edit.c:737 src/sudo_edit.c:740 +#: src/sudo_edit.c:914 src/sudo_edit.c:918 +#, c-format +msgid "contents of edit session left in %s" +msgstr "contignûts de session di modifiche lassâts in %s" + +#: src/sudo_edit.c:736 +msgid "unable to read temporary file" +msgstr "impussibil lei il file temporani" + +#: src/sudo_edit.c:819 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: erôr interni: strani numar di percors" + +#: src/sudo_edit.c:821 +msgid "sesh: unable to create temporary files" +msgstr "sesh: impussibil creâ file temporanis" + +#: src/sudo_edit.c:823 src/sudo_edit.c:921 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: erôr %d no cognossût" + +#: src/sudo_edit.c:913 +msgid "unable to copy temporary files back to their original location" +msgstr "impussibil tornâ a copiâ i file temporanis te lôr posizion origjinarie" + +#: src/sudo_edit.c:917 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "impussibil tornâ a copiâ cualchidun dai file temporanis te lôr posizion origjinarie" + +#: src/sudo_edit.c:961 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "impussibil cambiâ il uid a root (%u)" + +#: src/sudo_edit.c:978 +msgid "plugin error: missing file list for sudoedit" +msgstr "erôr di plugin: e mancje la liste file par sudoedit" + +#: src/sudo_edit.c:1019 src/sudo_edit.c:1032 +msgid "unable to read the clock" +msgstr "impussibil lei l'orloi" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "nissun tty presint e nissun program specificât pe richieste password" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nissun program pe richieste password specificât, cîr di stabilî SUDO_ASKPASS" + +#: src/tgetpass.c:261 +#, c-format +msgid "unable to set gid to %u" +msgstr "impussibil stabilî il gid a %u" + +#: src/tgetpass.c:265 +#, c-format +msgid "unable to set uid to %u" +msgstr "impussibil stabilî il uid a %u" + +#: src/tgetpass.c:270 +#, c-format +msgid "unable to run %s" +msgstr "impussibil eseguî %s" + +#: src/utmp.c:268 +msgid "unable to save stdin" +msgstr "impussibil salvâ stdin" + +#: src/utmp.c:270 +msgid "unable to dup2 stdin" +msgstr "impussibil esguî dup2 su stdin" + +#: src/utmp.c:273 +msgid "unable to restore stdin" +msgstr "impussibil ripristinâ stdin" diff --git a/utsudo-0.0.2/po/gl.mo b/utsudo-0.0.2/po/gl.mo new file mode 100644 index 0000000000000000000000000000000000000000..30c6e2ce5534d8a50aaa0c5ad6bf072e59bbbc21 GIT binary patch literal 17612 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 HrOf{qeEn{1 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/gl.po b/utsudo-0.0.2/po/gl.po new file mode 100644 index 0000000..f84eb0e --- /dev/null +++ b/utsudo-0.0.2/po/gl.po @@ -0,0 +1,898 @@ +# Galician translations for sudo package. +# This file is put in the public domain. +# Fran Dieguez , 2012. +# Francisco Diéguez , 2012. +# Leandro Regueiro , 2012-2015. +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.15b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2015-09-10 14:28-0600\n" +"PO-Revision-Date: 2015-09-15 10:41+0100\n" +"Last-Translator: Leandro Regueiro \n" +"Language-Team: Galician \n" +"Language: gl\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.4\n" + +#: lib/util/aix.c:85 lib/util/aix.c:155 +msgid "unable to open userdb" +msgstr "non foi posíbel abrir userdb" + +#: lib/util/aix.c:160 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "non foi posíbel ir ao rexistro «%s» para %s" + +#: lib/util/aix.c:185 +msgid "unable to restore registry" +msgstr "non foi posíbel restaurar o rexistro" + +#: lib/util/aix.c:204 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:185 lib/util/sudo_conf.c:265 lib/util/sudo_conf.c:342 +#: lib/util/sudo_conf.c:544 src/conversation.c:72 src/exec.c:864 +#: src/exec_common.c:96 src/exec_common.c:108 src/exec_common.c:115 +#: src/exec_pty.c:684 src/exec_pty.c:692 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:208 src/load_plugins.c:231 +#: src/load_plugins.c:296 src/load_plugins.c:311 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:414 src/sesh.c:102 +#: src/sudo.c:182 src/sudo.c:359 src/sudo.c:378 src/sudo.c:442 src/sudo.c:596 +#: src/sudo.c:615 src/sudo.c:642 src/sudo.c:651 src/sudo.c:660 src/sudo.c:677 +#: src/sudo.c:729 src/sudo.c:739 src/sudo.c:763 src/sudo.c:1146 +#: src/sudo.c:1148 src/sudo.c:1154 src/sudo.c:1162 src/sudo_edit.c:150 +#: src/sudo_edit.c:425 src/sudo_edit.c:522 src/sudo_edit.c:634 +#: src/sudo_edit.c:654 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:204 lib/util/gidlist.c:64 lib/util/sudo_conf.c:185 +#: lib/util/sudo_conf.c:265 lib/util/sudo_conf.c:342 lib/util/sudo_conf.c:544 +#: src/conversation.c:73 src/exec.c:864 src/exec_common.c:96 +#: src/exec_common.c:108 src/exec_common.c:115 src/exec_pty.c:684 +#: src/exec_pty.c:692 src/load_plugins.c:208 src/load_plugins.c:231 +#: src/load_plugins.c:296 src/load_plugins.c:311 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:414 src/sesh.c:102 +#: src/sudo.c:182 src/sudo.c:359 src/sudo.c:378 src/sudo.c:442 src/sudo.c:763 +#: src/sudo.c:1146 src/sudo.c:1148 src/sudo.c:1154 src/sudo.c:1162 +#: src/sudo_edit.c:150 src/sudo_edit.c:425 src/sudo_edit.c:522 +#: src/sudo_edit.c:634 src/sudo_edit.c:654 +msgid "unable to allocate memory" +msgstr "non foi posíbel asignar memoria" + +#: lib/util/strsignal.c:50 +msgid "Unknown signal" +msgstr "Sinal descoñecido" + +#: lib/util/strtoid.c:76 lib/util/strtoid.c:104 lib/util/strtomode.c:48 +#: lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "valor non válido" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:54 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "valor demasiado grande" + +#: lib/util/strtoid.c:89 lib/util/strtomode.c:54 lib/util/strtonum.c:61 +#: lib/util/strtonum.c:182 +msgid "value too small" +msgstr "valor demasiado pequeno" + +#: lib/util/sudo_conf.c:198 +#, c-format +msgid "invalid Path value `%s' in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:364 lib/util/sudo_conf.c:417 +#, c-format +msgid "invalid value for %s `%s' in %s, line %u" +msgstr "valor non válido para %s `%s' en %s, liña %u" + +#: lib/util/sudo_conf.c:385 +#, c-format +msgid "unsupported group source `%s' in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:401 +#, c-format +msgid "invalid max groups `%s' in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:560 +#, c-format +msgid "unable to stat %s" +msgstr "non foi posíbel executar stat en %s" + +#: lib/util/sudo_conf.c:563 +#, c-format +msgid "%s is not a regular file" +msgstr "%s non é un ficheiro normal" + +#: lib/util/sudo_conf.c:566 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s é propiedade de uid %u, pero debería ser %u" + +#: lib/util/sudo_conf.c:570 +#, c-format +msgid "%s is world writable" +msgstr "%s é escribíbel por todo o mundo" + +#: lib/util/sudo_conf.c:573 +#, c-format +msgid "%s is group writable" +msgstr "%s é escribíbel polo grupo" + +#: lib/util/sudo_conf.c:583 src/selinux.c:199 src/selinux.c:212 src/sudo.c:328 +#, c-format +msgid "unable to open %s" +msgstr "non foi posíbel abrir %s" + +#: src/exec.c:114 src/exec.c:116 src/exec.c:121 src/exec.c:409 src/exec.c:411 +#: src/exec.c:413 src/exec.c:415 src/exec.c:417 src/exec.c:420 src/exec.c:437 +#: src/exec.c:439 src/exec.c:441 src/exec.c:596 src/exec.c:791 +#: src/exec_pty.c:466 src/exec_pty.c:722 src/exec_pty.c:792 src/exec_pty.c:794 +#: src/exec_pty.c:806 src/exec_pty.c:808 src/exec_pty.c:1285 +#: src/exec_pty.c:1287 src/exec_pty.c:1292 src/exec_pty.c:1294 +#: src/exec_pty.c:1308 src/exec_pty.c:1319 src/exec_pty.c:1321 +#: src/exec_pty.c:1323 src/exec_pty.c:1325 src/exec_pty.c:1327 +#: src/exec_pty.c:1329 src/exec_pty.c:1331 src/signal.c:147 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "non foi posíbel definir o manexador para o sinal %d" + +#: src/exec.c:126 src/exec_pty.c:838 src/exec_pty.c:1369 src/tgetpass.c:265 +msgid "unable to fork" +msgstr "non é posíbel realizar fork" + +#: src/exec.c:304 src/exec.c:312 src/exec.c:869 src/exec_pty.c:604 +#: src/exec_pty.c:611 src/exec_pty.c:654 src/exec_pty.c:659 src/exec_pty.c:942 +#: src/exec_pty.c:952 src/exec_pty.c:997 src/exec_pty.c:1004 +#: src/exec_pty.c:1434 src/exec_pty.c:1441 src/exec_pty.c:1448 +msgid "unable to add event to queue" +msgstr "non foi posíbel engadir o evento á cola" + +#: src/exec.c:392 +msgid "unable to create sockets" +msgstr "non foi posíbel crear sockets" + +#: src/exec.c:448 +msgid "policy plugin failed session initialization" +msgstr "produciuse un erro durante a inicialización de sesión do engadido de política" + +#: src/exec.c:493 +msgid "error in event loop" +msgstr "erro no bucle de eventos" + +#: src/exec.c:511 +msgid "unable to restore tty label" +msgstr "non foi posíbel restaurar a etiqueta tty" + +#: src/exec.c:604 src/exec_pty.c:498 src/signal.c:86 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "non foi posíbel restaurar o manexador para o sinal %d" + +#: src/exec.c:722 src/exec_pty.c:1176 +msgid "error reading from signal pipe" +msgstr "produciuse un erro ao ler desde a tubería do sinal" + +#: src/exec_common.c:64 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "non foi posíbel retirar PRIV_PROC_EXEC desde PRIV_LIMIT" + +#: src/exec_pty.c:188 +msgid "unable to allocate pty" +msgstr "non foi posíbel asignar pty" + +#: src/exec_pty.c:766 src/exec_pty.c:775 src/exec_pty.c:783 +#: src/exec_pty.c:1277 src/exec_pty.c:1366 src/signal.c:128 src/tgetpass.c:261 +msgid "unable to create pipe" +msgstr "non foi psosíbel crear tubería" + +#: src/exec_pty.c:1209 +msgid "error reading from pipe" +msgstr "produciuse un erro ao ler da tubería" + +#: src/exec_pty.c:1234 +msgid "error reading from socketpair" +msgstr "produciuse un erro ao ler de socketpair" + +#: src/exec_pty.c:1243 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipo de resposta inesperada en canles alternos %d" + +#: src/exec_pty.c:1345 +msgid "unable to set controlling tty" +msgstr "non foi posíebl estabelecer o controlador tty" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:80 +#: src/load_plugins.c:110 src/load_plugins.c:116 src/load_plugins.c:122 +#: src/load_plugins.c:163 src/load_plugins.c:171 src/load_plugins.c:178 +#: src/load_plugins.c:184 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "produciuse un erro en %s, liña %d ao cargar o engadido «%s»" + +#: src/load_plugins.c:82 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:118 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s debe ser propiedade do uid %d" + +#: src/load_plugins.c:124 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s só debe ter permisos de escritura polo propietario" + +#: src/load_plugins.c:165 +#, c-format +msgid "unable to load %s: %s" +msgstr "non foi posíbel cargar %s: %s" + +#: src/load_plugins.c:173 +#, c-format +msgid "unable to find symbol `%s' in %s" +msgstr " non foi posíbel atopar o símbolo «%s» en %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "tipo de política descoñecida %d atopado en %s" + +#: src/load_plugins.c:186 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "versión principal %d do engadido incompatíbel (agardábase %d) atopouse en %s" + +#: src/load_plugins.c:195 +#, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "" + +#: src/load_plugins.c:197 +msgid "only a single policy plugin may be specified" +msgstr "só se pode especificar unha política de engadido" + +#: src/load_plugins.c:200 +#, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "" + +#: src/load_plugins.c:221 +#, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "" + +#: src/load_plugins.c:324 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "a política do engadido %s non inclúe un método check_policy" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:437 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, desbordamento en %s" + +#: src/parse_args.c:239 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "o agumento -C debe ser un número maior ou igual a 3" + +#: src/parse_args.c:406 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "non se deben especificar as opcións «-i» e «-s» simultáneamente" + +#: src/parse_args.c:410 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "non se deben especificar as opcións «-i» e «-E» simultáneamente" + +#: src/parse_args.c:420 +msgid "the `-E' option is not valid in edit mode" +msgstr "a opción «-E» non é válida no modo edición" + +#: src/parse_args.c:422 +msgid "you may not specify environment variables in edit mode" +msgstr "non se deben especificar variábeis de ambiente no modo edición" + +#: src/parse_args.c:430 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "a opción «-U» só se pode usar coa opción «-l»" + +#: src/parse_args.c:434 +msgid "the `-A' and `-S' options may not be used together" +msgstr "as opcións «-A» e «-S» non se poden empregar conxuntamente" + +#: src/parse_args.c:504 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit non se admite nesta plataforma" + +#: src/parse_args.c:577 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Só pode especificar unha das opcións -e, -h, -i, -K, -l, -s, -v ou -V" + +#: src/parse_args.c:591 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita ficheiros como outro usuario\n" +"\n" + +#: src/parse_args.c:593 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - executa unha orde como outro usuario\n" +"\n" + +#: src/parse_args.c:598 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opcións:\n" + +#: src/parse_args.c:600 +msgid "use a helper program for password prompting" +msgstr "usar un programa auxiliar para a solicitude de contrasinal" + +#: src/parse_args.c:603 +msgid "use specified BSD authentication type" +msgstr "usar tipo de autenticación especificado en BSD" + +#: src/parse_args.c:606 +msgid "run command in the background" +msgstr "executa unha orde en segundo plano" + +#: src/parse_args.c:608 +msgid "close all file descriptors >= num" +msgstr "pecha todos os descritores de ficheiro >= num" + +#: src/parse_args.c:611 +msgid "run command with the specified BSD login class" +msgstr "executa unha orde coa clase de inicio de sesión especificada" + +#: src/parse_args.c:614 +msgid "preserve user environment when running command" +msgstr "conserva o ambiente de usuario ao executar unha orde" + +#: src/parse_args.c:616 +msgid "edit files instead of running a command" +msgstr "edita ficheiros no lugar de executar unha orde" + +#: src/parse_args.c:618 +msgid "run command as the specified group name or ID" +msgstr "executa unha orde como o nome ou ID de grupo especificado" + +#: src/parse_args.c:620 +msgid "set HOME variable to target user's home dir" +msgstr "define a variábel HOME como o cartafol de inicio do usuario" + +#: src/parse_args.c:622 +msgid "display help message and exit" +msgstr "mostra esta mensaxe de axuda e sae" + +#: src/parse_args.c:624 +msgid "run command on host (if supported by plugin)" +msgstr "" + +#: src/parse_args.c:626 +msgid "run login shell as the target user; a command may also be specified" +msgstr "executar un intérprete de ordes de inicio como o usuario destino; tamén se pode especificar unha orde" + +#: src/parse_args.c:628 +msgid "remove timestamp file completely" +msgstr "retira completamente un ficheiro de marca de tempo" + +#: src/parse_args.c:630 +msgid "invalidate timestamp file" +msgstr "invalidar o ficheiro de marca de tempo" + +#: src/parse_args.c:632 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "listar os privilexios do usuario ou comprobar unha orde específica; usar dúas veces para un formato máis longo" + +#: src/parse_args.c:634 +msgid "non-interactive mode, no prompts are used" +msgstr "modo non interactivo, non se preguntará ao usuario" + +#: src/parse_args.c:636 +#, fuzzy +msgid "preserve group vector instead of setting to target's" +msgstr "conserva o vector de grupos en vez de definilo ao obxectivo" + +#: src/parse_args.c:638 +msgid "use the specified password prompt" +msgstr "usa o contrasinal especificado" + +#: src/parse_args.c:641 +msgid "create SELinux security context with specified role" +msgstr "crea un contexto de seguranza SELinux co rol especificado" + +#: src/parse_args.c:644 +msgid "read password from standard input" +msgstr "le o contrasinal desde a entrada estándar" + +#: src/parse_args.c:646 +msgid "run shell as the target user; a command may also be specified" +msgstr "executar o intérprete de ordes como o usuario destino; tamén se pode especificar unha orde" + +#: src/parse_args.c:649 +msgid "create SELinux security context with specified type" +msgstr "crea un contexto de seguranza SELinux co tipo especificado" + +#: src/parse_args.c:652 +msgid "in list mode, display privileges for user" +msgstr "en modo lista, mostrar os privilexios do usuario" + +#: src/parse_args.c:654 +msgid "run command (or edit file) as specified user name or ID" +msgstr "executa unha orde (ou edita un ficheiro) como o nome ou ID de usuario especificado" + +#: src/parse_args.c:656 +msgid "display version information and exit" +msgstr "mostra a información da versión e sae" + +#: src/parse_args.c:658 +msgid "update user's timestamp without running a command" +msgstr "actualiza a marca de tempo do usuario sen executar ningunha orde" + +#: src/parse_args.c:660 +msgid "stop processing command line arguments" +msgstr "detén o proceso de argumentos da liña de ordes" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "non foi posíbel abrir o sistema de auditoría" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "non foi posíbel enviar a mensaxe de auditoría" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "non foi posíbel executar fgetfilecon %s" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "%s etiquetas cambiadas" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "non foi posíbel restaurar o contexto para %s" + +#: src/selinux.c:166 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "non foi posíbel abrir %s, non volver a etiquetar tty" + +#: src/selinux.c:175 +msgid "unable to get current tty context, not relabeling tty" +msgstr "non foi posíbel obter o contexto actual de tty, non se volve etiquetar tty" + +#: src/selinux.c:182 +msgid "unable to get new tty context, not relabeling tty" +msgstr "non foi posíbel obter o novo contexto tty, non volver a etiquetar tty" + +#: src/selinux.c:189 +msgid "unable to set new tty context" +msgstr "non foi posíbel estabelecer o novo contexto tty" + +#: src/selinux.c:255 +#, c-format +msgid "you must specify a role for type %s" +msgstr "débese especificar unha regra por tipo %s" + +#: src/selinux.c:261 +#, c-format +msgid "unable to get default type for role %s" +msgstr "non foi posíbel obter o tipo de regra predeterminada %s" + +#: src/selinux.c:279 +#, c-format +msgid "failed to set new role %s" +msgstr "produciuse un erro ao definir a nova regra %s" + +#: src/selinux.c:283 +#, c-format +msgid "failed to set new type %s" +msgstr "produciuse un erro ao definir o novo tipo %s" + +#: src/selinux.c:295 +#, c-format +msgid "%s is not a valid context" +msgstr "%s non é un contexto válido" + +#: src/selinux.c:330 +msgid "failed to get old_context" +msgstr "produciuse un erro ao obter old_context" + +#: src/selinux.c:336 +msgid "unable to determine enforcing mode." +msgstr "non foi posíbel determinar o método de forzado" + +#: src/selinux.c:353 +#, c-format +msgid "unable to set tty context to %s" +msgstr "non foi posíbel definir o contexto tty para %s" + +#: src/selinux.c:392 +#, c-format +msgid "unable to set exec context to %s" +msgstr "non foi posíbel o contexto de execución a %s" + +#: src/selinux.c:399 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "non foi posíbel estabelecer a chave de creación de contexto a %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "require cando menos un argumento" + +#: src/sesh.c:107 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "non foi posíbel executar %s como shell de inicio de sesión" + +#: src/sesh.c:112 src/sudo.c:1217 +#, c-format +msgid "unable to execute %s" +msgstr "non é posíbel executar %s" + +#: src/signal.c:68 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "non foi posíbel gardar o manexador para o sinal %d" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "acadouse o límite de control de recursos" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "o usuario «%s» non é membro do grupo «%s»" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "a tarefa que invoca é definitiva" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "non é posíbel unirse ao proxecto «%s»" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "non hai fondo de recursos aceptando as asignacións existentes par ao proxecto «%s»" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "o fondo de recursos especificado non existe para o proxecto «%s»" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "non é posíbel ligar ao fondo de recursos predeterminado para o proxecto «%s»" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "configuración do proxecto fallada «%s»" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "aviso, o control de asignación de recuros fallou para o proxecto «%s»" + +#: src/sudo.c:193 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versión %s\n" + +#: src/sudo.c:195 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opcións de configuración: %s\n" + +#: src/sudo.c:203 +msgid "fatal error, unable to load plugins" +msgstr "erro fatal, non foi posíbel cargar os engadidos" + +#: src/sudo.c:211 +msgid "unable to initialize policy plugin" +msgstr "non foi posíbel inicializar a normativa do engadido" + +#: src/sudo.c:267 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "erro ao inicializar os engadidos de E/S %s" + +#: src/sudo.c:293 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "modo sudo 0x%x non agardado" + +#: src/sudo.c:422 +msgid "unable to get group vector" +msgstr "non é posíbel obter o vector de grupo" + +#: src/sudo.c:485 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "uid descoñecido %u: quen é vostede?" + +#: src/sudo.c:812 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s debe ser propiedade do uid %d e debe ter definido o bit setuid" + +#: src/sudo.c:815 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "o uid efectivo non é %d, é %s nun sistema de ficheiros coa opción «nosuid» definida ou nun sistema de ficheiros NFS sen privilexios de root?" + +#: src/sudo.c:821 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "o uid efectivo non é %d, está sudo instalado con setuid de root?" + +#: src/sudo.c:952 +#, c-format +msgid "unknown login class %s" +msgstr "clase de inicio de sesión descoñecida %s" + +#: src/sudo.c:965 +msgid "unable to set user context" +msgstr "non foi posíbel estabelecer o contexto do usuario" + +#: src/sudo.c:979 +msgid "unable to set supplementary group IDs" +msgstr "non foi posíbel estabelecer o grupo suplementario de IDs" + +#: src/sudo.c:986 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "non foi posíbel estabelcer o gid efectivo para executar como gid %u" + +#: src/sudo.c:992 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "non foi posíbel estabelcer o gid para executar como gid %u" + +#: src/sudo.c:999 +msgid "unable to set process priority" +msgstr "non foi posíbel estabelecer a prioridade de proceso" + +#: src/sudo.c:1007 +#, c-format +msgid "unable to change root to %s" +msgstr "non foi posíbel cambiar de root a %s" + +#: src/sudo.c:1020 src/sudo.c:1026 src/sudo.c:1033 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "non foi posíbel cambiar as runas uid (%u, %u)" + +#: src/sudo.c:1051 +#, c-format +msgid "unable to change directory to %s" +msgstr "non foi posíbel cambiar ao cartafol %s" + +#: src/sudo.c:1112 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "terminación de condición filla non agardada: %d" + +#: src/sudo.c:1245 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "a política do engadido %s non inclúe ningún método «check_policy»" + +#: src/sudo.c:1263 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "a política do engadido %s non admite listar os privilexios" + +#: src/sudo.c:1280 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "a política do engadido %s non admite a opción -v" + +#: src/sudo.c:1295 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "a normativa do engadido %s non admite as opcións -k/-K" + +#: src/sudo_edit.c:238 src/sudo_edit.c:339 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: non é un ficheiro regular" + +#: src/sudo_edit.c:245 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: a edición de ligazóns simbólicas non está permitida" + +#: src/sudo_edit.c:276 src/sudo_edit.c:378 +#, c-format +msgid "%s: short write" +msgstr "%s: escritura curta" + +#: src/sudo_edit.c:340 +#, c-format +msgid "%s left unmodified" +msgstr "%s sen modificar" + +#: src/sudo_edit.c:353 src/sudo_edit.c:539 +#, c-format +msgid "%s unchanged" +msgstr "%s sen cambios" + +#: src/sudo_edit.c:367 src/sudo_edit.c:389 +#, c-format +msgid "unable to write to %s" +msgstr "non foi posíbel escribir en %s" + +#: src/sudo_edit.c:368 src/sudo_edit.c:387 src/sudo_edit.c:390 +#: src/sudo_edit.c:564 src/sudo_edit.c:568 +#, c-format +msgid "contents of edit session left in %s" +msgstr "os contidos de edición de sesión déixanse en %s" + +#: src/sudo_edit.c:386 +msgid "unable to read temporary file" +msgstr "non é posíbel ler o ficheiro temporal" + +#: src/sudo_edit.c:469 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: erro interno: número impar de rutas" + +#: src/sudo_edit.c:471 +msgid "sesh: unable to create temporary files" +msgstr "sesh: non é posíbel crear ficheiros temporais" + +#: src/sudo_edit.c:473 src/sudo_edit.c:571 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: erro descoñecido %d" + +#: src/sudo_edit.c:563 +msgid "unable to copy temporary files back to their original location" +msgstr "non foi posíbel copiar os ficheiros temporais de volta á súa localización orixinal" + +#: src/sudo_edit.c:567 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "non foi posíbel copiar algúns ficheiros temporais de volta á súa localización orixinal" + +#: src/sudo_edit.c:610 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "non foi posíbel cambiar uid a root (%u)" + +#: src/sudo_edit.c:627 +msgid "plugin error: missing file list for sudoedit" +msgstr "erro do engadido: falta a lista de ficheiros para sudoedit" + +#: src/sudo_edit.c:668 src/sudo_edit.c:681 +msgid "unable to read the clock" +msgstr "non foi posíbel ler o reloxo" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "sen tty presente e non se especificou un programa askpass" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "non hai programa askpass especificado, tente estabelecer SUDO_ASKPASS" + +#: src/tgetpass.c:276 +#, c-format +msgid "unable to set gid to %u" +msgstr "non foi posíbel estabelecer o gid a %u" + +#: src/tgetpass.c:280 +#, c-format +msgid "unable to set uid to %u" +msgstr "non foi posíbel estabelecer o uid a %u" + +#: src/tgetpass.c:285 +#, c-format +msgid "unable to run %s" +msgstr "non foi posíbel executar %s" + +#: src/utmp.c:266 +msgid "unable to save stdin" +msgstr "non foi posíbel gardar stdin" + +#: src/utmp.c:268 +msgid "unable to dup2 stdin" +msgstr "non foi posíbel facer dup2 stdin" + +#: src/utmp.c:271 +msgid "unable to restore stdin" +msgstr "non foi posíbel restaurar stdin" + +#~ msgid "internal error, tried to emalloc(0)" +#~ msgstr "erro interno: tentou emalloc(0)" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "erro interno: tentou emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "erro interno, tentou ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "erro interno, tentou erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "erro interno, tentou erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "erro interno, tentou erealloc(0)" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "non foi posíbel estabelcer a terminal en modo directo" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: desbordamento detectado" + +#~ msgid "unable to open socket" +#~ msgstr "non foi posíbel abrir o socket" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "select failed" +#~ msgstr "selección fallada" + +#~ msgid "list user's available commands\n" +#~ msgstr "lista de ordes do usuario dispoñíbeis\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "executa un intérprete de ordes como un determinado usuario\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "cando está na lista, mostra os privilexios do usuario especificado\n" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: debe ser especificada cando menos unha política de engadido" + +#~ msgid "must be setuid root" +#~ msgstr "debe ser setuid root" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "erro interno: desbordamento de erealloc3(0)" diff --git a/utsudo-0.0.2/po/hr.mo b/utsudo-0.0.2/po/hr.mo new file mode 100644 index 0000000000000000000000000000000000000000..753dce7bf2edaf5c7b84aa0435e661940324485e GIT binary patch literal 19810 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/hr.po b/utsudo-0.0.2/po/hr.po new file mode 100644 index 0000000..f133647 --- /dev/null +++ b/utsudo-0.0.2/po/hr.po @@ -0,0 +1,1010 @@ +# Translation of sudo to Croatian. +# This file is put in the public domain. +# Tomislav Krznar , 2012, 2013. +# Božidar Putanec , 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 12:10-0700\n" +"Last-Translator: Božidar Putanec \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.2.4\n" +"X-Poedit-Basepath: sources/sudo-1.8.26b1\n" +"X-Poedit-SearchPath-0: .\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "nije moguće otvoriti userdb (korisnička baza podataka)" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "nije moguće prebaciti se u registar „%s“ za %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "nije moguće obnoviti registar" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "nije moguće dodijeliti memoriju" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Nepoznati signal" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "nevaljana vrijednost" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "veličina je prevelika" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "veličina je premala" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "nevaljana Path vrijednost „%s“ u %s, redak %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "nevaljana vrijednost za %s „%s“ u %s, redak %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nepodržani izvor grupe „%s“ u %s, redak %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "nevaljani maksimalni broj grupa „%s“ u %s, redak %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "nije moguće dobiti status od %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nije obična datoteka" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "vlasnik %s je UID %u, a trebao bi biti %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s može svatko mijenjati/pisati" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s može svaki član grupe mijenjati/pisati" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "nije moguće otvoriti %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "nepoznata prijavnička klasa %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "nije moguće uspostaviti korisnički kontekst" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "nije moguće uspostaviti prioritet procesa" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "nije moguće promijeniti root na %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "nije moguće promijeniti na runas UID (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "nije moguće promijeniti direktorij na %s" + +# Handler, an asynchronous callback (computer programming) subroutine in computing +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "nije moguće postaviti rukovatelja za signal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "nije moguće ukloniti PRIV_PROC_EXEC iz PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "greška čitanja iz para utičnica" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "neočekivana vrsta odgovora na povratnom kanalu: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "nije moguće dodati događaj u red čekanja" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "nije moguće uspostaviti upravljački TTY" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "nije moguće napraviti cijev" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "nije moguće primiti poruku od pretka (roditelja)" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "nije moguće kreirati potomka (dijete)" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "nije moguće obnoviti TTY etiketu" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "nije moguće izvršiti %s" + +# initialization > inicirati > dati/davati inicijativu, pobudu; pokrenuti/pokretati, započeti/započinjati +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "plugin s pravilima nije uspio pokrenuti inicijalizaciju sesije" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "greška u petlji događaja" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "nije moguće obnoviti rukovatelja za signal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "nije moguće dodijeliti PTY" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "nije moguće napraviti utičnice" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "nije moguće poslati poruku za praćenje procesa" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "greška u %s, redak %d pri učitavanju plugina „%s“" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "vlasnik %s mora biti UID %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s za pisanje mora biti dostupan samo vlasniku" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "nije moguće učitati %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nije moguće pronaći simbol „%s“ u %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "nepoznata vrsta pravila %d pronađena u %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "nekompatibilni plugin inačica %d (očekivana %d) pronađen u %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignorira se plugin s pravilima „%s“ u %s, redak %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "smije se navesti samo jedan plugin s pravilima" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignorira se duplikat plugina s pravilima „%s“ u %s, redak %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignorira se duplikat U/I plugina „%s“ u %s, redak %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "plugin s pravilima %s ne sadrži metodu check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "**interna greška**, %s prelijevanje" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nevaljano ime varijable okoline: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argument za -C mora biti broj veći ili jednak 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "ne smijete navesti opcije „-i“ i „-s“ zajedno" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "ne smijete navesti opcije „-i“ i -„E“ zajedno" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "opcija „-E“ nije valjana kad se redigira (in edit mode)" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "ne smijete specificirati varijable okoline kad se redigira (in edit mode)" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "opciju „-U“ može se koristiti samo s „-l“ opcijom" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "ne smiju se zajedno koristiti „-A“ i „-S“ opcije" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit nije podržan na ovoj platformi" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Smije se navesti samo jedna od opcija -e, -h, -i, -K, -l, -s, -v i -V" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - redigira datoteku kao neki drugi korisnik\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - izvrši naredbu kao neki drugi korisnik\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opcije:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "zahtjev za lozinku koristi pomoćni program" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "rabi navedenu BSD autentifikaciju" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "pokrene naredbu u pozadini" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "pozvoni kad treba ulaz ili kad nešto pita" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "zatvara sve deskriptore datoteka >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "pokrene naredbu s navedenom BSD klasom prijave" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "sačuva okolinu korisnika pri izvršenju naredbe" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "sačuva specifične varijable okoline" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "redigira datoteke umjesto pokretanja naredbe" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "izvrši naredbu kao navedeno group ime ili ID" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "var HOME postavi na osobni direktorij korisnika" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "pokaže ovu pomoć i iziđe" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "pokrene naredbu na host računalu (ako to plugin podržava)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "pokrene prijavnu ljusku kao ciljani korisnik; može se navesti i naredba" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "sasvim ukloni datoteku s vremenskim oznakama" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "poništi datoteku s vremenskim oznakama" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "privilegije korisnika ili test specifične naredbe; rabite -ll za duži popis" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "ne-interaktivni mȏd; bez prompta" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "sačuva grupni vektor umjesto postavljanja na ciljanu grupu" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "koristi navedeni prompt za unos lozinke" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "stvori SELinux sigurnosni kontekst s navedenom role ulogom" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "čita lozinku iz standardnog ulaza" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "pokrene ljusku kao ciljani korisnik; može se navesti i naredba" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "stvori SELinux sigurnosni kontekst s navedenom type ulogom" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "naredba završi nakon navedenoga timeout vremena" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "izlista popis privilegija user korisnika" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "pokreni naredbu (ili redigira datoteku) kao navedeni user korisnik" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "informira o inačici ovog programa i iziđe" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "obnovi vremensku oznaku korisnika bez pokretanja naredbe" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "prestane s obradom argumenata na naredbenom retku" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "nije moguće otvoriti revizijski sustav" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "nije moguće poslati revizijsku poruku" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "neuspješna fgetfilecon() %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s je promijenio etikete" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "nije moguće obnoviti kontekst za %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "nije moguće otvoriti %s, oznaka TTY se ne mijenja" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s nije znakovni uređaj (c-device), oznaka TTY se me mijenja" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nije moguće dobiti trenutačni TTY kontekst, oznaka TTY se me mijenja" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "nepoznata sigurnosna klasa „chr_file“, oznaka TTY se me mijenja" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "nije moguće dobiti novi TTY kontekst, oznaka TTY se me mijenja" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "nije moguće uspostaviti novi TTY kontekst" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "morate navesti ulogu za vrstu %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "nije moguće dobiti zadanu vrstu za ulogu %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "nije uspjelo dobiti novi kontekst" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "nije uspjelo postaviti novu ulogu %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "nije uspjelo postaviti novu vrstu %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nije valjani kontekst" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "nije uspjelo dobiti stari kontekst" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "nije moguće odrediti način provedbe." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "nije moguće postaviti TTY kontekst za %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "nije moguće postaviti exec kontekst na %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "nije moguće postaviti kontekst stvaranja ključa na %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "zahtijeva barem jedan argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "nevaljani broj deskriptora datoteke: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "nije moguće pokrenuti %s kao prijavnu ljusku" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "nije moguće sačuvati rukovatelja za signal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "dosegnuta je granica upravljanja resursima" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "korisnik „%s“ nije član projekta „%s“" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "pozvani zadatak je zadnji -- svršetak" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nije bilo moguće pridružiti se projektu „%s“" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "ne postoji skup resursa koji prihvaća zadane poveznice za projekt „%s“" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "ne postoji navedeni skup resursa za projekt „%s“" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "nije bilo moguće povezati se na zadani skup resursa za projekt „%s“" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "neuspješna setproject() za projekt „%s“" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "upozorenje: nije uspjelo dodijeliti upravljanje resursima projekta „%s“" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo inačica %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Konfiguracijske opcije: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "kobna greška, nije moguće učitati plugine" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "nije moguće inicijalizirati plugin s pravilima" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "plugin nije uzvratio naredbu za izvršiti" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "greška pri inicijalizaciji U/I plugina %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "neočekivani sudo mȏd 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "vas nema u %s bazi podataka" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "nije moguće odrediti TTY" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "vlasnik %s mora biti UID %d i mora imati postavljeni setuid bit" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "efektivni UID nije %d; je li %s na datotečnom sustavu s postavljenom opcijom „nosuid“ ili NFS datotečnom sustavu bez root privilegija?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "efektivni UID nije %d; je li sudo instaliran sa setuid root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "nije moguće postaviti ID dodatnih grupa" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "nije moguće postaviti efektivni GID na runas GID %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "nije moguće postaviti GID na runas GID %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "neočekivano stanje završetka potomka (dijete-procesa) : %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "plugin s pravilima %s nema metodu „check_policy“" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "plugin s pravilima %s ne podržava ispis ovlasti" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "plugin s pravilima %s ne podržava opciju -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "plugin s pravilima %s ne podržava -k/-K opcije" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "nije pronađen privremeni direktorij u koji je moguće pisati" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "nije moguće obnoviti trenutačni radni direktorij" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nije obična datoteka" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: simboličke veze nije dopušteno redigirati" + +# writable> zapisiv, upisiv, u kojem je dopušteno pisati +# http://hjp.znanje.hr/ > upisiv > koji se može upisati, koji ispunjava uvjete upisa +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: datoteke nije dopušteno redigirati u direktoriju koji dopušta pisanje" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: nepotpuni zapis" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s nije izmijenjeno" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s nije promijenjeno" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "nije moguće pisati u %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "sadržaj sesije redigiranja je ostavljen u %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "nije moguće čitati privremenu datoteku" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: interna greška: neparni broj staza" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: nije moguće čitati privremenu datoteku" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: nepoznata greška: %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "nije moguće kopirati privremene datoteke u njihovu originalnu lokaciju" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "nije moguće kopirati neke od privremenih datoteka u njihovu originalnu lokaciju" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "nije moguće promijeniti UID na root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "greška plugina: nedostaje popis datoteka za sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "nije moguće očitati vrijeme (clock)" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "vrijeme za čitanje lozinke je isteklo" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "nema lozinke (nije unesena)" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "nije moguće pročitati lozinku" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "za čitanje lozinke trebate terminal; rabite opciju -S za čitanje sa standardnog ulaza ili konfigurirajte askpass pomoćnika (pomoćni program)" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nije specificiran askpass program, pokušajte postaviti SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "nije moguće postaviti GID na %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "nije moguće postaviti UID na %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "nije moguće pokrenuti %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "nije moguće sačuvati stdin" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "dup2 nije moguće primijeniti na stdin" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "nije moguće obnoviti stdin" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "nema TTY i nije specificiran askpass program" + +#~ msgid "unable to get group vector" +#~ msgstr "nije moguće dobiti grupni vektor" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "nepoznat UID %u: tko ste vi?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "greška čitanja iz signalne cijevi" + +#~ msgid "error reading from pipe" +#~ msgstr "greška čitanja iz cjevovoda" + +#~ msgid "internal error, tried to emalloc(0)" +#~ msgstr "interna greška, pokušao sam emalloc(0)" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "interna greška, pokušao sam emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "interna greška, pokušao sam ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "interna greška, pokušao sam erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "interna greška, pokušao sam erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "interna greška, pokušao sam erecalloc(0)" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "select failed" +#~ msgstr "odabir nije uspio" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "ne mogu postaviti terminal u sirovi način" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: otkriven preljev" + +#~ msgid "unable to open socket" +#~ msgstr "ne mogu otvoriti utičnicu" + +#~ msgid "list user's available commands\n" +#~ msgstr "ispiši dostupne korisničke naredbe\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "pokreni ljusku kao odredišni korisnik\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "pri ispisu, ispiši navedene korisničke ovlasti\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "interna greška, emalloc2() preljev" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "interna greška, erealloc3() preljev" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: mora biti naveden barem jedan priključak police" diff --git a/utsudo-0.0.2/po/hu.mo b/utsudo-0.0.2/po/hu.mo new file mode 100644 index 0000000000000000000000000000000000000000..18d2282ebe334f3f24bbca819a402e7fd2436811 GIT binary patch literal 20126 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 F{{UeVsUQFV literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/hu.po b/utsudo-0.0.2/po/hu.po new file mode 100644 index 0000000..4a66835 --- /dev/null +++ b/utsudo-0.0.2/po/hu.po @@ -0,0 +1,883 @@ +# Hungarian translation for sudo. +# Copyright (C) 2016, 2017, 2018 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# +# Gabor Kelemen , 2016. +# Balázs Úr , 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.21b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-08-03 10:04-0600\n" +"PO-Revision-Date: 2018-01-20 13:53+0100\n" +"Last-Translator: Balázs Úr \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Launchpad-Export-Date: 2016-01-03 00:40+0000\n" +"X-Generator: Lokalize 1.2\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "userdb megnyitása sikertelen" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "a(z) „%s” regisztrációs adatbázisra váltás sikertelen ennél: %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "a rendszerleíró visszaállítása sikertelen" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:186 lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 +#: lib/util/sudo_conf.c:553 src/conversation.c:75 src/exec_common.c:107 +#: src/exec_common.c:123 src/exec_common.c:132 src/exec_monitor.c:167 +#: src/exec_nopty.c:462 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/exec_pty.c:867 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:198 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:663 src/sudo.c:673 src/sudo.c:693 src/sudo.c:712 src/sudo.c:721 +#: src/sudo.c:730 src/sudo.c:747 src/sudo.c:788 src/sudo.c:798 src/sudo.c:818 +#: src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 src/sudo.c:1351 +#: src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:187 +#: lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 lib/util/sudo_conf.c:553 +#: src/conversation.c:76 src/exec_common.c:107 src/exec_common.c:124 +#: src/exec_common.c:133 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:199 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:818 src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 +#: src/sudo.c:1351 src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +msgid "unable to allocate memory" +msgstr "a memóriafoglalás sikertelen" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Ismeretlen szignál" + +#: lib/util/strtoid.c:77 lib/util/strtoid.c:124 lib/util/strtoid.c:152 +#: lib/util/strtomode.c:49 lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "érvénytelen érték" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:55 lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "túl magas érték" + +#: lib/util/strtoid.c:86 lib/util/strtoid.c:137 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:182 +msgid "value too small" +msgstr "túl alacsony érték" + +#: lib/util/sudo_conf.c:205 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "érvénytelen „%s” útvonal érték a(z) %s, %u. sorában" + +#: lib/util/sudo_conf.c:371 lib/util/sudo_conf.c:424 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "a(z) %s értéke („%s”) érvénytelen a(z) %s, %u. sorában" + +#: lib/util/sudo_conf.c:392 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nem támogatott „%s” csoportforrás a(z) %s, %u. sorában" + +#: lib/util/sudo_conf.c:408 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "érvénytelen legnagyobb csoportok („%s”) a(z) %s, %u. sorában" + +#: lib/util/sudo_conf.c:569 +#, c-format +msgid "unable to stat %s" +msgstr "%s nem érhető el" + +#: lib/util/sudo_conf.c:572 +#, c-format +msgid "%s is not a regular file" +msgstr "a(z) %s nem szabályos fájl" + +#: lib/util/sudo_conf.c:575 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s a(z) %u uid tulajdona, ennek kellene lennie: %u" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is world writable" +msgstr "%s bárki számára írható" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is group writable" +msgstr "%s a csoport számára írható" + +#: lib/util/sudo_conf.c:592 src/selinux.c:208 src/selinux.c:225 src/sudo.c:357 +#, c-format +msgid "unable to open %s" +msgstr "%s nem nyitható meg" + +#: src/exec.c:160 +#, c-format +msgid "unknown login class %s" +msgstr "ismeretlen %s logikai osztály" + +#: src/exec.c:173 +msgid "unable to set user context" +msgstr "a felhasználói környezet beállítása sikertelen" + +#: src/exec.c:189 +msgid "unable to set process priority" +msgstr "a folyamat prioritásának beállítása sikertelen" + +#: src/exec.c:197 +#, c-format +msgid "unable to change root to %s" +msgstr "a gyökér megváltoztatása sikertelen erre: %s" + +#: src/exec.c:210 src/exec.c:216 src/exec.c:223 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "a runas uid értékre (%u, %u) váltás sikertelen" + +#: src/exec.c:241 +#, c-format +msgid "unable to change directory to %s" +msgstr "a könyvtárváltás sikertelen erre: %s" + +#: src/exec.c:337 src/exec_monitor.c:526 src/exec_monitor.c:528 +#: src/exec_nopty.c:520 src/exec_pty.c:472 src/exec_pty.c:1184 +#: src/exec_pty.c:1186 src/signal.c:139 src/signal.c:153 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "%d szignál kezelőjének beállítása sikertelen" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "a PRIV_PROC_EXEC eltávolítása sikertelen a PRIV_LIMIT-ből" + +#: src/exec_monitor.c:326 +msgid "error reading from socketpair" +msgstr "hiba a foglalatpárból való olvasáskor" + +#: src/exec_monitor.c:338 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "váratlan választípus a visszcsatornán: %d" + +#: src/exec_monitor.c:423 src/exec_monitor.c:431 src/exec_monitor.c:439 +#: src/exec_monitor.c:446 src/exec_monitor.c:453 src/exec_monitor.c:460 +#: src/exec_monitor.c:467 src/exec_monitor.c:474 src/exec_monitor.c:481 +#: src/exec_monitor.c:488 src/exec_nopty.c:215 src/exec_nopty.c:224 +#: src/exec_nopty.c:231 src/exec_nopty.c:238 src/exec_nopty.c:245 +#: src/exec_nopty.c:252 src/exec_nopty.c:259 src/exec_nopty.c:266 +#: src/exec_nopty.c:273 src/exec_nopty.c:280 src/exec_nopty.c:287 +#: src/exec_nopty.c:294 src/exec_nopty.c:302 src/exec_pty.c:563 +#: src/exec_pty.c:568 src/exec_pty.c:635 src/exec_pty.c:642 src/exec_pty.c:743 +#: src/exec_pty.c:1029 src/exec_pty.c:1038 src/exec_pty.c:1045 +#: src/exec_pty.c:1052 src/exec_pty.c:1059 src/exec_pty.c:1066 +#: src/exec_pty.c:1073 src/exec_pty.c:1080 src/exec_pty.c:1087 +#: src/exec_pty.c:1094 src/exec_pty.c:1101 src/exec_pty.c:1446 +#: src/exec_pty.c:1456 src/exec_pty.c:1501 src/exec_pty.c:1508 +#: src/exec_pty.c:1533 +msgid "unable to add event to queue" +msgstr "az esemény hozzáadása a sorhoz sikertelen" + +#: src/exec_monitor.c:540 +msgid "unable to set controlling tty" +msgstr "a vezérlő tty beállítása sikertelen" + +#: src/exec_monitor.c:548 src/exec_nopty.c:359 src/exec_pty.c:1261 +#: src/exec_pty.c:1280 src/exec_pty.c:1298 src/tgetpass.c:246 +msgid "unable to create pipe" +msgstr "adatcsatorna létrehozása sikertelen" + +#: src/exec_monitor.c:553 src/exec_nopty.c:377 src/exec_pty.c:1335 +#: src/tgetpass.c:250 +msgid "unable to fork" +msgstr "az elágaztatás sikertelen" + +#: src/exec_monitor.c:639 src/exec_nopty.c:430 +msgid "unable to restore tty label" +msgstr "a tty címke visszaállítása sikertelen" + +#: src/exec_nopty.c:353 src/exec_pty.c:1193 +msgid "policy plugin failed session initialization" +msgstr "a házirendbővítménynek nem sikerült a munkamenet előkészítése" + +#: src/exec_nopty.c:419 src/exec_pty.c:1404 +msgid "error in event loop" +msgstr "hiba az eseményhurokban" + +#: src/exec_nopty.c:528 src/exec_pty.c:504 src/signal.c:101 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "%d szignál kezelőjének visszaállítása sikertelen" + +#: src/exec_pty.c:143 +msgid "unable to allocate pty" +msgstr "a pty lefoglalása sikertelen" + +#: src/exec_pty.c:1173 +msgid "unable to create sockets" +msgstr "a foglalatok létrehozása sikertelen" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "hiba a(z) %s, %d. sorában a(z) „%s” bővítmény betöltése közben" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s a(z) %d uid tulajdona kell legyen" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s csak a tulajdonos által írható lehet" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "a(z) %s nem tölthető be: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "a(z) „%s” szimbólum nem található ebben: %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "ismeretlen %d házirendtípus található ebben: %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "összeférhetetlen %d bővítmény főverzió (várt: %d) található ebben: %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "a(z) „%s” házirendbővítmény mellőzése a(z) %s, %d. sorában" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "csak egyetlen házirendbővítmény határozható meg" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "kettőzött „%s” házirendbővítmény mellőzése a(z) %s, %d. sorában" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "kettőzött „%s” I/O bővítmény mellőzése a(z) %s, %d. sorában" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "a(z) %s házirendbővítmény nem tartalmazza a „check_policy” metódust" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:476 +#, c-format +msgid "internal error, %s overflow" +msgstr "belső hiba, %s túlcsordul" + +#: src/parse_args.c:219 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "érvénytelen környezeti változó név: %s" + +#: src/parse_args.c:313 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "a -C kapcsoló argumentuma legyen 3, vagy ennél nagyobb szám" + +#: src/parse_args.c:480 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "az „-i” és „-s” kapcsoló egyszerre nem használható" + +#: src/parse_args.c:484 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "az „-i” és „-E” kapcsoló egyszerre nem használható" + +#: src/parse_args.c:494 +msgid "the `-E' option is not valid in edit mode" +msgstr "az „-E” kapcsoló nem használható szerkesztő módban" + +#: src/parse_args.c:496 +msgid "you may not specify environment variables in edit mode" +msgstr "nem használhat környezeti változókat szerkesztő módban" + +#: src/parse_args.c:504 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "az „-U” kapcsoló csak a „-l” kapcsolóval együtt használható" + +#: src/parse_args.c:508 +msgid "the `-A' and `-S' options may not be used together" +msgstr "az „-A” és „-S” kapcsoló együtt nem használható" + +#: src/parse_args.c:584 +msgid "sudoedit is not supported on this platform" +msgstr "a „sudoedit” nem támogatott ezen a rendszeren" + +#: src/parse_args.c:657 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Kizárólag az -e, -h, -i, -K, -l, -s, -v vagy -V kapcsolók egyike használható" + +#: src/parse_args.c:671 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - fájlok szerkesztése más felhasználóként\n" +"\n" + +#: src/parse_args.c:673 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - parancs végrehajtása más felhasználóként\n" +"\n" + +#: src/parse_args.c:678 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Kapcsolók:\n" + +#: src/parse_args.c:680 +msgid "use a helper program for password prompting" +msgstr "segédprogram használata a jelszóbekérésre" + +#: src/parse_args.c:683 +msgid "use specified BSD authentication type" +msgstr "megadott BSD hitelesítési típus használata" + +#: src/parse_args.c:686 +msgid "run command in the background" +msgstr "parancs futtatása a háttérben" + +#: src/parse_args.c:688 +msgid "close all file descriptors >= num" +msgstr "minden fájlleíró lezárása, ami >= num" + +#: src/parse_args.c:691 +msgid "run command with the specified BSD login class" +msgstr "parancs futtatása a megadott BSD bejelentkezési osztállyal" + +#: src/parse_args.c:694 +msgid "preserve user environment when running command" +msgstr "felhasználói környezet megőrzése parancsfuttatáskor" + +#: src/parse_args.c:696 +msgid "preserve specific environment variables" +msgstr "bizonyos környezeti változók megőrzése" + +#: src/parse_args.c:698 +msgid "edit files instead of running a command" +msgstr "fájlok szerkesztése parancs futtatása helyett" + +#: src/parse_args.c:700 +msgid "run command as the specified group name or ID" +msgstr "parancs futtatása megadott csoportnévként vagy -azonosítóként" + +#: src/parse_args.c:702 +msgid "set HOME variable to target user's home dir" +msgstr "a HOME változó beállítása a célfelhasználó saját könyvtárára" + +#: src/parse_args.c:704 +msgid "display help message and exit" +msgstr "súgóüzenet megjelenítése és kilépés" + +#: src/parse_args.c:706 +msgid "run command on host (if supported by plugin)" +msgstr "parancs futtatása a gépen (ha a bővítmény támogatja)" + +#: src/parse_args.c:708 +msgid "run login shell as the target user; a command may also be specified" +msgstr "bejelentkezési parancsértelmező futtatása a célfelhasználóként; egy parancs is megadható" + +#: src/parse_args.c:710 +msgid "remove timestamp file completely" +msgstr "időbélyeg fájl teljes eltávolítása" + +#: src/parse_args.c:712 +msgid "invalidate timestamp file" +msgstr "időbélyeg fájl érvénytelenítése" + +#: src/parse_args.c:714 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "felhasználó jogosultságainak felsorolása, vagy adott parancs ellenőrzése, kétszer megadva hosszabb formátumban" + +#: src/parse_args.c:716 +msgid "non-interactive mode, no prompts are used" +msgstr "nem interaktív mód, kérdések nélkül" + +#: src/parse_args.c:718 +msgid "preserve group vector instead of setting to target's" +msgstr "csoportvektor megőrzése a céléra beállítás helyett" + +#: src/parse_args.c:720 +msgid "use the specified password prompt" +msgstr "a megadott jelszóbekérés használata" + +#: src/parse_args.c:723 +msgid "create SELinux security context with specified role" +msgstr "SELinux biztonsági környezet létrehozása a megadott szereppel" + +#: src/parse_args.c:726 +msgid "read password from standard input" +msgstr "jelszó olvasása a szabványos bemenetről" + +#: src/parse_args.c:728 +msgid "run shell as the target user; a command may also be specified" +msgstr "parancsértelmező futtatása a célfelhasználóként; egy parancs is megadható" + +#: src/parse_args.c:731 +msgid "create SELinux security context with specified type" +msgstr "SELinux biztonsági környezet létrehozása a megadott típussal" + +#: src/parse_args.c:734 +msgid "terminate command after the specified time limit" +msgstr "parancs megszakítása a megadott időkorlát után" + +#: src/parse_args.c:736 +msgid "in list mode, display privileges for user" +msgstr "lista módban a felhasználó jogosultságainak megjelenítése" + +#: src/parse_args.c:738 +msgid "run command (or edit file) as specified user name or ID" +msgstr "parancs futtatása (vagy fájl szerkesztése) a megadott nevű vagy azonosítójú felhasználóként" + +#: src/parse_args.c:740 +msgid "display version information and exit" +msgstr "verzióinformáció kiírása és kilépés" + +#: src/parse_args.c:742 +msgid "update user's timestamp without running a command" +msgstr "felhasználó időbélyegének frissítése parancs futtatása nélkül" + +#: src/parse_args.c:744 +msgid "stop processing command line arguments" +msgstr "parancssori argumentumok feldolgozásának befejezése" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "a felülvizsgálati rendszer megnyitása sikertelen" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "a felülvizsgálati üzenet küldése sikertelen" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "az fgetfilecon %s futtatása sikertelen" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "%s megváltoztatta a címkéket" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "%s környezetének visszaállítása sikertelen" + +#: src/selinux.c:167 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s nem nyitható meg, a tty nem címkézhető újra" + +#: src/selinux.c:171 src/selinux.c:212 src/selinux.c:229 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "a(z) %s nem karakteres eszköz, a tty nem címkézhető újra" + +#: src/selinux.c:180 +msgid "unable to get current tty context, not relabeling tty" +msgstr "a jelenlegi tty környezet lekérése sikertelen, a tty nem címkézhető újra" + +#: src/selinux.c:187 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "ismeretlen „chr_file” biztonsági osztály, a tty nem címkézhető újra" + +#: src/selinux.c:192 +msgid "unable to get new tty context, not relabeling tty" +msgstr "az új tty környezet lekérése sikertelen, a tty nem címkézhető újra" + +#: src/selinux.c:199 +msgid "unable to set new tty context" +msgstr "az új tty környezet beállítása sikertelen" + +#: src/selinux.c:273 +#, c-format +msgid "you must specify a role for type %s" +msgstr "meg kell adnia egy szerepet a(z) %s típushoz" + +#: src/selinux.c:279 +#, c-format +msgid "unable to get default type for role %s" +msgstr "az alapértelmezett típus lekérése sikertelen a(z) %s szerepnél" + +#: src/selinux.c:297 +#, c-format +msgid "failed to set new role %s" +msgstr "%s új szerep beállítása nem sikerült" + +#: src/selinux.c:301 +#, c-format +msgid "failed to set new type %s" +msgstr "%s új típus beállítása nem sikerült" + +#: src/selinux.c:313 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nem érvényes környezet" + +#: src/selinux.c:348 +msgid "failed to get old_context" +msgstr "az old_context lekérése nem sikerült" + +#: src/selinux.c:354 +msgid "unable to determine enforcing mode." +msgstr "a kényszerítő mód meghatározása sikertelen." + +#: src/selinux.c:371 +#, c-format +msgid "unable to set tty context to %s" +msgstr "a tty környezet beállítása sikertelen erre: %s" + +#: src/selinux.c:410 +#, c-format +msgid "unable to set exec context to %s" +msgstr "a végrehajtási környezet beállítása sikertelen erre: %s" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "a kulcslétrehozási környezet beállítása sikertelen erre: %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "legalább egy argumentum szükséges" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "érvénytelen fájlleíró szám: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s futtatása bejelentkezési parancsértelmezőként sikertelen" + +#: src/sesh.c:125 src/sudo.c:1117 +#, c-format +msgid "unable to execute %s" +msgstr "%s nem hajtható végre" + +#: src/signal.c:83 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "%d szignál kezelőjének mentése sikertelen" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "az erőforrás-vezérlési korlát elérve" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "„%s” felhasználó nem tagja ennek a projektnek: „%s”" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "a meghívó feladat végső" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nem sikerült a(z) „%s” projekthez csatlakozás" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nem létezik alapértelmezett kötéseket elfogadó erőforrás-tároló a(z) „%s” projektnél" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "a megadott erőforrás-tároló nem létezik a(z) „%s” projektnél" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "nem sikerült hozzákötni az alapértelmezett erőforrás-tárolóhoz a(z) „%s” projektnél" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "a projekt beállítása nem sikerült a(z) „%s” projektnél" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "figyelmeztetés: az erőforrás-vezérlés hozzárendelése nem sikerült a(z) „%s” projektnél" + +#: src/sudo.c:198 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo %s verzió\n" + +#: src/sudo.c:200 +#, c-format +msgid "Configure options: %s\n" +msgstr "Configure kapcsolói: %s\n" + +#: src/sudo.c:208 +msgid "fatal error, unable to load plugins" +msgstr "végzetes hiba: a bővítmények betöltése sikertelen" + +#: src/sudo.c:216 +msgid "unable to initialize policy plugin" +msgstr "a házirendbővítmény előkészítése sikertelen" + +#: src/sudo.c:260 +msgid "plugin did not return a command to execute" +msgstr "a bővítmény nem tért vissza végrehajtandó paranccsal" + +#: src/sudo.c:276 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "hiba a(z) %s I/O bővítmény előkészítésekor" + +#: src/sudo.c:299 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "váratatlan 0x%x sudo mód" + +#: src/sudo.c:461 +msgid "unable to get group vector" +msgstr "a csoportvektor lekérése sikertelen" + +#: src/sudo.c:523 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "ismeretlen %u uid: kicsoda Ön?" + +#: src/sudo.c:579 +msgid "unable to determine tty" +msgstr "a tty meghatározása sikertelen" + +#: src/sudo.c:867 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s a(z) %d uid tulajdona kell legyen, és a setuid bitnek beállítva kell lennie" + +#: src/sudo.c:870 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "a tényleges uid nem %d, a(z) %s a „nosuid” kapcsolóval beállított fájlrendszeren vagy rendszergazda jogosultságok nélküli NFS fájlrendszeren van?" + +#: src/sudo.c:876 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "a tényleges uid nem %d, a sudo telepítette a setuid gyökeret?" + +#: src/sudo.c:929 +msgid "unable to set supplementary group IDs" +msgstr "a kiegészítő csoportazonosítók beállítása sikertelen" + +#: src/sudo.c:936 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "a tényleges gid beállítása a runas gid %u értékre sikertelen" + +#: src/sudo.c:942 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "a gid beállítása a runas gid %u értékre sikertelen" + +#: src/sudo.c:999 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "váratlan gyermekmegszakítási feltétel: %d" + +#: src/sudo.c:1145 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "a(z) %s házirendbővítményből hiányzik a „check_policy” metódus" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "a(z) %s házirendbővítmény nem támogatja a jogosultságok felsorolását" + +#: src/sudo.c:1180 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "a(z) %s házirendbővítmény nem támogatja a -v kapcsolót" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "a(z) %s házirendbővítmény nem támogatja a -k/-K kapcsolókat" + +#: src/sudo_edit.c:178 src/sudo_edit.c:267 +msgid "unable to restore current working directory" +msgstr "az aktuális munkakönyvtár visszaállítása sikertelen" + +#: src/sudo_edit.c:574 src/sudo_edit.c:686 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nem szabályos fájl" + +#: src/sudo_edit.c:581 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: szimbolikus linkek szerkesztése nem engedélyezett" + +#: src/sudo_edit.c:584 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: fájlok szerkesztése egy írható könyvtárban nem engedélyezett" + +#: src/sudo_edit.c:617 src/sudo_edit.c:724 +#, c-format +msgid "%s: short write" +msgstr "%s: rövid írás" + +#: src/sudo_edit.c:687 +#, c-format +msgid "%s left unmodified" +msgstr "%s módosítatlanul hagyva" + +#: src/sudo_edit.c:700 src/sudo_edit.c:885 +#, c-format +msgid "%s unchanged" +msgstr "%s változatlan" + +#: src/sudo_edit.c:713 src/sudo_edit.c:735 +#, c-format +msgid "unable to write to %s" +msgstr "az írás sikertelen ebbe: %s" + +#: src/sudo_edit.c:714 src/sudo_edit.c:733 src/sudo_edit.c:736 +#: src/sudo_edit.c:910 src/sudo_edit.c:914 +#, c-format +msgid "contents of edit session left in %s" +msgstr "a szerkesztési munkamenet tartalma ebben maradt: %s" + +#: src/sudo_edit.c:732 +msgid "unable to read temporary file" +msgstr "az átmeneti fájl olvasása sikertelen" + +#: src/sudo_edit.c:815 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: belső hiba: útvonalak páratlan száma" + +#: src/sudo_edit.c:817 +msgid "sesh: unable to create temporary files" +msgstr "sesh: átmeneti fájlok létrehozása sikertelen" + +#: src/sudo_edit.c:819 src/sudo_edit.c:917 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: ismeretlen hiba: %d" + +#: src/sudo_edit.c:909 +msgid "unable to copy temporary files back to their original location" +msgstr "az átmeneti fájlok visszamásolása az eredeti helyükre sikertelen" + +#: src/sudo_edit.c:913 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "néhány átmeneti fájl visszamásolása az eredeti helyükre sikertelen" + +#: src/sudo_edit.c:958 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "az uid megváltoztatása rendszergazdára (%u) sikertelen" + +#: src/sudo_edit.c:975 +msgid "plugin error: missing file list for sudoedit" +msgstr "bővítményhiba: hiányzó fájllista a sudoedit programnál" + +#: src/sudo_edit.c:1016 src/sudo_edit.c:1029 +msgid "unable to read the clock" +msgstr "az óra olvasása sikertelen" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "nincs tty jelen, és nincs askpass program megadva" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nincs askpass program megadva, SUDO_ASKPASS beállításának kísérlete" + +#: src/tgetpass.c:261 +#, c-format +msgid "unable to set gid to %u" +msgstr "a gid beállítása %u értékre sikertelen" + +#: src/tgetpass.c:265 +#, c-format +msgid "unable to set uid to %u" +msgstr "az uid beállítása %u értékre sikertelen" + +#: src/tgetpass.c:270 +#, c-format +msgid "unable to run %s" +msgstr "%s futtatása sikertelen" + +#: src/utmp.c:268 +msgid "unable to save stdin" +msgstr "a szabványos bemenet mentése sikertelen" + +#: src/utmp.c:270 +msgid "unable to dup2 stdin" +msgstr "a szabványos bemenet dup2 futtatása sikertelen" + +#: src/utmp.c:273 +msgid "unable to restore stdin" +msgstr "a szabványos bemenet visszaállítása sikertelen" diff --git a/utsudo-0.0.2/po/it.mo b/utsudo-0.0.2/po/it.mo new file mode 100644 index 0000000000000000000000000000000000000000..87254479afdb6365847e5e7423cff19fba8b03ce GIT binary patch literal 20239 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 j0wg0, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 16:21+0200\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Poedit 2.2.3\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "impossibile aprire lo userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "impossibile passare al registro \"%s\" per %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "impossibile ripristinare il registro" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "impossibile allocare memoria" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Segnale sconosciuto" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "valore non valido" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "valore troppo grande" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "valore troppo piccolo" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valore percorso \"%s\" non valido in %s, riga %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valore %s \"%s\" non valido in %s, riga %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "gruppo sorgente \"%s\" non supportato in %s, riga %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "gruppi massimi \"%s\" non validi in %s, riga %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "impossibile eseguire stat su %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s non è un file regolare" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s è di proprietà dello uid %u, dovrebbe essere di %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s è scrivibile da tutti" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s è scrivibile dal gruppo" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "impossibile aprire %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "classe di accesso %s sconosciuta" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "impossibile impostare il contesto utente" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "impossibile impostare la priorità del processo" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "impossibile modificare root a %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "impossibile passare a un diverso uid (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "impossibile passare alla root %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "impossibile impostare il gestore per il segnale %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "impossibile rimuovere PRIV_PROC_EXEC da PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "errore nel leggere dal socketpair" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipologia di risposta inattesa sul backchannel: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "impossibile aggiungere l'evento alla coda" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "impossibile impostare il tty di controllo" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "impossibile creare una pipe" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "impossibile ricevere il messaggio dal genitore" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "impossibile eseguire fork" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "impossibile ripristinare l'etichetta tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "impossibile eseguire %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "inizializzazione della sessione non riuscita da parte del plugin della politica" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "errore nel ciclo dell'evento" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "impossibile ripristinare il gestore per il segnale %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "impossibile allocare pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "impossibile creare socket" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "impossibile inviare il messaggio per controllare il processo" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "errore in %s, riga %d, durante il caricamento del plugin \"%s\"" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve essere di proprietà dello uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s deve essere scrivibile solo dal proprietario" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossibile caricare %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossibile trovare il simbolo \"%s\" in %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "politica di tipo %d sconosciuta trovata in %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "numero principale di versione del plugin %d non compatibile (atteso %d) trovato in %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "viene ignorato il plugin di politica \"%s\" in %s, riga %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "solo un plugin di politica può essere specificato" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "viene ignorato il plugin di politica duplicato \"%s\" in %s, riga %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "viene ignorato il plugin di I/O duplicato \"%s\" in %s, riga %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "il plugin di politica %s non include un metodo check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "errore interno, overflow di %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nome della variabile d'ambiente non valido: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "l'argomento di -C deve essere un numero maggiore o uguale a 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "non è possibile specificare entrambe le opzioni \"-i\" e \"-s\"" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "non è possibile specificare entrambe le opzioni \"-i\" ed \"-E\"" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "l'opzione \"-E\" non è valida in modalità di modifica" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "non è possibile specificare variabili d'ambiente in modalità di modifica" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "l'opzione \"-U\" può essere usata solo con l'opzione \"-l\"" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "non è possibile usare assieme le opzioni \"-A\" e \"-S\"" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit non è supportato su questa piattaforma" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Solo una delle opzioni -e, -h, -i, -K, -l, -s, -v o -V può essere specificata" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - modifica file come un altro utente\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - esegue un comando come un altro utente\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opzioni:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "Utilizza un programma d'aiuto per richiedere la password" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "Utilizza la tipologia di autenticazione BSD specificata" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "Esegue il comando in background" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "Suona la campanella con le richieste" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "Chiude tutti i descrittori di file >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "Esegue il comando con la classe di accesso BSD specificata" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "Mantiene l'ambiente dell'utente quando viene eseguito il comando" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "Mantiene delle variabile d'ambiente specifiche" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "Modifica i file invece di eseguire un comando" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "Esegue il comando come il gruppo o l'ID specificato" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "Imposta la variabile HOME alla directory dell'utente finale" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "Visualizza il messaggio di aiuto ed esce" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "Esegue il comando sull'host (se supportato dal plugin)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "Esegue una shell di login come l'utente finale; può essere specificato un comando" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "Rimuove completamente il file temporale" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "Invalida il file temporale" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "Elenca i privilegi dell'utente o verifica un comando specifico; usare due volte per il formato più lungo" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "Modalità non interattiva, non richiede nulla all'utente" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "Mantiene il vettore di gruppo invece di impostarlo a quello dell'obiettivo" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "Utilizza la richiesta della password specificata" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "Crea il contesto di sicurezza SELinux con il ruolo specificato" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "Legge la password dallo standard input" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "Esegue la shell come l'utente finale; può essere specificato un comando" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "Crea il contesto di sicurezza SELinux con il tipo specificato" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "Termina il comando allo trascorrere del limite temporale specificato" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "In modalità elenco, visualizza i privilegi dell'utente" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "Esegue un comando (o modifica un file) come il nome utente o l'ID specificato" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "Visualizza le informazioni sulla versione ed esce" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "Aggiorna il timestamp dell'utente senza eseguire un comando" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "Ferma l'elaborazione degli argomenti a riga di comando" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "impossibile aprire il sistema di audit" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "impossibile inviare il messaggio di audit" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "impossibile eseguire fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s ha modificato le etichette" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "impossibile ripristinare il contesto per %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "impossibile aprire %s, tty non viene ri-etichettato" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s non è un dispositivo a caratteri, tty non viene ri-etichettato" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "impossibile ottenere il contesto tty attuale, tty non viene ri-etichettato" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe di sicurezza \"chr_file\" sconosciuta, tty non viene ri-etichettato" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "impossibile ottenere il nuovo contesto tty, tty non viene ri-etichettato" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "impossibile impostare il nuovo contesto tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "è necessario specificare un ruolo per la tipologia %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "impossibile ottenere la tipologia predefinita per il ruolo %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "recupero del nuovo contesto non riuscito" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "impossibile impostare il nuovo ruolo %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "impossibile impostare la nuova tipologia %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s non è un contesto valido" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "recupero del vecchio contesto non riuscito" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "impossibile determinare la modalità di rispetto." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "impossibile impostare il contesto tty a %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "impossibile impostare il contesto exec a %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "impossibile impostare il contesto di creazione della chiave a %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "richiede almeno un argomento" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "numero descrittore file non valido: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "impossibile eseguire %s come shell di login" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "impossibile salvare il gestore per il segnale %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "raggiunto il limite di controllo delle risorse" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "l'utente \"%s\" non fa parte del progetto \"%s\"" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "il task chiamante è definitivo" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "impossibile unirsi al progetto \"%s\"" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "non esiste alcun pool di risorse per il progetto \"%s\" che accetti binding predefiniti" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "il pool di risorse specificato non esiste per il progetto \"%s\"" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "impossibile unirsi al pool di risorse predefinito per il progetto \"%s\"" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject per il progetto \"%s\" non riuscita" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "attenzione, assegnazione della risorsa di controllo per il progetto \"%s\" non riuscita" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Versione di sudo: %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opzioni di configurazione: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "errore irreversibile, impossibile caricare i plugin" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "impossibile inizializzare il plugin delle politiche" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "il plug-in non ha restituito un comando da eseguire" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "errore nell'inizializzare il plugin di I/O %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "modalità 0x%x di sudo non attesa" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "l'utente attuale non esiste nel database %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "impossibile impostare il tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s deve essere di proprietà dello uid %d e avere il bit setuid impostato" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "lo uid effettivo non è %d. %s si trova su un file system con l'opzione \"nosuid\" impostata o su un file system NFS senza privilegi di root?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "lo uid effettivo non è %d. Il programma sudo è installato con setuid root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "impossibile impostare ID di gruppo supplementari" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "impossibile impostare il gid effettivo per eseguire come %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "impossibile impostare il gid per eseguire come gid %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condizione di uscita del figlio inattesa: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "il plugin di politica %s non include un metodo \"check_policy\"" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "il plugin di politica %s non supporta l'elencazione dei privilegi" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "il plugin di politica %s non supporta l'opzione -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "il plugin di politica %s non supporta le opzioni -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "nessuna directory temporanea scrivibile trovata" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "impossibile ripristinare la directory di lavoro attuale" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: non è un file regolare" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: la modifica di collegamenti simbolici non è consentita" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: la modifica di file in una directory con accesso in scrittura non è consentita" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: scrittura breve" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s lasciato non modificato" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s non modificato" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "impossibile scrivere su %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "contenuto della sessione di modifica lasciato in %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "impossibile leggere il file temporaneo" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: errore interno: strano numero numero di percorsi" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: impossibile creare file temporanei" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: errore %d sconosciuto" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "impossibile copiare i file temporanei nella loro posizione originale" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "impossibile copiare alcuni dei file temporanei nella loro posizione originale" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "impossibile modificare lo uid a root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "errore di plugin: elenco file mancante per sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "impossibile leggere l'orologio" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tempo esaurito durante la lettura della password" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "nessuna password fornita" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "impossibile leggere la password" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "è richiesto un terminale per leggere la password; utilizzare l'opzione -S per leggere dall'input standard o configurare uno strumento askpass" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nessun programma di richiesta password specificato, impostare SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "impossibile impostare il gid a %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "impossibile impostare lo uid a %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "impossibile eseguire %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "impossibile salvare lo stdin" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "impossibile eseguire dup2 sullo stdin" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "impossibile ripristinare lo stdin" diff --git a/utsudo-0.0.2/po/ja.mo b/utsudo-0.0.2/po/ja.mo new file mode 100644 index 0000000000000000000000000000000000000000..61ed3abc7e87e5968b225b0a3bc6a1b2a880f6bf GIT binary patch literal 23197 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 bB{2xPt;)P8QrHmIf0?a5!WzCYYDNDa!B77H literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/ja.po b/utsudo-0.0.2/po/ja.po new file mode 100644 index 0000000..012bb8d --- /dev/null +++ b/utsudo-0.0.2/po/ja.po @@ -0,0 +1,1005 @@ +# Japanese messages for sudo +# This file is put in the public domain. +# Yasuaki Taniguchi , 2011. +# Takeshi Hamasaki , 2012, 2015, 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-27 10:44+0900\n" +"Last-Translator: Takeshi Hamasaki \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.2.1\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "ユーザーデータベースを開くことができません" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "%s 用のレジストリー \"%s\" へ切り替えることができません" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "レジストリーを復元できません" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "メモリ割り当てを行えませんでした" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "不明なシグナルです" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "無効な値" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "値が大き過ぎます" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "値が小さ過ぎます" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "無効な Path の値 \"%s\" が %s の %u 行目 にあります" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "無効な %s の値 \"%s\" が %s の %u 行目 にあります" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "サポートしていないグループソース \"%s\" が %s の %u 行目で指定されています" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "無効な最大グループの値 \"%s\" が %s の %u 行目 にあります" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "%s の状態取得 (stat) ができません" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s は通常ファイルではありません" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s はユーザーID %u によって所有されています。これは %u であるべきです" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s は誰でも書き込み可能です" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s はグループのメンバーによる書き込みが可能です" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "%s を開けません" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "不明なログインクラス %s です" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "ユーザーコンテキストを設定できません" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "プロセス優先度を設定できません" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "root を %s へ変更できません" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "実行時のユーザーID (uid) (%u, %u) へ変更できません" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "ディレクトリーを %s に変更できません" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "シグナル %d のハンドラを設定できません" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "PRIV_LIMIT から PRIV_PROC_EXEC を取り除くことができません" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "ソケットペアからの読み込み中にエラーが発生しました" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "バックチャンネルに関する予期しないリプレイタイプです: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "キューにイベントを追加できません" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "tty の制御設定ができません" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "パイプを作成できません" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "親からのメッセージを受け取ることができません" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "fork できません" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "tty ラベルを復旧できません" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "%s を実行できません" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "ポリシープラグインがセッションの初期化に失敗しました" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "イベントループでエラーが発生しました" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "シグナル %d のハンドラを復元できません" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "pty を割り当てられません" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "ソケットを作成できません" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "監視プロセスへメッセージを送ることができません" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "%s, %d 行目 プラグイン \"%s\" をロード中にエラーが発生しました" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s の所有者は uid %d でなければいけません" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s は所有者のみ書き込み可能で無ければいけません" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s をロードできません: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "シンボル \"%s\" が %s に見つかりません" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "不明なポリシータイプ %d が %s で見つかりました" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "互換性の無いポリシーメジャーバージョン %d (予期されるのは %d)が %s で見つかりました" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ポリシープラグイン \"%s\" を無視します。%s の %d 行目" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "1つのポリシープラグインのみ指定できます" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "重複しているポリシープラグイン \"%s\" を無視します。%s の %d 行目" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "重複している I/O プラグイン \"%s\" を無視します。%s の %d 行目" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "ポリシープラグイン %s には check_policy メソッドが含まれていません" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部エラー、 %s がオーバーフローしました" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "無効な環境変数名です: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "-C の引数は 3 以上の数値でなければいけません" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "`-i' と `-s' オプションを同時に指定することはできません" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "`-i' と `-E' オプションを同時に指定することはできません" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "`-E' オプションは編集モードでは無効です" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "編集モードでは環境変数を指定できません" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "`-U' オプションは `-l' オプションのみと同時に指定できます" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "`-A' と `-S' オプションは同時に指定することはできません" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit はこのプラットフォームではサポートされていません" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "-e, -h, -i, -K, -l, -s, -v または -V のうち一つのみ指定できます" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - 別のユーザーとしてファイルを編集します\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - 別のユーザーとしてコマンドを実行します\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"オプション:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "パスワード要求のために補助プログラムを使用する" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "指定した BSD 認証タイプを使用する" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "コマンドをバックグラウンドで実行する" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "プロンプトと同時にベルを鳴らす" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "num 以上のすべてのファイル記述子を閉じる" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "指定した BSD ログインクラスでコマンドを実行する" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "コマンドを実行する時にユーザーの環境変数を維持する" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "指定の環境変数を維持する" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "コマンドを実行するのではなくファイルを編集する" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "指定したグループ名またはグループIDでコマンドを実行する" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "HOME 変数を変更先となるユーザーのホームディレクトリに設定する" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "このヘルプを表示して終了する" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "host でコマンドを実行する(プラグインがサポートしている場合)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "変更先のユーザーとしてログインシェルを実行する; コマンドを指定することもできます" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "タイムスタンプファイルを完全に削除する" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "無効なタイムスタンプファイルです" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "ユーザーの権限を一覧表示するまたは指定したコマンドについて確認する ;長い表示にするには2回指定すること" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "非対話モードで実行し、ユーザーに入力を求めない" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "グループベクトルを保護する (変更先のユーザーのものに設定しない)" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "指定したパスワードプロンプトを使用する" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "指定した役割で SELinux セキュリティーコンテキストを作成する" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "標準入力からパスワードを読み込む" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "変更先のユーザーとしてシェルを実行する; コマンドを指定することもできます" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "指定したタイプで SELinux セキュリティーコンテキストを作成する" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "指定した制限時間でコマンドの実行を中止する" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "リストモードで、ユーザーの権限を表示する" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "指定したユーザー名またはユーザーIDでコマンドを実行する (またはファイルを編集する)" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "バージョン情報を表示して終了する" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "コマンドを実行せずにユーザーのタイムスタンプを更新する" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "コマンドライン引数の処理を終了する" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "監査システムを開くことができません" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "監査メッセージを送ることができません" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "fgetfilecon %s を行うことができません" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s はラベルを変更しました" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "%s 用のコンテキストを復元することができません" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s を開くことができません。tty の再ラベル付けを行いません" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s はキャラクターデバイスではありません、tty の再ラベル付けを行いません" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "現在の tty コンテキストを取得できません。tty の再ラベル付けを行いません" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "\"chr_file\" は未知のセキュリティクラスです。tty の再ラベル付けを行いません" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "新しい tty コンテキストを取得できません。tty の再ラベル付けを行いません" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "新しい tty コンテキストを設定できません" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "タイプ %s 用の役割を指定しなければいけません" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "役割 %s 用のデフォルトのタイプを取得できません" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "新しいコンテキストの取得に失敗しました" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "新しい役割 %s の設定に失敗しました" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "新しいタイプ %s の設定に失敗しました" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s は有効なコンテキストではありません" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "古いコンテキストの取得に失敗しました" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "強制モードを決定することができません。" + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "新しい tty コンテキストを %s に設定できません" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "実行コンテキストを %s に設定できません" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "キー作成コンテキストを %s へ設定できません" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "最低でも一つ以上おの引数が必要です" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "無効なファイル記述子の番号: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s をログインシェルとして実行できません" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "シグナル %d のハンドラを保存できません" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "資源制御の制限の最大値に達しました" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "ユーザー \"%s\" はプロジェクト \"%s\" のメンバーではありません" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "起動しているタスクは最後 (final) です" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "プロジェクト \"%s\" に参加できません" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "プロジェクト \"%s\" 用にはデフォルト割り当てとして受け付けられる資源プールがありません" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "プロジェクト \"%s\" 用として指定した資源プールは存在しません" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "プロジェクト \"%s\" 用にデフォルト資源プールを割り当てられませんでした" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "プロジェクト\"%s\" への setproject に失敗しました" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "警告、プロジェクト \"%s\" への資源制御割り当てに失敗しました" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo バージョン %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "configure オプション: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "致命的エラー、プラグインをロードできません" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "ポリシープラグインを初期化できません" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "プラグインが実行するべきコマンドを返しませんでした" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "I/O プラグイン %s を初期化中にエラーが発生しました" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "予期しない sudo のモード 0x%x です" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "あなたは %s データベースに存在しません" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "tty を特定できません" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s は所有者が uid %d である必要があり、かつ setuid が設定されている必要があります" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "実効 uid が %d ではありません、%s は 'nosuid' が設定されたファイルシステムにあるか、root 権限のないNFSファイルシステムにあるのでは?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "実効 uid が %d ではありません、sudo は setuid root を設定してインストールされていますか?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "追加のグループIDを設定できません" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "実行時のグループID (gid) %u を実効グループIDに設定できません" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "実行時のグループID (gid) %u をグループIDに設定できません" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "予期しない子プロセスの終了コードです: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "ポリシープラグイン %s には check_policy メソッドが含まれていません" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "ポリシープラグイン %s は権限の一覧表示をサポートしていません" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "ポリシープラグイン %s は -v オプションをサポートしません" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "ポリシープラグイン %s は -k/-K オプションをサポートしません" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "書き込み可能な一時ディレクトリが見つかりません" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "カレントディレクトリを復元できません" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: 通常ファイルではありません" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: シンボリックリンクの編集は許可されていません" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: 書き込み可能なディレクトリ内のファイルの編集は許可されていません" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: 短い書き込みです" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s を修正しないままにします" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s を変更しません" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "%s へ書き込むことができません" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "編集セッションの内容が %s 内に残っています" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "一時ファイルを読み込むことができません" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: 内部エラー: パスの数がおかしいです" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: 一時ファイルを作成することができません" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: 不明なエラー %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "一時ファイルを元の場所に戻すことができません" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "一時ファイルのいくつかを元の場所に戻すことができません" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "ユーザーID (uid) を root (%u) に変更できません" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "プラグインエラー: sudoedit 用のファイル一覧がありません" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "時刻を読み込むことができません" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "パスワードの読み込みがタイムしました" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "パスワードが与えられませんでした" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "パスワードを読み込むことができません" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "パスワードを読み取るために端末が必要です。 -S オプションを利用して標準入力から読み取るか、askpass ヘルパーを使うよう設定してください" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "パスワードを尋ねる (askpass) プログラムが指定されていません。 SUDO_ASKPASS を設定し、やり直してください" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "グループIDを %u に設定できません" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "ユーザーIDを %u に設定できません" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "%s を実行できません" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "標準入力を保存できません" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "標準入力へ dup2 を実行できません" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "標準入力を復元できません" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません" + +#~ msgid "unable to get group vector" +#~ msgstr "グループベクトルを取得できません" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "不明なユーザーID %u です: 誰ですか?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "シグナルパイプからの読み込み中にエラーが発生しました" + +#~ msgid "error reading from pipe" +#~ msgstr "パイプからの読み込み中にエラーが発生しました" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "内部エラー、0バイトの確保を試みました" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "端末を raw モードに設定できません" + +#~ msgid "unable to open socket" +#~ msgstr "ソケットを開くことができません" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "内部エラー、 emalloc2(0) を試みました" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "内部エラー、ecalloc(0) を試みました" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "内部エラー、 erealloc(0) を試みました" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "内部エラー、 erealloc3(0) を試みました" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "内部エラー、 erecalloc(0) を試みました" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "select failed" +#~ msgstr "select に失敗しました" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: オーバーフローが検出されました" + +#~ msgid "list user's available commands\n" +#~ msgstr "ユーザーが使用可能なコマンドを一覧表示する\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "変更先のユーザーとしてシェルを実行する\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "一覧表示する時に、指定したユーザーの権限を一覧表示する\n" + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "内部エラー、 emalloc2() がオーバーフローしました" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "内部エラー、 erealloc3() がオーバーフローしました" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: 最低でも一つ以上のポリシープラグインを指定しなければいけません" + +#~ msgid "must be setuid root" +#~ msgstr "setuid root されていなければいけません" + +#~ msgid "the argument to -D must be between 1 and 9 inclusive" +#~ msgstr "-D の引数は 1 から 9 の間でなければいけません" diff --git a/utsudo-0.0.2/po/ko.mo b/utsudo-0.0.2/po/ko.mo new file mode 100644 index 0000000000000000000000000000000000000000..e8831d09a55198901ad822cf9137eb8af81c2c7d GIT binary patch literal 21188 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, 2011-2015 +# Seong-ho Cho , 2016, 2017, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 11:51-0600\n" +"PO-Revision-Date: 2019-10-17 10:55+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.2.1\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "사용자 DB를 열 수 없습니다" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "%2$s의 \"%1$s\" 레지스트리로 전환할 수 없습니다" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "레지스트리를 복원할 수 없습니다" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:469 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:999 +#: src/exec_pty.c:1162 src/exec_pty.c:1168 src/exec_pty.c:1177 +#: src/exec_pty.c:1184 src/exec_pty.c:1191 src/exec_pty.c:1198 +#: src/exec_pty.c:1205 src/exec_pty.c:1212 src/exec_pty.c:1219 +#: src/exec_pty.c:1226 src/exec_pty.c:1233 src/exec_pty.c:1240 +#: src/exec_pty.c:1248 src/exec_pty.c:1665 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:206 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:678 src/sudo.c:688 src/sudo.c:708 src/sudo.c:727 +#: src/sudo.c:736 src/sudo.c:745 src/sudo.c:762 src/sudo.c:803 src/sudo.c:813 +#: src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 src/sudo.c:1268 +#: src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 src/sudo_edit.c:888 +#: src/sudo_edit.c:1002 src/sudo_edit.c:1022 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:1162 +#: src/exec_pty.c:1168 src/exec_pty.c:1177 src/exec_pty.c:1184 +#: src/exec_pty.c:1191 src/exec_pty.c:1198 src/exec_pty.c:1205 +#: src/exec_pty.c:1212 src/exec_pty.c:1219 src/exec_pty.c:1226 +#: src/exec_pty.c:1233 src/exec_pty.c:1240 src/exec_pty.c:1248 +#: src/exec_pty.c:1665 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:207 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 +#: src/sudo.c:1268 src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 +#: src/sudo_edit.c:888 src/sudo_edit.c:1002 src/sudo_edit.c:1022 +msgid "unable to allocate memory" +msgstr "메모리를 할당할 수 없습니다" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "알 수 없는 시그널" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:56 lib/util/strtonum.c:65 lib/util/strtonum.c:183 +msgid "invalid value" +msgstr "잘못된 값" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:138 lib/util/strtoid.c:166 +#: lib/util/strtomode.c:62 lib/util/strtonum.c:68 lib/util/strtonum.c:195 +msgid "value too large" +msgstr "값이 너무 큽니다" + +#: lib/util/strtoid.c:93 lib/util/strtoid.c:144 lib/util/strtomode.c:62 +#: lib/util/strtonum.c:68 lib/util/strtonum.c:189 +msgid "value too small" +msgstr "값이 너무 작습니다" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "%2$s의 %3$u번째 줄에 잘못된 경로 값 \"%1$s\"" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "%3$s의 %4$u번째 줄에 %1$s의 잘못된 값 \"%2$s\"" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "%2$s의 %3$u번째 줄에 지원하지 않는 그룹 원본 \"%1$s\"" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "%2$s의 %3$u번째 줄에 잘못된 최대 그룹 값 \"%1$s\"" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "%s의 상태를 가져올 수 없습니다" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s은(는) 일반 파일이 아닙니다" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s은(는) %u uid에서 소유하고 있지만 %u uid가 소유해야 합니다" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s에 모두가 기록할 수 있습니다" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s에 그룹 구성원이 기록할 수 있습니다" + +#: lib/util/sudo_conf.c:599 src/selinux.c:215 src/selinux.c:232 src/sudo.c:362 +#, c-format +msgid "unable to open %s" +msgstr "%s을(를) 열 수 없습니다" + +#: src/exec.c:167 +#, c-format +msgid "unknown login class %s" +msgstr "알 수 없는 로그인 클래스 %s" + +#: src/exec.c:180 +msgid "unable to set user context" +msgstr "사용자 컨텍스트를 설정할 수 없습니다." + +#: src/exec.c:196 +msgid "unable to set process priority" +msgstr "프로세스 우선순위를 설정할 수 없습니다" + +#: src/exec.c:204 +#, c-format +msgid "unable to change root to %s" +msgstr "루트를 %s(으)로 바꿀 수 없습니다" + +#: src/exec.c:217 src/exec.c:223 src/exec.c:230 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "실행 uid로 바꿀 수 없습니다 (%u, %u)" + +#: src/exec.c:248 +#, c-format +msgid "unable to change directory to %s" +msgstr "%s 디렉터리로 바꿀 수 없습니다" + +#: src/exec.c:347 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:527 src/exec_pty.c:527 src/exec_pty.c:1333 +#: src/exec_pty.c:1335 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "%d 시그널의 핸들러를 설정할 수 없습니다" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "PRIV_LIMIT에서 PRIV_PROC_EXEC를 제거할 수 없습니다" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "소켓쌍 읽기 오류" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "백 채널에 잘못된 응답 형식: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:649 +#: src/exec_pty.c:654 src/exec_pty.c:751 src/exec_pty.c:758 src/exec_pty.c:855 +#: src/exec_pty.c:1170 src/exec_pty.c:1179 src/exec_pty.c:1186 +#: src/exec_pty.c:1193 src/exec_pty.c:1200 src/exec_pty.c:1207 +#: src/exec_pty.c:1214 src/exec_pty.c:1221 src/exec_pty.c:1228 +#: src/exec_pty.c:1235 src/exec_pty.c:1242 src/exec_pty.c:1618 +#: src/exec_pty.c:1628 src/exec_pty.c:1673 src/exec_pty.c:1680 +#: src/exec_pty.c:1707 +msgid "unable to add event to queue" +msgstr "큐에 이벤트를 추가할 수 없습니다" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "처리 tty를 설정할 수 없습니다" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1412 +#: src/exec_pty.c:1433 src/exec_pty.c:1453 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "파이프를 만들 수 없습니다" + +# parent가 정확히 무슨 의미인지 알 수 없음 +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "상위로부터 메시지를 받을 수 없습니다" + +#: src/exec_monitor.c:616 src/exec_nopty.c:384 src/exec_pty.c:1491 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "포킹할 수 없습니다" + +#: src/exec_monitor.c:630 src/sesh.c:127 src/sudo.c:1132 +#, c-format +msgid "unable to execute %s" +msgstr "%s을(를) 실행할 수 없습니다" + +#: src/exec_monitor.c:713 src/exec_nopty.c:437 +msgid "unable to restore tty label" +msgstr "tty 레이블을 복원할 수 없습니다" + +#: src/exec_nopty.c:360 src/exec_pty.c:1342 +msgid "policy plugin failed session initialization" +msgstr "정책 플러그인에서 세션 초기화에 실패했습니다" + +#: src/exec_nopty.c:426 src/exec_pty.c:1578 +msgid "error in event loop" +msgstr "이벤트 루프에 오류" + +#: src/exec_nopty.c:535 src/exec_pty.c:562 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "%d 시그널의 핸들러를 복원할 수 없습니다" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "pty를 할당할 수 없습니다" + +#: src/exec_pty.c:1322 +msgid "unable to create sockets" +msgstr "소켓을 만들 수 없습니다" + +#: src/exec_pty.c:1535 +msgid "unable to send message to monitor process" +msgstr "감사 프로세스에 메시지를 보낼 수 없습니다" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "%s의 %d번째 줄에서 \"%s\" 플러그인을 불러오는 중 오류" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s은(는) uid %d에서 소유해야 합니다" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s은(는) 소유자만 기록할 수 있어야 합니다" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s을(를) 불러올 수 없습니다: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "%2$s에서 \"%1$s\" 심볼을 찾을 수 없습니다" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "%2$s에서 알 수 없는 정책 유형 %1$d이(가) 있습니다" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "%3$s에 주 버전이(%2$d을(를) 기대했지만) %1$d인 비호환 플러그인이 있습니다" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "%2$s의 %3$d번째 줄에서 \"%1$s\" 정책 플러그인 무시" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "단일 정책 플러그인을 지정하십시오" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "%2$s의 %3$d번째 줄에서 \"%1$s\" 중복 정책 플러그인 무시" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "%2$s의 %3$d번째 줄에서 \"%1$s\" 중복 입출력 플러그인 무시" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "%s 정책 플러그인에 check_policy 메서드가 없습니다" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:472 +#, c-format +msgid "internal error, %s overflow" +msgstr "내부 오류. %s 오버플로우." + +#: src/parse_args.c:227 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "잘못된 환경 변수 이름: %s" + +#: src/parse_args.c:326 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "-C의 인자 값은 3보다 크거나 같아야 합니다" + +#: src/parse_args.c:511 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "`-i' 및 `-s' 옵션을 함께 지정할 수 없습니다" + +#: src/parse_args.c:515 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "`-i' 및 `-E' 옵션을 함께 지정할 수 없습니다" + +#: src/parse_args.c:525 +msgid "the `-E' option is not valid in edit mode" +msgstr "`-E' 옵션은 편집 모드에서 유효하지 않습니다" + +#: src/parse_args.c:527 +msgid "you may not specify environment variables in edit mode" +msgstr "편집 모드에서 환경 변수를 지정할 수 없습니다" + +#: src/parse_args.c:535 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "`-U' 옵션은 `-l' 옵션만 함께 사용할 수 있습니다" + +#: src/parse_args.c:539 +msgid "the `-A' and `-S' options may not be used together" +msgstr "`-A' 및 `-S' 옵션을 함께 사용할 수 없습니다" + +#: src/parse_args.c:615 +msgid "sudoedit is not supported on this platform" +msgstr "이 플랫폼에서 sudoedit를 지원하지 않습니다" + +#: src/parse_args.c:688 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "-e, -h, -i, -K, -l, -s, -v, -V 옵션 중 하나를 지정해야 합니다" + +#: src/parse_args.c:702 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - 다른 사용자 권한으로 파일을 편집합니다\n" +"\n" + +#: src/parse_args.c:704 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - 다른 사용자 권한으로 명령을 실행합니다\n" +"\n" + +#: src/parse_args.c:709 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"옵션:\n" + +#: src/parse_args.c:711 +msgid "use a helper program for password prompting" +msgstr "암호 질문에 보조 프로그램 활용" + +#: src/parse_args.c:714 +msgid "use specified BSD authentication type" +msgstr "지정 BSD 인증 형식 활용" + +#: src/parse_args.c:717 +msgid "run command in the background" +msgstr "백그라운드에서 명령 실행" + +#: src/parse_args.c:719 +msgid "ring bell when prompting" +msgstr "프롬프트를 띄울 때 알림 소리를 냅니다" + +#: src/parse_args.c:721 +msgid "close all file descriptors >= num" +msgstr "num 보다 크거나 같은 모든 파일 서술자를 닫습니다" + +#: src/parse_args.c:724 +msgid "run command with the specified BSD login class" +msgstr "지정 BSD 로그인 클래스로 명령을 실행합니다" + +#: src/parse_args.c:727 +msgid "preserve user environment when running command" +msgstr "명령을 실행할 때 사용자 환경을 유지합니다" + +#: src/parse_args.c:729 +msgid "preserve specific environment variables" +msgstr "지정 환경 변수 값을 유지합니다" + +#: src/parse_args.c:731 +msgid "edit files instead of running a command" +msgstr "명령을 실행하는 대신 파일을 편집합니다" + +#: src/parse_args.c:733 +msgid "run command as the specified group name or ID" +msgstr "지정 그룹 이름 또는 ID로 명령을 실행합니다" + +#: src/parse_args.c:735 +msgid "set HOME variable to target user's home dir" +msgstr "대상 사용자의 내 폴더에 HOME 변수를 지정합니다" + +#: src/parse_args.c:737 +msgid "display help message and exit" +msgstr "도움말을 보여주고 빠져나갑니다" + +#: src/parse_args.c:739 +msgid "run command on host (if supported by plugin)" +msgstr "(플러그인에서 지원한다면)호스트에서 명령을 실행합니다" + +#: src/parse_args.c:741 +msgid "run login shell as the target user; a command may also be specified" +msgstr "대상 사용자 자격으로 셸에 로그인합니다. 명령도 지정할 수 있습니다." + +#: src/parse_args.c:743 +msgid "remove timestamp file completely" +msgstr "타임스탬프 파일을 완전히 제거합니다" + +#: src/parse_args.c:745 +msgid "invalidate timestamp file" +msgstr "타임스탬프 파일을 초기화합니다" + +#: src/parse_args.c:747 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "사용자 권한을 보여주거나 지정 명령을 확인합니다. 긴 형식으로 보려면 옵션을 두 번 사용하십시오" + +#: src/parse_args.c:749 +msgid "non-interactive mode, no prompts are used" +msgstr "비대화형 모드. 프롬프트를 사용하지 않습니다" + +#: src/parse_args.c:751 +msgid "preserve group vector instead of setting to target's" +msgstr "대상을 설정하는 대신 그룹 벡터를 유지합니다" + +#: src/parse_args.c:753 +msgid "use the specified password prompt" +msgstr "지정 암호 프롬프트를 활용합니다" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified role" +msgstr "지정 역할을 지닌 SELinux 보안 컨텍스트를 만듭니다" + +#: src/parse_args.c:759 +msgid "read password from standard input" +msgstr "표준 입력으로 암호를 입력 받습니다" + +#: src/parse_args.c:761 +msgid "run shell as the target user; a command may also be specified" +msgstr "셸을 대상 사용자 명의로 실행합니다. 명령도 지정합니다." + +#: src/parse_args.c:764 +msgid "create SELinux security context with specified type" +msgstr "지정 유형의 SELinux 보안 컨텍스트를 만듭니다" + +#: src/parse_args.c:767 +msgid "terminate command after the specified time limit" +msgstr "지정 제한 시간 이후로 명령 실행을 멈춥니다" + +#: src/parse_args.c:769 +msgid "in list mode, display privileges for user" +msgstr "목록 모드에서 사용자 권한을 보여줍니다" + +#: src/parse_args.c:771 +msgid "run command (or edit file) as specified user name or ID" +msgstr "지정한 사용자 이름 또는 ID로 명령을 실행(또는 파일 편집)" + +#: src/parse_args.c:773 +msgid "display version information and exit" +msgstr "버전 정보를 보여주고 나갑니다" + +#: src/parse_args.c:775 +msgid "update user's timestamp without running a command" +msgstr "명령을 실행하지 않고 사용자 타임스탬프를 업데이트합니다" + +#: src/parse_args.c:777 +msgid "stop processing command line arguments" +msgstr "명령행 인자 처리를 멈춥니다" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "감사 시스템을 열 수 없습니다" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "감사 메시지를 보낼 수 없습니다." + +#: src/selinux.c:123 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "%s에 fgetfilecon을 실행할 수 없습니다." + +#: src/selinux.c:128 +#, c-format +msgid "%s changed labels" +msgstr "%s에서 레이블을 바꾸었습니다" + +#: src/selinux.c:133 +#, c-format +msgid "unable to restore context for %s" +msgstr "%s의 컨텍스트를 복원할 수 없습니다" + +#: src/selinux.c:174 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s을(를) 열 수 없어 tty의 레이블을 다시 지정하지 않습니다" + +#: src/selinux.c:178 src/selinux.c:219 src/selinux.c:236 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s은(는) 문자 장치가 아닙니다. tty에 레이블링을 다시 하지 않음." + +#: src/selinux.c:187 +msgid "unable to get current tty context, not relabeling tty" +msgstr "현재 tty 컨텍스트를 가져올 수 없어 tty의 레이블을 다시 지정하지 않습니다" + +#: src/selinux.c:194 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "\"chr_file\"의 보안 등급을 알 수 없어, tty의 레이블을 다시 지정하지 않습니다" + +#: src/selinux.c:199 +msgid "unable to get new tty context, not relabeling tty" +msgstr "새 tty 컨텍스트를 가져올 수 없습니다." + +#: src/selinux.c:206 +msgid "unable to set new tty context" +msgstr "새 tty 컨텍스트를 설정할 수 없습니다" + +#: src/selinux.c:280 +#, c-format +msgid "you must specify a role for type %s" +msgstr "%s 유형의 역할을 지정해야 합니다" + +#: src/selinux.c:286 +#, c-format +msgid "unable to get default type for role %s" +msgstr "%s 역할의 기본 유형을 가져올 수 없습니다" + +#: src/selinux.c:304 +#, c-format +msgid "failed to set new role %s" +msgstr "새 %s 역할 설정에 실패했습니다." + +#: src/selinux.c:308 +#, c-format +msgid "failed to set new type %s" +msgstr "새 %s 유형 설정에 실패했습니다" + +#: src/selinux.c:320 +#, c-format +msgid "%s is not a valid context" +msgstr "올바르지 않은 %s 컨텍스트 입니다" + +#: src/selinux.c:355 +msgid "failed to get old_context" +msgstr "old_context를 가져오기에 실패했습니다" + +#: src/selinux.c:361 +msgid "unable to determine enforcing mode." +msgstr "강제 모드로 지정할 수 없습니다." + +#: src/selinux.c:378 +#, c-format +msgid "unable to set tty context to %s" +msgstr "tty 컨텍스트를 %s(으)로 설정할 수 없습니다" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set exec context to %s" +msgstr "exec 컨텍스트를 %s(으)로 설정할 수 없습니다" + +#: src/selinux.c:424 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "키 생성 컨텍스트를 %s(으)로 설정할 수 없습니다" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "최소한 하나의 인자가 필요합니다" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "잘못된 파일 서술자 번호: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s(을)를 로그인 쉘로 실행할 수 없습니다" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "%d 시그널의 핸들러를 저장할 수 없습니다" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "자원 처리 한계에 도달했습니다" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "\"%s\" 사용자는 \"%s\" 프로젝트의 구성원이 아닙니다" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "실행 작업이 마지막입니다" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "\"%s\" 프로젝트에 참여할 수 없습니다" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "어떤 자원 풀에서도 \"%s\" 프로젝트에 있는 기본 바인딩을 수용하지 않습니다" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "\"%s\" 프로젝트에 지정한 자원 풀이 없습니다" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "\"%s\" 프로젝트에 기본 자원 풀을 바인딩할 수 없습니다" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "\"%s\" 프로젝트에서 setproject에 실패했습니다" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "경고! \"%s\" 프로젝트에 자원 처리 할당에 실패했습니다" + +#: src/sudo.c:203 +#, c-format +msgid "Sudo version %s\n" +msgstr "sudo 버전 %s\n" + +#: src/sudo.c:205 +#, c-format +msgid "Configure options: %s\n" +msgstr "설정 옵션: %s\n" + +#: src/sudo.c:213 +msgid "fatal error, unable to load plugins" +msgstr "치명적인 오류. 플러그인을 불러올 수 없습니다" + +#: src/sudo.c:221 +msgid "unable to initialize policy plugin" +msgstr "정책 플러그인을 초기화할 수 없습니다" + +#: src/sudo.c:265 +msgid "plugin did not return a command to execute" +msgstr "플러그인에서 실행할 명령을 반환하지 않았습니다" + +#: src/sudo.c:281 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "%s 입출력 플러그인 초기화 오류" + +#: src/sudo.c:304 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "예상치 못한 sudo 모드 0x%x" + +#: src/sudo.c:537 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 데이터베이스에 없는 사용자입니다" + +#: src/sudo.c:594 +msgid "unable to determine tty" +msgstr "tty를 지정할 수 없습니다" + +#: src/sudo.c:882 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s은(는) %d uid를 소유해야 하며 setuid 비트를 설정해야 합니다" + +#: src/sudo.c:885 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "%d은(는) 유효한 uid가 아닙니다. %s은(는) 'nosuid' 옵션을 설정한 파일 시스템이거나 루트 권한이 없는 NFS 파일 시스템입니까?" + +#: src/sudo.c:891 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "%d은(는) 유효한 uid가 아닙니다. sudo에 setuid root를 설치했습니까?" + +#: src/sudo.c:944 +msgid "unable to set supplementary group IDs" +msgstr "추가 그룹 ID를 설정할 수 없습니다" + +#: src/sudo.c:951 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "유효한 gid를 %u 실행 gid로 설정할 수 없습니다" + +#: src/sudo.c:957 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "gid를 실행 gid %u(으)로 설정할 수 없습니다" + +#: src/sudo.c:1014 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "예상치 못한 하위 프로세스 중단 상태: %d" + +#: src/sudo.c:1160 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "%s 정책 플러그인에 `check_policy' 메서드가 빠졌습니다" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "%s 정책 플러그인에서 권한 조회를 지원하지 않습니다" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "%s 정책 플러그인에서 -v 옵션을 지원하지 않습니다" + +#: src/sudo.c:1210 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "%s 정책 플러그인에서 -k/-K 옵션을 지원하지 않습니다" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "기록 가능한 임시 디렉터리를 찾을 수 없습니다" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "현재 작업 디렉터리를 복원할 수 없습니다" + +#: src/sudo_edit.c:594 src/sudo_edit.c:706 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: 일반 파일 아님" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: 심볼릭 링크 편집을 허용하지 않습니다" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: 기록 가능한 디렉터리에서 파일 편집을 허용하지 않습니다" + +#: src/sudo_edit.c:637 src/sudo_edit.c:744 +#, c-format +msgid "%s: short write" +msgstr "%s: 기록 내용이 짧습니다" + +#: src/sudo_edit.c:707 +#, c-format +msgid "%s left unmodified" +msgstr "%s 수정하지 않은 상태로 남음" + +#: src/sudo_edit.c:720 src/sudo_edit.c:905 +#, c-format +msgid "%s unchanged" +msgstr "%s 바꾸지 않음" + +#: src/sudo_edit.c:733 src/sudo_edit.c:755 +#, c-format +msgid "unable to write to %s" +msgstr "%s에 기록할 수 없습니다" + +#: src/sudo_edit.c:734 src/sudo_edit.c:753 src/sudo_edit.c:756 +#: src/sudo_edit.c:930 src/sudo_edit.c:934 +#, c-format +msgid "contents of edit session left in %s" +msgstr "%s에 편집 세션 내용 남음" + +#: src/sudo_edit.c:752 +msgid "unable to read temporary file" +msgstr "임시 파일을 읽을 수 없습니다" + +#: src/sudo_edit.c:835 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: 내부 오류: 경로에 잘못된 파일" + +#: src/sudo_edit.c:837 +msgid "sesh: unable to create temporary files" +msgstr "sesh: 임시 파일을 만들 수 없습니다" + +#: src/sudo_edit.c:839 src/sudo_edit.c:937 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: 잘못된 오류 %d" + +#: src/sudo_edit.c:929 +msgid "unable to copy temporary files back to their original location" +msgstr "원위치에 임시 파일을 복사할 수 없습니다" + +#: src/sudo_edit.c:933 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "원 위치에 임시 파일 일부를 복사할 수 없습니다" + +#: src/sudo_edit.c:978 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "uid를 루트로 바꿀 수 없습니다(%u)" + +#: src/sudo_edit.c:995 +msgid "plugin error: missing file list for sudoedit" +msgstr "플러그인 오류: sudoedit에 파일 목록이 빠짐" + +#: src/sudo_edit.c:1036 src/sudo_edit.c:1049 +msgid "unable to read the clock" +msgstr "클록을 읽을 수 없습니다" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "암호 읽기 시간 초과" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "암호를 입력하지 않았습니다" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "암호를 읽을 수 없습니다" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "암호를 읽으려면 터미널이 필요합니다. -S 옵션을 사용하여 표준 입력으로 암호를 받거나 askpass 도우미를 설정하십시오." + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "askpass 프로그램을 지정하지 않았습니다. SUDO_ASKPASS를 설정해보십시오" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "gid를 %u(으)로 설정할 수 없습니다" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "uid를 %u(으)로 설정할 수 없습니다" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "%s을(를) 실행할 수 없습니다" + +#: src/utmp.c:287 +msgid "unable to save stdin" +msgstr "표준 입력을 저장할 수 없습니다" + +#: src/utmp.c:289 +msgid "unable to dup2 stdin" +msgstr "표준 입력을 dup2 처리할 수 없습니다" + +#: src/utmp.c:292 +msgid "unable to restore stdin" +msgstr "표준 입력을 복원할 수 없습니다" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "존재하는 tty가 없으며 askpass 프로그램을 지정하지 않았습니다" + +#~ msgid "error reading from signal pipe" +#~ msgstr "시그널 파이프 읽기 오류" + +#~ msgid "unable to get group vector" +#~ msgstr "그룹 벡터를 가져올 수 없습니다" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "알 수 없는 %u: 누구일까요?" + +#~ msgid "error reading from pipe" +#~ msgstr "파이프 읽기 오류" diff --git a/utsudo-0.0.2/po/nb.mo b/utsudo-0.0.2/po/nb.mo new file mode 100644 index 0000000000000000000000000000000000000000..3f05f5341efb084bc219807955e2e8487713328d GIT binary patch literal 19515 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, 2011-2013. +# Åka Sikrom , 2014-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.28b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-07-19 11:51-0600\n" +"PO-Revision-Date: 2019-07-21 11:14+0200\n" +"Last-Translator: Åka Sikrom \n" +"Language-Team: Norwegian Bokmaal \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Poedit 2.0.6\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "klarte ikke å åpne brukerdatabase" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "klarte ikke å skifte til registeret «%s» for %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "klarte ikke å gjenopprette register" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:469 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:999 +#: src/exec_pty.c:1162 src/exec_pty.c:1168 src/exec_pty.c:1177 +#: src/exec_pty.c:1184 src/exec_pty.c:1191 src/exec_pty.c:1198 +#: src/exec_pty.c:1205 src/exec_pty.c:1212 src/exec_pty.c:1219 +#: src/exec_pty.c:1226 src/exec_pty.c:1233 src/exec_pty.c:1240 +#: src/exec_pty.c:1248 src/exec_pty.c:1665 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:206 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:678 src/sudo.c:688 src/sudo.c:708 src/sudo.c:727 +#: src/sudo.c:736 src/sudo.c:745 src/sudo.c:762 src/sudo.c:803 src/sudo.c:813 +#: src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 src/sudo.c:1268 +#: src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 src/sudo_edit.c:888 +#: src/sudo_edit.c:1002 src/sudo_edit.c:1022 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:783 +#: src/exec_pty.c:792 src/exec_pty.c:849 src/exec_pty.c:1162 +#: src/exec_pty.c:1168 src/exec_pty.c:1177 src/exec_pty.c:1184 +#: src/exec_pty.c:1191 src/exec_pty.c:1198 src/exec_pty.c:1205 +#: src/exec_pty.c:1212 src/exec_pty.c:1219 src/exec_pty.c:1226 +#: src/exec_pty.c:1233 src/exec_pty.c:1240 src/exec_pty.c:1248 +#: src/exec_pty.c:1665 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:185 src/parse_args.c:207 +#: src/parse_args.c:281 src/parse_args.c:571 src/parse_args.c:593 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:316 src/selinux.c:439 src/selinux.c:448 src/sesh.c:117 +#: src/sudo.c:618 src/sudo.c:836 src/sudo.c:1073 src/sudo.c:1094 +#: src/sudo.c:1268 src/sudo.c:1384 src/sudo_edit.c:258 src/sudo_edit.c:791 +#: src/sudo_edit.c:888 src/sudo_edit.c:1002 src/sudo_edit.c:1022 +msgid "unable to allocate memory" +msgstr "klarte ikke å tildele minne" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Ukjent signal" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:56 lib/util/strtonum.c:65 lib/util/strtonum.c:183 +msgid "invalid value" +msgstr "ugyldig verdi" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:138 lib/util/strtoid.c:166 +#: lib/util/strtomode.c:62 lib/util/strtonum.c:68 lib/util/strtonum.c:195 +msgid "value too large" +msgstr "verdien er for stor" + +#: lib/util/strtoid.c:93 lib/util/strtoid.c:144 lib/util/strtomode.c:62 +#: lib/util/strtonum.c:68 lib/util/strtonum.c:189 +msgid "value too small" +msgstr "verdien er for liten" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "«%s» er en ugyldig Path-verdi i %s, linje %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "«%2$s» er en ugyldig verdi for %1$s i %3$s, linje %4$u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "gruppekilden «%s» (i %s, linje %u) støttes ikke" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "«%s» er et ugyldig maskimalt antall grupper i %s, linje %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "klarte ikke å lage statistikk av %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "«%s» er ikke en vanlig fil" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "«%s» eies av uid %u, som skulle vært %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "«%s» kan overskrives av alle" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "«%s» kan overskrives av eiergruppa" + +#: lib/util/sudo_conf.c:599 src/selinux.c:215 src/selinux.c:232 src/sudo.c:362 +#, c-format +msgid "unable to open %s" +msgstr "klarte ikke å åpne %s" + +#: src/exec.c:167 +#, c-format +msgid "unknown login class %s" +msgstr "innloggingsklassen «%s» er ukjent" + +#: src/exec.c:180 +msgid "unable to set user context" +msgstr "klarte ikke å velge brukerkontekst" + +#: src/exec.c:196 +msgid "unable to set process priority" +msgstr "klarte ikke å velge prosessprioritet" + +#: src/exec.c:204 +#, c-format +msgid "unable to change root to %s" +msgstr "klarte ikke å endre rot til «%s»" + +#: src/exec.c:217 src/exec.c:223 src/exec.c:230 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "klarte ikke å endre til runas uid (%u, %u)" + +#: src/exec.c:248 +#, c-format +msgid "unable to change directory to %s" +msgstr "klarte ikke å endre mappe til «%s»" + +#: src/exec.c:347 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:527 src/exec_pty.c:527 src/exec_pty.c:1333 +#: src/exec_pty.c:1335 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "klarte ikke å velge håndtering av signal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "klarte ikke å fjerne PRIV_PROC_EXEC fra PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "feil under lesing fra sokkelpar" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "uforventet responstype i bak-kanalen: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:649 +#: src/exec_pty.c:654 src/exec_pty.c:751 src/exec_pty.c:758 src/exec_pty.c:855 +#: src/exec_pty.c:1170 src/exec_pty.c:1179 src/exec_pty.c:1186 +#: src/exec_pty.c:1193 src/exec_pty.c:1200 src/exec_pty.c:1207 +#: src/exec_pty.c:1214 src/exec_pty.c:1221 src/exec_pty.c:1228 +#: src/exec_pty.c:1235 src/exec_pty.c:1242 src/exec_pty.c:1618 +#: src/exec_pty.c:1628 src/exec_pty.c:1673 src/exec_pty.c:1680 +#: src/exec_pty.c:1707 +msgid "unable to add event to queue" +msgstr "klarte ikke å legge hendelse i kø" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "klarte ikke å velge styrende tty" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1412 +#: src/exec_pty.c:1433 src/exec_pty.c:1453 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "klarte ikke å lage datarør" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "klarte ikke å motta melding fra forelder" + +#: src/exec_monitor.c:616 src/exec_nopty.c:384 src/exec_pty.c:1491 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "klarte ikke å lage kopi av prosess" + +#: src/exec_monitor.c:630 src/sesh.c:127 src/sudo.c:1132 +#, c-format +msgid "unable to execute %s" +msgstr "klarte ikke å kjøre «%s»" + +#: src/exec_monitor.c:713 src/exec_nopty.c:437 +msgid "unable to restore tty label" +msgstr "klarte ikke å gjenopprette tty-etikett" + +#: src/exec_nopty.c:360 src/exec_pty.c:1342 +msgid "policy plugin failed session initialization" +msgstr "regeltillegg klarte ikke å starte økt" + +#: src/exec_nopty.c:426 src/exec_pty.c:1578 +msgid "error in event loop" +msgstr "feil i hendelsesløkke" + +#: src/exec_nopty.c:535 src/exec_pty.c:562 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "klarte ikke å gjenopprette håndtering av signal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "klarte ikke å tildele pty" + +#: src/exec_pty.c:1322 +msgid "unable to create sockets" +msgstr "klarte ikke å lage sokkel" + +#: src/exec_pty.c:1535 +msgid "unable to send message to monitor process" +msgstr "klarte ikke å sende melding til overvåkningsprosess" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "feil i «%s» linje %d under innlasting av tillegg «%s»" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "«%s» må eies av uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "«%s» kan ikke være overskrivbar for andre enn eier" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "klarte ikke å laste inn «%s». %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "fant ikke symbol «%s» i %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "regeltypen «%d», som ble funnet i «%s», er ukjent" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "ukompatibel versjon av programtillegg %d (forventet %d) ble funnet i «%s»" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "regeltillegg «%s» i «%s» linje %d blir ignorert" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "du kan bare velge ett regeltillegg" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "duplikattillegg «%s» i «%s» linje %d blir ignorert" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "duplikattillegg «%s» for inn- og utdata i «%s» line %d blir ignorert" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "regeltillegget «%s» inneholder ikke en «check_policy»-metode" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:472 +#, c-format +msgid "internal error, %s overflow" +msgstr "intern feil: %s er full" + +#: src/parse_args.c:227 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "%s er et ugyldig miljøvariabel-navn" + +#: src/parse_args.c:326 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "«-C» må brukes med et tallargument med en verdi på minst 3" + +#: src/parse_args.c:511 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "du kan ikke velge både «-i» og «-s»" + +#: src/parse_args.c:515 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "du kan ikke velge både «-i» og «-E»" + +#: src/parse_args.c:525 +msgid "the `-E' option is not valid in edit mode" +msgstr "valget «-E» er ugyldig i redigeringsmodus" + +#: src/parse_args.c:527 +msgid "you may not specify environment variables in edit mode" +msgstr "du kan ikke velge miljøvariabler i redigeringsmodus" + +#: src/parse_args.c:535 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "valget «-U» kan ikke brukes uten «-l»" + +#: src/parse_args.c:539 +msgid "the `-A' and `-S' options may not be used together" +msgstr "valgene «-A» og «-S» kan ikke brukes samtidig" + +#: src/parse_args.c:615 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit støttes ikke på denne plattformen" + +#: src/parse_args.c:688 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Du kan bare velge ett av valgene -e, -h, -i, -K, -l, -s, -v eller -V" + +#: src/parse_args.c:702 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - rediger filer som om du var en annen bruker\n" +"\n" + +#: src/parse_args.c:704 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - kjør en kommando som om du var en annen bruker\n" +"\n" + +#: src/parse_args.c:709 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Valg:\n" + +#: src/parse_args.c:711 +msgid "use a helper program for password prompting" +msgstr "bruk et hjelpeprogram for å oppgi passord" + +#: src/parse_args.c:714 +msgid "use specified BSD authentication type" +msgstr "bruk valgt BSD-autentiseringsmetode" + +#: src/parse_args.c:717 +msgid "run command in the background" +msgstr "kjør kommando i bakgrunnen" + +#: src/parse_args.c:719 +msgid "ring bell when prompting" +msgstr "lag varsellyd ved spørrende ledetekst" + +#: src/parse_args.c:721 +msgid "close all file descriptors >= num" +msgstr "lukk alle fildeskriptorer >= num" + +#: src/parse_args.c:724 +msgid "run command with the specified BSD login class" +msgstr "kjør kommando med valgt BSD-innloggingsklasse" + +#: src/parse_args.c:727 +msgid "preserve user environment when running command" +msgstr "behold gjeldende brukermiljø når kommandoen kjøres" + +#: src/parse_args.c:729 +msgid "preserve specific environment variables" +msgstr "behold bestemte miljøvariabler" + +#: src/parse_args.c:731 +msgid "edit files instead of running a command" +msgstr "rediger filer i stedet for å kjøre en kommando" + +#: src/parse_args.c:733 +msgid "run command as the specified group name or ID" +msgstr "kjør kommando som om du var en del av valgt gruppe (-navn eller -ID)" + +#: src/parse_args.c:735 +msgid "set HOME variable to target user's home dir" +msgstr "bruk valgt brukers hjemmemappe som HOME-miljøvariabel" + +#: src/parse_args.c:737 +msgid "display help message and exit" +msgstr "vis hjelpetekst og avslutt" + +#: src/parse_args.c:739 +msgid "run command on host (if supported by plugin)" +msgstr "kjør kommando på verten (hvis programtillegget støtter det)" + +#: src/parse_args.c:741 +msgid "run login shell as the target user; a command may also be specified" +msgstr "kjør innloggingsskall som om du var den valgte brukeren (du kan også oppgi en kommando her)" + +#: src/parse_args.c:743 +msgid "remove timestamp file completely" +msgstr "fjern tidsstempel-fil skikkelig" + +#: src/parse_args.c:745 +msgid "invalidate timestamp file" +msgstr "gjør tidsstempel-fil ugyldig" + +#: src/parse_args.c:747 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "vis brukerens privilegier, eller sjekk om det fungerer å kjøre en bestemt kommando (bruk to ganger for å se et lengre format)" + +#: src/parse_args.c:749 +msgid "non-interactive mode, no prompts are used" +msgstr "stillemodus (ingen ledetekst vises)" + +#: src/parse_args.c:751 +msgid "preserve group vector instead of setting to target's" +msgstr "behold gruppevektor, i stedet for å bruke den som gjelder for målet" + +#: src/parse_args.c:753 +msgid "use the specified password prompt" +msgstr "bruk valgt passord-ledetekst" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified role" +msgstr "lag SELinux-sikkerhetskontekst med valgt rolle" + +#: src/parse_args.c:759 +msgid "read password from standard input" +msgstr "les passord fra standard inndata" + +#: src/parse_args.c:761 +msgid "run shell as the target user; a command may also be specified" +msgstr "kjør skall som valgt bruker (du kan også oppgi en kommando her)" + +#: src/parse_args.c:764 +msgid "create SELinux security context with specified type" +msgstr "lag SELinux-sikkerhetskontekst med valgt type" + +#: src/parse_args.c:767 +msgid "terminate command after the specified time limit" +msgstr "avslutt kommando etter valgt tidsfrist" + +#: src/parse_args.c:769 +msgid "in list mode, display privileges for user" +msgstr "vis brukerprivilegier (i listemodus)" + +#: src/parse_args.c:771 +msgid "run command (or edit file) as specified user name or ID" +msgstr "kjør kommando (eller rediger fil) som valgt brukernavn eller bruker-ID" + +#: src/parse_args.c:773 +msgid "display version information and exit" +msgstr "vis programversjon og avslutt" + +#: src/parse_args.c:775 +msgid "update user's timestamp without running a command" +msgstr "oppdater brukerens tidsstempel uten å kjøre en kommando" + +#: src/parse_args.c:777 +msgid "stop processing command line arguments" +msgstr "slutt å behandle kommandolinje-argumenter" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "klarte ikke å åpne revisjonssystemet" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "klarte ikke å sende revisjonsmelding" + +#: src/selinux.c:123 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "klarte ikke å utføre fgetfilecon %s" + +#: src/selinux.c:128 +#, c-format +msgid "%s changed labels" +msgstr "%s endret etiketter" + +#: src/selinux.c:133 +#, c-format +msgid "unable to restore context for %s" +msgstr "klarte ikke å gjenopprette kontekst for «%s»" + +#: src/selinux.c:174 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "klarte ikke å åpne «%s». tty får ikke ny etikett" + +#: src/selinux.c:178 src/selinux.c:219 src/selinux.c:236 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s er ikke en tegnenhet. tty får ikke ny etikett" + +#: src/selinux.c:187 +msgid "unable to get current tty context, not relabeling tty" +msgstr "klarte ikke å hente gjeldende tty-kontekst. tty får ikke ny etikett" + +#: src/selinux.c:194 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "«chr_file» er ugyldig sikkerhetsklasse. tty får ikke ny etikett" + +#: src/selinux.c:199 +msgid "unable to get new tty context, not relabeling tty" +msgstr "klrate ikke å hente ny tty-kontekst. tty får ikke ny etikett" + +#: src/selinux.c:206 +msgid "unable to set new tty context" +msgstr "klarte ikke å velge ny tty-kontekst" + +#: src/selinux.c:280 +#, c-format +msgid "you must specify a role for type %s" +msgstr "du må velge en rolle for typen «%s»" + +#: src/selinux.c:286 +#, c-format +msgid "unable to get default type for role %s" +msgstr "klarte ikke å hente standardtype for rollen «%s»" + +#: src/selinux.c:304 +#, c-format +msgid "failed to set new role %s" +msgstr "klarte ikke å velge den nye rollen «%s»" + +#: src/selinux.c:308 +#, c-format +msgid "failed to set new type %s" +msgstr "klarte ikke å velge den nye typen «%s»" + +#: src/selinux.c:320 +#, c-format +msgid "%s is not a valid context" +msgstr "«%s» er en ugyldig kontekst" + +#: src/selinux.c:355 +msgid "failed to get old_context" +msgstr "klarte ikke å hente «old_context»" + +#: src/selinux.c:361 +msgid "unable to determine enforcing mode." +msgstr "klarte ikke å finne håndhevelsesmodus." + +#: src/selinux.c:378 +#, c-format +msgid "unable to set tty context to %s" +msgstr "klarte ikke å velge «%s» som tty-kontekst" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set exec context to %s" +msgstr "klarte ikke å velge «%s» som kjørekontekst" + +#: src/selinux.c:424 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "klarte ikke å velge «%s» som nøkkelkontekst" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "krever at du bruker minst ett argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "ugyldig fildeskriptor-tall: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "klarte ikke å kjøre %s som et innloggingsskall" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "klarte ikke å lagre håndtering av signal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "kontrollgrensen for ressurser er nådd" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "brukeren «%s» er ikke medlem av prosjektet «%s»" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "den kallende oppgaven er endelig" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "klarte ikke å bli med i prosjektet «%s»" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "det er ingen ressursgrunnlag som godtar standardtildelinger for prosjektet «%s»" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "fant ikke valgt ressursgrunnlag for prosjetet «%s»" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "klarte ikke å tildele standard ressursgrunnlag for prosjektet «%s»" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "klarte ikke å utføre «setproject» på «%s»" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "advarsel: noe gikk galt ved tildeling av ressurskontroll for prosjektet «%s»" + +#: src/sudo.c:203 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versjon %s\n" + +#: src/sudo.c:205 +#, c-format +msgid "Configure options: %s\n" +msgstr "Velg innstillinger: %s\n" + +#: src/sudo.c:213 +msgid "fatal error, unable to load plugins" +msgstr "kritisk feil: klarte ikke å laste inn tilleggsprogrammer" + +#: src/sudo.c:221 +msgid "unable to initialize policy plugin" +msgstr "klarte ikke å starte opp regeltillegg" + +#: src/sudo.c:265 +msgid "plugin did not return a command to execute" +msgstr "tillegget sendte ikke en kjørbar kommando" + +#: src/sudo.c:281 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "feil under klargjøring av inn-/utdatatillegget «%s»" + +#: src/sudo.c:304 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "uforventet sudo-modus 0x%x" + +#: src/sudo.c:537 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du finnes ikke i databasen %s" + +#: src/sudo.c:594 +msgid "unable to determine tty" +msgstr "fant ikke gjeldende tty" + +#: src/sudo.c:882 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "«%s» må eies av uid %d, og setuid-biten må være valgt" + +#: src/sudo.c:885 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "effektiv uid er ikke %d. Er «%s» på et filsystem hvor «nosuid» er valgt, eller på et NFS-filsystem uten rot-rettigheter?" + +#: src/sudo.c:891 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "effektiv uid er ikke %d. Er sudo installert med «setuid root»?" + +#: src/sudo.c:944 +msgid "unable to set supplementary group IDs" +msgstr "klarte ikke å velge ekstra grruppe-id-er" + +#: src/sudo.c:951 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "klarte ikke å velge «runas gid %u» som effektiv gid" + +#: src/sudo.c:957 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "klarte ikke å velge «runas gid %u» som gid" + +#: src/sudo.c:1014 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "uforventet årsak for avslutning av underprosess: %d" + +#: src/sudo.c:1160 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "regeltillegget «%s» mangler «check_policy»-metoden" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "regeltillegget «%s» støtter ikke listetillatelser" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "regeltillegget «%s» støtter ikke valget «-v»" + +#: src/sudo.c:1210 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "regeltillegget «%s» støtter ikke valgene «-k» og «-K»" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "fant ingen midlertidig mappe med skrivetillatelse" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "klarte ikke å gjenopprette gjeldende arbeidsmappe" + +#: src/sudo_edit.c:594 src/sudo_edit.c:706 +#, c-format +msgid "%s: not a regular file" +msgstr "«%s» er ikke en vanlig fil" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: redigering av symbolske lenker tillates ikke" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: redigering av filer i en mappe med skrivetilgang tillates ikke" + +#: src/sudo_edit.c:637 src/sudo_edit.c:744 +#, c-format +msgid "%s: short write" +msgstr "«%s» har kort skriving" + +#: src/sudo_edit.c:707 +#, c-format +msgid "%s left unmodified" +msgstr "«%s» ble uendret" + +#: src/sudo_edit.c:720 src/sudo_edit.c:905 +#, c-format +msgid "%s unchanged" +msgstr "«%s» er uendret" + +#: src/sudo_edit.c:733 src/sudo_edit.c:755 +#, c-format +msgid "unable to write to %s" +msgstr "klarte ikke å skrive til «%s»" + +#: src/sudo_edit.c:734 src/sudo_edit.c:753 src/sudo_edit.c:756 +#: src/sudo_edit.c:930 src/sudo_edit.c:934 +#, c-format +msgid "contents of edit session left in %s" +msgstr "innhold fra redigeringsøkt ligger igjen i «%s»" + +#: src/sudo_edit.c:752 +msgid "unable to read temporary file" +msgstr "klarte ikke å lese midlertidig fil" + +#: src/sudo_edit.c:835 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: intern feil: for høyt antall stier" + +#: src/sudo_edit.c:837 +msgid "sesh: unable to create temporary files" +msgstr "sesh: klarte ikke å lage midlertidige filer" + +#: src/sudo_edit.c:839 src/sudo_edit.c:937 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: ukjent feil (%d)" + +#: src/sudo_edit.c:929 +msgid "unable to copy temporary files back to their original location" +msgstr "klarte ikke å kopiere midlertidige filer tilbake til opprinnelig plassering" + +#: src/sudo_edit.c:933 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "klarte ikke å kopiere enkelte midlertidige filer tilbake til opprinnelig plassering" + +#: src/sudo_edit.c:978 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "klarte ikke å endre uid til root (%u)" + +#: src/sudo_edit.c:995 +msgid "plugin error: missing file list for sudoedit" +msgstr "feil med tillegg: sudoedit mangler filliste" + +#: src/sudo_edit.c:1036 src/sudo_edit.c:1049 +msgid "unable to read the clock" +msgstr "klarte ikke å lese klokka" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tidsavbrudd under lesing av passord" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "du skrev ikke inn passord" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "klarte ikke å lese passord" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "du trenger en terminal for å lese passordet. Bruk enten valget «-S» for å lese fra standard inndata eller sett opp et askpass-hjelpeprogram" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "intet program for passord-etterspørsel er valgt. Prøv å velge «SUDO_ASKPASS»" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "klarte ikke å velge %u som gid" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "klarte ikke å velge %u som uid" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "klarte ikke å kjøre «%s»" + +#: src/utmp.c:287 +msgid "unable to save stdin" +msgstr "klarte ikke å lagre standard innkanal" + +#: src/utmp.c:289 +msgid "unable to dup2 stdin" +msgstr "klarte ikke å utføre «dup2 stdin»" + +#: src/utmp.c:292 +msgid "unable to restore stdin" +msgstr "klarte ikke å gjenopprette standard innkanal" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "ingen tty er tilgjengelig, og intet program for passord-etterspørsel er valgt" + +#~ msgid "unable to get group vector" +#~ msgstr "klarte ikke å hente gruppevektor" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "UID %u er ukjent. Hvem er du?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "feil under lesing fra signalrør" + +#~ msgid "error reading from pipe" +#~ msgstr "feil under lesing fra datarør" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "klarte ikke å sette terminal i råmodus" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "intern feil: prøvde å tildele tomme byte" + +#~ msgid "unable to open socket" +#~ msgstr "klarte ikke å åpne sokkelen" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "intern feil: prøvde emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "intern feil: prøvde ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "intern feil: prøvde erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "intern feil: prøvde erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "intern feil: prøvde erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: overbelastet" diff --git a/utsudo-0.0.2/po/nl.mo b/utsudo-0.0.2/po/nl.mo new file mode 100644 index 0000000000000000000000000000000000000000..38603ce56bbb7df2830f03b5660f5169ec17b0c0 GIT binary patch literal 17715 zcmcJWdypJgb;g^wQ2-l*v5jrqHmp|yjUIky<+mhk*_I_+ekGVly*s_Lt)1x}`mw7O zBtT*eIAFj)0t7IRKw_$(paLNeDj}FaQKU!}6qSN1ObQanqbNfDNLAv3yQgP% zBny&E?bWx_eIMtZbM86kp0j%N)F;0);PWxs*|h#sg5dk$=Qi*UpBtVP1p0Lkcpi8= zxDi|dpA9|)J{SBHcn0_-@J#T#;0wY3^zY9(IS5YW`-R|(z}?{U!NcIC;OoF=fS&_T z0>1)275qB*Jn&l}Kf%BG@4+e1#P`!deu9X9SSrXt(fL|X>wg%$9Q-nP7AT@G0?zih zA3TTe_kyD9L*OjY8?Y9G7494I^;Cn!g`xjmIt;4NSWyblz=J`IYFuY;QBzd_Nv1tqx>%t6un zNl^R$HVDbV6JU<$I0HN%+y!d>9;ki~f#U0zzze~jfSTt;D7*G?3n)I{3o>Q!2*^+H zDF0~w$G{Lg6(SiLTm)*~eW3Qa0^SI|3)DQ{2Vr$^KAUFi!R4UjeJhCQg39Cl{{2H> z$n!q|rN7?-Mb|%pTIU7lI=Xg)(w9S^_W2;Fbv^^4qQO_e8Sp!x=zLP>-k{Wn&$v0I+sE1 z`#wkt3m1AdqMH{E1>9q3=|!+{3E*e zg3_A|JQ;kq$A`fy`2MG$^y@!7ZbEpM^8FqVQi8XGuX{oed=`8<->-z|ZQ%8wp{&Qf#T~?@NV!yQ2YB=P;!3^6u+JUQ?$-j@G9^iD89TO)c!vYUJ3pb6umoOs>a<3 z{xY}*z76~%@Mdr~hhNVh1SQA60byP6C@6ZKj1kcIvq9;{)u8m_<)HZUDvuuk5moR- z@G|h9!8!0eh?P9<@%R?-HokuW)c#L{`RczF6hC{Qi;B^V+fuD z-T^)U-Ua>xcoTR9i%H&Z05$F}L0$zv@^~&rbO+yW1$h*_8HCi}^Pu|u7=(4fc?kI$ za4#r%Kfphx51{t{LofuN3bEqy(%>`x`}e>-d_M=_>U{M; z(RD8<`F8gW^Lz??4)_@OJn&?gD80Aizv-2!0UMI$r?q1pgiszb`{sLvRt)^Vfso zYEb&|DNyr%2b4Vi3zU4%yT-}mE>Pnh1hwAhK+*FksQo|vTKD~OQ1dK+;`?jBbHR^* zlILH8&jxwU3X2=YW3;a%6%ZfrvJE0m_L=1b2gy|Jyu% z7Sw*e1D*^%eV4;CK^_I0K=F0p@dMx$eE$Y`K6uJ*d_SnqduWGg=h3tWoyQ*SHMHAl z&!TDUAJE=N)BO5qf1*jBXVYFw+oLahmT9-xZ;t=^^%~k+X|kiDT_2qt@%5FoU!&EZ z5AjRxzq|k}Xus;ePeS4!ys7mGU~Zew6Z!3W+RJGBX-}g`HxQ-y#2sKr)91Hn5iO%h&tF8lj;7D= zIS5|r@fqL(O?G2I8`AdDeut*dm9!)FTM+y{_`5XemOe4>HLzmKJjxf|(-hgmE`1!^NZ@7h%Ltnw3j& z9#%!1Z>W15i5IFe4x?}(8w{efJH6w=Qk3@MZrG3J<9?yZlOpWpSv3q-^Q4UC`>}t> z8cdeQy{aGOw)WVIm8hR|St~8$Bc*?nt)@&pzZO=!nyEI2#Zp%Fc@p!@_gT$yp0wBM z$BSiHrGu=SEGBVR{RUN0YE+i?*MxO<&8?HmQnV6>urDm)QgqJ4 zS$@@wRqENpmziQNoDqW>n97hj?J+Nn!Z_HOrHe_g%AwrLk2y93`?QTL<>{iW+=(}b zoh4dAyNTAP6||Kw%frr{_2_UA+4hTJyx@3qpz3DfN}LxchfRG)x}3t1ut<7o)DIT= zS%D7p`zElk8y5?CGAy&a2(P*_Oshd)5=+ZMw3t>EabdHW7!u7&A4yI7oloFcnK98~ zRP{^Lp~$LyAr6OG#u`vN%(KJsLK&VvQ=H!#csOIK@ppL~p`QnK-<+h?5m>%Zp>S)p z3WcjlxfC`#4f705T=@CMlxxE{=qAOm58syJ{xBS{xu^$6*hYLLDVw)750jKl3?d!2 zQK!~vOVXl@qprA>S81B0z0nB^;>AU_o}f=sBo2~THq+g#Ur{Gb>EuwXG0VVhQK~na zW(7lLy`ZIkl6;hgx4iVgx*=Hw<1?ln=E({+pcfZcA9w9SS|Z9(1P-KEbWOpyJZB}7 z^X9Ohpp-Kl$0eo>`&rc028aEsM~6c*#q6kiyb`A+U9w^GEGZL=z)=m^vvprR4E=Fy zAUm6GG0z6!FhMj^o;$rg_Umk6IWC7$k_U?sG@3H@#I1h!U~POxZ^XwmUNz;BBCmfV z6>)E1PG|&e=G@EfNzcUszmX!~NM*Tp*R6*AWI@{7+Nanv!N+MMh8aWGYUUhw&dnSqP_Y?Z0U-<3I5TQ(;%79EZA3_D%MFfesqVt>TZ=GQ7VrE+W3+E+E* z2GJ4cii+cQvx%BPZdzF)Xk5?UW_C%hOt1%KG#EN}W~>yqW{cL*(m`BUiWinSyxtrw zV5H2a?vTq3%hd!6s3rRu&J^cpCL~BReD3lvDl}cz%cDU(L5xi(^EI8sQVMn8j$Qi> zUVGrC{ns8ipkd=?HCkARaUW7VZ+2yd`CiC|71(aAJ!V{)qr{dDnMlV}=I(gZux8pZ zIY!QYIfY^fvkr!=5aGkvYd0_#3@2D#nlz@(>)ex9G&@#v;UK}YunWa4PH#oGjFSv( zFg_R3&S}Y?$9P~X0ak-Rrk29{QhC?}H304b_4#o)#l3ngBZ|&Svd*2fs zgVQ!=zrH_ipyq*QKV)jJ;6RCAWGv1t;v>Wj)NrzQQj{(MD z;xy@q4Eu2z_t)s~iYh@B!w6Z#5e7@a5A;-8me)RrkO9ZfBd-BL*bD=j?;iY zU&`3b#$*vKHdVv$5t2H!-!!(cg)`$zUw2>^7DKLep$~tpyZc@ctn{@h4RC_9;C{y_ z*sxeI>KE8nLf3jbHpeeM8Z}#*L#l0qJ{M+PtVcDNM_UMca3V`Z;ChZ6rH{;rYB+Hb zrp+!VO*a>mI)6XY<#8F_uy5~foIsw`zP7bb4DeEh{JQvg`qrk+ABJ_-uGv1S(vC+P z17c=!y_GD=Y$yx2ppX~);8h;|YpExD^%km*=tiy`oB)8+ZR}tz_?)F^_bH@8`+jHl^{kQGgd2sjLyLURbZO?Arvv<$!WBsv$1b1FgW+cZphe@>#n1*gY zw&2!h7q}%%nTQM#;a1*0>h%97Zu#qwU${9J2Dp-j%>k!hVK z2_Z=4#$uxJ8G`n-QfU{N;21E1W2!4xHoEusyrnUtq%Sko#7sJV4YMcBnkMs8tQ+|F zQ$Oz3nSD9tOv=(I!BNY68W|IZX<`@NX)2<|B(7tKJY+vsaHmkf9oap*+U83;bq35i znmk%H^EI(f>o~9T51PVT_I1p%5YTV0J!MG*I;K?xaoNI>c?YkzmbqGg43u&t7V|!; zxhOA?DZ#mzDQ=j`5r@4b3Uxl3u6aBp?Pul<-Yce*3ryqwWJgQa$d-rOj?5fk3Ku=K zLPfU+_t;;CTq1)2y>)A^M~X``)g19XH&V{}T2@`nw4*r2Nyvvzht?%B(BWZM7iO`Q z*lcufR#a>0sCBt8x)Q7^>4wcfUF`ZRv))`Kc*xa~6BVfMD27v5998(+v{aHsimJ_7 zFU41*o)c54NAAQ&jN;O>gSd%X+lfh+B`7m8Jh~PIqwmFl%tf#o<;v}C9tD)%0$_iX zqO$AKvBFW<+k|_LShBWc=oLc{9VT^j*u;EAaH2yuH)}6ftR;hDc)hjx; zXLI3FSq|s6Ze3kn-JpzId=g=5Qv1iUz}V#|iTd-m=gF=_jjZ5wu~1d_53baoEQaHQPI^&m-ikVT4e zjMkNR-2T$e<)eODaxu<3yGhY0t1}l~P7Pv%tNFxD$!9)Zjq_!0dv^OK1mW@*>UxY{ zjycr5cs{R^JP}(^xQ?A;!wh>o=CmmB-*=P-0vo2-fN@mUd230yX1pcSVQsqAj7IR zTPe794w!GI3Xdj-ZJ~x3l8kH{LZ;HAM4aCW)1gj|%t1uHo+LQKOeYR6&PPkp0J;>ECzZMs`PY#7=MX;o;V<$L(xjsmk_uCSwBoyZ^Tp6 zsd6qnUWsav5>;?O_Q7(=3ffiUnva(iR#`@$+hWmo>L**H1mKifRFdLMx<;4Nb~sd6 z>I+{2*)gWtL@AR7U!)6Zf>2mjDN*)B5{(;=(o@P$Emi&DJlU;OyOntHIiu>7hPNNM zxe5|T+;^#}q`@GHmYWLIJi4Crb^q%XUW;uxxbD&~3o(&;EOQ!0(JwgIOt40a^fF$? zP?sdjutsPs=?d;1f#WjyT5PsTRSHWcx~wx6FbpdcA$dt1Nys{gD}0kK)HWjU>O18S z%BPCit%BCj#?CvFRM@SCvX*23AI6GW@kraP(#Vo3ZA}h6n#q{iO`Ws=5>Kx_af-}E z^*9PBfX+AyVCvvboGW(`9_iqrJ@W0S6Wif19wt)JbC+EujEK`tUE6`tQnq@e_y7}~6E05m!<1*f*_1YJ}Fi)t#GQJHxZCAgPVeVJUWnfug z*x+Q0Jtn;4tp^r?e@rq5yoHx(aL<>pXF#w?LioG_-qO>pdjZZ*%}4_G~{_~i z*c58~%~CwiJQygF;HWZAa#Tu_(YFelG?ki6?OprXvKfRa9ITpdSok9erp?Th%AV%e zA@;bV@G`QgaWhT*!0nEGOdW0}v`h}eG_%X*=oAVB>)3C)<%1aGzAS|-tpZf6LLK-o z%T>9MW(ORaC+eXF7sp&~>1B2v11CYEQ!t3$qCyK2El5hM_=4_A9!0&4zCyRD1EY0E z8ANpNp`HXbo8=zF{jma_WD5J`xj9`Fv7Hs;W@!twe2$Bk);S(>o^pR9Kjq7LQ0Gd0 ztXMi~{l(HGwHgzc$q)S8`*2#^)c4q$?%MtcNJm*lg+Cr+i<%RF%N_*_t>Y$xs31Yk zSUTvUmUC-VGaXXR3seD zJ;|Ipe<KVWb~jC#z@5GESdv@_r;W_dvMPk+De60&J#>XWEv}X3<1FiSN5^-^SYT%- zHp`al(7xHUn{#|BDNn<=6P>4BJapcT(qSq)s&H6-W@xd3>(@jQQkfX*fK~Ul!VMTi zTpvQpe=134{x;#}Rbox%w_QV2^uZCrOQyQfk##CEieonKAR3z9Hd~VYmdECiZz8uQ)^xO!daCg znR!;#$N^PHe`hKc{lcDFAv|-+z^;LGCp}e%{4Tr@e@FK+^B_%Us*NA zROVdj$@{Z`tW>>26OSsBx?;;sQ|dus>|RdhQ3q4!s*7>s+hlxfypOwKC(eUr%{6rG}|xlqZ4+V1}EW-@N-CIiP%?h%K5IkWXRTI{YWAEG>jX_nhL-iZifi;c8u zrtN6ts!;n$XC$T&NsM<4#tWRy<;FOu>Lz#gdXQUF%I*bf+hD$GRq-HyETA=WWt230 z2{D-fTn(UKrv{7wbjIJ&_=7Lsp`?(|A3MiG`mVBIoenap>Lf1N@`M1oJv?QPUb{FW-B*0Pg}TVtHp};$J1>IsqpC;S$A}g9**u-fst-d++O)YxM?oRDdlhz!v zF)21rE##1;wz8Bf#kRNL1wbaBy_)jc_;&Pern0&H7FoGT^Q|9MAG@hj`iV|p zy%8lAw@(*;?S, 2013 +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.12b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2014-10-27 12:35-0600\n" +"PO-Revision-Date: 2015-01-14 02:50+0100\n" +"Last-Translator: P. Hamming \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/util/aix.c:92 lib/util/aix.c:151 +msgid "unable to open userdb" +msgstr "kan userdb niet openen" + +#: lib/util/aix.c:156 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "kan niet wijzigen naar register \"%s\" voor %s" + +#: lib/util/aix.c:175 +msgid "unable to restore registry" +msgstr "kan register niet herstellen" + +#: lib/util/alloc.c:68 lib/util/alloc.c:85 lib/util/alloc.c:106 +#: lib/util/alloc.c:128 lib/util/alloc.c:147 lib/util/alloc.c:170 +msgid "internal error, tried allocate zero bytes" +msgstr "interne fout, heb geprobeerd om zero bytes te alloceren" + +#: lib/util/alloc.c:87 lib/util/alloc.c:109 lib/util/alloc.c:149 +#: lib/util/alloc.c:172 src/net_ifs.c:174 src/net_ifs.c:191 src/net_ifs.c:325 +#, c-format +msgid "internal error, %s overflow" +msgstr "interne fout, %s overloop" + +#: lib/util/gidlist.c:78 src/load_plugins.c:61 src/load_plugins.c:74 +#: src/sudo.c:572 src/sudo.c:591 src/sudo.c:618 src/sudo.c:627 src/sudo.c:636 +#: src/sudo.c:653 src/sudo.c:700 src/sudo.c:710 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/strsignal.c:50 +msgid "Unknown signal" +msgstr "Onbekend signaal" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:65 lib/util/strtonum.c:183 +msgid "invalid value" +msgstr "ongeldige waarde" + +#: lib/util/strtoid.c:90 lib/util/strtoid.c:118 lib/util/strtomode.c:61 +#: lib/util/strtonum.c:68 lib/util/strtonum.c:195 +msgid "value too large" +msgstr "waarde te groot" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:61 lib/util/strtonum.c:68 +#: lib/util/strtonum.c:189 +msgid "value too small" +msgstr "waarde te klein" + +#: lib/util/sudo_conf.c:181 +#, c-format +msgid "invalid Path value `%s' in %s, line %u" +msgstr "ongeldige lokatie '%s' in %s, regel %u" + +#: lib/util/sudo_conf.c:335 lib/util/sudo_conf.c:388 +#, c-format +msgid "invalid value for %s `%s' in %s, line %u" +msgstr "ongeldige waarde voor %s '%s' in %s, regel %u" + +#: lib/util/sudo_conf.c:356 +#, c-format +msgid "unsupported group source `%s' in %s, line %u" +msgstr "niet-ondersteunde brongroup '%s' in %s, regel %u" + +#: lib/util/sudo_conf.c:372 +#, c-format +msgid "invalid max groups `%s' in %s, line %u" +msgstr "ongeldig maximaal aantal groepen '%s' in %s, regel %u" + +#: lib/util/sudo_conf.c:522 +#, c-format +msgid "unable to stat %s" +msgstr "kan status niet opvragen van %s" + +#: lib/util/sudo_conf.c:525 +#, c-format +msgid "%s is not a regular file" +msgstr "%s geen regulier bestand" + +#: lib/util/sudo_conf.c:528 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s is eigendom van %u, moet gebruikersnummer %u zijn" + +#: lib/util/sudo_conf.c:532 +#, c-format +msgid "%s is world writable" +msgstr "%s kan door iedereen worden geschreven" + +#: lib/util/sudo_conf.c:535 +#, c-format +msgid "%s is group writable" +msgstr "%s kan door groep worden geschreven" + +#: lib/util/sudo_conf.c:545 src/selinux.c:196 src/selinux.c:209 src/sudo.c:341 +#, c-format +msgid "unable to open %s" +msgstr "kan %s niet openen" + +#: src/exec.c:123 src/exec.c:128 src/exec.c:423 src/exec.c:425 src/exec.c:427 +#: src/exec.c:429 src/exec.c:431 src/exec.c:433 src/exec.c:436 src/exec.c:453 +#: src/exec.c:455 src/exec.c:457 src/exec.c:605 src/exec.c:800 +#: src/exec_pty.c:480 src/exec_pty.c:736 src/exec_pty.c:806 src/exec_pty.c:808 +#: src/exec_pty.c:820 src/exec_pty.c:1308 src/exec_pty.c:1310 +#: src/exec_pty.c:1315 src/exec_pty.c:1317 src/exec_pty.c:1331 +#: src/exec_pty.c:1342 src/exec_pty.c:1344 src/exec_pty.c:1346 +#: src/exec_pty.c:1348 src/exec_pty.c:1350 src/exec_pty.c:1352 +#: src/exec_pty.c:1354 src/signal.c:156 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "instellen van handler voor signal %d is niet mogelijk" + +#: src/exec.c:135 src/exec_pty.c:845 +msgid "policy plugin failed session initialization" +msgstr "beleidsplugin kon sessie niet initialiseren" + +#: src/exec.c:140 src/exec_pty.c:861 src/exec_pty.c:1392 src/tgetpass.c:221 +msgid "unable to fork" +msgstr "kan geen nieuw proces starten" + +#: src/exec.c:318 src/exec.c:326 src/exec.c:877 src/exec_pty.c:604 +#: src/exec_pty.c:609 src/exec_pty.c:667 src/exec_pty.c:674 src/exec_pty.c:965 +#: src/exec_pty.c:975 src/exec_pty.c:1020 src/exec_pty.c:1027 +#: src/exec_pty.c:1457 src/exec_pty.c:1464 src/exec_pty.c:1471 +msgid "unable to add event to queue" +msgstr "kan event niet toevoegen aan de wachtrij" + +#: src/exec.c:406 +msgid "unable to create sockets" +msgstr "kan geen sockets maken" + +#: src/exec.c:502 +msgid "error in event loop" +msgstr "fout in eventloop" + +#: src/exec.c:520 +msgid "unable to restore tty label" +msgstr "kan terminallabel niet herstellen" + +#: src/exec.c:613 src/exec_pty.c:514 src/signal.c:95 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "kan handler voor signal %d niet herstellen" + +#: src/exec.c:731 src/exec_pty.c:1199 +msgid "error reading from signal pipe" +msgstr "fout met het lezen van signaalpijp" + +#: src/exec_common.c:73 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "kan PRIV_PROC_EXEC niet verwijderen van PRIV_LIMIT" + +#: src/exec_pty.c:200 +msgid "unable to allocate pty" +msgstr "kan geen virtuele terminal reserveren" + +#: src/exec_pty.c:780 src/exec_pty.c:789 src/exec_pty.c:797 +#: src/exec_pty.c:1300 src/exec_pty.c:1389 src/signal.c:137 src/tgetpass.c:218 +msgid "unable to create pipe" +msgstr "kan geen pijp maken" + +#: src/exec_pty.c:836 +msgid "unable to set terminal to raw mode" +msgstr "kan de terminal niet op de raw-modus instellen" + +#: src/exec_pty.c:1232 +msgid "error reading from pipe" +msgstr "fout met lezen van pijp" + +#: src/exec_pty.c:1257 +msgid "error reading from socketpair" +msgstr "fout met lezen van socketpaar" + +#: src/exec_pty.c:1266 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "onverwachte soort beantwoording van het achterkanaal: %d" + +#: src/exec_pty.c:1368 +msgid "unable to set controlling tty" +msgstr "kan geen controlerende terminal instellen" + +#: src/load_plugins.c:59 src/load_plugins.c:72 src/load_plugins.c:89 +#: src/load_plugins.c:142 src/load_plugins.c:148 src/load_plugins.c:154 +#: src/load_plugins.c:195 src/load_plugins.c:202 src/load_plugins.c:209 +#: src/load_plugins.c:215 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "fout in %s, regel %d bij het initialiseren-I/O plug-in %s" + +#: src/load_plugins.c:91 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:150 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "eigenaar van %s moet uid %d zijn" + +#: src/load_plugins.c:156 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s mag alleen schrijfbaar zijn voor de eigenaar" + +#: src/load_plugins.c:197 +#, c-format +msgid "unable to load %s: %s" +msgstr "kan %s niet laden: %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "unable to find symbol `%s' in %s" +msgstr "kan symbool %s niet vinden in %s" + +#: src/load_plugins.c:211 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "onbekende beleidssoort %d gevonden in %s" + +#: src/load_plugins.c:217 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "niet-compatibel hoofdbeleidsversie %d, (verwachtte %d) gevonden in %s voor plugins" + +#: src/load_plugins.c:226 +#, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "beleidsplugin '%s' in %s, regel %d wordt genegeerd" + +#: src/load_plugins.c:228 +msgid "only a single policy plugin may be specified" +msgstr "slechts een beleidsplug-in mag geladen worden" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "dubbele beleidsplugin '%s' in %s, regel %d wordt genegeerd" + +#: src/load_plugins.c:249 +#, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "dubbele I/O-plugin '%s' in %s, regel %d wordt genegeerd" + +#: src/load_plugins.c:338 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "beleidsplug-in %s heeft geen check_policy methode" + +#: src/net_ifs.c:236 +msgid "unable to open socket" +msgstr "kan geen socket openen" + +#: src/parse_args.c:241 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "het argument van -C moet een getal zijn dat groter dan of gelijk aan 3 is" + +#: src/parse_args.c:403 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "u mag de opties '-i' en '-s' niet tegelijk opgeven" + +#: src/parse_args.c:407 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "u mag de opties '-i' en '-E' niet tegelijk opgeven" + +#: src/parse_args.c:417 +msgid "the `-E' option is not valid in edit mode" +msgstr "optie '-E' is niet geldig in bewerkingsmodus" + +#: src/parse_args.c:419 +msgid "you may not specify environment variables in edit mode" +msgstr "u mag geen omgevingsvariabelen opgeven in de bewerkingsmodus" + +#: src/parse_args.c:427 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "optie '-U' mag alleen worden gebruikt samen met optie '-l'" + +#: src/parse_args.c:431 +msgid "the `-A' and `-S' options may not be used together" +msgstr "de opties '-A' en '-S' mogen niet tegelijk worden gebruikt" + +#: src/parse_args.c:497 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit wordt niet ondersteund op dit platform" + +#: src/parse_args.c:570 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Slechts een van de volgende opties mag worden gebruikt: -e, -h, -i, -K, -l, -s, -v of -V" + +#: src/parse_args.c:584 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - bewerk bestanden als een andere gebruiker\n" +"\n" + +#: src/parse_args.c:586 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - voer een opdracht uit als een andere gebruiker\n" +"\n" + +#: src/parse_args.c:591 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opties:\n" + +#: src/parse_args.c:593 +msgid "use a helper program for password prompting" +msgstr "gebruik een hulpprogramma voor het vragen van wachtwoord" + +#: src/parse_args.c:596 +msgid "use specified BSD authentication type" +msgstr "gebruik opgegeven BSD-verificatietype" + +#: src/parse_args.c:599 +msgid "run command in the background" +msgstr "voer opdracht op de achtergrond uit" + +#: src/parse_args.c:601 +msgid "close all file descriptors >= num" +msgstr "sluit alle file descriptors >= num" + +#: src/parse_args.c:604 +msgid "run command with the specified BSD login class" +msgstr "voer opdracht uit met gespecificeerde BSD-inlogklasse" + +#: src/parse_args.c:607 +msgid "preserve user environment when running command" +msgstr "behoud gebruikersomgeving bij uitvoeren van opdracht" + +#: src/parse_args.c:609 +msgid "edit files instead of running a command" +msgstr "bewerk bestanden in plaats van uitvoeren van een opdracht" + +#: src/parse_args.c:611 +msgid "run command as the specified group name or ID" +msgstr "voer opdracht uit als de opgegeven groep" + +#: src/parse_args.c:613 +msgid "set HOME variable to target user's home dir" +msgstr "stel HOME variabele in om naar persoonlijke map van gebruiker te verwijzen" + +#: src/parse_args.c:615 +msgid "display help message and exit" +msgstr "hulptekst tonen en stoppen" + +#: src/parse_args.c:617 +msgid "run command on host (if supported by plugin)" +msgstr "voer opdracht uit op computer (enkel als plugin dit ondersteund)" + +#: src/parse_args.c:619 +msgid "run login shell as the target user; a command may also be specified" +msgstr "voer een inlogshell uit als beoogd gebruiker; een opdracht mag ook worden opgegeven" + +#: src/parse_args.c:621 +msgid "remove timestamp file completely" +msgstr "verwijder tijdbestand volledig" + +#: src/parse_args.c:623 +msgid "invalidate timestamp file" +msgstr "maak tijdbestand ongeldig" + +#: src/parse_args.c:625 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "geef privileges van gebruiker weer of controleer specifieke opdracht; gebuik twee keer voor uitgebreidere opmaak" + +#: src/parse_args.c:627 +msgid "non-interactive mode, no prompts are used" +msgstr "niet-interactieve modus, geen interactie met gebruiker" + +#: src/parse_args.c:629 +msgid "preserve group vector instead of setting to target's" +msgstr "behoud groepsvector in plaats van die van het doel in te stellen" + +#: src/parse_args.c:631 +msgid "use the specified password prompt" +msgstr "gebruik gespecifeerde wachtwoordvraag" + +#: src/parse_args.c:634 +msgid "create SELinux security context with specified role" +msgstr "maak SELinux beveiligingscontext met gespecificeerde rol aan" + +#: src/parse_args.c:637 +msgid "read password from standard input" +msgstr "lees wachtwoord van standaardinvoer" + +#: src/parse_args.c:639 +msgid "run shell as the target user; a command may also be specified" +msgstr "voer shell uit als doelgebruiker; een opdracht mag ook worden opgegeven" + +#: src/parse_args.c:642 +msgid "create SELinux security context with specified type" +msgstr "maak SELinux beveiligingscontext met gespecificeerde type aan" + +#: src/parse_args.c:645 +msgid "in list mode, display privileges for user" +msgstr "in lijstmodus, geef privileges voor gebruiker weer" + +#: src/parse_args.c:647 +msgid "run command (or edit file) as specified user name or ID" +msgstr "voer opdracht uit (of bewerk bestand) als gespecificeerde gebruiker" + +#: src/parse_args.c:649 +msgid "display version information and exit" +msgstr "versie-informatie tonen en stoppen" + +#: src/parse_args.c:651 +msgid "update user's timestamp without running a command" +msgstr "werk tijd van gebruiker bij zonder opdracht uit te voeren" + +#: src/parse_args.c:653 +msgid "stop processing command line arguments" +msgstr "stop verwerken opdrachtregelargumenten" + +#: src/selinux.c:77 +msgid "unable to open audit system" +msgstr "kan audit-systeem niet openen" + +#: src/selinux.c:85 +msgid "unable to send audit message" +msgstr "kan audit-melding niet verzenden" + +#: src/selinux.c:113 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "fgetfilecon %s mislukt" + +#: src/selinux.c:118 +#, c-format +msgid "%s changed labels" +msgstr "%s gewijzigde labels" + +#: src/selinux.c:123 +#, c-format +msgid "unable to restore context for %s" +msgstr "kan context voor %s niet herstellen" + +#: src/selinux.c:163 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "kan %s niet openen, terminaltitel wordt niet opnieuw ingesteld" + +#: src/selinux.c:172 +msgid "unable to get current tty context, not relabeling tty" +msgstr "kan huidige terminalcontext niet verkrijgen, terminaltitel wordt niet opniew ingesteld" + +#: src/selinux.c:179 +msgid "unable to get new tty context, not relabeling tty" +msgstr "kan geen nieuwe terminalcontext verkrijgen, terminaltitel wordt niet opnieuw ingesteld" + +#: src/selinux.c:186 +msgid "unable to set new tty context" +msgstr "kan nieuwe terminalcontext niet instellen" + +#: src/selinux.c:252 +#, c-format +msgid "you must specify a role for type %s" +msgstr "u moet een rol kiezen voor type %s" + +#: src/selinux.c:258 +#, c-format +msgid "unable to get default type for role %s" +msgstr "kan standaard-type niet verkrijgen voor rol %s" + +#: src/selinux.c:276 +#, c-format +msgid "failed to set new role %s" +msgstr "instellen van nieuwe rol %s mislukt" + +#: src/selinux.c:280 +#, c-format +msgid "failed to set new type %s" +msgstr "instellen van nieuw type %s mislukt" + +#: src/selinux.c:289 +#, c-format +msgid "%s is not a valid context" +msgstr "%s is geen geldige context" + +#: src/selinux.c:324 +msgid "failed to get old_context" +msgstr "verkrijgen old_context mislukt" + +#: src/selinux.c:330 +msgid "unable to determine enforcing mode." +msgstr "kan afdwingende modus niet vinden." + +#: src/selinux.c:347 +#, c-format +msgid "unable to set tty context to %s" +msgstr "kan terminalcontext niet instellen voor %s" + +#: src/selinux.c:386 +#, c-format +msgid "unable to set exec context to %s" +msgstr "kan uitvoeringscontext niet instellen op %s" + +#: src/selinux.c:393 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "kan context voor aanmaak van sleutels niet instellen op %s" + +#: src/sesh.c:80 +msgid "requires at least one argument" +msgstr "tenminste één argument vereist" + +#: src/sesh.c:109 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "kan %s niet uitvoeren als een loginshell" + +#: src/sesh.c:114 src/sudo.c:1186 +#, c-format +msgid "unable to execute %s" +msgstr "kan %s niet uitvoeren" + +#: src/signal.c:77 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "kan handler niet opslaan naar signaal %d" + +#: src/solaris.c:88 +msgid "resource control limit has been reached" +msgstr "hulpbroncontrolelimiet is bereikt" + +#: src/solaris.c:91 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "gebruiker \"%s\" is geen lid van project \"%s\"" + +#: src/solaris.c:95 +msgid "the invoking task is final" +msgstr "de aanroepende taak is klaar" + +#: src/solaris.c:98 +#, c-format +msgid "could not join project \"%s\"" +msgstr "kan project \"%s\" niet samenvoegen" + +#: src/solaris.c:103 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "er bestaat geen hulpbronnengroep voor project \"%s\" die de standaardbindingen accepteert" + +#: src/solaris.c:107 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "er bestaat geen hulpbronnengroep voor project \"%s\" die de standaardbindingen accepteert" + +#: src/solaris.c:111 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "kan niet verbinden met standaard hulpbronnen voor project \"%s\"" + +#: src/solaris.c:117 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject mislukt voor project \"%s\"" + +#: src/solaris.c:119 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "waarschuwing, hulpbrontoewijzingscontrole mislukt voor project \"%s\"" + +#: src/sudo.c:209 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versie %s\n" + +#: src/sudo.c:211 +#, c-format +msgid "Configure options: %s\n" +msgstr "Configuratieopties: %s\n" + +#: src/sudo.c:216 +msgid "fatal error, unable to load plugins" +msgstr "fatale fout, kan geen plug-ins laden" + +#: src/sudo.c:224 +msgid "unable to initialize policy plugin" +msgstr "kan beleidsplug-in niet instellen" + +#: src/sudo.c:280 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "fout bij initialiseren-I/O plug-in %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "onverwachte sudo modus 0x%x" + +#: src/sudo.c:426 +msgid "unable to get group vector" +msgstr "kan groepsvector niet verkrijgen" + +#: src/sudo.c:478 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "onbekende uid %u: wie bent u?" + +#: src/sudo.c:785 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "eigenaar van %s moet gebruikersnummer %d zijn en de setuid bit ingesteld" + +#: src/sudo.c:788 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "gebruikt gebruikersnummer is niet %d, is %s op een bestandssysteem met de 'nosuid' optie ingesteld of een NFS bestandssysteem zonder rootrechten?" + +#: src/sudo.c:794 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "gebruikt gebruikersnummer is niet %d, is sudo geinstalleerd met setuid root?" + +#: src/sudo.c:923 +#, c-format +msgid "unknown login class %s" +msgstr "onbekende inlog-klasse %s" + +#: src/sudo.c:936 +msgid "unable to set user context" +msgstr "kan gebruikerscontext niet instellen" + +#: src/sudo.c:950 +msgid "unable to set supplementary group IDs" +msgstr "kan aanvullende groeps-ID's niet instellen" + +#: src/sudo.c:957 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "kan effectieve gid niet instellen op runas-gid %u" + +#: src/sudo.c:963 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "kan gid niet instellen op runas-gid %u" + +#: src/sudo.c:970 +msgid "unable to set process priority" +msgstr "kan taakprioriteit niet instellen" + +#: src/sudo.c:978 +#, c-format +msgid "unable to change root to %s" +msgstr "kan root niet wijzigen naar %s" + +#: src/sudo.c:991 src/sudo.c:997 src/sudo.c:1003 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "kan niet wijzigen naar runas uid (%u, %u)" + +#: src/sudo.c:1021 +#, c-format +msgid "unable to change directory to %s" +msgstr "kan map niet wijzigen naar %s" + +#: src/sudo.c:1082 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "onverwachte dochter-afsluitvoorwaarde: %d" + +#: src/sudo.c:1214 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "beleidsplug-in %s heeft geen check_policy methode" + +#: src/sudo.c:1232 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "beleidsplug-in %s ondersteunt niet het tonen van privileges" + +#: src/sudo.c:1249 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "beleidsplug-in %s ondersteunt niet de -v optie" + +#: src/sudo.c:1264 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "beleidsplug-in %s ondersteunt niet de -k/-K opties" + +#: src/sudo_edit.c:203 src/sudo_edit.c:294 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: geen regulier bestand" + +#: src/sudo_edit.c:230 src/sudo_edit.c:332 +#, c-format +msgid "%s: short write" +msgstr "%s: te weinig geschreven" + +#: src/sudo_edit.c:295 +#, c-format +msgid "%s left unmodified" +msgstr "%s ongewijzigd gelaten" + +#: src/sudo_edit.c:308 src/sudo_edit.c:483 +#, c-format +msgid "%s unchanged" +msgstr "%s ongewijzigd" + +#: src/sudo_edit.c:321 src/sudo_edit.c:343 +#, c-format +msgid "unable to write to %s" +msgstr "kan niet schrijven naar %s" + +#: src/sudo_edit.c:322 src/sudo_edit.c:341 src/sudo_edit.c:344 +#: src/sudo_edit.c:508 src/sudo_edit.c:512 +#, c-format +msgid "contents of edit session left in %s" +msgstr "inhoud van bewerkingssessie achtergelaten in %s" + +#: src/sudo_edit.c:340 +msgid "unable to read temporary file" +msgstr "kan tijdelijk bestand niet lezen" + +#: src/sudo_edit.c:417 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: interne fout: oneven aantal paden" + +#: src/sudo_edit.c:419 +msgid "sesh: unable to create temporary files" +msgstr "sesh: kan geen tijdelijke bestanden aanmaken " + +#: src/sudo_edit.c:421 src/sudo_edit.c:515 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: onbekende fout %d" + +#: src/sudo_edit.c:507 +msgid "unable to copy temporary files back to their original location" +msgstr "kan tijdelijke bestanden niet terugzetten naar de oorsprongelijke lokatie" + +#: src/sudo_edit.c:511 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "kan sommige tijdelijke bestanden niet terugzetten naar de oorsprongelijke lokatie" + +#: src/sudo_edit.c:554 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "kan uid niet wijzigen naar root (%u)" + +#: src/sudo_edit.c:571 +msgid "plugin error: missing file list for sudoedit" +msgstr "plug-infout: missende bestandslijst voor sudoedit" + +#: src/tgetpass.c:90 +msgid "no tty present and no askpass program specified" +msgstr "geen terminal aanwezig en geen wachtwoordvraag(askpass)-programma opgegeven" + +#: src/tgetpass.c:99 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "geen wachtwoordvraag(askpass)-programma opgegeven, probeer SUDO_ASKPASS in te stellen" + +#: src/tgetpass.c:232 +#, c-format +msgid "unable to set gid to %u" +msgstr "kan gid niet instellen op %u" + +#: src/tgetpass.c:236 +#, c-format +msgid "unable to set uid to %u" +msgstr "kan uid niet instellen op %u" + +#: src/tgetpass.c:241 +#, c-format +msgid "unable to run %s" +msgstr "kan %s niet uitvoeren" + +#: src/utmp.c:278 +msgid "unable to save stdin" +msgstr "kan niet opslaan naar stdin" + +#: src/utmp.c:280 +msgid "unable to dup2 stdin" +msgstr "kan dup2 niet uitvoeren op standaardinvoer" + +#: src/utmp.c:283 +msgid "unable to restore stdin" +msgstr "kan stdin niet herstellen" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "interne fout, probeerde emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "interne fout, probeerde ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "interne fout, probeerde erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "interne fout, probeerde erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "interne fout, probeerde erecalloc(0)" + +#~ msgid "value out of range" +#~ msgstr "waarde buiten bereik" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "select failed" +#~ msgstr "selecteren mislukt" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: overloop gevonden" + +#~ msgid "unable to allocate memory" +#~ msgstr "kan geen geheugen reserveren" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "list user's available commands\n" +#~ msgstr "geef voor gebruiker beschikbare opdrachten weer\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "voer een shell uit als doel-gebruiker\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "bij listing, toon privileges van gespecificeerde gebruiker\n" diff --git a/utsudo-0.0.2/po/nn.mo b/utsudo-0.0.2/po/nn.mo new file mode 100644 index 0000000000000000000000000000000000000000..40a0091e80410099756f4643a841d6f09f837f49 GIT binary patch literal 3017 zcmaKt%a0UA9LHM$AA=9X2MRulg^7UMvokB2WtJtxb{fkj}T@A@DkQ1iT4Of-+|XYbg6{Dd$BPv9jTDUS4z|0x$9#Y=Zk+;Dv6Cm_>{d{6dL ztmz>gMi1E!vjeD}`G$e?kRK7g%gA5jSL$I>!i^TSAvVWr*R5%GS*xL!dhdQq`66^q=shDrVAUGGCYzx zW{FB;EcmeMUf*0U210u*F-ak_B46FHrq2?Yi0$P0rT;%|+CAYDE^Q$7fGcwV&yQ&X)pzABaCHQH2Lca`Py;ffeY%Ixr6gt5t{ z>y5X=`iZc9oHb4~>nGl*H|q7uS?+weYPoib!_7_h0k?{sM}Xc>JHE^NeR$|(55m)3 z2&AhS8=t~99j81N;i};MCOc>BI>N&>J2%wEx*j_z8#6l8`m{pOgsmlrK`oW0rp@N= zCeyldIkTq8as!z!bfJ>W>d#RGd{?m2os{bczpGW27MB(_oz|$;EAt3D3NTz9Ca~L! zkNs4lxYV<(-Q^aEF?VtGOgOW-j;`zo8!qU!p{j1OnU?gGWtCd4!ZXJ9(JwSg9YZ%a zJxf)Of9H;9c5se0j?Th}_XL_x?!vRChw{8C*ff+0(2w9k*Ryiaq7H~`6Ea2?Sfmdx zre&|UCLl*iYb9dplfmt;s_yo8v>EFo#s{075?#dgQiZA?P-*1-a_cR~tE>t45SILW zv^rka1SNp|Lc`aj6KT`m_#zvi&yKEqK<8W=bx!Dyo>w%^j*yB;bc3vI!ZP&D0qR5{ z+o%|Eut&OzI7XG`b_T_suFw<$r-tN`T$*haj&^n|)Qh<1cH`F2Za%`Upfa=%F~#@p5O8c59p!`oNmr#;x)Sm=FoYSzl@`wx6PoT0WJ>d`$oQ=kmrH zA{M1NlV}cqZX;~j6y-@SX>qqjjn0~|*mqyAg%8JiZRw&IaWqL{h4WO@wnlSo9krbP4xTI5S2wmXqq7e%yS7gno8E3^L qkT5FZqp2gM1Wb=oCFP-Ye&ZI*3$m!=tA&Z|BY+0DRi-3bN$?+ri%}8) literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/nn.po b/utsudo-0.0.2/po/nn.po new file mode 100644 index 0000000..14a8045 --- /dev/null +++ b/utsudo-0.0.2/po/nn.po @@ -0,0 +1,934 @@ +# Norwegian Nynorsk translation of sudo. +# This file is distributed under the same license as the sudo package. +# +# Karl Ove Hufthammer , 2016. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.18b4\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2016-08-31 05:48-0600\n" +"PO-Revision-Date: 2016-09-04 19:09+0100\n" +"Last-Translator: Karl Ove Hufthammer \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 2.0\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "klarte ikkje opna brukardatabase" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "klarte ikkje byta til registeret «%s» for %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "klarte ikkje gjenoppretta register" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:207 lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 +#: lib/util/sudo_conf.c:569 src/conversation.c:75 src/exec.c:868 +#: src/exec_common.c:107 src/exec_common.c:123 src/exec_common.c:132 +#: src/exec_pty.c:692 src/exec_pty.c:700 src/exec_pty.c:1163 +#: src/load_plugins.c:52 src/load_plugins.c:65 src/load_plugins.c:215 +#: src/load_plugins.c:238 src/load_plugins.c:303 src/load_plugins.c:318 +#: src/parse_args.c:180 src/parse_args.c:202 src/parse_args.c:370 +#: src/parse_args.c:466 src/parse_args.c:485 src/preserve_fds.c:47 +#: src/preserve_fds.c:130 src/selinux.c:83 src/selinux.c:292 src/selinux.c:415 +#: src/selinux.c:424 src/sesh.c:115 src/sudo.c:399 src/sudo.c:418 +#: src/sudo.c:482 src/sudo.c:600 src/sudo.c:660 src/sudo.c:670 src/sudo.c:690 +#: src/sudo.c:709 src/sudo.c:718 src/sudo.c:727 src/sudo.c:744 src/sudo.c:785 +#: src/sudo.c:795 src/sudo.c:815 src/sudo.c:1236 src/sudo.c:1257 +#: src/sudo.c:1431 src/sudo.c:1525 src/sudo_edit.c:151 src/sudo_edit.c:773 +#: src/sudo_edit.c:870 src/sudo_edit.c:983 src/sudo_edit.c:1003 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:208 +#: lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 lib/util/sudo_conf.c:569 +#: src/conversation.c:76 src/exec.c:868 src/exec_common.c:107 +#: src/exec_common.c:124 src/exec_common.c:133 src/exec_pty.c:692 +#: src/exec_pty.c:700 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:83 src/selinux.c:292 src/selinux.c:415 src/selinux.c:424 +#: src/sesh.c:115 src/sudo.c:399 src/sudo.c:418 src/sudo.c:482 src/sudo.c:600 +#: src/sudo.c:815 src/sudo.c:1236 src/sudo.c:1257 src/sudo.c:1431 +#: src/sudo.c:1525 src/sudo_edit.c:151 src/sudo_edit.c:773 src/sudo_edit.c:870 +#: src/sudo_edit.c:983 src/sudo_edit.c:1003 +msgid "unable to allocate memory" +msgstr "klarte ikkje tildela minne" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Ukjent signal" + +#: lib/util/strtoid.c:76 lib/util/strtoid.c:104 lib/util/strtomode.c:48 +#: lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "ugyldig verdi" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:54 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "verdien er for stor" + +#: lib/util/strtoid.c:89 lib/util/strtomode.c:54 lib/util/strtonum.c:61 +#: lib/util/strtonum.c:182 +msgid "value too small" +msgstr "verdien er for liten" + +#: lib/util/sudo_conf.c:223 +#, fuzzy, c-format +msgid "invalid Path value `%s' in %s, line %u" +msgstr "«%s» er ein ugyldig Path-verdi i %s, linje %u" + +#: lib/util/sudo_conf.c:389 lib/util/sudo_conf.c:442 +#, fuzzy, c-format +msgid "invalid value for %s `%s' in %s, line %u" +msgstr "«%2$s» er ein ugyldig verdi for %1$s i %3$s, linje %4$u" + +#: lib/util/sudo_conf.c:410 +#, c-format +msgid "unsupported group source `%s' in %s, line %u" +msgstr "gruppekjelda «%s» (i %s, linje %u) er ikkje støtta" + +#: lib/util/sudo_conf.c:426 +#, fuzzy, c-format +msgid "invalid max groups `%s' in %s, line %u" +msgstr "«%s» er eit ugyldig maskimalt mengd grupper i %s, linje %u" + +#: lib/util/sudo_conf.c:585 +#, fuzzy, c-format +msgid "unable to stat %s" +msgstr "klarte ikkje laga statistikk av %s" + +#: lib/util/sudo_conf.c:588 +#, c-format +msgid "%s is not a regular file" +msgstr "%s er ikkje ei vanleg fil" + +#: lib/util/sudo_conf.c:591 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "«%s» er eigd av uid %u, som skulle vore %u" + +#: lib/util/sudo_conf.c:595 +#, c-format +msgid "%s is world writable" +msgstr "%s er skrivbar for alle" + +#: lib/util/sudo_conf.c:598 +#, c-format +msgid "%s is group writable" +msgstr "%s er skrivbar for eigargruppa" + +#: lib/util/sudo_conf.c:608 src/selinux.c:201 src/selinux.c:213 src/sudo.c:368 +#, c-format +msgid "unable to open %s" +msgstr "klarte ikkje opna %s" + +#: src/exec.c:115 src/exec.c:117 src/exec.c:122 src/exec.c:408 src/exec.c:410 +#: src/exec.c:412 src/exec.c:414 src/exec.c:416 src/exec.c:418 src/exec.c:421 +#: src/exec.c:437 src/exec.c:439 src/exec.c:600 src/exec.c:795 +#: src/exec_pty.c:464 src/exec_pty.c:730 src/exec_pty.c:800 src/exec_pty.c:802 +#: src/exec_pty.c:814 src/exec_pty.c:816 src/exec_pty.c:1346 +#: src/exec_pty.c:1348 src/exec_pty.c:1353 src/exec_pty.c:1355 +#: src/exec_pty.c:1369 src/exec_pty.c:1380 src/exec_pty.c:1382 +#: src/exec_pty.c:1384 src/exec_pty.c:1386 src/exec_pty.c:1388 +#: src/exec_pty.c:1390 src/exec_pty.c:1392 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "klarte ikkje velja handtering av signal %d" + +#: src/exec.c:127 src/exec_pty.c:846 src/exec_pty.c:1430 src/tgetpass.c:259 +#, fuzzy +msgid "unable to fork" +msgstr "klarte ikkje laga kopi av prosess" + +#: src/exec.c:303 src/exec.c:311 src/exec.c:873 src/exec_pty.c:585 +#: src/exec_pty.c:590 src/exec_pty.c:660 src/exec_pty.c:667 src/exec_pty.c:954 +#: src/exec_pty.c:964 src/exec_pty.c:1009 src/exec_pty.c:1016 +#: src/exec_pty.c:1041 src/exec_pty.c:1495 src/exec_pty.c:1502 +#: src/exec_pty.c:1509 +msgid "unable to add event to queue" +msgstr "klarte ikkje leggja hending i kø" + +#: src/exec.c:391 +msgid "unable to create sockets" +msgstr "klarte ikkje laga socket-ar" + +#: src/exec.c:446 +#, fuzzy +msgid "policy plugin failed session initialization" +msgstr "regeltillegg klarte ikkje starta økt" + +#: src/exec.c:491 +msgid "error in event loop" +msgstr "feil i hendingslykkje" + +#: src/exec.c:509 +msgid "unable to restore tty label" +msgstr "klarte ikkje gjenoppretta tty-etikett" + +#: src/exec.c:608 src/exec_pty.c:496 src/signal.c:87 +#, fuzzy, c-format +msgid "unable to restore handler for signal %d" +msgstr "klarte ikkje retta opp igjen handtering av signal %d" + +#: src/exec.c:726 src/exec_pty.c:1235 +msgid "error reading from signal pipe" +msgstr "feil ved lesing frå signalrøyr" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "klarte ikkje fjerna PRIV_PROC_EXEC frå PRIV_LIMIT" + +#: src/exec_pty.c:188 +msgid "unable to allocate pty" +msgstr "klarte ikkje tildela pty" + +#: src/exec_pty.c:774 src/exec_pty.c:783 src/exec_pty.c:791 +#: src/exec_pty.c:1338 src/exec_pty.c:1427 src/signal.c:129 src/tgetpass.c:255 +msgid "unable to create pipe" +msgstr "klarte ikkje laga datarøyr" + +#: src/exec_pty.c:1268 +msgid "error reading from pipe" +msgstr "feil ved lesing frå datarøyr" + +#: src/exec_pty.c:1295 +msgid "error reading from socketpair" +msgstr "feil ved lesing frå socketpar" + +#: src/exec_pty.c:1304 +#, fuzzy, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "uventa responstype i bak-kanalen: %d" + +#: src/exec_pty.c:1406 +msgid "unable to set controlling tty" +msgstr "klarte ikkje velja styrande tty" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "feil i %s, linje %d ved lasting av tillegget «%s»" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s må eigast av uid %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s kan ikkje vera skrivbar for andre enn eigar" + +#: src/load_plugins.c:172 +#, fuzzy, c-format +msgid "unable to load %s: %s" +msgstr "klarte ikkje lasta inn «%s». %s" + +#: src/load_plugins.c:180 +#, fuzzy, c-format +msgid "unable to find symbol `%s' in %s" +msgstr "fann ikkje symbolet «%s» i %s" + +#: src/load_plugins.c:187 +#, fuzzy, c-format +msgid "unknown policy type %d found in %s" +msgstr "regeltypen «%d», som vart funne i «%s», er ukjent" + +#: src/load_plugins.c:193 +#, fuzzy, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "ukompatibel versjon av programtillegg %d (forventa %d) vart funnen i «%s»" + +#: src/load_plugins.c:202 +#, fuzzy, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "regeltillegg «%s» i «%s» linje %d vert ignorert" + +#: src/load_plugins.c:204 +#, fuzzy +msgid "only a single policy plugin may be specified" +msgstr "du kan berre velja eitt regeltillegg" + +#: src/load_plugins.c:207 +#, fuzzy, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "duplikattillegget «%s» i «%s» linje %d vert ignorert" + +#: src/load_plugins.c:228 +#, fuzzy, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "duplikattillegget «%s» for inn- og utdata i «%s» line %d vert ignorert" + +#: src/load_plugins.c:331 +#, fuzzy, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "regeltillegget «%s» inneheld ikkje ein «check_policy»-metode" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:477 +#, fuzzy, c-format +msgid "internal error, %s overflow" +msgstr "intern feil: %s er full" + +#: src/parse_args.c:239 +#, fuzzy +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "«-C» må brukast med eit talargument med ein verdi på minst 3" + +#: src/parse_args.c:406 +#, fuzzy +msgid "you may not specify both the `-i' and `-s' options" +msgstr "du kan ikkje velja både «-i» og «-s»" + +#: src/parse_args.c:410 +#, fuzzy +msgid "you may not specify both the `-i' and `-E' options" +msgstr "du kan ikkje velja både «-i» og «-E»" + +#: src/parse_args.c:420 +#, fuzzy +msgid "the `-E' option is not valid in edit mode" +msgstr "valet «-E» er ugyldig i redigeringsmodus" + +#: src/parse_args.c:422 +#, fuzzy +msgid "you may not specify environment variables in edit mode" +msgstr "du kan ikkje velja miljøvariablar i redigeringsmodus" + +#: src/parse_args.c:430 +#, fuzzy +msgid "the `-U' option may only be used with the `-l' option" +msgstr "valet «-U» kan ikkje brukast utan «-l»" + +#: src/parse_args.c:434 +#, fuzzy +msgid "the `-A' and `-S' options may not be used together" +msgstr "vala «-A» og «-S» kan ikkje verta samstundes brukt" + +#: src/parse_args.c:504 +#, fuzzy +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit vert ikkje støtta på denne plattforma" + +#: src/parse_args.c:577 +#, fuzzy +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Du kan berre velja eitt av vala -e, -h, -i, -K, -l, -s, -v eller -V" + +#: src/parse_args.c:591 +#, fuzzy, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - rediger filer som om du var ein annan nytter\n" +"\n" + +#: src/parse_args.c:593 +#, fuzzy, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - køyr ein kommando som om du var ein annan nytter\n" +"\n" + +#: src/parse_args.c:598 +#, fuzzy, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Val:\n" + +#: src/parse_args.c:600 +#, fuzzy +msgid "use a helper program for password prompting" +msgstr "nytte eit hjelpeprogram for å oppgje passord" + +#: src/parse_args.c:603 +#, fuzzy +msgid "use specified BSD authentication type" +msgstr "nytte valt BSD-autentiseringsmetode" + +#: src/parse_args.c:606 +#, fuzzy +msgid "run command in the background" +msgstr "køyr kommando i bakgrunnen" + +#: src/parse_args.c:608 +#, fuzzy +msgid "close all file descriptors >= num" +msgstr "lukk alle fildeskriptorer >= num" + +#: src/parse_args.c:611 +#, fuzzy +msgid "run command with the specified BSD login class" +msgstr "køyr kommando med valt BSD-innloggingsklasse" + +#: src/parse_args.c:614 +#, fuzzy +msgid "preserve user environment when running command" +msgstr "hald på gjeldande brukarmiljø når kommandoen vert køyrt" + +#: src/parse_args.c:616 +#, fuzzy +msgid "edit files instead of running a command" +msgstr "rediger filer i staden for å køyra ein kommando" + +#: src/parse_args.c:618 +#, fuzzy +msgid "run command as the specified group name or ID" +msgstr "køyr kommando som om du var ein del av vald gruppe (-namn eller -ID)" + +#: src/parse_args.c:620 +#, fuzzy +msgid "set HOME variable to target user's home dir" +msgstr "nytte vald nytter sine hjemmemappe som HOME-miljøvariabel" + +#: src/parse_args.c:622 +#, fuzzy +msgid "display help message and exit" +msgstr "vis hjelpetekst og avslutt" + +#: src/parse_args.c:624 +#, fuzzy +msgid "run command on host (if supported by plugin)" +msgstr "køyr kommando på verten (viss programtillegget støttar det)" + +#: src/parse_args.c:626 +#, fuzzy +msgid "run login shell as the target user; a command may also be specified" +msgstr "køyr innloggingsskall som om du var den valde brukaren (du kan òg oppgje ein kommando her)" + +#: src/parse_args.c:628 +#, fuzzy +msgid "remove timestamp file completely" +msgstr "fjern tidsstempel-fil skikkeleg" + +#: src/parse_args.c:630 +#, fuzzy +msgid "invalidate timestamp file" +msgstr "gjer tidsstempel-fil ugyldig" + +#: src/parse_args.c:632 +#, fuzzy +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "privilegia til vise brukaren, eller sjekk om det fungerer å køyra ein bestemd kommando (nytte to gonger for å sjå eit lengre format)" + +#: src/parse_args.c:634 +#, fuzzy +msgid "non-interactive mode, no prompts are used" +msgstr "stillemodus (ingen ledetekst vert vist)" + +#: src/parse_args.c:636 +#, fuzzy +msgid "preserve group vector instead of setting to target's" +msgstr "hald på gruppevektor, i staden for å bruka han som gjeld for målet" + +#: src/parse_args.c:638 +#, fuzzy +msgid "use the specified password prompt" +msgstr "nytte valt passord-ledetekst" + +#: src/parse_args.c:641 +#, fuzzy +msgid "create SELinux security context with specified role" +msgstr "lag SELinux-tryggleikskontekst med vald rolle" + +#: src/parse_args.c:644 +#, fuzzy +msgid "read password from standard input" +msgstr "les passord frå standard inndata" + +#: src/parse_args.c:646 +#, fuzzy +msgid "run shell as the target user; a command may also be specified" +msgstr "køyr skal som vald brukar (du kan òg oppgje ein kommando her)" + +#: src/parse_args.c:649 +#, fuzzy +msgid "create SELinux security context with specified type" +msgstr "lag SELinux-tryggleikskontekst med vald type" + +#: src/parse_args.c:652 +#, fuzzy +msgid "in list mode, display privileges for user" +msgstr "vis brukarprivilegium (i listemodus)" + +#: src/parse_args.c:654 +#, fuzzy +msgid "run command (or edit file) as specified user name or ID" +msgstr "køyr kommando (eller rediger fil) som valt brukarnamn eller nytter-ID" + +#: src/parse_args.c:656 +#, fuzzy +msgid "display version information and exit" +msgstr "vis programversjon og avslutt" + +#: src/parse_args.c:658 +#, fuzzy +msgid "update user's timestamp without running a command" +msgstr "oppdater brukaren sin tidsstempel utan å køyra ein kommando" + +#: src/parse_args.c:660 +#, fuzzy +msgid "stop processing command line arguments" +msgstr "slutt å handsama kommandolinje-argument" + +#: src/selinux.c:77 +#, fuzzy +msgid "unable to open audit system" +msgstr "klarte ikkje opna revisjonssystemet" + +#: src/selinux.c:87 +#, fuzzy +msgid "unable to send audit message" +msgstr "klarte ikkje senda revisjonsmelding" + +#: src/selinux.c:115 +#, fuzzy, c-format +msgid "unable to fgetfilecon %s" +msgstr "klarte ikkje utføra fgetfilecon %s" + +#: src/selinux.c:120 +#, fuzzy, c-format +msgid "%s changed labels" +msgstr "%s endra etikettar" + +#: src/selinux.c:125 +#, fuzzy, c-format +msgid "unable to restore context for %s" +msgstr "klarte ikkje retta opp igjen kontekst for «%s»" + +#: src/selinux.c:165 +#, fuzzy, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "klarte ikkje opna «%s». tty får ikkje ny etikett" + +#: src/selinux.c:173 +#, fuzzy +msgid "unable to get current tty context, not relabeling tty" +msgstr "klarte ikkje henta gjeldande tty-kontekst. tty får ikkje ny etikett" + +#: src/selinux.c:180 +#, fuzzy +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "«chr_file» er ugyldig tryggleiksklasse. tty får ikkje ny etikett" + +#: src/selinux.c:185 +#, fuzzy +msgid "unable to get new tty context, not relabeling tty" +msgstr "klrate ikkje henta ny tty-kontekst. tty får ikkje ny etikett" + +#: src/selinux.c:192 +#, fuzzy +msgid "unable to set new tty context" +msgstr "klarte ikkje velja ny tty-kontekst" + +#: src/selinux.c:256 +#, fuzzy, c-format +msgid "you must specify a role for type %s" +msgstr "du må velja ei rolle for typen «%s»" + +#: src/selinux.c:262 +#, fuzzy, c-format +msgid "unable to get default type for role %s" +msgstr "klarte ikkje henta standardtype for rollen «%s»" + +#: src/selinux.c:280 +#, fuzzy, c-format +msgid "failed to set new role %s" +msgstr "klarte ikkje velja den nye rollen «%s»" + +#: src/selinux.c:284 +#, fuzzy, c-format +msgid "failed to set new type %s" +msgstr "klarte ikkje velja den nye typen «%s»" + +#: src/selinux.c:296 +#, fuzzy, c-format +msgid "%s is not a valid context" +msgstr "«%s» er ein ugyldig kontekst" + +#: src/selinux.c:331 +#, fuzzy +msgid "failed to get old_context" +msgstr "klarte ikkje henta «old_context»" + +#: src/selinux.c:337 +#, fuzzy +msgid "unable to determine enforcing mode." +msgstr "klarte ikkje finna håndhevelsesmodus." + +#: src/selinux.c:354 +#, fuzzy, c-format +msgid "unable to set tty context to %s" +msgstr "klarte ikkje velja «%s» som tty-kontekst" + +#: src/selinux.c:393 +#, fuzzy, c-format +msgid "unable to set exec context to %s" +msgstr "klarte ikkje velja «%s» som kjørekontekst" + +#: src/selinux.c:400 +#, fuzzy, c-format +msgid "unable to set key creation context to %s" +msgstr "klarte ikkje velja «%s» som nøkkelkontekst" + +#: src/sesh.c:77 +#, fuzzy +msgid "requires at least one argument" +msgstr "krev at du brukar minst eitt argument" + +#: src/sesh.c:106 +#, fuzzy, c-format +msgid "invalid file descriptor number: %s" +msgstr "ugyldig fildeskriptor-tal: %s" + +#: src/sesh.c:120 +#, fuzzy, c-format +msgid "unable to run %s as a login shell" +msgstr "klarte ikkje køyra %s som eit innloggingsskall" + +#: src/sesh.c:125 src/sudo.c:1295 +#, fuzzy, c-format +msgid "unable to execute %s" +msgstr "klarte ikkje køyra «%s»" + +#: src/signal.c:69 +#, fuzzy, c-format +msgid "unable to save handler for signal %d" +msgstr "klarte ikkje lagra handtering av signal %d" + +#: src/solaris.c:76 +#, fuzzy +msgid "resource control limit has been reached" +msgstr "kontrollgrensa for ressursar er nådd" + +#: src/solaris.c:79 +#, fuzzy, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "brukaren «%s» er ikkje medlem av prosjektet «%s»" + +#: src/solaris.c:83 +#, fuzzy +msgid "the invoking task is final" +msgstr "den kallande oppgåva er endeleg" + +#: src/solaris.c:86 +#, fuzzy, c-format +msgid "could not join project \"%s\"" +msgstr "klarte ikkje verta med i prosjektet «%s»" + +#: src/solaris.c:91 +#, fuzzy, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "det er ingen ressursgrunnlag som godtek standardtildelinger for prosjektet «%s»" + +#: src/solaris.c:95 +#, fuzzy, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "fann ikkje valt ressursgrunnlag for prosjetet «%s»" + +#: src/solaris.c:99 +#, fuzzy, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "klarte ikkje tildela standard ressursgrunnlag for prosjektet «%s»" + +#: src/solaris.c:105 +#, fuzzy, c-format +msgid "setproject failed for project \"%s\"" +msgstr "klarte ikkje utføra «setproject» på «%s»" + +#: src/solaris.c:107 +#, fuzzy, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "åtvaring: noko gjekk gale ved tildeling av ressurskontroll for prosjektet «%s»" + +#: src/sudo.c:215 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versjon %s\n" + +#: src/sudo.c:217 +#, fuzzy, c-format +msgid "Configure options: %s\n" +msgstr "Vel innstillingar: %s\n" + +#: src/sudo.c:225 +#, fuzzy +msgid "fatal error, unable to load plugins" +msgstr "kritisk feil: klarte ikkje lasta inn tilleggsprogram" + +#: src/sudo.c:233 +#, fuzzy +msgid "unable to initialize policy plugin" +msgstr "klarte ikkje starta opp regeltillegg" + +#: src/sudo.c:277 +#, fuzzy +msgid "plugin did not return a command to execute" +msgstr "tillegget sende ikkje ein kjørbar kommando" + +#: src/sudo.c:293 +#, fuzzy, c-format +msgid "error initializing I/O plugin %s" +msgstr "feil under klargjøring av inn-/utdatatillegget «%s»" + +#: src/sudo.c:319 +#, fuzzy, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "uforventet sudo-modus 0x%x" + +#: src/sudo.c:462 +#, fuzzy +msgid "unable to get group vector" +msgstr "klarte ikkje henta gruppevektor" + +#: src/sudo.c:523 +#, fuzzy, c-format +msgid "unknown uid %u: who are you?" +msgstr "UID %u er ukjend. Kven er du?" + +#: src/sudo.c:574 +msgid "unable to determine tty" +msgstr "" + +#: src/sudo.c:864 +#, fuzzy, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "«%s» må eigast av uid %d, og setuid-biten må veljast" + +#: src/sudo.c:867 +#, fuzzy, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "effektiv uid er ikkje %d. Er «%s» på eit filsystem der «nosuid» er valt, eller på eit NFS-filsystem utan rot-rettar?" + +#: src/sudo.c:873 +#, fuzzy, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "effektiv uid er ikkje %d. Er sudo installert med «setuid root»?" + +#: src/sudo.c:954 +#, fuzzy +msgid "unable to set supplementary group IDs" +msgstr "klarte ikkje velja ekstra grruppe-id-er" + +#: src/sudo.c:961 +#, fuzzy, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "klarte ikkje velja «runa si gjev %u» som effektiv gjev" + +#: src/sudo.c:967 +#, fuzzy, c-format +msgid "unable to set gid to runas gid %u" +msgstr "klarte ikkje velja «runa si gjev %u» som gjev" + +#: src/sudo.c:1038 +#, fuzzy, c-format +msgid "unknown login class %s" +msgstr "innloggingsklassen «%s» er ukjend" + +#: src/sudo.c:1051 +#, fuzzy +msgid "unable to set user context" +msgstr "klarte ikkje velja brukarkontekst" + +#: src/sudo.c:1067 +#, fuzzy +msgid "unable to set process priority" +msgstr "klarte ikkje velja prosessprioritet" + +#: src/sudo.c:1075 +#, fuzzy, c-format +msgid "unable to change root to %s" +msgstr "klarte ikkje endra rot til «%s»" + +#: src/sudo.c:1088 src/sudo.c:1094 src/sudo.c:1101 +#, fuzzy, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "klarte ikkje endra til runa sine uid (%u, %u)" + +#: src/sudo.c:1119 +#, fuzzy, c-format +msgid "unable to change directory to %s" +msgstr "klarte ikkje endra mappe til «%s»" + +#: src/sudo.c:1177 +#, fuzzy, c-format +msgid "unexpected child termination condition: %d" +msgstr "uforventet årsak for avslutning av underprosess: %d" + +#: src/sudo.c:1323 +#, fuzzy, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "regeltillegget «%s» manglar «check_policy»-metoden" + +#: src/sudo.c:1341 +#, fuzzy, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "regeltillegget «%s» støttar ikkje listeløyve" + +#: src/sudo.c:1358 +#, fuzzy, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "regeltillegget «%s» støttar ikkje valet «-v»" + +#: src/sudo.c:1373 +#, fuzzy, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "regeltillegget «%s» støttar ikkje vala «-k» og «-K»" + +#: src/sudo_edit.c:181 src/sudo_edit.c:270 +#, fuzzy +msgid "unable to restore current working directory" +msgstr "klarte ikkje retta opp igjen gjeldande arbeidsmappe" + +#: src/sudo_edit.c:576 src/sudo_edit.c:687 +#, fuzzy, c-format +msgid "%s: not a regular file" +msgstr "«%s» er ikkje ei vanleg fil" + +#: src/sudo_edit.c:583 +#, fuzzy, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: redigering av symbolske lenkjer vert ikkje tillate" + +#: src/sudo_edit.c:586 +#, fuzzy, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: redigering av filer i ei mappe med skrivetilgang vert ikkje tillate" + +#: src/sudo_edit.c:619 src/sudo_edit.c:726 +#, fuzzy, c-format +msgid "%s: short write" +msgstr "«%s» har kort skriving" + +#: src/sudo_edit.c:688 +#, fuzzy, c-format +msgid "%s left unmodified" +msgstr "«%s» vart uendra" + +#: src/sudo_edit.c:701 src/sudo_edit.c:887 +#, fuzzy, c-format +msgid "%s unchanged" +msgstr "«%s» er uendra" + +#: src/sudo_edit.c:715 src/sudo_edit.c:737 +#, fuzzy, c-format +msgid "unable to write to %s" +msgstr "klarte ikkje skriva til «%s»" + +#: src/sudo_edit.c:716 src/sudo_edit.c:735 src/sudo_edit.c:738 +#: src/sudo_edit.c:912 src/sudo_edit.c:916 +#, fuzzy, c-format +msgid "contents of edit session left in %s" +msgstr "innhald frå redigeringsøkt ligg igjen i «%s»" + +#: src/sudo_edit.c:734 +#, fuzzy +msgid "unable to read temporary file" +msgstr "klarte ikkje lesa mellombels fil" + +#: src/sudo_edit.c:817 +#, fuzzy +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: intern feil: for høgt mengd stiar" + +#: src/sudo_edit.c:819 +#, fuzzy +msgid "sesh: unable to create temporary files" +msgstr "sesh: klarte ikkje laga mellombelse filer" + +#: src/sudo_edit.c:821 src/sudo_edit.c:919 +#, fuzzy, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: ukjend feil (%d)" + +#: src/sudo_edit.c:911 +#, fuzzy +msgid "unable to copy temporary files back to their original location" +msgstr "klarte ikkje kopiera mellombelse filer tilbake til opphavleg plassering" + +#: src/sudo_edit.c:915 +#, fuzzy +msgid "unable to copy some of the temporary files back to their original location" +msgstr "klarte ikkje kopiera enkelte mellombelse filer tilbake til opphavleg plassering" + +#: src/sudo_edit.c:959 +#, fuzzy, c-format +msgid "unable to change uid to root (%u)" +msgstr "klarte ikkje endra uid til root (%u)" + +#: src/sudo_edit.c:976 +#, fuzzy +msgid "plugin error: missing file list for sudoedit" +msgstr "feil med tillegg: sudoedit manglar filliste" + +#: src/sudo_edit.c:1017 src/sudo_edit.c:1030 +#, fuzzy +msgid "unable to read the clock" +msgstr "klarte ikkje lesa klokka" + +#: src/tgetpass.c:107 +#, fuzzy +msgid "no tty present and no askpass program specified" +msgstr "ingen tty er tilgjengeleg, og inkje program for passord-etterspurnad er vald" + +#: src/tgetpass.c:116 +#, fuzzy +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "inkje program for passord-etterspurnad er vald. Prøv å velja «SUDO_ASKPASS»" + +#: src/tgetpass.c:270 +#, fuzzy, c-format +msgid "unable to set gid to %u" +msgstr "klarte ikkje velja %u som gjev" + +#: src/tgetpass.c:274 +#, fuzzy, c-format +msgid "unable to set uid to %u" +msgstr "klarte ikkje velja %u som uid" + +#: src/tgetpass.c:279 +#, fuzzy, c-format +msgid "unable to run %s" +msgstr "klarte ikkje køyra «%s»" + +#: src/utmp.c:268 +#, fuzzy +msgid "unable to save stdin" +msgstr "klarte ikkje lagra standard innkanal" + +#: src/utmp.c:270 +#, fuzzy +msgid "unable to dup2 stdin" +msgstr "klarte ikkje utføra «dup2 stdin»" + +#: src/utmp.c:273 +#, fuzzy +msgid "unable to restore stdin" +msgstr "klarte ikkje retta opp igjen standard innkanal" diff --git a/utsudo-0.0.2/po/pl.mo b/utsudo-0.0.2/po/pl.mo new file mode 100644 index 0000000000000000000000000000000000000000..37acaef51f2035f2ad108ee5a08b2e8ff1f3ed1d GIT binary patch literal 20185 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/pl.po b/utsudo-0.0.2/po/pl.po new file mode 100644 index 0000000..43c6f48 --- /dev/null +++ b/utsudo-0.0.2/po/pl.po @@ -0,0 +1,930 @@ +# Polish translation for sudo. +# This file is put in the public domain. +# Jakub Bogusz , 2011-2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-25 20:30+0200\n" +"Last-Translator: Jakub Bogusz \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "nie udało się otworzyć userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "nie udało się przełączyć na rejestr \"%s\" dla %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "nie udało się odtworzyć rejestru" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "nie udało się przydzielić pamięci" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Nieznany sygnał" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "błędna wartość" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "wartość zbyt duża" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "wartość zbyt mała" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "błędna wartość Path \"%s\" w %s, w linii %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "błędna wartość opcji %s \"%s\" w %s, w linii %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nieobsługiwane źródło grup \"%s\" w %s, w linii %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "błędna maksymalna liczba grup \"%s\" w %s, w linii %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "nie udało się wykonać stat na %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie jest zwykłym plikiem" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "właścicielem %s jest uid %u, powinien być %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s jest zapisywalny dla świata" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s jest zapisywalny dla grupy" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "nie udało się otworzyć %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "nieznana klasa logowania %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "nie udało się ustawić kontekstu użytkownika" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "nie udało się ustawić priorytetu procesu" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "nie udało się zmienić katalogu głównego na %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "nie udało się zmienić uid-ów, aby działać jako (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "nie udało się zmienić katalogu na %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "nie udało się ustawić procedury obsługi dla sygnału %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "nie udało się usunąć PRIV_PROC_EXEC z PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "błąd odczytu z pary gniazd" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "nieoczekiwany typ odpowiedzi z kanału zwrotnego: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "nie udało się dodać zdarzenia do kolejki" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "nie udało się ustawić sterującego tty" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "nie udało się utworzyć potoku" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "nie udało się odebrać komunikatu od rodzica" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "nie udało się wykonać fork" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "nie udało się przywrócić etykiety tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "nie udało się wykonać %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "nie udało się zainicjować sesji przez wtyczkę polityki" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "błąd w pętli zdarzeń" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "nie udało się przywrócić procedury obsługi dla sygnału %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "nie udało się przydzielić pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "nie udało się utworzyć gniazd" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "nie udało się wysłać komunikatu do procesu monitorującego" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "błąd w %s, w linii %d podczas wczytywania wtyczki \"%s\"" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "właścicielem %s musi być uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "prawo zapisu do %s może mieć tylko właściciel" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie udało się załadować %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "nie udało się odnaleźć symbolu \"%s\" w %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "nieznany typ polityki %d napotkany w %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "niezgodna główna wersja polityki %d (zamiast oczekiwanej %d) napotkana w %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "zignorowano wtyczkę polityki \"%s\" w %s, w linii %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "może być podana tylko jedna wtyczka polityki" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "zignotowano powtórzoną wtyczkę polityki \"%s\" w %s, w linii %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "zignotowano powtórzoną wtyczkę we/wy \"%s\" w %s, w linii %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "wtyczka polityki %s nie zawiera metody check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "błąd wewnętrzny, przepełnienie %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "błędna nazwa zmiennej środowiskowej: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argument opcji -C musi być większy lub równy 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "nie można podać jednocześnie opcji `-i' oraz `-s'" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "nie można podać jednocześnie opcji `-i' oraz `-E'" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "opcja `-E' nie jest poprawna w trybie edycji" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "w trybie edycji nie można przekazywać zmiennych środowiskowych" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "opcji `-U' można używać tylko wraz z opcją `-l'" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "opcji `-A' oraz `-S' nie można używać jednocześnie" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit nie jest obsługiwane na tej platformie" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Można podać tylko jedną z opcji -e, -h, -i, -K, -l, -s, -v lub -V" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - modyfikowanie plików jako inny użytkownik\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - wykonywanie poleceń jako inny użytkownik\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opcje:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "użycie programu pomocniczego do pytań o hasło" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "użycie podanego rodzaju uwierzytelnienia BSD" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "uruchomienie polecenia w tle" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "dzwonek przy zapytaniu" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "zamknięcie wszystkich deskryptorów >= fd" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "uruchomienie polecenia z podaną klasą logowania BSD" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "zachowanie środowiska użytkownika przy uruchamianiu polecenia" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "zachowanie określonych zmiennych środowiskowych" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "modyfikowanie plików zamiast uruchomienia polecenia" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "wywołanie polecenia jako określona grupa lub ID" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "ustawienie zmiennej HOME na katalog domowy użytkownika docelowego" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "wyświetlenie opisu i zakończenie" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "uruchomienie polecenia na hoście (jeśli obsługiwane przez wtyczkę)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "uruchomienie powłoki logowania jako użytkownik docelowy; można także podać polecenie" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "całkowite usunięcie pliku znacznika czasu" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "unieważnienie pliku znacznika czasu" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "wypisanie uprawnień użytkownika lub sprawdzenie określonego polecenia; dwukrotne użycie to dłuższy format" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "tryb nieinteraktywny, bez pytań" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "zachowanie wektora grup zamiast ustawiania docelowych" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "użycie podanego pytania o hasło" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "utworzenie kontekstu bezpieczeństwa SELinuksa z podaną rolą" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "odczyt hasła ze standardowego wejścia" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "uruchomienie powłoki jako użytkownik docelowy; można także podać polecenie" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "utworzenie kontekstu bezpieczeństwa SELinuksa z podanym typem" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "zakończenie polecenia po zadanym limicie czasu" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "w trybie listy - wyświetlenie uprawnień użytkownika" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "uruchomienie polecenia (lub modyfikowanie pliku) jako podany użytkownik lub ID" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "wyświetlenie informacji o wersji i zakończenie" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "uaktualnienie znacznika czasu użytkownika bez uruchamiania polecenia" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "zakończenie przetwarzania argumentów linii poleceń" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "nie udało się otworzyć systemu audytu" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "nie udało się wysłać komunikatu audytowego" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "nie udało się wykonać fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "zmienionych etykiet: %s" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "nie udało się przywrócić kontekstu %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "nie udało się otworzyć %s, bez zmiany etykiety tty" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s nie jest urządzeniem znakowym, bez ponownego etykietowania tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nie udało się uzyskać bieżącego kontekstu tty, bez zmiany etykiety tty" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "nieznana klasa bezpieczeństwa \"chr_file\", bez ponownego etykietowania tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "nie udało się uzyskać nowego kontekstu tty, bez zmiany etykiety tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "nie udało się ustawić nowego kontekstu tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "trzeba podać rolę dla typu %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "nie udało się uzyskać domyślnego typu dla roli %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "nie udało się uzyskać nowego kontekstu" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "nie udało się ustawić nowej roli %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "nie udało się ustawić nowego typu %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nie jest poprawnym kontekstem" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "nie udało się uzyskać starego kontekstu" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "nie udało się określić trybu wymuszenia." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "nie udało się ustawić kontekstu tty na %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "nie udało się ustawić kontekstu wykonywania na %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "nie udało się ustawić kontekstu tworzenia klucza na %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "wymagany jest przynajmniej jeden argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "błędny numer deskryptora pliku: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "nie udało się uruchomić %s jako powłoki logowania" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "nie udało się zapisać procedury obsługi dla sygnału %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "osiągnięto limit kontroli zasobów" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "użytkownik \"%s\" nie jest członkiem projektu \"%s\"" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "zadanie uruchamiające jest ostatnim" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nie udało się dołączyć do projektu \"%s\"" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nie istnieje pula zasobów akceptująca domyślne przypisania dla projektu \"%s\"" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "podana pula zasobów nie istnieje w projekcie \"%s\"" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "nie można przypisać do domyślnej puli zasobów w projekcie \"%s\"" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject dla projektu \"%s\" nie powiodło się" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "uwaga: przypisanie kontroli zasobów dla projektu \"%s\" nie powiodło się" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo wersja %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opcje konfiguracji: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "błąd krytyczny, nie udało się załadować wtyczek" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "nie udało się zainicjować wtyczki polityki" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "wtyczka nie zwróciła polecenia do wykonania" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "błąd inicjalizacji wtyczki we/wy %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "nieoczekiwany tryb sudo 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "nie istniejesz w bazie danych %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "nie udało się określić tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s musi mieć uid %d jako właściciela oraz ustawiony bit setuid" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "efektywny uid nie wynosi %d, czy %s jest na systemie plików z opcją 'nosuid' albo systemie plików NFS bez uprawnień roota?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "efektywny uid nie wynosi %d, czy sudo jest zainstalowane z setuid root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "nie udało się ustawić ID dodatkowych grup" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "nie udało się ustawić efektywnego gid-a w celu działania jako gid %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "nie udało się ustawić gid-a w celu działania jako gid %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "nieoczekiwane zakończenie procesu potomnego: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "wtyczka polityki %s nie zawiera metody `check_policy'" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "wtyczka polityki %s nie obsługuje wypisywania uprawnień" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "wtyczka polityki %s nie obsługuje opcji -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "wtyczka polityki %s nie obsługuje opcji -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "nie znaleziono katalogu tymczasowego z prawem zapisu" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "nie udało się odtworzyć bieżącego kartalogu roboczego" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nie jest zwykłym plikiem" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: edycja dowiązań symbolicznych nie jest dozwolona" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: edycja plików w katalogu zapisywalnym nie jest dozwolona" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: skrócony zapis" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "pozostawiono bez zmian: %s" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "nie zmieniono: %s" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "nie udało się zapisać do %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "zawartość sesji edycji pozostawiono w %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "nie udało się odczytać pliku tymczasowego" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: błąd wewnętrzny: nieparzysta liczba ścieżek" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: nie udało się utworzyć plików tymczasowych" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: nieznany błąd %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "nie udało się skopiować plików tymczasowych z powrotem w ich oryginalne miejsce" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "nie udało się skopiować części plików tymczasowych z powrotem w ich oryginalne miejsce" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "nie udało się zmienić uid-a na roota (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "błąd wtyczki: brak listy plików dla sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "nie udało się odczytać zegara" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "przekroczony limit czasu przy czytaniu hasła" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "nie podano hasła" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "nie udało się odczytać hasła" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "do odczytu hasła wymagany jest terminal; należy użyć opcji -S, aby czytać ze standardowego wejścia, lub skonfigurować program pytający o hasło" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nie podano programu pytającego o hasło, proszę spróbować ustawić SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "nie udało się ustawić gid-a na %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "nie udało się ustawić uid-a na %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "nie udało się uruchomić %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "nie udało się zapisać standardowego wejścia" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "nie udało się wykonać dup2 na standardowym wejściu" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "nie udało się przywrócić standardowego wejścia" diff --git a/utsudo-0.0.2/po/pt.mo b/utsudo-0.0.2/po/pt.mo new file mode 100644 index 0000000000000000000000000000000000000000..5f00e275afbfa4f85086d06c3d12cdb62b36041d GIT binary patch literal 19645 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 K&xX&e>Hh#=-}&7D literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/pt.po b/utsudo-0.0.2/po/pt.po new file mode 100644 index 0000000..228c3da --- /dev/null +++ b/utsudo-0.0.2/po/pt.po @@ -0,0 +1,942 @@ +# Portuguese (Portugal) translations for the sudo package +# This file is distributed under the same license as the sudo package. +# Todd C. Miller , 2011-2016 +# Pedro Albuquerque , 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-25 06:34+0100\n" +"Last-Translator: Pedro Albuquerque \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.7\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "impossível abrir userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "impossível mudar para o registo \"%s\" para %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "impossível restaurar o registo" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "impossível alocar memória" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Sinal desconhecido" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "valor inválido" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "valor muito grande" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "valor muito pequeno" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "valor de caminho inválido \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "valor inválido %s \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "fonte de grupo não suportada \"%s\" em %s, linna %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "máximo de grupos inválido \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "impossível obter informações de %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um ficheiro normal" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s é propriedade de uid %u, deveria ser %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s é escrito universalmente" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s é escrito pelo grupo" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "impossível abrir %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "classe de sessão %s desconhecida" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "impossível definir contexto de utilizador" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "impossível processar prioridade" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "impossível alterar root para %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "impossível alterar para runas uid (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "impossível alterar pasta para %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "impossível definir gestor para sinal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "impossível remover PRIV_PROC_EXEC de PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "erro ao ler de socketpair" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipo de resposta inesperada no canal secundário: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "impossível adicionar evento à fila" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "impossível definir tty de controlo" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "impossível criar túnel" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "impossível receber mensagem de pai" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "impossível bifurcar" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "impossível restaurar rótulo tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "impossível executar %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "a extensão de política falhou a inicialização de sessão" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "erro em ciclo de evento" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "impossível restaurar gestor para o sinal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "impossível alocar pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "impossível criar sockets" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "impossível enviar mensagem para monitorizar processo" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "erro em %s, linha %d ao carregar a extensão \"%s\"" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s tem de ser propriedade de uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s só pode ter permissão de escrita para o dono" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "impossível carregar %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "impossível encontrar símbolo \"%s\" em %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "tipo de política %d desconhecida encontrada em %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "versão principal de extensão %d incompatível (esperada %d) encontrada em %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "a ignorar extensão de política \"%s\" em %s, linha %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "só pode especificar um tipo de extensão de política" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "a ignorar extensão de política duplicada \"%s\" em %s, linha %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "a ignorar extensão E/S duplicada \"%s\" em %s, linha %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "extensão de política %s não inclui um método check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, transporte %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nome de variável de ambiente inválido: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "o argumento para -C tem de ser um número maior ou igual a 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "não pode especificar ambas as opções \"-i\" e \"-s\"" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "não pode especificar ambas as opções \"-i\" e \"-E\"" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "a opção \"-E\" não é válida em modo de edição" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "não pode especificar variáveis de ambiente em modo de edição" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "a opção \"-U\" só pode ser usada com a opção \"-l\"" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "não pode especificar ambas as opções \"-A\" e \"-S\"" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit não é suportado nesta plataforma" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Só uma das opções -e, -h, -i, -K, -l, -s, -v ou -V pode ser especificada" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita ficheiros como outro utilizador\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - executa um comando como outro utilizador\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opções:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "usa um programa de ajuda para pedir a senha" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "usa um tipo de autenticação BSD especificado" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "executa o comando em 2º plano" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "tocar campainha ao pedir" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "fecha todos os descritores de ficheiros >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "executa o comando com a classe de sessão BSD especificada" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "preserva o ambiente de utilizador ao executar o comando" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "preserva variáveis de ambiente específicas" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "edita ficheiros em vez de executar um comando" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "executa o comando como nome de grupo ou ID especificados" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "define a variável HOME para a pasta home do utilizador alvo" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "mostra a ajuda e sai" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "executa o comando no anfitrião (se suportado pela extensão)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "executa a shell de sessão como utilizador alvo; também pode especificar um comando" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "remove completamente o ficheiro de datação" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "invalida o ficheiro de datação" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "lista privilégios do utilizador ou verifica um comando específico; use duas vezes para formato mais longo" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "modo não-interactivo, não usa prompts" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "preserva vector de grupo em vez de o definir para o do alvo" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "usa o pedido de senha especificado" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "cria contexto de segurnaça SELinux com o papel especificado" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "lê a senha da entrada padrão" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "executa a shell como utilizador alvo; também pode especificar um comando" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "cria contexto de segurnaça SELinux com o tipo especificado" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "termina o comando após o tempo limite especificado" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "em modo Lista, mostra os privilégios do utilizador" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "executa o comando (ou edita o ficheiro) como nome ou ID de utilizador especificados" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "mostra informação da versão e sai" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "actualiza datação do utilizador sem executar um comando" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "pára o processamento de argumentos da linha de comandos" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "impossível abrir o sistema de auditoria" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "impossível enviar mensagem de auditoria" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "impossível fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s rótulos alterados" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "impossível restaurar contexto para %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "impossível abrir %s, sem re-rotular tty" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s não é um dispositivo carácter, sem re-rotular tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "impossível obter contexto tty actual, sem re-rotular tty" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe de segurança \"chr_file\" desconhecida, sem re-rotular tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "impossível obter novo contexto tty, sem re-rotular tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "impossível definir novo contexto tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "tem de especificar um papel para o tipo %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "impossível obter o tipo predefinido para o papel %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "falha ao obter novo contexto" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "falha ao definir novo papel %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "falha ao definir novo tipo %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s não é um contexto válido" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "falha ao obter contexto antigo" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "impossível determinar modo de imposição." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "impossível definir contexto tty para %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "impossível definir contexto exec para %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "impossível definir contexto de criação de chave para %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "requer pelo menos um argumento" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "número de descritor de ficheiro inválido: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "impossível executar %s como shell de sessão" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "impossível gravar gestor para o sinal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "atingido o limite de controlo de recursos" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "o utilizador \"%s\" não é membro do projecto \"%s\"" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "a tarefa chamadora é final" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "impossível participar no projecto \"%s\"" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "não existe nenhum conjunto de recursos que aceite associações predefinidas para o projeto \"%s\"" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "o conjunto de recursos especificado não existe para o projecto \"%s\"" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "impossível associar ao conjunto de recursos predefinido do projecto \"%s\"" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "falha setproject para o projecto \"%s\"" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "aviso: falha na atribuição de controlo de recursos para o projecto \"%s\"" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versão %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opções de configuração: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "erro fatal, impossível carregar extensões" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "impossível inicializar a extensão de política" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "a extensão não devolveu um comando a executar" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "erro ao inicializar a extensão E/S %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "modo sudo 0x%x inesperado" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "utilizador não existente na base de dados %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "impossível determinar tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s tem ser propriedade de uid %d e ter o bit setuid definido" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "a uid efectiva não é %d, é %s num sistema de ficheiros com a opção 'nosuid' definida ou um sistema de ficheiros NFS sem privilégios root?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "a uid efectiva não é %d, tem sudo instalado com setuid root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "impossível definir IDs de grupo suplementares" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "impossível definir gid efectiva para gid runas %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "impossível definir gid para gid runas %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condição de terminação de filho inesperada: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "a extensão de política %s tem o método \"check_policy\" em falta" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "a extensão de política %s não suporta privilégios de listagem" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "a extensão de política %s não suporta a opção -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "a extensão de política %s não suporta as opções -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "sem pasta temporária onde possa escrever" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "impossível restaurar pasta de trabalho actual" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s não é um ficheiro normal" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: não é permitido editar ligações simbólicas" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: não é permitido editar ficheiros numa pasta onde se pode escrever" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: escrita curta" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s deixado sem alterações" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s não alterado" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "impossível escrever em %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "conteúdo da sessão de edição deixados em %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "impossível ler ficheiro temporário" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: erro interno: número de caminhos ímpar" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: impossível criar ficheiros temporários" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: erro %d desconhecido" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "impossível copiar ficheiros temporários de volta à localização original" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "impossível copiar alguns ficheiros temporários de volta à localização original" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "impossível alterar uid para root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "erro de extensão: lista de ficheiros para sudoedit em falta" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "impossível ler o relógio" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tempo expirado ao ler senha" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "não foi fornecida uma senha" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "impossível ler senha" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "é necessário um terminal para ler a senha; use a opção -S para ler da entrada padrão ou configure um ajudante de pedido de senha (askpass)" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "sem programa askpass especificado, tente definir SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "impossível definir gid para %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "impossível definir uid para %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "impossível executar %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "impossível gravar stdin" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "impossível dup2 stdin" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "impossível restaurar stdin" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "sem tty presente e sem programa askpass especificado" + +#~ msgid "unable to get group vector" +#~ msgstr "impossível obter vector de grupo" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "uid %u desconhecida: quem é?" diff --git a/utsudo-0.0.2/po/pt_BR.mo b/utsudo-0.0.2/po/pt_BR.mo new file mode 100644 index 0000000000000000000000000000000000000000..d31fe7875944d4190b6152ef593062a0b74f349e GIT binary patch literal 20291 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 Z7vs)tEFv~p@Vsa3{}01-^UweQ literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/pt_BR.po b/utsudo-0.0.2/po/pt_BR.po new file mode 100644 index 0000000..c6e2926 --- /dev/null +++ b/utsudo-0.0.2/po/pt_BR.po @@ -0,0 +1,997 @@ +# Brazilian Portuguese translation for sudo. +# Traduções em português brasileiro para o pacote sudo. +# Copyright (C) 2019 Free Software Foundation, Inc. +# This file is distributed under the same license as the sudo package. +# Rafael Fontenelle , 2013-2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 07:28-0200\n" +"Last-Translator: Rafael Fontenelle \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Virtaal 1.0.0-beta1\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "não foi possível abrir o userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "não foi possível alterar para registro \"%s\" para %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "não foi possível restaurar registro" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "não foi possível alocar memória" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Sinal desconhecido" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "valor inválido" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "valor grande demais" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "valor pequeno demais" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "Path inválido com valor \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "Valor inválido para %s \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "fonte de grupo sem suporte \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "máximo de grupos inválido \"%s\" em %s, linha %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "não foi possível obter o estado de %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s não é um arquivo comum" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s tem como dono o uid %u, deveria ser %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s é gravável globalmente" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s é gravável pelo grupo" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "não foi possível abrir %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "classe de login desconhecida %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "não foi possível definir contexto de usuário" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "não foi possível definir prioridade do processo" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "não foi possível alterar a raiz para %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "não foi possível alterar para uid de \"runas\" (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "não foi possível alterar diretório para %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "não foi possível definir manipulador para sinal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "não foi possível remover PRIV_PROC_EXEC de PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "erro ao ler do par de soquetes" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "tipo de resposta inesperada no canal de retorno: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "não foi possível adicionar um evento à fila" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "não foi possível definir tty de controle" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "não foi possível criar um encadeamento (pipe)" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "não foi possível receber mensagem de pai" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "não foi possível fazer fork" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "não foi possível restaurar rótulo de tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "não foi possível executar %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "plug-in de política falhou ao inicializar da sessão" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "erro em loop de evento" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "não foi possível restaurar manipulador para sinal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "não foi possível alocar pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "não foi possível criar soquetes" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "não foi possível enviar mensagem para monitorar processo" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "erro em %s, linha %d ao carregar plug-in \"%s\"" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s deve ter como dono o uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s deve ser gravável apenas pelo dono" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "não foi possível carregar %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "não foi possível localizar símbolo \"%s\" em %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "tipo de política %d desconhecida localizada em %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "versão maior %d do plug-in incompatível (esperava %d) localizada em %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignorando plug-in de política \"%s\" em %s, linha %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "apenas um plug-in de política pode ser especificado" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignorando plug-in de política duplicada \"%s\" em %s, linha %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignorando plug-in de E/S \"%s\" duplicado em %s, linha %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "plug-in de política %s não inclui um método de check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "erro interno, estouro de pilha de %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "nome de variável de ambiente inválida: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "o argumento do -C deve ser um número maior ou igual a 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "você não pode especificar as opções \"-i\" e \"-s\" ao mesmo tempo" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "você não pode especificar as opções \"-i\" e \"-E\" ao mesmo tempo" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "a opção \"-E\" não é válida no modo de edição" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "você não pode especificar variáveis de ambiente no modo de edição" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "a opção \"-U\" pode ser usada apenas com a opção \"-l\"" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "as opções \"-A\" e \"-S\" não podem ser usadas ao mesmo tempo" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "não há suporte a sudoedit nesta plataforma" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Apenas uma das opções -e, -h, -i, -K, -l, -s, -v ou -V pode ser especificada" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - edita arquivos como outro usuário\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - executa um comando como outro usuário\n" +"\n" + +# Deixei minúsculo para seguir o padrão das demais linhas do "sudo -h" +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"opções:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "usa um programa auxiliar para pedir senha" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "usa o tipo de autenticação BSD especificado" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "executa um comando em plano de fundo" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "toca campainha ao solicitar senha" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "fecha todos os descritores, de arquivos, >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "executa um comando com uma classe de login especificada" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "preserva um ambiente de usuário ao executar um comando" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "preserva variáveis de ambiente específicas" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "edita arquivos em vez de executar um comando" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "executa um comando como o ID ou nome de grupo especificado" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "define a variável HOME para a pasta pessoal do usuário alvo" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "exibe uma mensagem de ajuda e sai" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "executa o comando na máquina (se houver suporte pelo plug-in)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "executa um shell de login como usuário alvo; um comando também pode ser especificado" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "remove arquivo de marca de tempo completamente" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "invalida arquivo de marca de tempo" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "lista os privilégios do usuário ou verifica um comando específico; use duas vezes para um formato maior" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "modo não interativo, não pergunta para o usuário" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "preserva vetor de grupos ao invés de definir para o do alvo" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "usa a senha especificada" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "cria um contexto de segurança SELinux com o papel especificado" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "lê a senha da entrada padrão" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "executa o shell como o usuário alvo; um comando também pode ser especificado" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "cria um contexto de segurança SELinux com o tipo especificado" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "termina o comando após o tempo limite especificado" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "no modo lista, exibe os privilégios por usuário" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "executa um comando (ou edita um arquivo) como o nome ou ID do usuário especificado" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "exibe as informações de versão e sai" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "atualiza a marca de tempo do usuário sem executar um comando" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "interrompe processamento de argumentos de linha de comando" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "não foi possível abrir o sistema de auditoria" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "não foi possível enviar mensagem de auditoria" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "não foi possível fazer fgetfilecon de %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s mudou de rótulo" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "não foi possível restaurar contexto de %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "não foi possível abrir %s, não re-rotulando o tty" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s não é um dispositivo de caractere, não re-rotulando o tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "não foi possível obter contexto de tty atual, não re-rotulando o tty" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "classe de segurança \"chr_file\" desconhecida, não re-rotulando o tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "não foi possível obter novo contexto de tty, não re-rotulando o tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "não foi possível definir um novo contexto de tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "você deve especificar um papel para o tipo %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "não foi possível obter tipo padrão para o papel %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "falha ao obter novo contexto" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "falha ao definir novo papel %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "falha ao definir novo tipo %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s não é um contexto válido" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "falha ao obter contexto antigo" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "não foi possível determinar modo de aplicação." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "não foi possível definir contexto de tty de %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "não foi possível definir contexto de exec de %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "não foi possível definir contexto de criação de chave para %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "requer ao menos um argumento" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "número de descritor de arquivos inválido: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "não foi possível executar %s como shell de login" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "não foi possível salvar manipulador para sinal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "limite de controle de recurso foi atingido" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "usuário \"%s\" não é um membro do projeto \"%s\"" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "a tarefa de chamada é final" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "não foi possível participar do projeto \"%s\"" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nenhuma pool de recursos aceitando vinculações padrões existe para o projeto \"%s\"" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "pool de recursos especificados não existe para o projeto \"%s\"" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "não foi possível vincular ao pool de recursos padrão para o projeto \"%s\"" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject falhou para o projeto \"%s\"" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "aviso, atribuição de controle de recursos falhou para o projeto \"%s\"" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo versão %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Opções de configuração: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "erro fatal, não foi possível carregar os plug-ins" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "não foi possível inicializar plug-in de política" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "o plug-in não retornou um comando para ser executado" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "erro ao inicializar o plug-in de E/S %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "modo de sudo inesperado 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "você não existe no banco de dados %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "não foi possível determinar o tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s deve ter como dono o uid %d e tem definido o bit setuid" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "uid efetivo não é %d, é %s em um sistema de arquivos com a opção \"nosuid\" defina ou um sistema de arquivos NFS sem privilégios de root?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "uid efetivo não é %d, sudo está instalado em uma raiz com setuid?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "não foi possível definir IDs de grupo suplementares" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "não foi possível definir gid efetivo para executar como gid %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "não foi possível definir gid para executar como gid %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "condição inesperada de término de filho: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "plug-in de política %s é sem o método \"check_policy\"" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "plug-in de política %s não tem suporte a listagem de privilégios" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "plug-in de política %s não tem suporte à opção -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "plug-in de política %s não tem suporte às opções -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "nenhum diretório temporário gravável encontrado" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "não foi possível restaurar o diretório de trabalho atual" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: não é um arquivo comum" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: edição de links simbólicos não é permitida" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: edição de arquivos em um diretório gravável não é permitida" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: escrita curta" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s não foi modificado" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s sem alteração" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "não foi possível gravar em %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "conteúdo da sessão de edição deixado em %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "não foi possível ler arquivo temporário" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: erro interno: número ímpar de caminhos" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: não foi possível criar arquivos temporários" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: erro desconhecido: %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "não foi possível copiar arquivos temporários de volta para sua localização original" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "não foi possível copiar alguns dos arquivos temporários de volta para sua localização original" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "não foi possível alterar uid de root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "erro no plug-in: faltando lista de arquivo para sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "não foi possível ler o relógio" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tempo limite esgotado lendo senha" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "nenhuma senha foi fornecida" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "não foi possível ler a senha" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "um terminal é necessário para ler a senha; use a opção -S para ler a entrada padrão ou configure um auxiliar de askpass" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "nenhum programa de askpass especificado, tente definir SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "não foi possível definir gid para %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "não foi possível definir uid para %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "não foi possível executar %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "não foi possível salvar a entrada padrão" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "não foi possível realizar dup2 da entrada padrão" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "não foi possível restaurar a entrada padrão" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "nenhum tty presente e nenhum programa de askpass especificado" + +#~ msgid "unable to get group vector" +#~ msgstr "não foi possível obter vetor de grupos" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "uid desconhecido %u: quem é você?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "erro ao ler do sinal de encadeamento (pipe)" + +#~ msgid "error reading from pipe" +#~ msgstr "erro ao ler de encadeamento (pipe)" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "erro interno, tentou alocar zero bytes" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "não foi possível definir o terminal para modo raw" + +#~ msgid "unable to open socket" +#~ msgstr "não foi possível abrir soquete" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "erro interno, tentou fazer emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "erro interno, tentou fazer ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "erro interno, tentou fazer erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "erro interno, tentou fazer erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "erro interno, tentou fazer erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: estouro de pilha detectado" + +#~ msgid "value out of range" +#~ msgstr "valor fora de faixa" + +#~ msgid "select failed" +#~ msgstr "seleção falhou" + +#~ msgid "list user's available commands\n" +#~ msgstr "lista comandos disponíveis do usuário\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "executa um shell como usuário alvo\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "ao listar, lista os privilégios do usuário especificado\n" diff --git a/utsudo-0.0.2/po/ru.mo b/utsudo-0.0.2/po/ru.mo new file mode 100644 index 0000000000000000000000000000000000000000..9a9c226c55d678055065f14bbbd02e60b71e32ea GIT binary patch literal 24520 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/ru.po b/utsudo-0.0.2/po/ru.po new file mode 100644 index 0000000..b0784ca --- /dev/null +++ b/utsudo-0.0.2/po/ru.po @@ -0,0 +1,923 @@ +# Transation of sudo messages to Russian. +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# +# Pavel Maryanov , 2011. +# Yuri Kozlov , 2011, 2012, 2013, 2014, 2016. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.16b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2016-02-19 15:48-0700\n" +"PO-Revision-Date: 2016-02-28 11:05+0200\n" +"Last-Translator: Pavel Maryanov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.6\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: lib/util/aix.c:85 lib/util/aix.c:164 +msgid "unable to open userdb" +msgstr "не удаётся открыть userdb" + +#: lib/util/aix.c:219 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "не удаётся переключиться на реестр «%s» для %s" + +#: lib/util/aix.c:244 +msgid "unable to restore registry" +msgstr "не удаётся восстановить реестр" + +#: lib/util/aix.c:267 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:207 lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 +#: lib/util/sudo_conf.c:569 src/conversation.c:75 src/exec.c:863 +#: src/exec_common.c:107 src/exec_common.c:123 src/exec_common.c:132 +#: src/exec_pty.c:684 src/exec_pty.c:692 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:416 src/selinux.c:425 +#: src/sesh.c:115 src/sudo.c:201 src/sudo.c:398 src/sudo.c:417 src/sudo.c:481 +#: src/sudo.c:655 src/sudo.c:665 src/sudo.c:685 src/sudo.c:704 src/sudo.c:713 +#: src/sudo.c:722 src/sudo.c:739 src/sudo.c:780 src/sudo.c:790 src/sudo.c:810 +#: src/sudo.c:1215 src/sudo.c:1236 src/sudo.c:1398 src/sudo.c:1492 +#: src/sudo_edit.c:151 src/sudo_edit.c:716 src/sudo_edit.c:813 +#: src/sudo_edit.c:925 src/sudo_edit.c:945 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:267 lib/util/gidlist.c:64 lib/util/sudo_conf.c:208 +#: lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 lib/util/sudo_conf.c:569 +#: src/conversation.c:76 src/exec.c:863 src/exec_common.c:107 +#: src/exec_common.c:124 src/exec_common.c:133 src/exec_pty.c:684 +#: src/exec_pty.c:692 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:416 src/selinux.c:425 +#: src/sesh.c:115 src/sudo.c:201 src/sudo.c:398 src/sudo.c:417 src/sudo.c:481 +#: src/sudo.c:810 src/sudo.c:1215 src/sudo.c:1236 src/sudo.c:1398 +#: src/sudo.c:1492 src/sudo_edit.c:151 src/sudo_edit.c:716 src/sudo_edit.c:813 +#: src/sudo_edit.c:925 src/sudo_edit.c:945 +msgid "unable to allocate memory" +msgstr "не удаётся выделить память" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Неизвестный сигнал" + +#: lib/util/strtoid.c:76 lib/util/strtoid.c:104 lib/util/strtomode.c:48 +#: lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "недопустимое значение" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:54 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "значение слишком велико" + +#: lib/util/strtoid.c:89 lib/util/strtomode.c:54 lib/util/strtonum.c:61 +#: lib/util/strtonum.c:182 +msgid "value too small" +msgstr "значение слишком мало" + +#: lib/util/sudo_conf.c:223 +#, c-format +msgid "invalid Path value `%s' in %s, line %u" +msgstr "некорректное значение Path «%s» в %s, строка %u" + +#: lib/util/sudo_conf.c:389 lib/util/sudo_conf.c:442 +#, c-format +msgid "invalid value for %s `%s' in %s, line %u" +msgstr "некорректное значение для %s «%s» в %s, строка %u" + +#: lib/util/sudo_conf.c:410 +#, c-format +msgid "unsupported group source `%s' in %s, line %u" +msgstr "неподдерживаемый групповой источник «%s» в %s, строка %u" + +#: lib/util/sudo_conf.c:426 +#, c-format +msgid "invalid max groups `%s' in %s, line %u" +msgstr "некорректное максимальное значение для групп «%s» в %s, строка %u" + +#: lib/util/sudo_conf.c:585 +#, c-format +msgid "unable to stat %s" +msgstr "не удалось выполнить вызов stat %s" + +#: lib/util/sudo_conf.c:588 +#, c-format +msgid "%s is not a regular file" +msgstr "%s не является обычным файлом" + +#: lib/util/sudo_conf.c:591 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s принадлежит пользователю с uid %u, а должен принадлежать пользователю с uid %u" + +#: lib/util/sudo_conf.c:595 +#, c-format +msgid "%s is world writable" +msgstr "доступ на запись в %s разрешена всем" + +#: lib/util/sudo_conf.c:598 +#, c-format +msgid "%s is group writable" +msgstr "доступ на запись в %s разрешена группе" + +#: lib/util/sudo_conf.c:608 src/selinux.c:199 src/selinux.c:212 src/sudo.c:367 +#, c-format +msgid "unable to open %s" +msgstr "не удаётся открыть %s" + +#: src/exec.c:114 src/exec.c:116 src/exec.c:121 src/exec.c:409 src/exec.c:411 +#: src/exec.c:413 src/exec.c:415 src/exec.c:417 src/exec.c:419 src/exec.c:422 +#: src/exec.c:438 src/exec.c:440 src/exec.c:595 src/exec.c:790 +#: src/exec_pty.c:466 src/exec_pty.c:722 src/exec_pty.c:792 src/exec_pty.c:794 +#: src/exec_pty.c:806 src/exec_pty.c:808 src/exec_pty.c:1289 +#: src/exec_pty.c:1291 src/exec_pty.c:1296 src/exec_pty.c:1298 +#: src/exec_pty.c:1312 src/exec_pty.c:1323 src/exec_pty.c:1325 +#: src/exec_pty.c:1327 src/exec_pty.c:1329 src/exec_pty.c:1331 +#: src/exec_pty.c:1333 src/exec_pty.c:1335 src/signal.c:147 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "не удаётся установить обработчик сигнала %d" + +#: src/exec.c:126 src/exec_pty.c:838 src/exec_pty.c:1373 src/tgetpass.c:265 +msgid "unable to fork" +msgstr "не удаётся создать дочерний процесс" + +#: src/exec.c:304 src/exec.c:312 src/exec.c:868 src/exec_pty.c:604 +#: src/exec_pty.c:611 src/exec_pty.c:654 src/exec_pty.c:659 src/exec_pty.c:946 +#: src/exec_pty.c:956 src/exec_pty.c:1001 src/exec_pty.c:1008 +#: src/exec_pty.c:1438 src/exec_pty.c:1445 src/exec_pty.c:1452 +msgid "unable to add event to queue" +msgstr "не удаётся добавить событие в очередь" + +#: src/exec.c:392 +msgid "unable to create sockets" +msgstr "не удаётся создать сокеты" + +#: src/exec.c:447 +msgid "policy plugin failed session initialization" +msgstr "модулю политик не удалось инициализировать сеанс" + +#: src/exec.c:492 +msgid "error in event loop" +msgstr "ошибка в событийном цикле" + +#: src/exec.c:510 +msgid "unable to restore tty label" +msgstr "не удаётся создать восстановить метку tty" + +#: src/exec.c:603 src/exec_pty.c:498 src/signal.c:86 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "не удаётся восстановить обработчик сигнала %d" + +#: src/exec.c:721 src/exec_pty.c:1180 +msgid "error reading from signal pipe" +msgstr "ошибка чтения из сигнального канала" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "не удаётся удалить PRIV_PROC_EXEC из PRIV_LIMIT" + +#: src/exec_pty.c:188 +msgid "unable to allocate pty" +msgstr "не удаётся выделить pty" + +#: src/exec_pty.c:766 src/exec_pty.c:775 src/exec_pty.c:783 +#: src/exec_pty.c:1281 src/exec_pty.c:1370 src/signal.c:128 src/tgetpass.c:261 +msgid "unable to create pipe" +msgstr "не удаётся создать канал" + +#: src/exec_pty.c:1213 +msgid "error reading from pipe" +msgstr "ошибка чтения из канала" + +#: src/exec_pty.c:1238 +msgid "error reading from socketpair" +msgstr "ошибка чтения из пары сокетов" + +#: src/exec_pty.c:1247 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "неожиданный тип ответа в резервном канале: %d" + +#: src/exec_pty.c:1349 +msgid "unable to set controlling tty" +msgstr "не удаётся установить управляющий tty" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "ошибка в %s, строка %d, при загрузке модуля «%s»" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s должен принадлежать пользователю с uid %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s должен быть доступен на запись только владельцу" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "не удаётся загрузить %s: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol `%s' in %s" +msgstr "не удаётся найти символ «%s» в %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "найден неизвестный тип политики %d в %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "найдена несовместимая основная версия модуля %d (ожидалась %d) в %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "игнорируется модуль политики «%s» в %s, строка %d" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "может быть задан только один модуль политики" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "игнорируется повторный модуль политики «%s» в %s, строка %d" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "игнорируется повторный модуль ввода-вывода «%s» в %s, строка %d" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "модуль политики %s не содержит метод check_policy" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:476 +#, c-format +msgid "internal error, %s overflow" +msgstr "внутренняя ошибка, переполнение %s" + +#: src/parse_args.c:239 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "аргумент для -C должен быть числом, которое больше или равно 3" + +#: src/parse_args.c:406 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "параметры «-i» и «-s» являются взаимоисключающими" + +#: src/parse_args.c:410 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "параметры «-i» и «-E» являются взаимоисключающими" + +#: src/parse_args.c:420 +msgid "the `-E' option is not valid in edit mode" +msgstr "параметр «-E» не действует в режиме редактирования" + +#: src/parse_args.c:422 +msgid "you may not specify environment variables in edit mode" +msgstr "переменные окружения нельзя определять в режиме редактирования" + +#: src/parse_args.c:430 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "параметр «-U» можно использовать только с параметром «-l»" + +#: src/parse_args.c:434 +msgid "the `-A' and `-S' options may not be used together" +msgstr "параметры «-A» и «-S» являются взаимоисключающими" + +#: src/parse_args.c:504 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit не поддерживается на этой платформе" + +#: src/parse_args.c:577 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Можно указать только параметры -e, -h, -i, -K, -l, -s, -v или -V" + +#: src/parse_args.c:591 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s — редактирование файлов от имени другого пользователя\n" +"\n" + +#: src/parse_args.c:593 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s — выполнение команд от имени другого пользователя\n" +"\n" + +#: src/parse_args.c:598 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Параметры:\n" + +#: src/parse_args.c:600 +msgid "use a helper program for password prompting" +msgstr "использовать вспомогательную программу для ввода пароля" + +#: src/parse_args.c:603 +msgid "use specified BSD authentication type" +msgstr "использовать указанный тип проверки подлинности BSD" + +#: src/parse_args.c:606 +msgid "run command in the background" +msgstr "выполнить команду в фоновом режиме" + +#: src/parse_args.c:608 +msgid "close all file descriptors >= num" +msgstr "закрыть все дескрипторы файлов >= num" + +#: src/parse_args.c:611 +msgid "run command with the specified BSD login class" +msgstr "выполнить команду с указанным классом входа BSD в систему" + +#: src/parse_args.c:614 +msgid "preserve user environment when running command" +msgstr "сохранить пользовательское окружение при выполнении команды" + +#: src/parse_args.c:616 +msgid "edit files instead of running a command" +msgstr "редактировать файлы вместо выполнения команды" + +#: src/parse_args.c:618 +msgid "run command as the specified group name or ID" +msgstr "выполнить команду от имени или ID указанной группы" + +#: src/parse_args.c:620 +msgid "set HOME variable to target user's home dir" +msgstr "установить для переменной HOME домашний каталог указанного пользователя" + +#: src/parse_args.c:622 +msgid "display help message and exit" +msgstr "показать справку и выйти" + +#: src/parse_args.c:624 +msgid "run command on host (if supported by plugin)" +msgstr "выполнить команду на узле (если поддерживается модулем)" + +#: src/parse_args.c:626 +msgid "run login shell as the target user; a command may also be specified" +msgstr "запустить оболочку входа в систему от имени указанного пользователя; также можно задать команду" + +#: src/parse_args.c:628 +msgid "remove timestamp file completely" +msgstr "полностью удалить файл timestamp" + +#: src/parse_args.c:630 +msgid "invalidate timestamp file" +msgstr "объявить недействительным файл timestamp" + +#: src/parse_args.c:632 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "показать список прав пользователя или проверить заданную команду; в длинном формате используется дважды" + +#: src/parse_args.c:634 +msgid "non-interactive mode, no prompts are used" +msgstr "автономный режим без не вывода запросов пользователю" + +#: src/parse_args.c:636 +msgid "preserve group vector instead of setting to target's" +msgstr "сохранить вектор группы вместо установки целевой группы" + +#: src/parse_args.c:638 +msgid "use the specified password prompt" +msgstr "использовать указанный запрос пароля" + +#: src/parse_args.c:641 +msgid "create SELinux security context with specified role" +msgstr "создать контекст безопасности SELinux с указанной ролью" + +#: src/parse_args.c:644 +msgid "read password from standard input" +msgstr "читать пароль из стандартного ввода" + +#: src/parse_args.c:646 +msgid "run shell as the target user; a command may also be specified" +msgstr "запустить оболочку от имени указанного пользователя; также можно задать команду" + +#: src/parse_args.c:649 +msgid "create SELinux security context with specified type" +msgstr "создать контекст безопасности SELinux указанного типа" + +#: src/parse_args.c:652 +msgid "in list mode, display privileges for user" +msgstr "в режиме списка показывать права пользователя" + +#: src/parse_args.c:654 +msgid "run command (or edit file) as specified user name or ID" +msgstr "выполнить команду (или редактировать файл) от имени или ID указанного пользователя" + +#: src/parse_args.c:656 +msgid "display version information and exit" +msgstr "показать сведения о версии и выйти" + +#: src/parse_args.c:658 +msgid "update user's timestamp without running a command" +msgstr "обновить временную метку пользователя без выполнения команды" + +#: src/parse_args.c:660 +msgid "stop processing command line arguments" +msgstr "прекратить обработку аргументов командной строки" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "не удаётся открыть систему аудита" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "не удаётся отправить сообщение аудита" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "не удаётся выполнить fgetfilecon %s" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "изменено меток: %s" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "не удаётся восстановить контекст для %s" + +#: src/selinux.c:166 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "не удаётся открыть %s, tty без возможности переименования" + +#: src/selinux.c:175 +msgid "unable to get current tty context, not relabeling tty" +msgstr "не удаётся получить контекст текущего tty, tty без возможности переименования" + +#: src/selinux.c:182 +msgid "unable to get new tty context, not relabeling tty" +msgstr "не удаётся получить контекст tty, tty без возможности переименования" + +#: src/selinux.c:189 +msgid "unable to set new tty context" +msgstr "не удаётся установить новый контекст tty" + +#: src/selinux.c:255 +#, c-format +msgid "you must specify a role for type %s" +msgstr "необходимо указать роль для типа %s" + +#: src/selinux.c:261 +#, c-format +msgid "unable to get default type for role %s" +msgstr "не удаётся получить тип по умолчанию для роли %s" + +#: src/selinux.c:279 +#, c-format +msgid "failed to set new role %s" +msgstr "не удалось установить новую роль %s" + +#: src/selinux.c:283 +#, c-format +msgid "failed to set new type %s" +msgstr "не удалось установить новый тип %s" + +#: src/selinux.c:295 +#, c-format +msgid "%s is not a valid context" +msgstr "%s не является допустимым контекстом" + +#: src/selinux.c:330 +msgid "failed to get old_context" +msgstr "не удалось получить old_context" + +#: src/selinux.c:336 +msgid "unable to determine enforcing mode." +msgstr "не удаётся определить принудительный режим" + +#: src/selinux.c:353 +#, c-format +msgid "unable to set tty context to %s" +msgstr "не удаётся задать контекст tty для %s" + +#: src/selinux.c:392 +#, c-format +msgid "unable to set exec context to %s" +msgstr "не удаётся установить для контекста exec значение %s" + +#: src/selinux.c:399 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "не удаётся установить для контекста создания ключа значение %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "укажите не менее одного аргумента" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "неверный номер файлового дескриптора: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "не удаётся выполнить %s в качестве регистрационной оболочки" + +#: src/sesh.c:125 src/sudo.c:1274 +#, c-format +msgid "unable to execute %s" +msgstr "не удаётся выполнить %s" + +#: src/signal.c:68 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "не удаётся сохранить обработчик сигнала %d" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "достигнут лимит управления ресурсами" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "пользователь «%s» не является членом проекта «%s»" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "вызывающе задание — последнее" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "не удалось присоединиться к проекту «%s»" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "для проекта «%s» не существует пула ресурсов, принимающих привязки по умолчанию" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "у проекта «%s» нет указанного пула ресурсов" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "не удаётся подключиться к пулу ресурсов по умолчанию проекта «%s»" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject завершилась с ошибкой для проекта «%s»" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "предупреждение: назначение контроля за ресурсами завершилось с ошибкой для проекта «%s»" + +#: src/sudo.c:212 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo версия %s\n" + +#: src/sudo.c:214 +#, c-format +msgid "Configure options: %s\n" +msgstr "Параметры настройки: %s\n" + +#: src/sudo.c:222 +msgid "fatal error, unable to load plugins" +msgstr "фатальная ошибка, не удалось загрузить модули" + +#: src/sudo.c:230 +msgid "unable to initialize policy plugin" +msgstr "не удаётся инициализировать модуль политики" + +#: src/sudo.c:276 +msgid "plugin did not return a command to execute" +msgstr "модуль не вернул команду для выполнения" + +#: src/sudo.c:292 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "ошибка инициализации модуля ввода-вывода %s" + +#: src/sudo.c:318 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "неожиданный режим sudo: 0x%x" + +#: src/sudo.c:461 +msgid "unable to get group vector" +msgstr "не удаётся получить вектор группы" + +#: src/sudo.c:522 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "неизвестный uid %u: кто вы?" + +#: src/sudo.c:859 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s должен принадлежать пользователю с uid %d и иметь бит setuid" + +#: src/sudo.c:862 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "эффективный uid не равен %d, возможно, %s находится в файловой системе, смонтированной с битом «nosuid» или в файловой системе NFS без прав суперпользователя?" + +#: src/sudo.c:868 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "эффективный uid не равен %d, программа sudo установлена с битом setuid и принадлежит root?" + +#: src/sudo.c:999 +#, c-format +msgid "unknown login class %s" +msgstr "неизвестный класс входа %s" + +#: src/sudo.c:1012 +msgid "unable to set user context" +msgstr "не удаётся назначить контекст пользователя" + +#: src/sudo.c:1026 +msgid "unable to set supplementary group IDs" +msgstr "не удаётся назначить дополнительные идентификаторы групп" + +#: src/sudo.c:1033 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "не удаётся назначить эффективный gid на runas gid %u" + +#: src/sudo.c:1039 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "не удаётся назначить gid на runas gid %u" + +#: src/sudo.c:1046 +msgid "unable to set process priority" +msgstr "не удаётся назначить приоритет процесса" + +#: src/sudo.c:1054 +#, c-format +msgid "unable to change root to %s" +msgstr "не удаётся изменить root на %s" + +#: src/sudo.c:1067 src/sudo.c:1073 src/sudo.c:1080 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "не удаётся изменить на runas uid (%u, %u)" + +#: src/sudo.c:1098 +#, c-format +msgid "unable to change directory to %s" +msgstr "не удаётся сменить каталог на %s" + +#: src/sudo.c:1156 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "неожиданное условие завершения потомка: %d" + +#: src/sudo.c:1302 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "модуль политики %s не содержит метод «check_policy»" + +#: src/sudo.c:1320 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "модуль политики %s не поддерживает списка прав" + +#: src/sudo.c:1337 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "модуль политики %s не поддерживает параметр -v" + +#: src/sudo.c:1352 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "модуль политики %s не поддерживает параметры -k/-K" + +#: src/sudo_edit.c:181 +msgid "unable to restore current working directory" +msgstr "не удалось восстановить текущий рабочий каталог" + +#: src/sudo_edit.c:526 src/sudo_edit.c:630 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: не обычный файл" + +#: src/sudo_edit.c:533 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: изменение символических ссылок не допускается" + +#: src/sudo_edit.c:536 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: изменение файлов в каталоге, доступном на запись, не допускается" + +#: src/sudo_edit.c:567 src/sudo_edit.c:669 +#, c-format +msgid "%s: short write" +msgstr "%s: неполная запись" + +#: src/sudo_edit.c:631 +#, c-format +msgid "%s left unmodified" +msgstr "%s осталось неизменным" + +#: src/sudo_edit.c:644 src/sudo_edit.c:830 +#, c-format +msgid "%s unchanged" +msgstr "%s не изменено" + +#: src/sudo_edit.c:658 src/sudo_edit.c:680 +#, c-format +msgid "unable to write to %s" +msgstr "не удаётся записать в %s" + +#: src/sudo_edit.c:659 src/sudo_edit.c:678 src/sudo_edit.c:681 +#: src/sudo_edit.c:855 src/sudo_edit.c:859 +#, c-format +msgid "contents of edit session left in %s" +msgstr "содержимое сеанса редактирования сохранено в %s" + +#: src/sudo_edit.c:677 +msgid "unable to read temporary file" +msgstr "не удалось прочитать временный файл" + +#: src/sudo_edit.c:760 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: внутренняя ошибка: нечётное количество путей" + +#: src/sudo_edit.c:762 +msgid "sesh: unable to create temporary files" +msgstr "sesh: не удалось создать временные файлы" + +#: src/sudo_edit.c:764 src/sudo_edit.c:862 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: неизвестная ошибка %d" + +#: src/sudo_edit.c:854 +msgid "unable to copy temporary files back to their original location" +msgstr "не удалось скопировать временные файлы обратно в изначальное положение" + +#: src/sudo_edit.c:858 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "не удалось скопировать некоторые из временных файлов обратно в изначальное положение" + +#: src/sudo_edit.c:901 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "не удалось изменить uid на root (%u)" + +#: src/sudo_edit.c:918 +msgid "plugin error: missing file list for sudoedit" +msgstr "ошибка модуля: отсутствует список файлов для sudoedit" + +#: src/sudo_edit.c:959 src/sudo_edit.c:972 +msgid "unable to read the clock" +msgstr "не удалось прочитать время" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "нет tty и не указана программа askpass" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "не указана программа askpass, попробуйте задать значение в SUDO_ASKPASS" + +#: src/tgetpass.c:276 +#, c-format +msgid "unable to set gid to %u" +msgstr "не удаётся назначить gid равным %u" + +#: src/tgetpass.c:280 +#, c-format +msgid "unable to set uid to %u" +msgstr "не удаётся назначить uid равным %u" + +#: src/tgetpass.c:285 +#, c-format +msgid "unable to run %s" +msgstr "не удаётся выполнить %s" + +#: src/utmp.c:266 +msgid "unable to save stdin" +msgstr "не удаётся сохранить стандартный ввод" + +#: src/utmp.c:268 +msgid "unable to dup2 stdin" +msgstr "не удаётся выполнить dup2 для стандартного ввода" + +#: src/utmp.c:271 +msgid "unable to restore stdin" +msgstr "не удаётся восстановить стандартный ввод" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "внутренняя ошибка, попытка выделить 0 байт" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "не удаётся перевести терминал в «сырой» режим" + +#~ msgid "unable to open socket" +#~ msgstr "не удаётся открыть сокет" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "внутренняя ошибка, попытка выполнить emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "внутренняя ошибка, попытка выполнить ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "внутренняя ошибка, попытка выполнить erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "внутренняя ошибка, попытка выполнить erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "внутренняя ошибка, попытка выполнить ereсalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: обнаружено переполнение" + +#~ msgid "value out of range" +#~ msgstr "значение за пределами диапазона" + +#~ msgid "select failed" +#~ msgstr "ошибка select" + +#~ msgid "list user's available commands\n" +#~ msgstr "вывести список команд, доступных пользователю\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "запустить оболочку от имени указанного пользователя\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "при выводе списка показать привилегии пользователя\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "внутренняя ошибка, переполнение emalloc2()" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "внутренняя ошибка, переполнение erealloc3()" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: необходимо указать не менее одного модуля политики" + +#~ msgid "must be setuid root" +#~ msgstr "требуется setuid пользователя root" + +#~ msgid "the argument to -D must be between 1 and 9 inclusive" +#~ msgstr "аргумент для -D должен быть в диапазоне от 1 до 9 включительно" diff --git a/utsudo-0.0.2/po/sk.mo b/utsudo-0.0.2/po/sk.mo new file mode 100644 index 0000000000000000000000000000000000000000..a8d4cef883663ebe827513683ef966565049b577 GIT binary patch literal 15495 zcmbuFdyE}dea9z211t%T03p1Gz+wk{9Xk(`Zg8B$b`p~~HgRkR+9aO6cXsdi&Yii; z+b%q!F}963%(lM@=DL+$J@y-(RU9hIuh{B;BSG~gI{&{EcjOL zuVhlucLTTy{1EsE_&B%~{9n)qx3I_?!2RIcz!21aKk4xE4*wL?x_=992Y(3O0B(Mb z=e-Af5WEIF1>ORF4HSLf2j2}|4%4m%ZvfevcN7$#Ls0AeI(Pv5eNglK2;2f*{aT9$ z!1r18V<&1UA5b0>z(8UvKAq7pU)r>7zEhyq z{X=j&_*bCl|1qff-p)%zPth_H!2~dJ9nU z{2YkMcz^Ej8{qr7|7TEge=9@@4}v?uPk^$Qv)~mk^1N?@FX#UIOe%eQ9uyzn0}-&m z`!Fc_`rsb$H$lTEPT+3W~lTfzqE%D24cPFL)dH2zWcV0_wefiNBjb@$De^W$;mO zH~3DBPq+xO1@9}M=6eQ&<=*q4`20pD(fgZ0@%16_gW&IgcY@yqcY-$}4C!|c9tF>U zK6nYjz5%=%i!9btDyLJ37hu8cY$vK_kxJbn+HYzDeyM% zPr!Nbe?aNghf!ig?|l_SWxc-xwU7S>>EgYTO~4}WRDph{(<64+EQEg7ojB zpyqiR)I8q=?*P9Cs{amzi3xcRg5u|+?*2(o<5xlTdmdzncQp@v@F>Vuy^|oU_0E8r z{~tlRdjI9#Z-#jq{~=KHKL(2auetkggLL&?jWTHdJ3;BsqwfC8pvHX*)IKl&dE0L% zD7rIHbbJO>zrO&r-yb-9-JG5822lHZ2o!x!fRe)s_zv(n5K_F$P(JyCJ>VO`W8gjD z0EETfUpjmqRR3!czSdg=F9CHOqG@iXG#6d#OS+}&7iqsr`xH(4{Rr(*+N)`Ap^4TH z(QqS1Pl5XSIsSTaeP{nT;qIkVx=zzRO?#PcrmkDK7teJ`*Am)mbi?%!4bwC^lnO1s?Mi!ZufYQg(3_$#zqX;08zLYtw7cZjip=Gq` zOY)I!Y@+R=!D{alG+nX*@xQGbt^>4)CSB2m+L-H={N7KKZAxF3XdT+?XbUvy!j?b3^0*wM_uCBFvD+!c{7W8 z>_7K!+36=`*E2eh6uD?I3YdqvnaxNW=E2*h(F5)Gc*>JrmL7+R{?)Vj)m}3T12po` z-g}~?Jc)psB|5NF>6U*YD%yTcu%D%I_>+z)mU^Mrit=8}_S<3H^SjU(EV41wBs>`v z_1lUSQL>O`-9Y9w>NI9wQIZ#7(9))}GD#%z+NQj4VS(*MXrI*1+01Nfi~dCUG^J%{ zzQinDyG1GLrX^A%K~=5)Ls_#vHHa@-{pl_#t6gqEmA&g zujQX;^V*Nopd~_kak)r`W3&0Dx;qMwMGy3P-?ay-E{M*~hm6e7g)Hs*y$E)0@Z745 zeZ3H{V#_a5e^GmgTMt*hV)RD4OTrUIq|%c0ZzMSTrU+u+EV%{SH4cKQwIN4p?xC+~ zCi+`t55tpAjqOC6o#M(yBYLvgrE2>Z9CQ&~69j;J!{1?_mHv%{<)dQ8J9|-rJMN)v z@_bG_-QYN{D}6+Wo5PcsEsh3>Uc=ZD-L>Ww;e|7-wc?O;jDZVrdV;B~t3DWDM*LZZ zM(~roDC=&D9%EK63!e`&;~A@&%p~;yJEeBQs_Pk6&n$Tq5q4Ju-JVfp&oD>PX;VI? z!czEVJ8X6^5@+^JoPmi}H;Y|Qqd=Oa?J42t+WZJXP3%CcrNDz_+iqI zvNY+22{ES~Cbc_rEcaykelN)L6KU4+jRQc2Nh{zkN_u5Mk1pyqC0&WE7l%a{FVW#6 zC1Dc*u#GUlBow=XY_Zg`yw1}yL!@#M_;RS4dd~|^_xe*!i3}?&QtbU={tKRh_>h8@3>*l`Dv@= zEK-37htbYm&yiDf@szlN+63e&CLyf5+30S)_pH__{JRe9--~O=qROw1QHp7{Q+P_+ zqrO$-cCK2gUp+FxJTKCoo-~yMpsY@bkm#7eq1l;B6&pufM;1jJH6~OSGHcK1apSg4 zCJG;G9I9d?noclRN&(+w)WjOtOTz1h?5%oMi&#I1luQ_xb8tNm*F805m5G`;YiS>A z#8odds#0D>xW?`}jSVXCESjt)^9#~UDI^wvf2Q;GW;nhy?TA4|katAjLZobKBt8<%2s$~x@?{;uNfbm_Llryn&48- zDg83GrNKxb%Ghy)J+Nc53zDemseXpxhO;)y7~7qFny1Z9Sd4EwbQRA8FBZ@gnFS7K zl1Yf6<#PA2U^Yg)ESLl}le;WNS?U&}iCGv2^C7y9TqlI1QLS(xC}Tz`r;*_(lbu{$ z-K-z$8zD}ut6b^g*NhUE(@h1qu}Mw-g@01-TxSMpLZ;kerMhbt_9)ej&BGuiAo9aW7*BUpNHmp# zzwPAgNv5!YdMvN7+qREg@@VTLva+#apc*Nj%$9Q`b*V{wm(p?<(~d%|^)xQ^I<~Gp zLei@IO}z{kkZBf-Wi#Q<9(@qoC@xGYGkzjqONt_; zz*EZPjqdXde8G7o3Q2P^Q4;A8SNaqEV+0 zxp%Qcs4(3r&4xq9Gwmwd;$&z%A2BQGM69BW6F5Z)g^Q{dK4@9h*w<j_8s%vXYLDCFf{h(7;WSBaxrh*pU(O1qUhyw*IqkcE)JqN4z_C0))V>6!2^x^ z!hWPPo5mi>v^oE}ZQFM=wq4)2ZkxY-+uV&i-n(u4wrw-_khnMQ&w?Z;H%qAr_mpeP zWH)yQgQ(-bzlSuMX;JLhaqD82>VGS_-z^ME7E4ZA8uy1mcg{Z)r~QD=d8ZL=zbUy@ zMNPgHr&ONYns-Ls*-~fb0Ym(pZ};ODZfSWMlfO~|n0&*ZSi}!nElA0?&g|c}fA5G# z+qZ6;*{$=+gk2DW=P=-t#kC}wQF1dCXOQ7Zb{@X}j>b)+ep+%N%o=+s&~*SZ=ikIB zB9z@3ayDt%aL`nKhW+oGIT)8&5I621b>%!Up@QHx-+BGbDkk`I=jLSR&h6LuyZmkb zoWD7_W#@JNyWj06@85ZY9&YF1bvHA=owRX#kcUe1=lrdshlj!-YqnL;H@4}8H*+Li zJvYBp9RruWEa;cV2@=Dz^E#;vIw^WKT%pn}*Uk-}>LcaVbJdw}f2oru!{vT}jSrvd z1cM9qPomIgYI86=T+R}*LbHlTt?S+?ch_o6Tb&LwqEBs9B%xkJErh`NV`sRGB5|T* zeHG3I`&QvKzqIz`_y8O`(+?=pc%Os=EL;=mAqU9Ar|f`1(2H{POPe#x%m;1~wv~3L zdcPn&)%kKY{Rj=)*eC|@v#kY)ABa$`+a|6 zcknEbmLq|vVtXs?<13Qk8P=HdCuVVn(VgK6VJ~eVW2SV{njCfk@y_|341sl){K0S; zPJ34CBxZ9)JzQ=^Se4GF_Ya?5JEt>z*idGxr=e=uj}XW4u$2Vq?;!Gl-Ad2k$b}d({@oneEx7b_69*egJ=D<3#NsNbQy5;D&+wq5}gr`r-pMHknN>?!gJs+g= zSulWz9D`o&mvEw+HWS%48k!?7v0&8Ao^{)un~wp5C>rl*R7ul0cfuh{q>P#QiB(}@ zq+>is$IR{7}i->|&+Tnn;m#&`XTqy~}9*(%! z7n+`zeQb&(iW7q}9+S15gNzm58a2)Fxp){!N6KE3Hu}RA^OqUD!AvOEXb!g~#12w_ zkcDec1_QD7BDz!tkoLVnywncRRHUDGj0YJ%davGA?8R6TPVP|rlq6NkzHtw;0d%W0 zT@)(TaInh+O}I!^$UKO%o9gMAnt#|xy=lw5C41yK8w{kMCGJ$MLq0&~ZC_{H(38R>WvB{sy=f z!V=*;IEzL=Rmz-UFPKU_1MV; zq3S&Hp!mqr`P%2OVnAd^QwOq6(c?V)WwA*aw41b zkf13!QoYwAMU|&8OligKwPgs=VIlEK!j%L#(taKVrXPOXW8SbW((g8>Q zX&(j7(m|Un92YZ@yyA8`;p%V50GQ?M+A{vK5~YVELZhUG^00PDw3k<1TXx?qtUoti zr}PNtF;YrfCOjmOW8^xOL(kUE1ubnj$b0G9DJ3%qt`|@iV_KQV2Y<4HJPO)LS>V>} zXNNzVqTj~apr`V z;_Jus7zDTC!s4;9lcj9Mz}sot=Hr3CfKHuJ)Dp9(=X4YOIA zT!;4RvX^RrO&*!WWC8>d8x)N|Lh1`#sQoZPp4TFc=;s|12CKB&tS`=*r<1zrEpP}! zM&MIXnjDe;b+D1uI$D=E*3J)YSH2^6N9op--rMxw=~jj+I5lzWDQD@Fqwgqg|6{^k zQFc^>$4S$wZz-Ilm^xAGHg3bpNb>aOA^n+zMkb|A+MO@7D#G&N+9^BOj@WBP*sxzk zl2Hi6q9{Pe`yW>SahX^1+o~WR&+-~EoxR$s*m&r^u)rTvQMd#izw@Ql(`(C+VeJDt zCFtw1RO$=y@c8g-Gw_FJKr7+}7*rdEgFX#@xwD#l$I&eBUHCpwk zl&#VYv0hr0#{yH-&X@tA1PCowRpU7BQ{dYfGILQ7QB)|Q4c{}gkMOm~z7ldw#(a?~kL`QEcm zAm&Iz`(7`F`jxfO(jWg8w4vNkm*Y8e*?;M(jn<}GQ-s;PTdF`=NKK0GR?fjeQys{# z%3_JCqmFAj+&0+*DYR&IryFPaUQc$8m7i}7EQ1tUCI5;lKbys`-*HV--{?RURL(ms zi!xzF_RmOcT^d#L+-nwY8vGa{T@zo%4XwoLAVuYMLT*DJXC)P7u9CyctA z`?xhFD_hk;XJs8L&g7;yTz4cPC*n`PuCo)Sn)>cFun+7;YHI+vKPx@t8*6f{cW9!*u+8;yHt?GrQRA}m)5(l(TGZJ=KI{n z-pQm6ntdu%=!>03T!5Zxb{P|=uAS9$!?VPOjU&>Cs7VJ=IkF9fG#cc->?wKFe}`NI zRTC4x5KU8?*MagyZhk6to6<=Prbj9Wdzr4%^id4h*q%75<@`mOK|GbYg>}uYnw%_+ zn3`}J$MB4gC?=2YrA6B91m?To!~pBuRc-YtI79~tf5Hhc2R!Jsj$FxJ$Cn`aHm4Ex ztkir@q}HQz7a^(s(8^;eyhsd`NX4qB>eAW-mC8f2h>LjDvFipb*Y`&949q*+1xXX> z=%B@EX%&1%92`G`ld{^(&=e}>&{74u{qo4hd&3o-%Y~+<3;a=MS2&%u#dawsnX=FJ zsJ?iNR&`QdJx%n~f3&VU$gR#rLxJ<7>{(lO@DdV_VK g$CN;4L=`0~|1qW0Qm0iezc-&c#)zv^5N8zs50IlQzW@LL literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/sk.po b/utsudo-0.0.2/po/sk.po new file mode 100644 index 0000000..2c00dbb --- /dev/null +++ b/utsudo-0.0.2/po/sk.po @@ -0,0 +1,858 @@ +# Portable object template file for sudo +# This file is put in the public domain. +# Todd C. Miller , 2011-2015 +# Dušan Kazik , 2015-2016 +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.16b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2016-02-19 15:48-0700\n" +"PO-Revision-Date: 2016-03-20 10:56+0100\n" +"Last-Translator: Dušan Kazik \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: .\n" + +#: lib/util/aix.c:85 lib/util/aix.c:164 +msgid "unable to open userdb" +msgstr "nie je možné otvoriť userdb" + +#: lib/util/aix.c:219 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "nie je možné prepnúť na register „%s“ pre %s" + +#: lib/util/aix.c:244 +msgid "unable to restore registry" +msgstr "nie je možné obnoviť register" + +#: lib/util/aix.c:267 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:207 lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 +#: lib/util/sudo_conf.c:569 src/conversation.c:75 src/exec.c:863 +#: src/exec_common.c:107 src/exec_common.c:123 src/exec_common.c:132 +#: src/exec_pty.c:684 src/exec_pty.c:692 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:416 src/selinux.c:425 +#: src/sesh.c:115 src/sudo.c:201 src/sudo.c:398 src/sudo.c:417 src/sudo.c:481 +#: src/sudo.c:655 src/sudo.c:665 src/sudo.c:685 src/sudo.c:704 src/sudo.c:713 +#: src/sudo.c:722 src/sudo.c:739 src/sudo.c:780 src/sudo.c:790 src/sudo.c:810 +#: src/sudo.c:1215 src/sudo.c:1236 src/sudo.c:1398 src/sudo.c:1492 +#: src/sudo_edit.c:151 src/sudo_edit.c:716 src/sudo_edit.c:813 +#: src/sudo_edit.c:925 src/sudo_edit.c:945 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:267 lib/util/gidlist.c:64 lib/util/sudo_conf.c:208 +#: lib/util/sudo_conf.c:290 lib/util/sudo_conf.c:367 lib/util/sudo_conf.c:569 +#: src/conversation.c:76 src/exec.c:863 src/exec_common.c:107 +#: src/exec_common.c:124 src/exec_common.c:133 src/exec_pty.c:684 +#: src/exec_pty.c:692 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:180 +#: src/parse_args.c:202 src/parse_args.c:370 src/parse_args.c:466 +#: src/parse_args.c:485 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:291 src/selinux.c:416 src/selinux.c:425 +#: src/sesh.c:115 src/sudo.c:201 src/sudo.c:398 src/sudo.c:417 src/sudo.c:481 +#: src/sudo.c:810 src/sudo.c:1215 src/sudo.c:1236 src/sudo.c:1398 +#: src/sudo.c:1492 src/sudo_edit.c:151 src/sudo_edit.c:716 src/sudo_edit.c:813 +#: src/sudo_edit.c:925 src/sudo_edit.c:945 +msgid "unable to allocate memory" +msgstr "nie je možné alokovať pamäť" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Neznámy signál" + +#: lib/util/strtoid.c:76 lib/util/strtoid.c:104 lib/util/strtomode.c:48 +#: lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "neplatná hodnota" + +#: lib/util/strtoid.c:83 lib/util/strtoid.c:111 lib/util/strtomode.c:54 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "hodnota je príliš veľká" + +#: lib/util/strtoid.c:89 lib/util/strtomode.c:54 lib/util/strtonum.c:61 +#: lib/util/strtonum.c:182 +msgid "value too small" +msgstr "hodnota je príliš malá" + +#: lib/util/sudo_conf.c:223 +#, c-format +msgid "invalid Path value `%s' in %s, line %u" +msgstr "neplatná hodnota pre cestu „%s“ v %s, riadok %u" + +#: lib/util/sudo_conf.c:389 lib/util/sudo_conf.c:442 +#, c-format +msgid "invalid value for %s `%s' in %s, line %u" +msgstr "neplatná hodnota pre %s „%s“ v %s, riadok %u" + +#: lib/util/sudo_conf.c:410 +#, c-format +msgid "unsupported group source `%s' in %s, line %u" +msgstr "nepodporovaný zdroj skupiny „%s“ v %s, riadok %u" + +#: lib/util/sudo_conf.c:426 +#, c-format +msgid "invalid max groups `%s' in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:585 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: lib/util/sudo_conf.c:588 +#, c-format +msgid "%s is not a regular file" +msgstr "%s nie je regulárny súbor" + +#: lib/util/sudo_conf.c:591 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je vlastnený identifikátorom uid %u a mal by byť vlastnený %u" + +#: lib/util/sudo_conf.c:595 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: lib/util/sudo_conf.c:598 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: lib/util/sudo_conf.c:608 src/selinux.c:199 src/selinux.c:212 src/sudo.c:367 +#, c-format +msgid "unable to open %s" +msgstr "nie je možné otvoriť %s" + +#: src/exec.c:114 src/exec.c:116 src/exec.c:121 src/exec.c:409 src/exec.c:411 +#: src/exec.c:413 src/exec.c:415 src/exec.c:417 src/exec.c:419 src/exec.c:422 +#: src/exec.c:438 src/exec.c:440 src/exec.c:595 src/exec.c:790 +#: src/exec_pty.c:466 src/exec_pty.c:722 src/exec_pty.c:792 src/exec_pty.c:794 +#: src/exec_pty.c:806 src/exec_pty.c:808 src/exec_pty.c:1289 +#: src/exec_pty.c:1291 src/exec_pty.c:1296 src/exec_pty.c:1298 +#: src/exec_pty.c:1312 src/exec_pty.c:1323 src/exec_pty.c:1325 +#: src/exec_pty.c:1327 src/exec_pty.c:1329 src/exec_pty.c:1331 +#: src/exec_pty.c:1333 src/exec_pty.c:1335 src/signal.c:147 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "" + +#: src/exec.c:126 src/exec_pty.c:838 src/exec_pty.c:1373 src/tgetpass.c:265 +msgid "unable to fork" +msgstr "" + +#: src/exec.c:304 src/exec.c:312 src/exec.c:868 src/exec_pty.c:604 +#: src/exec_pty.c:611 src/exec_pty.c:654 src/exec_pty.c:659 src/exec_pty.c:946 +#: src/exec_pty.c:956 src/exec_pty.c:1001 src/exec_pty.c:1008 +#: src/exec_pty.c:1438 src/exec_pty.c:1445 src/exec_pty.c:1452 +msgid "unable to add event to queue" +msgstr "" + +#: src/exec.c:392 +msgid "unable to create sockets" +msgstr "nie je možné vytvoriť sokety" + +#: src/exec.c:447 +msgid "policy plugin failed session initialization" +msgstr "" + +#: src/exec.c:492 +msgid "error in event loop" +msgstr "" + +#: src/exec.c:510 +msgid "unable to restore tty label" +msgstr "nie je možné obnoviť menovku rozhrania tty" + +#: src/exec.c:603 src/exec_pty.c:498 src/signal.c:86 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "" + +#: src/exec.c:721 src/exec_pty.c:1180 +msgid "error reading from signal pipe" +msgstr "chyba pri čítaní zo zreťazenia signálov" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "nie je možné odstrániť PRIV_PROC_EXEC z PRIV_LIMIT" + +#: src/exec_pty.c:188 +msgid "unable to allocate pty" +msgstr "nie je možné alokovať pty" + +#: src/exec_pty.c:766 src/exec_pty.c:775 src/exec_pty.c:783 +#: src/exec_pty.c:1281 src/exec_pty.c:1370 src/signal.c:128 src/tgetpass.c:261 +msgid "unable to create pipe" +msgstr "nie je možné vytvoriť zreťazenie" + +#: src/exec_pty.c:1213 +msgid "error reading from pipe" +msgstr "chyba pri čítaní zo zreťazenia" + +#: src/exec_pty.c:1238 +msgid "error reading from socketpair" +msgstr "" + +#: src/exec_pty.c:1247 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "neočakávaný typ odpovede na zadnom kanále: %d" + +#: src/exec_pty.c:1349 +msgid "unable to set controlling tty" +msgstr "nie je možné nastaviť ovládacie rozhranie tty" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "chyba v %s, riadok%d počas načítania zásuvného modulu „%s“" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s musí byť vlastnený identifikátorom uid %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s musí byť zapisovateľný iba vlastníkom" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "nie je možné načítať %s:%s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol `%s' in %s" +msgstr "nie je možné nájsť symbol „%s“ v %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "našiel sa neplatný typ politiky %d v %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "nekompatibilná hlavná verzia zásuvného modulu %d (očakávala sa %d) nájdená v %s" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "ignoruje sa zásuvný modul politiky „%s“ v %s, riadok %d" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "môže byť určený iba jeden zásuvný modul politiky" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "ignoruje sa zdvojený zásuvný modul politiky „%s“ v %s, riadok %d" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "ignoruje sa zdvojený vstupno-výstupný zásuvný modul „%s“ v %s, riadok %d" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "zásuvný modul politiky %s nezahŕňa spôsob check_policy" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:476 +#, c-format +msgid "internal error, %s overflow" +msgstr "vnútorná chyba, %s pretečenie" + +#: src/parse_args.c:239 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "parameter pre -C musí byť číslo väčšie alebo rovné 3" + +#: src/parse_args.c:406 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "nemôžete určiť naraz voľby „-i“ a „-s“" + +#: src/parse_args.c:410 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "nemôžete určiť naraz voľby „-i“ a „-E“" + +#: src/parse_args.c:420 +msgid "the `-E' option is not valid in edit mode" +msgstr "voľba „-E“ nie je platná v režime úprav" + +#: src/parse_args.c:422 +msgid "you may not specify environment variables in edit mode" +msgstr "nemôžete určiť premenné prostredia v režim úprav" + +#: src/parse_args.c:430 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "voľba „-U“ môže byť použitá iba s voľbou „-l“" + +#: src/parse_args.c:434 +msgid "the `-A' and `-S' options may not be used together" +msgstr "voľby „-A“ a „-S“ nemôžu byť použité zároveň" + +#: src/parse_args.c:504 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit nie je podporovaný na tejto platforme" + +#: src/parse_args.c:577 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Môže byť určená iba jedna z volieb -e, -h, -i, -K, -l, -s, -v alebo -V" + +#: src/parse_args.c:591 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - upravuje súbory ako iný používateľ\n" +"\n" + +#: src/parse_args.c:593 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - vykonáva príkaz ako iný používateľ\n" +"\n" + +#: src/parse_args.c:598 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Voľby:\n" + +#: src/parse_args.c:600 +msgid "use a helper program for password prompting" +msgstr "použije pomocný program na pýtanie hesla " + +#: src/parse_args.c:603 +msgid "use specified BSD authentication type" +msgstr "" + +#: src/parse_args.c:606 +msgid "run command in the background" +msgstr "spustí príkaz na pozadí" + +#: src/parse_args.c:608 +msgid "close all file descriptors >= num" +msgstr "zavrie všetky popisovače súborov >= číslo" + +#: src/parse_args.c:611 +msgid "run command with the specified BSD login class" +msgstr "spustí príkaz s určenou triedou prihlásenia BSD" + +#: src/parse_args.c:614 +msgid "preserve user environment when running command" +msgstr "zachová rozhranie používateľa, keď sa spúšťa príkaz" + +#: src/parse_args.c:616 +msgid "edit files instead of running a command" +msgstr "upraví súbory namiesto spustenia príkazu" + +#: src/parse_args.c:618 +msgid "run command as the specified group name or ID" +msgstr "spustí príkaz ako určený názov skupiny alebo ID" + +#: src/parse_args.c:620 +msgid "set HOME variable to target user's home dir" +msgstr "nastaví premennú HOME do domovského adresára cieľového používateľa" + +#: src/parse_args.c:622 +msgid "display help message and exit" +msgstr "zobrazí správu pomocníka a skončí" + +#: src/parse_args.c:624 +msgid "run command on host (if supported by plugin)" +msgstr "spustí príkaz na hostiteľovi (ak je podporované zásuvným modulom)" + +#: src/parse_args.c:626 +msgid "run login shell as the target user; a command may also be specified" +msgstr "spustí príkazový riadok prihlásenia, príkaz môže byť tiež určený" + +#: src/parse_args.c:628 +msgid "remove timestamp file completely" +msgstr "úplne odstráni súbor časovej značky" + +#: src/parse_args.c:630 +msgid "invalidate timestamp file" +msgstr "urobí súbor časovej značky neplatným" + +#: src/parse_args.c:632 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "vypíše právomoci používateľa, alebo skontroluje určený príkaz; použite dvakrát pre dlhší formát" + +#: src/parse_args.c:634 +msgid "non-interactive mode, no prompts are used" +msgstr "neinteraktívny režim, nebudú použité žiadne výzvy" + +#: src/parse_args.c:636 +msgid "preserve group vector instead of setting to target's" +msgstr "" + +#: src/parse_args.c:638 +msgid "use the specified password prompt" +msgstr "použije určenú výzvu na heslo" + +#: src/parse_args.c:641 +msgid "create SELinux security context with specified role" +msgstr "vytvorí bezpečnostný kontext systému SELinux s určenou rolou" + +#: src/parse_args.c:644 +msgid "read password from standard input" +msgstr "bude čítať heslo zo štandardného vstupu" + +#: src/parse_args.c:646 +msgid "run shell as the target user; a command may also be specified" +msgstr "" + +#: src/parse_args.c:649 +msgid "create SELinux security context with specified type" +msgstr "vytvorí bezpečnostný kontext systému SELinux s určeným typom" + +#: src/parse_args.c:652 +msgid "in list mode, display privileges for user" +msgstr "v režime výpisu, zobrazí právomoci používateľa" + +#: src/parse_args.c:654 +msgid "run command (or edit file) as specified user name or ID" +msgstr "" + +#: src/parse_args.c:656 +msgid "display version information and exit" +msgstr "zobrazí informácie o verzii a skončí" + +#: src/parse_args.c:658 +msgid "update user's timestamp without running a command" +msgstr "" + +#: src/parse_args.c:660 +msgid "stop processing command line arguments" +msgstr "zastaví spracovávanie parametrov príkazového riadku" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "nie je možné otvoriť systém auditu" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "nie je možné odoslať správu auditu" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "nie je možné vykonať funkciu fgetfilecon na %s" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "nie je možné obnoviť kontext pre %s" + +#: src/selinux.c:166 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "nie je možné otvoriť %s, rozhranie tty nebude mať zmenenú menovku" + +#: src/selinux.c:175 +msgid "unable to get current tty context, not relabeling tty" +msgstr "nie je možné získať aktuálny kontext rozhrania tty, rozhranie tty nebude mať zmenenú menovku" + +#: src/selinux.c:182 +msgid "unable to get new tty context, not relabeling tty" +msgstr "nie je možné získať nový kontext tty, rozhranie tty nebude mať zmenenú menovku" + +#: src/selinux.c:189 +msgid "unable to set new tty context" +msgstr "nie je možné nastaviť nový kontext rozhrania tty" + +#: src/selinux.c:255 +#, c-format +msgid "you must specify a role for type %s" +msgstr "musíte určiť typ roly pre %s" + +#: src/selinux.c:261 +#, c-format +msgid "unable to get default type for role %s" +msgstr "nie je možné získať predvolený typ roly %s" + +#: src/selinux.c:279 +#, c-format +msgid "failed to set new role %s" +msgstr "zlyhalo nastavenie novej roly %s" + +#: src/selinux.c:283 +#, c-format +msgid "failed to set new type %s" +msgstr "zlyhalo nastavenie nového typu %s" + +#: src/selinux.c:295 +#, c-format +msgid "%s is not a valid context" +msgstr "%s nie je platný kontext" + +#: src/selinux.c:330 +msgid "failed to get old_context" +msgstr "zlyhalo získanie old_context" + +#: src/selinux.c:336 +msgid "unable to determine enforcing mode." +msgstr "" + +#: src/selinux.c:353 +#, c-format +msgid "unable to set tty context to %s" +msgstr "nie je možné nastaviť kontext rozhrania tty na %s" + +#: src/selinux.c:392 +#, c-format +msgid "unable to set exec context to %s" +msgstr "nie je možné nastaviť kontext exec na %s" + +#: src/selinux.c:399 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "nie je možné nastaviť kontext tvorby kľúča na %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "vyžaduje aspoň jeden parameter" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "neplatné číslo popisovača súboru: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "nie je možné spustiť %s ako terminál prihlásenia" + +#: src/sesh.c:125 src/sudo.c:1274 +#, c-format +msgid "unable to execute %s" +msgstr "nie je možné vykonať %s" + +#: src/signal.c:68 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "bol dosiahnutý limit ovládania prostriedkov" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "používateľ „%s“ nie je členom projektu „%s“" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "vyvolávajúca úloha je konečná" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "nepodarilo sa vstúpiť do projektu „%s“" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "funkcia setproject zlyhala pre projekt „%s“" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "upozornenie, zlyhalo priradenie ovládania prostriedkov pre projekt „%s“" + +#: src/sudo.c:212 +#, c-format +msgid "Sudo version %s\n" +msgstr "Verzia programu sudo %s\n" + +#: src/sudo.c:214 +#, c-format +msgid "Configure options: %s\n" +msgstr "Voľby konfigurácie: %s\n" + +#: src/sudo.c:222 +msgid "fatal error, unable to load plugins" +msgstr "závažná chyba, nie je možné načítať zásuvné moduly" + +#: src/sudo.c:230 +msgid "unable to initialize policy plugin" +msgstr "nie je možné inicializovať zásuvný modul politiky" + +#: src/sudo.c:276 +msgid "plugin did not return a command to execute" +msgstr "" + +#: src/sudo.c:292 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "chyba pri inicializácii vstupno-výstupného zásuvného modulu %s" + +#: src/sudo.c:318 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "neočakávaný režim sudo 0x%x" + +#: src/sudo.c:461 +msgid "unable to get group vector" +msgstr "nie je možné získať vektor skupiny" + +#: src/sudo.c:522 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "neznámy identifikátor uid %u: kto ste?" + +#: src/sudo.c:859 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s musí byť vlastnený identifikátorom uid %d a musí mať nastavený bit setuid" + +#: src/sudo.c:862 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "efektívny identifikátor uid nie je %d, je %s na systéme súborov s nastavenou voľbou „nosuid“, alebo na systéme súborov NFS bez právomocí administrátora?" + +#: src/sudo.c:868 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "" + +#: src/sudo.c:999 +#, c-format +msgid "unknown login class %s" +msgstr "neznáma trieda prihlásenia %s" + +#: src/sudo.c:1012 +msgid "unable to set user context" +msgstr "nie je možné nastaviť kontext používateľa" + +#: src/sudo.c:1026 +msgid "unable to set supplementary group IDs" +msgstr "" + +#: src/sudo.c:1033 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "" + +#: src/sudo.c:1039 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "" + +#: src/sudo.c:1046 +msgid "unable to set process priority" +msgstr "nie je možné nastaviť prioritu procesu" + +#: src/sudo.c:1054 +#, c-format +msgid "unable to change root to %s" +msgstr "nie je možné zmeniť administrátora na %s" + +#: src/sudo.c:1067 src/sudo.c:1073 src/sudo.c:1080 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "" + +#: src/sudo.c:1098 +#, c-format +msgid "unable to change directory to %s" +msgstr "nie je možné zmeniť adresár na %s" + +#: src/sudo.c:1156 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "neočakávaná podmienka prerušenia potomka: %d" + +#: src/sudo.c:1302 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "zásuvnému modulu politiky %s chýba spôsob „check_policy“" + +#: src/sudo.c:1320 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "zásuvný modul politiky %s nepodporuje výpis právomocí" + +#: src/sudo.c:1337 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "" + +#: src/sudo.c:1352 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "" + +#: src/sudo_edit.c:181 +msgid "unable to restore current working directory" +msgstr "nie je možné obnoviť aktuálny pracovný adresár" + +#: src/sudo_edit.c:526 src/sudo_edit.c:630 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: nie je regulárny súbor" + +#: src/sudo_edit.c:533 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: upravovanie symbolických odkazov nie je dovolené" + +#: src/sudo_edit.c:536 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: upravovanie súborov v zapisovateľnom adresári nie je dovolené" + +#: src/sudo_edit.c:567 src/sudo_edit.c:669 +#, c-format +msgid "%s: short write" +msgstr "%s: krátky zápis" + +#: src/sudo_edit.c:631 +#, c-format +msgid "%s left unmodified" +msgstr "%s zostal nezmenený" + +#: src/sudo_edit.c:644 src/sudo_edit.c:830 +#, c-format +msgid "%s unchanged" +msgstr "%s nezmenený" + +#: src/sudo_edit.c:658 src/sudo_edit.c:680 +#, c-format +msgid "unable to write to %s" +msgstr "nie je možné zapísať do %s" + +#: src/sudo_edit.c:659 src/sudo_edit.c:678 src/sudo_edit.c:681 +#: src/sudo_edit.c:855 src/sudo_edit.c:859 +#, c-format +msgid "contents of edit session left in %s" +msgstr "obsah upravovanej relácie zostal v %s" + +#: src/sudo_edit.c:677 +msgid "unable to read temporary file" +msgstr "nie je možné čítať dočasný súbor" + +#: src/sudo_edit.c:760 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: vnútorná chyba: nepárne čísla ciest" + +#: src/sudo_edit.c:762 +msgid "sesh: unable to create temporary files" +msgstr "sesh: nie je možné vytvoriť dočasné súbory" + +#: src/sudo_edit.c:764 src/sudo_edit.c:862 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: neznáma chyba %d" + +#: src/sudo_edit.c:854 +msgid "unable to copy temporary files back to their original location" +msgstr "nie je možné skopírovať dočasné súbory späť do ich pôvodného umiestnenia" + +#: src/sudo_edit.c:858 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "nie je možné skopírovať niektoré z dočasných súborov späť do ich pôvodného umiestnenia" + +#: src/sudo_edit.c:901 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "nie je možné zmeniť identifikátor uid na administrátora (%u)" + +#: src/sudo_edit.c:918 +msgid "plugin error: missing file list for sudoedit" +msgstr "chyba zásuvného modulu: chýba zoznam súborov pre sudoedit" + +#: src/sudo_edit.c:959 src/sudo_edit.c:972 +msgid "unable to read the clock" +msgstr "nie je možné čítať hodiny" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "" + +#: src/tgetpass.c:276 +#, c-format +msgid "unable to set gid to %u" +msgstr "nie je možné nastaviť identifikátor gid na %u" + +#: src/tgetpass.c:280 +#, c-format +msgid "unable to set uid to %u" +msgstr "nie je možné nastaviť identifikátor uid na %u" + +#: src/tgetpass.c:285 +#, c-format +msgid "unable to run %s" +msgstr "nie je možné spustiť %s" + +#: src/utmp.c:266 +msgid "unable to save stdin" +msgstr "nie je možné uložiť štandardný vstup stdin" + +#: src/utmp.c:268 +msgid "unable to dup2 stdin" +msgstr "" + +#: src/utmp.c:271 +msgid "unable to restore stdin" +msgstr "nie je možné obnoviť štandardný vstup stdin" diff --git a/utsudo-0.0.2/po/sl.mo b/utsudo-0.0.2/po/sl.mo new file mode 100644 index 0000000000000000000000000000000000000000..22725f0dc8373400532fd834f291d9a7e2c9ff1d GIT binary patch literal 16463 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, 2012. +# Klemen Košir , 2012 - 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.7b1\n" +"Report-Msgid-Bugs-To: http://www.sudo.ws/bugs\n" +"POT-Creation-Date: 2013-04-02 10:40-0400\n" +"PO-Revision-Date: 2013-04-06 09:33+0100\n" +"Last-Translator: Klemen Košir \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.5\n" + +#: common/aix.c:150 +#, c-format +msgid "unable to open userdb" +msgstr "ni mogoče odpreti userdb" + +#: common/aix.c:153 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "ni mogoče preklopiti na vpisnik \"%s\" za %s" + +#: common/aix.c:170 +#, c-format +msgid "unable to restore registry" +msgstr "ni mogoče obnoviti vpisnika" + +#: common/alloc.c:82 +msgid "internal error, tried to emalloc(0)" +msgstr "notranja napaka, poskus uporabe emalloc(0)" + +#: common/alloc.c:99 +msgid "internal error, tried to emalloc2(0)" +msgstr "notranja napaka, poskus uporabe emalloc2(0)" + +#: common/alloc.c:101 common/alloc.c:123 common/alloc.c:163 common/alloc.c:187 +#, c-format +msgid "internal error, %s overflow" +msgstr "notranja napaka, prekoračitev funkcije %s" + +#: common/alloc.c:120 +msgid "internal error, tried to ecalloc(0)" +msgstr "notranja napaka med izvajanjem funkcije ecalloc(0)" + +#: common/alloc.c:142 +msgid "internal error, tried to erealloc(0)" +msgstr "notranja napaka, poskus uporabe erealloc(0)" + +#: common/alloc.c:161 +msgid "internal error, tried to erealloc3(0)" +msgstr "notranja napaka, poskus uporabe erealloc3(0)" + +#: common/alloc.c:185 +msgid "internal error, tried to erecalloc(0)" +msgstr "notranja napaka, poskus uporabe erealloc(0)" + +#: common/error.c:154 +#, c-format +msgid "%s: %s: %s\n" +msgstr "%s: %s: %s\n" + +#: common/error.c:157 common/error.c:161 +#, c-format +msgid "%s: %s\n" +msgstr "%s: %s\n" + +#: common/sudo_conf.c:172 +#, c-format +msgid "unsupported group source `%s' in %s, line %d" +msgstr "nepodprt vir skupine %s v datoteki %s v %d. vrstici" + +#: common/sudo_conf.c:186 +#, c-format +msgid "invalid max groups `%s' in %s, line %d" +msgstr "neveljavna največja skupina %s v datoteki %s v %d. vrstici" + +#: common/sudo_conf.c:382 +#, c-format +msgid "unable to stat %s" +msgstr "stanja datoteke %s ni mogoče izpisati" + +#: common/sudo_conf.c:385 +#, c-format +msgid "%s is not a regular file" +msgstr "%s ni običajna datoteka" + +#: common/sudo_conf.c:388 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s je v lasti uporabnika z ID-jem %u, moral bi biti %u" + +#: common/sudo_conf.c:392 +#, c-format +msgid "%s is world writable" +msgstr "v datoteko %s lahko zapisujejo vsi uporabniki" + +#: common/sudo_conf.c:395 +#, c-format +msgid "%s is group writable" +msgstr "%s" + +#: common/sudo_conf.c:405 src/selinux.c:196 src/selinux.c:209 src/sudo.c:328 +#, c-format +msgid "unable to open %s" +msgstr "ni mogoče odpreti %s" + +#: compat/strsignal.c:50 +msgid "Unknown signal" +msgstr "Neznan signal" + +#: src/exec.c:127 src/exec_pty.c:685 +#, c-format +msgid "policy plugin failed session initialization" +msgstr "vstavek za pravilnik ni mogel zagnati seje" + +#: src/exec.c:132 src/exec_pty.c:701 src/exec_pty.c:1066 src/tgetpass.c:220 +#, c-format +msgid "unable to fork" +msgstr "ni mogoče razvejiti" + +#: src/exec.c:259 +#, c-format +msgid "unable to create sockets" +msgstr "ni mogoče ustvariti vtičev" + +#: src/exec.c:347 src/exec_pty.c:1130 src/exec_pty.c:1268 +#, c-format +msgid "select failed" +msgstr "izbira je spodletela" + +#: src/exec.c:449 +#, c-format +msgid "unable to restore tty label" +msgstr "ni mogoče obnoviti oznake tty" + +#: src/exec_common.c:70 +#, c-format +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "ni mogoče odstraniti PRIV_PROC_EXEC iz PRIV_LIMIT" + +#: src/exec_pty.c:183 +#, c-format +msgid "unable to allocate pty" +msgstr "ni mogoče dodeliti pty" + +#: src/exec_pty.c:623 src/exec_pty.c:632 src/exec_pty.c:640 src/exec_pty.c:986 +#: src/exec_pty.c:1063 src/signal.c:126 src/tgetpass.c:217 +#, c-format +msgid "unable to create pipe" +msgstr "ni mogoče ustvariti cevi" + +#: src/exec_pty.c:676 +#, c-format +msgid "unable to set terminal to raw mode" +msgstr "ni mogoče postaviti terminala v surov način" + +#: src/exec_pty.c:1042 +#, c-format +msgid "unable to set controlling tty" +msgstr "ni mogoče nastaviti nadzora tty" + +#: src/exec_pty.c:1139 +#, c-format +msgid "error reading from signal pipe" +msgstr "napaka med branjem iz cevi signala" + +#: src/exec_pty.c:1160 +#, c-format +msgid "error reading from pipe" +msgstr "napaka med branjem iz cevovoda" + +#: src/exec_pty.c:1176 +#, c-format +msgid "error reading from socketpair" +msgstr "napaka med branjem iz para vtičev" + +#: src/exec_pty.c:1180 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "nepričakovana vrsta odgovora na ozadnem kanalu: %d" + +#: src/load_plugins.c:70 src/load_plugins.c:79 src/load_plugins.c:132 +#: src/load_plugins.c:138 src/load_plugins.c:144 src/load_plugins.c:185 +#: src/load_plugins.c:192 src/load_plugins.c:199 src/load_plugins.c:205 +#, c-format +msgid "error in %s, line %d while loading plugin `%s'" +msgstr "v datoteki %s (vrstica %d) je prišlo do napake med nalaganjem vstavka %s" + +#: src/load_plugins.c:72 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: src/load_plugins.c:81 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:140 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s mora biti v lasti ID-ja uporabnika %d" + +#: src/load_plugins.c:146 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s mora biti zapisljiv samo za lastnika" + +#: src/load_plugins.c:187 +#, c-format +msgid "unable to dlopen %s: %s" +msgstr "ni mogoče uporabiti dlopen %s: %s" + +#: src/load_plugins.c:194 +#, c-format +msgid "unable to find symbol `%s' in %s" +msgstr "ni mogoče najti simbola '%s' v %s" + +#: src/load_plugins.c:201 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "neznana vrsta pravilnika %d v %s" + +#: src/load_plugins.c:207 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "nezdružljiva različica vstavka %d (pričakovana %d) v %s" + +#: src/load_plugins.c:216 +#, c-format +msgid "ignoring policy plugin `%s' in %s, line %d" +msgstr "vstavek pravilnika %s v datoteki %s v %d. vrstici bo prezrt" + +#: src/load_plugins.c:218 +#, c-format +msgid "only a single policy plugin may be specified" +msgstr "naložen je lahko le en vstavek pravilnika" + +#: src/load_plugins.c:221 +#, c-format +msgid "ignoring duplicate policy plugin `%s' in %s, line %d" +msgstr "podvojeni vstavek pravilnika %s v datoteki %s v %d. vrstici bo prezrt" + +#: src/load_plugins.c:236 +#, c-format +msgid "ignoring duplicate I/O plugin `%s' in %s, line %d" +msgstr "podvojeni vstavek I/O %s v datoteki %s v %d. vrstici bo prezrt" + +#: src/load_plugins.c:313 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "vstavek pravilnika %s ne vključuje načina check_policy" + +#: src/net_ifs.c:156 src/net_ifs.c:165 src/net_ifs.c:177 src/net_ifs.c:186 +#: src/net_ifs.c:297 src/net_ifs.c:321 +#, c-format +msgid "load_interfaces: overflow detected" +msgstr "load_interfaces: zaznana je bila prekoračitev" + +#: src/net_ifs.c:226 +#, c-format +msgid "unable to open socket" +msgstr "ni mogoče odpreti vtiča" + +#: src/parse_args.c:197 +#, c-format +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argument k -C mora biti številka, večja kot ali enaka 3" + +#: src/parse_args.c:286 +#, c-format +msgid "unknown user: %s" +msgstr "neznan uporabnik: %s" + +#: src/parse_args.c:345 +#, c-format +msgid "you may not specify both the `-i' and `-s' options" +msgstr "možnosti `-i' in `-s' ne smeta biti navedeni hkrati" + +#: src/parse_args.c:349 +#, c-format +msgid "you may not specify both the `-i' and `-E' options" +msgstr "možnosti `-i' in `-E' ne smeta biti navedeni hkrati" + +#: src/parse_args.c:359 +#, c-format +msgid "the `-E' option is not valid in edit mode" +msgstr "možnost `-E' ni veljavna v načinu urejanja" + +#: src/parse_args.c:361 +#, c-format +msgid "you may not specify environment variables in edit mode" +msgstr "v načinu urejanja se ne sme podati spremenljivk okolja" + +#: src/parse_args.c:369 +#, c-format +msgid "the `-U' option may only be used with the `-l' option" +msgstr "možnost `-U' se lahko uporabi samo z možnostjo `-l'" + +#: src/parse_args.c:373 +#, c-format +msgid "the `-A' and `-S' options may not be used together" +msgstr "možnosti `-A' in `-S' se ne smeta uporabljati hkrati" + +#: src/parse_args.c:456 +#, c-format +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit ni podprt v tem okolju" + +#: src/parse_args.c:529 +#, c-format +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Od -e, -h, -i, -K, -l, -s, -v ali -V je lahko navedena samo ena možnost" + +#: src/parse_args.c:543 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - urejaj datoteke kot drug uporabnik\n" +"\n" + +#: src/parse_args.c:545 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - izvedi ukaz kot drug uporabnik\n" +"\n" + +#: src/parse_args.c:550 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Možnosti:\n" + +#: src/parse_args.c:552 +msgid "use helper program for password prompting\n" +msgstr "uporabi program pomagalnik za pozive za vnos gesla\n" + +#: src/parse_args.c:555 +msgid "use specified BSD authentication type\n" +msgstr "uporabi navedeno vrsto urejanja BSD\n" + +#: src/parse_args.c:558 +msgid "run command in the background\n" +msgstr "zaženi ukaz v ozadju\n" + +#: src/parse_args.c:560 +msgid "close all file descriptors >= fd\n" +msgstr "zapri vse opisnike datotek >= fd\n" + +#: src/parse_args.c:563 +msgid "run command with specified login class\n" +msgstr "zaženi ukaz z navedenim prijavnim razredom\n" + +#: src/parse_args.c:566 +msgid "preserve user environment when executing command\n" +msgstr "ohrani okolje uporabnika, kadar se izvajajo ukazi\n" + +#: src/parse_args.c:568 +msgid "edit files instead of running a command\n" +msgstr "namesto izvedbe ukaza uredi datoteke\n" + +#: src/parse_args.c:570 +msgid "execute command as the specified group\n" +msgstr "izvedi ukaz kot navedena skupina\n" + +#: src/parse_args.c:572 +msgid "set HOME variable to target user's home dir.\n" +msgstr "nastavi spremenljivko HOME kot cilj v domači mapi uporabnika\n" + +#: src/parse_args.c:574 +msgid "display help message and exit\n" +msgstr "prikaži sporočilo pomoči in končaj\n" + +#: src/parse_args.c:576 +msgid "run a login shell as target user\n" +msgstr "zaženi lupino prijave kot ciljni uporabnik\n" + +#: src/parse_args.c:578 +msgid "remove timestamp file completely\n" +msgstr "popolnoma odstrani datoteko s časovnimi žigi\n" + +#: src/parse_args.c:580 +msgid "invalidate timestamp file\n" +msgstr "razveljavi veljavnost datoteke s časovnimi žigi\n" + +#: src/parse_args.c:582 +msgid "list user's available commands\n" +msgstr "prikaži razpoložljive ukaze uporabnika\n" + +#: src/parse_args.c:584 +msgid "non-interactive mode, will not prompt user\n" +msgstr "nevzajemni način, ne bo poziva uporabnika\n" + +#: src/parse_args.c:586 +msgid "preserve group vector instead of setting to target's\n" +msgstr "ohrani vektor skupine namesto nastavitve tarči\n" + +#: src/parse_args.c:588 +msgid "use specified password prompt\n" +msgstr "uporabi določen poziv za vnos gesla\n" + +#: src/parse_args.c:591 src/parse_args.c:599 +msgid "create SELinux security context with specified role\n" +msgstr "ustvari varnostno vsebino SELinux z določeno vlogo\n" + +#: src/parse_args.c:594 +msgid "read password from standard input\n" +msgstr "preberi geslo s standardnega vnosa\n" + +#: src/parse_args.c:596 +msgid "run a shell as target user\n" +msgstr "zaženi lupino kot ciljni uporabnik\n" + +#: src/parse_args.c:602 +msgid "when listing, list specified user's privileges\n" +msgstr "med naštevanjem prikaži določena dovoljenja uporabnika\n" + +#: src/parse_args.c:604 +msgid "run command (or edit file) as specified user\n" +msgstr "zaženi ukaz (ali uredi datoteko) kot določen uporabnik\n" + +#: src/parse_args.c:606 +msgid "display version information and exit\n" +msgstr "prikaži podrobnosti različice in končaj\n" + +#: src/parse_args.c:608 +msgid "update user's timestamp without running a command\n" +msgstr "posodobi časovni žig uporabnika brez izvajanja ukaza\n" + +#: src/parse_args.c:610 +msgid "stop processing command line arguments\n" +msgstr "zaustavi obdelovanje argumentov ukazne vrstice\n" + +#: src/selinux.c:77 +#, c-format +msgid "unable to open audit system" +msgstr "ni mogoče odpreti nadzornega sistema" + +#: src/selinux.c:85 +#, c-format +msgid "unable to send audit message" +msgstr "ni mogoče poslati nadzornega sporočila" + +#: src/selinux.c:113 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "ni mogoče uporabiti fgetfilecon %s" + +#: src/selinux.c:118 +#, c-format +msgid "%s changed labels" +msgstr "%s spremenjenih oznak" + +#: src/selinux.c:123 +#, c-format +msgid "unable to restore context for %s" +msgstr "ni mogoče obnoviti vsebine za %s" + +#: src/selinux.c:163 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "ni mogoče odpreti %s, brez ponovnega označevanja tty" + +#: src/selinux.c:172 +#, c-format +msgid "unable to get current tty context, not relabeling tty" +msgstr "ni mogoče pridobiti trenutne vsebine tty, brez ponovnega označevanja tty" + +#: src/selinux.c:179 +#, c-format +msgid "unable to get new tty context, not relabeling tty" +msgstr "ni mogoče pridobiti nove vsebine tty, brez ponovnega označevanja tty" + +#: src/selinux.c:186 +#, c-format +msgid "unable to set new tty context" +msgstr "ni mogoče nastaviti nove vsebine tty" + +#: src/selinux.c:252 +#, c-format +msgid "you must specify a role for type %s" +msgstr "podati morate vlogo za vrsto %s" + +#: src/selinux.c:258 +#, c-format +msgid "unable to get default type for role %s" +msgstr "ni mogoče pridobiti privzete vrste za vlogo %s" + +#: src/selinux.c:276 +#, c-format +msgid "failed to set new role %s" +msgstr "nastavitev nove vloge %s ni uspela" + +#: src/selinux.c:280 +#, c-format +msgid "failed to set new type %s" +msgstr "nastavitev nove vrste %s ni uspela" + +#: src/selinux.c:289 +#, c-format +msgid "%s is not a valid context" +msgstr "%s ni veljavna vsebina" + +#: src/selinux.c:324 +#, c-format +msgid "failed to get old_context" +msgstr "pridobitev stare_vsebine je spodletela" + +#: src/selinux.c:330 +#, c-format +msgid "unable to determine enforcing mode." +msgstr "ni mogoče določiti načina vsiljenja" + +#: src/selinux.c:342 +#, c-format +msgid "unable to setup tty context for %s" +msgstr "ni mogoče nastaviti vsebine tty za %s" + +#: src/selinux.c:381 +#, c-format +msgid "unable to set exec context to %s" +msgstr "ni mogoče nastavite izvedene vsebine k %s" + +#: src/selinux.c:388 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "ni mogoče nastaviti vsebine ustvarjenja ključa k %s" + +#: src/sesh.c:57 +#, c-format +msgid "requires at least one argument" +msgstr "zahteva vsaj en argument" + +#: src/sesh.c:78 src/sudo.c:1126 +#, c-format +msgid "unable to execute %s" +msgstr "ni mogoče izvršiti %s" + +#: src/solaris.c:88 +#, c-format +msgid "resource control limit has been reached" +msgstr "meja omejitve virov je bila dosežena" + +#: src/solaris.c:91 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "uporabnik \"%s\" ni član projekta \"%s\"" + +#: src/solaris.c:95 +#, c-format +msgid "the invoking task is final" +msgstr "priklicana naloga je končna" + +#: src/solaris.c:98 +#, c-format +msgid "could not join project \"%s\"" +msgstr "ni mogoče pridružiti projekta \"%s\"" + +#: src/solaris.c:103 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "nobene zaloge virov, ki sprejemajo privzete vezi, ne obstajajo za projekt \"% s\"" + +#: src/solaris.c:107 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "določen vir zalog ne obstaja za projekt \"%s\"" + +#: src/solaris.c:111 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "ni mogoče vezati na privzet vir zalog za projekt \"%s\"" + +#: src/solaris.c:117 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject je spodletel za projekt \"%s\"" + +#: src/solaris.c:119 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "opozorilo, naloga nadzora virov je spodletela za projekt \"%s\"" + +#: src/sudo.c:196 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo različica %s\n" + +#: src/sudo.c:198 +#, c-format +msgid "Configure options: %s\n" +msgstr "Nastavitev možnosti: %s\n" + +#: src/sudo.c:203 +#, c-format +msgid "fatal error, unable to load plugins" +msgstr "usodna napaka, ni mogoče naložiti vstavka" + +#: src/sudo.c:211 +#, c-format +msgid "unable to initialize policy plugin" +msgstr "ni mogoče začenjati vstavka pravilnika" + +#: src/sudo.c:268 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "napaka med začenjanjem I/O vstavka %s" + +#: src/sudo.c:293 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "nepričakovan način sudo 0x%x" + +#: src/sudo.c:413 +#, c-format +msgid "unable to get group vector" +msgstr "ni mogoče pridobiti vektorja skupine" + +#: src/sudo.c:465 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "neznan ID uporabnika %u: kdo ste?" + +#: src/sudo.c:802 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s si mora lastiti uporabnik z ID-jem %d and mora imeti nastavljen bit setuid" + +#: src/sudo.c:805 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "trenutni ID uporabnika ni %d. Ali je %s na datotečnem sistemu z nastavljeno možnostjo \"nosuid\" ali datotečnem sistemu NFS brez dovoljenj skrbnika?" + +#: src/sudo.c:811 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "trenutni uid ni %d. Ali je sudo pravilno nameščen?" + +#: src/sudo.c:915 +#, c-format +msgid "unknown login class %s" +msgstr "neznan razred prijave %s" + +#: src/sudo.c:929 src/sudo.c:932 +#, c-format +msgid "unable to set user context" +msgstr "ni mogoče nastaviti vsebine uporabnika" + +#: src/sudo.c:944 +#, c-format +msgid "unable to set supplementary group IDs" +msgstr "ni mogoče nastaviti dopolnilnih ID-jev skupin" + +#: src/sudo.c:951 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "ni mogoče nastaviti učinkovitega ID-ja skupine, da se zažene kot ID skupine %u" + +#: src/sudo.c:957 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "ni mogoče nastaviti ID-ja skupine, da se zažene kot ID skupine %u" + +#: src/sudo.c:964 +#, c-format +msgid "unable to set process priority" +msgstr "ni mogoče nastaviti prednosti opravil" + +#: src/sudo.c:972 +#, c-format +msgid "unable to change root to %s" +msgstr "ni mogoče spremeniti skrbnika v %s" + +#: src/sudo.c:979 src/sudo.c:985 src/sudo.c:991 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "ni mogoče spremeniti ID uporabnika zaženi kot (%u, %u)" + +#: src/sudo.c:1005 +#, c-format +msgid "unable to change directory to %s" +msgstr "ni mogoče spremeniti mape v %s" + +#: src/sudo.c:1089 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "nepričakovan pogoj uničenja podrejenega opravila: %d" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "vstavek pravilnika %s ne vključuje načina check_policy" + +#: src/sudo.c:1159 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "vstavek pravilnika %s ne podpira navajanja dovoljenj" + +#: src/sudo.c:1171 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "vstavek pravilnika %s ne podpira možnosti -v" + +#: src/sudo.c:1183 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "vstavek pravilnika %s ne podpira možnosti -k/-K" + +#: src/sudo_edit.c:110 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "ni mogoče spremeniti ID-ja uporabnika v skrbnika (%u)" + +#: src/sudo_edit.c:142 +#, c-format +msgid "plugin error: missing file list for sudoedit" +msgstr "napaka vstavka: manjka seznam datotek za sudoedit" + +#: src/sudo_edit.c:170 src/sudo_edit.c:270 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: ni običajna datoteka" + +#: src/sudo_edit.c:204 src/sudo_edit.c:306 +#, c-format +msgid "%s: short write" +msgstr "%s: kratko pisanje" + +#: src/sudo_edit.c:271 +#, c-format +msgid "%s left unmodified" +msgstr "%s je ostalo nespremenjeno" + +#: src/sudo_edit.c:284 +#, c-format +msgid "%s unchanged" +msgstr "%s nespremenjeno" + +#: src/sudo_edit.c:296 src/sudo_edit.c:317 +#, c-format +msgid "unable to write to %s" +msgstr "ni mogoče pisati v %s" + +#: src/sudo_edit.c:297 src/sudo_edit.c:315 src/sudo_edit.c:318 +#, c-format +msgid "contents of edit session left in %s" +msgstr "vsebina seje urejanja je ostala v %s" + +#: src/sudo_edit.c:314 +#, c-format +msgid "unable to read temporary file" +msgstr "ni mogoče brati začasne datoteke" + +#: src/tgetpass.c:89 +#, c-format +msgid "no tty present and no askpass program specified" +msgstr "prisotnega ni nobenega tty in določen ni noben program askpass" + +#: src/tgetpass.c:98 +#, c-format +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "določenega ni nobenega programa askpass, poskusite nastaviti SUDO_ASKPASS" + +#: src/tgetpass.c:230 +#, c-format +msgid "unable to set gid to %u" +msgstr "ni mogoče nastaviti ID skupine v %u" + +#: src/tgetpass.c:234 +#, c-format +msgid "unable to set uid to %u" +msgstr "ni mogoče nastaviti ID uporabnika v %u" + +#: src/tgetpass.c:239 +#, c-format +msgid "unable to run %s" +msgstr "ni mogoče zagnati %s" + +#: src/utmp.c:278 +#, c-format +msgid "unable to save stdin" +msgstr "ni mogoče shraniti stdin" + +#: src/utmp.c:280 +#, c-format +msgid "unable to dup2 stdin" +msgstr "ni mogoče uporabiti dup2 za stdin" + +#: src/utmp.c:283 +#, c-format +msgid "unable to restore stdin" +msgstr "ni mogoče obnoviti stdin" diff --git a/utsudo-0.0.2/po/sr.mo b/utsudo-0.0.2/po/sr.mo new file mode 100644 index 0000000000000000000000000000000000000000..d0410e15c351e8f605bd0c4928ae02cd4f8583a9 GIT binary patch literal 24566 zcmche3$$ESdB+ckRId*NL=i*}$R&wnlAG`fH-v{If$%Va0HRjHL3^Z{|h`7 zJnEPrmi0k3ap3W<34+tXGr*I;E5UQY zQSg=EL*UE6FM>ydd%=YYo?9|Z3O&jZf`_ks(+XF>i2C$Y#7TmWkP zYEW{R@OZb!M?mrM6u1cdNAPU$*b{=_t>8*<9(XHwA-EG1pWg@10RICV1W#enr-7G( zx<3lO3cL@Lo_2zo{~O?H@CV?z;DXmP28_Uk;A5cX`+IOc_!5*TK88SDzZ*OcyayDY zUj@$se+6p%JSI5@d?zUVd>B-}r$EW=7og;HBFdH?E(1fb2)+rt7gWE;K+V$zbKuKa zwB&dmC_b(SMQ1B0{&$1Rz+Zvl|16AHa(EBOQiD4{@v{?@oW2c;{?9=5I}PGm=PGar zY=Dcw&x4}(Jy7d95+{qc2rdONjo{rLtDySb3Gy#^m_M@bL!kKl4ybh<#bo01 zOi=c<64d%PgPLzAhzkU}LD|t?f#Ua{{qvX7nWYCOgPQMrPc*fuVcTjpg1z}3B z=YcFOcsnRL-wKNFM?u-;H$chxIZ*t+1))G9SPhErCMbLQBzO$?HIHrZ05}p1{Ma!KL65@Ppv3;MYN|^K6{%W#Bd7(crtl8kh&K1^)(={N^y35D)2azruo)^E5L`qi@~3GJRM8nViyi+rff~OLlzaye zVjjE#WN7du@J8@i5RnAS-{$ze4Xkke4ERp)d=|F|{3tjEeiIabIh1%GcrW;V@I-_x z{yzz7y*~mmkzmnENAG4({Ix*QJrkqU{C9#H_XAM$=U(pm-49;N^|Rp3;DvP3^`}Ac z`%6&%GWQDSKkGoreLD#2!9I|o!GD92!*Y}@zCHnN2Y(7~1t&2UOfdK@i0K45jEp4( z>p|Ur6h!60_rTM^V^Qimz;i*#^+VvP;CDdL`vu6qpw48NLhyA^^7$>ul)-yZmi*+~ zpy>S^ycs+mCe^RAR z4V^UK3Q%${fs(_wK=J>&>)pIJfU=AG!3g{=sQJ&i!Rhe>AX5cj1~vW&guvI}8c_27 z0*Gk@&w{8jScr1P$0l$A_?MvW{}U+whhRo@CP3-!0Emc#pMdWM7hx<5!TUTO0A=t0 z0)7CzgidGLTXECf4fe@gok+N)?M(6o*dX*HT` z{xdZ3ayw0H&_`?3=MD$<_bmP{rM=SMI}SwL!53*-+cug$Lp0pX^eLT{X?fZ!Xphle zMyu2Gkd=(C(w@^L|=HlZ}6b zb`rrhW?y)%HC#d@q8^m(qOVew6Qo6%@1|I7TNe>c`R%+CNl$S(O9#TuNkwM2OIOHVgcsLjc9Yj zKdEdg!^`@~u*svr=KQceUTK!N6LIDHY^v0_lV+|IjW)t&d7@G%juxYW`b{+J4UMXl zOOwL5yJ%~YTBcKG*6jG~BP3l2$MYMb5P667s3AVrqYA!?Vzcb!$;DuOI2@Ej6Ohs* zBB!@v8F40j6^gZJq*19&O8ydQHL6V%8x32|u<2Vv>ys1fE2ZK{SSpq`n67&JIz@HK zeORKbHEhBtxU^CpEsiy72*}$NtPTXLC9O)CyQ8+i9O})D(~7h!X(d{nwlS>K!rTq< z=x`!$Qm$8{5vPK+%|a#I7}e?+t&zUIyrGQX!+LS7oG%3`Dv-)Pt3`SIX6=frisj~JG&|D75hi0x4L21V<6*MWuvWoC zMxNi8#$+`L3dMT0gxtoXQZ<}larrSM!ZM=G#YXZpmSM5XA|~<*0-a8&C{Qfd8&SR> zY1NwLvTP;s{2&?~W$8uCR`%)*Y_Kq2U$I(|bb6>yLS@1&Q5HU@TΞj#sqIT$<09 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/sr.po b/utsudo-0.0.2/po/sr.po new file mode 100644 index 0000000..222a9fd --- /dev/null +++ b/utsudo-0.0.2/po/sr.po @@ -0,0 +1,923 @@ +# Serbian translations for sudo package. +# This file is put in the public domain. +# Мирослав Николић , 2011—2017. +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.21b2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2017-08-03 10:04-0600\n" +"PO-Revision-Date: 2017-08-06 14:45+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian <(nothing)>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:85 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "не могу да отворим корисничку базу података" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "не могу да се пребацим на регистар „%s“ за %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "не могу да повратим регистар" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/gidlist.c:74 +#: lib/util/sudo_conf.c:186 lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 +#: lib/util/sudo_conf.c:553 src/conversation.c:75 src/exec_common.c:107 +#: src/exec_common.c:123 src/exec_common.c:132 src/exec_monitor.c:167 +#: src/exec_nopty.c:462 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/exec_pty.c:867 src/load_plugins.c:52 +#: src/load_plugins.c:65 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:198 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:663 src/sudo.c:673 src/sudo.c:693 src/sudo.c:712 src/sudo.c:721 +#: src/sudo.c:730 src/sudo.c:747 src/sudo.c:788 src/sudo.c:798 src/sudo.c:818 +#: src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 src/sudo.c:1351 +#: src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:64 lib/util/sudo_conf.c:187 +#: lib/util/sudo_conf.c:272 lib/util/sudo_conf.c:349 lib/util/sudo_conf.c:553 +#: src/conversation.c:76 src/exec_common.c:107 src/exec_common.c:124 +#: src/exec_common.c:133 src/exec_pty.c:667 src/exec_pty.c:676 +#: src/exec_pty.c:738 src/load_plugins.c:215 src/load_plugins.c:238 +#: src/load_plugins.c:303 src/load_plugins.c:318 src/parse_args.c:177 +#: src/parse_args.c:199 src/parse_args.c:273 src/parse_args.c:540 +#: src/parse_args.c:562 src/preserve_fds.c:47 src/preserve_fds.c:130 +#: src/selinux.c:84 src/selinux.c:309 src/selinux.c:432 src/selinux.c:441 +#: src/sesh.c:115 src/sudo.c:389 src/sudo.c:416 src/sudo.c:481 src/sudo.c:603 +#: src/sudo.c:818 src/sudo.c:1058 src/sudo.c:1079 src/sudo.c:1253 +#: src/sudo.c:1351 src/sudo_edit.c:148 src/sudo_edit.c:771 src/sudo_edit.c:868 +#: src/sudo_edit.c:982 src/sudo_edit.c:1002 +msgid "unable to allocate memory" +msgstr "не могу да доделим меморију" + +#: lib/util/strsignal.c:48 +msgid "Unknown signal" +msgstr "Непознати сигнал" + +#: lib/util/strtoid.c:77 lib/util/strtoid.c:124 lib/util/strtoid.c:152 +#: lib/util/strtomode.c:49 lib/util/strtonum.c:58 lib/util/strtonum.c:176 +msgid "invalid value" +msgstr "неисправна вредност" + +#: lib/util/strtoid.c:84 lib/util/strtoid.c:131 lib/util/strtoid.c:159 +#: lib/util/strtomode.c:55 lib/util/strtonum.c:61 lib/util/strtonum.c:188 +msgid "value too large" +msgstr "вредност је превелика" + +#: lib/util/strtoid.c:86 lib/util/strtoid.c:137 lib/util/strtomode.c:55 +#: lib/util/strtonum.c:61 lib/util/strtonum.c:182 +msgid "value too small" +msgstr "вредност је премала" + +#: lib/util/sudo_conf.c:205 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "неисправна вредност путање „%s“ у „%s“, %u. ред" + +#: lib/util/sudo_conf.c:371 lib/util/sudo_conf.c:424 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "неисправна вредност за %s „%s“ у „%s“, %u. ред" + +#: lib/util/sudo_conf.c:392 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "неподржани извор групе „%s“ у „%s“, %u. ред" + +#: lib/util/sudo_conf.c:408 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "неисправне највеће групе „%s“ у „%s“, %u. ред" + +#: lib/util/sudo_conf.c:569 +#, c-format +msgid "unable to stat %s" +msgstr "не могу да добијем податке о „%s“" + +#: lib/util/sudo_conf.c:572 +#, c-format +msgid "%s is not a regular file" +msgstr "„%s“ није обична датотека" + +#: lib/util/sudo_conf.c:575 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s је у власништву уиб-а %u, а треба бити %u" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is world writable" +msgstr "%s је светски уписив" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is group writable" +msgstr "%s је групно уписив" + +#: lib/util/sudo_conf.c:592 src/selinux.c:208 src/selinux.c:225 src/sudo.c:357 +#, c-format +msgid "unable to open %s" +msgstr "не могу да отворим %s" + +#: src/exec.c:160 +#, c-format +msgid "unknown login class %s" +msgstr "непозната класа пријаве %s" + +#: src/exec.c:173 +msgid "unable to set user context" +msgstr "не могу да подесим кориснички контекст" + +#: src/exec.c:189 +msgid "unable to set process priority" +msgstr "не могу да подесим приоритет процеса" + +#: src/exec.c:197 +#, c-format +msgid "unable to change root to %s" +msgstr "не могу да променим администратора на %s" + +#: src/exec.c:210 src/exec.c:216 src/exec.c:223 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "не могу да се пребацим у покрени_као уид (%u, %u)" + +#: src/exec.c:241 +#, c-format +msgid "unable to change directory to %s" +msgstr "не могу да променим директоријум у %s" + +#: src/exec.c:337 src/exec_monitor.c:526 src/exec_monitor.c:528 +#: src/exec_nopty.c:520 src/exec_pty.c:472 src/exec_pty.c:1184 +#: src/exec_pty.c:1186 src/signal.c:139 src/signal.c:153 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "не могу да подесим руковаоца за сигнал „%d“" + +#: src/exec_common.c:166 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "не могу да уклоним PRIV_PROC_EXEC из PRIV_LIMIT" + +#: src/exec_monitor.c:326 +msgid "error reading from socketpair" +msgstr "грешка у читању из пара прикључка" + +#: src/exec_monitor.c:338 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "неочекивана врста одговора на повратном каналу: %d" + +#: src/exec_monitor.c:423 src/exec_monitor.c:431 src/exec_monitor.c:439 +#: src/exec_monitor.c:446 src/exec_monitor.c:453 src/exec_monitor.c:460 +#: src/exec_monitor.c:467 src/exec_monitor.c:474 src/exec_monitor.c:481 +#: src/exec_monitor.c:488 src/exec_nopty.c:215 src/exec_nopty.c:224 +#: src/exec_nopty.c:231 src/exec_nopty.c:238 src/exec_nopty.c:245 +#: src/exec_nopty.c:252 src/exec_nopty.c:259 src/exec_nopty.c:266 +#: src/exec_nopty.c:273 src/exec_nopty.c:280 src/exec_nopty.c:287 +#: src/exec_nopty.c:294 src/exec_nopty.c:302 src/exec_pty.c:563 +#: src/exec_pty.c:568 src/exec_pty.c:635 src/exec_pty.c:642 src/exec_pty.c:743 +#: src/exec_pty.c:1029 src/exec_pty.c:1038 src/exec_pty.c:1045 +#: src/exec_pty.c:1052 src/exec_pty.c:1059 src/exec_pty.c:1066 +#: src/exec_pty.c:1073 src/exec_pty.c:1080 src/exec_pty.c:1087 +#: src/exec_pty.c:1094 src/exec_pty.c:1101 src/exec_pty.c:1446 +#: src/exec_pty.c:1456 src/exec_pty.c:1501 src/exec_pty.c:1508 +#: src/exec_pty.c:1533 +msgid "unable to add event to queue" +msgstr "не могу да додам догађај у ред" + +#: src/exec_monitor.c:540 +msgid "unable to set controlling tty" +msgstr "не могу да подесим контролисање tty" + +#: src/exec_monitor.c:548 src/exec_nopty.c:359 src/exec_pty.c:1261 +#: src/exec_pty.c:1280 src/exec_pty.c:1298 src/tgetpass.c:246 +msgid "unable to create pipe" +msgstr "не могу да направим спојку" + +#: src/exec_monitor.c:553 src/exec_nopty.c:377 src/exec_pty.c:1335 +#: src/tgetpass.c:250 +msgid "unable to fork" +msgstr "не могу да поделим" + +#: src/exec_monitor.c:639 src/exec_nopty.c:430 +msgid "unable to restore tty label" +msgstr "не могу да повратим tty натпис" + +#: src/exec_nopty.c:353 src/exec_pty.c:1193 +msgid "policy plugin failed session initialization" +msgstr "није успело покретање сесије прикључка политике" + +#: src/exec_nopty.c:419 src/exec_pty.c:1404 +msgid "error in event loop" +msgstr "грешка у петљи догађаја" + +#: src/exec_nopty.c:528 src/exec_pty.c:504 src/signal.c:101 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "не могу да повратим руковаоца за сигнал „%d“" + +#: src/exec_pty.c:143 +msgid "unable to allocate pty" +msgstr "не могу да доделим pty" + +#: src/exec_pty.c:1173 +msgid "unable to create sockets" +msgstr "не могу да направим утичнице" + +#: src/load_plugins.c:50 src/load_plugins.c:63 src/load_plugins.c:85 +#: src/load_plugins.c:115 src/load_plugins.c:123 src/load_plugins.c:129 +#: src/load_plugins.c:170 src/load_plugins.c:178 src/load_plugins.c:185 +#: src/load_plugins.c:191 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "грешка у „%s“, %d. ред приликом учитавања прикључка „%s“" + +#: src/load_plugins.c:87 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:125 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s мора бити у власништву уида %d" + +#: src/load_plugins.c:131 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s мора бити уписив само од стране власника" + +#: src/load_plugins.c:172 +#, c-format +msgid "unable to load %s: %s" +msgstr "не могу да учитам %s: %s" + +#: src/load_plugins.c:180 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не могу да пронађем симбол „%s“ у %s" + +#: src/load_plugins.c:187 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "непозната врста сигурности %d је пронађена у %s" + +#: src/load_plugins.c:193 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "пронађено је несагласно главно издање прикључка %d (очекивано је %d) у „%s“" + +#: src/load_plugins.c:202 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "занемарујем прикључак сигурности „%s“ у %s, %d. ред" + +#: src/load_plugins.c:204 +msgid "only a single policy plugin may be specified" +msgstr "може бити наведен само један прикључак сигурности" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "занемарујем удвостручен прикључак сигурности „%s“ у %s, %d. ред" + +#: src/load_plugins.c:228 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "занемарујем удвостручени У/И прикључак „%s“ у %s, %d. ред" + +#: src/load_plugins.c:331 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "прикључак сигурности %s не садржи метод провере_сигурности" + +#: src/net_ifs.c:173 src/net_ifs.c:190 src/net_ifs.c:335 src/sudo.c:476 +#, c-format +msgid "internal error, %s overflow" +msgstr "унутрашња грешка, прекорачење функције „%s“" + +#: src/parse_args.c:219 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "неисправан назив променљиве окружења: %s" + +#: src/parse_args.c:313 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "аргумент уз -C мора бити број већи или једнак 3" + +#: src/parse_args.c:480 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "не можете да наведете обе опције „-i“ и „-s“" + +#: src/parse_args.c:484 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "не можете да наведете обе опције „-i“ и „-E“" + +#: src/parse_args.c:494 +msgid "the `-E' option is not valid in edit mode" +msgstr "опција „-E“ није исправна у режиму уређивања" + +#: src/parse_args.c:496 +msgid "you may not specify environment variables in edit mode" +msgstr "не можете да одредите променљиве окружења у режиму уређивања" + +#: src/parse_args.c:504 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "опција „-U“ може бити коришћена само са опцијом „-l“" + +#: src/parse_args.c:508 +msgid "the `-A' and `-S' options may not be used together" +msgstr "опције „-A“ и „-S“ не могу бити коришћене заједно" + +#: src/parse_args.c:584 +msgid "sudoedit is not supported on this platform" +msgstr "„sudoedit“ није подржано на овој платформи" + +#: src/parse_args.c:657 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Само једна од опција -e, -h, -i, -K, -l, -s, -v или -V може бити наведена" + +#: src/parse_args.c:671 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s — уредите датотеке као други корисник\n" +"\n" + +#: src/parse_args.c:673 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s — извршите наредбу као други корисник\n" +"\n" + +#: src/parse_args.c:678 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Опције:\n" + +#: src/parse_args.c:680 +msgid "use a helper program for password prompting" +msgstr "користи програм испомоћи за упит лозинке" + +#: src/parse_args.c:683 +msgid "use specified BSD authentication type" +msgstr "користи наведену врсту БСД потврде идентитета" + +#: src/parse_args.c:686 +msgid "run command in the background" +msgstr "покреће наредбу у позадини" + +#: src/parse_args.c:688 +msgid "close all file descriptors >= num" +msgstr "затвара све описнике датотеке >= fd" + +#: src/parse_args.c:691 +msgid "run command with the specified BSD login class" +msgstr "покреће наредбу са наведеним разредом БСД пријаве" + +#: src/parse_args.c:694 +msgid "preserve user environment when running command" +msgstr "чува корисничко окружење приликом покретања наредбе" + +#: src/parse_args.c:696 +msgid "preserve specific environment variables" +msgstr "чува нарочите променљиве окружења" + +#: src/parse_args.c:698 +msgid "edit files instead of running a command" +msgstr "уређује датотеке уместо да изврши наредбу" + +#: src/parse_args.c:700 +msgid "run command as the specified group name or ID" +msgstr "извршава наредбу као наведени назив групе или ИБ" + +#: src/parse_args.c:702 +msgid "set HOME variable to target user's home dir" +msgstr "подешава променљиву ЛИЧНО у циљну корисничку личну фасциклу" + +#: src/parse_args.c:704 +msgid "display help message and exit" +msgstr "приказује поруку помоћи и излази" + +#: src/parse_args.c:706 +msgid "run command on host (if supported by plugin)" +msgstr "покреће наредбу на домаћину (ако је подржано прикључком)" + +#: src/parse_args.c:708 +msgid "run login shell as the target user; a command may also be specified" +msgstr "покреће љуску пријаве као крајњи корисник; наредба може такође бити наведена" + +#: src/parse_args.c:710 +msgid "remove timestamp file completely" +msgstr "потпуно уклања датотеку записа датума и времена" + +#: src/parse_args.c:712 +msgid "invalidate timestamp file" +msgstr "чини неисправном датотеку датума и времена" + +#: src/parse_args.c:714 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "исписује привилегије корисника или проверава посебну наредбу; користи се двапута за дуже записе" + +#: src/parse_args.c:716 +msgid "non-interactive mode, no prompts are used" +msgstr "немеђудејствени режим, не користи упите" + +#: src/parse_args.c:718 +msgid "preserve group vector instead of setting to target's" +msgstr "чува вектор групе уместо да подеси на циљеве" + +#: src/parse_args.c:720 +msgid "use the specified password prompt" +msgstr "користи упит наведене лозинке" + +#: src/parse_args.c:723 +msgid "create SELinux security context with specified role" +msgstr "ствара СЕЛинукс сигурносни контекст са наведеном улогом" + +#: src/parse_args.c:726 +msgid "read password from standard input" +msgstr "чита лозинку са стандардног улаза" + +#: src/parse_args.c:728 +msgid "run shell as the target user; a command may also be specified" +msgstr "покреће љуску као крајњи корисник; наредба такође може бити наведена" + +#: src/parse_args.c:731 +msgid "create SELinux security context with specified type" +msgstr "ствара СЕЛинукс сигурносни контекст са наведеном улогом" + +#: src/parse_args.c:734 +msgid "terminate command after the specified time limit" +msgstr "окончава наредбу након наведеног временског ограничења" + +#: src/parse_args.c:736 +msgid "in list mode, display privileges for user" +msgstr "у режиму списка, приказује привилегије за корисника" + +#: src/parse_args.c:738 +msgid "run command (or edit file) as specified user name or ID" +msgstr "покреће наредбу (или уређује датотеку) као наведени корисник" + +#: src/parse_args.c:740 +msgid "display version information and exit" +msgstr "приказује податке о издању и излази" + +#: src/parse_args.c:742 +msgid "update user's timestamp without running a command" +msgstr "освежава кориснички запис датума и времена без покретања наредбе" + +#: src/parse_args.c:744 +msgid "stop processing command line arguments" +msgstr "зауставља обрађивање аргумената линије наредби" + +#: src/selinux.c:78 +msgid "unable to open audit system" +msgstr "не могу да отворим аудит систем" + +#: src/selinux.c:88 +msgid "unable to send audit message" +msgstr "не могу да пошаљем аудит поруку" + +#: src/selinux.c:116 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "не могу да добавим контекст отворене датотеке %s" + +#: src/selinux.c:121 +#, c-format +msgid "%s changed labels" +msgstr "%s измењена натписа" + +#: src/selinux.c:126 +#, c-format +msgid "unable to restore context for %s" +msgstr "не могу да повратим контекст за %s" + +#: src/selinux.c:167 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "не могу да отворим %s, није тту за поновно натписивање" + +#: src/selinux.c:171 src/selinux.c:212 src/selinux.c:229 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "„%s“ није знаковни уређај, није конзола за поновно натписивање" + +#: src/selinux.c:180 +msgid "unable to get current tty context, not relabeling tty" +msgstr "не могу да добавим текући тту контекст, није тту за поновно натписивање" + +#: src/selinux.c:187 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "непознат разред безбедности „chr_file“, није тту за поновно натписивање" + +#: src/selinux.c:192 +msgid "unable to get new tty context, not relabeling tty" +msgstr "не могу да добавим нови тту контекст, није тту за поновно натписивање" + +#: src/selinux.c:199 +msgid "unable to set new tty context" +msgstr "не могу да подесим нови тту контекст" + +#: src/selinux.c:273 +#, c-format +msgid "you must specify a role for type %s" +msgstr "морате да наведете улогу за врсту %s" + +#: src/selinux.c:279 +#, c-format +msgid "unable to get default type for role %s" +msgstr "не могу да добавим основну врсту за улогу %s" + +#: src/selinux.c:297 +#, c-format +msgid "failed to set new role %s" +msgstr "нисам успео да подесим нову улогу %s" + +#: src/selinux.c:301 +#, c-format +msgid "failed to set new type %s" +msgstr "нисам успео да подесим нову врсту %s" + +#: src/selinux.c:313 +#, c-format +msgid "%s is not a valid context" +msgstr "%s није исправан контекст" + +#: src/selinux.c:348 +msgid "failed to get old_context" +msgstr "нисам успео да добавим стари_контекст" + +#: src/selinux.c:354 +msgid "unable to determine enforcing mode." +msgstr "не могу да одредим режим присиљавања." + +#: src/selinux.c:371 +#, c-format +msgid "unable to set tty context to %s" +msgstr "не могу да подесим тту контекст на %s" + +#: src/selinux.c:410 +#, c-format +msgid "unable to set exec context to %s" +msgstr "не могу да подесим извршни контекст за %s" + +#: src/selinux.c:417 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "не могу да подесим контекст стварања кључа за %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "захтева барем један аргумент" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "неисправан број описника датотеке: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "не могу да покренем „%s“ као шкољку пријављивања" + +#: src/sesh.c:125 src/sudo.c:1117 +#, c-format +msgid "unable to execute %s" +msgstr "не могу да извршим %s" + +#: src/signal.c:83 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "не могу да сачувам руковаоца за сигнал „%d“" + +#: src/solaris.c:76 +msgid "resource control limit has been reached" +msgstr "ограничење контроле ресурса је достигнуто" + +#: src/solaris.c:79 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "корисник „%s“ није члан пројекта „%s“" + +#: src/solaris.c:83 +msgid "the invoking task is final" +msgstr "задатак призивања је завршни" + +#: src/solaris.c:86 +#, c-format +msgid "could not join project \"%s\"" +msgstr "не могу да приступим пројекту „%s“" + +#: src/solaris.c:91 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "не постоји депо извора који прихвата основне пречице за пројекат „%s“" + +#: src/solaris.c:95 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "наведени депо извора не постоји за пројекат „%s“" + +#: src/solaris.c:99 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "не могу да се повежем са основним депоом извора за пројекат „%s“" + +#: src/solaris.c:105 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "подешавање пројекта није успело за пројекат „%s“" + +#: src/solaris.c:107 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "упозорење, није успело додељивање контроле ресурса за пројекат „%s“" + +#: src/sudo.c:198 +#, c-format +msgid "Sudo version %s\n" +msgstr "Судо издање %s\n" + +#: src/sudo.c:200 +#, c-format +msgid "Configure options: %s\n" +msgstr "Опције подешавања: %s\n" + +#: src/sudo.c:208 +msgid "fatal error, unable to load plugins" +msgstr "кобна грешка, не могу да учитам прикључке" + +#: src/sudo.c:216 +msgid "unable to initialize policy plugin" +msgstr "не могу да започнем прикључак сигурности" + +#: src/sudo.c:260 +msgid "plugin did not return a command to execute" +msgstr "прикључак није вратио наредбу за извршавање" + +#: src/sudo.c:276 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "грешка приликом покретања У/И прикључка %s" + +#: src/sudo.c:299 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "неочекивани судо режим 0x%x" + +#: src/sudo.c:461 +msgid "unable to get group vector" +msgstr "не могу да добавим вектор групе" + +#: src/sudo.c:523 +#, c-format +msgid "unknown uid %u: who are you?" +msgstr "непознати уид %u: ко сте ви?" + +#: src/sudo.c:579 +msgid "unable to determine tty" +msgstr "не могу да одредим конзолу" + +#: src/sudo.c:867 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s мора бити власништвo уида %d и треба да има подешен бит „setuid“" + +#: src/sudo.c:870 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "стварни уид није %d, већ %s на систему датотека са подешеном опцијом „nosuid“ или је НФС систем датотека без администраторских привилегија?" + +#: src/sudo.c:876 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "стварни уид није %d, већ сетуид администратор инсталиран судоом?" + +#: src/sudo.c:929 +msgid "unable to set supplementary group IDs" +msgstr "не могу да подесим додатне ИБ-ове групе" + +#: src/sudo.c:936 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "не могу да подесим ефективан гид да се покрене_као гид %u" + +#: src/sudo.c:942 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "не могу да подесим гид да се покрене као гид %u" + +#: src/sudo.c:999 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "неочекивани услов завршетка потпроцеса: %d" + +#: src/sudo.c:1145 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "прикључак сигурности %s не садржи метод „check_policy“" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "прикључак сигурности %s не подржава привилегије исписивања" + +#: src/sudo.c:1180 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "прикључак сигурности %s не подржава опцију -v" + +#: src/sudo.c:1195 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "прикључак сигурности %s не подржава опције -k/-K" + +#: src/sudo_edit.c:178 src/sudo_edit.c:267 +msgid "unable to restore current working directory" +msgstr "не могу да повратим текући радни директоријум" + +#: src/sudo_edit.c:574 src/sudo_edit.c:686 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: није обична датотека" + +#: src/sudo_edit.c:581 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: уређивање симболичких веза није допуштено" + +#: src/sudo_edit.c:584 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: уређивање датотека у уписивом директоријуму није допуштено" + +#: src/sudo_edit.c:617 src/sudo_edit.c:724 +#, c-format +msgid "%s: short write" +msgstr "%s: кратак упис" + +#: src/sudo_edit.c:687 +#, c-format +msgid "%s left unmodified" +msgstr "%s је остао неизмењен" + +#: src/sudo_edit.c:700 src/sudo_edit.c:885 +#, c-format +msgid "%s unchanged" +msgstr "%s је непромењен" + +#: src/sudo_edit.c:713 src/sudo_edit.c:735 +#, c-format +msgid "unable to write to %s" +msgstr "не могу да упишем у %s" + +#: src/sudo_edit.c:714 src/sudo_edit.c:733 src/sudo_edit.c:736 +#: src/sudo_edit.c:910 src/sudo_edit.c:914 +#, c-format +msgid "contents of edit session left in %s" +msgstr "садржај сесије уређивања је остао у %s" + +#: src/sudo_edit.c:732 +msgid "unable to read temporary file" +msgstr "не могу да прочитам привремену датотеку" + +#: src/sudo_edit.c:815 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: унутрашња грешка: непарн број путања" + +#: src/sudo_edit.c:817 +msgid "sesh: unable to create temporary files" +msgstr "sesh: не могу да направим привремене датотеке" + +#: src/sudo_edit.c:819 src/sudo_edit.c:917 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: непозната грешка „%d“" + +#: src/sudo_edit.c:909 +msgid "unable to copy temporary files back to their original location" +msgstr "не могу да умножим привремене датотеке назад на њихова првобитна места" + +#: src/sudo_edit.c:913 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "не могу да умножим неке од привремених датотека назад на њихова првобитна места" + +#: src/sudo_edit.c:958 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "не могу да променим уид у администратора (%u)" + +#: src/sudo_edit.c:975 +msgid "plugin error: missing file list for sudoedit" +msgstr "грешка прикључка: недостаје датотеа списка за уређивање судоа" + +#: src/sudo_edit.c:1016 src/sudo_edit.c:1029 +msgid "unable to read the clock" +msgstr "не могу да прочитам сат" + +#: src/tgetpass.c:107 +msgid "no tty present and no askpass program specified" +msgstr "тту не постоји и није наведен програм за пропуштање" + +#: src/tgetpass.c:116 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "није наведен програм за пропуштање, покушајте да подесите SUDO_ASKPASS" + +#: src/tgetpass.c:261 +#, c-format +msgid "unable to set gid to %u" +msgstr "не могу да подесим гид у %u" + +#: src/tgetpass.c:265 +#, c-format +msgid "unable to set uid to %u" +msgstr "не могу да подесим уид у %u" + +#: src/tgetpass.c:270 +#, c-format +msgid "unable to run %s" +msgstr "не могу да покренем %s" + +#: src/utmp.c:268 +msgid "unable to save stdin" +msgstr "не могу да сачувам стандардни улаз" + +#: src/utmp.c:270 +msgid "unable to dup2 stdin" +msgstr "не могу да дуп2 стандардни улаз" + +#: src/utmp.c:273 +msgid "unable to restore stdin" +msgstr "не могу да повратим стандардни улаз" + +#~ msgid "error reading from signal pipe" +#~ msgstr "грешка у читању из спојке сигнала" + +#~ msgid "error reading from pipe" +#~ msgstr "грешка у читању из спојке" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "унутрашња грешка, покушах да доделим нула бајта" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "не могу да подесим терминал у сирови режим" + +#~ msgid "unable to open socket" +#~ msgstr "не могу да отворим утичницу" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "унутрашња грешка, покушах да обавим „emalloc2(0)“" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "унутрашња грешка, покушах „ecalloc(0)“" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "унутрашња грешка, покушах да обавим „erealloc(0)“" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "унутрашња грешка, покушах да обавим „erealloc3(0)“" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "унутрашња грешка, покушах да обавим „erecalloc(0)“" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "учитај_сучеља: откривено је прекорачење" + +#~ msgid "value out of range" +#~ msgstr "вредност је изван опсега" + +#~ msgid "select failed" +#~ msgstr "избор није успео" diff --git a/utsudo-0.0.2/po/sv.mo b/utsudo-0.0.2/po/sv.mo new file mode 100644 index 0000000000000000000000000000000000000000..a8b82e5b20e274da78ffd61e1b93f278e98167c3 GIT binary patch literal 19364 zcmbuGd$b)@ea8nCiWd-65CO#jye5&HkcSVrA&@5+NKE7=6m2WaJ!kH@lXK3@VP?)v z0t)zSZ56eMMJYaN;-jL)Vk2l%xb8aD^Txn;f#-pTz~$iQ!KZ@% z4xSDkcbey|2A=^w6TA{U3%mim0K5rQz4w4m1Mdf)3w|Cv8~iu$Mc@f^dNQ~HJQ2JK zJOP{pC%{*L7lLC)TIU{3*G0p12ipw{tyQ1d$Z>7I8n zxEef1@4jYY0yUqXf@{FDS=TfhfF_4hMS<6c0cmEcZL^SR009|m8{ z{g*+_cMN8(11|?J0yFT1;0HkQ?Hi!#9na)N#|cn$n*zm`w}U=-KX@+q6;Snl3~GMo zAfy`a1z-#8gQD-dLCx<0Q2l)u)H+V*8|237w% zLDhQ$sP*0pt_Hsbt_4qgj_q$fsP%>5W#HW)OZ2|!@FyTs@lNwC-CLl>y%OY~_e%b- zH1AeWf!_hu??pUBG`tuT9bOMgUhV;5rS~}y5%j*{@CTskJ&{HE;IlyK z!3I$C-2rO6*MgF_kAVF1{*gZ#=TQ(9@=j+E$-(nL&2tB+_cNfzy#<7H-aA2!_eoIo zzX*!|KL&m90+dH|-U^DJLr`?O3sgV%gX;eap!D{8AWQK63*?`7Hl1pHmxH3`9#H(e z5!Cp1gX;f5&r207*WGdc9P({UuQ2{|wZ8 zFJN(6-!}fpz9kNC1uy0Pt)SNPH=yM4hYl}bGScU3LA`$q_~>z-_X%)}`}-JNdh;1j z^8Bx$)^RouMc37!`r8R=9k+p^)4M^@=>hlrYoO@!Bao$fPe$ofe+~Fz@M=)=ejRus zcn5d_`1|1H;0Hj>^It&G>1>1rlkBYlMenWPHt>2-@^BbD1v~=Y0sbW@x?aa3`03pY zN>4rtijLn0`RAPmk@bEPD7xMVN}lcjWrrRB-v~YeZUS=_zaBgSiZ1^FLOSn6jG7Ow z1I4dBp!&THgaqDwp!oVNQ2n07AN8{l+yK4`8r@*I!{|qt} z??<5Mb0I|6`d$tiJpk426QJh#O;Ge2LufS4RiN763T^=(1l9k~K=pS4l{NpDftvr# z;F;i^;CbN3z-NPh2dds9p!j&^M%sXvg6j8n@C@+Fp!oDKsCoU|-7kmun(yVH*3|~p z|9(*Oc^CLh@UtMK@xBfsy58w91J-+2fIj$YQ1pBccslqXDEazZ@I3IpLCxrxeM92F!sQLKYtsLzDr5A4o z$H9j{AAA@@g}f(UW&OuyhkHO?dDEck-3N-FUvhW~La+X|gUy+Ypiu)lx>Ut{Wqvn^Tjr(cn5W5@E@Lu=(Hyuto6kpy(c@;%#ki0&D@+8VW3M@4` z)B#seBo}`|nWfxE(FK`|eE%AFqaJX*oFX0n2;~!$^C+U3u0s|U{O$7OkKI$rN^yOFABd9odz4!#QxshfS}?NxNBsVjyBDvYMwxN<@vMsuPg>on5S9QbnF^c3?vU-@ZpYlG+kdja?pkTVZH&Av`it9pt z+(Vh5yq5A_%1bG_uCZYB?4bKC_)zWlx$bux{6orlKF+NcPKc85>fV2K1g{BMb~drq<6Y@QQl2C zkusv(K)IcwOFF0P)s)N3FZ<_3z-{h+ox`)h1C){9Y;d;9TZx475 zWg}%h<+mtTQck4|D4(P}KzSYIWXc-KW{OWajq*E`l=4Q(6Dhi`w&48%m{VRzdA)lk zxQWuETu1pZWjp0`%5KUlDc;zwVIC!MHZkUnXMW2MJ5laWNBuDK1OCNHJ`<+?C=1iE zqQ-%+J<3Br@Y~5?5X7CuE4F8XxEpr-elQjGGj$$iem6}Twi1dU7+KP59%YXbEDPNM!jI#gMa{S0_rt zcAlgMMSqcW7^Z_L&&_fs48PShJ2;q1`cd2OM{&>aYGGZ=sCjgs5Gm8#3>bP_l6X4m zj#3EZB;Ac6^3DS-q#lumq2_jo=l>xNQdg{@i3Hy-NYxk23<>>bfHxTBmokl|# zkolKw@Z-_IGm;tSnTTQ3EekWV93yUU59YRwbc*0p5t705JK=ON>PsWCWR$j9Mv^cF zvl*tzK3MFZKc1amYq&3=tL8gMfZ|SW+Y!a11Bh08geD%;a-=H$e#qgMr1sMU6>UGh zHu=F}=yjrO*oSeVh(BO)K^Ka!jPO8|mv0LuMlp*R1hPU^rJ5Ov;w%^IpjJAHV+m_% zdc1IYnx#kRjTFX7_;_cfexf$&(()lYNG}7sL(9r^i{ZW?+ zhNETma5ju{swBg*3)CKCcaxfIzi3y{4EeE*B=UM^#W-pA!h9G+sW%-kn31Y3%Z|hS zg$T@hlVA^>aMa$2RB9vnkgQg{6>lU3_6_Uz&0JPu!esL$%37tHYv!T0NvcV9Mnmk6 z1hlpkQD7da7Hct-={i`f|EP_Qp=u0Qu=1FF%v2%F73Yo8$s>AEj0+qhx>}gy*&x^l zcMIW$v&+K+STF1?Y+gaz5sF}yJVNbKSt>^%2`mk#`^kQ~wr*^9fKKvr6dGx0(qdFr z3**@+P2zzhWHv}6L+UsfgvLh{oykAcERw9zRG2oZ41xpJOJ_$N&&;SC-Of+8h$Sqf zemPAsH;=Fgc`z6nCG!lWMa*ScO}UJboeA4L)YloLHj-${VtrxN-tTTSMT05IjLraTk!W2_|SGX>fj@J z(X_ZhyB*@%B(TmR%R+OX$-HHl^#wMWK1z3t5gI0Gz&t9)Y-ECw;+ByJq97SGD}I_7 zPH0HK0bZ4*cRUk&Ko|y<+%;r>fx~oS*}*)@ouq^osjOlVyrGYwjp#gA)kx!nKZx*3 zG9Jb-Ng=c_88#VbuQ@Dy=eZ3q(2D-3V**66@OoEs5au&U=P2#6(Gb#L;TTH;R~mN= zjbzhXy^C5`7oo$kwjts$k;=mQxR8Pd>ivdxZ8gjAYl|$$nZm-MN3k=|#=Ch#Bq>Z` ztqp@`Ol`z5>1ycM{}g#Lb#f7(mgE zXN*64gg!oy$5z_mzlXOkrF1!>SH=V@wBsnX+H6jI**aN`?OPk|s3_i5l`ZL)sEt`x z?Wv&MQ@xnU)#gAjF_W;$<yuw^_X!wHb$g!? zDfP7|HL#pFt6E>vQz>@P&k}7q%H^0oe(~1G>C6NISa(Ace$v5I7|)=X3->mYdA4Td z!d+NcSu?ZsD683!+y)`z9UkZYOLpztR=K89!p%Cd{WA&t!z8LMB47eqr%em&X}Nr4 zs2&WL7RVUlg?2d0lcD6Rt#}&)QQYvhTO(0}&cuF1BdW-%)p9w1Cc zE#xd*&Anw!by@6F(|Lm;HWXLc#&YC_T8? zn;~g|syDk!uK89vB}83N!36V5yyG!yk2Y#cv0TZ5@zIKfUFfZ;;Zt-V5z@Z6=}?M%KDxPQBW# zb}#H8b*+o-F)kM{*h~3OiMFytW%rvWMn{(_Pm+pREP*$6<+4{K5O*K?9 z#PK!6)IE8Om6%$=NGUtJzpagA-YFL7Ox2!B5z9z-{`01oEqIIRBDvA7Gl0}mXkt~j z$v1JtkU$mxUoFo?61%V2e(m+Uui3Tb`fb;3+hRAR=Gl(zJGbv?)W=d2>^gQDL*Aec zX5UtDyeFGu%ug9oFVY#7tJB9ci`h0;#C~j%dZf3AKO45D7;e6B7tbXjCQVuIj=-Tg zXY)W#K5$Wh@!Pc~nbLocHBD1#{zS46y|HrO(k=CF^|HvqU~>iuQ7J@lj<8V^b+W-4 zF41OOD=x~3SLv3nvwplMt;@~$XkJfJ{gQ=@+n|Ozb6qTG_}E=PCXwj97h(@&=ag3} zBx$i}%+v9Ct8i3;S`lWtVeqsD#RmOQ@vgRXHn`lrwQf>Xt7bxE^%qdWxsnBxFrmDg zdwpIx5qGl_!p-)KaYs&kt^Jg+H!5l$N{H#^P-Z6DWS{V6Hgj4~OiAS=COaTCDXXU8 zkX){@n-Er^vV3kF_UBhLDKI$?fAxX!19V}7!de7ur)D3!O`^>lbGg6W=PzL;tGLbb#f6HCo!+$6dqPJ=XIqTsq>3=ryZcz12Q-!POoQy zZ9*nb$hB!7=~egHfQ+QKKS-5GU0DUtPVcc#GL9yXv{d+gFd4DgH^Hh6wB5EzIe>tJ zogfQ6)hQxcyCCxToFysZApnkw0Jscmvtw?O6_M-WP3k+}A``}WMm&?#jDm{lD5~3T@xx@(b}0|uv(i(-K@1Ineb=w ze3(sKbkWqPdsEc!2dmU-)&6X3_pa78oNOu6-`a|_P55h9ueqePW_4@r3;Z=NoLIg3 z!qsb6uO8dMPP(-x4dRSlMnZOOGK8cgdSm~ZAmjWAYwus0g;QyeZR`$6<*s7$aT)F6 z?ubl#Yfl&qXtke>K{n%Gnh#sq>_#P3l5~~1S(SxVb(S?dwsZT=ZPhy0tXe&`MWIy8 zL=ephEW?5PB6dAdyxtttVbnJ4-E&3j;;Nn|JRPR3ZRA9i4x8{V=KN~xIzyQW-x7-i zoL!fs-fR!iHWLQ>jp_UB3h=JksyTE`oE+uEEYy+M%n=&H45i ziO5*Zq;`Uelhj=R&*rf@5{b(h_AqdGFvA>6Ty%WyaBfa%=e2i7su}cx6mbuJh**m> zD>&I;%LGgy8)}A@vG%TZr;f&FWYbPSeVwmvv(%JG&id|69Qa2$W+mZ--{7Rxa6?D+ znKvo>R-Rnw*tREP6-TQ^)ZE!>4>Hb*m58N?#sV`f^9aU?qt!4cb!F88loO<}nHT!f znw;NmI-NTVk*jmomA;)HVrUOq5jQQ)9<{b+_Q6tZGdwYuNL3=IL^Y?aXpBx431LRao8l{;%d)4Cc z^83PG?tlBXd&V>V)SGwb4&$IX?O9k0p%@0fJBe*&bBB6iivDI!?@Tk8!rqERX@bXo zJPq(+9*&0a#L$T;boh)ytCEHUvsr(X2eyXeHt8^&pF4!DSDLR3R+$KCOU}#I!JL}0 zGY6wR&M^3Pf{j5b^E#H*4XQnaGHL?L+`+8qR0s%Uw5PNDs1(?Vgqm?g+p3zf7!fJS zTL>j*J6#AFruKYxiD~eyiS_2i5iMSWl(G){?WY&^q;@*wD+1P!}n!xJz*SlaQ&tlJGZT_4yxIz^Oy#*F%-48RW*hS1M@`|Z8KM6MH9}5WbxMr?<; zm2(nKWMsyo{=T^*Hl8+Hy{xL#u)7=_4BU}&IUtg7B*nVR6(D0aj7cABY&*kh7&l`> z4i>c-ugjUMQje{VjCUuKBo2mQpNV>kgEbM6P9YnnzrmZ*@94-%a%Sw5+mm7Ei-@lB zZ}}|r!PMJRXfX@M$7IZvYQm(#U1b~#-&O1tt#v1206n6 z7aMN6)hSx(k7T~=>9kRl!kx;A$yT8|X1iuy8Y(XEU3R20*s=LQ1f__2tdMz_sn8u& zTl?xHU4xL;n>$S4>=u)GM6bqoFQz>`6Fn>RXv()eq?VE^Ca#EXs6<|=hk68M8^nA< zp2V`&tW0|@b1sqvJrY#zY_~ZGGKAjgq*`XB2*K)yye(qs^2B;UWBCx%O5*L*)PzDt z!sZP>8xTA_1ZinL7#-e#vib64w z7FioluA~Y`jaW89Ob;_Kr2u=Lg-}i>_e^|?tLH3)U5aF|I3i;rU6>nN|8Jzt>Yze5 z*$kgeT0D2S<4(3Czo(=*e39Qb+7WnWgILU%FN91mUXQg_m|(=&h{{|Udu(fO-#V`s zqy8pjB(qq9^*jj%%28B>ws(hqlwqQ;PR?KUn;6ofW^JU*b ziVOR|KB+6ilVORKw6Kjt%i25QT7qi^k|5NW%g32@#TWgcV#eGU1cPBH_=`5Sr`a_( zIpL2wMEcf0WphV*5CDV8VYCj&YXOQ4!%M@6)j>3Etwft8<8+lVwX)7i&B1r8@SHWN zuPs&|j}DxXrML0`yrFrEn`|p04L@KvG{!V7-p0iLK1!=2k)YHZ%xzXmd1XN@^G$aW z4fqU)bpmdWz}(2YOqZWr2MA7OI<|uO`h>gd85(Zaunm5s!`@`L0Ww(dIdpH17ojrI&QNM z#$HKC71KyXIEQ31Xm4%{zGvucDI7)==qa z@*~)c((|)RlT|axfSOEdjW}L2y%{E8_8ayVEvauv*(N7!G-X`b6fgQl$LY1c)gASV z0Kkkf-q<6%8Y!pXOTRU57CBU3IFdOE(T2M^SC{S^2KSO7dnU3^YF2 zl+P+=l2jN$T~$@oDSHn^Vin>@Ibj9~^r`Gx6P6b-9`vaXE#pXjuD($7q<-)&U2byH zM0dsUJF;)`8Foie;}e0c^xu9(Q%wxP8z`{u7nrNway%q_aH^D9ll!l{>{tldtnZ`;ttB2|Czj8AL$*ttp)**t?> z2LT-F)2M7hrUfVYO5fFv^2^yOGs@0SfuQ`1`8vZgwJCaydW8%H>69{JHse}fN~1PT zOlqR-7Bj9L?bp`cXy6X`$=EJF%|iZ+P8DQt^dOmYS@!z0Dy^$bL-EWW04xlB>g|=( zA!m0C>#;Q#ooLo$cNP!;mSR?Mwpy^ORlTydn;kyir?O>I)V4sy3qBIl6tOOZm+>+t zs#558@pcrVxY#OS|bsy5SB%JO0A~(R6xCsj~bM8630wc!w81;KDu49 z?$V?$#Gp2GF+tOLOd5_XpOU(U9%f24^IL1zv{_5c+R@&9bWj)7T2IOuv3HX6YfuyO zx3+JcXt;t}{hFy<%vINFmQHv{Qk5o32^2?)`dTn6h-W^ssotit6I&m^9N3t^ey%`t zRXQ9)&}Ivhk#H?|lPGzkZy*TZVjF*E{I8ro=OyMN1oxhU3u3fPe#C5dQ1`%orBHUD zD7R%?ul-2D#PG__Huo;F`RVc;zg>{^R13RBbzywv zXo^zKdFAdzlkHhbSs2^Hwdi4B;_Id`+X!j_S>G6|*HR zj64a3+^aw7bJ)j|;Poqjg5LWSI#*m04|74w(w| zoeKZKt+}y@;9|M4G5ZuYFtCUOtoOLu>QKo)THASv5@f|C62ucD+h#, 2012. +# Sebastian Rasmussen , 2016, 2017, 2018, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 15:00+0200\n" +"Last-Translator: Sebastian Rasmussen \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2.3\n" +"X-Poedit-Bookmarks: -1,0,-1,-1,-1,-1,-1,-1,-1,-1\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "kunde inte öppna användardatabasen" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "kunde inte växla till registret ”%s” för %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "kunde inte återställa registret" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "kunde inte allokera minne" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Okänd signal" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "ogiltigt värde" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "värde för stort" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "värde för litet" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "ogiltigt Path-värde ”%s” i %s, rad %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "ogiltigt värde för %s ”%s” i %s, rad %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "gruppkälla ”%s” stöds ej i %s, rad %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "ogiltigt största antal grupper ”%s” i %s, rad %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "kunde inte ta status på %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s är inte en vanlig fil" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s ägs av uid %u, ska vara %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s är skrivbar för alla" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s är skrivbar för gruppen" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "kunde inte öppna %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "okänd inloggningsklass %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "kunde inte ställa in användarens kontext" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "kunde inte ställa in processprioritet" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "kunde inte ändra rot till %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "kunde inte ändra till runas uid (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "kunde inte ändra katalog till %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "kunde inte ställa in hanterare för signal %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "kan inte ta bort PRIV_PROC_EXEC från PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "fel vid läsning från uttagspar" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "oväntad svarstyp i bakkanal: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "kunde inte lägga till händelse till kö" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "kan inte ställa in kontrollerande tty" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "kunde inte skapa rör" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "kan inte ta emot meddelande från förälder" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "kunde inte grena process" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "kan inte återställa tty-etikett" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "kunde inte köra %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "policyinsticksmodul misslyckades att initiera session" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "fel i händelseslinga" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "kunde inte återställa hanterare för signal %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "kunde inte allokera pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "kunde inte skapa uttag" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "kan inte skicka meddelande till övervakningsprocess" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "fel i %s, rad %d under inläsning av insticksmodul ”%s”" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s måste ägas av uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s får endast vara skrivbar av ägaren" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "kunde inte läsa in %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "kunde inte hitta symbol ”%s” i %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "okänd policytyp %d hittad i %s" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "inkompatibel huvudversion %d för insticksmodul (%d förväntades) hittad i %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ignorerar policyinsticksmodul ”%s” i %s, rad %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "bara en policyinsticksmodul kan anges" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ignorerar dubblerad policyinsticksmodul ”%s” i %s, rad %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ignorerar dubblerad I/O-insticksmodul ”%s” i %s, rad %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "policyinsticksmodul %s inkluderar inte en check_policy-metod" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "internt fel, %s spill" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "ogiltigt namn på miljövariabel: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "argumentet till -C måste vara ett tal större än eller lika med 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "du får inte ange flaggorna ”-i” och ”-s” samtidigt" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "du får inte ange flaggorna ”-i” och ”-E” samtidigt" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "flaggan ”-E” är inte giltig i redigeringsläget" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "du får inte ange miljövariabler i redigeringsläget" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "flaggan ”-U” får bara användas med flaggan ”-l”" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "flaggorna ”-A” och ”-S” får inte användas tillsammans" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit stöds inte på denna plattform" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Endast en av flaggorna -e, -h, -i, -K, -l, -s, -v eller -V får anges" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - redigera filer som en annan användare\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - kör ett kommando som en annan användare\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Flaggor:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "använd hjälpprogram för att fråga efter lösenord" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "använd angiven BSD-autentiseringstyp" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "kör kommando i bakgrunden" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "ring i klockan vid fråga" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "stäng alla fildeskriptorer >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "kör kommando med den angivna BSD-inloggningsklassen" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "bevara användarens miljö när kommandot körs" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "bevara specifika miljövariabler" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "redigera filer istället för att köra ett kommando" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "kör kommando som angivet gruppnamn eller ID" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "ställ in HOME-variabeln till målanvändarens hemkatalog" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "visa hjälpmeddelande och avsluta" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "kör kommando på värd (om det stöds av instick)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "kör ett inloggningsskal som målanvändaren; ett kommando kan också anges" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "ta bort tidsstämpelfil helt" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "ogiltigförklara tidsstämpelfil" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "lista användarens rättigheter eller kontrollera ett specifikt kommando; använd två gånger för längre format" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "icke-interaktivt läge, inga frågor ställs" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "behåll gruppvektor istället för att ställa in den till målets" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "använd angiven lösenordsprompt" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "skapa SELinux-säkerhetskontext med angiven roll" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "läs lösenord från standard in" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "kör skal som målanvändaren; ett kommando kan också anges" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "skapa SELinux-säkerhetskontext med angiven typ" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "avsluta kommando efter den angivna tidsgränsen" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "i listläge, visa rättigheter för användaren" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "kör kommando (eller redigera fil) som angivet användarnamn eller ID" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "visa versionsinformation och avsluta" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "uppdatera användarens tidsstämpel utan att köra ett kommando" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "sluta behandla kommandoradsargument" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "kan inte öppna granskningssystem" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "kan inte skicka granskningsmeddelande" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "kan inte köra fgetfilecon på %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s ändrade etiketter" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "kan inte återställa kontext för %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "kan inte öppna %s, ometiketterar inte tty" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s är inte en teckenenhet, ometiketterar inte tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "kan inte hämta aktuell tty-kontext, ometiketterar inte tty" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "okänd säkerhetsklass ”chr_file”, ometiketterar inte tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "kan inte hämta ny tty-kontext, ometiketterar inte tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "kan inte ställa in ny tty-kontext" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "du måste ange en roll för typen %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "kunde inte få tag på standardtyp för rollen %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "misslyckades med att få tag på ny kontext" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "misslyckades med att ställa in nya rollen %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "misslyckades med att ställa in nya typen %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s är inte en giltig kontext" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "misslyckades med att få tag på gammal kontext" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "kan inte fastställa påtvingande läge." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "kunde inte ställa in tty-kontext till %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "kunde inte ställa in körkontext till %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "kan inte ställa in kontext för nyckelskapande till %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "kräver minst ett argument" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "ogiltigt fildeskriptornummer: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "kunde inte köra %s som ett inloggningsskal" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "kunde inte spara hanterare för signal %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "begränsning för resurskontroll uppnådd" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "användaren ”%s” är inte medlem av projekt ”%s”" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "den startande uppgiften är den sista" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "kunde inte gå med i projekt ”%s”" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "ingen resurspool som accepterar standardbindningar existerar för projekt ”%s”" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "angiven resurspool finns inte för projekt ”%s”" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "kunde inte binda till standardresurspool för projekt ”%s”" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "setproject misslyckades för projekt ”%s”" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "varning, tilldelning av resurskontroll misslyckades för projekt ”%s”" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo version %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Konfigurationsflaggor: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "ödesdigert fel, kunde inte läsa in insticksmoduler" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "kan inte initiera policy-instick" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "insticksmodul returnerade ett kommando att exekvera" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "fel vid initiering av I/O-insticksmodul %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "oväntat sudo-läge 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "du existerar inte i %s-databasen" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "kan inte detektera tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s måste ägas av uid %d och ha setuid-biten inställd" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "effektivt uid är inte %d, är %s på ett filsystem med flaggan ”nosuid” inställd eller ett NFS-filsystem utan root-rättigheter?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "effektivt uid är inte %d, har sudo installerats som setuid root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "kan inte ställa in kompletterande grupp-ID:n" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "kunde inte ställa in effektiv gid till runas gid %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "kunde inte ställa in gid för runas gid %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "oväntat barnavslutsvillkor: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "policyinsticksmodul %s saknar metoden ”check_policy”" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "policyinsticksmodul %s har inte stöd för att lista rättigheter" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "policyinsticksmodul %s har inte stöd för flaggan -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "policyinsticksmodul %s har inte stöd för flaggorna -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "ingen skrivbar temporärkatalog hittad" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "kunde inte återställa aktuell arbetskatalog" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: inte en vanlig fil" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: att redigera symboliska länkar är inte tillåtet" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: att redigera filer i en skrivbar katalog är inte tillåtet" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: kort skrivning" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s lämnad oförändrad" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s oförändrad" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "kunde inte skriva till %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "innehåll av redigeringssession finns kvar i %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "kunde inte läsa temporärfil" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: internt fel: udda antal sökvägar" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: kunde inte skapa temporärfiler" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: okänt fel %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "kan inte kopiera temporära filer tillbaka till deras originalplats" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "kan inte kopiera vissa av de temporära filerna tillbaka till deras originalplats" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "kunde inte ändra uid till root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "insticksfel: fillista för sudoedit saknas" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "kunde inte läsa klockan" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "tidsgräns löpte ut vid lösenordsinläsning" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "ingen lösenord angavs" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "kan inte läsa lösenord" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "en terminal krävs för att läsa lösenordet; använd antingen flaggan -S för att läsa från standard in, eller konfigurera en askpass-hjälpare" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "inget askpass-program angivet, prova att ställ in SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "kunde inte ställa in gid till %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "kunde inte ställa in uid till %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "kunde inte köra %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "kunde inte spara standard in" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "kan inte köra dup2 på standard in" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "kan inte återställa standard in" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "ingen tty finns tillgänglig och inget askpass-program angivet" + +#~ msgid "unable to get group vector" +#~ msgstr "kan inte hämta gruppvektor" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "okänt uid %u: vem är du?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "fel vid läsning från signalrör" + +#~ msgid "error reading from pipe" +#~ msgstr "fel vid läsning från rör" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: stackspill upptäcktes" + +#~ msgid "unable to open socket" +#~ msgstr "kunde inte öppna uttag" + +#~ msgid "list user's available commands\n" +#~ msgstr "lista användarens tillgängliga kommandon\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "kör ett skal som målanvändaren\n" + +#~ msgid "must be setuid root" +#~ msgstr "måste vara setuid root" + +#~ msgid "internal error, tried to emalloc(0)" +#~ msgstr "internt fel, försökte med emalloc(0)" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "internt fel, försökte med emalloc2(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "internt fel, försökte med erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "internt fel, försökte med erealloc3(0)" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "internt fel, stackspill i erealloc3()" diff --git a/utsudo-0.0.2/po/tr.mo b/utsudo-0.0.2/po/tr.mo new file mode 100644 index 0000000000000000000000000000000000000000..fee569abd217e3f9905eeda6db850aa8c9efa0dd GIT binary patch literal 19506 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/tr.po b/utsudo-0.0.2/po/tr.po new file mode 100644 index 0000000..aa35210 --- /dev/null +++ b/utsudo-0.0.2/po/tr.po @@ -0,0 +1,997 @@ +# This file is put in the public domain. +# This file is distributed under the same license as the sudo package. +# Volkan Gezer , 2013, 2015. +# Mehmet Kececi , 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 15:13+0300\n" +"Last-Translator: Mehmet Kececi \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "userdb açılamıyor" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "\"%s\" kaydına %s için geçiş yapılamıyor" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "kayıt geri yüklenemiyor" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "bellek ayırma başarısız" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Bilinmeyen sinyal" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "geçersiz değer" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "değer çok büyük" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "değer çok küçük" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "geçersiz Yol değeri %s içinde \"%s\", satır %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "%s \"%s\" için geçersiz değer, %s içinde, satır %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "\"%s\" desteklenmeyen grup kaynağı, %s içinde, satır %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "`\"%s\" geçersiz azami grubu, %s içinde, satır %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "%s durumlanamıyor" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s düzenli bir dosya değil" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s, %u kullanıcı kimliği tarafından sahiplenmiş, %u olmalı" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s genel yazılabilir" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s grup yazılabilir" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "%s açılamıyor" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "bilinmeyen %s oturum sınıfı" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "kullanıcı bağlamı ayarlama başarısız" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "süreç önceliği ayarlanamıyor" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "kök %s olarak değiştirilemiyor" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "runas uid (%u, %u) olarak değiştirilemiyor" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "%s dizinine değiştirilemiyor" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "sinyal %d için işleyici ayarlanamıyor" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "PRIV_LIMIT'ten PRIV_PROC_EXEC kaldırılamıyor" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "sockerpair'den okuma hatası" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "backchannel'da beklenmeyen yanıt türü: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "olay kuyruğa eklenemedi" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "tty denetleme ayarlaması başarısız" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "iletişim tüneli oluşturulamıyor" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "ebeveynden mesaj alamıyor" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "çatallanamıyor" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "tty etiketi geri yüklenemiyor" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "%s çalıştırılamıyor" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "oturum başlatma için ilke eklentisi başarısız" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "olay döngüsünde hata" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "sinyal %d için işleyici geri yüklenemiyor" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "pty ayırma başarısız" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "soket oluşturulamıyor" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "süreci izlemek için mesaj gönderilemiyor" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "\"%s\" eklentisi yüklenirken satır %d, %s içerisinde hata" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s, %d kullanıcı kimliği tarafından sahiplenmeli" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s sadece sahibi tarafından yazılabilir olmalı" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "%s yüklenemedi: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "%s içerisinde \"%s\" sembolü bulunamıyor" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "bilinmeyen ilke türü %d bulundu: %s içerisinde" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "uyumsuz temel ilke sürümü %d bulundu (beklenen %d) %s içerisinde" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "\"%s\" ilke eklentisi ihmal ediliyor, %s içinde, satır %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "sadece tek ilke eklentisi belirtilebilir" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "yinelenmiş \"%s\" ilke eklentisi ihmal ediliyor, %s içinde, satır %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "kopyalanmış \"%s\" I/O eklentisi ihmal ediliyor, %s içinde, satır %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "%s ilke eklentisi, bir check_policy yöntemi içermiyor" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "dahili hata, %s taşması" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "geçersiz çevre değişken adı: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "-C argümanı 3 veya daha büyük bir sayı olmalıdır" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "`-i' ve `-s' seçeneklerini aynı anda belirtemezsiniz" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "`-i' ve `-E' seçeneklerini aynı anda belirtemezsiniz" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "düzenleme kipinde `-E' seçeneği geçerli değil" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "düzenleme kipinde ortam değişkenlerini belirtemezsiniz" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "`-U' seçeneği sadece `-l' seçeneği ile kullanılabilir" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "`-A' ve `-S' seçenekleri birlikte kullanılamaz" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit bu platformda desteklenmiyor" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "-e, -h, -i, -K, -l, -s, -v veya -V seçeneklerinden sadece biri belirtilebilir" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - dosyaları farklı kullanıcı olarak düzenle\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - bir komutu farklı kullanıcı olarak çalıştır\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Seçenekler:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "parola sorgulaması için bir yardımcı program kullan" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "belirtilen BSD kimlik doğrulama türünü kullan" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "arkaalanda komutu çalıştır" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "istendiğinde zili çal" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr ">= sayı olan tüm dosya tanımlayıcılarını kapat" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "komutu belirtilen BSD oturum sınıfı ile çalıştır" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "komut çalıştırılırken kullanıcı ortamını koru" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "özel çevre değişkenlerini koru" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "komut çalıştırmak yerine dosyaları düzenleyiniz" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "grup adı veya ID olarak tanımlanan komutu çalıştır" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "HOME değişkenini kullanıcının ev dizinine hedefle" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "yardım mesajını görüntüle ve çık" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "komutunuzu hostta çalıştırın (eğer plugin tarafından destekleniyorsa)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "oturum kabuğunu hedef kullanıcı olarak çalıştır; bir komut da belirtilebilir" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "zaman damgası dosyasını kalıcı olarak kaldır" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "zaman damgası dosyasının geçerliliğini kaldır" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "kullanıcı yetkilerini listele veya özel bir komut denetle; daha uzun biçim için iki kez kullanın" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "etkileşimsiz kip, sorgu yapılmaz" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "hedefe atamak yerine grup vektörünü koru" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "belirtilen parola sorgusunu kullan" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "SELinux güvenlik bağlamını belirtilen rol ile oluştur" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "standart girdiden şifreyi okuyun" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "kabuğu hedef kullanıcı olarak çalıştır; bir komut da belirtilebilir" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "SELinux güvenlik bağlamını belirtilen tür ile oluştur" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "belirtilen süre sonunda komutu sonlandır" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "liste modunda, kullanıcıların ayrıcalıklarını görüntüle" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "belirtilen kullanıcı adı veya ID ile komutu çalıştırın (veya dosyayı düzenleyin)" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "sürüm bilgisini göster ve çık" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "kullanıcı zaman damgasını bir komut çalıştırmadan güncelle" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "komut satırı argümanlarını işlemeyi durdur" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "denetim sistemi açılamıyor" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "denetim iletisi gönderilemiyor" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "fgetfilecon %s yapılamıyor" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s değişmiş etiket" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "%s için bağlam geri yüklenemiyor" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "%s açılamadı, tty yeniden etiketlenemiyor" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s bir karakter aygıtı değildir, tty yeniden etiketlenemiyor" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "geçerli tty bağlamı alınamadı, tty yeniden etiketlenemiyor" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "bilinmeyen güvenlik sınıfı \"chr_file\", tty yeniden etiketlenemiyor" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "yeni tty bağlamı alınamadı, tty yeniden etiketlenemiyor" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "yeni tty bağlamı alınamıyor" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "%s türü için bir görev belirtmelisiniz" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "%s görevi için öntanımlı tür alınamıyor" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "yeni bağlam alınamadı" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "%s yeni görevi atanamadı" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "yeni tür %s atanamadı" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s geçerli bir bağlam değil" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "eski bağlam alınamadı" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "zorlama kipini belirleme başarısız." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "tty bağlamı %s olarak ayarlanamadı" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "%s için exec bağlamı ayarlanamıyor" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "%s için anahtar oluşturma bağlamı ayarlanamıyor" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "en az bir argüman gerektirir" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "geçersiz dosya tanımlayıcı sayısı: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "bir oturum açma kabuğu gibi %s çalıştırılamıyor" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "%d için işleyici kaydedilemiyor" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "kaynak denetim sınırına ulaşıldı" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "\"%s\", bir \"%s\" projesi üyesi değil" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "çağırılan görev son" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "\"%s\" projesine katılamadı" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "\"%s\" projesi için hiçbir kaynak havuzu varsayılan atamaları kabul etmiyor" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "belirtilen kaynak havuzu \"%s\" projesi için mevcut değil" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "\"%s\" projesi için öntanımlı kaynak havuzu atanamadı" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "\"%s\" projesi için setproject başarısız" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "uyarı, \"%s\" projesi için kaynak denetim ataması başarısız" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo sürüm %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Yapılandırma seçenekleri: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "ölümcül hata, eklentiler yüklenemiyor" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "ilke eklentisi başlatılamıyor" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "eklenti çalıştırmak için bir komut döndürmedi" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "I/O eklentisi %s başlatılırken hata" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "beklenmeyen 0x%x sudo kipi" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "sen %s veritabanında yoksun" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "tty belirlenemiyor" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s, %d kullanıcı kimliği tarafından sahiplenmeli ve setuid biti ayarlanmış olmalı" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "etkin kullanıcı kimliği %d değil, %s 'nosuid' seçeneği ayarlanmış bir dosya sisteminde veya yetkisiz haklara sahip bir NFS dosya sisteminde mi?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "etkin kullanıcı kimliği %d değil, sudo setuid root ile mi yüklendi?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "ek grup kimlikleri ayarlanamıyor" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "etkin grup kimliği, runas gid %u olarak ayarlanamıyor" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "grup kimliği, runas gid %u olarak ayarlanamıyor" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "beklenmeyen alt sonlandırma şartı: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "%s ilke eklentisi, bir `check_policy' yöntemi içermiyor" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "%s ilke eklentisi listeleme yetkilerini desteklemiyor" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "%s ilke eklentisi -v seçeneğini desteklemiyor" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "%s ilke eklentisi -k/-K seçeneklerini desteklemiyor" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "yazılabilir geçici dizin bulunamadı" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "geçerli çalışma klasörü geri yüklenemiyor" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: düzenli bir dosya değil" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: sembolik bağlantı düzenlemesine izin verilmemiştir" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: yazılabilir klasördeki düzenleme dosyalarına izin verilmemiştir" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: kısa yazım" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s düzenlenmemiş olarak bırakıldı" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s değiştirilmemiş" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "%s dosyasına yazılamıyor" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "düzenleme oturumu içerikleri %s içinde bırakıldı" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "geçici dosya okunamıyor" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: iç hata: yolların tek sayısı" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: geçici dosyalar oluşturulamıyor" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: bilinmeyen hata %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "geçici dosyalar onların özgün konumlarına kopyalanamıyor" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "bazı geçici dosyalar onların özgün konumlarına kopyalanamıyor" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "kullanıcı kimliği yetkili (%u) olarak değiştirilemiyor" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "eklenti hatası: sudoedit için eksik dosya listesi" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "saat okunamıyor" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "şifre okuma zaman aşımına uğradı" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "şifre sağlanmadı" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "parola okunamıyor" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "şifreyi okumak için bir terminal gereklidir; ya standart girdiden okumak için -S seçeneğini kullanın ya da bir askpass yardımcısı yapılandırın" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "askpass programı belirtilmemiş, SUDO_ASKPASS ayarlamayı deneyin" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "grup kimliği %u olarak ayarlanamıyor" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "kullanıcı kimliği %u olarak ayarlanamıyor" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "%s çalıştırılamıyor" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "stdin kaydedilemiyor" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "dup2 stdin yapılamıyor" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "stdin geri yüklenemiyor" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "tty bulunmuyor ve askpass programı belirtilmemiş" + +#~ msgid "unable to get group vector" +#~ msgstr "grup vektörü alınamıyor" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "bilinmeyen kullanıcı kimliği %u: kimsiniz?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "sinyal tünelinden okuma hatası" + +#~ msgid "error reading from pipe" +#~ msgstr "tünelden okuma hatası" + +#, fuzzy +#~| msgid "internal error, tried to emalloc(0)" +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "dahili hata, emalloc(0) denendi" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "uçbirim ham kipine ayarlanamıyor" + +#~ msgid "unable to open socket" +#~ msgstr "soket açılamıyor" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "dahili hata, emalloc2(0) denendi" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "dahili hata, ecalloc() denendi" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "dahili hata, erealloc() denendi" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "dahili hata, erealloc3() denendi" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "dahili hata, erecalloc() denendi" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "select failed" +#~ msgstr "seçim başarısız" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: taşma tespit edildi" + +#~ msgid "list user's available commands\n" +#~ msgstr "kullanıcının kullanılabilir komutlarını listele\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "hedef kullanıcı olarak bir kabuk çalıştır\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "listelerken, belirtilen kullanıcının haklarını listele\n" + +#~ msgid ": " +#~ msgstr ": " diff --git a/utsudo-0.0.2/po/uk.mo b/utsudo-0.0.2/po/uk.mo new file mode 100644 index 0000000000000000000000000000000000000000..f775b182f154520be46a0937de495da4e47e8353 GIT binary patch literal 27109 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 hB=1oxFcv&+kzwZ$+$ literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/uk.po b/utsudo-0.0.2/po/uk.po new file mode 100644 index 0000000..d5e4263 --- /dev/null +++ b/utsudo-0.0.2/po/uk.po @@ -0,0 +1,935 @@ +# Ukrainian translation for sudo. +# This file is put in the public domain. +# +# Yuri Chornoivan , 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 13:57+0300\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"X-Generator: Lokalize 19.04.0\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "не вдалося відкрити userdb" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "не вдалося перемкнутися на регістр «%s» для %s" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "не вдалося відновити регістр" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "не вдалося отримати потрібний об’єм пам’яті" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "Невідомий сигнал" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "некоректне значення" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "надто велике значення" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "надто мале значення" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "некоректне значення Path, «%s», у %s, рядок %u" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "некоректне значення %s, «%s», у %s, рядок %u" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "непідтримуване джерело групи, «%s», у %s, рядок %u" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "некоректна максимальна кількість груп, «%s», у %s, рядок %u" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "не вдалося виконати stat для %s" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s не є звичайним файлом" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s належить uid %u, має належати %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "Запис до «%s» можливий для довільного користувача" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "Запис до «%s» може здійснювати будь-який користувач з групи" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "не вдалося відкрити %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "невідомий клас входу %s" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "не вдалося встановити контекст користувача" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "не вдалося встановити пріоритет процесу" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "не вдалося змінити root на %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "не вдалося змінити uid користувача, від імені якого відбувається виконання (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "не вдалося змінити каталог на %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "не вдалося встановити обробник для сигналу %d" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "не вдалося вилучити PRIV_PROC_EXEC з PRIV_LIMIT" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "помилка під час спроби читання з пари сокетів" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "неочікуваний тип відповіді на зворотному каналі: %d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "не вдалося додати подію до черги обробки" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "не вдалося встановити tty для керування" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "не вдалося створити канал" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "не вдалося отримати повідомлення від батьківського процесу" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "не вдалося створити відгалуження" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "не вдалося відновити позначку tty" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "не вдалося виконати %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "не вдалося виконати ініціалізацію сеансу через додаток правил" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "помилка у циклі обробки подій" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "не вдалося відновити обробник для сигналу %d" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "не вдалося розмістити pty" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "не вдалося створити сокети" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "не вдалося надіслати повідомлення до процесу аудиту" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "помилка у %s, рядок %d під час спроби завантаження додатка «%s»" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s має належати користувачеві з uid %d" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s має бути доступним до запису лише для власника" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "не вдалося завантажити %s: %s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "не вдалося знайти символ «%s» у %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "у %2$s виявлено невідомий тип правил, %1$d" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "несумісна основна версія додатка, %d, (мало бути %d) у %s" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "ігноруємо додаток правил, «%s», у %s, рядок %d" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "можна визначати лише один додаток обробки правил" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "ігноруємо повторний запис додатка правил, «%s», у %s, рядок %d" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "ігноруємо повторний запис додатка введення-виведення, «%s», у %s, рядок %d" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "до додатка правил %s не включено метод check_policy" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "внутрішня помилка, переповнення %s" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "некоректна назва змінної середовища: %s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "аргументом параметра -C mмає бути число не менше за 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "не можна одночасно вказувати параметри «-i» і «-s»" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "не можна одночасно вказувати параметри «-i» і «-E»" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "не можна використовувати «-E» у режимі редагування" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "не можна вказувати змінні середовища у режимі редагування" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "параметр «-U» можна використовувати лише разом з параметром «-l»" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "параметри «-A» і «-S» не можна використовувати одночасно" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "підтримки sudoedit для цієї платформи не передбачено" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Можна використовувати лише такі параметри: -e, -h, -i, -K, -l, -s, -v та -V" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s — редагувати файли від імені іншого користувача\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s — виконати команду від імені іншого користувача\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Параметри:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "використовувати допоміжну програму для запитів щодо пароля" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "використовувати вказаний тип розпізнавання BSD" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "виконати команду у фоновому режимі" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "звук дзвінка під час запиту" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "закрити всі дескриптори файлів >= num" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "виконати команду з вказаним класом доступу BSD" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "зберегти середовище користувача на час виконання команди" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "зберегти вказані змінні середовища" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "редагувати файли замість виконання команди" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "виконати команду від імені групи користувачів, вказаної за назвою або ідентифікатором" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "встановити для змінної HOME значення домашнього каталогу вказаного користувача." + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "показати довідкове повідомлення і завершити роботу" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "виконати команду на комп’ютері (якщо підтримується додатком)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "запустити оболонку для входу до системи від імені вказаного користувача; слід вказати команду запуску" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "повністю вилучити файл часової позначки" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "позбавити чинності файл часової позначки" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "показати список прав доступу користувача або перевірити певну команду; подвоєння параметра призводить до виведення додаткових даних" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "неінтерактивний режим, не просити користувача відповідати на питання" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "зберегти вектор групи, не встановлювати вектор вказаного користувача" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "використовувати вказаний інструмент отримання паролів" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "створити контекст захисту SELinux з вказаною роллю" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "прочитати пароль зі стандартного джерела вхідних даних" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "виконати командну оболонку від імені вказаного користувача; слід також вказати команду" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "створити контекст захисту SELinux вказаного типу" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "перервати виконання команди щойно буде перевищено вказане обмеження за часом" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "у режимі списку, показати права доступу користувача" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "виконати команду (або редагувати файл) від імені користувача, вказаного за іменем або ідентифікатором" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "показати дані щодо версії і завершити роботу" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "оновити штамп часу користувача без виконання команди" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "зупинити обробку аргументів командного рядка" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "не вдалося відкрити систему аудиту" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "не вдалося надіслати повідомлення аудиту" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "не вдалося виконати fgetfilecon %s" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s змінено позначки" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "не вдалося відновити контекст %s" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "не вдалося відкрити %s, не змінюємо позначки tty" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s не є символьним пристроєм, не змінюємо мітки tty" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "не вдалося отримати поточний контекст tty, не змінюємо позначки tty" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "невідомий клас захисту «chr_file», не змінюємо позначки tty" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "не вдалося отримати новий контекст tty, не змінюємо позначки tty" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "не вдалося встановити новий контекст tty" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "вам слід вказати роль для типу %s" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "не вдалося отримати типовий тип для ролі %s" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "не вдалося отримати новий контекст" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "не вдалося встановити нову роль %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "не вдалося встановити новий тип %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s не є коректним контекстом" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "не вдалося отримати старий контекст" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "не вдалося визначити режим примушення." + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "не вдалося встановити контекст tty у значення %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "не вдалося встановити контекст виконання у значення %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "не вдалося встановити контекст ключа створення у значення %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "потребує принаймні одного аргументу" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "некоректний номер дескриптора файла: %s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "%s не можна працювати як оболонка для входу" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "не вдалося зберегти обробник для сигналу %d" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "перевищено обмеження керування ресурсами" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "користувач «%s» не є учасником проекту «%s»" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "викликане завдання є завершальним" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "не вдалося приєднатися до проекту «%s»" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "для проекту «%s» не існує сховища ресурсів, яке приймає типові прив’язки" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "у проекті «%s» не існує вказаного сховища ресурсів" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "не вдалося виконати прив’язку до типового сховища ресурсів проекту «%s»" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "помилка під час виконання setproject для проекту «%s»" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "попередження, помилка призначення керування ресурсами проекту «%s»" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Версія sudo %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "Параметри налаштування: %s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "критична помилка, не вдалося завантажити додатки" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "не вдалося ініціалізувати додаток правил" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "додатком не повернуто команди, яку слід виконати" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "помилка під час спроби ініціалізації додатка введення/виведення даних %s" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "неочікуваний режим sudo 0x%x" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "вас немає у базі даних %s" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "не вдалося визначити tty" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s має належати користувачеві з uid %d, крім того, має бути встановлено біт setuid" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "поточним uid не є %d. Можливо %s зберігається у файловій системі зі встановленим параметром «nosuid» або у файловій системі NFS без прав доступу root?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "поточним uid не є %d, sudo встановлено з ідентифікатором користувача root?" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "не вдалося встановити ідентифікатори додаткових груп" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "не вдалося встановити ефективний ідентифікатор групи для ідентифікатора групи запуску %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "не вдалося встановити ідентифікатор групи для ідентифікатора групи запуску %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "неочікувана умова переривання дочірнього процесу: %d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "до додатка правил %s не включено метод «check_policy»" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "у додатку правил %s не передбачено підтримки побудови списку прав доступу" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "у додатку правил %s не передбачено підтримки параметра -v" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "у додатку правил %s не передбачено підтримки параметрів -k/-K" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "не знайдено придатного до запису тимчасового каталогу" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "не вдалося відновити поточний робочий каталог" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: не є звичайним файлом" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: не можна редагувати символічні посилання" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: не можна редагувати файли у непридатному до запису каталозі" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s: короткий запис" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s залишено без змін" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s не змінено" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "не вдалося виконати запис до %s" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "дані сеансу редагування залишилися у %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "не вдалося виконати читання з файла тимчасових даних" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: внутрішня помилка: непарна кількість шляхів" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh: не вдалося створити тимчасові файли" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: невідома помилка %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "не вдалося скопіювати тимчасові файли назад до початкового місця зберігання" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "не вдалося скопіювати деякі з тимчасових файлів назад до початкового місця зберігання" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "не вдалося змінити значення uid на значення root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "помилка додатка: не вистачає списку файлів для sudoedit" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "не вдалося прочитати час на годиннику" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "перевищено граничний час очікування на пароль" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "пароль не надано" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "не вдалося прочитати пароль" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "у терміналі слід прочитати пароль; або скористайтеся параметром -S, щоб виконати читання зі стандартного джерела даних, або налаштуйте допоміжний засіб askpass" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "не вказано програми askpass, спробуйте встановити значення змінної SUDO_ASKPASS" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "не вдалося встановити gid у значення %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "не вдалося встановити uid у значення %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "не вдалося виконати %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "не вдалося зберегти stdin" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "не вдалося виконати dup2 для stdin" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "не вдалося відновити stdin" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "не виявлено tty і не вказано програми askpass" diff --git a/utsudo-0.0.2/po/utsudo.pot b/utsudo-0.0.2/po/utsudo.pot new file mode 100644 index 0000000..c353c76 --- /dev/null +++ b/utsudo-0.0.2/po/utsudo.pot @@ -0,0 +1,932 @@ +# Portable object template file for sudo +# This file is put in the public domain. +# Todd C. Miller , 2011-2018 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: utsudo 0.0.2\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "" + +#: src/parse_args.c:700 +msgid "" +"Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "" + +#: src/parse_args.c:759 +msgid "" +"list user's privileges or check a specific command; use twice for longer " +"format" +msgstr "" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "" + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "" + +#: src/sudo.c:890 +#, c-format +msgid "" +"effective uid is not %d, is %s on a file system with the 'nosuid' option set " +"or an NFS file system without root privileges?" +msgstr "" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "" + +#: src/sudo_edit.c:936 +msgid "" +"unable to copy some of the temporary files back to their original location" +msgstr "" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "" + +#: src/tgetpass.c:147 +msgid "" +"a terminal is required to read the password; either use the -S option to " +"read from standard input or configure an askpass helper" +msgstr "" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "" diff --git a/utsudo-0.0.2/po/vi.mo b/utsudo-0.0.2/po/vi.mo new file mode 100644 index 0000000000000000000000000000000000000000..7ee1cdafb39b4271940500eb07b40c2f737e37df GIT binary patch literal 21975 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 =C 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/vi.po b/utsudo-0.0.2/po/vi.po new file mode 100644 index 0000000..bb726a8 --- /dev/null +++ b/utsudo-0.0.2/po/vi.po @@ -0,0 +1,1006 @@ +# Vietnamese translation for sudo. +# Bản dịch tiếng Việt dành cho sudo. +# This file is put in the public domain. +# Trần Ngọc Quân , 2012-2014, 2015, 2016, 2017, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-01 13:57+0700\n" +"Last-Translator: Trần Ngọc Quân \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Language-Team-Website: \n" +"X-Generator: Gtranslator 2.91.7\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-Language: Vietnamese\n" +"X-Poedit-Country: VIET NAM\n" + +#: lib/util/aix.c:90 lib/util/aix.c:177 +msgid "unable to open userdb" +msgstr "không thể mở cơ sở dữ liệu người dùng userdb" + +#: lib/util/aix.c:232 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "không thể chuyển đến sổ đăng ký “%s” cho %s" + +#: lib/util/aix.c:257 +msgid "unable to restore registry" +msgstr "không thể phục hồi sổ đăng ký" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/gidlist.c:79 +#: lib/util/sudo_conf.c:191 lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 +#: lib/util/sudo_conf.c:558 src/conversation.c:82 src/exec_common.c:112 +#: src/exec_common.c:128 src/exec_common.c:137 src/exec_monitor.c:210 +#: src/exec_monitor.c:465 src/exec_monitor.c:471 src/exec_monitor.c:479 +#: src/exec_monitor.c:487 src/exec_monitor.c:494 src/exec_monitor.c:501 +#: src/exec_monitor.c:508 src/exec_monitor.c:515 src/exec_monitor.c:522 +#: src/exec_monitor.c:529 src/exec_monitor.c:536 src/exec_nopty.c:212 +#: src/exec_nopty.c:218 src/exec_nopty.c:227 src/exec_nopty.c:234 +#: src/exec_nopty.c:241 src/exec_nopty.c:248 src/exec_nopty.c:255 +#: src/exec_nopty.c:262 src/exec_nopty.c:269 src/exec_nopty.c:276 +#: src/exec_nopty.c:283 src/exec_nopty.c:290 src/exec_nopty.c:297 +#: src/exec_nopty.c:305 src/exec_nopty.c:467 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:994 +#: src/exec_pty.c:1157 src/exec_pty.c:1163 src/exec_pty.c:1172 +#: src/exec_pty.c:1179 src/exec_pty.c:1186 src/exec_pty.c:1193 +#: src/exec_pty.c:1200 src/exec_pty.c:1207 src/exec_pty.c:1214 +#: src/exec_pty.c:1221 src/exec_pty.c:1228 src/exec_pty.c:1235 +#: src/exec_pty.c:1243 src/exec_pty.c:1661 src/load_plugins.c:57 +#: src/load_plugins.c:70 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:203 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:676 src/sudo.c:686 src/sudo.c:706 src/sudo.c:725 +#: src/sudo.c:734 src/sudo.c:743 src/sudo.c:760 src/sudo.c:801 src/sudo.c:811 +#: src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 src/sudo.c:1266 +#: src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 src/sudo_edit.c:886 +#: src/sudo_edit.c:1000 src/sudo_edit.c:1020 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/sudo_conf.c:192 +#: lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 lib/util/sudo_conf.c:558 +#: src/conversation.c:83 src/exec_common.c:112 src/exec_common.c:129 +#: src/exec_common.c:138 src/exec_monitor.c:465 src/exec_monitor.c:471 +#: src/exec_monitor.c:479 src/exec_monitor.c:487 src/exec_monitor.c:494 +#: src/exec_monitor.c:501 src/exec_monitor.c:508 src/exec_monitor.c:515 +#: src/exec_monitor.c:522 src/exec_monitor.c:529 src/exec_monitor.c:536 +#: src/exec_nopty.c:212 src/exec_nopty.c:218 src/exec_nopty.c:227 +#: src/exec_nopty.c:234 src/exec_nopty.c:241 src/exec_nopty.c:248 +#: src/exec_nopty.c:255 src/exec_nopty.c:262 src/exec_nopty.c:269 +#: src/exec_nopty.c:276 src/exec_nopty.c:283 src/exec_nopty.c:290 +#: src/exec_nopty.c:297 src/exec_nopty.c:305 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:1157 +#: src/exec_pty.c:1163 src/exec_pty.c:1172 src/exec_pty.c:1179 +#: src/exec_pty.c:1186 src/exec_pty.c:1193 src/exec_pty.c:1200 +#: src/exec_pty.c:1207 src/exec_pty.c:1214 src/exec_pty.c:1221 +#: src/exec_pty.c:1228 src/exec_pty.c:1235 src/exec_pty.c:1243 +#: src/exec_pty.c:1661 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:204 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 +#: src/sudo.c:1266 src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 +#: src/sudo_edit.c:886 src/sudo_edit.c:1000 src/sudo_edit.c:1020 +msgid "unable to allocate memory" +msgstr "không thể cấp phát bộ nhớ" + +#: lib/util/strsignal.c:53 +msgid "Unknown signal" +msgstr "Không hiểu tín hiệu" + +#: lib/util/strtoid.c:82 lib/util/strtoid.c:129 lib/util/strtoid.c:157 +#: lib/util/strtomode.c:54 lib/util/strtonum.c:63 lib/util/strtonum.c:181 +msgid "invalid value" +msgstr "giá trị không hợp lệ" + +#: lib/util/strtoid.c:89 lib/util/strtoid.c:136 lib/util/strtoid.c:164 +#: lib/util/strtomode.c:60 lib/util/strtonum.c:66 lib/util/strtonum.c:193 +msgid "value too large" +msgstr "giá trị quá lớn" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:142 lib/util/strtomode.c:60 +#: lib/util/strtonum.c:66 lib/util/strtonum.c:187 +msgid "value too small" +msgstr "giá trị quá nhỏ" + +#: lib/util/sudo_conf.c:210 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "đường dẫn không hợp lệ “%s” trong %s, dòng %u" + +#: lib/util/sudo_conf.c:376 lib/util/sudo_conf.c:429 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "giá trị không hợp lệ cho %s “%s” trong %s, dòng %u" + +#: lib/util/sudo_conf.c:397 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "nguồn nhóm không được hỗ trợ “%s” trong %s, dòng %u" + +#: lib/util/sudo_conf.c:413 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "nhóm tối đa không hợp lệ “%s” trong %s, dòng %u" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "unable to stat %s" +msgstr "không thể lấy thống kê về %s" + +#: lib/util/sudo_conf.c:577 +#, c-format +msgid "%s is not a regular file" +msgstr "%s không phải tập tin thường" + +#: lib/util/sudo_conf.c:580 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s được sở hữu bởi uid %u, nên là %u" + +#: lib/util/sudo_conf.c:584 +#, c-format +msgid "%s is world writable" +msgstr "%s là ai ghi cũng được" + +#: lib/util/sudo_conf.c:587 +#, c-format +msgid "%s is group writable" +msgstr "%s là nhóm có thể ghi" + +#: lib/util/sudo_conf.c:597 src/selinux.c:213 src/selinux.c:230 src/sudo.c:360 +#, c-format +msgid "unable to open %s" +msgstr "không thể mở “%s”" + +#: src/exec.c:165 +#, c-format +msgid "unknown login class %s" +msgstr "không hiểu lớp đăng nhập %s" + +#: src/exec.c:178 +msgid "unable to set user context" +msgstr "không thể đặt ngữ cảnh người dùng" + +#: src/exec.c:194 +msgid "unable to set process priority" +msgstr "không thể đặt ưu tiên cho quá trình" + +#: src/exec.c:202 +#, c-format +msgid "unable to change root to %s" +msgstr "không thể chuyển đổi thư mục gốc thành %s" + +#: src/exec.c:215 src/exec.c:221 src/exec.c:228 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "không thể thay đổi thành chạy như là mã người dùng này (%u, %u)" + +#: src/exec.c:246 +#, c-format +msgid "unable to change directory to %s" +msgstr "không thể thay đổi thư mục thành %s" + +#: src/exec.c:345 src/exec_monitor.c:574 src/exec_monitor.c:576 +#: src/exec_nopty.c:525 src/exec_pty.c:522 src/exec_pty.c:1329 +#: src/exec_pty.c:1331 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "không thể đặt bộ tiếp hợp cho tín hiệu %d" + +#: src/exec_common.c:171 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "không thể xóa bỏ PRIV_PROC_EXEC từ PRIV_LIMIT" + +#: src/exec_monitor.c:364 +msgid "error reading from socketpair" +msgstr "gặp lỗi khi đọc từ socketpair" + +#: src/exec_monitor.c:381 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "kiểu trả về không như mong đợi từ backchannel: %d" + +#: src/exec_monitor.c:473 src/exec_monitor.c:481 src/exec_monitor.c:489 +#: src/exec_monitor.c:496 src/exec_monitor.c:503 src/exec_monitor.c:510 +#: src/exec_monitor.c:517 src/exec_monitor.c:524 src/exec_monitor.c:531 +#: src/exec_monitor.c:538 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:644 +#: src/exec_pty.c:649 src/exec_pty.c:746 src/exec_pty.c:753 src/exec_pty.c:850 +#: src/exec_pty.c:1165 src/exec_pty.c:1174 src/exec_pty.c:1181 +#: src/exec_pty.c:1188 src/exec_pty.c:1195 src/exec_pty.c:1202 +#: src/exec_pty.c:1209 src/exec_pty.c:1216 src/exec_pty.c:1223 +#: src/exec_pty.c:1230 src/exec_pty.c:1237 src/exec_pty.c:1614 +#: src/exec_pty.c:1624 src/exec_pty.c:1669 src/exec_pty.c:1676 +#: src/exec_pty.c:1703 +msgid "unable to add event to queue" +msgstr "không thể thêm sự kiện vào hàng đợi" + +#: src/exec_monitor.c:592 +msgid "unable to set controlling tty" +msgstr "không thể đặt điều khiển cho tty" + +#: src/exec_monitor.c:600 src/exec_nopty.c:364 src/exec_pty.c:1408 +#: src/exec_pty.c:1429 src/exec_pty.c:1449 src/tgetpass.c:292 +msgid "unable to create pipe" +msgstr "không tạo được đường ống pipe" + +#: src/exec_monitor.c:608 +msgid "unable to receive message from parent" +msgstr "không thể nhận tin nhắn từ cha mẹ" + +#: src/exec_monitor.c:614 src/exec_nopty.c:382 src/exec_pty.c:1487 +#: src/tgetpass.c:296 +msgid "unable to fork" +msgstr "không thể tạo tiến trình con" + +#: src/exec_monitor.c:628 src/sesh.c:125 src/sudo.c:1130 +#, c-format +msgid "unable to execute %s" +msgstr "không thể thực thi %s" + +#: src/exec_monitor.c:711 src/exec_nopty.c:435 +msgid "unable to restore tty label" +msgstr "không thể phục hồi nhãn cho tty" + +#: src/exec_nopty.c:358 src/exec_pty.c:1338 +msgid "policy plugin failed session initialization" +msgstr "phần bổ sung chính sách gặp lỗi khi khởi tạo phiên" + +#: src/exec_nopty.c:424 src/exec_pty.c:1574 +msgid "error in event loop" +msgstr "có lỗi trong vòng lặp sự kiện" + +#: src/exec_nopty.c:533 src/exec_pty.c:557 src/signal.c:110 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "không thể phục hồi bộ tiếp hợp cho tín hiệu %d" + +#: src/exec_pty.c:156 +msgid "unable to allocate pty" +msgstr "không thể phân bổ pty" + +#: src/exec_pty.c:1318 +msgid "unable to create sockets" +msgstr "không thể tạo các ổ cắm mạng" + +#: src/exec_pty.c:1531 +msgid "unable to send message to monitor process" +msgstr "không thể gửi tin đến tiến trình theo dõi" + +#: src/load_plugins.c:55 src/load_plugins.c:68 src/load_plugins.c:90 +#: src/load_plugins.c:120 src/load_plugins.c:128 src/load_plugins.c:134 +#: src/load_plugins.c:175 src/load_plugins.c:183 src/load_plugins.c:190 +#: src/load_plugins.c:196 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "lỗi trong %s, dòng %d, trong khi tải phần bổ sung “%s”" + +#: src/load_plugins.c:92 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:130 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s phải được sở hữu bởi uid %d" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s phải là những thứ chỉ có thể ghi bởi chủ sở hữu" + +#: src/load_plugins.c:177 +#, c-format +msgid "unable to load %s: %s" +msgstr "không thể tải %s: %s" + +#: src/load_plugins.c:185 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "không tìm thấy ký hiệu “%s” trong %s" + +#: src/load_plugins.c:192 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "không hiểu kiểu chính sách %d tìm thấy trong %s" + +#: src/load_plugins.c:198 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "không tương thích số hiệu phiên bản lớn %d (cần %d) tìm thấy trong %s" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "lờ đi phần bổ sung chính sách “%s” trong %s, dòng %d" + +#: src/load_plugins.c:209 +msgid "only a single policy plugin may be specified" +msgstr "chỉ được phép chỉ định một phần bổ sung chính sách" + +#: src/load_plugins.c:212 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "lờ đi phần bổ sung chính sách bị trùng lặp “%s” trong %s, dòng %d" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "lờ đi phần bổ sung I/O trùng lặp “%s” trong %s, dòng %d" + +#: src/load_plugins.c:347 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "phần bổ sung chính sách %s không bao gồm phương thức kiểm tra chính sách" + +#: src/net_ifs.c:180 src/net_ifs.c:197 src/net_ifs.c:342 src/sudo.c:470 +#, c-format +msgid "internal error, %s overflow" +msgstr "lỗi nội bộ, %s bị tràn" + +#: src/parse_args.c:224 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "tên biến môi trường không hợp lệ: %s" + +#: src/parse_args.c:320 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "đối số cho -C phải là một số lớn hơn hoặc bằng 3" + +#: src/parse_args.c:505 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "bạn không thể chỉ định đồng thời cả hai tùy chọn “-i” và “-s”" + +#: src/parse_args.c:509 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "bạn không thể chỉ định cả hai tùy chọn “-i” và “-E”" + +#: src/parse_args.c:519 +msgid "the `-E' option is not valid in edit mode" +msgstr "tùy chọn “-E” không hợp lệ trong chế độ chỉnh sửa" + +#: src/parse_args.c:521 +msgid "you may not specify environment variables in edit mode" +msgstr "bạn có lẽ không được chỉ định biến môi trường trong chế độ soạn thảo" + +#: src/parse_args.c:529 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "tùy chọn “-U” chỉ sử dụng cùng với tùy chọn “-l”" + +#: src/parse_args.c:533 +msgid "the `-A' and `-S' options may not be used together" +msgstr "tùy chọn “-A” và “-S” không thể dùng cùng một lúc với nhau" + +#: src/parse_args.c:609 +msgid "sudoedit is not supported on this platform" +msgstr "sudoedit không được hỗ trợ trên nền tảng này" + +#: src/parse_args.c:682 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "Chỉ được phép chỉ định một trong số các tùy chọn -e, -h, -i, -K, -l, -s, -v hay -V" + +#: src/parse_args.c:696 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - sửa chữa các tập tin trên danh nghĩa người dùng khác\n" +"\n" + +#: src/parse_args.c:698 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - thực hiện câu lệnh trên danh nghĩa người dùng khác\n" +"\n" + +#: src/parse_args.c:703 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Tùy chọn:\n" + +#: src/parse_args.c:705 +msgid "use a helper program for password prompting" +msgstr "sử dụng chương trình trợ giúp cho hỏi đáp mật khẩu" + +#: src/parse_args.c:708 +msgid "use specified BSD authentication type" +msgstr "sử dụng kiểu xác thực BSD được chỉ ra" + +#: src/parse_args.c:711 +msgid "run command in the background" +msgstr "chạy lệnh ở chế độ nền" + +#: src/parse_args.c:713 +msgid "close all file descriptors >= num" +msgstr "đóng tất cả các mô tả của tập tin >= số" + +#: src/parse_args.c:716 +msgid "run command with the specified BSD login class" +msgstr "chạy lệnh với một lớp đăng nhập BSD được chỉ ra" + +#: src/parse_args.c:719 +msgid "preserve user environment when running command" +msgstr "bảo tồn môi trường người dùng khi thi hành lệnh" + +#: src/parse_args.c:721 +msgid "preserve specific environment variables" +msgstr "bảo tôn các biến môi trường chuyên biệt" + +#: src/parse_args.c:723 +msgid "edit files instead of running a command" +msgstr "chỉnh sửa các tập tin thay vì chạy lệnh" + +#: src/parse_args.c:725 +msgid "run command as the specified group name or ID" +msgstr "thực hiện câu lệnh với tư cách là tên hay ID của nhóm được chỉ định" + +#: src/parse_args.c:727 +msgid "set HOME variable to target user's home dir" +msgstr "đặt biến HOME cho thư mục riêng của người dùng đích" + +#: src/parse_args.c:729 +msgid "display help message and exit" +msgstr "hiển thị trợ giúp này rồi thoát" + +#: src/parse_args.c:731 +msgid "run command on host (if supported by plugin)" +msgstr "chạy câu lệnh trên máy chủ (nếu được hỗ trợ bởi phần bổ sung)" + +#: src/parse_args.c:733 +msgid "run login shell as the target user; a command may also be specified" +msgstr "chạy shell đăng nhập như là người dùng đích; có thể đồng thời chỉ định một câu lệnh" + +#: src/parse_args.c:735 +msgid "remove timestamp file completely" +msgstr "gỡ bỏ hoàn toàn dấu vết thời gian của tập tin" + +#: src/parse_args.c:737 +msgid "invalidate timestamp file" +msgstr "làm mất hiệu lực dấu vết thời gian (timestamp) của tập tin" + +#: src/parse_args.c:739 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "liệt kê đặc quyền của người dùng hay kiểm tra câu lệnh xác định; dùng hai lần cho định dạng dài" + +#: src/parse_args.c:741 +msgid "non-interactive mode, no prompts are used" +msgstr "chế độ không-tương-tác, sẽ không hỏi tên người dùng" + +#: src/parse_args.c:743 +msgid "preserve group vector instead of setting to target's" +msgstr "bảo tồn véc-tơ nhóm thay vì các cài đặt cho đích" + +#: src/parse_args.c:745 +msgid "use the specified password prompt" +msgstr "sử dụng nhắc nhập mật khẩu đã chỉ ra" + +#: src/parse_args.c:748 +msgid "create SELinux security context with specified role" +msgstr "tạo ngữ cảnh an ninh SELinux với vai trò đã chỉ ra" + +#: src/parse_args.c:751 +msgid "read password from standard input" +msgstr "đọc mật khẩu từ đầu vào tiêu chuẩn" + +#: src/parse_args.c:753 +msgid "run shell as the target user; a command may also be specified" +msgstr "chạy hệ vỏ dưới danh nghĩa người dùng đích; cũng có thể chỉ định thêm câu lệnh" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified type" +msgstr "tạo ngữ cảnh an ninh SELinux với kiểu đã chỉ ra" + +#: src/parse_args.c:759 +msgid "terminate command after the specified time limit" +msgstr "chấm dứt lệnh sau một thời hạn giới hạn được chỉ định" + +#: src/parse_args.c:761 +msgid "in list mode, display privileges for user" +msgstr "ở chế độ liệt kê, hiển thị đặc quyền cho người dùng" + +#: src/parse_args.c:763 +msgid "run command (or edit file) as specified user name or ID" +msgstr "chạy lệnh (hay sửa chữa tập tin) trên tư cách của người dùng hay ID đã chỉ ra" + +#: src/parse_args.c:765 +msgid "display version information and exit" +msgstr "hiển thị thông tin phiên bản rồi thoát" + +#: src/parse_args.c:767 +msgid "update user's timestamp without running a command" +msgstr "cập nhật dấu vết thời gian (timestamp) của người dùng mà không chạy một lệnh" + +#: src/parse_args.c:769 +msgid "stop processing command line arguments" +msgstr "dừng việc xử lý đối số dòng lệnh" + +#: src/selinux.c:83 +msgid "unable to open audit system" +msgstr "không thể mở hệ thống audit" + +#: src/selinux.c:93 +msgid "unable to send audit message" +msgstr "không thể gửi thông tin audit" + +#: src/selinux.c:121 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "không thể fgetfilecon %s" + +#: src/selinux.c:126 +#, c-format +msgid "%s changed labels" +msgstr "%s nhãn đã thay đổi" + +#: src/selinux.c:131 +#, c-format +msgid "unable to restore context for %s" +msgstr "Không thể phục hồi ngữ cảnh cho %s" + +#: src/selinux.c:172 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "không thể mở %s, không phải là tty dán nhãn lại" + +#: src/selinux.c:176 src/selinux.c:217 src/selinux.c:234 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s không phải là một thiết bị ký tự, không phải là tty dán nhãn lại" + +#: src/selinux.c:185 +msgid "unable to get current tty context, not relabeling tty" +msgstr "không thể lấy ngữ cảnh tty hiện hành, không phải là tty dán nhãn lại" + +#: src/selinux.c:192 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "không hiểu lớp an ninh \"chr_file\", không phải là tty dán nhãn lại" + +#: src/selinux.c:197 +msgid "unable to get new tty context, not relabeling tty" +msgstr "không thể lấy ngữ cảnh tty mới, không phải là tty dán nhãn lại" + +#: src/selinux.c:204 +msgid "unable to set new tty context" +msgstr "không thể đặt ngữ cảnh tty mới" + +#: src/selinux.c:278 +#, c-format +msgid "you must specify a role for type %s" +msgstr "bạn phải chỉ định một kiểu vai trò cho %s" + +#: src/selinux.c:284 +#, c-format +msgid "unable to get default type for role %s" +msgstr "không thể lấy kiểu mặc định cho vai trò %s" + +#: src/selinux.c:302 +#, c-format +msgid "failed to set new role %s" +msgstr "gặp lỗi khi đặt đặt vai trò mới %s" + +#: src/selinux.c:306 +#, c-format +msgid "failed to set new type %s" +msgstr "gặp lỗi khi đặt kiểu mới %s" + +#: src/selinux.c:318 +#, c-format +msgid "%s is not a valid context" +msgstr "%s không phải là một ngữ cảnh hợp lệ" + +#: src/selinux.c:353 +msgid "failed to get old_context" +msgstr "gặp lỗi khi lấy ngữ cảnh cũ" + +#: src/selinux.c:359 +msgid "unable to determine enforcing mode." +msgstr "không thể xác định rõ chế độ ép buộc." + +#: src/selinux.c:376 +#, c-format +msgid "unable to set tty context to %s" +msgstr "không thể cài đặt ngữ cảnh tty mới cho %s" + +#: src/selinux.c:415 +#, c-format +msgid "unable to set exec context to %s" +msgstr "không thể đặt ngữ cảnh bảo thực thi thành %s" + +#: src/selinux.c:422 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "không thể đặt ngữ cảnh tạo khóa thành %s" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "cần thiết ít nhất một đối số" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "số mô tả của tập tin không hợp lệ: %s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "không thể chạy %s như là hệ vỏ đăng nhập" + +#: src/signal.c:88 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "không thể ghi lại bộ tiếp hợp cho tín hiệu %d" + +#: src/solaris.c:81 +msgid "resource control limit has been reached" +msgstr "giới hạn điều khiển tài nguyên đã tới hạn" + +#: src/solaris.c:84 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "người dùng “%s” không phải là thành viên của dự án “%s”" + +#: src/solaris.c:88 +msgid "the invoking task is final" +msgstr "tác vụ được gọi là cuối cùng" + +#: src/solaris.c:91 +#, c-format +msgid "could not join project \"%s\"" +msgstr "không thể gia nhập dự án “%s”" + +#: src/solaris.c:96 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "không kho tài nguyên chung nào được thừa nhận ràng buộc đã tồn tại sẵn cho dự án “%s”" + +#: src/solaris.c:100 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "nguồn tài nguyên chung được chỉ ra chưa tồn tại cho dự án “%s”" + +#: src/solaris.c:104 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "không thể buộc phần tài nguyên chung mặc định cho dự án “%s”" + +#: src/solaris.c:110 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "đặt dự án cho dự án “%s” gặp lỗi" + +#: src/solaris.c:112 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "cảnh báo, nguồn điều khiển gán gặp lỗi cho dự án “%s”" + +#: src/sudo.c:201 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo phiên bản %s\n" + +#: src/sudo.c:203 +#, c-format +msgid "Configure options: %s\n" +msgstr "Các tùy chọn cấu hình: %s\n" + +#: src/sudo.c:211 +msgid "fatal error, unable to load plugins" +msgstr "lỗi nghiêm trọng, không thể tải các phần bổ sung" + +#: src/sudo.c:219 +msgid "unable to initialize policy plugin" +msgstr "không thể khởi tạo phần bổ sung chính sách" + +#: src/sudo.c:263 +msgid "plugin did not return a command to execute" +msgstr "phần bổ sung không trả về một lệnh để thực thi" + +#: src/sudo.c:279 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "Gặp lỗi khi nạp phần bổ sung I/O %s" + +#: src/sudo.c:302 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "không mong đợi chế độ sudo 0x%x" + +#: src/sudo.c:535 +#, c-format +msgid "you do not exist in the %s database" +msgstr "bạn không tồn tại trong cơ sở dữ liệu %s" + +#: src/sudo.c:592 +msgid "unable to determine tty" +msgstr "không thể dò tìm tty" + +#: src/sudo.c:880 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s phải được sở hữu bởi uid %d và bít setuid phải được đặt" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "uid chịu tác động hiện tại không phải là %d, có phải là %s trên hệ thống tập tin với tùy chọn “nosuid” được đặt, hay một hệ thống tập tin NFS không có đặc quyền của root không?" + +#: src/sudo.c:889 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "uid chịu tác động hiện tại không phải là %d, chương trình sudo có được cài với setuid root không?" + +#: src/sudo.c:942 +msgid "unable to set supplementary group IDs" +msgstr "không thể đặt nhóm phụ IDs" + +#: src/sudo.c:949 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "không thể đặt hiệu ứng gid chạy như là gid %u" + +#: src/sudo.c:955 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "không thể thay đổi gid thành runas gid %u" + +#: src/sudo.c:1012 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "biểu thức điều kiện con kết thúc không như mong đợi: %d" + +#: src/sudo.c:1158 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "phần bổ sung chính sách %s bị thiếu phương thức kiểm tra chính sách “check_policy”" + +#: src/sudo.c:1176 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "phần bổ sung chính sách %s không hỗ trợ liệt kê đặc quyền" + +#: src/sudo.c:1193 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "phần bổ sung chính sách %s không hỗ trợ tùy chọn -v" + +#: src/sudo.c:1208 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "phần bổ sung chính sách %s không hỗ trợ tùy chọn -k/-K" + +#: src/sudo_edit.c:219 +msgid "no writable temporary directory found" +msgstr "không thể tìm thấy thư mục tạm ghi được nào" + +#: src/sudo_edit.c:286 src/sudo_edit.c:375 +msgid "unable to restore current working directory" +msgstr "không thể phục hồi thư mục làm việc hiện tại" + +#: src/sudo_edit.c:592 src/sudo_edit.c:704 +#, c-format +msgid "%s: not a regular file" +msgstr "%s: không phải là tập tin thường" + +#: src/sudo_edit.c:599 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s: sửa các liên kết mềm là không được phép" + +#: src/sudo_edit.c:602 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s: sửa các tập tin trong thư mục ghi được là là không được phép" + +#: src/sudo_edit.c:635 src/sudo_edit.c:742 +#, c-format +msgid "%s: short write" +msgstr "%s: ghi ngắn" + +#: src/sudo_edit.c:705 +#, c-format +msgid "%s left unmodified" +msgstr "%s còn lại chưa thay đổi" + +#: src/sudo_edit.c:718 src/sudo_edit.c:903 +#, c-format +msgid "%s unchanged" +msgstr "%s không thay đổi" + +#: src/sudo_edit.c:731 src/sudo_edit.c:753 +#, c-format +msgid "unable to write to %s" +msgstr "không thể ghi vào %s" + +#: src/sudo_edit.c:732 src/sudo_edit.c:751 src/sudo_edit.c:754 +#: src/sudo_edit.c:928 src/sudo_edit.c:932 +#, c-format +msgid "contents of edit session left in %s" +msgstr "nội dung của phiên chỉnh sửa chỉ còn %s" + +#: src/sudo_edit.c:750 +msgid "unable to read temporary file" +msgstr "không thể đọc tập tin tạm thời" + +#: src/sudo_edit.c:833 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh: lỗi nội tại: số cũ của đường dẫn" + +#: src/sudo_edit.c:835 +msgid "sesh: unable to create temporary files" +msgstr "sesh: không thể tạo tập tin tạm thời" + +#: src/sudo_edit.c:837 src/sudo_edit.c:935 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh: không hiểu lỗi %d" + +#: src/sudo_edit.c:927 +msgid "unable to copy temporary files back to their original location" +msgstr "không thể chép các tập tin tạm trở lại vị trí gốc của chúng" + +#: src/sudo_edit.c:931 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "không thể chép một số tập tin tạm trở lại vị trí gốc của chúng" + +#: src/sudo_edit.c:976 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "không thể thay đổi uid thành root (%u)" + +#: src/sudo_edit.c:993 +msgid "plugin error: missing file list for sudoedit" +msgstr "lỗi phần bổ sung: thiếu danh sách tập tin cho sudoedit" + +#: src/sudo_edit.c:1034 src/sudo_edit.c:1047 +msgid "unable to read the clock" +msgstr "không thể đọc khóa" + +#: src/tgetpass.c:101 +msgid "timed out reading password" +msgstr "quá thời hạn chờ đọc mật khẩu" + +#: src/tgetpass.c:104 +msgid "no password was provided" +msgstr "chưa đưa ra mật khẩu" + +#: src/tgetpass.c:107 +msgid "unable to read password" +msgstr "không thể đọc mật khẩu" + +#: src/tgetpass.c:141 +msgid "no tty present and no askpass program specified" +msgstr "không có tty hiện diện và không có chương trình hỏi mật khẩu nào được chỉ ra" + +#: src/tgetpass.c:150 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "không có chương trình hỏi mật khẩu nào được chỉ ra, hãy thử đặt SUDO_ASKPASS" + +#: src/tgetpass.c:307 +#, c-format +msgid "unable to set gid to %u" +msgstr "không thể đặt mã số nhóm thành %u" + +#: src/tgetpass.c:311 +#, c-format +msgid "unable to set uid to %u" +msgstr "không thể đặt mã số người dùng thành %u" + +#: src/tgetpass.c:316 +#, c-format +msgid "unable to run %s" +msgstr "không thể chạy %s" + +#: src/utmp.c:271 +msgid "unable to save stdin" +msgstr "không thể ghi lại đầu vào tiêu chuẩn" + +#: src/utmp.c:273 +msgid "unable to dup2 stdin" +msgstr "không thể dup2 (nhân đôi) đầu vào tiêu chuẩn" + +#: src/utmp.c:276 +msgid "unable to restore stdin" +msgstr "không thể phục hồi đầu vào tiêu chuẩn" + +#~ msgid "unable to get group vector" +#~ msgstr "không thể lấy véc-tơ nhóm" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "không hiểu mã số người dùng %u: bạn là ai?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "lỗi khi đọc từ đường ống dẫn tín hiệu" + +#~ msgid "error reading from pipe" +#~ msgstr "gặp lỗi khi đọc từ một đường ống dẫn lệnh" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "lỗi nội bộ, đã phân bổ 0 byte bộ nhớ" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "không thể đặt thiết bị cuối sang chế độ thô" + +#~ msgid "unable to open socket" +#~ msgstr "không mở được socket" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s: %s: %s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "lỗi nội bộ, đã dùng erealloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "lỗi nội bộ, đã dùng ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "lỗi nội bộ, đã dùng erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "lỗi nội bộ, đã dùng erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "lỗi nội bộ, đã dùng erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces: đã có chỗ bị tràn" + +#~ msgid "value out of range" +#~ msgstr "giá trị nằm ngoài phạm vi" + +#~ msgid "select failed" +#~ msgstr "lựa chọn gặp lỗi" + +#~ msgid "list user's available commands\n" +#~ msgstr "Danh sách các biến câu lệnh người dùng có thể sử dụng\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "chạy shell như là người dùng đích\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "khi liệt kê, liệt kê các đặc quyền của người dùng\n" + +#~ msgid ": " +#~ msgstr ": " + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "lỗi nội bộ, erealloc2() bị tràn" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "lỗi nội bộ, erealloc3() bị tràn" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s: phải xác định ít nhất một phần bổ xung chính sách" + +#~ msgid "must be setuid root" +#~ msgstr "phải được đặt setuid của root" diff --git a/utsudo-0.0.2/po/zh_CN.mo b/utsudo-0.0.2/po/zh_CN.mo new file mode 100644 index 0000000000000000000000000000000000000000..502eee85b2be423c3375beb9e91c8ff5cc720d57 GIT binary patch literal 17573 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 LZ8>NYu=jrfZ(%Gf literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/zh_CN.po b/utsudo-0.0.2/po/zh_CN.po new file mode 100644 index 0000000..62ecde7 --- /dev/null +++ b/utsudo-0.0.2/po/zh_CN.po @@ -0,0 +1,1003 @@ +# Chinese simplified translation for sudo. +# sudo 的简体中文翻译。 +# This file is put in the public domain. +# Wylmer Wang , 2011, 2012, 2013, 2014, 2015, 2016, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: sudo-1.8.26b1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2018-10-29 08:31-0600\n" +"PO-Revision-Date: 2018-11-05 09:18+0800\n" +"Last-Translator: Wylmer Wang \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" + +#: lib/util/aix.c:90 lib/util/aix.c:177 +msgid "unable to open userdb" +msgstr "无法打开 userdb" + +#: lib/util/aix.c:232 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "无法为 %2$s 切换到注册表“%1$s”" + +#: lib/util/aix.c:257 +msgid "unable to restore registry" +msgstr "无法恢复注册表" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/gidlist.c:79 +#: lib/util/sudo_conf.c:191 lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 +#: lib/util/sudo_conf.c:558 src/conversation.c:82 src/exec_common.c:112 +#: src/exec_common.c:128 src/exec_common.c:137 src/exec_monitor.c:210 +#: src/exec_monitor.c:465 src/exec_monitor.c:471 src/exec_monitor.c:479 +#: src/exec_monitor.c:487 src/exec_monitor.c:494 src/exec_monitor.c:501 +#: src/exec_monitor.c:508 src/exec_monitor.c:515 src/exec_monitor.c:522 +#: src/exec_monitor.c:529 src/exec_monitor.c:536 src/exec_nopty.c:212 +#: src/exec_nopty.c:218 src/exec_nopty.c:227 src/exec_nopty.c:234 +#: src/exec_nopty.c:241 src/exec_nopty.c:248 src/exec_nopty.c:255 +#: src/exec_nopty.c:262 src/exec_nopty.c:269 src/exec_nopty.c:276 +#: src/exec_nopty.c:283 src/exec_nopty.c:290 src/exec_nopty.c:297 +#: src/exec_nopty.c:305 src/exec_nopty.c:467 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:994 +#: src/exec_pty.c:1157 src/exec_pty.c:1163 src/exec_pty.c:1172 +#: src/exec_pty.c:1179 src/exec_pty.c:1186 src/exec_pty.c:1193 +#: src/exec_pty.c:1200 src/exec_pty.c:1207 src/exec_pty.c:1214 +#: src/exec_pty.c:1221 src/exec_pty.c:1228 src/exec_pty.c:1235 +#: src/exec_pty.c:1243 src/exec_pty.c:1661 src/load_plugins.c:57 +#: src/load_plugins.c:70 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:203 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:676 src/sudo.c:686 src/sudo.c:706 src/sudo.c:725 +#: src/sudo.c:734 src/sudo.c:743 src/sudo.c:760 src/sudo.c:801 src/sudo.c:811 +#: src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 src/sudo.c:1266 +#: src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 src/sudo_edit.c:886 +#: src/sudo_edit.c:1000 src/sudo_edit.c:1020 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: lib/util/aix.c:280 lib/util/gidlist.c:69 lib/util/sudo_conf.c:192 +#: lib/util/sudo_conf.c:277 lib/util/sudo_conf.c:354 lib/util/sudo_conf.c:558 +#: src/conversation.c:83 src/exec_common.c:112 src/exec_common.c:129 +#: src/exec_common.c:138 src/exec_monitor.c:465 src/exec_monitor.c:471 +#: src/exec_monitor.c:479 src/exec_monitor.c:487 src/exec_monitor.c:494 +#: src/exec_monitor.c:501 src/exec_monitor.c:508 src/exec_monitor.c:515 +#: src/exec_monitor.c:522 src/exec_monitor.c:529 src/exec_monitor.c:536 +#: src/exec_nopty.c:212 src/exec_nopty.c:218 src/exec_nopty.c:227 +#: src/exec_nopty.c:234 src/exec_nopty.c:241 src/exec_nopty.c:248 +#: src/exec_nopty.c:255 src/exec_nopty.c:262 src/exec_nopty.c:269 +#: src/exec_nopty.c:276 src/exec_nopty.c:283 src/exec_nopty.c:290 +#: src/exec_nopty.c:297 src/exec_nopty.c:305 src/exec_pty.c:778 +#: src/exec_pty.c:787 src/exec_pty.c:844 src/exec_pty.c:1157 +#: src/exec_pty.c:1163 src/exec_pty.c:1172 src/exec_pty.c:1179 +#: src/exec_pty.c:1186 src/exec_pty.c:1193 src/exec_pty.c:1200 +#: src/exec_pty.c:1207 src/exec_pty.c:1214 src/exec_pty.c:1221 +#: src/exec_pty.c:1228 src/exec_pty.c:1235 src/exec_pty.c:1243 +#: src/exec_pty.c:1661 src/load_plugins.c:219 src/load_plugins.c:240 +#: src/load_plugins.c:309 src/load_plugins.c:315 src/load_plugins.c:329 +#: src/load_plugins.c:335 src/parse_args.c:182 src/parse_args.c:204 +#: src/parse_args.c:278 src/parse_args.c:565 src/parse_args.c:587 +#: src/preserve_fds.c:52 src/preserve_fds.c:137 src/selinux.c:89 +#: src/selinux.c:314 src/selinux.c:437 src/selinux.c:446 src/sesh.c:115 +#: src/sudo.c:616 src/sudo.c:834 src/sudo.c:1071 src/sudo.c:1092 +#: src/sudo.c:1266 src/sudo.c:1382 src/sudo_edit.c:256 src/sudo_edit.c:789 +#: src/sudo_edit.c:886 src/sudo_edit.c:1000 src/sudo_edit.c:1020 +msgid "unable to allocate memory" +msgstr "无法分配内存" + +#: lib/util/strsignal.c:53 +msgid "Unknown signal" +msgstr "未知信号" + +#: lib/util/strtoid.c:82 lib/util/strtoid.c:129 lib/util/strtoid.c:157 +#: lib/util/strtomode.c:54 lib/util/strtonum.c:63 lib/util/strtonum.c:181 +msgid "invalid value" +msgstr "值无效" + +#: lib/util/strtoid.c:89 lib/util/strtoid.c:136 lib/util/strtoid.c:164 +#: lib/util/strtomode.c:60 lib/util/strtonum.c:66 lib/util/strtonum.c:193 +msgid "value too large" +msgstr "值过大" + +#: lib/util/strtoid.c:91 lib/util/strtoid.c:142 lib/util/strtomode.c:60 +#: lib/util/strtonum.c:66 lib/util/strtonum.c:187 +msgid "value too small" +msgstr "值过小" + +#: lib/util/sudo_conf.c:210 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "%2$s 第 %3$u 行的路径值“%1$s”无效" + +#: lib/util/sudo_conf.c:376 lib/util/sudo_conf.c:429 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "%3$s 第 %4$u 行的 %1$s 的值“%2$s”无效" + +#: lib/util/sudo_conf.c:397 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "不支持 %2$s 第 %3$u 行的组来源“%1$s”" + +#: lib/util/sudo_conf.c:413 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "%2$s 第 %3$u 行的最大组数“%1$s”无效" + +#: lib/util/sudo_conf.c:574 +#, c-format +msgid "unable to stat %s" +msgstr "无法 stat %s" + +#: lib/util/sudo_conf.c:577 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 不是常规文件" + +#: lib/util/sudo_conf.c:580 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 属于用户 ID %u,应为 %u" + +#: lib/util/sudo_conf.c:584 +#, c-format +msgid "%s is world writable" +msgstr "%s 可被任何人写" + +#: lib/util/sudo_conf.c:587 +#, c-format +msgid "%s is group writable" +msgstr "%s 可被用户组写" + +#: lib/util/sudo_conf.c:597 src/selinux.c:213 src/selinux.c:230 src/sudo.c:360 +#, c-format +msgid "unable to open %s" +msgstr "打不开 %s" + +#: src/exec.c:165 +#, c-format +msgid "unknown login class %s" +msgstr "未知的登录类别 %s" + +#: src/exec.c:178 +msgid "unable to set user context" +msgstr "无法设置用户环境" + +#: src/exec.c:194 +msgid "unable to set process priority" +msgstr "无法设置进程优先级" + +#: src/exec.c:202 +#, c-format +msgid "unable to change root to %s" +msgstr "无法从 root 切换到 %s" + +#: src/exec.c:215 src/exec.c:221 src/exec.c:228 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "无法切换到以用户 ID(%u,%u)运行" + +#: src/exec.c:246 +#, c-format +msgid "unable to change directory to %s" +msgstr "无法将目录切换到 %s" + +#: src/exec.c:345 src/exec_monitor.c:574 src/exec_monitor.c:576 +#: src/exec_nopty.c:525 src/exec_pty.c:522 src/exec_pty.c:1329 +#: src/exec_pty.c:1331 src/signal.c:148 src/signal.c:162 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "无法设置 %d 信号的处理程序" + +#: src/exec_common.c:171 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "无法从 PRIV_LIMIT 中移除 PRIV_PROC_EXEC" + +#: src/exec_monitor.c:364 +msgid "error reading from socketpair" +msgstr "从套接字对读取出错" + +#: src/exec_monitor.c:381 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "联络通道的回应类型异常:%d" + +#: src/exec_monitor.c:473 src/exec_monitor.c:481 src/exec_monitor.c:489 +#: src/exec_monitor.c:496 src/exec_monitor.c:503 src/exec_monitor.c:510 +#: src/exec_monitor.c:517 src/exec_monitor.c:524 src/exec_monitor.c:531 +#: src/exec_monitor.c:538 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:644 +#: src/exec_pty.c:649 src/exec_pty.c:746 src/exec_pty.c:753 src/exec_pty.c:850 +#: src/exec_pty.c:1165 src/exec_pty.c:1174 src/exec_pty.c:1181 +#: src/exec_pty.c:1188 src/exec_pty.c:1195 src/exec_pty.c:1202 +#: src/exec_pty.c:1209 src/exec_pty.c:1216 src/exec_pty.c:1223 +#: src/exec_pty.c:1230 src/exec_pty.c:1237 src/exec_pty.c:1614 +#: src/exec_pty.c:1624 src/exec_pty.c:1669 src/exec_pty.c:1676 +#: src/exec_pty.c:1703 +msgid "unable to add event to queue" +msgstr "无法将事件添加到队列" + +#: src/exec_monitor.c:592 +msgid "unable to set controlling tty" +msgstr "无法设置控制终端" + +#: src/exec_monitor.c:600 src/exec_nopty.c:364 src/exec_pty.c:1408 +#: src/exec_pty.c:1429 src/exec_pty.c:1449 src/tgetpass.c:292 +msgid "unable to create pipe" +msgstr "无法创建管道" + +#: src/exec_monitor.c:608 +msgid "unable to receive message from parent" +msgstr "无法从父(进程)接收消息" + +#: src/exec_monitor.c:614 src/exec_nopty.c:382 src/exec_pty.c:1487 +#: src/tgetpass.c:296 +msgid "unable to fork" +msgstr "无法执行 fork" + +#: src/exec_monitor.c:628 src/sesh.c:125 src/sudo.c:1130 +#, c-format +msgid "unable to execute %s" +msgstr "无法执行 %s" + +#: src/exec_monitor.c:711 src/exec_nopty.c:435 +msgid "unable to restore tty label" +msgstr "无法恢复终端标签" + +#: src/exec_nopty.c:358 src/exec_pty.c:1338 +msgid "policy plugin failed session initialization" +msgstr "策略插件会话初始化失败" + +#: src/exec_nopty.c:424 src/exec_pty.c:1574 +msgid "error in event loop" +msgstr "事件循环中有错误" + +#: src/exec_nopty.c:533 src/exec_pty.c:557 src/signal.c:110 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "无法恢复 %d 信号的处理程序" + +#: src/exec_pty.c:156 +msgid "unable to allocate pty" +msgstr "无法分配伪终端" + +#: src/exec_pty.c:1318 +msgid "unable to create sockets" +msgstr "无法创建套接字" + +#: src/exec_pty.c:1531 +msgid "unable to send message to monitor process" +msgstr "无法向监视进程发送消息" + +#: src/load_plugins.c:55 src/load_plugins.c:68 src/load_plugins.c:90 +#: src/load_plugins.c:120 src/load_plugins.c:128 src/load_plugins.c:134 +#: src/load_plugins.c:175 src/load_plugins.c:183 src/load_plugins.c:190 +#: src/load_plugins.c:196 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "在加载插件“%3$s”时在 %1$s 第 %2$d 行出错" + +#: src/load_plugins.c:92 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s:%s" + +#: src/load_plugins.c:130 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必须属于用户 ID %d(的用户)" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s 必须只对其所有者可写" + +#: src/load_plugins.c:177 +#, c-format +msgid "unable to load %s: %s" +msgstr "无法加载 %s:%s" + +#: src/load_plugins.c:185 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "在 %2$s 中找不到符号“%1$s”" + +#: src/load_plugins.c:192 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "%2$s 中的策略类型 %1$d 未知" + +#: src/load_plugins.c:198 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "%3$s 中发现不兼容的插件主版本号 %1$d(应为 %2$d)" + +#: src/load_plugins.c:207 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "忽略位于 %2$s 第 %3$d 行的策略插件“%1$s”" + +#: src/load_plugins.c:209 +msgid "only a single policy plugin may be specified" +msgstr "只能指定一个策略插件" + +#: src/load_plugins.c:212 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "忽略位于 %2$s 第 %3$d 行的重复策略插件“%1$s”" + +#: src/load_plugins.c:231 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "忽略位于 %2$s 第 %3$d 行的重复 I/O 插件“%1$s”" + +#: src/load_plugins.c:347 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "策略插件 %s 不包含 check_policy 方法" + +#: src/net_ifs.c:180 src/net_ifs.c:197 src/net_ifs.c:342 src/sudo.c:470 +#, c-format +msgid "internal error, %s overflow" +msgstr "内部错误,%s 溢出" + +#: src/parse_args.c:224 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "无效的环境变量名:%s" + +#: src/parse_args.c:320 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "-C 选项的参数必须是一个大于等于 3 的数字" + +#: src/parse_args.c:505 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "您不能同时指定“-i”和“-s”选项" + +#: src/parse_args.c:509 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "您不能同时指定“-i”和“-E”选项" + +#: src/parse_args.c:519 +msgid "the `-E' option is not valid in edit mode" +msgstr "“-E”选项在编辑模式中无效" + +#: src/parse_args.c:521 +msgid "you may not specify environment variables in edit mode" +msgstr "在编辑模式中您不能指定环境变量" + +#: src/parse_args.c:529 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "“-U”选项只能与“-l”选项一起使用" + +#: src/parse_args.c:533 +msgid "the `-A' and `-S' options may not be used together" +msgstr "“-A”和“-S”选项不可同时使用" + +#: src/parse_args.c:609 +msgid "sudoedit is not supported on this platform" +msgstr "此平台不支持 sudoedit" + +#: src/parse_args.c:682 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "只能指定 -e、-h、-i、-K、-l、-s、-v 或 -V 选项中的一个" + +#: src/parse_args.c:696 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - 以其他用户身份编辑文件\n" +"\n" + +#: src/parse_args.c:698 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - 以其他用户身份执行一条命令\n" +"\n" + +#: src/parse_args.c:703 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"选项:\n" + +#: src/parse_args.c:705 +msgid "use a helper program for password prompting" +msgstr "使用助手程序进行密码提示" + +#: src/parse_args.c:708 +msgid "use specified BSD authentication type" +msgstr "使用指定的 BSD 认证类型" + +#: src/parse_args.c:711 +msgid "run command in the background" +msgstr "在后台运行命令" + +#: src/parse_args.c:713 +msgid "close all file descriptors >= num" +msgstr "关闭所有 >= num 的文件描述符" + +#: src/parse_args.c:716 +msgid "run command with the specified BSD login class" +msgstr "以指定的 BSD 登录类别运行命令" + +#: src/parse_args.c:719 +msgid "preserve user environment when running command" +msgstr "在执行命令时保留用户环境" + +#: src/parse_args.c:721 +msgid "preserve specific environment variables" +msgstr "保留特定的环境变量" + +#: src/parse_args.c:723 +msgid "edit files instead of running a command" +msgstr "编辑文件而非执行命令" + +#: src/parse_args.c:725 +msgid "run command as the specified group name or ID" +msgstr "以指定的用户组或 ID 执行命令" + +#: src/parse_args.c:727 +msgid "set HOME variable to target user's home dir" +msgstr "将 HOME 变量设为目标用户的主目录。" + +#: src/parse_args.c:729 +msgid "display help message and exit" +msgstr "显示帮助消息并退出" + +#: src/parse_args.c:731 +msgid "run command on host (if supported by plugin)" +msgstr "在主机上运行命令(如果插件支持)" + +#: src/parse_args.c:733 +msgid "run login shell as the target user; a command may also be specified" +msgstr "以目标用户身份运行一个登录 shell;可同时指定一条命令" + +#: src/parse_args.c:735 +msgid "remove timestamp file completely" +msgstr "完全移除时间戳文件" + +#: src/parse_args.c:737 +msgid "invalidate timestamp file" +msgstr "无效的时间戳文件" + +#: src/parse_args.c:739 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "列出用户权限或检查某个特定命令;对于长格式,使用两次" + +#: src/parse_args.c:741 +msgid "non-interactive mode, no prompts are used" +msgstr "非交互模式,不提示" + +#: src/parse_args.c:743 +msgid "preserve group vector instead of setting to target's" +msgstr "保留组向量,而非设置为目标的组向量" + +#: src/parse_args.c:745 +msgid "use the specified password prompt" +msgstr "使用指定的密码提示" + +#: src/parse_args.c:748 +msgid "create SELinux security context with specified role" +msgstr "以指定的角色创建 SELinux 安全环境" + +#: src/parse_args.c:751 +msgid "read password from standard input" +msgstr "从标准输入读取密码" + +#: src/parse_args.c:753 +msgid "run shell as the target user; a command may also be specified" +msgstr "以目标用户运行 shell;可同时指定一条命令" + +#: src/parse_args.c:756 +msgid "create SELinux security context with specified type" +msgstr "以指定的类型创建 SELinux 安全环境" + +#: src/parse_args.c:759 +msgid "terminate command after the specified time limit" +msgstr "在达到指定时间限制后终止命令" + +#: src/parse_args.c:761 +msgid "in list mode, display privileges for user" +msgstr "在列表模式中显示用户的权限" + +#: src/parse_args.c:763 +msgid "run command (or edit file) as specified user name or ID" +msgstr "以指定用户或 ID 运行命令(或编辑文件)" + +#: src/parse_args.c:765 +msgid "display version information and exit" +msgstr "显示版本信息并退出" + +#: src/parse_args.c:767 +msgid "update user's timestamp without running a command" +msgstr "更新用户的时间戳而不执行命令" + +#: src/parse_args.c:769 +msgid "stop processing command line arguments" +msgstr "停止处理命令行参数" + +#: src/selinux.c:83 +msgid "unable to open audit system" +msgstr "无法打开审查系统" + +#: src/selinux.c:93 +msgid "unable to send audit message" +msgstr "无法发送审查消息" + +#: src/selinux.c:121 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "无法 fgetfilecon %s" + +#: src/selinux.c:126 +#, c-format +msgid "%s changed labels" +msgstr "%s 修改了标签" + +#: src/selinux.c:131 +#, c-format +msgid "unable to restore context for %s" +msgstr "无法恢复 %s 的环境" + +#: src/selinux.c:172 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "无法打开 %s,将不重新标记终端" + +#: src/selinux.c:176 src/selinux.c:217 src/selinux.c:234 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s 不是字符型设备,将不重新标记终端" + +#: src/selinux.c:185 +msgid "unable to get current tty context, not relabeling tty" +msgstr "无法获取当前终端的环境,将不重新标记终端" + +#: src/selinux.c:192 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "未知的安全类“chr_file”,将不重新标记终端" + +#: src/selinux.c:197 +msgid "unable to get new tty context, not relabeling tty" +msgstr "无法获取新终端的环境,将不重新标记终端" + +#: src/selinux.c:204 +msgid "unable to set new tty context" +msgstr "无法设置新终端的环境" + +#: src/selinux.c:278 +#, c-format +msgid "you must specify a role for type %s" +msgstr "您必须为 %s 类型指定一个角色" + +#: src/selinux.c:284 +#, c-format +msgid "unable to get default type for role %s" +msgstr "无法获取 %s 角色的默认类型" + +#: src/selinux.c:302 +#, c-format +msgid "failed to set new role %s" +msgstr "设置新角色 %s 失败" + +#: src/selinux.c:306 +#, c-format +msgid "failed to set new type %s" +msgstr "设置新类型 %s 失败" + +#: src/selinux.c:318 +#, c-format +msgid "%s is not a valid context" +msgstr "%s 不是有效的环境" + +#: src/selinux.c:353 +msgid "failed to get old_context" +msgstr "无法获取 old_context" + +#: src/selinux.c:359 +msgid "unable to determine enforcing mode." +msgstr "无法确定强制模式。" + +#: src/selinux.c:376 +#, c-format +msgid "unable to set tty context to %s" +msgstr "无法将终端环境设置为 %s" + +#: src/selinux.c:415 +#, c-format +msgid "unable to set exec context to %s" +msgstr "无法向 %s 设置 exec 环境" + +#: src/selinux.c:422 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "无法向 %s 设置键创建环境" + +#: src/sesh.c:77 +msgid "requires at least one argument" +msgstr "要求至少有一个参数" + +#: src/sesh.c:106 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "无效的文件描述符数字:%s" + +#: src/sesh.c:120 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "无法以登录 shell 执行 %s" + +#: src/signal.c:88 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "无法保存 %d 信号的处理程序" + +#: src/solaris.c:81 +msgid "resource control limit has been reached" +msgstr "达到了资源控制限制" + +#: src/solaris.c:84 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "用户“%s”不是项目“%s”的成员" + +#: src/solaris.c:88 +msgid "the invoking task is final" +msgstr "调用的任务是最终的(final)" + +#: src/solaris.c:91 +#, c-format +msgid "could not join project \"%s\"" +msgstr "无法加入项目“%s”" + +#: src/solaris.c:96 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "不存在对应于项目“%s”的、接受默认绑定的资源池" + +#: src/solaris.c:100 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "指定的对应于项目“%s”的资源池不存在" + +#: src/solaris.c:104 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "无法为项目“%s”绑定到默认的资源池" + +#: src/solaris.c:110 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "对项目“%s”执行 setproject 失败" + +#: src/solaris.c:112 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "警告,对项目“%s”的资源控制分配失败" + +#: src/sudo.c:201 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo 版本 %s\n" + +#: src/sudo.c:203 +#, c-format +msgid "Configure options: %s\n" +msgstr "当前选项:%s\n" + +#: src/sudo.c:211 +msgid "fatal error, unable to load plugins" +msgstr "致命错误,无法加载插件" + +#: src/sudo.c:219 +msgid "unable to initialize policy plugin" +msgstr "无法初始化策略插件" + +#: src/sudo.c:263 +msgid "plugin did not return a command to execute" +msgstr "插件未返回能执行的命令" + +#: src/sudo.c:279 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "初始化 I/O 插件 %s 出错" + +#: src/sudo.c:302 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "异常的 sudo 模式 0x%x" + +#: src/sudo.c:535 +#, c-format +msgid "you do not exist in the %s database" +msgstr "%s 数据库中没有您" + +#: src/sudo.c:592 +msgid "unable to determine tty" +msgstr "无法确定终端" + +#: src/sudo.c:880 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s 必须属于用户 ID %d(的用户)并且设置 setuid 位" + +#: src/sudo.c:883 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "有效用户 ID 不是 %d,%s 位于一个设置了“nosuid”选项的文件系统或没有 root 权限的 NFS 文件系统中吗?" + +#: src/sudo.c:889 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "有效用户 ID 不是 %d,sudo 属于 root 并设置了 setuid 位吗?" + +#: src/sudo.c:942 +msgid "unable to set supplementary group IDs" +msgstr "无法设置补充组 ID" + +#: src/sudo.c:949 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "无法设置有效组 ID 来以组 ID %u 运行" + +#: src/sudo.c:955 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "无法设置组 ID 来以组 ID %u 运行" + +#: src/sudo.c:1012 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "异常的子进程终止条件:%d" + +#: src/sudo.c:1158 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "“check_policy”方法中缺少策略插件 %s" + +#: src/sudo.c:1176 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "策略插件 %s 不支持列出权限" + +#: src/sudo.c:1193 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "策略插件 %s不支持 -v 选项" + +#: src/sudo.c:1208 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "策略插件 %s 不支持 -k/-K 选项" + +#: src/sudo_edit.c:219 +msgid "no writable temporary directory found" +msgstr "未找到可写的临时目录" + +#: src/sudo_edit.c:286 src/sudo_edit.c:375 +msgid "unable to restore current working directory" +msgstr "无法恢复当前工作目录" + +#: src/sudo_edit.c:592 src/sudo_edit.c:704 +#, c-format +msgid "%s: not a regular file" +msgstr "%s:不是常规文件" + +#: src/sudo_edit.c:599 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s:不允许编辑符号链接" + +#: src/sudo_edit.c:602 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s:不允许编辑可写目录中的文件" + +#: src/sudo_edit.c:635 src/sudo_edit.c:742 +#, c-format +msgid "%s: short write" +msgstr "%s:截短写入" + +#: src/sudo_edit.c:705 +#, c-format +msgid "%s left unmodified" +msgstr "%s 并未修改" + +#: src/sudo_edit.c:718 src/sudo_edit.c:903 +#, c-format +msgid "%s unchanged" +msgstr "%s 已更改" + +#: src/sudo_edit.c:731 src/sudo_edit.c:753 +#, c-format +msgid "unable to write to %s" +msgstr "无法写入 %s" + +#: src/sudo_edit.c:732 src/sudo_edit.c:751 src/sudo_edit.c:754 +#: src/sudo_edit.c:928 src/sudo_edit.c:932 +#, c-format +msgid "contents of edit session left in %s" +msgstr "编辑会话的内容留在了 %s 中" + +#: src/sudo_edit.c:750 +msgid "unable to read temporary file" +msgstr "无法读取临时文件" + +#: src/sudo_edit.c:833 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh:内部错误:路径数量异常" + +#: src/sudo_edit.c:835 +msgid "sesh: unable to create temporary files" +msgstr "sesh:无法创建临时文件" + +#: src/sudo_edit.c:837 src/sudo_edit.c:935 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh:未知错误 %d" + +#: src/sudo_edit.c:927 +msgid "unable to copy temporary files back to their original location" +msgstr "无法将临时文件复制回其原位置" + +#: src/sudo_edit.c:931 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "无法将某些临时文件复制回其原位置" + +#: src/sudo_edit.c:976 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "无法将用户 ID 切换到 root(%u)" + +#: src/sudo_edit.c:993 +msgid "plugin error: missing file list for sudoedit" +msgstr "插件错误:缺少 sudoedit 的文件列表" + +#: src/sudo_edit.c:1034 src/sudo_edit.c:1047 +msgid "unable to read the clock" +msgstr "无法读取时钟" + +#: src/tgetpass.c:101 +msgid "timed out reading password" +msgstr "读密码超时" + +#: src/tgetpass.c:104 +msgid "no password was provided" +msgstr "未提供密码" + +#: src/tgetpass.c:107 +msgid "unable to read password" +msgstr "无法读取密码" + +#: src/tgetpass.c:141 +msgid "no tty present and no askpass program specified" +msgstr "没有终端存在,且未指定 askpass 程序" + +#: src/tgetpass.c:150 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "没有指定 askpass 程序,尝试设置 SUDO_ASKPASS" + +#: src/tgetpass.c:307 +#, c-format +msgid "unable to set gid to %u" +msgstr "无法将组 ID 设为 %u" + +#: src/tgetpass.c:311 +#, c-format +msgid "unable to set uid to %u" +msgstr "无法将用户 ID 设为 %u" + +#: src/tgetpass.c:316 +#, c-format +msgid "unable to run %s" +msgstr "无法执行 %s" + +#: src/utmp.c:271 +msgid "unable to save stdin" +msgstr "无法保存 stdin" + +#: src/utmp.c:273 +msgid "unable to dup2 stdin" +msgstr "无法 dup2 stdin" + +#: src/utmp.c:276 +msgid "unable to restore stdin" +msgstr "无法恢复 stdin" + +#~ msgid "unable to get group vector" +#~ msgstr "无法获取组向量" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "未知的用户 ID %u:您是?" + +#~ msgid "error reading from signal pipe" +#~ msgstr "从单管道读取出错" + +#~ msgid "error reading from pipe" +#~ msgstr "从管道读取出错" + +#~ msgid "internal error, tried allocate zero bytes" +#~ msgstr "内部错误,试图分配 0 个字节" + +#~ msgid "unable to set terminal to raw mode" +#~ msgstr "无法将终端设为原始模式" + +#~ msgid "unable to open socket" +#~ msgstr "无法打开套接字" + +#~ msgid "%s: %s: %s\n" +#~ msgstr "%s:%s:%s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s:%s\n" + +#~ msgid "internal error, tried to emalloc2(0)" +#~ msgstr "内部错误,试图 emalloc2(0)" + +#~ msgid "internal error, tried to ecalloc(0)" +#~ msgstr "内部错误,试图 ecalloc(0)" + +#~ msgid "internal error, tried to erealloc(0)" +#~ msgstr "内部错误,试图 erealloc(0)" + +#~ msgid "internal error, tried to erealloc3(0)" +#~ msgstr "内部错误,试图 erealloc3(0)" + +#~ msgid "internal error, tried to erecalloc(0)" +#~ msgstr "内部错误,试图 erecalloc(0)" + +#~ msgid "load_interfaces: overflow detected" +#~ msgstr "load_interfaces:检测到溢出" + +#~ msgid "value out of range" +#~ msgstr "值超出范围" + +#~ msgid "select failed" +#~ msgstr "select 失败" + +#~ msgid "list user's available commands\n" +#~ msgstr "列出用户能执行的命令\n" + +#~ msgid "run a shell as target user\n" +#~ msgstr "以目标用户身份运行 shell\n" + +#~ msgid "when listing, list specified user's privileges\n" +#~ msgstr "在列表时,列出指定用户的权限\n" + +#~ msgid ": " +#~ msgstr ":" + +#~ msgid "internal error, emalloc2() overflow" +#~ msgstr "内部错误,emalloc2() 溢出" + +#~ msgid "internal error, erealloc3() overflow" +#~ msgstr "内部错误,erealloc3() 错误" + +#~ msgid "%s: at least one policy plugin must be specified" +#~ msgstr "%s:至少要指定一个策略插件" + +#~ msgid "must be setuid root" +#~ msgstr "必须为 setuid root" + +#~ msgid "the argument to -D must be between 1 and 9 inclusive" +#~ msgstr "-D 选项的参数必须介于 1 到 9(含 1 和 9)" diff --git a/utsudo-0.0.2/po/zh_TW.mo b/utsudo-0.0.2/po/zh_TW.mo new file mode 100644 index 0000000000000000000000000000000000000000..01d2dd51800d4d6f8f60e7926de9f430362d2460 GIT binary patch literal 18824 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 literal 0 HcmV?d00001 diff --git a/utsudo-0.0.2/po/zh_TW.po b/utsudo-0.0.2/po/zh_TW.po new file mode 100644 index 0000000..7da953a --- /dev/null +++ b/utsudo-0.0.2/po/zh_TW.po @@ -0,0 +1,942 @@ +# Chinese(Taiwan) translation for sudo. +# This file is put in the public domain. +# +# 林博仁 (Buo-ren, Lin) , 2018. +# pan93412 , 2019. +msgid "" +msgstr "" +"Project-Id-Version: sudo 1.8.29rc1\n" +"Report-Msgid-Bugs-To: https://bugzilla.sudo.ws\n" +"POT-Creation-Date: 2019-10-21 19:55-0600\n" +"PO-Revision-Date: 2019-10-24 21:13+0800\n" +"Last-Translator: pan93412 \n" +"Language-Team: Chinese (traditional) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Bugs: Report translation errors to the Language-Team address.\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 19.08.2\n" + +#: lib/util/aix.c:92 lib/util/aix.c:172 +msgid "unable to open userdb" +msgstr "無法開啟使用者資料庫" + +#: lib/util/aix.c:227 +#, c-format +msgid "unable to switch to registry \"%s\" for %s" +msgstr "無法將 %2$s 切換至「%1$s」登錄表" + +#: lib/util/aix.c:252 +msgid "unable to restore registry" +msgstr "無法還原登錄表" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/gidlist.c:81 +#: lib/util/sudo_conf.c:193 lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 +#: lib/util/sudo_conf.c:560 src/conversation.c:84 src/exec_common.c:114 +#: src/exec_common.c:130 src/exec_common.c:139 src/exec_monitor.c:212 +#: src/exec_monitor.c:467 src/exec_monitor.c:473 src/exec_monitor.c:481 +#: src/exec_monitor.c:489 src/exec_monitor.c:496 src/exec_monitor.c:503 +#: src/exec_monitor.c:510 src/exec_monitor.c:517 src/exec_monitor.c:524 +#: src/exec_monitor.c:531 src/exec_monitor.c:538 src/exec_nopty.c:214 +#: src/exec_nopty.c:220 src/exec_nopty.c:229 src/exec_nopty.c:236 +#: src/exec_nopty.c:243 src/exec_nopty.c:250 src/exec_nopty.c:257 +#: src/exec_nopty.c:264 src/exec_nopty.c:271 src/exec_nopty.c:278 +#: src/exec_nopty.c:285 src/exec_nopty.c:292 src/exec_nopty.c:299 +#: src/exec_nopty.c:307 src/exec_nopty.c:480 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1002 +#: src/exec_pty.c:1165 src/exec_pty.c:1171 src/exec_pty.c:1180 +#: src/exec_pty.c:1187 src/exec_pty.c:1194 src/exec_pty.c:1201 +#: src/exec_pty.c:1208 src/exec_pty.c:1215 src/exec_pty.c:1222 +#: src/exec_pty.c:1229 src/exec_pty.c:1236 src/exec_pty.c:1243 +#: src/exec_pty.c:1251 src/exec_pty.c:1668 src/load_plugins.c:59 +#: src/load_plugins.c:72 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:207 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:679 src/sudo.c:689 src/sudo.c:710 src/sudo.c:729 +#: src/sudo.c:738 src/sudo.c:747 src/sudo.c:764 src/sudo.c:805 src/sudo.c:815 +#: src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 src/sudo.c:1240 +#: src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 src/sudo_edit.c:891 +#: src/sudo_edit.c:1005 src/sudo_edit.c:1025 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: lib/util/aix.c:275 lib/util/gidlist.c:71 lib/util/sudo_conf.c:194 +#: lib/util/sudo_conf.c:279 lib/util/sudo_conf.c:356 lib/util/sudo_conf.c:560 +#: src/conversation.c:85 src/exec_common.c:114 src/exec_common.c:131 +#: src/exec_common.c:140 src/exec_monitor.c:467 src/exec_monitor.c:473 +#: src/exec_monitor.c:481 src/exec_monitor.c:489 src/exec_monitor.c:496 +#: src/exec_monitor.c:503 src/exec_monitor.c:510 src/exec_monitor.c:517 +#: src/exec_monitor.c:524 src/exec_monitor.c:531 src/exec_monitor.c:538 +#: src/exec_nopty.c:214 src/exec_nopty.c:220 src/exec_nopty.c:229 +#: src/exec_nopty.c:236 src/exec_nopty.c:243 src/exec_nopty.c:250 +#: src/exec_nopty.c:257 src/exec_nopty.c:264 src/exec_nopty.c:271 +#: src/exec_nopty.c:278 src/exec_nopty.c:285 src/exec_nopty.c:292 +#: src/exec_nopty.c:299 src/exec_nopty.c:307 src/exec_pty.c:786 +#: src/exec_pty.c:795 src/exec_pty.c:852 src/exec_pty.c:1165 +#: src/exec_pty.c:1171 src/exec_pty.c:1180 src/exec_pty.c:1187 +#: src/exec_pty.c:1194 src/exec_pty.c:1201 src/exec_pty.c:1208 +#: src/exec_pty.c:1215 src/exec_pty.c:1222 src/exec_pty.c:1229 +#: src/exec_pty.c:1236 src/exec_pty.c:1243 src/exec_pty.c:1251 +#: src/exec_pty.c:1668 src/load_plugins.c:225 src/load_plugins.c:246 +#: src/load_plugins.c:315 src/load_plugins.c:321 src/load_plugins.c:335 +#: src/load_plugins.c:341 src/parse_args.c:186 src/parse_args.c:208 +#: src/parse_args.c:282 src/parse_args.c:583 src/parse_args.c:605 +#: src/preserve_fds.c:54 src/preserve_fds.c:139 src/selinux.c:91 +#: src/selinux.c:337 src/selinux.c:450 src/selinux.c:459 src/sesh.c:117 +#: src/sudo.c:619 src/sudo.c:841 src/sudo.c:1041 src/sudo.c:1062 +#: src/sudo.c:1240 src/sudo.c:1356 src/sudo_edit.c:258 src/sudo_edit.c:794 +#: src/sudo_edit.c:891 src/sudo_edit.c:1005 src/sudo_edit.c:1025 +msgid "unable to allocate memory" +msgstr "無法分配記憶體" + +#: lib/util/strsignal.c:55 +msgid "Unknown signal" +msgstr "訊號未知" + +#: lib/util/strtoid.c:96 lib/util/strtomode.c:56 lib/util/strtonum.c:161 +#: lib/util/strtonum.c:196 +msgid "invalid value" +msgstr "數值無效" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:173 +msgid "value too large" +msgstr "數值過大" + +#: lib/util/strtomode.c:62 lib/util/strtonum.c:167 +msgid "value too small" +msgstr "數值過小" + +#: lib/util/sudo_conf.c:212 +#, c-format +msgid "invalid Path value \"%s\" in %s, line %u" +msgstr "於 %2$s 第 %3$u 行發現無效的 Path 值「%1$s」" + +#: lib/util/sudo_conf.c:378 lib/util/sudo_conf.c:431 +#, c-format +msgid "invalid value for %s \"%s\" in %s, line %u" +msgstr "於 %3$s 中第 %4$u 行發現用於 %1$s 的「%2$s」無效數值" + +#: lib/util/sudo_conf.c:399 +#, c-format +msgid "unsupported group source \"%s\" in %s, line %u" +msgstr "於「%2$s」第 %3$u 行發現不支援的「%1$s」群組來源" + +#: lib/util/sudo_conf.c:415 +#, c-format +msgid "invalid max groups \"%s\" in %s, line %u" +msgstr "於 %2$s 第 %3$u 行發現無效的「%1$s」最大群組" + +#: lib/util/sudo_conf.c:576 +#, c-format +msgid "unable to stat %s" +msgstr "無法取得 %s 檔案的資訊" + +#: lib/util/sudo_conf.c:579 +#, c-format +msgid "%s is not a regular file" +msgstr "%s 非一般檔案" + +#: lib/util/sudo_conf.c:582 +#, c-format +msgid "%s is owned by uid %u, should be %u" +msgstr "%s 不應由使用者 ID 為 %u 的使用者所擁有,應為 %u" + +#: lib/util/sudo_conf.c:586 +#, c-format +msgid "%s is world writable" +msgstr "%s 允許所有使用者寫入" + +#: lib/util/sudo_conf.c:589 +#, c-format +msgid "%s is group writable" +msgstr "%s 允許群組寫入" + +#: lib/util/sudo_conf.c:599 src/selinux.c:233 src/selinux.c:250 src/sudo.c:363 +#, c-format +msgid "unable to open %s" +msgstr "無法開啟 %s" + +#: src/exec.c:111 +#, c-format +msgid "unknown login class %s" +msgstr "未知的 %s 登入類別" + +#: src/exec.c:123 +msgid "unable to set user context" +msgstr "無法設定使用者上下文" + +#: src/exec.c:139 +msgid "unable to set process priority" +msgstr "無法設定行程優先層級" + +#: src/exec.c:150 +#, c-format +msgid "unable to change root to %s" +msgstr "無法切換根目錄至 %s" + +#: src/exec.c:163 src/exec.c:169 src/exec.c:176 +#, c-format +msgid "unable to change to runas uid (%u, %u)" +msgstr "無法變更至 runas 使用者 ID (%u, %u)" + +#: src/exec.c:194 +#, c-format +msgid "unable to change directory to %s" +msgstr "無法變更目錄至 %s" + +#: src/exec.c:293 src/exec_monitor.c:576 src/exec_monitor.c:578 +#: src/exec_nopty.c:538 src/exec_pty.c:530 src/exec_pty.c:1336 +#: src/exec_pty.c:1338 src/signal.c:150 src/signal.c:164 +#, c-format +msgid "unable to set handler for signal %d" +msgstr "無法設定用於處理 %d 訊號的程式" + +#: src/exec_common.c:173 +msgid "unable to remove PRIV_PROC_EXEC from PRIV_LIMIT" +msgstr "無法自 PRIV_LIMIT 移除 PRIV_PROC_EXEC" + +#: src/exec_monitor.c:366 +msgid "error reading from socketpair" +msgstr "自 socketpair 讀取資料時發生錯誤" + +#: src/exec_monitor.c:383 +#, c-format +msgid "unexpected reply type on backchannel: %d" +msgstr "未預期的 backchannel 回應類型:%d" + +#: src/exec_monitor.c:475 src/exec_monitor.c:483 src/exec_monitor.c:491 +#: src/exec_monitor.c:498 src/exec_monitor.c:505 src/exec_monitor.c:512 +#: src/exec_monitor.c:519 src/exec_monitor.c:526 src/exec_monitor.c:533 +#: src/exec_monitor.c:540 src/exec_nopty.c:222 src/exec_nopty.c:231 +#: src/exec_nopty.c:238 src/exec_nopty.c:245 src/exec_nopty.c:252 +#: src/exec_nopty.c:259 src/exec_nopty.c:266 src/exec_nopty.c:273 +#: src/exec_nopty.c:280 src/exec_nopty.c:287 src/exec_nopty.c:294 +#: src/exec_nopty.c:301 src/exec_nopty.c:309 src/exec_pty.c:652 +#: src/exec_pty.c:657 src/exec_pty.c:754 src/exec_pty.c:761 src/exec_pty.c:858 +#: src/exec_pty.c:1173 src/exec_pty.c:1182 src/exec_pty.c:1189 +#: src/exec_pty.c:1196 src/exec_pty.c:1203 src/exec_pty.c:1210 +#: src/exec_pty.c:1217 src/exec_pty.c:1224 src/exec_pty.c:1231 +#: src/exec_pty.c:1238 src/exec_pty.c:1245 src/exec_pty.c:1621 +#: src/exec_pty.c:1631 src/exec_pty.c:1676 src/exec_pty.c:1683 +#: src/exec_pty.c:1710 +msgid "unable to add event to queue" +msgstr "無法新增事件至佇列中" + +#: src/exec_monitor.c:594 +msgid "unable to set controlling tty" +msgstr "無法設定控制終端" + +#: src/exec_monitor.c:602 src/exec_nopty.c:366 src/exec_pty.c:1415 +#: src/exec_pty.c:1436 src/exec_pty.c:1456 src/tgetpass.c:307 +msgid "unable to create pipe" +msgstr "無法建立管線" + +#: src/exec_monitor.c:610 +msgid "unable to receive message from parent" +msgstr "無法自上層接收訊息" + +#: src/exec_monitor.c:624 src/exec_nopty.c:395 src/exec_pty.c:1494 +#: src/tgetpass.c:311 +msgid "unable to fork" +msgstr "無法複製 (fork) 出新行程" + +#: src/exec_monitor.c:628 src/exec_monitor.c:727 src/exec_nopty.c:448 +msgid "unable to restore tty label" +msgstr "無法還原終端標籤 (tty label)" + +#: src/exec_monitor.c:644 src/sesh.c:127 src/sudo.c:1100 +#, c-format +msgid "unable to execute %s" +msgstr "無法執行 %s" + +#: src/exec_nopty.c:360 src/exec_pty.c:1345 +msgid "policy plugin failed session initialization" +msgstr "政策外掛程式初始化工作階段失敗" + +#: src/exec_nopty.c:437 src/exec_pty.c:1581 +msgid "error in event loop" +msgstr "在事件處理迴圈中發生錯誤" + +#: src/exec_nopty.c:546 src/exec_pty.c:565 src/signal.c:112 +#, c-format +msgid "unable to restore handler for signal %d" +msgstr "無法還原用於處理 %d 訊號的程序" + +#: src/exec_pty.c:158 +msgid "unable to allocate pty" +msgstr "無法分配虛擬終端機" + +#: src/exec_pty.c:1325 +msgid "unable to create sockets" +msgstr "無法建立 socket 檔案" + +#: src/exec_pty.c:1538 +msgid "unable to send message to monitor process" +msgstr "無法傳送訊息至監控程序" + +#: src/load_plugins.c:57 src/load_plugins.c:70 src/load_plugins.c:92 +#: src/load_plugins.c:122 src/load_plugins.c:134 src/load_plugins.c:140 +#: src/load_plugins.c:181 src/load_plugins.c:189 src/load_plugins.c:196 +#: src/load_plugins.c:202 +#, c-format +msgid "error in %s, line %d while loading plugin \"%s\"" +msgstr "載入「%3$s」外掛程式時,發現 %1$s 中的第 %2$d 行有錯誤" + +#: src/load_plugins.c:94 +#, c-format +msgid "%s%s: %s" +msgstr "%s%s: %s" + +#: src/load_plugins.c:136 +#, c-format +msgid "%s must be owned by uid %d" +msgstr "%s 必須由使用者 ID 為 %d 的使用者所擁有" + +#: src/load_plugins.c:142 +#, c-format +msgid "%s must be only be writable by owner" +msgstr "%s 必須只能被其所有者可寫" + +#: src/load_plugins.c:183 +#, c-format +msgid "unable to load %s: %s" +msgstr "無法載入 %s:%s" + +#: src/load_plugins.c:191 +#, c-format +msgid "unable to find symbol \"%s\" in %s" +msgstr "無法在 %s 中找到「%s」符號" + +#: src/load_plugins.c:198 +#, c-format +msgid "unknown policy type %d found in %s" +msgstr "在 %2$s 發現未知的 %1$d sudo 政策類型" + +#: src/load_plugins.c:204 +#, c-format +msgid "incompatible plugin major version %d (expected %d) found in %s" +msgstr "在 %3$s 中發現不相容的外掛程式主版本號 %1$d(預期應為 %2$d)" + +#: src/load_plugins.c:213 +#, c-format +msgid "ignoring policy plugin \"%s\" in %s, line %d" +msgstr "無視 %2$s 中第 %3$d 行的「%1$s」sudo 政策外掛程式" + +#: src/load_plugins.c:215 +msgid "only a single policy plugin may be specified" +msgstr "只能指定一個 Sudo 政策外掛程式" + +#: src/load_plugins.c:218 +#, c-format +msgid "ignoring duplicate policy plugin \"%s\" in %s, line %d" +msgstr "無視 %2$s 中 %3$d 行的重複「%1$s」Sudo 政策外掛程式" + +#: src/load_plugins.c:237 +#, c-format +msgid "ignoring duplicate I/O plugin \"%s\" in %s, line %d" +msgstr "無視 %2$s 中第 %3$d 行的「%1$s」重複 I/O 外掛程式" + +#: src/load_plugins.c:353 +#, c-format +msgid "policy plugin %s does not include a check_policy method" +msgstr "%s 政策外掛程式未包含 check_policy 方法" + +#: src/net_ifs.c:183 src/net_ifs.c:200 src/net_ifs.c:345 src/sudo.c:473 +#, c-format +msgid "internal error, %s overflow" +msgstr "內部錯誤,%s 溢位" + +#: src/parse_args.c:228 +#, c-format +msgid "invalid environment variable name: %s" +msgstr "無效的環境變數名稱:%s" + +#: src/parse_args.c:329 +msgid "the argument to -C must be a number greater than or equal to 3" +msgstr "傳入 -C 的參數數字應該要等於或大於 3" + +#: src/parse_args.c:523 +msgid "you may not specify both the `-i' and `-s' options" +msgstr "不能同時指定 -i 跟 -s 指令列選項" + +#: src/parse_args.c:527 +msgid "you may not specify both the `-i' and `-E' options" +msgstr "不能同時指定 -i 跟 -E 指令列選項" + +#: src/parse_args.c:537 +msgid "the `-E' option is not valid in edit mode" +msgstr "-E 指令列選項在編輯模式中無效" + +#: src/parse_args.c:539 +msgid "you may not specify environment variables in edit mode" +msgstr "不能在編輯模式中指定環境變數" + +#: src/parse_args.c:547 +msgid "the `-U' option may only be used with the `-l' option" +msgstr "-U 指令列選項只能跟 -l 選項一起使用" + +#: src/parse_args.c:551 +msgid "the `-A' and `-S' options may not be used together" +msgstr "不能同時使用 -A 跟 -S 指令列選項" + +#: src/parse_args.c:627 +msgid "sudoedit is not supported on this platform" +msgstr "此平台不支援 sudoedit" + +#: src/parse_args.c:700 +msgid "Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified" +msgstr "只能指定以下指令列選項之一:-e、-h、-i、-K、-l、-s、-v、-V" + +#: src/parse_args.c:714 +#, c-format +msgid "" +"%s - edit files as another user\n" +"\n" +msgstr "" +"%s - 以另一個使用者的身份編輯檔案\n" +"\n" + +#: src/parse_args.c:716 +#, c-format +msgid "" +"%s - execute a command as another user\n" +"\n" +msgstr "" +"%s - 以另一個使用者的身份執行指令\n" +"\n" + +#: src/parse_args.c:721 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"指令列選項:\n" + +#: src/parse_args.c:723 +msgid "use a helper program for password prompting" +msgstr "使用助手程式詢問密碼" + +#: src/parse_args.c:726 +msgid "use specified BSD authentication type" +msgstr "使用指定的 BSD 身份驗證類型" + +#: src/parse_args.c:729 +msgid "run command in the background" +msgstr "在背景中執行指令" + +#: src/parse_args.c:731 +msgid "ring bell when prompting" +msgstr "提示時響鈴" + +#: src/parse_args.c:733 +msgid "close all file descriptors >= num" +msgstr "關閉所有 >= num 的檔案描述元" + +#: src/parse_args.c:736 +msgid "run command with the specified BSD login class" +msgstr "以指定的 BSD 登入類型執行指令" + +#: src/parse_args.c:739 +msgid "preserve user environment when running command" +msgstr "在執行指令時保留使用者的環境" + +#: src/parse_args.c:741 +msgid "preserve specific environment variables" +msgstr "保留指定的環境變數" + +#: src/parse_args.c:743 +msgid "edit files instead of running a command" +msgstr "編輯檔案而非執行指令" + +#: src/parse_args.c:745 +msgid "run command as the specified group name or ID" +msgstr "以指定的群組名稱或 ID 執行指令" + +#: src/parse_args.c:747 +msgid "set HOME variable to target user's home dir" +msgstr "設定 HOME 環境變數為目標使用者的家目錄" + +#: src/parse_args.c:749 +msgid "display help message and exit" +msgstr "顯示說明訊息並退出" + +#: src/parse_args.c:751 +msgid "run command on host (if supported by plugin)" +msgstr "在指定的主機上執行指令(若外掛程式支援)" + +#: src/parse_args.c:753 +msgid "run login shell as the target user; a command may also be specified" +msgstr "以目標使用者的身份執行登入 shell;亦可同時指定一個指令" + +#: src/parse_args.c:755 +msgid "remove timestamp file completely" +msgstr "完全地移除時間戳記檔案" + +#: src/parse_args.c:757 +msgid "invalidate timestamp file" +msgstr "使時間戳檔案無效化" + +#: src/parse_args.c:759 +msgid "list user's privileges or check a specific command; use twice for longer format" +msgstr "列出使用者的權限或是檢查特定的指令;指定兩次以用更長的格式輸出" + +#: src/parse_args.c:761 +msgid "non-interactive mode, no prompts are used" +msgstr "非互動式模式,不使用任何提示文字" + +#: src/parse_args.c:763 +msgid "preserve group vector instead of setting to target's" +msgstr "保留目前的群組集合而非設定為目標的群組集合" + +#: src/parse_args.c:765 +msgid "use the specified password prompt" +msgstr "使用指定的密碼提示文字" + +#: src/parse_args.c:768 +msgid "create SELinux security context with specified role" +msgstr "使用指定的角色建立 SELinux 安全上下文" + +#: src/parse_args.c:771 +msgid "read password from standard input" +msgstr "自標準輸入讀取密碼" + +#: src/parse_args.c:773 +msgid "run shell as the target user; a command may also be specified" +msgstr "以目標使用者的身份執行 shell;一個指令亦可同時被指定" + +#: src/parse_args.c:776 +msgid "create SELinux security context with specified type" +msgstr "使用指定的類型建立 SELinux 安全上下文" + +#: src/parse_args.c:779 +msgid "terminate command after the specified time limit" +msgstr "在指定的時間限制過後中止指令" + +#: src/parse_args.c:781 +msgid "in list mode, display privileges for user" +msgstr "在清單模式中顯示使用者的權限" + +#: src/parse_args.c:783 +msgid "run command (or edit file) as specified user name or ID" +msgstr "以指定的使用者名稱或 ID 來執行指令(或編輯檔案)" + +#: src/parse_args.c:785 +msgid "display version information and exit" +msgstr "顯示版本資訊並離開" + +#: src/parse_args.c:787 +msgid "update user's timestamp without running a command" +msgstr "更新使用者時間戳記而不執行指令" + +#: src/parse_args.c:789 +msgid "stop processing command line arguments" +msgstr "停止處理指令列引數" + +#: src/selinux.c:85 +msgid "unable to open audit system" +msgstr "無法開啟稽核系統" + +#: src/selinux.c:95 +msgid "unable to send audit message" +msgstr "無法傳送稽核訊息" + +#: src/selinux.c:129 +#, c-format +msgid "unable to fgetfilecon %s" +msgstr "無法對 %s 進行 fgetfilecon" + +#: src/selinux.c:134 +#, c-format +msgid "%s changed labels" +msgstr "%s 個變更的標籤" + +#: src/selinux.c:142 +#, c-format +msgid "unable to restore context for %s" +msgstr "無法還原「%s」的 SELinux 上下文" + +#: src/selinux.c:190 +#, c-format +msgid "unable to open %s, not relabeling tty" +msgstr "無法開啟 %s,將不重加終端機的標籤" + +#: src/selinux.c:194 src/selinux.c:237 src/selinux.c:254 +#, c-format +msgid "%s is not a character device, not relabeling tty" +msgstr "%s 不是一個字元裝置,將不重加終端機的標籤" + +#: src/selinux.c:203 +msgid "unable to get current tty context, not relabeling tty" +msgstr "無法取得目前的終端機內文,將不重加終端機的標籤" + +#: src/selinux.c:210 +msgid "unknown security class \"chr_file\", not relabeling tty" +msgstr "未知的安全類別「chr_file」,將不重加終端機的標籤" + +#: src/selinux.c:215 +msgid "unable to get new tty context, not relabeling tty" +msgstr "無法取得新的終端機上下文,將不重加終端機的標籤" + +#: src/selinux.c:224 +msgid "unable to set new tty context" +msgstr "無法設定新的終端機上下文" + +#: src/selinux.c:298 +#, c-format +msgid "you must specify a role for type %s" +msgstr "你必須對 %s 類別指定一個角色" + +#: src/selinux.c:304 +#, c-format +msgid "unable to get default type for role %s" +msgstr "無法取得 %s 角色的預設分類" + +#: src/selinux.c:316 +msgid "failed to get new context" +msgstr "無法取得新上下文" + +#: src/selinux.c:325 +#, c-format +msgid "failed to set new role %s" +msgstr "無法設定新的角色 %s" + +#: src/selinux.c:329 +#, c-format +msgid "failed to set new type %s" +msgstr "無法設定新的類別 %s" + +#: src/selinux.c:341 +#, c-format +msgid "%s is not a valid context" +msgstr "%s 不是有效的 SELinux 上下文" + +#: src/selinux.c:373 +msgid "failed to get old context" +msgstr "無法取得舊上下文" + +#: src/selinux.c:379 +msgid "unable to determine enforcing mode." +msgstr "無法判斷 SELinux 行使模式。" + +#: src/selinux.c:396 +#, c-format +msgid "unable to set tty context to %s" +msgstr "無法設定 tty 上下文為 %s" + +#: src/selinux.c:428 +#, c-format +msgid "unable to set exec context to %s" +msgstr "無法設定執行上下文為 %s" + +#: src/selinux.c:435 +#, c-format +msgid "unable to set key creation context to %s" +msgstr "無法設定金鑰建立上下文為 %s" + +#: src/sesh.c:79 +msgid "requires at least one argument" +msgstr "至少需要至少一個指令列引數" + +#: src/sesh.c:108 +#, c-format +msgid "invalid file descriptor number: %s" +msgstr "無效的檔案描述元:%s" + +#: src/sesh.c:122 +#, c-format +msgid "unable to run %s as a login shell" +msgstr "無法以登入 shell 執行 %s" + +#: src/signal.c:90 +#, c-format +msgid "unable to save handler for signal %d" +msgstr "無法儲存用於 %d 訊號的處理程式" + +#: src/solaris.c:83 +msgid "resource control limit has been reached" +msgstr "已達到資源控制的上限" + +#: src/solaris.c:86 +#, c-format +msgid "user \"%s\" is not a member of project \"%s\"" +msgstr "「%s」使用者不是「%s」專案的成員" + +#: src/solaris.c:90 +msgid "the invoking task is final" +msgstr "觸發的作業已經完成 (final)" + +#: src/solaris.c:93 +#, c-format +msgid "could not join project \"%s\"" +msgstr "無法加入「%s」專案" + +#: src/solaris.c:98 +#, c-format +msgid "no resource pool accepting default bindings exists for project \"%s\"" +msgstr "專案「%s」不存在接受預設繫結的資源集區" + +#: src/solaris.c:102 +#, c-format +msgid "specified resource pool does not exist for project \"%s\"" +msgstr "專案「%s」不存在指定的資源集區" + +#: src/solaris.c:106 +#, c-format +msgid "could not bind to default resource pool for project \"%s\"" +msgstr "無法將專案「%s」繫結到預設資源集區" + +#: src/solaris.c:112 +#, c-format +msgid "setproject failed for project \"%s\"" +msgstr "對專案「%s」進行專案設定程序 (setproject) 失敗" + +#: src/solaris.c:114 +#, c-format +msgid "warning, resource control assignment failed for project \"%s\"" +msgstr "警告:對專案「%s」執行資源控制指派失敗" + +#: src/sudo.c:204 +#, c-format +msgid "Sudo version %s\n" +msgstr "Sudo 版本 %s\n" + +#: src/sudo.c:206 +#, c-format +msgid "Configure options: %s\n" +msgstr "設定選項:%s\n" + +#: src/sudo.c:214 +msgid "fatal error, unable to load plugins" +msgstr "致命錯誤:無法載入外掛程式" + +#: src/sudo.c:222 +msgid "unable to initialize policy plugin" +msgstr "無法初始化 Sudo 政策外掛程式" + +#: src/sudo.c:266 +msgid "plugin did not return a command to execute" +msgstr "外掛程式沒有回傳要執行的指令" + +#: src/sudo.c:282 +#, c-format +msgid "error initializing I/O plugin %s" +msgstr "初始化「%s」I/O 外掛程式時發生錯誤" + +#: src/sudo.c:306 +#, c-format +msgid "unexpected sudo mode 0x%x" +msgstr "未預期的 0x%x sudo 模式" + +#: src/sudo.c:538 +#, c-format +msgid "you do not exist in the %s database" +msgstr "您不在 %s 資料庫中" + +#: src/sudo.c:595 +msgid "unable to determine tty" +msgstr "無法判斷終端機" + +#: src/sudo.c:887 +#, c-format +msgid "%s must be owned by uid %d and have the setuid bit set" +msgstr "%s 必須由使用者 ID 為 %d 的使用者所擁有,且必須設定 setuid 位元" + +#: src/sudo.c:890 +#, c-format +msgid "effective uid is not %d, is %s on a file system with the 'nosuid' option set or an NFS file system without root privileges?" +msgstr "有效的使用者 ID 不是 %d,請問「%s」是存在於設定「nosuid」掛載選項的檔案系統中,還是存在於沒有 root 權限的 NFS 檔案系統?" + +#: src/sudo.c:896 +#, c-format +msgid "effective uid is not %d, is sudo installed setuid root?" +msgstr "有效的使用者 ID 不是 %d,請檢查 sudo 是否安裝了 setuid root。" + +#: src/sudo.c:912 +msgid "unable to set supplementary group IDs" +msgstr "無法設定增補群組 ID" + +#: src/sudo.c:919 +#, c-format +msgid "unable to set effective gid to runas gid %u" +msgstr "無法將有效群組 ID 設定為 runas 群組 ID %u" + +#: src/sudo.c:925 +#, c-format +msgid "unable to set gid to runas gid %u" +msgstr "無法將群組 ID 設定為 runas 群組 ID %u" + +#: src/sudo.c:982 +#, c-format +msgid "unexpected child termination condition: %d" +msgstr "未預期之子行程中止狀況:%d" + +#: src/sudo.c:1128 +#, c-format +msgid "policy plugin %s is missing the `check_policy' method" +msgstr "%s 政策外掛程式缺少 check_policy 方法" + +#: src/sudo.c:1146 +#, c-format +msgid "policy plugin %s does not support listing privileges" +msgstr "%s 政策外掛程式不支援權限" + +#: src/sudo.c:1163 +#, c-format +msgid "policy plugin %s does not support the -v option" +msgstr "%s 政策外掛程式不支援 -v 指令列選項" + +#: src/sudo.c:1178 +#, c-format +msgid "policy plugin %s does not support the -k/-K options" +msgstr "%s 政策外掛程式不支援 -k/-K 指令列選項" + +#: src/sudo_edit.c:221 +msgid "no writable temporary directory found" +msgstr "沒有找到可寫入的暫存目錄" + +#: src/sudo_edit.c:288 src/sudo_edit.c:377 +msgid "unable to restore current working directory" +msgstr "無法還原目前的工作目錄" + +#: src/sudo_edit.c:594 src/sudo_edit.c:707 +#, c-format +msgid "%s: not a regular file" +msgstr "%s:非一般檔案" + +#: src/sudo_edit.c:601 +#, c-format +msgid "%s: editing symbolic links is not permitted" +msgstr "%s:不允許編輯符號連結" + +#: src/sudo_edit.c:604 +#, c-format +msgid "%s: editing files in a writable directory is not permitted" +msgstr "%s:不允許在可寫目錄編輯檔案" + +#: src/sudo_edit.c:637 src/sudo_edit.c:747 +#, c-format +msgid "%s: short write" +msgstr "%s:過短寫入" + +#: src/sudo_edit.c:708 +#, c-format +msgid "%s left unmodified" +msgstr "%s 保持未變更狀態" + +#: src/sudo_edit.c:721 src/sudo_edit.c:908 +#, c-format +msgid "%s unchanged" +msgstr "%s 未變更" + +#: src/sudo_edit.c:736 src/sudo_edit.c:758 +#, c-format +msgid "unable to write to %s" +msgstr "無法寫入「%s」" + +#: src/sudo_edit.c:737 src/sudo_edit.c:756 src/sudo_edit.c:759 +#: src/sudo_edit.c:933 src/sudo_edit.c:937 +#, c-format +msgid "contents of edit session left in %s" +msgstr "編輯階段的內容被留在 %s" + +#: src/sudo_edit.c:755 +msgid "unable to read temporary file" +msgstr "無法讀取暫存檔案" + +#: src/sudo_edit.c:838 +msgid "sesh: internal error: odd number of paths" +msgstr "sesh:內部錯誤:只有奇數個路徑" + +#: src/sudo_edit.c:840 +msgid "sesh: unable to create temporary files" +msgstr "sesh:無法建立暫存檔案" + +#: src/sudo_edit.c:842 src/sudo_edit.c:940 +#, c-format +msgid "sesh: unknown error %d" +msgstr "sesh:未知錯誤代碼 %d" + +#: src/sudo_edit.c:932 +msgid "unable to copy temporary files back to their original location" +msgstr "無法將暫存檔複製回暫存檔的原始位置" + +#: src/sudo_edit.c:936 +msgid "unable to copy some of the temporary files back to their original location" +msgstr "無法將部份的暫存檔複製回其原始位置" + +#: src/sudo_edit.c:981 +#, c-format +msgid "unable to change uid to root (%u)" +msgstr "無法將使用者 ID 變更為 root (%u)" + +#: src/sudo_edit.c:998 +msgid "plugin error: missing file list for sudoedit" +msgstr "外掛程式錯誤:缺少可用於 sudoedit 的檔案清單" + +#: src/sudo_edit.c:1039 src/sudo_edit.c:1052 +msgid "unable to read the clock" +msgstr "無法讀取時間" + +#: src/tgetpass.c:102 +msgid "timed out reading password" +msgstr "讀取密碼逾時" + +#: src/tgetpass.c:105 +msgid "no password was provided" +msgstr "未提供密碼" + +#: src/tgetpass.c:108 +msgid "unable to read password" +msgstr "無法讀取密碼" + +#: src/tgetpass.c:147 +msgid "a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper" +msgstr "需要終端器才能讀取密碼;可以使用 -S 選項,從標準輸入讀取,或是設定 askpass 協助工具。" + +#: src/tgetpass.c:157 +msgid "no askpass program specified, try setting SUDO_ASKPASS" +msgstr "沒有指定 askpass 程式,將嘗試設定 SUDO_ASKPASS 環境變數" + +#: src/tgetpass.c:322 +#, c-format +msgid "unable to set gid to %u" +msgstr "無法將群組 ID 設定為 %u" + +#: src/tgetpass.c:326 +#, c-format +msgid "unable to set uid to %u" +msgstr "無法將使用者 ID 設定為 %u" + +#: src/tgetpass.c:331 +#, c-format +msgid "unable to run %s" +msgstr "無法執行 %s" + +#: src/utmp.c:295 +msgid "unable to save stdin" +msgstr "無法儲存標準輸入" + +#: src/utmp.c:297 +msgid "unable to dup2 stdin" +msgstr "無法對標準輸入執行 dup2 操作" + +#: src/utmp.c:300 +msgid "unable to restore stdin" +msgstr "無法復原標準輸入" + +#~ msgid "no tty present and no askpass program specified" +#~ msgstr "未提供終端機且沒有指定 askpass 程式" + +#~ msgid "unable to get group vector" +#~ msgstr "無法取得 group vector" + +#~ msgid "unknown uid %u: who are you?" +#~ msgstr "未知的 %u 使用者識別碼:你是哪位啊?" diff --git a/utsudo-0.0.2/pp b/utsudo-0.0.2/pp new file mode 100755 index 0000000..aabf288 --- /dev/null +++ b/utsudo-0.0.2/pp @@ -0,0 +1,8804 @@ +#!/bin/sh +# Copyright 2019 One Identity LLC. ALL RIGHTS RESERVED +pp_revision="20190919" + # Copyright 2018 One Identity LLC. ALL RIGHTS RESERVED. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # 3. Neither the name of One Identity LLC. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + # Please see for more information + +pp_version="1.0.0.$pp_revision" +pp_copyright="Copyright 2018, One Identity LLC. ALL RIGHTS RESERVED." + +pp_opt_debug=false +pp_opt_destdir="$DESTDIR" +pp_opt_install_script= +pp_opt_list=false +pp_opt_no_clean=false +pp_opt_no_package=false +pp_opt_only_front=false +pp_opt_platform= +pp_opt_probe=false +pp_opt_strip=false +pp_opt_save_unstripped=false +pp_opt_vas_platforms=false +pp_opt_wrkdir="`pwd`/pp.work.$$" +pp_opt_verbose=false +pp_opt_version=false +pp_opt_input="-" +pp_opt_init_vars="" +pp_opt_eval= + +test -n "$PP_NO_CLEAN" && pp_opt_no_clean=true +test -n "$PP_DEBUG" && pp_opt_debug=true +test -n "$PP_VERBOSE" && pp_opt_verbose=true + +pp_main_cleanup () { + pp_debug "main_cleanup" + pp_remove_later_now + if $pp_opt_no_clean || test x"$pp_platform" = x"unknown"; then + : no cleanup + else + pp_backend_${pp_platform}_cleanup + $pp_errors && pp_die "Errors during cleanup" + if test -d "$pp_wrkdir"; then + if $pp_opt_debug; then + pp_debug "not removing $pp_wrkdir" + else + pp_verbose rm -rf "$pp_wrkdir" + fi + fi + fi +} + +pp_parseopts () { + typeset a n _var _val + while test $# -gt 0; do + + # convert -[dilpv] to --long-options + case "$1" in + --?*=?*) n=`echo "$1" | sed -ne 's/^--\([^=]*\)=.*/\1/p'` + a=`echo "$1" | sed -ne 's/^--[^=]*=\(.*\)/\1/p'` + shift + set -- "--$n" "$a" "$@";; + --?*) : ;; + + -d) shift; set -- "--debug" "$@";; + -d*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--debug" "$@";; + + -i) shift; set -- "--install-script" "$@";; + -i*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--install-script" "$a" "$@";; + + -l) shift; set -- "--list" "$@";; + -l*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--list" "$@";; + + -p) shift; set -- "--platform" "$@";; + -p*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--platform" "$a" "$@";; + + -v) shift; set -- "--verbose" "$@";; + -v*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--verbose" "$@";; + + -\?) shift; set -- "--help" "$@";; + -\?*) a=`echo "$1" | sed -ne 's/^-.//'` + shift; set -- "--help" "$@";; + esac + + case "$1" in + --destdir|--eval|--install-script|--platform|--wrkdir) + test $# -ge 2 || pp_error "missing argument to $1";; + esac + + case "$1" in + --) shift;break;; + --debug) pp_opt_debug=true; shift;; + --destdir) pp_opt_destdir="$2"; shift;shift;; + --eval) pp_opt_eval="$2"; shift;shift;; # undoc + --install-script) pp_opt_install_script="$2"; shift;shift;; + --list) pp_opt_list=true; shift;; + --no-clean) pp_opt_no_clean=true; shift;; + --no-package) pp_opt_no_package=true; shift;; + --only-front) pp_opt_only_front=true; shift;; + --platform) pp_opt_platform="$2"; shift;shift;; + --probe) pp_opt_probe=true; shift;; + --strip) pp_opt_strip=true; shift;; + --save-unstripped) pp_opt_save_unstripped=true; shift;; + --wrkdir) pp_opt_wrkdir="$2"; shift;shift;; + --vas-platforms) pp_opt_vas_platforms=true; shift;; + --verbose) pp_opt_verbose=true; shift;; + --version) pp_opt_version=true; shift;; + --help) pp_errors=true; shift;; + -) break;; + -*) pp_error "unknown option $1"; shift;; + *) break;; + esac + + done + + pp_opt_input=- + if test $# -gt 0; then + pp_opt_input="$1" + shift + fi + + #-- extra arguments of the form Foo=bar alter *global* vars + while test $# -gt 0; do + case "$1" in + -*) pp_error "unexpected option '$1'" + shift;; + *=*) _val="${1#*=}" + _var=${1%="$_val"} + _val=`echo "$_val"|sed -e 's/[$"\\]/\\&/g'` + pp_debug "setting $_var = \"$_val\"" + pp_opt_init_vars="$pp_opt_init_vars$_var=\"$_val\";" + shift;; + *) pp_error "unexpected argument $1'" + shift;; + esac + done + + test $# -gt 0 && + pp_error "unknown argument $1" + + if $pp_errors; then + cat <<. >&2 +polypkg $pp_version $pp_copyright +usage: $0 [options] [input.pp] [var=value ...] + -d --debug -- write copious info to stderr + --destdir=path -- file root, defaults to \$DESTDIR + -? --help -- display this information + -i --install-script=path -- create an install helper script + -l --list -- write package filenames to stdout + --no-clean -- don't remove temporary files + --no-package -- do everything but create packages + --only-front -- only perform front-end actions + -p --platform=platform -- defaults to local platform + --probe -- print local system identifier, then exit + --strip -- strip debug symbols from binaries before + packaging (modifies files in destdir) + --save-unstripped -- save unstripped binaries to + \$name-\$version-unstripped.tar.gz + --wrkdir=path -- defaults to subdirectory of \$TMPDIR or /tmp + -v --verbose -- write info to stderr + --version -- display version and quit +. + exit 1 + fi +} + +pp_drive () { + # initialise the front and back ends + pp_model_init + pp_frontend_init + $pp_opt_only_front || pp_backend_init + + # run the front-end to generate the intermediate files + # set $pp_input_dir to be the 'include dir' if needed + pp_debug "calling frontend on $pp_opt_input" + case "$pp_opt_input" in + -) pp_input_dir=. + test -t 1<&0 && + pp_warn "reading directives from standard input" + pp_frontend + ;; + */*) pp_input_dir=${pp_opt_input%/*} + pp_frontend <"$pp_opt_input" + ;; + *) pp_input_dir=. + pp_frontend <"$pp_opt_input" + ;; + esac + + pp_files_ignore_others + pp_service_scan_groups + + # some sanity checks after front-end processing + if test x"$pp_platform" != x"null"; then + pp_debug "sanity checks" + test -n "$pp_components" || pp_error "No components?" + pp_check_var_is_defined "name" + pp_check_var_is_defined "version" + pp_files_check_duplicates + pp_files_check_coverage + pp_die_if_errors "Errors during sanity checks" + fi + + # stop now if we're only running the front + $pp_opt_only_front && return + + if test x"$pp_opt_strip" = x"true"; then + pp_strip_binaries + fi + + # run the back-end to generate the package + pp_debug "calling backend" + pp_backend + pp_die_if_errors "Errors during backend processing" + + # copy the resulting package files to PP_PKGDESTDIR or . + for f in `pp_backend_names` -; do + test x"$f" = x"-" && continue + pp_debug "copying: $f to `pwd`" + if pp_verbose cp -r $pp_wrkdir/$f ${PP_PKGDESTDIR:-.}; then + echo "${PP_PKGDESTDIR:+$PP_PKGDESTDIR/}$f" + else + pp_error "$f: missing package" + fi + done + pp_die_if_errors "Errors during package copying" +} + +pp_install_script () { + pp_debug "writing install script to $pp_opt_install_script" + rm -f $pp_opt_install_script + pp_backend_install_script > $pp_opt_install_script + pp_die_if_errors "Errors during package install script" + chmod +x $pp_opt_install_script +} + +pp_main () { + # If PP_DEV_PATH is set, then jump to that script. + # (Useful when working on polypkg source that isn't installed) + if test -n "$PP_DEV_PATH" -a x"$PP_DEV_PATH" != x"$0"; then + pp_warn "switching from $0 to $PP_DEV_PATH ..." + exec "$PP_DEV_PATH" "$@" || exit 1 + fi + + pp_set_expand_converter_or_reexec "$@" + pp_parseopts "$@" + + if $pp_opt_version; then + #-- print version and exit + echo "polypkg $pp_version" + exit 0 + fi + + pp_set_platform + + trap 'pp_main_cleanup' 0 + + pp_wrkdir="$pp_opt_wrkdir" + pp_debug "pp_wrkdir = $pp_wrkdir" + rm -rf "$pp_wrkdir" + mkdir -p "$pp_wrkdir" + + pp_destdir="$pp_opt_destdir" + pp_debug "pp_destdir = $pp_destdir" + + if $pp_opt_probe; then + pp_backend_init + pp_backend_probe + elif $pp_opt_vas_platforms; then + pp_backend_init + pp_backend_vas_platforms + elif test -n "$pp_opt_eval"; then + #-- execute a shell command + eval "$pp_opt_eval" || exit + else + pp_drive + if test -n "$pp_opt_install_script"; then + pp_install_script + fi + fi + + exit 0 +} + + +pp_errors=false + +if test -n "$TERM" -a -t 1 && (tput op) >/dev/null 2>/dev/null; then + pp_col_redfg=`tput setf 4` 2>/dev/null + pp_col_bluefg=`tput setf 1` 2>/dev/null + pp_col_reset=`tput op` 2>/dev/null +else + pp_col_redfg='[' + pp_col_bluefg='[' + pp_col_reset=']' +fi + +pp__warn () { + if test x"" = x"$pp_lineno"; then + echo "$1 $2" >&2 + else + echo "$1 line $pp_lineno: $2" >&2 + fi +} + +pp_warn () { + pp__warn "pp: ${pp_col_redfg}warning${pp_col_reset}" "$*" +} + +pp_error () { + pp__warn "pp: ${pp_col_redfg}error${pp_col_reset}" "$*" + pp_errors=true +} + +pp_die () { + pp_error "$@" + exit 1 +} + +pp_die_if_errors () { + $pp_errors && pp_die "$@" +} + +pp_debug () { + $pp_opt_debug && echo "${pp_col_bluefg}debug${pp_col_reset} $*" >&2 +} + +pp_verbose () { + $pp_opt_verbose && echo "pp: ${pp_col_bluefg}info${pp_col_reset} $*" >&2 + "$@"; +} + +pp_substitute () { + sed -e 's,%(\([^)]*\)),`\1`,g' \ + -e 's,%{\([^}]*\)},${\1},g' \ + -e 's,$,,' | + tr '' '\012' | + sed -e '/^[^]/s/["$`\\]/\\&/g' \ + -e 's/^//' \ + -e '1s/^/echo "/' \ + -e '$s,$,",' \ + -e 's,,"echo ",g' | + tr -d '\012' | + tr '' '\012' + echo +} + +pp_incr () { + eval "$1=\`expr \$$1 + 1\`" +} + +pp_decr () { + eval "$1=\`expr \$$1 - 1\`" +} + +pp_check_var_is_defined () { + if eval test -z "\"\$$1\""; then + pp_error "\$$1: not set" + eval "$1=undefined" + fi +} + +pp_contains () { + case " $1 " in + *" $2 "*) return 0;; + *) return 1;; + esac +} + +pp_contains_all () { + typeset _s _c + _l="$1"; shift + for _w + do + pp_contains "$_l" "$_w" || return 1 + done + return 0 +} + +pp_contains_any () { + typeset _s _c + _l="$1"; shift + for _w + do + pp_contains "$_l" "$_w" && return 0 + done + return 1 +} + +pp_add_to_list () { + if eval test -z \"\$$1\"; then + eval $1='"$2"' + elif eval pp_contains '"$'$1'"' '"$2"'; then + : already there + else + eval $1='"$'$1' $2"' + fi +} + +pp_unique () { + typeset result element + result= + for element + do + pp_add_to_list result $element + done + echo $result +} + +pp_mode_strip_altaccess () { + case "$1" in + ??????????[+.]) + echo `echo "$1" | cut -b -10`;; + *) + echo "$1";; + esac +} + +pp_mode_from_ls () { + typeset umode gmode omode smode + + set -- `pp_mode_strip_altaccess "$1"` + + case "$1" in + ?--[-X]??????) umode=0;; + ?--[xs]??????) umode=1;; + ?-w[-X]??????) umode=2;; + ?-w[xs]??????) umode=3;; + ?r-[-X]??????) umode=4;; + ?r-[xs]??????) umode=5;; + ?rw[-X]??????) umode=6;; + ?rw[xs]??????) umode=7;; + *) pp_error "bad user mode $1";; + esac + + case "$1" in + ????--[-S]???) gmode=0;; + ????--[xs]???) gmode=1;; + ????-w[-S]???) gmode=2;; + ????-w[xs]???) gmode=3;; + ????r-[-X]???) gmode=4;; + ????r-[xs]???) gmode=5;; + ????rw[-X]???) gmode=6;; + ????rw[xs]???) gmode=7;; + *) pp_error "bad group mode $1";; + esac + + case "$1" in + ???????--[-T]) omode=0;; + ???????--[xt]) omode=1;; + ???????-w[-T]) omode=2;; + ???????-w[xt]) omode=3;; + ???????r-[-T]) omode=4;; + ???????r-[xt]) omode=5;; + ???????rw[-T]) omode=6;; + ???????rw[xt]) omode=7;; + *) pp_error "bad other mode $1";; + esac + + case "$1" in + ???[-x]??[-x]??[-x]) smode=;; + ???[-x]??[-x]??[tT]) smode=1;; + ???[-x]??[Ss]??[-x]) smode=2;; + ???[-x]??[Ss]??[tT]) smode=3;; + ???[Ss]??[-x]??[-x]) smode=4;; + ???[Ss]??[-x]??[tT]) smode=5;; + ???[Ss]??[Ss]??[-x]) smode=6;; + ???[Ss]??[Ss]??[tT]) smode=7;; + *) pp_error "bad set-id mode $1";; + esac + + echo "$smode$umode$gmode$omode" +} + +pp_find_recurse () { + pp_debug "find: ${1#$pp_destdir}/" + for f in "$1"/.* "$1"/*; do + case "$f" in */.|*/..) continue;; esac # should never happen! + if test -d "$f" -o -f "$f" -o -h "$f"; then + if test -d "$f" -a ! -h "$f"; then + echo "${f#$pp_destdir}/" + pp_find_recurse "$f" + else + echo "${f#$pp_destdir}" + fi + fi + done +} + +pp_prepend () { + #test -t && pp_warn "pp_prepend: stdin is a tty?" + if test -f $1; then + pp_debug "prepending to $1" + mv $1 $1._prepend + cat - $1._prepend >$1 + rm -f $1._prepend + else + pp_debug "prepend: creating $1" + cat >$1 + fi +} + +pp_note_file_used() { + echo "$1" >> $pp_wrkdir/all.files +} + +pp_create_dir_if_missing () { + case "$1" in + */) pp_error "pp_create_dir_if_missing: trailing / forbidden";; + "") return 0;; + *) if test ! -d "$pp_destdir$1"; then + pp_debug "fabricating directory $1/" + pp_create_dir_if_missing "${1%/*}" + mkdir "$pp_destdir$1" && + pp_note_file_used "$1/" + pp_remove_later "$1" && + chmod ${2:-755} "$pp_destdir$1" + fi;; + esac +} + +pp_add_file_if_missing () { + typeset dir + #-- check that the file isn't already declared in the component + if test -s $pp_wrkdir/%files.${2:-run}; then + awk "\$6 == \"$1\" {exit 1}" < $pp_wrkdir/%files.${2:-run} || return 1 + fi + + pp_create_dir_if_missing "${1%/*}" + pp_debug "fabricating file $1" + echo "f ${3:-755} - - ${4:--} $1" >> $pp_wrkdir/%files.${2:-run} + pp_note_file_used "$1" + pp_remove_later "$1" + return 0 +} + +pp_add_transient_file () { + test -f "$pp_destdir$1" && pp_die "$pp_destdir$1: exists" + pp_create_dir_if_missing "${1%/*}" + pp_debug "transient file $1" + pp_note_file_used "$1" + pp_remove_later "$1" +} + +pp_remove_later () { + { + echo "$1" + test -s $pp_wrkdir/pp_cleanup && cat $pp_wrkdir/pp_cleanup + } > $pp_wrkdir/pp_cleanup.new + mv $pp_wrkdir/pp_cleanup.new $pp_wrkdir/pp_cleanup +} + +pp_ls_readlink () { + if test -h "$1"; then + ls -1ld "$1" | sed -ne 's,.* -> ,,p' + else + echo "$1: not a symbolic link" >&2 + return 1 + fi +} + +pp_remove_later_now () { + typeset f + if test -s $pp_wrkdir/pp_cleanup; then + pp_debug "pp_remove_later_now" + while read f; do + pp_debug "removing $pp_destdir$f" + if test -d $pp_destdir$f; then + rmdir $pp_destdir$f + else + rm $pp_destdir$f + fi + done < $pp_wrkdir/pp_cleanup + rm $pp_wrkdir/pp_cleanup + fi +} + +pp_readlink() { + +pp_debug "&& pp_readlink_fn=$pp_readlink_fn" + + if test -n "$pp_readlink_fn"; then +pp_debug "&& calling $pp_readlink_fn $*" + "$pp_readlink_fn" "$@" + else + readlink "$@" + fi +} + + +pp_install_script_common () { + cat <<-. + + # Automatically generated for + # $name $version ($pp_platform) + # by PolyPackage $pp_version + + usage () { + case "$1" in + "list-services") + echo "usage: \$0 list-services" ;; + "list-components") + echo "usage: \$0 list-components" ;; + "list-files") + echo "usage: \$0 list-files {cpt...|all}" ;; + "install") + echo "usage: \$0 install {cpt...|all}" ;; + "uninstall") + echo "usage: \$0 uninstall {cpt...|all}" ;; + "start") + echo "usage: \$0 start {svc...}" ;; + "stop") + echo "usage: \$0 stop {svc...}" ;; + "print-platform") + echo "usage: \$0 print-platform" ;; + *) + echo "usage: \$0 [-q] command [args]" + echo " list-services" + echo " list-components" + echo " list-files {cpt...|all}" + echo " install {cpt...|all}" + echo " uninstall {cpt...|all}" + echo " start {svc...}" + echo " stop {svc...}" + echo " print-platform" + ;; + esac >&2 + exit 1 + } + + if test x"\$1" = x"-q"; then + shift + verbose () { "\$@"; } + verbosemsg () { : ; } + else + verbose () { echo "+ \$*"; "\$@"; } + verbosemsg () { echo "\$*"; } + fi +. +} + + +pp_functions () { + typeset func deps allfuncs + allfuncs= + while test $# -gt 0; do + pp_add_to_list allfuncs "$1" + deps=`pp_backend_function "$1:depends"` + shift + set -- `pp_unique "$@" $deps` + done + + for func in $allfuncs + do + pp_debug "generating function code for '$1'" + echo "" + echo "$func () {" + case "$func" in + pp_mkgroup|pp_mkuser|pp_havelib) echo <<.;; + if test \$# -lt 1; then + echo "$func: not enough arguments" >&2 + return 1 + fi +. + esac + pp_backend_function "$func" || cat <<. + echo "$func: not implemented" >&2 + return 1 +. + echo "}" + done +} + +pp_function () { + pp_functions "$1" +} + +pp_makevar () { + #-- convert all non alpha/digits to underscores + echo "$*" | tr -c '[a-z][A-Z][0-9]\012' '[_*]' +} + +pp_getpwuid () { + awk -F: '$3 == uid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' uid="$1" \ + < /etc/passwd || pp_error "no local username for uid $1" +} + +pp_getgrgid () { + awk -F: '$3 == gid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' gid="$1" \ + < /etc/group || pp_error "no local group for gid $1" +} + +pp_backend_function_getopt () { + cat <<'..' +pp_getopt () { + _pp_optstring="$1"; shift; eval `_pp_getopt "$_pp_optstring"` +} +_pp_getopt_meta=s,[\\\\\"\'\`\$\&\;\(\)\{\}\#\%\ \ ],\\\\\&,g +_pp_protect () { + sed "$_pp_getopt_meta" <<. | tr '\012' ' ' +$* +. +} +_pp_protect2 () { + sed "s,^..,,$pp_getopt_meta" <<. | tr '\012' ' ' +$* +. +} +_pp_nonl () { + tr '\012' ' ' <<. +$* +. +} +_pp_getopt () { + _pp_nonl '_pp_nonl set --; while test $# -gt 0; do case "$1" in "--") shift; break;;' + sed 's/\([^: ]:*\)/<@<\1>@>/g; + s/<@<\(.\):>@>/"-\1") _pp_nonl -"\1"; _pp_protect "$2"; shift; shift;; "-\1"*) _pp_nonl -"\1"; _pp_protect2 "$1"; shift;;/g;s/<@<\(.\)>@>/ "-\1") _pp_nonl -"\1"; shift;; "-\1"*) _pp_nonl -"\1"; _pp_tmp="$1"; shift; set -- -`_pp_protect2 "$_pp_tmp"` "$@";;/g' <<. +$1 +. + _pp_nonl '-*) echo "$1: unknown option">&2; return 1;; *) break;; esac; done; _pp_nonl --; while test $# -gt 0; do _pp_nonl "$1"; shift; done; echo' + echo +} +.. +} + +pp_copy_unstripped () { + typeset filedir realdir + filedir="`dirname ${1#$pp_destdir}`" + realdir="$pp_wrkdir/unstripped/$filedir" + + mkdir -p "$realdir" + # Can't use hardlinks because `strip` modifies the original file in-place + cp "$1" "$realdir" +} + +pp_package_stripped_binaries () { + (cd "$pp_wrkdir/unstripped" && tar -c .) \ + | gzip > "$name-dbg-$version.tar.gz" + rm -rf "$pp_wrkdir/unstripped" +} + +pp_strip_binaries () { + if test x"$pp_opt_save_unstripped" = x"true"; then + rm -rf "$pp_wrkdir/unstripped" + mkdir "$pp_wrkdir/unstripped" + fi + + for f in `find "$pp_destdir" -type f`; do + if file "$f" | awk '{print $2}' | grep ^ELF >/dev/null 2>&1; then + if test x"$pp_opt_save_unstripped" = x"true"; then + if file "$f" | LC_MESSAGES=C grep 'not stripped' >/dev/null 2>&1; then + pp_debug "Saving unstripped binary $f" + pp_copy_unstripped "$f" + else + pp_debug "$f is already stripped; not saving a copy" + fi + fi + pp_debug "Stripping unnecessary symbols from $f" + strip "$f" + fi + done + + if test x"$pp_opt_save_unstripped" = x"true"; then + pp_package_stripped_binaries + fi +} + +pp_if_true=0 +pp_if_false=0 + +pp_frontend_init () { + name= + version= + build_number= + summary="no summary" + description="No description" + copyright="Copyright 2018 One Identity LLC. ALL RIGHTS RESERVED." + + #-- if the user supplied extra arguments on the command line + # then load them now. + pp_debug "pp_opt_init_vars=$pp_opt_init_vars" + test -n "$pp_opt_init_vars" && eval "$pp_opt_init_vars" +} + +pp_is_qualifier () { + typeset ret + + case "$1" in + "["*"]") ret=true;; + *) ret=false;; + esac + pp_debug "is_qualifier: $* -> $ret" + test $ret = true +} + +pp_eval_qualifier () { + typeset ret + + case "$1" in + "[!$pp_platform]"| \ + "[!"*",$pp_platform]"| \ + "[!$pp_platform,"*"]"| \ + "[!"*",$pp_platform,"*"]") ret=false;; + "[!"*"]") ret=true;; + "[$pp_platform]"| \ + "["*",$pp_platform]"| \ + "[$pp_platform,"*"]"| \ + "["*",$pp_platform,"*"]") ret=true;; + "["*"]") ret=false;; + *) pp_die "pp_eval_qualifier: bad qualifier '$1'" + esac + pp_debug "eval: $* -> $ret" + test true = $ret +} + +pp_frontend_if () { + typeset ifcmd ifret + ifcmd="$1"; + shift + case "$ifcmd" in + %if) if test 0 = $pp_if_false; then + case "$*" in + true |1) pp_incr pp_if_true;; + false|0) pp_incr pp_if_false;; + *) + ifret=true + if pp_is_qualifier "$*"; then + pp_eval_qualifier "$*" || ifret=false + else + eval test "$@" || ifret=false + pp_debug "evaluating test $* -> $ifret" + fi + pp_incr pp_if_$ifret + ;; + esac + else + pp_incr pp_if_false + fi;; + %else) test $# = 0 || pp_warn "ignoring argument to %else" + if test $pp_if_false -gt 1; then + : no change + elif test $pp_if_false = 1; then + pp_incr pp_if_true + pp_decr pp_if_false + elif test $pp_if_true = 0; then + pp_die "unmatched %else" + else + pp_incr pp_if_false + pp_decr pp_if_true + fi;; + %endif) test $# = 0 || pp_warn "ignoring argument to %endif" + if test $pp_if_false -gt 0; then + pp_decr pp_if_false + elif test $pp_if_true -gt 0; then + pp_decr pp_if_true + else + pp_die "unmatched %endif" + fi;; + *) pp_die "frontend_if: unknown cmd $ifcmd";; + esac +} + + +pp_frontend () { + typeset section newsection sed_word sed_ws line cpt svc + typeset section_enabled newsection_enabled s sed sed_candidate + + section='%_initial' + newsection='%_initial' + section_enabled=: + newsection_enabled=: + sed_word="[a-zA-Z_][a-zA-Z_0-9]*" + sed_ws="[ ]" + + #-- not all seds are created equal + sed= + for sed_candidate in ${PP_SED:-sed} /usr/xpg4/bin/sed; do + if echo 'foo' | $sed_candidate -ne '/^\(x\)*foo/p' | grep foo > /dev/null + then + sed="$sed_candidate" + break + fi + done + test -z "$sed" && + pp_die "sed is broken on this system" + + pp_lineno=0 + + #-- Note: this sed script should perform similar to pp_eval_qualifier() + $sed -e "/^#/s/.*//" \ + -e "/^\\[!\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]/s/.*//" \ + -e "s/^\\[\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]$sed_ws*//" \ + -e "s/^\\[!\\($sed_word,\\)*$sed_word\\]$sed_ws*//" \ + -e "/^\\[\\($sed_word,\\)*$sed_word\\]/s/.*//" \ + -e "s/^%$sed_ws*/%/" \ + -e "s/^$sed_ws/%\\\\&/" \ + > $pp_wrkdir/frontend.tmp + + #-- add an ignore section at the end to force section completion + echo '%ignore' >> $pp_wrkdir/frontend.tmp + echo >> $pp_wrkdir/frontend.tmp + + exec 0<$pp_wrkdir/frontend.tmp + : > $pp_wrkdir/tmp + : > $pp_wrkdir/%fixup + while read -r line; do + #-- Convert leading double-% to single-%, or switch sections + pp_incr pp_lineno + + pp_debug "line $pp_lineno: $line" + set -f + set -- $line + set +f + #pp_debug "line $pp_lineno: $*" + + case "$line" in %*) + case "$1" in + %if|%else|%endif) + pp_debug "processing if directive $1" + pp_frontend_if "$@" + continue;; + esac + test 0 -ne $pp_if_false && continue # ignore lines %if'd out + + case "$1" in + %set|%fixup|%ignore) + pp_debug "processing new section $1" + newsection="$1"; shift + newsection_enabled=: + if pp_is_qualifier "$1"; then + pp_eval_qualifier "$1" || newsection_enabled=false + shift + fi + test $# -eq 0 || pp_warn "ignoring extra arguments: $line" + continue;; + %pre|%post|%preun|%postup|%preup|%postun|%files|%depend|%check|%conflict) + pp_debug "processing new component section $*" + s="$1"; shift + if test $# -eq 0 || pp_is_qualifier "$1"; then + cpt=run + else + cpt="$1" + shift + fi + newsection="$s.$cpt" + newsection_enabled=: + if test $# -gt 0 && pp_is_qualifier "$1"; then + pp_eval_qualifier "$1" || newsection_enabled=false + shift + fi + test $# -eq 0 || + pp_warn "ignoring extra arguments: $line" + case "$cpt" in + run|dbg|doc|dev) + $newsection_enabled && pp_add_component "$cpt";; + x-*) :;; # useful for discarding stuff + *) pp_error "unknown component: $1 $cpt";; + esac + continue;; + %pp) + newsection="%ignore"; shift + if test $# -gt 0; then + pp_set_api_version "$1" + shift + else + pp_error "%pp: missing version" + fi + test $# -gt 0 && + pp_error "%pp: too many arguments" + continue;; + %service) + pp_debug "processing new service section $1 $2" + s="$1"; shift + if test $# -eq 0 || pp_is_qualifier "$1"; then + pp_error "$s: service name required" + svc=unknown + else + svc="$1"; shift + fi + + newsection="$s.$svc" + newsection_enabled=: + if test $# -gt 0 && pp_is_qualifier "$1"; then + pp_eval_qualifier "$1" || newsection_enabled=false + shift + fi + test $# -eq 0 || + pp_warn "ignoring extra arguments: $line" + $newsection_enabled && pp_add_service "$svc" + continue;; + %\\*) + pp_debug "removing leading %\\" + line="${line#??}" + pp_debug " result is <$line>" + set -f + set -- $line + set +f + ;; + %%*) + pp_debug "removing leading %" + line="${line#%}" + set -f + set -- $line + set +f + ;; + %*) + pp_error "unknown section $1" + newsection='%ignore' + newsection_enabled=: + continue;; + esac;; + esac + + test 0 != $pp_if_false && continue # ignore lines %if'd out + + pp_debug "section=$section (enabled=$section_enabled) newsection=$newsection (enabled=$newsection_enabled)" + + #-- finish processing a previous section + if test x"$newsection" != x""; then + $section_enabled && case "$section" in + %ignore|%_initial) + pp_debug "leaving ignored section $section" + : ignore # guaranteed to be the last section + ;; + %set) + pp_debug "leaving $section: sourcing $pp_wrkdir/tmp" + $pp_opt_debug && cat $pp_wrkdir/tmp >&2 + . $pp_wrkdir/tmp + : > $pp_wrkdir/tmp + ;; + %pre.*|%preun.*|%post.*|%postup.*|%preup.*|%postun.*|%depend.*|%check.*|%conflict.*|%service.*|%fixup) + pp_debug "leaving $section: substituting $pp_wrkdir/tmp" + # cat $pp_wrkdir/tmp >&2 # debugging + $pp_opt_debug && pp_substitute < $pp_wrkdir/tmp >&2 + pp_substitute < $pp_wrkdir/tmp > $pp_wrkdir/tmp.sh + . $pp_wrkdir/tmp.sh >> $pp_wrkdir/$section || + pp_error "shell error in $section" + rm -f $pp_wrkdir/tmp.sh + : > $pp_wrkdir/tmp + ;; + esac + section="$newsection" + section_enabled="$newsection_enabled" + newsection= + fi + + #-- ignore section content that is disabled + $section_enabled || continue + + #-- process some lines in-place + case "$section" in + %_initial) + case "$line" in "") continue;; esac # ignore non-section blanks + pp_die "Ignoring text before % section introducer";; + %set|%pre.*|%preun.*|%post.*|%postup.*|%preup.*|%postun.*|%check.*|%service.*|%fixup) + pp_debug "appending line to \$pp_wrkdir/tmp" + echo "$line" >> $pp_wrkdir/tmp + ;; + %files.*) + test $# -eq 0 && continue; + pp_files_expand "$@" >> $pp_wrkdir/$section + ;; + %depend.*) + pp_debug "Adding explicit dependency $@ to $cpt" + echo "$@" >> $pp_wrkdir/%depend.$cpt + ;; + %conflict.*) + pp_debug "Adding explicit conflict $@ to $cpt" + echo "$@" >> $pp_wrkdir/%conflict.$cpt + ;; + esac + done + exec <&- + + if test $pp_if_true != 0 -o $pp_if_false != 0; then + pp_die "missing %endif at end of file" + fi + + pp_lineno= + + pp_debug " name = $name" + pp_debug " version = $version" + pp_debug " summary = $summary" + pp_debug " description = $description" + pp_debug " copyright = $copyright" + pp_debug "" + pp_debug "\$pp_components: $pp_components" + pp_debug "\$pp_services: $pp_services" +} + +pp_set_api_version() { + case "$1" in + 1.0) : ;; + *) pp_error "This version of polypackage is too old";; + esac +} + +pp_platform= + +pp_set_platform () { + if test -n "$pp_opt_platform"; then + pp_contains "$pp_platforms" "$pp_opt_platform" || + pp_die "$pp_opt_platform: unknown platform" + pp_platform="$pp_opt_platform" + else + uname_s=`uname -s 2>/dev/null` + pp_platform= + for p in $pp_platforms; do + pp_debug "probing for platform $p" + if eval pp_backend_${p}_detect "$uname_s"; then + pp_platform="$p" + break; + fi + done + test -z "$pp_platform" && + pp_die "cannot detect platform (supported: $pp_platforms)" + fi + pp_debug "pp_platform = $pp_platform" +} + +pp_expand_path= + +pp_expand_test_usr_bin () { + awk '$1 == "/usr" || $2 == "/usr" {usr++} + $1 == "/bin" || $2 == "/bin" {bin++} + END { if (usr == 1 && bin == 1) exit(0); else exit(1); }' +} + +pp_set_expand_converter_or_reexec () { + test -d /usr -a -d /bin || + pp_die "missing /usr or /bin" + echo /usr /bin | pp_expand_test_usr_bin || pp_die "pp_expand_test_usr_bin?" + if (eval "echo /{usr,bin}" | pp_expand_test_usr_bin) 2>/dev/null; then + pp_expand_path=pp_expand_path_brace + elif (eval "echo /@(usr|bin)" | pp_expand_test_usr_bin) 2>/dev/null; then + pp_expand_path=pp_expand_path_at + else + test x"$pp_expand_rexec" != x"true" || + pp_die "problem finding shell that can do brace expansion" + for shell in bash ksh ksh93; do + if ($shell -c 'echo /{usr,bin}' | + pp_expand_test_usr_bin) 2>/dev/null || + ($shell -c 'echo /@(usr|bin)' | + pp_expand_test_usr_bin) 2>/dev/null + then + pp_debug "switching to shell $shell" + pp_expand_rexec=true exec $shell "$0" "$@" + fi + done + pp_die "cannot find a shell that does brace expansion" + fi +} + +pp_expand_path_brace () { + typeset f + eval "for f in $1; do echo \"\$f\"; done|sort -u" +} + +pp_expand_path_at () { + typeset f + eval "for f in ` + echo "$1" | sed -e 's/{/@(/g' -e 's/}/)/g' -e 's/,/|/g' + `; do echo \"\$f\"; done|sort -u" +} + +pp_shlib_suffix='.so*' + +pp_model_init () { + #@ $pp_components: whitespace-delimited list of components seen in %files + pp_components= + #@ $pp_services: whitespace-delimited list of %service seen + pp_services= + + rm -f $pp_wrkdir/%files.* \ + $pp_wrkdir/%post.* \ + $pp_wrkdir/%pre.* \ + $pp_wrkdir/%preun.* \ + $pp_wrkdir/%postup.* \ + $pp_wrkdir/%postun.* \ + $pp_wrkdir/%service.* \ + $pp_wrkdir/%set \ + $pp_wrkdir/%fixup +} + + +pp_have_component () { + pp_contains "$pp_components" "$1" +} + +pp_have_all_components () { + pp_contains_all "$pp_components" "$@" +} + +pp_add_component () { + pp_add_to_list 'pp_components' "$1" +} + +pp_add_service () { + pp_add_to_list 'pp_services' "$1" +} + +pp_service_init_vars () { + cmd= + pidfile= + stop_signal=15 # SIGTERM + user=root + group= + enable=yes # make it so the service starts on boot + optional=no # Whether installing this service is optional + pp_backend_init_svc_vars +} + +pp_service_check_vars () { + test -n "$cmd" || + pp_error "%service $1: cmd not defined" + case "$enable" in + yes|no) : ;; + *) pp_error "%service $1: \$enable must be set to yes or no";; + esac +} + +pp_load_service_vars () { + pp_service_init_vars + . "$pp_wrkdir/%service.$1" + pp_service_check_vars "$1" +} + +pp_files_expand () { + typeset _p _mode _group _owner _flags _path _optional _has_target _tree + typeset _target _file _tgt _m _o _g _f _type _lm _ll _lo _lg _ls _lx + typeset _ignore _a + + test $# -eq 0 && return + + pp_debug "pp_files_expand: path is: $1" + + case "$1" in "#"*) return;; esac + _p="$1"; shift + + pp_debug "pp_files_expand: other arguments: $*" + + #-- the mode must be an octal number of at least three digits + _mode="=" + _a=`eval echo \"$1\"` + case "$_a" in + *:*) :;; + -|=|[01234567][01234567][01234567]*) _mode="$_a"; shift;; + esac + + #-- the owner:group field may have optional parts + _a=`eval echo \"$1\"` + case "$_a" in + *:*) _group=${_a#*:}; _owner=${_a%:*}; shift;; + =|-) _group=$_a; _owner=$_a; shift;; + *) _group=; _owner=;; + esac + + #-- process the flags argument + _flags= + _target= + _optional=false + _has_target=false + _ignore=false + if test $# -gt 0; then + _a=`eval echo \"$1\"` + case ",$_a," in *,volatile,*) _flags="${_flags}v";; esac + case ",$_a," in *,optional,*) _optional=true;; esac + case ",$_a," in *,symlink,*) _has_target=true;; esac + case ",$_a," in *,ignore-others,*) _flags="${_flags}i";; esac + case ",$_a," in *,ignore,*) _ignore=true;; esac + shift + fi + + #-- process the target argument + if $_has_target; then + test $# -ne 0 || pp_error "$_p: missing target" + _a=`eval echo \"$1\"` + _target="$_a" + shift + fi + + pp_debug "pp_files_expand: $_mode|$_owner:$_group|$_flags|$_target|$*" + + test $# -eq 0 || pp_error "$_p: too many arguments" + + #-- process speciall suffixes + tree= + case "$_p" in + *"/**") _p="${_p%"/**"}"; tree="**";; + *".%so") _p="${_p%".%so"}$pp_shlib_suffix";; + esac + + #-- expand the path using the shell glob + pp_debug "expanding .$_p ... with $pp_expand_path" + (cd ${pp_destdir} && $pp_expand_path ".$_p") > $pp_wrkdir/tmp.files.exp + + #-- expand path/** by rewriting the glob output file + case "$tree" in + "") : ;; + "**") + pp_debug "expanding /** tree ..." + while read _path; do + _path="${_path#.}" + pp_find_recurse "$pp_destdir${_path%/}" + done < $pp_wrkdir/tmp.files.exp | + sort -u > $pp_wrkdir/tmp.files.exp2 + mv $pp_wrkdir/tmp.files.exp2 $pp_wrkdir/tmp.files.exp + ;; + esac + + while read _path; do + _path="${_path#.}" + _file="${pp_destdir}${_path}" + _tgt= + _m="$_mode" + _o="${_owner:--}" + _g="${_group:--}" + _f="$_flags" + + case "$_path" in + /*) :;; + *) pp_warn "$_path: inserting leading /" + _path="/$_path";; # ensure leading / + esac + + #-- sanity checks + case "$_path" in + */../*|*/..) pp_error "$_path: invalid .. in path";; + */./*|*/.) pp_warn "$_path: invalid component . in path";; + *//*) pp_warn "$_path: redundant / in path";; + esac + + #-- set the type based on the real file's type + if $_ignore; then + _type=f _m=_ _o=_ _g=_ + elif test -h "$_file"; then + case "$_path" in + */) pp_warn "$_path (symlink $_file): removing trailing /" + _path="${_path%/}" + ;; + esac + _type=s + if test x"$_target" != x"=" -a -n "$_target"; then + _tgt="$_target" +pp_debug "symlink target is $_tgt" + else + _tgt=`pp_readlink "$_file"`; + test -z "$_tgt" && pp_error "can't readlink $_file" + case "$_tgt" in + ${pp_destdir}/*) + pp_warn "stripped \$destdir from symlink ($_path)" + _tgt="${_tgt#$pp_destdir}";; + esac + fi + _m=777 + elif test -d "$_file"; then + #-- display a warning if the user forgot the trailing / + case "$_path" in + */) :;; + *) pp_warn "$_path (matching $_file): adding trailing /" + _path="$_path/";; + esac + _type=d + $_has_target && pp_error "$_file: not a symlink" + elif test -f "$_file"; then + case "$_path" in + */) pp_warn "$_path (matching $_file): removing trailing /" + _path="${_path%/}" + ;; + esac + _type=f + $_has_target && pp_error "$_file: not a symlink" + else + $_optional && continue + pp_error "$_file: missing" + _type=f + fi + + #-- convert '=' shortcuts into mode/owner/group from ls + case ":$_m:$_o:$_g:" in *:=:*) + if LS_OPTIONS=--color=never /bin/ls -ld "$_file" \ + > $pp_wrkdir/ls.tmp + then + read _lm _ll _lo _lg _ls _lx < $pp_wrkdir/ls.tmp + test x"$_m" = x"=" && _m=`pp_mode_from_ls "$_lm"` + test x"$_o" = x"=" && _o="$_lo" + test x"$_g" = x"=" && _g="$_lg" + else + pp_error "cannot read $_file" + test x"$_m" = x"=" && _m=- + test x"$_o" = x"=" && _o=- + test x"$_g" = x"=" && _g=- + fi + ;; + esac + + test -n "$_f" || _f=- + + #-- sanity checks + test -n "$_type" || pp_die "_type empty" + test -n "$_path" || pp_die "_path empty" + test -n "$_m" || pp_die "_m empty" + test -n "$_o" || pp_die "_o empty" + test -n "$_g" || pp_die "_g empty" + + #-- setuid/gid files must be given an explicit owner/group (or =) + case "$_o:$_g:$_m" in + -:*:[4657][1357]??|-:*:[4657]?[1357]?|-:*:[4657]??[1357]) + pp_error "$_path: setuid file ($_m) missing explicit owner";; + *:-:[2367][1357]??|*:-:[2367]?[1357]?|*:-:[2367]??[1357]) + pp_error "$_path: setgid file ($_m) missing explicit group";; + esac + + # convert numeric uids into usernames; only works for /etc/passwd + case "$_o" in [0-9]*) _o=`pp_getpwuid $_o`;; esac + case "$_g" in [0-9]*) _g=`pp_getgrgid $_g`;; esac + + pp_debug "$_type $_m $_o $_g $_f $_path" $_tgt + $_ignore || echo "$_type $_m $_o $_g $_f $_path" $_tgt + pp_note_file_used "$_path" + case "$_f" in *i*) echo "$_path" >> $pp_wrkdir/ign.files;; esac + done < $pp_wrkdir/tmp.files.exp +} + +pp_files_check_duplicates () { + typeset _path + if test -s $pp_wrkdir/all.files; then + sort < $pp_wrkdir/all.files | uniq -d > $pp_wrkdir/duplicate.files + if test -f $pp_wrkdir/ign.awk; then + # Remove ignored files + mv $pp_wrkdir/duplicate.files $pp_wrkdir/duplicate.files.ign + sed -e 's/^/_ _ _ _ _ /' < $pp_wrkdir/duplicate.files.ign | + awk -f $pp_wrkdir/ign.awk | + sed -e 's/^_ _ _ _ _ //' > $pp_wrkdir/duplicate.files + fi + while read _path; do + pp_warn "$_path: file declared more than once" + done <$pp_wrkdir/duplicate.files + fi +} + +pp_files_check_coverage () { + pp_find_recurse "$pp_destdir" | sort > $pp_wrkdir/coverage.avail + if test -s $pp_wrkdir/all.files; then + sort -u < $pp_wrkdir/all.files + else + : + fi > $pp_wrkdir/coverage.used + join -v1 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \ + > $pp_wrkdir/coverage.not-packaged + if test -s $pp_wrkdir/coverage.not-packaged; then + pp_warn "The following files/directories were found but not packaged:" + sed -e 's,^, ,' < $pp_wrkdir/coverage.not-packaged >&2 + fi + join -v2 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \ + > $pp_wrkdir/coverage.not-avail + if test -s $pp_wrkdir/coverage.not-avail; then + pp_warn "The following files/directories were named but not found:" + sed -e 's,^, ,' < $pp_wrkdir/coverage.not-avail >&2 + fi +} + +pp_files_ignore_others () { + typeset p f + + test -s $pp_wrkdir/ign.files || return + + #-- for each file in ign.files, we remove it from all the + # other %files.* lists, except where it has an i flag. + # rather than scan each list multiple times, we build + # an awk script + + pp_debug "stripping ignore files" + + while read p; do + echo '$6 == "'"$p"'" && $5 !~ /i/ { next }' + done < $pp_wrkdir/ign.files > $pp_wrkdir/ign.awk + echo '{ print }' >> $pp_wrkdir/ign.awk + + $pp_opt_debug && cat $pp_wrkdir/ign.awk + + for f in $pp_wrkdir/%files.*; do + mv $f $f.ign + awk -f $pp_wrkdir/ign.awk < $f.ign > $f || pp_error "awk" + done +} + +pp_service_scan_groups () { + typeset svc + + #-- scan for "group" commands, and build a list of groups + pp_service_groups= + if test -n "$pp_services"; then + for svc in $pp_services; do + group= + . $pp_wrkdir/%service.$svc + if test -n "$group"; then + pp_contains "$pp_services" "$group" && pp_error \ + "%service $svc: group name $group in use by a service" + pp_add_to_list 'pp_service_groups' "$group" + echo "$svc" >> $pp_wrkdir/%svcgrp.$group + fi + done + fi +} + +pp_service_get_svc_group () { + (tr '\012' ' ' < $pp_wrkdir/%svcgrp.$1 ; echo) | sed -e 's/ $//' +} + +for _sufx in _init '' _names _cleanup _install_script \ + _init_svc_vars _function _probe _vas_platforms +do + eval "pp_backend$_sufx () { pp_debug pp_backend$_sufx; pp_backend_\${pp_platform}$_sufx \"\$@\"; }" +done + + +pp_platforms="$pp_platforms aix" + +pp_backend_aix_detect () { + test x"$1" = x"AIX" +} + +pp_backend_aix_init () { + pp_aix_detect_arch + pp_aix_detect_os + + pp_aix_bosboot= # components that need bosboot + pp_aix_lang=en_US + pp_aix_copyright= + pp_aix_start_services_after_install=false + pp_aix_init_services_after_install=true + + pp_aix_sudo=sudo # AIX package tools must run as root + + case "$pp_aix_os" in + *) pp_readlink_fn=pp_ls_readlink;; # XXX + esac + + pp_aix_abis_seen= +} + +pp_aix_detect_arch () { + pp_aix_arch_p=`uname -p 2>/dev/null` + case "$pp_aix_arch_p" in + "") pp_debug "can't get processor type from uname -p" + pp_aix_arch_p=powerpc + pp_aix_arch=R;; # guess (lsattr -l proc0 ??) + powerpc) pp_aix_arch=R;; + *) pp_aix_arch_p=intel + pp_aix_arch=I;; # XXX? verify + esac + + case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in + PowerPC_POWER*) pp_aix_arch_std=ppc64;; + PowerPC*) pp_aix_arch_std=ppc;; + *) pp_aix_arch_std=unknown;; + esac +} + +pp_aix_detect_os () { + typeset r v + + r=`uname -r` + v=`uname -v` + pp_aix_os=aix$v$r +} + +pp_aix_version_fix () { + typeset v + v=`echo $1 | sed 's/[-+]/./' | tr -c -d '[0-9].\012' | awk -F"." '{ printf "%d.%d.%d.%.4s\n", $1, $2, $3, $4 }' | sed 's/[.]*$//g'` + if test x"$v" != x"$1"; then + pp_warn "stripped version '$1' to '$v'" + fi + case $v in + ""|*..*|.*|*.) pp_error "malformed '$1'" + echo "0.0.0.0";; + *.*.*.*.*) + # 5 components are only valid for fileset updates, not base + # filesets (full packages). We trim 5+ components down to 4. + pp_warn "version '$1' has too many dots for AIX, truncating" + echo "$v" | cut -d. -f1-4;; + *.*.*.*) echo "$v";; + *.*.*) echo "$v.0";; + *.*) echo "$v.0.0";; + *) echo "$v.0.0.0";; + esac +} + +pp_aix_select () { + case "$1" in + -user) op="";; + -root) op="!";; + *) pp_die "pp_aix_select: bad argument";; + esac + #pp_debug awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }' + #awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }' + awk $op'($6 ~ /^\/usr\// || $6 ~ /^\/opt\//) { print; }' +} + +pp_aix_copy_root () { + typeset t m o g f p st target + while read t m o g f p st; do + case "$t" in + d) pp_create_dir_if_missing "$1${p%/}";; + f) pp_add_transient_file "$1$p" + pp_verbose ln "$pp_destdir$p" "$pp_destdir$1$p" || + pp_error "can't link $p into $1";; + *) pp_warn "pp_aix_copy_root: filetype $t not handled";; + esac + done +} + +pp_aix_size () { + typeset prefix t m o g f p st + + prefix="$1" + while read t m o g f p st; do + case "$t" in f) du -a "$pp_destdir$p";; esac + done | sed -e 's!/[^/]*$!!' | sort +1 | + awk '{ if ($2 != d) + { if (sz) print d,sz; + d=$2; sz=0 } + sz += $1; } + END { if (sz) print d,sz }' | + sed -n -e "s!^$pp_destdir!$prefix!p" +} + +pp_aix_list () { + awk '{ print "." pfx $6; }' pfx="$1" +} + +pp_aix_make_liblpp () { + typeset out dn fl f + + out="$1"; shift + dn=`dirname "$2"` + fl= + for f + do + case "$f" in "$dn/"*) fl="$fl `basename $f`" ;; + *) pp_die "liblpp name $f not in $dn/";; esac + done + (cd "$dn" && pp_verbose ar -c -g -r "$out" $fl) || pp_error "ar error" +} + +pp_aix_make_script () { + rm -f "$1" + echo "#!/bin/sh" > "$1" + cat >> "$1" + echo "exit 0" >> "$1" + chmod +x "$1" +} + +pp_aix_inventory () { + typeset fileset t m o g f p st type + + fileset="$1" + while read t m o g f p st; do + case "$p" in *:*) pp_error "path $p contains colon";; esac + echo "$p:" + case "$t" in + f) type=FILE; defm=644 ;; + s) type=SYMLINK; defm=777 ;; + d) type=DIRECTORY; defm=755 ;; + esac + echo " type = $type" + echo " class = inventory,apply,$fileset" + if test x"$m" = x"-"; then m="$defm"; fi + if test x"$o" = x"-"; then o="root"; fi + if test x"$g" = x"-"; then g="system"; fi + echo " owner = $o" + echo " group = $g" + + case "$m" in ????) + m=`echo $m|sed -e 's/^1/TCB,/' \ + -e 's/^[23]/TCB,SGID,/' \ + -e 's/^[45]/TCB,SUID,/' \ + -e 's/^[67]/TCB,SUID,SGID,/'`;; # vtx bit ignored + esac + echo " mode = $m" + case "$t" in + f) if test ! -f "$pp_destdir$p"; then + pp_error "$p: missing file" + fi + case "$flags" in + *v*) + echo " size = VOLATILE" + echo " checksum = VOLATILE" + ;; + *) + if test -r "$pp_destdir$p"; then + echo " size = $size" + pp_verbose sum -r < "$pp_destdir$p" | + sed -e 's/.*/ checksum = "&"/' + fi + ;; + esac;; + s) + echo " target = $st" + ;; + esac + + #-- Record ABI types seen + case "$t" in + f) if test -r "$pp_destdir$p"; then + case "`file "$pp_destdir$p"`" in + *"executable (RISC System/6000)"*) abi=ppc;; + *"64-bit XCOFF executable"*) abi=ppc64;; + *) abi=;; + esac + if test -n "$abi"; then + pp_add_to_list pp_aix_abis_seen $abi + fi + fi;; + esac + + done +} + +pp_aix_depend () +{ + if test -s "$1"; then + pp_warn "aix dependencies not implemented" + fi +} + +pp_aix_add_service () { + typeset svc cmd_cmd cmd_arg f + svc="$1" + + pp_load_service_vars $svc + + set -- $cmd + cmd_cmd="$1"; shift + cmd_arg="${pp_aix_mkssys_cmd_args:-$*}"; + + case "$stop_signal" in + HUP) stop_signal=1;; + INT) stop_signal=2;; + QUIT) stop_signal=3;; + KILL) stop_signal=9;; + TERM) stop_signal=15;; + USR1) stop_signal=30;; + USR2) stop_signal=31;; + "") + pp_error "%service $svc: stop_signal not set";; + [a-zA-Z]*) + pp_error "%service $svc: bad stop_signal ($stop_signal)";; + esac + + test -z "$pidfile" || pp_error "aix requires empty pidfile (non daemon)" + + pp_add_component run + if test "$user" = "root"; then + uid=0 + else + uid="\"\`/usr/bin/id -u $user\`\"" + fi + + + #-- add command text to create/remove the service + cat <<-. >> $pp_wrkdir/%post.$svc +svc=$svc +uid=0 +cmd_cmd="$cmd_cmd" +cmd_arg="$cmd_arg" +stop_signal=$stop_signal +force_signal=9 +srcgroup="$pp_aix_mkssys_group" +instances_allowed=${pp_aix_mkssys_instances_allowed:--Q} + +lssrc -s \$svc > /dev/null 2>&1 +if [ \$? -eq 0 ]; then + lssrc -s \$svc | grep "active" > /dev/null 2>&1 + if [ \$? -eq 0 ]; then + stopsrc -s \$svc > /dev/null 2>&1 + fi + rmsys -s \$svc > /dev/null 2>&1 +fi + +mkssys -s \$svc -u \$uid -p "\$cmd_cmd" \${cmd_arg:+-a "\$cmd_arg"} -S -n \$stop_signal -f 9 ${pp_aix_mkssys_args} \${srcgroup:+-G \$srcgroup} \$instances_allowed +. + + #-- add code to start the service on reboot + ${pp_aix_init_services_after_install} && + cat <<-. >> $pp_wrkdir/%post.$svc +id=\`echo "\$svc" | cut -c1-14\` +mkitab "\$id:2:once:/usr/bin/startsrc -s \$svc" > /dev/null 2>&1 +. + + ${pp_aix_start_services_after_install} && + cat <<-. >> $pp_wrkdir/%post.$svc +startsrc -s \$svc +. + +if [ -f "$pp_wrkdir/%post.run" ];then + cat $pp_wrkdir/%post.run >> $pp_wrkdir/%post.$svc +fi +mv $pp_wrkdir/%post.$svc $pp_wrkdir/%post.run + + + ${pp_aix_init_services_after_install} && + pp_prepend $pp_wrkdir/%preun.$svc <<-. +rmitab `echo "$svc" | cut -c1-14` > /dev/null 2>&1 +. + pp_prepend $pp_wrkdir/%preun.$svc <<-. +stopsrc -s $svc >/dev/null 2>&1 +rmssys -s $svc +. + +if [ -f "$pp_wrkdir/%preun.run" ];then + cat $pp_wrkdir/%preun.run >> $pp_wrkdir/%preun.$svc +fi +mv $pp_wrkdir/%preun.$svc $pp_wrkdir/%preun.run +} + +pp_backend_aix () { + typeset briefex instuser instroot svc cmp outbff + typeset user_wrkdir root_wrkdir + typeset user_files root_files + + test -n "$pp_destdir" || + pp_error "AIX backend requires the '--destdir' option" + + instuser="/usr/lpp/$name" + instroot="$instuser/inst_root" + pp_aix_bff_name=${pp_aix_bff_name:-$name} + + # Here is the component mapping: + # run -> $pp_aix_bff_name.rte ('Run time environment') + # doc -> $pp_aix_bff_name.doc (non-standard) + # dev -> $pp_aix_bff_name.adt ('Application developer toolkit') + # dbg -> $pp_aix_bff_name.diag ('Diagnostics') + + test `echo "$summary" | wc -c ` -gt 40 && pp_error "\$summary too long" + + user_wrkdir=$pp_wrkdir/u + root_wrkdir=$pp_wrkdir/r + pp_verbose rm -rf $user_wrkdir $root_wrkdir + pp_verbose mkdir -p $user_wrkdir $root_wrkdir + + for svc in $pp_services .; do + test . = "$svc" && continue + pp_aix_add_service $svc + done + + { + echo "4 $pp_aix_arch I $name {" + + for cmp in $pp_components; do + case "$cmp" in + run) ex=rte briefex="runtime";; + doc) ex=doc briefex="documentation";; + dev) ex=adt briefex="developer toolkit";; + dbg) ex=diag briefex="diagnostics";; + esac + + user_files=$pp_wrkdir/%files.$cmp.u + root_files=$pp_wrkdir/%files.$cmp.r + + pp_aix_select -user < $pp_wrkdir/%files.$cmp > $user_files + pp_aix_select -root < $pp_wrkdir/%files.$cmp > $root_files + + # Default to USR only unless there are root files, + # or a post/pre/check script associated + content=U + if test -s $root_files \ + -o -s $pp_wrkdir/%pre.$cmp \ + -o -s $pp_wrkdir/%post.$cmp \ + -o -s $pp_wrkdir/%preun.$cmp \ + -o -s $pp_wrkdir/%postun.$cmp \ + -o -s $pp_wrkdir/%check.$cmp + then + content=B + fi + + if $pp_opt_debug; then + echo "$cmp USER %files:" + cat $user_files + echo "$cmp ROOT %files:" + cat $root_files + fi >&2 + + bosboot=N; pp_contains_any "$pp_aix_bosboot" $cmp && bosboot=b + + echo $pp_aix_bff_name.$ex \ + `[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"` \ + 1 $bosboot $content \ + $pp_aix_lang "$summary $briefex" + echo "[" + + pp_aix_depend $pp_wrkdir/%depend.$cmp + + echo "%" + + # generate per-directory size information + pp_aix_size < $user_files + pp_aix_size $instroot < $root_files + + pp_aix_list < $user_files > $user_wrkdir/$pp_aix_bff_name.$ex.al + pp_aix_list $instroot < $root_files >> $user_wrkdir/$pp_aix_bff_name.$ex.al + pp_aix_list < $root_files > $root_wrkdir/$pp_aix_bff_name.$ex.al + + if $pp_opt_debug; then + echo "$cmp USER $pp_aix_bff_name.$ex.al:" + cat $user_wrkdir/$pp_aix_bff_name.$ex.al + echo "$cmp ROOT $pp_aix_bff_name.$ex.al:" + cat $root_wrkdir/$pp_aix_bff_name.$ex.al + fi >&2 + + pp_aix_inventory $pp_aix_bff_name.$ex < $user_files \ + > $user_wrkdir/$pp_aix_bff_name.$ex.inventory + pp_aix_inventory $pp_aix_bff_name.$ex < $root_files \ + > $root_wrkdir/$pp_aix_bff_name.$ex.inventory + + if $pp_opt_debug; then + pp_debug "$cmp USER $pp_aix_bff_name.$ex.inventory:" + cat $user_wrkdir/$pp_aix_bff_name.$ex.inventory + pp_debug "$cmp ROOT $pp_aix_bff_name.$ex.inventory:" + cat $root_wrkdir/$pp_aix_bff_name.$ex.inventory + fi >&2 + + if test x"" != x"${pp_aix_copyright:-$copyright}"; then + echo "${pp_aix_copyright:-$copyright}" > $user_wrkdir/$pp_aix_bff_name.$ex.copyright + echo "${pp_aix_copyright:-$copyright}" > $root_wrkdir/$pp_aix_bff_name.$ex.copyright + fi + + #-- assume that post/pre uninstall scripts only make + # sense when installed in a root context + + if test -r $pp_wrkdir/%pre.$cmp; then + pp_aix_make_script $user_wrkdir/$pp_aix_bff_name.$ex.pre_i \ + < $pp_wrkdir/%pre.$cmp + fi + + if test -r $pp_wrkdir/%post.$cmp; then + pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.post_i \ + < $pp_wrkdir/%post.$cmp + fi + + if test -r $pp_wrkdir/%preun.$cmp; then + pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.unpost_i \ + < $pp_wrkdir/%preun.$cmp + fi + + if test -r $pp_wrkdir/%postun.$cmp; then + pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.unpre_i \ + < $pp_wrkdir/%postun.$cmp + fi + + # remove empty files + for f in $user_wrkdir/$pp_aix_bff_name.$ex.* $root_wrkdir/$pp_aix_bff_name.$ex.*; do + if test ! -s "$f"; then + pp_debug "removing empty $f" + rm -f "$f" + fi + done + + # copy/link the root files so we can do an easy backup later + pp_aix_copy_root $instroot < $root_files + + echo "%" + echo "]" + done + echo "}" + } > $pp_wrkdir/lpp_name + + if $pp_opt_debug; then + echo "/lpp_name :" + cat $pp_wrkdir/lpp_name + fi >&2 + + #-- copy the /lpp_name file to the destdir + pp_add_transient_file /lpp_name + cp $pp_wrkdir/lpp_name $pp_destdir/lpp_name + + #-- copy the liblpp.a files under destdir for packaging + (cd $user_wrkdir && pp_verbose ar -c -g -r liblpp.a $name.*) || + pp_error "ar error" + if test -s $user_wrkdir/liblpp.a; then + pp_add_transient_file $instuser/liblpp.a + pp_verbose cp $user_wrkdir/liblpp.a $pp_destdir$instuser/liblpp.a || + pp_error "cannot create user liblpp.a" + fi + (cd $root_wrkdir && pp_verbose ar -c -g -r liblpp.a $name.*) || + pp_error "ar error" + if test -s $root_wrkdir/liblpp.a; then + pp_add_transient_file $instroot/liblpp.a + pp_verbose cp $root_wrkdir/liblpp.a $pp_destdir$instroot/liblpp.a || + pp_error "cannot create root liblpp.a" + fi + + { echo ./lpp_name + test -s $user_wrkdir/liblpp.a && echo .$instuser/liblpp.a + test -s $root_wrkdir/liblpp.a && echo .$instroot/liblpp.a + cat $user_wrkdir/$name.*.al # includes the relocated root files! + } > $pp_wrkdir/bff.list + + if test -n "$pp_aix_abis_seen" -a x"$pp_aix_arch_std" = x"auto"; then + case "$pp_aix_abis_seen" in + "ppc ppc64"|"ppc64 ppc") + pp_aix_arch_std=ppc64 + ;; + ppc|ppc64) + pp_aix_arch_std=$pp_aix_abis_seen + ;; + *" "*) + pp_warn "multiple architectures detected: $pp_aix_abis_seen" + pp_aix_arch_std=unknown + ;; + "") + pp_warn "no binary executables detected; using noarch" + pp_aix_arch_std=noarch + ;; + *) + pp_warn "unknown architecture detected $pp_aix_abis_seen" + pp_aix_arch_std=$pp_aix_abis_seen + ;; + esac + fi + + . $pp_wrkdir/%fixup + + outbff=`pp_backend_aix_names` + pp_debug "creating: $pp_wrkdir/$outbff" + (cd $pp_destdir && pp_verbose /usr/sbin/backup -i -q -p -f -) \ + < $pp_wrkdir/bff.list \ + > $pp_wrkdir/$outbff || pp_error "backup failed" + if test -n "$pp_aix_sudo" -o -x /usr/sbin/installp; then + $pp_aix_sudo /usr/sbin/installp -l -d $pp_wrkdir/$outbff + fi +} + +pp_backend_aix_cleanup () { + : +} + +pp_backend_aix_names () { + echo "$name.`[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"`.bff" +} + +pp_backend_aix_install_script () { + typeset pkgname platform + # + # The script should take a first argument being the + # operation; further arguments refer to components or services + # + # list-components -- lists components in the pkg + # install component... -- installs the components + # uninstall component... -- uninstalles the components + # list-services -- lists the services in the pkg + # start service... -- starts the name service + # stop service... -- stops the named services + # print-platform -- prints the platform group + # + pkgname="`pp_backend_aix_names`" + platform="`pp_backend_aix_probe`" # XXX should be derived from files + + fsets= + for cmp in $pp_components; do + case "$cmp" in + run) ex=rte;; + doc) ex=doc;; + dev) ex=adt;; + dbg) ex=diag;; + esac + fsets="$fsets $name.$ex" + done + + echo '#!/bin/sh' + pp_install_script_common + + cat <<-. + + cpt_to_fileset () { + test x"\$*" = x"all" && + set -- $pp_components + for cpt + do + case "\$cpt" in + run) echo "$name.rte";; + doc) echo "$name.doc";; + dev) echo "$name.adt";; + dbg) echo "$name.diag";; + *) usage;; + esac + done + } + + test \$# -eq 0 && usage + op="\$1"; shift + + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo "$pp_components" + ;; + list-services) + test \$# -eq 0 || usage \$op + echo "$pp_services" + ;; + list-files) + test \$# -ge 1 || usage \$op + echo \${PP_PKGDESTDIR:-.}/$pkgname + ;; + install) + test \$# -ge 1 || usage \$op + verbose /usr/sbin/installp -acX -V0 -F \ + -d \${PP_PKGDESTDIR:-.}/$pkgname \ + \`cpt_to_fileset "\$@"\` + ;; + uninstall) + test \$# -ge 1 || usage \$op + verbose /usr/sbin/installp -u -e/dev/null \ + -V0 \`cpt_to_fileset "\$@"\` + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + verbose \${op}src -s \$svc || ec=1 + done + exit \$ec + ;; + print-platform) + echo "$platform" + ;; + *) + usage;; + esac +. +} + +pp_backend_aix_init_svc_vars () { + : +} + +pp_backend_aix_probe () { + echo "${pp_aix_os}-${pp_aix_arch_std}" +} + +pp_backend_aix_vas_platforms () { + case "${pp_aix_arch_std}" in + ppc*) :;; + *) pp_die "unknown architecture ${pp_aix_arch_std}";; + esac + case "${pp_aix_os}" in + aix43) echo "aix-43";; + aix51) echo "aix-51 aix-43";; + aix52) echo "aix-51 aix-43";; + aix53) echo "aix-53 aix-51 aix-43";; + aix61) echo "aix-53 aix-51 aix-43";; + *) pp_die "unknown system ${pp_aix_os}";; + esac +} +pp_backend_aix_function () { + case "$1" in + pp_mkgroup) cat <<'.';; + /usr/sbin/lsgroup "$1" >/dev/null && + return 0 + echo "Creating group $1" + /usr/bin/mkgroup -A "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat <<'.';; + /usr/sbin/lsuser "$1" >/dev/null && + return 0 + pp_mkgroup "${2:-$1}" || return 1 + echo "Creating user $1" + /usr/bin/mkuser \ + login=false \ + rlogin=false \ + account_locked=true \ + home="${3:-/nohome.$1}" \ + pgrp="${2:-$1}" \ + "$1" +. + pp_havelib) cat <<'.';; + case "$2" in + "") pp_tmp_name="lib$1.so";; + *.*.*) pp_tmp_name="lib$1.so.$2";; + *.*) pp_tmp_name="lib$1.so.$2.0";; + *) pp_tmp_name="lib$1.so.$2";; + esac + for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do + test -r "$pp_tmp_dir/$pp_tmp_name" -a \ + -r "$pp_tmp_dir/lib$1.so" && return 0 + done + return 1 +. + *) false;; + esac +} + +pp_platforms="$pp_platforms sd" + +pp_backend_sd_detect () { + test x"$1" = x"HP-UX" +} + +pp_backend_sd_init () { + pp_sd_sudo=sudo + pp_sd_startlevels=2 + pp_sd_stoplevels=auto + pp_sd_config_file= + pp_sd_vendor= + pp_sd_vendor_tag=OneIdentity + pp_sd_default_start=1 # config_file default start value + + pp_readlink_fn=pp_ls_readlink # HPUX has no readlink + pp_shlib_suffix='.sl' # .so on most other platforms + + pp_sd_detect_os +} + +pp_sd_detect_os () { + typeset revision + + revision=`uname -r` + pp_sd_os="${revision#?.}" + test -z "$pp_sd_os" && + pp_warn "cannot detect OS version" + pp_sd_os_std="hpux`echo $pp_sd_os | tr -d .`" + + case "`uname -m`" in + 9000/[678]??) pp_sd_arch_std=hppa;; + ia64) pp_sd_arch_std=ia64;; + *) pp_sd_arch_std=unknown;; + esac +} + +pp_sd_write_files () { + typeset t m o g f p st line dm + while read t m o g f p st; do + line=" file" + case "$f" in *v*) line="$line -v";; esac # FIXME for uninstall + case ${pp_sd_os} in + 10.*) + case $t in + f) dm=644;; + d) p=${p%/}; dm=755;; + esac + ;; + *) + case $t in + f) dm=644;; + d) line="$line -t d"; p=${p%/}; dm=755;; + s) line="$line -t s";; + esac + ;; + esac + + test x"$o" = x"-" && o=root + test x"$g" = x"-" && g=sys + test x"$m" = x"-" && m=$dm + + case $t in + s) + # swpackage will make unqualified links relative to the + # current working (source) directory, not the destination; + # we need to qualify them to prevent this. + case "$st" in + [!/]*) st="`dirname \"$p\"`/$st";; + esac + echo "$line -o $o -g $g -m $m $st $p" + ;; + *) + echo "$line -o $o -g $g -m $m $pp_destdir$p $p" + ;; + esac + + done +} + +pp_sd_service_group_script () { + typeset grp svcs scriptpath out + grp="$1" + svcs="$2" + scriptpath="/sbin/init.d/$grp" + out="$pp_destdir$scriptpath" + + pp_add_file_if_missing $scriptpath run 755 || return 0 + + cat <<-. > $out + #!/sbin/sh + # generated by pp $pp_version + svcs="$svcs" +. + + cat <<-'.' >> $out + #-- starts services in order.. stops them all if any break + pp_start () { + undo= + for svc in \$svcs; do + /sbin/init.d/\$svc start + case \$? in + 0|4) + undo="\$svc \$undo" + ;; + *) + if test -n "\$undo"; then + for svc in \$undo; do + /sbin/init.d/\$svc stop + done + return 1 + fi + ;; + esac + done + return 0 + } + + #-- stops services in reverse + pp_stop () { + reverse= + for svc in \$svcs; do + reverse="\$svc \$reverse" + done + rc=0 + for svc in \$reverse; do + /sbin/init.d/\$svc stop || rc=\$? + done + return \$rc + } + + case \$1 in + start_msg) echo "Starting \$svcs";; + stop_msg) echo "Stopping \$svcs";; + start) pp_start;; + stop) pp_stop;; + *) echo "usage: \$0 {start|stop|start_msg|stop_msg}" + exit 1;; + esac +. +} + +pp_sd_service_script () { + typeset svc config_file config_value scriptpath out + + svc="$1" + scriptpath="/sbin/init.d/$svc" + + config_file=${pp_sd_config_file:-/etc/rc.config.d/$svc} + sd_config_var=`echo run-$svc | tr '[a-z]-' '[A-Z]_'` + sd_config_value=${pp_sd_default_start:-0} + pp_load_service_vars "$svc" + + test -n "$user" -a x"$user" != x"root" && + cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\"" + if test -z "$pidfile"; then + pidfile="/var/run/$svc.pid" + cmd="$cmd & echo \$! > \$pidfile" + fi + + pp_debug "config file is $config_file" + + pp_add_file_if_missing $scriptpath run 755 + pp_add_file_if_missing $config_file run 644 v + + cat <<-. >> $pp_destdir$config_file + + # Controls whether the $svc service is started + $sd_config_var=$sd_config_value +. + + if test ! -f $pp_destdir$scriptpath; then + cat <<-. > $pp_destdir$scriptpath + #!/sbin/sh + # generated by pp $pp_version + + svc="$svc" + pidfile="$pidfile" + config_file="$config_file" + + pp_start () { + $cmd + } + + pp_disabled () { + test \${$sd_config_var:-0} -eq 0 + } + + pp_stop () { + if test ! -s "\$pidfile"; then + echo "Unable to stop \$svc (no pid file)" + return 1 + else + read pid < "\$pidfile" + if kill -0 "\$pid" 2>/dev/null; then + if kill -${stop_signal:-TERM} "\$pid"; then + rm -f "\$pidfile" + return 0 + else + echo "Unable to stop \$svc" + return 1 + fi + else + rm -f "\$pidfile" + return 0 + fi + fi + } + + pp_running () { + if test -s "\$pidfile"; then + read pid < "\$pidfile" 2>/dev/null + if test \${pid:-0} -gt 1 && kill -0 "\$pid" 2>/dev/null; then + # make sure command name matches + c="\`echo $cmd | sed -e 's: .*::' -e 's:^.*/::'\`" + pid="\`ps -p \$pid 2>/dev/null | sed -n \"s/^ *\(\$pid\) .*\$c *\$/\1/p\"\`" + if test -n "\$pid"; then + return 0 + fi + fi + fi + return 1 + } + + case \$1 in + start_msg) echo "Starting the \$svc service";; + stop_msg) echo "Stopping the \$svc service";; + start) + if test -f "\$config_file"; then + . \$config_file + fi + if pp_disabled; then + exit 2 + elif pp_running; then + echo "\$svc already running"; + exit 0 + elif pp_start; then + echo "\$svc started"; + # rc(1M) says we should exit 4, but nobody expects it! + exit 0 + else + exit 1 + fi;; + stop) if pp_stop; then + echo "\$svc stopped"; + exit 0 + else + exit 1 + fi;; + *) echo "usage: \$0 {start|stop|start_msg|stop_msg}" + exit 1;; + esac +. + fi +} + +pp_sd_make_service () { + typeset level startpriority stoppriority startlevels stoplevels + typeset svc svcvar symtype + + svc="$1" + svcvar=`pp_makevar $svc` + + case ${pp_sd_os} in + 10.*) symtype="file";; + *) symtype="file -t s";; + esac + + # TODO: Figure out why this check is here + #-- don't do anything if the script exists + #if test -s "$pp_destdir/sbin/init.d/$svc"; then + # pp_error "$pp_destdir/sbin/init.d/$svc exists" + # return + #fi + + # symlink the script, depending on the priorities chosen + eval startpriority='${pp_sd_startpriority_'$svcvar'}' + eval stoppriority='${pp_sd_stoppriority_'$svcvar'}' + test -z "$startpriority" && startpriority="${pp_sd_startpriority:-50}" + test -z "$stoppriority" && stoppriority="${pp_sd_stoppriority:-50}" + + eval startlevels='${pp_sd_startlevels_'$svcvar'}' + test -z "$startlevels" && startlevels="$pp_sd_startlevels" + + eval stoplevels='${pp_sd_stoplevels_'$svcvar'}' + test -z "$stoplevels" && stoplevels="$pp_sd_stoplevels" + + # create the script and config file + pp_sd_service_script $svc + + # fix the priority up + case "$startpriority" in + ???) :;; + ??) startpriority=0$startpriority;; + ?) startpriority=00$startpriority;; + esac + case "$stoppriority" in + ???) :;; + ??) stoppriority=0$stoppriority;; + ?) stoppriority=00$stoppriority;; + esac + + if test x"$stoplevels" = x"auto"; then + stoplevels= + test -z "$startlevels" || for level in $startlevels; do + stoplevels="$stoplevels `expr $level - 1`" + done + fi + + # create the symlinks + test -z "$startlevels" || for level in $startlevels; do + echo " ${symtype}" \ + "/sbin/init.d/$svc" \ + "/sbin/rc$level.d/S$startpriority$svc" + done + test -z "$stoplevels" || for level in $stoplevels; do + echo " ${symtype}" \ + "/sbin/init.d/$svc" \ + "/sbin/rc$level.d/K$stoppriority$svc" + done +} + +pp_sd_control () { + typeset ctrl script + typeset cpt + + ctrl="$1"; shift + cpt="$1"; shift + script="$pp_wrkdir/control.$ctrl.$cpt" + cat <<. >$script +. + cat "$@" >> $script + echo "exit 0" >> $script + /usr/bin/chmod +x $script + echo " $ctrl $script" +} + +pp_sd_depend () { + typeset _name _vers + while read _name _vers; do + case "$_name" in ""| "#"*) continue ;; esac + echo " prerequisites $_name ${_vers:+r>= $_vers}" + done +} + +pp_sd_conflict () { + typeset _name _vers + while read _name _vers; do + case "$_name" in ""| "#"*) continue ;; esac + echo " exrequisites $_name ${_vers:+r>= $_vers}" + done +} + +pp_backend_sd () { + typeset psf cpt svc outfile release swp_flags + + psf=$pp_wrkdir/psf + release="?.${pp_sd_os%.[0-9][0-9]}.*" + + echo "depot" > $psf + echo "layout_version 1.0" >>$psf + + #-- vendor + cat <<. >>$psf + vendor + tag $pp_sd_vendor_tag + title "${pp_sd_vendor:-$vendor}" + end + + product + tag $name + revision $version + vendor_tag $pp_sd_vendor_tag + is_patch false + title "$summary" + copyright "$copyright" + machine_type * + os_name HP-UX + os_release $release + os_version ? + directory / + is_locatable false +. + test -n "$description" \ + && echo $description > $pp_wrkdir/description \ + && cat <<. >> $psf + description < $pp_wrkdir/description +. + + # make convenience service groups + if test -n "$pp_service_groups"; then + for grp in $pp_service_groups; do + pp_sd_service_group_script \ + $grp "`pp_service_get_svc_group $grp`" + done + fi + + for cpt in $pp_components; do + cat <<. >>$psf + fileset + tag ${pp_sd_fileset_tag:-$cpt} + title "${summary:-cpt}" + revision $version +. + test -s $pp_wrkdir/%depend.$cpt && + pp_sd_depend < $pp_wrkdir/%depend.$cpt >> $psf + test -s $pp_wrkdir/%conflict.$cpt && + pp_sd_conflict < $pp_wrkdir/%conflict.$cpt >> $psf + + #-- make sure services are shut down during uninstall + if test $cpt = run -a -n "$pp_services"; then + for svc in $pp_services; do + pp_prepend $pp_wrkdir/%preun.$cpt <<-. + /sbin/init.d/$svc stop +. + done + fi + + #-- we put the post/preun code into configure/unconfigure + # and not postinstall/preremove, because configure/unconfigure + # scripts are run on the hosts where the package is installed, + # not loaded (a subtle difference). + test -s $pp_wrkdir/%pre.$cpt && + pp_sd_control checkinstall $cpt $pp_wrkdir/%pre.$cpt >> $psf + test -s $pp_wrkdir/%post.$cpt && + pp_sd_control configure $cpt $pp_wrkdir/%post.$cpt >> $psf + test -s $pp_wrkdir/%preun.$cpt && + pp_sd_control unconfigure $cpt $pp_wrkdir/%preun.$cpt >> $psf + test -s $pp_wrkdir/%postun.$cpt && + pp_sd_control postremove $cpt $pp_wrkdir/%postun.$cpt >> $psf + test -s $pp_wrkdir/%check.$cpt && + pp_sd_control checkinstall $cpt $pp_wrkdir/%check.$cpt >> $psf + + if test $cpt = run -a -n "$pp_services"; then + for svc in $pp_services; do + #-- service names are 10 chars max on hpux + case "$svc" in ???????????*) + pp_warn "service name '$svc' is too long for hpux";; + esac + pp_sd_make_service $svc >> $psf + done + #pp_sd_make_service_config + fi + + pp_sd_write_files < $pp_wrkdir/%files.$cpt >> $psf + + #-- end fileset clause + cat <<. >>$psf + end +. + + done + + #-- end product clause + cat <<. >>$psf + end +. + + $pp_opt_debug && cat $psf >&2 + + test -s $pp_wrkdir/%fixup && . $pp_wrkdir/%fixup + + outfile=`pp_backend_sd_names` + case ${pp_sd_os} in + 10.*) + swp_flags="-x target_type=tape" + ;; + *) + swp_flags="-x media_type=tape" + ;; + esac + if pp_verbose ${pp_sd_sudo} /usr/sbin/swpackage -s $psf $swp_flags \ + @ $pp_wrkdir/$outfile + then + pp_verbose ${pp_sd_sudo} /usr/sbin/swlist -l file -s $pp_wrkdir/$outfile + else + pp_error "swpackage failed" + fi +} + +pp_backend_sd_cleanup () { + : +} + +pp_backend_sd_names () { + echo "$name-$version.$pp_sd_arch_std.depot" +} + +pp_backend_sd_install_script () { + typeset pkgname platform + + pkgname=`pp_backend_sd_names` + platform="`pp_backend_sd_probe`" + + echo "#!/bin/sh" + pp_install_script_common + cat <<. + + cpt_to_tags () { + test x"\$*" = x"all" && set -- $pp_components + for cpt + do + echo "$name.\$cpt" + done + } + + test \$# -eq 0 && usage + op="\$1"; shift + + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo "$pp_components" + ;; + list-services) + test \$# -eq 0 || usage \$op + echo "$pp_services" + ;; + list-files) + test \$# -ge 1 || usage \$op + echo \${PP_PKGDESTDIR:-.}/$pkgname + ;; + install) + test \$# -ge 1 || usage \$op + verbose /usr/sbin/swinstall -x verbose=0 \ + -s \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \ + \`cpt_to_tags "\$@"\` + ;; + uninstall) + test \$# -ge 1 || usage \$op + verbose /usr/sbin/swremove -x verbose=0 \ + \`cpt_to_tags "\$@"\` + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + verbose /sbin/init.d/\$svc \$op + [ \$? -eq 4 -o \$? -eq 0 ] || ec=1 + done + exit \$ec + ;; + print-platform) + echo "$platform" + ;; + *) + usage + ;; + esac +. +} + +pp_backend_sd_probe () { + echo "${pp_sd_os_std}-${pp_sd_arch_std}" +} + +pp_backend_sd_vas_platforms () { + case "`pp_backend_sd_probe`" in + hpux*-hppa) echo hpux-pa;; + hpux*-ia64) echo hpux-ia64 hpux-pa;; + *) pp_die "unknown system `pp_backend_sd_probe`";; + esac +} + +pp_backend_sd_init_svc_vars () { + : +} +pp_backend_sd_function () { + case "$1" in + pp_mkgroup) cat <<'.';; + /usr/sbin/groupmod "$1" 2>/dev/null || + /usr/sbin/groupadd "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat <<'.';; + pp_mkgroup "${2:-$1}" || return 1 + /usr/sbin/useradd \ + -g "${2:-$1}" \ + -d "${3:-/nonexistent}" \ + -s "${4:-/bin/false}" \ + "$1" +. + pp_havelib) cat <<'.';; + for pp_tmp_dir in `echo /usr/lib${3:+:$3} | tr : ' '`; do + test -r "$pp_tmp_dir/lib$1${2:+.$2}.sl" && return 0 + done + return 1 +. + *) false;; + esac +} + +pp_platforms="$pp_platforms solaris" + +pp_backend_solaris_detect () { + test x"$1" = x"SunOS" +} + +pp_backend_solaris_init () { + pp_solaris_category= + pp_solaris_istates="s S 1 2 3" # run-states when install is ok + pp_solaris_rstates="s S 1 2 3" # run-states when remove is ok + pp_solaris_maxinst= + pp_solaris_vendor= + pp_solaris_pstamp= + pp_solaris_copyright= + pp_solaris_name= + pp_solaris_desc= + pp_solaris_package_arch=auto + + pp_solaris_detect_os + pp_solaris_detect_arch + + pp_solaris_init_svc + + #-- readlink not reliably available on Solaris + pp_readlink_fn=pp_ls_readlink +} + +pp_solaris_detect_os () { + typeset osrel + + osrel=`/usr/bin/uname -r` + case "$osrel" in + 5.[0-6]) pp_solaris_os="sol2${osrel#5.}";; + 5.*) pp_solaris_os="sol${osrel#5.}";; + esac + test -z "$pp_solaris_os" && + pp_warn "can't determine OS suffix from uname -r" + +} + +pp_solaris_detect_arch () { + pp_solaris_arch=`/usr/bin/optisa amd64 sparcv9 i386 sparc` + [ -z "$pp_solaris_arch" ] && + pp_error "can't determine processor architecture" + case "$pp_solaris_arch" in + amd64) pp_solaris_arch_std=x86_64;; + i386) pp_solaris_arch_std=i386;; + sparcv9) pp_solaris_arch_std=sparc64;; + sparc) pp_solaris_arch_std=sparc;; + *) pp_solaris_arch_std=unknown;; + esac +} + +pp_solaris_is_request_script_necessary () { + typeset has_optional_services + + has_optional_services=no + for _svc in $pp_services; do + pp_load_service_vars $_svc + if test "$optional" = "yes"; then + has_optional_services=yes + fi + done + + # If the package has no optional services and only one component, don't + # create a request script at all. + if test "$has_optional_services" = "no" && + test `echo $pp_components | wc -w` -eq 1; then + return 1 # no + fi + + return 0 # yes +} + +pp_solaris_request () { + typeset _cmp _svc + + #-- The common part of the request script contains the ask() function + # and resets the CLASSES list to empty + cat <<'.' + trap 'exit 3' 15 + ask () { + ans=`ckyorn -d "$1" \ + -p "Do you want to $2"` \ + || exit $? + case "$ans" in y*|Y*) return 0;; *) return 1;; esac + } + CLASSES= +. + #-- each of our components adds itself to the CLASSES list + for _cmp in $pp_components; do + case "$_cmp" in + run) :;; + doc) echo 'ask y "install the documentation files" &&';; + dev) echo 'ask y "install the development files" &&';; + dbg) echo 'ask n "install the diagnostic files" &&';; + esac + echo ' CLASSES="$CLASSES '$_cmp'"' + done + + #-- the request script writes the CLASSES var to its output + cat <<'.' + echo "CLASSES=$CLASSES" > $1 +. + + if test -n "$pp_services"; then + echo 'SERVICES=' + for _svc in $pp_services; do + pp_load_service_vars $_svc + if test "$enable" = "yes"; then + _default_prompt=y + else + _default_prompt=n + fi + if test "$optional" = "yes"; then + echo 'ask '$_default_prompt' "install '$_svc' service" &&' + fi + echo ' SERVICES="$SERVICES '$_svc'"' + done + echo 'echo "SERVICES=$SERVICES" >> $1' + fi + +} + +pp_solaris_procedure () { + cat <<. + + #-- $2 for $1 component of $name + case " \$CLASSES " in *" $1 "*) +. + cat + cat <<. + ;; esac +. +} + +pp_solaris_depend () { + typeset _name _vers + while read _name _vers; do + if test -n "$_name"; then + echo "P $_name $_name" + test -n "$_vers" && echo " $_vers" + fi + done +} + +pp_solaris_conflict () { + typeset _name _vers + while read _name _vers; do + if test -n "$_name"; then + echo "I $_name $_name" + test -n "$_vers" && echo " $_vers" + fi + done +} + +pp_solaris_space() { + echo "$2:$3:$1" >> $pp_wrkdir/space.cumulative +} + +pp_solaris_sum_space () { + if test -s $pp_wrkdir/space.cumulative; then + sort -t: +2 < $pp_wrkdir/space.cumulative | + awk -F: 'NR==1{n=$3}{if($3==n){b+=$1;i+=$2}else{print n" "b" "i;b=$1;i=$2;n=$3}}END{print n" "b" "i}' > $pp_wrkdir/space + fi +} + +pp_solaris_proto () { + typeset t m o g f p st + typeset abi + + while read t m o g f p st; do + # Use Solaris default mode, owner and group if all unspecified + if test x"$m$o$g" = x"---"; then + m="?"; o="?"; g="?" + fi + test x"$o" = x"-" && o="root" + case "$t" in + f) test x"$g" = x"-" && g="bin" + test x"$m" = x"-" && m=444 + case "$f" in + *v*) echo "v $1 $p=$pp_destdir$p $m $o $g";; + *) echo "f $1 $p=$pp_destdir$p $m $o $g";; + esac + if test -r "$pp_destdir$p"; then + #-- Use file to record ABI types seen + case "`file "$pp_destdir$p"`" in + *"ELF 32"*80386*) abi=i386;; + *"ELF 64"*AMD*) abi=x86_64;; + *"ELF 32"*SPARC*) abi=sparc;; + *"ELF 64"*SPARC*) abi=sparc64;; + *) abi=;; + esac + if test -n "$abi"; then + pp_add_to_list pp_solaris_abis_seen $abi + fi + fi + ;; + d) test x"$g" = x"-" && g="sys" + test x"$m" = x"-" && m=555 + echo "d $1 $p $m $o $g" + ;; + s) test x"$g" = x"-" && g="bin" + test x"$m" = x"-" && m=777 + if test x"$m" != x"777" -a x"$m" != x"?"; then + pp_warn "$p: invalid mode $m for symlink, should be 777 or -" + fi + echo "s $1 $p=$st $m $o $g" + ;; + esac + done +} + +pp_backend_solaris () { + typeset _cmp _svc _grp + + prototype=$pp_wrkdir/prototype + : > $prototype + + pkginfo=$pp_wrkdir/pkginfo + : > $pkginfo + echo "i pkginfo=$pkginfo" >> $prototype + + case "${pp_solaris_name:-$name}" in + [0-9]*) + pp_error "Package name '${pp_solaris_name:-$name}'" \ + "cannot start with a number" + ;; + ???????????????*) + pp_warn "Package name '${pp_solaris_name:-$name}'" \ + "too long for Solaris 2.6 or 2.7 (max 9 characters)" + ;; + ??????????*) + pp_warn "Package name '${pp_solaris_name:-$name}'" \ + "too long for 2.7 Solaris (max 9 characters)" + ;; + esac + + #-- generate the package info file + echo "VERSION=$version" >> $pkginfo + echo "PKG=${pp_solaris_name:-$name}" >> $pkginfo + echo "CLASSES=$pp_components" >> $pkginfo + echo "BASEDIR=/" >> $pkginfo + echo "NAME=$name $version" >> $pkginfo + echo "CATEGORY=${pp_solaris_category:-application}" >> $pkginfo + + desc="${pp_solaris_desc:-$description}" + test -n "$desc" && + echo "DESC=$desc" >> $pkginfo + + test -n "$pp_solaris_rstates" && + echo "RSTATES=$pp_solaris_rstates" >> $pkginfo + test -n "$pp_solaris_istates" && + echo "ISTATES=$pp_solaris_istates" >> $pkginfo + test -n "$pp_solaris_maxinst" && + echo "MAXINST=$pp_solaris_maxinst" >> $pkginfo + test -n "${pp_solaris_vendor:-$vendor}" && + echo "VENDOR=${pp_solaris_vendor:-$vendor}" >> $pkginfo + test -n "$pp_solaris_pstamp" && + echo "PSTAMP=$pp_solaris_pstamp" >> $pkginfo + + if test -n "${pp_solaris_copyright:-$copyright}"; then + echo "${pp_solaris_copyright:-$copyright}" > $pp_wrkdir/copyright + echo "i copyright=$pp_wrkdir/copyright" >> $prototype + fi + + #-- scripts to run before and after install + : > $pp_wrkdir/postinstall + : > $pp_wrkdir/preremove + : > $pp_wrkdir/postremove + for _cmp in $pp_components; do + #-- add the preinstall scripts in definition order + if test -s $pp_wrkdir/%pre.$_cmp; then + pp_solaris_procedure $_cmp preinst < $pp_wrkdir/%pre.$_cmp \ + >> $pp_wrkdir/preinstall + fi + #-- add the postinstall scripts in definition order + if test -s $pp_wrkdir/%post.$_cmp; then + pp_solaris_procedure $_cmp postinst < $pp_wrkdir/%post.$_cmp \ + >> $pp_wrkdir/postinstall + fi + #-- add the preremove rules in reverse definition order + if test -s $pp_wrkdir/%preun.$_cmp; then + pp_solaris_procedure $_cmp preremove < $pp_wrkdir/%preun.$_cmp | + pp_prepend $pp_wrkdir/preremove + fi + #-- add the postremove scripts in definition order + if test -s $pp_wrkdir/%postun.$_cmp; then + pp_solaris_procedure $_cmp postremove < $pp_wrkdir/%postun.$_cmp \ + >> $pp_wrkdir/postremove + fi + #-- Add the check script in definition order + if test -s $pp_wrkdir/%check.$_cmp; then + pp_solaris_procedure $_cmp checkinstall \ + < $pp_wrkdir/%check.$_cmp \ + >> $pp_wrkdir/checkinstall + fi + #-- All dependencies and conflicts are merged together for Solaris pkgs + test -s $pp_wrkdir/%depend.$_cmp && + pp_solaris_depend < $pp_wrkdir/%depend.$_cmp >> $pp_wrkdir/depend + test -s $pp_wrkdir/%conflict.$_cmp && + pp_solaris_conflict < $pp_wrkdir/%conflict.$_cmp >> $pp_wrkdir/depend + done + + + if pp_solaris_is_request_script_necessary; then + pp_solaris_request > $pp_wrkdir/request + fi + + test -n "$pp_services" && + for _svc in $pp_services; do + pp_load_service_vars $_svc + pp_solaris_smf $_svc + pp_solaris_make_service $_svc + pp_solaris_install_service $_svc | pp_prepend $pp_wrkdir/postinstall + pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/preremove + pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/postremove + unset pp_svc_xml_file + done + + test -n "$pp_service_groups" && + for _grp in $pp_service_groups; do + pp_solaris_make_service_group \ + $_grp "`pp_service_get_svc_group $_grp`" + done + + #-- if installf was used; we need to indicate a termination + grep installf $pp_wrkdir/postinstall >/dev/null && + echo 'installf -f $PKGINST' >> $pp_wrkdir/postinstall + + pp_solaris_sum_space + + # NB: pkginfo and copyright are added earlier + for f in compver depend space checkinstall \ + preinstall request postinstall \ + preremove postremove; do + if test -s $pp_wrkdir/$f; then + case $f in + *install|*remove|request) + # turn scripts into a proper shell scripts + mv $pp_wrkdir/$f $pp_wrkdir/$f.tmp + { echo "#!/bin/sh"; + echo "# $f script for ${pp_solaris_name:-$name}-$version" + cat $pp_wrkdir/$f.tmp + echo "exit 0"; } > $pp_wrkdir/$f + chmod +x $pp_wrkdir/$f + rm -f $pp_wrkdir/$f.tmp + ;; + esac + if $pp_opt_debug; then + pp_debug "contents of $f:" + cat $pp_wrkdir/$f >&2 + fi + echo "i $f=$pp_wrkdir/$f" >> $prototype + fi + done + + #-- create the prototype file which lists the files to install + # do this as late as possible because files could be added + pp_solaris_abis_seen= + for _cmp in $pp_components; do + pp_solaris_proto $_cmp < $pp_wrkdir/%files.$_cmp + done >> $prototype + + if test x"$pp_solaris_package_arch" = x"auto"; then + if pp_contains "$pp_solaris_abis_seen" sparc64; then + pp_solaris_package_arch_std="sparc64" + echo "ARCH=sparcv9" >> $pkginfo + elif pp_contains "$pp_solaris_abis_seen" sparc; then + pp_solaris_package_arch_std="sparc" + echo "ARCH=sparc" >> $pkginfo + elif pp_contains "$pp_solaris_abis_seen" x86_64; then + pp_solaris_package_arch_std="x86_64" + echo "ARCH=amd64" >> $pkginfo + elif pp_contains "$pp_solaris_abis_seen" i386; then + pp_solaris_package_arch_std="i386" + echo "ARCH=i386" >> $pkginfo + else + pp_warn "No ELF files found: not supplying an ARCH type" + pp_solaris_package_arch_std="noarch" + fi + else + pp_solaris_package_arch_std="$pp_solaris_package_arch" + echo "ARCH=$pp_solaris_package_arch" >> $pkginfo + fi + + mkdir $pp_wrkdir/pkg + + . $pp_wrkdir/%fixup + +if $pp_opt_debug; then + echo "$pkginfo::"; cat $pkginfo + echo "$prototype::"; cat $prototype +fi >&2 + + pkgmk -d $pp_wrkdir/pkg -f $prototype \ + || { error "pkgmk failed"; return; } + pkgtrans -s $pp_wrkdir/pkg \ + $pp_wrkdir/`pp_backend_solaris_names` \ + ${pp_solaris_name:-$name} \ + || { error "pkgtrans failed"; return; } +} + +pp_backend_solaris_cleanup () { + : +} + +pp_backend_solaris_names () { + echo ${pp_solaris_name:-$name}-$version-${pp_solaris_package_arch_std:-$pp_solaris_arch}.pkg +} + +pp_backend_solaris_install_script () { + typeset pkgname platform + + platform="${pp_solaris_os:-solaris}-${pp_solaris_package_arch_std:-$pp_solaris_arch}" + + echo "#! /sbin/sh" + pp_install_script_common + pkgname=`pp_backend_solaris_names` + + cat <<. + tmpnocheck=/tmp/nocheck\$\$ + tmpresponse=/tmp/response\$\$ + trap 'rm -f \$tmpnocheck \$tmpresponse' 0 + + make_tmpfiles () { + cat <<-.. > \$tmpresponse + CLASSES=\$* + SERVICES=$pp_services +.. + cat <<-.. > \$tmpnocheck + mail= + instance=overwrite + partial=nocheck + runlevel=nocheck + idepend=nocheck + rdepend=nocheck + space=nocheck + setuid=nocheck + conflict=nocheck + action=nocheck + basedir=default +.. + } + + test \$# -eq 0 && usage + op="\$1"; shift + + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo "$pp_components" + ;; + list-services) + test \$# -eq 0 || usage \$op + echo "$pp_services" + ;; + list-files) + test \$# -ge 1 || usage \$op + echo \${PP_PKGDESTDIR:-.}/$pkgname + ;; + install) + test \$# -ge 1 || usage \$op + make_tmpfiles "\$@" + verbose /usr/sbin/pkgadd -n -d \${PP_PKGDESTDIR:-.}/$pkgname \ + -r \$tmpresponse \ + -a \$tmpnocheck \ + ${pp_solaris_name:-$name} + ;; + uninstall) + test \$# -ge 1 || usage \$op + make_tmpfiles "\$@" + verbose /usr/sbin/pkgrm -n \ + -a \$tmpnocheck \ + ${pp_solaris_name:-$name} + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + verbose /etc/init.d/\$svc \$op || ec=1 + done + exit \$ec + ;; + print-platform) + echo "$platform" + ;; + *) + usage + ;; + esac +. +} + +pp_solaris_dynlib_depend () { + xargs ldd 2>/dev/null | + sed -e '/^[^ ]*:$/d' -e 's,.*=>[ ]*,,' -e 's,^[ ]*,,' | + sort -u | + grep -v '^/usr/platform/' | ( + set -- ""; shift + while read p; do + set -- "$@" -p "$p" + if [ $# -gt 32 ]; then + echo "$# is $#" >&2 + pkgchk -l "$@" + set -- ""; shift + fi + done + [ $# -gt 0 ] && pkgchk -l "$@" + )| + awk '/^Current status:/{p=0} p==1 {print $1} /^Referenced by/ {p=1}' | + sort -u | + xargs -l32 pkginfo -x | + awk 'NR % 2 == 1 { name=$1; } NR%2 == 0 { print name, $2 }' +} + +pp_solaris_add_dynlib_depends () { + typeset tmp + tmp=$pp_wrkdir/tmp.dynlib + + for _cmp in $pp_components; do + awk '{print destdir $6}' destdir="$pp_destdir" \ + < $pp_wrkdir/%files.$_cmp | + pp_solaris_dynlib_depend > $tmp + if test -s $tmp; then + cat $tmp >> $pp_wrkdir/%depend.$_cmp + fi + rm -f $tmp + done +} + +pp_backend_solaris_probe () { + echo "${pp_solaris_os}-${pp_solaris_arch_std}" +} + +pp_backend_solaris_vas_platforms () { + case `pp_backend_solaris_probe` in + sol10-sparc* | sol9-sparc* | sol8-sparc*) + echo solaris8-sparc solaris7-sparc solaris26-sparc;; + sol7-sparc*) echo solaris7-sparc solaris26-sparc;; + sol26-sparc*) echo solaris26-sparc;; + sol8-*86) echo solaris8-x86;; + sol10-*86 | sol10-x86_64) + echo solaris10-x64 solaris8-x86;; + *) pp_die "unknown system `pp_backend_solaris_probe`";; + esac +} +pp_backend_solaris_function() { + case "$1" in + pp_mkgroup) cat<<'.';; + /usr/sbin/groupmod "$1" 2>/dev/null && return 0 + /usr/sbin/groupadd "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat<<'.';; + id "$1" >/dev/null 2>/dev/null && return 0 + pp_mkgroup "${2:-$1}" || return 1 + /usr/sbin/useradd \ + -g "${2:-$1}" \ + -d "${3:-/nonexistent}" \ + -s "${4:-/bin/false}" \ + "$1" +. + *) false;; + esac +} + +pp_backend_solaris_init_svc_vars () { + _smf_category=${pp_solaris_smf_category:-application} + _smf_method_envvar_name=${smf_method_envvar_name:-"PP_SMF_SERVICE"} + pp_solaris_service_shell=/sbin/sh +} + +pp_solaris_init_svc () { + smf_version=1 + smf_type=service + solaris_user= + solaris_stop_signal= + solaris_sysv_init_start=S70 # invocation order for start scripts + solaris_sysv_init_kill=K30 # invocation order for kill scripts + solaris_sysv_init_start_states="2" # states to install start link + solaris_sysv_init_kill_states="S 0 1" # states to install kill link + + # + # To have the service be installed to start automatically, + # %service foo + # solaris_sysv_init_start_states="S 0 1 2" + # +} + +pp_solaris_smf () { + typeset f _pp_solaris_service_script svc _pp_solaris_manpage + + pp_solaris_name=${pp_solaris_name:-$name} + pp_solaris_manpath=${pp_solaris_manpath:-"/usr/share/man"} + pp_solaris_mansect=${pp_solaris_mansect:-1} + smf_start_timeout=${smf_start_timeout:-60} + smf_stop_timeout=${smf_stop_timeout:-60} + smf_restart_timeout=${smf_restart_timeout:-60} + + svc=${pp_solaris_smf_service_name:-$1} + _pp_solaris_service_script=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"} + _pp_solaris_manpage=${pp_solaris_manpage:-$svc} + + if [ -z $pp_svc_xml_file ]; then + pp_svc_xml_file="/var/svc/manifest/$_smf_category/$svc.xml" + echo "## Generating the smf service manifest file for $pp_svc_xml_file" + else + echo "## SMF service manifest file already defined at $pp_svc_xml_file" + if [ -z $pp_solaris_smf_service_name ] || [ -z $pp_solaris_smf_category ] || [ -z $pp_solaris_service_script ] || [ -z $smf_method_envvar_name ]; then + pp_error "All required variables are not set.\n"\ + "When using a custom manifest file all of the following variables must be set:\n"\ + "pp_solaris_smf_service_name, pp_solaris_smf_category, pp_solaris_service_script and smf_method_envvar_name.\n\n"\ + "Example:\n"\ + " \$pp_solaris_smf_category=application\n"\ + " \$pp_solaris_smf_service_name=pp\n\n"\ + " \n\n"\ + "Example:\n"\ + " \$pp_solaris_service_script=/etc/init.d/pp\n\n"\ + " \n\n"\ + "Example:\n"\ + " \$smf_method_envvar_name=PP_SMF_SERVICE\n\n"\ + " \n"\ + " \n"\ + " \n" + + return 1 + fi + return 0 + fi + + f=$pp_svc_xml_file + pp_add_file_if_missing $f || + return 0 + pp_solaris_add_parent_dirs "$f" + + _pp_solaris_smf_dependencies=" + + + + + + + +" + _pp_solaris_smf_dependencies=${pp_solaris_smf_dependencies:-$_pp_solaris_smf_dependencies} + + cat <<-. >$pp_destdir$f + + + + + + + + + + + + $_pp_solaris_smf_dependencies + + $pp_solaris_smf_additional_dependencies + + + + + + + + + + + + + + + $pp_solaris_smf_property_groups + + + + +. +} + +pp_solaris_make_service_group () { + typeset group out file svcs svc + + group="$1" + svcs="$2" + file="/etc/init.d/$group" + out="$pp_destdir$file" + + #-- return if the script is supplied already + pp_add_file_if_missing "$file" run 755 || return 0 + pp_solaris_add_parent_dirs "$file" + + echo "#! /sbin/sh" > $out + echo "# polypkg service group script for these services:" >> $out + echo "svcs=\"$svcs\"" >> $out + + cat <<'.' >>$out + + #-- starts services in order.. stops them all if any break + pp_start () { + undo= + for svc in $svcs; do + if /etc/init.d/$svc start; then + undo="$svc $undo" + else + if test -n "$undo"; then + for svc in $undo; do + /etc/init.d/$svc stop + done + return 1 + fi + fi + done + return 0 + } + + #-- stops services in reverse + pp_stop () { + reverse= + for svc in $svcs; do + reverse="$svc $reverse" + done + rc=0 + for svc in $reverse; do + /etc/init.d/$svc stop || rc=$? + done + return $rc + } + + #-- returns true only if all services return true status + pp_status () { + rc=0 + for svc in $svcs; do + /etc/init.d/$svc status || rc=$? + done + return $rc + } + + case "$1" in + start) pp_start;; + stop) pp_stop;; + status) pp_status;; + restart) pp_stop && pp_start;; + *) echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;; + esac +. +} + +pp_solaris_make_service () { + typeset file out svc + + svc="${pp_solaris_smf_service_name:-$1}" + file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"} + out="$pp_destdir$file" + + #-- return if we don't need to create the init script + pp_add_file_if_missing "$file" run 755 || + return 0 + pp_solaris_add_parent_dirs "$file" + + echo "#! /sbin/sh" >$out + echo "#-- This service init file generated by polypkg" >>$out + + #-- Start SMF integration. + if [ -n "$pp_svc_xml_file" ] ; then + cat <<_EOF >>$out +if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$$_smf_method_envvar_name" = "t" ] ; then + case "\$1" in + start) + echo "starting $svc" + /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1 + /usr/sbin/svcadm enable -s $_smf_category/$svc + RESULT=\$? + if [ "\$RESULT" -ne 0 ] ; then + echo "Error \$RESULT starting $svc" >&2 + fi + ;; + stop) + echo "stopping $svc" + /usr/sbin/svcadm disable -ts $_smf_category/$svc + RESULT=0 + ;; + restart) + echo "restarting $svc" + /usr/sbin/svcadm disable -ts $_smf_category/$svc + /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1 + /usr/sbin/svcadm enable -s $_smf_category/$svc + RESULT=\$? + if [ "\$RESULT" -ne 0 ] ; then + echo "Error \$RESULT starting $svc" >&2 + fi + ;; + *) + echo "Usage: $file {start|stop|restart|status}" >&2 + RESULT=1 + esac + exit $RESULT +fi +_EOF + fi + + #-- Construct a start command that builds a pid file as needed + # and forks the daemon. Services started by smf may not fork. + if test -z "$pidfile"; then + # The service does not define a pidfile, so we have to make + # our own up. On Solaris systems where there is no /var/run + # we must use /tmp to guarantee the pid files are removed after + # a system crash. + if test -z "$pp_piddir"; then + pp_piddir="/var/run" + fi + cat <<. >>$out + pp_isdaemon=0 + pp_piddirs="${pp_piddir}${pp_piddir+ }/var/run /tmp" + for pp_piddir in \$pp_piddirs; do + test -d "\$pp_piddir/." && break + done + pidfile="\$pp_piddir/$svc.pid" +. + else + # The service is able to write its own PID file + cat <<. >>$out + pp_isdaemon=1 + pidfile="$pidfile" +. + fi + + pp_su= + if test "${user:-root}" != "root"; then + pp_su="su $user -c exec " + fi + + cat <<. >>$out + stop_signal="${stop_signal:-TERM}" + svc="${svc}" + + # generated command to run $svc as a service + pp_exec () { + if [ \$pp_isdaemon -ne 1 ]; then + if [ "t\$PP_SMF_SERVICE" = "t" ]; then + ${pp_su}$cmd & + echo \$! > \$pidfile + else + echo "via exec." + echo \$$ > \$pidfile + exec ${pp_su}$cmd + return 1 + fi + else + ${pp_su}$cmd + fi + } +. + + #-- write the invariant section of the init script + cat <<'.' >>$out + + # returns true if $svc is running + pp_running () { + if test -s "$pidfile"; then + read pid < "$pidfile" 2>/dev/null + if test ${pid:-0} -gt 1 && kill -0 "$pid" 2>/dev/null; then + # make sure command name matches up to the first 8 chars + c="`echo $cmd | sed -e 's: .*::' -e 's:^.*/::' -e 's/^\(........\).*$/\1/'`" + pid="`ps -p $pid 2>/dev/null | sed -n \"s/^ *\($pid\) .*$c *$/\1/p\"`" + if test -n "$pid"; then + return 0 + fi + fi + fi + return 1 + } + + # prints a message describing $svc's running state + pp_status () { + if pp_running; then + echo "service $svc is running (pid $pid)" + return 0 + elif test -f "$pidfile"; then + echo "service $svc is not running, but pid file exists" + return 2 + else + echo "service $svc is not running" + return 1 + fi + } + + # starts $svc + pp_start () { + if pp_running; then + echo "service $svc already running" >&2 + return 0 + fi + echo "starting $svc... \c" + if pp_exec; then + echo "done." + else + echo "ERROR." + exit 1 + fi + } + + # stops $svc + pp_stop () { + if pp_running; then + echo "stopping $svc... \c" + if kill -$stop_signal $pid; then + rm -f "$pidfile" + echo "done." + else + echo "ERROR." + return 1 + fi + else + echo "service $svc already stopped" >&2 + return 0 + fi + } + + umask 022 + case "$1" in + start) pp_start;; + stop) pp_stop;; + status) pp_status;; + restart) pp_stop && pp_start;; + *) echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;; + esac +. +} + +pp_solaris_remove_service () { + typeset file svc + + svc="${pp_solaris_smf_service_name:-$1}" + file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"} + + echo ' +if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then + if [ -x /usr/sbin/svcadm ] ; then + /usr/sbin/svcadm disable -s '$svc' 2>/dev/null + case "`uname -r`-$pp_svc_xml_file" in + 5.1[1-9]*-/var/svc/manifest/*|5.[2-9]*-/var/svc/manifest/*) + # Use manifest-import if > 5.10 and manifest in default location + /usr/sbin/svcadm restart manifest-import 2>/dev/null + ;; + *) + /usr/sbin/svccfg delete '$svc' 2>/dev/null + ;; + esac + else + '$file' stop >/dev/null 2>/dev/null + fi +fi + ' +} + +pp_solaris_install_service () { + typeset s k l file svc + + svc="${pp_solaris_smf_service_name:-$1}" + file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"} + + s="${solaris_sysv_init_start}$svc" + k="${solaris_sysv_init_kill}$svc" + + echo ' +if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then + if [ -x ${PKG_INSTALL_ROOT}/usr/sbin/svcadm ]; then + case "`uname -r`-$pp_svc_xml_file" in + 5.1[1-9]*-/var/svc/manifest/*|5.[2-9]*-/var/svc/manifest/*) + # Use manifest-import if > 5.10 and manifest in default location + echo "/usr/sbin/svcadm restart manifest-import 2>/dev/null" >> ${PKG_INSTALL_ROOT}/var/svc/profile/upgrade + ;; + *) + echo "/usr/sbin/svccfg import '$pp_svc_xml_file' 2>/dev/null" >> ${PKG_INSTALL_ROOT}/var/svc/profile/upgrade + ;; + esac + else' + test -n "${solaris_sysv_init_start_states}" && + for state in ${solaris_sysv_init_start_states}; do + l="/etc/rc$state.d/$s" + echo "echo '$l'" + echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s" + pp_solaris_space /etc/rc$state.d 0 1 + done + test -n "${solaris_sysv_init_kill_states}" && + for state in ${solaris_sysv_init_kill_states}; do + l="/etc/rc$state.d/$k" + echo "echo '$l'" + echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s" + pp_solaris_space /etc/rc$state.d 0 1 + done + echo ' + fi +else + if [ -x /usr/sbin/svcadm ]; then + echo "Registering '$svc' with SMF" + /usr/sbin/svcadm disable -s '$svc' 2>/dev/null + case "`uname -r`-$pp_svc_xml_file" in + 5.1[1-9]*-/var/svc/manifest/*|5.[2-9]*-/var/svc/manifest/*) + # Use manifest-import if > 5.10 and manifest in default location + /usr/sbin/svcadm restart manifest-import + # Wait for import to complete, otherwise it will not know + # about our service until after we try to start it + echo Waiting for manifest-import... + typeset waited + waited=0 + while [ $waited -lt 15 ] && ! /usr/bin/svcs -l '$svc' >/dev/null 2>&1; do + sleep 1 + waited=`expr $waited + 1` + done + if /usr/bin/svcs -l '$svc' >/dev/null 2>&1; then + echo OK + else + echo manifest-import took to long, you might have to control '$svc' manually. + fi + ;; + *) + /usr/sbin/svccfg delete '$svc' 2>/dev/null + /usr/sbin/svccfg import '$pp_svc_xml_file' + ;; + esac + else' + test -n "${solaris_sysv_init_start_states}" && + for state in ${solaris_sysv_init_start_states}; do + l="/etc/rc$state.d/$s" + echo "echo '$l'" + echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s" + pp_solaris_space /etc/rc$state.d 0 1 + done + test -n "${solaris_sysv_init_kill_states}" && + for state in ${solaris_sysv_init_kill_states}; do + l="/etc/rc$state.d/$k" + echo "echo '$l'" + echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s" + pp_solaris_space /etc/rc$state.d 0 1 + done + echo ' + fi +fi' +} + +pp_solaris_add_parent_dirs () { + typeset dir + + dir=${1%/*} + while test -n "$dir"; do + if awk "\$6 == \"$dir/\" {exit 1}" < $pp_wrkdir/%files.run; then + echo "d - - - - $dir/" >> $pp_wrkdir/%files.run + fi + dir=${dir%/*} + done +} + +pp_platforms="$pp_platforms deb" + +pp_backend_deb_detect () { + test -f /etc/debian_version +} + +pp_deb_cmp_full_name () { + local prefix + prefix="${pp_deb_name:-$name}" + case "$1" in + run) echo "${prefix}" ;; + dbg) echo "${prefix}-${pp_deb_dbg_pkgname}";; + dev) echo "${prefix}-${pp_deb_dev_pkgname}";; + doc) echo "${prefix}-${pp_deb_doc_pkgname}";; + *) pp_error "unknown component '$1'"; + esac +} + +pp_backend_deb_init () { + pp_deb_dpkg_version="2.0" + pp_deb_name= + pp_deb_version= + pp_deb_release= + pp_deb_arch= + pp_deb_arch_std= + pp_deb_maintainer="One Identity LLC " + pp_deb_copyright= + pp_deb_distro= + pp_deb_control_description= + pp_deb_summary= + pp_deb_description= + pp_deb_dbg_pkgname="dbg" + pp_deb_dev_pkgname="dev" + pp_deb_doc_pkgname="doc" + pp_deb_section=contrib # Free software that depends on non-free software + + # Detect the host architecture + pp_deb_detect_arch + + # Make sure any programs we require are installed + pp_deb_check_required_programs +} + +pp_deb_check_required_programs () { + local p needed notfound ok + needed= notfound= + for prog in dpkg dpkg-deb install md5sum fakeroot + do + if which $prog 2>/dev/null >/dev/null; then + pp_debug "$prog: found" + else + pp_debug "$prog: not found" + case "$prog" in + dpkg|dpkg-deb) p=dpkg;; + install|md5sum) p=coreutils;; + fakeroot) p=fakeroot;; + *) pp_die "unexpected dpkg tool $prog";; + esac + notfound="$notfound $prog" + pp_contains "$needed" "$p" || needed="$needed $p" + fi + done + if [ -n "$notfound" ]; then + pp_error "cannot find these programs: $notfound" + pp_error "please install these packages: $needed" + fi +} + +pp_deb_munge_description () { + # Insert a leading space on each line, replace blank lines with a + #space followed by a full-stop. + pp_deb_control_description="`echo ${pp_deb_description:-$description} | \ + sed 's,^\(.*\)$, \1, ' | sed 's,^[ \t]*$, .,g' | fmt -w 80`" +} + +pp_deb_detect_arch () { + pp_deb_arch=`dpkg-architecture -qDEB_HOST_ARCH` + pp_deb_arch_std=`uname -m` +} + +pp_deb_sanitize_version() { + echo "$@" | tr -d -c '[:alnum:].+-:~' +} + +pp_deb_version_final() { + if test -n "$pp_deb_version"; then + # Don't sanitize; assume the user is sane (hah!) + echo "$pp_deb_version" + else + pp_deb_sanitize_version "$version" + fi +} + +pp_deb_conflict () { + local _name _vers _conflicts + + _conflicts="Conflicts:" + while read _name _vers; do + case "$_name" in ""| "#"*) continue ;; esac + _conflicts="$_conflicts $_name" + test -n "$_vers" && _conflicts="$_conflicts $_name (>= $vers)" + _conflicts="${_conflicts}," + done + echo "${_conflicts%,}" +} + +pp_deb_make_control() { + local cmp="$1" + local installed_size + + # compute the installed size + installed_size=`pp_deb_files_size < $pp_wrkdir/%files.$cmp` + + package_name=`pp_deb_cmp_full_name "$cmp"` + cat <<-. + Package: ${package_name} + Version: `pp_deb_version_final`-${pp_deb_release:-1} + Section: ${pp_deb_section:-contrib} + Priority: optional + Architecture: ${pp_deb_arch} + Maintainer: ${pp_deb_maintainer:-$maintainer} + Description: ${pp_deb_summary:-$summary} + ${pp_deb_control_description} + Installed-Size: ${installed_size} +. + if test -s $pp_wrkdir/%depend."$cmp"; then + sed -ne '/^[ ]*$/!s/^[ ]*/Depends: /p' \ + < $pp_wrkdir/%depend."$cmp" + fi + if test -s $pp_wrkdir/%conflict."$cmp"; then + pp_deb_conflict < $pp_wrkdir/%conflict."$cmp" + fi +} + +pp_deb_make_md5sums() { + local cmp="$1"; shift + local pkg_dir + + pkg_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp` + (cd $pkg_dir && md5sum "$@") > $pkg_dir/DEBIAN/md5sums || + pp_error "cannot make md5sums" +} + +pp_deb_make_package_maintainer_script() { + local output="$1" + local source="$2" + local desc="$3" + + # See if we need to create this script at all + if [ -s "$source" ] + then + + # Create header + cat <<-. >$output || pp_error "Cannot create $output" + #!/bin/sh + # $desc + # Generated by PolyPackage $pp_version + +. + + cat $source >> "$output" || pp_error "Cannot append to $output" + + # Set perms + chmod 755 "$output" || pp_error "Cannot chmod $output" + fi +} + +pp_deb_handle_services() { + local svc + + #-- add service start/stop code + if test -n "$pp_services"; then + #-- record the uninstall commands in reverse order + for svc in $pp_services; do + pp_load_service_vars $svc + + # Create init script (unless one exists) + pp_deb_service_make_init_script $svc + + #-- append %post code to install the svc + test x"yes" = x"$enable" && + cat<<-. >> $pp_wrkdir/%post.run + case "\$1" in + configure) + # Install the service links + update-rc.d $svc defaults + ;; + esac +. + + #-- prepend %preun code to stop svc + cat<<-. | pp_prepend $pp_wrkdir/%preun.run + case "\$1" in + remove|deconfigure|upgrade) + # Stop the $svc service + invoke-rc.d $svc stop + ;; + esac +. + + #-- prepend %postun code to remove service + cat<<-. | pp_prepend $pp_wrkdir/%postun.run + case "\$1" in + purge) + # Remove the service links + update-rc.d $svc remove + ;; + esac +. + done + #pp_deb_service_remove_common | pp_prepend $pp_wrkdir/%preun.run + fi + +} +pp_deb_fakeroot () { + if test -s $pp_wrkdir/fakeroot.save; then + fakeroot -i $pp_wrkdir/fakeroot.save -s $pp_wrkdir/fakeroot.save "$@" + else + fakeroot -s $pp_wrkdir/fakeroot.save "$@" + fi +} + +pp_deb_files_size () { + local t m o g f p st + while read t m o g f p st; do + case $t in + f|s) du -k "${pp_destdir}$p";; + d) echo 4;; + esac + done | awk '{n+=$1} END {print n}' +} + +pp_deb_make_DEBIAN() { + local cmp="${1:-run}" + local data cmp_full_name + local old_umask + + old_umask=`umask` + umask 0022 + cmp_full_name=`pp_deb_cmp_full_name $cmp` + data=$pp_wrkdir/$cmp_full_name + + # Create DEBIAN dir $data/DEBIAN + mkdir -p $data/DEBIAN + + # Create control file + pp_deb_make_control $cmp > $data/DEBIAN/control + + # Copy in conffiles + if test -f $pp_wrkdir/%conffiles.$cmp; then + cp $pp_wrkdir/%conffiles.$cmp $data/DEBIAN/conffiles + fi + + # Create preinst + pp_deb_make_package_maintainer_script "$data/DEBIAN/preinst" \ + "$pp_wrkdir/%pre.$cmp" "Pre-install script for $cmp_full_name"\ + || exit $? + + # Create postinst + pp_deb_make_package_maintainer_script "$data/DEBIAN/postinst" \ + "$pp_wrkdir/%post.$cmp" "Post-install script for $cmp_full_name"\ + || exit $? + + # Create prerm + pp_deb_make_package_maintainer_script "$data/DEBIAN/prerm" \ + "$pp_wrkdir/%preun.$cmp" "Pre-uninstall script for $cmp_full_name"\ + || exit $? + + # Create postrm + pp_deb_make_package_maintainer_script "$data/DEBIAN/postrm" \ + "$pp_wrkdir/%postun.$cmp" "Post-uninstall script for $cmp_full_name"\ + || exit $? + + umask $old_umask +} + +pp_deb_make_data() { + local _l t m o g f p st data + local data share_doc owner group + cmp=$1 + data=$pp_wrkdir/`pp_deb_cmp_full_name $cmp` + cat $pp_wrkdir/%files.${cmp} | while read t m o g f p st; do + if test x"$m" = x"-"; then + case "$t" in + d) m=755;; + f) m=644;; + esac + fi + test x"$o" = x"-" && o=root + test x"$g" = x"-" && g=root + case "$t" in + f) # Files + pp_deb_fakeroot install -D -o $o -g $g -m ${m} $pp_destdir/$p $data/$p; + if [ x"$f" = x"v" ] + then + # File marked as "volatile". Assume this means it's a conffile + # TODO: check this as admins like modified conffiles to be left + # behind + echo "$p" >> $pp_wrkdir/%conffiles.$cmp + fi;; + + d) # Directories + pp_deb_fakeroot install -m ${m} -o $o -g $g -d $data/$p;; + + s) # Symlinks + # Remove leading / from vars + rel_p=`echo $p | sed s,^/,,` + rel_st=`echo $st | sed s,^/,,` + # TODO: we are always doing absolute links here. We should follow + # the debian policy of relative links when in the same top-level + # directory + (cd $data; ln -sf $st $rel_p);; + *) pp_error "Unsupported data file type: $t";; + esac + done + + # If no copyright file is present add one. This is a debian requirement. + share_doc="/usr/share/doc/`pp_deb_cmp_full_name $cmp`" + if [ ! -f "$data/$share_doc/copyright" ] + then + echo "${pp_deb_copyright:-$copyright}" > "$pp_wrkdir/copyright" + install -D -m 644 "$pp_wrkdir/copyright" "$data/$share_doc/copyright" + fi + +} + +pp_deb_makedeb () { + local cmp + local package_build_dir + + cmp="$1" + + package_build_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp` + + # Create package dir + mkdir -p $package_build_dir + + # Copy in data + pp_deb_make_data $cmp || + pp_die "Could not make DEBIAN data files for $cmp" + + # Make control files + # must be done after copying data so conffiles are found + pp_deb_make_DEBIAN $cmp || + pp_die "Could not make DEBIAN control files for $cmp" + + # Create md5sums + pp_deb_make_md5sums $cmp `(cd $package_build_dir; + find . -name DEBIAN -prune -o -type f -print | sed "s,^\./,,")` || + pp_die "Could not make DEBIAN md5sums for $cmp" +} + +pp_backend_deb () { + local debname + + # Munge description for control file inclusion + pp_deb_munge_description + + # Handle services + pp_deb_handle_services $cmp + + for cmp in $pp_components + do + debname=`pp_deb_name $cmp` + pp_deb_makedeb $cmp + done + + . $pp_wrkdir/%fixup + + for cmp in $pp_components + do + debname=`pp_deb_name $cmp` + # Create debian package + pp_debug "Building `pp_deb_cmp_full_name $cmp` -> $output" + pp_deb_fakeroot dpkg-deb \ + --build $pp_wrkdir/`pp_deb_cmp_full_name $cmp` \ + $pp_wrkdir/$debname || + pp_error "failed to create $cmp package" + done +} + +pp_backend_deb_cleanup () { + # rm -rf $pp_wrkdir + : +} + +pp_deb_name () { + local cmp="${1:-run}" + echo `pp_deb_cmp_full_name $cmp`"_"`pp_deb_version_final`"-${pp_deb_release:-1}_${pp_deb_arch}.deb" +} +pp_backend_deb_names () { + for cmp in $pp_components + do + pp_deb_name $cmp + done +} + +pp_backend_deb_install_script () { + local cmp _cmp_full_name + + echo "#!/bin/sh" + pp_install_script_common + + cat <<. + + cmp_to_pkgname () { + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo "$cmp) echo '`pp_deb_cmp_full_name $cmp`';;" + done + cat <<. + *) usage;; + esac + done + } + + + cmp_to_pathname () { + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo "$cmp) echo \${PP_PKGDESTDIR:-.}/'`pp_deb_name $cmp`';;" + done + cat <<. + *) usage;; + esac + done + } + + test \$# -eq 0 && usage + op="\$1"; shift + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo $pp_components + ;; + list-services) + test \$# -eq 0 || usage \$op + echo $pp_services + ;; + list-files) + test \$# -ge 1 || usage \$op + cmp_to_pathname "\$@" + ;; + install) + test \$# -ge 1 || usage \$op + dpkg --install \`cmp_to_pathname "\$@"\` + ;; + uninstall) + test \$# -ge 1 || usage \$op + dpkg --remove \`cmp_to_pkgname "\$@"\`; : + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + /etc/init.d/\$svc \$op || ec=1 + done + exit \$ec + ;; + print-platform) + test \$# -eq 0 || usage \$op + echo "linux-${pp_deb_arch}" + ;; + *) + usage + ;; + esac +. +} + +pp_backend_deb_probe() { + local arch distro release + + pp_deb_detect_arch + + # /etc/debian_version exists on Debian & Ubuntu, so it's no use + # to us. Use lsb_release instead. + + case `(lsb_release -is || echo no-lsb) 2>/dev/null` in + Debian) + distro=deb + ;; + Ubuntu) + distro=ubu + ;; + no-lsb) + echo unknown-$pp_deb_arch_std + return 0 + ;; + *) + distro=unknown + ;; + esac + + release=`lsb_release -rs` + + # If release is not numeric, use the codename + case $release in + *[!.0-9r]*) + release=`lsb_release -cs` + case $release in + buzz) + release="11" + ;; + rex) + release="12" + ;; + bo) + release="13" + ;; + hamm) + release="20" + ;; + slink) + release="21" + ;; + potato) + release="22" + ;; + woody) + release="30" + ;; + sarge) + release="31" + ;; + etch) + release="40" + ;; + lenny) + release="50" + ;; + squeeze) + release="60" + ;; + wheezy) + release="70" + ;; + jessie) + release="80" + ;; + stretch) + release="90" + ;; + esac + ;; + *) + # Remove trailing revision number and any dots + release=`echo $release | cut -dr -f1 | tr -d .` + ;; + esac + + echo $distro$release-$pp_deb_arch_std +} + +pp_backend_deb_vas_platforms () { + case "$pp_deb_arch_std" in + x86_64) echo "linux-x86_64.deb";; # DO NOT add linux-x86.deb here!! + *86) echo "linux-x86.deb";; + *) pp_die "unknown architecture ${pp_deb_arch_std}";; + esac +} +pp_backend_deb_init_svc_vars () { + + reload_signal= + start_runlevels=${pp_deb_default_start_runlevels-"2 3 4 5"} # == lsb default-start + stop_runlevels=${pp_deb_default_stop_runlevels-"0 1 6"} # == lsb default-stop + svc_description="${pp_deb_default_svc_description}" # == lsb short descr + svc_process= + + lsb_required_start='$local_fs $network' + lsb_should_start= + lsb_required_stop='$local_fs' + lsb_description= + + start_priority=50 + stop_priority=50 #-- stop_priority = 100 - start_priority +} + +pp_deb_service_make_init_script () { + local svc=$1 + local script=/etc/init.d/$svc + local out=$pp_destdir$script + local _process _cmd + + pp_add_file_if_missing $script run 755 v || return 0 + + #-- start out as an empty shell script + cat <<-'.' >$out + #!/bin/sh +. + + #-- determine the process name from $cmd unless $svc_process is given + set -- $cmd + #_process=${svc_process:-"$1"} --? WTF + + #-- construct a start command that builds a pid file if needed + #-- the command name in /proc/[pid]/stat is limited to 15 characters + _cmd="$cmd"; + _cmd_path=`echo $cmd | cut -d" " -f1` + _cmd_name=`basename $_cmd_path | cut -c1-15` + _cmd_args=`echo $cmd | cut -d" " -f2-` + test x"$_cmd_path" != x"$_cmd_args" || _cmd_args= + + #-- generate the LSB init info + cat <<-. >>$out + ### BEGIN INIT INFO + # Provides: ${svc} + # Required-Start: ${lsb_required_start} + # Should-Start: ${lsb_should_start} + # Required-Stop: ${lsb_required_stop} + # Default-Start: ${start_runlevels} + # Default-Stop: ${stop_runlevels} + # Short-Description: ${svc_description:-no description} + ### END INIT INFO + # Generated by PolyPackage ${pp_version} + # ${copyright} + +. + + if test x"${svc_description}" = x"${pp_deb_default_svc_description}"; then + svc_description= + fi + + #-- write service-specific definitions + cat <<. >>$out +NAME="${_cmd_name}" +DESC="${svc_description:-$svc service}" +USER="${user}" +GROUP="${group}" +PIDFILE="${pidfile}" +STOP_SIGNAL="${stop_signal}" +RELOAD_SIGNAL="${reload_signal}" +CMD="${_cmd}" +DAEMON="${_cmd_path}" +DAEMON_ARGS="${_cmd_args}" +SCRIPTNAME=${script} +. + + #-- write the generic part of the init script + cat <<'.' >>$out + +[ -x "$DAEMON" ] || exit 0 + +[ -r /etc/default/$NAME ] && . /etc/default/$NAME + +[ -f /etc/default/rcS ] && . /etc/default/rcS + +. /lib/lsb/init-functions + +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + if [ -n "$PIDFILE" ] + then + pidfile_opt="--pidfile $PIDFILE" + else + pidfile_opt="--make-pidfile --background --pidfile /var/run/$NAME.pid" + fi + if [ -n "$USER" ] + then + user_opt="--user $USER" + fi + if [ -n "$GROUP" ] + then + group_opt="--group $GROUP" + fi + + start-stop-daemon --start --quiet $pidfile_opt $user_opt --exec $DAEMON --test > /dev/null \ + || return 1 + + # Note: there seems to be no way to tell whether the daemon will fork itself or not, so pass + # --background for now + start-stop-daemon --start --quiet $pidfile_opt $user_opt --exec $DAEMON -- \ + $DAEMON_ARGS \ + || return 2 +} + +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + if [ -n "$PIDFILE" ] + then + pidfile_opt="--pidfile $PIDFILE" + else + pidfile_opt="--pidfile /var/run/$NAME.pid" + fi + if [ -n "$USER" ] + then + user_opt="--user $USER" + fi + if [ -n $STOP_SIGNAL ] + then + signal_opt="--signal $STOP_SIGNAL" + fi + start-stop-daemon --stop --quiet $signal_opt --retry=TERM/30/KILL/5 $pidfile_opt --name $NAME + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + # Wait for children to finish too if this is a daemon that forks + # and if the daemon is only ever run from this initscript. + # If the above conditions are not satisfied then add some other code + # that waits for the process to drop all resources that could be + # needed by services started subsequently. A last resort is to + # sleep for some time. + start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON + [ "$?" = 2 ] && return 2 + # Many daemons don't delete their pidfiles when they exit. + test -z $PIDFILE || rm -f $PIDFILE + return "$RETVAL" +} + +do_reload() { + # + # If the daemon can reload its configuration without + # restarting (for example, when it is sent a SIGHUP), + # then implement that here. + # + if [ -n "$PIDFILE" ] + then + pidfile_opt="--pidfile $PIDFILE" + else + pidfile_opt="--pidfile /var/run/$NAME.pid" + fi + if [ -n "$RELOAD_SIGNAL" ] + then + start-stop-daemon --stop --signal $RELOAD_SIGNAL --quiet $pidfile_opt --name $NAME + fi + return 0 +} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + reload|force-reload) + if [ -n "$RELOAD_SIGNAL" ] + then + log_daemon_msg "Reloading $DESC" "$NAME" + do_reload + log_end_msg $? + else + # Do a restart instead + "$0" restart + fi + ;; + restart) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: +. + chmod 755 $out +} +pp_backend_deb_function() { + case "$1" in + pp_mkgroup) cat<<'.';; + /usr/sbin/groupmod "$1" 2>/dev/null && return 0 + /usr/sbin/groupadd "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat<<'.';; + pp_tmp_system= + id -u "$1" >/dev/null 2>/dev/null && return 0 + # deb 3.1's useradd changed API in 4.0. Gah! + /usr/sbin/useradd --help 2>&1 | /bin/grep -q .--system && + pp_tmp_system=--system + pp_mkgroup "${2:-$1}" || return 1 + /usr/sbin/useradd \ + -g "${2:-$1}" \ + -d "${3:-/nonexistent}" \ + -s "${4:-/bin/false}" \ + $pp_tmp_system \ + "$1" +. + pp_havelib) cat<<'.';; + for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do + test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0 + done + return 1 +. + *) false;; + esac +} + +pp_platforms="$pp_platforms kit" + +pp_backend_kit_detect () { + test x"$1" = x"OSF1" +} + +pp_backend_kit_init () { + pp_kit_name= + pp_kit_package= + pp_kit_desc= + pp_kit_version= + pp_kit_subset= + pp_readlink_fn=pp_ls_readlink + pp_kit_startlevels="2 3" + pp_kit_stoplevels="0 2 3" +} + +pp_backend_kit () { + typeset mi_file k_file svc outfile + typeset desc + + pp_backend_kit_names > /dev/null + + if test -z "$pp_kit_desc"; then + pp_kit_desc="$description" + fi + + mi_file="$pp_wrkdir/$pp_kit_subset.mi" + k_file="$pp_wrkdir/$pp_kit_subset.k" + scp_file="$pp_wrkdir/$pp_kit_subset.scp" + + desc="${pp_kit_desc:-$description}" + + cat <<-. >> $k_file + NAME='$name' + CODE=$pp_kit_name + VERS=$pp_kit_version + MI=$mi_file + COMPRESS=0 + %% + $pp_kit_subset . 0 '$desc' +. + + if test -n "$pp_services"; then + for svc in $pp_services; do + pp_kit_make_service $svc + pp_prepend $pp_wrkdir/%preun.run <<-. + /sbin/init.d/$svc stop +. + done + fi + + pp_backend_kit_make_mi "$mi_file" + pp_backend_kit_make_scp + #rm -rf $pp_wrkdir/kit_dest + mkdir -p $pp_wrkdir/kit_dest + pp_backend_kit_kits $k_file $pp_opt_destdir $pp_wrkdir/kit_dest + tar cvf $pp_wrkdir/$pp_kit_subset.tar -C $pp_wrkdir/kit_dest . + gzip -c $pp_wrkdir/$pp_kit_subset.tar > $pp_wrkdir/$pp_kit_subset.tar.gz + #rm -rf $pp_wrkdir/$pp_kit_subset.tar $pp_wrkdir/scps +} + +pp_backend_kit_make_mi () { + # XXX this information should go into the .inv files + typeset t m o g f p st line dm + while read t m o g f p st; do + case $t in + f|d) + echo "0 .$p $pp_kit_subset" + echo " chmod $m $p" >> $pp_wrkdir/%post.run + if [ x"$o" = x"-" ] ; then + echo " chown root $p" >> $pp_wrkdir/%post.run + else + echo " chown $o $p" >> $pp_wrkdir/%post.run + fi + if [ x"$g" = x"-" ] ; then + echo " chgrp 0 $p" >> $pp_wrkdir/%post.run + else + echo " chgrp $g $p" >> $pp_wrkdir/%post.run + fi + ;; + s) + echo " ln -s $st $p" >> $pp_wrkdir/%post.run + echo " rm -f $p" >> $pp_wrkdir/%preun.run + ;; + esac + done < $pp_wrkdir/%files.run | sort -k3 |uniq > $1 +} + + +pp_backend_kit_make_scp () { + scpdir="$pp_wrkdir/scps" + mkdir "$scpdir" && touch "$scpdir"/$pp_kit_subset.scp + cat <"$scpdir"/$pp_kit_subset.scp + + . /usr/share/lib/shell/libscp + + case "\$ACT" in + PRE_L) + STL_ScpInit + + + + ;; + POST_L) + STL_ScpInit + STL_LinkCreate +EOF + + cat $pp_wrkdir/%post.run >>"$scpdir"/$pp_kit_subset.scp + cat >>"$scpdir"/$pp_kit_subset.scp <>"$scpdir"/$pp_kit_subset.scp + cat >>"$scpdir"/$pp_kit_subset.scp </dev/null || + /usr/sbin/groupadd $1 +. + pp_mkuser) cat <<'.';; + eval user=\$$# + grep "^$user:" /etc/passwd >/dev/null || + /usr/sbin/useradd -s /usr/bin/false "$@" +. + pp_havelib) cat <<'.';; + for dir in `echo /usr/lib${3+:$3} | tr : ' '`; do + test -r "$dir/lib$1.${2-sl}" && return 0 + done + return 1 +. + *) pp_error "unknown function request: $1";; + esac +} + +pp_backend_kit_init_svc_vars () { + : +} + +pp_backend_kit_probe () { + echo tru64-`uname -r | sed 's/V\([0-9]*\)\.\([0-9]*\)/\1\2/'` +} + +pp_kit_service_group_script () { + typeset grp svcs scriptpath out + grp="$1" + svcs="$2" + scriptpath="/sbin/init.d/$grp" + out="$pp_destdir$scriptpath" + + pp_add_file_if_missing $scriptpath run 755 || return 0 + + cat <<-. > $out + #!/sbin/sh + # generated by pp $pp_version + svcs="$svcs" +. + +cat <<-'.' >> $out + #-- starts services in order.. stops them all if any break + pp_start () { + undo= + for svc in $svcs; do + /sbin/init.d/$svc start + case $? in + 0|4) + undo="$svc $undo" + ;; + *) + if test -n "$undo"; then + for svc in $undo; do + /sbin/init.d/$svc stop + done + return 1 + fi + ;; + esac + done + return 0 + } + + #-- stops services in reverse + pp_stop () { + reverse= + for svc in $svcs; do + reverse="$svc $reverse" + done + rc=0 + for svc in $reverse; do + /sbin/init.d/$svc stop || rc=$? + done + return $rc + } + + case "$1" in + start_msg) echo "Starting $svcs";; + stop_msg) echo "Stopping $svcs";; + start) pp_start;; + stop) pp_stop;; + *) echo "usage: $0 {start|stop|start_msg|stop_msg}" + exit 1;; + esac +. +} + +pp_kit_service_script () { + typeset svc scriptpath out + + svc="$1" + scriptpath="/sbin/init.d/$svc" + + pp_load_service_vars "$svc" + + test -n "$user" -a x"$user" != x"root" && + cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\"" + if test -z "$pidfile"; then + pidfile="/var/run/$svc.pid" + cmd="$cmd & echo \$! > \$pidfile" + fi + + pp_add_file_if_missing $scriptpath run 755 + + cat <<-. > $pp_destdir$scriptpath + svc="$svc" + pidfile="$pidfile" + + pp_start () { + $cmd + } +. + cat <<-'.' >>$pp_destdir$scriptpath + pp_stop () { + if test ! -s "$pidfile"; then + echo "Unable to stop $svc (no pid file)" + return 1 + else + read pid < "$pidfile" + if kill -0 "$pid" 2>/dev/null; then + if kill -${stop_signal:-TERM} "$pid"; then + rm -f "$pidfile" + return 0 + else + echo "Unable to stop $svc" + return 1 + fi + else + rm -f "$pidfile" + return 0 + fi + fi + } + + pp_running () { + if test ! -s "$pidfile"; then + return 1 + else + read pid < "$pidfile" + kill -0 "$pid" 2>/dev/null + fi + } + case "$1" in + start_msg) echo "Starting the $svc service";; + stop_msg) echo "Stopping the $svc service";; + start) + if pp_running; then + echo "$svc already running"; + exit 0 + elif pp_start; then + echo "$svc started"; + # rc(1M) says we should exit 4, but nobody expects it! + exit 0 + else + exit 1 + fi + ;; + stop) + if pp_stop; then + echo "$svc stopped"; + exit 0 + else + exit 1 + fi + ;; + *) echo "usage: $0 {start|stop|start_msg|stop_msg}" + exit 1 + ;; + esac +. +} + +pp_kit_make_service () { + typeset level priority startlevels stoplevels + typeset svc svcvar + + svc="$1" + svcvar=`pp_makevar $svc` + + #-- don't do anything if the script exists + if test -s "$pp_destdir/sbin/init.d/$svc"; then + pp_error "$pp_destdir/sbin/init.d/$svc exists" + return + fi + + # symlink the script, depending on the priorities chosen + eval priority='${pp_kit_priority_'$svcvar'}' + test -z "$priority" && priority="${pp_kit_priority:-50}" + + eval startlevels='${pp_kit_startlevels_'$svcvar'}' + test -z "$startlevels" && startlevels="$pp_kit_startlevels" + + eval stoplevels='${pp_kit_stoplevels_'$svcvar'}' + test -z "$stoplevels" && stoplevels="$pp_kit_stoplevels" + + # create the script and config file + pp_kit_service_script $svc + + # fix the priority up + case "$priority" in + ???) :;; + ??) priority=0$priority;; + ?) priority=00$priority;; + esac + + if test x"$stoplevels" = x"auto"; then + stoplevels= + test -z "$startlevels" || for level in $startlevels; do + stoplevels="$stoplevels `expr $level - 1`" + done + fi + + # create the symlinks + test -z "$startlevels" || for level in $startlevels; do + echo " ln -s /sbin/init.d/$svc /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%post.run + echo " rm /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%preun.run + done + test -z "$stoplevels" || for level in $stoplevels; do + echo " ln -s /sbin/init.d/$svc /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%post.run + echo " rm -f /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%preun.run + done +} + + + + +pp_backend_kit_sizes () { + awk ' + BEGIN { root = usr = var = 0; } + { + if (substr($9, 1, 1) != "l") + if (substr($10, 1, 6) == "./var/") + var += $2; + else if (substr($10, 1, 10) == "./usr/var/") + var += $2 + else if (substr($10, 1, 6) == "./usr/") + usr += $2 + else + root += $2 + } + END { printf "%d\t%d\t%d", root, usr, var } + ' "$@" +} + +pp_kit_kits_global () { + line=`sed -n '/^%%/q;/^'$2'=/{s/^'$2'=//p;q;}' <"$1"` + test -z "$line" && return 1 + eval "echo $line" + : +} + +pp_backend_kit_kits () { + typeset KITFILE FROMDIR TODIR + typeset SCPDIR + + SCPDIR="$pp_wrkdir/scps" + + PATH="/usr/lbin:/usr/bin:/etc:/usr/ucb:$PATH"; export PATH # XXX + #umask 2 # XXX + + test $# -ge 3 || pp_die "pp_backend_kit_kits: too few arguments" + KITFILE="$1"; shift + FROMDIR="$1"; shift + TODIR="$1"; shift + + test -f "$KITFILE" || pp_die "$KITFILE not found" + test -d "$FROMDIR" || pp_die "$FROMDIR not found" + test -d "$TODIR" || pp_die "$TODIR not found" + + INSTCTRL="$TODIR/instctrl" + mkdir -p "$INSTCTRL" || pp_die "cannot create instctrl directory" + chmod 775 "$INSTCTRL" + + grep "%%" $KITFILE > /dev/null || pp_die "no %% in $KITFILE" + + typeset NAME CODE VERS MI ROOT COMPRESS + typeset S_LIST ALLSUBS + + NAME=`pp_kit_kits_global "$KITFILE" NAME` || pp_die "no NAME in $KITFILE" + CODE=`pp_kit_kits_global "$KITFILE" CODE` || pp_die "no CODE in $KITFILE" + VERS=`pp_kit_kits_global "$KITFILE" VERS` || pp_die "no VERS in $KITFILE" + MI=`pp_kit_kits_global "$KITFILE" MI` || pp_die "no MI in $KITFILE" + ROOT=`pp_kit_kits_global "$KITFILE" ROOT` + COMPRESS=`pp_kit_kits_global "$KITFILE" COMPRESS` + + test -f "$MI" || pp_die "Inventory file $MI not found" + + case "$ROOT" in + *ROOT) + test -f "$TODIR/$ROOT" || + pp_die "Root image $ROOT not found in $TODIR" ;; + esac + + ALLSUBS=`awk 'insub==1 {print $1} /^%%/ {insub=1}' <"$KITFILE"` + test $# -eq 0 && set -- $ALLSUBS + + pp_debug "Creating $# $NAME subsets." + pp_debug "ALLSUBS=<$ALLSUBS>" + + if test x"$COMPRESS" = x"1"; then + COMPRESS=: + else + COMPRESS=false + fi + + #rm -f *.ctrl Volume* + + for SUB + do + test -z "$SUB" && pp_die "SUB is empty" + + typeset INV CTRL ROOTSIZE USRSIZE VARSIZE TSSUB + #rm -f Volume* + case $SUB in + .*) :;; + *) pp_verbose rm -f "$TODIR/$SUB"* "$INSTCTRL/$SUB"*;; + esac + + TSSUB="$pp_wrkdir/ts.$SUB" + + pp_debug "kits: Subset $SUB" + + INV="$SUB.inv" + CTRL="$SUB.ctrl" + pp_debug "kits: Generating media creation information..." + + # Invcutter takes as input + # SUB dir/path + # and generates stl_inv(4) files, like this + # f 0 00000 0 0 100644 2/11/09 010 f dir/path none SUB + grep " $SUB\$" "$MI" | + pp_verbose /usr/lbin/invcutter \ + -v "$VERS" -f "$FROMDIR" > "$INSTCTRL/$INV" || + pp_die "failed to create $INSTCTRL/$INV" + chmod 664 "$INSTCTRL/$INV" + + pp_backend_kit_sizes "$INSTCTRL/$INV" > "$pp_wrkdir/kit.sizes" + read ROOTSIZE USRSIZE VARSIZE < "$pp_wrkdir/kit.sizes" + + # Prefix each line with $FROMDIR. This will be stripped + awk '$1 != "d" {print from $10}' from="$FROMDIR/" \ + > "$TSSUB" < "$INSTCTRL/$INV" || + pp_die "failed" + + NVOLS=0 + + pp_debug "kits: Creating $SUB control file..." + + sed '1,/^%%/d;/^'"$SUB"'/{p;q;}' < "$KITFILE" > "$pp_wrkdir/kit.line" + read _SUB _IGNOR DEPS FLAGS DESC < "$pp_wrkdir/kit.line" + if test -z "$_SUB"; then + pp_warn "No such subset $SUB in $KITFILE" + continue + fi + DEPS=`echo $DEPS | tr '|' ' '` + case $FLAGS in + FLGEXP*) pp_verbose FLAGS='"${'"$FLAGS"'}"' ;; + esac + case $DESC in + *%*) DESC=`echo $DESC|awk -F% '{printf "%-36s%%%s\n", $1, $2}'`;; + esac + + cat > "$INSTCTRL/$CTRL" <<-. + NAME='$NAME $SUB' + DESC=$DESC + ROOTSIZE=$ROOTSIZE + USRSIZE=$USRSIZE + VARSIZE=$VARSIZE + NVOLS=1:$NVOLS + MTLOC=1:$TLOC + DEPS="$DEPS" + FLAGS=$FLAGS +. + chmod 664 "$INSTCTRL/$CTRL" + + pp_debug "kits: Making tar image" + + pp_verbose tar cfPR "$TODIR/$SUB" "$FROMDIR/" "$TSSUB" || + pp_error "problem creating kit file" + + if $COMPRESS; then + pp_debug "kits: Compressing" + (cd "$TODIR" && compress -f -v "$SUB") || + pp_die "problem compressing $TODIR/$SUB" + SPC=`expr $SUB : '\(...\).*'` # first three characters + SVC=`expr $SUB : '.*\(...\)'` # last three characters + : > "$INSTCTRL/$SPC$SVC.comp" + chmod 664 "$INSTCTRL/$SPC$SVC.comp" + pp_debug "kits: Padding compressed file to 10kB" # wtf? + rm -f "$TODIR/$SUB" + pp_verbose \ + dd if="$TODIR/$SUB.Z" of="$TODIR/$SUB" bs=10k conv=sync || + pp_die "problem moving compressed file" + rm -f "$TODIR/$SUB.Z" + fi + chmod 664 "$TODIR/$SUB" + + if test -f "$SCPDIR/$SUB.scp"; then + cp "$SCPDIR/$SUB.scp" "$INSTCTRL/$SUB.scp" + chmod 755 "$INSTCTRL/$SUB.scp" + else + pp_debug "kits: null subset control program for $SUB" + : > "$INSTCTRL/$SUB.scp" + chmod 744 "$INSTCTRL/$SUB.scp" + fi + + pp_debug "kits: Finished creating media image for $SUB" + done + + pp_debug "kits: Creating $CODE.image" + + case "$ROOT" in + *ROOT) ALLSUBS="$ROOT $ALLSUBS" + ;; + esac + + (cd "$TODIR" && sum $ALLSUBS) > "$INSTCTRL/$CODE.image" + chmod 664 "$INSTTRL/$CODE.image" + pp_debug "kits: Creating INSTCTRL" + (cd "$INSTCTRL" && tar cpvf - *) > "$TODIR/INSTCTRL" + chmod 664 "$TODIR/INSTCTRL" + cp "$INSTCTRL/$CODE.image" "$TODIR/$CODE.image" + chmod 664 "$TODIR/$CODE.image" + + pp_debug "kits: Media image production complete" +} + +pp_platforms="$pp_platforms rpm" + +pp_backend_rpm_detect () { + test x"$1" = x"Linux" -a ! -f /etc/debian_version +} + +pp_backend_rpm_init () { + + pp_rpm_version= + pp_rpm_summary= + pp_rpm_description= + pp_rpm_group="Applications/Internet" + pp_rpm_license="Unspecified" + pp_rpm_vendor= + pp_rpm_url= + pp_rpm_packager= + pp_rpm_provides= + pp_rpm_requires= + pp_rpm_requires_pre= + pp_rpm_requires_post= + pp_rpm_requires_preun= + pp_rpm_requires_postun= + pp_rpm_release= + pp_rpm_epoch= + pp_rpm_dev_group="Development/Libraries" + pp_rpm_dbg_group="Development/Tools" + pp_rpm_doc_group="Documentation" + pp_rpm_dev_description= + pp_rpm_dbg_description= + pp_rpm_doc_description= + pp_rpm_dev_requires= + pp_rpm_dev_requires_pre= + pp_rpm_dev_requires_post= + pp_rpm_dev_requires_preun= + pp_rpm_dev_requires_postun= + pp_rpm_dbg_requires= + pp_rpm_dbg_requires_pre= + pp_rpm_dbg_requires_post= + pp_rpm_dbg_requires_preun= + pp_rpm_dbg_requires_postun= + pp_rpm_doc_requires= + pp_rpm_doc_requires_pre= + pp_rpm_doc_requires_post= + pp_rpm_doc_requires_preun= + pp_rpm_doc_requires_postun= + pp_rpm_dev_provides= + pp_rpm_dbg_provides= + pp_rpm_doc_provides= + + pp_rpm_autoprov= + pp_rpm_autoreq= + pp_rpm_autoreqprov= + + pp_rpm_dbg_pkgname=debug + pp_rpm_dev_pkgname=devel + pp_rpm_doc_pkgname=doc + + pp_rpm_defattr_uid=root + pp_rpm_defattr_gid=root + + pp_rpm_detect_arch + pp_rpm_detect_distro + pp_rpm_rpmbuild=`pp_rpm_detect_rpmbuild` + + # SLES8 doesn't always come with readlink + test -x /usr/bin/readlink -o -x /bin/readlink || + pp_readlink_fn=pp_ls_readlink +} + +pp_rpm_detect_arch () { + pp_rpm_arch=auto + + #-- Find the default native architecture that RPM is configured to use + cat <<-. >$pp_wrkdir/dummy.spec + Name: dummy + Version: 1 + Release: 1 + Summary: dummy + Group: ${pp_rpm_group} + License: ${pp_rpm_license} + %description + dummy +. + $pp_opt_debug && cat $pp_wrkdir/dummy.spec + pp_rpm_arch_local=`rpm -q --qf '%{arch}\n' --specfile $pp_wrkdir/dummy.spec` + rm $pp_wrkdir/dummy.spec + + #-- Ask the kernel what machine architecture is in use + local arch + for arch in "`uname -m`" "`uname -p`"; do + case "$arch" in + i?86) + pp_rpm_arch_std=i386 + break + ;; + x86_64|ppc|ppc64|ppc64le|ia64|s390|s390x) + pp_rpm_arch_std="$arch" + break + ;; + powerpc) + # Probably AIX + case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in + PowerPC_POWER*) pp_rpm_arch_std=ppc64;; + *) pp_rpm_arch_std=ppc;; + esac + break + ;; + *) pp_rpm_arch_std=unknown + ;; + esac + done + + #-- Later on, when files are processed, we use 'file' to determine + # what platform ABIs are used. This is used when pp_rpm_arch == auto + pp_rpm_arch_seen= +} + +pp_rpm_detect_distro () { + pp_rpm_distro= + if test -f /etc/whitebox-release; then + pp_rpm_distro=`awk ' + /^White Box Enterprise Linux release/ { print "wbel" $6; exit; } + ' /etc/whitebox-release` + elif test -f /etc/mandrakelinux-release; then + pp_rpm_distro=`awk ' + /^Mandrakelinux release/ { print "mand" $3; exit; } + ' /etc/mandrake-release` + elif test -f /etc/mandrake-release; then + pp_rpm_distro=`awk ' + /^Linux Mandrake release/ { print "mand" $4; exit; } + /^Mandrake Linux release/ { print "mand" $4; exit; } + ' /etc/mandrake-release` + elif test -f /etc/fedora-release; then + pp_rpm_distro=`awk ' + /^Fedora Core release/ { print "fc" $4; exit; } + /^Fedora release/ { print "f" $3; exit; } + ' /etc/fedora-release` + elif test -f /etc/redhat-release; then + pp_rpm_distro=`awk ' + /^Red Hat Enterprise Linux/ { print "rhel" $7; exit; } + /^CentOS release/ { print "centos" $3; exit; } + /^CentOS Linux release/ { print "centos" $4; exit; } + /^Red Hat Linux release/ { print "rh" $5; exit; } + ' /etc/redhat-release` + elif test -f /etc/SuSE-release; then + pp_rpm_distro=`awk ' + /^SuSE Linux [0-9]/ { print "suse" $3; exit; } + /^SUSE LINUX [0-9]/ { print "suse" $3; exit; } + /^openSUSE [0-9]/ { print "suse" $2; exit; } + /^S[uU]SE Linux Enterprise Server [0-9]/ { print "sles" $5; exit; } + /^S[uU]SE LINUX Enterprise Server [0-9]/ { print "sles" $5; exit; } + /^SuSE SLES-[0-9]/ { print "sles" substr($2,6); exit; } + ' /etc/SuSE-release` + elif test -f /etc/os-release; then + pp_rpm_distro="`. /etc/os-release && echo \$ID\$VERSION`" + elif test -f /etc/pld-release; then + pp_rpm_distro=`awk ' + /^[^ ]* PLD Linux/ { print "pld" $1; exit; } + ' /etc/pld-release` + elif test X"`uname -s 2>/dev/null`" = X"AIX"; then + local r v + r=`uname -r` + v=`uname -v` + pp_rpm_distro="aix$v$r" + fi + pp_rpm_distro=`echo $pp_rpm_distro | tr -d .` + test -z "$pp_rpm_distro" && + pp_warn "unknown distro" +} + +pp_rpm_detect_rpmbuild () { + local cmd + for cmd in rpmbuild rpm; do + if `which $cmd > /dev/null 2>&1`; then + echo $cmd + return 0 + fi + done + + pp_error "Could not find rpmbuild" + # Default to `rpmbuild` in case it magically appears + echo rpmbuild + return 1 +} + +pp_rpm_label () { + local label arg + label="$1"; shift + for arg + do + test -z "$arg" || echo "$label: $arg" + done +} + +pp_rpm_writefiles () { + local _l t m o g f p st fo farch + while read t m o g f p st; do + _l="$p" + test $t = d && _l="%dir ${_l%/}/" + if test $t = s; then + # rpm warns if %attr contains a mode for symlinks + m=- + elif test x"$m" = x"-"; then + case "$t" in + d) m=755;; + f) m=644;; + esac + fi + test x"$o" = x"-" && o="${pp_rpm_defattr_uid:-root}" + test x"$g" = x"-" && g="${pp_rpm_defattr_gid:-root}" + _l="%attr($m,$o,$g) $_l" + + if test "$t" = "f" -a x"$pp_rpm_arch" = x"auto"; then + fo=`file "${pp_destdir}$p" 2>/dev/null` + #NB: The following should match executables and shared objects, + #relocatable objects. It will not match .a files however. + case "$fo" in + *": ELF 32-bit LSB "*", Intel 80386"*) + farch=i386;; + *": ELF 64-bit LSB "*", AMD x86-64"*|\ + *": ELF 64-bit LSB "*", x86-64"*) + farch=x86_64;; + *": ELF 32-bit MSB "*", PowerPC"*) + farch=ppc;; + *": ELF 64-bit LSB "*", 64-bit PowerPC"*) + farch=ppc64le;; + *": ELF 64-bit MSB "*", 64-bit PowerPC"*) + farch=ppc64;; + *": ELF 64-bit LSB "*", IA-64"*) + farch=ia64;; + *": ELF 32-bit MSB "*", IBM S/390"*) + farch=s390;; + *": ELF 64-bit MSB "*", IBM S/390"*) + farch=s390x;; + *"executable (RISC System/6000)"*) + farch=ppc;; + *"64-bit XCOFF executable"*) + farch=ppc64;; + *": ELF 64-bit LSB "*", ARM aarch64"*) + farch=aarch64;; + *" ELF "*) + farch=ELF;; + *) + farch=noarch;; + esac + # If file(1) doesn't provide enough info, try readelf(1) + if test "$farch" = "ELF"; then + fo=`readelf -h "${pp_destdir}$p" | awk '{if ($1 == "Class:") {class=$2} else if ($1 == "Machine:") {machine=$0; sub(/^ *Machine: */, "", machine)}} END {print class " " machine}' 2>/dev/null` + case "$fo" in + "ELF32 Intel 80386") + farch=i386;; + "ELF64 "*[xX]"86-64") + farch=x86_64;; + "ELF32 PowerPC") + farch=ppc;; + "ELF64 PowerPC"*) + farch=ppc64;; + "ELF64 IA-64") + farch=ia64;; + "ELF32 IBM S/390") + farch=s390;; + "ELF64 IBM S/390") + farch=s390x;; + "ELF64 AArch64") + farch=aarch64;; + *) + farch=noarch;; + esac + fi + pp_debug "file: $fo -> $farch" + test x"$farch" = x"noarch" || pp_add_to_list pp_rpm_arch_seen $farch + fi + + case $f in *v*) _l="%config(noreplace) $_l";; esac + echo "$_l" + done + echo +} + +pp_rpm_subname () { + case "$1" in + run) : ;; + dbg) echo "${2}${pp_rpm_dbg_pkgname}";; + dev) echo "${2}${pp_rpm_dev_pkgname}";; + doc) echo "${2}${pp_rpm_doc_pkgname}";; + *) pp_error "unknown component '$1'"; + esac +} + +pp_rpm_depend () { + local _name _vers + while read _name _vers; do + case "$_name" in ""| "#"*) continue ;; esac + echo "Requires: $_name ${_vers:+>= $_vers}" + done +} + +pp_rpm_conflict () { + local _name _vers + while read _name _vers; do + case "$_name" in ""| "#"*) continue ;; esac + echo "Conflicts: $_name ${_vers:+>= $_vers}" + done +} + +pp_rpm_override_requires () { + local orig_find_requires + + if test -z "$pp_rpm_depend_filter_cmd"; then + return 0 + fi + + orig_find_requires=`rpm --eval '%{__find_requires}'` + cat << EOF > "$pp_wrkdir/filtered-find-requires" +$orig_find_requires \$@ | $pp_rpm_depend_filter_cmd +EOF + chmod +x "$pp_wrkdir/filtered-find-requires" + echo "%define __find_requires $pp_wrkdir/filtered-find-requires" + # Might be necessary for old versions of RPM? Not for 4.4.2. + #echo "%define _use_internal_dependency_generator 0" +} + +pp_backend_rpm () { + local cmp specfile _summary _group _desc _pkg _subname svc _script + + specfile=$pp_wrkdir/$name.spec + : > $specfile + + #-- force existence of a 'run' component + pp_add_component run + : >> $pp_wrkdir/%files.run + + if test -z "$pp_rpm_arch"; then + pp_error "Unknown RPM architecture" + return 1 + fi + + #-- Write the header components of the RPM spec file + cat <<-. >>$specfile + Name: ${pp_rpm_name:-$name} + Version: ${pp_rpm_version:-$version} + Release: ${pp_rpm_release:-1} + Summary: ${pp_rpm_summary:-$summary} + Group: ${pp_rpm_group} + License: ${pp_rpm_license} +. + pp_rpm_label "URL" "$pp_rpm_url" >>$specfile + pp_rpm_label "Vendor" "${pp_rpm_vendor:-$vendor}" >>$specfile + pp_rpm_label "Packager" "$pp_rpm_packager" >>$specfile + pp_rpm_label "Provides" "$pp_rpm_provides" >>$specfile + pp_rpm_label "Requires(pre)" "$pp_rpm_requires_pre" >>$specfile + pp_rpm_label "Requires(post)" "$pp_rpm_requires_post" >>$specfile + pp_rpm_label "Requires(preun)" "$pp_rpm_requires_preun" >>$specfile + pp_rpm_label "Requires(postun)" "$pp_rpm_requires_postun" >>$specfile + pp_rpm_label "AutoProv" "$pp_rpm_autoprov" >>$specfile + pp_rpm_label "AutoReq" "$pp_rpm_autoreq" >>$specfile + pp_rpm_label "AutoReqProv" "$pp_rpm_autoreqprov" >>$specfile + + test -n "$pp_rpm_serial" && pp_warn "pp_rpm_serial deprecated" + if test -n "$pp_rpm_epoch"; then + #-- Epoch was introduced in RPM 2.5.6 + case `$pp_rpm_rpmbuild --version 2>/dev/null` in + 1.*|2.[0-5].*|2.5.[0-5]) + pp_rpm_label "Serial" $pp_rpm_epoch >>$specfile;; + *) + pp_rpm_label "Epoch" $pp_rpm_epoch >>$specfile;; + esac + fi + + if test -n "$pp_rpm_requires"; then + pp_rpm_label "Requires" "$pp_rpm_requires" >>$specfile + elif test -s $pp_wrkdir/%depend.run; then + pp_rpm_depend < $pp_wrkdir/%depend.run >> $specfile + fi + if test -s $pp_wrkdir/%conflict.run; then + pp_rpm_conflict < $pp_wrkdir/%conflict.run >> $specfile + fi + + pp_rpm_override_requires >> $specfile + + cat <<-. >>$specfile + + %description + ${pp_rpm_description:-$description} +. + + for cmp in $pp_components; do + case $cmp in + run) continue;; + dev) _summary="development tools for $pp_rpm_summary" + _group="$pp_rpm_dev_group" + _desc="${pp_rpm_dev_description:-Development libraries for $name. $pp_rpm_description.}" + ;; + doc) _summary="documentation for $pp_rpm_summary" + _group="$pp_rpm_doc_group" + _desc="${pp_rpm_doc_description:-Documentation for $name. $pp_rpm_description.}" + ;; + dbg) _summary="diagnostic tools for $pp_rpm_summary" + _group="$pp_rpm_dbg_group" + _desc="${pp_rpm_dbg_description:-Diagnostic tools for $name.}" + ;; + esac + + _subname=`pp_rpm_subname $cmp` + cat <<-. + + %package $_subname + Summary: $name $_summary + Group: $_group +. + for _script in pre post preun postun; do + eval '_pkg="$pp_rpm_'$cmp'_requires_'$_script'"' + if test -n "$_pkg"; then + eval pp_rpm_label "Requires($_script)" $_pkg + fi + done + eval '_pkg="$pp_rpm_'$cmp'_requires"' + if test -n "$_pkg"; then + eval pp_rpm_label Requires ${pp_rpm_name:-$name} $_pkg + elif test -s $pp_wrkdir/%depend.$cmp; then + pp_rpm_depend < $pp_wrkdir/%depend.$cmp >> $specfile + fi + if test -s $pp_wrkdir/%conflict.$cmp; then + pp_rpm_conflict < $pp_wrkdir/%conflict.$cmp >> $specfile + fi + + eval '_pkg="$pp_rpm_'$cmp'_provides"' + eval pp_rpm_label Provides $_pkg + + cat <<-. + + %description $_subname + $_desc +. + done >>$specfile + + #-- NB: we don't put any %prep, %build or %install RPM sections + # into the spec file. + + #-- add service start/stop code + if test -n "$pp_services"; then + pp_rpm_service_install_common >> $pp_wrkdir/%post.run + + #-- record the uninstall commands in reverse order + for svc in $pp_services; do + pp_load_service_vars $svc + + pp_rpm_service_make_init_script $svc + + #-- append %post code to install the svc + pp_rpm_service_install $svc >> $pp_wrkdir/%post.run + + #-- prepend %preun code to uninstall svc + # (use files in case vars are modified) + pp_rpm_service_remove $svc | pp_prepend $pp_wrkdir/%preun.run + done + pp_rpm_service_remove_common | pp_prepend $pp_wrkdir/%preun.run + fi + + # make convenience service groups + if test -n "$pp_service_groups"; then + for grp in $pp_service_groups; do + pp_rpm_service_group_make_init_script \ + $grp "`pp_service_get_svc_group $grp`" + done + fi + + #-- Write the RPM %file sections + # (do this after services, since services adds to %files.run) + for cmp in $pp_components; do + _subname=`pp_rpm_subname $cmp` + + if test -s $pp_wrkdir/%check.$cmp; then + echo "" + echo "%pre $_subname" + cat $pp_wrkdir/%check.$cmp + echo : # causes script to exit true by default + fi + + if test -s $pp_wrkdir/%files.$cmp; then + echo "" + echo "%files $_subname" + pp_rpm_writefiles < $pp_wrkdir/%files.$cmp + fi + + if test -n "$pp_rpm_ghost"; then + for ghost in $pp_rpm_ghost; do + echo "%ghost $ghost" + done + fi + + if test -s $pp_wrkdir/%pre.$cmp; then + echo "" + echo "%pre $_subname" + cat $pp_wrkdir/%pre.$cmp + echo : # causes script to exit true + fi + + if test -s $pp_wrkdir/%post.$cmp; then + echo "" + echo "%post $_subname" + cat $pp_wrkdir/%post.$cmp + echo : # causes script to exit true + fi + + if test -s $pp_wrkdir/%preun.$cmp; then + echo "" + echo "%preun $_subname" + cat $pp_wrkdir/%preun.$cmp + echo : # causes script to exit true + fi + + if test -s $pp_wrkdir/%postun.$cmp; then + echo "" + echo "%postun $_subname" + cat $pp_wrkdir/%postun.$cmp + echo : # causes script to exit true + fi + done >>$specfile + + #-- create a suitable work area for rpmbuild + cat <<-. >$pp_wrkdir/.rpmmacros + %_topdir $pp_wrkdir + # XXX Note escaped %% for use in headerSprintf + %_rpmfilename %%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm + . + mkdir $pp_wrkdir/RPMS + mkdir $pp_wrkdir/BUILD + + if test x"$pp_rpm_arch" = x"auto"; then + #-- Reduce the arch_seen list to exactly one item + case "$pp_rpm_arch_seen" in + "i386 x86_64"|"x86_64 i386") + pp_rpm_arch_seen=x86_64;; + *"s390 s390x"* | *"s390x s390"* ) + pp_rpm_arch_seen=s390x;; + *"aarch64"* ) + pp_rpm_arch_seen=aarch64;; + *" "*) + pp_error "detected multiple targets: $pp_rpm_arch_seen" + pp_rpm_arch_seen=unknown;; # not detected + "") + pp_warn "detected no binaries: using target noarch" + pp_rpm_arch_seen=noarch;; + *) + pp_debug "detected architecture $pp_rpm_arch_seen" + esac + pp_rpm_arch="$pp_rpm_arch_seen" + fi + + . $pp_wrkdir/%fixup + +$pp_opt_debug && cat $specfile + + pp_debug "creating: `pp_backend_rpm_names`" + +pp_debug "pp_rpm_arch_seen = <${pp_rpm_arch_seen}>" +pp_debug "pp_rpm_arch = <${pp_rpm_arch}>" + + HOME=$pp_wrkdir \ + pp_verbose \ + $pp_rpm_rpmbuild -bb \ + --buildroot="$pp_destdir/" \ + --target="${pp_rpm_arch}" \ + --define='_unpackaged_files_terminate_build 0' \ + --define='_use_internal_dependency_generator 0' \ + `$pp_opt_debug && echo --verbose || echo --quiet` \ + $pp_rpm_rpmbuild_extra_flags \ + $specfile || + pp_error "Problem creating RPM packages" + + for f in `pp_backend_rpm_names`; do + # The package might be in an arch-specific subdir + pkgfile=not-found + for dir in $pp_wrkdir/RPMS/${pp_rpm_arch} $pp_wrkdir/RPMS; do + if test -f $dir/$f; then + pkgfile=$dir/$f + fi + done + if test x"$pkgfile" = x"not-found"; then + pp_error "Problem predicting RPM filename: $f" + else + ln $pkgfile $pp_wrkdir/$f + fi + done +} + +pp_rpm_output_name () { + echo "${pp_rpm_name:-$name}`pp_rpm_subname "$1" -`-${pp_rpm_version:-$version}-${pp_rpm_release:-1}.${pp_rpm_arch}.rpm" +} + +pp_backend_rpm_names () { + local cmp _subname + for cmp in $pp_components; do + pp_rpm_output_name $cmp + done +} + +pp_backend_rpm_cleanup () { + : +} + +pp_rpm_print_requires () { + local _subname _name + + echo "CPU:$pp_rpm_arch" + ## XXX should be lines of the form (from file/ldd/objdump) + # EXEC:/bin/sh + # RTLD:libc.so.4:open + rpm -q --requires -p $pp_wrkdir/`pp_rpm_output_name $1` |sed -e '/^rpmlib(/d;s/ //g;s/^/RPM:/' | sort -u +} + +pp_backend_rpm_install_script () { + local cmp _subname + + echo "#!/bin/sh" + pp_install_script_common + + cat <<. + + cmp_to_pkgname () { + local oi name + if test x"\$1" = x"--only-installed"; then + #-- only print if installation detected + oi=false + shift + else + oi=true + fi + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + _subname=`pp_rpm_subname $cmp -` + echo "$cmp) name=${pp_rpm_name:-$name}${_subname};;" + done + cat <<. + *) usage;; + esac + if \$oi || rpm -q "\$name" >/dev/null 2>/dev/null; then + echo "\$name" + fi + done + } + + + cmp_to_pathname () { + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo "$cmp) echo \${PP_PKGDESTDIR:-.}/`pp_rpm_output_name $cmp` ;;" + done + cat <<. + *) usage;; + esac + done + } + + print_requires () { + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo "$cmp) cat <<'._end'" + pp_rpm_print_requires $cmp + echo "._end"; echo ';;' + done + cat <<. + *) usage;; + esac + done + } + + test \$# -eq 0 && usage + op="\$1"; shift + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo $pp_components + ;; + list-services) + test \$# -eq 0 || usage \$op + echo $pp_services + ;; + list-files) + test \$# -ge 1 || usage \$op + cmp_to_pathname "\$@" + ;; + install) + test \$# -ge 1 || usage \$op + verbose rpm -U --replacepkgs --oldpackage \ + \`cmp_to_pathname "\$@"\` + ;; + uninstall) + test \$# -ge 1 || usage \$op + pkgs=\`cmp_to_pkgname --only-installed "\$@"\` + if test -z "\$pkgs"; then + verbosemsg "nothing to uninstall" + else + verbose rpm -e \$pkgs + fi + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + verbose /etc/init.d/\$svc \$op || ec=1 + done + exit \$ec + ;; + print-platform) + test \$# -eq 0 || usage \$op + echo "linux-${pp_rpm_arch}" + ;; + print-requires) + test \$# -ge 1 || usage \$op + print_requires "\$@" + ;; + *) + usage + ;; + esac +. + +} + +pp_backend_rpm_probe () { + echo "${pp_rpm_distro}-${pp_rpm_arch_std}" +} + +pp_backend_rpm_vas_platforms () { + case "$pp_rpm_arch_std" in + x86_64) echo "linux-x86_64.rpm linux-x86.rpm";; + *86) echo "linux-x86.rpm";; + s390) echo "linux-s390";; + s390x) echo "linux-s390x";; + ppc*) echo "linux-glibc23-ppc64 linux-glibc22-ppc64";; + ia64) echo "linux-ia64";; + *) pp_die "unknown architecture $pp_rpm_arch_std";; + esac +} + +pp_rpm_service_install_common () { + cat <<-'.' + + _pp_install_service () { + local svc level + svc="$1" + if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ] + then + # LSB-style install + /usr/lib/lsb/install_initd /etc/init.d/$svc &> /dev/null + elif [ -x /sbin/chkconfig ]; then + # Red Hat/chkconfig-style install + /sbin/chkconfig --add $svc &> /dev/null + /sbin/chkconfig $svc off &> /dev/null + else + : # manual links under /etc/init.d + fi + } + + _pp_enable_service () { + local svc level + svc="$1" + if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ] + then + # LSB-style install + : # not sure how to enable + elif [ -x /sbin/chkconfig ]; then + # Red Hat/chkconfig-style install + /sbin/chkconfig $svc on &> /dev/null + else + # manual install + set -- `sed -n -e 's/^# Default-Start://p' /etc/init.d/$svc` + start_priority=`sed -n -e 's/^# X-Quest-Start-Priority:[[:space:]]*//p' /etc/init.d/$svc` + stop_priority=`sed -n -e 's/^# X-Quest-Stop-Priority:[[:space:]]*//p' /etc/init.d/$svc` + + # Provide default start & stop priorities of 20 & 80 in + # accordance with Debian update-rc.d defaults + if [ -z "$start_priority" ]; then + start_priority=20 + fi + if [ -z "$stop_priority" ]; then + stop_priority=80 + fi + + if [ -d "/etc/rc.d" ];then + rcdir=/etc/rc.d + else + rcdir=/etc + fi + + for level + do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/S$start_priority$svc; done + set -- `sed -n -e 's/^# Default-Stop://p' /etc/init.d/$svc` + for level + do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/K$stop_priority$svc; done + fi + } +. +} + +pp_rpm_service_remove_common () { + cat <<-'.' + + _pp_remove_service () { + local svc + svc="$1" + /etc/init.d/$svc stop >/dev/null 2>&1 + if [ -x /usr/lib/lsb/remove_initd -a ! -r /etc/redhat-release ] + then + /usr/lib/lsb/remove_initd /etc/init.d/$svc &> /dev/null + elif [ -x /sbin/chkconfig ]; then + /sbin/chkconfig --del $svc &> /dev/null + else + if [ -d "/etc/rc.d" ];then + rcdir=/etc/rc.d + else + rcdir=/etc + fi + + rm -f $rcdir/rc?.d/[SK]??$svc + fi + } +. +} + + +pp_rpm_service_install () { + pp_rpm_service_make_init_script $1 >/dev/null || + pp_error "could not create init script for service $1" + echo "_pp_install_service $1" + test $enable = yes && echo "_pp_enable_service $1" +} + +pp_rpm_service_remove () { + cat <<-. + if [ "\$1" = "remove" -o "\$1" = "0" ]; then + # only remove the service if not upgrade + _pp_remove_service $1 + fi +. +} + + +pp_backend_rpm_init_svc_vars () { + + reload_signal= + start_runlevels=${pp_rpm_default_start_runlevels-"2 3 4 5"} # == lsb default-start + stop_runlevels=${pp_rpm_default_stop_runlevels-"0 1 6"} # == lsb default-stop + svc_description="${pp_rpm_default_svc_description}" # == lsb short descr + svc_process= + + lsb_required_start='$local_fs $network' + lsb_should_start= + lsb_required_stop= + lsb_description= + + start_priority=50 + stop_priority=50 #-- stop_priority = 100 - start_priority +} + +pp_rpm_service_group_make_init_script () { + local grp=$1 + local svcs="$2" + local script=/etc/init.d/$grp + local out=$pp_destdir$script + + pp_add_file_if_missing $script run 755 || return 0 + + cat <<-. >>$out + #!/bin/sh + svcs="$svcs" +. + + cat <<-'.' >>$out + + #-- prints usage message + pp_usage () { + echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2 + return 2 + } + + #-- starts services in order.. stops them all if any break + pp_start () { + undo= + for svc in $svcs; do + if /etc/init.d/$svc start; then + undo="$svc $undo" + else + if test -n "$undo"; then + for svc in $undo; do + /etc/init.d/$svc stop + done + return 1 + fi + fi + done + return 0 + } + + #-- stops services in reverse + pp_stop () { + reverse= + for svc in $svcs; do + reverse="$svc $reverse" + done + rc=0 + for svc in $reverse; do + /etc/init.d/$svc stop || rc=$? + done + return $rc + } + + #-- returns true only if all services return true status + pp_status () { + rc=0 + for svc in $svcs; do + /etc/init.d/$svc status || rc=$? + done + return $rc + } + + pp_reload () { + rc=0 + for svc in $svcs; do + /etc/init.d/$svc reload || rc=$? + done + return $rc + } + + case "$1" in + start) pp_start;; + stop) pp_stop;; + restart) pp_stop; pp_start;; + status) pp_status;; + try-restart|condrestart) + if pp_status >/dev/null; then + pp_restart + fi;; + reload) pp_reload;; + force-reload) if pp_status >/dev/null; then + pp_reload + else + pp_restart + fi;; + *) pp_usage;; + esac +. + chmod 755 $out +} + +pp_rpm_service_make_init_script () { + local svc=$1 + local script=/etc/init.d/$svc + local out=$pp_destdir$script + local _process _cmd _rpmlevels + + pp_add_file_if_missing $script run 755 || return 0 + + #-- start out as an empty shell script + cat <<-'.' >$out + #!/bin/sh +. + + #-- determine the process name from $cmd unless $svc_process is given + set -- $cmd + _process=${svc_process:-"$1"} + + #-- construct a start command that builds a pid file if needed + _cmd="$cmd"; + if test -z "$pidfile"; then + pidfile=/var/run/$svc.pid + _cmd="$cmd & echo \$! > \$pidfile" + fi + if test "$user" != "root"; then + _cmd="su $user -c exec $_cmd"; + fi + + #-- generate the Red Hat chkconfig headers + _rpmlevels=`echo $start_runlevels | tr -d ' '` + cat <<-. >>$out + # chkconfig: ${_rpmlevels:--} ${start_priority:-50} ${stop_priority:-50} + # description: ${svc_description:-no description} + # processname: ${_process} + # pidfile: ${pidfile} +. + + #-- generate the LSB init info + cat <<-. >>$out + ### BEGIN INIT INFO + # Provides: ${svc} + # Required-Start: ${lsb_required_start} + # Should-Start: ${lsb_should_start} + # Required-Stop: ${lsb_required_stop} + # Default-Start: ${start_runlevels} + # Default-Stop: ${stop_runlevels} + # Short-Description: ${svc_description} + ### END INIT INFO + # Generated by PolyPackage ${pp_version} + # ${copyright} + + prog="`echo $cmd | sed -e 's: .*::' -e 's:^.*/::'`" + +. + + if test x"${svc_description}" = x"${pp_rpm_default_svc_description}"; then + svc_description= + fi + + #-- write service-specific definitions + cat <<. >>$out + #-- definitions specific to service ${svc} + svc_name="${svc_description:-$svc service}" + user="${user}" + pidfile="${pidfile}" + stop_signal="${stop_signal}" + reload_signal="${reload_signal}" + pp_exec_cmd () { $_cmd; } +. + + #-- write the generic part of the init script + cat <<'.' >>$out + + #-- use system message logging, if available + if [ -f /lib/lsb/init-functions -a ! -r /etc/redhat-release ]; then + . /lib/lsb/init-functions + pp_success_msg () { log_success_msg "$@"; } + pp_failure_msg () { log_failure_msg "$@"; } + pp_warning_msg () { log_warning_msg "$@"; } + elif [ -f /etc/init.d/functions ]; then + . /etc/init.d/functions + pp_success_msg () { echo -n "$*"; success "$@"; echo; } + pp_failure_msg () { echo -n "$*"; failure "$@"; echo; } + pp_warning_msg () { echo -n "$*"; warning "$@"; echo; } + else + pp_success_msg () { echo ${1:+"$*:"} OK; } + pp_failure_msg () { echo ${1:+"$*:"} FAIL; } + pp_warning_msg () { echo ${1:+"$*:"} WARNING; } + fi + + #-- prints a status message + pp_msg () { echo -n "$*: "; } + + #-- prints usage message + pp_usage () { + echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2 + return 2 + } + + #-- reloads the service, if possible + # returns 0=success 1=failure 3=unimplemented + pp_reload () { + test -n "$reload_signal" || return 3 # unimplemented + pp_msg "Reloading ${svc_name}" + if pp_signal -${reload_signal}; then + pp_success_msg + return 0 + else + pp_failure_msg "not running" + return 1 + fi + } + + #-- delivers signal $1 to the pidfile + # returns 0=success 1=failure + pp_signal () { + if test -s "$pidfile"; then + read pid < "$pidfile" 2>/dev/null + kill "$@" "$pid" 2>/dev/null + else + return 1 + fi + } + + #-- verifies that ${svc_name} is running + # returns 0=success 1=failure + pp_running () { + if test -s "$pidfile"; then + read pid < "$pidfile" 2>/dev/null + if test ${pid:-0} -gt 1 && kill -0 "$pid" 2>/dev/null; then + # make sure name matches + pid="`ps -p $pid 2>/dev/null | sed -n \"s/^ *\($pid\) .*$prog *$/\1/p\"`" + if test -n "$pid"; then + return 0 + fi + fi + fi + return 1 + } + + #-- prints information about the service status + # returns 0=running 1=crashed 3=stopped + pp_status () { + pp_msg "Checking for ${svc_name}" + if pp_running; then + pp_success_msg "running" + return 0 + elif test -s "$pidfile"; then + pp_failure_msg "not running (crashed)" + return 1 + else + pp_failure_msg "not running" + return 3 + fi + } + + #-- starts the service + # returns 0=success 1=failure + pp_start () { + pp_msg "Starting ${svc_name}" + if pp_status >/dev/null; then + pp_warning_msg "already started" + return 0 + elif pp_exec_cmd; then + pp_success_msg + return 0 + else + pp_failure_msg "cannot start" + return 1 + fi + } + + #-- stops the service + # returns 0=success (always) + pp_stop () { + pp_msg "Stopping ${svc_name}" + if pp_signal -${stop_signal}; then + pp_success_msg + else + pp_success_msg "already stopped" + fi + rm -f "$pidfile" + return 0 + } + + #-- stops and starts the service + pp_restart () { + pp_stop + pp_start + } + + case "$1" in + start) pp_start;; + stop) pp_stop;; + restart) pp_restart;; + status) pp_status;; + try-restart|condrestart) + if pp_status >/dev/null; then + pp_restart + fi;; + reload) pp_reload;; + force-reload) if pp_status >/dev/null; then + pp_reload + else + pp_restart + fi;; + *) pp_usage;; + esac + +. + chmod 755 $out +} +pp_backend_rpm_function () { + case "$1" in + pp_mkgroup) cat<<'.';; + /usr/sbin/groupadd -f -r "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat<<'.';; + pp_mkgroup "${2:-$1}" || return 1 + /usr/sbin/useradd \ + -g "${2:-$1}" \ + -M -d "${3:-/nonexistent}" \ + -s "${4:-/bin/false}" \ + -r "$1" +. + pp_havelib) cat<<'.';; + for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do + test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0 + done + return 1 +. + *) false;; + esac +} + +: NOTES <<. + + # creating a dmg file for publishing on the web + hdiutil create -srcfolder /path/foo foo.dmg + hdiutil internet-enable -yes /path/foo.dmg + # Layout for packages + -/component/ + -/extras/postinstall + -/extras/postupgrade + # /Developer/usr/bin/packagemaker (man packagemaker) + + Make a bunch of packages, and then build a 'distribution' + which is only understood by macos>10.4 + + # Message files in the resource path used are + Welcome.{rtf,html,rtfd,txt} - limited text shown in Intro + ReadMe.{rtf,html,rtfd,txt} - scrollable/printable, after Intro + License.{rtf,html,rtfd,txt} - ditto, user must click 'Accept' + background.{jpg,tif,gif,pict,eps,pdf} 620x418 background image + + # These scripts looked for in the resource path + InstallationCheck $pkgpath $defaultloc $targetvol + 0:ok 32:warn 32+x:warn[1] 64:stop 96+x:stop[2] + VolumeCheck $volpath + 0:ok 32:failure 32+x:failure[3] + preflight $pkgpath $targetloc $targetvol [priv] + preinstall $pkgpath $targetloc $targetvol [priv] + preupgrade $pkgpath $targetloc $targetvol [priv] + postinstall $pkgpath $targetloc $targetvol [priv] + postupgrade $pkgpath $targetloc $targetvol [priv] + postflight $pkgpath $targetloc $targetvol [priv] + 0:ok else fail (for all scripts) + + A detailed reason is deduced by finding an index x (16..31) + in the file InstallationCheck.strings or VolumeCheck.strings. + + Scripts marked [priv] are executed with root privileges. + None of the [priv] scripts are used by metapackages. + + # Default permissions + Permissions of existing directories should match those + of a clean install of the OS; typically root:admin 0775 + New directories or files should be 0775 or 0664 with the + appropriate user:group. + Exceptions: + /etc root:admin 0755 + /var root:admin 0755 + + + Info.plist = { + CFBundleGetInfoString: "1.2.3, One Identity LLC.", + CFBundleIdentifier: "com.quest.rc.openssh", + CFBundleShortVersionString: "1.2.3", + IFMajorVersion: 1, + IFMinorVersion: 2, + IFPkgFlagAllowBackRev: false, + IFPkgFlagAuthorizationAction: "AdminAuthorization", + IFPkgFlagDefaultLocation: "/", + IFPkgFlagFollowLinks: true, + IFPkgFlagInstallFat: false, + IFPkgFlagInstalledSize: , # this is added by packagemaker + IFPkgFlagIsRequired: false, + IFPkgFlagOverwritePermissions: false, + IFPkgFlagRelocatable: false, + IFPkgFlagRestartAction: "NoRestart", + IFPkgFlagRootVolumeOnly: false, + IFPkgFlagUpdateInstalledLanguages: false, + IFPkgFormatVersion= 0.10000000149011612, + IFRequirementDicts: [ { + Level = "requires", + SpecArgument = "/opt/quest/lib/libvas.4.2.0.dylib", + SpecType = "file", + TestObject = true, + TestOperator = "eq", } ] + } + + Description.plist = { + IFPkgDescriptionDescription = "this is the description text", + IFPkgDescriptionTitle = "quest-openssh" + } + + # Startup scripts + 'launchd' is a kind of combined inetd and rc/init.d system. + + Create a /Library/LaunchDaemons/$daemonname.plist file + Examples found in /System/Library/LaunchDaemons/ + See manual page launchd.plist(5) for details: + + { Label: "com.quest.rc.foo", # required + Program: "/sbin/program", + ProgramArguments: [ "/sbin/program", "arg1", "arg2" ], # required + RunAtLoad: true, + WatchPaths: [ "/etc/crontab" ], + QueueDirectories: [ "/var/cron/tabs" ], + inetdCompatibility: { Wait: false }, # inetd-only + OnDemand: false, # recommended + SessionCreate: true, + UserName: "nobody", + InitGroups: true, + Sockets: { # inetd only + Listeners: { + SockServiceName: "ssh", + Bonjour: ["ssh", "sftp-ssh"], } }, + Disabled: false, + StandardErrorPath: "/dev/null", + } + + + How to add a new user + dscl . -create /Users/$user + dscl . -create /Users/$user UserShell /bin/bash + dscl . -create /Users/$user RealName "$user" + dscl . -create /Users/$user UniqueID $uid + dscl . -create /Users/$user PrimaryGroupID $gid + dscl . -create /Users/$user NFSHomeDirectory /Users/$user + dscl . -passwd /Users/$user "$passwd" + mkdir /Users/$user + chown $uid.$gid /Users/$user + +. + + +pp_platforms="$pp_platforms macos" + +pp_backend_macos_detect () { + [ x"$1" = x"Darwin" ] +} + +pp_backend_macos_init () { + pp_macos_default_bundle_id_prefix="com.quest.rc." + pp_macos_bundle_id= + pp_macos_bundle_vendor= + pp_macos_bundle_version= + pp_macos_bundle_info_string= + pp_macos_pkg_type=bundle + pp_macos_pkg_license= + pp_macos_pkg_readme= + pp_macos_pkg_welcome= + pp_macos_sudo=sudo + pp_macos_installer_plugin= + # OS X puts the library version *before* the .dylib extension + pp_shlib_suffix='*.dylib' +} + +pp_macos_plist () { + typeset in + in="" + while test $# -gt 0; do + case "$1" in + + start-plist) cat <<-.; in=" "; shift ;; + + + +. + end-plist) echo ""; in=; shift;; + + '[') echo "$in"; in="$in "; shift;; + ']') echo "$in"; in="${in# }"; shift;; + '{') echo ""; in="$in "; shift;; + '}') echo ""; in="${in# }"; shift;; + key) shift; echo "$in$1"; shift;; + string) shift; + echo "$1" | sed -e 's/&/&/g;s//\>/g;' \ + -e 's/^/'"$in"'/;s/$/<\/string>/'; + shift;; + true) echo "$in"; shift;; + false) echo "$in"; shift;; + real) shift; echo "$in$1"; shift;; + integer) shift; echo "$in$1"; shift;; + date) shift; echo "$in$1"; shift;; # ISO 8601 format + data) shift; echo "$in$1"; shift;; # base64 encoded + *) pp_error "pp_macos_plist: bad argument '$1'"; shift;; + esac + done +} + +pp_macos_rewrite_cpio () { + typeset script + script=$pp_wrkdir/cpio-rewrite.pl + cat <<-'.' >$script + #!/usr/bin/perl + # + # Filter a cpio file, applying the user/group/mode specified in %files + # + # A CPIO header block has octal fields at the following offset/lengths: + # 0 6 magic + # 6 6 dev + # 12 6 ino + # 18 6 mode + # 24 6 uid + # 30 6 gid + # 36 6 nlink + # 42 6 rdev + # 48 11 mtime + # 59 6 namesize (including NUL terminator) + # 65 11 filesize + # 76 -- + # + use strict; + use warnings; + no strict 'subs'; + + # set %uid, %gid, %mode based on %files + my (%uid, %gid, %mode, %users, %groups); + my %type_map = ( d => 0040000, f => 0100000, s => 0120000 ); + while () { + my ($type,$mode,$uid,$gid,$flags,$name) = + m/^(.) (\S+) (\S+) (\S+) (\S+) (\S+)/; + $mode = $type eq "f" ? "0644" : "0755" if $mode eq "-"; + $uid = 0 if $uid eq "-"; + $gid = 0 if $gid eq "-"; + if ($uid ne "=" and $uid =~ m/\D/) { + unless (exists $users{$uid}) { + my @pw = getpwnam($uid) or die "bad username '$uid'"; + $users{$uid} = $pw[2]; + } + $uid = $users{$uid}; + } + if ($gid ne "=" and $gid =~ m/\D/) { + unless (exists $groups{$gid}) { + my @gr = getgrnam($gid) or die "bad group'$gid'"; + $groups{$gid} = $gr[2]; + } + $gid = $groups{$gid}; + } + $name =~ s:/$:: if $type eq "d"; + $name = ".".$name."\0"; + $uid{$name} = sprintf("%06o",int($uid)) unless $uid eq "="; + $gid{$name} = sprintf("%06o",int($gid)) unless $gid eq "="; + $mode{$name} = sprintf("%06o",oct($mode)|$type_map{$type}) unless $mode eq "="; + } + undef %users; + undef %groups; + # parse the cpio file + my $hdrlen = 76; + while (read(STDIN, my $header, $hdrlen)) { + my ($name, $namesize, $filesize); + my $filepad = 0; + if ($header =~ m/^07070[12]/) { + # SVR4 ASCII format, convert to ODC + if ($hdrlen == 76) { + # Read in rest of header and update header len for SVR4 + read(STDIN, $header, 110 - 76, 76); + $hdrlen = 110; + } + my $ino = hex(substr($header, 6, 8)) & 0x3ffff; + my $mode = hex(substr($header, 14, 8)) & 0x3ffff; + my $uid = hex(substr($header, 22, 8)) & 0x3ffff; + my $gid = hex(substr($header, 30, 8)) & 0x3ffff; + my $nlink = hex(substr($header, 38, 8)) & 0x3ffff; + my $mtime = hex(substr($header, 46, 8)) & 0xffffffff; + $filesize = hex(substr($header, 54, 8)) & 0xffffffff; + my $dev_maj = hex(substr($header, 62, 8)); + my $dev_min = hex(substr($header, 70, 8)); + my $dev = &makedev($dev_maj, $dev_min) & 0x3ffff; + my $rdev_maj = hex(substr($header, 78, 8)); + my $rdev_min = hex(substr($header, 86, 8)); + my $rdev = &makedev($rdev_maj, $rdev_min) & 0x3ffff; + $namesize = hex(substr($header, 94, 8)) & 0x3ffff; + read(STDIN, $name, $namesize); + # Header + name is padded to a multiple of 4 bytes + my $namepad = (($hdrlen + $namesize + 3) & 0xfffffffc) - ($hdrlen + $namesize); + read(STDIN, my $padding, $namepad) if ($namepad); + # File data is padded to be a multiple of 4 bytes + $filepad = (($filesize + 3) & 0xfffffffc) - $filesize; + + my $new_header = sprintf("070707%06o%06o%06o%06o%06o%06o%06o%011o%06o%011o", $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime, $namesize, $filesize); + $header = $new_header; + } elsif ($header =~ m/^070707/) { + # POSIX Portable ASCII Format + $namesize = oct(substr($header, 59, 6)); + $filesize = oct(substr($header, 65, 11)); + read(STDIN, $name, $namesize); + } else { + die "bad magic"; + } + # update uid, gid and mode (already in octal) + substr($header, 24, 6) = $uid{$name} if exists $uid{$name}; + substr($header, 30, 6) = $gid{$name} if exists $gid{$name}; + substr($header, 18, 6) = $mode{$name} if exists $mode{$name}; + print($header, $name); + # check for trailer at EOF + last if $filesize == 0 && $name =~ /^TRAILER!!!\0/; + # copy-through the file data + while ($filesize > 0) { + my $seg = 8192; + $seg = $filesize if $filesize < $seg; + read(STDIN, my $data, $seg); + print $data; + $filesize -= $seg; + } + # If file data is padded, skip it + read(STDIN, my $padding, $filepad) if ($filepad); + } + # pass through any padding at the end (blocksize-dependent) + for (;;) { + my $numread = read(STDIN, my $data, 8192); + last unless $numread; + print $data; + } + exit(0); + + sub makedev { + (((($_[0] & 0xff)) << 24) | ($_[1] & 0xffffff)); + } + __DATA__ +. + # Append to the script the %files data + cat "$@" > $script + /usr/bin/perl $script || pp_error "pp_macos_rewrite_cpio error"; +} + +pp_macos_files_bom () { + typeset _l t m o g f p st owner + while read t m o g f p st; do + # make sure that $m is padded up to 4 digits long + case "$m" in + ?) m="000$m";; + ??) m="00$m";; + ???) m="0$m";; + ?????*) pp_error "pp_macos_writebom: mode '$m' too long";; + esac + + # convert owner,group into owner/group in octal + case $o in -) o=0;; esac + case $g in -) g=0;; esac + owner=`pp_d2o $o`/`pp_d2o $g` + + case $t in + f) + test x"$m" = x"000-" && m=0644 + echo ".$p 10$m $owner ` + /usr/bin/cksum < "${pp_destdir}$p" | + awk '{print $2 " " $1}'`" + ;; + d) + test x"$m" = x"000-" && m=0755 + echo ".${p%/} 4$m $owner" + ;; + s) + test x"$m" = x"000-" && m=0755 + rl=`/usr/bin/readlink "${pp_destdir}$p"` + #test x"$rl" = x"$st" || + # pp_error "symlink mismatch $rl != $st" + echo ".$p 12$m $owner ` + /usr/bin/readlink -n "${pp_destdir}$p" | + /usr/bin/cksum | + awk '{print $2 " " $1}'` $st" + ;; + esac + done +} + +pp_macos_bom_fix_parents () { + perl -pe ' + sub dirname { my $d=shift; $d=~s,/[^/]*$,,; $d; } + sub chk { my $d=shift; + &chk(&dirname($d)) if $d =~ m,/,; + unless ($seen{$d}++) { + # Make sure we do not override system directories + if ($d =~ m:^\./(etc|var)$:) { + my $tgt = "private/$1"; + my ($sum, $len) = split(/\s+/, `/usr/bin/printf "$tgt" | /usr/bin/cksum /dev/stdin`); + print "$d\t120755\t0/0\t$len\t$sum\t$tgt\n"; + } elsif ($d eq "." || $d eq "./Library") { + print "$d\t41775\t0/80\n"; + } elsif ($d eq "./Applications" || $d eq "./Developer") { + print "$d\t40775\t0/80\n"; + } else { + print "$d\t40755\t0/0\n"; + } + } + } + m/^(\S+)\s+(\d+)/; + if (oct($2) & 040000) { + $seen{$1}++; # directory + } + &chk(&dirname($1));' +} + +pp_macos_files_size () { + typeset _l t m o g f p st owner + while read t m o g f p st; do + case $t in + f) wc -c < "${pp_destdir}$p";; + s) echo 4095;; + d) ;; # always seems to be zero + esac + done | awk '{n+=1+int($1/4096)} END {print n*4}' +} + +pp_o2d () { + awk 'BEGIN { x=0; '`echo "$1" | + sed -e 's/./x=x*8+&;/g'`'print x;}' /dev/null; then + rm -f "$2" + /usr/bin/mkbom -i "$1" "$2" + return + fi + + # On 10.4 we have this nonsense. + pp_warn "mkbom workaround: copying source files to staging area" + + bomstage=$pp_wrkdir/bom_stage + $pp_macos_sudo /bin/mkdir "$bomstage" + while IFS=' ' read path mode ugid size cksumi linkpath; do + if test -h "$pp_destdir/$path"; then + $pp_macos_sudo /bin/ln -s "$linkpath" "$bomstage/$path" + else + if test -d "$pp_destdir/$path"; then + $pp_macos_sudo /bin/mkdir -p "$bomstage/$path" + else + $pp_macos_sudo /bin/cp "$pp_destdir/$path" "$bomstage/$path" + fi + $pp_macos_sudo /bin/chmod $mode "$bomstage/$path" + $pp_macos_sudo /usr/sbin/chown `echo $ugid| tr / :` "$bomstage/$path" + fi + done <"$1" + (cd $bomstage && $pp_macos_sudo mkbom . $pp_wrkdir/bom_stage.bom) || + pp_error "mkbom failed" + $pp_macos_sudo mv $pp_wrkdir/bom_stage.bom "$2" +} + +pp_backend_macos () { + : ${pp_macos_bundle_id:=$pp_macos_default_bundle_id_prefix$name} + case "$pp_macos_pkg_type" in + bundle) pp_backend_macos_bundle;; + flat) pp_backend_macos_flat;; + *) pp_error "unsupported package type $pp_macos_pkg_type";; + esac +} + +pp_backend_macos_bundle () { + typeset pkgdir Contents Resources lprojdir svc + typeset Info_plist Description_plist + typeset bundle_vendor bundle_version size cmp filelists + + mac_version=`sw_vers -productVersion` + bundle_vendor=${pp_macos_bundle_vendor:-$vendor} + + if test -z "$pp_macos_bundle_version"; then + bundle_version=`echo "$version.0.0.0" | sed -n -e 's/[^0-9.]//g' \ + -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'` + else + bundle_version="$pp_macos_bundle_version" + fi + source_version=`echo $version | sed 's/.*\.//'` + + # build the package layout + pkgdir=$pp_wrkdir/$name.pkg + Contents=$pkgdir/Contents + Resources=$Contents/Resources + lprojdir=$Resources/en.lproj + mkdir $pkgdir $Contents $Resources $lprojdir || + pp_error "Can't make package temporary directories" + + echo "major: 1" > $Resources/package_version + echo "minor: 0" >> $Resources/package_version + echo "pmkrpkg1" > $Contents/PkgInfo + case $mac_version in + "10.6"*) + xattr -w "com.apple.TextEncoding" "macintosh;0" "$Resources/package_version" + xattr -w "com.apple.TextEncoding" "macintosh;0" "$Contents/PkgInfo" + ;; + esac + + # Copy welcome file/dir for display at package install time. + if test -n "$pp_macos_pkg_welcome"; then + typeset sfx + sfx=`echo "$pp_macos_pkg_welcome"|sed 's/^.*\.\([^\.]*\)$/\1/'` + case "$sfx" in + rtf|html|rtfd|txt) ;; + *) sfx=txt;; + esac + cp -R ${pp_macos_pkg_welcome} $Resources/Welcome.$sfx + fi + + # Copy readme file/dir for display at package install time. + if test -n "$pp_macos_pkg_readme"; then + typeset sfx + sfx=`echo "$pp_macos_pkg_readme"|sed 's/^.*\.\([^\.]*\)$/\1/'` + case "$sfx" in + rtf|html|rtfd|txt) ;; + *) sfx=txt;; + esac + cp -R ${pp_macos_pkg_readme} $Resources/ReadMe.$sfx + fi + + # Copy license file/dir for display at package install time. + if test -n "$pp_macos_pkg_license"; then + typeset sfx + sfx=`echo "$pp_macos_pkg_license"|sed 's/^.*\.\([^\.]*\)$/\1/'` + case "$sfx" in + rtf|html|rtfd|txt) ;; + *) sfx=txt;; + esac + cp -R ${pp_macos_pkg_license} $Resources/License.$sfx + fi + + # Add services (may modify %files) + for svc in $pp_services .; do + test . = "$svc" && continue + pp_macos_add_service $svc + done + + # Find file lists (%files.* includes ignore files) + for cmp in $pp_components; do + test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp" + done + + # compute the installed size + size=`cat $filelists | pp_macos_files_size` + + #-- Create Info.plist + Info_plist=$Contents/Info.plist + pp_macos_plist \ + start-plist \{ \ + key CFBundleGetInfoString string \ + "${pp_macos_bundle_info_string:-$version $bundle_vendor}" \ + key CFBundleIdentifier string \ + "${pp_macos_bundle_id}" \ + key CFBundleName string "$name" \ + key CFBundleShortVersionString string "$bundle_version.$source_version" \ + key IFMajorVersion integer 1 \ + key IFMinorVersion integer 0 \ + key IFPkgFlagAllowBackRev false \ + key IFPkgFlagAuthorizationAction string "RootAuthorization" \ + key IFPkgFlagDefaultLocation string "/" \ + key IFPkgFlagFollowLinks true \ + key IFPkgFlagInstallFat true \ + key IFPkgFlagInstalledSize integer $size \ + key IFPkgFlagIsRequired false \ + key IFPkgFlagOverwritePermissions true \ + key IFPkgFlagRelocatable false \ + key IFPkgFlagRestartAction string "NoRestart" \ + key IFPkgFlagRootVolumeOnly true \ + key IFPkgFlagUpdateInstalledLanguages false \ + key IFPkgFlagUseUserMask false \ + key IFPkgFormatVersion real 0.10000000149011612 \ + key SourceVersion string $source_version \ + \} end-plist> $Info_plist + + # write en.lproj/Description.plist + Description_plist=$lprojdir/Description.plist + pp_macos_plist \ + start-plist \{ \ + key IFPkgDescriptionDeleteWarning string "" \ + key IFPkgDescriptionDescription string "$pp_macos_bundle_info_string" \ + key IFPkgDescriptionTitle string "$name" \ + key IFPkgDescriptionVersion string "$bundle_version.$source_version" \ + \} end-plist > $Description_plist + + # write Resources/files + awk '{print $6}' $filelists > $Resources/files + + # write package size file + printf \ +"NumFiles 0 +InstalledSize $size +CompressedSize 0 +" > $Resources/$name.sizes + + # write Resources/preinstall + for cmp in $pp_components; do + if test -s $pp_wrkdir/%pre.$cmp; then + if test ! -s $Resources/preinstall; then + echo "#!/bin/sh" > $Resources/preinstall + chmod +x $Resources/preinstall + fi + cat $pp_wrkdir/%pre.$cmp >> $Resources/preinstall + echo : >> $Resources/preinstall + fi + done + + # write Resources/postinstall + for cmp in $pp_components; do + if test -s $pp_wrkdir/%post.$cmp; then + if test ! -s $Resources/postinstall; then + echo "#!/bin/sh" > $Resources/postinstall + chmod +x $Resources/postinstall + fi + cat $pp_wrkdir/%post.$cmp >> $Resources/postinstall + echo : >> $Resources/postinstall + fi + done + + # write Resources/postupgrade + for cmp in $pp_components; do + if test -s $pp_wrkdir/%postup.$cmp; then + if test ! -s $Resources/postupgrade; then + echo "#!/bin/sh" > $Resources/postupgrade + chmod +x $Resources/postupgrade + fi + cat $pp_wrkdir/%postup.$cmp >> $Resources/postupgrade + echo : >> $Resources/postupgrade + fi + done + + # write Resources/preremove + for cmp in $pp_components; do + if test -s $pp_wrkdir/%preun.$cmp; then + if test ! -s $Resources/preremove; then + echo "#!/bin/sh" > $Resources/preremove + chmod +x $Resources/preremove + fi + cat $pp_wrkdir/%preun.$cmp >> $Resources/preremove + echo : >> $Resources/preremove + fi + done + + # write Resources/postremove + for cmp in $pp_components; do + if test -s $pp_wrkdir/%postun.$cmp; then + if test ! -s $Resources/postremove; then + echo "#!/bin/sh" > $Resources/postremove + chmod +x $Resources/postremove + fi + cat $pp_wrkdir/%postun.$cmp >> $Resources/postremove + echo : >> $Resources/postremove + fi + done + + # write uninstall info + echo "version=$version" > $Resources/uninstall + if [ -n "$pp_macos_requires" ];then + echo "requires=$pp_macos_requires" >> $Resources/uninstall + fi + + . $pp_wrkdir/%fixup + + # Create the bill-of-materials (Archive.bom) + cat $filelists | pp_macos_files_bom | sort | + pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls + + pp_macos_mkbom $pp_wrkdir/tmp.bomls $Contents/Archive.bom + + # Create the cpio archive (Archive.pax.gz) + ( + cd $pp_destdir && + awk '{ print "." $6 }' $filelists | sed 's:/$::' | sort | /usr/bin/cpio -o | pp_macos_rewrite_cpio $filelists | gzip -9f -c > $Contents/Archive.pax.gz + ) + + # Copy installer plugins if any + if test -n "$pp_macos_installer_plugin"; then + if test ! -f "$pp_macos_installer_plugin/InstallerSections.plist"; then + pp_error "Missing InstallerSections.plist file in $pp_macos_installer_plugin" + fi + mkdir -p $pkgdir/Plugins + cp -R "$pp_macos_installer_plugin"/* $pkgdir/Plugins + fi + + test -d $pp_wrkdir/bom_stage && $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage + + rm -f ${name}-${version}.dmg + hdiutil create -fs HFS+ -srcfolder $pkgdir -volname $name ${name}-${version}.dmg +} + +pp_backend_macos_flat () { + typeset pkgdir bundledir Resources lprojdir svc + typeset Info_plist Description_plist + typeset bundle_vendor bundle_version size numfiles cmp filelists + + mac_version=`sw_vers -productVersion` + bundle_vendor=${pp_macos_bundle_vendor:-$vendor} + + if test -z "$pp_macos_bundle_version"; then + bundle_version=`echo "$version.0.0.0" | sed -n -e 's/[^0-9.]//g' \ + -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'` + else + bundle_version="$pp_macos_bundle_version" + fi + source_version=`echo $version | sed 's/.*\.//'` + + # build the flat package layout + pkgdir=$pp_wrkdir/pkg + bundledir=$pp_wrkdir/pkg/$name.pkg + Resources=$pkgdir/Resources + lprojdir=$Resources/en.lproj + mkdir $pkgdir $bundledir $Resources $lprojdir || + pp_error "Can't make package temporary directories" + + # Add services (may modify %files) + for svc in $pp_services .; do + test . = "$svc" && continue + pp_macos_add_service $svc + done + + # Find file lists (%files.* includes ignore files) + for cmp in $pp_components; do + test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp" + done + + # compute the installed size and number of files/dirs + size=`cat $filelists | pp_macos_files_size` + numfiles=`cat $filelists | wc -l` + numfiles="${numfiles##* }" + + # Write Distribution file + cat <<-. >$pkgdir/Distribution + + + $name $version + + +. + if test -n "$pp_macos_pkg_welcome"; then + cp -R "${pp_macos_pkg_welcome}" $Resources + echo " " >>$pkgdir/Distribution + fi + if test -n "$pp_macos_pkg_readme"; then + cp -R "${pp_macos_pkg_readme}" $Resources + echo " " >>$pkgdir/Distribution + fi + if test -n "$pp_macos_pkg_license"; then + cp -R "${pp_macos_pkg_license}" $Resources + echo " " >>$pkgdir/Distribution + fi + cat <<-. >>$pkgdir/Distribution + + + + + + + #$name.pkg + +. + + # write scripts archive + # XXX - missing preupgrade, preflight, postflight + mkdir $pp_wrkdir/scripts + for cmp in $pp_components; do + if test -s $pp_wrkdir/%pre.$cmp; then + if test ! -s $pp_wrkdir/scripts/preinstall; then + echo "#!/bin/sh" > $pp_wrkdir/scripts/preinstall + chmod +x $pp_wrkdir/scripts/preinstall + fi + cat $pp_wrkdir/%pre.$cmp >> $pp_wrkdir/scripts/preinstall + echo : >> $pp_wrkdir/scripts/preinstall + fi + if test -s $pp_wrkdir/%post.$cmp; then + if test ! -s $pp_wrkdir/scripts/postinstall; then + echo "#!/bin/sh" > $pp_wrkdir/scripts/postinstall + chmod +x $pp_wrkdir/scripts/postinstall + fi + cat $pp_wrkdir/%post.$cmp >> $pp_wrkdir/scripts/postinstall + echo : >> $pp_wrkdir/scripts/postinstall + fi + if test -s $pp_wrkdir/%postup.$cmp; then + if test ! -s $pp_wrkdir/scripts/postupgrade; then + echo "#!/bin/sh" > $pp_wrkdir/scripts/postupgrade + chmod +x $pp_wrkdir/scripts/postupgrade + fi + cat $pp_wrkdir/%postup.$cmp >> $pp_wrkdir/scripts/postupgrade + echo : >> $pp_wrkdir/scripts/postupgrade + fi + # XXX - not supported + if test -s $pp_wrkdir/%preun.$cmp; then + if test ! -s $pp_wrkdir/scripts/preremove; then + echo "#!/bin/sh" > $pp_wrkdir/scripts/preremove + chmod +x $pp_wrkdir/scripts/preremove + fi + cat $pp_wrkdir/%preun.$cmp >> $pp_wrkdir/scripts/preremove + echo : >> $pp_wrkdir/scripts/preremove + fi + # XXX - not supported + if test -s $pp_wrkdir/%postun.$cmp; then + if test ! -s $pp_wrkdir/scripts/postremove; then + echo "#!/bin/sh" > $pp_wrkdir/scripts/postremove + chmod +x $pp_wrkdir/scripts/postremove + fi + cat $pp_wrkdir/%postun.$cmp >> $pp_wrkdir/scripts/postremove + echo : >> $pp_wrkdir/scripts/postremove + fi + done + if test "`echo $pp_wrkdir/scripts/*`" != "$pp_wrkdir/scripts/*"; then + # write scripts archive, scripts are mode 0755 uid/gid 0/0 + # resetting the owner and mode is not strictly required + ( + cd $pp_wrkdir/scripts || pp_error "Can't cd to $pp_wrkdir/scripts" + rm -f $pp_wrkdir/tmp.files.scripts + for s in *; do + echo "f 0755 0 0 - ./$s" >>$pp_wrkdir/tmp.files.scripts + done + find . -type f | /usr/bin/cpio -o | pp_macos_rewrite_cpio $pp_wrkdir/tmp.files.scripts | gzip -9f -c > $bundledir/Scripts + ) + fi + + # Write PackageInfo file + cat <<-. >$bundledir/PackageInfo + + + +. + if test -s $bundledir/Scripts; then + echo " " >>$bundledir/PackageInfo + for s in preflight postflight preinstall postinstall preupgrade postupgrade; do + if test -s "$pp_wrkdir/scripts/$s"; then + echo " <$s file=\"$s\"/>" >>$bundledir/PackageInfo + fi + done + echo " " >>$bundledir/PackageInfo + fi + cat <<-. >>$bundledir/PackageInfo + +. + + . $pp_wrkdir/%fixup + + # Create the bill-of-materials (Bom) + cat $filelists | pp_macos_files_bom | sort | + pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls + pp_macos_mkbom $pp_wrkdir/tmp.bomls $bundledir/Bom + + # Create the cpio payload + ( + cd $pp_destdir || pp_error "Can't cd to $pp_destdir" + awk '{ print "." $6 }' $filelists | sed 's:/$::' | sort | /usr/bin/cpio -o | pp_macos_rewrite_cpio $filelists | gzip -9f -c > $bundledir/Payload + ) + + # Copy installer plugins if any + if test -n "$pp_macos_installer_plugin"; then + if test ! -f "$pp_macos_installer_plugin/InstallerSections.plist"; then + pp_error "Missing InstallerSections.plist file in $pp_macos_installer_plugin" + fi + mkdir -p $pkgdir/Plugins + cp -R "$pp_macos_installer_plugin"/* $pkgdir/Plugins + fi + + test -d $pp_wrkdir/bom_stage && $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage + + # Create the flat package with xar (like pkgutil --flatten does) + # Note that --distribution is only supported by Mac OS X 10.6 and above + xar_flags="--compression=bzip2 --no-compress Scripts --no-compress Payload" + case $mac_version in + "10.5"*) ;; + *) xar_flags="$xar_flags --distribution";; + esac + (cd $pkgdir && /usr/bin/xar $xar_flags -cf "../$name-$version.pkg" *) +} + +pp_backend_macos_cleanup () { + : +} + +pp_backend_macos_names () { + case "$pp_macos_pkg_type" in + bundle) echo ${name}.pkg;; + flat) echo ${name}-${version}.pkg;; + *) pp_error "unsupported package type $pp_macos_pkg_type";; + esac +} + +pp_backend_macos_install_script () { + echo '#!/bin/sh' + typeset pkgname platform + + pkgname="`pp_backend_macos_names`" + platform="`pp_backend_macos_probe`" + pp_install_script_common + + cat <<. + test \$# -eq 0 && usage + op="\$1"; shift + + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo "$pp_components" + ;; + list-services) + test \$# -eq 0 || usage \$op + echo "$pp_services" + ;; + list-files) + test \$# -ge 1 || usage \$op + echo \${PP_PKGDESTDIR:-.}/"$pkgname" + ;; + install) + test \$# -ge 1 || usage \$op + vol=/Volumes/pp\$\$ + pkg=\$vol/${name}-${version}.pkg + hdiutil attach -readonly -mountpoint \$vol \ + \${PP_PKGDESTDIR:-.}/"$pkgname" + trap "hdiutil detach \$vol" 0 + installer -pkginfo -pkg \$pkg + installer -verbose -pkg \$pkg -target / + ;; + uninstall) + test \$# -ge 1 || usage \$op + # XXX + echo "Uninstall not implemented" >&2 + exit 1;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + # XXX + echo "\${op} not implemented" >&2 + ec=1 + done + exit \$ec + ;; + print-platform) + echo "$platform" + ;; + *) + usage;; + esac +. +} + +pp_backend_macos_init_svc_vars () { + pp_macos_start_services_after_install=true + pp_macos_service_name= + pp_macos_default_service_id_prefix="com.quest.rc." + pp_macos_service_id= + pp_macos_service_user= + pp_macos_service_group= + pp_macos_service_initgroups= + pp_macos_service_umask= + pp_macos_service_cwd= + pp_macos_service_nice= + pp_macos_svc_plist_file= +} + +pp_macos_launchd_plist () { + typeset svc svc_id + + svc="$1" + svc_id="$2" + + set -- $cmd + + if [ -n "$pp_macos_svc_plist_file" ]; then + echo "## Launchd plist file already defined at $pp_macos_svc_plist_file" + return + fi + + echo "## Generating the launchd plist file for $svc" + pp_macos_svc_plist_file="$pp_wrkdir/$svc.plist" + cat <<-. > $pp_macos_svc_plist_file + + + + + Label + $svc_id + ProgramArguments + +. + while test $# != 0; do + printf " $1\n" >> $pp_macos_svc_plist_file + shift + done + cat <<-. >> $pp_macos_svc_plist_file + + KeepAlive + +. + if test -n "$pp_macos_service_user"; then + printf " UserName\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_user\n" >> $pp_macos_svc_plist_file + fi + if test -n "$pp_macos_service_group"; then + printf " GroupName\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_group\n" >> $pp_macos_svc_plist_file + fi + if test -n "$pp_macos_service_initgroups"; then + printf " InitGroups\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_initgroups\n" >> $pp_macos_svc_plist_file + fi + if test -n "$pp_macos_service_umask"; then + printf " Umask\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_umask\n" >> $pp_macos_svc_plist_file + fi + if test -n "$pp_macos_service_cwd"; then + printf " WorkingDirectory\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_cwd\n" >> $pp_macos_svc_plist_file + fi + if test -n "$pp_macos_service_nice"; then + printf " Nice\n" >> $pp_macos_svc_plist_file + printf " $pp_macos_service_nice\n" >> $pp_macos_svc_plist_file + fi + cat <<-. >> $pp_macos_svc_plist_file + + +. +} + +pp_macos_add_service () { + typeset svc svc_id plist_file plist_dir + + pp_load_service_vars "$1" + svc=${pp_macos_service_name:-$1} + svc_id=${pp_macos_service_id:-$pp_macos_default_service_id_prefix$svc} + + #-- create a plist file for svc + pp_macos_launchd_plist "$svc" "$svc_id" + + #-- copy the plist file into place and add to %files + plist_dir="/Library/LaunchDaemons" + plist_file="$plist_dir/$svc_id.plist" + mkdir -p "$pp_destdir/$plist_dir" + cp "$pp_macos_svc_plist_file" "$pp_destdir/$plist_file" + pp_add_file_if_missing "$plist_file" + + #-- add code to start the service on install & upgrade + ${pp_macos_start_services_after_install} && <<-. >> $pp_wrkdir/%post.$svc + # start service '$svc' automatically after install + launchctl load "$plist_file" +. + ${pp_macos_start_services_after_install} && <<-. >> $pp_wrkdir/%postup.$svc + # start service '$svc' automatically after upgrade + # This is necessary if the service is new since the previous version. + # XXX: Does launchd automatically reload an service if its binary + # is replaced? + launchctl load "$plist_file" +. +} + +pp_backend_macos_probe () { + typeset name vers arch + case `sw_vers -productName` in + "Mac OS X") name="macos";; + *) name="unknown";; + esac + vers=`sw_vers -productVersion | sed -e 's/^\([^.]*\)\.\([^.]*\).*/\1\2/'` + arch=`arch` + echo "$name$vers-$arch" +} + +pp_backend_macos_vas_platforms () { + echo "osx" # XXX non-really sure what they do.. it should be "macos" +} +pp_backend_macos_function () { + case "$1" in + _pp_macos_search_unused) cat<<'.';; + # Find an unused value in the given path + # args: path attribute minid [maxid] + pp_tmp_val=$3 + while :; do + test $pp_tmp_val -ge ${4:-999999} && return 1 + /usr/bin/dscl . -search "$1" "$2" $pp_tmp_val | + grep . > /dev/null || break + pp_tmp_val=`expr $pp_tmp_val + 1` + done + echo $pp_tmp_val +. + pp_mkgroup:depends) echo _pp_macos_search_unused;; + pp_mkgroup) cat<<'.';; + set -e + /usr/bin/dscl . -read /Groups/"$1" >/dev/null 2>&1 && return + pp_tmp_gid=`_pp_macos_search_unused /Groups PrimaryGroupID 100` + /usr/bin/dscl . -create /Groups/"$1" + /usr/bin/dscl . -create /Groups/"$1" PrimaryGroupID $pp_tmp_gid + /usr/bin/dscl . -create /Groups/"$1" RealName "Group $1" + /usr/bin/dscl . -create /Groups/"$1" GroupMembership "" + /usr/bin/dscl . -create /Groups/"$1" Password '*' +. + pp_mkuser:depends) echo pp_mkgroup _pp_macos_search_unused;; + pp_mkuser) cat<<'.';; + set -e + /usr/bin/dscl . -read /Users/"$1" >/dev/null 2>&1 && return + pp_tmp_uid=`_pp_macos_search_unused /Users UniqueID 100` + pp_mkgroup "${2:-$1}" + pp_tmp_gid=`/usr/bin/dscl . -read /Groups/"${2:-$1}" \ + PrimaryGroupID | awk '{print $2}'` + /usr/bin/dscl . -create /Users/"$1" + /usr/bin/dscl . -create /Users/"$1" PrimaryGroupID $pp_tmp_gid + /usr/bin/dscl . -create /Users/"$1" NFSHomeDirectory \ + "${3:-/var/empty}" + /usr/bin/dscl . -create /Users/"$1" UserShell \ + "${4:-/usr/bin/false}" + /usr/bin/dscl . -create /Users/"$1" RealName "$1" + /usr/bin/dscl . -create /Users/"$1" UniqueID $pp_tmp_uid + /usr/bin/dscl . -create /Users/"$1" Password '*' +. + pp_havelib) cat<<'.';; + # (use otool -L to find dependent libraries) + for pp_tmp_dir in `echo "${3:+$3:}/usr/local/lib:/lib:/usr/lib" | + tr : ' '`; do + test -r "$pp_tmp_dir/lib$1{$2:+.$2}.dylib" && return 0 + done + return 1 +. + *) false;; + esac +} + +pp_platforms="$pp_platforms inst" + +pp_backend_inst_detect () { + case "$1" in + IRIX*) return 0;; + *) return 1;; + esac +} + +pp_backend_inst_init () { + pp_readlink_fn=pp_ls_readlink +} + +pp_backend_inst_create_idb() +{ + typeset t m o g f p st + + while read t m o g f p st; do + if test x"$o" = x"-"; then + o="root" + fi + if test x"$g" = x"-"; then + g="sys" + fi + case "$t" in + f) test x"$m" = x"-" && m=444 + echo "f 0$m $o $g $p $p $name.sw.base" + ;; + d) test x"$m" = x"-" && m=555 + echo "d 0$m $o $g $p $p $name.sw.base" + ;; + s) test x"$m" = x"-" && m=777 + test x"$m" = x"777" || + pp_warn "$p: invalid mode $m for symlink, should be 777 or -" + echo "l 0$m $o $g $p $p $name.sw.base symval($st)" + ;; + esac + done +} + +pp_backend_inst_create_spec() +{ + echo "product $name" + echo " id \"${summary}. Version: ${version}\"" + echo " image sw" + echo " id \"Software\"" + echo " version $version" + echo " order 9999" + echo " subsys base" + echo " id \"Base Software\"" + echo " replaces self" + echo " exp $name.sw.base" + echo " endsubsys" + echo " endimage" + echo "endproduct" +} + +pp_backend_inst () { + curdir=`pwd` + + cd "$pp_opt_wrkdir" + + # initialize + pp_inst_tardist=tardist + pp_inst_spec=${name}.spec + pp_inst_idb=${name}.idb + + rm -rf $pp_inst_tardist $pp_inst_spec $pp_inst_idb + mkdir -p $pp_inst_tardist + + # Create idb file + (for _cmp in $pp_components; do + cat %files.$_cmp | sort +4u -6 | pp_backend_inst_create_idb + done) >> $pp_inst_idb + + pp_backend_inst_create_spec >> $pp_inst_spec + + # Generate tardist + gendist -verbose -all -root / -source $pp_opt_destdir -idb $pp_inst_idb -spec $pp_inst_spec -dist $pp_inst_tardist $name + tar -cvf `pp_backend_inst_names` $pp_inst_tardist + + cd "$curdir" +} + +pp_backend_inst_cleanup () { + : +} + +pp_backend_inst_names () { + echo ${name}-${version}.tardist +} + +pp_backend_inst_install_script () { + : +} + +pp_backend_inst_function () { + echo false +} + +pp_backend_inst_init_svc_vars () { + : +} + +pp_backend_inst_probe () { + cpu=`hinv|sed -n '/^CPU/{s/000 /k /;s/^CPU: //;s/ Process.*//;s/^MIPS //;p;q;}'|tr A-Z a-z` + echo irix`uname -r`-$cpu +} + +pp_backend_inst_vas_platforms () { + echo "irix-65" +} + +pp_platforms="$pp_platforms null" + +pp_backend_null_detect () { + ! : +} + +pp_backend_null_init () { + : +} + + +pp_backend_null () { + : +} + +pp_backend_null_cleanup () { + : +} + +pp_backend_null_names () { + : +} + +pp_backend_null_install_script () { + : +} + +pp_backend_null_function () { + echo false +} + +pp_backend_null_init_svc_vars () { + : +} + +pp_backend_null_probe () { + echo unknown-unknown +} + +pp_backend_null_vas_platforms () { +: +} + +pp_platforms="$pp_platforms bsd" + +pp_bsd_munge_text () { + # Insert a leading space on each line, replace blank lines with a + #space followed by a full-stop. + test -z "$1" && pp_die "pp_bsd_munge_text requires a parameter" + echo ${1} | sed "s,^\(.*\)$, \1, " | sed "s,^[ \t]*$, .,g" +} + +pp_backend_bsd_detect () { + test x"$1" = x"FreeBSD" +} + +pp_backend_bsd_init () { + + # Get the OS revision + pp_bsd_detect_os + + # Get the arch (i386/amd64) + pp_bsd_detect_arch + + pp_bsd_name= + pp_bsd_version= + pp_bsd_origin= + pp_bsd_comment= + pp_bsd_arch= + pp_bsd_abi= + pp_bsd_www= + pp_bsd_maintainer= + pp_bsd_prefix="/usr/local/" + pp_bsd_desc= + pp_bsd_message= + + # pp_bsd_category must be in array format comma seperated + # pp_bsd_category=[security,network] + pp_bsd_category= + + # pp_bsd_licenselogic can be one of the following: single, and, or unset + pp_bsd_licenselogic= + + # pp_bsd_licenses must be in array format comma seperated + # pp_bsd_licenses=[GPLv2,MIT] + pp_bsd_licenses= + + # pp_bsd_annotations. These can be any key: value pair + # key must be seperated by a : + # keyvalue pairs must be comma seperated + # pp_bsd_annotations="repo_type: binary, somekey: somevalue" + # since all packages created by PolyPackage will be of type binary + # let's just set it now. + pp_bsd_annotations="repo_type: binary" + + pp_bsd_dbg_pkgname="debug" + pp_bsd_dev_pkgname="devel" + pp_bsd_doc_pkgname="doc" + + # Make sure any programs we require are installed + pp_bsd_check_required_programs + +} + +pp_bsd_cmp_full_name () { + typeset prefix + prefix="${pp_bsd_name:-$name}" + case "$1" in + run) echo "${prefix}" ;; + dbg) echo "${prefix}-${pp_bsd_dbg_pkgname}";; + dev) echo "${prefix}-${pp_bsd_dev_pkgname}";; + doc) echo "${prefix}-${pp_bsd_doc_pkgname}";; + *) pp_error "unknown component '$1'"; + esac +} + +pp_bsd_check_required_programs () { + local p needed notfound ok + needed= notfound= + + # list of programs FreeBSD needs in order to create a binary package + for prog in ${pp_bsd_required_programs:-"pkg"} + do + if which $prog 2>&1 > /dev/null; then + pp_debug "$prog: found" + else + pp_debug "$prog: not found" + case "$prog" in + pkg) p=pkg;; + *) pp_die "Unexpected pkg tool $prog";; + esac + notfound="$notfound $prod" + pp_contains "$needed" "$p" || needed="$needed $p" + fi + done + if [ -n "$notfound" ]; then + pp_error "cannot find these programs: $notfound" + pp_error "please install these packages: $needed" + fi +} + +pp_bsd_detect_os () { + typeset revision + + pp_bsd_os=`uname -s` + revision=`uname -r` + pp_bsd_os_rev=`echo $revision | awk -F '-' '{print $1}'` +} + +pp_bsd_detect_arch() { + pp_bsd_platform="`uname -m`" + case $pp_bsd_platform in + amd64) pp_bsd_platform_std=x86_64;; + i386) pp_bsd_platform_std=i386;; + *) pp_bsd_platform_std=unknown;; + esac +} + +pp_bsd_label () { + local label arg + label="$1"; shift + for arg + do + test -z "$arg" || echo "$label: $arg" + done +} + +pp_bsd_make_annotations () { + + test -z $1 && pp_die "pp_bsd_make_annotations requires a parameter" + manifest=$1 + + # Add annotations. These can be any key: value pair + # key must be seperated by a : + # key:value pairs must be comma seperated. + if test -n "$pp_bsd_annotations"; then + pp_debug "Processing annotations:" + pp_bsd_label "annotations" "{" >> $manifest + + SAVEIFS=$IFS + IFS=, + for annotate in $pp_bsd_annotations; do + # Remove any spaces at the start of the line + annotate=`echo $annotate | sed 's/^ *//'` + pp_debug " $annotate" + echo " $annotate" >> $manifest + done + IFS=$SAVEIFS + echo "}" >> $manifest + fi +} + +pp_bsd_make_depends() { + typeset package origin version + cmp=$1 + manifest=$2 + + if test -s $pp_wrkdir/%depend.${cmp}; then + echo "deps: {" >> $manifest + cat $pp_wrkdir/%depend.${cmp} | while read package origin version; do + if test x != x$package; then + pp_debug "Processing dependency: $package" + if test x != x$origin -a x != x$version; then + pp_debug " $package: {origin: \"$origin\", version: \"$version\"}" + echo " $package: {origin: \"$origin\", version: \"$version\"}" >> $manifest + else + pp_warn "Dependency $package is missing origin or version or both" + fi + fi + done + echo "}" >> $manifest + fi +} + +pp_bsd_make_messages () { + test -z $1 && pp_die "pp_bsd_make_messages requires a parameter" + manifest=$1 + + pp_debug "Processing messsages" + + # Empty messages: [ ] is OK in the manifest + pp_bsd_label "messages" "[" >> $manifest + # Look for a single message in the variable pp_bsd_message + if test -n "$pp_bsd_message"; then + echo " { message: \"`pp_bsd_munge_text "$pp_bsd_message"`\" }," >> $manifest + fi + local a=1 + # Look for messages in the variables pp_bsd_message_[1..n] + var="pp_bsd_messages_1" + while [ -n "${!var}" ]; do + echo " { message: \"`pp_bsd_munge_text "${!var}"`\" }," >> $manifest + a=`expr $a + 1` + var="pp_bsd_messages_$a" + done + echo "]" >> $manifest +} + +pp_bsd_make_manifest() { + local cmp manifest + + cmp="$1" + manifest="$2" + + package_name=`pp_bsd_cmp_full_name $cmp` + + # Required for pkg +MANIFEST + cat <<-. >> $manifest + name: "${package_name}" + version: "${pp_bsd_version:-$version}" + origin: "${pp_bsd_origin}" + www: "${pp_bsd_www}" + desc: "`pp_bsd_munge_text "${pp_bsd_desc:-$description}"`" + comment: "${pp_bsd_comment:-$summary}" + maintainer: "${pp_bsd_maintainer}" + prefix: "${pp_bsd_prefix}" +. + + # Optional, so if they are not included in the pkg-product.pp file then do not create the label + pp_bsd_label "categories" "${pp_bsd_categories}" >> $manifest + pp_bsd_label "arch" "${pp_bsd_arch}" >> $manifest + pp_bsd_label "abi" "${pp_bsd_abi}" >> $manifest + pp_bsd_label "licenselogic" "${pp_bsd_licenselogic}" >> $manifest + pp_bsd_label "licenses" "${pp_bsd_licenses}" >> $manifest + + pp_bsd_make_annotations $manifest + pp_bsd_make_depends $cmp $manifest + + pp_bsd_make_messages $manifest +} + +pp_bsd_fakeroot () { + if test -s $pp_wrkdir/fakeroot.save; then + fakeroot -i $pp_wrkdir/fakeroot.save -s $pp_wrkdir/fakeroot.save "$@" + else + fakeroot -s $pp_wrkdir/fakeroot.save "$@" + fi +} + +pp_bsd_make_data() { + # t = file type + # m = file mode + # o = file owner + # g = file group + # f = ? + # p = file path + # st = file link + # + # EXAMPLE: f 755 root httpd v /usr/bin/hello goodbye + # -> /usr/bin/hello: {uname: root, gname: httpd, perm: 755 } goodbye + typeset _l t m o g f p st datadir + cmp=$1 + datadir=$pp_wrkdir/`pp_bsd_cmp_full_name $cmp` + local path + + outfilelist="$pp_wrkdir/files.list.$cmp" + outdirslist="$pp_wrkdir/dirs.list.$cmp" + + pp_debug "Processing $pp_wrkdir/%file.${cmp}" + + echo "files: {" > $outfilelist + echo "directories: {" > $outdirslist + + cat $pp_wrkdir/%files.${cmp} | while read t m o g f p st; do + test x"$o" = x"-" && o="${pp_bsd_defattr_uid:-root}" + test x"$g" = x"-" && g="${pp_bsd_defattr_gid:-wheel}" + path=$p + case "$t" in + f) # Files + # For now just skip the file if it is volatile, we will need to remove it in the pre uninstall script + if [ x"$f" != x"v" ]; then + # If the directory doesn't exist where we are going to copy this file, then create it first + if [ ! -d `dirname "$datadir$path"` ]; then + pp_debug "creating directory `dirname "$datadir$path"`" + mkdir -p `dirname "$datadir$path"` + fi + + pp_debug "install -D $datadir -o $o -g $g -h sha256 -m ${m} -v $pp_destdir$p $datadir$path"; + pp_bsd_fakeroot install -D $datadir -o $o -g $g -h sha256 -m ${m} -v $pp_destdir$p $datadir$path; + echo " \"$path\": \"-\", \"$path\": {uname: $o, gname: $g, perm: ${m}}" >> $outfilelist; + else + pp_warn "file $f was marked as volatile, skipping" + fi; + ;; + d) # Directories + pp_debug "install -D $datadir -o $o -g $g -m ${m} -d -v $datadir$path"; + pp_bsd_fakeroot install -D $datadir -o $o -g $g -m ${m} -d -v $datadir$path; + echo " \"$path\": \"-\", \"$path\": {uname: $o, gname: $g, perm: ${m}}" >> $outdirslist; + ;; + s) # Symlinks + pp_debug "Found symlink: $datadir$path"; + # Remove leading / + rel_p=`echo $p | sed s,^/,,` + (cd $datadir; ln -sf $st $rel_p); + # Do we care if the file doesn't exist? Just symnlink it regardless and throw a warning? This will be important in the case + # where we depend on other packages to be installed and will be using the libs from that package. + if [ ! -e "$datadir$path" ]; then + pp_warn "$datadir$path does not exist" + fi + echo " \"$path\": \"$st\"" >> $outfilelist; + ;; + *) pp_error "Unsupported data file type: %t";; + esac + done + + echo "}" >> $outfilelist + echo "}" >> $outdirslist + cat $outfilelist >> $manifest + cat $outdirslist >> $manifest + + pp_debug "Finished processing $pp_wrkdir/%file.${cmp}" +} + +pp_bsd_makebsd() { + typeset cmp + typeset package_build_dir + local manifest postinstall preinstall preuninstall postuninstall preupgrade postupgrade + + cmp="$1" + + if test -z "$pp_bsd_platform"; then + pp_error "Unknown BSD architecture" + return 1 + fi + + _subname=`pp_bsd_cmp_full_name $cmp` + package_build_dir=$pp_wrkdir/$_subname + + manifest="$package_build_dir/+MANIFEST" + postinstall="$package_build_dir/+POST_INSTALL" + preinstall="$package_build_dir/+PRE_INSTALL" + preuninstall="$package_build_dir/+PRE_DEINSTALL" + postuninstall="$package_build_dir/+POST_DEINSTALL" + preupgrade="$package_build_dir/+PRE_UPGRADE" + postupgrade="$package_build_dir/+POST_UPGRADE" + + # Create package dir + mkdir -p $package_build_dir + + pp_bsd_make_manifest $cmp $manifest + pp_bsd_make_data $cmp + + pp_debug "Processing pre/post install scripts" + + if test -s $pp_wrkdir/%pre.$cmp; then + pp_debug "Found %pre.$cmp" + { + cat "$pp_wrkdir/%pre.$cmp" + } > $preinstall + pp_debug "Created $preinstall" + fi + + if test -s $pp_wrkdir/%post.$cmp; then + pp_debug "Found %post.$cmp" + { + echo "# Post install script for " + cat "$pp_wrkdir/%post.$cmp" + } > $postinstall + pp_debug "Created $postinstall" + fi + + pp_debug "Processing pre/post uninstall scripts" + + if test -s $pp_wrkdir/%preun.$cmp; then + pp_debug "Found %preun.$cmp" + { + echo "# Pre uninstall script for ${pp_bsd_name:-$name}" + cat "$pp_wrkdir/%preun.$cmp" + } > $preuninstall + pp_debug "Created pkg $preuninstall" + fi + + if test -s $pp_wrkdir/%postun.$cmp; then + pp_debug "Found %postun.$cmp" + { + echo "# Post uninstall script for ${pp_bsd_name:-$name}" + cat "$pp_wrkdir/%postun.$cmp" + } > $postuninstall + pp_debug "Created $postuninstall" + fi + + if test -s $pp_wrkdir/%preup.$cmp; then + pp_debug "Found %preup.$cmp" + { + echo "# Pre upgrade script for ${pp_bsd_name:-$name}" + cat "$pp_wrkdir/%preup.$cmp" + } > $preupgrade + pp_debug "Created pkg $preupgrade" + fi + + if test -s $pp_wrkdir/%postup.$cmp; then + pp_debug "Found %postup.$cmp" + { + echo "# Post upgrade script for ${pp_bsd_name:-$name}" + cat "$pp_wrkdir/%postup.$cmp" + } > $postupgrade + pp_debug "Created $postupgrade" + fi +} + +pp_backend_bsd() { + #get-files-dir-entries + #create-manifest + #create-preuninstall + #create-postinstall + #create-package + # + pp_bsd_handle_services + + for cmp in $pp_components + do + _subname=`pp_bsd_cmp_full_name $cmp` + pp_debug "Generating packaging specific files for $_subname" + pp_bsd_makebsd $cmp + done + + # call this to fixup any files before creating the actual packages + . $pp_wrkdir/%fixup + + for cmp in $pp_components + do + _subname=`pp_bsd_cmp_full_name $cmp` + package_build_dir=$pp_wrkdir/$_subname + # Build the actual packages now + pp_debug "Building FreeBSD $_subname" + pp_debug "Running package create command: pkg create -m $package_build_dir -r $pp_wrkdir/`pp_bsd_cmp_full_name $cmp` -o $pp_wrkdir" + pp_bsd_fakeroot pkg create -m $package_build_dir -r $pp_wrkdir/`pp_bsd_cmp_full_name $cmp` -o $pp_wrkdir -v + done + +} + +pp_bsd_name () { + typeset cmp="${1:-run}" + echo `pp_bsd_cmp_full_name $cmp`"-${pp_bsd_version:-$version}.txz" +} + +pp_backend_bsd_names () { + for cmp in $pp_components; do + echo `pp_bsd_cmp_full_name $cmp`"-${pp_bsd_version:-$version}.txz" + done +} + +pp_backend_bsd_cleanup () { + : +} + +pp_backend_bsd_probe () { + echo "${pp_bsd_os}-${pp_bsd_platform_std}" + echo "${pp_bsd_os}${pp_bsd_os_rev}-${pp_bsd_platform_std}" +} + + +pp_backend_bsd_vas_platforms() { + case "${pp_bsd_platform_std}" in + x86_64) echo "FreeBSD-x86_64.txz FreeBSD-i386.txz";; + i386) echo "FreeBSD-i386.txz";; + *) pp_die "unknown architecture $pp_bsd_platform_std";; + esac +} + + +pp_backend_bsd_install_script () { + typeset cmp _cmp_full_name + + echo "#!/bin/sh" + pp_install_script_common + + cat <<. + + cmp_to_pkgname () { + test x"\$*" = x"all" && set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo " $cmp) echo '`pp_bsd_cmp_full_name $cmp`';;" + done + + cat <<. + *) usage;; + esac + done + } + + cmp_to_pathname () { + test x"\$*" = x"all" && + set -- $pp_components + for cmp + do + case \$cmp in +. + for cmp in $pp_components; do + echo " $cmp) echo \${PP_PKGDESTDIR:-.}/'`pp_bsd_name $cmp`';;" + done + + cat <<. + *) usage;; + esac + done + } + + test \$# -eq 0 && usage + op="\$1"; shift + case "\$op" in + list-components) + test \$# -eq 0 || usage \$op + echo $pp_components + ;; + list-services) + test \$# -eq 0 || usage \$op + echo $pp_services + ;; + list-files) + test \$# -ge 1 || usage \$op + cmp_to_pathname "\$@" + ;; + install) + test \$# -ge 1 || usage \$op + pkg add \`cmp_to_pathname "\$@"\` + ;; + uninstall) + test \$# -ge 1 || usage \$op + pkg remove \`cmp_to_pkgname "\$@"\`; : + ;; + start|stop) + test \$# -ge 1 || usage \$op + ec=0 + for svc + do + /etc/rc.d/\$svc \$op || ec=1 + done + exit \$ec + ;; + print-platform) + test \$# -eq 0 || usage \$op + echo "${pp_bsd_os}-${pp_bsd_platform}" + echo '`pp_backend_bsd_probe`' + ;; + *) + usage + ;; + esac +. +} +pp_backend_bsd_init_svc_vars () { + svc_process_regex="${pp_bsd_svc_process_regex}" + svc_description=$summary + svc_init_prefix="${pp_bsd_prefix}" + svc_init_filename="${pp_bsd_svc_init_filename}" # == $svc + svc_init_filepath="${pp_bsd_svc_init_filepath}" # == $pp_bsd_prefix/etc/rc.d/ by default + + bsd_svc_before="${pp_bsd_svc_before}" + bsd_svc_require="${pp_bsd_svc_require}" + bsd_svc_keyword="${pp_bsd_svc_keyword}" + +} + +pp_bsd_service_make_init_info() { + local svc=$1 + local out=$2 + cat <<-. >$out + #!/bin/sh + # + # FreeBSD Script Header Detail + # + # PROVIDE: $svc +. + + if [ ! -z "$bsd_svc_before" ]; then + cat <<-. >>$out + # BEFORE: $bsd_svc_before +. + fi + + if [ ! -z "$bsd_svc_require" ]; then + cat <<-. >>$out + # REQUIRE: $bsd_svc_require +. + fi + + if [ ! -z "$bsd_svc_keyword" ]; then + cat <<-. >>$out + # KEYWORD: $bsd_svc_keyword +. + fi + + cat <<-'.' >>$out + ### END INIT INFO + +. + +} + +pp_bsd_service_make_init_set_vars() { + local svc=$1 + local out=$2 + + svc_command="$cmd" + svc_pre_command="${pp_bsd_svc_pre_command}" + svc_pre_command_args="${pp_bsd_svc_pre_command_args}" + + local run_command="${svc_pre_command:-$svc_command}" + local run_pre_command_args="${svc_pre_command:+"${svc_pre_command_args}"}" + local run_post_command_args="${svc_command:+"${svc_command_args}"}" + local run_post_command_without_pre_command="${svc_pre_command:+"$svc_command"}" + local run_post_command_with_args="${run_post_command_without_pre_command}${run_post_command_args:+" $run_post_command_args"}" + local run_command_args="${run_pre_command_args:+"$run_pre_command_args"}${run_post_command_with_args:+" $run_post_command_with_args"}" + + # https://www.freebsd.org/cgi/man.cgi?query=rc.subr + cat <<-. >>$out + # FreeBSD rc subroutines + . /etc/rc.subr + + # 0: Not running. + # 1: Running normally + # 2: Running, but no PID file. + # 3: Running, but PID file doesn't match running processes. + # If the PID file is found but no process, the file is removed and 0 is returned. + DAEMON_RUNNING=0 + + name="$svc" + desc="${svc_description:-\$name}" + + start_cmd="\${name}_start" + status_cmd="\${name}_status" + stop_cmd="\${name}_stop" + + # Loads any variables set in /etc/rc.conf.d/\$name + load_rc_config \$name + + : \${${svc}_enable:="Yes"} + : \${${svc}_pidfile:="${pidfile:-/var/run/\${name\}.pid}"} + : \${${svc}_args:="$run_command_args"} + : \${${svc}_cmd:="$run_command"} + + # Regex used in the pp_check_daemon_running ps check to find our running processe(s) + # If it's set in /etc/rc.conf.d/\$name this will be used first + # then check if pp_bsd_svc_process_regex is set, finally set to the \${name}_cmd + # When set to \${name}_cmd pp_check_daemon_running will only find the parent process pid + : \${${svc}_process_regex:="${pp_bsd_svc_process_regex:-${cmd}}"} + + # For additional information about the rc.subr see: + # https://www.freebsd.org/cgi/man.cgi?query=rc.subr + rcvar="\${name}_enable" + + pidfile=\${${svc}_pidfile} + + command="\$${svc}_cmd" + command_args="\$${svc}_args" + +. + +} + +pp_bsd_service_make_init_body() { + local svc=$1 + local out=$2 + + cat<<-'.' >>$out + pp_exec_cmd() { (eval $command $command_args) } + + pp_success_msg () { echo ${1:+"$*:"} OK; } + pp_failure_msg () { echo ${1:+"$*:"} FAIL; } + pp_warning_msg () { echo ${1:+"$*:"} WARNING; } + + #-- prints a status message + pp_msg () { echo -n "$*: "; } + + # Kills process $1. + # First a sigterm, then wait up to 10 seconds + # before issuing a sig kill. + pp_signal () { + # Kill the processes the nice way first + if [ -z "$1" ]; then + # No pid file. Use the list from pp_check_daemon_running + kill $PROCESSES 2>/dev/null + else + kill $1 2>/dev/null + fi + count=1 + + #Check to make sure the processes died, if not kill them the hard way + while [ $count -le 10 ]; do + sleep 1 + pp_check_daemon_running + if [ $DAEMON_RUNNING -eq 0 ]; then + break; + fi + if [ $count -eq 1 ]; then + # We tried killing the pid associated to the pidfile, now try the ones we found from pp_check_daemon_running + kill $PROCESSES 2>/dev/null + fi + count=`expr $count + 1` + done + # Check one more time to make sure we got them all + if [ $DAEMON_RUNNING -ne 0 ]; then + # These guys don't want to go down the nice way, now just kill them + kill -9 $PROCESSES 2>/dev/null + fi + # make sure to remove the pidfile + rm -f $pidfile + } + + # Check to see if the daemon process is running + # Sets the PROCESSES global variable with all pids that match + # ${name}_process_regex + # Sets global variable DAEMON_RUNNING to one of the following: + # 0: Not Running + # 1: Running normally + # 2: Running, but no PID file + # 3: Running, but PID file doesn't match running processes. + # + pp_check_daemon_running() + { + DAEMON_RUNNING=0 +. + cat<<-. >>$out + + PROCESSES="\`eval ps -axo pid,args | grep "\${${svc}_process_regex}" | grep -v grep | awk '{print \$1}'\`" + +. + cat<<-'.' >>$out + if [ -f $pidfile ]; then + if [ ! -z "$PROCESSES" ]; then + PARENT_PID=`cat $pidfile 2>/dev/null` + PPROCESS=`echo $PROCESSES | grep "${PARENT_PID:-"NOPID"}"` + if [ $? -eq 0 ]; then + DAEMON_RUNNING=1 + else + DAEMON_RUNNING=3 + fi + else + rm -r $pidfile + fi + else + if [ ! -z "$PROCESSES" ]; then + DAEMON_RUNNING=2 + fi + fi + } +. + cat <<-. >>$out + + # starts the service + ${svc}_start() +. + cat <<-'.' >>$out + { + pp_msg "Starting ${desc}" + pp_check_daemon_running + + if [ $DAEMON_RUNNING -eq 0 ]; then + pp_exec_cmd + RETVAL=$? + if [ $RETVAL -eq 0 ]; then + pp_success_msg + else + pp_failure_msg "cannot start" + fi + else + if [ $DAEMON_RUNNING -eq 1 ]; then + pp_success_msg "${name} appears to be running already" + else + pp_warning_msg "${name} is already running but without a pid file" + fi + fi + } + +. + + cat <<-. >>$out + # stops the service + ${svc}_stop() +. + + cat <<-'.' >>$out + { + pp_msg "Stopping ${desc}" + pp_check_daemon_running + + if [ $DAEMON_RUNNING -ne 0 ]; then + pp_signal `cat $pidfile 2>/dev/null` + if [ -n "$pidfile" ]; then + loop_cnt=1 + while [ -e ${pidfile} ]; do + sleep 1 + loop_cnt=`expr $loop_cnt + 1` + if [ $loop_cnt -eq 10 ]; then + break + fi + done + fi + rm -f $pidfile + + pp_success_msg + else + pp_failure_msg + echo -n "$desc does not appear to be running." + echo + fi + } +. + + cat <<-. >>$out + # prints information about the service status + # returns: + # 0=running + # 1=Not running + # 2=Running without pidfile + # 3=Running with pid that doesn't match pidfile + ${svc}_status() +. + + cat <<-'.' >>$out + { + pp_msg "Checking ${desc}" + pp_check_daemon_running + if [ $DAEMON_RUNNING -eq 1 ]; then + pp_success_msg "PID $PARENT_PID: running" + return 0 + else + if [ $DAEMON_RUNNING -eq 0 ]; then + pp_failure_msg "not running" + return 1 + elif [ $DAEMON_RUNNING -eq 2 ]; then + pp_warning_msg "running without a pid file" + return 2 + else + pp_warning_msg "running but pid file doesn't match running processe()" + return 3 + fi + fi + } + + run_rc_command "$1" +. +} + +pp_bsd_service_make_init_script () { + local svc=${svc_init_filename:-$1} + local script="${svc_init_filepath:-"${svc_init_prefix}/etc/rc.d"}/$svc" + script=`echo $script | sed 's://*:/:g'` + local out=$pp_destdir$script + + pp_add_file_if_missing $script run 755 || return 0 + + pp_bsd_service_make_init_info "$svc" "$out" + pp_bsd_service_make_init_set_vars "$svc" "$out" + pp_bsd_service_make_init_body "$svc" "$out" + + chmod 755 $out + +} + +pp_bsd_handle_services () { + if test -n "$pp_services"; then + for svc in $pp_services; do + pp_load_service_vars $svc + # Append some code to %post to install the svc TODO: Figure out why/what + pp_bsd_service_make_init_script $svc + # prepend some code to %preun to uninstall svc TODO: Figure out why/what + done + fi +} +pp_backend_bsd_function() { + case "$1" in + pp_mkgroup) cat<<'.';; + /usr/sbin/pw group show "$1" 2>/dev/null && return 0 + /usr/sbin/pw group add "$1" +. + pp_mkuser:depends) echo pp_mkgroup;; + pp_mkuser) cat<<'.';; + #Check if user exists + /usr/sbin/pw user show "$1" 2>/dev/null && return 0 + pp_mkgroup "${2:-$1}" || return 1 + echo "Creating user $1" + /usr/sbin/pw user add \ + -n "$1" \ + -d "${3:-/nonexistent}" \ + -g "${2:-$1}" \ + -s "${4:-/bin/false}" +. + pp_havelib) cat<<'.';; + for pp_tmp_dir in `echo "/usr/local/lib:/usr/lib:/lib${3:+:$3}" | tr : ' '`; do + test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0 + done + return 1 +. + *) false;; + esac +} + + +quest_require_vas () { + typeset v d + + if test $# -ne 1; then + return + fi + set -- `echo "$1" | tr . ' '` 0 0 0 + + for d + do + echo $d | grep '^[0-9][0-9]*$' > /dev/null || + pp_error "quest_require_vas: Bad version component $d" + done + + test $# -lt 4 && + pp_error "quest_require_vas: missing version number" + + case "$1.$2.$3.$4" in + *.0.0.0) v=$1;; + *.*.0.0) v=$1.$2;; + *.*.*.0) v=$1.$2.$3;; + *) v=$1.$2.$3.$4;; + esac + + cat <<. + if test -x /opt/quest/bin/vastool && + /opt/quest/bin/vastool -v | + awk 'NR == 1 {print \$4}' | + awk -F. '{ if (\$1<$1 || \$1==$1 && ( \ + \$2<$2 || \$2==$2 && ( \ + \$3<$3 || \$2==$3 && ( \ + \$4<$4 )))) exit(1); }' + then + exit 0 + else + echo "Requires VAS $v or later" + exit 1 + fi +. +} +pp_main ${1+"$@"} diff --git a/utsudo-0.0.2/src_ori/Makefile.in b/utsudo-0.0.2/src_ori/Makefile.in new file mode 100644 index 0000000..ab2c3a2 --- /dev/null +++ b/utsudo-0.0.2/src_ori/Makefile.in @@ -0,0 +1,759 @@ +# +# SPDX-License-Identifier: ISC +# +# Copyright (c) 2010-2018 Todd C. Miller +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# @configure_input@ +# + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +devdir = @devdir@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +incdir = $(top_srcdir)/include +rundir = @rundir@ +cross_compiling = @CROSS_COMPILING@ + +# Compiler & tools to use +CC = @CC@ +LIBTOOL = @LIBTOOL@ +SED = @SED@ + +# Our install program supports extra flags... +INSTALL = $(SHELL) $(top_srcdir)/install-sh -c +INSTALL_OWNER = -o $(install_uid) -g $(install_gid) +INSTALL_BACKUP = @INSTALL_BACKUP@ + +# Libraries +LT_LIBS = $(top_builddir)/lib/util/libutsudo_util.la +LT_DEBUG_O = $(top_builddir)/lib/util/debug_fatal_lbuf.o +LIBS = @LIBS@ @SUDO_LIBS@ @GETGROUPS_LIB@ @NET_LIBS@ $(LT_LIBS) + +# C preprocessor defines +CPPDEFS = -D_PATH_SUDO_CONF=\"$(sysconfdir)/utsudo.conf\" \ + -DLOCALEDIR=\"$(localedir)\" + +# C preprocessor flags +CPPFLAGS = -I$(incdir) -I$(top_builddir) -I. -I$(srcdir) -I$(top_srcdir) \ + $(CPPDEFS) @CPPFLAGS@ + +# Usually -O and/or -g +CFLAGS = @CFLAGS@ + +# Flags to pass to the link stage +LDFLAGS = @LDFLAGS@ +SUDO_LDFLAGS = $(LDFLAGS) @SUDO_LDFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ + +# Flags to pass to libtool +LTFLAGS = --tag=disable-static + +# Address sanitizer flags +ASAN_CFLAGS = @ASAN_CFLAGS@ +ASAN_LDFLAGS = @ASAN_LDFLAGS@ + +# PIE flags +PIE_CFLAGS = @PIE_CFLAGS@ +PIE_LDFLAGS = @PIE_LDFLAGS@ + +# Stack smashing protection flags +SSP_CFLAGS = @SSP_CFLAGS@ +SSP_LDFLAGS = @SSP_LDFLAGS@ + +# cppcheck options, usually set in the top-level Makefile +CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64 + +# splint options, usually set in the top-level Makefile +SPLINT_OPTS = -D__restrict= -checks + +# PVS-studio options +PVS_CFG = $(top_srcdir)/PVS-Studio.cfg +PVS_IGNORE = 'V707,V011,V002,V536' +PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) + +# Where to install things... +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +sysconfdir = @sysconfdir@ +libexecdir = @libexecdir@ +datarootdir = @datarootdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +noexecfile = @NOEXECFILE@ +noexecdir = @NOEXECDIR@ +tmpfiles_d = @TMPFILES_D@ + +# User and group ids the installed files should be "owned" by +install_uid = 0 +install_gid = 0 + +# File mode to use for shared libraries +shlib_mode = @SHLIB_MODE@ + +# Optional init script and rc.d link +INIT_DIR=@INIT_DIR@ +INIT_SCRIPT=@INIT_SCRIPT@ +RC_LINK=@RC_LINK@ + +TEST_PROGS = check_ttyname @CHECK_NOEXEC@ +TEST_LIBS = @LIBS@ $(LT_LIBS) +TEST_LDFLAGS = @LDFLAGS@ + +#### End of system configuration section. #### + +SHELL = @SHELL@ + +PROGS = @PROGS@ + +OBJS = conversation.o copy_file.o env_hooks.o exec.o exec_common.o \ + exec_monitor.o exec_nopty.o exec_pty.o get_pty.o hooks.o \ + limits.o load_plugins.o net_ifs.o parse_args.o preserve_fds.o \ + signal.o utsudo.o sudo_edit.o tcsetpgrp_nobg.o tgetpass.o \ + ttyname.o utmp.o @SUDO_OBJS@ + +IOBJS = $(OBJS:.o=.i) sesh.i + +POBJS = $(IOBJS:.i=.plog) + +SESH_OBJS = copy_file.o exec_common.o sesh.o $(LT_DEBUG_O) + +CHECK_NOEXEC_OBJS = check_noexec.o exec_common.o $(LT_DEBUG_O) + +CHECK_TTYNAME_OBJS = check_ttyname.o ttyname.o $(LT_DEBUG_O) + +LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ + +VERSION = @PACKAGE_VERSION@ + +all: $(PROGS) + +depend: + $(top_srcdir)/mkdep.pl --srcdir=$(top_srcdir) \ + --builddir=`pwd`/$(top_builddir) src/Makefile.in + cd $(top_builddir) && ./config.status --file src/Makefile + +Makefile: $(srcdir)/Makefile.in + cd $(top_builddir) && ./config.status --file src/Makefile + +./sudo_usage.h: $(srcdir)/sudo_usage.h.in + cd $(top_builddir) && ./config.status --file src/sudo_usage.h + +.SUFFIXES: .c .h .i .lo .o .plog + +.c.o: + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.lo: + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $< + +.c.i: + $(CC) -E -o $@ $(CPPFLAGS) $< + +.i.plog: + ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@ + +utsudo: $(OBJS) $(LT_LIBS) @STATIC_SUDOERS@ + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(OBJS) $(SUDO_LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @STATIC_SUDOERS@ $(LT_DEBUG_O) + +# We can't use -module here since you cannot preload a module on Darwin +libsudo_noexec.la: sudo_noexec.lo + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LDFLAGS) $(LT_LDFLAGS) $(SSP_LDFLAGS) @LIBDL@ -o $@ sudo_noexec.lo -avoid-version -rpath $(noexecdir) -shrext .so + +# Some hackery is required to install this as sudo_noexec, not libsudo_noexec +sudo_noexec.la: libsudo_noexec.la + sed 's/libsudo_noexec/sudo_noexec/g' libsudo_noexec.la > sudo_noexec.la + if test -f .libs/libsudo_noexec.lai; then sed 's/libsudo_noexec/sudo_noexec/g' .libs/libsudo_noexec.lai > .libs/sudo_noexec.lai; fi + cp -p .libs/libsudo_noexec.so .libs/sudo_noexec.so + +sesh: $(SESH_OBJS) $(LT_LIBS) + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(SESH_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + +check_noexec: $(CHECK_NOEXEC_OBJS) $(top_builddir)/lib/util/libutsudo_util.la sudo_noexec.la + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_NOEXEC_OBJS) $(TEST_LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LIBS) + +check_ttyname: $(CHECK_TTYNAME_OBJS) $(top_builddir)/lib/util/libutsudo_util.la + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_TTYNAME_OBJS) $(TEST_LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LIBS) + +pre-install: + +install: install-binaries install-rc @INSTALL_NOEXEC@ + +install-dirs: + # We only create the rc.d dir when installing to the actual system dir + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) \ + $(DESTDIR)$(libexecdir)/utsudo $(DESTDIR)$(noexecdir) + if test -n "$(INIT_SCRIPT)"; then \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(INIT_DIR); \ + if test -z "$(DESTDIR)"; then \ + $(SHELL) $(top_srcdir)/mkinstalldirs \ + `echo $(RC_LINK) | $(SED) 's,/[^/]*$$,,'`; \ + fi; \ + elif test -n "$(tmpfiles_d)"; then \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(tmpfiles_d); \ + fi + +install-rc: install-dirs + # We only create the rc.d link when installing to the actual system dir + if [ -n "$(INIT_SCRIPT)" ]; then \ + $(INSTALL) $(INSTALL_OWNER) -m 0755 $(top_builddir)/init.d/$(INIT_SCRIPT) $(DESTDIR)$(INIT_DIR)/utsudo; \ + if test -z "$(DESTDIR)"; then \ + rm -f $(RC_LINK); \ + ln -s $(INIT_DIR)/utsudo $(RC_LINK); \ + fi; \ + elif test -n "$(tmpfiles_d)"; then \ + $(INSTALL) $(INSTALL_OWNER) -m 0644 $(top_builddir)/init.d/utsudo.conf $(DESTDIR)$(tmpfiles_d)/utsudo.conf; \ + fi + +install-binaries: install-dirs $(PROGS) + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 04755 utsudo $(DESTDIR)$(bindir)/utsudo + rm -f $(DESTDIR)$(bindir)/utsudoedit + ln -s utsudo $(DESTDIR)$(bindir)/utsudoedit + if [ -f sesh ]; then \ + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m 0755 sesh $(DESTDIR)$(libexecdir)/utsudo/sesh; \ + fi + +install-doc: + +install-includes: + +install-noexec: install-dirs sudo_noexec.la + INSTALL_BACKUP='$(INSTALL_BACKUP)' $(LIBTOOL) $(LTFLAGS) --mode=install $(INSTALL) $(INSTALL_OWNER) -m $(shlib_mode) sudo_noexec.la $(DESTDIR)$(noexecdir) + +install-plugin: + +uninstall: + -$(LIBTOOL) $(LTFLAGS) --mode=uninstall rm -f $(DESTDIR)$(noexecdir)/sudo_noexec.la + -rm -f $(DESTDIR)$(bindir)/utsudo \ + $(DESTDIR)$(bindir)/utsudoedit \ + $(DESTDIR)$(libexecdir)/utsudo/sesh \ + $(DESTDIR)/usr/lib/tmpfiles.d/utsudo.conf + -test -z "$(INSTALL_BACKUP)" || \ + rm -f $(DESTDIR)$(bindir)/utsudo$(INSTALL_BACKUP) \ + $(DESTDIR)$(libexecdir)/utsudo/sesh$(INSTALL_BACKUP) \ + $(DESTDIR)$(noexecdir)/sudo_noexec.so$(INSTALL_BACKUP) + -test -z "$(INIT_SCRIPT)" || \ + rm -f $(DESTDIR)$(RC_LINK) $(DESTDIR)$(INIT_DIR)/utsudo + +splint: + splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) -I. -I$(srcdir) -I$(top_srcdir) $(srcdir)/*.c + +cppcheck: + cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) -I. -I$(srcdir) -I$(top_srcdir) $(srcdir)/*.c + +pvs-log-files: $(POBJS) + +pvs-studio: $(POBJS) + plog-converter $(PVS_LOG_OPTS) $(POBJS) + +check: $(TEST_PROGS) + @if test X"$(cross_compiling)" != X"yes"; then \ + MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \ + MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \ + ./check_ttyname; \ + if test X"@CHECK_NOEXEC@" != X""; then \ + ./check_noexec .libs/$(noexecfile); \ + fi; \ + fi + +clean: + -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f $(PROGS) $(TEST_PROGS) \ + *.lo *.o *.la *.a *.i *.plog stamp-* core *.core core.* nohup.out + +mostlyclean: clean + +distclean: clean + -rm -rf Makefile .libs sudo_usage.h + +clobber: distclean + +realclean: distclean + rm -f TAGS tags + +cleandir: realclean + +# *Not* auto-generated to avoid building with ASAN +sudo_noexec.lo: $(srcdir)/sudo_noexec.c $(incdir)/sudo_compat.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_noexec.c + +# Autogenerated dependencies, do not modify +check_noexec.o: $(srcdir)/regress/noexec/check_noexec.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/sudo_exec.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/noexec/check_noexec.c +check_noexec.i: $(srcdir)/regress/noexec/check_noexec.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_util.h \ + $(srcdir)/sudo_exec.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_noexec.plog: check_noexec.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/noexec/check_noexec.c --i-file $< --output-file $@ +check_ttyname.o: $(srcdir)/regress/ttyname/check_ttyname.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/ttyname/check_ttyname.c +check_ttyname.i: $(srcdir)/regress/ttyname/check_ttyname.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_ttyname.plog: check_ttyname.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/ttyname/check_ttyname.c --i-file $< --output-file $@ +conversation.o: $(srcdir)/conversation.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/conversation.c +conversation.i: $(srcdir)/conversation.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +conversation.plog: conversation.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/conversation.c --i-file $< --output-file $@ +copy_file.o: $(srcdir)/copy_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/copy_file.c +copy_file.i: $(srcdir)/copy_file.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +copy_file.plog: copy_file.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/copy_file.c --i-file $< --output-file $@ +env_hooks.o: $(srcdir)/env_hooks.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/env_hooks.c +env_hooks.i: $(srcdir)/env_hooks.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +env_hooks.plog: env_hooks.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/env_hooks.c --i-file $< --output-file $@ +exec.o: $(srcdir)/exec.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h $(srcdir)/sudo_plugin_int.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exec.c +exec.i: $(srcdir)/exec.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h $(srcdir)/sudo_plugin_int.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exec.plog: exec.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec.c --i-file $< --output-file $@ +exec_common.o: $(srcdir)/exec_common.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exec_common.c +exec_common.i: $(srcdir)/exec_common.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exec_common.plog: exec_common.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_common.c --i-file $< --output-file $@ +exec_monitor.o: $(srcdir)/exec_monitor.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exec_monitor.c +exec_monitor.i: $(srcdir)/exec_monitor.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exec_monitor.plog: exec_monitor.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_monitor.c --i-file $< --output-file $@ +exec_nopty.o: $(srcdir)/exec_nopty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exec_nopty.c +exec_nopty.i: $(srcdir)/exec_nopty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exec_nopty.plog: exec_nopty.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_nopty.c --i-file $< --output-file $@ +exec_pty.o: $(srcdir)/exec_pty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/exec_pty.c +exec_pty.i: $(srcdir)/exec_pty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_event.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +exec_pty.plog: exec_pty.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/exec_pty.c --i-file $< --output-file $@ +get_pty.o: $(srcdir)/get_pty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/get_pty.c +get_pty.i: $(srcdir)/get_pty.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +get_pty.plog: get_pty.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/get_pty.c --i-file $< --output-file $@ +hooks.o: $(srcdir)/hooks.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/hooks.c +hooks.i: $(srcdir)/hooks.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +hooks.plog: hooks.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/hooks.c --i-file $< --output-file $@ +limits.o: $(srcdir)/limits.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/limits.c +limits.i: $(srcdir)/limits.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +limits.plog: limits.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/limits.c --i-file $< --output-file $@ +load_plugins.o: $(srcdir)/load_plugins.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/load_plugins.c +load_plugins.i: $(srcdir)/load_plugins.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +load_plugins.plog: load_plugins.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/load_plugins.c --i-file $< --output-file $@ +net_ifs.o: $(srcdir)/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/net_ifs.c +net_ifs.i: $(srcdir)/net_ifs.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +net_ifs.plog: net_ifs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/net_ifs.c --i-file $< --output-file $@ +openbsd.o: $(srcdir)/openbsd.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/openbsd.c +openbsd.i: $(srcdir)/openbsd.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +openbsd.plog: openbsd.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/openbsd.c --i-file $< --output-file $@ +parse_args.o: $(srcdir)/parse_args.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h ./sudo_usage.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/parse_args.c +parse_args.i: $(srcdir)/parse_args.c $(incdir)/compat/getopt.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_lbuf.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h ./sudo_usage.h + $(CC) -E -o $@ $(CPPFLAGS) $< +parse_args.plog: parse_args.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/parse_args.c --i-file $< --output-file $@ +preload.o: $(srcdir)/preload.c $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/preload.c +preload.i: $(srcdir)/preload.c $(incdir)/sudo_compat.h $(incdir)/sudo_dso.h \ + $(incdir)/sudo_plugin.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +preload.plog: preload.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/preload.c --i-file $< --output-file $@ +preserve_fds.o: $(srcdir)/preserve_fds.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/preserve_fds.c +preserve_fds.i: $(srcdir)/preserve_fds.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +preserve_fds.plog: preserve_fds.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/preserve_fds.c --i-file $< --output-file $@ +selinux.o: $(srcdir)/selinux.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/selinux.c +selinux.i: $(srcdir)/selinux.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +selinux.plog: selinux.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/selinux.c --i-file $< --output-file $@ +sesh.o: $(srcdir)/sesh.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sesh.c +sesh.i: $(srcdir)/sesh.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sesh.plog: sesh.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sesh.c --i-file $< --output-file $@ +signal.o: $(srcdir)/signal.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_exec.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/signal.c +signal.i: $(srcdir)/signal.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_exec.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +signal.plog: signal.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/signal.c --i-file $< --output-file $@ +solaris.o: $(srcdir)/solaris.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/solaris.c +solaris.i: $(srcdir)/solaris.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_dso.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +solaris.plog: solaris.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/solaris.c --i-file $< --output-file $@ +utsudo.o: $(srcdir)/utsudo.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h ./sudo_usage.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/utsudo.c +utsudo.i: $(srcdir)/utsudo.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(srcdir)/sudo_plugin_int.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h ./sudo_usage.h + $(CC) -E -o $@ $(CPPFLAGS) $< +utsudo.plog: sudo.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/utsudo.c --i-file $< --output-file $@ +sudo_edit.o: $(srcdir)/sudo_edit.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_edit.c +sudo_edit.i: $(srcdir)/sudo_edit.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +sudo_edit.plog: sudo_edit.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/sudo_edit.c --i-file $< --output-file $@ +tcsetpgrp_nobg.o: $(srcdir)/tcsetpgrp_nobg.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tcsetpgrp_nobg.c +tcsetpgrp_nobg.i: $(srcdir)/tcsetpgrp_nobg.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tcsetpgrp_nobg.plog: tcsetpgrp_nobg.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tcsetpgrp_nobg.c --i-file $< --output-file $@ +tgetpass.o: $(srcdir)/tgetpass.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/tgetpass.c +tgetpass.i: $(srcdir)/tgetpass.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \ + $(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/utsudo.h \ + $(top_builddir)/config.h $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +tgetpass.plog: tgetpass.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/tgetpass.c --i-file $< --output-file $@ +ttyname.o: $(srcdir)/ttyname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/ttyname.c +ttyname.i: $(srcdir)/ttyname.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_conf.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/utsudo.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +ttyname.plog: ttyname.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/ttyname.c --i-file $< --output-file $@ +utmp.o: $(srcdir)/utmp.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/utmp.c +utmp.i: $(srcdir)/utmp.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \ + $(srcdir)/utsudo.h $(srcdir)/sudo_exec.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(CC) -E -o $@ $(CPPFLAGS) $< +utmp.plog: utmp.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/utmp.c --i-file $< --output-file $@ diff --git a/utsudo-0.0.2/src_ori/conversation.c b/utsudo-0.0.2/src_ori/conversation.c new file mode 100644 index 0000000..dbf4301 --- /dev/null +++ b/utsudo-0.0.2/src_ori/conversation.c @@ -0,0 +1,176 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2005, 2007-2012 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "utsudo.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +extern int tgetpass_flags; /* XXX */ + +/* + * Sudo conversation function. + */ +int +sudo_conversation(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback) +{ + char *pass; + int fd, n; + const int conv_debug_instance = sudo_debug_get_active_instance(); + + sudo_debug_set_active_instance(sudo_debug_instance); + + for (n = 0; n < num_msgs; n++) { + const struct sudo_conv_message *msg = &msgs[n]; + int flags = tgetpass_flags; + FILE *fp = stdout; + + switch (msg->msg_type & 0xff) { + case SUDO_CONV_PROMPT_ECHO_ON: + SET(flags, TGP_ECHO); + goto read_pass; + case SUDO_CONV_PROMPT_MASK: + SET(flags, TGP_MASK); + /* FALLTHROUGH */ + case SUDO_CONV_PROMPT_ECHO_OFF: + if (ISSET(msg->msg_type, SUDO_CONV_PROMPT_ECHO_OK)) + SET(flags, TGP_NOECHO_TRY); + read_pass: + /* Read the password unless interrupted. */ + pass = tgetpass(msg->msg, msg->timeout, flags, callback); + if (pass == NULL) + goto err; + replies[n].reply = strdup(pass); + if (replies[n].reply == NULL) { + sudo_fatalx_nodebug(U_("%s: %s"), "sudo_conversation", + U_("unable to allocate memory")); + } + memset_s(pass, SUDO_CONV_REPL_MAX, 0, strlen(pass)); + break; + case SUDO_CONV_ERROR_MSG: + fp = stderr; + /* FALLTHROUGH */ + case SUDO_CONV_INFO_MSG: + if (msg->msg != NULL) { + if (ISSET(msg->msg_type, SUDO_CONV_PREFER_TTY)) { + /* Try writing to /dev/tty first. */ + if ((fd = open(_PATH_TTY, O_WRONLY)) != -1) { + ssize_t nwritten = + write(fd, msg->msg, strlen(msg->msg)); + close(fd); + if (nwritten != -1) + break; + } + } + if (fputs(msg->msg, fp) == EOF) + goto err; + } + break; + default: + goto err; + } + } + + sudo_debug_set_active_instance(conv_debug_instance); + return 0; + +err: + /* Zero and free allocated memory and return an error. */ + if (replies != 0) { + do { + struct sudo_conv_reply *repl = &replies[n]; + if (repl->reply == NULL) + continue; + memset_s(repl->reply, SUDO_CONV_REPL_MAX, 0, strlen(repl->reply)); + free(repl->reply); + repl->reply = NULL; + } while (n--); + } + + sudo_debug_set_active_instance(conv_debug_instance); + return -1; +} + +int +sudo_conversation_1_7(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[]) +{ + return sudo_conversation(num_msgs, msgs, replies, NULL); +} + +int +sudo_conversation_printf(int msg_type, const char *fmt, ...) +{ + FILE *fp = stdout; + FILE *ttyfp = NULL; + va_list ap; + int len; + const int conv_debug_instance = sudo_debug_get_active_instance(); + + sudo_debug_set_active_instance(sudo_debug_instance); + + if (ISSET(msg_type, SUDO_CONV_PREFER_TTY)) { + /* Try writing to /dev/tty first. */ + ttyfp = fopen(_PATH_TTY, "w"); + } + + switch (msg_type & 0xff) { + case SUDO_CONV_ERROR_MSG: + fp = stderr; + /* FALLTHROUGH */ + case SUDO_CONV_INFO_MSG: + va_start(ap, fmt); + len = vfprintf(ttyfp ? ttyfp : fp, fmt, ap); + va_end(ap); + break; + default: + len = -1; + errno = EINVAL; + break; + } + + if (ttyfp != NULL) + fclose(ttyfp); + + sudo_debug_set_active_instance(conv_debug_instance); + return len; +} diff --git a/utsudo-0.0.2/src_ori/copy_file.c b/utsudo-0.0.2/src_ori/copy_file.c new file mode 100644 index 0000000..907256f --- /dev/null +++ b/utsudo-0.0.2/src_ori/copy_file.c @@ -0,0 +1,159 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include + +#include +#include +#include +#include + +#include "utsudo.h" + +/* + * Extend the given fd to the specified size in bytes. + * We do this to allocate disk space up-front before overwriting + * the original file with the temporary. Otherwise, we could + * we run out of disk space after truncating the original file. + */ +static int +sudo_extend_file(int fd, const char *name, off_t new_size) +{ + off_t old_size, size; + ssize_t nwritten; + char zeroes[BUFSIZ] = { '\0' }; + debug_decl(sudo_extend_file, SUDO_DEBUG_UTIL); + + if ((old_size = lseek(fd, 0, SEEK_END)) == -1) { + sudo_warn("lseek"); + debug_return_int(-1); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: extending %s from %lld to %lld", + __func__, name, (long long)old_size, (long long)new_size); + + for (size = old_size; size < new_size; size += nwritten) { + size_t len = new_size - size; + if (len > sizeof(zeroes)) + len = sizeof(zeroes); + nwritten = write(fd, zeroes, len); + if (nwritten == -1) { + int serrno = errno; + if (ftruncate(fd, old_size) == -1) { + sudo_debug_printf( + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to truncate %s to %lld", name, (long long)old_size); + } + errno = serrno; + debug_return_int(-1); + } + } + if (lseek(fd, 0, SEEK_SET) == -1) { + sudo_warn("lseek"); + debug_return_int(-1); + } + + debug_return_int(0); +} + +/* + * Copy the contents of src_fd into dst_fd. + * Returns 0 on success or -1 on error. + */ +int +sudo_copy_file(const char *src, int src_fd, off_t src_len, const char *dst, + int dst_fd, off_t dst_len) +{ + char buf[BUFSIZ]; + ssize_t nwritten, nread; + debug_decl(sudo_copy_file, SUDO_DEBUG_UTIL); + + /* Extend the file to the new size if larger before copying. */ + if (dst_len > 0 && src_len > dst_len) { + if (sudo_extend_file(dst_fd, dst, src_len) == -1) + goto write_error; + } + + /* Overwrite the old file with the new contents. */ + while ((nread = read(src_fd, buf, sizeof(buf))) > 0) { + ssize_t off = 0; + do { + nwritten = write(dst_fd, buf + off, nread - off); + if (nwritten == -1) + goto write_error; + off += nwritten; + } while (nread > off); + } + if (nread == 0) { + /* success, read to EOF */ + if (src_len < dst_len) { + /* We don't open with O_TRUNC so must truncate manually. */ + if (ftruncate(dst_fd, src_len) == -1) { + sudo_debug_printf( + SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to truncate %s to %lld", dst, (long long)src_len); + goto write_error; + } + } + debug_return_int(0); + } else if (nread < 0) { + sudo_warn(U_("unable to read from %s"), src); + debug_return_int(-1); + } else { +write_error: + sudo_warn(U_("unable to write to %s"), dst); + debug_return_int(-1); + } +} + +bool +sudo_check_temp_file(int tfd, const char *tfile, uid_t uid, struct stat *sb) +{ + struct stat sbuf; + debug_decl(sudo_check_temp_file, SUDO_DEBUG_UTIL); + + if (sb == NULL) + sb = &sbuf; + + if (fstat(tfd, sb) == -1) { + sudo_warn(U_("unable to stat %s"), tfile); + debug_return_bool(false); + } + if (!S_ISREG(sb->st_mode)) { + sudo_warnx(U_("%s: not a regular file"), tfile); + debug_return_bool(false); + } + if ((sb->st_mode & ALLPERMS) != (S_IRUSR|S_IWUSR)) { + sudo_warnx(U_("%s: bad file mode: 0%o"), tfile, + (unsigned int)(sb->st_mode & ALLPERMS)); + debug_return_bool(false); + } + if (sb->st_uid != uid) { + sudo_warnx(U_("%s is owned by uid %u, should be %u"), + tfile, (unsigned int)sb->st_uid, (unsigned int)uid); + debug_return_bool(false); + } + debug_return_bool(true); +} diff --git a/utsudo-0.0.2/src_ori/debug_fatal_lbuf.c b/utsudo-0.0.2/src_ori/debug_fatal_lbuf.c new file mode 100644 index 0000000..d066a9f --- /dev/null +++ b/utsudo-0.0.2/src_ori/debug_fatal_lbuf.c @@ -0,0 +1,492 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define DEFAULT_TEXT_DOMAIN "sudo" +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_plugin.h" +#include "sudo_debug.h" +#include "sudo_conf.h" +#include "sudo_util.h" + +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include "sudo_queue.h" +#include "sudo_lbuf.h" + + +#ifndef HAVE_GETADDRINFO +# include "compat/getaddrinfo.h" +#endif + + +void warning(const char *errstr, const char *fmt, va_list ap); + +/****************************** lbuf.c **********************************/ + +bool sudo_lbuf_expand(struct sudo_lbuf *lbuf, int extra); + +/* + * Parse the format and append strings, only %s and %% escapes are supported. + */ +bool +sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) +{ + int len, saved_len = lbuf->len; + bool ret = false; + va_list ap; + char *s; + debug_decl(sudo_lbuf_append, SUDO_DEBUG_UTIL) + + if (sudo_lbuf_error(lbuf)) + debug_return_bool(false); + + va_start(ap, fmt); + while (*fmt != '\0') { + if (fmt[0] == '%' && fmt[1] == 's') { + if ((s = va_arg(ap, char *)) == NULL) + s = "(NULL)"; + len = strlen(s); + if (!sudo_lbuf_expand(lbuf, len)) + goto done; + memcpy(lbuf->buf + lbuf->len, s, len); + lbuf->len += len; + fmt += 2; + continue; + } + if (!sudo_lbuf_expand(lbuf, 1)) + goto done; + lbuf->buf[lbuf->len++] = *fmt++; + } + ret = true; + +done: + if (!ret) + lbuf->len = saved_len; + if (lbuf->size != 0) + lbuf->buf[lbuf->len] = '\0'; + va_end(ap); + + debug_return_bool(ret); +} + +/* XXX - check output function return value */ +static void +sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len) +{ + char *cp, save; + int i, have, contlen = 0; + int indent = lbuf->indent; + bool is_comment = false; + debug_decl(sudo_lbuf_println, SUDO_DEBUG_UTIL) + + /* Comment lines don't use continuation and only indent is for "# " */ + if (line[0] == '#' && isblank((unsigned char)line[1])) { + is_comment = true; + indent = 2; + } + if (lbuf->continuation != NULL && !is_comment) + contlen = strlen(lbuf->continuation); + + /* + * Print the buffer, splitting the line as needed on a word + * boundary. + */ + cp = line; + have = lbuf->cols; + while (cp != NULL && *cp != '\0') { + char *ep = NULL; + int need = len - (int)(cp - line); + + if (need > have) { + have -= contlen; /* subtract for continuation char */ + if ((ep = memrchr(cp, ' ', have)) == NULL) + ep = memchr(cp + have, ' ', need - have); + if (ep != NULL) + need = (int)(ep - cp); + } + if (cp != line) { + if (is_comment) { + lbuf->output("# "); + } else { + /* indent continued lines */ + /* XXX - build up string instead? */ + for (i = 0; i < indent; i++) + lbuf->output(" "); + } + } + /* NUL-terminate cp for the output function and restore afterwards */ + save = cp[need]; + cp[need] = '\0'; + lbuf->output(cp); + cp[need] = save; + cp = ep; + + /* + * If there is more to print, reset have, incremement cp past + * the whitespace, and print a line continuaton char if needed. + */ + if (cp != NULL) { + have = lbuf->cols - indent; + ep = line + len; + while (cp < ep && isblank((unsigned char)*cp)) { + cp++; + } + if (contlen) + lbuf->output(lbuf->continuation); + } + lbuf->output("\n"); + } + + debug_return; +} + +bool +sudo_lbuf_expand(struct sudo_lbuf *lbuf, int extra) +{ + debug_decl(sudo_lbuf_expand, SUDO_DEBUG_UTIL) + + if (lbuf->len + extra + 1 >= lbuf->size) { + char *new_buf; + int new_size = lbuf->size; + + do { + new_size += 256; + } while (lbuf->len + extra + 1 >= new_size); + if ((new_buf = realloc(lbuf->buf, new_size)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + lbuf->error = 1; + debug_return_bool(false); + } + lbuf->buf = new_buf; + lbuf->size = new_size; + } + debug_return_bool(true); +} + + + +/**************************************************************************/ +/****************************** fata.c **********************************/ + +static bool (*sudo_warn_setlocale)(bool, int *); +static bool (*sudo_warn_setlocale_prev)(bool, int *); + +struct sudo_fatal_callback { + SLIST_ENTRY(sudo_fatal_callback) entries; + void (*func)(void); +}; +SLIST_HEAD(sudo_fatal_callback_list, sudo_fatal_callback); +static struct sudo_fatal_callback_list callbacks = SLIST_HEAD_INITIALIZER(&callbacks); + +sudo_conv_t sudo_warn_conversation; + + void +do_cleanup(void) +{ + struct sudo_fatal_callback *cb; + + /* Run callbacks, removing them from the list as we go. */ + while ((cb = SLIST_FIRST(&callbacks)) != NULL) { + SLIST_REMOVE_HEAD(&callbacks, entries); + cb->func(); + free(cb); + } +} + +void +sudo_fatal_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(strerror(errno), fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_fatalx_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(NULL, fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_warn_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(strerror(errno), fmt, ap); + va_end(ap); +} + +void +sudo_warnx_nodebug_v1(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + warning(NULL, fmt, ap); + va_end(ap); +} + +void +sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(gai_strerror(errnum), fmt, ap); + va_end(ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + warning(gai_strerror(errnum), fmt, ap); + va_end(ap); +} + +void +sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) +{ + warning(strerror(errno), fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) +{ + warning(NULL, fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) +{ + warning(strerror(errno), fmt, ap); +} + +void +sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) +{ + warning(NULL, fmt, ap); +} + +void +sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) +{ + warning(gai_strerror(errnum), fmt, ap); + do_cleanup(); + exit(EXIT_FAILURE); +} + +void +sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) +{ + warning(gai_strerror(errnum), fmt, ap); +} + +void +warning(const char *errstr, const char *fmt, va_list ap) +{ + int cookie; + + /* Set user locale if setter was specified. */ + if (sudo_warn_setlocale != NULL) + sudo_warn_setlocale(false, &cookie); + + if (sudo_warn_conversation != NULL) { + struct sudo_conv_message msgs[6]; + char static_buf[1024], *buf = static_buf; + int nmsgs = 0; + + /* Use conversation function. */ + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = getprogname(); + if (fmt != NULL) { + va_list ap2; + int buflen; + + /* Use static buffer if possible, else dynamic. */ + va_copy(ap2, ap); + buflen = vsnprintf(static_buf, sizeof(static_buf), fmt, ap2); + va_end(ap2); + if (buflen >= ssizeof(static_buf)) { + buf = malloc(++buflen); + if (buf != NULL) + (void)vsnprintf(buf, buflen, fmt, ap); + else + buf = static_buf; + } + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = ": "; + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = buf; + } + if (errstr != NULL) { + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = ": "; + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = errstr; + } + msgs[nmsgs].msg_type = SUDO_CONV_ERROR_MSG; + msgs[nmsgs++].msg = "\n"; + sudo_warn_conversation(nmsgs, msgs, NULL, NULL); + if (buf != static_buf) + free(buf); + } else { + /* Write to the standard error. */ + fputs(getprogname(), stderr); + if (fmt != NULL) { + fputs(": ", stderr); + vfprintf(stderr, fmt, ap); + } + if (errstr != NULL) { + fputs(": ", stderr); + fputs(errstr, stderr); + } + putc('\n', stderr); + } + + /* Restore old locale as needed. */ + if (sudo_warn_setlocale != NULL) + sudo_warn_setlocale(true, &cookie); +} + +/**************************************************************************/ +/*************************** sudo_debug.c *******************************/ + +/* Support up to 10 instances. */ +#define SUDO_DEBUG_INSTANCE_MAX 10 +static struct sudo_debug_instance *sudo_debug_instances[SUDO_DEBUG_INSTANCE_MAX]; +static int sudo_debug_last_instance = -1; +SLIST_HEAD(sudo_debug_output_list, sudo_debug_output); + +/* Default instance index to use for common utility functions. */ +int sudo_debug_active_instance = -1; + +struct sudo_debug_output { + SLIST_ENTRY(sudo_debug_output) entries; + char *filename; + int *settings; + int fd; +}; + +struct sudo_debug_instance { + char *program; + const char *const *subsystems; + const unsigned int *subsystem_ids; + unsigned int max_subsystem; + struct sudo_debug_output_list outputs; +}; + +void +sudo_debug_vprintf2_v1(const char *func, const char *file, int lineno, int level, + const char *fmt, va_list ap) +{ + int buflen, pri, saved_errno = errno; + unsigned int subsys; + char static_buf[1024], *buf = static_buf; + struct sudo_debug_instance *instance; + struct sudo_debug_output *output; + debug_decl_func(sudo_debug_vprintf2); + + if (sudo_debug_active_instance == -1) + goto out; + + /* Extract priority and subsystem from level. */ + pri = SUDO_DEBUG_PRI(level); + subsys = SUDO_DEBUG_SUBSYS(level); + + /* Find matching instance. */ + if (sudo_debug_active_instance > sudo_debug_last_instance) { + sudo_warnx_nodebug("%s: invalid instance ID %d, max %d", + __func__, sudo_debug_active_instance, sudo_debug_last_instance); + goto out; + } + instance = sudo_debug_instances[sudo_debug_active_instance]; + if (instance == NULL) { + sudo_warnx_nodebug("%s: unregistered instance index %d", __func__, + sudo_debug_active_instance); + goto out; + } + + SLIST_FOREACH(output, &instance->outputs, entries) { + /* Make sure we want debug info at this level. */ + if (subsys <= instance->max_subsystem && output->settings[subsys] >= pri) { + va_list ap2; + + /* Operate on a copy of ap to support multiple outputs. */ + va_copy(ap2, ap); + buflen = fmt ? vsnprintf(static_buf, sizeof(static_buf), fmt, ap2) : 0; + va_end(ap2); + if (buflen >= ssizeof(static_buf)) { + va_list ap3; + + /* Not enough room in static buf, allocate dynamically. */ + va_copy(ap3, ap); + buflen = vasprintf(&buf, fmt, ap3); + va_end(ap3); + } + if (buflen != -1) { + int errcode = ISSET(level, SUDO_DEBUG_ERRNO) ? saved_errno : 0; + if (ISSET(level, SUDO_DEBUG_LINENO)) + sudo_debug_write2(output->fd, func, file, lineno, buf, buflen, errcode); + else + sudo_debug_write2(output->fd, NULL, NULL, 0, buf, buflen, errcode); + if (buf != static_buf) { + free(buf); + buf = static_buf; + } + } + } + } +out: + errno = saved_errno; +} + + +void +sudo_debug_printf2_v1(const char *func, const char *file, int lineno, int level, + const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + sudo_debug_vprintf2(func, file, lineno, level, fmt, ap); + va_end(ap); +} + +/**************************************************************************/ diff --git a/utsudo-0.0.2/src_ori/env_hooks.c b/utsudo-0.0.2/src_ori/env_hooks.c new file mode 100644 index 0000000..6023a1c --- /dev/null +++ b/utsudo-0.0.2/src_ori/env_hooks.c @@ -0,0 +1,299 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010, 2012-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "utsudo.h" +#include "sudo_plugin.h" +#include "sudo_dso.h" + +extern char **environ; /* global environment pointer */ +static char **priv_environ; /* private environment pointer */ + +/* + * NOTE: we don't use dlsym() to find the libc getenv() + * since this may allocate memory on some systems (glibc) + * which leads to a hang if malloc() calls getenv (jemalloc). + */ +char * +getenv_unhooked(const char *name) +{ + char **ep, *val = NULL; + size_t namelen = 0; + + /* For BSD compatibility, treat '=' in name like end of string. */ + while (name[namelen] != '\0' && name[namelen] != '=') + namelen++; + for (ep = environ; *ep != NULL; ep++) { + if (strncmp(*ep, name, namelen) == 0 && (*ep)[namelen] == '=') { + val = *ep + namelen + 1; + break; + } + } + return val; +} + +__dso_public char * +getenv(const char *name) +{ + char *val = NULL; + + switch (process_hooks_getenv(name, &val)) { + case SUDO_HOOK_RET_STOP: + return val; + case SUDO_HOOK_RET_ERROR: + return NULL; + default: + return getenv_unhooked(name); + } +} + +static int +rpl_putenv(PUTENV_CONST char *string) +{ + char **ep; + size_t len; + bool found = false; + + /* Look for existing entry. */ + len = (strchr(string, '=') - string) + 1; + for (ep = environ; *ep != NULL; ep++) { + if (strncmp(string, *ep, len) == 0) { + *ep = (char *)string; + found = true; + break; + } + } + /* Prune out duplicate variables. */ + if (found) { + while (*ep != NULL) { + if (strncmp(string, *ep, len) == 0) { + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + } else { + ep++; + } + } + } + + /* Append at the end if not already found. */ + if (!found) { + size_t env_len = (size_t)(ep - environ); + char **envp = reallocarray(priv_environ, env_len + 2, sizeof(char *)); + if (envp == NULL) + return -1; + if (environ != priv_environ) + memcpy(envp, environ, env_len * sizeof(char *)); + envp[env_len++] = (char *)string; + envp[env_len] = NULL; + priv_environ = environ = envp; + } + return 0; +} + +typedef int (*sudo_fn_putenv_t)(PUTENV_CONST char *); + +static int +putenv_unhooked(PUTENV_CONST char *string) +{ + sudo_fn_putenv_t fn; + + fn = (sudo_fn_putenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "putenv"); + if (fn != NULL) + return fn(string); + return rpl_putenv(string); +} + +__dso_public int +putenv(PUTENV_CONST char *string) +{ + switch (process_hooks_putenv((char *)string)) { + case SUDO_HOOK_RET_STOP: + return 0; + case SUDO_HOOK_RET_ERROR: + return -1; + default: + return putenv_unhooked(string); + } +} + +static int +rpl_setenv(const char *var, const char *val, int overwrite) +{ + char *envstr, *dst; + const char *src; + size_t esize; + + if (!var || *var == '\0') { + errno = EINVAL; + return -1; + } + + /* + * POSIX says a var name with '=' is an error but BSD + * just ignores the '=' and anything after it. + */ + for (src = var; *src != '\0' && *src != '='; src++) + continue; + esize = (size_t)(src - var) + 2; + if (val) { + esize += strlen(val); /* glibc treats a NULL val as "" */ + } + + /* Allocate and fill in envstr. */ + if ((envstr = malloc(esize)) == NULL) + return -1; + for (src = var, dst = envstr; *src != '\0' && *src != '=';) + *dst++ = *src++; + *dst++ = '='; + if (val) { + for (src = val; *src != '\0';) + *dst++ = *src++; + } + *dst = '\0'; + + if (!overwrite && getenv(var) != NULL) { + free(envstr); + return 0; + } + if (rpl_putenv(envstr) == -1) { + free(envstr); + return -1; + } + return 0; +} + +typedef int (*sudo_fn_setenv_t)(const char *, const char *, int); + +static int +setenv_unhooked(const char *var, const char *val, int overwrite) +{ + sudo_fn_setenv_t fn; + + fn = (sudo_fn_setenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "setenv"); + if (fn != NULL) + return fn(var, val, overwrite); + return rpl_setenv(var, val, overwrite); +} + +__dso_public int +setenv(const char *var, const char *val, int overwrite) +{ + switch (process_hooks_setenv(var, val, overwrite)) { + case SUDO_HOOK_RET_STOP: + return 0; + case SUDO_HOOK_RET_ERROR: + return -1; + default: + return setenv_unhooked(var, val, overwrite); + } +} + +static int +rpl_unsetenv(const char *var) +{ + char **ep = environ; + size_t len; + + if (var == NULL || *var == '\0' || strchr(var, '=') != NULL) { + errno = EINVAL; + return -1; + } + + len = strlen(var); + while (*ep != NULL) { + if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') { + /* Found it; shift remainder + NULL over by one. */ + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; + /* Keep going, could be multiple instances of the var. */ + } else { + ep++; + } + } + return 0; +} + +#ifdef UNSETENV_VOID +typedef void (*sudo_fn_unsetenv_t)(const char *); +#else +typedef int (*sudo_fn_unsetenv_t)(const char *); +#endif + +static int +unsetenv_unhooked(const char *var) +{ + int ret = 0; + sudo_fn_unsetenv_t fn; + + fn = (sudo_fn_unsetenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "unsetenv"); + if (fn != NULL) { +# ifdef UNSETENV_VOID + fn(var); +# else + ret = fn(var); +# endif + } else { + ret = rpl_unsetenv(var); + } + return ret; +} + +#ifdef UNSETENV_VOID +__dso_public void +#else +__dso_public int +#endif +unsetenv(const char *var) +{ + int ret; + + switch (process_hooks_unsetenv(var)) { + case SUDO_HOOK_RET_STOP: + ret = 0; + break; + case SUDO_HOOK_RET_ERROR: + ret = -1; + break; + default: + ret = unsetenv_unhooked(var); + break; + } +#ifndef UNSETENV_VOID + return ret; +#endif +} diff --git a/utsudo-0.0.2/src_ori/exec.c b/utsudo-0.0.2/src_ori/exec.c new file mode 100644 index 0000000..a23d5d1 --- /dev/null +++ b/utsudo-0.0.2/src_ori/exec.c @@ -0,0 +1,434 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#ifdef HAVE_LOGIN_CAP_H +# include +# ifndef LOGIN_SETENV +# define LOGIN_SETENV 0 +# endif +#endif +#ifdef HAVE_PROJECT_H +# include +# include +#endif + +#include "utsudo.h" +#include "sudo_exec.h" +#include "sudo_event.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +/* + * Setup the execution environment immediately prior to the call to execve(). + * Group setup is performed by policy_init_session(), called earlier. + * Returns true on success and false on failure. + */ +static bool +exec_setup(struct command_details *details) +{ + bool ret = false; + debug_decl(exec_setup, SUDO_DEBUG_EXEC) + + if (details->pw != NULL) { +#ifdef HAVE_PROJECT_H + set_project(details->pw); +#endif +#ifdef HAVE_PRIV_SET + if (details->privs != NULL) { + if (setppriv(PRIV_SET, PRIV_INHERITABLE, details->privs) != 0) { + sudo_warn("unable to set privileges"); + goto done; + } + } + if (details->limitprivs != NULL) { + if (setppriv(PRIV_SET, PRIV_LIMIT, details->limitprivs) != 0) { + sudo_warn("unable to set limit privileges"); + goto done; + } + } else if (details->privs != NULL) { + if (setppriv(PRIV_SET, PRIV_LIMIT, details->privs) != 0) { + sudo_warn("unable to set limit privileges"); + goto done; + } + } +#endif /* HAVE_PRIV_SET */ + +#ifdef HAVE_GETUSERATTR + if (aix_prep_user(details->pw->pw_name, details->tty) != 0) { + /* error message displayed by aix_prep_user */ + goto done; + } +#endif +#ifdef HAVE_LOGIN_CAP_H + if (details->login_class) { + int flags; + login_cap_t *lc; + + /* + * We only use setusercontext() to set the nice value, rlimits + * and umask unless this is a login shell (sudo -i). + */ + lc = login_getclass((char *)details->login_class); + if (!lc) { + sudo_warnx(U_("unknown login class %s"), details->login_class); + errno = ENOENT; + goto done; + } + if (ISSET(details->flags, CD_LOGIN_SHELL)) { + /* Set everything except user, group and login name. */ + flags = LOGIN_SETALL; + CLR(flags, LOGIN_SETGROUP|LOGIN_SETLOGIN|LOGIN_SETUSER|LOGIN_SETENV|LOGIN_SETPATH); + } else { + flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY|LOGIN_SETUMASK; + } + if (setusercontext(lc, details->pw, details->pw->pw_uid, flags)) { + sudo_warn(U_("unable to set user context")); + if (details->pw->pw_uid != ROOT_UID) + goto done; + } + } +#endif /* HAVE_LOGIN_CAP_H */ + } + + if (ISSET(details->flags, CD_SET_GROUPS)) { + /* set_user_groups() prints error message on failure. */ + if (!set_user_groups(details)) + goto done; + } + + if (ISSET(details->flags, CD_SET_PRIORITY)) { + if (setpriority(PRIO_PROCESS, 0, details->priority) != 0) { + sudo_warn(U_("unable to set process priority")); + goto done; + } + } + + /* Policy may override umask in PAM or login.conf. */ + if (ISSET(details->flags, CD_OVERRIDE_UMASK)) + (void) umask(details->umask); + + if (details->chroot) { + if (chroot(details->chroot) != 0 || chdir("/") != 0) { + sudo_warn(U_("unable to change root to %s"), details->chroot); + goto done; + } + } + + /* + * Unlimit the number of processes since Linux's setuid() will + * return EAGAIN if RLIMIT_NPROC would be exceeded by the uid switch. + */ + unlimit_nproc(); + +#if defined(HAVE_SETRESUID) + if (setresuid(details->uid, details->euid, details->euid) != 0) { + sudo_warn(U_("unable to change to runas uid (%u, %u)"), + (unsigned int)details->uid, (unsigned int)details->euid); + goto done; + } +#elif defined(HAVE_SETREUID) + if (setreuid(details->uid, details->euid) != 0) { + sudo_warn(U_("unable to change to runas uid (%u, %u)"), + (unsigned int)details->uid, (unsigned int)details->euid); + goto done; + } +#else + /* Cannot support real user-ID that is different from effective user-ID. */ + if (setuid(details->euid) != 0) { + sudo_warn(U_("unable to change to runas uid (%u, %u)"), + (unsigned int)details->euid, (unsigned int)details->euid); + goto done; + } +#endif /* !HAVE_SETRESUID && !HAVE_SETREUID */ + + /* Restore previous value of RLIMIT_NPROC. */ + restore_nproc(); + + /* + * Only change cwd if we have chroot()ed or the policy modules + * specifies a different cwd. Must be done after uid change. + */ + if (details->cwd != NULL) { + if (details->chroot || user_details.cwd == NULL || + strcmp(details->cwd, user_details.cwd) != 0) { + /* Note: cwd is relative to the new root, if any. */ + if (chdir(details->cwd) != 0) { + sudo_warn(U_("unable to change directory to %s"), details->cwd); + goto done; + } + } + } + + ret = true; + +done: + debug_return_bool(ret); +} + +/* + * Setup the execution environment and execute the command. + * If SELinux is enabled, run the command via sesh, otherwise + * execute it directly. + * If the exec fails, cstat is filled in with the value of errno. + */ +void +exec_cmnd(struct command_details *details, int errfd) +{ + debug_decl(exec_cmnd, SUDO_DEBUG_EXEC) + + restore_signals(); + if (exec_setup(details) == true) { + /* headed for execve() */ + if (details->closefrom >= 0) { + int fd, maxfd; + unsigned char *debug_fds; + + /* Preserve debug fds and error pipe as needed. */ + maxfd = sudo_debug_get_fds(&debug_fds); + for (fd = 0; fd <= maxfd; fd++) { + if (sudo_isset(debug_fds, fd)) + add_preserved_fd(&details->preserved_fds, fd); + } + if (errfd != -1) + add_preserved_fd(&details->preserved_fds, errfd); + + /* Close all fds except those explicitly preserved. */ + closefrom_except(details->closefrom, &details->preserved_fds); + } +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + selinux_execve(details->execfd, details->command, details->argv, + details->envp, ISSET(details->flags, CD_NOEXEC)); + } else +#endif + { + sudo_execve(details->execfd, details->command, details->argv, + details->envp, ISSET(details->flags, CD_NOEXEC)); + } + } + sudo_debug_printf(SUDO_DEBUG_ERROR, "unable to exec %s: %s", + details->command, strerror(errno)); + debug_return; +} + +/* + * Check for caught signals sent to sudo before command execution. + * Also suspends the process if SIGTSTP was caught. + * Returns true if we should terminate, else false. + */ +bool +sudo_terminated(struct command_status *cstat) +{ + int signo; + bool sigtstp = false; + debug_decl(sudo_terminated, SUDO_DEBUG_EXEC) + + for (signo = 0; signo < NSIG; signo++) { + if (signal_pending(signo)) { + switch (signo) { + case SIGCHLD: + /* Ignore. */ + break; + case SIGTSTP: + /* Suspend below if not terminated. */ + sigtstp = true; + break; + default: + /* Terminal signal, do not exec command. */ + cstat->type = CMD_WSTATUS; + cstat->val = signo + 128; + debug_return_bool(true); + break; + } + } + } + if (sigtstp) { + struct sigaction sa; + sigset_t set, oset; + + /* Send SIGTSTP to ourselves, unblocking it if needed. */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + if (sudo_sigaction(SIGTSTP, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGTSTP); + sigemptyset(&set); + sigaddset(&set, SIGTSTP); + sigprocmask(SIG_UNBLOCK, &set, &oset); + if (kill(getpid(), SIGTSTP) != 0) + sudo_warn("kill(%d, SIGTSTP)", (int)getpid()); + sigprocmask(SIG_SETMASK, &oset, NULL); + /* No need to restore old SIGTSTP handler. */ + } + debug_return_bool(false); +} + +#if SUDO_API_VERSION != SUDO_API_MKVERSION(1, 14) +# error "Update sudo_needs_pty() after changing the plugin API" +#endif +static bool +sudo_needs_pty(struct command_details *details) +{ + struct plugin_container *plugin; + + if (ISSET(details->flags, CD_USE_PTY)) + return true; + + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_ttyin != NULL || + plugin->u.io->log_ttyout != NULL || + plugin->u.io->log_stdin != NULL || + plugin->u.io->log_stdout != NULL || + plugin->u.io->log_stderr != NULL || + plugin->u.io->change_winsize != NULL || + plugin->u.io->log_suspend != NULL) + return true; + } + return false; +} + +/* + * Execute a command, potentially in a pty with I/O loggging, and + * wait for it to finish. + * This is a little bit tricky due to how POSIX job control works and + * we fact that we have two different controlling terminals to deal with. + */ +int +sudo_execute(struct command_details *details, struct command_status *cstat) +{ + debug_decl(sudo_execute, SUDO_DEBUG_EXEC) + + /* If running in background mode, fork and exit. */ + if (ISSET(details->flags, CD_BACKGROUND)) { + switch (sudo_debug_fork()) { + case -1: + cstat->type = CMD_ERRNO; + cstat->val = errno; + debug_return_int(-1); + case 0: + /* child continues without controlling terminal */ + (void)setpgid(0, 0); + break; + default: + /* parent exits (but does not flush buffers) */ + sudo_debug_exit_int(__func__, __FILE__, __LINE__, + sudo_debug_subsys, 0); + _exit(0); + } + } + + /* + * Restore resource limits before running. + * We must do this *before* calling the PAM session module. + */ + restore_limits(); + + /* + * Run the command in a new pty if there is an I/O plugin or the policy + * has requested a pty. If /dev/tty is unavailable and no I/O plugin + * is configured, this returns false and we run the command without a pty. + */ + if (sudo_needs_pty(details)) { + if (exec_pty(details, cstat)) + goto done; + } + + /* + * If we are not running the command in a pty, we were not invoked + * as sudoedit, there is no command timeout and there is no close + * function, just exec directly. Only returns on error. + */ + if (!ISSET(details->flags, CD_SET_TIMEOUT|CD_SUDOEDIT) && + policy_plugin.u.policy->close == NULL) { + if (!sudo_terminated(cstat)) { + exec_cmnd(details, -1); + cstat->type = CMD_ERRNO; + cstat->val = errno; + } + goto done; + } + + /* + * Run the command in the existing tty (if any) and wait for it to finish. + */ + exec_nopty(details, cstat); + +done: + /* The caller will run any plugin close functions. */ + debug_return_int(cstat->type == CMD_ERRNO ? -1 : 0); +} + +/* + * Kill command with increasing urgency. + */ +void +terminate_command(pid_t pid, bool use_pgrp) +{ + debug_decl(terminate_command, SUDO_DEBUG_EXEC); + + /* Avoid killing more than a single process or process group. */ + if (pid <= 0) + debug_return; + + /* + * Note that SIGCHLD will interrupt the sleep() + */ + if (use_pgrp) { + sudo_debug_printf(SUDO_DEBUG_INFO, "killpg %d SIGHUP", (int)pid); + killpg(pid, SIGHUP); + sudo_debug_printf(SUDO_DEBUG_INFO, "killpg %d SIGTERM", (int)pid); + killpg(pid, SIGTERM); + sleep(2); + sudo_debug_printf(SUDO_DEBUG_INFO, "killpg %d SIGKILL", (int)pid); + killpg(pid, SIGKILL); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, "kill %d SIGHUP", (int)pid); + kill(pid, SIGHUP); + sudo_debug_printf(SUDO_DEBUG_INFO, "kill %d SIGTERM", (int)pid); + kill(pid, SIGTERM); + sleep(2); + sudo_debug_printf(SUDO_DEBUG_INFO, "kill %d SIGKILL", (int)pid); + kill(pid, SIGKILL); + } + + debug_return; +} diff --git a/utsudo-0.0.2/src_ori/exec_common.c b/utsudo-0.0.2/src_ori/exec_common.c new file mode 100644 index 0000000..b2d6e4d --- /dev/null +++ b/utsudo-0.0.2/src_ori/exec_common.c @@ -0,0 +1,221 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_PRIV_SET +# include +#endif +#include +#include +#include + +#include "utsudo.h" +#include "sudo_exec.h" + +#ifdef RTLD_PRELOAD_VAR +/* + * Add a DSO file to LD_PRELOAD or the system equivalent. + */ +static char ** +preload_dso(char *envp[], const char *dso_file) +{ + char *preload = NULL; + int env_len; + int preload_idx = -1; + bool present = false; +# ifdef RTLD_PRELOAD_ENABLE_VAR + bool enabled = false; +# else + const bool enabled = true; +# endif + debug_decl(preload_dso, SUDO_DEBUG_UTIL) + + /* + * Preload a DSO file. For a list of LD_PRELOAD-alikes, see + * http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html + * XXX - need to support 32-bit and 64-bit variants + */ + + /* Count entries in envp, looking for LD_PRELOAD as we go. */ + for (env_len = 0; envp[env_len] != NULL; env_len++) { + if (preload_idx == -1 && strncmp(envp[env_len], RTLD_PRELOAD_VAR "=", + sizeof(RTLD_PRELOAD_VAR)) == 0) { + const char *cp = envp[env_len] + sizeof(RTLD_PRELOAD_VAR); + const char *end = cp + strlen(cp); + const char *ep; + const size_t dso_len = strlen(dso_file); + + /* Check to see if dso_file is already present. */ + for (cp = sudo_strsplit(cp, end, RTLD_PRELOAD_DELIM, &ep); + cp != NULL; cp = sudo_strsplit(NULL, end, RTLD_PRELOAD_DELIM, + &ep)) { + if ((size_t)(ep - cp) == dso_len) { + if (memcmp(cp, dso_file, dso_len) == 0) { + /* already present */ + present = true; + break; + } + } + } + + /* Save index of existing LD_PRELOAD variable. */ + preload_idx = env_len; + continue; + } +# ifdef RTLD_PRELOAD_ENABLE_VAR + if (strncmp(envp[env_len], RTLD_PRELOAD_ENABLE_VAR "=", sizeof(RTLD_PRELOAD_ENABLE_VAR)) == 0) { + enabled = true; + continue; + } +# endif + } + + /* + * Make a new copy of envp as needed. + * It would be nice to realloc the old envp[] but we don't know + * whether it was dynamically allocated. [TODO: plugin API] + */ + if (preload_idx == -1 || !enabled) { + const int env_size = env_len + 1 + (preload_idx == -1) + enabled; + + char **nenvp = reallocarray(NULL, env_size, sizeof(*envp)); + if (nenvp == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + memcpy(nenvp, envp, env_len * sizeof(*envp)); + nenvp[env_len] = NULL; + envp = nenvp; + } + + /* Prepend our LD_PRELOAD to existing value or add new entry at the end. */ + if (!present) { + if (preload_idx == -1) { +# ifdef RTLD_PRELOAD_DEFAULT + asprintf(&preload, "%s=%s%s%s", RTLD_PRELOAD_VAR, dso_file, + RTLD_PRELOAD_DELIM, RTLD_PRELOAD_DEFAULT); +# else + preload = sudo_new_key_val(RTLD_PRELOAD_VAR, dso_file); +# endif + if (preload == NULL) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + envp[env_len++] = preload; + envp[env_len] = NULL; + } else { + int len = asprintf(&preload, "%s=%s%s%s", RTLD_PRELOAD_VAR, + dso_file, RTLD_PRELOAD_DELIM, envp[preload_idx]); + if (len == -1) { + sudo_fatalx(U_("%s: %s"), __func__, + U_("unable to allocate memory")); + } + envp[preload_idx] = preload; + } + } +# ifdef RTLD_PRELOAD_ENABLE_VAR + if (!enabled) { + envp[env_len++] = RTLD_PRELOAD_ENABLE_VAR "="; + envp[env_len] = NULL; + } +# endif + + debug_return_ptr(envp); +} +#endif /* RTLD_PRELOAD_VAR */ + +/* + * Disable execution of child processes in the command we are about + * to run. On systems with privilege sets, we can remove the exec + * privilege. On other systems we use LD_PRELOAD and the like. + */ +char ** +disable_execute(char *envp[], const char *dso) +{ + debug_decl(disable_execute, SUDO_DEBUG_UTIL) + +#ifdef HAVE_PRIV_SET + /* Solaris privileges, remove PRIV_PROC_EXEC post-execve. */ + (void)priv_set(PRIV_ON, PRIV_INHERITABLE, "PRIV_FILE_DAC_READ", NULL); + (void)priv_set(PRIV_ON, PRIV_INHERITABLE, "PRIV_FILE_DAC_WRITE", NULL); + (void)priv_set(PRIV_ON, PRIV_INHERITABLE, "PRIV_FILE_DAC_SEARCH", NULL); + if (priv_set(PRIV_OFF, PRIV_LIMIT, "PRIV_PROC_EXEC", NULL) == 0) + debug_return_ptr(envp); + sudo_warn(U_("unable to remove PRIV_PROC_EXEC from PRIV_LIMIT")); +#endif /* HAVE_PRIV_SET */ + +#ifdef RTLD_PRELOAD_VAR + if (dso != NULL) + envp = preload_dso(envp, dso); +#endif /* RTLD_PRELOAD_VAR */ + + debug_return_ptr(envp); +} + +/* + * Like execve(2) but falls back to running through /bin/sh + * ala execvp(3) if we get ENOEXEC. + */ +int +sudo_execve(int fd, const char *path, char *const argv[], char *envp[], bool noexec) +{ + debug_decl(sudo_execve, SUDO_DEBUG_UTIL) + + sudo_debug_execve(SUDO_DEBUG_INFO, path, argv, envp); + + /* Modify the environment as needed to disable further execve(). */ + if (noexec) + envp = disable_execute(envp, sudo_conf_noexec_path()); + +#ifdef HAVE_FEXECVE + if (fd != -1) + fexecve(fd, argv, envp); + else +#endif + execve(path, argv, envp); + if (fd == -1 && errno == ENOEXEC) { + int argc; + char **nargv; + + for (argc = 0; argv[argc] != NULL; argc++) + continue; + nargv = reallocarray(NULL, argc + 2, sizeof(char *)); + if (nargv != NULL) { + nargv[0] = "sh"; + nargv[1] = (char *)path; + memcpy(nargv + 2, argv + 1, argc * sizeof(char *)); + execve(_PATH_SUDO_BSHELL, nargv, envp); + free(nargv); + } + } + debug_return_int(-1); +} diff --git a/utsudo-0.0.2/src_ori/exec_monitor.c b/utsudo-0.0.2/src_ori/exec_monitor.c new file mode 100644 index 0000000..65a8dbe --- /dev/null +++ b/utsudo-0.0.2/src_ori/exec_monitor.c @@ -0,0 +1,735 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include + +#include "utsudo.h" +#include "sudo_event.h" +#include "sudo_exec.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +struct monitor_closure { + pid_t cmnd_pid; + pid_t cmnd_pgrp; + pid_t mon_pgrp; + int backchannel; + struct command_status *cstat; + struct sudo_event_base *evbase; + struct sudo_event *errpipe_event; + struct sudo_event *backchannel_event; + struct sudo_event *sigint_event; + struct sudo_event *sigquit_event; + struct sudo_event *sigtstp_event; + struct sudo_event *sigterm_event; + struct sudo_event *sighup_event; + struct sudo_event *sigusr1_event; + struct sudo_event *sigusr2_event; + struct sudo_event *sigchld_event; +}; + +static bool tty_initialized; + +/* + * Deliver a signal to the running command. + * The signal was either forwarded to us by the parent sudo process + * or was received by the monitor itself. + * + * There are two "special" signals, SIGCONT_FG and SIGCONT_BG that + * also specify whether the command should have the controlling tty. + */ +static void +deliver_signal(struct monitor_closure *mc, int signo, bool from_parent) +{ + char signame[SIG2STR_MAX]; + debug_decl(deliver_signal, SUDO_DEBUG_EXEC); + + /* Avoid killing more than a single process or process group. */ + if (mc->cmnd_pid <= 0) + debug_return; + + if (signo == SIGCONT_FG) + (void)strlcpy(signame, "CONT_FG", sizeof(signame)); + else if (signo == SIGCONT_BG) + (void)strlcpy(signame, "CONT_BG", sizeof(signame)); + else if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + + /* Handle signal from parent or monitor. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "received SIG%s%s", + signame, from_parent ? " from parent" : ""); + switch (signo) { + case SIGALRM: + terminate_command(mc->cmnd_pid, true); + break; + case SIGCONT_FG: + /* Continue in foreground, grant it controlling tty. */ + if (tcsetpgrp(io_fds[SFD_SLAVE], mc->cmnd_pgrp) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to set foreground pgrp to %d (command)", + __func__, (int)mc->cmnd_pgrp); + } + /* Lazily initialize the pty if needed. */ + if (!tty_initialized) { + if (sudo_term_copy(io_fds[SFD_USERTTY], io_fds[SFD_SLAVE])) + tty_initialized = true; + } + killpg(mc->cmnd_pid, SIGCONT); + break; + case SIGCONT_BG: + /* Continue in background, I take controlling tty. */ + if (tcsetpgrp(io_fds[SFD_SLAVE], mc->mon_pgrp) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to set foreground pgrp to %d (monitor)", + __func__, (int)mc->mon_pgrp); + } + killpg(mc->cmnd_pid, SIGCONT); + break; + case SIGKILL: + _exit(1); /* XXX */ + /* NOTREACHED */ + default: + /* Relay signal to command. */ + killpg(mc->cmnd_pid, signo); + break; + } + debug_return; +} + +/* + * Unpack rows and cols from a CMD_TTYWINCH value, set the new window + * size on the pty slave and inform the command of the change. + */ +static void +handle_winch(struct monitor_closure *mc, unsigned int wsize_packed) +{ + struct winsize wsize, owsize; + debug_decl(handle_winch, SUDO_DEBUG_EXEC); + + /* Rows and colums are stored as two shorts packed into a single int. */ + wsize.ws_row = wsize_packed & 0xffff; + wsize.ws_col = (wsize_packed >> 16) & 0xffff; + + if (ioctl(io_fds[SFD_SLAVE], TIOCGWINSZ, &owsize) == 0 && + (wsize.ws_row != owsize.ws_row || wsize.ws_col != owsize.ws_col)) { + + sudo_debug_printf(SUDO_DEBUG_INFO, + "window size change %dx%d -> %dx%d", + owsize.ws_col, owsize.ws_row, wsize.ws_col, wsize.ws_row); + + (void)ioctl(io_fds[SFD_SLAVE], TIOCSWINSZ, &wsize); + deliver_signal(mc, SIGWINCH, true); + } + + debug_return; +} + +/* + * Send status to parent over socketpair. + * Return value is the same as send(2). + */ +static int +send_status(int fd, struct command_status *cstat) +{ + int n = -1; + debug_decl(send_status, SUDO_DEBUG_EXEC); + + if (cstat->type != CMD_INVALID) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "sending status message to parent: [%d, %d]", + cstat->type, cstat->val); + n = send(fd, cstat, sizeof(*cstat), 0); + if (n != sizeof(*cstat)) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to send status to parent", __func__); + } + cstat->type = CMD_INVALID; /* prevent re-sending */ + } + debug_return_int(n); +} + +/* + * Wait for command status after receiving SIGCHLD. + * If the command was stopped, the status is send back to the parent. + * Otherwise, cstat is filled in but not sent. + */ +static void +mon_handle_sigchld(struct monitor_closure *mc) +{ + char signame[SIG2STR_MAX]; + int status; + pid_t pid; + debug_decl(mon_handle_sigchld, SUDO_DEBUG_EXEC); + + /* Read command status. */ + do { + pid = waitpid(mc->cmnd_pid, &status, WUNTRACED|WCONTINUED|WNOHANG); + } while (pid == -1 && errno == EINTR); + switch (pid) { + case 0: + errno = ECHILD; + /* FALLTHROUGH */ + case -1: + sudo_warn(U_("%s: %s"), __func__, "waitpid"); + debug_return; + } + + if (WIFCONTINUED(status)) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) resumed", + __func__, (int)mc->cmnd_pid); + } else if (WIFSTOPPED(status)) { + if (sig2str(WSTOPSIG(status), signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", WSTOPSIG(status)); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) stopped, SIG%s", + __func__, (int)mc->cmnd_pid, signame); + } else if (WIFSIGNALED(status)) { + if (sig2str(WTERMSIG(status), signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", WTERMSIG(status)); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) killed, SIG%s", + __func__, (int)mc->cmnd_pid, signame); + mc->cmnd_pid = -1; + } else if (WIFEXITED(status)) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) exited: %d", + __func__, (int)mc->cmnd_pid, WEXITSTATUS(status)); + mc->cmnd_pid = -1; + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: unexpected wait status %d for command (%d)", + __func__, status, (int)mc->cmnd_pid); + } + + /* Don't overwrite execve() failure with child exit status. */ + if (mc->cstat->type == CMD_INVALID) { + /* + * Store wait status in cstat and forward to parent if stopped. + * Parent does not expect SIGCONT so don't bother sending it. + */ + if (!WIFCONTINUED(status)) { + mc->cstat->type = CMD_WSTATUS; + mc->cstat->val = status; + if (WIFSTOPPED(status)) { + /* Save the foreground pgid so we can restore it later. */ + pid = tcgetpgrp(io_fds[SFD_SLAVE]); + if (pid != mc->mon_pgrp) + mc->cmnd_pgrp = pid; + send_status(mc->backchannel, mc->cstat); + } + } + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: not overwriting command status %d,%d with %d,%d", + __func__, mc->cstat->type, mc->cstat->val, CMD_WSTATUS, status); + } + + debug_return; +} + +static void +mon_signal_cb(int signo, int what, void *v) +{ + struct sudo_ev_siginfo_container *sc = v; + struct monitor_closure *mc = sc->closure; + debug_decl(mon_signal_cb, SUDO_DEBUG_EXEC); + + /* + * Handle SIGCHLD specially and deliver other signals + * directly to the command. + */ + if (signo == SIGCHLD) { + mon_handle_sigchld(mc); + if (mc->cmnd_pid == -1) { + /* Command exited or was killed, exit event loop. */ + sudo_ev_loopexit(mc->evbase); + } + } else { + /* + * If the signal came from the process group of the command we ran, + * do not forward it as we don't want the child to indirectly kill + * itself. This can happen with, e.g., BSD-derived versions of + * reboot that call kill(-1, SIGTERM) to kill all other processes. + */ + if (USER_SIGNALED(sc->siginfo) && sc->siginfo->si_pid != 0) { + pid_t si_pgrp = getpgid(sc->siginfo->si_pid); + if (si_pgrp != -1) { + if (si_pgrp == mc->cmnd_pgrp) + debug_return; + } else if (sc->siginfo->si_pid == mc->cmnd_pid) { + debug_return; + } + } + deliver_signal(mc, signo, false); + } + debug_return; +} + +/* Note: this is basically the same as errpipe_cb() in exec_nopty.c */ +static void +mon_errpipe_cb(int fd, int what, void *v) +{ + struct monitor_closure *mc = v; + ssize_t nread; + int errval; + debug_decl(mon_errpipe_cb, SUDO_DEBUG_EXEC); + + /* + * Read errno from child or EOF when command is executed. + * Note that the error pipe is *blocking*. + */ + nread = read(fd, &errval, sizeof(errval)); + switch (nread) { + case -1: + if (errno != EAGAIN && errno != EINTR) { + if (mc->cstat->val == CMD_INVALID) { + /* XXX - need a way to distinguish non-exec error. */ + mc->cstat->type = CMD_ERRNO; + mc->cstat->val = errno; + } + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: failed to read error pipe", __func__); + sudo_ev_loopbreak(mc->evbase); + } + break; + default: + if (nread == 0) { + /* The error pipe closes when the command is executed. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "EOF on error pipe"); + } else { + /* Errno value when child is unable to execute command. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "errno from child: %s", + strerror(errval)); + mc->cstat->type = CMD_ERRNO; + mc->cstat->val = errval; + } + sudo_ev_del(mc->evbase, mc->errpipe_event); + close(fd); + break; + } + debug_return; +} + +static void +mon_backchannel_cb(int fd, int what, void *v) +{ + struct monitor_closure *mc = v; + struct command_status cstmp; + ssize_t n; + debug_decl(mon_backchannel_cb, SUDO_DEBUG_EXEC); + + /* + * Read command from backchannel, should be a signal. + * Note that the backchannel is a *blocking* socket. + */ + n = recv(fd, &cstmp, sizeof(cstmp), MSG_WAITALL); + if (n != sizeof(cstmp)) { + if (n == -1) { + if (errno == EINTR || errno == EAGAIN) + debug_return; + sudo_warn(U_("error reading from socketpair")); + } else { + /* short read or EOF, parent process died? */ + } + /* XXX - need a way to distinguish non-exec error. */ + mc->cstat->type = CMD_ERRNO; + mc->cstat->val = n ? EIO : ECONNRESET; + sudo_ev_loopbreak(mc->evbase); + } else { + switch (cstmp.type) { + case CMD_TTYWINCH: + handle_winch(mc, cstmp.val); + break; + case CMD_SIGNO: + deliver_signal(mc, cstmp.val, true); + break; + default: + sudo_warnx(U_("unexpected reply type on backchannel: %d"), cstmp.type); + break; + } + } + debug_return; +} + +/* + * Sets up std{in,out,err} and executes the actual command. + * Returns only if execve() fails. + */ +static void +exec_cmnd_pty(struct command_details *details, bool foreground, int errfd) +{ + volatile pid_t self = getpid(); + debug_decl(exec_cmnd_pty, SUDO_DEBUG_EXEC); + + /* Register cleanup function */ + sudo_fatal_callback_register(pty_cleanup); + + /* Set command process group here too to avoid a race. */ + setpgid(0, self); + + /* Wire up standard fds, note that stdout/stderr may be pipes. */ + if (io_fds[SFD_STDIN] != STDIN_FILENO) { + if (dup2(io_fds[SFD_STDIN], STDIN_FILENO) == -1) + sudo_fatal("dup2"); + if (io_fds[SFD_STDIN] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDIN]); + } + if (io_fds[SFD_STDOUT] != STDOUT_FILENO) { + if (dup2(io_fds[SFD_STDOUT], STDOUT_FILENO) == -1) + sudo_fatal("dup2"); + if (io_fds[SFD_STDOUT] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDOUT]); + } + if (io_fds[SFD_STDERR] != STDERR_FILENO) { + if (dup2(io_fds[SFD_STDERR], STDERR_FILENO) == -1) + sudo_fatal("dup2"); + if (io_fds[SFD_STDERR] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDERR]); + } + + /* Wait for parent to grant us the tty if we are foreground. */ + if (foreground && !ISSET(details->flags, CD_EXEC_BG)) { + struct timespec ts = { 0, 1000 }; /* 1us */ + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: waiting for controlling tty", + __func__); + while (tcgetpgrp(io_fds[SFD_SLAVE]) != self) + nanosleep(&ts, NULL); + sudo_debug_printf(SUDO_DEBUG_DEBUG, "%s: got controlling tty", + __func__); + } + + /* Done with the pty slave, don't leak it. */ + if (io_fds[SFD_SLAVE] != -1) + close(io_fds[SFD_SLAVE]); + + /* Execute command; only returns on error. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "executing %s in the %s", + details->command, foreground ? "foreground" : "background"); + exec_cmnd(details, errfd); + + debug_return; +} + +/* + * Fill in the monitor closure and setup initial events. + * Allocates read events for the signal pipe, error pipe and backchannel. + */ +static void +fill_exec_closure_monitor(struct monitor_closure *mc, + struct command_status *cstat, int errfd, int backchannel) +{ + debug_decl(fill_exec_closure_monitor, SUDO_DEBUG_EXEC); + + /* Fill in the non-event part of the closure. */ + mc->cstat = cstat; + mc->backchannel = backchannel; + mc->mon_pgrp = getpgrp(); + + /* Setup event base and events. */ + mc->evbase = sudo_ev_base_alloc(); + if (mc->evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Event for command status via errfd. */ + mc->errpipe_event = sudo_ev_alloc(errfd, + SUDO_EV_READ|SUDO_EV_PERSIST, mon_errpipe_cb, mc); + if (mc->errpipe_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->errpipe_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + /* Event for forwarded signals via backchannel. */ + mc->backchannel_event = sudo_ev_alloc(backchannel, + SUDO_EV_READ|SUDO_EV_PERSIST, mon_backchannel_cb, mc); + if (mc->backchannel_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->backchannel_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + /* Events for local signals. */ + mc->sigint_event = sudo_ev_alloc(SIGINT, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigint_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigint_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigquit_event = sudo_ev_alloc(SIGQUIT, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigquit_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigquit_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigtstp_event = sudo_ev_alloc(SIGTSTP, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigtstp_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigtstp_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigterm_event = sudo_ev_alloc(SIGTERM, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigterm_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigterm_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sighup_event = sudo_ev_alloc(SIGHUP, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sighup_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sighup_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigusr1_event = sudo_ev_alloc(SIGUSR1, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigusr1_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigusr1_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigusr2_event = sudo_ev_alloc(SIGUSR2, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigusr2_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigusr2_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + mc->sigchld_event = sudo_ev_alloc(SIGCHLD, + SUDO_EV_SIGINFO, mon_signal_cb, mc); + if (mc->sigchld_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(mc->evbase, mc->sigchld_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + /* Clear the default event base. */ + sudo_ev_base_setdef(NULL); + + debug_return; +} + +/* + * Monitor process that creates a new session with the controlling tty, + * resets signal handlers and forks a child to call exec_cmnd_pty(). + * Waits for status changes from the command and relays them to the + * parent and relays signals from the parent to the command. + * Must be called with signals blocked and the old signal mask in oset. + * Returns an error if fork(2) fails, else calls _exit(2). + */ +int +exec_monitor(struct command_details *details, sigset_t *oset, + bool foreground, int backchannel) +{ + struct monitor_closure mc = { 0 }; + struct command_status cstat; + struct sigaction sa; + int errpipe[2]; + debug_decl(exec_monitor, SUDO_DEBUG_EXEC); + + /* The pty master is not used by the monitor. */ + if (io_fds[SFD_MASTER] != -1) + close(io_fds[SFD_MASTER]); + + /* Ignore any SIGTTIN or SIGTTOU we receive (shouldn't be possible). */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_IGN; + if (sudo_sigaction(SIGTTIN, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGTTIN); + if (sudo_sigaction(SIGTTOU, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGTTOU); + + /* If we are starting in the foreground, the pty was already initialized. */ + if (foreground) + tty_initialized = true; + + /* + * Start a new session with the parent as the session leader + * and the slave pty as the controlling terminal. + * This allows us to be notified when the command has been suspended. + */ + if (setsid() == -1) { + sudo_warn("setsid"); + goto bad; + } + if (pty_make_controlling() == -1) { + sudo_warn(U_("unable to set controlling tty")); + goto bad; + } + + /* + * We use a pipe to get errno if execve(2) fails in the child. + */ + if (pipe2(errpipe, O_CLOEXEC) != 0) + sudo_fatal(U_("unable to create pipe")); + + /* + * Before forking, wait for the main sudo process to tell us to go. + * Avoids race conditions when the command exits quickly. + */ + while (recv(backchannel, &cstat, sizeof(cstat), MSG_WAITALL) == -1) { + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to receive message from parent")); + } + +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + if (selinux_setup(details->selinux_role, details->selinux_type, + details->tty, io_fds[SFD_SLAVE], true) == -1) + goto bad; + } +#endif + + mc.cmnd_pid = sudo_debug_fork(); + switch (mc.cmnd_pid) { + case -1: + sudo_warn(U_("unable to fork")); +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + if (selinux_restore_tty() != 0) + sudo_warnx(U_("unable to restore tty label")); + } +#endif + goto bad; + case 0: + /* child */ + sigprocmask(SIG_SETMASK, oset, NULL); + close(backchannel); + close(errpipe[0]); + if (io_fds[SFD_USERTTY] != -1) + close(io_fds[SFD_USERTTY]); + restore_signals(); + + /* setup tty and exec command */ + exec_cmnd_pty(details, foreground, errpipe[1]); + if (write(errpipe[1], &errno, sizeof(int)) == -1) + sudo_warn(U_("unable to execute %s"), details->command); + _exit(1); + } + close(errpipe[1]); + + /* No longer need execfd. */ + if (details->execfd != -1) { + close(details->execfd); + details->execfd = -1; + } + + /* Send the command's pid to main sudo process. */ + cstat.type = CMD_PID; + cstat.val = mc.cmnd_pid; + send_status(backchannel, &cstat); + + /* + * Create new event base and register read events for the + * signal pipe, error pipe, and backchannel. + */ + fill_exec_closure_monitor(&mc, &cstat, errpipe[0], backchannel); + + /* Restore signal mask now that signal handlers are setup. */ + sigprocmask(SIG_SETMASK, oset, NULL); + + /* If any of stdin/stdout/stderr are pipes, close them in parent. */ + if (io_fds[SFD_STDIN] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDIN]); + if (io_fds[SFD_STDOUT] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDOUT]); + if (io_fds[SFD_STDERR] != io_fds[SFD_SLAVE]) + close(io_fds[SFD_STDERR]); + + /* Put command in its own process group. */ + mc.cmnd_pgrp = mc.cmnd_pid; + setpgid(mc.cmnd_pid, mc.cmnd_pgrp); + + /* Make the command the foreground process for the pty slave. */ + if (foreground && !ISSET(details->flags, CD_EXEC_BG)) { + if (tcsetpgrp(io_fds[SFD_SLAVE], mc.cmnd_pgrp) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to set foreground pgrp to %d (command)", + __func__, (int)mc.cmnd_pgrp); + } + } + + /* + * Wait for errno on pipe, signal on backchannel or for SIGCHLD. + * The event loop ends when the child is no longer running and + * the error pipe is closed. + */ + cstat.type = CMD_INVALID; + cstat.val = 0; + (void) sudo_ev_dispatch(mc.evbase); + if (mc.cmnd_pid != -1) { + pid_t pid; + + /* Command still running, did the parent die? */ + sudo_debug_printf(SUDO_DEBUG_ERROR, + "Command still running after event loop exit, terminating"); + terminate_command(mc.cmnd_pid, true); + do { + pid = waitpid(mc.cmnd_pid, NULL, 0); + } while (pid == -1 && errno == EINTR); + /* XXX - update cstat with wait status? */ + } + + /* + * Take the controlling tty. This prevents processes spawned by the + * command from receiving SIGHUP when the session leader (us) exits. + */ + if (tcsetpgrp(io_fds[SFD_SLAVE], mc.mon_pgrp) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to set foreground pgrp to %d (monitor)", + __func__, (int)mc.mon_pgrp); + } + + /* Send parent status. */ + send_status(backchannel, &cstat); + +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + if (selinux_restore_tty() != 0) + sudo_warnx(U_("unable to restore tty label")); + } +#endif + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, 1); + _exit(1); + +bad: + debug_return_int(-1); +} diff --git a/utsudo-0.0.2/src_ori/exec_nopty.c b/utsudo-0.0.2/src_ori/exec_nopty.c new file mode 100644 index 0000000..d222a04 --- /dev/null +++ b/utsudo-0.0.2/src_ori/exec_nopty.c @@ -0,0 +1,586 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "utsudo.h" +#include "sudo_exec.h" +#include "sudo_event.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +struct exec_closure_nopty { + pid_t cmnd_pid; + pid_t ppgrp; + struct command_status *cstat; + struct command_details *details; + struct sudo_event_base *evbase; + struct sudo_event *errpipe_event; + struct sudo_event *sigint_event; + struct sudo_event *sigquit_event; + struct sudo_event *sigtstp_event; + struct sudo_event *sigterm_event; + struct sudo_event *sighup_event; + struct sudo_event *sigalrm_event; + struct sudo_event *sigpipe_event; + struct sudo_event *sigusr1_event; + struct sudo_event *sigusr2_event; + struct sudo_event *sigchld_event; + struct sudo_event *sigcont_event; + struct sudo_event *siginfo_event; +}; + +static void handle_sigchld_nopty(struct exec_closure_nopty *ec); + +/* Note: this is basically the same as mon_errpipe_cb() in exec_monitor.c */ +static void +errpipe_cb(int fd, int what, void *v) +{ + struct exec_closure_nopty *ec = v; + ssize_t nread; + int errval; + debug_decl(errpipe_cb, SUDO_DEBUG_EXEC); + + /* + * Read errno from child or EOF when command is executed. + * Note that the error pipe is *blocking*. + */ + nread = read(fd, &errval, sizeof(errval)); + switch (nread) { + case -1: + if (errno != EAGAIN && errno != EINTR) { + if (ec->cstat->val == CMD_INVALID) { + /* XXX - need a way to distinguish non-exec error. */ + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = errno; + } + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: failed to read error pipe", __func__); + sudo_ev_loopbreak(ec->evbase); + } + break; + default: + if (nread == 0) { + /* The error pipe closes when the command is executed. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "EOF on error pipe"); + } else { + /* Errno value when child is unable to execute command. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "errno from child: %s", + strerror(errval)); + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = errval; + } + sudo_ev_del(ec->evbase, ec->errpipe_event); + close(fd); + break; + } + debug_return; +} + +/* Signal callback */ +static void +signal_cb_nopty(int signo, int what, void *v) +{ + struct sudo_ev_siginfo_container *sc = v; + struct exec_closure_nopty *ec = sc->closure; + char signame[SIG2STR_MAX]; + debug_decl(signal_cb_nopty, SUDO_DEBUG_EXEC) + + if (ec->cmnd_pid == -1) + debug_return; + + if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + sudo_debug_printf(SUDO_DEBUG_DIAG, + "%s: evbase %p, command: %d, signo %s(%d), cstat %p", + __func__, ec->evbase, (int)ec->cmnd_pid, signame, signo, ec->cstat); + + switch (signo) { + case SIGCHLD: + handle_sigchld_nopty(ec); + if (ec->cmnd_pid == -1) { + /* Command exited or was killed, exit event loop. */ + sudo_ev_loopexit(ec->evbase); + } + debug_return; +#ifdef SIGINFO + case SIGINFO: +#endif + case SIGINT: + case SIGQUIT: + case SIGTSTP: + /* + * Only forward user-generated signals not sent by a process in + * the command's own process group. Signals sent by the kernel + * may include SIGTSTP when the user presses ^Z. Curses programs + * often trap ^Z and send SIGTSTP to their own pgrp, so we don't + * want to send an extra SIGTSTP. + */ + if (!USER_SIGNALED(sc->siginfo)) + debug_return; + if (sc->siginfo->si_pid != 0) { + pid_t si_pgrp = getpgid(sc->siginfo->si_pid); + if (si_pgrp != -1) { + if (si_pgrp == ec->ppgrp || si_pgrp == ec->cmnd_pid) + debug_return; + } else if (sc->siginfo->si_pid == ec->cmnd_pid) { + debug_return; + } + } + break; + default: + /* + * Do not forward signals sent by a process in the command's process + * group, as we don't want the command to indirectly kill itself. + * For example, this can happen with some versions of reboot that + * call kill(-1, SIGTERM) to kill all other processes. + */ + if (USER_SIGNALED(sc->siginfo) && sc->siginfo->si_pid != 0) { + pid_t si_pgrp = getpgid(sc->siginfo->si_pid); + if (si_pgrp != -1) { + if (si_pgrp == ec->ppgrp || si_pgrp == ec->cmnd_pid) + debug_return; + } else if (sc->siginfo->si_pid == ec->cmnd_pid) { + debug_return; + } + } + break; + } + + /* Send signal to command. */ + if (signo == SIGALRM) { + terminate_command(ec->cmnd_pid, false); + } else if (kill(ec->cmnd_pid, signo) != 0) { + sudo_warn("kill(%d, SIG%s)", (int)ec->cmnd_pid, signame); + } + + debug_return; +} + + +/* + * Fill in the exec closure and setup initial exec events. + * Allocates events for the signal pipe and error pipe. + */ +static void +fill_exec_closure_nopty(struct exec_closure_nopty *ec, + struct command_status *cstat, struct command_details *details, int errfd) +{ + debug_decl(fill_exec_closure_nopty, SUDO_DEBUG_EXEC) + + /* Fill in the non-event part of the closure. */ + ec->ppgrp = getpgrp(); + ec->cstat = cstat; + ec->details = details; + + /* Setup event base and events. */ + ec->evbase = sudo_ev_base_alloc(); + if (ec->evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Event for command status via errfd. */ + ec->errpipe_event = sudo_ev_alloc(errfd, + SUDO_EV_READ|SUDO_EV_PERSIST, errpipe_cb, ec); + if (ec->errpipe_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->errpipe_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + sudo_debug_printf(SUDO_DEBUG_INFO, "error pipe fd %d\n", errfd); + + /* Events for local signals. */ + ec->sigint_event = sudo_ev_alloc(SIGINT, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigint_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigint_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigquit_event = sudo_ev_alloc(SIGQUIT, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigquit_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigquit_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigtstp_event = sudo_ev_alloc(SIGTSTP, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigtstp_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigtstp_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigterm_event = sudo_ev_alloc(SIGTERM, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigterm_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigterm_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sighup_event = sudo_ev_alloc(SIGHUP, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sighup_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sighup_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigalrm_event = sudo_ev_alloc(SIGALRM, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigalrm_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigalrm_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigpipe_event = sudo_ev_alloc(SIGPIPE, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigpipe_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigpipe_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigusr1_event = sudo_ev_alloc(SIGUSR1, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigusr1_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigusr1_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigusr2_event = sudo_ev_alloc(SIGUSR2, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigusr2_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigusr2_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigchld_event = sudo_ev_alloc(SIGCHLD, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigchld_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigchld_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigcont_event = sudo_ev_alloc(SIGCONT, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->sigcont_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigcont_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + +#ifdef SIGINFO + ec->siginfo_event = sudo_ev_alloc(SIGINFO, + SUDO_EV_SIGINFO, signal_cb_nopty, ec); + if (ec->siginfo_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->siginfo_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); +#endif + + /* Set the default event base. */ + sudo_ev_base_setdef(ec->evbase); + + debug_return; +} + +/* + * Free the dynamically-allocated contents of the exec closure. + */ +static void +free_exec_closure_nopty(struct exec_closure_nopty *ec) +{ + debug_decl(free_exec_closure_nopty, SUDO_DEBUG_EXEC) + + sudo_ev_base_free(ec->evbase); + sudo_ev_free(ec->errpipe_event); + sudo_ev_free(ec->sigint_event); + sudo_ev_free(ec->sigquit_event); + sudo_ev_free(ec->sigtstp_event); + sudo_ev_free(ec->sigterm_event); + sudo_ev_free(ec->sighup_event); + sudo_ev_free(ec->sigalrm_event); + sudo_ev_free(ec->sigpipe_event); + sudo_ev_free(ec->sigusr1_event); + sudo_ev_free(ec->sigusr2_event); + sudo_ev_free(ec->sigchld_event); + sudo_ev_free(ec->sigcont_event); + sudo_ev_free(ec->siginfo_event); + + debug_return; +} + +/* + * Execute a command and wait for it to finish. + */ +void +exec_nopty(struct command_details *details, struct command_status *cstat) +{ + struct exec_closure_nopty ec = { 0 }; + sigset_t set, oset; + int errpipe[2]; + debug_decl(exec_nopty, SUDO_DEBUG_EXEC) + + /* + * The policy plugin's session init must be run before we fork + * or certain pam modules won't be able to track their state. + */ + if (policy_init_session(details) != true) + sudo_fatalx(U_("policy plugin failed session initialization")); + + /* + * We use a pipe to get errno if execve(2) fails in the child. + */ + if (pipe2(errpipe, O_CLOEXEC) != 0) + sudo_fatal(U_("unable to create pipe")); + + /* + * Block signals until we have our handlers setup in the parent so + * we don't miss SIGCHLD if the command exits immediately. + */ + sigfillset(&set); + sigprocmask(SIG_BLOCK, &set, &oset); + + /* Check for early termination or suspend signals before we fork. */ + if (sudo_terminated(cstat)) { + sigprocmask(SIG_SETMASK, &oset, NULL); + debug_return; + } + +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + if (selinux_setup(details->selinux_role, details->selinux_type, + details->tty, -1, true) == -1) { + cstat->type = CMD_ERRNO; + cstat->val = errno; + debug_return; + } + } +#endif + + ec.cmnd_pid = sudo_debug_fork(); + switch (ec.cmnd_pid) { + case -1: + sudo_fatal(U_("unable to fork")); + break; + case 0: + /* child */ + sigprocmask(SIG_SETMASK, &oset, NULL); + close(errpipe[0]); + exec_cmnd(details, errpipe[1]); + while (write(errpipe[1], &errno, sizeof(int)) == -1) { + if (errno != EINTR) + break; + } + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, 1); + _exit(1); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "executed %s, pid %d", details->command, + (int)ec.cmnd_pid); + close(errpipe[1]); + + /* No longer need execfd. */ + if (details->execfd != -1) { + close(details->execfd); + details->execfd = -1; + } + + /* Set command timeout if specified. */ + if (ISSET(details->flags, CD_SET_TIMEOUT)) + alarm(details->timeout); + + /* + * Fill in exec closure, allocate event base, signal events and + * the error pipe event. + */ + fill_exec_closure_nopty(&ec, cstat, details, errpipe[0]); + + /* Restore signal mask now that signal handlers are setup. */ + sigprocmask(SIG_SETMASK, &oset, NULL); + + /* + * Non-pty event loop. + * Wait for command to exit, handles signals and the error pipe. + */ + if (sudo_ev_dispatch(ec.evbase) == -1) + sudo_warn(U_("error in event loop")); + if (sudo_ev_got_break(ec.evbase)) { + /* error from callback */ + sudo_debug_printf(SUDO_DEBUG_ERROR, "event loop exited prematurely"); + /* kill command */ + terminate_command(ec.cmnd_pid, true); + } + +#ifdef HAVE_SELINUX + if (ISSET(details->flags, CD_RBAC_ENABLED)) { + if (selinux_restore_tty() != 0) + sudo_warnx(U_("unable to restore tty label")); + } +#endif + + /* Free things up. */ + free_exec_closure_nopty(&ec); + debug_return; +} + +/* + * Wait for command status after receiving SIGCHLD. + * If the command exits, fill in cstat and stop the event loop. + * If the command stops, save the tty pgrp, suspend sudo, then restore + * the tty pgrp when sudo resumes. + */ +static void +handle_sigchld_nopty(struct exec_closure_nopty *ec) +{ + pid_t pid; + int status; + char signame[SIG2STR_MAX]; + debug_decl(handle_sigchld_nopty, SUDO_DEBUG_EXEC) + + /* Read command status. */ + do { + pid = waitpid(ec->cmnd_pid, &status, WUNTRACED|WNOHANG); + } while (pid == -1 && errno == EINTR); + switch (pid) { + case 0: + /* waitpid() will return 0 for SIGCONT, which we don't care about */ + debug_return; + case -1: + sudo_warn(U_("%s: %s"), __func__, "waitpid"); + debug_return; + } + + if (WIFSTOPPED(status)) { + /* + * Save the controlling terminal's process group so we can restore it + * after we resume, if needed. Most well-behaved shells change the + * pgrp back to its original value before suspending so we must + * not try to restore in that case, lest we race with the command upon + * resume, potentially stopping sudo with SIGTTOU while the command + * continues to run. + */ + struct sigaction sa, osa; + pid_t saved_pgrp = -1; + int fd, signo = WSTOPSIG(status); + + if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) stopped, SIG%s", + __func__, (int)ec->cmnd_pid, signame); + + fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + saved_pgrp = tcgetpgrp(fd); + if (saved_pgrp == -1) { + close(fd); + fd = -1; + } + } + if (saved_pgrp != -1) { + /* + * Command was stopped trying to access the controlling terminal. + * If the command has a different pgrp and we own the controlling + * terminal, give it to the command's pgrp and let it continue. + */ + if (signo == SIGTTOU || signo == SIGTTIN) { + if (saved_pgrp == ec->ppgrp) { + pid_t cmnd_pgrp = getpgid(ec->cmnd_pid); + if (cmnd_pgrp != ec->ppgrp) { + if (tcsetpgrp_nobg(fd, cmnd_pgrp) == 0) { + if (killpg(cmnd_pgrp, SIGCONT) != 0) { + sudo_warn("kill(%d, SIGCONT)", + (int)cmnd_pgrp); + } + close(fd); + goto done; + } + } + } + } + } + if (signo == SIGTSTP) { + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + if (sudo_sigaction(SIGTSTP, &sa, &osa) != 0) { + sudo_warn(U_("unable to set handler for signal %d"), + SIGTSTP); + } + } + if (kill(getpid(), signo) != 0) + sudo_warn("kill(%d, SIG%s)", (int)getpid(), signame); + if (signo == SIGTSTP) { + if (sudo_sigaction(SIGTSTP, &osa, NULL) != 0) { + sudo_warn(U_("unable to restore handler for signal %d"), + SIGTSTP); + } + } + if (saved_pgrp != -1) { + /* + * On resume, restore foreground process group, if different. + * Otherwise, we cannot resume some shells (pdksh). + * + * It is possible that we are no longer the foreground process so + * use tcsetpgrp_nobg() to prevent sudo from receiving SIGTTOU. + */ + if (saved_pgrp != ec->ppgrp) + tcsetpgrp_nobg(fd, saved_pgrp); + close(fd); + } + } else { + /* Command has exited or been killed, we are done. */ + if (WIFSIGNALED(status)) { + if (sig2str(WTERMSIG(status), signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", WTERMSIG(status)); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) killed, SIG%s", + __func__, (int)ec->cmnd_pid, signame); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: command (%d) exited: %d", + __func__, (int)ec->cmnd_pid, WEXITSTATUS(status)); + } + /* Don't overwrite execve() failure with command exit status. */ + if (ec->cstat->type == CMD_INVALID) { + ec->cstat->type = CMD_WSTATUS; + ec->cstat->val = status; + } else { + sudo_debug_printf(SUDO_DEBUG_WARN, + "%s: not overwriting command status %d,%d with %d,%d", + __func__, ec->cstat->type, ec->cstat->val, CMD_WSTATUS, status); + } + ec->cmnd_pid = -1; + } +done: + debug_return; +} diff --git a/utsudo-0.0.2/src_ori/exec_pty.c b/utsudo-0.0.2/src_ori/exec_pty.c new file mode 100644 index 0000000..3c1a997 --- /dev/null +++ b/utsudo-0.0.2/src_ori/exec_pty.c @@ -0,0 +1,1818 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include /* for struct winsize on HP-UX */ + +#include "utsudo.h" +#include "sudo_event.h" +#include "sudo_exec.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +/* Evaluates to true if the event has /dev/tty as its fd. */ +#define USERTTY_EVENT(_ev) (sudo_ev_get_fd((_ev)) == io_fds[SFD_USERTTY]) + +#define TERM_COOKED 0 +#define TERM_RAW 1 + +/* Tail queue of messages to send to the monitor. */ +struct monitor_message { + TAILQ_ENTRY(monitor_message) entries; + struct command_status cstat; +}; +TAILQ_HEAD(monitor_message_list, monitor_message); + +struct exec_closure_pty { + pid_t monitor_pid; + pid_t cmnd_pid; + pid_t ppgrp; + short rows; + short cols; + struct command_status *cstat; + struct command_details *details; + struct sudo_event_base *evbase; + struct sudo_event *backchannel_event; + struct sudo_event *fwdchannel_event; + struct sudo_event *sigint_event; + struct sudo_event *sigquit_event; + struct sudo_event *sigtstp_event; + struct sudo_event *sigterm_event; + struct sudo_event *sighup_event; + struct sudo_event *sigalrm_event; + struct sudo_event *sigusr1_event; + struct sudo_event *sigusr2_event; + struct sudo_event *sigchld_event; + struct sudo_event *sigwinch_event; + struct monitor_message_list monitor_messages; +}; + +/* + * I/O buffer with associated read/write events and a logging action. + * Used to, e.g. pass data from the pty to the user's terminal + * and any I/O logging plugins. + */ +struct io_buffer; +typedef bool (*sudo_io_action_t)(const char *, unsigned int, struct io_buffer *); +struct io_buffer { + SLIST_ENTRY(io_buffer) entries; + struct exec_closure_pty *ec; + struct sudo_event *revent; + struct sudo_event *wevent; + sudo_io_action_t action; + int len; /* buffer length (how much produced) */ + int off; /* write position (how much already consumed) */ + char buf[64 * 1024]; +}; +SLIST_HEAD(io_buffer_list, io_buffer); + +static char ptyname[PATH_MAX]; +int io_fds[6] = { -1, -1, -1, -1, -1, -1}; +static bool foreground, pipeline; +static int ttymode = TERM_COOKED; +static sigset_t ttyblock; +static struct io_buffer_list iobufs; +static const char *utmp_user; + +static void del_io_events(bool nonblocking); +static void sync_ttysize(struct exec_closure_pty *ec); +static int safe_close(int fd); +static void ev_free_by_fd(struct sudo_event_base *evbase, int fd); +static void check_foreground(struct exec_closure_pty *ec); +static void add_io_events(struct sudo_event_base *evbase); +static void schedule_signal(struct exec_closure_pty *ec, int signo); + +/* + * Cleanup hook for sudo_fatal()/sudo_fatalx() + */ +void +pty_cleanup(void) +{ + debug_decl(cleanup, SUDO_DEBUG_EXEC); + + if (io_fds[SFD_USERTTY] != -1) + sudo_term_restore(io_fds[SFD_USERTTY], false); + if (utmp_user != NULL) + utmp_logout(ptyname, 0); + + debug_return; +} + +/* + * Allocate a pty if /dev/tty is a tty. + * Fills in io_fds[SFD_USERTTY], io_fds[SFD_MASTER], io_fds[SFD_SLAVE] + * and ptyname globals. + */ +static bool +pty_setup(struct command_details *details, const char *tty) +{ + debug_decl(pty_setup, SUDO_DEBUG_EXEC); + + io_fds[SFD_USERTTY] = open(_PATH_TTY, O_RDWR); + if (io_fds[SFD_USERTTY] == -1) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: no %s, not allocating a pty", + __func__, _PATH_TTY); + debug_return_bool(false); + } + + if (!get_pty(&io_fds[SFD_MASTER], &io_fds[SFD_SLAVE], + ptyname, sizeof(ptyname), details->euid)) + sudo_fatal(U_("unable to allocate pty")); + + /* Update tty name in command details (used by SELinux and AIX). */ + details->tty = ptyname; + + /* Add entry to utmp/utmpx? */ + if (ISSET(details->flags, CD_SET_UTMP)) { + utmp_user = + details->utmp_user ? details->utmp_user : user_details.username; + utmp_login(tty, ptyname, io_fds[SFD_SLAVE], utmp_user); + } + + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: %s fd %d, pty master fd %d, pty slave fd %d", + __func__, _PATH_TTY, io_fds[SFD_USERTTY], io_fds[SFD_MASTER], + io_fds[SFD_SLAVE]); + + debug_return_bool(true); +} + +/* + * Make the tty slave the controlling tty. + * This is only used by the monitor but ptyname[] is static. + */ +int +pty_make_controlling(void) +{ + if (io_fds[SFD_SLAVE] != -1) { +#ifdef TIOCSCTTY + if (ioctl(io_fds[SFD_SLAVE], TIOCSCTTY, NULL) != 0) + return -1; +#else + /* Set controlling tty by reopening pty slave. */ + int fd = open(ptyname, O_RDWR); + if (fd == -1) + return -1; + close(fd); +#endif + } + return 0; +} + +/* Call I/O plugin tty input log method. */ +static bool +log_ttyin(const char *buf, unsigned int n, struct io_buffer *iob) +{ + struct plugin_container *plugin; + sigset_t omask; + bool ret = true; + debug_decl(log_ttyin, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_ttyin) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_ttyin(buf, n); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_ttyin = NULL; + } + ret = false; + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_bool(ret); +} + +/* Call I/O plugin stdin log method. */ +static bool +log_stdin(const char *buf, unsigned int n, struct io_buffer *iob) +{ + struct plugin_container *plugin; + sigset_t omask; + bool ret = true; + debug_decl(log_stdin, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_stdin) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_stdin(buf, n); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_stdin = NULL; + } + ret = false; + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_bool(ret); +} + +/* Call I/O plugin tty output log method. */ +static bool +log_ttyout(const char *buf, unsigned int n, struct io_buffer *iob) +{ + struct plugin_container *plugin; + sigset_t omask; + bool ret = true; + debug_decl(log_ttyout, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_ttyout) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_ttyout(buf, n); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_ttyout = NULL; + } + ret = false; + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + if (!ret) { + /* + * I/O plugin rejected the output, delete the write event + * (user's tty) so we do not display the rejected output. + */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: deleting and freeing devtty wevent %p", __func__, iob->wevent); + sudo_ev_free(iob->wevent); + iob->wevent = NULL; + iob->off = iob->len = 0; + } + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_bool(ret); +} + +/* Call I/O plugin stdout log method. */ +static bool +log_stdout(const char *buf, unsigned int n, struct io_buffer *iob) +{ + struct plugin_container *plugin; + sigset_t omask; + bool ret = true; + debug_decl(log_stdout, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_stdout) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_stdout(buf, n); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_stdout = NULL; + } + ret = false; + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + if (!ret) { + /* + * I/O plugin rejected the output, delete the write event + * (user's stdout) so we do not display the rejected output. + */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: deleting and freeing stdout wevent %p", __func__, iob->wevent); + sudo_ev_free(iob->wevent); + iob->wevent = NULL; + iob->off = iob->len = 0; + } + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_bool(ret); +} + +/* Call I/O plugin stderr log method. */ +static bool +log_stderr(const char *buf, unsigned int n, struct io_buffer *iob) +{ + struct plugin_container *plugin; + sigset_t omask; + bool ret = true; + debug_decl(log_stderr, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_stderr) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_stderr(buf, n); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_stderr = NULL; + } + ret = false; + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + if (!ret) { + /* + * I/O plugin rejected the output, delete the write event + * (user's stderr) so we do not display the rejected output. + */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: deleting and freeing stderr wevent %p", __func__, iob->wevent); + sudo_ev_free(iob->wevent); + iob->wevent = NULL; + iob->off = iob->len = 0; + } + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return_bool(ret); +} + +/* Call I/O plugin suspend log method. */ +static void +log_suspend(int signo) +{ + struct plugin_container *plugin; + sigset_t omask; + debug_decl(log_suspend, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->version < SUDO_API_MKVERSION(1, 13)) + continue; + if (plugin->u.io->log_suspend) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->log_suspend(signo); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->log_suspend = NULL; + } + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return; +} + +/* Call I/O plugin window change log method. */ +static void +log_winchange(unsigned int rows, unsigned int cols) +{ + struct plugin_container *plugin; + sigset_t omask; + debug_decl(log_winchange, SUDO_DEBUG_EXEC); + + sigprocmask(SIG_BLOCK, &ttyblock, &omask); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->version < SUDO_API_MKVERSION(1, 12)) + continue; + if (plugin->u.io->change_winsize) { + int rc; + + sudo_debug_set_active_instance(plugin->debug_instance); + rc = plugin->u.io->change_winsize(rows, cols); + if (rc <= 0) { + if (rc < 0) { + /* Error: disable plugin's I/O function. */ + plugin->u.io->change_winsize = NULL; + } + break; + } + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + sigprocmask(SIG_SETMASK, &omask, NULL); + + debug_return; +} + +/* + * Check whether we are running in the foregroup. + * Updates the foreground global and does lazy init of the + * the pty slave as needed. + */ +static void +check_foreground(struct exec_closure_pty *ec) +{ + debug_decl(check_foreground, SUDO_DEBUG_EXEC); + + if (io_fds[SFD_USERTTY] != -1) { + foreground = tcgetpgrp(io_fds[SFD_USERTTY]) == ec->ppgrp; + + /* Also check for window size changes. */ + sync_ttysize(ec); + } + + debug_return; +} + +/* + * Suspend sudo if the underlying command is suspended. + * Returns SIGCONT_FG if the command should be resumed in the + * foreground or SIGCONT_BG if it is a background process. + */ +static int +suspend_sudo(struct exec_closure_pty *ec, int signo) +{ + char signame[SIG2STR_MAX]; + struct sigaction sa, osa; + int ret = 0; + debug_decl(suspend_sudo, SUDO_DEBUG_EXEC); + + switch (signo) { + case SIGTTOU: + case SIGTTIN: + /* + * If sudo is already the foreground process, just resume the command + * in the foreground. If not, we'll suspend sudo and resume later. + */ + if (!foreground) + check_foreground(ec); + if (foreground) { + if (ttymode != TERM_RAW) { + if (sudo_term_raw(io_fds[SFD_USERTTY], 0)) + ttymode = TERM_RAW; + } + ret = SIGCONT_FG; /* resume command in foreground */ + break; + } + /* FALLTHROUGH */ + case SIGSTOP: + case SIGTSTP: + /* Flush any remaining output and deschedule I/O events. */ + del_io_events(true); + + /* Restore original tty mode before suspending. */ + if (ttymode != TERM_COOKED) + sudo_term_restore(io_fds[SFD_USERTTY], false); + + /* Log the suspend event. */ + log_suspend(signo); + + if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + + /* Suspend self and continue command when we resume. */ + if (signo != SIGSTOP) { + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + if (sudo_sigaction(signo, &sa, &osa) != 0) + sudo_warn(U_("unable to set handler for signal %d"), signo); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "kill parent SIG%s", signame); + if (killpg(ec->ppgrp, signo) != 0) + sudo_warn("killpg(%d, SIG%s)", (int)ec->ppgrp, signame); + + /* Log the resume event. */ + log_suspend(SIGCONT); + + /* Check foreground/background status on resume. */ + check_foreground(ec); + + /* + * We always resume the command in the foreground if sudo itself + * is the foreground process. This helps work around poorly behaved + * programs that catch SIGTTOU/SIGTTIN but suspend themselves with + * SIGSTOP. At worst, sudo will go into the background but upon + * resume the command will be runnable. Otherwise, we can get into + * a situation where the command will immediately suspend itself. + */ + sudo_debug_printf(SUDO_DEBUG_INFO, "parent is in %s, ttymode %d -> %d", + foreground ? "foreground" : "background", ttymode, + foreground ? TERM_RAW : TERM_COOKED); + + if (foreground) { + /* Foreground process, set tty to raw mode. */ + if (sudo_term_raw(io_fds[SFD_USERTTY], 0)) + ttymode = TERM_RAW; + } else { + /* Background process, no access to tty. */ + ttymode = TERM_COOKED; + } + + if (signo != SIGSTOP) { + if (sudo_sigaction(signo, &osa, NULL) != 0) + sudo_warn(U_("unable to restore handler for signal %d"), signo); + } + + ret = ttymode == TERM_RAW ? SIGCONT_FG : SIGCONT_BG; + break; + } + + debug_return_int(ret); +} + +/* + * SIGTTIN signal handler for read_callback that just sets a flag. + */ +static volatile sig_atomic_t got_sigttin; + +static void +sigttin(int signo) +{ + got_sigttin = 1; +} + +/* + * Read an iobuf that is ready. + */ +static void +read_callback(int fd, int what, void *v) +{ + struct io_buffer *iob = v; + struct sudo_event_base *evbase = sudo_ev_get_base(iob->revent); + struct sigaction sa, osa; + int saved_errno; + ssize_t n; + debug_decl(read_callback, SUDO_DEBUG_EXEC); + + /* + * We ignore SIGTTIN by default but we need to handle it when reading + * from the terminal. A signal event won't work here because the + * read() would be restarted, preventing the callback from running. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = sigttin; + got_sigttin = 0; + sigaction(SIGTTIN, &sa, &osa); + n = read(fd, iob->buf + iob->len, sizeof(iob->buf) - iob->len); + saved_errno = errno; + sigaction(SIGTTIN, &osa, NULL); + errno = saved_errno; + + switch (n) { + case -1: + if (got_sigttin) { + /* Schedule SIGTTIN to be forwared to the command. */ + schedule_signal(iob->ec, SIGTTIN); + } + if (errno == EAGAIN || errno == EINTR) + break; + /* treat read error as fatal and close the fd */ + sudo_debug_printf(SUDO_DEBUG_ERROR, + "error reading fd %d: %s", fd, strerror(errno)); + /* FALLTHROUGH */ + case 0: + /* got EOF or pty has gone away */ + if (n == 0) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "read EOF from fd %d", fd); + } + safe_close(fd); + ev_free_by_fd(evbase, fd); + /* If writer already consumed the buffer, close it too. */ + if (iob->wevent != NULL && iob->off == iob->len) { + safe_close(sudo_ev_get_fd(iob->wevent)); + ev_free_by_fd(evbase, sudo_ev_get_fd(iob->wevent)); + iob->off = iob->len = 0; + } + break; + default: + sudo_debug_printf(SUDO_DEBUG_INFO, + "read %zd bytes from fd %d", n, fd); + if (!iob->action(iob->buf + iob->len, n, iob)) { + terminate_command(iob->ec->cmnd_pid, true); + iob->ec->cmnd_pid = -1; + } + iob->len += n; + /* Enable writer now that there is data in the buffer. */ + if (iob->wevent != NULL) { + if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + /* Re-enable reader if buffer is not full. */ + if (iob->len != sizeof(iob->buf)) { + if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + break; + } +} + +/* + * SIGTTOU signal handler for write_callback that just sets a flag. + */ +static volatile sig_atomic_t got_sigttou; + +static void +sigttou(int signo) +{ + got_sigttou = 1; +} + +/* + * Write an iobuf that is ready. + */ +static void +write_callback(int fd, int what, void *v) +{ + struct io_buffer *iob = v; + struct sudo_event_base *evbase = sudo_ev_get_base(iob->wevent); + struct sigaction sa, osa; + int saved_errno; + ssize_t n; + debug_decl(write_callback, SUDO_DEBUG_EXEC); + + /* + * We ignore SIGTTOU by default but we need to handle it when writing + * to the terminal. A signal event won't work here because the + * write() would be restarted, preventing the callback from running. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = sigttou; + got_sigttou = 0; + sigaction(SIGTTOU, &sa, &osa); + n = write(fd, iob->buf + iob->off, iob->len - iob->off); + saved_errno = errno; + sigaction(SIGTTOU, &osa, NULL); + errno = saved_errno; + + if (n == -1) { + switch (errno) { + case EPIPE: + case ENXIO: + case EIO: + case EBADF: + /* other end of pipe closed or pty revoked */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "unable to write %d bytes to fd %d", + iob->len - iob->off, fd); + /* Close reader if there is one. */ + if (iob->revent != NULL) { + safe_close(sudo_ev_get_fd(iob->revent)); + ev_free_by_fd(evbase, sudo_ev_get_fd(iob->revent)); + } + safe_close(fd); + ev_free_by_fd(evbase, fd); + break; + case EINTR: + if (got_sigttou) { + /* Schedule SIGTTOU to be forwared to the command. */ + schedule_signal(iob->ec, SIGTTOU); + } + /* FALLTHROUGH */ + case EAGAIN: + /* not an error */ + break; + default: + /* XXX - need a way to distinguish non-exec error. */ + iob->ec->cstat->type = CMD_ERRNO; + iob->ec->cstat->val = errno; + sudo_debug_printf(SUDO_DEBUG_ERROR, + "error writing fd %d: %s", fd, strerror(errno)); + sudo_ev_loopbreak(evbase); + break; + } + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "wrote %zd bytes to fd %d", n, fd); + iob->off += n; + /* Reset buffer if fully consumed. */ + if (iob->off == iob->len) { + iob->off = iob->len = 0; + /* Forward the EOF from reader to writer. */ + if (iob->revent == NULL) { + safe_close(fd); + ev_free_by_fd(evbase, fd); + } + } + /* Re-enable writer if buffer is not empty. */ + if (iob->len > iob->off) { + if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + /* Enable reader if buffer is not full. */ + if (iob->revent != NULL && + (ttymode == TERM_RAW || !USERTTY_EVENT(iob->revent))) { + if (iob->len != sizeof(iob->buf)) { + if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + } +} + +static void +io_buf_new(int rfd, int wfd, + bool (*action)(const char *, unsigned int, struct io_buffer *), + struct exec_closure_pty *ec, struct io_buffer_list *head) +{ + int n; + struct io_buffer *iob; + debug_decl(io_buf_new, SUDO_DEBUG_EXEC); + + /* Set non-blocking mode. */ + n = fcntl(rfd, F_GETFL, 0); + if (n != -1 && !ISSET(n, O_NONBLOCK)) + (void) fcntl(rfd, F_SETFL, n | O_NONBLOCK); + n = fcntl(wfd, F_GETFL, 0); + if (n != -1 && !ISSET(n, O_NONBLOCK)) + (void) fcntl(wfd, F_SETFL, n | O_NONBLOCK); + + /* Allocate and add to head of list. */ + if ((iob = malloc(sizeof(*iob))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + iob->ec = ec; + iob->revent = sudo_ev_alloc(rfd, SUDO_EV_READ, read_callback, iob); + iob->wevent = sudo_ev_alloc(wfd, SUDO_EV_WRITE, write_callback, iob); + iob->len = 0; + iob->off = 0; + iob->action = action; + iob->buf[0] = '\0'; + if (iob->revent == NULL || iob->wevent == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + SLIST_INSERT_HEAD(head, iob, entries); + + debug_return; +} + +/* + * We already closed the slave pty so reads from the master will not block. + */ +static void +pty_finish(struct command_status *cstat) +{ + struct io_buffer *iob; + int n; + debug_decl(pty_finish, SUDO_DEBUG_EXEC); + + /* Flush any remaining output (the plugin already got it). */ + if (io_fds[SFD_USERTTY] != -1) { + n = fcntl(io_fds[SFD_USERTTY], F_GETFL, 0); + if (n != -1 && ISSET(n, O_NONBLOCK)) { + CLR(n, O_NONBLOCK); + (void) fcntl(io_fds[SFD_USERTTY], F_SETFL, n); + } + } + del_io_events(false); + + /* Free I/O buffers. */ + while ((iob = SLIST_FIRST(&iobufs)) != NULL) { + SLIST_REMOVE_HEAD(&iobufs, entries); + if (iob->revent != NULL) + sudo_ev_free(iob->revent); + if (iob->wevent != NULL) + sudo_ev_free(iob->wevent); + free(iob); + } + + /* Restore terminal settings. */ + if (io_fds[SFD_USERTTY] != -1) + sudo_term_restore(io_fds[SFD_USERTTY], false); + + /* Update utmp */ + if (utmp_user != NULL) + utmp_logout(ptyname, cstat->type == CMD_WSTATUS ? cstat->val : 0); + + debug_return; +} + +/* + * Send command status to the monitor (signal or window size change). + */ +static void +send_command_status(struct exec_closure_pty *ec, int type, int val) +{ + struct monitor_message *msg; + debug_decl(send_command, SUDO_DEBUG_EXEC) + + if ((msg = calloc(1, sizeof(*msg))) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + msg->cstat.type = type; + msg->cstat.val = val; + TAILQ_INSERT_TAIL(&ec->monitor_messages, msg, entries); + + if (sudo_ev_add(ec->evbase, ec->fwdchannel_event, NULL, true) == -1) + sudo_fatal(U_("unable to add event to queue")); + + /* Restart event loop to send the command immediately. */ + sudo_ev_loopcontinue(ec->evbase); + + debug_return; +} + +/* + * Schedule a signal to be forwarded. + */ +static void +schedule_signal(struct exec_closure_pty *ec, int signo) +{ + char signame[SIG2STR_MAX]; + debug_decl(schedule_signal, SUDO_DEBUG_EXEC) + + if (signo == SIGCONT_FG) + strlcpy(signame, "CONT_FG", sizeof(signame)); + else if (signo == SIGCONT_BG) + strlcpy(signame, "CONT_BG", sizeof(signame)); + else if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + sudo_debug_printf(SUDO_DEBUG_DIAG, "scheduled SIG%s for command", signame); + + send_command_status(ec, CMD_SIGNO, signo); + + debug_return; +} + +static void +backchannel_cb(int fd, int what, void *v) +{ + struct exec_closure_pty *ec = v; + struct command_status cstat; + ssize_t nread; + debug_decl(backchannel_cb, SUDO_DEBUG_EXEC) + + /* + * Read command status from the monitor. + * Note that the backchannel is a *blocking* socket. + */ + nread = recv(fd, &cstat, sizeof(cstat), MSG_WAITALL); + switch (nread) { + case -1: + switch (errno) { + case EINTR: + case EAGAIN: + /* Nothing ready. */ + break; + default: + if (ec->cstat->val == CMD_INVALID) { + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = errno; + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: failed to read command status: %s", + __func__, strerror(errno)); + sudo_ev_loopbreak(ec->evbase); + } + break; + } + break; + case 0: + /* EOF, monitor exited or was killed. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "EOF on backchannel, monitor dead?"); + if (ec->cstat->type == CMD_INVALID) { + /* XXX - need new CMD_ type for monitor errors. */ + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = ECONNRESET; + } + sudo_ev_loopexit(ec->evbase); + break; + case sizeof(cstat): + /* Check command status. */ + switch (cstat.type) { + case CMD_PID: + ec->cmnd_pid = cstat.val; + sudo_debug_printf(SUDO_DEBUG_INFO, "executed %s, pid %d", + ec->details->command, (int)ec->cmnd_pid); + break; + case CMD_WSTATUS: + if (WIFSTOPPED(cstat.val)) { + int signo; + + /* Suspend parent and tell monitor how to resume on return. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "command stopped, suspending parent"); + signo = suspend_sudo(ec, WSTOPSIG(cstat.val)); + schedule_signal(ec, signo); + /* Re-enable I/O events */ + add_io_events(ec->evbase); + } else { + /* Command exited or was killed, either way we are done. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "command exited or was killed"); + sudo_ev_loopexit(ec->evbase); + } + *ec->cstat = cstat; + break; + case CMD_ERRNO: + /* Monitor was unable to execute command or broken pipe. */ + sudo_debug_printf(SUDO_DEBUG_INFO, "errno from monitor: %s", + strerror(cstat.val)); + sudo_ev_loopbreak(ec->evbase); + *ec->cstat = cstat; + break; + } + /* Keep reading command status messages until EAGAIN or EOF. */ + break; + default: + /* Short read, should not happen. */ + if (ec->cstat->val == CMD_INVALID) { + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = EIO; + sudo_debug_printf(SUDO_DEBUG_ERROR, + "%s: failed to read command status: short read", __func__); + sudo_ev_loopbreak(ec->evbase); + } + break; + } + debug_return; +} + +/* + * Handle changes to the monitors's status (SIGCHLD). + */ +static void +handle_sigchld_pty(struct exec_closure_pty *ec) +{ + int n, status; + pid_t pid; + debug_decl(handle_sigchld_pty, SUDO_DEBUG_EXEC) + + /* + * Monitor process was signaled; wait for it as needed. + */ + do { + pid = waitpid(ec->monitor_pid, &status, WUNTRACED|WNOHANG); + } while (pid == -1 && errno == EINTR); + switch (pid) { + case 0: + errno = ECHILD; + /* FALLTHROUGH */ + case -1: + sudo_warn(U_("%s: %s"), __func__, "waitpid"); + debug_return; + } + + /* + * If the monitor dies we get notified via backchannel_cb(). + * If it was stopped, we should stop too (the command keeps + * running in its pty) and continue it when we come back. + */ + if (WIFSTOPPED(status)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "monitor stopped, suspending sudo"); + n = suspend_sudo(ec, WSTOPSIG(status)); + kill(pid, SIGCONT); + schedule_signal(ec, n); + /* Re-enable I/O events */ + add_io_events(ec->evbase); + } else if (WIFSIGNALED(status)) { + char signame[SIG2STR_MAX]; + if (sig2str(WTERMSIG(status), signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", WTERMSIG(status)); + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: monitor (%d) killed, SIG%s", + __func__, (int)ec->monitor_pid, signame); + ec->monitor_pid = -1; + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: monitor exited, status %d", __func__, WEXITSTATUS(status)); + ec->monitor_pid = -1; + } + debug_return; +} + +/* Signal callback */ +static void +signal_cb_pty(int signo, int what, void *v) +{ + struct sudo_ev_siginfo_container *sc = v; + struct exec_closure_pty *ec = sc->closure; + char signame[SIG2STR_MAX]; + debug_decl(signal_cb_pty, SUDO_DEBUG_EXEC) + + if (ec->monitor_pid == -1) + debug_return; + + if (sig2str(signo, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", signo); + sudo_debug_printf(SUDO_DEBUG_DIAG, + "%s: evbase %p, monitor: %d, signo %s(%d), cstat %p", __func__, + ec->evbase, (int)ec->monitor_pid, signame, signo, ec->cstat); + + switch (signo) { + case SIGCHLD: + handle_sigchld_pty(ec); + break; + case SIGWINCH: + sync_ttysize(ec); + break; + default: + /* + * Do not forward signals sent by a process in the command's process + * group, as we don't want the command to indirectly kill itself. + * For example, this can happen with some versions of reboot that + * call kill(-1, SIGTERM) to kill all other processes. + */ + if (USER_SIGNALED(sc->siginfo) && sc->siginfo->si_pid != 0) { + pid_t si_pgrp = getpgid(sc->siginfo->si_pid); + if (si_pgrp != -1) { + if (si_pgrp == ec->ppgrp || si_pgrp == ec->cmnd_pid) + debug_return; + } else if (sc->siginfo->si_pid == ec->cmnd_pid) { + debug_return; + } + } + /* Schedule signal to be forwared to the command. */ + schedule_signal(ec, signo); + break; + } + + debug_return; +} + +/* + * Forward signals in monitor_messages to the monitor so it can + * deliver them to the command. + */ +static void +fwdchannel_cb(int sock, int what, void *v) +{ + struct exec_closure_pty *ec = v; + char signame[SIG2STR_MAX]; + struct monitor_message *msg; + ssize_t nsent; + debug_decl(fwdchannel_cb, SUDO_DEBUG_EXEC) + + while ((msg = TAILQ_FIRST(&ec->monitor_messages)) != NULL) { + switch (msg->cstat.type) { + case CMD_SIGNO: + if (msg->cstat.val == SIGCONT_FG) + strlcpy(signame, "CONT_FG", sizeof(signame)); + else if (msg->cstat.val == SIGCONT_BG) + strlcpy(signame, "CONT_BG", sizeof(signame)); + else if (sig2str(msg->cstat.val, signame) == -1) + (void)snprintf(signame, sizeof(signame), "%d", msg->cstat.val); + sudo_debug_printf(SUDO_DEBUG_INFO, + "sending SIG%s to monitor over backchannel", signame); + break; + case CMD_TTYWINCH: + sudo_debug_printf(SUDO_DEBUG_INFO, "sending window size change " + "to monitor over backchannelL %d x %d", + msg->cstat.val & 0xffff, (msg->cstat.val >> 16) & 0xffff); + break; + default: + sudo_debug_printf(SUDO_DEBUG_INFO, + "sending cstat type %d, value %d to monitor over backchannel", + msg->cstat.type, msg->cstat.val); + break; + } + TAILQ_REMOVE(&ec->monitor_messages, msg, entries); + nsent = send(sock, &msg->cstat, sizeof(msg->cstat), 0); + if (nsent != sizeof(msg->cstat)) { + if (errno == EPIPE) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "broken pipe writing to monitor over backchannel"); + /* Other end of socket gone, empty out monitor_messages. */ + free(msg); + while ((msg = TAILQ_FIRST(&ec->monitor_messages)) != NULL) { + TAILQ_REMOVE(&ec->monitor_messages, msg, entries); + free(msg); + } + /* XXX - need new CMD_ type for monitor errors. */ + ec->cstat->type = CMD_ERRNO; + ec->cstat->val = errno; + sudo_ev_loopbreak(ec->evbase); + } + break; + } + free(msg); + } +} + +/* + * Fill in the exec closure and setup initial exec events. + * Allocates events for the signal pipe and backchannel. + * Forwarded signals on the backchannel are enabled on demand. + */ +static void +fill_exec_closure_pty(struct exec_closure_pty *ec, struct command_status *cstat, + struct command_details *details, pid_t ppgrp, int backchannel) +{ + debug_decl(fill_exec_closure_pty, SUDO_DEBUG_EXEC) + + /* Fill in the non-event part of the closure. */ + ec->cmnd_pid = -1; + ec->ppgrp = ppgrp; + ec->cstat = cstat; + ec->details = details; + ec->rows = user_details.ts_rows; + ec->cols = user_details.ts_cols; + TAILQ_INIT(&ec->monitor_messages); + + /* Setup event base and events. */ + ec->evbase = sudo_ev_base_alloc(); + if (ec->evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Event for command status via backchannel. */ + ec->backchannel_event = sudo_ev_alloc(backchannel, + SUDO_EV_READ|SUDO_EV_PERSIST, backchannel_cb, ec); + if (ec->backchannel_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->backchannel_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + sudo_debug_printf(SUDO_DEBUG_INFO, "backchannel fd %d\n", backchannel); + + /* Events for local signals. */ + ec->sigint_event = sudo_ev_alloc(SIGINT, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigint_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigint_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigquit_event = sudo_ev_alloc(SIGQUIT, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigquit_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigquit_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigtstp_event = sudo_ev_alloc(SIGTSTP, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigtstp_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigtstp_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigterm_event = sudo_ev_alloc(SIGTERM, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigterm_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigterm_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sighup_event = sudo_ev_alloc(SIGHUP, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sighup_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sighup_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigalrm_event = sudo_ev_alloc(SIGALRM, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigalrm_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigalrm_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigusr1_event = sudo_ev_alloc(SIGUSR1, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigusr1_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigusr1_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigusr2_event = sudo_ev_alloc(SIGUSR2, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigusr2_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigusr2_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigchld_event = sudo_ev_alloc(SIGCHLD, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigchld_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigchld_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + ec->sigwinch_event = sudo_ev_alloc(SIGWINCH, + SUDO_EV_SIGINFO, signal_cb_pty, ec); + if (ec->sigwinch_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (sudo_ev_add(ec->evbase, ec->sigwinch_event, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + + /* The signal forwarding event gets added on demand. */ + ec->fwdchannel_event = sudo_ev_alloc(backchannel, + SUDO_EV_WRITE, fwdchannel_cb, ec); + if (ec->fwdchannel_event == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Set the default event base. */ + sudo_ev_base_setdef(ec->evbase); + + debug_return; +} + +/* + * Free the dynamically-allocated contents of the exec closure. + */ +static void +free_exec_closure_pty(struct exec_closure_pty *ec) +{ + struct monitor_message *msg; + debug_decl(free_exec_closure_pty, SUDO_DEBUG_EXEC) + + sudo_ev_base_free(ec->evbase); + sudo_ev_free(ec->backchannel_event); + sudo_ev_free(ec->fwdchannel_event); + sudo_ev_free(ec->sigint_event); + sudo_ev_free(ec->sigquit_event); + sudo_ev_free(ec->sigtstp_event); + sudo_ev_free(ec->sigterm_event); + sudo_ev_free(ec->sighup_event); + sudo_ev_free(ec->sigalrm_event); + sudo_ev_free(ec->sigusr1_event); + sudo_ev_free(ec->sigusr2_event); + sudo_ev_free(ec->sigchld_event); + sudo_ev_free(ec->sigwinch_event); + + while ((msg = TAILQ_FIRST(&ec->monitor_messages)) != NULL) { + TAILQ_REMOVE(&ec->monitor_messages, msg, entries); + free(msg); + } + + debug_return; +} + +/* + * Execute a command in a pty, potentially with I/O loggging, and + * wait for it to finish. + * This is a little bit tricky due to how POSIX job control works and + * we fact that we have two different controlling terminals to deal with. + */ +bool +exec_pty(struct command_details *details, struct command_status *cstat) +{ + int io_pipe[3][2] = { { -1, -1 }, { -1, -1 }, { -1, -1 } }; + bool interpose[3] = { false, false, false }; + struct exec_closure_pty ec = { 0 }; + struct plugin_container *plugin; + sigset_t set, oset; + struct sigaction sa; + struct stat sb; + pid_t ppgrp; + int sv[2]; + debug_decl(exec_pty, SUDO_DEBUG_EXEC) + + /* + * Allocate a pty. + */ + if (!pty_setup(details, user_details.tty)) { + if (TAILQ_EMPTY(&io_plugins)) { + /* Not logging I/O and didn't allocate a pty. */ + debug_return_bool(false); + } + } + + /* + * We communicate with the monitor over a bi-directional pair of sockets. + * Parent sends signal info to monitor and monitor sends back wait status. + */ + if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1) + sudo_fatal(U_("unable to create sockets")); + + /* + * We don't want to receive SIGTTIN/SIGTTOU. + * XXX - this affects tcsetattr() and tcsetpgrp() too. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_IGN; + if (sudo_sigaction(SIGTTIN, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGTTIN); + if (sudo_sigaction(SIGTTOU, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGTTOU); + + /* + * The policy plugin's session init must be run before we fork + * or certain pam modules won't be able to track their state. + */ + if (policy_init_session(details) != true) + sudo_fatalx(U_("policy plugin failed session initialization")); + + /* + * Child will run the command in the pty, parent will pass data + * to and from pty. + */ + + /* So we can block tty-generated signals */ + sigemptyset(&ttyblock); + sigaddset(&ttyblock, SIGINT); + sigaddset(&ttyblock, SIGQUIT); + sigaddset(&ttyblock, SIGTSTP); + sigaddset(&ttyblock, SIGTTIN); + sigaddset(&ttyblock, SIGTTOU); + + ppgrp = getpgrp(); /* parent's pgrp, so child can signal us */ + + /* Determine whether any of std{in,out,err} should be logged. */ + TAILQ_FOREACH(plugin, &io_plugins, entries) { + if (plugin->u.io->log_stdin) + interpose[STDIN_FILENO] = true; + if (plugin->u.io->log_stdout) + interpose[STDOUT_FILENO] = true; + if (plugin->u.io->log_stderr) + interpose[STDERR_FILENO] = true; + } + + /* + * Setup stdin/stdout/stderr for command, to be duped after forking. + * In background mode there is no stdin. + */ + if (!ISSET(details->flags, CD_BACKGROUND)) + io_fds[SFD_STDIN] = io_fds[SFD_SLAVE]; + io_fds[SFD_STDOUT] = io_fds[SFD_SLAVE]; + io_fds[SFD_STDERR] = io_fds[SFD_SLAVE]; + + if (io_fds[SFD_USERTTY] != -1) { + /* Read from /dev/tty, write to pty master */ + if (!ISSET(details->flags, CD_BACKGROUND)) { + io_buf_new(io_fds[SFD_USERTTY], io_fds[SFD_MASTER], + log_ttyin, &ec, &iobufs); + } + + /* Read from pty master, write to /dev/tty */ + io_buf_new(io_fds[SFD_MASTER], io_fds[SFD_USERTTY], + log_ttyout, &ec, &iobufs); + + /* Are we the foreground process? */ + foreground = tcgetpgrp(io_fds[SFD_USERTTY]) == ppgrp; + } + + /* + * If stdin, stdout or stderr is not a tty and logging is enabled, + * use a pipe to interpose ourselves instead of using the pty fd. + */ + if (io_fds[SFD_STDIN] == -1 || !isatty(STDIN_FILENO)) { + if (!interpose[STDIN_FILENO]) { + /* Not logging stdin, do not interpose. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "stdin not a tty, not logging"); + if (fstat(STDIN_FILENO, &sb) == 0 && S_ISFIFO(sb.st_mode)) + pipeline = true; + io_fds[SFD_STDIN] = dup(STDIN_FILENO); + if (io_fds[SFD_STDIN] == -1) + sudo_fatal("dup"); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "stdin not a tty, creating a pipe"); + pipeline = true; + if (pipe(io_pipe[STDIN_FILENO]) != 0) + sudo_fatal(U_("unable to create pipe")); + io_buf_new(STDIN_FILENO, io_pipe[STDIN_FILENO][1], + log_stdin, &ec, &iobufs); + io_fds[SFD_STDIN] = io_pipe[STDIN_FILENO][0]; + } + } + if (io_fds[SFD_STDOUT] == -1 || !isatty(STDOUT_FILENO)) { + if (!interpose[STDOUT_FILENO]) { + /* Not logging stdout, do not interpose. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "stdout not a tty, not logging"); + if (fstat(STDOUT_FILENO, &sb) == 0 && S_ISFIFO(sb.st_mode)) + pipeline = true; + io_fds[SFD_STDOUT] = dup(STDOUT_FILENO); + if (io_fds[SFD_STDOUT] == -1) + sudo_fatal("dup"); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "stdout not a tty, creating a pipe"); + pipeline = true; + if (pipe(io_pipe[STDOUT_FILENO]) != 0) + sudo_fatal(U_("unable to create pipe")); + io_buf_new(io_pipe[STDOUT_FILENO][0], STDOUT_FILENO, + log_stdout, &ec, &iobufs); + io_fds[SFD_STDOUT] = io_pipe[STDOUT_FILENO][1]; + } + } + if (io_fds[SFD_STDERR] == -1 || !isatty(STDERR_FILENO)) { + if (!interpose[STDERR_FILENO]) { + /* Not logging stderr, do not interpose. */ + sudo_debug_printf(SUDO_DEBUG_INFO, + "stderr not a tty, not logging"); + if (fstat(STDERR_FILENO, &sb) == 0 && S_ISFIFO(sb.st_mode)) + pipeline = true; + io_fds[SFD_STDERR] = dup(STDERR_FILENO); + if (io_fds[SFD_STDERR] == -1) + sudo_fatal("dup"); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "stderr not a tty, creating a pipe"); + if (pipe(io_pipe[STDERR_FILENO]) != 0) + sudo_fatal(U_("unable to create pipe")); + io_buf_new(io_pipe[STDERR_FILENO][0], STDERR_FILENO, + log_stderr, &ec, &iobufs); + io_fds[SFD_STDERR] = io_pipe[STDERR_FILENO][1]; + } + } + + if (foreground) { + /* Copy terminal attrs from user tty -> pty slave. */ + if (!sudo_term_copy(io_fds[SFD_USERTTY], io_fds[SFD_SLAVE])) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to copy terminal settings to pty", __func__); + foreground = false; + } else { + /* Start in raw mode unless part of a pipeline or backgrounded. */ + if (!pipeline && !ISSET(details->flags, CD_EXEC_BG)) { + if (sudo_term_raw(io_fds[SFD_USERTTY], 0)) + ttymode = TERM_RAW; + } + } + } + + /* + * Block signals until we have our handlers setup in the parent so + * we don't miss SIGCHLD if the command exits immediately. + */ + sigfillset(&set); + sigprocmask(SIG_BLOCK, &set, &oset); + + /* Check for early termination or suspend signals before we fork. */ + if (sudo_terminated(cstat)) { + sigprocmask(SIG_SETMASK, &oset, NULL); + debug_return_int(true); + } + + ec.monitor_pid = sudo_debug_fork(); + switch (ec.monitor_pid) { + case -1: + sudo_fatal(U_("unable to fork")); + break; + case 0: + /* child */ + close(sv[0]); + (void)fcntl(sv[1], F_SETFD, FD_CLOEXEC); + /* Close the other end of the stdin/stdout/stderr pipes and exec. */ + if (io_pipe[STDIN_FILENO][1] != -1) + close(io_pipe[STDIN_FILENO][1]); + if (io_pipe[STDOUT_FILENO][0] != -1) + close(io_pipe[STDOUT_FILENO][0]); + if (io_pipe[STDERR_FILENO][0] != -1) + close(io_pipe[STDERR_FILENO][0]); + /* + * If stdin/stdout is not a tty, start command in the background + * since it might be part of a pipeline that reads from /dev/tty. + * In this case, we rely on the command receiving SIGTTOU or SIGTTIN + * when it needs access to the controlling tty. + */ + exec_monitor(details, &oset, foreground && !pipeline, sv[1]); + cstat->type = CMD_ERRNO; + cstat->val = errno; + if (send(sv[1], cstat, sizeof(*cstat), 0) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: unable to send status to parent", __func__); + } + _exit(1); + } + + /* + * We close the pty slave so only the monitor and command have a + * reference to it. This ensures that we can don't block reading + * from the master when the command and monitor have exited. + */ + if (io_fds[SFD_SLAVE] != -1) { + close(io_fds[SFD_SLAVE]); + io_fds[SFD_SLAVE] = -1; + } + + /* Tell the monitor to continue now that the slave is closed. */ + cstat->type = CMD_SIGNO; + cstat->val = 0; + while (send(sv[0], cstat, sizeof(*cstat), 0) == -1) { + if (errno != EINTR && errno != EAGAIN) + sudo_fatal(U_("unable to send message to monitor process")); + } + + /* Close the other end of the stdin/stdout/stderr pipes and socketpair. */ + if (io_pipe[STDIN_FILENO][0] != -1) + close(io_pipe[STDIN_FILENO][0]); + if (io_pipe[STDOUT_FILENO][1] != -1) + close(io_pipe[STDOUT_FILENO][1]); + if (io_pipe[STDERR_FILENO][1] != -1) + close(io_pipe[STDERR_FILENO][1]); + close(sv[1]); + + /* No longer need execfd. */ + if (details->execfd != -1) { + close(details->execfd); + details->execfd = -1; + } + + /* Set command timeout if specified. */ + if (ISSET(details->flags, CD_SET_TIMEOUT)) + alarm(details->timeout); + + /* + * Fill in exec closure, allocate event base, signal events and + * the backchannel event. + */ + fill_exec_closure_pty(&ec, cstat, details, ppgrp, sv[0]); + + /* Restore signal mask now that signal handlers are setup. */ + sigprocmask(SIG_SETMASK, &oset, NULL); + + /* + * I/O logging must be in the C locale for floating point numbers + * to be logged consistently. + */ + setlocale(LC_ALL, "C"); + + /* + * In the event loop we pass input from user tty to master + * and pass output from master to stdout and IO plugin. + */ + add_io_events(ec.evbase); + if (sudo_ev_dispatch(ec.evbase) == -1) + sudo_warn(U_("error in event loop")); + if (sudo_ev_got_break(ec.evbase)) { + /* error from callback or monitor died */ + sudo_debug_printf(SUDO_DEBUG_ERROR, "event loop exited prematurely"); + /* XXX - may need to terminate command if cmnd_pid != -1 */ + } + + /* Flush any remaining output, free I/O bufs and events, do logout. */ + pty_finish(cstat); + + /* Free things up. */ + free_exec_closure_pty(&ec); + + debug_return_bool(true); +} + +/* + * Schedule I/O events before starting the main event loop or + * resuming from suspend. + */ +static void +add_io_events(struct sudo_event_base *evbase) +{ + struct io_buffer *iob; + debug_decl(add_io_events, SUDO_DEBUG_EXEC); + + /* + * Schedule all readers as long as the buffer is not full. + * Schedule writers that contain buffered data. + * Normally, write buffers are added on demand when data is read. + */ + SLIST_FOREACH(iob, &iobufs, entries) { + /* Don't read from /dev/tty if we are not in the foreground. */ + if (iob->revent != NULL && + (ttymode == TERM_RAW || !USERTTY_EVENT(iob->revent))) { + if (iob->len != sizeof(iob->buf)) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "added I/O revent %p, fd %d, events %d", + iob->revent, iob->revent->fd, iob->revent->events); + if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + if (iob->wevent != NULL) { + /* Enable writer if buffer is not empty. */ + if (iob->len > iob->off) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "added I/O wevent %p, fd %d, events %d", + iob->wevent, iob->wevent->fd, iob->wevent->events); + if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + } + debug_return; +} + +/* + * Flush any output buffered in iobufs or readable from fds other + * than /dev/tty. Removes I/O events from the event base when done. + */ +static void +del_io_events(bool nonblocking) +{ + struct io_buffer *iob; + struct sudo_event_base *evbase; + debug_decl(del_io_events, SUDO_DEBUG_EXEC); + + /* Remove iobufs from existing event base. */ + SLIST_FOREACH(iob, &iobufs, entries) { + if (iob->revent != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "deleted I/O revent %p, fd %d, events %d", + iob->revent, iob->revent->fd, iob->revent->events); + sudo_ev_del(NULL, iob->revent); + } + if (iob->wevent != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "deleted I/O wevent %p, fd %d, events %d", + iob->wevent, iob->wevent->fd, iob->wevent->events); + sudo_ev_del(NULL, iob->wevent); + } + } + + /* Create temporary event base for flushing. */ + evbase = sudo_ev_base_alloc(); + if (evbase == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* Avoid reading from /dev/tty, just flush existing data. */ + SLIST_FOREACH(iob, &iobufs, entries) { + /* Don't read from /dev/tty while flushing. */ + if (iob->revent != NULL && !USERTTY_EVENT(iob->revent)) { + if (iob->len != sizeof(iob->buf)) { + if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + /* Flush any write buffers with data in them. */ + if (iob->wevent != NULL) { + if (iob->len > iob->off) { + if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + } + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: flushing remaining I/O buffers (nonblocking)", __func__); + (void) sudo_ev_loop(evbase, SUDO_EVLOOP_NONBLOCK); + + /* + * If not in non-blocking mode, make sure we flush write buffers. + * We don't want to read from the pty or stdin since that might block + * and the command is no longer running anyway. + */ + if (!nonblocking) { + /* Clear out iobufs from event base. */ + SLIST_FOREACH(iob, &iobufs, entries) { + if (iob->revent != NULL && !USERTTY_EVENT(iob->revent)) + sudo_ev_del(evbase, iob->revent); + if (iob->wevent != NULL) + sudo_ev_del(evbase, iob->wevent); + } + + SLIST_FOREACH(iob, &iobufs, entries) { + /* Flush any write buffers with data in them. */ + if (iob->wevent != NULL) { + if (iob->len > iob->off) { + if (sudo_ev_add(evbase, iob->wevent, NULL, false) == -1) + sudo_fatal(U_("unable to add event to queue")); + } + } + } + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: flushing remaining write buffers (blocking)", __func__); + (void) sudo_ev_dispatch(evbase); + + /* We should now have flushed all write buffers. */ + SLIST_FOREACH(iob, &iobufs, entries) { + if (iob->wevent != NULL) { + if (iob->len > iob->off) { + sudo_debug_printf(SUDO_DEBUG_ERROR, + "unflushed data: wevent %p, fd %d, events %d", + iob->wevent, iob->wevent->fd, iob->wevent->events); + } + } + } + } + + /* Free temporary event base, removing its events. */ + sudo_ev_base_free(evbase); + + debug_return; +} + +/* + * Check for tty size changes. + * Passes the new window size to the I/O plugin and to the monitor. + */ +static void +sync_ttysize(struct exec_closure_pty *ec) +{ + struct winsize wsize; + debug_decl(sync_ttysize, SUDO_DEBUG_EXEC); + + if (ioctl(io_fds[SFD_USERTTY], TIOCGWINSZ, &wsize) == 0) { + if (wsize.ws_row != ec->rows || wsize.ws_col != ec->cols) { + const unsigned int wsize_packed = (wsize.ws_row & 0xffff) | + ((wsize.ws_col & 0xffff) << 16); + + /* Log window change event. */ + log_winchange(wsize.ws_row, wsize.ws_col); + + /* Send window change event to monitor process. */ + send_command_status(ec, CMD_TTYWINCH, wsize_packed); + + /* Update rows/cols. */ + ec->rows = wsize.ws_row; + ec->cols = wsize.ws_col; + } + } + + debug_return; +} + +/* + * Remove and free any events associated with the specified + * file descriptor present in the I/O buffers list. + */ +static void +ev_free_by_fd(struct sudo_event_base *evbase, int fd) +{ + struct io_buffer *iob; + debug_decl(ev_free_by_fd, SUDO_DEBUG_EXEC); + + /* Deschedule any users of the fd and free up the events. */ + SLIST_FOREACH(iob, &iobufs, entries) { + if (iob->revent != NULL) { + if (sudo_ev_get_fd(iob->revent) == fd) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: deleting and freeing revent %p with fd %d", + __func__, iob->revent, fd); + sudo_ev_free(iob->revent); + iob->revent = NULL; + } + } + if (iob->wevent != NULL) { + if (sudo_ev_get_fd(iob->wevent) == fd) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: deleting and freeing wevent %p with fd %d", + __func__, iob->wevent, fd); + sudo_ev_free(iob->wevent); + iob->wevent = NULL; + } + } + } + debug_return; +} + +/* + * Only close the fd if it is not /dev/tty or std{in,out,err}. + * Return value is the same as close(2). + */ +static int +safe_close(int fd) +{ + debug_decl(safe_close, SUDO_DEBUG_EXEC); + + /* Avoid closing /dev/tty or std{in,out,err}. */ + if (fd < 3 || fd == io_fds[SFD_USERTTY]) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: not closing fd %d (%s)", __func__, fd, _PATH_TTY); + errno = EINVAL; + debug_return_int(-1); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: closing fd %d", __func__, fd); + debug_return_int(close(fd)); +} diff --git a/utsudo-0.0.2/src_ori/get_pty.c b/utsudo-0.0.2/src_ori/get_pty.c new file mode 100644 index 0000000..c416c55 --- /dev/null +++ b/utsudo-0.0.2/src_ori/get_pty.c @@ -0,0 +1,197 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2012, 2014-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_SYS_STROPTS_H +#include +#endif /* HAVE_SYS_STROPTS_H */ +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#if defined(HAVE_LIBUTIL_H) +# include +#elif defined(HAVE_UTIL_H) +# include +#endif +#ifdef HAVE_PTY_H +# include +#endif + +#include "utsudo.h" + +#if defined(HAVE_OPENPTY) +bool +get_pty(int *master, int *slave, char *name, size_t namesz, uid_t ttyuid) +{ + struct group *gr; + gid_t ttygid = -1; + bool ret = false; + debug_decl(get_pty, SUDO_DEBUG_PTY) + + if ((gr = getgrnam("tty")) != NULL) + ttygid = gr->gr_gid; + + if (openpty(master, slave, name, NULL, NULL) == 0) { + if (chown(name, ttyuid, ttygid) == 0) + ret = true; + } + + debug_return_bool(ret); +} + +#elif defined(HAVE__GETPTY) +bool +get_pty(int *master, int *slave, char *name, size_t namesz, uid_t ttyuid) +{ + char *line; + bool ret = false; + debug_decl(get_pty, SUDO_DEBUG_PTY) + + /* IRIX-style dynamic ptys (may fork) */ + line = _getpty(master, O_RDWR, S_IRUSR|S_IWUSR|S_IWGRP, 0); + if (line != NULL) { + *slave = open(line, O_RDWR|O_NOCTTY, 0); + if (*slave != -1) { + (void) chown(line, ttyuid, -1); + strlcpy(name, line, namesz); + ret = true; + } else { + close(*master); + *master = -1; + } + } + debug_return_bool(ret); +} +#elif defined(HAVE_GRANTPT) +# ifndef HAVE_POSIX_OPENPT +static int +posix_openpt(int oflag) +{ + int fd; + +# ifdef _AIX + fd = open(_PATH_DEV "ptc", oflag); +# else + fd = open(_PATH_DEV "ptmx", oflag); +# endif + return fd; +} +# endif /* HAVE_POSIX_OPENPT */ + +bool +get_pty(int *master, int *slave, char *name, size_t namesz, uid_t ttyuid) +{ + char *line; + bool ret = false; + debug_decl(get_pty, SUDO_DEBUG_PTY) + + *master = posix_openpt(O_RDWR|O_NOCTTY); + if (*master != -1) { + (void) grantpt(*master); /* may fork */ + if (unlockpt(*master) != 0) { + close(*master); + goto done; + } + line = ptsname(*master); + if (line == NULL) { + close(*master); + goto done; + } + *slave = open(line, O_RDWR|O_NOCTTY, 0); + if (*slave == -1) { + close(*master); + goto done; + } +# if defined(I_PUSH) && !defined(_AIX) + ioctl(*slave, I_PUSH, "ptem"); /* pseudo tty emulation module */ + ioctl(*slave, I_PUSH, "ldterm"); /* line discipline module */ +# endif + (void) chown(line, ttyuid, -1); + strlcpy(name, line, namesz); + ret = true; + } +done: + debug_return_bool(ret); +} + +#else /* Old-style BSD ptys */ + +static char line[] = _PATH_DEV "ptyXX"; + +bool +get_pty(int *master, int *slave, char *name, size_t namesz, uid_t ttyuid) +{ + char *bank, *cp; + struct group *gr; + gid_t ttygid = -1; + bool ret = false; + debug_decl(get_pty, SUDO_DEBUG_PTY) + + if ((gr = getgrnam("tty")) != NULL) + ttygid = gr->gr_gid; + + for (bank = "pqrs"; *bank != '\0'; bank++) { + line[sizeof(_PATH_DEV "ptyX") - 2] = *bank; + for (cp = "0123456789abcdef"; *cp != '\0'; cp++) { + line[sizeof(_PATH_DEV "ptyXX") - 2] = *cp; + *master = open(line, O_RDWR|O_NOCTTY, 0); + if (*master == -1) { + if (errno == ENOENT) + goto done; /* out of ptys */ + continue; /* already in use */ + } + line[sizeof(_PATH_DEV "p") - 2] = 't'; + (void) chown(line, ttyuid, ttygid); + (void) chmod(line, S_IRUSR|S_IWUSR|S_IWGRP); +# ifdef HAVE_REVOKE + (void) revoke(line); +# endif + *slave = open(line, O_RDWR|O_NOCTTY, 0); + if (*slave != -1) { + strlcpy(name, line, namesz); + ret = true; /* success */ + goto done; + } + (void) close(*master); + } + } +done: + debug_return_bool(ret); +} +#endif /* HAVE_OPENPTY */ diff --git a/utsudo-0.0.2/src_ori/hooks.c b/utsudo-0.0.2/src_ori/hooks.c new file mode 100644 index 0000000..43e8f0b --- /dev/null +++ b/utsudo-0.0.2/src_ori/hooks.c @@ -0,0 +1,253 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "utsudo.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + +/* Singly linked hook list. */ +struct sudo_hook_entry { + SLIST_ENTRY(sudo_hook_entry) entries; + union { + sudo_hook_fn_t generic_fn; + sudo_hook_fn_setenv_t setenv_fn; + sudo_hook_fn_unsetenv_t unsetenv_fn; + sudo_hook_fn_getenv_t getenv_fn; + sudo_hook_fn_putenv_t putenv_fn; + } u; + void *closure; +}; +SLIST_HEAD(sudo_hook_list, sudo_hook_entry); + +/* Each hook type gets own hook list. */ +static struct sudo_hook_list sudo_hook_setenv_list = + SLIST_HEAD_INITIALIZER(sudo_hook_setenv_list); +static struct sudo_hook_list sudo_hook_unsetenv_list = + SLIST_HEAD_INITIALIZER(sudo_hook_unsetenv_list); +static struct sudo_hook_list sudo_hook_getenv_list = + SLIST_HEAD_INITIALIZER(sudo_hook_getenv_list); +static struct sudo_hook_list sudo_hook_putenv_list = + SLIST_HEAD_INITIALIZER(sudo_hook_putenv_list); + +/* NOTE: must not anything that might call setenv() */ +int +process_hooks_setenv(const char *name, const char *value, int overwrite) +{ + struct sudo_hook_entry *hook; + int rc = SUDO_HOOK_RET_NEXT; + + /* First process the hooks. */ + SLIST_FOREACH(hook, &sudo_hook_setenv_list, entries) { + rc = hook->u.setenv_fn(name, value, overwrite, hook->closure); + if (rc == SUDO_HOOK_RET_STOP || rc == SUDO_HOOK_RET_ERROR) + break; + } + return rc; +} + +/* NOTE: must not anything that might call putenv() */ +int +process_hooks_putenv(char *string) +{ + struct sudo_hook_entry *hook; + int rc = SUDO_HOOK_RET_NEXT; + + /* First process the hooks. */ + SLIST_FOREACH(hook, &sudo_hook_putenv_list, entries) { + rc = hook->u.putenv_fn(string, hook->closure); + if (rc == SUDO_HOOK_RET_STOP || rc == SUDO_HOOK_RET_ERROR) + break; + } + return rc; +} + +/* NOTE: must not anything that might call getenv() */ +int +process_hooks_getenv(const char *name, char **value) +{ + struct sudo_hook_entry *hook; + char *val = NULL; + int rc = SUDO_HOOK_RET_NEXT; + + /* First process the hooks. */ + SLIST_FOREACH(hook, &sudo_hook_getenv_list, entries) { + rc = hook->u.getenv_fn(name, &val, hook->closure); + if (rc == SUDO_HOOK_RET_STOP || rc == SUDO_HOOK_RET_ERROR) + break; + } + if (val != NULL) + *value = val; + return rc; +} + +/* NOTE: must not anything that might call unsetenv() */ +int +process_hooks_unsetenv(const char *name) +{ + struct sudo_hook_entry *hook; + int rc = SUDO_HOOK_RET_NEXT; + + /* First process the hooks. */ + SLIST_FOREACH(hook, &sudo_hook_unsetenv_list, entries) { + rc = hook->u.unsetenv_fn(name, hook->closure); + if (rc == SUDO_HOOK_RET_STOP || rc == SUDO_HOOK_RET_ERROR) + break; + } + return rc; +} + +/* Hook registration internals. */ +static int +register_hook_internal(struct sudo_hook_list *head, + int (*hook_fn)(), void *closure) +{ + struct sudo_hook_entry *hook; + debug_decl(register_hook_internal, SUDO_DEBUG_HOOKS) + + if ((hook = calloc(1, sizeof(*hook))) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + debug_return_int(-1); + } + hook->u.generic_fn = hook_fn; + hook->closure = closure; + SLIST_INSERT_HEAD(head, hook, entries); + + debug_return_int(0); +} + +/* Register the specified hook. */ +int +register_hook(struct sudo_hook *hook) +{ + int ret; + debug_decl(register_hook, SUDO_DEBUG_HOOKS) + + if (SUDO_API_VERSION_GET_MAJOR(hook->hook_version) != SUDO_HOOK_VERSION_MAJOR) { + /* Major versions must match. */ + errno = EINVAL; + ret = -1; + } else { + switch (hook->hook_type) { + case SUDO_HOOK_GETENV: + ret = register_hook_internal(&sudo_hook_getenv_list, + hook->hook_fn, hook->closure); + break; + case SUDO_HOOK_PUTENV: + ret = register_hook_internal(&sudo_hook_putenv_list, + hook->hook_fn, hook->closure); + break; + case SUDO_HOOK_SETENV: + ret = register_hook_internal(&sudo_hook_setenv_list, + hook->hook_fn, hook->closure); + break; + case SUDO_HOOK_UNSETENV: + ret = register_hook_internal(&sudo_hook_unsetenv_list, + hook->hook_fn, hook->closure); + break; + default: + /* XXX - use define for unknown value */ + errno = ENOTSUP; + ret = 1; + break; + } + } + + debug_return_int(ret); +} + +/* Hook deregistration internals. */ +static void +deregister_hook_internal(struct sudo_hook_list *head, + int (*hook_fn)(), void *closure) +{ + struct sudo_hook_entry *hook, *prev = NULL; + debug_decl(deregister_hook_internal, SUDO_DEBUG_HOOKS) + + SLIST_FOREACH(hook, head, entries) { + if (hook->u.generic_fn == hook_fn && hook->closure == closure) { + /* Remove from list and free. */ + if (prev == NULL) + SLIST_REMOVE_HEAD(head, entries); + else + SLIST_REMOVE_AFTER(prev, entries); + free(hook); + break; + } + prev = hook; + } + + debug_return; +} + +/* Deregister the specified hook. */ +int +deregister_hook(struct sudo_hook *hook) +{ + int ret = 0; + debug_decl(deregister_hook, SUDO_DEBUG_HOOKS) + + if (SUDO_API_VERSION_GET_MAJOR(hook->hook_version) != SUDO_HOOK_VERSION_MAJOR) { + /* Major versions must match. */ + ret = -1; + } else { + switch (hook->hook_type) { + case SUDO_HOOK_GETENV: + deregister_hook_internal(&sudo_hook_getenv_list, hook->hook_fn, + hook->closure); + break; + case SUDO_HOOK_PUTENV: + deregister_hook_internal(&sudo_hook_putenv_list, hook->hook_fn, + hook->closure); + break; + case SUDO_HOOK_SETENV: + deregister_hook_internal(&sudo_hook_setenv_list, hook->hook_fn, + hook->closure); + break; + case SUDO_HOOK_UNSETENV: + deregister_hook_internal(&sudo_hook_unsetenv_list, hook->hook_fn, + hook->closure); + break; + default: + /* XXX - use define for unknown value */ + ret = 1; + break; + } + } + + debug_return_int(ret); +} diff --git a/utsudo-0.0.2/src_ori/limits.c b/utsudo-0.0.2/src_ori/limits.c new file mode 100644 index 0000000..4b5df06 --- /dev/null +++ b/utsudo-0.0.2/src_ori/limits.c @@ -0,0 +1,204 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1999-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef __linux__ +# include +#endif + +#include "utsudo.h" + +static struct saved_limit { + int resource; + bool saved; + struct rlimit limit; +} saved_limits[] = { +#ifdef RLIMIT_AS + { RLIMIT_AS }, +#endif + { RLIMIT_CPU }, + { RLIMIT_DATA }, + { RLIMIT_FSIZE }, + { RLIMIT_NOFILE }, +#ifdef RLIMIT_NPROC + { RLIMIT_NPROC }, +#endif +#ifdef RLIMIT_RSS + { RLIMIT_RSS }, +#endif + { RLIMIT_STACK } +}; + +static struct rlimit corelimit; +static bool coredump_disabled; +#ifdef __linux__ +static struct rlimit nproclimit; +static int dumpflag; +#endif + +/* + * Disable core dumps to avoid dropping a core with user password in it. + * Not all operating systems disable core dumps for setuid processes. + */ +void +disable_coredump(void) +{ + struct rlimit rl = { 0, 0 }; + debug_decl(disable_coredump, SUDO_DEBUG_UTIL) + + if (getrlimit(RLIMIT_CORE, &corelimit) == -1) + sudo_warn("getrlimit(RLIMIT_CORE)"); + if (setrlimit(RLIMIT_CORE, &rl) == -1) + sudo_warn("setrlimit(RLIMIT_CORE)"); +#ifdef __linux__ + /* On Linux, also set PR_SET_DUMPABLE to zero (reset by execve). */ + if ((dumpflag = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0)) == -1) + dumpflag = 0; + (void) prctl(PR_SET_DUMPABLE, 0, 0, 0, 0); +#endif /* __linux__ */ + coredump_disabled = true; + + debug_return; +} + +/* + * Restore core resource limit before executing the command. + */ +static void +restore_coredump(void) +{ + debug_decl(restore_coredump, SUDO_DEBUG_UTIL) + + if (coredump_disabled) { + if (setrlimit(RLIMIT_CORE, &corelimit) == -1) + sudo_warn("setrlimit(RLIMIT_CORE)"); +#ifdef __linux__ + (void) prctl(PR_SET_DUMPABLE, dumpflag, 0, 0, 0); +#endif /* __linux__ */ + } + debug_return; +} + +/* + * Unlimit the number of processes since Linux's setuid() will + * apply resource limits when changing uid and return EAGAIN if + * nproc would be exceeded by the uid switch. + * + * This function is called *after* session setup and before the + * final setuid() call. + */ +void +unlimit_nproc(void) +{ +#ifdef __linux__ + struct rlimit rl = { RLIM_INFINITY, RLIM_INFINITY }; + debug_decl(unlimit_nproc, SUDO_DEBUG_UTIL) + + if (getrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("getrlimit(RLIMIT_NPROC)"); + if (setrlimit(RLIMIT_NPROC, &rl) == -1) { + rl.rlim_cur = rl.rlim_max = nproclimit.rlim_max; + if (setrlimit(RLIMIT_NPROC, &rl) != 0) + sudo_warn("setrlimit(RLIMIT_NPROC)"); + } + debug_return; +#endif /* __linux__ */ +} + +/* + * Restore saved value of RLIMIT_NPROC before execve(). + */ +void +restore_nproc(void) +{ +#ifdef __linux__ + debug_decl(restore_nproc, SUDO_DEBUG_UTIL) + + if (setrlimit(RLIMIT_NPROC, &nproclimit) != 0) + sudo_warn("setrlimit(RLIMIT_NPROC)"); + + debug_return; +#endif /* __linux__ */ +} + +/* + * Unlimit resource limits so sudo is not limited by, e.g. + * stack, data or file table sizes. + */ +void +unlimit_sudo(void) +{ + struct rlimit inf = { RLIM_INFINITY, RLIM_INFINITY }; + unsigned int idx; + debug_decl(unlimit_sudo, SUDO_DEBUG_UTIL) + + /* Set resource limits to unlimited and stash the old values. */ + for (idx = 0; idx < nitems(saved_limits); idx++) { + struct saved_limit *lim = &saved_limits[idx]; + if (getrlimit(lim->resource, &lim->limit) == -1) + continue; + lim->saved = true; + if (setrlimit(lim->resource, &inf) == -1) { + struct rlimit rl = lim->limit; + rl.rlim_cur = rl.rlim_max; + if (setrlimit(lim->resource, &rl) == -1) + sudo_warn("setrlimit(%d)", lim->resource); + } + } + + debug_return; +} + +/* + * Restore resource limits modified by unlimit_sudo() and disable_coredump(). + */ +void +restore_limits(void) +{ + unsigned int idx; + debug_decl(restore_limits, SUDO_DEBUG_UTIL) + + /* Restore resource limits to saved values. */ + for (idx = 0; idx < nitems(saved_limits); idx++) { + struct saved_limit *lim = &saved_limits[idx]; + if (lim->saved) { + if (setrlimit(lim->resource, &lim->limit) == -1) + sudo_warn("setrlimit(%d)", lim->resource); + } + } + restore_coredump(); + + debug_return; +} diff --git a/utsudo-0.0.2/src_ori/load_plugins.c b/utsudo-0.0.2/src_ori/load_plugins.c new file mode 100644 index 0000000..eea5778 --- /dev/null +++ b/utsudo-0.0.2/src_ori/load_plugins.c @@ -0,0 +1,375 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "utsudo.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" +#include "sudo_dso.h" + +/* We always use the same name for the sudoers plugin, regardless of the OS */ +#define SUDOERS_PLUGIN "sudoers.so" + +#ifdef ENABLE_SUDO_PLUGIN_API +static int +sudo_stat_plugin(struct plugin_info *info, char *fullpath, + size_t pathsize, struct stat *sb) +{ + int status = -1; + debug_decl(sudo_stat_plugin, SUDO_DEBUG_PLUGIN) + + if (info->path[0] == '/') { + if (strlcpy(fullpath, info->path, pathsize) >= pathsize) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("%s: %s"), info->path, strerror(ENAMETOOLONG)); + goto done; + } + status = stat(fullpath, sb); + } else { + int len; + +#ifdef STATIC_SUDOERS_PLUGIN + /* Check static symbols. */ + if (strcmp(info->path, SUDOERS_PLUGIN) == 0) { + if (strlcpy(fullpath, info->path, pathsize) >= pathsize) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("%s: %s"), info->path, strerror(ENAMETOOLONG)); + goto done; + } + /* Plugin is static, fake up struct stat. */ + memset(sb, 0, sizeof(*sb)); + sb->st_uid = ROOT_UID; + sb->st_mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH; + status = 0; + goto done; + } +#endif /* STATIC_SUDOERS_PLUGIN */ + + if (sudo_conf_plugin_dir_path() == NULL) { + errno = ENOENT; + goto done; + } + + len = snprintf(fullpath, pathsize, "%s%s", sudo_conf_plugin_dir_path(), + info->path); + if (len < 0 || (size_t)len >= pathsize) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("%s%s: %s"), sudo_conf_plugin_dir_path(), info->path, + strerror(ENAMETOOLONG)); + goto done; + } + /* Try parent dir for compatibility with old plugindir default. */ + if ((status = stat(fullpath, sb)) != 0) { + char *cp = strrchr(fullpath, '/'); + if (cp > fullpath + 4 && cp[-5] == '/' && cp[-4] == 's' && + cp[-3] == 'u' && cp[-2] == 'd' && cp[-1] == 'o') { + int serrno = errno; + strlcpy(cp - 4, info->path, pathsize - (cp - 4 - fullpath)); + if ((status = stat(fullpath, sb)) != 0) + errno = serrno; + } + } + } +done: + debug_return_int(status); +} + +static bool +sudo_check_plugin(struct plugin_info *info, char *fullpath, size_t pathsize) +{ + struct stat sb; + bool ret = false; + debug_decl(sudo_check_plugin, SUDO_DEBUG_PLUGIN) + + if (sudo_stat_plugin(info, fullpath, pathsize, &sb) != 0) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + if (info->path[0] == '/') { + sudo_warn("%s", info->path); + } else { + sudo_warn("%s%s", + sudo_conf_plugin_dir_path() ? sudo_conf_plugin_dir_path() : "", + info->path); + } + goto done; + } + if (sb.st_uid != ROOT_UID) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("%s must be owned by uid %d"), fullpath, ROOT_UID); + goto done; + } + if ((sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("%s must be only be writable by owner"), fullpath); + goto done; + } + ret = true; + +done: + debug_return_bool(ret); +} +#else +static bool +sudo_check_plugin(struct plugin_info *info, char *fullpath, size_t pathsize) +{ + debug_decl(sudo_check_plugin, SUDO_DEBUG_PLUGIN) + (void)strlcpy(fullpath, info->path, pathsize); + debug_return_bool(true); +} +#endif /* ENABLE_SUDO_PLUGIN_API */ + +/* + * Load the plugin specified by "info". + */ +static bool +sudo_load_plugin(struct plugin_container *policy_plugin, + struct plugin_container_list *io_plugins, struct plugin_info *info) +{ + struct plugin_container *container = NULL; + struct generic_plugin *plugin; + char path[PATH_MAX]; + void *handle = NULL; + debug_decl(sudo_load_plugin, SUDO_DEBUG_PLUGIN) + + /* Sanity check plugin and fill in path */ + if (!sudo_check_plugin(info, path, sizeof(path))) + goto bad; + + /* Open plugin and map in symbol */ + handle = sudo_dso_load(path, SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + if (!handle) { + const char *errstr = sudo_dso_strerror(); + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("unable to load %s: %s"), path, + errstr ? errstr : "unknown error"); + goto bad; + } + plugin = sudo_dso_findsym(handle, info->symbol_name); + if (!plugin) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("unable to find symbol \"%s\" in %s"), info->symbol_name, path); + goto bad; + } + + if (plugin->type != SUDO_POLICY_PLUGIN && plugin->type != SUDO_IO_PLUGIN) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("unknown policy type %d found in %s"), plugin->type, path); + goto bad; + } + if (SUDO_API_VERSION_GET_MAJOR(plugin->version) != SUDO_API_VERSION_MAJOR) { + sudo_warnx(U_("error in %s, line %d while loading plugin \"%s\""), + _PATH_SUDO_CONF, info->lineno, info->symbol_name); + sudo_warnx(U_("incompatible plugin major version %d (expected %d) found in %s"), + SUDO_API_VERSION_GET_MAJOR(plugin->version), + SUDO_API_VERSION_MAJOR, path); + goto bad; + } + if (plugin->type == SUDO_POLICY_PLUGIN) { + if (policy_plugin->handle != NULL) { + /* Ignore duplicate entries. */ + if (strcmp(policy_plugin->name, info->symbol_name) != 0) { + sudo_warnx(U_("ignoring policy plugin \"%s\" in %s, line %d"), + info->symbol_name, _PATH_SUDO_CONF, info->lineno); + sudo_warnx(U_("only a single policy plugin may be specified")); + goto bad; + } + sudo_warnx(U_("ignoring duplicate policy plugin \"%s\" in %s, line %d"), + info->symbol_name, _PATH_SUDO_CONF, info->lineno); + goto bad; + } + policy_plugin->handle = handle; + policy_plugin->path = strdup(path); + if (policy_plugin->path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + policy_plugin->name = info->symbol_name; + policy_plugin->options = info->options; + policy_plugin->debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + policy_plugin->u.generic = plugin; + policy_plugin->debug_files = sudo_conf_debug_files(path); + } else if (plugin->type == SUDO_IO_PLUGIN) { + /* Check for duplicate entries. */ + TAILQ_FOREACH(container, io_plugins, entries) { + if (strcmp(container->name, info->symbol_name) == 0) { + sudo_warnx(U_("ignoring duplicate I/O plugin \"%s\" in %s, line %d"), + info->symbol_name, _PATH_SUDO_CONF, info->lineno); + sudo_dso_unload(handle); + handle = NULL; + break; + } + } + container = calloc(1, sizeof(*container)); + if (container == NULL || (container->path = strdup(path)) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + container->handle = handle; + container->name = info->symbol_name; + container->options = info->options; + container->debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; + container->u.generic = plugin; + container->debug_files = sudo_conf_debug_files(path); + TAILQ_INSERT_TAIL(io_plugins, container, entries); + } + + /* Zero out info strings that we now own (see above). */ + info->symbol_name = NULL; + info->options = NULL; + + debug_return_bool(true); +bad: + free(container); + if (handle != NULL) + sudo_dso_unload(handle); + debug_return_bool(false); +} + +static void +free_plugin_info(struct plugin_info *info) +{ + free(info->path); + free(info->symbol_name); + if (info->options != NULL) { + int i = 0; + while (info->options[i] != NULL) + free(info->options[i++]); + free(info->options); + } + free(info); +} + +/* + * Load the plugins listed in sudo.conf. + */ +bool +sudo_load_plugins(struct plugin_container *policy_plugin, + struct plugin_container_list *io_plugins) +{ + struct plugin_container *container; + struct plugin_info_list *plugins; + struct plugin_info *info, *next; + bool ret = false; + debug_decl(sudo_load_plugins, SUDO_DEBUG_PLUGIN) + + /* Walk the plugin list from sudo.conf, if any and free it. */ + plugins = sudo_conf_plugins(); + TAILQ_FOREACH_SAFE(info, plugins, entries, next) { + ret = sudo_load_plugin(policy_plugin, io_plugins, info); + if (!ret) + goto done; + free_plugin_info(info); + } + TAILQ_INIT(plugins); + + /* + * If no policy plugin, fall back to the default (sudoers). + * If there is also no I/O log plugin, use sudoers for that too. + */ + if (policy_plugin->handle == NULL) { + /* Default policy plugin */ + info = calloc(1, sizeof(*info)); + if (info == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + info->symbol_name = strdup("sudoers_policy"); + info->path = strdup(SUDOERS_PLUGIN); + if (info->symbol_name == NULL || info->path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_plugin_info(info); + goto done; + } + /* info->options = NULL; */ + ret = sudo_load_plugin(policy_plugin, io_plugins, info); + free_plugin_info(info); + if (!ret) + goto done; + + /* Default I/O plugin */ + if (TAILQ_EMPTY(io_plugins)) { + info = calloc(1, sizeof(*info)); + if (info == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + info->symbol_name = strdup("sudoers_io"); + info->path = strdup(SUDOERS_PLUGIN); + if (info->symbol_name == NULL || info->path == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + free_plugin_info(info); + goto done; + } + /* info->options = NULL; */ + ret = sudo_load_plugin(policy_plugin, io_plugins, info); + free_plugin_info(info); + if (!ret) + goto done; + } + } + if (policy_plugin->u.policy->check_policy == NULL) { + sudo_warnx(U_("policy plugin %s does not include a check_policy method"), + policy_plugin->name); + ret = false; + goto done; + } + + /* Install hooks (XXX - later). */ + sudo_debug_set_active_instance(SUDO_DEBUG_INSTANCE_INITIALIZER); + if (policy_plugin->u.policy->version >= SUDO_API_MKVERSION(1, 2)) { + if (policy_plugin->u.policy->register_hooks != NULL) + policy_plugin->u.policy->register_hooks(SUDO_HOOK_VERSION, register_hook); + } + TAILQ_FOREACH(container, io_plugins, entries) { + if (container->u.io->version >= SUDO_API_MKVERSION(1, 2)) { + if (container->u.io->register_hooks != NULL) + container->u.io->register_hooks(SUDO_HOOK_VERSION, register_hook); + } + } + sudo_debug_set_active_instance(sudo_debug_instance); + +done: + debug_return_bool(ret); +} diff --git a/utsudo-0.0.2/src_ori/net_ifs.c b/utsudo-0.0.2/src_ori/net_ifs.c new file mode 100644 index 0000000..9014b65 --- /dev/null +++ b/utsudo-0.0.2/src_ori/net_ifs.c @@ -0,0 +1,374 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2015, 2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +/* + * Suppress a warning w/ gcc on Digital UN*X. + * The system headers should really do this.... + */ +#if defined(__osf__) && !defined(__cplusplus) +struct mbuf; +struct rtentry; +#endif + +/* Avoid a compilation problem with gcc and machine/sys/getppdp.h */ +#define _MACHINE_SYS_GETPPDP_INCLUDED + +#include + +#include +#include +#include +#if defined(HAVE_SYS_SOCKIO_H) && !defined(SIOCGIFCONF) +# include +#endif +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include +#ifdef _ISC +# include +# include +# include +# define STRSET(cmd, param, len) {strioctl.ic_cmd=(cmd);\ + strioctl.ic_dp=(param);\ + strioctl.ic_timout=0;\ + strioctl.ic_len=(len);} +#endif /* _ISC */ +#ifdef _MIPS +# include +#endif /* _MIPS */ +#include +#include +#ifdef NEED_RESOLV_H +# include +# include +#endif /* NEED_RESOLV_H */ +#include +#ifdef HAVE_GETIFADDRS +# include +#endif + +#define SUDO_NET_IFS_C /* to expose sudo_inet_ntop in sudo_compat.h */ + +#define DEFAULT_TEXT_DOMAIN "sudo" +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_conf.h" +#include "sudo_debug.h" + +/* Minix apparently lacks IFF_LOOPBACK */ +#ifndef IFF_LOOPBACK +# define IFF_LOOPBACK 0 +#endif + +#ifndef INET_ADDRSTRLEN +# define INET_ADDRSTRLEN 16 +#endif +#ifndef INET6_ADDRSTRLEN +# define INET6_ADDRSTRLEN 46 +#endif + +#ifdef HAVE_GETIFADDRS + +/* + * Fill in the interfaces string with the machine's ip addresses and netmasks + * and return the number of interfaces found. Returns -1 on error. + */ +int +get_net_ifs(char **addrinfo) +{ + struct ifaddrs *ifa, *ifaddrs; + struct sockaddr_in *sin; +#ifdef HAVE_STRUCT_IN6_ADDR + struct sockaddr_in6 *sin6; + char addrstr[INET6_ADDRSTRLEN], maskstr[INET6_ADDRSTRLEN]; +#else + char addrstr[INET_ADDRSTRLEN], maskstr[INET_ADDRSTRLEN]; +#endif + int ailen, len, num_interfaces = 0; + char *cp; + debug_decl(get_net_ifs, SUDO_DEBUG_NETIF) + + if (!sudo_conf_probe_interfaces()) + debug_return_int(0); + + if (getifaddrs(&ifaddrs) == -1) + debug_return_int(-1); + + /* Allocate space for the interfaces info string. */ + for (ifa = ifaddrs; ifa != NULL; ifa = ifa -> ifa_next) { + /* Skip interfaces marked "down" and "loopback". */ + if (ifa->ifa_addr == NULL || ifa->ifa_netmask == NULL || + !ISSET(ifa->ifa_flags, IFF_UP) || ISSET(ifa->ifa_flags, IFF_LOOPBACK)) + continue; + + switch (ifa->ifa_addr->sa_family) { + case AF_INET: +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: +#endif + num_interfaces++; + break; + } + } + if (num_interfaces == 0) + goto done; + ailen = num_interfaces * 2 * INET6_ADDRSTRLEN; + if ((cp = malloc(ailen)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + num_interfaces = -1; + goto done; + } + *addrinfo = cp; + + /* Store the IP addr/netmask pairs. */ + for (ifa = ifaddrs; ifa != NULL; ifa = ifa -> ifa_next) { + /* Skip interfaces marked "down" and "loopback". */ + if (ifa->ifa_addr == NULL || ifa->ifa_netmask == NULL || + !ISSET(ifa->ifa_flags, IFF_UP) || ISSET(ifa->ifa_flags, IFF_LOOPBACK)) + continue; + + switch (ifa->ifa_addr->sa_family) { + case AF_INET: + sin = (struct sockaddr_in *)ifa->ifa_addr; + if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) + continue; + sin = (struct sockaddr_in *)ifa->ifa_netmask; + if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) + continue; + + len = snprintf(cp, ailen - (*addrinfo - cp), + "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr); + if (len < 0 || len >= ailen - (*addrinfo - cp)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + cp += len; + break; +#ifdef HAVE_STRUCT_IN6_ADDR + case AF_INET6: + sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; + if (inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr, sizeof(addrstr)) == NULL) + continue; + sin6 = (struct sockaddr_in6 *)ifa->ifa_netmask; + if (inet_ntop(AF_INET6, &sin6->sin6_addr, maskstr, sizeof(maskstr)) == NULL) + continue; + + len = snprintf(cp, ailen - (*addrinfo - cp), + "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr); + if (len < 0 || len >= ailen - (*addrinfo - cp)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + cp += len; + break; +#endif /* HAVE_STRUCT_IN6_ADDR */ + } + } + +done: +#ifdef HAVE_FREEIFADDRS + freeifaddrs(ifaddrs); +#else + free(ifaddrs); +#endif + debug_return_int(num_interfaces); +} + +#elif defined(SIOCGIFCONF) && !defined(STUB_LOAD_INTERFACES) + +/* + * Fill in the interfaces string with the machine's ip addresses and netmasks + * and return the number of interfaces found. Returns -1 on error. + */ +int +get_net_ifs(char **addrinfo) +{ + char ifr_tmpbuf[sizeof(struct ifreq)]; + struct ifreq *ifr, *ifr_tmp = (struct ifreq *)ifr_tmpbuf; + struct ifconf *ifconf; + struct sockaddr_in *sin; + int ailen, i, len, n, sock, num_interfaces = 0; + size_t buflen = sizeof(struct ifconf) + BUFSIZ; + char *cp, *previfname = "", *ifconf_buf = NULL; + char addrstr[INET_ADDRSTRLEN], maskstr[INET_ADDRSTRLEN]; +#ifdef _ISC + struct strioctl strioctl; +#endif /* _ISC */ + debug_decl(get_net_ifs, SUDO_DEBUG_NETIF) + + if (!sudo_conf_probe_interfaces()) + debug_return_int(0); + + sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) + debug_return_int(-1); + + /* + * Get interface configuration or return. + */ + for (;;) { + if ((ifconf_buf = malloc(buflen)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + num_interfaces = -1; + goto done; + } + ifconf = (struct ifconf *) ifconf_buf; + ifconf->ifc_len = buflen - sizeof(struct ifconf); + ifconf->ifc_buf = (caddr_t) (ifconf_buf + sizeof(struct ifconf)); + +#ifdef _ISC + STRSET(SIOCGIFCONF, (caddr_t) ifconf, buflen); + if (ioctl(sock, I_STR, (caddr_t) &strioctl) < 0) +#else + /* Note that some kernels return EINVAL if the buffer is too small */ + if (ioctl(sock, SIOCGIFCONF, (caddr_t) ifconf) < 0 && errno != EINVAL) +#endif /* _ISC */ + goto done; + + /* Break out of loop if we have a big enough buffer. */ + if (ifconf->ifc_len + sizeof(struct ifreq) < buflen) + break; + buflen += BUFSIZ; + free(ifconf_buf); + } + + /* Allocate space for the maximum number of interfaces that could exist. */ + if ((n = ifconf->ifc_len / sizeof(struct ifreq)) == 0) + goto done; + ailen = n * 2 * INET6_ADDRSTRLEN; + if ((cp = malloc(ailen)) == NULL) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to allocate memory"); + num_interfaces = -1; + goto done; + } + *addrinfo = cp; + + /* For each interface, store the ip address and netmask. */ + for (i = 0; i < ifconf->ifc_len; ) { + /* Get a pointer to the current interface. */ + ifr = (struct ifreq *) &ifconf->ifc_buf[i]; + + /* Set i to the subscript of the next interface. */ + i += sizeof(struct ifreq); +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + if (ifr->ifr_addr.sa_len > sizeof(ifr->ifr_addr)) + i += ifr->ifr_addr.sa_len - sizeof(struct sockaddr); +#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */ + + /* Skip duplicates and interfaces with NULL addresses. */ + sin = (struct sockaddr_in *) &ifr->ifr_addr; + if (sin->sin_addr.s_addr == 0 || + strncmp(previfname, ifr->ifr_name, sizeof(ifr->ifr_name) - 1) == 0) + continue; + + if (ifr->ifr_addr.sa_family != AF_INET) + continue; + +#ifdef SIOCGIFFLAGS + memset(ifr_tmp, 0, sizeof(*ifr_tmp)); + memcpy(ifr_tmp->ifr_name, ifr->ifr_name, sizeof(ifr_tmp->ifr_name)); + if (ioctl(sock, SIOCGIFFLAGS, (caddr_t) ifr_tmp) < 0) +#endif + memcpy(ifr_tmp, ifr, sizeof(*ifr_tmp)); + + /* Skip interfaces marked "down" and "loopback". */ + if (!ISSET(ifr_tmp->ifr_flags, IFF_UP) || + ISSET(ifr_tmp->ifr_flags, IFF_LOOPBACK)) + continue; + + /* Get the netmask. */ + memset(ifr_tmp, 0, sizeof(*ifr_tmp)); + memcpy(ifr_tmp->ifr_name, ifr->ifr_name, sizeof(ifr_tmp->ifr_name)); + sin = (struct sockaddr_in *) &ifr_tmp->ifr_addr; +#ifdef _ISC + STRSET(SIOCGIFNETMASK, (caddr_t) ifr_tmp, sizeof(*ifr_tmp)); + if (ioctl(sock, I_STR, (caddr_t) &strioctl) < 0) +#else + if (ioctl(sock, SIOCGIFNETMASK, (caddr_t) ifr_tmp) < 0) +#endif /* _ISC */ + sin->sin_addr.s_addr = htonl(IN_CLASSC_NET); + + /* Convert the addr and mask to string form. */ + sin = (struct sockaddr_in *) &ifr->ifr_addr; + if (inet_ntop(AF_INET, &sin->sin_addr, addrstr, sizeof(addrstr)) == NULL) + continue; + sin = (struct sockaddr_in *) &ifr_tmp->ifr_addr; + if (inet_ntop(AF_INET, &sin->sin_addr, maskstr, sizeof(maskstr)) == NULL) + continue; + + len = snprintf(cp, ailen - (*addrinfo - cp), + "%s%s/%s", cp == *addrinfo ? "" : " ", addrstr, maskstr); + if (len < 0 || len >= ailen - (*addrinfo - cp)) { + sudo_warnx(U_("internal error, %s overflow"), __func__); + goto done; + } + cp += len; + + /* Stash the name of the interface we saved. */ + previfname = ifr->ifr_name; + num_interfaces++; + } + +done: + free(ifconf_buf); + (void) close(sock); + + debug_return_int(num_interfaces); +} + +#else /* !SIOCGIFCONF || STUB_LOAD_INTERFACES */ + +/* + * Stub function for those without SIOCGIFCONF or getifaddrs() + */ +int +get_net_ifs(char **addrinfo) +{ + debug_decl(get_net_ifs, SUDO_DEBUG_NETIF) + debug_return_int(0); +} + +#endif /* SIOCGIFCONF && !STUB_LOAD_INTERFACES */ diff --git a/utsudo-0.0.2/src_ori/openbsd.c b/utsudo-0.0.2/src_ori/openbsd.c new file mode 100644 index 0000000..55b46db --- /dev/null +++ b/utsudo-0.0.2/src_ori/openbsd.c @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include + +#include "utsudo.h" + +int +os_init(int argc, char *argv[], char *envp[]) +{ +#ifdef SUDO_DEVEL + extern char *malloc_options; + malloc_options = "S"; +#endif + return os_init_common(argc, argv, envp); +} diff --git a/utsudo-0.0.2/src_ori/parse_args.c b/utsudo-0.0.2/src_ori/parse_args.c new file mode 100644 index 0000000..f90306f --- /dev/null +++ b/utsudo-0.0.2/src_ori/parse_args.c @@ -0,0 +1,801 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include +#include "utsudo.h" +#include "sudo_lbuf.h" + +#ifdef HAVE_GETOPT_LONG +# include +# else +# include "compat/getopt.h" +#endif /* HAVE_GETOPT_LONG */ + +int tgetpass_flags; + +/* + * Local functions. + */ +static void help(void) __attribute__((__noreturn__)); +static void usage_excl(int); + +/* + * Mapping of command line flags to name/value settings. + */ +static struct sudo_settings sudo_settings[] = { +#define ARG_BSDAUTH_TYPE 0 + { "bsdauth_type" }, +#define ARG_LOGIN_CLASS 1 + { "login_class" }, +#define ARG_PRESERVE_ENVIRONMENT 2 + { "preserve_environment" }, +#define ARG_RUNAS_GROUP 3 + { "runas_group" }, +#define ARG_SET_HOME 4 + { "set_home" }, +#define ARG_USER_SHELL 5 + { "run_shell" }, +#define ARG_LOGIN_SHELL 6 + { "login_shell" }, +#define ARG_IGNORE_TICKET 7 + { "ignore_ticket" }, +#define ARG_PROMPT 8 + { "prompt" }, +#define ARG_SELINUX_ROLE 9 + { "selinux_role" }, +#define ARG_SELINUX_TYPE 10 + { "selinux_type" }, +#define ARG_RUNAS_USER 11 + { "runas_user" }, +#define ARG_PROGNAME 12 + { "progname" }, +#define ARG_IMPLIED_SHELL 13 + { "implied_shell" }, +#define ARG_PRESERVE_GROUPS 14 + { "preserve_groups" }, +#define ARG_NONINTERACTIVE 15 + { "noninteractive" }, +#define ARG_SUDOEDIT 16 + { "sudoedit" }, +#define ARG_CLOSEFROM 17 + { "closefrom" }, +#define ARG_NET_ADDRS 18 + { "network_addrs" }, +#define ARG_MAX_GROUPS 19 + { "max_groups" }, +#define ARG_PLUGIN_DIR 20 + { "plugin_dir" }, +#define ARG_REMOTE_HOST 21 + { "remote_host" }, +#define ARG_TIMEOUT 22 + { "timeout" }, +#define NUM_SETTINGS 23 + { NULL } +}; + +struct environment { + char **envp; /* pointer to the new environment */ + size_t env_size; /* size of new_environ in char **'s */ + size_t env_len; /* number of slots used, not counting NULL */ +}; + +/* + * Default flags allowed when running a command. + */ +#define DEFAULT_VALID_FLAGS (MODE_BACKGROUND|MODE_PRESERVE_ENV|MODE_RESET_HOME|MODE_LOGIN_SHELL|MODE_NONINTERACTIVE|MODE_PRESERVE_GROUPS|MODE_SHELL) +#define EDIT_VALID_FLAGS MODE_NONINTERACTIVE +#define LIST_VALID_FLAGS (MODE_NONINTERACTIVE|MODE_LONG_LIST) +#define VALIDATE_VALID_FLAGS MODE_NONINTERACTIVE + +/* Option number for the --host long option due to ambiguity of the -h flag. */ +#define OPT_HOSTNAME 256 + +/* + * Available command line options, both short and long. + * Note that we must disable arg permutation to support setting environment + * variables and to better support the optional arg of the -h flag. + */ +static const char short_opts[] = "+Aa:BbC:c:D:Eeg:Hh::iKklnPp:r:SsT:t:U:u:Vv"; +static struct option long_opts[] = { + { "askpass", no_argument, NULL, 'A' }, + { "auth-type", required_argument, NULL, 'a' }, + { "background", no_argument, NULL, 'b' }, + { "bell", no_argument, NULL, 'B' }, + { "close-from", required_argument, NULL, 'C' }, + { "login-class", required_argument, NULL, 'c' }, + { "preserve-env", optional_argument, NULL, 'E' }, + { "edit", no_argument, NULL, 'e' }, + { "group", required_argument, NULL, 'g' }, + { "set-home", no_argument, NULL, 'H' }, + { "help", no_argument, NULL, 'h' }, + { "host", required_argument, NULL, OPT_HOSTNAME }, + { "login", no_argument, NULL, 'i' }, + { "remove-timestamp", no_argument, NULL, 'K' }, + { "reset-timestamp", no_argument, NULL, 'k' }, + { "list", no_argument, NULL, 'l' }, + { "non-interactive", no_argument, NULL, 'n' }, + { "preserve-groups", no_argument, NULL, 'P' }, + { "prompt", required_argument, NULL, 'p' }, + { "role", required_argument, NULL, 'r' }, + { "stdin", no_argument, NULL, 'S' }, + { "shell", no_argument, NULL, 's' }, + { "type", required_argument, NULL, 't' }, + { "command-timeout",required_argument, NULL, 'T' }, + { "other-user", required_argument, NULL, 'U' }, + { "user", required_argument, NULL, 'u' }, + { "version", no_argument, NULL, 'V' }, + { "validate", no_argument, NULL, 'v' }, + { NULL, no_argument, NULL, '\0' }, +}; + +/* + * Insert a key=value pair into the specified environment. + */ +static void +env_insert(struct environment *e, char *pair) +{ + debug_decl(env_insert, SUDO_DEBUG_ARGS) + + /* Make sure we have at least two slots free (one for NULL). */ + if (e->env_len + 1 >= e->env_size) { + char **tmp; + + if (e->env_size == 0) + e->env_size = 16; + tmp = reallocarray(e->envp, e->env_size, 2 * sizeof(char *)); + if (tmp == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + e->envp = tmp; + e->env_size *= 2; + } + e->envp[e->env_len++] = pair; + e->envp[e->env_len] = NULL; + + debug_return; +} + +/* + * Format as var=val and insert into the specified environment. + */ +static void +env_set(struct environment *e, char *var, char *val) +{ + char *pair; + debug_decl(env_set, SUDO_DEBUG_ARGS) + + pair = sudo_new_key_val(var, val); + if (pair == NULL) { + sudo_fatalx(U_("%s: %s"), + __func__, U_("unable to allocate memory")); + } + env_insert(e, pair); + + debug_return; +} + +/* + * Parse a comma-separated list of env vars and add to the + * specified environment. + */ +static void +parse_env_list(struct environment *e, char *list) +{ + char *cp, *last, *val; + debug_decl(parse_env_list, SUDO_DEBUG_ARGS) + + for ((cp = strtok_r(list, ",", &last)); cp != NULL; + (cp = strtok_r(NULL, ",", &last))) { + if (strchr(cp, '=') != NULL) { + sudo_warnx(U_("invalid environment variable name: %s"), cp); + usage(1); + } + if ((val = getenv(cp)) != NULL) + env_set(e, cp, val); + } + debug_return; +} + +/* + * Command line argument parsing. + * Sets nargc and nargv which corresponds to the argc/argv we'll use + * for the command to be run (if we are running one). + */ +int +parse_args(int argc, char **argv, int *nargc, char ***nargv, + struct sudo_settings **settingsp, char ***env_addp) +{ + struct environment extra_env; + int mode = 0; /* what mode is sudo to be run in? */ + int flags = 0; /* mode flags */ + int valid_flags = DEFAULT_VALID_FLAGS; + int ch, i; + char *cp; + const char *runas_user = NULL; + const char *runas_group = NULL; + const char *progname; + int proglen; + debug_decl(parse_args, SUDO_DEBUG_ARGS) + + /* Is someone trying something funny? */ + if (argc <= 0) + usage(1); + + /* Pass progname to plugin so it can call initprogname() */ + progname = getprogname(); + sudo_settings[ARG_PROGNAME].value = progname; + + /* First, check to see if we were invoked as "sudoedit". */ + proglen = strlen(progname); + if (proglen > 4 && strcmp(progname + proglen - 4, "edit") == 0) { + progname = "sudoedit"; + mode = MODE_EDIT; + sudo_settings[ARG_SUDOEDIT].value = "true"; + valid_flags = EDIT_VALID_FLAGS; + } + + /* Load local IP addresses and masks. */ + if (get_net_ifs(&cp) > 0) + sudo_settings[ARG_NET_ADDRS].value = cp; + + /* Set max_groups from sudo.conf. */ + i = sudo_conf_max_groups(); + if (i != -1) { + if (asprintf(&cp, "%d", i) == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + sudo_settings[ARG_MAX_GROUPS].value = cp; + } + + /* Returns true if the last option string was "-h" */ +#define got_host_flag (optind > 1 && argv[optind - 1][0] == '-' && \ + argv[optind - 1][1] == 'h' && argv[optind - 1][2] == '\0') + + /* Returns true if the last option string was "--" */ +#define got_end_of_args (optind > 1 && argv[optind - 1][0] == '-' && \ + argv[optind - 1][1] == '-' && argv[optind - 1][2] == '\0') + + /* Returns true if next option is an environment variable */ +#define is_envar (optind < argc && argv[optind][0] != '/' && \ + strchr(argv[optind], '=') != NULL) + + /* Space for environment variables is lazy allocated. */ + memset(&extra_env, 0, sizeof(extra_env)); + + /* XXX - should fill in settings at the end to avoid dupes */ + for (;;) { + /* + * Some trickiness is required to allow environment variables + * to be interspersed with command line options. + */ + if ((ch = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { + switch (ch) { + case 'A': + SET(tgetpass_flags, TGP_ASKPASS); + break; +#ifdef HAVE_BSD_AUTH_H + case 'a': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + sudo_settings[ARG_BSDAUTH_TYPE].value = optarg; + break; +#endif + case 'b': + SET(flags, MODE_BACKGROUND); + break; + case 'B': + SET(tgetpass_flags, TGP_BELL); + break; + case 'C': + assert(optarg != NULL); + if (sudo_strtonum(optarg, 3, INT_MAX, NULL) == 0) { + sudo_warnx(U_("the argument to -C must be a number greater than or equal to 3")); + usage(1); + } + sudo_settings[ARG_CLOSEFROM].value = optarg; + break; +#ifdef HAVE_LOGIN_CAP_H + case 'c': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + sudo_settings[ARG_LOGIN_CLASS].value = optarg; + break; +#endif + case 'D': + /* Ignored for backwards compatibility. */ + break; + case 'E': + /* + * Optional argument is a comma-separated list of + * environment variables to preserve. + * If not present, preserve everything. + */ + if (optarg == NULL) { + sudo_settings[ARG_PRESERVE_ENVIRONMENT].value = "true"; + SET(flags, MODE_PRESERVE_ENV); + } else { + parse_env_list(&extra_env, optarg); + } + break; + case 'e': + if (mode && mode != MODE_EDIT) + usage_excl(1); + mode = MODE_EDIT; + sudo_settings[ARG_SUDOEDIT].value = "true"; + valid_flags = EDIT_VALID_FLAGS; + break; + case 'g': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + runas_group = optarg; + sudo_settings[ARG_RUNAS_GROUP].value = optarg; + break; + case 'H': + sudo_settings[ARG_SET_HOME].value = "true"; + SET(flags, MODE_RESET_HOME); + break; + case 'h': + if (optarg == NULL) { + /* + * Optional args support -hhostname, not -h hostname. + * If we see a non-option after the -h flag, treat as + * remote host and bump optind to skip over it. + */ + if (got_host_flag && !is_envar && + argv[optind] != NULL && argv[optind][0] != '-') { + sudo_settings[ARG_REMOTE_HOST].value = argv[optind++]; + continue; + } + if (mode && mode != MODE_HELP) { + if (strcmp(progname, "sudoedit") != 0) + usage_excl(1); + } + mode = MODE_HELP; + valid_flags = 0; + break; + } + /* FALLTHROUGH */ + case OPT_HOSTNAME: + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + sudo_settings[ARG_REMOTE_HOST].value = optarg; + break; + case 'i': + sudo_settings[ARG_LOGIN_SHELL].value = "true"; + SET(flags, MODE_LOGIN_SHELL); + break; + case 'k': + sudo_settings[ARG_IGNORE_TICKET].value = "true"; + break; + case 'K': + sudo_settings[ARG_IGNORE_TICKET].value = "true"; + if (mode && mode != MODE_KILL) + usage_excl(1); + mode = MODE_KILL; + valid_flags = 0; + break; + case 'l': + if (mode) { + if (mode == MODE_LIST) + SET(flags, MODE_LONG_LIST); + else + usage_excl(1); + } + mode = MODE_LIST; + valid_flags = LIST_VALID_FLAGS; + break; + case 'n': + SET(flags, MODE_NONINTERACTIVE); + sudo_settings[ARG_NONINTERACTIVE].value = "true"; + break; + case 'P': + sudo_settings[ARG_PRESERVE_GROUPS].value = "true"; + SET(flags, MODE_PRESERVE_GROUPS); + break; + case 'p': + /* An empty prompt is allowed. */ + assert(optarg != NULL); + sudo_settings[ARG_PROMPT].value = optarg; + break; +#ifdef HAVE_SELINUX + case 'r': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + sudo_settings[ARG_SELINUX_ROLE].value = optarg; + break; + case 't': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + sudo_settings[ARG_SELINUX_TYPE].value = optarg; + break; +#endif + case 'T': + /* Plugin determines whether empty timeout is allowed. */ + assert(optarg != NULL); + sudo_settings[ARG_TIMEOUT].value = optarg; + break; + case 'S': + SET(tgetpass_flags, TGP_STDIN); + break; + case 's': + sudo_settings[ARG_USER_SHELL].value = "true"; + SET(flags, MODE_SHELL); + break; + case 'U': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + list_user = optarg; + break; + case 'u': + assert(optarg != NULL); + if (*optarg == '\0') + usage(1); + runas_user = optarg; + sudo_settings[ARG_RUNAS_USER].value = optarg; + break; + case 'v': + if (mode && mode != MODE_VALIDATE) + usage_excl(1); + mode = MODE_VALIDATE; + valid_flags = VALIDATE_VALID_FLAGS; + break; + case 'V': + if (mode && mode != MODE_VERSION) + usage_excl(1); + mode = MODE_VERSION; + valid_flags = 0; + break; + default: + usage(1); + } + } else if (!got_end_of_args && is_envar) { + /* Insert key=value pair, crank optind and resume getopt. */ + env_insert(&extra_env, argv[optind]); + optind++; + } else { + /* Not an option or an environment variable -- we're done. */ + break; + } + } + + argc -= optind; + argv += optind; + + if (!mode) { + /* Defer -k mode setting until we know whether it is a flag or not */ + if (sudo_settings[ARG_IGNORE_TICKET].value != NULL) { + if (argc == 0 && !ISSET(flags, MODE_SHELL|MODE_LOGIN_SHELL)) { + mode = MODE_INVALIDATE; /* -k by itself */ + sudo_settings[ARG_IGNORE_TICKET].value = NULL; + valid_flags = 0; + } + } + if (!mode) + mode = MODE_RUN; /* running a command */ + } + + if (argc > 0 && mode == MODE_LIST) + mode = MODE_CHECK; + + if (ISSET(flags, MODE_LOGIN_SHELL)) { + if (ISSET(flags, MODE_SHELL)) { + sudo_warnx(U_("you may not specify both the `-i' and `-s' options")); + usage(1); + } + if (ISSET(flags, MODE_PRESERVE_ENV)) { + sudo_warnx(U_("you may not specify both the `-i' and `-E' options")); + usage(1); + } + SET(flags, MODE_SHELL); + } + if ((flags & valid_flags) != flags) + usage(1); + if (mode == MODE_EDIT && + (ISSET(flags, MODE_PRESERVE_ENV) || extra_env.env_len != 0)) { + if (ISSET(mode, MODE_PRESERVE_ENV)) + sudo_warnx(U_("the `-E' option is not valid in edit mode")); + if (extra_env.env_len != 0) + sudo_warnx(U_("you may not specify environment variables in edit mode")); + usage(1); + } + if ((runas_user != NULL || runas_group != NULL) && + !ISSET(mode, MODE_EDIT | MODE_RUN | MODE_CHECK | MODE_VALIDATE)) { + usage(1); + } + if (list_user != NULL && mode != MODE_LIST && mode != MODE_CHECK) { + sudo_warnx(U_("the `-U' option may only be used with the `-l' option")); + usage(1); + } + if (ISSET(tgetpass_flags, TGP_STDIN) && ISSET(tgetpass_flags, TGP_ASKPASS)) { + sudo_warnx(U_("the `-A' and `-S' options may not be used together")); + usage(1); + } + if ((argc == 0 && mode == MODE_EDIT) || + (argc > 0 && !ISSET(mode, MODE_RUN | MODE_EDIT | MODE_CHECK))) + usage(1); + if (argc == 0 && mode == MODE_RUN && !ISSET(flags, MODE_SHELL)) { + SET(flags, (MODE_IMPLIED_SHELL | MODE_SHELL)); + sudo_settings[ARG_IMPLIED_SHELL].value = "true"; + } +#ifdef ENABLE_SUDO_PLUGIN_API + sudo_settings[ARG_PLUGIN_DIR].value = sudo_conf_plugin_dir_path(); +#endif + + if (mode == MODE_HELP) + help(); + + /* + * For shell mode we need to rewrite argv + */ + if (ISSET(flags, MODE_SHELL|MODE_LOGIN_SHELL) && ISSET(mode, MODE_RUN)) { + char **av, *cmnd = NULL; + int ac = 1; + + if (argc != 0) { + /* shell -c "command" */ + char *src, *dst; + size_t size = 0; + + for (av = argv; *av != NULL; av++) + size += strlen(*av) + 1; + + if (size == 0 || (cmnd = reallocarray(NULL, size, 2)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (!gc_add(GC_PTR, cmnd)) + exit(1); + + for (dst = cmnd, av = argv; *av != NULL; av++) { + for (src = *av; *src != '\0'; src++) { + /* quote potential meta characters */ + if (!isalnum((unsigned char)*src) && *src != '_' && *src != '-' && *src != '$') + *dst++ = '\\'; + *dst++ = *src; + } + *dst++ = ' '; + } + if (cmnd != dst) + dst--; /* replace last space with a NUL */ + *dst = '\0'; + + ac += 2; /* -c cmnd */ + } + + av = reallocarray(NULL, ac + 1, sizeof(char *)); + if (av == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + if (!gc_add(GC_PTR, av)) + exit(1); + + av[0] = (char *)user_details.shell; /* plugin may override shell */ + if (cmnd != NULL) { + av[1] = "-c"; + av[2] = cmnd; + } + av[ac] = NULL; + + argv = av; + argc = ac; + } + + if (mode == MODE_EDIT) { +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) + /* Must have the command in argv[0]. */ + argc++; + argv--; + argv[0] = "sudoedit"; +#else + sudo_fatalx(U_("sudoedit is not supported on this platform")); +#endif + } + + *settingsp = sudo_settings; + *env_addp = extra_env.envp; + *nargc = argc; + *nargv = argv; + debug_return_int(mode | flags); +} + +static int +usage_err(const char *buf) +{ + return fputs(buf, stderr); +} + +static int +usage_out(const char *buf) +{ + return fputs(buf, stdout); +} + +/* + * Give usage message and exit. + * The actual usage strings are in sudo_usage.h for configure substitution. + */ +void +usage(int fatal) +{ + struct sudo_lbuf lbuf; + char *uvec[6]; + int i, ulen; + + /* + * Use usage vectors appropriate to the progname. + */ + if (strcmp(getprogname(), "sudoedit") == 0) { + uvec[0] = &SUDO_USAGE5[3]; + uvec[1] = NULL; + } else { + uvec[0] = SUDO_USAGE1; + uvec[1] = SUDO_USAGE2; + uvec[2] = SUDO_USAGE3; + uvec[3] = SUDO_USAGE4; + uvec[4] = SUDO_USAGE5; + uvec[5] = NULL; + } + + /* + * Print usage and wrap lines as needed, depending on the + * tty width. + */ + ulen = (int)strlen(getprogname()) + 8; + sudo_lbuf_init(&lbuf, fatal ? usage_err : usage_out, ulen, NULL, + user_details.ts_cols); + for (i = 0; uvec[i] != NULL; i++) { + sudo_lbuf_append(&lbuf, "usage: %s%s", getprogname(), uvec[i]); + sudo_lbuf_print(&lbuf); + } + sudo_lbuf_destroy(&lbuf); + if (fatal) + exit(1); +} + +/* + * Tell which options are mutually exclusive and exit. + */ +static void +usage_excl(int fatal) +{ + debug_decl(usage_excl, SUDO_DEBUG_ARGS) + + sudo_warnx(U_("Only one of the -e, -h, -i, -K, -l, -s, -v or -V options may be specified")); + usage(fatal); +} + +static void +help(void) +{ + struct sudo_lbuf lbuf; + const int indent = 32; + const char *pname = getprogname(); + debug_decl(help, SUDO_DEBUG_ARGS) + + sudo_lbuf_init(&lbuf, usage_out, indent, NULL, user_details.ts_cols); + if (strcmp(pname, "sudoedit") == 0) + sudo_lbuf_append(&lbuf, _("%s - edit files as another user\n\n"), pname); + else + sudo_lbuf_append(&lbuf, _("%s - execute a command as another user\n\n"), pname); + sudo_lbuf_print(&lbuf); + + usage(0); + + sudo_lbuf_append(&lbuf, _("\nOptions:\n")); + sudo_lbuf_append(&lbuf, " -A, --askpass %s\n", + _("use a helper program for password prompting")); +#ifdef HAVE_BSD_AUTH_H + sudo_lbuf_append(&lbuf, " -a, --auth-type=type %s\n", + _("use specified BSD authentication type")); +#endif + sudo_lbuf_append(&lbuf, " -b, --background %s\n", + _("run command in the background")); + sudo_lbuf_append(&lbuf, " -B, --bell %s\n", + _("ring bell when prompting")); + sudo_lbuf_append(&lbuf, " -C, --close-from=num %s\n", + _("close all file descriptors >= num")); +#ifdef HAVE_LOGIN_CAP_H + sudo_lbuf_append(&lbuf, " -c, --login-class=class %s\n", + _("run command with the specified BSD login class")); +#endif + sudo_lbuf_append(&lbuf, " -E, --preserve-env %s\n", + _("preserve user environment when running command")); + sudo_lbuf_append(&lbuf, " --preserve-env=list %s\n", + _("preserve specific environment variables")); + sudo_lbuf_append(&lbuf, " -e, --edit %s\n", + _("edit files instead of running a command")); + sudo_lbuf_append(&lbuf, " -g, --group=group %s\n", + _("run command as the specified group name or ID")); + sudo_lbuf_append(&lbuf, " -H, --set-home %s\n", + _("set HOME variable to target user's home dir")); + sudo_lbuf_append(&lbuf, " -h, --help %s\n", + _("display help message and exit")); + sudo_lbuf_append(&lbuf, " -h, --host=host %s\n", + _("run command on host (if supported by plugin)")); + sudo_lbuf_append(&lbuf, " -i, --login %s\n", + _("run login shell as the target user; a command may also be specified")); + sudo_lbuf_append(&lbuf, " -K, --remove-timestamp %s\n", + _("remove timestamp file completely")); + sudo_lbuf_append(&lbuf, " -k, --reset-timestamp %s\n", + _("invalidate timestamp file")); + sudo_lbuf_append(&lbuf, " -l, --list %s\n", + _("list user's privileges or check a specific command; use twice for longer format")); + sudo_lbuf_append(&lbuf, " -n, --non-interactive %s\n", + _("non-interactive mode, no prompts are used")); + sudo_lbuf_append(&lbuf, " -P, --preserve-groups %s\n", + _("preserve group vector instead of setting to target's")); + sudo_lbuf_append(&lbuf, " -p, --prompt=prompt %s\n", + _("use the specified password prompt")); +#ifdef HAVE_SELINUX + sudo_lbuf_append(&lbuf, " -r, --role=role %s\n", + _("create SELinux security context with specified role")); +#endif + sudo_lbuf_append(&lbuf, " -S, --stdin %s\n", + _("read password from standard input")); + sudo_lbuf_append(&lbuf, " -s, --shell %s\n", + _("run shell as the target user; a command may also be specified")); +#ifdef HAVE_SELINUX + sudo_lbuf_append(&lbuf, " -t, --type=type %s\n", + _("create SELinux security context with specified type")); +#endif + sudo_lbuf_append(&lbuf, " -T, --command-timeout=timeout %s\n", + _("terminate command after the specified time limit")); + sudo_lbuf_append(&lbuf, " -U, --other-user=user %s\n", + _("in list mode, display privileges for user")); + sudo_lbuf_append(&lbuf, " -u, --user=user %s\n", + _("run command (or edit file) as specified user name or ID")); + sudo_lbuf_append(&lbuf, " -V, --version %s\n", + _("display version information and exit")); + sudo_lbuf_append(&lbuf, " -v, --validate %s\n", + _("update user's timestamp without running a command")); + sudo_lbuf_append(&lbuf, " -- %s\n", + _("stop processing command line arguments")); + sudo_lbuf_print(&lbuf); + sudo_lbuf_destroy(&lbuf); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, 0); + exit(0); +} diff --git a/utsudo-0.0.2/src_ori/preload.c b/utsudo-0.0.2/src_ori/preload.c new file mode 100644 index 0000000..9b8a387 --- /dev/null +++ b/utsudo-0.0.2/src_ori/preload.c @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010, 2011, 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#ifdef HAVE_GSS_KRB5_CCACHE_NAME +# if defined(HAVE_GSSAPI_GSSAPI_KRB5_H) +# include +# include +# elif defined(HAVE_GSSAPI_GSSAPI_H) +# include +# else +# include +# endif +#endif + +#include "sudo_plugin.h" +#include "sudo_compat.h" +#include "sudo_dso.h" + +#ifdef STATIC_SUDOERS_PLUGIN + +extern struct policy_plugin sudoers_policy; +extern struct io_plugin sudoers_io; + +static struct sudo_preload_symbol sudo_rtld_default_symbols[] = { +# ifdef HAVE_GSS_KRB5_CCACHE_NAME + { "gss_krb5_ccache_name", (void *)&gss_krb5_ccache_name}, +# endif + { (const char *)0, (void *)0 } +}; + +/* XXX - can we autogenerate these? */ +static struct sudo_preload_symbol sudo_sudoers_plugin_symbols[] = { + { "sudoers_policy", (void *)&sudoers_policy}, + { "sudoers_io", (void *)&sudoers_io}, + { (const char *)0, (void *)0 } +}; + +/* + * Statically compiled symbols indexed by handle. + */ +static struct sudo_preload_table sudo_preload_table[] = { + { (char *)0, SUDO_DSO_DEFAULT, sudo_rtld_default_symbols }, + { "sudoers.so", &sudo_sudoers_plugin_symbols, sudo_sudoers_plugin_symbols }, + { (char *)0, (void *)0, (struct sudo_preload_symbol *)0 } +}; + +void +preload_static_symbols(void) +{ + sudo_dso_preload_table(sudo_preload_table); +} + +#endif /* STATIC_SUDOERS_PLUGIN */ diff --git a/utsudo-0.0.2/src_ori/preserve_fds.c b/utsudo-0.0.2/src_ori/preserve_fds.c new file mode 100644 index 0000000..7dbb8cb --- /dev/null +++ b/utsudo-0.0.2/src_ori/preserve_fds.c @@ -0,0 +1,224 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "utsudo.h" + +/* + * Add an fd to preserve. + */ +int +add_preserved_fd(struct preserved_fd_list *pfds, int fd) +{ + struct preserved_fd *pfd, *pfd_new; + debug_decl(add_preserved_fd, SUDO_DEBUG_UTIL) + + pfd_new = malloc(sizeof(*pfd)); + if (pfd_new == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + pfd_new->lowfd = fd; + pfd_new->highfd = fd; + pfd_new->flags = fcntl(fd, F_GETFD); + if (pfd_new->flags == -1) { + free(pfd_new); + debug_return_int(-1); + } + + TAILQ_FOREACH(pfd, pfds, entries) { + if (fd == pfd->highfd) { + /* already preserved */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "fd %d already preserved", fd); + free(pfd_new); + pfd_new = NULL; + break; + } + if (fd < pfd->highfd) { + TAILQ_INSERT_BEFORE(pfd, pfd_new, entries); + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "preserving fd %d", fd); + pfd_new = NULL; + break; + } + } + if (pfd_new != NULL) { + TAILQ_INSERT_TAIL(pfds, pfd_new, entries); + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "preserving fd %d", fd); + } + + debug_return_int(0); +} + +/* + * Close all descriptors, startfd and higher except those listed + * in pfds. + */ +void +closefrom_except(int startfd, struct preserved_fd_list *pfds) +{ + int fd, lastfd = -1; + struct preserved_fd *pfd, *pfd_next; + unsigned char *fdbits; + debug_decl(closefrom_except, SUDO_DEBUG_UTIL) + + /* First, relocate preserved fds to be as contiguous as possible. */ + TAILQ_FOREACH_REVERSE_SAFE(pfd, pfds, preserved_fd_list, entries, pfd_next) { + if (pfd->highfd < startfd) + continue; + fd = dup(pfd->highfd); + if (fd == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "dup %d", pfd->highfd); + if (errno == EBADF) { + TAILQ_REMOVE(pfds, pfd, entries); + continue; + } + /* NOTE: still need to adjust lastfd below with unchanged lowfd. */ + } else if (fd < pfd->highfd) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "dup %d -> %d", pfd->highfd, pfd->lowfd); + sudo_debug_update_fd(pfd->highfd, pfd->lowfd); + pfd->lowfd = fd; + fd = pfd->highfd; + } + if (fd != -1) + (void) close(fd); + + if (pfd->lowfd > lastfd) + lastfd = pfd->lowfd; /* highest (relocated) preserved fd */ + } + + if (lastfd == -1) { + /* No fds to preserve. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "closefrom(%d)", startfd); + closefrom(startfd); + debug_return; + } + + /* Create bitmap of preserved (relocated) fds. */ + fdbits = calloc((lastfd + NBBY) / NBBY, 1); + if (fdbits == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + TAILQ_FOREACH(pfd, pfds, entries) { + sudo_setbit(fdbits, pfd->lowfd); + } + + /* + * Close any unpreserved fds [startfd,lastfd] + */ + for (fd = startfd; fd <= lastfd; fd++) { + if (!sudo_isset(fdbits, fd)) { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "closing fd %d", fd); +#ifdef __APPLE__ + /* Avoid potential libdispatch crash when we close its fds. */ + (void) fcntl(fd, F_SETFD, FD_CLOEXEC); +#else + (void) close(fd); +#endif + } + } + free(fdbits); + + /* Let closefrom() do the rest for us. */ + if (lastfd + 1 > startfd) + startfd = lastfd + 1; + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "closefrom(%d)", startfd); + closefrom(startfd); + + /* Restore preserved fds and set flags. */ + TAILQ_FOREACH_REVERSE(pfd, pfds, preserved_fd_list, entries) { + if (pfd->lowfd != pfd->highfd) { + if (dup2(pfd->lowfd, pfd->highfd) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "dup2(%d, %d): %s", pfd->lowfd, pfd->highfd, + strerror(errno)); + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "dup2(%d, %d)", pfd->lowfd, pfd->highfd); + } + if (fcntl(pfd->highfd, F_SETFD, pfd->flags) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "fcntl(%d, F_SETFD, %d): %s", pfd->highfd, + pfd->flags, strerror(errno)); + } else { + sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO, + "fcntl(%d, F_SETFD, %d)", pfd->highfd, pfd->flags); + } + sudo_debug_update_fd(pfd->lowfd, pfd->highfd); + (void) close(pfd->lowfd); + pfd->lowfd = pfd->highfd; + } + } + debug_return; +} + +/* + * Parse a comma-separated list of fds and add them to preserved_fds. + */ +void +parse_preserved_fds(struct preserved_fd_list *pfds, const char *fdstr) +{ + const char *cp = fdstr; + long lval; + char *ep; + debug_decl(parse_preserved_fds, SUDO_DEBUG_UTIL) + + do { + errno = 0; + lval = strtol(cp, &ep, 10); + if (ep == cp || (*ep != ',' && *ep != '\0')) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to parse fd string %s", cp); + break; + } + if ((errno == ERANGE && lval == LONG_MAX) || lval < 0 || lval > INT_MAX) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "range error parsing fd string %s", cp); + } else { + add_preserved_fd(pfds, (int)lval); + } + cp = ep + 1; + } while (*ep != '\0'); + + debug_return; +} diff --git a/utsudo-0.0.2/src_ori/regress/noexec/check_noexec.c b/utsudo-0.0.2/src_ori/regress/noexec/check_noexec.c new file mode 100644 index 0000000..e617bb2 --- /dev/null +++ b/utsudo-0.0.2/src_ori/regress/noexec/check_noexec.c @@ -0,0 +1,205 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#ifdef HAVE_WORDEXP_H +# include +#endif +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_util.h" +#include "sudo_exec.h" + +__dso_public int main(int argc, char *argv[], char *envp[]); + +static bool +report_status(int status, const char *what) +{ + bool ret = false; + + /* system() returns -1 for exec failure. */ + if (status == -1) { + printf("%s: OK (%s)\n", getprogname(), what); + return true; + } + + /* check exit value, expecting 127 for failure */ + if (WIFEXITED(status)) { + int exitval = WEXITSTATUS(status); + if (exitval == 127) { + printf("%s: OK (%s)\n", getprogname(), what); + ret = true; + } else { + printf("%s: FAIL (%s) [%d]\n", getprogname(), what, exitval); + } + } else if (WIFSIGNALED(status)) { + printf("%s: FAIL (%s) [signal %d]\n", getprogname(), what, + WTERMSIG(status)); + } else { + /* should not happen */ + printf("%s: FAIL (%s) [status %d]\n", getprogname(), what, status); + } + + return ret; +} + +static int +try_execl(void) +{ + pid_t child, pid; + int status; + + child = fork(); + switch (child) { + case -1: + sudo_fatal_nodebug("fork"); + case 0: + /* child */ + /* Try to exec /bin/true, else exit with value 127. */ + execl("/bin/true", "true", (char *)0); + _exit(127); + default: + /* parent */ + do { + pid = waitpid(child, &status, 0); + } while (pid == -1 && errno == EINTR); + if (pid == -1) + sudo_fatal_nodebug("waitpid"); + + if (report_status(status, "execl")) + return 0; + return 1; + } +} + +static int +try_system(void) +{ + int status; + + /* Try to run /bin/true, system() returns 127 on exec failure. */ + status = system("/bin/true > /dev/null 2>&1"); + + if (report_status(status, "system")) + return 0; + return 1; +} + +#ifdef HAVE_WORDEXP_H +static int +try_wordexp(void) +{ + wordexp_t we; + int rc, ret = 1; + + /* + * sudo_noexec.so prevents command substitution via the WRDE_NOCMD flag + * where possible. + */ + rc = wordexp("$(/bin/echo foo)", &we, 0); + switch (rc) { + case -1: + /* sudo's wordexp() wrapper returns -1 if RTLD_NEXT is not supported. */ + case 127: + /* Solaris 10 wordexp() returns 127 for execve() failure. */ +#ifdef WRDE_ERRNO + case WRDE_ERRNO: + /* Solaris 11 wordexp() returns WRDE_ERRNO for execve() failure. */ +#endif + printf("%s: OK (wordexp) [%d]\n", getprogname(), rc); + ret = 0; + break; + case WRDE_SYNTAX: + /* FreeBSD returns WRDE_SYNTAX if it can't write to the shell process */ + printf("%s: OK (wordexp) [WRDE_SYNTAX]\n", getprogname()); + ret = 0; + break; + case WRDE_CMDSUB: + printf("%s: OK (wordexp) [WRDE_CMDSUB]\n", getprogname()); + ret = 0; + break; + case 0: + /* + * On HP-UX 11.00 we don't seem to be able to add WRDE_NOCMD + * but the execve() wrapper prevents the command substitution. + */ + if (we.we_wordc == 0) { + printf("%s: OK (wordexp) [%d]\n", getprogname(), rc); + wordfree(&we); + ret = 0; + break; + } + wordfree(&we); + /* FALLTHROUGH */ + default: + printf("%s: FAIL (wordexp) [%d]\n", getprogname(), rc); + break; + } + return ret; +} +#endif + +int +main(int argc, char *argv[], char *envp[]) +{ + int errors = 0; + + initprogname(argc > 0 ? argv[0] : "check_noexec"); + + if (argc != 2) { + fprintf(stderr, "usage: %s regress | /path/to/sudo_noexec.so\n", getprogname()); + exit(1); + } + + /* Disable execution for post-exec and re-exec ourself. */ + if (strcmp(argv[1], "rexec") != 0) { + const char *noexec = argv[1]; + argv[1] = "rexec"; + execve(argv[0], argv, disable_execute(envp, noexec)); + sudo_fatalx_nodebug("execve"); + } + + errors += try_execl(); + errors += try_system(); +#ifdef HAVE_WORDEXP_H + errors += try_wordexp(); +#endif + + return errors; +} diff --git a/utsudo-0.0.2/src_ori/regress/ttyname/check_ttyname.c b/utsudo-0.0.2/src_ori/regress/ttyname/check_ttyname.c new file mode 100644 index 0000000..f9de1eb --- /dev/null +++ b/utsudo-0.0.2/src_ori/regress/ttyname/check_ttyname.c @@ -0,0 +1,87 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2013-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_util.h" +#include "sudo_debug.h" + +__dso_public int main(int argc, char *argv[]); + +int sudo_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +extern char *get_process_ttyname(char *name, size_t namelen); + +int +main(int argc, char *argv[]) +{ + char *tty_libc = NULL, *tty_sudo = NULL; + char pathbuf[PATH_MAX]; + int ret = 1; + + initprogname(argc > 0 ? argv[0] : "check_ttyname"); + + /* Lookup tty name using kernel info if possible. */ + if (get_process_ttyname(pathbuf, sizeof(pathbuf)) != NULL) + tty_sudo = pathbuf; + +#if defined(HAVE_KINFO_PROC2_NETBSD) || \ + defined(HAVE_KINFO_PROC_OPENBSD) || \ + defined(HAVE_KINFO_PROC_FREEBSD) || \ + defined(HAVE_KINFO_PROC_44BSD) || \ + defined(HAVE__TTYNAME_DEV) || defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) || \ + defined(HAVE_PSTAT_GETPROC) || defined(__linux__) + + /* Lookup tty name attached to stdin via libc. */ + tty_libc = ttyname(STDIN_FILENO); +#endif + + /* Compare libc and kernel ttys. */ + if (tty_libc != NULL && tty_sudo != NULL) { + if (strcmp(tty_libc, tty_sudo) == 0) + ret = 0; + } else if (tty_libc == NULL && tty_sudo == NULL) { + ret = 0; + } + + if (ret == 0) { + printf("%s: OK (%s)\n", getprogname(), tty_sudo ? tty_sudo : "none"); + } else if (tty_libc == NULL) { + printf("%s: SKIP (%s)\n", getprogname(), tty_sudo ? tty_sudo : "none"); + ret = 0; + } else { + printf("%s: FAIL %s (sudo) vs. %s (libc)\n", getprogname(), + tty_sudo ? tty_sudo : "none", tty_libc ? tty_libc : "none"); + } + + return ret; +} diff --git a/utsudo-0.0.2/src_ori/selinux.c b/utsudo-0.0.2/src_ori/selinux.c new file mode 100644 index 0000000..0366706 --- /dev/null +++ b/utsudo-0.0.2/src_ori/selinux.c @@ -0,0 +1,485 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2016 Todd C. Miller + * Copyright (c) 2008 Dan Walsh + * + * Borrowed heavily from newrole source code + * Authors: + * Anthony Colatrella + * Tim Fraser + * Steve Grubb + * Darrel Goeddel + * Michael Thompson + * Dan Walsh + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#ifdef HAVE_SELINUX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* for is_selinux_enabled() */ +#include /* for context-mangling functions */ +#include +#include + +#ifdef HAVE_LINUX_AUDIT +# include +#endif + +#include "utsudo.h" +#include "sudo_exec.h" + +static struct selinux_state { + security_context_t old_context; + security_context_t new_context; + security_context_t tty_context; + security_context_t new_tty_context; + const char *ttyn; + int ttyfd; + int enforcing; +} se_state; + +#ifdef HAVE_LINUX_AUDIT +static int +audit_role_change(const security_context_t old_context, + const security_context_t new_context, const char *ttyn, int result) +{ + int au_fd, rc = -1; + char *message; + debug_decl(audit_role_change, SUDO_DEBUG_SELINUX) + + au_fd = audit_open(); + if (au_fd == -1) { + /* Kernel may not have audit support. */ + if (errno != EINVAL && errno != EPROTONOSUPPORT && errno != EAFNOSUPPORT +) + sudo_fatal(U_("unable to open audit system")); + } else { + /* audit role change using the same format as newrole(1) */ + rc = asprintf(&message, "newrole: old-context=%s new-context=%s", + old_context, new_context); + if (rc == -1) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + rc = audit_log_user_message(au_fd, AUDIT_USER_ROLE_CHANGE, + message, NULL, NULL, ttyn, result); + if (rc <= 0) + sudo_warn(U_("unable to send audit message")); + free(message); + close(au_fd); + } + + debug_return_int(rc); +} +#endif + +/* + * This function attempts to revert the relabeling done to the tty. + * fd - referencing the opened ttyn + * ttyn - name of tty to restore + * + * Returns 0 on success and -1 on failure. + */ +int +selinux_restore_tty(void) +{ + int ret = -1; + security_context_t chk_tty_context = NULL; + debug_decl(selinux_restore_tty, SUDO_DEBUG_SELINUX) + + if (se_state.ttyfd == -1 || se_state.new_tty_context == NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: no tty, skip relabel", + __func__); + debug_return_int(0); + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: %s -> %s", + __func__, se_state.new_tty_context, se_state.tty_context); + + /* Verify that the tty still has the context set by sudo. */ + if (fgetfilecon(se_state.ttyfd, &chk_tty_context) == -1) { + sudo_warn(U_("unable to fgetfilecon %s"), se_state.ttyn); + goto skip_relabel; + } + + if (strcmp(chk_tty_context, se_state.new_tty_context) != 0) { + sudo_warnx(U_("%s changed labels"), se_state.ttyn); + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: not restoring tty label, expected %s, have %s", + __func__, se_state.new_tty_context, chk_tty_context); + goto skip_relabel; + } + + if (fsetfilecon(se_state.ttyfd, se_state.tty_context) == -1) { + sudo_warn(U_("unable to restore context for %s"), se_state.ttyn); + goto skip_relabel; + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: successfully set tty label to %s", + __func__, se_state.tty_context); + ret = 0; + +skip_relabel: + if (se_state.ttyfd != -1) { + close(se_state.ttyfd); + se_state.ttyfd = -1; + } + freecon(chk_tty_context); + debug_return_int(ret); +} + +/* + * This function attempts to relabel the tty. If this function fails, then + * the contexts are free'd and -1 is returned. On success, 0 is returned + * and tty_context and new_tty_context are set. + * + * This function will not fail if it can not relabel the tty when selinux is + * in permissive mode. + */ +static int +relabel_tty(const char *ttyn, int ptyfd) +{ + security_context_t tty_con = NULL; + security_context_t new_tty_con = NULL; + struct stat sb; + int fd; + debug_decl(relabel_tty, SUDO_DEBUG_SELINUX) + + se_state.ttyfd = ptyfd; + + /* It is perfectly legal to have no tty. */ + if (ptyfd == -1 && ttyn == NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: no tty, skip relabel", + __func__); + debug_return_int(0); + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: relabeling tty %s", __func__, ttyn); + + /* If sudo is not allocating a pty for the command, open current tty. */ + if (ptyfd == -1) { + se_state.ttyfd = open(ttyn, O_RDWR|O_NOCTTY|O_NONBLOCK); + if (se_state.ttyfd == -1 || fstat(se_state.ttyfd, &sb) == -1) { + sudo_warn(U_("unable to open %s, not relabeling tty"), ttyn); + goto bad; + } + if (!S_ISCHR(sb.st_mode)) { + sudo_warn(U_("%s is not a character device, not relabeling tty"), + ttyn); + goto bad; + } + (void)fcntl(se_state.ttyfd, F_SETFL, + fcntl(se_state.ttyfd, F_GETFL, 0) & ~O_NONBLOCK); + } + + if (fgetfilecon(se_state.ttyfd, &tty_con) == -1) { + sudo_warn(U_("unable to get current tty context, not relabeling tty")); + goto bad; + } + + if (tty_con != NULL) { + security_class_t tclass = string_to_security_class("chr_file"); + if (tclass == 0) { + sudo_warn(U_("unknown security class \"chr_file\", not relabeling tty")); + goto bad; + } + if (security_compute_relabel(se_state.new_context, tty_con, + tclass, &new_tty_con) == -1) { + sudo_warn(U_("unable to get new tty context, not relabeling tty")); + goto bad; + } + } + + if (new_tty_con != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: tty context %s -> %s", + __func__, tty_con, new_tty_con); + if (fsetfilecon(se_state.ttyfd, new_tty_con) == -1) { + sudo_warn(U_("unable to set new tty context")); + goto bad; + } + } + + if (ptyfd != -1) { + /* Reopen pty that was relabeled, std{in,out,err} are reset later. */ + se_state.ttyfd = open(ttyn, O_RDWR|O_NOCTTY, 0); + if (se_state.ttyfd == -1 || fstat(se_state.ttyfd, &sb) == -1) { + sudo_warn(U_("unable to open %s"), ttyn); + goto bad; + } + if (!S_ISCHR(sb.st_mode)) { + sudo_warn(U_("%s is not a character device, not relabeling tty"), + ttyn); + goto bad; + } + if (dup2(se_state.ttyfd, ptyfd) == -1) { + sudo_warn("dup2"); + goto bad; + } + } else { + /* Re-open tty to get new label and reset std{in,out,err} */ + close(se_state.ttyfd); + se_state.ttyfd = open(ttyn, O_RDWR|O_NOCTTY|O_NONBLOCK); + if (se_state.ttyfd == -1 || fstat(se_state.ttyfd, &sb) == -1) { + sudo_warn(U_("unable to open %s"), ttyn); + goto bad; + } + if (!S_ISCHR(sb.st_mode)) { + sudo_warn(U_("%s is not a character device, not relabeling tty"), + ttyn); + goto bad; + } + (void)fcntl(se_state.ttyfd, F_SETFL, + fcntl(se_state.ttyfd, F_GETFL, 0) & ~O_NONBLOCK); + for (fd = STDIN_FILENO; fd <= STDERR_FILENO; fd++) { + if (isatty(fd) && dup2(se_state.ttyfd, fd) == -1) { + sudo_warn("dup2"); + goto bad; + } + } + } + /* Retain se_state.ttyfd so we can restore label when command finishes. */ + (void)fcntl(se_state.ttyfd, F_SETFD, FD_CLOEXEC); + + se_state.ttyn = ttyn; + se_state.tty_context = tty_con; + se_state.new_tty_context = new_tty_con; + debug_return_int(0); + +bad: + if (se_state.ttyfd != -1 && se_state.ttyfd != ptyfd) { + close(se_state.ttyfd); + se_state.ttyfd = -1; + } + freecon(tty_con); + debug_return_int(se_state.enforcing ? -1 : 0); +} + +/* + * Returns a new security context based on the old context and the + * specified role and type. + */ +security_context_t +get_exec_context(security_context_t old_context, const char *role, const char *type) +{ + security_context_t new_context = NULL; + context_t context = NULL; + char *typebuf = NULL; + debug_decl(get_exec_context, SUDO_DEBUG_SELINUX) + + /* We must have a role, the type is optional (we can use the default). */ + if (role == NULL) { + sudo_warnx(U_("you must specify a role for type %s"), type); + errno = EINVAL; + goto bad; + } + if (type == NULL) { + if (get_default_type(role, &typebuf)) { + sudo_warnx(U_("unable to get default type for role %s"), role); + errno = EINVAL; + goto bad; + } + type = typebuf; + } + + /* + * Expand old_context into a context_t so that we can extract and modify + * its components easily. + */ + if ((context = context_new(old_context)) == NULL) { + sudo_warn(U_("failed to get new context")); + goto bad; + } + + /* + * Replace the role and type in "context" with the role and + * type we will be running the command as. + */ + if (context_role_set(context, role)) { + sudo_warn(U_("failed to set new role %s"), role); + goto bad; + } + if (context_type_set(context, type)) { + sudo_warn(U_("failed to set new type %s"), type); + goto bad; + } + + /* + * Convert "context" back into a string and verify it. + */ + if ((new_context = strdup(context_str(context))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + if (security_check_context(new_context) == -1) { + sudo_warnx(U_("%s is not a valid context"), new_context); + errno = EINVAL; + goto bad; + } + + context_free(context); + debug_return_str(new_context); + +bad: + free(typebuf); + context_free(context); + freecon(new_context); + debug_return_str(NULL); +} + +/* + * Determine the exec and tty contexts in preparation for fork/exec. + * Must run as root, before forking the child process. + * Sets the tty context but not the exec context (which happens later). + * If ptyfd is not -1, it indicates we are running + * in a pty and do not need to reset std{in,out,err}. + * Returns 0 on success and -1 on failure. + */ +int +selinux_setup(const char *role, const char *type, const char *ttyn, + int ptyfd, bool label_tty) +{ + int ret = -1; + debug_decl(selinux_setup, SUDO_DEBUG_SELINUX) + + /* Store the caller's SID in old_context. */ + if (getprevcon(&se_state.old_context)) { + sudo_warn(U_("failed to get old context")); + goto done; + } + + se_state.enforcing = security_getenforce(); + if (se_state.enforcing == -1) { + sudo_warn(U_("unable to determine enforcing mode.")); + goto done; + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: old context %s", __func__, + se_state.old_context); + se_state.new_context = get_exec_context(se_state.old_context, role, type); + if (se_state.new_context == NULL) { +#ifdef HAVE_LINUX_AUDIT + audit_role_change(se_state.old_context, "?", se_state.ttyn, 0); +#endif + goto done; + } + sudo_debug_printf(SUDO_DEBUG_INFO, "%s: new context %s", __func__, + se_state.new_context); + + if (label_tty && relabel_tty(ttyn, ptyfd) == -1) { + sudo_warn(U_("unable to set tty context to %s"), se_state.new_context); + goto done; + } + +#ifdef HAVE_LINUX_AUDIT + audit_role_change(se_state.old_context, se_state.new_context, + se_state.ttyn, 1); +#endif + + ret = 0; + +done: + debug_return_int(ret); +} + +int +selinux_setcon(void) +{ + debug_decl(selinux_setcon, SUDO_DEBUG_SELINUX); + + if (setexeccon(se_state.new_context)) { + sudo_warn(U_("unable to set exec context to %s"), se_state.new_context); + if (se_state.enforcing) + debug_return_int(-1); + } + +#ifdef HAVE_SETKEYCREATECON + if (setkeycreatecon(se_state.new_context)) { + sudo_warn(U_("unable to set key creation context to %s"), se_state.new_context); + if (se_state.enforcing) + debug_return_int(-1); + } +#endif /* HAVE_SETKEYCREATECON */ + + debug_return_int(0); +} + +void +selinux_execve(int fd, const char *path, char *const argv[], char *envp[], + bool noexec) +{ + char **nargv; + const char *sesh; + int argc, nargc, serrno; + debug_decl(selinux_execve, SUDO_DEBUG_SELINUX) + + sesh = sudo_conf_sesh_path(); + if (sesh == NULL) { + sudo_warnx("internal error: sesh path not set"); + errno = EINVAL; + debug_return; + } + + /* Set SELinux exec and keycreate contexts. */ + if (selinux_setcon() == -1) + debug_return; + + /* + * Build new argv with sesh as argv[0]. + * If argv[0] ends in -noexec, sesh will disable execute + * for the command it runs. + */ + for (argc = 0; argv[argc] != NULL; argc++) + continue; + nargv = reallocarray(NULL, argc + 3, sizeof(char *)); + if (nargv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return; + } + if (noexec) + nargv[0] = *argv[0] == '-' ? "-sesh-noexec" : "sesh-noexec"; + else + nargv[0] = *argv[0] == '-' ? "-sesh" : "sesh"; + nargc = 1; + if (fd != -1 && asprintf(&nargv[nargc++], "--execfd=%d", fd) == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return; + } + nargv[nargc++] = (char *)path; + memcpy(&nargv[nargc], &argv[1], argc * sizeof(char *)); /* copies NULL */ + + /* sesh will handle noexec for us. */ + sudo_execve(-1, sesh, nargv, envp, false); + serrno = errno; + free(nargv); + errno = serrno; + debug_return; +} + +#endif /* HAVE_SELINUX */ diff --git a/utsudo-0.0.2/src_ori/sesh.c b/utsudo-0.0.2/src_ori/sesh.c new file mode 100644 index 0000000..693410f --- /dev/null +++ b/utsudo-0.0.2/src_ori/sesh.c @@ -0,0 +1,292 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2008, 2010-2018, 2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_exec.h" +#include "sudo_plugin.h" +#include "sudo_util.h" + +__dso_public int main(int argc, char *argv[], char *envp[]); + +static int sesh_sudoedit(int argc, char *argv[]); + +/* + * Exit codes defined in sudo_exec.h: + * SESH_SUCCESS (0) ... successful operation + * SESH_ERR_FAILURE (1) ... unspecified error + * SESH_ERR_INVALID (30) ... invalid -e arg value + * SESH_ERR_BAD_PATHS (31) ... odd number of paths + * SESH_ERR_NO_FILES (32) ... copy error, no files copied + * SESH_ERR_SOME_FILES (33) ... copy error, no files copied + */ +int +main(int argc, char *argv[], char *envp[]) +{ + int ret; + debug_decl(main, SUDO_DEBUG_MAIN) + + initprogname(argc > 0 ? argv[0] : "sesh"); + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE_NAME, LOCALEDIR); + textdomain(PACKAGE_NAME); + + if (argc < 2) + sudo_fatalx(U_("requires at least one argument")); + + /* Read sudo.conf and initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudo_debug_register(getprogname(), NULL, NULL, + sudo_conf_debug_files(getprogname())); + + if (strcmp(argv[1], "-e") == 0) { + ret = sesh_sudoedit(argc, argv); + } else { + bool login_shell, noexec = false; + char *cp, *cmnd; + int fd = -1; + + /* If the first char of argv[0] is '-', we are running a login shell. */ + login_shell = argv[0][0] == '-'; + + /* If argv[0] ends in -noexec, pass the flag to sudo_execve() */ + if ((cp = strrchr(argv[0], '-')) != NULL && cp != argv[0]) + noexec = strcmp(cp, "-noexec") == 0; + + /* If argv[1] is --execfd=%d, extract the fd to exec with. */ + if (strncmp(argv[1], "--execfd=", 9) == 0) { + const char *errstr; + + cp = argv[1] + 9; + fd = sudo_strtonum(cp, 0, INT_MAX, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("invalid file descriptor number: %s"), cp); + argv++; + argc--; + } + + /* Shift argv and make a copy of the command to execute. */ + argv++; + argc--; + if ((cmnd = strdup(argv[0])) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + /* If invoked as a login shell, modify argv[0] accordingly. */ + if (login_shell) { + if ((cp = strrchr(argv[0], '/')) == NULL) + sudo_fatal(U_("unable to run %s as a login shell"), argv[0]); + *cp = '-'; + argv[0] = cp; + } + sudo_execve(fd, cmnd, argv, envp, noexec); + sudo_warn(U_("unable to execute %s"), cmnd); + ret = SESH_ERR_FAILURE; + } + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, ret); + _exit(ret); +} + +static int +sesh_sudoedit(int argc, char *argv[]) +{ + int i, oflags_src, oflags_dst, post, ret = SESH_ERR_FAILURE; + int fd_src = -1, fd_dst = -1, follow = 0; + ssize_t nread, nwritten; + struct stat sb; + struct timespec times[2]; + char buf[BUFSIZ]; + debug_decl(sesh_sudoedit, SUDO_DEBUG_EDIT) + + /* Check for -h flag (don't follow links). */ + if (strcmp(argv[2], "-h") == 0) { + argv++; + argc--; + follow = O_NOFOLLOW; + } + + if (argc < 3) + debug_return_int(SESH_ERR_FAILURE); + + /* + * We need to know whether we are performing the copy operation + * before or after the editing. Without this we would not know + * which files are temporary and which are the originals. + * post = 0 ... before + * post = 1 ... after + */ + if (strcmp(argv[2], "0") == 0) + post = 0; + else if (strcmp(argv[2], "1") == 0) + post = 1; + else /* invalid value */ + debug_return_int(SESH_ERR_INVALID); + + /* Align argv & argc to the beggining of the file list. */ + argv += 3; + argc -= 3; + + /* no files specified, nothing to do */ + if (argc == 0) + debug_return_int(SESH_SUCCESS); + /* odd number of paths specified */ + if (argc & 1) + debug_return_int(SESH_ERR_BAD_PATHS); + + /* + * In the pre-editing stage, use O_EXCL to ensure that the temporary + * files are created by us and that we are not opening any symlinks. + * In the post-editing stage, use O_NOFOLLOW so we don't follow symlinks + * when opening the temporary files. + */ + oflags_src = O_RDONLY|(post ? O_NONBLOCK|O_NOFOLLOW : follow); + oflags_dst = O_WRONLY|O_CREAT|(post ? follow : O_EXCL); + for (i = 0; i < argc - 1; i += 2) { + const char *path_src = argv[i]; + const char *path_dst = argv[i + 1]; + /* + * Try to open the source file for reading. If it + * doesn't exist, that's OK, we'll create an empty + * destination file. + */ + if ((fd_src = open(path_src, oflags_src, S_IRUSR|S_IWUSR)) < 0) { + if (errno != ENOENT) { + sudo_warn("%s", path_src); + if (post) { + ret = SESH_ERR_SOME_FILES; + goto nocleanup; + } else + goto cleanup_0; + } + } + if (post) { + /* Make sure the temporary file is safe and has the proper owner. */ + if (!sudo_check_temp_file(fd_src, path_src, geteuid(), &sb)) { + ret = SESH_ERR_SOME_FILES; + goto nocleanup; + } + fcntl(fd_src, F_SETFL, fcntl(fd_src, F_GETFL, 0) & ~O_NONBLOCK); + } + + if ((fd_dst = open(path_dst, oflags_dst, post ? + (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) : (S_IRUSR|S_IWUSR))) < 0) { + /* error - cleanup */ + sudo_warn("%s", path_dst); + if (post) { + ret = SESH_ERR_SOME_FILES; + goto nocleanup; + } else + goto cleanup_0; + } + + if (fd_src != -1) { + off_t len_src = -1; + off_t len_dst = -1; + + if (post) { + /* sudo_check_temp_file() filled in sb for us. */ + len_src = sb.st_size; + if (fstat(fd_dst, &sb) != 0) { + ret = SESH_ERR_SOME_FILES; + goto nocleanup; + } + len_dst = sb.st_size; + } + + if (sudo_copy_file(path_src, fd_src, len_src, path_dst, fd_dst, + len_dst) == -1) { + if (post) { + ret = SESH_ERR_SOME_FILES; + goto nocleanup; + } else { + goto cleanup_0; + } + } + } + + if (!post) { + if (fd_src == -1 || fstat(fd_src, &sb) != 0) + memset(&sb, 0, sizeof(sb)); + /* Make mtime on temp file match src. */ + mtim_get(&sb, times[0]); + times[1].tv_sec = times[0].tv_sec; + times[1].tv_nsec = times[0].tv_nsec; + if (futimens(fd_dst, times) == -1) { + if (utimensat(AT_FDCWD, path_dst, times, 0) == -1) + sudo_warn("%s", path_dst); + } + } + close(fd_dst); + fd_dst = -1; + if (fd_src != -1) { + close(fd_src); + fd_src = -1; + } + } + + ret = SESH_SUCCESS; + if (post) { + /* Remove temporary files (post=1) */ + for (i = 0; i < argc - 1; i += 2) + unlink(argv[i]); + } +nocleanup: + if (fd_dst != -1) + close(fd_dst); + if (fd_src != -1) + close(fd_src); + return(ret); +cleanup_0: + /* Remove temporary files (post=0) */ + for (i = 0; i < argc - 1; i += 2) + unlink(argv[i + 1]); + if (fd_dst != -1) + close(fd_dst); + if (fd_src != -1) + close(fd_src); + return(SESH_ERR_NO_FILES); +} diff --git a/utsudo-0.0.2/src_ori/signal.c b/utsudo-0.0.2/src_ori/signal.c new file mode 100644 index 0000000..d616eca --- /dev/null +++ b/utsudo-0.0.2/src_ori/signal.c @@ -0,0 +1,207 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2016 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include + +#include "utsudo.h" +#include "sudo_exec.h" + +static struct signal_state { + int signo; + int restore; + struct sigaction sa; +} saved_signals[] = { + { SIGALRM }, /* SAVED_SIGALRM */ + { SIGCHLD }, /* SAVED_SIGCHLD */ + { SIGCONT }, /* SAVED_SIGCONT */ + { SIGHUP }, /* SAVED_SIGHUP */ + { SIGINT }, /* SAVED_SIGINT */ + { SIGPIPE }, /* SAVED_SIGPIPE */ + { SIGQUIT }, /* SAVED_SIGQUIT */ + { SIGTERM }, /* SAVED_SIGTERM */ + { SIGTSTP }, /* SAVED_SIGTSTP */ + { SIGTTIN }, /* SAVED_SIGTTIN */ + { SIGTTOU }, /* SAVED_SIGTTOU */ + { SIGUSR1 }, /* SAVED_SIGUSR1 */ + { SIGUSR2 }, /* SAVED_SIGUSR2 */ + { -1 } +}; + +static sig_atomic_t pending_signals[NSIG]; + +static void +sudo_handler(int signo) +{ + /* Mark signal as pending. */ + pending_signals[signo] = 1; +} + +bool +signal_pending(int signo) +{ + return pending_signals[signo] == 1; +} + +/* + * Save signal handler state so it can be restored before exec. + */ +void +save_signals(void) +{ + struct signal_state *ss; + debug_decl(save_signals, SUDO_DEBUG_MAIN) + + for (ss = saved_signals; ss->signo != -1; ss++) { + if (sigaction(ss->signo, NULL, &ss->sa) != 0) + sudo_warn(U_("unable to save handler for signal %d"), ss->signo); + } + + debug_return; +} + +/* + * Restore signal handlers to initial state for exec. + */ +void +restore_signals(void) +{ + struct signal_state *ss; + debug_decl(restore_signals, SUDO_DEBUG_MAIN) + + for (ss = saved_signals; ss->signo != -1; ss++) { + if (ss->restore) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "restoring handler for signal %d: %s", ss->signo, + ss->sa.sa_handler == SIG_IGN ? "SIG_IGN" : + ss->sa.sa_handler == SIG_DFL ? "SIG_DFL" : "???"); + if (sigaction(ss->signo, &ss->sa, NULL) != 0) { + sudo_warn(U_("unable to restore handler for signal %d"), + ss->signo); + } + } + } + + debug_return; +} + +/* + * Trap tty-generated (and other) signals so we can't be killed before + * calling the policy close function. The signal pipe will be drained + * in sudo_execute() before running the command and new handlers will + * be installed in the parent. + */ +void +init_signals(void) +{ + struct sigaction sa; + struct signal_state *ss; + debug_decl(init_signals, SUDO_DEBUG_MAIN) + + memset(&sa, 0, sizeof(sa)); + sigfillset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = sudo_handler; + + for (ss = saved_signals; ss->signo > 0; ss++) { + switch (ss->signo) { + case SIGCONT: + case SIGPIPE: + case SIGTTIN: + case SIGTTOU: + /* Don't install these until exec time. */ + break; + case SIGCHLD: + /* Sudo needs to be able to catch SIGCHLD. */ + if (ss->sa.sa_handler == SIG_IGN) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "will restore signal %d on exec", SIGCHLD); + ss->restore = true; + } + if (sigaction(SIGCHLD, &sa, NULL) != 0) { + sudo_warn(U_("unable to set handler for signal %d"), + SIGCHLD); + } + break; + default: + if (ss->sa.sa_handler != SIG_IGN) { + if (sigaction(ss->signo, &sa, NULL) != 0) { + sudo_warn(U_("unable to set handler for signal %d"), + ss->signo); + } + } + break; + } + } + /* Ignore SIGPIPE until exec. */ + if (saved_signals[SAVED_SIGPIPE].sa.sa_handler != SIG_IGN) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "will restore signal %d on exec", SIGPIPE); + saved_signals[SAVED_SIGPIPE].restore = true; + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) != 0) + sudo_warn(U_("unable to set handler for signal %d"), SIGPIPE); + } + + debug_return; +} + +/* + * Like sigaction() but sets restore flag in saved_signals[] + * if needed. + */ +int +sudo_sigaction(int signo, struct sigaction *sa, struct sigaction *osa) +{ + struct signal_state *ss; + int ret; + debug_decl(sudo_sigaction, SUDO_DEBUG_MAIN) + + for (ss = saved_signals; ss->signo > 0; ss++) { + if (ss->signo == signo) { + /* If signal was or now is ignored, restore old handler on exec. */ + if (ss->sa.sa_handler == SIG_IGN || sa->sa_handler == SIG_IGN) { + sudo_debug_printf(SUDO_DEBUG_INFO, + "will restore signal %d on exec", signo); + ss->restore = true; + } + break; + } + } + ret = sigaction(signo, sa, osa); + + debug_return_int(ret); +} diff --git a/utsudo-0.0.2/src_ori/solaris.c b/utsudo-0.0.2/src_ori/solaris.c new file mode 100644 index 0000000..c0dfce4 --- /dev/null +++ b/utsudo-0.0.2/src_ori/solaris.c @@ -0,0 +1,124 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#ifdef HAVE_PROJECT_H +# include +# include +#endif +#include +#include + +#include "utsudo.h" +#include "sudo_dso.h" + +int +os_init(int argc, char *argv[], char *envp[]) +{ + /* + * Solaris 11 is unable to load the per-locale shared objects + * without this. We must keep the handle open for it to work. + * This bug was fixed in Solaris 11 Update 1. + */ + void *handle = sudo_dso_load("/usr/lib/locale/common/methods_unicode.so.3", + SUDO_DSO_LAZY|SUDO_DSO_GLOBAL); + (void)&handle; + + return os_init_common(argc, argv, envp); +} + +#ifdef HAVE_PROJECT_H +void +set_project(struct passwd *pw) +{ + struct project proj; + char buf[PROJECT_BUFSZ]; + int errval; + debug_decl(set_project, SUDO_DEBUG_UTIL) + + /* + * Collect the default project for the user and settaskid + */ + setprojent(); + if (getdefaultproj(pw->pw_name, &proj, buf, sizeof(buf)) != NULL) { + errval = setproject(proj.pj_name, pw->pw_name, TASK_NORMAL); + switch(errval) { + case 0: + break; + case SETPROJ_ERR_TASK: + switch (errno) { + case EAGAIN: + sudo_warnx(U_("resource control limit has been reached")); + break; + case ESRCH: + sudo_warnx(U_("user \"%s\" is not a member of project \"%s\""), + pw->pw_name, proj.pj_name); + break; + case EACCES: + sudo_warnx(U_("the invoking task is final")); + break; + default: + sudo_warnx(U_("could not join project \"%s\""), proj.pj_name); + } + case SETPROJ_ERR_POOL: + switch (errno) { + case EACCES: + sudo_warnx(U_("no resource pool accepting default bindings " + "exists for project \"%s\""), proj.pj_name); + break; + case ESRCH: + sudo_warnx(U_("specified resource pool does not exist for " + "project \"%s\""), proj.pj_name); + break; + default: + sudo_warnx(U_("could not bind to default resource pool for " + "project \"%s\""), proj.pj_name); + } + break; + default: + if (errval <= 0) { + sudo_warnx(U_("setproject failed for project \"%s\""), proj.pj_name); + } else { + sudo_warnx(U_("warning, resource control assignment failed for " + "project \"%s\""), proj.pj_name); + } + } + } else { + sudo_warn("getdefaultproj"); + } + endprojent(); + debug_return; +} +#endif /* HAVE_PROJECT_H */ diff --git a/utsudo-0.0.2/src_ori/sudo_edit.c b/utsudo-0.0.2/src_ori/sudo_edit.c new file mode 100644 index 0000000..603f48e --- /dev/null +++ b/utsudo-0.0.2/src_ori/sudo_edit.c @@ -0,0 +1,1143 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2008, 2010-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utsudo.h" +#include "sudo_exec.h" + +#if defined(HAVE_SETRESUID) || defined(HAVE_SETREUID) || defined(HAVE_SETEUID) + +/* + * Editor temporary file name along with original name, mtime and size. + */ +struct tempfile { + char *tfile; + char *ofile; + off_t osize; + struct timespec omtim; +}; + +static char edit_tmpdir[MAX(sizeof(_PATH_VARTMP), sizeof(_PATH_TMP))]; + +static void +switch_user(uid_t euid, gid_t egid, int ngroups, GETGROUPS_T *groups) +{ + int serrno = errno; + debug_decl(switch_user, SUDO_DEBUG_EDIT) + + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "set uid:gid to %u:%u(%u)", (unsigned int)euid, (unsigned int)egid, + ngroups ? (unsigned int)groups[0] : (unsigned int)egid); + + /* When restoring root, change euid first; otherwise change it last. */ + if (euid == ROOT_UID) { + if (seteuid(ROOT_UID) != 0) + sudo_fatal("seteuid(ROOT_UID)"); + } + if (setegid(egid) != 0) + sudo_fatal("setegid(%d)", (int)egid); + if (ngroups != -1) { + if (sudo_setgroups(ngroups, groups) != 0) + sudo_fatal("setgroups"); + } + if (euid != ROOT_UID) { + if (seteuid(euid) != 0) + sudo_fatal("seteuid(%u)", (unsigned int)euid); + } + errno = serrno; + + debug_return; +} + +#ifdef HAVE_FACCESSAT +/* + * Returns true if the open directory fd is writable by the user. + */ +static int +dir_is_writable(int dfd, struct user_details *ud, struct command_details *cd) +{ + debug_decl(dir_is_writable, SUDO_DEBUG_EDIT) + int rc; + + /* Change uid/gid/groups to invoking user, usually needs root perms. */ + if (cd->euid != ROOT_UID) { + if (seteuid(ROOT_UID) != 0) + sudo_fatal("seteuid(ROOT_UID)"); + } + switch_user(ud->uid, ud->gid, ud->ngroups, ud->groups); + + /* Access checks are done using the euid/egid and group vector. */ + rc = faccessat(dfd, ".", W_OK, AT_EACCESS); + + /* Change uid/gid/groups back to target user, may need root perms. */ + if (ud->uid != ROOT_UID) { + if (seteuid(ROOT_UID) != 0) + sudo_fatal("seteuid(ROOT_UID)"); + } + switch_user(cd->euid, cd->egid, cd->ngroups, cd->groups); + + if (rc == 0) + debug_return_int(true); + if (errno == EACCES) + debug_return_int(false); + debug_return_int(-1); +} +#else +static bool +group_matches(gid_t target, gid_t gid, int ngroups, GETGROUPS_T *groups) +{ + int i; + debug_decl(group_matches, SUDO_DEBUG_EDIT) + + if (target == gid) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user gid %u matches directory gid %u", (unsigned int)gid, + (unsigned int)target); + debug_return_bool(true); + } + for (i = 0; i < ngroups; i++) { + if (target == groups[i]) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user gid %u matches directory gid %u", (unsigned int)gid, + (unsigned int)target); + debug_return_bool(true); + } + } + debug_return_bool(false); +} + +/* + * Returns true if the open directory fd is writable by the user. + */ +static int +dir_is_writable(int dfd, struct user_details *ud, struct command_details *cd) +{ + struct stat sb; + debug_decl(dir_is_writable, SUDO_DEBUG_EDIT) + + if (fstat(dfd, &sb) == -1) + debug_return_int(-1); + + /* If the user owns the dir we always consider it writable. */ + if (sb.st_uid == ud->uid) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "user uid %u matches directory uid %u", (unsigned int)ud->uid, + (unsigned int)sb.st_uid); + debug_return_int(true); + } + + /* Other writable? */ + if (ISSET(sb.st_mode, S_IWOTH)) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "directory is writable by other"); + debug_return_int(true); + } + + /* Group writable? */ + if (ISSET(sb.st_mode, S_IWGRP)) { + if (group_matches(sb.st_gid, ud->gid, ud->ngroups, ud->groups)) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "directory is writable by one of the user's groups"); + debug_return_int(true); + } + } + + errno = EACCES; + debug_return_int(false); +} +#endif /* HAVE_FACCESSAT */ + +/* + * Find our temporary directory, one of /var/tmp, /usr/tmp, or /tmp + * Returns true on success, else false; + */ +static bool +set_tmpdir(struct command_details *command_details) +{ + const char *tdir = NULL; + const char *tmpdirs[] = { + _PATH_VARTMP, +#ifdef _PATH_USRTMP + _PATH_USRTMP, +#endif + _PATH_TMP + }; + unsigned int i; + size_t len; + int dfd; + debug_decl(set_tmpdir, SUDO_DEBUG_EDIT) + + for (i = 0; tdir == NULL && i < nitems(tmpdirs); i++) { + if ((dfd = open(tmpdirs[i], O_RDONLY)) != -1) { + if (dir_is_writable(dfd, &user_details, command_details) == true) + tdir = tmpdirs[i]; + close(dfd); + } + } + if (tdir == NULL) + sudo_fatalx(U_("no writable temporary directory found")); + + len = strlcpy(edit_tmpdir, tdir, sizeof(edit_tmpdir)); + if (len >= sizeof(edit_tmpdir)) { + errno = ENAMETOOLONG; + sudo_warn("%s", tdir); + debug_return_bool(false); + } + while (len > 0 && edit_tmpdir[--len] == '/') + edit_tmpdir[len] = '\0'; + debug_return_bool(true); +} + +/* + * Construct a temporary file name for file and return an + * open file descriptor. The temporary file name is stored + * in tfile which the caller is responsible for freeing. + */ +static int +sudo_edit_mktemp(const char *ofile, char **tfile) +{ + const char *cp, *suff; + int len, tfd; + debug_decl(sudo_edit_mktemp, SUDO_DEBUG_EDIT) + + if ((cp = strrchr(ofile, '/')) != NULL) + cp++; + else + cp = ofile; + suff = strrchr(cp, '.'); + if (suff != NULL) { + len = asprintf(tfile, "%s/%.*sXXXXXXXX%s", edit_tmpdir, + (int)(size_t)(suff - cp), cp, suff); + } else { + len = asprintf(tfile, "%s/%s.XXXXXXXX", edit_tmpdir, cp); + } + if (len == -1) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + tfd = mkstemps(*tfile, suff ? strlen(suff) : 0); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "%s -> %s, fd %d", ofile, *tfile, tfd); + debug_return_int(tfd); +} + +#ifndef HAVE_OPENAT +static int +sudo_openat(int dfd, const char *path, int flags, mode_t mode) +{ + int fd, odfd; + debug_decl(sudo_openat, SUDO_DEBUG_EDIT) + + if (dfd == AT_FDCWD) + debug_return_int(open(path, flags, mode)); + + /* Save cwd */ + if ((odfd = open(".", O_RDONLY)) == -1) + debug_return_int(-1); + + if (fchdir(dfd) == -1) { + close(odfd); + debug_return_int(-1); + } + + fd = open(path, flags, mode); + + /* Restore cwd */ + if (fchdir(odfd) == -1) + sudo_fatal(U_("unable to restore current working directory")); + close(odfd); + + debug_return_int(fd); +} +#define openat sudo_openat +#endif /* HAVE_OPENAT */ + +#ifdef O_NOFOLLOW +static int +sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode) +{ + debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT) + + debug_return_int(openat(dfd, path, oflags|O_NOFOLLOW, mode)); +} +#else +/* + * Returns true if fd and path don't match or path is a symlink. + * Used on older systems without O_NOFOLLOW. + */ +static bool +sudo_edit_is_symlink(int fd, char *path) +{ + struct stat sb1, sb2; + debug_decl(sudo_edit_is_symlink, SUDO_DEBUG_EDIT) + + /* + * Treat [fl]stat() failure like there was a symlink. + */ + if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1) + debug_return_bool(true); + + /* + * Make sure we did not open a link and that what we opened + * matches what is currently on the file system. + */ + if (S_ISLNK(sb2.st_mode) || + sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) { + debug_return_bool(true); + } + + debug_return_bool(false); +} + +static int +sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode) +{ + int fd = -1, odfd = -1; + struct stat sb; + debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT) + + /* Save cwd and chdir to dfd */ + if ((odfd = open(".", O_RDONLY)) == -1) + debug_return_int(-1); + if (fchdir(dfd) == -1) { + close(odfd); + debug_return_int(-1); + } + + /* + * Check if path is a symlink. This is racey but we detect whether + * we lost the race in sudo_edit_is_symlink() after the open. + */ + if (lstat(path, &sb) == -1 && errno != ENOENT) + goto done; + if (S_ISLNK(sb.st_mode)) { + errno = ELOOP; + goto done; + } + + fd = open(path, oflags, mode); + if (fd == -1) + goto done; + + /* + * Post-open symlink check. This will leave a zero-length file if + * O_CREAT was specified but it is too dangerous to try and remove it. + */ + if (sudo_edit_is_symlink(fd, path)) { + close(fd); + fd = -1; + errno = ELOOP; + } + +done: + /* Restore cwd */ + if (odfd != -1) { + if (fchdir(odfd) == -1) + sudo_fatal(U_("unable to restore current working directory")); + close(odfd); + } + + debug_return_int(fd); +} +#endif /* O_NOFOLLOW */ + +/* + * Directory open flags for use with openat(2). + * Use O_SEARCH/O_PATH and/or O_DIRECTORY where possible. + */ +#if defined(O_SEARCH) +# if defined(O_DIRECTORY) +# define DIR_OPEN_FLAGS (O_SEARCH|O_DIRECTORY) +# else +# define DIR_OPEN_FLAGS (O_SEARCH) +# endif +#elif defined(O_PATH) +# if defined(O_DIRECTORY) +# define DIR_OPEN_FLAGS (O_PATH|O_DIRECTORY) +# else +# define DIR_OPEN_FLAGS (O_PATH) +# endif +#elif defined(O_DIRECTORY) +# define DIR_OPEN_FLAGS (O_RDONLY|O_DIRECTORY) +#else +# define DIR_OPEN_FLAGS (O_RDONLY|O_NONBLOCK) +#endif + +static int +sudo_edit_open_nonwritable(char *path, int oflags, mode_t mode, + struct command_details *command_details) +{ + const int dflags = DIR_OPEN_FLAGS; + int dfd, fd, is_writable; + debug_decl(sudo_edit_open_nonwritable, SUDO_DEBUG_EDIT) + + if (path[0] == '/') { + dfd = open("/", dflags); + path++; + } else { + dfd = open(".", dflags); + if (path[0] == '.' && path[1] == '/') + path += 2; + } + if (dfd == -1) + debug_return_int(-1); + + for (;;) { + char *slash; + int subdfd; + + /* + * Look up one component at a time, avoiding symbolic links in + * writable directories. + */ + is_writable = dir_is_writable(dfd, &user_details, command_details); + if (is_writable == -1) { + close(dfd); + debug_return_int(-1); + } + + while (path[0] == '/') + path++; + slash = strchr(path, '/'); + if (slash == NULL) + break; + *slash = '\0'; + if (is_writable) + subdfd = sudo_edit_openat_nofollow(dfd, path, dflags, 0); + else + subdfd = openat(dfd, path, dflags, 0); + *slash = '/'; /* restore path */ + close(dfd); + if (subdfd == -1) + debug_return_int(-1); + path = slash + 1; + dfd = subdfd; + } + + if (is_writable) { + close(dfd); + errno = EISDIR; + debug_return_int(-1); + } + + /* + * For "sudoedit /" we will receive ENOENT from openat() and sudoedit + * will try to create a file with an empty name. We treat an empty + * path as the cwd so sudoedit can give a sensible error message. + */ + fd = openat(dfd, *path ? path : ".", oflags, mode); + close(dfd); + debug_return_int(fd); +} + +#ifdef O_NOFOLLOW +static int +sudo_edit_open(char *path, int oflags, mode_t mode, + struct command_details *command_details) +{ + const int sflags = command_details ? command_details->flags : 0; + int fd; + debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT) + + if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) + oflags |= O_NOFOLLOW; + if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_details.uid != ROOT_UID) { + fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode, + command_details); + } else { + fd = open(path, oflags|O_NONBLOCK, mode); + } + if (fd != -1 && !ISSET(oflags, O_NONBLOCK)) + (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK); + debug_return_int(fd); +} +#else +static int +sudo_edit_open(char *path, int oflags, mode_t mode, + struct command_details *command_details) +{ + const int sflags = command_details ? command_details->flags : 0; + struct stat sb; + int fd; + debug_decl(sudo_edit_open, SUDO_DEBUG_EDIT) + + /* + * Check if path is a symlink. This is racey but we detect whether + * we lost the race in sudo_edit_is_symlink() after the file is opened. + */ + if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) { + if (lstat(path, &sb) == -1 && errno != ENOENT) + debug_return_int(-1); + if (S_ISLNK(sb.st_mode)) { + errno = ELOOP; + debug_return_int(-1); + } + } + + if (ISSET(sflags, CD_SUDOEDIT_CHECKDIR) && user_details.uid != ROOT_UID) { + fd = sudo_edit_open_nonwritable(path, oflags|O_NONBLOCK, mode, + command_details); + } else { + fd = open(path, oflags|O_NONBLOCK, mode); + } + if (fd == -1) + debug_return_int(-1); + if (!ISSET(oflags, O_NONBLOCK)) + (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK); + + /* + * Post-open symlink check. This will leave a zero-length file if + * O_CREAT was specified but it is too dangerous to try and remove it. + */ + if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW) && sudo_edit_is_symlink(fd, path)) { + close(fd); + fd = -1; + errno = ELOOP; + } + + debug_return_int(fd); +} +#endif /* O_NOFOLLOW */ + +/* + * Create temporary copies of files[] and store the temporary path name + * along with the original name, size and mtime in tf. + * Returns the number of files copied (which may be less than nfiles) + * or -1 if a fatal error occurred. + */ +static int +sudo_edit_create_tfiles(struct command_details *command_details, + struct tempfile *tf, char *files[], int nfiles) +{ + int i, j, tfd, ofd, rc; + struct timespec times[2]; + struct stat sb; + debug_decl(sudo_edit_create_tfiles, SUDO_DEBUG_EDIT) + + /* + * For each file specified by the user, make a temporary version + * and copy the contents of the original to it. + */ + for (i = 0, j = 0; i < nfiles; i++) { + rc = -1; + switch_user(command_details->euid, command_details->egid, + command_details->ngroups, command_details->groups); + ofd = sudo_edit_open(files[i], O_RDONLY, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details); + if (ofd != -1 || errno == ENOENT) { + if (ofd == -1) { + /* + * New file, verify parent dir exists unless in cwd. + * This fails early so the user knows ahead of time if the + * edit won't succeed. Additional checks are performed + * when copying the temporary file back to the origin. + */ + char *slash = strrchr(files[i], '/'); + if (slash != NULL && slash != files[i]) { + const int sflags = command_details->flags; + const int serrno = errno; + int dfd; + + /* + * The parent directory is allowed to be a symbolic + * link as long as *its* parent is not writable. + */ + *slash = '\0'; + SET(command_details->flags, CD_SUDOEDIT_FOLLOW); + dfd = sudo_edit_open(files[i], DIR_OPEN_FLAGS, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details); + command_details->flags = sflags; + if (dfd != -1) { + if (fstat(dfd, &sb) == 0 && S_ISDIR(sb.st_mode)) { + memset(&sb, 0, sizeof(sb)); + rc = 0; + } + close(dfd); + } + *slash = '/'; + errno = serrno; + } else { + memset(&sb, 0, sizeof(sb)); + rc = 0; + } + } else { + rc = fstat(ofd, &sb); + } + } + switch_user(ROOT_UID, user_details.egid, + user_details.ngroups, user_details.groups); + if (ofd != -1 && !S_ISREG(sb.st_mode)) { + sudo_warnx(U_("%s: not a regular file"), files[i]); + close(ofd); + continue; + } + if (rc == -1) { + /* open() or fstat() error. */ + if (ofd == -1 && errno == ELOOP) { + sudo_warnx(U_("%s: editing symbolic links is not permitted"), + files[i]); + } else if (ofd == -1 && errno == EISDIR) { + sudo_warnx(U_("%s: editing files in a writable directory is not permitted"), + files[i]); + } else { + sudo_warn("%s", files[i]); + } + if (ofd != -1) + close(ofd); + continue; + } + tf[j].ofile = files[i]; + tf[j].osize = sb.st_size; + mtim_get(&sb, tf[j].omtim); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "seteuid(%u)", (unsigned int)user_details.uid); + if (seteuid(user_details.uid) != 0) + sudo_fatal("seteuid(%u)", (unsigned int)user_details.uid); + tfd = sudo_edit_mktemp(tf[j].ofile, &tf[j].tfile); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "seteuid(%u)", ROOT_UID); + if (seteuid(ROOT_UID) != 0) + sudo_fatal("seteuid(ROOT_UID)"); + if (tfd == -1) { + sudo_warn("mkstemps"); + if (ofd != -1) + close(ofd); + debug_return_int(-1); + } + if (ofd != -1) { + if (sudo_copy_file(tf[j].ofile, ofd, tf[j].osize, tf[j].tfile, tfd, -1) == -1) { + close(ofd); + close(tfd); + debug_return_int(-1); + } + close(ofd); + } + /* + * We always update the stashed mtime because the time + * resolution of the filesystem the temporary file is on may + * not match that of the filesystem where the file to be edited + * resides. It is OK if futimens() fails since we only use the + * info to determine whether or not a file has been modified. + */ + times[0].tv_sec = times[1].tv_sec = tf[j].omtim.tv_sec; + times[0].tv_nsec = times[1].tv_nsec = tf[j].omtim.tv_nsec; + if (futimens(tfd, times) == -1) { + if (utimensat(AT_FDCWD, tf[j].tfile, times, 0) == -1) + sudo_warn("%s", tf[j].tfile); + } + rc = fstat(tfd, &sb); + if (!rc) + mtim_get(&sb, tf[j].omtim); + close(tfd); + j++; + } + debug_return_int(j); +} + +/* + * Copy the temporary files specified in tf to the originals. + * Returns the number of copy errors or 0 if completely successful. + */ +static int +sudo_edit_copy_tfiles(struct command_details *command_details, + struct tempfile *tf, int nfiles, struct timespec *times) +{ + int i, tfd, ofd, errors = 0; + struct timespec ts; + struct stat sb; + mode_t oldmask; + debug_decl(sudo_edit_copy_tfiles, SUDO_DEBUG_EDIT) + + /* Copy contents of temp files to real ones. */ + for (i = 0; i < nfiles; i++) { + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "seteuid(%u)", (unsigned int)user_details.uid); + if (seteuid(user_details.uid) != 0) + sudo_fatal("seteuid(%u)", (unsigned int)user_details.uid); + tfd = sudo_edit_open(tf[i].tfile, O_RDONLY, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, NULL); + if (seteuid(ROOT_UID) != 0) + sudo_fatal("seteuid(ROOT_UID)"); + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "seteuid(%u)", ROOT_UID); + if (tfd == -1 || !sudo_check_temp_file(tfd, tf[i].tfile, user_details.uid, &sb)) { + sudo_warnx(U_("%s left unmodified"), tf[i].ofile); + if (tfd != -1) + close(tfd); + errors++; + continue; + } + mtim_get(&sb, ts); + if (tf[i].osize == sb.st_size && sudo_timespeccmp(&tf[i].omtim, &ts, ==)) { + /* + * If mtime and size match but the user spent no measurable + * time in the editor we can't tell if the file was changed. + */ + if (sudo_timespeccmp(×[0], ×[1], !=)) { + sudo_warnx(U_("%s unchanged"), tf[i].ofile); + unlink(tf[i].tfile); + close(tfd); + continue; + } + } + switch_user(command_details->euid, command_details->egid, + command_details->ngroups, command_details->groups); + oldmask = umask(command_details->umask); + ofd = sudo_edit_open(tf[i].ofile, O_WRONLY|O_CREAT, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, command_details); + umask(oldmask); + switch_user(ROOT_UID, user_details.egid, + user_details.ngroups, user_details.groups); + if (ofd == -1) { + sudo_warn(U_("unable to write to %s"), tf[i].ofile); + goto bad; + } + + /* Overwrite the old file with the new contents. */ + if (sudo_copy_file(tf[i].tfile, tfd, sb.st_size, tf[i].ofile, ofd, + tf[i].osize) == -1) { +bad: + sudo_warnx(U_("contents of edit session left in %s"), tf[i].tfile); + errors++; + } + + if (ofd != -1) + close(ofd); + close(tfd); + } + debug_return_int(errors); +} + +#ifdef HAVE_SELINUX +static int +selinux_run_helper(uid_t uid, gid_t gid, int ngroups, GETGROUPS_T *groups, + char *const argv[], char *const envp[]) +{ + int status, ret = SESH_ERR_FAILURE; + const char *sesh; + pid_t child, pid; + debug_decl(selinux_run_helper, SUDO_DEBUG_EDIT); + + sesh = sudo_conf_sesh_path(); + if (sesh == NULL) { + sudo_warnx("internal error: sesh path not set"); + debug_return_int(-1); + } + + child = sudo_debug_fork(); + switch (child) { + case -1: + sudo_warn(U_("unable to fork")); + break; + case 0: + /* child runs sesh in new context */ + if (selinux_setcon() == 0) { + switch_user(uid, gid, ngroups, groups); + execve(sesh, argv, envp); + } + _exit(SESH_ERR_FAILURE); + default: + /* parent waits */ + do { + pid = waitpid(child, &status, 0); + } while (pid == -1 && errno == EINTR); + + ret = WIFSIGNALED(status) ? SESH_ERR_KILLED : WEXITSTATUS(status); + } + + debug_return_int(ret); +} + +static int +selinux_edit_create_tfiles(struct command_details *command_details, + struct tempfile *tf, char *files[], int nfiles) +{ + char **sesh_args, **sesh_ap; + int i, rc, error, sesh_nargs, ret = -1; + struct stat sb; + debug_decl(selinux_edit_create_tfiles, SUDO_DEBUG_EDIT) + + if (nfiles < 1) + debug_return_int(0); + + /* Construct common args for sesh */ + sesh_nargs = 4 + (nfiles * 2) + 1; + sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *)); + if (sesh_args == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto done; + } + *sesh_ap++ = "sesh"; + *sesh_ap++ = "-e"; + if (!ISSET(command_details->flags, CD_SUDOEDIT_FOLLOW)) + *sesh_ap++ = "-h"; + *sesh_ap++ = "0"; + + for (i = 0; i < nfiles; i++) { + char *tfile, *ofile = files[i]; + int tfd; + *sesh_ap++ = ofile; + tf[i].ofile = ofile; + if (stat(ofile, &sb) == -1) + memset(&sb, 0, sizeof(sb)); /* new file */ + tf[i].osize = sb.st_size; + mtim_get(&sb, tf[i].omtim); + /* + * The temp file must be created by the sesh helper, + * which uses O_EXCL | O_NOFOLLOW to make this safe. + */ + tfd = sudo_edit_mktemp(ofile, &tfile); + if (tfd == -1) { + sudo_warn("mkstemps"); + free(tfile); + goto done; + } + /* Helper will re-create temp file with proper security context. */ + close(tfd); + unlink(tfile); + *sesh_ap++ = tfile; + tf[i].tfile = tfile; + } + *sesh_ap = NULL; + + /* Run sesh -e [-h] 0 ... */ + error = selinux_run_helper(command_details->uid, command_details->gid, + command_details->ngroups, command_details->groups, sesh_args, + command_details->envp); + switch (error) { + case SESH_SUCCESS: + break; + case SESH_ERR_BAD_PATHS: + sudo_fatalx(U_("sesh: internal error: odd number of paths")); + case SESH_ERR_NO_FILES: + sudo_fatalx(U_("sesh: unable to create temporary files")); + case SESH_ERR_KILLED: + sudo_fatalx(U_("sesh: killed by a signal")); + default: + sudo_fatalx(U_("sesh: unknown error %d"), error); + goto done; + } + + for (i = 0; i < nfiles; i++) { + int tfd = open(tf[i].tfile, O_RDONLY|O_NONBLOCK|O_NOFOLLOW); + if (tfd == -1) { + sudo_warn(U_("unable to open %s"), tf[i].tfile); + goto done; + } + if (!sudo_check_temp_file(tfd, tf[i].tfile, command_details->uid, NULL)) { + close(tfd); + goto done; + } + if (fchown(tfd, user_details.uid, user_details.gid) != 0) { + sudo_warn("unable to chown(%s) to %d:%d for editing", + tf[i].tfile, user_details.uid, user_details.gid); + close(tfd); + goto done; + } + close(tfd); + } + ret = nfiles; + +done: + /* Contents of tf will be freed by caller. */ + free(sesh_args); + + debug_return_int(ret); +} + +static int +selinux_edit_copy_tfiles(struct command_details *command_details, + struct tempfile *tf, int nfiles, struct timespec *times) +{ + char **sesh_args, **sesh_ap; + int i, rc, error, sesh_nargs, ret = 1; + int tfd = -1; + struct timespec ts; + struct stat sb; + debug_decl(selinux_edit_copy_tfiles, SUDO_DEBUG_EDIT) + + if (nfiles < 1) + debug_return_int(0); + + /* Construct common args for sesh */ + sesh_nargs = 3 + (nfiles * 2) + 1; + sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *)); + if (sesh_args == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + *sesh_ap++ = "sesh"; + *sesh_ap++ = "-e"; + *sesh_ap++ = "1"; + + /* Construct args for sesh -e 1 */ + for (i = 0; i < nfiles; i++) { + if (tfd != -1) + close(tfd); + if ((tfd = open(tf[i].tfile, O_RDONLY|O_NONBLOCK|O_NOFOLLOW)) == -1) { + sudo_warn(U_("unable to open %s"), tf[i].tfile); + continue; + } + if (!sudo_check_temp_file(tfd, tf[i].tfile, user_details.uid, &sb)) + continue; + mtim_get(&sb, ts); + if (tf[i].osize == sb.st_size && sudo_timespeccmp(&tf[i].omtim, &ts, ==)) { + /* + * If mtime and size match but the user spent no measurable + * time in the editor we can't tell if the file was changed. + */ + if (sudo_timespeccmp(×[0], ×[1], !=)) { + sudo_warnx(U_("%s unchanged"), tf[i].ofile); + unlink(tf[i].tfile); + continue; + } + } + *sesh_ap++ = tf[i].tfile; + *sesh_ap++ = tf[i].ofile; + if (fchown(tfd, command_details->uid, command_details->gid) != 0) { + sudo_warn("unable to chown(%s) back to %d:%d", tf[i].tfile, + command_details->uid, command_details->gid); + } + } + *sesh_ap = NULL; + if (tfd != -1) + close(tfd); + + if (sesh_ap - sesh_args > 3) { + /* Run sesh -e 1 ... */ + error = selinux_run_helper(command_details->uid, command_details->gid, + command_details->ngroups, command_details->groups, sesh_args, + command_details->envp); + switch (error) { + case SESH_SUCCESS: + ret = 0; + break; + case SESH_ERR_NO_FILES: + sudo_warnx(U_("unable to copy temporary files back to their original location")); + break; + case SESH_ERR_SOME_FILES: + sudo_warnx(U_("unable to copy some of the temporary files back to their original location")); + break; + case SESH_ERR_KILLED: + sudo_warnx(U_("sesh: killed by a signal")); + break; + default: + sudo_warnx(U_("sesh: unknown error %d"), error); + break; + } + if (ret != 0) + sudo_warnx(U_("contents of edit session left in %s"), edit_tmpdir); + } + free(sesh_args); + + debug_return_int(ret); +} +#endif /* HAVE_SELINUX */ + +/* + * Wrapper to allow users to edit privileged files with their own uid. + * Returns the wait status of the command on success and a wait status + * of 1 on failure. + */ +int +sudo_edit(struct command_details *command_details) +{ + struct command_details saved_command_details; + char **nargv = NULL, **ap, **files = NULL; + int errors, i, ac, nargc, ret; + int editor_argc = 0, nfiles = 0; + struct timespec times[2]; + struct tempfile *tf = NULL; + debug_decl(sudo_edit, SUDO_DEBUG_EDIT) + + if (!set_tmpdir(command_details)) + goto cleanup; + + /* + * Set real, effective and saved uids to root. + * We will change the euid as needed below. + */ + sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, + "setuid(%u)", ROOT_UID); + if (setuid(ROOT_UID) != 0) { + sudo_warn(U_("unable to change uid to root (%u)"), ROOT_UID); + goto cleanup; + } + + /* + * The user's editor must be separated from the files to be + * edited by a "--" option. + */ + for (ap = command_details->argv; *ap != NULL; ap++) { + if (files) + nfiles++; + else if (strcmp(*ap, "--") == 0) + files = ap + 1; + else + editor_argc++; + } + if (nfiles == 0) { + sudo_warnx(U_("plugin error: missing file list for sudoedit")); + goto cleanup; + } + +#ifdef HAVE_SELINUX + /* Compute new SELinux security context. */ + if (ISSET(command_details->flags, CD_RBAC_ENABLED)) { + if (selinux_setup(command_details->selinux_role, + command_details->selinux_type, NULL, -1, false) != 0) + goto cleanup; + } +#endif + + /* Copy editor files to temporaries. */ + tf = calloc(nfiles, sizeof(*tf)); + if (tf == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto cleanup; + } +#ifdef HAVE_SELINUX + if (ISSET(command_details->flags, CD_RBAC_ENABLED)) + nfiles = selinux_edit_create_tfiles(command_details, tf, files, nfiles); + else +#endif + nfiles = sudo_edit_create_tfiles(command_details, tf, files, nfiles); + if (nfiles <= 0) + goto cleanup; + + /* + * Allocate space for the new argument vector and fill it in. + * We concatenate the editor with its args and the file list + * to create a new argv. + */ + nargc = editor_argc + nfiles; + nargv = reallocarray(NULL, nargc + 1, sizeof(char *)); + if (nargv == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto cleanup; + } + for (ac = 0; ac < editor_argc; ac++) + nargv[ac] = command_details->argv[ac]; + for (i = 0; i < nfiles && ac < nargc; ) + nargv[ac++] = tf[i++].tfile; + nargv[ac] = NULL; + + /* + * Run the editor with the invoking user's creds, + * keeping track of the time spent in the editor. + * XXX - should run editor with user's context + */ + if (sudo_gettime_real(×[0]) == -1) { + sudo_warn(U_("unable to read the clock")); + goto cleanup; + } + memcpy(&saved_command_details, command_details, sizeof(struct command_details)); + command_details->uid = user_details.uid; + command_details->euid = user_details.uid; + command_details->gid = user_details.gid; + command_details->egid = user_details.gid; + command_details->ngroups = user_details.ngroups; + command_details->groups = user_details.groups; + command_details->argv = nargv; + ret = run_command(command_details); + if (sudo_gettime_real(×[1]) == -1) { + sudo_warn(U_("unable to read the clock")); + goto cleanup; + } + + /* Restore saved command_details. */ + command_details->uid = saved_command_details.uid; + command_details->euid = saved_command_details.euid; + command_details->gid = saved_command_details.gid; + command_details->egid = saved_command_details.egid; + command_details->ngroups = saved_command_details.ngroups; + command_details->groups = saved_command_details.groups; + command_details->argv = saved_command_details.argv; + + /* Copy contents of temp files to real ones. */ +#ifdef HAVE_SELINUX + if (ISSET(command_details->flags, CD_RBAC_ENABLED)) + errors = selinux_edit_copy_tfiles(command_details, tf, nfiles, times); + else +#endif + errors = sudo_edit_copy_tfiles(command_details, tf, nfiles, times); + if (errors) { + /* Preserve the edited temporary files. */ + ret = W_EXITCODE(1, 0); + } + + for (i = 0; i < nfiles; i++) + free(tf[i].tfile); + free(tf); + free(nargv); + debug_return_int(ret); + +cleanup: + /* Clean up temp files and return. */ + if (tf != NULL) { + for (i = 0; i < nfiles; i++) { + if (tf[i].tfile != NULL) + unlink(tf[i].tfile); + free(tf[i].tfile); + } + } + free(tf); + free(nargv); + debug_return_int(W_EXITCODE(1, 0)); +} + +#else /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ + +/* + * Must have the ability to change the effective uid to use sudoedit. + */ +int +sudo_edit(struct command_details *command_details) +{ + debug_decl(sudo_edit, SUDO_DEBUG_EDIT) + debug_return_int(W_EXITCODE(1, 0)); +} + +#endif /* HAVE_SETRESUID || HAVE_SETREUID || HAVE_SETEUID */ diff --git a/utsudo-0.0.2/src_ori/sudo_exec.h b/utsudo-0.0.2/src_ori/sudo_exec.h new file mode 100644 index 0000000..210c65e --- /dev/null +++ b/utsudo-0.0.2/src_ori/sudo_exec.h @@ -0,0 +1,119 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2017, 2020-2021 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_EXEC_H +#define SUDO_EXEC_H + +/* + * Older systems may not support MSG_WAITALL but it shouldn't really be needed. + */ +#ifndef MSG_WAITALL +# define MSG_WAITALL 0 +#endif + +/* + * Some older systems support siginfo but predate SI_USER. + */ +#ifdef SI_USER +# define USER_SIGNALED(_info) ((_info) != NULL && (_info)->si_code == SI_USER) +#else +# define USER_SIGNALED(_info) ((_info) != NULL && (_info)->si_code <= 0) +#endif + +/* + * Indices into io_fds[] when running a command in a pty. + */ +#define SFD_STDIN 0 +#define SFD_STDOUT 1 +#define SFD_STDERR 2 +#define SFD_MASTER 3 +#define SFD_SLAVE 4 +#define SFD_USERTTY 5 + +/* + * Special values to indicate whether continuing in foreground or background. + */ +#define SIGCONT_FG -2 +#define SIGCONT_BG -3 + +/* + * Positions in saved_signals[] + */ +#define SAVED_SIGALRM 0 +#define SAVED_SIGCHLD 1 +#define SAVED_SIGCONT 2 +#define SAVED_SIGHUP 3 +#define SAVED_SIGINT 4 +#define SAVED_SIGPIPE 5 +#define SAVED_SIGQUIT 6 +#define SAVED_SIGTERM 7 +#define SAVED_SIGTSTP 8 +#define SAVED_SIGTTIN 9 +#define SAVED_SIGTTOU 10 +#define SAVED_SIGUSR1 11 +#define SAVED_SIGUSR2 12 + +/* + * Error codes for sesh + */ +#define SESH_SUCCESS 0 /* successful operation */ +#define SESH_ERR_FAILURE 1 /* unspecified error */ +#define SESH_ERR_KILLED 2 /* killed by a signal */ +#define SESH_ERR_INVALID 30 /* invalid -e arg value */ +#define SESH_ERR_BAD_PATHS 31 /* odd number of paths */ +#define SESH_ERR_NO_FILES 32 /* copy error, no files copied */ +#define SESH_ERR_SOME_FILES 33 /* copy error, some files copied */ + +/* + * Symbols shared between exec.c, exec_nopty.c, exec_pty.c and exec_monitor.c + */ +struct command_details; +struct command_status; +struct stat; + +/* copy_file.c */ +int sudo_copy_file(const char *src, int src_fd, off_t src_len, const char *dst, int dst_fd, off_t dst_len); +bool sudo_check_temp_file(int tfd, const char *tname, uid_t uid, struct stat *sb); + +/* exec.c */ +void exec_cmnd(struct command_details *details, int errfd); +void terminate_command(pid_t pid, bool use_pgrp); +bool sudo_terminated(struct command_status *cstat); + +/* exec_common.c */ +int sudo_execve(int fd, const char *path, char *const argv[], char *envp[], bool noexec); +char **disable_execute(char *envp[], const char *dso); + +/* exec_nopty.c */ +void exec_nopty(struct command_details *details, struct command_status *cstat); + +/* exec_pty.c */ +bool exec_pty(struct command_details *details, struct command_status *cstat); +void pty_cleanup(void); +int pty_make_controlling(void); +extern int io_fds[6]; + +/* exec_monitor.c */ +int exec_monitor(struct command_details *details, sigset_t *omask, bool foreground, int backchannel); + +/* utmp.c */ +bool utmp_login(const char *from_line, const char *to_line, int ttyfd, + const char *user); +bool utmp_logout(const char *line, int status); + +#endif /* SUDO_EXEC_H */ diff --git a/utsudo-0.0.2/src_ori/sudo_noexec.c b/utsudo-0.0.2/src_ori/sudo_noexec.c new file mode 100644 index 0000000..336ae85 --- /dev/null +++ b/utsudo-0.0.2/src_ori/sudo_noexec.c @@ -0,0 +1,263 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2004-2005, 2010-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include + +#if defined(HAVE_DECL_SECCOMP_SET_MODE_FILTER) && HAVE_DECL_SECCOMP_SET_MODE_FILTER +# include +# include +# include +# include +#endif + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SPAWN_H +#include +#endif +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#ifdef HAVE_WORDEXP_H +#include +#endif +#if defined(HAVE_SHL_LOAD) +# include +#elif defined(HAVE_DLOPEN) +# include +#endif + +#include "sudo_compat.h" +#include "pathnames.h" + +#ifdef HAVE___INTERPOSE +/* + * Mac OS X 10.4 and above has support for library symbol interposition. + * There is a good explanation of this in the Mac OS X Internals book. + */ +typedef struct interpose_s { + void *new_func; + void *orig_func; +} interpose_t; + +# define FN_NAME(fn) dummy_ ## fn +# define INTERPOSE(fn) \ + __attribute__((__used__)) static const interpose_t interpose_ ## fn \ + __attribute__((__section__("__DATA,__interpose"))) = \ + { (void *)dummy_ ## fn, (void *)fn }; +#else +# define FN_NAME(fn) fn +# define INTERPOSE(fn) +#endif + +/* + * Dummy versions of the exec(3) family of syscalls. It is not enough to + * just dummy out execve(2) since many C libraries do not call the public + * execve(2) interface. Note that it is still possible to access the real + * syscalls via the syscall(2) interface, but that is rarely done. + */ + +#define DUMMY_BODY \ +{ \ + errno = EACCES; \ + return -1; \ +} + +#define DUMMY1(fn, t1) \ +__dso_public int \ +FN_NAME(fn)(t1 a1) \ +DUMMY_BODY \ +INTERPOSE(fn) + +#define DUMMY2(fn, t1, t2) \ +__dso_public int \ +FN_NAME(fn)(t1 a1, t2 a2) \ +DUMMY_BODY \ +INTERPOSE(fn) + +#define DUMMY3(fn, t1, t2, t3) \ +__dso_public int \ +FN_NAME(fn)(t1 a1, t2 a2, t3 a3) \ +DUMMY_BODY \ +INTERPOSE(fn) + +#define DUMMY6(fn, t1, t2, t3, t4, t5, t6) \ +__dso_public int \ +FN_NAME(fn)(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) \ +DUMMY_BODY \ +INTERPOSE(fn) + +#define DUMMY_VA(fn, t1, t2) \ +__dso_public int \ +FN_NAME(fn)(t1 a1, t2 a2, ...) \ +DUMMY_BODY \ +INTERPOSE(fn) + +/* + * Standard exec(3) family of functions. + */ +DUMMY_VA(execl, const char *, const char *) +DUMMY_VA(execle, const char *, const char *) +DUMMY_VA(execlp, const char *, const char *) +DUMMY2(execv, const char *, char * const *) +DUMMY2(execvp, const char *, char * const *) +DUMMY3(execve, const char *, char * const *, char * const *) + +/* + * Non-standard exec(3) functions and corresponding private versions. + */ +#ifdef HAVE_EXECVP +DUMMY3(execvP, const char *, const char *, char * const *) +#endif +#ifdef HAVE_EXECVPE +DUMMY3(execvpe, const char *, char * const *, char * const *) +#endif +#ifdef HAVE_EXECT +DUMMY3(exect, const char *, char * const *, char * const *) +#endif + +/* + * Not all systems support fexecve(2), posix_spawn(2) and posix_spawnp(2). + */ +#ifdef HAVE_FEXECVE +DUMMY3(fexecve, int , char * const *, char * const *) +#endif +#ifdef HAVE_POSIX_SPAWN +DUMMY6(posix_spawn, pid_t *, const char *, const posix_spawn_file_actions_t *, const posix_spawnattr_t *, char * const *, char * const *) +#endif +#ifdef HAVE_POSIX_SPAWNP +DUMMY6(posix_spawnp, pid_t *, const char *, const posix_spawn_file_actions_t *, const posix_spawnattr_t *, char * const *, char * const *) +#endif + +/* + * system(3) and popen(3). + * We can't use a wrapper for popen since it returns FILE *, not int. + */ +DUMMY1(system, const char *) + +__dso_public FILE * +FN_NAME(popen)(const char *c, const char *t) +{ + errno = EACCES; + return NULL; +} +INTERPOSE(popen) + +#if defined(HAVE_WORDEXP) && (defined(RTLD_NEXT) || defined(HAVE_SHL_LOAD) || defined(HAVE___INTERPOSE)) +/* + * We can't use a wrapper for wordexp(3) since we still want to call + * the real wordexp(3) but with WRDE_NOCMD added to the flags argument. + */ +typedef int (*sudo_fn_wordexp_t)(const char *, wordexp_t *, int); + +__dso_public int +FN_NAME(wordexp)(const char *words, wordexp_t *we, int flags) +{ +#if defined(HAVE___INTERPOSE) + return wordexp(words, we, flags | WRDE_NOCMD); +#else +# if defined(HAVE_DLOPEN) + void *fn = dlsym(RTLD_NEXT, "wordexp"); +# elif defined(HAVE_SHL_LOAD) + const char *name, *myname = _PATH_SUDO_NOEXEC; + struct shl_descriptor *desc; + void *fn = NULL; + int idx = 0; + + name = strrchr(myname, '/'); + if (name != NULL) + myname = name + 1; + + /* Search for wordexp() but skip this shared object. */ + while (shl_get(idx++, &desc) == 0) { + name = strrchr(desc->filename, '/'); + if (name == NULL) + name = desc->filename; + else + name++; + if (strcmp(name, myname) == 0) + continue; + if (shl_findsym(&desc->handle, "wordexp", TYPE_PROCEDURE, &fn) == 0) + break; + } +# else + void *fn = NULL; +# endif + if (fn == NULL) { + errno = EACCES; + return -1; + } + return ((sudo_fn_wordexp_t)fn)(words, we, flags | WRDE_NOCMD); +#endif /* HAVE___INTERPOSE */ +} +INTERPOSE(wordexp) +#endif /* HAVE_WORDEXP && (RTLD_NEXT || HAVE_SHL_LOAD || HAVE___INTERPOSE) */ + +/* + * On Linux we can use a seccomp() filter to disable exec. + */ +#if defined(HAVE_DECL_SECCOMP_SET_MODE_FILTER) && HAVE_DECL_SECCOMP_SET_MODE_FILTER + +/* Older systems may not support execveat(2). */ +#ifndef __NR_execveat +# define __NR_execveat -1 +#endif + +static void noexec_ctor(void) __attribute__((constructor)); + +static void +noexec_ctor(void) +{ + struct sock_filter exec_filter[] = { + /* Load syscall number into the accumulator */ + BPF_STMT(BPF_LD | BPF_ABS, offsetof(struct seccomp_data, nr)), + /* Jump to deny for execve/execveat */ + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_execve, 2, 0), + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_execveat, 1, 0), + /* Allow non-matching syscalls */ + BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), + /* Deny execve/execveat syscall */ + BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | (EACCES & SECCOMP_RET_DATA)) + }; + const struct sock_fprog exec_fprog = { + nitems(exec_filter), + exec_filter + }; + + /* + * SECCOMP_MODE_FILTER will fail unless the process has + * CAP_SYS_ADMIN or the no_new_privs bit is set. + */ + if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == 0) + (void)prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &exec_fprog); +} +#endif /* HAVE_DECL_SECCOMP_SET_MODE_FILTER */ diff --git a/utsudo-0.0.2/src_ori/sudo_plugin_int.h b/utsudo-0.0.2/src_ori/sudo_plugin_int.h new file mode 100644 index 0000000..3b85a48 --- /dev/null +++ b/utsudo-0.0.2/src_ori/sudo_plugin_int.h @@ -0,0 +1,119 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2010-2014 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_PLUGIN_INT_H +#define SUDO_PLUGIN_INT_H + +/* + * All plugin structures start with a type and a version. + */ +struct generic_plugin { + unsigned int type; + unsigned int version; + /* the rest depends on the type... */ +}; + +typedef int (*sudo_conv_1_7_t)(int num_msgs, + const struct sudo_conv_message msgs[], struct sudo_conv_reply replies[]); + +/* + * Backwards-compatible structures for API bumps. + */ +struct policy_plugin_1_0 { + unsigned int type; + unsigned int version; + int (*open)(unsigned int version, sudo_conv_1_7_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const user_env[]); + void (*close)(int exit_status, int error); /* wait status or error */ + int (*show_version)(int verbose); + int (*check_policy)(int argc, char * const argv[], + char *env_add[], char **command_info[], + char **argv_out[], char **user_env_out[]); + int (*list)(int argc, char * const argv[], int verbose, + const char *list_user); + int (*validate)(void); + void (*invalidate)(int remove); + int (*init_session)(struct passwd *pwd); +}; +struct io_plugin_1_0 { + unsigned int type; + unsigned int version; + int (*open)(unsigned int version, sudo_conv_1_7_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], int argc, char * const argv[], + char * const user_env[]); + void (*close)(int exit_status, int error); + int (*show_version)(int verbose); + int (*log_ttyin)(const char *buf, unsigned int len); + int (*log_ttyout)(const char *buf, unsigned int len); + int (*log_stdin)(const char *buf, unsigned int len); + int (*log_stdout)(const char *buf, unsigned int len); + int (*log_stderr)(const char *buf, unsigned int len); +}; +struct io_plugin_1_1 { + unsigned int type; + unsigned int version; + int (*open)(unsigned int version, sudo_conv_1_7_t conversation, + sudo_printf_t sudo_printf, char * const settings[], + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[]); + void (*close)(int exit_status, int error); /* wait status or error */ + int (*show_version)(int verbose); + int (*log_ttyin)(const char *buf, unsigned int len); + int (*log_ttyout)(const char *buf, unsigned int len); + int (*log_stdin)(const char *buf, unsigned int len); + int (*log_stdout)(const char *buf, unsigned int len); + int (*log_stderr)(const char *buf, unsigned int len); +}; + +/* + * Sudo plugin internals. + */ +struct plugin_container { + TAILQ_ENTRY(plugin_container) entries; + struct sudo_conf_debug_file_list *debug_files; + char *name; + char *path; + char **options; + void *handle; + int debug_instance; + union { + struct generic_plugin *generic; + struct policy_plugin *policy; + struct policy_plugin_1_0 *policy_1_0; + struct io_plugin *io; + struct io_plugin_1_0 *io_1_0; + struct io_plugin_1_1 *io_1_1; + } u; +}; +TAILQ_HEAD(plugin_container_list, plugin_container); + +extern struct plugin_container policy_plugin; +extern struct plugin_container_list io_plugins; + +int sudo_conversation(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[], struct sudo_conv_callback *callback); +int sudo_conversation_1_7(int num_msgs, const struct sudo_conv_message msgs[], + struct sudo_conv_reply replies[]); +int sudo_conversation_printf(int msg_type, const char *fmt, ...); + +bool sudo_load_plugins(struct plugin_container *policy_plugin, + struct plugin_container_list *io_plugins); + +#endif /* SUDO_PLUGIN_INT_H */ diff --git a/utsudo-0.0.2/src_ori/sudo_usage.h.in b/utsudo-0.0.2/src_ori/sudo_usage.h.in new file mode 100644 index 0000000..d37c49a --- /dev/null +++ b/utsudo-0.0.2/src_ori/sudo_usage.h.in @@ -0,0 +1,38 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2007-2010, 2013, 2015, 2017 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef SUDO_USAGE_H +#define SUDO_USAGE_H + +/* + * Usage strings for sudo. These are here because we + * need to be able to substitute values from configure. + */ +#define SUDO_USAGE1 " -h | -K | -k | -V" +#define SUDO_USAGE2 " -v [-AknS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-u user]" +#define SUDO_USAGE3 " -l [-AknS] @BSDAUTH_USAGE@[-g group] [-h host] [-p prompt] [-U user] [-u user] [command]" +#define SUDO_USAGE4 " [-AbEHknPS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] @LOGINCAP_USAGE@[-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] []" +#define SUDO_USAGE5 " -e [-AknS] @BSDAUTH_USAGE@@SELINUX_USAGE@[-C num] @LOGINCAP_USAGE@[-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ..." + +/* + * Configure script arguments used to build sudo. + */ +#define CONFIGURE_ARGS "@CONFIGURE_ARGS@" + +#endif /* SUDO_USAGE_H */ diff --git a/utsudo-0.0.2/src_ori/tcsetpgrp_nobg.c b/utsudo-0.0.2/src_ori/tcsetpgrp_nobg.c new file mode 100644 index 0000000..be58ab1 --- /dev/null +++ b/utsudo-0.0.2/src_ori/tcsetpgrp_nobg.c @@ -0,0 +1,80 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2017 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "utsudo.h" + +static volatile sig_atomic_t got_sigttou; + +/* + * SIGTTOU signal handler for tcsetpgrp_nobg() that just sets a flag. + */ +static void +sigttou(int signo) +{ + got_sigttou = 1; +} + +/* + * Like tcsetpgrp() but restarts on EINTR _except_ for SIGTTOU. + * Returns 0 on success or -1 on failure, setting errno. + * Sets got_sigttou on failure if interrupted by SIGTTOU. + */ +int +tcsetpgrp_nobg(int fd, pid_t pgrp_id) +{ + struct sigaction sa, osa; + int rc; + + /* + * If we receive SIGTTOU from tcsetpgrp() it means we are + * not in the foreground process group. + * This avoid a TOCTOU race compared to using tcgetpgrp(). + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; /* do not restart syscalls */ + sa.sa_handler = sigttou; + got_sigttou = 0; + (void)sigaction(SIGTTOU, &sa, &osa); + do { + rc = tcsetpgrp(fd, pgrp_id); + } while (rc != 0 && errno == EINTR && !got_sigttou); + (void)sigaction(SIGTTOU, &osa, NULL); + + return rc; +} diff --git a/utsudo-0.0.2/src_ori/tgetpass.c b/utsudo-0.0.2/src_ori/tgetpass.c new file mode 100644 index 0000000..fb67ae7 --- /dev/null +++ b/utsudo-0.0.2/src_ori/tgetpass.c @@ -0,0 +1,449 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1996, 1998-2005, 2007-2018 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include + +#include "utsudo.h" +#include "sudo_plugin.h" + +enum tgetpass_errval { + TGP_ERRVAL_NOERROR, + TGP_ERRVAL_TIMEOUT, + TGP_ERRVAL_NOPASSWORD, + TGP_ERRVAL_READERROR +}; + +static volatile sig_atomic_t signo[NSIG]; + +static void tgetpass_handler(int); +static char *getln(int, char *, size_t, bool, enum tgetpass_errval *); +static char *sudo_askpass(const char *, const char *); + +static int +suspend(int signo, struct sudo_conv_callback *callback) +{ + int ret = 0; + debug_decl(suspend, SUDO_DEBUG_CONV) + + if (callback != NULL && SUDO_API_VERSION_GET_MAJOR(callback->version) != SUDO_CONV_CALLBACK_VERSION_MAJOR) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO, + "callback major version mismatch, expected %u, got %u", + SUDO_CONV_CALLBACK_VERSION_MAJOR, + SUDO_API_VERSION_GET_MAJOR(callback->version)); + callback = NULL; + } + + if (callback != NULL && callback->on_suspend != NULL) { + if (callback->on_suspend(signo, callback->closure) == -1) + ret = -1; + } + kill(getpid(), signo); + if (callback != NULL && callback->on_resume != NULL) { + if (callback->on_resume(signo, callback->closure) == -1) + ret = -1; + } + debug_return_int(ret); +} + +static void +tgetpass_display_error(enum tgetpass_errval errval) +{ + debug_decl(tgetpass_display_error, SUDO_DEBUG_CONV) + + switch (errval) { + case TGP_ERRVAL_NOERROR: + break; + case TGP_ERRVAL_TIMEOUT: + sudo_warnx(U_("timed out reading password")); + break; + case TGP_ERRVAL_NOPASSWORD: + sudo_warnx(U_("no password was provided")); + break; + case TGP_ERRVAL_READERROR: + sudo_warn(U_("unable to read password")); + break; + } + debug_return; +} + +/* + * Like getpass(3) but with timeout and echo flags. + */ +char * +tgetpass(const char *prompt, int timeout, int flags, + struct sudo_conv_callback *callback) +{ + struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm; + struct sigaction savetstp, savettin, savettou; + char *pass; + static const char *askpass; + static char buf[SUDO_CONV_REPL_MAX + 1]; + int i, input, output, save_errno, ttyfd; + bool need_restart, neednl = false; + bool feedback = ISSET(flags, TGP_MASK); + enum tgetpass_errval errval; + debug_decl(tgetpass, SUDO_DEBUG_CONV) + + (void) fflush(stdout); + + if (askpass == NULL) { + askpass = getenv_unhooked("SUDO_ASKPASS"); + if (askpass == NULL || *askpass == '\0') + askpass = sudo_conf_askpass_path(); + } + +restart: + /* Try to open /dev/tty if we are going to be using it for I/O. */ + ttyfd = -1; + if (!ISSET(flags, TGP_STDIN|TGP_ASKPASS)) { + ttyfd = open(_PATH_TTY, O_RDWR); + /* If no tty present and we need to disable echo, try askpass. */ + if (ttyfd == -1 && !ISSET(flags, TGP_ECHO|TGP_NOECHO_TRY)) { + if (askpass == NULL || getenv_unhooked("DISPLAY") == NULL) { + sudo_warnx(U_("a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper")); + debug_return_str(NULL); + } + SET(flags, TGP_ASKPASS); + } + } + + /* If using a helper program to get the password, run it instead. */ + if (ISSET(flags, TGP_ASKPASS)) { + if (askpass == NULL || *askpass == '\0') + sudo_fatalx(U_("no askpass program specified, try setting SUDO_ASKPASS")); + debug_return_str_masked(sudo_askpass(askpass, prompt)); + } + + /* Reset state. */ + for (i = 0; i < NSIG; i++) + signo[i] = 0; + pass = NULL; + save_errno = 0; + need_restart = false; + + /* Use tty for reading/writing if available else use stdin/stderr. */ + if (ttyfd == -1) { + input = STDIN_FILENO; + output = STDERR_FILENO; + } else { + input = ttyfd; + output = ttyfd; + } + + /* + * If we are using a tty but are not the foreground pgrp this will + * return EINTR. We send ourself SIGTTOU bracketed by callbacks. + */ + if (!ISSET(flags, TGP_ECHO)) { + for (;;) { + if (feedback) + neednl = sudo_term_cbreak(input); + else + neednl = sudo_term_noecho(input); + if (neednl || errno != EINTR) + break; + /* Received SIGTTOU, suspend the process. */ + if (suspend(SIGTTOU, callback) == -1) { + if (input != STDIN_FILENO) + (void) close(input); + debug_return_ptr(NULL); + } + } + } + /* Only use feedback mode when we can disable echo. */ + if (!neednl) + feedback = false; + + /* + * Catch signals that would otherwise cause the user to end + * up with echo turned off in the shell. + */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; /* don't restart system calls */ + sa.sa_handler = tgetpass_handler; + (void) sigaction(SIGALRM, &sa, &savealrm); + (void) sigaction(SIGINT, &sa, &saveint); + (void) sigaction(SIGHUP, &sa, &savehup); + (void) sigaction(SIGQUIT, &sa, &savequit); + (void) sigaction(SIGTERM, &sa, &saveterm); + (void) sigaction(SIGTSTP, &sa, &savetstp); + (void) sigaction(SIGTTIN, &sa, &savettin); + (void) sigaction(SIGTTOU, &sa, &savettou); + + if (ISSET(flags, TGP_BELL) && output != STDERR_FILENO) { + /* Ring the bell if requested and there is a tty. */ + if (write(output, "\a", 1) == -1) + goto restore; + } + if (prompt) { + if (write(output, prompt, strlen(prompt)) == -1) + goto restore; + } + + if (timeout > 0) + alarm(timeout); + pass = getln(input, buf, sizeof(buf), feedback, &errval); + alarm(0); + save_errno = errno; + + if (neednl || pass == NULL) { + if (write(output, "\n", 1) == -1) + goto restore; + } + tgetpass_display_error(errval); + +restore: + /* Restore old signal handlers. */ + (void) sigaction(SIGALRM, &savealrm, NULL); + (void) sigaction(SIGINT, &saveint, NULL); + (void) sigaction(SIGHUP, &savehup, NULL); + (void) sigaction(SIGQUIT, &savequit, NULL); + (void) sigaction(SIGTERM, &saveterm, NULL); + (void) sigaction(SIGTSTP, &savetstp, NULL); + (void) sigaction(SIGTTIN, &savettin, NULL); + (void) sigaction(SIGTTOU, &savettou, NULL); + + /* Restore old tty settings. */ + if (!ISSET(flags, TGP_ECHO)) { + /* Restore old tty settings if possible. */ + (void) sudo_term_restore(input, true); + } + if (input != STDIN_FILENO) + (void) close(input); + + /* + * If we were interrupted by a signal, resend it to ourselves + * now that we have restored the signal handlers. + */ + for (i = 0; i < NSIG; i++) { + if (signo[i]) { + switch (i) { + case SIGALRM: + break; + case SIGTSTP: + case SIGTTIN: + case SIGTTOU: + if (suspend(i, callback) == 0) + need_restart = true; + break; + default: + kill(getpid(), i); + break; + } + } + } + if (need_restart) + goto restart; + + if (save_errno) + errno = save_errno; + + debug_return_str_masked(pass); +} + +/* + * Fork a child and exec sudo-askpass to get the password from the user. + */ +static char * +sudo_askpass(const char *askpass, const char *prompt) +{ + static char buf[SUDO_CONV_REPL_MAX + 1], *pass; + struct sigaction sa, savechld; + enum tgetpass_errval errval; + int pfd[2], status; + pid_t child; + debug_decl(sudo_askpass, SUDO_DEBUG_CONV) + + /* Set SIGCHLD handler to default since we call waitpid() below. */ + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sa.sa_handler = SIG_DFL; + (void) sigaction(SIGCHLD, &sa, &savechld); + + if (pipe(pfd) == -1) + sudo_fatal(U_("unable to create pipe")); + + child = sudo_debug_fork(); + if (child == -1) + sudo_fatal(U_("unable to fork")); + + if (child == 0) { + /* child, point stdout to output side of the pipe and exec askpass */ + if (dup2(pfd[1], STDOUT_FILENO) == -1) { + sudo_warn("dup2"); + _exit(255); + } + if (setuid(ROOT_UID) == -1) + sudo_warn("setuid(%d)", ROOT_UID); + if (setgid(user_details.gid)) { + sudo_warn(U_("unable to set gid to %u"), (unsigned int)user_details.gid); + _exit(255); + } + if (setuid(user_details.uid)) { + sudo_warn(U_("unable to set uid to %u"), (unsigned int)user_details.uid); + _exit(255); + } + closefrom(STDERR_FILENO + 1); + execl(askpass, askpass, prompt, (char *)NULL); + sudo_warn(U_("unable to run %s"), askpass); + _exit(255); + } + + /* Get response from child (askpass). */ + (void) close(pfd[1]); + pass = getln(pfd[0], buf, sizeof(buf), 0, &errval); + (void) close(pfd[0]); + + tgetpass_display_error(errval); + + /* Wait for child to exit. */ + for (;;) { + pid_t rv = waitpid(child, &status, 0); + if (rv == -1 && errno != EINTR) + break; + if (rv != -1 && !WIFSTOPPED(status)) + break; + } + + if (pass == NULL) + errno = EINTR; /* make cancel button simulate ^C */ + + /* Restore saved SIGCHLD handler. */ + (void) sigaction(SIGCHLD, &savechld, NULL); + + debug_return_str_masked(pass); +} + +extern int sudo_term_eof, sudo_term_erase, sudo_term_kill; + +static char * +getln(int fd, char *buf, size_t bufsiz, bool feedback, + enum tgetpass_errval *errval) +{ + size_t left = bufsiz; + ssize_t nr = -1; + char *cp = buf; + char c = '\0'; + debug_decl(getln, SUDO_DEBUG_CONV) + + *errval = TGP_ERRVAL_NOERROR; + + if (left == 0) { + *errval = TGP_ERRVAL_READERROR; + errno = EINVAL; + debug_return_str(NULL); /* sanity */ + } + + while (--left) { + nr = read(fd, &c, 1); + if (nr != 1 || c == '\n' || c == '\r') + break; + if (feedback) { + if (c == sudo_term_eof) { + nr = 0; + break; + } else if (c == sudo_term_kill) { + while (cp > buf) { + if (write(fd, "\b \b", 3) == -1) + break; + cp--; + } + cp = buf; + left = bufsiz; + continue; + } else if (c == sudo_term_erase) { + if (cp > buf) { + ignore_result(write(fd, "\b \b", 3)); + cp--; + left++; + } + continue; + } + ignore_result(write(fd, "*", 1)); + } + *cp++ = c; + } + *cp = '\0'; + if (feedback) { + /* erase stars */ + while (cp > buf) { + if (write(fd, "\b \b", 3) == -1) + break; + --cp; + } + } + + switch (nr) { + case -1: + /* Read error */ + if (errno == EINTR) { + if (signo[SIGALRM] == 1) + *errval = TGP_ERRVAL_TIMEOUT; + } else { + *errval = TGP_ERRVAL_READERROR; + } + debug_return_str(NULL); + case 0: + /* EOF is only an error if no bytes were read. */ + if (left == bufsiz - 1) { + *errval = TGP_ERRVAL_NOPASSWORD; + debug_return_str(NULL); + } + /* FALLTHROUGH */ + default: + debug_return_str_masked(buf); + } +} + +static void +tgetpass_handler(int s) +{ + signo[s] = 1; +} diff --git a/utsudo-0.0.2/src_ori/ttyname.c b/utsudo-0.0.2/src_ori/ttyname.c new file mode 100644 index 0000000..6c95916 --- /dev/null +++ b/utsudo-0.0.2/src_ori/ttyname.c @@ -0,0 +1,341 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2012-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +/* Large files not supported by procfs.h on Solaris. */ +#if defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +# undef _FILE_OFFSET_BITS +# undef _LARGE_FILES +#endif + +#include +#include +#if defined(MAJOR_IN_MKDEV) +# include +#elif defined(MAJOR_IN_SYSMACROS) +# include +#endif +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#if defined(HAVE_KINFO_PROC2_NETBSD) || defined (HAVE_KINFO_PROC_OPENBSD) || defined(HAVE_KINFO_PROC_44BSD) +# include +#elif defined(HAVE_KINFO_PROC_FREEBSD) +# include +# include +# include +#endif +#if defined(HAVE_PROCFS_H) +# include +#elif defined(HAVE_SYS_PROCFS_H) +# include +#endif +#ifdef HAVE_PSTAT_GETPROC +# include +#endif + +#include "utsudo.h" + +/* + * How to access the tty device number in struct kinfo_proc. + */ +#if defined(HAVE_KINFO_PROC2_NETBSD) +# define SUDO_KERN_PROC KERN_PROC2 +# define sudo_kinfo_proc kinfo_proc2 +# define sudo_kp_tdev p_tdev +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_OPENBSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_tdev p_tdev +# define sudo_kp_namelen 6 +#elif defined(HAVE_KINFO_PROC_FREEBSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_tdev ki_tdev +# define sudo_kp_namelen 4 +#elif defined(HAVE_KINFO_PROC_44BSD) +# define SUDO_KERN_PROC KERN_PROC +# define sudo_kinfo_proc kinfo_proc +# define sudo_kp_tdev kp_eproc.e_tdev +# define sudo_kp_namelen 4 +#endif + +#if defined(sudo_kp_tdev) +/* + * Store the name of the tty to which the process is attached in name. + * Returns name on success and NULL on failure, setting errno. + */ +char * +get_process_ttyname(char *name, size_t namelen) +{ + struct sudo_kinfo_proc *ki_proc = NULL; + size_t size = sizeof(*ki_proc); + int mib[6], rc, serrno = errno; + char *ret = NULL; + debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) + + /* + * Lookup controlling tty for this process via sysctl. + * This will work even if std{in,out,err} are redirected. + */ + mib[0] = CTL_KERN; + mib[1] = SUDO_KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = (int)getpid(); + mib[4] = sizeof(*ki_proc); + mib[5] = 1; + do { + struct sudo_kinfo_proc *kp; + + size += size / 10; + if ((kp = realloc(ki_proc, size)) == NULL) { + rc = -1; + break; /* really out of memory. */ + } + ki_proc = kp; + rc = sysctl(mib, sudo_kp_namelen, ki_proc, &size, NULL, 0); + } while (rc == -1 && errno == ENOMEM); + errno = ENOENT; + if (rc != -1) { + if ((dev_t)ki_proc->sudo_kp_tdev != (dev_t)-1) { + errno = serrno; + ret = sudo_ttyname_dev(ki_proc->sudo_kp_tdev, name, namelen); + if (ret == NULL) { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to map device number %u to name", + ki_proc->sudo_kp_tdev); + } + } + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to resolve tty via KERN_PROC"); + } + free(ki_proc); + + debug_return_str(ret); +} +#elif defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) +/* + * Store the name of the tty to which the process is attached in name. + * Returns name on success and NULL on failure, setting errno. + */ +char * +get_process_ttyname(char *name, size_t namelen) +{ + char path[PATH_MAX], *ret = NULL; + struct psinfo psinfo; + ssize_t nread; + int fd, serrno = errno; + debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) + + /* Try to determine the tty from pr_ttydev in /proc/pid/psinfo. */ + (void)snprintf(path, sizeof(path), "/proc/%u/psinfo", (unsigned int)getpid()); + if ((fd = open(path, O_RDONLY, 0)) != -1) { + nread = read(fd, &psinfo, sizeof(psinfo)); + close(fd); + if (nread == (ssize_t)sizeof(psinfo)) { + dev_t rdev = (dev_t)psinfo.pr_ttydev; +#if defined(_AIX) && defined(DEVNO64) + if ((psinfo.pr_ttydev & DEVNO64) && sizeof(dev_t) == 4) + rdev = makedev(major64(psinfo.pr_ttydev), minor64(psinfo.pr_ttydev)); +#endif + if (rdev != (dev_t)-1) { + errno = serrno; + ret = sudo_ttyname_dev(rdev, name, namelen); + goto done; + } + } + } + errno = ENOENT; + +done: + if (ret == NULL) + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to resolve tty via %s", path); + + debug_return_str(ret); +} +#elif defined(__linux__) +/* + * Store the name of the tty to which the process is attached in name. + * Returns name on success and NULL on failure, setting errno. + */ +char * +get_process_ttyname(char *name, size_t namelen) +{ + const char path[] = "/proc/self/stat"; + char *cp, buf[1024]; + char *ret = NULL; + int serrno = errno; + ssize_t nread; + int fd; + debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) + + /* + * Try to determine the tty from tty_nr in /proc/self/stat. + * Ignore /proc/self/stat if it contains embedded NUL bytes. + */ + if ((fd = open(path, O_RDONLY | O_NOFOLLOW)) != -1) { + cp = buf; + while ((nread = read(fd, cp, buf + sizeof(buf) - cp)) != 0) { + if (nread == -1) { + if (errno == EAGAIN || errno == EINTR) + continue; + break; + } + cp += nread; + if (cp >= buf + sizeof(buf)) + break; + } + if (nread == 0 && memchr(buf, '\0', cp - buf) == NULL) { + /* + * Field 7 is the tty dev (0 if no tty). + * Since the process name at field 2 "(comm)" may include + * whitespace (including newlines), start at the last ')' found. + */ + *cp = '\0'; + cp = strrchr(buf, ')'); + if (cp != NULL) { + char *ep = cp; + const char *errstr; + int field = 1; + + while (*++ep != '\0') { + if (*ep == ' ') { + *ep = '\0'; + if (++field == 7) { + int tty_nr = sudo_strtonum(cp, INT_MIN, INT_MAX, + &errstr); + if (errstr) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "%s: tty device %s: %s", path, cp, errstr); + } + if (tty_nr != 0) { + /* + * Avoid sign extension when assigning tdev. + * tty_nr in /proc/self/stat is printed as a + * signed int but the actual device number is an + * unsigned int and dev_t is unsigned long long. + */ + dev_t tdev = (unsigned int)tty_nr; + errno = serrno; + ret = sudo_ttyname_dev(tdev, name, namelen); + goto done; + } + break; + } + cp = ep + 1; + } + } + } + } + } + errno = ENOENT; + +done: + if (fd != -1) + close(fd); + if (ret == NULL) + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to resolve tty via %s", path); + + debug_return_str(ret); +} +#elif defined(HAVE_PSTAT_GETPROC) +/* + * Store the name of the tty to which the process is attached in name. + * Returns name on success and NULL on failure, setting errno. + */ +char * +get_process_ttyname(char *name, size_t namelen) +{ + struct pst_status pstat; + char *ret = NULL; + int rc, serrno = errno; + debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) + + /* + * Determine the tty from psdev in struct pst_status. + * EOVERFLOW is not a fatal error for the fields we use. + * See the "EOVERFLOW Error" section of pstat_getvminfo(3). + */ + rc = pstat_getproc(&pstat, sizeof(pstat), 0, getpid()); + if (rc != -1 || errno == EOVERFLOW) { + if (pstat.pst_term.psd_major != -1 && pstat.pst_term.psd_minor != -1) { + errno = serrno; + ret = sudo_ttyname_dev(makedev(pstat.pst_term.psd_major, + pstat.pst_term.psd_minor), name, namelen); + goto done; + } + } + errno = ENOENT; + +done: + if (ret == NULL) + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to resolve tty via pstat"); + + debug_return_str(ret); +} +#else +/* + * Store the name of the tty to which the process is attached in name. + * Returns name on success and NULL on failure, setting errno. + */ +char * +get_process_ttyname(char *name, size_t namelen) +{ + char *tty; + debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) + + if ((tty = ttyname(STDIN_FILENO)) == NULL) { + if ((tty = ttyname(STDOUT_FILENO)) == NULL) + tty = ttyname(STDERR_FILENO); + } + if (tty != NULL) { + if (strlcpy(name, tty, namelen) < namelen) + debug_return_str(name); + errno = ERANGE; + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to store tty from ttyname"); + } else { + sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to resolve tty via ttyname"); + errno = ENOENT; + } + + debug_return_str(NULL); +} +#endif diff --git a/utsudo-0.0.2/src_ori/utmp.c b/utsudo-0.0.2/src_ori/utmp.c new file mode 100644 index 0000000..4482a05 --- /dev/null +++ b/utsudo-0.0.2/src_ori/utmp.c @@ -0,0 +1,400 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2011-2018 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#if defined(HAVE_UTMPS_H) +# include +#elif defined(HAVE_UTMPX_H) +# include +#else +# include +#endif /* HAVE_UTMPS_H */ +#ifdef HAVE_GETTTYENT +# include +#endif +#include +#include + +#include "utsudo.h" +#include "sudo_exec.h" + +/* + * GCC 8 warns about strncpy() where the size field is the size of the buffer. + * However, strings in utmp may not be NUL terminated so this usage is correct. + */ +#if __GNUC_PREREQ__(8, 0) +# pragma GCC diagnostic ignored "-Wstringop-truncation" +#endif + +/* + * Simplify handling of different utmp types. + */ +#if defined(HAVE_GETUTSID) +# define sudo_getutline(u) GETUTSLINE(u) +# define sudo_pututline(u) PUTUTSLINE(u) +# define sudo_setutent() SETUTSENT() +# define sudo_endutent() ENDUTSENT() +#elif defined(HAVE_GETUTXID) +# define sudo_getutline(u) getutxline(u) +# define sudo_pututline(u) pututxline(u) +# define sudo_setutent() setutxent() +# define sudo_endutent() endutxent() +#elif defined(HAVE_GETUTID) +# define sudo_getutline(u) getutline(u) +# define sudo_pututline(u) pututline(u) +# define sudo_setutent() setutent() +# define sudo_endutent() endutent() +#endif + +#if defined(HAVE_GETUTSID) +typedef struct utmps sudo_utmp_t; +#elif defined(HAVE_GETUTXID) +typedef struct utmpx sudo_utmp_t; +#else +typedef struct utmp sudo_utmp_t; +/* Older systems have ut_name, not ut_user */ +# if !defined(HAVE_STRUCT_UTMP_UT_USER) && !defined(ut_user) +# define ut_user ut_name +# endif +#endif + +/* HP-UX has __e_termination and __e_exit, others may lack the __ */ +#if defined(HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION) +# undef __e_termination +# define __e_termination e_termination +# undef __e_exit +# define __e_exit e_exit +#endif + +#if defined(HAVE_GETUTSID) || defined(HAVE_GETUTXID) || defined(HAVE_GETUTID) +/* + * Create ut_id from the new ut_line and the old ut_id. + */ +static void +utmp_setid(sudo_utmp_t *old, sudo_utmp_t *new) +{ + const char *line = new->ut_line; + size_t idlen; + debug_decl(utmp_setid, SUDO_DEBUG_UTMP) + + /* Skip over "tty" in the id if old entry did too. */ + if (old != NULL) { + /* cppcheck-suppress uninitdata */ + if (strncmp(line, "tty", 3) == 0) { + idlen = MIN(sizeof(old->ut_id), 3); + if (strncmp(old->ut_id, "tty", idlen) != 0) + line += 3; + } + } + + /* Store as much as will fit, skipping parts of the beginning as needed. */ + /* cppcheck-suppress uninitdata */ + idlen = strlen(line); + if (idlen > sizeof(new->ut_id)) { + line += idlen - sizeof(new->ut_id); + idlen = sizeof(new->ut_id); + } + strncpy(new->ut_id, line, idlen); + + debug_return; +} +#endif /* HAVE_GETUTSID || HAVE_GETUTXID || HAVE_GETUTID */ + +/* + * Store time in utmp structure. + */ +static void +utmp_settime(sudo_utmp_t *ut) +{ + struct timeval tv; + debug_decl(utmp_settime, SUDO_DEBUG_UTMP) + + if (gettimeofday(&tv, NULL) == 0) { +#if defined(HAVE_STRUCT_UTMP_UT_TV) + ut->ut_tv.tv_sec = tv.tv_sec; + ut->ut_tv.tv_usec = tv.tv_usec; +#else + ut->ut_time = tv.tv_sec; +#endif + } + + debug_return; +} + +/* + * Fill in a utmp entry, using an old entry as a template if there is one. + */ +static void +utmp_fill(const char *line, const char *user, sudo_utmp_t *ut_old, + sudo_utmp_t *ut_new) +{ + debug_decl(utmp_file, SUDO_DEBUG_UTMP) + + if (ut_old == NULL) { + memset(ut_new, 0, sizeof(*ut_new)); + if (user == NULL) { + strncpy(ut_new->ut_user, user_details.username, + sizeof(ut_new->ut_user)); + } + } else if (ut_old != ut_new) { + memcpy(ut_new, ut_old, sizeof(*ut_new)); + } + if (user != NULL) + strncpy(ut_new->ut_user, user, sizeof(ut_new->ut_user)); + strncpy(ut_new->ut_line, line, sizeof(ut_new->ut_line)); +#if defined(HAVE_STRUCT_UTMP_UT_ID) + utmp_setid(ut_old, ut_new); +#endif +#if defined(HAVE_STRUCT_UTMP_UT_PID) + ut_new->ut_pid = getpid(); +#endif + utmp_settime(ut_new); +#if defined(HAVE_STRUCT_UTMP_UT_TYPE) + ut_new->ut_type = USER_PROCESS; +#endif + debug_return; +} + +/* + * There are two basic utmp file types: + * + * POSIX: sequential access with new entries appended to the end. + * Manipulated via {get,put}[sx]?utent() + * + * Legacy: sparse file indexed by ttyslot() * sizeof(struct utmp) + */ +#if defined(HAVE_GETUTSID) || defined(HAVE_GETUTXID) || defined(HAVE_GETUTID) +bool +utmp_login(const char *from_line, const char *to_line, int ttyfd, + const char *user) +{ + sudo_utmp_t utbuf, *ut_old = NULL; + bool ret = false; + debug_decl(utmp_login, SUDO_DEBUG_UTMP) + + /* Strip off /dev/ prefix from line as needed. */ + if (strncmp(to_line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + to_line += sizeof(_PATH_DEV) - 1; + sudo_setutent(); + if (from_line != NULL) { + if (strncmp(from_line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + from_line += sizeof(_PATH_DEV) - 1; + + /* Lookup old line. */ + memset(&utbuf, 0, sizeof(utbuf)); + strncpy(utbuf.ut_line, from_line, sizeof(utbuf.ut_line)); + ut_old = sudo_getutline(&utbuf); + sudo_setutent(); + } + utmp_fill(to_line, user, ut_old, &utbuf); + if (sudo_pututline(&utbuf) != NULL) + ret = true; + sudo_endutent(); + + debug_return_bool(ret); +} + +bool +utmp_logout(const char *line, int status) +{ + bool ret = false; + sudo_utmp_t *ut, utbuf; + debug_decl(utmp_logout, SUDO_DEBUG_UTMP) + + /* Strip off /dev/ prefix from line as needed. */ + if (strncmp(line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + line += sizeof(_PATH_DEV) - 1; + + memset(&utbuf, 0, sizeof(utbuf)); + strncpy(utbuf.ut_line, line, sizeof(utbuf.ut_line)); + if ((ut = sudo_getutline(&utbuf)) != NULL) { + memset(ut->ut_user, 0, sizeof(ut->ut_user)); +# if defined(HAVE_STRUCT_UTMP_UT_TYPE) + ut->ut_type = DEAD_PROCESS; +# endif +# if defined(HAVE_STRUCT_UTMP_UT_EXIT) + ut->ut_exit.__e_termination = WIFSIGNALED(status) ? WTERMSIG(status) : 0; + ut->ut_exit.__e_exit = WIFEXITED(status) ? WEXITSTATUS(status) : 0; +# endif + utmp_settime(ut); + if (sudo_pututline(ut) != NULL) + ret = true; + } + debug_return_bool(ret); +} + +#else /* !HAVE_GETUTSID && !HAVE_GETUTXID && !HAVE_GETUTID */ + +/* + * Find the slot for the specified line (tty name and file descriptor). + * Returns a slot suitable for seeking into utmp on success or <= 0 on error. + * If getttyent() is available we can use that to compute the slot. + */ +# ifdef HAVE_GETTTYENT +static int +utmp_slot(const char *line, int ttyfd) +{ + int slot = 1; + struct ttyent *tty; + debug_decl(utmp_slot, SUDO_DEBUG_UTMP) + + setttyent(); + while ((tty = getttyent()) != NULL) { + if (strcmp(line, tty->ty_name) == 0) + break; + slot++; + } + endttyent(); + debug_return_int(tty ? slot : 0); +} +# else +static int +utmp_slot(const char *line, int ttyfd) +{ + int sfd, slot; + debug_decl(utmp_slot, SUDO_DEBUG_UTMP) + + /* + * Temporarily point stdin to the tty since ttyslot() + * doesn't take an argument. + */ + if ((sfd = dup(STDIN_FILENO)) == -1) + sudo_fatal(U_("unable to save stdin")); + if (dup2(ttyfd, STDIN_FILENO) == -1) + sudo_fatal(U_("unable to dup2 stdin")); + slot = ttyslot(); + if (dup2(sfd, STDIN_FILENO) == -1) + sudo_fatal(U_("unable to restore stdin")); + close(sfd); + + debug_return_int(slot); +} +# endif /* HAVE_GETTTYENT */ + +bool +utmp_login(const char *from_line, const char *to_line, int ttyfd, + const char *user) +{ + sudo_utmp_t utbuf, *ut_old = NULL; + bool ret = false; + int slot; + FILE *fp; + debug_decl(utmp_login, SUDO_DEBUG_UTMP) + + /* Strip off /dev/ prefix from line as needed. */ + if (strncmp(to_line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + to_line += sizeof(_PATH_DEV) - 1; + + /* Find slot for new entry. */ + slot = utmp_slot(to_line, ttyfd); + if (slot <= 0) + goto done; + + if ((fp = fopen(_PATH_UTMP, "r+")) == NULL) + goto done; + + if (from_line != NULL) { + if (strncmp(from_line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + from_line += sizeof(_PATH_DEV) - 1; + + /* Lookup old line. */ + while (fread(&utbuf, sizeof(utbuf), 1, fp) == 1) { +# ifdef HAVE_STRUCT_UTMP_UT_ID + if (utbuf.ut_type != LOGIN_PROCESS && utbuf.ut_type != USER_PROCESS) + continue; +# endif + if (utbuf.ut_user[0] && + !strncmp(utbuf.ut_line, from_line, sizeof(utbuf.ut_line))) { + ut_old = &utbuf; + break; + } + } + } + utmp_fill(to_line, user, ut_old, &utbuf); +# ifdef HAVE_FSEEKO + if (fseeko(fp, slot * (off_t)sizeof(utbuf), SEEK_SET) == 0) { +# else + if (fseek(fp, slot * (long)sizeof(utbuf), SEEK_SET) == 0) { +# endif + if (fwrite(&utbuf, sizeof(utbuf), 1, fp) == 1) + ret = true; + } + fclose(fp); + +done: + debug_return_bool(ret); +} + +bool +utmp_logout(const char *line, int status) +{ + sudo_utmp_t utbuf; + bool ret = false; + FILE *fp; + debug_decl(utmp_logout, SUDO_DEBUG_UTMP) + + if ((fp = fopen(_PATH_UTMP, "r+")) == NULL) + debug_return_int(ret); + + /* Strip off /dev/ prefix from line as needed. */ + if (strncmp(line, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) + line += sizeof(_PATH_DEV) - 1; + + while (fread(&utbuf, sizeof(utbuf), 1, fp) == 1) { + if (!strncmp(utbuf.ut_line, line, sizeof(utbuf.ut_line))) { + memset(utbuf.ut_user, 0, sizeof(utbuf.ut_user)); +# if defined(HAVE_STRUCT_UTMP_UT_TYPE) + utbuf.ut_type = DEAD_PROCESS; +# endif + utmp_settime(&utbuf); + /* Back up and overwrite record. */ +# ifdef HAVE_FSEEKO + if (fseeko(fp, (off_t)0 - (off_t)sizeof(utbuf), SEEK_CUR) == 0) { +# else + if (fseek(fp, 0L - (long)sizeof(utbuf), SEEK_CUR) == 0) { +# endif + if (fwrite(&utbuf, sizeof(utbuf), 1, fp) == 1) + ret = true; + } + break; + } + } + fclose(fp); + + debug_return_bool(ret); +} +#endif /* HAVE_GETUTSID || HAVE_GETUTXID || HAVE_GETUTID */ diff --git a/utsudo-0.0.2/src_ori/utsudo.c b/utsudo-0.0.2/src_ori/utsudo.c new file mode 100644 index 0000000..3a27733 --- /dev/null +++ b/utsudo-0.0.2/src_ori/utsudo.c @@ -0,0 +1,1427 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2019 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#ifdef __TANDEM +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SELINUX +# include /* for is_selinux_enabled() */ +#endif +#ifdef HAVE_SETAUTHDB +# include +#endif /* HAVE_SETAUTHDB */ +#if defined(HAVE_GETPRPWNAM) && defined(HAVE_SET_AUTH_PARAMETERS) +# ifdef __hpux +# undef MAXINT +# include +# else +# include +# endif /* __hpux */ +# include +#endif /* HAVE_GETPRPWNAM && HAVE_SET_AUTH_PARAMETERS */ + +#include +#include "utsudo.h" +#include "sudo_plugin.h" +#include "sudo_plugin_int.h" + + +/* + * Local variables + */ +struct plugin_container policy_plugin; +struct plugin_container_list io_plugins = TAILQ_HEAD_INITIALIZER(io_plugins); +struct user_details user_details; +const char *list_user; /* extern for parse_args.c */ +int sudo_debug_instance = SUDO_DEBUG_INSTANCE_INITIALIZER; +static struct command_details command_details; +static int sudo_mode; + +struct sudo_gc_entry { + SLIST_ENTRY(sudo_gc_entry) entries; + enum sudo_gc_types type; + union { + char **vec; + void *ptr; + } u; +}; +SLIST_HEAD(sudo_gc_list, sudo_gc_entry); +#ifdef NO_LEAKS +static struct sudo_gc_list sudo_gc_list = SLIST_HEAD_INITIALIZER(sudo_gc_list); +#endif + +/* + * Local functions + */ +static void fix_fds(void); +static void sudo_check_suid(const char *path); +static char **get_user_info(struct user_details *); +static void command_info_to_details(char * const info[], + struct command_details *details); +static void gc_init(void); + +/* Policy plugin convenience functions. */ +static int policy_open(struct plugin_container *plugin, + struct sudo_settings *settings, + char * const user_info[], char * const user_env[]); +static void policy_close(struct plugin_container *plugin, int exit_status, + int error); +static int policy_show_version(struct plugin_container *plugin, int verbose); +static int policy_check(struct plugin_container *plugin, int argc, + char * const argv[], char *env_add[], char **command_info[], + char **argv_out[], char **user_env_out[]); +static int policy_list(struct plugin_container *plugin, int argc, + char * const argv[], int verbose, const char *list_user); +static int policy_validate(struct plugin_container *plugin); +static void policy_invalidate(struct plugin_container *plugin, int remove); + +/* I/O log plugin convenience functions. */ +static int iolog_open(struct plugin_container *plugin, + struct sudo_settings *settings, char * const user_info[], + char * const command_details[], int argc, char * const argv[], + char * const user_env[]); +static void iolog_close(struct plugin_container *plugin, int exit_status, + int error); +static int iolog_show_version(struct plugin_container *plugin, int verbose); +static void iolog_unlink(struct plugin_container *plugin); +static void free_plugin_container(struct plugin_container *plugin, bool ioplugin); + +__dso_public int main(int argc, char *argv[], char *envp[]); + +int +main(int argc, char *argv[], char *envp[]) +{ + int nargc, ok, status = 0; + char **nargv, **env_add; + char **user_info, **command_info, **argv_out, **user_env_out; + struct sudo_settings *settings; + struct plugin_container *plugin, *next; + sigset_t mask; + debug_decl_vars(main, SUDO_DEBUG_MAIN) + + initprogname(argc > 0 ? argv[0] : "sudo"); + + /* Crank resource limits to unlimited. */ + unlimit_sudo(); + + /* Make sure fds 0-2 are open and do OS-specific initialization. */ + fix_fds(); + os_init(argc, argv, envp); + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE_NAME, LOCALEDIR); + textdomain(PACKAGE_NAME); + + (void) tzset(); + + /* Must be done before we do any password lookups */ +#if defined(HAVE_GETPRPWNAM) && defined(HAVE_SET_AUTH_PARAMETERS) + (void) set_auth_parameters(argc, argv); +# ifdef HAVE_INITPRIVS + initprivs(); +# endif +#endif /* HAVE_GETPRPWNAM && HAVE_SET_AUTH_PARAMETERS */ + + /* Initialize the debug subsystem. */ + if (sudo_conf_read(NULL, SUDO_CONF_DEBUG) == -1) + exit(EXIT_FAILURE); + sudo_debug_instance = sudo_debug_register(getprogname(), + NULL, NULL, sudo_conf_debug_files(getprogname())); + if (sudo_debug_instance == SUDO_DEBUG_INSTANCE_ERROR) + exit(EXIT_FAILURE); + + /* Make sure we are setuid root. */ + sudo_check_suid(argc > 0 ? argv[0] : "sudo"); + + /* Save original signal state and setup default signal handlers. */ + save_signals(); + init_signals(); + + /* Reset signal mask to the default value (unblock). */ + (void) sigemptyset(&mask); + (void) sigprocmask(SIG_SETMASK, &mask, NULL); + + /* Parse the rest of sudo.conf. */ + sudo_conf_read(NULL, SUDO_CONF_ALL & ~SUDO_CONF_DEBUG); + + /* Fill in user_info with user name, uid, cwd, etc. */ + if ((user_info = get_user_info(&user_details)) == NULL) + exit(EXIT_FAILURE); /* get_user_info printed error message */ + + /* Disable core dumps if not enabled in sudo.conf. */ + if (sudo_conf_disable_coredump()) + disable_coredump(); + + /* Parse command line arguments. */ + sudo_mode = parse_args(argc, argv, &nargc, &nargv, &settings, &env_add); + sudo_debug_printf(SUDO_DEBUG_DEBUG, "sudo_mode %d", sudo_mode); + + /* Print sudo version early, in case of plugin init failure. */ + if (ISSET(sudo_mode, MODE_VERSION)) { + printf(_("Sudo version %s\n"), PACKAGE_VERSION); + if (user_details.uid == ROOT_UID) + (void) printf(_("Configure options: %s\n"), CONFIGURE_ARGS); + } + + /* Use conversation function for sudo_(warn|fatal)x? for plugins. */ + sudo_warn_set_conversation(sudo_conversation); + + /* Load plugins. */ + if (!sudo_load_plugins(&policy_plugin, &io_plugins)) + sudo_fatalx(U_("fatal error, unable to load plugins")); + + /* Open policy plugin. */ + ok = policy_open(&policy_plugin, settings, user_info, envp); + if (ok != 1) { + if (ok == -2) + usage(1); + else + sudo_fatalx(U_("unable to initialize policy plugin")); + } + + switch (sudo_mode & MODE_MASK) { + case MODE_VERSION: + policy_show_version(&policy_plugin, !user_details.uid); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + ok = iolog_open(plugin, settings, user_info, NULL, + nargc, nargv, envp); + if (ok != -1) + iolog_show_version(plugin, !user_details.uid); + } + break; + case MODE_VALIDATE: + case MODE_VALIDATE|MODE_INVALIDATE: + ok = policy_validate(&policy_plugin); + exit(ok != 1); + case MODE_KILL: + case MODE_INVALIDATE: + policy_invalidate(&policy_plugin, sudo_mode == MODE_KILL); + exit(0); + break; + case MODE_CHECK: + case MODE_CHECK|MODE_INVALIDATE: + case MODE_LIST: + case MODE_LIST|MODE_INVALIDATE: + ok = policy_list(&policy_plugin, nargc, nargv, + ISSET(sudo_mode, MODE_LONG_LIST), list_user); + exit(ok != 1); + case MODE_EDIT: + case MODE_RUN: + ok = policy_check(&policy_plugin, nargc, nargv, env_add, + &command_info, &argv_out, &user_env_out); + sudo_debug_printf(SUDO_DEBUG_INFO, "policy plugin returns %d", ok); + if (ok != 1) { + if (ok == -2) + usage(1); + exit(EXIT_FAILURE); /* plugin printed error message */ + } + /* Reset nargv/nargc based on argv_out. */ + /* XXX - leaks old nargv in shell mode */ + for (nargv = argv_out, nargc = 0; nargv[nargc] != NULL; nargc++) + continue; + if (nargc == 0) + sudo_fatalx(U_("plugin did not return a command to execute")); + /* Open I/O plugins once policy plugin succeeds. */ + TAILQ_FOREACH_SAFE(plugin, &io_plugins, entries, next) { + ok = iolog_open(plugin, settings, user_info, + command_info, nargc, nargv, user_env_out); + switch (ok) { + case 1: + break; + case 0: + /* I/O plugin asked to be disabled, remove and free. */ + iolog_unlink(plugin); + break; + case -2: + usage(1); + break; + default: + sudo_fatalx(U_("error initializing I/O plugin %s"), + plugin->name); + } + } + /* Setup command details and run command/edit. */ + command_info_to_details(command_info, &command_details); + command_details.tty = user_details.tty; + command_details.argv = argv_out; + command_details.envp = user_env_out; + if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) + SET(command_details.flags, CD_LOGIN_SHELL); + if (ISSET(sudo_mode, MODE_BACKGROUND)) + SET(command_details.flags, CD_BACKGROUND); + /* Become full root (not just setuid) so user cannot kill us. */ + if (setuid(ROOT_UID) == -1) + sudo_warn("setuid(%d)", ROOT_UID); + if (ISSET(command_details.flags, CD_SUDOEDIT)) { + status = sudo_edit(&command_details); + } else { + status = run_command(&command_details); + } + /* The close method was called by sudo_edit/run_command. */ + break; + default: + sudo_fatalx(U_("unexpected sudo mode 0x%x"), sudo_mode); + } + + /* + * If the command was terminated by a signal, sudo needs to terminated + * the same way. Otherwise, the shell may ignore a keyboard-generated + * signal. However, we want to avoid having sudo dump core itself. + */ + if (WIFSIGNALED(status)) { + struct sigaction sa; + + if (WCOREDUMP(status)) + disable_coredump(); + + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = SIG_DFL; + sigaction(WTERMSIG(status), &sa, NULL); + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, + WTERMSIG(status) | 128); + kill(getpid(), WTERMSIG(status)); + } + sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, + WEXITSTATUS(status)); + exit(WEXITSTATUS(status)); +} + +int +os_init_common(int argc, char *argv[], char *envp[]) +{ +#ifdef STATIC_SUDOERS_PLUGIN + preload_static_symbols(); +#endif + gc_init(); + return 0; +} + +/* + * Ensure that stdin, stdout and stderr are open; set to /dev/null if not. + * Some operating systems do this automatically in the kernel or libc. + */ +static void +fix_fds(void) +{ + int miss[3], devnull = -1; + debug_decl(fix_fds, SUDO_DEBUG_UTIL) + + /* + * stdin, stdout and stderr must be open; set them to /dev/null + * if they are closed. + */ + miss[STDIN_FILENO] = fcntl(STDIN_FILENO, F_GETFL, 0) == -1; + miss[STDOUT_FILENO] = fcntl(STDOUT_FILENO, F_GETFL, 0) == -1; + miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1; + if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) { + devnull = open(_PATH_DEVNULL, O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); + if (devnull == -1) + sudo_fatal(U_("unable to open %s"), _PATH_DEVNULL); + if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1) + sudo_fatal("dup2"); + if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1) + sudo_fatal("dup2"); + if (miss[STDERR_FILENO] && dup2(devnull, STDERR_FILENO) == -1) + sudo_fatal("dup2"); + if (devnull > STDERR_FILENO) + close(devnull); + } + debug_return; +} + +/* + * Allocate space for groups and fill in using sudo_getgrouplist2() + * for when we cannot (or don't want to) use getgroups(). + * Returns 0 on success and -1 on failure. + */ +static int +fill_group_list(struct user_details *ud) +{ + int ret = -1; + debug_decl(fill_group_list, SUDO_DEBUG_UTIL) + + /* + * If user specified a max number of groups, use it, otherwise let + * sudo_getgrouplist2() allocate the group vector. + */ + ud->ngroups = sudo_conf_max_groups(); + if (ud->ngroups > 0) { + ud->groups = reallocarray(NULL, ud->ngroups, sizeof(GETGROUPS_T)); + if (ud->groups != NULL) { + /* No error on insufficient space if user specified max_groups. */ + (void)sudo_getgrouplist2(ud->username, ud->gid, &ud->groups, + &ud->ngroups); + ret = 0; + } + } else { + ud->groups = NULL; + ret = sudo_getgrouplist2(ud->username, ud->gid, &ud->groups, + &ud->ngroups); + } + if (ret == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: %s: unable to get groups via sudo_getgrouplist2()", + __func__, ud->username); + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: %s: got %d groups via sudo_getgrouplist2()", + __func__, ud->username, ud->ngroups); + } + debug_return_int(ret); +} + +static char * +get_user_groups(struct user_details *ud) +{ + char *cp, *gid_list = NULL; + size_t glsize; + int i, len, group_source; + debug_decl(get_user_groups, SUDO_DEBUG_UTIL) + + ud->groups = NULL; + group_source = sudo_conf_group_source(); + if (group_source != GROUP_SOURCE_DYNAMIC) { + int maxgroups = (int)sysconf(_SC_NGROUPS_MAX); + if (maxgroups < 0) + maxgroups = NGROUPS_MAX; + + if ((ud->ngroups = getgroups(0, NULL)) > 0) { + /* Use groups from kernel if not too many or source is static. */ + if (ud->ngroups < maxgroups || group_source == GROUP_SOURCE_STATIC) { + ud->groups = reallocarray(NULL, ud->ngroups, sizeof(GETGROUPS_T)); + if (ud->groups == NULL) + goto done; + if (getgroups(ud->ngroups, ud->groups) < 0) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO, + "%s: %s: unable to get %d groups via getgroups()", + __func__, ud->username, ud->ngroups); + free(ud->groups); + ud->groups = NULL; + } else { + sudo_debug_printf(SUDO_DEBUG_INFO, + "%s: %s: got %d groups via getgroups()", + __func__, ud->username, ud->ngroups); + } + } + } + } + if (ud->groups == NULL) { + /* + * Query group database if kernel list is too small or disabled. + * Typically, this is because NFS can only support up to 16 groups. + */ + if (fill_group_list(ud) == -1) + goto done; + } + + /* + * Format group list as a comma-separated string of gids. + */ + glsize = sizeof("groups=") - 1 + (ud->ngroups * (MAX_UID_T_LEN + 1)); + if ((gid_list = malloc(glsize)) == NULL) + goto done; + memcpy(gid_list, "groups=", sizeof("groups=") - 1); + cp = gid_list + sizeof("groups=") - 1; + for (i = 0; i < ud->ngroups; i++) { + len = snprintf(cp, glsize - (cp - gid_list), "%s%u", + i ? "," : "", (unsigned int)ud->groups[i]); + if (len < 0 || (size_t)len >= glsize - (cp - gid_list)) + sudo_fatalx(U_("internal error, %s overflow"), __func__); + cp += len; + } +done: + debug_return_str(gid_list); +} + +/* + * Return user information as an array of name=value pairs. + * and fill in struct user_details (which shares the same strings). + */ +static char ** +get_user_info(struct user_details *ud) +{ + char *cp, **user_info, path[PATH_MAX]; + unsigned int i = 0; + mode_t mask; + struct passwd *pw; + int fd; + debug_decl(get_user_info, SUDO_DEBUG_UTIL) + + /* + * On BSD systems you can set a hint to keep the password and + * group databases open instead of having to open and close + * them all the time. Since sudo does a lot of password and + * group lookups, keeping the file open can speed things up. + */ +#ifdef HAVE_SETPASSENT + setpassent(1); +#endif /* HAVE_SETPASSENT */ +#ifdef HAVE_SETGROUPENT + setgroupent(1); +#endif /* HAVE_SETGROUPENT */ + + memset(ud, 0, sizeof(*ud)); + + /* XXX - bound check number of entries */ + user_info = reallocarray(NULL, 32, sizeof(char *)); + if (user_info == NULL) + goto oom; + + ud->pid = getpid(); + ud->ppid = getppid(); + ud->pgid = getpgid(0); + ud->tcpgid = -1; + fd = open(_PATH_TTY, O_RDWR); + if (fd != -1) { + ud->tcpgid = tcgetpgrp(fd); + close(fd); + } + ud->sid = getsid(0); + + ud->uid = getuid(); + ud->euid = geteuid(); + ud->gid = getgid(); + ud->egid = getegid(); + +#ifdef HAVE_SETAUTHDB + aix_setauthdb(IDtouser(ud->uid), NULL); +#endif + pw = getpwuid(ud->uid); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (pw == NULL) + sudo_fatalx(U_("you do not exist in the %s database"), "passwd"); + + user_info[i] = sudo_new_key_val("user", pw->pw_name); + if (user_info[i] == NULL) + goto oom; + ud->username = user_info[i] + sizeof("user=") - 1; + + /* Stash user's shell for use with the -s flag; don't pass to plugin. */ + if ((ud->shell = getenv("SHELL")) == NULL || ud->shell[0] == '\0') { + ud->shell = pw->pw_shell[0] ? pw->pw_shell : _PATH_SUDO_BSHELL; + } + if ((ud->shell = strdup(ud->shell)) == NULL) + goto oom; + + if (asprintf(&user_info[++i], "pid=%d", (int)ud->pid) == -1) + goto oom; + if (asprintf(&user_info[++i], "ppid=%d", (int)ud->ppid) == -1) + goto oom; + if (ud->pgid != -1) { + if (asprintf(&user_info[++i], "pgid=%d", (int)ud->pgid) == -1) + goto oom; + } + if (ud->tcpgid != -1) { + if (asprintf(&user_info[++i], "tcpgid=%d", (int)ud->tcpgid) == -1) + goto oom; + } + if (ud->sid != -1) { + if (asprintf(&user_info[++i], "sid=%d", (int)ud->sid) == -1) + goto oom; + } + if (asprintf(&user_info[++i], "uid=%u", (unsigned int)ud->uid) == -1) + goto oom; + if (asprintf(&user_info[++i], "euid=%u", (unsigned int)ud->euid) == -1) + goto oom; + if (asprintf(&user_info[++i], "gid=%u", (unsigned int)ud->gid) == -1) + goto oom; + if (asprintf(&user_info[++i], "egid=%u", (unsigned int)ud->egid) == -1) + goto oom; + + if ((cp = get_user_groups(ud)) == NULL) + goto oom; + user_info[++i] = cp; + + mask = umask(0); + umask(mask); + if (asprintf(&user_info[++i], "umask=0%o", (unsigned int)mask) == -1) + goto oom; + + if (getcwd(path, sizeof(path)) != NULL) { + user_info[++i] = sudo_new_key_val("cwd", path); + if (user_info[i] == NULL) + goto oom; + ud->cwd = user_info[i] + sizeof("cwd=") - 1; + } + + if (get_process_ttyname(path, sizeof(path)) != NULL) { + user_info[++i] = sudo_new_key_val("tty", path); + if (user_info[i] == NULL) + goto oom; + ud->tty = user_info[i] + sizeof("tty=") - 1; + } else { + /* tty may not always be present */ + if (errno != ENOENT) + sudo_warn(U_("unable to determine tty")); + } + + cp = sudo_gethostname(); + user_info[++i] = sudo_new_key_val("host", cp ? cp : "localhost"); + free(cp); + if (user_info[i] == NULL) + goto oom; + ud->host = user_info[i] + sizeof("host=") - 1; + + sudo_get_ttysize(&ud->ts_rows, &ud->ts_cols); + if (asprintf(&user_info[++i], "lines=%d", ud->ts_rows) == -1) + goto oom; + if (asprintf(&user_info[++i], "cols=%d", ud->ts_cols) == -1) + goto oom; + + user_info[++i] = NULL; + + /* Add to list of vectors to be garbage collected at exit. */ + if (!gc_add(GC_VECTOR, user_info)) + goto bad; + + debug_return_ptr(user_info); +oom: + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); +bad: + while (i--) + free(user_info[i]); + free(user_info); + debug_return_ptr(NULL); +} + +/* + * Convert a command_info array into a command_details structure. + */ +static void +command_info_to_details(char * const info[], struct command_details *details) +{ + int i; + id_t id; + char *cp; + const char *errstr; + debug_decl(command_info_to_details, SUDO_DEBUG_PCOMM) + + memset(details, 0, sizeof(*details)); + details->closefrom = -1; + details->execfd = -1; + details->flags = CD_SUDOEDIT_CHECKDIR | CD_SET_GROUPS; + TAILQ_INIT(&details->preserved_fds); + +#define SET_STRING(s, n) \ + if (strncmp(s, info[i], sizeof(s) - 1) == 0 && info[i][sizeof(s) - 1]) { \ + details->n = info[i] + sizeof(s) - 1; \ + break; \ + } +#define SET_FLAG(s, n) \ + if (strncmp(s, info[i], sizeof(s) - 1) == 0) { \ + switch (sudo_strtobool(info[i] + sizeof(s) - 1)) { \ + case true: \ + SET(details->flags, n); \ + break; \ + case false: \ + CLR(details->flags, n); \ + break; \ + default: \ + sudo_debug_printf(SUDO_DEBUG_ERROR, \ + "invalid boolean value for %s", info[i]); \ + break; \ + } \ + break; \ + } + + sudo_debug_printf(SUDO_DEBUG_INFO, "command info from plugin:"); + for (i = 0; info[i] != NULL; i++) { + sudo_debug_printf(SUDO_DEBUG_INFO, " %d: %s", i, info[i]); + switch (info[i][0]) { + case 'c': + SET_STRING("chroot=", chroot) + SET_STRING("command=", command) + SET_STRING("cwd=", cwd) + if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) { + cp = info[i] + sizeof("closefrom=") - 1; + details->closefrom = sudo_strtonum(cp, 0, INT_MAX, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + break; + } + break; + case 'e': + SET_FLAG("exec_background=", CD_EXEC_BG) + if (strncmp("execfd=", info[i], sizeof("execfd=") - 1) == 0) { + cp = info[i] + sizeof("execfd=") - 1; + details->execfd = sudo_strtonum(cp, 0, INT_MAX, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); +#ifdef HAVE_FEXECVE + /* Must keep fd open during exec. */ + add_preserved_fd(&details->preserved_fds, details->execfd); +#else + /* Plugin thinks we support fexecve() but we don't. */ + (void)fcntl(details->execfd, F_SETFD, FD_CLOEXEC); + details->execfd = -1; +#endif + break; + } + break; + case 'l': + SET_STRING("login_class=", login_class) + break; + case 'n': + if (strncmp("nice=", info[i], sizeof("nice=") - 1) == 0) { + cp = info[i] + sizeof("nice=") - 1; + details->priority = sudo_strtonum(cp, INT_MIN, INT_MAX, + &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + SET(details->flags, CD_SET_PRIORITY); + break; + } + SET_FLAG("noexec=", CD_NOEXEC) + break; + case 'p': + SET_FLAG("preserve_groups=", CD_PRESERVE_GROUPS) + if (strncmp("preserve_fds=", info[i], sizeof("preserve_fds=") - 1) == 0) { + parse_preserved_fds(&details->preserved_fds, + info[i] + sizeof("preserve_fds=") - 1); + break; + } + break; + case 'r': + if (strncmp("runas_egid=", info[i], sizeof("runas_egid=") - 1) == 0) { + cp = info[i] + sizeof("runas_egid=") - 1; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + details->egid = (gid_t)id; + SET(details->flags, CD_SET_EGID); + break; + } + if (strncmp("runas_euid=", info[i], sizeof("runas_euid=") - 1) == 0) { + cp = info[i] + sizeof("runas_euid=") - 1; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + details->euid = (uid_t)id; + SET(details->flags, CD_SET_EUID); + break; + } + if (strncmp("runas_gid=", info[i], sizeof("runas_gid=") - 1) == 0) { + cp = info[i] + sizeof("runas_gid=") - 1; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + details->gid = (gid_t)id; + SET(details->flags, CD_SET_GID); + break; + } + if (strncmp("runas_groups=", info[i], sizeof("runas_groups=") - 1) == 0) { + cp = info[i] + sizeof("runas_groups=") - 1; + details->ngroups = sudo_parse_gids(cp, NULL, &details->groups); + /* sudo_parse_gids() will print a warning on error. */ + if (details->ngroups == -1) + exit(EXIT_FAILURE); /* XXX */ + break; + } + if (strncmp("runas_uid=", info[i], sizeof("runas_uid=") - 1) == 0) { + cp = info[i] + sizeof("runas_uid=") - 1; + id = sudo_strtoid(cp, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + details->uid = (uid_t)id; + SET(details->flags, CD_SET_UID); + break; + } +#ifdef HAVE_PRIV_SET + if (strncmp("runas_privs=", info[i], sizeof("runas_privs=") - 1) == 0) { + const char *endp; + cp = info[i] + sizeof("runas_privs=") - 1; + if (*cp != '\0') { + details->privs = priv_str_to_set(cp, ",", &endp); + if (details->privs == NULL) + sudo_warn("invalid runas_privs %s", endp); + } + break; + } + if (strncmp("runas_limitprivs=", info[i], sizeof("runas_limitprivs=") - 1) == 0) { + const char *endp; + cp = info[i] + sizeof("runas_limitprivs=") - 1; + if (*cp != '\0') { + details->limitprivs = priv_str_to_set(cp, ",", &endp); + if (details->limitprivs == NULL) + sudo_warn("invalid runas_limitprivs %s", endp); + } + break; + } +#endif /* HAVE_PRIV_SET */ + break; + case 's': + SET_STRING("selinux_role=", selinux_role) + SET_STRING("selinux_type=", selinux_type) + SET_FLAG("set_utmp=", CD_SET_UTMP) + SET_FLAG("sudoedit=", CD_SUDOEDIT) + SET_FLAG("sudoedit_checkdir=", CD_SUDOEDIT_CHECKDIR) + SET_FLAG("sudoedit_follow=", CD_SUDOEDIT_FOLLOW) + break; + case 't': + if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) { + cp = info[i] + sizeof("timeout=") - 1; + details->timeout = sudo_strtonum(cp, 0, INT_MAX, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + SET(details->flags, CD_SET_TIMEOUT); + break; + } + break; + case 'u': + if (strncmp("umask=", info[i], sizeof("umask=") - 1) == 0) { + cp = info[i] + sizeof("umask=") - 1; + details->umask = sudo_strtomode(cp, &errstr); + if (errstr != NULL) + sudo_fatalx(U_("%s: %s"), info[i], U_(errstr)); + SET(details->flags, CD_SET_UMASK); + break; + } + SET_FLAG("umask_override=", CD_OVERRIDE_UMASK) + SET_FLAG("use_pty=", CD_USE_PTY) + SET_STRING("utmp_user=", utmp_user) + break; + } + } + + if (!ISSET(details->flags, CD_SET_EUID)) + details->euid = details->uid; + if (!ISSET(details->flags, CD_SET_EGID)) + details->egid = details->gid; + if (!ISSET(details->flags, CD_SET_UMASK)) + CLR(details->flags, CD_OVERRIDE_UMASK); + +#ifdef HAVE_SETAUTHDB + aix_setauthdb(IDtouser(details->euid), NULL); +#endif + details->pw = getpwuid(details->euid); +#ifdef HAVE_SETAUTHDB + aix_restoreauthdb(); +#endif + if (details->pw != NULL && (details->pw = pw_dup(details->pw)) == NULL) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + +#ifdef HAVE_SELINUX + if (details->selinux_role != NULL && is_selinux_enabled() > 0) + SET(details->flags, CD_RBAC_ENABLED); +#endif + debug_return; +} + +static void +sudo_check_suid(const char *sudo) +{ + char pathbuf[PATH_MAX]; + struct stat sb; + bool qualified; + debug_decl(sudo_check_suid, SUDO_DEBUG_PCOMM) + + if (geteuid() != ROOT_UID) { + /* Search for sudo binary in PATH if not fully qualified. */ + qualified = strchr(sudo, '/') != NULL; + if (!qualified) { + char *path = getenv_unhooked("PATH"); + if (path != NULL) { + const char *cp, *ep; + const char *pathend = path + strlen(path); + + for (cp = sudo_strsplit(path, pathend, ":", &ep); cp != NULL; + cp = sudo_strsplit(NULL, pathend, ":", &ep)) { + + int len = snprintf(pathbuf, sizeof(pathbuf), "%.*s/%s", + (int)(ep - cp), cp, sudo); + if (len < 0 || len >= ssizeof(pathbuf)) + continue; + if (access(pathbuf, X_OK) == 0) { + sudo = pathbuf; + qualified = true; + break; + } + } + } + } + + if (qualified && stat(sudo, &sb) == 0) { + /* Try to determine why sudo was not running as root. */ + if (sb.st_uid != ROOT_UID || !ISSET(sb.st_mode, S_ISUID)) { + sudo_fatalx( + U_("%s must be owned by uid %d and have the setuid bit set"), + sudo, ROOT_UID); + } else { + sudo_fatalx(U_("effective uid is not %d, is %s on a file system " + "with the 'nosuid' option set or an NFS file system without" + " root privileges?"), ROOT_UID, sudo); + } + } else { + sudo_fatalx( + U_("effective uid is not %d, is sudo installed setuid root?"), + ROOT_UID); + } + } + debug_return; +} + +bool +set_user_groups(struct command_details *details) +{ + bool ret = false; + debug_decl(set_user_groups, SUDO_DEBUG_EXEC) + + if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) { + if (details->ngroups >= 0) { + if (sudo_setgroups(details->ngroups, details->groups) < 0) { + sudo_warn(U_("unable to set supplementary group IDs")); + goto done; + } + } + } +#ifdef HAVE_SETEUID + if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) { + sudo_warn(U_("unable to set effective gid to runas gid %u"), + (unsigned int)details->egid); + goto done; + } +#endif + if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) { + sudo_warn(U_("unable to set gid to runas gid %u"), + (unsigned int)details->gid); + goto done; + } + ret = true; + +done: + CLR(details->flags, CD_SET_GROUPS); + debug_return_bool(ret); +} + +/* + * Run the command and wait for it to complete. + * Returns wait status suitable for use with the wait(2) macros. + */ +int +run_command(struct command_details *details) +{ + struct plugin_container *plugin; + struct command_status cstat; + int status = W_EXITCODE(1, 0); + debug_decl(run_command, SUDO_DEBUG_EXEC) + + cstat.type = CMD_INVALID; + cstat.val = 0; + + sudo_execute(details, &cstat); + + switch (cstat.type) { + case CMD_ERRNO: + /* exec_setup() or execve() returned an error. */ + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "calling policy close with errno %d", cstat.val); + policy_close(&policy_plugin, 0, cstat.val); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "calling I/O close with errno %d", cstat.val); + iolog_close(plugin, 0, cstat.val); + } + break; + case CMD_WSTATUS: + /* Command ran, exited or was killed. */ + status = cstat.val; + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "calling policy close with wait status %d", status); + policy_close(&policy_plugin, status, 0); + TAILQ_FOREACH(plugin, &io_plugins, entries) { + sudo_debug_printf(SUDO_DEBUG_DEBUG, + "calling I/O close with wait status %d", status); + iolog_close(plugin, status, 0); + } + break; + default: + sudo_warnx(U_("unexpected child termination condition: %d"), cstat.type); + break; + } + debug_return_int(status); +} + +/* + * Format struct sudo_settings as name=value pairs for the plugin + * to consume. Returns a NULL-terminated plugin-style array of pairs. + */ +static char ** +format_plugin_settings(struct plugin_container *plugin, + struct sudo_settings *sudo_settings) +{ + size_t plugin_settings_size; + struct sudo_debug_file *debug_file; + struct sudo_settings *setting; + char **plugin_settings; + unsigned int i = 0; + debug_decl(format_plugin_settings, SUDO_DEBUG_PCOMM) + + /* Determine sudo_settings array size (including plugin_path and NULL) */ + plugin_settings_size = 2; + for (setting = sudo_settings; setting->name != NULL; setting++) + plugin_settings_size++; + if (plugin->debug_files != NULL) { + TAILQ_FOREACH(debug_file, plugin->debug_files, entries) + plugin_settings_size++; + } + + /* Allocate and fill in. */ + plugin_settings = reallocarray(NULL, plugin_settings_size, sizeof(char *)); + if (plugin_settings == NULL) + goto bad; + plugin_settings[i] = sudo_new_key_val("plugin_path", plugin->path); + if (plugin_settings[i] == NULL) + goto bad; + for (setting = sudo_settings; setting->name != NULL; setting++) { + if (setting->value != NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "settings: %s=%s", + setting->name, setting->value); + plugin_settings[++i] = + sudo_new_key_val(setting->name, setting->value); + if (plugin_settings[i] == NULL) + goto bad; + } + } + if (plugin->debug_files != NULL) { + TAILQ_FOREACH(debug_file, plugin->debug_files, entries) { + /* XXX - quote filename? */ + if (asprintf(&plugin_settings[++i], "debug_flags=%s %s", + debug_file->debug_file, debug_file->debug_flags) == -1) + goto bad; + } + } + plugin_settings[++i] = NULL; + + /* Add to list of vectors to be garbage collected at exit. */ + if (!gc_add(GC_VECTOR, plugin_settings)) + sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + + debug_return_ptr(plugin_settings); +bad: + while (i--) + free(plugin_settings[i]); + free(plugin_settings); + debug_return_ptr(NULL); +} + +static int +policy_open(struct plugin_container *plugin, struct sudo_settings *settings, + char * const user_info[], char * const user_env[]) +{ + char **plugin_settings; + int ret; + debug_decl(policy_open, SUDO_DEBUG_PCOMM) + + /* Convert struct sudo_settings to plugin_settings[] */ + plugin_settings = format_plugin_settings(plugin, settings); + if (plugin_settings == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + + /* + * Backwards compatibility for older API versions + */ + sudo_debug_set_active_instance(SUDO_DEBUG_INSTANCE_INITIALIZER); + switch (plugin->u.generic->version) { + case SUDO_API_MKVERSION(1, 0): + case SUDO_API_MKVERSION(1, 1): + ret = plugin->u.policy_1_0->open(plugin->u.io_1_0->version, + sudo_conversation_1_7, sudo_conversation_printf, plugin_settings, + user_info, user_env); + break; + default: + ret = plugin->u.policy->open(SUDO_API_VERSION, sudo_conversation, + sudo_conversation_printf, plugin_settings, user_info, user_env, + plugin->options); + } + + /* Stash plugin debug instance ID if set in open() function. */ + plugin->debug_instance = sudo_debug_get_active_instance(); + sudo_debug_set_active_instance(sudo_debug_instance); + + debug_return_int(ret); +} + +static void +policy_close(struct plugin_container *plugin, int exit_status, int error_code) +{ + debug_decl(policy_close, SUDO_DEBUG_PCOMM) + if (plugin->u.policy->close != NULL) { + sudo_debug_set_active_instance(plugin->debug_instance); + plugin->u.policy->close(exit_status, error_code); + sudo_debug_set_active_instance(sudo_debug_instance); + } else if (error_code) { + errno = error_code; + sudo_warn(U_("unable to execute %s"), command_details.command); + } + debug_return; +} + +static int +policy_show_version(struct plugin_container *plugin, int verbose) +{ + int ret; + debug_decl(policy_show_version, SUDO_DEBUG_PCOMM) + + if (plugin->u.policy->show_version == NULL) + debug_return_int(true); + sudo_debug_set_active_instance(plugin->debug_instance); + ret = plugin->u.policy->show_version(verbose); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return_int(ret); +} + +static int +policy_check(struct plugin_container *plugin, int argc, char * const argv[], + char *env_add[], char **command_info[], char **argv_out[], + char **user_env_out[]) +{ + int ret; + debug_decl(policy_check, SUDO_DEBUG_PCOMM) + + if (plugin->u.policy->check_policy == NULL) { + sudo_fatalx(U_("policy plugin %s is missing the `check_policy' method"), + plugin->name); + } + sudo_debug_set_active_instance(plugin->debug_instance); + ret = plugin->u.policy->check_policy(argc, argv, env_add, command_info, + argv_out, user_env_out); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return_int(ret); +} + +static int +policy_list(struct plugin_container *plugin, int argc, char * const argv[], + int verbose, const char *list_user) +{ + int ret; + debug_decl(policy_list, SUDO_DEBUG_PCOMM) + + if (plugin->u.policy->list == NULL) { + sudo_warnx(U_("policy plugin %s does not support listing privileges"), + plugin->name); + debug_return_int(false); + } + sudo_debug_set_active_instance(plugin->debug_instance); + ret = plugin->u.policy->list(argc, argv, verbose, list_user); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return_int(ret); +} + +static int +policy_validate(struct plugin_container *plugin) +{ + int ret; + debug_decl(policy_validate, SUDO_DEBUG_PCOMM) + + if (plugin->u.policy->validate == NULL) { + sudo_warnx(U_("policy plugin %s does not support the -v option"), + plugin->name); + debug_return_int(false); + } + sudo_debug_set_active_instance(plugin->debug_instance); + ret = plugin->u.policy->validate(); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return_int(ret); +} + +static void +policy_invalidate(struct plugin_container *plugin, int remove) +{ + debug_decl(policy_invalidate, SUDO_DEBUG_PCOMM) + if (plugin->u.policy->invalidate == NULL) { + sudo_fatalx(U_("policy plugin %s does not support the -k/-K options"), + plugin->name); + } + sudo_debug_set_active_instance(plugin->debug_instance); + plugin->u.policy->invalidate(remove); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return; +} + +int +policy_init_session(struct command_details *details) +{ + int ret = true; + debug_decl(policy_init_session, SUDO_DEBUG_PCOMM) + + /* + * We set groups, including supplementary group vector, + * as part of the session setup. This allows for dynamic + * groups to be set via pam_group(8) in pam_setcred(3). + */ + if (ISSET(details->flags, CD_SET_GROUPS)) { + /* set_user_groups() prints error message on failure. */ + if (!set_user_groups(details)) + goto done; + } + + /* Session setup may override sudoers umask so set it first. */ + if (ISSET(details->flags, CD_SET_UMASK)) + (void) umask(details->umask); + + if (policy_plugin.u.policy->init_session) { + /* + * Backwards compatibility for older API versions + */ + sudo_debug_set_active_instance(policy_plugin.debug_instance); + switch (policy_plugin.u.generic->version) { + case SUDO_API_MKVERSION(1, 0): + case SUDO_API_MKVERSION(1, 1): + ret = policy_plugin.u.policy_1_0->init_session(details->pw); + break; + default: + ret = policy_plugin.u.policy->init_session(details->pw, + &details->envp); + } + sudo_debug_set_active_instance(sudo_debug_instance); + } +done: + debug_return_int(ret); +} + +static int +iolog_open(struct plugin_container *plugin, struct sudo_settings *settings, + char * const user_info[], char * const command_info[], + int argc, char * const argv[], char * const user_env[]) +{ + char **plugin_settings; + int ret; + debug_decl(iolog_open, SUDO_DEBUG_PCOMM) + + /* Convert struct sudo_settings to plugin_settings[] */ + plugin_settings = format_plugin_settings(plugin, settings); + if (plugin_settings == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_int(-1); + } + + /* + * Backwards compatibility for older API versions + */ + sudo_debug_set_active_instance(plugin->debug_instance); + switch (plugin->u.generic->version) { + case SUDO_API_MKVERSION(1, 0): + ret = plugin->u.io_1_0->open(plugin->u.io_1_0->version, + sudo_conversation_1_7, sudo_conversation_printf, plugin_settings, + user_info, argc, argv, user_env); + break; + case SUDO_API_MKVERSION(1, 1): + ret = plugin->u.io_1_1->open(plugin->u.io_1_1->version, + sudo_conversation_1_7, sudo_conversation_printf, plugin_settings, + user_info, command_info, argc, argv, user_env); + break; + default: + ret = plugin->u.io->open(SUDO_API_VERSION, sudo_conversation, + sudo_conversation_printf, plugin_settings, user_info, command_info, + argc, argv, user_env, plugin->options); + } + + /* Stash plugin debug instance ID if set in open() function. */ + plugin->debug_instance = sudo_debug_get_active_instance(); + sudo_debug_set_active_instance(sudo_debug_instance); + + debug_return_int(ret); +} + +static void +iolog_close(struct plugin_container *plugin, int exit_status, int error_code) +{ + debug_decl(iolog_close, SUDO_DEBUG_PCOMM) + + if (plugin->u.io->close != NULL) { + sudo_debug_set_active_instance(plugin->debug_instance); + plugin->u.io->close(exit_status, error_code); + sudo_debug_set_active_instance(sudo_debug_instance); + } + debug_return; +} + +static int +iolog_show_version(struct plugin_container *plugin, int verbose) +{ + int ret; + debug_decl(iolog_show_version, SUDO_DEBUG_PCOMM) + + if (plugin->u.io->show_version == NULL) + debug_return_int(true); + + sudo_debug_set_active_instance(plugin->debug_instance); + ret = plugin->u.io->show_version(verbose); + sudo_debug_set_active_instance(sudo_debug_instance); + debug_return_int(ret); +} + +/* + * Remove the specified I/O logging plugin from the io_plugins list. + * Deregisters any hooks before unlinking, then frees the container. + */ +static void +iolog_unlink(struct plugin_container *plugin) +{ + debug_decl(iolog_unlink, SUDO_DEBUG_PCOMM) + + /* Deregister hooks, if any. */ + if (plugin->u.io->version >= SUDO_API_MKVERSION(1, 2)) { + if (plugin->u.io->deregister_hooks != NULL) { + sudo_debug_set_active_instance(plugin->debug_instance); + plugin->u.io->deregister_hooks(SUDO_HOOK_VERSION, + deregister_hook); + sudo_debug_set_active_instance(sudo_debug_instance); + } + } + /* Remove from io_plugins list and free. */ + TAILQ_REMOVE(&io_plugins, plugin, entries); + free_plugin_container(plugin, true); + + debug_return; +} + +static void +free_plugin_container(struct plugin_container *plugin, bool ioplugin) +{ + debug_decl(free_plugin_container, SUDO_DEBUG_PLUGIN) + + free(plugin->path); + free(plugin->name); + if (plugin->options != NULL) { + int i = 0; + while (plugin->options[i] != NULL) + free(plugin->options[i++]); + free(plugin->options); + } + if (ioplugin) + free(plugin); + + debug_return; +} + +bool +gc_add(enum sudo_gc_types type, void *v) +{ +#ifdef NO_LEAKS + struct sudo_gc_entry *gc; + debug_decl(gc_add, SUDO_DEBUG_MAIN) + + if (v == NULL) + debug_return_bool(false); + + gc = calloc(1, sizeof(*gc)); + if (gc == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + debug_return_bool(false); + } + switch (type) { + case GC_PTR: + gc->u.ptr = v; + break; + case GC_VECTOR: + gc->u.vec = v; + break; + default: + free(gc); + sudo_warnx("unexpected garbage type %d", type); + debug_return_bool(false); + } + gc->type = type; + SLIST_INSERT_HEAD(&sudo_gc_list, gc, entries); + debug_return_bool(true); +#else + return true; +#endif /* NO_LEAKS */ +} + +#ifdef NO_LEAKS +static void +gc_run(void) +{ + struct plugin_container *plugin; + struct sudo_gc_entry *gc; + char **cur; + debug_decl(gc_run, SUDO_DEBUG_MAIN) + + /* Collect garbage. */ + while ((gc = SLIST_FIRST(&sudo_gc_list))) { + SLIST_REMOVE_HEAD(&sudo_gc_list, entries); + switch (gc->type) { + case GC_PTR: + free(gc->u.ptr); + free(gc); + break; + case GC_VECTOR: + for (cur = gc->u.vec; *cur != NULL; cur++) + free(*cur); + free(gc->u.vec); + free(gc); + break; + default: + sudo_warnx("unexpected garbage type %d", gc->type); + } + } + + /* Free plugin structs. */ + free_plugin_container(&policy_plugin, false); + while ((plugin = TAILQ_FIRST(&io_plugins))) { + TAILQ_REMOVE(&io_plugins, plugin, entries); + free_plugin_container(plugin, true); + } + + debug_return; +} +#endif /* NO_LEAKS */ + +static void +gc_init(void) +{ +#ifdef NO_LEAKS + atexit(gc_run); +#endif +} diff --git a/utsudo-0.0.2/src_ori/utsudo.h b/utsudo-0.0.2/src_ori/utsudo.h new file mode 100644 index 0000000..7540867 --- /dev/null +++ b/utsudo-0.0.2/src_ori/utsudo.h @@ -0,0 +1,296 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 1993-1996, 1998-2005, 2007-2016 + * Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ + +#ifndef SUDO_SUDO_H +#define SUDO_SUDO_H + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ + +#include "sudo_gettext.h" /* must be included before sudo_compat.h */ + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_conf.h" +#include "sudo_debug.h" +#include "sudo_queue.h" +#include "sudo_util.h" + +#ifdef HAVE_PRIV_SET +# include +#endif + +/* Enable asserts() to avoid static analyzer false positives. */ +#if !(defined(SUDO_DEVEL) || defined(__clang_analyzer__) || defined(__COVERITY__)) +# define NDEBUG +#endif + +#ifdef __TANDEM +# define ROOT_UID 65535 +#else +# define ROOT_UID 0 +#endif + +/* + * Various modes sudo can be in (based on arguments) in hex + */ +#define MODE_RUN 0x00000001 +#define MODE_EDIT 0x00000002 +#define MODE_VALIDATE 0x00000004 +#define MODE_INVALIDATE 0x00000008 +#define MODE_KILL 0x00000010 +#define MODE_VERSION 0x00000020 +#define MODE_HELP 0x00000040 +#define MODE_LIST 0x00000080 +#define MODE_CHECK 0x00000100 +#define MODE_MASK 0x0000ffff + +/* Mode flags */ +/* XXX - prune this */ +#define MODE_BACKGROUND 0x00010000 +#define MODE_SHELL 0x00020000 +#define MODE_LOGIN_SHELL 0x00040000 +#define MODE_IMPLIED_SHELL 0x00080000 +#define MODE_RESET_HOME 0x00100000 +#define MODE_PRESERVE_GROUPS 0x00200000 +#define MODE_PRESERVE_ENV 0x00400000 +#define MODE_NONINTERACTIVE 0x00800000 +#define MODE_LONG_LIST 0x01000000 + +/* + * Flags for tgetpass() + */ +#define TGP_NOECHO 0x00 /* turn echo off reading pw (default) */ +#define TGP_ECHO 0x01 /* leave echo on when reading passwd */ +#define TGP_STDIN 0x02 /* read from stdin, not /dev/tty */ +#define TGP_ASKPASS 0x04 /* read from askpass helper program */ +#define TGP_MASK 0x08 /* mask user input when reading */ +#define TGP_NOECHO_TRY 0x10 /* turn off echo if possible */ +#define TGP_BELL 0x20 /* bell on password prompt */ + +/* name/value pairs for command line settings. */ +struct sudo_settings { + const char *name; + const char *value; +}; + +struct user_details { + pid_t pid; + pid_t ppid; + pid_t pgid; + pid_t tcpgid; + pid_t sid; + uid_t uid; + uid_t euid; + uid_t gid; + uid_t egid; + const char *username; + const char *cwd; + const char *tty; + const char *host; + const char *shell; + GETGROUPS_T *groups; + int ngroups; + int ts_rows; + int ts_cols; +}; + +#define CD_SET_UID 0x000001 +#define CD_SET_EUID 0x000002 +#define CD_SET_GID 0x000004 +#define CD_SET_EGID 0x000008 +#define CD_PRESERVE_GROUPS 0x000010 +#define CD_NOEXEC 0x000020 +#define CD_SET_PRIORITY 0x000040 +#define CD_SET_UMASK 0x000080 +#define CD_SET_TIMEOUT 0x000100 +#define CD_SUDOEDIT 0x000200 +#define CD_BACKGROUND 0x000400 +#define CD_RBAC_ENABLED 0x000800 +#define CD_USE_PTY 0x001000 +#define CD_SET_UTMP 0x002000 +#define CD_EXEC_BG 0x004000 +#define CD_SUDOEDIT_FOLLOW 0x008000 +#define CD_SUDOEDIT_CHECKDIR 0x010000 +#define CD_SET_GROUPS 0x020000 +#define CD_LOGIN_SHELL 0x040000 +#define CD_OVERRIDE_UMASK 0x080000 + +struct preserved_fd { + TAILQ_ENTRY(preserved_fd) entries; + int lowfd; + int highfd; + int flags; +}; +TAILQ_HEAD(preserved_fd_list, preserved_fd); + +struct command_details { + uid_t uid; + uid_t euid; + gid_t gid; + gid_t egid; + mode_t umask; + int priority; + int timeout; + int ngroups; + int closefrom; + int flags; + int execfd; + struct preserved_fd_list preserved_fds; + struct passwd *pw; + GETGROUPS_T *groups; + const char *command; + const char *cwd; + const char *login_class; + const char *chroot; + const char *selinux_role; + const char *selinux_type; + const char *utmp_user; + const char *tty; + char **argv; + char **envp; +#ifdef HAVE_PRIV_SET + priv_set_t *privs; + priv_set_t *limitprivs; +#endif +}; + +/* Status passed between parent and child via socketpair */ +struct command_status { +#define CMD_INVALID 0 +#define CMD_ERRNO 1 +#define CMD_WSTATUS 2 +#define CMD_SIGNO 3 +#define CMD_PID 4 +#define CMD_TTYWINCH 5 + int type; + int val; +}; + +/* Garbage collector data types. */ +enum sudo_gc_types { + GC_UNKNOWN, + GC_VECTOR, + GC_PTR +}; + +/* For fatal() and fatalx() (XXX - needed?) */ +void cleanup(int); + +/* tgetpass.c */ +char *tgetpass(const char *prompt, int timeout, int flags, + struct sudo_conv_callback *callback); + +/* exec.c */ +int sudo_execute(struct command_details *details, struct command_status *cstat); + +/* parse_args.c */ +int parse_args(int argc, char **argv, int *nargc, char ***nargv, + struct sudo_settings **settingsp, char ***env_addp); +extern int tgetpass_flags; + +/* get_pty.c */ +bool get_pty(int *master, int *slave, char *name, size_t namesz, uid_t uid); + +/* sudo.c */ +int policy_init_session(struct command_details *details); +int run_command(struct command_details *details); +int os_init_common(int argc, char *argv[], char *envp[]); +bool gc_add(enum sudo_gc_types type, void *v); +bool set_user_groups(struct command_details *details); +extern const char *list_user; +extern struct user_details user_details; +extern int sudo_debug_instance; + +/* sudo_edit.c */ +int sudo_edit(struct command_details *details); + +/* parse_args.c */ +void usage(int); + +/* openbsd.c */ +int os_init_openbsd(int argc, char *argv[], char *envp[]); + +/* selinux.c */ +int selinux_restore_tty(void); +int selinux_setup(const char *role, const char *type, const char *ttyn, + int ttyfd, bool label_tty); +int selinux_setcon(void); +void selinux_execve(int fd, const char *path, char *const argv[], + char *envp[], bool noexec); + +/* solaris.c */ +void set_project(struct passwd *); +int os_init_solaris(int argc, char *argv[], char *envp[]); + +/* hooks.c */ +/* XXX - move to sudo_plugin_int.h? */ +struct sudo_hook; +int register_hook(struct sudo_hook *hook); +int deregister_hook(struct sudo_hook *hook); +int process_hooks_getenv(const char *name, char **val); +int process_hooks_setenv(const char *name, const char *value, int overwrite); +int process_hooks_putenv(char *string); +int process_hooks_unsetenv(const char *name); + +/* env_hooks.c */ +char *getenv_unhooked(const char *name); + +/* interfaces.c */ +int get_net_ifs(char **addrinfo); + +/* ttyname.c */ +char *get_process_ttyname(char *name, size_t namelen); + +/* signal.c */ +struct sigaction; +int sudo_sigaction(int signo, struct sigaction *sa, struct sigaction *osa); +void init_signals(void); +void restore_signals(void); +void save_signals(void); +bool signal_pending(int signo); + +/* preload.c */ +void preload_static_symbols(void); + +/* preserve_fds.c */ +int add_preserved_fd(struct preserved_fd_list *pfds, int fd); +void closefrom_except(int startfd, struct preserved_fd_list *pfds); +void parse_preserved_fds(struct preserved_fd_list *pfds, const char *fdstr); + +/* setpgrp_nobg.c */ +int tcsetpgrp_nobg(int fd, pid_t pgrp_id); + +/* limits.c */ +void disable_coredump(); +void restore_limits(void); +void restore_nproc(void); +void unlimit_nproc(void); +void unlimit_sudo(void); + +#endif /* SUDO_SUDO_H */ diff --git a/utsudo-0.0.2/sudo.pp b/utsudo-0.0.2/sudo.pp new file mode 100644 index 0000000..833b210 --- /dev/null +++ b/utsudo-0.0.2/sudo.pp @@ -0,0 +1,531 @@ +%set + if test -n "$flavor"; then + name="sudo-$flavor" + pp_kit_package="sudo_$flavor" + else + name="sudo" + pp_kit_package="sudo" + fi + summary="Provide limited super-user privileges to specific users" + description="Sudo is a program designed to allow a sysadmin to give \ +limited root privileges to users and log root activity. \ +The basic philosophy is to give as few privileges as possible but \ +still allow people to get their work done." + vendor="Todd C. Miller" + copyright="(c) 1993-1996,1998-2019 Todd C. Miller" + sudoedit_man=`echo ${pp_destdir}$mandir/*/sudoedit.*|sed "s:^${pp_destdir}::"` + sudoedit_man_target=`basename $sudoedit_man | sed 's/edit//'` + +%if [aix] + # AIX package summary is limited to 40 characters + summary="Configurable super-user privileges" + + # Convert to 4 part version for AIX, including patch level + pp_aix_version=`echo $version|sed -e 's/^\([0-9]*\.[0-9]*\.[0-9]*\)p\([0-9]*\)$/\1.\2/' -e 's/^\([0-9]*\.[0-9]*\.[0-9]*\)[^0-9\.].*$/\1/' -e 's/^\([0-9]*\.[0-9]*\.[0-9]*\)$/\1.0/'` +%endif + +%if [kit] + # Strip off patchlevel for kit which only supports xyz versions + pp_kit_version="`echo $version|sed -e 's/\.//g' -e 's/[^0-9][^0-9]*[0-9][0-9]*$//'`" + pp_kit_name="TCM" +%endif + +%if [sd] + pp_sd_vendor_tag="TCM" +%endif + +%if [solaris] + pp_solaris_name="TCM${name}" + pp_solaris_pstamp=`/usr/bin/date "+%B %d, %Y"` +%endif + +%if [macos] + # System Integrity Protection on macOS won't allow us to write + # directly to /etc or /var. We must install in /private instead. + case "$sudoersdir" in + /etc|/etc/*) + mkdir -p ${pp_destdir}/private + chmod 755 ${pp_destdir}/private + if test -d ${pp_destdir}/etc; then + mv ${pp_destdir}/etc ${pp_destdir}/private/etc + fi + sudoersdir="/private${sudoersdir}" + ;; + esac + case "$vardir" in + /var|/var/*) + mkdir -p ${pp_destdir}/private + chmod 755 ${pp_destdir}/private + if test -d ${pp_destdir}/var; then + mv ${pp_destdir}/var ${pp_destdir}/private/var + fi + vardir="/private${vardir}" + ;; + esac + case "$rundir" in + /var|/var/*) + mkdir -p ${pp_destdir}/private + chmod 755 ${pp_destdir}/private + if test -d ${pp_destdir}/var; then + mv ${pp_destdir}/var ${pp_destdir}/private/var + fi + rundir="/private${rundir}" + ;; + esac +%endif + +%if [rpm,deb] + # Convert patch level into release and remove from version + pp_rpm_release="`expr \( $version : '.*p\([0-9][0-9]*\)$' \| 0 \) + 1`" + pp_rpm_version="`expr \( $version : '\(.*\)p[0-9][0-9]*$' \| $version \)`" + pp_rpm_license="BSD" + pp_rpm_url="https://www.sudo.ws" + pp_rpm_group="Applications/System" + pp_rpm_packager="Todd C. Miller " + if test -n "$linux_audit"; then + pp_rpm_requires="audit-libs >= $linux_audit" + fi + # The package manager will handle an existing sudoers file + rm -f ${pp_destdir}$sudoersdir/sudoers.dist +%else + # For all but RPM and Debian we copy sudoers in a post-install script. + rm -f ${pp_destdir}$sudoersdir/sudoers +%endif + +%if [deb] + pp_deb_maintainer="$pp_rpm_packager" + pp_deb_release="$pp_rpm_release" + pp_deb_version="$pp_rpm_version" + pp_deb_section=admin + install -D -m 644 ${pp_destdir}$docdir/LICENSE ${pp_wrkdir}/${name}/usr/share/doc/${name}/copyright + install -D -m 644 ${pp_destdir}$docdir/ChangeLog ${pp_wrkdir}/${name}/usr/share/doc/${name}/changelog + gzip -9f ${pp_wrkdir}/${name}/usr/share/doc/${name}/changelog + printf "$name ($pp_deb_version-$pp_deb_release) admin; urgency=low\n\n * see upstream changelog\n\n -- $pp_deb_maintainer `date '+%a, %d %b %Y %T %z'`\n" > ${pp_wrkdir}/${name}/usr/share/doc/${name}/changelog.Debian + chmod 644 ${pp_wrkdir}/${name}/usr/share/doc/${name}/changelog.Debian + gzip -9f ${pp_wrkdir}/${name}/usr/share/doc/${name}/changelog.Debian + # Create lintian override file + mkdir -p ${pp_wrkdir}/${name}/usr/share/lintian/overrides + cat >${pp_wrkdir}/${name}/usr/share/lintian/overrides/${name} <<-EOF + # The sudo binary must be setuid root + $name: setuid-binary usr/bin/sudo 4755 root/root + # Sudo configuration and data dirs must not be world-readable + $name: non-standard-file-perm etc/sudoers 0440 != 0644 + $name: non-standard-dir-perm etc/sudoers.d/ 0750 != 0755 + $name: non-standard-dir-perm var/lib/sudo/ 0700 != 0755 + # Sudo ships with debugging symbols + $name: unstripped-binary-or-object + EOF + chmod 644 ${pp_wrkdir}/${name}/usr/share/lintian/overrides/${name} +%endif + +%if [rpm] + # Add distro info to release + osrelease=`echo "$pp_rpm_distro" | sed -e 's/^[^0-9]*\([0-9]\{1,2\}\).*/\1/'` + case "$pp_rpm_distro" in + centos*|rhel*|f[0-9]*) + pp_rpm_release="$pp_rpm_release.el${osrelease%%[0-9]}" + ;; + sles*) + pp_rpm_release="$pp_rpm_release.sles$osrelease" + ;; + esac + + # Uncomment some Defaults in sudoers + # Note that the order must match that of sudoers. + case "$pp_rpm_distro" in + centos*|rhel*|f[0-9]*) + chmod u+w ${pp_destdir}${sudoersdir}/sudoers + /bin/ed - ${pp_destdir}${sudoersdir}/sudoers <<-'EOF' + /Locale settings/+1,s/^# // + /Desktop path settings/+1,s/^# // + /allow members of group wheel to execute any command/+1,s/^# // + w + q + EOF + chmod u-w ${pp_destdir}${sudoersdir}/sudoers + ;; + sles*) + chmod u+w ${pp_destdir}${sudoersdir}/sudoers + /bin/ed - ${pp_destdir}${sudoersdir}/sudoers <<-'EOF' + /Locale settings/+1,s/^# // + /ConsoleKit session/+1,s/^# // + /allow any user to run sudo if they know the password/+2,s/^# // + /allow any user to run sudo if they know the password/+3,s/^# // + w + q + EOF + chmod u-w ${pp_destdir}${sudoersdir}/sudoers + ;; + esac + + # For RedHat the doc dir is expected to include version and release + case "$pp_rpm_distro" in + centos*|rhel*|f[0-9]*) + rhel_docdir="${docdir}-${pp_rpm_version}-${pp_rpm_release}" + if test "`dirname ${exampledir}`" = "${docdir}"; then + exampledir="${rhel_docdir}/`basename ${exampledir}`" + fi + mv "${pp_destdir}/${docdir}" "${pp_destdir}/${rhel_docdir}" + docdir="${rhel_docdir}" + ;; + esac + + # Choose the correct PAM file by distro, must be tab indented for "<<-" + case "$pp_rpm_distro" in + centos*|rhel*) + mkdir -p ${pp_destdir}/etc/pam.d + if test $osrelease -lt 50; then + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + auth required pam_stack.so service=system-auth + account required pam_stack.so service=system-auth + password required pam_stack.so service=system-auth + session required pam_limits.so + EOF + else + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + auth include system-auth + account include system-auth + password include system-auth + session optional pam_keyinit.so revoke + session required pam_limits.so + EOF + cat > ${pp_destdir}/etc/pam.d/sudo-i <<-EOF + #%PAM-1.0 + auth include sudo + account include sudo + password include sudo + session optional pam_keyinit.so force revoke + session required pam_limits.so + EOF + fi + ;; + f[0-9]*) + # XXX - share with rhel + mkdir -p ${pp_destdir}/etc/pam.d + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + auth include system-auth + account include system-auth + password include system-auth + session optional pam_keyinit.so revoke + session required pam_limits.so + EOF + cat > ${pp_destdir}/etc/pam.d/sudo-i <<-EOF + #%PAM-1.0 + auth include sudo + account include sudo + password include sudo + session optional pam_keyinit.so force revoke + session required pam_limits.so + EOF + ;; + sles*) + mkdir -p ${pp_destdir}/etc/pam.d + if test $osrelease -lt 10; then + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + auth required pam_unix2.so + session required pam_limits.so + EOF + else + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + auth include common-auth + account include common-account + password include common-password + session include common-session + # session optional pam_xauth.so + EOF + fi + ;; + esac +%endif + +%if [deb] + # Uncomment some Defaults and the %sudo rule in sudoers + # Note that the order must match that of sudoers and be tab-indented. + chmod u+w ${pp_destdir}${sudoersdir}/sudoers + /bin/ed - ${pp_destdir}${sudoersdir}/sudoers <<-'EOF' + /Locale settings/+1,s/^# // + /X11 resource/+1,s/^# // + /^# \%sudo/,s/^# // + /^# Defaults secure_path/,s/^# // + /^# Defaults mail_badpass/,s/^# // + w + q + EOF + chmod u-w ${pp_destdir}${sudoersdir}/sudoers + mkdir -p ${pp_destdir}/etc/pam.d + cat > ${pp_destdir}/etc/pam.d/sudo <<-EOF + #%PAM-1.0 + + @include common-auth + @include common-account + + session required pam_permit.so + session required pam_limits.so + EOF +%endif + +%if [macos] + pp_macos_pkg_type=flat + pp_macos_bundle_id=ws.sudo.pkg.sudo + pp_macos_pkg_license=${pp_destdir}$docdir/LICENSE + pp_macos_pkg_readme=${pp_wrkdir}/ReadMe.txt + perl -pe 'last if (/^What/i && $seen++)' ${pp_destdir}$docdir/NEWS > ${pp_wrkdir}/ReadMe.txt +%endif + +%if X"$aix_freeware" = X"true" + # Create links from /opt/freeware/{bin,sbin} -> /usr/{bin.sbin} + mkdir -p ${pp_destdir}/usr/bin ${pp_destdir}/usr/sbin + ln -s -f ${bindir}/cvtsudoers ${pp_destdir}/usr/bin + ln -s -f ${bindir}/sudo ${pp_destdir}/usr/bin + ln -s -f ${bindir}/sudoedit ${pp_destdir}/usr/bin + ln -s -f ${bindir}/sudoreplay ${pp_destdir}/usr/bin + ln -s -f ${sbindir}/visudo ${pp_destdir}/usr/sbin +%endif + + # Package parent directories when not installing under /usr + if test "${prefix}" != "/usr"; then + extradirs=`echo ${pp_destdir}/${mandir}/[mc]* | sed "s#${pp_destdir}/##g"` + extradirs="$extradirs `dirname $docdir` `dirname $rundir` `dirname $vardir`" + test "`dirname $exampledir`" != "$docdir" && extradirs="$extradirs `dirname $exampledir`" + test -d ${pp_destdir}${localedir} && extradirs="$extradirs $localedir" + for dir in $bindir $sbindir $libexecdir $includedir $extradirs; do + while test "$dir" != "/"; do + parentdirs="${parentdirs}${parentdirs+ }$dir/" + dir=`dirname $dir` + done + done + parentdirs=`echo $parentdirs | tr " " "\n" | sort -u` + fi + +%depend [deb] + libc6, libpam0g, libpam-modules, zlib1g, libselinux1 + +%fixup [deb] + # Add Conflicts, Replaces headers and add libldap depedency as needed. + DEPENDS="%{linux_audit}" + if test -z "%{flavor}"; then + echo "Conflicts: sudo-ldap" >> %{pp_wrkdir}/%{name}/DEBIAN/control + echo "Replaces: sudo-ldap" >> %{pp_wrkdir}/%{name}/DEBIAN/control + elif test "%{flavor}" = "ldap"; then + echo "Conflicts: sudo" >> %{pp_wrkdir}/%{name}/DEBIAN/control + echo "Replaces: sudo" >> %{pp_wrkdir}/%{name}/DEBIAN/control + echo "Provides: sudo" >> %{pp_wrkdir}/%{name}/DEBIAN/control + DEPENDS="${DEPENDS}, libldap-2.4-2" + fi + cp -p %{pp_wrkdir}/%{name}/DEBIAN/control %{pp_wrkdir}/%{name}/DEBIAN/control.$$ + sed "s/^\(Depends:.*\) *$/\1, ${DEPENDS}/" %{pp_wrkdir}/%{name}/DEBIAN/control.$$ > %{pp_wrkdir}/%{name}/DEBIAN/control + rm -f %{pp_wrkdir}/%{name}/DEBIAN/control.$$ + echo "Homepage: https://www.sudo.ws" >> %{pp_wrkdir}/%{name}/DEBIAN/control + echo "Bugs: https://bugzilla.sudo.ws" >> %{pp_wrkdir}/%{name}/DEBIAN/control + +%files +%if X"$parentdirs" != X"" + $parentdirs - +%endif + $bindir/cvtsudoers 0755 root: + $bindir/sudo 4755 root: + $bindir/sudoedit 0755 root: symlink sudo + $bindir/sudoreplay 0755 + $sbindir/visudo 0755 + $includedir/sudo_plugin.h 0644 + $libexecdir/utsudo/ 0755 + $libexecdir/utsudo/sesh 0755 optional,ignore-others + $libexecdir/utsudo/* $shlib_mode optional + $sudoersdir/sudoers.d/ 0750 $sudoers_uid:$sudoers_gid + $rundir/ 0711 root: + $vardir/ 0711 root: ignore-others + $vardir/lectured/ 0700 root: + $docdir/ 0755 +%if [deb] + $docdir/LICENSE ignore,ignore-others + $docdir/ChangeLog ignore,ignore-others +%endif + $exampledir/ 0755 ignore-others + $exampledir/* 0644 ignore-others + $docdir/** 0644 + $localedir/*/ - optional + $localedir/*/LC_MESSAGES/ - optional + $localedir/*/LC_MESSAGES/* 0644 optional + /etc/pam.d/* 0644 volatile,optional +%if [rpm,deb] + $sudoersdir/sudoers $sudoers_mode $sudoers_uid:$sudoers_gid volatile +%else + $sudoersdir/sudoers.dist $sudoers_mode $sudoers_uid:$sudoers_gid +%endif +%if X"$aix_freeware" = X"true" + # Links for binaries from /opt/freeware to /usr + /usr/bin/cvtsudoers 0755 root: symlink $bindir/cvtsudoers + /usr/bin/sudo 0755 root: symlink $bindir/sudo + /usr/bin/sudoedit 0755 root: symlink $bindir/sudoedit + /usr/bin/sudoreplay 0755 root: symlink $bindir/sudoreplay + /usr/sbin/visudo 0755 root: symlink $sbindir/visudo +%endif +%if [rpm] + /etc/rc.d/init.d/sudo 0755 root: optional +%endif +%if [aix] + /etc/rc.d/ ignore + /etc/rc.d/rc2.d/ ignore + /etc/rc.d/rc2.d/** ignore + /etc/rc.d/init.d/ ignore + /etc/rc.d/init.d/sudo 0755 root: +%endif +%if [sd] + /sbin/ ignore + /sbin/rc2.d/ ignore + /sbin/rc2.d/** ignore + /sbin/init.d/ ignore + /sbin/init.d/sudo 0755 root: +%endif + +%files [!aix] + $mandir/man*/* 0644 + $sudoedit_man 0644 symlink,ignore-others $sudoedit_man_target + +%files [aix] + # Some versions use catpages, some use manpages. + $mandir/cat*/* 0644 optional + $mandir/man*/* 0644 optional + $sudoedit_man 0644 symlink,ignore-others $sudoedit_man_target + +%pre [aix] + if rpm -q %{name} >/dev/null 2>&1; then + echo "Another version of sudo is currently installed via rpm." 2>&1 + echo "Please either uninstall the rpm version of sudo by running \"rpm -e sudo\"" 2>&1 + echo "or upgrade the existing version of sudo using the .rpm packagae instead" 2>&1 + echo "instead of the .bff package." 2>&1 + echo "" 2>&1 + echo "Note that you may need to pass rpm the --oldpackage flag when upgrading" 2>&1 + echo "the AIX Toolbox version of sudo to the latest sudo rpm from sudo.ws." 2>&1 + echo "" 2>&1 + exit 1 + fi + +%post [!rpm,deb] + # Don't overwrite an existing sudoers file +%if [solaris] + sudoersdir=${PKG_INSTALL_ROOT}%{sudoersdir} +%else + sudoersdir=%{sudoersdir} +%endif + if test ! -r $sudoersdir/sudoers; then + cp $sudoersdir/sudoers.dist $sudoersdir/sudoers + chmod %{sudoers_mode} $sudoersdir/sudoers + chown %{sudoers_uid} $sudoersdir/sudoers + chgrp %{sudoers_gid} $sudoersdir/sudoers + fi + +%post [deb] + set -e + + # dpkg-deb does not maintain the mode on the sudoers file, and + # installs it 0640 when sudo requires 0440 + chmod %{sudoers_mode} %{sudoersdir}/sudoers + + # create symlink to ease transition to new path for ldap config + # if old config file exists and new one doesn't + if test X"%{flavor}" = X"ldap" -a \ + -r /etc/ldap/ldap.conf -a ! -r /etc/sudo-ldap.conf; then + ln -s /etc/ldap/ldap.conf /etc/sudo-ldap.conf + fi + + # Debian uses a sudo group in its default sudoers file + perl -e ' + exit 0 if getgrnam("sudo"); + $gid = 27; # default debian sudo gid + setgrent(); + while (getgrgid($gid)) { $gid++; } + if ($gid != 27) { + print "On Debian we normally use gid 27 for \"sudo\".\n"; + $gname = getgrgid(27); + print "However, on your system gid 27 is group \"$gname\".\n\n"; + print "Would you like me to stop configuring sudo so that you can change this? [n] "; + $ans = ; + if ($ans =~ /^[yY]/) { + print "\"dpkg --pending --configure\" will restart the configuration.\n\n"; + exit 1; + } + } + print "Creating group \"sudo\" with gid = $gid\n"; + system("groupadd -g $gid sudo"); + exit 0; + ' + +%post [rpm] + case "%{pp_rpm_distro}" in + aix*) + # Create /etc/rc.d/rc2.d/S90sudo link if possible + if [ -d /etc/rc.d/rc2.d ]; then + rm -f /etc/rc.d/rc2.d/S90sudo + ln -s /etc/rc.d/init.d/sudo /etc/rc.d/rc2.d/S90sudo + fi + ;; + esac + +%post [rpm,deb] + # Create /usr/lib/tmpfiles.d/sudo.conf if systemd is configured. + if [ -f /usr/lib/tmpfiles.d/systemd.conf ]; then + cat > /usr/lib/tmpfiles.d/sudo.conf <<-EOF + # Create an empty sudo time stamp directory on OSes using systemd. + # Sudo will create the directory itself but this can cause problems + # on systems that have SELinux enabled since the directories will be + # created with the user's security context. + d %{rundir} 0711 root root + D %{rundir}/ts 0700 root root + EOF + fi + +%post [aix] + # Create /etc/rc.d/rc2.d/S90sudo link if /etc/rc.d exists + if [ -d /etc/rc.d ]; then + rm -f /etc/rc.d/rc2.d/S90sudo + ln -s /etc/rc.d/init.d/sudo /etc/rc.d/rc2.d/S90sudo + fi + +%post [sd] + # Create /sbin/rc2.d/S900sudo link + rm -f /sbin/rc2.d/S900sudo + ln -s /sbin/init.d/sudo /sbin/rc2.d/S900sudo + +%preun + # Remove the time stamp dir and its contents + # We currently leave the lecture status files installed + rm -rf %{rundir}/ts +%if [deb] + set -e + + # Remove the /etc/ldap/ldap.conf -> /etc/sudo-ldap.conf symlink if + # it matches what we created in the postinstall script. + if test X"%{flavor}" = X"ldap" -a \ + X"`readlink /etc/sudo-ldap.conf 2>/dev/null`" = X"/etc/ldap/ldap.conf"; then + rm -f /etc/sudo-ldap.conf + fi + + # Remove systemd tmpfile config + rm -f /usr/lib/tmpfiles.d/sudo.conf +%endif +%if [rpm] + case "%{pp_rpm_distro}" in + aix*) + # Remove /etc/rc.d/rc2.d/S90sudo link + rm -f /etc/rc.d/rc2.d/S90sudo + ;; + *) + # Remove systemd tmpfile config + rm -f /usr/lib/tmpfiles.d/sudo.conf + ;; + esac +%endif +%if [aix] + # Remove /etc/rc.d/rc2.d/S90sudo link + rm -f /etc/rc.d/rc2.d/S90sudo +%endif +%if [sd] + # Remove /sbin/rc2.d/S900sudo link + rm -f /sbin/rc2.d/S900sudo +%endif diff --git a/utsudo.spec b/utsudo.spec index 6746c76..fbbfece 100644 --- a/utsudo.spec +++ b/utsudo.spec @@ -2,8 +2,8 @@ ExcludeArch: i686 Summary: The tudo respect sudo Name: utsudo -Version: 0.0.1 -Release: 0%{?dist}.01 +Version: 0.0.2 +Release: 0%{?dist} License: ISC Group: Applications/System URL: https://www.sudo.ws/ @@ -36,8 +36,6 @@ BuildRequires: cargo BuildRequires: rust BuildRequires: patchelf -Patch0001: 0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch - %description Sudo (superuser do) allows a system administrator to give certain users (or groups of users) the ability to run some (or all) commands @@ -52,8 +50,6 @@ on many different machines. %prep %setup -q -%patch0001 -p1 - %build # Remove bundled copy of zlib rm -rf zlib/ @@ -196,8 +192,8 @@ rm -rf $RPM_BUILD_ROOT /bin/chmod 0440 /etc/utsudoers || : %changelog -* Mon Aug 07 2023 Lujun - 0.0.1.01 -- Add Patch: 0001-fix-compile-error-undefined-reference-to-sys_sigabbr.patch +* Wed Sep 20 2023 Lujun - 0.0.2 +- upgrade to 0.0.2. -* Tue May 10 2022 Lujun - 0.0.1 +* Wed May 10 2022 Lujun - 0.0.1 - init. -- Gitee From 51d2c097eec8ae4c468a94202f3dafcaff3a4187 Mon Sep 17 00:00:00 2001 From: wanglujun Date: Wed, 20 Sep 2023 15:43:07 +0800 Subject: [PATCH 2/6] del utsudo-0.0.1.tar.gz --- utsudo-0.0.1.tar.gz | Bin 3459777 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 utsudo-0.0.1.tar.gz diff --git a/utsudo-0.0.1.tar.gz b/utsudo-0.0.1.tar.gz deleted file mode 100644 index ff51db246a65d445cb513f0783ff5559dee92e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3459777 zcmV(#K;*w4iwFP!000001MK~4L*!U?CXDu1$FGp-_5kGwl3S9Q)l=i4NV1A)5^{j7 z>VDgHl!y?ZCXk{-iXF(2oH?XB&t zomap4kNMe#pEqw_d$X>_V*8V_x5+*yxITF_Rj9k?wj94um6MEvN$k9J{l>AySl-(C9eKK=J~zX$(4px@unf8Wx7>8+jZ=)){Y zqRafIe2iyF^dX;TV`^a^nmF3(^`a=kHl*2Y6lddToI<

p68IzlqAbw1{rfNz#uV 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ⅈ~qDSIv3_epXV28IraPwpWQ{@MWixC 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�_Y0ip^}X9KMJ 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 v~$Vf7GpdXl$@ZA%fj&bW|!_; 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%0AYTC+$8;}|wL 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Ξ3a=dyPF+BvWZ@1 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

  • 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 z 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�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%0D`Kve2UNt?_ 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� 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 z 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 z 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 wK`5PfT(r(b_mcSefW`w!2EdV7`**Ss2 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

  • g7QZU(OfNaL=QV*xL}DtTUv5 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

    R{2P1SL@6; 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

    fb^?6Yglcsd$%wg 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�sIn%x-&Cv} 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�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 z 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 z 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%0A@J2>tlW!-6Q=KVH%M{rw(cCA} zd*-dLZn2*fY%*A5JWA#w==CIi5T;$;dOdU&gJ|Wlz`P-_7InfZ-9@_pQm2rQ?IVc3 zsiY7m@plgK9Wsl=Y{TRyrUVp&kE?4&u1 z(b}{r_);X7H}oUOc#kIK%_QgjIg*|d&O<@jDDOJZ+ow`PN|Wf>zl|LjUB2`>FZTA2 z;ERkTfQ|yFEHwcjxwv$_etE95`1LiTAphRKSzjLCu97GZKQ{J<_TYGL`<;GpJaF!Q zhV_1mBdx+fPfn^UXJ`0+46knS6&3EdYvt9Ojq(Z>TwSN2*RfSeV^(O4MI2Z@UTKC5 zqq7TkT;BAQ%p0zfd8H1SsQgeGkD1VKIDD{19dT5Vpe>lgRfO7k$yl=%#h#zj2i#vX z4_8stuQFz%u`e|6*wHccWq3HujW54%++Yyq1#;T3YvN}RQ|fz2+c8D}i^x7^pSrb0 z-?_RT!2=(7fTE6=erwApSqKDCD9a5c-1CU03C*)}23N2K_bToHV{WjLmM2IN&bMrs5BP(&~4O2_rkV7GSuJ|oYJogxe8@$@ROsGCr45Ga-sVVlf(8;xtz(@!o?@V!ky1vR~|Kh zJ^_g?%&gr1;yCoLfkkK5-W)}vw>%*I;AED2V3hDK$<=?zCAW|Qvr zzYgX23(*e4-6u*oP;+bdXTN9JGw)aS+(B#P4ok=H@VNlOv+^H*Gj(%E`R~5!W#!jt zOb?pA)f?^I*6a3Rvvs_4v~-e7g>uH7Gvnu{mL&s)jx}gsj2(J|+a9}-iFEXJqapn( zUcY-6eYvwG-|cL1#YK=$>u;O&BhlPFINCp~si$lW=J?n#kY22zKkjiRP2^&vTKm#P z`il%h-|BcS^i;+L?EtC2vK1^W3N(iF_k1Vf!vE0$_SS(T)5pk5X#6FlZ`XJLqO33O z-LZH-aBqcuXCbSiz>y@3FD&E`> z!S+t`uzj%INPf|1?2p_8UKiA!4pdc-wjd&4u4!SGIoHtM6_%WT~WzZ|a9z zjs2}Ab{DBGl`&f1d$s*q*1L4j`d(YFD14R0;*G{;t_MgDb5u4O_(10I)DJnGCnmIP zyn9Dm0KW$X=)r3f&T9f>2By`ojE7K!GhGrBA)$w!L`wu3E;f)}O454@m@EwXMzdeH6+F42VY(zydvbBTZOF_dEi$b-WspePa!TF0;O zt9yBgp?IU1x_`a5ZjoKqX zfgQBy^qs2#{6wx@fwt~7R7>=1tBV(Fi*VvbVhNtH2tY)SM43Ly0k+S+N){F?K%X;< ze5r;rLFfZ7*t(dOsblp}C5FfW`2IoZU2D6bqaDMb!*f^6plxZ#9!ld=cR=Z?^i9#l zz38tCC};ZXz+gicmQIpa{j7M> z9rSSP95(;o@%CYp3vM+VJMC6;3s8IX6{fFkqg{0SWgT$HPQCR8N+s-&r9$RIMzRwx zS|4AmG9Q7OsYq!M0>?eHSY>l-EWBozlYa9nKB<25&2!;@gDz79?KJnzH`#NdS{M)b zGeAbc5efVxlD54*R|)4w9jye+eFAg~%fUpYowD$OdqoS33e2dk^gd(_%(AsqaN^NW zI$5cMMWyKkO(`5j%k%kGGFlZ+r&R3Gdwq!vwOkcmTkCJBxauMCozcA)pO&*?<^;;f zTL-yAfjAu>ZSMfZX}+ohFT_eQy zDDMjxg72W)KJ>=FCjC#(9tqp(TvMfybtQwiL*0RWi=F%tKCFfh`Uldw6EsEY76eb| zmrx=O068PrD$XVFq1CgZIKlt$Ugifwb8mIX`SSbkaXOp(uQD($VLi`Kp1e!f6-)T7 zAU;5cHpR+w@hPK9A~*&Nv~nicot_1}-7D7xBsUyi^qdazoUamF8G6o*HL|gQ?9!*_ z2~EFx`gEqInP2zE7rlbXyRZkX${3)xEO4<#l1nC)VbQ(mUIuv8SXv z*aJzuYJ9;?J*-Qw8~;61pLksaFBNV8q(^cw)JnhuE=9ZK!t(U`Q5Sd(;p?a5HG923 zTTiUcdrZEFlY&$Qzbs)J#ufx_85uiNp8;ktncYo!QI#QDnl&TpWYIKdaVfKWDoU5V zkqdu;8a7m_cXh#aIdDtxHj7do6}`Q7hu(z3^gbvK2eHH!BBfz(eB}%#RE?D-Ff3Q% z5q}8D!Fsb19p@4S*Q3K<+ReB1oh4Wa*-Akgj!+==2Xq1J&DI4f+M<-5c264sy|?Y5 zK)~;jD^!t_FmVB3SIlYQDJqpw&dF*+nRlaQ+QJgS^Yb?C7xZtDf;6J>A-VtAHx_yT zq+En%$rX_HIV*k8FDi#MS#T@u;3Y!okpArjItUmYs>#*d`I5#`wojc}G+X+xQ#|~X zm6rszKq^)aKpfgiU{+~DEw`OVxAz9DsU24jV5 z=tfqz+q@g99{Kma=fdp6>ex7bx$wvh;A;*B;?gpsX`C19B8JhRNz3ZZB|maLL#i{F z&KT>9jB>uTlNb5C91RVlv;$u@bBRoCND~H&lLGTF2J>)Mn7uTZy%@~ij4(}I8Z1ZZ zEN!MVy=k`0f-*1O)V9r*BUv6(&rz_cf^)(4wy-DhM6mjibKiLAQ?K!e!Uee7eZ?4c z@VF?x)0K8Oi>SK0agguA-3EAqO*d_!xI?I-Xiu*c{E9Z3N$POrJ+?SzHwj z&@X9GfFB$8Q9P5rup&z3nEi*-bL)%oFsSXK0gBYxMo4!IITPi8V;(i_2~ms`I?6sC z6X?kNm?U)z#D&bXjgTOYrtgG=!qeIn(d{tX?wzUcNuu(!Z9J*>2_<6P55DOQ9Nx5~ z(Z{Wk3GO}wc?vTV*XY?G4v&Ypw>S-+RYskRRR$3`Lp|3)b6N3L?yuJbDP(Jic0sP~ z%Z-X?B3I>!M5V81^|Kk=QD|}pka3$DyELO%{}h=3wM_^6hevo51bmd|0U?puANVj0 zq{F%|T?QPqW00Zd!m>1pyqS}jp&80(o^y9{vR3*|nomiJ=iG_4@&-E)pm{!y5QKjl z&McC*t|<2`X~~DYXye;&IXqLKtRz_1$PA;8s=P39Mn%*iipX6=9R~m08YG%)D$klFuaT4Bf~yA_yF)QW5Dh zh&Lv)6GY9J&fJoWJ|*U9#0+@l{{xt$e~5ov<>k*`#XtU$KgX>u0itqwi8VMWJ;8Ud zHR({E97R}hF2}m?Z~zC=c9Nq-lDZRCG}eLe1`0Jhw;s_CDH74viCEm^XlIF?32#>J zO=_nnyq9}4wLscx#-?3gC{r2YX<43iB;N}Mo>sw*EP_-yOBG6N=t_$o*9mJaI$d17 zdiqq|9HI(+iuxR0HV5R{r1=VUSHf4mO4Z0%$r7(z4+Oq}c=|NxKJ*kXvc?YTKXn>P zX3Txt0DLl8^Ya!GI>cp@=>jMWEv1p>ubK_ z)|;hZ2!%|DOhX-tDQ$8o_)H6`NLRX!kAuMmh~+_YG^>T#Oy+ChQfT(q4qLS(f=e@% zF$+z$3^Pk61`G|iI63}jO4(!+xk*JMCUJ>H`@nGe?VX7&TjP=2$KY~Fr7oSjwkp}3 zp_7x#w|m`rt2{~*3AyIO!|c1=anDZK9P;JF4U}wvI3A#>#=tC?Y#o=2J~pdJBedWg zJn`$Vxak~p#^V{m4T~m4`3qs7E!_DS!7d{wEM-)>}mY& zN12|*?sBr3DJ_##cf8r~ong?X6r^;6MjO3RA5A{gJ)%#ZRk-~|*435W4bxy!odurJ zSkysIb7Tk{+JcJVqbw$FEe|)IU%7B`{>g(H)%$WZv=rFmOvDE3C=p%kqlXc8ESQD zj@Wq9Z2Yvn2MnQe8Cbi>1U+F+6Bu`Cniw@@j2a-G6*9?fsB0RWd@P^VfXQV=fs@H& z2xn+}N5GN;QQv-7jKL**AS1{I57m9Yk86(`fNoC64@1I3RD{R|J1}DFkb~_;*|_5| z1bjX-mUFje*q4SfABDOd8VGgGv>y#EASZ&2-HHg4U~Xn}=FdM)Rr=UdihOL;LV-r= z8n|X&XPPBfPgO3^_XPTX3l$jaQh}kv&12GU#*Zo;xS_Y=c?u0(`o06OHrrnpbNC(B zL(xoSWW!N8&~qLN6yYywoG?~~Tw$r?w9w=Jq6}C^t2Ekb!T|K`{srnl z4FFI#x=IKv3d|l_H!gGUS&!hoSsk6c)`((mj|J&@7|6>i16D)^kwMkAf)iv3# z30As+lpj%oG-lUz)ox{qHMqKyNNKt(>{?>f_hiE?j)*1X8=nOi^ zDudhy_;T54`|$K`RJ!~$s|q0s@6XU6H2&8p5E_5$5B}C4Ow%7UO4-ZrHp1$IMvDG` zprVoH4W52|F?BT0vA#(#e~I}Ch}fqMSiy0LVSSIs9#?)a~zkO<~OY9zF8;*NBXMHeOIxJXr6a4;u} zMl}9J;pkuRW=44^0mvK@(X1T(M1J0IxB8Tw4AtP)Q+f4#$csz6#C%YGTM}85`xbKS zOD#%ladL8YhMet90lM*Ae9B`_9*d`sbM*7_^Qqi?8ZSRDCm-SCQ&{#GbB|w;d=V!P zo4Ay{>ii2>c~uV{Nmn$JkDth=r%=8I)(%=lwMlH<>u~ek{uUh*Ue3Vo#B^Li>GhzkPUgv@Pji3L#G+Hzc^jppGH>q=cTGJ zE;9I=6(a|X6MQ^Dd+yzBAo8u zbn|bz`JYEO_Y=wH;g`D|$M-)wgDyHDVw_qcF@I_LdDxgjKMx!8($B+2GX3;AGt$o( zfUitH^S(tjcALNeeV{+vN6lT4{U;21m@SIx%1Tj?KC!ta>D}iM)ZB#b{7p?~rKU_u z4}p>bhVH`o3ux(_G&Gf1nm7AFFg~qv?X=w>D)BT#T}wuVG0YdmjSs+than}Mp>Yc1 zK5S~M`RaHttd-)RTh1lmjwQqq!3z=o2?H`qo}KK5%Z4A2juQdUNopVM@9!+Zi=w#d z{Hv&Lf*29lBhsROP`ZR~;mIdbqpK&I+0vCL?XRi}8vxrne%U%&QUwZU@V}EYL}kqM z?4vV3?7&*4e%!9_Y}Z>f>d5#)+Bpg;V|6GyN2yv~7Z<<>!_n!oM;Z;s7xnSTMFdGXwXR)P-d@En5mRbvyZ5`R15e-kq%0RDk;>3Yx$>>we z1J%1+&-nh!|K2*@edJAn`HRQ>N8A^(m+|u^Uldi7MR95Me7j(50a=80f&9LyIv8FW z-Ab^M@{X152L;xlwF#zG)lr9CcX?}P2YZ;n8wV`0ETb7$&1NJ_fh-%J0{H?2sa_A+ z)PyOJMQ94-_f1(kG6lL7IR)@rdUpelDbGb{{Hj81{H^9zWbDY~UE7`a(hT-;-0R(! zRB%^30lBVi8gYA{*wizW*GZUUstJNRcat9882|(4 z4If;=mokNEh7}mAXwH~_j6@&1o2OF>=$^tk==!p6 zuoNKM$`C8tuYd)If1V5ahNJ*`c2Ga81J9nJQTk{xjVnuUGZaRT3L7vo!mvr_8g!cZ z>n55xAS@U@2-SE-Nzk-;EIKqFHHSjC%~2(xOg=Ai@)5^rZENA%*Y!BFrsbQ(hPoq_ zT+nRJ03Wrl;!-~OZTlm@J>dsp8n{fzjH=5KKy-;5<$)XB4>1}ypd7-sXyq!in^irM0TaRy0*UYFov3@AnzGA8xNnh2xEFBM#-roRQG?V5p-$#{}yeiTmJLWG(^PFc}!I7H&Xr~2`&8>89-wi!s78c)%>UlqtJ&;>G&yd4JO|NKQ-4dgRm>v z3G?S;h`SQ3A>1&7+8$$jaLJ&;=9 zh`(!X>wfhpA%N=1Oi%I1->0cEnO+O`>Km~*f_)Ya5zpvmw@xhzP=Cf2d z%Tjhm+PpPiHnz4KI1BYwV|$xJcyUOpcOOSEVIqH8U8&~J$yT{uKnr;+C>WSTsf zrvtt~8gaOzp=XasJ1bMpp$cDR&wj=j65D{>tJoeyIlD1Sf;8X`7s67cne-A*YY7B${G6==(CmsxSYKZGqhqzq@bomrcB(Fw5OxA201uX%9D}XCR=W*zXZFkXxy3>aRY>k zA@(Zh8z8**!7Ee1dy9M}VtbT@1g{$XlDff&X#0^^58ykRVS~tY8$GV6vyz~xYSj1k z_qH4Lo%Wmk)={FiDk$>uczb6{mkIOr*X}K;R%r5o=VL=_J*&h}lhr$pvu~v^_~vZl z-EAo5Ao~t1mzGO3>}63f{0q1}?OkA&LjQ!$XiRKh9}bDhxF)o@NedbPL~oJ(^s5jZurqB zdI0j`SDN4C5k#h#8XgZ=VcW&1m?NJsh{z7`i1f1Rl+&#Hh0Mc-YlN$eRm&xVi}6y) z#X{FLoU|4C8t83WM<$>*bI%&PC=4-|+*0~33Kfg)qVP*|7e(I8u!~X_-efS+ zd5Hh|`k(R0A9vl-N_nMRt@PI`)?J&H>&hNk-LB^hF5Pl}{qx#DS@Ow~b^Kd>x=}U% z;%9wjQ z;K21)&^vZvM{6=&dEln>T&kmrN_TG5-hcVu5&)+#Kk~*;*2VGO_PZdB z)#%n$3UwdVy=Eii7;jUGL4rbR{Vww6qwYod8e4(loT7wtsgf<1!zy8%{hjSbbFbBu zD{+85Xwk2pk|2^calb6B#dMd+(?A_N(Sji;ko#9c2+=yp4?%ywVCjC;G*G2jP@j#J_|zP zzRRYR!3+WKve0P6EgY6+d#}0lrvA2Ru1ir=@gkDbn!(1Y;!#1HPP&uE{cvso&+83d zhQ3HG2&YXRNgXvi%y#fb8r8NKR3tc-@C#2SyAM)%o86W+CzR z$2@qbIVW&1_=V7BJ;^~A=qiu1G7qrSCja1}1(mty3o`W;ViStGzCeYSvBTNr!UE>_ z;3tKJ1qlz{4LBn^jB^;ejD9!l|77`A5dml%$DF+2*jGuDw`1GL%n6_HVAr8OO2bqTbki#4dTb^HY z9&q{9*ixrKPCBM+Ib)}K0zoTqnnOrvG-e#s1$k0UL~u_AG3rgq8I}bCV?Lf~RGud; z02XGgIy$c}M4F`G=^Z8aO|0wxi1eM-6e-(M2&2mxfd2!~Kbu|o`}4@31peO|Vv+&! zc=&AApFUIg|Bbb^YJ~sac(T6sH~;@NK8s@W@jk?g!smK48rCY6+uPgn)nHt9y(>WT zm!n(Y!7Iu>uOwY?qC4(-)W?jukJ_t58K-`5(A?W-aEJGvb9Fru zOPvBpGb_);>#@^y#c^3|dDgY<^u_mA_@w*ds()AR+CL=Lt5(IXWqBieAYQtD-vYVq z`~Le2{t7iMr&sQ{{U2nrWUZyl*ic&ZY?NSmqt}Q9$2967gF0xudNCf6g%ohn72qfP zZr8cIhX(|UE)iwgF|SYZqIQtA2V?+yz*60g)1d%yXx)cTe4TcNchxKGMN9TVyh0A0 zrnRUd%&5DjHPwiONSehZ_6PF_6r02qpvU)|Y*N)Nr_4YwP%VpIgY?QqEiiNy3y!aU zix`zQ!_1)%S z;|Gpk z&6l)P=p6@4k<;_l(0_r|m3MR`XL)wV26Wbi6W)PsHOm5`^$)=!%rG+MvdnskQ4wt} z#Pmh z#8cgK`VOw;5HBu$U;2AtjiRyEBp1rZt!j- zzw_o}3rL^^mM1qotl!b(-YmU7*eS3r;uU5}8!$nD)1mDnRC|3qc(|rCfiPA6$Qg}C zHY?1+%NaVCvAv+^6tqo29Ay$IQ%7ZjG)AWlL}g+n-D;hQc$sZX5#y0t7;Xr2e-J3z zAx_xJG(Lo)gmTZmdtE*kax4TVaXe;RO2l9B)}*GfoXITuJfTk_3NM2rKwX!-bv`(3 z9yb5q(rWq1I;!zm7odX`9fCafj>cPWwSgqITg@YoiZk*T1_Xu%mYB6bA(U^Bu73C3Y6;lqCli>@?Lh}nFGXb@S^eQ= z9?O@iE2WiHa&IP*Mfc}XPWt&gob+e&(HR*(Ib|TvXW^m&hT@~A@z9UML4Owi{2=bx zWS=pTZ~-t$k7Xak#0-q%(SMZC>=;i}tXGVTvv{ zO#({YI3T_mL%Mg-O{jCtEcf?Zup}S7kZr)0%w+nuN_U%E!6df&(yLfrt`v*;^Gs&! zTUQh?{20H~L~cc#uy*7uli6p{DjrCLY)$0~No0O{p6lCrTx4&I!5^Ug{h=+(16s9x z3?WduE{akK-RZRb%h1Cs8Ja?TPEzK846w2M2+Jd?FA=WS<-0QGL(hVxUfOZZ$(Qk3w70R*YijX2R+CO#Hd;*-1mB&v zM($8jdP9YwVEEV0<>)!z*Xhclu&^kO5jTvw&OkfalvSm0>E&3D`f%=@!Hv~(x~k<| zHHQPqiXZ-|&FZMbRRzZYW5A~yXihM%?w4V){;?@mwEcn6=*Y#`FN6Caq)Mn&Zjj=P zj67>7^86qVomdss4T@ybXv5B9<8GWq9a(6sRSX(6m&w2;h>au_BTPDFHI)4w4v52O z4O3!h8y=vD9XLhSm3GUMmO(!GXY>JYpoyh6-osQClpmX%)X+Rv^PhMsFYKOst4)HC zW`H1Vb*{N4p1G+lQMKsPG9Mi4Qm_ zo99d8zU99cD^H(dclz&fbBIzG_B~gqbgtgfCtEPvImgn$&HV_`l77-vPo9fU;^RkZ z%gi3IwZF@yp#woPxm-!U#COqt;b;+P!2}wrU&`esSH$V2BmFanWvT@!>R}_;9g0V0 zn>&Thx6z=15#VUh9g@l_9~`P+pP}gtcTWLQm`UIgbjSVv{U-LULSJ#^rp4>eNGg`H~105YGeY9q$s! zw+J!Vr9+ViiRVOIcyJH$1z_p@)*b8Ok>ivS?#tE|6m^h1lWt+@>e~9ibl!_AG%PG*#h;N=L=^z=OBWQaa0F-qld2&rjiyPB4JhCS=;X^!f*Utf}NuyM5fi2HNd{Y-!xVjzKBA7b@3v>=C{RN~$MR z7Om)XPvHS@=9ifT=#lL8c`nTBGy_aytcLbr{}o~7rOXEcADq}LkoOjpD@0~dnj3S} zPh^sus{u(-fXYfN^WpMcfFMBP5Bd91&{YZ>as$UJvcPiteyT-QT>qB)Gk73(4DSiz zDrDKND3U&iGm)v9@Z!ELS46w zhd=~sf45|vLF0Tb){ zz`Av=8Gki*UYU(7i(Bfwj9EZ;n79cSRRknb`mjJ$4lc%T9FU>K1xSea4t=(JEPuamj5DCbA4Ox12+uEhhpqz zGYg?@)~q{xp1CYNZkI^FW%8q$@2R4 z1#V0l$|n6RNgzlLRiWijnOF(`dd=5_eMS|AWZf}#4H z`+&Xrl>5LyKdJ6R5j6l~CKDSAjhJnwDXxx?3M)7tEha*Y|0y`KJSlWYiqg1=A`!@g zjxhMFYdj#9;LMShT?J$wBM~X^9q-HS@{BvkrriMpbp1_@w~X=P>yOUbvnL<>PoBO1 zIPlk2-+zS7u>8@76WjTCW8D?B?RK2_kufr^OuG%eZ?|DBVzj0dIuURj78WF>DgCDE z!9!_2&YFyURI8#L!gz$(2~7l0@&$Rc+1P*e3UGRWUkj*9vM7|uQh8Ac}A%=?vJ zZGAW@CEL1iD$o6jeSx7@@T6ThvmLZ-4gqG*BORsP+fv3A-1Q4M9;iRBNGvYTgs%b& z0)ugBlhq#vpX#xOV!#{udJHTB*~nOQ4*&-NLkT%RK!GN`ac}J#$&%fxpyF5>>%O_4rsZw$?QTWqA^(C2>a5?221`8j z+1*V?kqiPqx&y2aL#|Ybr(xGs7T`%{>5e=4g0=eHcN=K*9T*`n%0of{Vj4!ymK9Y( zijmv3?v(_DdR!3vhtgOPupSYrdw#%y6j6VUl0%g!%`N8$l`4Fe0HHWi5~wX!02S7E z4&Kz;3WJ*Sr$$XP$gHWP0>9E#885duT>@6Mpe|}$54hgSX|*y$5}|t&NDATh0&10Q zzFikftJRe!>xFEvu1X)oZ7H&ah07bW7vE{rCGaN|{P)>RO;7{X2@Tjc8=>;$C$dI; zQk5skbq*S-m4+QFTI=a-wVs-_sHN43;|aC$gj-piJf0`vHp^h^OnT&C(gS9= zM^&rkRZe-4g>P9BQrn`KkqRaha(fX9NNHi*IQ2VntF#efg&7 zV;xug6zHtXIn&-dQc6CMCs2w2giT3>oKfBv+ZdD1xf39ebBsJ|AR|Kz;CV+J?6&1yk_!%j$HwR+$T6m}cn6_UY*Nh>B5(d;7C;hvKXOYcXyinM)8z_U2q z%`huKnAsR-ZDXajRtQzaRljuxgV9=fBV4)Ocdo4E8U}!9vl^oPwgxOiz?PttAFv|# z{>^%nl{u+fX9(tG-#t5N`DZgRH5S%z{TQs>{+a6yujhi*#~N{1`>o2_cPl0YXYJ`q z$+_qg<88AwO0?GRmAAWQ9Uov&o!@Wzt{rb-Cjd)t0-JM23C%3Aq$XkA{Et;=%X>4~ML62iaqVlcebb6)1-IJ7R ze9G~BuP)b~;#})jj_>&DxsoQBLDlz@qBK0$JR~(&5V5A82Bt;}eD%tGz*BTrYmEot zeHc5^cx-%*1G<__q>Nx1C%=}@mZgMijMpCz*5AmsKys-?=IGk$JxUYHW)nywt?tn6 z*~{rIL#@wl*?IN^#M=7Ub3N<$oo*Z+-`Ru6^8oEVdxGS{qPOEID1=)Gk4=J)j4VaP z+dAH3odmWU+_kd3pLxfMW=T4NwsyW_h3k`bRMJRIxL;PcM1esS^aU*)g0T3gv2C|^ z4xX&H+Z-je$~h6PWU(^qE-|<{qJUf1lQE#^noD)dXDo3dqSg!l*c5Rqg)`Gi0`K-| z!t;xi=n1-G^}A2j^UwL9Y`5CLbZ;Ng?8s+%zI@FW1YP_rEHxVY2S=^VY<7xXTvZ^w zcnGp#M4J^@+%4F=}YP9M@&o1@fn8SQp}8-bk;pgysD_=Mf=E^NNIrOl#( z5EBbXK-SA?hj{HVCdN?TWCM&#+Pu>H^FV5E*%%>g`D1H6Nf)E6C8Fw<|F(wK00Zdm zNMHNFYf>ua!?wvh3FqtOYI&{n-#ht)v5yC?KXu@xN;_%PYs+yOKn$jaJQ+7Z5u}?y zs7M>9RiS~^3U;CTo2b~MPNnaTx)GHWB~|j4avQ~JajozvAEx^tSP*j%!;oyd^v{1r zOkdW5g;R@WtQd~Bpg4nRqty2VxHojI$h4A-7M41S3SNn z8ndk>nPoeBM~ujO&S)fKE|Y&Un{}(3AG(T{P~;uVjpNDan|PsfkEvs?0AmKz$b6ql9>e+p^ z*Ov2nVuPTCa3u?FKE^R6JU&V|#PlAct&XM$DOhef-s18XX>Iw^>cJijw--D#S_~e3 zPJ1AbSdrG$BeN~_EU77aH$zj`Ru@P@s44ZxY)U;#YKq>?GK=Bq3pbDqI=B#-I%QD2 zhInHHOlEA}hr^y-l5Z!&k-~QpC?%KA0gdJKT__srlQZ;5p@J~lAmFW+*OKZT?;IU& zze}t+?tyqZg$sXMf2Uw9n?P=?yP09EuB@)q8avzzSf|zXwcxh`*y%Y#;I&w{bmdvY z>k>Sg0vU%w672Er_CbqwxO{+vcl`;{fx4hvpfoVw3o?V$R*;%;?hJcCrr}B+r#y#;BUP32Z9IoYkiH9mnfT4tETcIY z->aQVIBeC>#=4v5p{4-1DkK8u0;9b2y?QP_nOMM>j>!jY7xuLW(njq7@z-wsT|10u z6iv z0Rq!TWz{q&s0WK6re{D&8t*E{?`ls?)ccG`9o6jIjqjc&)Pku2^tB$Yqvth2^DS$E zOmnz4p;m-C)ZaSJ{$8znHCDI(i(>0FbXdj*^<@c8RfiF#F;op+Dx*ob5_k>{_Z!Vt zYyWUFK}#nU7`aGMkYW0rXU{Op%^9BD^b%Dlky!{SHcrs}sDAjmdDMQny;nc{rMjT?bd9>ZBUmc=jZ{m8j-+_t~@M+LqfJg0v#{IIf<00O;}U;aX@XbopJ-KuL#b6OA%5V1jk>|oOp%+oW$ME`XLa#@vR#FR4XMK$@ zCH+%FAo1pa)mTYtPAoBj2>838G18WYna=Gf|3jG5zj8_rus<`YA+Dl&h#%#rR^NX2 zW9_86dRDI1RtqE}!6UI+UM*KC>lOW|!VeIo4v#7a4Sb|jA|N&nNndTja9P4qE;lj` z8A!d)#5IW8bTf%&AWkqq5&jtJ&6*@5d8O6y&+}OcGLL=Avz~VO*%KT>_<{?zv+Pqu zt7|=3H%ilqF5L-@JY1hHmf`5?OONfByD+D34Gbd-o$E^vRU~Q}Sxz}isXBiPIZg>J zCV61DSLsd@x=s4d3)f#;-QeC!_OK$k!<0N~6D*Q7N1Du%E-XX>Khvh}TwbAj4%v!h zd}lOL{(%3W68InOHqoc{u(MR4S2Us}Vqq2*hU1aHlr?V(VfbsX>o&4nfC{hhcggV} z+!?r@Bv$1-u$5j&U{C_vPV3GVt~A4O*-~91AbYeSCu1 zJ26Bx?i)07+TJpas(L>3LzEim@u<~8qSP`>%9#7B{-%|LGG0TjD#&sThHJvJMk4^w zgkAI@X!4Wxf)WS&KQ|BasS|*8NdL}b3>_kRE_VcvICesNes4IOd_K8IY3H{Nu29(< z*=2P35+8AKQSkzUEWN5316_lG%4zT`%>L#oE0xbZ;c7@T9&Q7Jh1WlV!!G*X2pHIP zQvQBa2)L$n!C|yaqWO9fgyqEgVQef-1sUt3K|2|%$6AP)&|qC)vDwU=@wdvqk%s!C zgutVaAT`|%HIG^bp0Jnut)v;dfc;j2RgcWs*1@~V>W?ccwU_1na;qHEu28iED*qk8 ztemW^p8=hOwqdBXYB^f@dKjnK*F&KEdXY%)kN|5n1y*duRNW^}pJDYk2c=^*`Zov1 z@Av@BbPZEJS$U~0W0GA71JymXx>o&Bgm%T713ss$Qr7lo#_){tM&b97qBxd-fhsU^ z4=(Y zPK?$(yxnR7c`vb)m0J?{EskUGJh?(OQlUDz0&KS0^f?Lj80UpKMCvnx1XkT_7q?ru zVJ^0|8Z9=66q6BKqs1bnJ_SEWElT>;f256oRIEIR2~hQ7CiWpV^`F!p4-|o#^Tp@s zW)X2NI2xZt9ZrKCMvy^18d)G~7RFxE=`>7+r5Z#XQrMXq8HCg&DF-zpy$e+(Bzf1v z@!c|cJ6Ou(MY^;p?`jzU0t& zLkuQ?;b{$)^g5LWLLVn=sko($va=!oQ-%=ISVf6LNI_-3OfkDrTS|2upD=S1HO@jY z{*jm<))*KQmfGst%Ernvn|&$<@Md1H=N7p50*3M35qOe<++ z=5krxvwc8u(DF4qt3o}*l57$dfj~s6Aa4wmjx<8RJ`j$Yfq;d~ZEx+>5LQis5Tj^w zLRgLTVRdRBlJNh;DpFfZe~26zlc<-{oJ9$k#fTVS4MrAI*U~8^0|GSrT~nggg|3Ab zX1Wtf=~99u^fVBm4B6`0k0(#RJ2PLztg;g%HCfdJ7_PRGSZ(>cAAek~?H)8Mj=ET0 z29a;Ye3k&GKeVIr{PhrrqnsGgcws0*)hqdo}~KXCY|M(xJ`JwNTF{bnLMH%knR!-Gf?a#qayW zQpdCIVaqrPx5Xist)kf=WHQa`O zQ+^`n0tiDNk6<-mm>LCo*Ij}Oq|M)~PSHePIAj;CXl zaSW#rRt-=RO(;*l`7p9DYJVjmsbKcTe8%LOo;^%-Z;e;~T-U+n+UvbzZ6B#} zv+#n;MiV308K8?NrOFuwhAigKb-!{SFjVcQY27MTWW|JDRhD(XIOm~?Bt$z7yGb?| zs5w`m?xqp!aCc-N+aR3ouP47&&M1cpvsT%Y+8Ay2YiC*fPJT)7{d^AMrzRqSRoZn1 zQvy>l8H$CZLPJ&9l@x7xCO(Bj>?QU@0&8E`A$XCnF1pa?v_z4#%tqMxUD<_KenmYr z#p9?@T(z2v!z4p5eJ?6#T~vWmr~pwe^3As!cs)Halo6D9Qb;SK;sYHt>R4(@tRgJ+ zbZV*Q+b5}=GRizn>y!>a1cjb0CpM>J05NCfUi_;&#%u(oq37IKBfErws?f4VW^WTg zWY1o=?7QWv5u_paBVL5BNCliw5v%chVRZC#lfqfn-RlIajs{>}$G&)^&5J=dLXc8! zOM+Xe`r&T7S%0}bV?b1F#SDoWR1e)l&NTq7vJCg?pwVi-eRVKfoYrWcWaYSZ_iVkw z$fa>x@7e2KUq)`*%tgBKkn4Sv1@8c$8o2N=<*>5zaK5^3%rWla$r=D$UWGci%jQ17?@tuogd!a13rl*Qyg$qfOk8 zm%0OsfOEa-`O-|rQXE)I5_hN(dFkb5hF>XmYKoEfQCRW ziXGQ|uS^{T`Ew|iSMCqsWKVvzO23~i*YaWJHnN{MEOlPwMd@-?F}?@&r^_-hl)9}< z?7CuH>(9*MXihMxIGbtf;uFfoHG9KhCux4A@H*oZ4?C$4W~~2Yy_c|ebT14cdNP~| zP-cUHo8=~QNa)#P(M1gU6@t!Dz^21Sb+8)le3<0|2DPpv$Y{TWFJG)>tEcxXkcu?0)KH1BNJ5 z5TgD`2~)Y>s;p`%xP6IA=Ud9?BqQfg<~P1K&C3K}&E0o2*Wt`Z6hq7p5`dvP*y{Cy zdcz4 zR^^hUvikvAy{xLhfyT2njBR=rf4&aSLm^M;VCVx6g{DPGAZW{5({F71e%JN8|GJ9C zC1n77k*<0t4fcZTb=`x>_x^NOzI%{krMB{z+;f4^>V-Wf0hhgxI!qc_K&R+S;7GFP zmeCKb$C-R$!Zo6r5jhzfHF8u65YEqtaGsX$ikP}+fQX6E8vbb69!Ac3Qr4kEjl1J_ zO7zJ7y34V_vOyrx<@IMzmJ4j^6ILfW@FutemUl?WB{!lamp?8y?4IqpgQ$|yc_Pb7 z{&4b93(pm;azsl%1KwGNoxiF~<#g^x+z6ci*spXh$~aYe$&H;BgeNI4zm*n=71BE= zK{%hZ^1#{!2_iD=%^O}Plf5^-CiQD6RP!UP?;!^*H!d8?%bU>KJf<&ONUGsHTftS1 zIBdlCK}z+!+E8V+Kk^}1lsYO7aAQ`0VtIReCWuew=%P6A+&O@zALNc3Ue4*~el5Y9 z8U&i)LTksq1e%RRku$d&M6VXI4j}hoj-I;p->(l2RJy(Vu#?x^hb#n41V#6w^nL0& zPkUsm>>0zJbuWDD(#Ay2mhX@Il++j2N(X|nAXYgvf$05bmq6BZqA;ltoxFAH3-ZXT}>pXk1LbuF4X+a#qIq*`^GK|SVg^^(k zh*4{V=}KXLhaLFu{mR(t!o0`5_zfHApa;GLlZYoNyS!}Xt>ce8%j^kF_M)hFyON{S z?__RApA(h~c4N9Hwwp4d!|D^GWp-o|zDC!eW0``_=s@%s;DzRLt#P#d4hjGAhCC1$ z;nBJDU{_@`+F5y}y256>-jy1C1Xu?H+ED}}CKDS#0ye7ski+vt2)oeAk1MsU62jOh zuSJ}tyN-2H>c*~Mcb~|RGH*{dh;~yoCOMwK1%CVFnW5y%bF@J-oJ?M;_O$a4*^&JC zBkidb7|06H^ELK&t|vV#E+;*$grBZ++?ZNU&Yz7;D2RgFr92NxcUts0f`G4%q8hw zL!^%H@q)!bI#(KWJSo$x@f!( z>%v~+klR|N_ID2s>n;7jSm5$n`Vu3YKXsYE>O#-A)U!4=93embnT>^Sr^2$L`3%nP zas=niBM>42URg`ClMY~VOxFb6%TWu#Z-=^=qUN8WI~<}T5txkLF%L9~k9W|BPG97) zDQ!ny#RTq{0(*vDw02KkHqTmGL1j)Y1v>58iS#%O;HyNqdH3m%!+bP_S48rWh)Gf9PN^({6dU{L=D( zb$rq3>{?E*+^`4!*e}1{fBS>U#g3_+jdx|H57LZEJA(!oTfy%CaVQt8DVu6CjdU|5mG;B+LVA+$+EKpx-YNV8-`^gntvy zTr?->=p4i#B05~I)hmJfc7OpX9`e+rAOri>U#{&ne{Pk6WDdrOa|ib&EaUo-BvYDwyAJh|AbCy;HcE^Z|5_AEcr{NnjP9zqcBre1c z;Y<6adslmD2LT`PyAEmyBoU7lY2*7=m&DhXc2OK0G$y#PFrfin(WEwj0!(Uxgi`@fgMji;xi$sr8_Rh=R$%GJoN%wPPT~zy06LRs z;ha#j^{%vDYaJgn4@=<<@87NSHW?3XZ`zIrC>tqIHs*rzBn8Toxu85vf%0@ND9=)$ zJev>7VHy~3E;#i@GX;>q^L!>eSz?-RR1&1P3Eo^Fw=D10 zQ32^=-c~_=t&bl?^sU_KnMqcp(p)xD6^&e-^YA|knv=1rlrkdQx#W39}SKnWY4JBbojnvzIKh0w&JX0qiVcru3)LtS1WHpPs! z=;C2vLC$x)lr{q4g4mQ1B@BP+Fr4WtjvWXs#iFQFeogz%?u?1O>U0n<1NNujWZxA9 zT@wrc8mJ@R0$ad(q1u$|)4eQ(&%i5hL0JMYACs_P8Bxy*E2?sN%F9qywTlKul+0=5 zx;?)vM161{4GfG_P4(s}kU3SkXJPXBB|bc&%6XsZVF6XJp8ea{@hG;U%KyR`~P?R1Fv1YwnkRtnKaZ;ib6@P-Y_Rf$f$?uwU$cY2e3v z^CPfYO^^yF!1C=mU>#2Gm+#FC3;N^^S|fKDA&|ty5;yf*Y2XgfB48Yuo|mmvWTeSg zE+ipe`1qpaJ9ZxgzXa9uR;v<~@Fvm0$bD#O+K3K%*5ErW-DK5`QdS+#4vYs=JPk&4 zGlXHBavi`unA}79-Iaw*EXZjC;rNai2@vYzn=1*VbI(V2q%(<)WN*=4)KYM?BFW%sKqv1-k| z=DP`%?13HGD?hcM6>4pDMIxA=c4Ch(yT`iuEDRqF#;`-Hkq*84X{S_80JV`0>h66n z5!7;e6?01B)wYjX=~bLjH2H0Fn=}US_xN2{%(Wf-ZyG}i>>gd(z3NS7Ayp5$RQj@a zKZgTfOvUkbw-sV9r|YVw1;MQ=!`vW=^iAIvMut}`wXI5#V{=NOx2ljzUlb{0Iyo=b z-ZeS*2jHK#Q95vE$8NpYbm{&56zeCv1II$M1nnp<=Mqw{Vmn@UdNWuip=$kbx`C4A zMXO3V`0XwSahz#G+0iJ_>_oinJ3V)BD)tBVt58oOGPOIfFO6Oh3!3QwEA+!ZSH<_= zqvt_xrH0B=X*tLFHziYtNH3Eie#`H8&Tu4_6oZu;IekE~R)1J1l5OIp1%d#fZqM$x zR|DsFy2j5$F|@dM$8-fO6Af-(;uB9b08P2QZjsXW-FnW*&X@rriE9jO0hl0ALO+X8 zzBcW|On|ivOxX2kG^|xBSI(&HTQ}BVU|pB52II2pUE#x9`=avWa8tG6jGkMY7d`i) z4QSjMJipvDThE~X@1uc4TZRmbKDWX_Lwg?3!+UXo%F^+$3j^w6UR@Y44)D_L_1s&W zMtEa!{LjIC22J_BKBsiViAD2__kiK9u19D`0do&ikN5UELu+Zs)|fA3mob_-u%tI^ z7-0jmg?zTfD%hZl=`9#6qf2?by=@mJSdidlC5tc3i!O{a?}K6{9ApxQ8oXn&wo|d z*Pnn8UVZv>{l7pQe*%BR#uw;I>@&ti6XL&mDU9` zCbmvA+~K`PY|c`rAgbSew_bvOo)q!xGmtB*-(?gjI&!;R(I|^ur-$L!zsKKY{_z5L zUisGlfnXlkUf=P3$?uGPy9hkf@V#)9ewB2kWte>}!-iX8I>-r&7*@s#HFMz$**g4+X-g`|I zw|5VAwxN{(fB@PDFm{`VjW_V5{&IU~`{);H{?+!;UbEE#fnZPU?ThBy=H8KLy+Jre z&t5jg&UXFfPE)+vKSWUVy#wmRhg4Pmq=CJuAGP+O-9s2&>v-n~hw16x3K5pxYdL<>PK~~4RZ)xZWW+p;h5 zIEi`}WS9=TKeTSt`81d-(!4Eg)ejHq1=@af#}lty4|bfcu>%_xq&(My zL!w{PN~4C~0T!>}_WMw|2pzA#D$4V1U16qm%0s|zY_Hb7+gMpGefM3dT3Xqtu9i{y zgrfzV4~UiBi=NeaU+#cpV|o7U*kKiry=e9wyn07@$gu`c2+JMX`Z(i3l7XIZrhE`{ zpJtTA>zVIPovF##d`?T#^i8ca1X{aq4@BS=eOCVyym za13Z#&rp!(9Dyhr;F+?Vw8)V+(8Aab^2ajU&-2t3CI+=0AQ4CN^Q2-1;5l0AQXM1=1sEL@UNKGfAoJsgb;}LOChvV2d z-l@Z>IzBwuhXaP=Q@F6Xm4=%1aOuSUyaz{{(T*N&7;Q1)iJ>YOAWR~3a;He=Rw1?K zyCw{(e)!7-Y_>FgcJM;y_^`Q)eTOM&9lvZHZ66&UHO1@w{VkgIR`c*JuwJd_A&iHB z5a|^StoIzhzdQzPg;Pi=U=NQE5JMGU&3`5&+NeYAEt>0nM2){lO0<9Y3xdY^pw$Rr z&;Vn$VD=hEX0d%nnFuBrZxUwxdArptXlzP&`4`v`zevQY@Fy)-1ZNg$b;b58QQvyI zjs2J9VL!CC<@TZJYrK)OAI4EYdO@J`JnQ~JcpB0r zED!9_5Aq29M{+6(yZp_o{IBFy)FJXQ2SMkyTkaIaRnNW9f3J(eA8;=EG6!Wu?!Eon z*dE*EYdUPCah_3Pc=jC$3oG<*mHu4|WQJ?xZqTF0SLOxBtT}T=_xPk?^&B`yK(Emb z0(LQhMneW49ca7Ee0^>HB8+N)W#~HOREkhI+QF!X->cDwM2c(EGq2!>n;W<+&_nHl>F^+g7X zkdV4=XN+8_r53FM>%rH~ed1@Wo*zuSzJoA_L4#W>i@gMfFS40p+#W`GFu6V1tG;!g z%=68|@JU$7Y+oYJHxtJPI2LeLoX->I=Y+NMd3>dC;M|;El+8mx590I^**xl2gwspG z>}s5;{2juYiN%|Vzhl-bmBpKfzmpg`nZ=ujze7N&EZ*Gw9doHs7Vm-l9gQ)>;yskV zBL+N~#k(9(IFpBPcU7P=Z+Gz+!d4h`2uCE64)Nzmr)kt9L^|-Z{5aI(F$hRHbrV$f!Pt8nD9+{%dM^wb4X%duJz_jIonuM=UU*hED?Jnad=v{fT{y>q@ z&!;b@Nb#BUB}7~Zt3QywBoG(E>kp$ZUs8V{>BM8|4?yy9hod&;%zTjgV1)#iJ$r z(I=-!8Nq;~gaCofsY^~F1cW|j)g@0L1k5SVs!N_s2#D;?rc0hi2;}gl(SlhB0h90P zv|u(uK-*y^THp-qQF}Oo(=sUjf_hVnY@*KO{6W{mg=k%KEMP$}oVC%%8Wpzi;pzYz8 zXx0B%jPUo>(*NeGC0PB0YIH)!=qL3!zji~#@ziiPvk>q6JbA5oq{(Y5;4 zm5q8jOpAkKllKsGdBN8pMkh%EG|oS~lE)KK0RVIdwnPfa$6lRzw0+}{x~wql_ieA^ zV6coKjEq%|K4TID+(VtGGos&~ZQvFMwQ!i$8dFsG;|sK|#Tw!Df@y;a9Rf;=RxOi~ z)rEy~2C-4H?hpO!Vb)-%s0Flr8;ALvd;!&a*4vRTkC76-y!G4>>kAn?3`$R*^vR6R z4?{wnq;7_A@WSe#V_eVfUXd-Y)QQRx5q;q;rRlwppkN+78)g)jh9XUK-~bg31QFh9 zS=4c2p@h`HY9~(`;048-b_TF_DJWeRBcS->&NZ)#F-hEHc&4!Mg-!8J5~m_VRvdH$ zBx1%(Gdby=-FHze?tC0yViRfd5g01sGcs9{eM=UuEY1R|IhmB%EsURKVRds zm{|mxzxA%P!vw3ejgiKkOUL$Vz|J%>SRlp%t{?&1DB{8;o_q)g^Q2H6D~dyOSt%G9O2^UGK7nnjPG^24tmMI;BPN7UHe8p z;cqW8BX`IF=HzqpH@^*_1ixOOck(ue0At!cv_{vQbzul3A2>2WP=I=7fS_JFcL;#L zy~tpQvUc#;`1vAp;S6MR{Ov`?4<7mY*}ae91=M5x>qQ1QUW6y#1ixNnWC8^FCin%@ zf&rpkcckVf_zCdP2U}IrKjd?mfKlk3dhjBH9!>m$zrDzKWA%i;y~x~Ho_xaJXj+eb z^nQXve&r!6;B=XH*V(6}A+&!jxh0WxZwGcaD=skP0~KnIoi1k7*1xahZvcBh( zk&j@!(BRSj{!V+Vd4TX=n7?s4-ZTL-(j>tbd;oYBe>P!~GuwNuqdL9MEm462da-q1fmkOeEWjuj(Eo3sy#+&^%4UoUR;3p0Jq(R$x7bAwi zrUHq`>bY02|ArV`FSEDPQtRJ_?=UO-N3XW!WV#h*{K`YjOc!3rihc_}us~*Kzfs?5 z!kV>P$FE*(zoY4jJbRJZZM}ZAdj#+L{?%oFguj6fy>9Z8KIZ7iynEd|I%>YdQg>JO zXk_1w^s_d`n#9R@B}(tx@ZTQ(a}58KG>tA@yS=XMZDzy#MwX&aW=kb#$my0Y##esH z>UL2U-o%J8eyvi0hrdH%t1Q_Ou2U+>Ls>$by-mGOXp@NGt(1E)FoLpae{shdXV{zO=@@k?0JEooiJ8$*fu87IXXo&J8pJ7;BHiizt~Q z(>OS2ylFOm(#!lCHvw!_sbo_Oq)jO6&`_L>I`hIBT8F0RvS0cru-{P$L)3pHouSm!LR>!T;FQ%*5B!` zz#f#2&Btwu1K57E-#Ti`&?Uy>gZj}M^`yP`^5rkk=3Z<2_2!dxbNZk;SiJcruLXSG zUT{LT+HIw0LVE#7 zzC0rXYpqqU);k8A~02lIvm`4dh6m)NcK!Cg9~4lnf0G z=$ygWey++>6qsD@M|#k82S8JJSHu1)Nlg4_^g$l3SkvB()!SU5l2dv?0h0&_>Q>wk!iPo?r0dwtiv%* z3l7Hk`B_8hxHp`ptd?2m!;ul4o^1^>3;H>r9AxG2H=b}Rll!pyYN!6X^$A5rhA|%Y zTnmAq=Hd6wrK(UKUHz`U1JtqCV+;w$)qQUR?a4Lvf%d)TyC0IiBjxbiZN4xY4!>9QE*lWMtSX`?s^75&Wy&N5xEZg1Dl`lJk3)`Ou!&9c zkgb8$yZ_y;iD3Mh%<#sSSSo(bkOkkQC76Auq-}=)v*2(HJd+jJ1z?&eypunDUtlZP ziA(B4u3K3y!&t6VCyeN)xl0Puoec_QIRvVXlg&fKk|b_m4Qd0%uG`Z4P=8S^$i9^Z zwpa-O8#o1D^Q192>_SOJdG#c|Rrt9eWH&NOqQQ;qE19T7RhO-AdYacvE*>>Xg9jSlOf4SEkp{EylB@j!Q9fBme^J)~`H zu*NN-=s;~M!6MXX*9A;8*gU_me9q>b%V7nSCxWvCh^BN25Vo4FBj|P^x1<#Sh01be zr_tVRwpyq`s=xpUV!7`c{qmhFw5Kk21bm~U;2r2)ryEF?@j+)YU7J{Akx)Cc5SHWm z@1Zc9U%-os8QMG_-geKC7o{?rp$ckbs(n+ZP7m?MF!WGXhzr=EQep9T5&$K|CDt~i z@+25Ah|pu0yi+wJ0WTOnJS9S&F@`ZV0S19dDxWgI8EYlX+N|wGrfb$}Ni#X6t~t9? zipF+ICZmy5%}9WZjI-LRIXPLUBBM-}f+P&# zv0MQPnmCy7F@+(lc6xM9FM#jzk;MI=I-@$GxyfvR@F}1xUMX5Pz&N20nhh#mIy%TI zZ+4ja7nG6X9~kL0d=AcxDdAQQD2+1-T|q9~OQ5SGN$EKdrEUt=8d@ zDw)c$!{^z=>1Q%(r__vTG|qBnAzqiZUa-Ub`$4BP1ZK>W--Jvt0$(#3^$_NOzKYV0 zH@f*gWdFVjjx%lA1Y$>!-&dHJ-E%T)rnr`6LeX7%j9AHKiBsNaA*L}@I3nAiZv z1^@NJ>LT=ZpLLg;Sq+$AQYFHUT-@l%l#(d@_~VOcF@5~XRwt;F)Kxw8u{UZZq8o7; z*oWvdG^xQC<}#_!?JAQHuf9;*;CaA@N#x*L9sXu+>fpO%+)G^r0YG(>ETM)$nr7U8 z8u!Z7t^?eFs#F$Ht;Ev$;d3R?U{XO*+Rp!4hI3GAcs8Ba(iWV&ynN1Qx3t|Yy=A$P zUo7T>#^o^xPGdwIQq70@s!0ejIHdCw`O2@0uoJ(n7GdD0gWJ==Z>P}SM}cAI89*@U za_8l%MXuE~dj#trDW2GgBzY`OQjT>LcScHd;91D4h0qcb8_L*}71ba9xvH_h#$`1T zpf!cnShxOVaoW%&<`(`5(3ZqlT$6=fDuyzxt8406$Sv_zMInM4IV*6rnT@++0iPMYUneo1nbStE4)kNSvW9yB28Am3H4^51M+ld(I6R z;_A)qIi0N{o#@W?-s|IfYcrSoAitKf!GiOy?uQn>mX~kxmD43kV18PFBDK?M4fo+E zW0ei`CT%mMMw;nwY+j>i59gu>k_T^1v%jHZ#uVDuJtSyvEIy&dM$Sb4I(p0GqS&t6QU6(CTFQ?hZ~K$M0E9-7FRoPsH<1?O{a z1p()*go22}M9J#IQMm;i);o{tnw1PRK+|lF_`vD}-#{G;CZyo0L7t6S$HDQif*}gJ zA*QdHOz^#C=xhyfx4yUi3TB@)fMK;9YqEwQ36*X|=}xfOC+r~70Oq?XEM^9 z!PF738OSiRAouO&xt=_&kHW@K=?NT+k5*gHiT-%VD$82WSy9MTOKH%<%5R|>(3P}) zQDY_5so@Z*#R1)%X`O1RB%3!NXnGkLj@F8j)!SxniN9!AZ082g`HOz;>lc3HO_Un&_9CNird@ZhIm^)Y!v_n z;>GJMm-G0QO~_`w5eY6A7D{rHtNUEzwltIJyZ)$muR1~(!GyfNZr7~w$nCF>>~hBf zoT*w3{kT?NP|X|G0P3CVjLLXT>0hhw(mD)_3#pdW%qE$lQiL;r%^7Q!<&wZostG*{ z_|Uz$u*1(VOtYLM<7ppVr7ZZ*2Pn5r=i1~lSzAH;(s8SK7~wFP4(-3U?#tN}9{A^L zYxJX_5ulF{rqS~4-sL~Cn(mYj-t6!FVv?0U=E0@jTtj#Mt(`n3d_w*o!{HZcV`BcF zryFZ4Pow!?RyV5afBS!YjnCpgDC3uZ9dh%)6fT(FP_Q@1=w9sXVC<)z9YGNRTWG`I zJbc^S$_$5X&%SZkSOn{>d{_N0n-LLk&l12T!7D>eto#_^$rc|aJlUcVo{YNo2ocH_ z5jA~ggtEm)ict31ebEuh7FkqzjHsK7Y4MxmyC^BaCiKknPM_+I99^*ZI>#x|Pdxcv%V!m7~$AcDX@p1yMx|+8<5i=0%h2;3aO2*7N*tX|yX7w{n&AFM$1R}w~L3?k%-Pmc?_vi{UI+-JHY=?_)HD4aTHp}vI z#tXt}dF^J`y8U}Wd&9MX|^&i9b1#BU7@yLBJAbo1*CTV$L3q&xPADN=(8t9-kHy2zVB_sJX-&4_*>dnKodBM!ifkS0BVBQJl0 z@^bc-;wc+03nHAWkg$*(rL$cSvI zlpACLjD`Qa$f~^Z*vkU!A^0sHbPKZnbE7V;S)^tcDo*NNnG?V-OoJxDIfZyZ?Mp{k zG}6BF;P&HSt!Qt0Nwa|1JJN~XgF6udCZP=z<{-cTp@xSKZrB7E8~07pxaA3q^x)>f zJ&3}S08f8RY8-FSBQ2l)_~53a(9qTP^)_xut zWg%WqF*mE(=Rv(lZJZgiQDKs7T{T)8@ah=Eu#SQfp4fth5@DklUSdD+I3@LiI4)!G z(a{gw5|Ot;q+W=Xc%E2Ka%hEUJ;k|k%}71u;7Y{7h3grdU1B}8)1v*no0z^gh%-#6$Gqf(dcatg0>-kS>qQvO#G%TQ6l+v*oqAIx4i(r|Jz0Jss2yf! z6C0LzDRvS}{_lChXeDEtRF4?mw0ek)qI;HkvCxi<)+>nc$zLuQ7)BWxGH*i2C0uM9x?pFubvs6iy{tmBS-Qga}002COyn$g7+O~#A3 zaD7gM>bj$%=&~=kj{r`UW`g_hqcTZM>_gY_0Yl!i%G1=e(0eCFr*$`=ZU?P{Q8}+| z0I(f6&s>y2^dzB9Zl0$=g-XEzv1XU&LFOIdvWjXajKLk`rC^EpqCa#!Qi_w0qgh|I z6RVF=61{tv12|F`9Z!x-mN$R|q&x})-v}AXKv0Pi$l=23=)@<$z#Bw;Q+)}#VXPtD z^$S%bXrG98;!Kjkw5-SeO2X06y^4H?ik3J5ETYJXu=ovcT>rj*;r4uvB%obGFKmn# zk%}IS56>Y^>=IwlKy9{GcLqZ7p+={|T!h&vcq5EAx-TPlmVTV(aA%cHbMkZ>jVOZ| z-InA!A}21oM*jE$N&#wfJqizcnmgJ(Kra7=Y>aSj z8-4Gg`UO|aOB)=4rk$v+8rXK%?wUHfjZO0EzFw^mu5u&+VVTLg1 z8tMP^Aik+Ae=>AT259kpWVqAYN}7g;gI-{E)U1!|-gd4AfMMEnnHbuQm`ls)*li3* zz%H3S?JnQ#+i1dps(lWUBCJc~E`#j`*t27kG_C&-Q_yU{R9^BKmT0&_4L-wX%JLty5;xGKxoWZXj4|h!O(7lSBcouy;nz8v>BW))s4V&5RjuP=OE|d;+ew% zxh|{NE4veI4;9RTH=4vbM6X6|5P^Z(w{=98w(GS$TS9rkI3>8iqDLl$QVSr_e8S;c z)DnQn5t{tIaR3u!-7w{#A*_Vaxg3cWNkA(1tf9z9u15117jr?Qhd{}oukV60qf223 zGV_Kn@!GFXB|(M?J(lp4+B&SqjW6|U3<91Nb?~A6&6+s7gW;7e;e&+Uqxkw3k}v8bh87CfSKBypw@flbhBlbobbwVdflid|1~Q@Mj+%$Nbi9%2Mv}HfZldn65cax^I3H(t z5FNJ%N3VN%wRuj}U{ha;^>eelQSzcUw!=lMX+<&6{YaK{hv8C+goWDApXB2$g^ z{8>JOQv?qgS24N`xFV+SxDFTsao~nFfVwdgxz#MGx{O8D@35W-0MvrQT7ooM)*XRE z1w}uY!}=t{IvP)544)7`E-RACq5{iJM}h^-34RZlhK(9}ris5D3ezCgE~ zvJHQH;g6gVA^^#}XvK5!nMB1`O;&zA`St&tRs70HHg_KAyu*+xzy2Tg z!wQ~N;bDa*Bl0Ha7yrLpF$`4i>Z=diuOdI9IM-Hk6gN%PG4rV%4(76C9Gr~??3Yy%~8;Evqw;XuD0@m ziz)y$Vf9b}MY5*U*E04uKx0jz8_?TiJaB#++woari50+5EM7TQe6*?O&3q>(&m6ym zkP8=+^TrO&TttZ&Zr7F~z11689h9V_n^#={{-{4E-P{FdN_0)CrUf+P$E0H78>VvVKMXy7aG){}N{@4N=b127=9%V{K%UszqyUqSygXhb=K&Om(b3-dK0U&!EX}Ud7|FL>OAE+Hl+3oi(EWB z4wtVdTNmHMI;+N;aGf>vM$d+Nvu?Zz*V)i-ZXEfn_IKaYWR&&XU%xyh1yvUzcK1;m~TSu zJPE%s>LkyFbRU^22!XXd{JK6#t6(a`JBk$znbzi;`G>Z?ibjrwYef|}v_>q+m8 z`WxZ*vG$)Ny*KJ7PaU9|lG9C_JBi!~K#mS(j`n1ZRzoo+z%g`zo$R2~q{4H75RGq< z6|F8B67;7Eau`}QiOW+dFZ17Jt(25YcS#}8mMi6t@L#!L2ExLg(nSv^;~3zjthlC_ z_5V=xGB861KqVJdXZq_keT`^GVs$JGMv++5pa35(;{yyn(P_$>8q1ivG8tq@Tdw~Q z8I%Ui9tAE92;HK(X=3?A2~DbC4X+O!%E4!e(dhoiYkZ$<#`U)jMr9e(*DpWs~E9QYq15(34hYsBtRPaz-INh#2 zAbZbjHpENg0T!VMDOqEO5I>rvMK_P5b>Wf6qrPCoyXaiCl4ZS1@+i@+32y|k5Np*U z?M6*(jE2M0j#H%CGF=^b>gY0*waB>-tF_Y8jg3#yrgTh@7{i4eBQ=z?K8o=IAbd8^ z9EAe<2M(TS9m5J^#RP+p*0V5qpmf#L_i*8p;+q@i8`?Ex8h|$*gl{&i+xIAdJrSE^ zf(5L*_`sTmPg(K(Brq`%Mp@6zuxjahfWynmqr*o5uV>ce+?VjYeps)SN}ojhh(x=X zNnLW?h1i-W31P(gW9&}{W}34J1?wnLQ+xvkDj4%k4fT@#$j?4(u5>rTGd1rZd0e6A zYD6D03mOGU!?o~!!ahqcBD{^WM#(P`)+g~p^2_qTCdm|WbK3h9u-x^Y-^LRGNa}q^ z8s+|8vj`MMJ{WtZ+Uv$`?~6d{OFxKWahQ*zcr_QSps=Jhk%O^K2k%)|r3pslG{h$v z9jM|c;Bvy@4F;Z0`QmK^l!r}FajL{+%=R>Z5%OtLd-XEzI~97Z_2XV2QE=#;lt$Sn z3Mgs9OGAB*OhXvkg!d6oZ+}7oW4d`)&@2aP&n%xu^|pOE*vy50%UhJ_y?|Ll4mbo< z-L6Nva!9UceH-Z!-`+xqH#vw9fa?4*&4J|&V&|uQPeT&3ZPf)>b*7> z=pt#4l!Q-?qt&TPxFyr5q!1~7aW4+s-u;2RhBa>E!d)Q4({Nu^j}w>_IcKP7DM?cq zKU;{rRtHnsw4UZxM7ToK=tn^`tXgJ;X&S<$K;^i!vjSuTi4UFOs9Y|8gjM;J1X!;4 zEKt=2_%x6@FTyN9b>XRCF(%1q7LZg>eDH5N04@cTJDd%YJDdoJ?vewyu^B){YQ$kK z&j944^xK)bofIdQcjceOt;V>P5RolArJS)1r<6?CU+Fax7dgFn%C1PS5Lxp{1$72yXRcUfb8FYUq;DWU!I@hg!U*trQxz}w8@;SJ#fcY*MT#Wyk@1snsFu1 z^s=;QHRd2;`nl^E;gx+*f)K<(n-1ni!PYPxEjOo|Do3VAo_Irjq#M&)F0>I1IR-PA zp%+o0XhLCHy1*l<8lX8*Z+LB0y3Uou#_xE!==mMjljfwd_sb|7;5}9?`J3V z(*K;Dtdzbx<7?OaNqhM$FI&E{N5fmpd8?a7fx7gn23ukcWomr)0TId4KPXOdK^i%s zCW{_y!k15?xwjQ5recnM$|DTA+{55+-;0Vp>Qperz->2dmOD^R7r1YTi^Hvn9SCL$ z`g`SFP3Z5{BlPzw-e0~RNbWAb!@gdH`WoGI*m>8qU*w&aFPHOjXrZ^F&9(@5TQ#^c zZ%3c=_2YRvsFlryN&`yylnGw9`}WA%^ou8__{pB;PtQ+tr~f>Ce!6s8IQ?+?>2&e* zn^SSRa8{%e|14fn?V$%UdB^Az3+55PS#sf`O($>m;eVOjGGSi>%xVOVU;MRPE*5ih zLW8ql-f5e~=o}kGqf@G@=k+(nxX;rNe2BwGSN5z979jmO^LjuSQhn*<*P2*3t6^-2 z?_Yd>TK(b050xu)`t<4dQu(w{!)MvjX%%1vT`FZyae>WgHyy8)zn`Fr%Y{i5SB1G* zoBy;9IZL%>x9+Rg+e1>0N8=N#-y-=%4KcCFuXVXrxRERhcl{UtWBj4mCrV_ zL9q46oz1z@)lsEQ!>F=mEj%7C7MlUg)Y z_X)2h4;nCQvm1hsdug#rT z$vG~W4rdCo>y+?qvh1kq?kk&aPC?%TjdV-W0B$l+3J5!oe^J0(?r0Whw*;L!ciNV!S;V_b+UZpZH^t^}YK|nu z#czFdc`8RP9)?lp`J|8C9$IWDOd!)i&zNmGaxajjbNJ{3aQ0jWUw+OVAr; zPqNF|GrpkYP!xe8Kza4kJ6eA8x-L9Yvkx_qqq_mX<0E5y_!BmyVYZ9o`kb!+!_>2$ zWj|_DP<{&|D^4z9zAe&3OoLH0rpug?pm@q;W=|$|Woloic6CxuV||%03N|mHJGj^q z)dbp`1S=MZ@CjQ2tEOxP><_wQ-~xY&V3f=FK5#BO{Vx2A#ql})W`>Z_iPj>?jY0)j zNAQhvS=JGywE!V6-HnYsZZAE0~Xw2*vZ(^u{E;{%yY@=(%iIT*~NjE?(=rh_>cFeMP~jRMxH+&Pr!4tSij<%1Ui)>hL4_8#k|w-VIo zJ+1!V!%zAP>hy6*ruBD^61XbG@F` zF;7uq1qgm|aPaZFgM*E-9{TMAAe}2yz{_p(7GI((PZU{3*lvxCe`iJbBCWFsiVGLC z#VK0Yi8}`Aoyc2xS-(RHObg%{@Mv~{*+%u4w!2*lphVFw4C4?JHVIKcnXt?|yvQ8( zBt{d@`#W5`5*T!O^$F}EkTr2^-g#7vr0I7l`tZ)l;DQWG9P^p#lvti!wb=P*a>+2% zF;dbwaGmNMiiHCY@cTAKK49N$O#%sE;cRETQr66K5kvA`jrc{DFKG@>obOeBZJ+!g zZ`T)L+|vHTA~{kG$iVJ67v8z(o*;}~(*}JlJ8Vwuan6n=c7&n?y%I-8Y3oTpCeMjD zJeI6swcJRRMDndl7tDt2M1{cEKs*((9~ri@(p4CTtFSM3fK=B!Mvj1{M*S4>y}(k*X_MoI6kyT|?OZrZs9Q7g~u@KcV6x=cf~aImwGtBIVcFYq3x z`H&*0uA?#!gNjfpwn5gxEPNQRXf{7N$(4)-Q#Ca<$^Ri%sdE^0)~J1dXEO2o>P|Fa zmCe_&|b>&0A14`#xojBd{d2ce;(ou|f5TnoGatk!-zZo`mbZ`5}OozTCM@SE3!c6ZYea+E#KKrG2#{JbR%$ zX--KiFM&{k*38|BSSTX(cdaj$s4Yo#L(94w8@fT|poN=mznm%Sl*o5$Qy)~;DRl67 zkexbV=~NrD=blj{VkyYb&fTKLDWSCd#UHkk{aZ*fFvYZVP?Ev8HcF{QCm@((G}pLH z*N(Hs3&)+NCNpgQ{ds%ZhVu|7f0GcQ!**t5Sb!((Cd{u@>ecl$IT)Fry#~*~d4`?~ z5fga&Kq0Z|tA*!j>`U&DEe(b-s%?qjPhUXR*MH{|{c2(!5fGmM@Ee^0=!={J@Vjs| z{7R>|TT(>jh-scT`8;jm}v}&50M*=24uo%YcFhwd^!kaX2`bHP_dmnAIBD zeS~(xr8xE${}}j_*Tw+!n^Qa$7`bC!~`V zb(rbkd?;!YGA@u~2x#xB!%teA!h|@0D>F&Y94N*_N)F#Jmv%<=f_}E4U%6q!<8)lr z?LQv2$DcEvDx{X((_+F5)Q43~>-Bu*-1(je!nhGe3PW|JQ*ZIk~BVNXmI&?f%o0UBbEpiAA1& zKwj+N->B`7rAt#qj9)Ax|A03znxZgD6i-tJQ_bjbn+|gqhR%gY%QVd-0mysdIz~Xo zTgRC=PBbb9bCyI(;nrkXT=?2vc3P*PlH1rkLhcvcvd(d`9cHZ~`hxDaPTa#I9}$Ny zp3vs!wwWyteO8BYG|5{8OK2jMoqU8k29}fX@CFKt>9RD-3qt932vo)xkZW?pUppzCx>`^R<#W0Ek$6_Xemiqu( zc{tCeXtF241Ibjg+(0*k1aC{}uwCADeqX`AKm4Er!D~>!;DOTbEBM!fT7Lz=fKU{6 z6RXDW?7gtDv-yzb1pjJmqBDcD2p5FF4Wa>b>9Usse8N|(1?O+bD+vZOEns_jLLxV( z$6QDikc-th#;z$3VI!w(u)!T;M)GaL>zkwy_huyQXek&*|L5WHRLePJ@!-|?7o_(! z;{B#owr9=)b__=aW{QI%Cp=eu_OBLT_`g&sr!-7#n*TMaFvgK05*@(3+iSH~z3{uhU1u_2`K z0+VXx$|XdKOJK73Vi7_bh>@w~^3G>T0ox%P?zT(xZi*>cLXr!T93$Z=CtSluQINoq z##S7CmM}98k_-bAo?u);Y|wRDT8j552(_n!Nl@U=D;OMf)!<(@^-cR@ zyM7HnfRINkwktaw4vygjcmi^Dt5VC-t%`}{Hw+Ax*Z-nI(c}Dd0J8!1^b>WKN%3nu z$1Hk_CzplD@sP6^U=ap$5?TN;D}2W`2V$6oKA+B=k%>Yc3S+PcXOMFk zD7I+?i-{NP-&&dSuDfoM?+b_GU(zgfp6$9ewe|T zxIJt&?w3mIYJcxn46O|^9pGqTUa_?jc^3jSpWs`Uy$m7IV^qQN$x_m+naPU2>SQT@ zOoiEn3h<9pEcN%(9)4B71qj`o31X5wcZU8t?TEW=d z+8#qf@uY1t)NV&&L%CL}dHz0T$&kW3P8MfscnA4>G~9_I)~GnCjyi-R0gTq+$*|qe z6tQ=8s0T>FD#;FEy!%*k27;WAOTQt1p2JxmzK)gBL@n zW_aNv5~a;yd(BFSuC7Aoi19b#ptDUytsmflvXSIH2~@If!yJpkh=2|~Z^NavaOg_+ zZfVPLGr^@o1lCgnM5VL?OF^+m3^M*U8AG9A{3*~>vA;Dph2lOYE#B7;F%>fItFjGZ z=&>WWUx#g;zgtbd6<;e=uUpq2cN)8Q@7;g!UN zL2uXvws5JCd75PmWS{Eh->Shp1zY8-!}j`C^X8#UMtX3kxpm{@H*H;4E&O3y5~yl; zd|*K7Brl*g(W-z(`>9ov6i<%UfgW7$6g}e&UZ%YKFs#pBZ8|H)eaaKud9vj4KTb$t zUE9#%Z4R)xeU`#m5~k-i(vusS0R8CO%~_(Sd8DLnJe4#(VSk6hLfPdAy*{ao)6*rT zxc61g@)d3AU{OoCIF%DRdi6Qcya(|?6+Y#SDyHmkx}eWgW>CgGV-uh+`VSp@2`&Zv zxL~9-WoXLB+PHwhlxcllmwC=M%RHIkH_;0IGVW``cVdPNZlhy{7&$^^lU`>)hTJ4e zi;#;!vNYLr!0EwFIS}QO=t`Ac zjgxo*ub*c+#TcKHFvD;_T`q!PHE26#_fc?uJ5|n67*R39MZaRowxIo|aq|fvRf341 z3%Q#mmdpV(*I+CMWWiuy)1FQuh0VqW<25m+6T#vxrICKV2VAo0D=m?@{!K!x-&ir? z;><=av}3tTUCRZ(BUVJp1sW{)vK|XNG|5HEwIq~scj`g8d^kIgger2+CMUlIg!jW2 z`GFICz~ZrUG2|v;lwzd_iAuDlTZuQD1b|+Hv;-3OA?hg)IWlwUFeMzk>Z?@(>(e7* z0Q%7h79m!UXA6*@+B2HvcCn`M8bR5%E68cnHJ|DjB^srD@ONEiiA8 zMdEe~#O_h+5H@uDr{6mCGDu;_Pnwr*>YyCqOCWbJA1 zF9=%u{6daa#-@@Ro#_;WT1_cCoTw*ToCk{9A}`!11catfTdm%e9c7)gT0{UieU=fJ zwQn{>lE#5iv788#Osu1v8LGWLAY@{zAhWX5=0w$kMUaFjG})|gn=3C?3q}6kl{??QDOyz89uHfj8 zJ=fyI!KDbe9!*ZZW)bGQ^X*pQ$rtxcR#Dk14k9T?11us)Cw>Dsg{u>ptkSBW@7r|N zna|K-WR}wDx=x#^-+&3>y| z?WDtW+Ttt(MA@wkzkO2+Kvj79%_u%^k-w$#}E;cQfI}9R10skxRV0HDLEC3BV z;e%?w9h;ik(J3CD&{Zi2T2;MQdm@VqiW4_+FB@6w)f-J_mx%|-OWTE{B^`kr`Cy|M zOzOj=F_^v&)7LOY{+JKCb&My+u~4Bee^`0xsT-8rl-Z#5*4?TV+O(gHQF?1aKC+tQQJ1F&5yfx zA2`+9N2Yq`(X#6MOR6WrB+gV?H|%Q+$L;B$gAoRWd+ES~*+b5gjk$0$GJtS`7CPi5 z21cP3Nl!z|-$Yb|_eX)^gofQM($_^es3E*JMcl-xJe5)RfLIX>SFY0YmIRfxk`_NH zcPQWOty0e65V;Wi&hZ;Rx)+i`W?;j%2}a+D3!1}cH&>y%s#%3 z;pa`#kw7M=Gt_&F9EE2Px0-I^|TG-RE?24=hA96 zc|t}wp=YP4s2_KnorTJD&wY`Kgf7Q%vUok#IBM-P5bVBm{#EA% zQ_vcRX!xe|r=S_QTnXYoQ&^bQvqo`a3(GtAy75YYJ5!jSj}|JMT?<9Jf^+&u1jwYLrbo8EiJyKezGsHctMfZ89OXWx5LOcK=nh zTQ*nnz+Xi*+{i4|h=yNGGVZ-YFLzlnS3BezgglFeGk~KB_q%L%2%C(@>SrmBWxI2# z<5MaFy$wC&!xdeE(;1^prZ_et9Nz>QiwwN7hjP7(PH!^9O!reN3g;;b{y=w2HB)%n zrqaZBGBl{7cF?u|Xg-_`CKz3GFp`!~P(4!?ppkt_qU}KAotc1xvR8BBg`5I&;_*q2 zF~LcWk_sA6R!DR%-&f!LKUE*p)s-5fx%^F~V2`zg&h609*fm?pmBdTF2}4EfN~k$_@fPW&qsc%6&Gt*_*9AX!@*nWY#6$jm$% za%^_O;-ii^2*cebP6Xo($82pY#5nax>+1Mv%U|$fQfzFbgB4CDdS@L?EDdJO^RzVx ze)l|MtRVvSB%dK(S;>sYYuPA-=XOkarPMXM*=Ih zcLl~XLa2(V*t!Lvk7wu@0MGi&!9w zAqs#gFl>+et={$<4KmG`BLIh>|c#s{U z8DvYF#`%Nen8zVBJUN^gZ-hzUjo`PIffJ?G6L^cNX(Br&YwS_sDVO1}*f?G??)tix zxYFEj(j*1BXwq2**?P|e>CY+2^)PGCFrC7X>fcdMp0Kh~ux*A#>7}`a@>>8KYj3!; z{yj4wPteC@aB^vs7fih)3dNSOLX=zgLN~A4X6jU5DvSWxJF=>uci7^0&koQtftY%c-|)}Y1Sh9EZwPA#zW%ZL!>4+!UNLzzs_>XpHZ|TTt|jS2 zQcH}$bOKvrwfaP1&R{L&rn7@t9YI+G-1kTzNNzTR;{*m4gcTrZfr;GA#!$XpO+5Ce0W#hsnP#D z%aNM=FLDdEuI{`17=sX!ZjCQ>Nj5}L5L38MFti`YSa@E+OV=1O0ftF*f?fu~B(u$$ z`a51o4Mytz4{m*3bgKf&+^glW8G3qT#3O+*%IT&vRsaG=-o`kzW6twgNF5wLNp9b* zf&AL2-pdne(*lPt?W-J#-B-a&|CN0iEWxZdw7YXIBATkA{&Q2MlU8CBwpHA0_}O=f zzwWjFj>XI|iM1h<)w-5!{5JNHx)1-QlZvYUc~B=;5I9V1ZXDFF%bR$Xp%q2mOQrSO z7C?9e-GJlL|08$+Kd9Hq!Ad`Z((q{0D{09@f#|W{d9DHHKb0ytbHlL~ZA9rREs2=klPgtXg@ug;YhZ(z5oU1aQC zk4N&G?4LSKQFlB0XKL!FnMXn z5Y3=O=pcYET7DC;2Jjp^=oS{(j?q=1MZnk_472f0jCRvwvZa$v=|bz}-m4d4b>8ir zj9L%w-J^Ms8HoM=c>QYc&EFnsh#!Caks!JT;`!eD7tcPteg7X11>*jFYxS9H6wBhU zO6e-vf7Kbb;e63jhTz-n$z*uBT^1^8a7Q$h+xV&oh6)W7u@&&!=s+CsGyqRq33B8D z=zaj*ZzU28*@2g~vttVMD-Alu+7)=wH};P*8gvH@rzbi;jkMT3x^}LZ8ubs)e%S`W zTWgz?(yu=5-u*;x_kZ1cUI23MzJUBz2=d@Z2SiXE@p0>HcA<`8naCYo;fRv|2y}2% zINLN$zssdn_Z4vZGTX6SXKM_{ZcFntvM4oz+SZu~!KIr;J7r7#{`S?=4=~M>;5A!E z%ttX0E7j>IMsqkVYQNAmsJ)DTqbA6PGh!P6?W3F^V%&vG?v-Y3tM0Zv`97&vG@yy^ z>e@{4dgh<91le2)TPLQ4{(6<~sP}!}>tKNRr@!nm&$G^-1(KUH+KXu=2X_(AJg_5e zQr3s-d2l+)e)K&&ME^tl3o``Wq;*h7R(<8&0!g)QlC+|GBRO>*nhYo+ zxReB^SeVnk{y76?dMGclX0^Np;=Ix5lpSACnGS#b?cJvGTtsOU_uhQ)AMeuR|MS~k z@cb@4|J&ZHSN`*#={dTY2I%k8i{JL&Hv&XE`o(VWf?Jd%n>y7)&K;BP2%IvUpR315 z!;<7M__VbI0Ujz{BpWWdHeKT$Cv*tA*(QO=1+z#(fM#rQr36rIV2;&pyEjV5n=%7@ z2V#tZY-~P~GM<%j$JAS@UF(?cbVp1tT{cK*P!Ey=R^OrUHt3=a0HHcKI!HLNm~W7e z(dl)@D~gB(=Py1c*5v}!@&Co?gegU<;aVn}gRoZ@?NJ4Ev~9YJRnfZ;fEk1Y^P zg@ZC$j$wAk12Z1*@Ja@v`2!wI56rmSsOmnl?E`mAQ0n+ug>*%(bAzb#5CN`Vv7r3K zcRAXx)nb#eOL5OQExPM`4(n&yqbn9&#x!EVWyp;mta$kZhG~0nq_ck04Wa1UI*n@M z-oX*jbpRV7z8!R%yG^tkYMLd-9`eo*My3Gtx@4NZ=;r6vZO_$?b|2*%KLjhas^e2^jVvZXoQa3YhHH{k78p| zS`oRkMtSW8m|$tjvRga=gm&o&XsFx}m{!Hcz&1IGEPqQHzcV?W4tgiO3ySAJ&KdZH z6qhXFOi-tC?8IBw1rb=PrQ1aL9*1MQ5dvfDG}n-M;#$gG2mS|9&c<(F<-tNwzo~IKwYQ)P4fb0#^37RFP=@59FuJE`YuW-=r1B&PHXAG-* z(8-{H44qkd5?~Nk-+2dBR!8LVes9P3E;-PEbTKka@&1E@l*q(sIn#K)R&u74`({ex zWR8N8&$sMO#xy?{OGNb(K&wcx)Q3NNJkAqOwiXNgPHKIRn5X#L#XnoOF7zw-R`YbB|?c zm{tUW)60UuFS>%EnInL`GXlhkA9@fsXv@^i0Y%&WtqHpUr4~1(oYFp{W zVzQrV8rWG)NWhJZOd@jUM%7jh$pWRQvTw-G2xWuGdS_>84L0$ z2+PE_{V}fi4B2q zR<+^vC2K(kV>F^@b2w(FCVKg(m__01vXS2&`Mk)5BvqXA@o*}`1$AiX$Vk@O!#qY? zw_iC4wqJzNZ=-|JaM~ppzr`voz`bzUE@{?+Drr66vdUE`;TG~%e(usPx^n#~66ds$ z&ng3NYQANAmhNHk_ADiqZO@m?o{4q2TRekIHD5fDY(tkcqIga%ZNx38<(Bnkn7tv? zc4_)(Wvpf4Y-PUR6kHK4E49*OGw@%6eJL>l>?Vs7X}&VpR(fnrti?EV6J#}rh;kW= zg?NXrcM81A8iQ1Seo7%q2^#axjzJtGW=k8|#VjCpbsCl4%*Bj8@4Ds!%gG054hNCt z_9$9eK!u{FX*tomGzy!xl=g^*+6H}l6t7^#_82Mj>l!p4FKCjfV|5yRt47HXM#&U! z)VlVR;`V#_D3Sx#hA_ET`YM>u=F)9k z&vgzkbLyVWFlg#|Pshn7=dSFM^i=bS8iH6i_4YDr4Y*i5Gg6}S>l6Lr7}EL~M*6r3 zB38gxB%|H4R@ko?n<=Y;O(4)znkp>Gn91wk9N1%WNyM^P>27SsQD#MDXNpXs)`$73 zI+IvSl%qS0P{3;s8)ntoGJx}Ow>MQLiVh|yAUj}8TvVbsajuSNfo+z-OR5?)u??&r zt&LX6J%PLHMdQd1QJg+jfvHPst*LHeXA-Z$rC1(I#BdXDTlun(WA|uKzG!4hIm`NA zK`EDOd=aG(!9q&KYRFN_!?KuCw7`8zS#2M$x|*G@CAD}~AWgYUeB2ijDkz*IMPAb6 z!GR+Kalpa2Gn{ut=RWNXQ}mDTI;`-!94i8jUc=Mdnlp@J$6-g?eo)x23*V6k$jvrn z?fEQ?n7>4jkeV}@Ogf4TRg&w3{^Bn&EAV}2jGu}VEeS@lb4?G6O5`ebOK&AA*>Xy< zy@_%2MI;0CT$$tL1v|0m^df#|3M$u0MV%^>Bv;=!#cUp^x3HExwz`KBO>>+g+M=5H zt=G3)Jv!5j+bvVg>YZ9dQQDlyx`<>D-%XW+#G3`h_fr%F#q|j!*GbRGM|*?e8pTT* z7ipQXB*M|`(hnJ$^_!C2zB*9Vf8eD8h!xdMPc(iMTNSK#dK{_Tw=)s+C+z{{b&D<~ zboEO}!Fk~{OwI@sclEd>BB1D-R_#XGL<5j_xYQ1*=1Q>{0b=J>10u&PVlV$n#b1ra zG3F%d`Of<0T$9gz5-7B9s+A$^H-#}1q;z(g&WBw!!x;J~QcN=&e^?#&B>t;Y7B5Ih zqxVpq%%^^cap0>bbbaD_9pN>U+&x7bgLA3sz}pWLB zPNJo`csjAAyO9xLM~14&0OgmbmyEzbu-AEhNM#DPk~k;B8)}pLDg+@%@1sPC)2E)E z$H!7?P^2%_S#B!$NM_YS( zM9o1G`6sj7^GM8QI}`_$1+gf=D1LZ^9Nr5<6^ZugRM+w0;lV<98es<>hI%19%>Wla zOoc@S;G8he+WlSuNN)CUCxRr@H*3z-{ehc%f^d7V=%{!QCXCP@P4;vWrFy`X;~`yx zM!=3njZla+-bZmy3DYR%KM^8%O!k{M$fjz%O><~zEo%!jps{LO4$4>W-W|UC+po`G z?00E-f;~q^)-64^{nr2VLxouP&*ch#&LW?lZW0xxfgFpghIaL5~q@0=r*aSKBI+@1>vh>teaSNtsstz4P>+M zaKWK%ScnfUaMJ9iYJTYB=1uHK;04C9^@)^|M?o^rWYXE%EHyb7jY;blJrqY!xL);< zx}fb`3;eiucT>6sKdSfclED;wz29)3-*2ek_3q-=9@hJJRTSz$V<}Xm^X%-Wyx#a> z1cCuDp^A!A`a+4(XOfvWMO>@YD#3(ugPE}VAYpLKb}92KM~728u6q5MXamIUPF$Pw9nY9y3h)gE5CFavx8F=cRV1lg`Jp!(j>|+~wSu`1~{-QL2o)&1!v| z;;$Mt5Z_JuQ%V)18;#F=0%J0&;o!KKa580fqXL(^_BfM@6K?0ihh<$q zdRW%=f`^%2+4y09eOLW07eOrR1_8uStnJ!hTJAFxDu!tAnzeSl=jlWqqvG0mgGuNI zea;r+JU)Yp(`o+6;jGjO{m*C5+B{4cXoE_A0Pbq)2Am-HU+IwiJwj;ZQNQ1?FaXAFY%!y zzzg2kfLX!H0U*pq)e|eJWua(bxMBLR?sK(RG+3gQgsj9*2;jxkK(})#Ri^5yCW#%- zqnCSsynaF4&748R!9;@(%Ylqs zkWs4)!|aa`ch?<8^nov}tL$8d5j-D&6hdiZ=i`6O+rz=hfYKe0Kcfm86BVB6i+(EE znNO#v562kzC~$0K>3rJh0WGz?D+lV*h5>^yYsjhad5>c*0zR&buJK3sdjhK*@nYiH znjS86fKKd)ef+MD;qkLsD>2bu4uA(7Bu90GbcrwL2Ob$%(xVVX#d6WB7bGV9{L4VM z5`7jQ%xc|w84587htYA`Zp$Qwo8xUe1^Rd5OgVt${)C}TtQfkZ8Kd@bRCvp@R$Bj# z+mW53Hv01Hq6CjTxoY{kyjZ>9pIM)@oL-&q1FD zCkhSSkAdBN<`lfNck<~HtC+*y+_Dx=;vYnZ^~^O{0x{a9D4*sDnT4R)ioU@E$HGym zo$Gs>?r*7-9aPb)7k(u^faY0tI=XM&3qvU$+Ewb0*C&MZ`{aJ2{Yxi#U~RGFfBXZ9 zsee%1F&kvUVzj598=dWh2GkvD}x#AjFNpHAK=>L&Ka*Oa`z@U1DJAH@f;u^ zFsBvz<>KHsN~mnNQQcQYPHG@bti7YItY+@owDwvz=O)Qb8d7XE%nn)0^T{F(NiM98 zXe{4JCJwo#=9CWGEM%1E^(VZ?5%0Bt;yi-`FJ^t2c53`k3UjnI3wqX`N;D&2npFuh zfKjC}yv3&~oY_8Nkc&f!^ywCao|uZg6GF4PbE8>xJ`PFZ^ud}Ha6k&S%Hi*1u1yZI zuFy=;9`^tG;?=8`^@=~WDuhfTQlRbE0mY<|(aKqkhe=Hvy92|YxJ~;S(yI-LI z7FdDdU2YtXFqA1jhOvPj)q!wC+8R7g{DxAc-|KsV?_k?GFgVwQ{b)*Q8xbO}WDUs3 zXGjm}tvA4h;O^{1c#J1@7H*S|JvqWDLY~Oa((!DH@tx04dy;a1{Y*_%1?T}y33LxE z`?Ibb%q6|2dI6~7l7KTD?v5UXz0Dr4gXqu%EtyfaLsoJZT@s8W(ZEykcg_tQD>?6K`@eU^2pSS_EV={m#QND7bfHbQZ;^#&qDH0yUqB_=+pf@}I z8^2e}iB*hvfjE(`WJ!DTZ9Q=URNZ(n*I~s{a?6~BfE$o1H!t#?h>fQ^X8D`S6EkT6 zo@Z(wHc33(Eg$<38-CXLU`JVgb+8~hG*L>*hzlxyV3{7o8GBRJwwld~{P?rBRfk^( zM+Gs~DXP&C2yoR2^Jcfv8ZAgaNml<;Z5?b7%)utqaZv8SgL3_#QJ-L3q<96sDC|t; z7%&e>M1!e6POgZ8N5M}sOZ9_WN^Z!|4_uDEf)KZ;49ar_X9ZdqE=Mg|^)=66kgKqf9y81Zh?DIC+l` zD`g(v%1tFKZ6}ml*glPxwFe-t9#Y`?4N9U7YF6*>+$2$Swr0WRG%$%ZP;f=4BDY>X zP59v|y<$k)Cqbt#Yh0LI?dHnOqv?uuYd}MQT+If;olWB4<17Odl$_(DD<0-G6lIem zjL}gHdOQCvm17xfwA$X_2ReF;g-q$u{fC>u4B7F~gz!1=VtDT&+KD{+B`tJj-HwMO z);<@w5ZdQ^PGo9#z(e;Uw<>2Qc+U%_?e#S&`*<5cyJ_cb^p@S5Y4(RY0yzM714dL; zjX;p~F3)}b=FUiFb=k7TcB@uP2;|@c2Swg_$YdjYi=T+fY%%1t!`%nyeSiA#;V(*y z_>zuvP`~_d(Z9cW^Ec8xBf@l8xsz9Ic4ku@Gr)hY6GkFHE*Ap4%{^lzEjMzZ)LJVe zk{X$qJ9?g)dMv6Pk-6}3QvM6)*>l>I%N*doG|EDgMIc`^H!9R?flFKy0*MD5rgo+i zENPa)OKs=XLpSwlg}K2X|8@7k9jQlWC7a6lMcVG+h=Kkoo%B~NNrPQFv4q+0aPO>IlIYVH?I3RGL8N>Whp^I`iET44Oi8a0}m z1Vm6M`?4{PKj$ACJos@S^k>%Y`?EDP?D3%oz;T`5M($$xX0^;;91#wFJL;!t+MRc1 zi(8Phe%JOf2109HT_D@yRXQ@rFza^bRR8u<8OFP+gGPE_CU}YgGf#ZLQM&`@ksfEJ zhtHPxHqCg>>JQm`g%En~asT932&AV7eV+ImvWeKmpL$3Va+D?=rXfi!xNU(`4lyz` zGIF*K?Xc~>50a%jFT8Sgt}1V`Qj48J_<2--QQrWFLJ+tHjQgNB?${{JPO{p9thADl z)o71!H%4;>Kd7ca*{jh7)(>cShz1IZeBa_3S@Avk$+;O^`7gUx6?nF33Kgt$Mnpac zx$Ql-;A9O8JgyatA~c!Z4cwFuvpXwTAagCan1%)I)oH-isGqLS~Wh1 z0sGa0w%|v_?&^NOcCoO7+FjG{f%NLKCRN|hp@1ci!r^EQ?0c&uMHmJSxf zKs26z4<{f)B-tZ5_yI1E#tt+bZ7xRb3tTB^Je(`4H7R(ClpI&`De$W@cFS&sinLx8 zic2n0wy6VHWy}d7>N^|JopTWUm{1WK^{?kk%awYRr{!&wezWVy>a}StR*qg z0jN_pl{td!U&1&fMz0#CGG1OGMO>*4*^c(?^; z4LL^V?A<%VvCr906hv28A(BEYib8}{y8#Fetb)syaQK>I^RX;^Kw;>B1z`i0h77os zcm8Uj0)o9@Nr-?iY(Q~nfLQefApvgXru_w>0D`6zy1n139eH>6>|Dz&z*FUQYo{n; zeHQ7&!O`TrdvLVW{onY_)5 z+%{+=81j>^>feR_`>2py2! z@A0bh?stg(+njDyndnbp3xn~w+sL=cbnszZR%OY0p0_S zv}v-M3%hL*;=u-?VzAm*feU#RTPhCcW3n27jZnWs1C^_L@DA~iZZ_|DE^S)sd|u>- zt=+JV2lkgaV3S`pcI}5+dH1H44ZqyMnwRnIovhPgdpgJhPiubYxm%Y4U+ew(`0ajf z)k;C@a7}jA@)To>_S5NQ%X~zN_vgrFHU@;1^zGbUgc}pS|+amCDOD zl`js*cEs(sN&9cR&nAFwH1VIA8w~$33E|!o)W8Sm_~bzxkiE*iW3x8`=uln!l0tgM z-fOPoAF7Q@IO^x7F#X%d!%NjZgA)*4XaMusX9U#VVxMw-xfwP!Zi|;@P?rfDa6?QeBj?i)R?Y?5idJfa4y9#SAN}Gt5cl1iVSi1#}Ln9v*7XrcZ0* z$bRwDgF|+5M^J3+rYZo%m&Ux6d$$<{q?Z;c{Vb}VUOLv5xmgi$xi7i?_J(5};vG87 z3w;tE_mEr|n>Tk-KLsg<6BxFK=FG(FAo{8`=Dh=Vp2J0|$$|{jwBVgA#JU2?M0{zr zprzs#Tw?ftF>-e_Xln1o)B8>Z~zZrKq&jpmVkwLfF zTJ0pAh_;h@G)~=x=%g<6&&ZO#@cf8`?}ny<-b3lOLMwmhuik^<4U)s30J_b2TMi7c zX<06^+YcNabp&j6f__WsiNxCWx~(&E(Yto`88B;6Pza`otkWI^%|xhYub%Gjzu2ea zHG0xeQUpgC1Hue!+SB$#Rp{(+x1t*N*Ghog`Z%@6S?j3t`7(vBRz*zAAKozA@bgq% zrgL@P9#duI-Q*~M#M2DcBi^mTDWC>Yd0%c_{|78NP1c7GmHpK)CM!2)}`y-mwP+5Zf8FFLXKUsLk+{?qpR4l zuTY~a#xn?q-PGkyA3N@bU`bhj)o2n+L+=Q}g~csN7dNHZ9 z%=4_J2(|_scg_)NLR9k+qqC%NlaCbR2^b5=!cbz?R6p$cmzZHWb#2PD&p)f`%ciQl zdEaU^uEwqM-J7ey$wv8Zt2N%dI{u+mZaf^ozq>ccBd$nur^bm&j^V$-!()06uOCv; zn-_1MhcGu4m8XVYbh$MLY}k*B@5g?!&)dhCmtk>`s1iygzroUz)1rw?HcGp_Z3W^p z2Em6V#A+W5!ZJi_hHTR7P-r2<;Mnkw%BhKTRIPe5ZPZGhz=M?k^zjeAVAfd>Nhy)M z-)4KC*;C5NW>IXV1kP601+5^u(!G2442T>43e#zv8K1W^6fd zB`;pRRCjlit)F(_qz2u98DkD@4#rNf8lM^B1ft&KXQJZZwrIcpCGUE&Sc8@hO5f0k`0 zodMKC!VmYY;0CZB)Z8RU&wSma=T+yKkwu; zF9t?Mm@7r@FZj{X6*)4;`CxVm2mA4SbljURy&Znyf8uTBiS$jH>RC?dt!uaT0O#Fq z?MJnNc3eM`O;@`!14(7`7G3!FwjP_SdvMEU2Oh+*KbVZwo@pn{MfQ7?srvhi_xpQq z-?U6V9-gTFe17-0Ut0^NXrzQW{P~6rG0N`hucaZBHg3Khp_5XfZGp)aCnY5FbGY9Xoq;WcPgm64ASI1D?Owf7X)c zK6?M0>tAyCINtAnfNn6=a)4f^qc{gKoO=kevpk=?3yEJKMsi#lFyMh zy>41ce^o!pX#ER1D%FQQHRzUiH8NF-`l_c4%*mk_0P;)56^+-wXk?`g(Ol02a~<8e zCs7xY{4!WD&{FePj`J6G+}0n@D82G%FYfPC=`Y7D5ry&>^i(_rZr@SQ0ijq3dsI{# zXSeaY?cyx#I8?{##@@IykP9@e!ecLkQE%F(XvuvJ0_X~_unUDT0pc!V)W)dimap@S zJBm?hzjOR*VcpjCYiaFEoyUq>z=u5EhgZ9(bvNM1&7N0@JoNX<_;p0s!KJsj0WFGd zAR?ef!#O%x4&?iLEQ2<7-fjVPUBt*Dd_01b7yqg_bIkFpG3NP?{>;Z@Qa>RJy^GQC z(2MkfA3r1EB9~ZWTtOqh#3{B^Fhb(+s79j1J>ond6YFZ5Okq-gMM!%(XMVISVWPpKgqh-$o`kS5htk{Uq zqcgu!|5t4`njq9w&NT!zuI9M3j;)i8o9^w3lmNydCgI}jPZg;!h%)j}12DjE+raL7sXRFpRm5ZwhC# z*6Rxjy>tsI;e0a!oETI6r|+NrwIyb6f$D-L!|*n(xJ4UcE%=)H<-TX71~6>U0x~E3 znikNN)JpXuWKcUjid9bb97eJGCRKPx#S{G`osYXsvaQYLlgaQBV;8i?3K7y3L$a(P zp( zRTe@oQ3uAX+LHmh+v5Go=yQbOu%TE%<8yyD zZNp^pH(Nd?yrn!7yu6iKh zWCL(_xxv$$8qSL%XMngbD}IXoS)Fv~UR%ka0>+<8Ed{7SIro9Yyz^uoB`d1#3>^xc8IVfBF{6iP3 z=o~%zLx&Ck2oi|7A07O^Mu`<1WQF<>eVKDm-YSH#7Gut#c&%1jUcGdTWL8)vE&M{G zHSY9UAOlay1QDO2x$U4mY&j*S^DzbKbDs@Z_V>W@kLYCJJ%FV-@IbVp!hO~z6JGbp zF$nR%Lt0`j6ZZMWAE5tDX#R~G^uGzsi`wP$0&>rd!sVTSq1mXbu8zMZr+IbivzJAn z?SRJ>LKbdxtCILzXG;GnA|rbr|M#HF|Csdal%Of+sr_G+g1zM4_kLy4^;OysH*CHf zW2#rzzPWVKp7!Ak-wiTztd(@ekNTe<|5T+c&D7mp^~txIPv8xvdRkBD5K+QIMCbG~29H5hYqX)~nxO5^bfz{_!4A36sSwE~ z^cAgsfnLufJ0{vr%(G_wYSP-dQIl4yp~Q%{+_+KoKi~Hx9vUV~s>8ch<0d2@4^MRn z-O`%Q>V?vEy?L+hs9n`+!9u$t^CGkxRyXR+`#bb_2Of*vFudGGtNNQtFe}g!(wiBv ze6k~6yYSc5Lcz}(7q#IS7b$V5(Lw_;FID9S&}sSM<)&oM?Lzeq5}|Nz!(oC;@4T;Zb9! zO1hjaOtzB_fA)U;B)>>$OpO&J@t28 z6onP|m&SnbS~-wbIgKi6;D5`I5yin3V$lyG(LV5|*2X~a*1!A4H$Jo_N4?o;+CA)z z&j2ll7${%GUo@);$l&|0UmnUiJ2AN;O^rHp1zrTTO!B_K(OEiT`+)U{ib$j(KUgFrQ)7LB6-R`r(prDJ z%Xo?qQ9iZBcsNaw4l}WvV2D%>En#m(q(KxHp|~{$$v$k#uoj}2s6~W`Fs<{y>O-n9 zTnVRwkSp)wo(;Xq+4Qgxcxf?$esW(gTlBVY2vfffdmE@LQ51p$XVoB4B z$0NYty+gt|ho=RQx;jjKo8+sMF^-H*UzajYz7({g9GGGlS>D-Y-1m|r79QdF4o-k( z^|HrPId?3;JJI%8|GTb!Wy5!!RS)O1UMLzHUyRa?c2G6r^TJCS#K3f|Ygs_UZB;(p)-Tep98 z+rh_c%Q}vVN=`xkNpoXUaN{DqYekhb-+>Y&boCU zx(1JGz-IwnwYpZau0e(tzq*;%-=)J#?RAKa)ConZRhbr#g2o8DlwDUd%$yj0(*)rZ zq_&Fk2EpGpA_7>^v?%K{WFElmE@kKBS@CBzo3fdBDEcy3ahR5Ft3tdxkX7FS&crlAC1`PmW6fn9$d#LCj4I|+mtYMzwpPOJY_&8jC z9=$T~caL&`s=?bw@|DGQkG05q(`EPNY8!U0Qr^JJiw>Ldf^wDuXlPD1ley)cvns)K zSfP#S+*cEY}DPW_`VH@|aXO+jUd+wvUfaFlu7vO&6h4zZpEazIz{{$4tA9*n_ z6I+FZZ}E9WX=O&f?CdnZ_+aZRYSW{7o_>$?j>3-~1slxc+-+gREg`4z;m4SFn$Bs! z=`&?w;L%IYkc~g_CH&gesTSz;?y4CGp5LMx#0x^g2V+)6Q6y865&gW?gNzL?2Y9aL zbM_*sGhw9U>-yvU`;LBj717hSCvQ%M*H7u(&3C!3Ca@!;J)xIs&9#_^j$}3yR+B9< zeJn)514<^79V8aQkxD8x^sL~glw^xmWM(5Y4nzZ5s}TnxL+=qCurW-}_);AM;UrEj zsT57bKn3$8ZCMu=?c0Q{5vLYF;f*L~!U8N_^cBKGy-;QRPPVsfS&OedhiZE7l@6;% z2&o?5N9s?>=$|igOC@`UU~YL!I@E~1>~#(yr5i&?q?SuZ@k13_r4xr#@@g@)G?0)& zekQr5pnXIRk3b8mXs>BTcUlsaG2glJv}3!+&tN)C=RFSLDPfyTkEIj=@YS}SCGgel zd$heyzhhGbQLNZpJqe7gfmv5S{x|+T~4n+>h1`(bXNRPb$#T^1g8R;_XXa1DC#Vb9tO~+T9Tw zwtQ5{1=^Hil&9o^=VW4D%?`>%2L%dRISX2#jZpnn%In8lDYC=i3sMPrsk8BuYb{#9 z6Mt#ORQ^pJlg_(z{=TsoCm$TiTqKXuEBgM${%@~7v<}LC`dFeZ^p{^JFi1VJ7%Ffi z<6gfY9l9>0d?Muh!~!2NhePCz@-$V`$z(;Ub_W@gU>2uA$?5z~QA0F`jI>2weWTVa zEd0L{BpjEm*ogcln-a06W&2XBi%c@(PsyR6`P~|{1zC@$97g8$EFEVcNpxnaEmzlg z_`*At*(orrpEo-h*_-@U+yJ;_@(tK~n4MX^Cm8G~r@%?;CR=!vm16HGz z(0o!;Z%tYSF&c7GsZJ>|#W+=Tj|tlo76yEDrG-wEXk&+n`}6j+4f}vNZVFi>Q!BXu zOPC%+(AL&TooPEetvPmZk{1BVqlH}%3W1->ohr12Bej;CEQz>%Xy`%4G;i$$2r`i{ z_}7i|{RefUaZ|?Kllok(c8@15L&F|vUG4JX%3SuZH7Q|$QMj4-$2Tymw@Le1B z@TtQeYIJHn=3trRPr~7=VJP42J(qxJ%Lvj4nqVfERI3*PZr<~jHy43&tl+~KrZ>C^ zQ#eySR9q&>=89B+s@fqvj!HbtVGCW`8_Y*-e>SThUc7&eG0Q|WBoWQ^vbWNTS)v>u zie&dTu2O9Pgsr32*wX;|Ue^uw)9o;&A9eQcC^d|(+4II+|$+v6FDADH6^>%2yLmT>F(rGKh(HX=3U?8Dg@+j}=<(SCkxS$F?Y>_>{I58I1 zwdKo|F!_0}0K8eXoCo zF9&oC(`{yGu8zI*ZS1)|;C2aMRa*xe2y(Cqb(cGe5l;@10@Qw3{6V)k8mk_&w&fV4rBZgMm%Ms#>$DGmGsBrH*N5F9bMnaJE1wh;x1TC(aG zym=faMHZh<=TGGoH zJ#DEXno{MlX^fw6POP|W^duy5^}1g+37z4bk1$im&aOrBzskyd)ULR?^1qp?(rWZ7 ztT;<9%2)6H_Uj==v3mOI)#3ZMZ$I3itXjFKcqWny)NH}JDpq@BszMv4Cu2z}wj+}` zubNi_a=wH6wZ_K=h5@hU&1AQ(@7F%=7QK{|@to#CKduf&6Ld|3o;^m~J9Gv&rkWhE zk#s6Uv9=E#HKczsiE@a&USdi1AknSy@N`c4P~EUM>qTj#OIx*s%L^)`?WpiIN!%?( zpQmJnhhB4GpuF5<&eUf${O>!Z>5yLF0&rtBbD!g2xL*j=stbhF$%(T<^!kWE=a)=Q zrMztR^EiLi0{HsL&y4g-raxcqMku3OI+>=}*ZO?YpSHVj{4~rLn;xkc*NfCs2`N_j zCRNK)!-d8cBTiiG#m*)-Ui3_H@A@3#K;|vw~@-Odxd27>IHlS&k-cd02_P zv_T6yr0h7*kqh~oN1F1m#oE)L8h1fbc)_4u=wM?C7~k`SRC8R3Zb>w^!v2bfQ*@uz#oNbtJB`Y6y^qevv%ydT&Y$i82jEo!CQs3e7<2@o~i zDH-DG`k*r7(Vy(rb`tk3*^avpG^G1%3f#Y)`EZo2K72rNO5KN}_JHEI_NJ}m?YO7* z$lYOfsb0N$rXHagFKiQkf&LBTMGgA<*lVH9cH{L5WVmVC@&Re1J9Lb|z4zICG-^*T zeKZBI&V*?K8=)&U6+Cu9>3VK~8H173W?mDt$JB(4ksYH{b{w6`FULS<5 zP8iH#RQOU7Yhtsnb=x;flNNrbDCIiLJNIK#O<;;ldvlPHGkUK(hK2NZ$uH`LtN}q3 zh8yTgR07Fx$UQd6MQvtLL*b-s27zHs_ng?vJT3_Z<3a;o87KWhQH(A(-LFtx%olYH z&Mm*?bdp-|WI$FyXdSPoO;g#DZixx8BQy9?i2dNG5Vuxu?{<2Q=Hq_PUG#QhuB*K< z98SX4T|2@5@PZj*vmI>IwhlJS+v=dPttxW!%t6}@W}mj;MQyu}&re3M zXP>K|c8(H7$?s?Faf)JUVjf%G#Ll z=bt^j--N-m{sPksPK9U+1j1qEW3xRR&qvKqwI8a@|5tGkNqIP3jN8L}2I#R)a%&*N zi(O!*WOb}t^iZ`kSc7c7LAEz&(A9>`YvZ(i`kghcvmr-a?0F@0L64!RSH_#D`Sjk* zIGqgM$^eN=mHpjHp6RcWreIMLaN$#8+zTu=Nv>70o`67tb96AC_e>7;l3PjH{;;{h zV|l?B7g8IKTb#>rGYKlVvcGP&6Q8?i0n38i*}ie7Guh0`DhtR6;;404;zwq~JIr8^ z^k#|D*W8%$=r}wCLDS4DMA4$LW|F??Q9Nw{R4?(Pbwq0uY&tJ2CkUP#iR{ZR$!jI? z`fVbwaB$qLm44?*)l^5Z6>?++QIYB>{!MA0C6lJ*JtC_#t0Jrb(7Wj%oq~|oROy6W zVAo1d9d_W9reNG_rPoIObKY5@5SW_%0pQOae&@7=1vk9e;BNqFUPjm`yx!9TQ{9JA zKwSP%-K+(+q0xL=OnSXzu^A7C%ETa;<@$G-e62rcnXRenlM03vL)_6MTZ~dK_ytWc zNwNG!g#4i(la^miuqIf@$O_hk4vy(aYjA)t=Uw^XhKG#LTb|`uWTVriOaNGpvQe|J zhD?4_k|pD-I&39-Pv6v~dFZ^6mlDVe{8*s9{KS1<^*dClr$tGq&h< zINjUF900xP$eQSJP9JpBS&WzA49?t~K5e68tBLy^jJ3Ix)d?512AY(Db-Eeuq}`ss z7Q?J>q0B&zOCX|iK0^~jTH7jm`78aDhOV=mQ$tR}Hi@Q+Grh^p8^@khZD0`m3{Q~S z{%kYE%^aRl)7oK0DVL8_gT&+UrKFHVGB>0h`R8iC5lOsriRtn%$4;5uDRQ~n8pb&Nu9u8WKm9pN#;#;MR z$7LOvHsG+ZDXUcV)ro>NFbj_x{#%dDakjfzXexJdoo%Y_Tvb0Stp_I0(VOxl2~63# zs57O5z`f8YO%E*$8i%7E|IosC+%Mid*WtOxHW<*EHQJN%WZOPoX44|N=!|))Ev2nU_SLlhnnqLcg>-hB zjg;_EovBsv}jt8r>)-h(f)r*<5+z z?TB>Pyugr&)WS1;*pyGq%%2+u2kYr)^eu&h>RCE$&(LP6rk-k5C>(7^J*-t^id}y3bKE-} zIGM-gqjj#i3vYi9aEqM`V3e)2ha>TP0Ef3(IvuPy9x?#lpmgm3IOsD(zkfMm(bS`| z2(bEcp{`D*=?J6SdT`U;@Nm+SYk-NU@U!hd>)YE$AzU`ofG{l!A@#tV^Tl3!c;3Fu zUP0A z3`cCa(Z}KUBDR-UjnH@OSHpA2Agi0Ud1|6y`di(n05_{PQY89nc-xFcY4Et5W~6`- z78F?6Kt2}UD!MlDUOSkH{#S`pSYgs zb~M*cX~K#v^%|0Itk6=luDQCjzLqLGVr6eg+=sZk!lAjQsx($oadiSGsva`dDyOH$ zCwMetZkFJkW(^oxvUx<^&{Y?AMK{KFB4;KO&Q5sb9+zI@9kFunh!K}dBA6YW;hdDE zE-k{lWsUH!q@Oeaw%js->XKS)Q!GU@ED2Au8ydIXoD~BZD;O;7zS$rxXN)HM{Z`E= znHi+F51t+RG6PL0e!+=?lYGI_R@KLjhCAG>jY){yzErC;`P6D`Lzi+7)6ylHc+N!x zr|xz1{xt8UPtF}>-aO08<;!ye-7BZ=k(Zt~9hMq1n2RYSXlq!s^&BSg3&A9MBY5cF zOwVT-cC8`Q7y+ch%k0zmuZ0zveiCd3>!X4`^qpw&u$F z=gM*5pu8oiP{eMo1EgEEs?2N@}%xqqV|k^?}BX<}u; zT&X;K7+ki;avb9aq%!g!jifd-0+{WPqiBV3&e6F&JN^GbLPyi3R`PuEi-=w-EhV!@ z#080l!z9BVE#mowm*y6}RT^J8^AwI9eu8A2sr{ z8)il>qBYlRcWYW+z|@=@E%)NW7v%6 zquzAT*`_FXs5in3W^@SwsjxBtL;>Oo_^9UYw@Z(*^#3Sb`h0I$Mb*wbJJY4 zbLphfaI!UH?B>-{rd--De>Zyy&KZcw;6o3nF@|UaQU=BO*>!^`v2JqH9M5E07EGV%0eED?iVC7o{Ig!t#8j zBDr}h)0Ey(|)!H8I4&_;&d;1e- zS1wG(tNo*bw5^(Lk*SrNw3J*%r)WrZ)*DJbA>MH~2~7Y{O?K5?bx++-ZlK$(7VaC` zx~NL9f;OEj#_GPWCYYM@0ifi$l|w7?3U=a9_mZ0QkHaD8G2jH&eQ4Vih=Yb2X! z@-&^RMM9gOd5J96Y~Rs?9=+}H_6;PT(FABfIe_!gCaV-~l0%1Di%}SnIJmj@2WN6~p^xR*MZ#?67lk3!znWE4|K9-U6ZQ8GFKsJ2 zw+$jZIProA0}2)_oH&wjipKyao%%;8^{I}|!r18HU_?&*AOJS*Q%K2nXNJxegb4?! zg=hP&_+jD$IxA_e%>gEvV<##>o_%B?SwngZJe80ArnoNCX;d5codU2)XT_*@s|>2I zr42fY!lNG`4l=B@7%gda&{rbRtNmZtjC3$QN!@8;1I(_kud82P{JQr>?Y-Ii0ROyv zi~8Mn)AVf6CEqIwEQ`97n6;yh5ym|Wi1v~A?T!$m$^B4Qi zTKSf9lqy{V!2P!W;(be^BE!#L-@pCs9sVXm6L|1$@A=EUSAiv4R-Dw8(&b6JpJ)hX19QHc6RVkZ|5!QUdJIyQx0t(va87*bt6qQj5Hy zA}9WfX=guL0G`9-QpTZ7w z-0O{Xgm#8#I1uN!NBMz48EDr5>X>`JuJTtXf5R5+@~WBo>>FcFx4+(BrbE{FdT0k2VwMy{?g*4jD9#g;qxt4J{Xq zhjUK}v{~aNq9F;7RUN6DB~vtCmo;b%RJjnB3}z(UX46#Hj}A_|=S5XK4h&jE!nnmI>p&Qnwv>G z(--I7$ea+&xs@TmNq5DJuT*xpf_`SZyo;hGt&wzcizPx4Nf$2>4`{&>aiAzP6Qy`k zcyEb^rnJ+UPpALhHS}MyPRh>q5JSZqfkvjo;W~v3)`BIIPV5x2$Vh!Xn_jjs;C}t? zPW^9tuU^&f`?IXdW)RGqOYdKN_?`BsC&^mrBXpl1;O@T5EZWSik`s#yPQt_P6lM>s z9^9C-Q*`;~Yi3|*G!h(Y2#qXG8M8&wUdlaKAgWR|rR zM!H%}KabOHYKD2o8DpPi@K`=67{=G61)@4KNqi+ywtyOgsa`^2R0q#4Y5T8f7wdnT z^+)`c;xy|gYdZa%nM%TxSO(&>4eQQuYDPkqZU{o@Ftpzh1&*UI2Yd)nPIjLSq+pNp zrf-V@Am?Z#gE|FE>94=N+uY_+$F~THc62l21p-H3JiiaV- z^LRW#a~^ZThw%#{A4%>dnql}W{TFobgDsUN+c51Pa&rzxSzjglCT2Pcx5pZhaADg$ENnuyt6Ove85!x(hTUfVE(ouP<03%(%iqxSVwt=a$7c0iG zSy0;9j16|Fv6&lHAk|ygX&h}K7CKaZC^e?|khN9LlW_A1>9PZR+jL+?`4_~xN0HZs=aTHO12{0wxv}v`?!(l1`fd-EnD=Ts zHT7%z^t+He8opXR?F}asTU1@EI`Ta`IAE#rwoCltv-(jePt9$Sc@tm}QgUOq+*Ft)fA3qFx zIvgB(W8zK%NkWErBn#P*6Ga9+z-w2-5Uu*)KnE!Im$Wd6Z0l%Y|6J}f|gJ; zYFT#WMoTOM_1x2 zcXh%(O{-92>yj~X1A+PZ;G~r;*PEm4QMEQ2NW}l8kP^=|>r9q{0*rVINDHr=1_zPL z64%;Rf8QCDgDli~4bk&>dKzm$NySH*~Tjl7Pf{Dlt3FWjc4PLJb3P z@(sFEkDW9I&^Mt`QV0d($m%q)OLvwPi--;IEfR(H| zXP!fNFz*ne`YeV(F@gI39855P++q}u7r(Fd|LIX>F*4^ZkTZ+0R6QV$AHW}f{Gqii z$in%+EnawijItuh?rMYand2{{*-qfWi(v^>m)(}XG898MZ{f$=s=Fx{LiU>tcU8 zfy2zdq<@II-2dACg|@jxb4vdrFHm*@y-lY)9HJ15l=ot_6gAV2AyN>R8{O1Ur&#@b zSE=jyc<>KoB@JBi(KQeJz%F|DL0NbMevvr*H7PR?36HaM-Z{08B3rPtuTmQLg|Gx% zQ;zQ{-uIEA2!1ml+Wi0Nvk&Hw2K(#bD;~uC53dgQJCi-wpVq{sL&*3JgMz-YL+wJk z&t8EL$Nph!m_gcfA~xnQmMalpF&NXwYb$i<`D#sN`@S`eAlFi}e}C(yhNOk|hR>hH zyWn$q6KY96l_>jRU{i^w)pnEC9+VGJ9iukj%l>b_Y_h7I)V(?#h?B}sTJ`+Js}~<$ zY=)1m&7$-0_k5=u+eW_qHl$}|1351*AarCg<{a^wkzG3QZHr0j6pbS1RKdymeSSaEmJMhxRs} zonnx2YwqNkQ5N-HyF4x-fOf%-(%?VflOuvYMB+=A5V1xS1oaJ0m|{XDKd;$_wo+?X z|M|4~e=A4D)Yj--f`8np{`_e(tiqmov_;R(jvKCuO08TpUQ&v$G}zkpA^hzRd3VqU z$$VR_G~goS#YruPc5j{rGbJRdOLiMfIVXF^wGwfsP%RK^has&KF|kXHlX7mU^DNK> zT1f~*?kPuZBD|H|OL<;}-lgzc1DSmDPh40u6%4vr@0 z-Gd|BD)jVomP3)#;kw3~otp?I7rL_64jvl5U1k3w4@aLgx9zsvr+K~pqVD{+@{iR0 z^K@O-Q8HTQBfNS-3-TVu579q%#8C2I?^mf^CCmEJztTSvHz0j^mh;Y8czdQ|mmqWl zl>Aw4G!wS{_mv!jC8LX~!rt zJJ2W|YHljrh6~e0>8qW<9SWgihanPvEC>-~Hl07XS2Z~=O}df#?*|(sscs!?9@Omj z`a$Dhw_ed%KuFFL*BdrlEfVHX2}M~G8Gsxn@Oqi2jg!d%fo%MC3*Ab5EjkopkaR8* ztM8ygJ`}5X<4{wyM^4Tk$6j$L<71QAuZPu#GJa3;Ao^b2u7Es@cZ)-K+-Q*Q$L$>g`n_{M z1(z>5Sexn7{rGp|UJC|``)Hj@EoN&P0PClu{oMSamyq)^yy?UlU3t~Al`I})w~P#q z{B*|0@AtH$)2)W+rDVQ_IDu&?bz0>og*7oP%F_;0!`le0Ngi6$=uCXp`i<5UQk(om z2*ki>!!id34WFn|y<~JzeyW7j?5}D%#t7$PW3%I#)|j?k>lWMyO*s*yvHhtQS(HHK^C$^o8x^FOFWP`0M04{m_$|Ecz40y$?puWTTFZ&a+%xz>x);fS~dml zsgn+O&L;PGOLvfv`K;&gMp;*Sn8oU2`QYH-=+pMW!S~z!%F#h$qA5C>3bv=r=_vRy zblO;aLVv8mr)elv`n^84dJ!IAU%_Sb3f)+LU@0rrjkZkDO-s zAkbD!P^+pt4B}aU6)}EO$nzCzR?$-bM(`AsrFM-tXlJ}hK@WHGZ}UA}O3%f0tgyAj z>s;QGcrRS+`a3dU{5v5h$}t&*f9bsXMzf=MYQ&oFhKqK#5d0KxBVoRc#NEG(ca|l^ z*vi)J3J}i{wrFz7Nfhx0{&dO12sGcL1k;2o;vH^zHR5Z5=+|Md-e|nuR2c>qJ~z>W zshWG+>Ucg=urL*zDzPvUq0VCmfC_S!v^5rL*KxwK^@oMWeSi zzfg!MuFs2I;tCg@sZvg~AZs~g0xCEbcFG#l<%N;64s5nDA%tF#5+3V4Lz@|Rc4S>= z#TzEY1Iz3bmyLKUiSWbWoc!HCQ|>`7FWlsBE#v^bsFc)Xg#_kLo+PlYGLHA{v~XLJ z_+r!3vA8!8`34}U!>DG`6jF$oP!<()5u_g-R?1AS%1y-)zDU#&5YiPgDxMBg|N$rYRTwG^Bv;a}WNT59JZ$aM%~uT^2) zY~a1}Y`RhYd0RE$|C@MTO@@iDrFQ`vI|TV)6Qd<1H99^fd8Iy9`a?^VcLQ}d>YgL$ z8ao;vo`RR*TnXg^7h?n)5+{x=2TJ6$uuMlvo5gn^aBjHMJ(%%-$u_~GJ;!vL+RX43 z*11~|11*3L`@{4Yb^;q%X)x}!jySO@=2g9Or~Z$J^*<}+-Ab!|mFaKw$-{pn`MLp_6-aajSBG>TLv?)e8W$A=c+yJ&qwxJTzZI*+y?1~WCbJ% z-EArK29oOhQkwdOrKmB;hTKy0&@DrS(9G@Ghxh1aPXKki&+W{nL)YT6ivCR+(rZh{ z%e1P?+Jq*IMQqZ3yzin}lbZ^>;JR}sQHB_9=nSW-ajNdzAr`Mmx#rD0^3_A<2!-wt z>h+#_|Mu+%r5zvqS$g=5QCXcX1!H4Cwkm&Ouo z2oqwX4&<O60J;-dl$2^+C!)R;gJn2_SXr9%)pMlblSg2Zbf-Mkr33vE>NV-Ue#k(WSF5>9T~hRU@YHdpZOT zyk%2tKwCrzipc2jlFxWDH1Hb@ZYi>#lVVw~_`Ns3D`Yz~A@}$G?+f+Y{(JiS`&0h= zVIS)&Nt<+I_!6Z|*nI=7+7_Q>NOypD9DGqpCL3CjD02$iy5;abc@mm8m|xTsZ{LJr zqcUr5dJx{g_Sx82zlM&sh&t#LldP45x#I(7>p27xi4EtkAN-5aD=|USZoSc{@BFNG8an`>>r&`HOVg*s`%4M?e^5>|7YP@)F}2as z2yBD8e+M2geyV3224O$pQ8t_OV{eRMBnlZxK3$4m&fdS!*7@MUy&P&g8qt$Mt|fl@ zD*&t!psU4ccZ-+DqoU%@AibORP%Y4FcTU;c3WK94O&`f0Mv<#1BGYt0A(?b}Vvgko zoj$sW=8hauv#|p_5x=$!x$8+VG}u8}ISDoPHUr`G;?3`GU!j*|ew|p3iu2k{edI3= zviE3g6HD)++|JCZQoqsyySv@xhs6r!W>nCvKppP=`sVF>_58)Vef9Fy(_i-$c^%{j z#z)}Y1R|o4c?&t%JpD}y`veSMX1Pj!<2RENXfPPhdz2(nKg9NF({gGnSp-$CD`XR7 zCpPg_?nl5`U%vYF#UJn3o=2}t0&D>(ui!uWkyLJyO3p;gM^6L_uy5S~%oKppG;;sh zHBP?j%R8!aWlnR|yAQHEckW~dV>r&0;WSy^y{R1Kn0AT$RlEtuVzRiZiuW#U!AQ;u zJfrHVV)&t#T&t|V!9!Vot+IT9N3s%IW%+`*X|gt&W%>dSUVnJ?_8C6Fzf{pX4AF>x z&=8NQ$ndCwJ{`RNbb!*mXXt-we&uCgT z?2TkEg6h!!T&{ebnQa7<_?-6FZ#u$^hIk|GPh(8ZW)4jtQgj3mxjXTCZ0lys%FdiD zb!%-E%I&>ZaQ_`nJ<T0UW!3J=UgU#Aj#xjM~eIsX$M%kLqU+LqwaSSY~P zLL|*#;zHBPfVhVJ2$p(uiWI|##DCZBlHOlas3$>*F{JR$=U*`L_WA7OiH9R1MHOw_ z{!Y-vKyEF!VD0}VD)k>F>Nsmb-N?nxTG{2ev&smM(z8f6k|phi>J5a$DqW(wowR9u z2@mU07!k%4(06l~@jL%ElruRDLD(-FlO_sY;@i61+NVRg>Ems|(67=S(;#AeY;isy&Pay46EiItCJwgEH=Odh}DjT}$gHO<6`EQKe=l0GK! zTXXIzbYrk0eaK(3`N$OC47U!aMX_}k1uE>IRkql6SUnE9&myy)oB^N1Bg|tn5B-Aq zc^bT*6!pPQ>_r`mfJFQC+8Jz^b=^7J_G%}~WLX55>15$d z*v+F8XipKR4G*LHfls~2F7gcK!l*sH^q%E{P|I_&2W}-#CzIizL#MK=zBdM@KGs17 z1Q1^L#%Q7V+t~OPCVorC-E`_9pHGM0Z}Cp^fhH2s+`m4e5w2c|BJ@Ryq`!V1TX*vu5(~bd5JET8u z+xRn1)kQ;!H5I-~Bk{-`oKd>FFLJc^UxxG#i_VLyjEw_!CEg_GMZQVi%UqL!q6?~w zHVG&gZ<6yO-z4v4u1P`B1yx3y1XPT!BJ4~2McQ#*xNq=c8{f3ThtPo7GltDoD(;`e zX>(0AFELwr*ed-p?f6)GC+*p6dN?0+TX+o?d)L?R{FgRwS^hDn@9~!YWJGB$NTuvR z>gOiG*8Zy(`#*t1(96(-Mv}dEFu*NoD7>gyEO%X4TU`B?5;9*X|Cu8)P8J5_;!Psx zrQLP(NWsGv4wp6ic{!kz9zC7lMvXbQyqEKbg2ujo_nKo4aC}qLsGGIYE8c;eH?k+e zyE|?+=n^C1v#1S$gquE|#QZoCPICjA9a7?$))D;17=G32KTcHT&J|_oI~Z3m8GwIlMepJ-yYl> z_O1tQ_>tZHd58YFh@q6KBUmTtd2c%DU?EC%a@;;1UaF^if0!7fN7e~#nBl5d)faSJ z=gtVs!9R62r)Ci|z3F&O}%}Y#F4B>FzqojQmd|9Em-8x;6FeAm&MvJBD z=`VYX1d4SPvAFsry-+VuG@VQbKnxP1buPEMHknY#`EhTUsPcn{WS6O} zQxqCXMBBp4l&o^SHe&{(Y5Q}JlcjxG!(Y2NB5lPwpsja{+N#^IYFodsnM_LE*y48H z%eB+%W#Nz%7QbaTPkL~|Xn$cRUs7T945XGw6HhwD{gaZBLW{=EZ){PQU`K_8`-NS4 z53BjFukv2to?1+u{okA@DW-A-cMEF# zIREXFX{|Fe_Ip!IIgx7yY&TKb`q-!oUyTjPh;nmP_bMo;P3?BKA8Zy4wmXbPL!D;P zf%eBaIjV)wC?ASP+TQa6x{uv^`{pPqsAe+ke&K}r_^0}`rQW@Io?Ebh6A0KS>b+BC z*!e$2WQS!3rI8|qBrD@B!l^?B@&djf~qqR~%uJ+)fd{&-%!Gwa2 zn#}I@p_@n*OL(!4EST|PRL;er_P7_2yeOg%WnltIo&S(R^o+=m#(=^X&x#kwcLXv4 z$U)?i=vs)W^as#U5RTiENv|zeFw`y$zvi^5;gD|F1_3D~7(Z-J`LIsEa^{G9!stt%OfT(# z!pp=Y4vgwnRLxEr+Qa2Uo}JxSGxIqIwyX!Q_#fXaWiazeZ1F0OBU zeuskLUL6ka)NksEy&55?%=J@RM|vupjv3CBJ9Om0TZ;AoQ}L)#+T}|EV^mMYMy;x8 zh+Uxp}G_2AyUFa(HuckSE|>898)uRxVl z{8<8BOS6g!m7642xbGJ3M+*0y!X=_PKHeygw#(^uxxcB(heP*Piu&CmnTp+9*Z>8WGb5|D*{44t{HucWPEb~zX3NsDM`$T+o>N)4&^j2UgTz(E9uQ<1b?R=efnK*!Eak_)~owc$Aix0t1e7@07qeG^n{z#wMBCnyJQ zoo#KhB*U8djd42dO@{4Gk2ltb4`p?UEOt0_L@-)=@Z6EbV8)W%zc}F8bUwzIs1Aj@ z$Hrg3e6@RHr2u;gbmK-?g*hFExA#ImeA9Vc4`om1RX)N$kX*+PhLwM58GwV$c zDTBQ11Kt5mn*`-i%Z*Q!9NQ{)t`7azH)3$gmtTtFzkBAgTyw8m#bQ-mELkh(t5OH$ zzrf~G*z_O*_YW5*n0T08-mBfK?egW@deDq{);k=KbxC_Dz3q)Vmxp4x4~2Ka7{oXhxzqhbnX5N# z?V|XeP?33qLgt_hS3@^k@i)h;%u=-FW*4FGyyg}VKWJ`N*07F6dbO%3Q=5`(TJSB! ztiKiDjup#k+$&sU@sUe0T?yKc!oCbwxY=c}hIwSJf!e_ndpgq)Xb0!~weT4y9ro9e^-*hx>E()@& z^E5lihhE@Q%E~@Ko8a!e(<4PLGN0Yr{n`UZr*dS5L~D7gRUL-kJxTH5sZray-mQJy zsowuY-|q8weN^>HwJ-hi8tW3pKj->|sSiuaVkwr@T`T1noy_JO=l_vO8=0*BEY-!G zyA4k|xWk(?Zb-$IisbyLpdf8=xf&gXWI@$hs9jvS5q%#O7A|anSr&N#)GJc3#levK zc1I=WJYyaQN%=6uY>DqBCOW^J-C@~4M^1VS!4r#)URnUxCsjI48FSyHYwb!g1i_Fq zzMF;0U} z_O7>TytbK*H{LgTg~sRWxlN<-%^nf)ta?z zJ6Wk|w;5a`V51LbeuT7WE@P2fqz-@Z7iyVU2OeQ4ub#JW>1Lsrh1X)|JqZLjna?P6 zIYx|{Y^ysgOTntWqqBg}(XU57GMG>v>8>+oniFBouK^PU=!l0DMXXLSS37C9S19fj zC5ClIO2?7YiGVl*P+<;34+S<0WYToXR?sHn2%dG(7|jjw%~9TcwegDSX{ELKAkQ}F z-GYu$s7THn5QfSN`+`OQu$ZW~L|C*O(0!t@iKGaL(~)DQu0%y$yUwo5amGyjma4JZ z*VP7^wDL8nwrn8cpxNpu?UIL4KD<`YYDv>VjV5*a!c@N=wj3LdqSo{37RXtZqHz4k z5wtfRkeWy@0@@z4Wpkf*(JZ*}o>Gnmf8q(G$c{lTIN?KXE*;2u1v4}#%D`m`^f*-o ztJCoPQQ}6(k0^?eDcs>~-I_JnVODCRn{vwC_6eFg>*cbovVlXE3>ig+6UQpSHkXOY z?(i)UZ#>wd&EmAz`MhYSV0~s$_FbF{mJ3H5WP=ozwz@dNCK0gHhJ~V2av*&u-t25T z?_oL%@!;_J(_p3EGMT@;x4d>2^fzzl6HD)!>wjVMowIQN6g5Bv?WSdd0D9J#62;Ob zcZo}t8T)dGrl;e33{L6i#r zy~Fr*y(9#;9m;Ro&n3dH1V(DBY(8K+oAY$~86}Q3F%4roS&F*0)!_Z8-I=Bts(ubZ ziX}Tj13+#|m|*@*3blav-JbNi7-0}`qqGC;h%Z(4IU)?90i@Vc+Nu;lUp;;Q?5{U< z_=53WZmRG_43X*k`xmcXJl%hBQ`3;xsV%xpTj?lCd3< z?|l!ou(ah{69qC{pfPE8X2VN`0|5MfUFd0(( z8W5}SVmwEPq9%&z!o!DRAce+-8ZlDNB@k=fO||1x9S_E&k!wo!Uv7XB%afuy9b*@_ zTVms4@Ow^)u^!R#HP$i?Kr1p6e7$!q5D+frleM+D4`+Uf+qUXh9!-V9pc_VkGthF# z1_2J61PkDiQHYqQH;d4dyhr z;Lt!r>@HX4b_`ocRFMtdH65DICUeQL?k7!5qB_m+Y)B?<)uZYHD}-vy^q}Ss1Ma~Q z%at&-y|rI4syaQ|3$BAAT{RMuLk_pz4m5N;pX5_b@|`}c*g{(?LmH~dO~U=`-EU1# zQeYb&7J0;&9;Q5o3N)r7%(rho*w^acRrGIxTqjdFaCJ(tSJf0?9=xj zUOjIP2gjXSme%ey(It*vPPIe6=|XklPM4z?!5T;ET4y+`{|T=F@kYJ-FsrM2y$^r> z#P!pxS1=PAMg_0Vqd|D$+0Y{c>kw|$?B$MKnVY_RG(iJVom1Ind=lHZfnuGnzi1D1 zu%T)-9S<+7Qe)4W!;umP--+wl;6$qo`CiPCHqwDa+AWpXAIM#_@RCGvy+mDJP>@|c z$1_&UwjLZ4B4>G$HxKmHX>En&rAsbU9|4Q7RSA26$D2g@R+Q6}uQZ06hYthmTRp~M z>$f&JYjMQMN1_hEARUxp$T4ptF9RSh+iE^`9oKRh+Df+NQh>R>PftG=eQpZ2XQw`= z)t~=Ch+_YkVtJPRET!HA8icB{hd^35fld!q|!WBYWIeR&AoPBNP6OWD#<|fL$8I zk!m{Z>Z3sZ;DVonqiEv~j+Qmw+^T(L2e6?n+X@jbLSdn>RjzIF0m|&rtJ;8CqpXjK zA2`vRdqWseDaP{UIH;KL*f*>@e*=)W4+!XJ6a0N8A$ypMIafd55a*s3+&-9C@#x|& z$)gVFP7|x-!*Ht+!4@+lLEY#iW9{ulih-Td~wkF5ixjMbb4!1b>Xx8^}GuDU*W~+*AY2(X4wDI~bm|Gbe~>=ynxg zU~MTYJ~utW^D{hsD)WHOqLd{2rw2J`^Ac5{{##O->Q@)}cNg?>GU;sj@A`N|+r3*Q zuRrBJ+vR6e4!!;Sa`=SXNs+TCB(iqcTA*SCay*PWa1|JYIJDI{o9*6y=$^&GtepD8 z=PX=}Lld%4f4qE~`UA}IqY3v1l&BB0iUzfNQEYt$!S(u*y-g6szwe*Iwc+@zOVmjLa$UQ{dBWlpHy7z$>i?O;4#!BV?{vP{j~|;Eh>5-Cr%zie*OX3Hswkb@s-6e|#q`j`2&GOcP73QL z*-cN>E*y*0Pdl-=CF`o)K|{MXn)*;=)aMlGTFocj_N-T(c4}Q+MP82M>1MK%nw}?x z6D~3wyAk;;YCrnX<^o;0CU-b~TB#!Z6x0s#HZN-+3RYZL@3hk$Oj`zab@AC2j5ReX z$L3iVe!3}VJUz*8CS|I`PtNKO34%S0i?7SqWja}PS$?C||IMEf1&#N1iCRQ1@$Cth ziX{TRd~aF4tK|AfOZc%L=xX^sBrW27Asnsxix9^i8S8&P9VPu)*$phvBif>oIR!F?A)VOA zUY-Sq>_%L;zhkN9JoKgyY=z!?m}-rk9aRl*MdoyY;dgLl*`H2YGPlfzf;moh6ZaVv zZF!s-3OW$!eAaSIRLVNof-HXwfPf0$!@)_ido*Fp*?#vM1C4cnO zNq+DJ@C(LYmz3d@pUIM*gvxTaDnSvgEiS?$&*-$uPgWuyh($#NWQdHNDrm#THH4l^ znx=w-0C?F4D+``PsJp1Ug_MmgD@6Y-dP|Z8a-e@%V+H-UXlyhH8GeY*Y}((Nx#jM7 z(uo75S3v+J{CP8kD#nVVVey*r58zzh@9YWrYYF!Q^UltvoE68Sl1_7^riI`qgB%%f z+`Mk_qX5p`#x}oQixJ&I=)#>LitY;tu(jy}Xqg~?KZIXxvO^Lz^77X*$qP^FzT_2= zvh=ZSp_F9-w0Ns9c$mWGu&DiYf|!v$umPBryFKQd=pbSDhPvT787vgqY8IPGUqUA$ z-DtXj=G@HKd^{&)>?>>fHON$da3=Fg+qURH+(x)BUpZx(RpcNywsKgD8SwGW4E;c; zTjKT08IQ=87(+Wx29i${PinnhSJFx&X)ZeweO7mrP}Y=`W94bvT>VfzULv zHF#=OJ_fBaG3dWjkMV+AP_FT;_38vsD8m>}nBN)=#lw0TYc^K|r>Y%_539hpzTal_=m0Jt78eifQ_(XI7eI=pplofc*{sNqKWkfc_=WBtH9vynMUrnPTh=Yt zI0S1h)LG+0P2 zl+y}>&P{0FVPkSfTj)@z=)jK-cNqoH*2jI=CHsBY^0rC5KWh($-VG-!b>UcRFJ1?; z>dAb}KJAND-Vu4HR)ooeLg8uNLB?~4_EAI{Xs7ouDgPz$lc`X-6X?Nw+Vjh~4-3kn zzZj6gFXuiC%V|x!f8@86Dd>F+c4^<)?FUc!TWC_rucbx!ZWTKCIOO$W966f!IOKH! zj+|^-*s=0eqxl1%Y$iAA?cY}Ji(BmF)4f+Kcfc+9_owgQ?7jKbE$dz)I7+g%K5|C% zWHACY6-}4_pVGH+!OYd!6W^GmAU3;fW8EOj)J{uJ*hWiFySuIVc!1fYG2~dU>(Zd; zC~h@f9ve*@+59fl8^`O6Q}UjQlazm@_k^3A$;m`>a#al(cd?I`GruFcp+I3pBO5!w z1v4J4L-8PjGdZsujOx|m);YXc4hJYUDCu0ep(Iq1Y-_6yp{MF$T)820oazft0k$77 z=y<$%{~z;5!+ghn$In$1fS2FCm>2{dd#OB=;QVzo5f?RR_O5$Js>I6S zAjvRa#K8uF9BhKjT1KH(ZI$Z>jr!yuIm#~vk8oq@!V;}ZbY1Gta>aD;GdHc`I{==F zrX%(#YagQu!Mz3zl&Su7(le&f>P*|&DG=*!3wMHv&qj;XubK-!!#F#LhvFr=j8Hqx z+1a@g!-K>25*`(@zS~Uk1w2u02q89CE2zDdB`=DGsIuSW#d;>dO+!zy2`G$ zqE<2xpOW?v*~}$(rq{jAC_BfTfA`+mX^+W<6C3^2o2R)`TyYpTI0O2oKZ>y{Cp(C+ zkZ&cLxM$AW6Ss(l-nzCUPh2J`q83q7bd3@iHEF%UlFUTNQ$CZ$3;CFmQYdJcO&m{f=wbk?w>l+U zPOxG^g{rV7hcn5T%(|oh!opMkzo36S$guCtPjgq zcbnDvI2}tal9_&uQpVLic!#LSbzi@U_4l-W27A|WVINRz0uuj2`gI@ZN=Hd zf3Pt>G|P9fd#L(vlIA~pY0RR~ls%mUEum=Cvh=FF+x($c-o2ru0@3ZT=pMO&@or%T zQjY^Kp{9EC_QQ*PiLJ11L%y_Cchu*b9_r})csR(&MG>YQa^>^hF=0CG4(7ALP}?q6 zvuWof9g^n=dU4iI(iAYHH9+UVb9|iMtSVNDRWwpGMHqZty=q^gY)nm%05pW<5pIl+ ztB*R9%g1%&;ah)%4SpOz%pTV%2u@bV$ZD?ZLlKNIKU`OJiRs>((y-#pk%r)TXR07j_G)io~ZN1_*6VO{@xn`y?V8)>Fi|t zbT%4p!|zE-Ks6kU26)*p18ShD;Q1I)?qRM8D*YbhfY(KZv(7XflJ>YxryTsY zE%8k)3P~+ffTKH@&C+c}7jvUI2JRgWI-gbLDTpJJ8B+&YAu^9~w|4cPlm7N>aI)Qp z|0aXZY`ZtfwkO?_8}(p!=i*-DCkI*$MyPIE*Z2I$Nb)K<;6 zE+`A-wgv4nynR7k<*f^9>a1Ll$xi7lk=AO1ay^@?{Y+N+Q@pr`_b`Eg1!lk=Vcm9n zoSFsJE2a=5j*3gE+q+N~YNPR>R=e9^aZP3%vD(}ut089?_cIJP?#vDSST2e7Wgd^( zQ=G@#ehL}QiBI7fIT_()I4U5{pf2D=yxqOQ*o1PIBqjB_Kn%n@knKPxH522#Lg(Y2 zpw&W_nR|?P_BZ0CT^I=f+gYzOODQLYmt}Z%nu`2IIm0MSlL^!qV$j8R5B(FS2cSbV!0rTiRceaXq8X&7@T?|&hQQm6EQy&Y@I!S92ibdJd2c>5(e*soF z?ETuC;p=^xNKKVAYP+?&+v+V$hP^Jd2+gWry?Rzlw*7Ma@?-!sLf3^+?H}k{SDSWf z7>X*(PQwCp`z?vh{Mt0+-pkkR|4gSQ`B}q0AB>&nyXN`3&;6Is*Qc1Y`WKj#?|WxW zmTz((bC_Mz!9R(>Pdj}3o;<}N@?IrjL7CmJFtarms^?%{Qr7HO=q=kME65N)*7M8u zte|;&I;O<_;GeywdW2F@zc+onE#dPhLim89fb%kRMU4jHw$E)_ZKSx#*11H6)%!-!UsWo=^ z)42EZPNVUlVdseu1XtK|PQv-oDhyuXYGcn8NhPwaU+qtNou|`2Elq@|r;}NoCOThU z501~;8D(_bsdX>mr(g8L<)lYx+fe~x-h6=KZz(-GymMxYyqQR7NGR9)N3yMM#A8gf z6^{8xxTJ|H&U@!8V$*X7*{GWt17$pKu$*!q1~c*;N~qISy|hh())i?R;ru3h1-+>Z z+bHjLD>P-*XV~wMe*>2QxtS7`^=4fXfT#KnT#ONFx8#(s+nu-jf4Cg-mv@{OT-sHC zI-Lz*C&_@RqH+w_&hvI}1T)^@kI!`ES$#Sgfl9xP=iudVWPkUfb$nt{8#ke=_Z*qi7k|toUp(0ms1Ul{wLtYC0Riy{)c=|H=CHq+4V+=oG!S9y0Gv6{G?kvg!4Kxc@nDEX zZ$PWRw+EWjs+$;n*0~@B^bt&NVZETCqvkY4RE-cBO(Ze4tM31PkC-Y?E1w3xfl$G@ zKa+8KoOUk_@%LaIP?9Kr4^jJR=QD*zzFM(GUJvQyxK?^a8W2o3Eb$Q$>pm+~r8&H1 zQpN9|kRRRXrhycKJ43L~AWIl`+tcm~^lQZN#tEmDcG6!R zK<}>{P63rUZ8Zkb4W+KNQa9@iRZUezn@~rx!8%;}lIXinhPQM^KW?K#)S?1#k{!O` zV5ej)x&-}r0BdjWxhl^G-Nm5qrUT6VMMH`O`pXKudAa{rIFakAe_7D$NjuBVyMEE6 z%uf>?(A+QDp#wZNxrWW~-=c*XDi%$^9ge4LCqv_z_iN8k7y7mfi<7E zr{{w)EYu*p50@lcHP?4mBV;4OV-gq-2VKl5b27MS`AjeIOBv`^^f{-BEqceoLmVN9 z#fN;r3II^XhC@iN#gO@zk|Z}$3@=bdu@~p8j|tvn^KRP0fBeTf1lbgZY2F`52iDRlLb_>cLB$j9P6S_h3YOTlA9U6*!dvU%ChF#zAspmC$b*GvSAXQ7Iil5JOUx9zD4j z4Ryy_aE#bVRBzl#@r2zL` z;ig-Z!?sHKM&cSa*T1iS4|3Tq_db2Ekj9@-NEnTJ1)Gsn9&ufd z>i}P_KRT%E-xaCSZyD~@rdPH%__&_$2W^y_IcRzu0S9(5G{|!l!?#2-`jRUwhse!% zVSU8J^7?xY1s=wV>&LfLp1#<^z=`(u->RP;>@*acw^(%Th3MKEUE4Yew;+NzE*v2AN zDGw4oL3y4(QW~9q%vC~fI)n#kzW;JCL_K+1QPp_P*ha0?@RGtpp0ZksZ|UkIOeQCm z?wtRbvqlN3r|Q|ey|+43{V|;6KdaMrrqT{<9)P+>t~@gdMUE;Ay4N{5fj-uUy>TBU zb}d-#*2CHQrh5cTyhLNmrN zWAytTA)0Eu_kL21h8oQVBSv-qX9CBl@q>T%)W%@k8O}+k`sTM+N+)MXr<(-*;69cn zdH^&%`tbn{Mzu=xAq#j|*&XC0_(P0bGWa=8T8wRVLcdt6v8^)x zwTr(Lmgens20f9sNrn~*|VsS4Hmhe}Qo^+Y8*5ANMd6bSmL?@aK{hi~EG29+6u*Z}eXY7ZFS|AP)3Jg*xH;78o!Hc085v4dB3h442XoKWm9lXIxK z-$Y| zziLN$a$RA8cu)IN?rDEYJ?)1*B?J|Gp6{iL9Q)9p7I%{e(<|cllXE0Pr?O_f+-%aQ zn@QC*lY*gCQcG%_%sDyOap%*Oq~mP?Bc!xZ8_AuW2Whem-+3T6jkBblaxHhtEk@Ay z5cG2haFQ2d07kn(5S!O!z0R-b+l|F(mI)yR;@~y!iLi@@=BK2wB=@^EW?n_EZT1M_ zCFRrZbVwO`etcm01D-fGFn0T!ZACz|9c*jpO`mgMPqvxr$Ts1t=AfGo4H!L}v}v`v z%Tsn5ny7#7{0RU1*x3E#PuO*}|NHxU>goQoy*&{QwmA{#lrm+#eg4b>Ggj#pb}Kif z*Xb&nqdH{d3nh)fWy4YQ^bxFg)c4r{zDWyWUjkY{K%7 zL2ec_9xK5Xkq@P=Zj*VK{^j-OCGuxH>-c>+?k($%!+)VKW)(zxU|ypP>(QfkeyAC? z-MENr|A^aH@qdkm{gUt$-X>h-NLv5%!~3UuuU@?W?z`^}cIp;!I=QUQPC*pwpIU1jT*3??BA3Ms zCpK?7;=;>%edy~?jh}bj>BLWMNw0yA==}n|gH6~bAa}xX>MD8}ow?PPi`Pu4y%XCn z%bMT>`gt%>16ei2oKKjOa6bKuWm^_M>!;d?k zgx$i{_UI9;q)m0L@I~X3!-qGe?}vwYQa?NtweY%nI>Ekaw@aPC7rsjJaGF;Lis~cs zZ+v9k;~qa&ZipLCm1LsUTwll3W1e!0UIJHfwO^d=@;DvkRbPigHB%#%s=hi=6NMu8 z`B+R)c=pq9_%NKQ&vgxC=gE9QQHNFkKRiIL8Cl@nlntTFK7N zPMI?`&@=tednOP4XHTANZN^AK1c44WnRiyoqY5-9rDjlhHp|DLEOJz#Zf~>gI?SDv zAJp{&X1UUXa*9u?o29h1^YEc$E8{nPdDC~^5GKmB*4<5^@KN1-?;ow{k~2e-6HG^| z19gn}{tYNpB@^*c3so~FB}uJ3DK&s7r83o0I+EmPX8ypsn~%tU^vVWPx+zZ*buFOn z^UtbsB`aoEC8b1_8#fp?gwl)$Xd=c>1uMPep9+CwLwvJ2}a0b$e zB-aP*?Yc%b9ZC$7Y=%Aul%HC;`sD0#L}*5Xj13f_2nG|v0zN@^7ZB96hWt>Ah#Js; z8Ldmw1~WB@=%E%HCN!+&i^EBKisl^7jVm&V>I5b_vo~lBZGBhFIa{Kdhj0Hc+pd57 zv;JwTyuFPNFp>ck>70HJz^TdK!}E>r1s|MqHfb9uv-WDczRgftYgNYF!B^$(%@02i zSC$CQBv)r`EdDocr z$(#$VTtRrMV}3ICJ+x~+f}IT2BP1LTVKb;7WIxomm7QiRGQ*exHoScbhLBh_4)pkF z(_-hLOv>GZSz{L`@4;-RzH>0cy5L_Z2>$}YgRyCnm3CSAR3i@={X^RsC2k*`TJAM| z{E;g8X=f2mx(*$%jbr9lV60IKtJo>5qE}c#_uMH!fAL@V4|US0cLt(w9CTU#jO`_r z+AbY)NK0;n0hvk-m`ZqIq^HLvZN0&)M6tXQ+41;V;Tvvwc}`tA?_i*@2!FK82`{}{6KQ?GYps6Ky4d>ZhwmTO`<0^#BffZeQ*lHU_FKd4 zEAFON`nXg5@snJQmm8e)$Zv#EtEMntw$;uL8x<^FfpNsDY;gK~@*^JK(PvMZSvPBy zUsMMe|DwF>jXOC9kT@{MgB48LT;(IV}(vc$ZFBm zjZKZmzy-)VN1KI^?@Gc*G3_Do4xmv&7{_FnF{Dy52qy(k*4ff+AelqTB1sq!+%ml4Dy04{0|WyXMl z8fW6PO;Escq*O{Wq+D5dQDvp#o>wQa3TTpZzNT2w&Lmb_5h9)5Jc@~2P+1{eP&_PV zyfoSDOhV7$ppfTdT{VwlsKkGq7}z6|rDLN5wQE>9qx-e-jI62HoT|aMO_J=aOvmsi z@Ujq3OXvd@!Y zdlmt}$HHALLFVIZKAEH#$w5065KB{$`t#g1)`I*F3J7p2KTF3ml0)B%R~;PlCe!pk z@tuz4s*9jciWr(X=IH#yXS=SIpYrYcgb9o$#FwzB1bc<%8r#34?3}*CN}HzLc}IH` za9B>?h%i66{GwSc^OqYxa3V)NjT;??0ZsywM7`t6@7fOjFR@W^c>n$Q=T7zK+NV0~ zzCkWkF={&4fZg@yPxQ~$L9Ot|W^Ie2=}0tE&l5gqS#gi_&O%}gjd0K%-5co!3J}na zdcAU_cO!O&r7%=78HeQh%li<`BX|GcD`9xfcKkBIT4jc;>j(7K%(_-tKd+l-1fgeR zt8AXvd*d2C=6ORbS+FaEMp<|`H0UYqGoEMdab?CD5VOpBBUpH7q3IlEWV7VaAE7@~ zQ^5xQ*r`K%9&6&d1<+BdsbHc!Ua`bv^mz*X;VKMW-hJ-x*?6re#5zmHjV+LX?C>B7 z(urQQXBge~oShZegz`i0V)jBTG!yJu2el^I>BAk|mkL{&d?n(rM?OB6p~(b%1_F%| zV_aezbsS4_$QZyuuziV&NP-6jP*W zHdVdTG|XLQH$K5y#!}EyBj3R8Y`&MT%-7}*>Ly+~$@KthpG%-&o9mp6C~0GdFRdfI zlCU+YYwMd}RVjK?uU55(opnT}H&)1Vw&VaN@H#laSj)ysKpkA+lh3`&xIeR)jUxeGTF-+zF4vrQCIql9 z*9+gX$F=EonNAEjSmRM$(C?T>b-Y@~p}GK<=TL1(VBM%CgPn~xQK^Oi$AnRjR&?|!yK$7 zZ|0+yq<`F5^H(>m>NWHdp7yd#9`39Krz$>6B4}3B4;v$Am2KMzYwGU3fP{8lSJS9L zza!vSg+^7#;+n}E6CMq13ri(d-u-Y<1Rz2b{iO{((#r5485F11G#3ClYP~|L2I08A zkgR}Zb-LOrS0${|$O6i`5DQ7GTN;urL=Y#g3$-G3-8`yaPTl$BR`iuhZ$V$(%wqZ) zh-LJZwnk{@p(v!Vfm(&a(;g?J{W_*FAK!*8aE+^T1!-X+Q_%01@C0dOe!;uticG^RZSNm`qIEJFTKEo4wvcZpvvz z!^c3&V8Z5vNxm7qe%*?dc)Xx0eY~#)=iZC?#Ar?UScxaqM$RZ>$!ykXB~N-0A8Yig(;)tp;1v$NE;Tl)FsyHFNCt zGIDW>Mg!B6D70ioC#!<;72Qi#%U3$bST2IAj`(_#slUG5|G^FYs&7iFXX%g(%-F)Z z0BP(>5$`MuFBJLAg5UnVH;Uu=hz%Y7_iFKftT) z7}KyP82&dsuVV0|>9{?V-T}48X;RmvyXmNn(hLVSKcpnY92>Beppq6LZ+mI1rG)q; zZQ`(rH95ObQ{4OP)>0<185bB<%zYHoNx z8gH+@k1TAkdv%*{vAn%ilif7A(N#$GLJN=`S78eq4#s-sN|VNLhM@Pbp6Kt6ot^b~ zNkOPEGnX!-Xi>Bhf2|~LUC_Ylw0ABP%WjMs~0Y5wm^x+v=!}Fsd%IFdfn#lWue*CmS1|DG?sb(Ek> zV-kC1WTJwtaobA}K`sL5*M+eN>ga;8Q{Ta|Q`D-=boe^*ow891$k${h(bh1dgN`I! z+5lOs8)>rd)Xaz84tY`MVH52f6X;?2Ag8xuaxABuIa|E>8k#33+@l?Zv4Cpza>kO| zB4kAT5@!3rXuV`ge{w6O>H_R}HLKAO)c17*HUr~0KIy$lnNq6a;T$br1YQ4eLT z0U;;rkg6%N3j&-mmnxL;BGQ~}Q`MoE1GUf&Xlm_eS_zq^B;*=O1gttKNaTzqferUB zM`SCcpR%MlB}q{WqU}q{HyxKY`TYL& zeVi0FPR1TLm5!5-$J>te%=WXb=9WFo@qj~?9+fk5u*uB%rJ&84_3=7zI$U3&#|7t~ zqRCm;v(8BIUwm2g%fIK62y0mBj>vZTm*UGInX|=rK?`}M044t&u8Z6ewtf2Fi=zJl z7e(H*^i=DVTIr%aRU5+rYNbE->B6X5MW|VC3@l0Oa@W3d)a&s`s8`i(c-0b%UXXJ0<)x$crKO>Ox9YBZyk)eGAcO|wY3?&K%*>L zb0^bqGYUp=sB#Y4o)RnXg2+N8U*=&WtnZ=w#=YhfpnsVMqO65OQ8%0ZPkL&8{Yw76%wEzxNLg zN<|4`*GlQ6l^kH83Jzhd!@$6^bi$*845n)JND}TVKnNQGAyin-m2`b2l(_cdSP@!% z?ehglbx1zFDo^)RVG|lv9CFdS&cq>9AF2 z8)`UEO%BQjW#R0f`>g{^z*vt@W`@!?;lR||ol{_!y>^#aR&|ul$FoU_dn%!!pz|wr zV>WG1RH89sG9bWAI1;rZf}Gh8t5BANZ~OvKrezKYH2XM(8Dl}^Mg>F2Xx%XP*n+boFj}RB~cTtQWUX47>W2{ z>i88CLbZ)zW|*%Mmls{@FC?jZh(u@+kb^^9VPn5KnTyWlqMq>;{4|o(Wvz6(oGz*` zr%Q=*q=?c0bCpnHHcne2PbFbUnditOoj}AX6J}cTigV%?Q7iaKbiQjz4xN&YKBY(6 zRN6509gGvLGmI0SB?-d-{Q+B4kSde}GfuDm*6U544hLsFuRELxW#Lt~%T3J5%IzVc z*SXUe`_kTd1RxNsiUEN(+)w+-@ZGzg%|hd4ZQuPeHatM+jn9$ zJ}J4eNK;9EjYba4+r=#qKa|BOUtzB`_U5RlF#RDx(iKu%!%|m1Y*x#S8&{Hvzzw

    ;B~q^McdG4XPg83GSOC(4lKx>eY2t@Not2R?-p3 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%0Do+F0&%H~G)E2*Vv^tUVYC$h-G%f8Trl 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

    HK~ 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 VuYX_v{$Kz5{{V!9B{Tq7_W<1ax7Ppw -- Gitee From b253513424e1ba7912eb2bee98f3e68bbb79e001 Mon Sep 17 00:00:00 2001 From: binlingyu Date: Thu, 21 Sep 2023 13:55:15 +0800 Subject: [PATCH 3/6] Add src directory and conversation.rs file --- utsudo-0.0.2/src/conversation.rs | 140 +++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 utsudo-0.0.2/src/conversation.rs diff --git a/utsudo-0.0.2/src/conversation.rs b/utsudo-0.0.2/src/conversation.rs new file mode 100644 index 0000000..351472f --- /dev/null +++ b/utsudo-0.0.2/src/conversation.rs @@ -0,0 +1,140 @@ + + +/* + * Sudo conversation function. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_conversation( + mut num_msgs: libc::c_int, + mut msgs: *const sudo_conv_message, + mut replies: *mut sudo_conv_reply, + mut callback: *mut sudo_conv_callback, +) -> libc::c_int { + let mut pass: *mut libc::c_char = 0 as *mut libc::c_char; + let mut fd: libc::c_int = 0; + let mut n: libc::c_int = 0; + let conv_debug_instance: libc::c_int = sudo_debug_get_active_instance_v1(); + + sudo_debug_set_active_instance_v1(sudo_debug_instance); + + 'err: loop { + loop { + if !(n < num_msgs) { + break; + } + + let mut msg: *const sudo_conv_message = + &*msgs.offset(n as isize) as *const sudo_conv_message; + let mut flags: libc::c_int = tgetpass_flags; + let mut fp: *mut FILE = stdout; + + 'instance: loop { + 'read_pass: loop { + match (*msg).msg_type & 0xff as libc::c_int { + SUDO_CONV_PROMPT_ECHO_ON => { + SET!(flags, TGP_ECHO); + break 'read_pass; + } + SUDO_CONV_PROMPT_MASK | SUDO_CONV_PROMPT_ECHO_OFF => { + if (*msg).msg_type & 0xff as libc::c_int == SUDO_CONV_PROMPT_MASK { + SET!(flags, TGP_MASK); + } + /* FALLTHROUGH */ + if ISSET!((*msg).msg_type, SUDO_CONV_PROMPT_ECHO_OK) != 0 { + SET!(flags, TGP_NOECHO_TRY); + } + break 'read_pass; + } + + SUDO_CONV_ERROR_MSG | SUDO_CONV_INFO_MSG => { + if (*msg).msg_type & 0xff as libc::c_int == SUDO_CONV_ERROR_MSG { + fp = stderr; + } + /* FALLTHROUGH */ + if !((*msg).msg).is_null() { + if ISSET!((*msg).msg_type, SUDO_CONV_PREFER_TTY) != 0 { + /* Try writing to /dev/tty first. */ + fd = open(_PATH_TTY!(), O_WRONLY); + if fd != -(1 as libc::c_int) { + let mut nwritten: ssize_t = write( + fd, + (*msg).msg as *const libc::c_void, + strlen((*msg).msg), + ); + close(fd); + if nwritten != -(1 as libc::c_int) as libc::c_long { + break 'instance; + } + } + } + if fputs((*msg).msg, fp) == EOF { + break 'err; + } + } + break 'instance; + } + _ => { + break 'err; + } + } + break; + } + /* Read the password unless interrupted. */ + pass = tgetpass((*msg).msg, (*msg).timeout, flags, callback); + if pass.is_null() { + break 'err; + } + (*replies.offset(n as isize)).reply = strdup(pass); + if ((*replies.offset(n as isize)).reply).is_null() { + sudo_fatalx_nodebug_v1( + sudo_warn_gettext_v1( + 0 as *const libc::c_char, + b"%s: %s\0" as *const u8 as *const libc::c_char, + ), + b"sudo_conversation\0" as *const u8 as *const libc::c_char, + sudo_warn_gettext_v1( + 0 as *const libc::c_char, + b"unable to allocate memory\0" as *const u8 as *const libc::c_char, + ), + ); + } + sudo_memset_s( + pass as *mut libc::c_void, + SUDO_CONV_REPL_MAX as size_t, + 0, + strlen(pass as *const libc::c_char), + ); + break 'instance; + } + n += 1; + } + sudo_debug_set_active_instance_v1(conv_debug_instance); + return 0; + } + /* Zero and free allocated memory and return an error. */ + if !replies.is_null() { + loop { + let mut repl: *mut sudo_conv_reply = + &mut *replies.offset(n as isize) as *mut sudo_conv_reply; + if !((*repl).reply).is_null() { + sudo_memset_s( + (*repl).reply as *mut libc::c_void, + SUDO_CONV_REPL_MAX as size_t, + 0, + strlen((*repl).reply), + ); + free((*repl).reply as *mut libc::c_void); + let ref mut repl = (*repl).reply; + *repl = 0 as *mut libc::c_char; + } + let num = n; + n = n - 1; + if num == 0 { + break; + } + } + } + + sudo_debug_set_active_instance_v1(conv_debug_instance); + return -(1 as libc::c_int); +} \ No newline at end of file -- Gitee From 01cbd5bec3f25ad7b442c46606d44e9ff926abe5 Mon Sep 17 00:00:00 2001 From: binlingyu Date: Thu, 21 Sep 2023 13:59:38 +0800 Subject: [PATCH 4/6] Add sudo_conversation_1_7 function --- utsudo-0.0.2/src/conversation.rs | 85 +++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/utsudo-0.0.2/src/conversation.rs b/utsudo-0.0.2/src/conversation.rs index 351472f..c02542a 100644 --- a/utsudo-0.0.2/src/conversation.rs +++ b/utsudo-0.0.2/src/conversation.rs @@ -1,4 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +#![allow( + dead_code, + mutable_transmutes, + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused_assignments, + unused_mut, + unreachable_code, + non_snake_case +)] + +use crate::struct_macro::*; + +use crate::ISSET; +use crate::SET; +use crate::_PATH_TTY; + +extern "C" { + static mut tgetpass_flags: libc::c_int; + static mut sudo_debug_instance: libc::c_int; + static mut stdout: *mut FILE; + static mut stderr: *mut FILE; + fn sudo_debug_get_active_instance_v1() -> libc::c_int; + fn open(__file: *const libc::c_char, __oflag: libc::c_int, _: ...) -> libc::c_int; + fn write(__fd: libc::c_int, __buf: *const libc::c_void, __n: size_t) -> ssize_t; + fn strlen(_: *const libc::c_char) -> libc::c_ulong; + fn close(__fd: libc::c_int) -> libc::c_int; + fn fputs(__s: *const libc::c_char, __stream: *mut FILE) -> libc::c_int; + fn tgetpass( + prompt: *const libc::c_char, + timeout: libc::c_int, + flags: libc::c_int, + callback: *mut sudo_conv_callback, + ) -> *mut libc::c_char; + fn sudo_memset_s(v: *mut libc::c_void, smax: size_t, c: libc::c_int, n: size_t) -> libc::c_int; + fn free(__ptr: *mut libc::c_void); + fn fclose(__stream: *mut FILE) -> libc::c_int; + fn __errno_location() -> *mut libc::c_int; + fn sudo_debug_set_active_instance_v1(inst: libc::c_int) -> libc::c_int; + fn strdup(_: *const libc::c_char) -> *mut libc::c_char; + + fn sudo_fatalx_nodebug_v1(fmt: *const libc::c_char, _: ...) -> !; + fn sudo_warn_gettext_v1( + domainname: *const libc::c_char, + msgid: *const libc::c_char, + ) -> *mut libc::c_char; + +} +pub const EOF: libc::c_int = -1; + +// #define SUDO_CONV_PROMPT_ECHO_OFF 0x0001 /* do not echo user input */ +// #define SUDO_CONV_PROMPT_ECHO_ON 0x0002 /* echo user input */ +// #define SUDO_CONV_ERROR_MSG 0x0003 /* error message */ +// #define SUDO_CONV_INFO_MSG 0x0004 /* informational message */ +// #define SUDO_CONV_PROMPT_MASK 0x0005 /* mask user input */ +// #define SUDO_CONV_PROMPT_ECHO_OK 0x1000 /* flag: allow echo if no tty */ +// #define SUDO_CONV_PREFER_TTY 0x2000 /* flag: use tty if possible */ +pub const SUDO_CONV_PROMPT_ECHO_OFF: libc::c_int = 0x0001; +pub const SUDO_CONV_PROMPT_ECHO_ON: libc::c_int = 0x0002; +pub const SUDO_CONV_ERROR_MSG: libc::c_int = 0x0003; +pub const SUDO_CONV_INFO_MSG: libc::c_int = 0x0004; +pub const SUDO_CONV_PROMPT_MASK: libc::c_int = 0x0005; +pub const SUDO_CONV_PROMPT_ECHO_OK: libc::c_int = 0x1000; +pub const SUDO_CONV_PREFER_TTY: libc::c_int = 0x2000; /* * Sudo conversation function. @@ -137,4 +208,16 @@ pub unsafe extern "C" fn sudo_conversation( sudo_debug_set_active_instance_v1(conv_debug_instance); return -(1 as libc::c_int); -} \ No newline at end of file +} + +#[no_mangle] +pub unsafe extern "C" fn sudo_conversation_1_7( + mut num_msgs: libc::c_int, + mut msgs: *const sudo_conv_message, + mut replies: *mut sudo_conv_reply, +) -> libc::c_int { + return sudo_conversation(num_msgs, msgs, replies, 0 as *mut sudo_conv_callback); +} + +// sudo_conversation_printf 函数涉及可变参数,暂不重构, +// 函数实现放到了 lib/util/utsudo_variadic.c 文件中 \ No newline at end of file -- Gitee From d47600f36d8716b60d863263d2132fffe63aa773 Mon Sep 17 00:00:00 2001 From: binlingyu Date: Thu, 21 Sep 2023 14:10:54 +0800 Subject: [PATCH 5/6] Add copy_file.rs file --- utsudo-0.0.2/src/copy_file.rs | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 utsudo-0.0.2/src/copy_file.rs diff --git a/utsudo-0.0.2/src/copy_file.rs b/utsudo-0.0.2/src/copy_file.rs new file mode 100644 index 0000000..f1d75a4 --- /dev/null +++ b/utsudo-0.0.2/src/copy_file.rs @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. + * + * SPDX-License-Identifier: MulanPSL-2.0 + */ + +use crate::struct_macro::*; + +use crate::S_ISREG; + +/* + * Extend the given fd to the specified size in bytes. + * We do this to allocate disk space up-front before overwriting + * the original file with the temporary. Otherwise, we could + * we run out of disk space after truncating the original file. + */ +#[inline] +unsafe extern "C" fn sudo_extend_file( + mut fd: libc::c_int, + mut name: *const libc::c_char, + mut new_size: off_t, +) -> libc::c_int { + let mut old_size: off_t = 0; + let mut size: off_t = 0; + let mut nwritten: ssize_t = 0; + let mut zeroes: [libc::c_char; BUFSIZ as usize] = [0; BUFSIZ as usize]; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + old_size = lseek(fd, 0 as off_t, SEEK_END); + if old_size == -(1 as libc::c_int) as libc::c_long { + sudo_warn!(b"lseek\0" as *const u8 as *const libc::c_char,); + debug_return_int!(-(1 as libc::c_int)); + } + sudo_debug_printf!( + SUDO_DEBUG_INFO, + b"%s: extending %s from %lld to %lld %s\0" as *const u8 as *const libc::c_char, + stdext::function_name!().as_ptr(), + name, + old_size, + new_size + ); + + size = old_size; + while size < new_size { + let mut len: size_t = (new_size - size) as size_t; + + if len > std::mem::size_of::<[libc::c_char; BUFSIZ as usize]>() as size_t { + len = std::mem::size_of::<[libc::c_char; BUFSIZ as usize]>() as size_t; + } + nwritten = write(fd, zeroes.as_mut_ptr() as *const libc::c_void, len); + if nwritten == -1 as ssize_t { + let mut serrno: libc::c_int = *__errno_location(); + if ftruncate(fd, old_size) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO | SUDO_DEBUG_ERRNO, + b"unable to truncate %s to %lld \0" as *const u8 as *const libc::c_char, + name, + old_size + ); + } + *__errno_location() = serrno; + debug_return_int!(-(1 as libc::c_int)); + } + size += nwritten + } + if lseek(fd, 0 as off_t, SEEK_SET) == -(1 as libc::c_int) as libc::c_long { + sudo_warn!(b"lseek\0" as *const u8 as *const libc::c_char,); + debug_return_int!(-(1 as libc::c_int)); + } + debug_return_int!(0); +} -- Gitee From 4eb431ea6826c91376abd47daee64b696cf2f415 Mon Sep 17 00:00:00 2001 From: binlingyu Date: Thu, 21 Sep 2023 14:13:36 +0800 Subject: [PATCH 6/6] Add sudo_copy_file function --- utsudo-0.0.2/src/copy_file.rs | 101 ++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/utsudo-0.0.2/src/copy_file.rs b/utsudo-0.0.2/src/copy_file.rs index f1d75a4..dbef8eb 100644 --- a/utsudo-0.0.2/src/copy_file.rs +++ b/utsudo-0.0.2/src/copy_file.rs @@ -8,6 +8,22 @@ use crate::struct_macro::*; use crate::S_ISREG; +use utsudo_util::debug_decl; +use utsudo_util::debug_decl_vars; +use utsudo_util::debug_return_bool; +use utsudo_util::debug_return_int; +use utsudo_util::sudo_debug_macro::sudo_debug_subsys; +use utsudo_util::sudo_debug_macro::SUDO_DEBUG_ERRNO; +use utsudo_util::sudo_debug_macro::SUDO_DEBUG_ERROR; +use utsudo_util::sudo_debug_macro::SUDO_DEBUG_INFO; +use utsudo_util::sudo_debug_macro::SUDO_DEBUG_LINENO; +use utsudo_util::sudo_debug_macro::SUDO_DEBUG_UTIL; + +use utsudo_util::sudo_debug_printf; +use utsudo_util::sudo_warn; +use utsudo_util::sudo_warnx; + + /* * Extend the given fd to the specified size in bytes. * We do this to allocate disk space up-front before overwriting @@ -69,3 +85,88 @@ unsafe extern "C" fn sudo_extend_file( } debug_return_int!(0); } + +/* + * Copy the contents of src_fd into dst_fd. + * Returns 0 on success or -1 on error. + */ +#[no_mangle] +pub unsafe extern "C" fn sudo_copy_file( + mut src: *const libc::c_char, + mut src_fd: libc::c_int, + mut src_len: off_t, + mut dst: *const libc::c_char, + mut dst_fd: libc::c_int, + mut dst_len: off_t, +) -> libc::c_int { + let mut buf: [libc::c_char; BUFSIZ as usize] = [0; BUFSIZ as usize]; + let mut nwritten: ssize_t = 0 as ssize_t; + let mut nread: ssize_t = 0 as ssize_t; + debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL); + + /* Extend the file to the new size if larger before copying. */ + 'write_error: loop { + if dst_len > 0 as off_t && src_len > dst_len { + if sudo_extend_file(dst_fd, dst, src_len) == -1 { + break 'write_error; + } + } + loop { + /* Overwrite the old file with the new contents.*/ + nread = read( + src_fd, + buf.as_mut_ptr() as *mut libc::c_void, + std::mem::size_of::<[libc::c_char; BUFSIZ as usize]>() as size_t, + ); + if !(nread > 0 as ssize_t) { + break; + } + let mut off: ssize_t = 0 as ssize_t; + loop { + nwritten = write( + dst_fd, + buf.as_mut_ptr().offset(off as isize) as *const libc::c_void, + (nread - off) as size_t, + ); + if nwritten == -(1 as libc::c_int) as libc::c_long { + break 'write_error; + } + off += nwritten; + if !(nread > off) { + break; + } + } + } + + if nread == 0 as ssize_t { + /* success, read to EOF */ + if src_len < dst_len { + /* We don't open with O_TRUNC so must truncate manually. */ + if ftruncate(dst_fd, src_len) == -1 { + sudo_debug_printf!( + SUDO_DEBUG_ERROR | SUDO_DEBUG_LINENO | SUDO_DEBUG_ERRNO, + b"unable to truncate %s to %lld\0" as *const u8 as *const libc::c_char, + dst, + src_len as libc::c_longlong + ); + break 'write_error; + } + } + debug_return_int!(0); + } else if nread < 0 as ssize_t { + sudo_warn!( + b"unable to read from %s\0" as *const u8 as *const libc::c_char, + src + ); + debug_return_int!(-(1 as libc::c_int)); + } else { + break 'write_error; + } + break; + } + sudo_warn!( + b"unable to write to %s\0" as *const u8 as *const libc::c_char, + dst + ); + debug_return_int!(-(1 as libc::c_int)); +} -- Gitee

    `X34Lp)m-+3=Qk-lv%7M!3Ua(%6Ji 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%0ADtrB|d{*TK24m5= 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